diff options
author | Michael Vrhel <michael.vrhel@artifex.com> | 2013-05-30 15:48:33 -0700 |
---|---|---|
committer | Michael Vrhel <michael.vrhel@artifex.com> | 2013-05-30 15:48:33 -0700 |
commit | 483e100c06e647d8ba2d68beef09c1c241fd328d (patch) | |
tree | d54b32de79ac892571cfda81704d51f8ded1676e | |
parent | 69cce78d20f9ee34954812e72ad6f3e4bf085374 (diff) | |
download | ghostpdl-483e100c06e647d8ba2d68beef09c1c241fd328d.tar.gz |
Addition of ETS code and project into gs/toolbin/halftone
-rw-r--r-- | gs/toolbin/halftone/ETS/COPYING.txt | 340 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/Makefile_avec | 6 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/Makefile_sse2 | 9 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/README.txt | 247 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/_eb_sse2.s | 344 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/build.bat | 3 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/eb_avec.c | 691 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/eb_avec.h | 44 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/eb_sse2.s | 344 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/ei03.pdf | bin | 0 -> 108353 bytes | |||
-rw-r--r-- | gs/toolbin/halftone/ETS/ets.c | 900 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/ets.h | 93 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/ipview.html | 386 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/test_ets.c | 855 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/tm.h | 4099 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/win32/ETS.sln | 20 | ||||
-rw-r--r-- | gs/toolbin/halftone/ETS/win32/ETS.vcproj | 196 |
17 files changed, 8577 insertions, 0 deletions
diff --git a/gs/toolbin/halftone/ETS/COPYING.txt b/gs/toolbin/halftone/ETS/COPYING.txt new file mode 100644 index 000000000..d60c31a97 --- /dev/null +++ b/gs/toolbin/halftone/ETS/COPYING.txt @@ -0,0 +1,340 @@ + 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. + + GNU GENERAL PUBLIC LICENSE + 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. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/gs/toolbin/halftone/ETS/Makefile_avec b/gs/toolbin/halftone/ETS/Makefile_avec new file mode 100644 index 000000000..61ffa5eb3 --- /dev/null +++ b/gs/toolbin/halftone/ETS/Makefile_avec @@ -0,0 +1,6 @@ +LDLIBS = -lm +CFLAGS = -faltivec -g -Wall -Wmissing-prototypes +LDFLAGS = -g + + +test_evenbetter: test_evenbetter.o evenbetter-rll.o eb_avec.o diff --git a/gs/toolbin/halftone/ETS/Makefile_sse2 b/gs/toolbin/halftone/ETS/Makefile_sse2 new file mode 100644 index 000000000..882f32d94 --- /dev/null +++ b/gs/toolbin/halftone/ETS/Makefile_sse2 @@ -0,0 +1,9 @@ +LDLIBS = -lm +CFLAGS = -g -O2 -Wall -Wmissing-prototypes +LDFLAGS = -g + +test_evenbetter: test_evenbetter.o evenbetter-rll.o eb_sse2.o + +eb_sse2.o: eb_sse2.s + nasm $^ -f elf + diff --git a/gs/toolbin/halftone/ETS/README.txt b/gs/toolbin/halftone/ETS/README.txt new file mode 100644 index 000000000..a24ceefae --- /dev/null +++ b/gs/toolbin/halftone/ETS/README.txt @@ -0,0 +1,247 @@ +Release notes ETS version 138 +26 Apr 2006 +Copyright 2000-2010 Artifex Sotware Inc. + +This version of ETS is for commercial licensees and is governed by the +licensing agreement between Artifex Software and the licensee. Please +contact mailto://sales@artifex.com for information on licensing. + +This is the latest unified release of Even Tone Screening. The core +ETS algorithm has been highly tuned for modern inkjet printers such as +the latest EPSON seven color devices. In addition, there are alternate +versions of the core screening algorithm written for both Altivec +(G4/PPC 970) and SSE2 (Pentium 4) instruction sets. The quality of the +results with assembly speedup is comparable, but will not be +bit-identical to the C code. + + +README for Even Better Screening + +EBS is the newest refinement of Even Toned Screening. It is based on +the same fundamental algorithms as ETS, and adds several interesting +features. + +1. It's possible to screen all planes in tandem, rather than screening +each plane independent. The result is a more even distribution of +inks, and an avoidance of "interference patterns" between similar fine +structure in the planes. + +2. The number of levels of output is adjustable at runtime. Most +modern inkjets support multiple drop sizes, and the number of discrete +drop sizes seems to be increasing. + +3. Dot aspect ratios of 1:1, 2:1, and 4:1 are directly supported. + +4. An option exists to apply Even Toned smoothing to shadow dots as +well as highlight dots. In print modes where individual white dots +in the shadow areas are visible, this avoids wormy patterns. It is +a runtime option because there is a speed penalty. [ Note: this +option not fully supported in the current release ] + +5. More parameters are tunable at runtime, including the amplitude of +added random noise, and the scale for the Even Toned output dependent +feedback signal. + +Some usage tips: + +The default parameters for even_c1_scale, rand_scale, and do_shadows +are all 0, and should give good results. The reasonable range for +rand_scale is about -4 .. 3. Higher values result in more randomness. +The effects should be quite easy to see. even_c1_scale produces a more +subtle effect. Values of -1 or -2 should produce slightly less regular +patterns in highlights. This might be a good idea on printers with +poor accuracy between passes, for example in bidirectional modes. +As mentioned above, set do_shadows to 1 if wormy patterns are visible +in shadows. At high resolutions on most inkjet printers, the dots are +so close together that individual white pixels cannot be seen. + +The planes in the call to even_better_line() should be sorted in +darkest-to-lightest order, for example K, C, M, c, m, Y. The +strengths[] parameter should be an array of approximate darkness +values for the inks, for example { 128, 50, 50, 25, 25, 10 }. It +might be worth fiddling with the strength parameters. + + +Compiling SSE2 + +To enable SSE2 in evenbetter-rll.c, enable the #define USE_AVEC +conditional compile. + +The SSE2 optimized code is in the assembly language file eb_sse2.s. +In addition, I've included two win32-format object files, with and +without the leading underscore. I believe the former is the one to use +for both MS and Watcom compilers. + +You can use the NASM tool to reassemble the eb_sse2.s file. Use the +following command line: + +nasm eb_sse2.s -f win32 + +Most compilers will need an additional underscore prefix in front of +the global symbols. There's an _eb_sse2.s file that's the same as +eb_sse2.s except for this change, and it can be assembled using the +same command line as above, just with _eb_sse2.s as the filename. + +The included Makefile_sse2 will compile the test_evenbetter executable +on Linux platforms. This utility acts as a pipe and converts pgm to +pgm. + + +Release notes for 2003-10-21 Altivec-optimized EvenBetter code drop + +1. Compiling + +To enable Altivec in evenbetter-rll.c, enable the #define USE_AVEC +conditional compile. + +The Altivec optimized code is in the C-language file eb_avec.c, using +the Altivec intrinsics. Most up-to-date compilers should have support +for this. With GCC, use the following command line: + +gcc -faltivec -O2 -Wall -Wmissing-prototypes -c -o eb_avec.o eb_avec.c + +Note that the -O3 option was tested and did not succeed, at least on +GCC 3.3, build 1435. + +On other compilers, it may be necessary to define the HAVE_ALTIVEC_H +preprocessor macro. + +The included Makefile_avec will compile the test_evenbetter executable +on OS X platforms. This utility acts as a pipe and converts pgm to +pgm. + +2. Code changes + +For the most part, this code uses the same API as before. However, +there is one important change: destination buffers _must_ be aligned +to 16-byte boundaries, and should also have an additional 16 bytes of +padding at the end. + +I've provided eb_malloc_aligned() and eb_free_aligned() as handy +utility functions for allocating aligned memory blocks. See the +allocation of "obuf" in the sample code (test_evenbetter.c) for an +example. + +3. Performance and quality + +Barring bugs, quality should be almost identical to the scalar +version. + +I did not implement the test for G4 capability, as it's fairly +dependent on platform specifics. Currently, G4 is always assumed, +so the code is likely to crash when run on G3's. To fix this, +edit the line "using_vectors = 1;" so that vectors are only enabled +when the G4/G5 is detected. See: + +http://developer.apple.com/hardware/ve/g3_compatibility.html + +Performance is most optimal when the number of planes is a multiple of +4. Screening 5 planes will take about the same time as screening 8. + + +Tone-dependent randomness scaling + +As of version 134, ETS can accept lookup tables to control the tone- +dependent randomness scaling. If you do not wish to use this feature, +you must set the new rand_scale_luts field of EvenBetterParams to +NULL. + +Otherwise, rand_scale_luts has the same layout as luts - an array of +pointers, one for each plane, to int arrays of size ET_SRC_MAX + 1. +Each value of the array corresponds to one input tone level; in general, +if you change the luts, you'll want to change the rand_scale_luts +accordingly. + +The nominal value is 65536, which is a fairly small level of +randomness. In general, gray values near round rational numbers (1/2, +1/3, etc.) will need higher levels of randomness in order to avoid +repeating patterns. The current default, as computed in +eb_compute_randshift, peaks at 2 << 19 for 1/4 and 1/2, 2 << 18 for +1/3, and 2 << 17 for 1/6 and 1/9. + +Note also that even when using the rand_scale_luts, the rand_scale +parameter still has the effect of globally scaling the randomness +value. Each increment by one of rand_scale is equivalent to doubling +the values in the rand_scale luts. simultaneously doubling the +rand_scale_lut values and decreasing rand_scale by 1 has no effect. + +To really fine-tune the tone-dependent randomness for a device, we +recommend running grayscale test files with several different +constant values for the luts, then visually choosing the best value +for each grayscale value in the test file. Different devices will be +sensitive to different patterns, depending on the details of the +weaving. + +Lastly, keep in mind that the randomness scaling is quantized to +powers of two in the scalar code, but is smoothly variable in the +vector versions. + + +Notes on per-channel even_c1_scale settings + +As of version 135, this code supports per-channel setting of +even_c1_scale, as a way to control artifacts in "dirty highlights". +Recommended values are -2 for full-strength inks for which light +variants exist (magenta, cyan, and black on EPSON 7-color printer), +and 0 for all other inks. + + +Notes on mseveneighths + +The eb_avec vector version contains an experimental workaround for +problems in "dirty highlights". It is disabled by default, but can +easily be enabled by uncommenting these two lines in eb_avec.c: + + // f_4 = vec_abs(f_3); + // f_3 = vec_madd(f_4, mseveneighths, f_3); + +The values in mseveneighths in eb_avec.c can also be adjusted - +while the current value is -.875, values of -.90 or -.95 may be +more effective in controlling the dirty highlights problem. However, +values too near -1 seem to create other artifacts. + +Pending feedback from users, this experimental feature will either +be removed from all versions, or added to all versions. + + +Partial version history + +Version 138 contains a fix to eb_malloc_aligned for crashes when the +base allocator is aligned to 4-byte but not 8-byte boundaries. Also, +the .obj files for eb_sse2.s are updated, while in some 137 tarballs +they were stale. + +Version 137 mostly contains small changes to the vector code to make +it more like the scalar version. + +[There was never a consistent 136 release, although some code did go +out with that version number] + +Version 135 adds per-channel control of even_c1_scale. + +Version 134 has tone-dependent randomness scaling. + +Version 133 has some fixes to make the code compile in C++. + +Version 132 fixes some improperly merged files in the 131 release. + +Version 131 contains a fix for a subtle problem in the noisy highlight +change in 130, as well as more robust support for > 8bpp deep images +on vector platforms. + +Version 130 contains a quality improvement in noisy highlight regions. + +Version 129 contains performance tuning for the SSE2 implementation. + +Version 128 contains a significant speedup in the prep (Altivec only), +specialized to 8-but LUT's with gamma 1.0, 1.8, or 2.0. There is a new +"gamma" parameter to enable it - a value of 0.0 uses the old LUT-based +code. + +In addition, make sure the input buffer is allocated with 16-byte +alignment, and is also padded up to a size which is a multiple of 16 +bytes. + +This version also unifies the SSE2 release. To enable, undefine +USE_AVEC and define USE_SSE2 at the top of evenbetter-rll.c. + diff --git a/gs/toolbin/halftone/ETS/_eb_sse2.s b/gs/toolbin/halftone/ETS/_eb_sse2.s new file mode 100644 index 000000000..b75f6eeed --- /dev/null +++ b/gs/toolbin/halftone/ETS/_eb_sse2.s @@ -0,0 +1,344 @@ +;;; Implementation of Even Better core in SSE2 instruction set + + struc ebctx +.xs resd 1 +.iir_line resd 1 +.r_line resd 1 +.a_line resd 1 +.b_line resd 1 +.dummy resd 3 +.luts resd 4 +.e resb 16 +.e_i_1 resb 16 +.r resb 16 +.a resb 16 +.b resb 16 +.ones resb 16 +.twos resb 16 +.aspect2 resb 16 +.ehi resd 4 +.elo resd 4 +.ohi resd 4 +.r_mul resd 4 +.kernel resd 4 +.seed1 resd 4 +.seed2 resd 4 +.tmmat resd 4 +.y resd 4 + endstruc + + struc srcbuf +.im resd 64 ; image in floating pt +.rb resd 64 ; 0.5 - rb_lut, in floating pt +.rs resd 64 ; scale for randomness + endstruc + +;;; some of the optimization is tricky. For a = c ? a : b, we write: +;;; pandn a, c ; a = (~a & c) +;;; por b, c ; b = (b | c) +;;; pandn a, b ; a = (~(~a & c)) & (b | c) +;;; For the converse, a = c ? b : a, we write: +;;; pxor b, a ; b = (a ^ b) +;;; pand b, c ; b = (a ^ b) & c +;;; pxor a, b ; a = a ^ ((a ^ b) & c) + + global _eb_test_sse2 +_eb_test_sse2: + push ebx + mov eax, 1 + cpuid + mov eax, edx + shr eax, 26 + and eax, byte 1 + jz eb_test_sse2_1 + +eb_test_sse2_1: + pop ebx + ret + + global _eb_sse2_set_daz +_eb_sse2_set_daz: + sub esp, 4 + stmxcsr [esp] + mov eax, [esp] + or word [esp], 0x8040 + ldmxcsr [esp] + add esp, 4 + ret + + global _eb_sse2_restore_daz +_eb_sse2_restore_daz: + ldmxcsr [esp + 4] + ret + + global _eb_sse2_core +_eb_sse2_core: +;;; screen one block of 16 pixels, 4 planes + struc args +.header resb 8 +.ctx resd 1 ; context +.destbuf resd 1 ; dest buffers +.srcbuf resd 1 ; source buffer struct +.offset resd 1 ; offset (in pixels) +.tmbase resd 1 ; base addr of threshold mod matrix + endstruc + push ebp + mov ebp, esp + push ebx + push edi + push esi + + struc frame +.obuf resb 64 + endstruc + sub esp, frame_size +;;; align esp to 128-bit boundary + and esp, byte -0x10 + + mov eax, [ebp + args.ctx] + mov ebx, [ebp + args.srcbuf] + mov ecx, 0 + mov edx, [ebp + args.offset] + shl edx, 4 + mov edi, [eax + ebctx.iir_line] + + movaps xmm6, [eax + ebctx.e] + movdqa xmm4, [eax + ebctx.r] + movdqa xmm0, [eax + ebctx.a] + movdqa xmm1, [eax + ebctx.b] + +eb_sse2_core1: +;;; pixel loop + ;; invariant: xmm4 = r, xmm0 = a, xmm1 = b + mov esi, [eax + ebctx.r_line] + paddd xmm4, xmm0 + movdqa xmm3, [esi + edx] ; r[i] + movdqa xmm2, xmm3 + movaps xmm7, [eax + ebctx.e_i_1] + pcmpgtd xmm3, xmm4 ; xmm3 is ones if r + a < rline[x] + mov esi, [eax + ebctx.a_line] + pxor xmm4, xmm2 + movdqa xmm5, [esi + edx] ; a[i] + pand xmm4, xmm3 + paddd xmm0, [eax + ebctx.twos] + pxor xmm2, xmm4 ; r = ... ? r + a : r[i] + movdqa [eax + ebctx.r], xmm2 + pandn xmm0, xmm3 + mov esi, [eax + ebctx.b_line] + por xmm5, xmm3 + + pandn xmm0, xmm5 ; a = ... ? a + 2 : a[i] + movdqa xmm5, [esi + edx] ; b[i] + pandn xmm1, xmm3 + movdqa [eax + ebctx.a], xmm0 + por xmm5, xmm3 + movaps xmm3, [eax + ebctx.kernel] + pandn xmm1, xmm5 ; b = ... ? b : b[i] + movdqa [eax + ebctx.b], xmm1 + + ;; xmm2 = r (updated) + + + mov esi, [ebp + args.tmbase] + xor eax, eax + mov al, [esi + ecx] + shl eax, 24 ; could avoid this by changing the rand lut + cvtsi2ss xmm4, eax + pshufd xmm4, xmm4, 0 + ;; note: if we swapped eax and esi, we could probably avoid this + mov eax, [ebp + args.ctx] + + ;; compute FS kernel + pshufd xmm1, xmm3, 0x00 ; 1/16 + mulps xmm1, xmm7 + movaps xmm7, [edi + edx] ; e_i + pshufd xmm5, xmm3, 0xff ; 7/16 + mulps xmm6, xmm5 + cvtdq2ps xmm2, xmm2 + mulps xmm2, [eax + ebctx.r_mul] + addps xmm6, xmm1 + mulps xmm4, [ebx + srcbuf.rs] + pshufd xmm0, xmm3, 0xaa ; 5/16 + mulps xmm0, xmm7 + addps xmm2, [ebx + srcbuf.rb] + pshufd xmm3, xmm3, 0x55 ; 3/16 + movaps [eax + ebctx.e_i_1], xmm7 + addps xmm0, xmm6 + movdqa xmm5, [ebx + srcbuf.im] + mulps xmm3, [edi + edx + 0x10] ; e[i+1] + addps xmm2, xmm4 + + addps xmm0, xmm3 + + movaps xmm6, xmm0 + addps xmm0, xmm2 + minps xmm0, [eax + ebctx.ehi] + pxor xmm4, xmm4 + maxps xmm0, [eax + ebctx.elo] + addps xmm0, xmm5 + subps xmm2, xmm2 + minps xmm0, [eax + ebctx.ohi] + addps xmm6, xmm5 + maxps xmm0, xmm2 + cvttps2dq xmm1, xmm0 ; this is where the actual quantization is + cmpneqps xmm2, xmm5 + pand xmm1, xmm2 ; force 0 if im == 0.0 + cvtdq2ps xmm3, xmm1 + subps xmm6, xmm3 + movdqa xmm0, [eax + ebctx.a] + pcmpeqd xmm4, xmm1 ; 1's when pixel is 0 + ;movdqa xmm1, [eax + ebctx.r] ; for visualizing r buf when testing + movaps xmm7, [edi + edx] + packssdw xmm1, xmm1 + movaps [edi + edx], xmm6 + packuswb xmm1, xmm1 + movd [esp + ecx * 4], xmm1 + + ;; update r + mov esi, [eax + ebctx.a_line] + movdqa xmm2, [eax + ebctx.ones] + pandn xmm0, xmm4 + por xmm2, xmm4 + movdqa xmm1, [eax + ebctx.b] + pandn xmm0, xmm2 + movdqa [esi + edx], xmm0 + mov esi, [eax + ebctx.b_line] + pandn xmm1, xmm4 + movdqa xmm2, [eax + ebctx.aspect2] + por xmm2, xmm4 + pand xmm4, [eax + ebctx.r] + pandn xmm1, xmm2 + movdqa [esi + edx], xmm1 + add ebx, byte 0x10 + mov esi, [eax + ebctx.r_line] + movdqa [esi + edx], xmm4 + add edx, byte 0x10 + add ecx, byte 1 + + cmp ecx, byte 0x10 + jne eb_sse2_core1 + + movdqa [eax + ebctx.r], xmm4 + movdqa [eax + ebctx.a], xmm0 + movdqa [eax + ebctx.b], xmm1 + movaps [eax + ebctx.e], xmm6 + +;;; repack output + mov eax, [ebp + args.destbuf] + mov ecx, [ebp + args.offset] + mov ebx, [eax] + mov edx, [eax + 4] + mov esi, [eax + 8] + mov edi, [eax + 12] + movdqa xmm0, [esp] ; 3d3c3b3a2d2c2b2a1d1c1b1a0d0c0b0a + ;; 0 1 2 3 + movdqa xmm4, xmm0 + movdqa xmm2, [esp + 0x20] + punpckhbw xmm4, xmm2 ; Bd3dBc3cBb3cBa3aAd2dAc2cAb2bAa2a + punpcklbw xmm0, xmm2 ; 9d1d9c1c9b1b9a1a8d0d8c0c8b0b8a0a + movdqa xmm1, [esp + 0x10] ; 7d7c7b7a6d6c6b6a5d5c5b5a4d4c4b4a + movdqa xmm2, xmm1 + movdqa xmm3, [esp + 0x30] + punpcklbw xmm2, xmm3 ; Dd5dDc5cDb5cDa5aCd4dCc4cCb4bCa4a + punpckhbw xmm1, xmm3 ; Fd7dFc7cFb7bFa7aEd6dEc6cEb6bEa6a + ;; 0 4 2 1 + movdqa xmm3, xmm0 + punpckhbw xmm3, xmm2 + punpcklbw xmm0, xmm2 + movdqa xmm2, xmm4 + punpcklbw xmm4, xmm1 + punpckhbw xmm2, xmm1 + ;; 0 3 4 2 + movdqa xmm1, xmm0 + punpckhbw xmm1, xmm4 + punpcklbw xmm0, xmm4 + movdqa xmm4, xmm3 + punpcklbw xmm4, xmm2 + punpckhbw xmm3, xmm2 + ;; 0 1 4 3 + movdqa xmm2, xmm0 + punpckhbw xmm2, xmm4 + movdqa [edx + ecx], xmm2 + punpcklbw xmm0, xmm4 + movdqa [ebx + ecx], xmm0 ; FaEaDaCaBaAa9a8a7a6a5a4a3a2a1a0a + movdqa xmm4, xmm1 + punpcklbw xmm4, xmm3 + movdqa [esi + ecx], xmm4 + punpckhbw xmm1, xmm3 + movdqa [edi + ecx], xmm1 + ;; 0 2 4 1 + + mov esi, [ebp - 12] + mov edi, [ebp - 8] + mov ebx, [ebp - 4] + leave + ret + + global _eb_sse2_rev_rs +_eb_sse2_rev_rs: + struc rargs +.header resb 8 +.ctx resd 1 ; context +.offset resd 1 ; offset (in pixels) + endstruc + push ebp + mov ebp, esp + push edi + push esi + + mov eax, [ebp + rargs.ctx] + mov ecx, [ebp + rargs.offset] + shl ecx, 4 + mov esi, [eax + ebctx.r_line] + add esi, ecx + mov edi, [eax + ebctx.a_line] + add edi, ecx + mov edx, [eax + ebctx.b_line] + add edx, ecx + movdqa xmm0, [eax + ebctx.r] + movdqa xmm1, [eax + ebctx.a] + movdqa xmm7, [eax + ebctx.aspect2] + paddd xmm7, xmm7 + movdqa xmm2, [eax + ebctx.b] + mov ecx, 0x10 +eb_rev_rs1: + movdqa xmm3, [esi] ; pr[i] + paddd xmm0, xmm1 + movdqa xmm4, [edx] ; pb[i] + movdqa xmm6, xmm4 + movdqa xmm5, xmm0 + paddd xmm6, xmm3 + paddd xmm5, xmm2 + pcmpgtd xmm5, xmm6 ; 1's if rv + bv + av > pr[i] + pb[i] + paddd xmm1, [eax + ebctx.twos] + pxor xmm3, xmm0 + pxor xmm4, xmm2 + pand xmm3, xmm5 + pand xmm4, xmm5 + pxor xmm0, xmm3 + pxor xmm2, xmm4 + movdqa xmm4, [edi] ; pa[i] + movdqa xmm3, xmm0 + pxor xmm4, xmm1 + movdqa xmm6, xmm2 + paddd xmm3, xmm2 + paddd xmm6, xmm7 + movdqa [esi], xmm3 ; pr[i] = rv + bv + pand xmm4, xmm5 + movdqa [edx], xmm6 ; pb[i] = bv + 2 * aspect_2 + pxor xmm1, xmm4 + movdqa [edi], xmm1 ; pa[i] = av + sub edi, byte 0x10 + sub edx, byte 0x10 + sub esi, byte 0x10 + sub ecx, byte 1 + jne eb_rev_rs1 + movdqa [eax + ebctx.r], xmm0 + movdqa [eax + ebctx.a], xmm1 + movdqa [eax + ebctx.b], xmm2 + + pop esi + pop edi + leave + ret + diff --git a/gs/toolbin/halftone/ETS/build.bat b/gs/toolbin/halftone/ETS/build.bat new file mode 100644 index 000000000..2542a9b45 --- /dev/null +++ b/gs/toolbin/halftone/ETS/build.bat @@ -0,0 +1,3 @@ +cl -c test_evenbetter.c +cl /O2 /DUSE_SSE2 -c evenbetter-rll.c +link /SUBSYSTEM:CONSOLE /OUT:test_evenbetter.exe test_evenbetter.obj evenbetter-rll.obj _eb_sse2.obj /NODEFAULTLIB:LIBC.lib /NODEFAULTLIB:LIBCMTD.lib LIBCMT.lib shell32.lib comdlg32.lib gdi32.lib user32.lib winspool.lib advapi32.lib diff --git a/gs/toolbin/halftone/ETS/eb_avec.c b/gs/toolbin/halftone/ETS/eb_avec.c new file mode 100644 index 000000000..92ac87b41 --- /dev/null +++ b/gs/toolbin/halftone/ETS/eb_avec.c @@ -0,0 +1,691 @@ +#ifdef HAVE_ALTIVEC_H +#include <altivec.h> +#endif + +#include <stdio.h> /* for FILE, just so we can include evenbetter-rll.h" */ +#include "evenbetter-rll.h" /* for ET_SrcPixel */ +#include "eb_avec.h" + +void +eb_avec_core(eb_ctx_avec *ctx, vector unsigned char *destbuf[4], + eb_srcbuf *srcbuf, int offset, const signed char *tmbase) +{ + vector float e; + vector float e_i_1; + vector unsigned int r; + vector unsigned int a; + vector unsigned int b; + vector unsigned int *r_line = ctx->r_line; + vector unsigned int *a_line = ctx->a_line; + vector unsigned int *b_line = ctx->b_line; + vector unsigned int r_i; + vector unsigned int a_i; + vector unsigned int b_i; + vector unsigned int u_0, u_1; + vector unsigned short u16_0; + vector unsigned char u8_0, u8_1, u8_2, u8_3, u8_4, u8_5, u8_6, u8_7; + vector bool int b_0, b_1; + vector float f_0, f_1, f_2, f_3, f_4; + vector float *iir_line; + vector float zero = (vector float) vec_splat_u32(0); + vector float kernel = ctx->kernel; + vector float r_mul = ctx->r_mul; + vector float elo = ctx->elo; + vector float ehi = ctx->ehi; + vector float ohi = ctx->ohi; + vector unsigned int aspect2 = ctx->aspect2; + vector unsigned int ones = vec_splat_u32(1); + vector unsigned int twos = vec_splat_u32(2); + vector float mseveneighths = { -0.875, -0.875, -0.875, -0.875 }; + vector float im; + vector float rb; + vector float rs; + vector float e_q; + vector unsigned char tmpbuf[4]; + int i, off; + int ctrl_w = 0x10100010; + vector signed char tmvec; + vector unsigned char tmperm; + + e = ctx->e; + e_i_1 = ctx->e_i_1; + r = ctx->r; + a = ctx->a; + b = ctx->b; + off = offset; + iir_line = ctx->iir_line + off; + + vec_dst(&a_line[off], ctrl_w, 0); + vec_dst(&b_line[off], ctrl_w, 1); + vec_dst(&r_line[off], ctrl_w, 2); + vec_dst(iir_line, ctrl_w + 0x10000, 3); + + for (i = 0; i < 16; i++) { + r_i = r_line[off]; + u_0 = vec_adds(r, a); + b_0 = vec_cmpgt(r_i, u_0); + r = vec_sel(r_i, u_0, b_0); + a_i = a_line[off]; + u_1 = vec_adds(a, twos); + a = vec_sel(a_i, u_1, b_0); + b_i = b_line[off]; + b = vec_sel(b_i, b, b_0); + + /* compute FS kernel */ + im = srcbuf->im[i]; + rb = srcbuf->rb[i]; + rs = srcbuf->rs[i]; + f_3 = vec_ctf(r, 0); + f_3 = vec_madd(f_3, r_mul, rb); + // f_4 = vec_abs(f_3); + // f_3 = vec_madd(f_4, mseveneighths, f_3); + f_1 = vec_splat(kernel, 3); + e = vec_madd(f_1, e, zero); + f_1 = vec_splat(kernel, 0); + e = vec_madd(f_1, e_i_1, e); + e_i_1 = iir_line[0]; + f_1 = vec_splat(kernel, 1); + f_2 = iir_line[1]; + e = vec_madd(f_1, f_2, e); + f_1 = vec_splat(kernel, 2); + e = vec_madd(f_1, e_i_1, e); + + /* add threshold modulation */ + tmvec = vec_lde(i, tmbase); + tmperm = vec_lvsl(i, tmbase); + tmvec = vec_perm(tmvec, tmvec, tmperm); + tmvec = vec_splat(tmvec, 0); + f_0 = vec_ctf((vector signed int)tmvec, 0); + e_q = vec_madd(f_0, rs, e); + e_q = vec_add(e_q, f_3); + + e_q = vec_min(e_q, ehi); + e_q = vec_max(e_q, elo); + e_q = vec_add(e_q, im); + e_q = vec_min(e_q, ohi); + + u_0 = vec_ctu(e_q, 0); /* quantization step */ + b_0 = vec_cmpeq(im, zero); + u_0 = vec_andc(u_0, b_0); /* force 0 if im == 0.0 */ + u16_0 = vec_packs(u_0, u_0); + u8_0 = vec_packs(u16_0, u16_0); + vec_ste((vector unsigned int)u8_0, 0, &((unsigned int *)tmpbuf)[i]); + f_0 = vec_ctf(u_0, 0); + e = vec_add(e, im); + e = vec_sub(e, f_0); + iir_line[0] = e; + + /* update r */ + b_1 = vec_cmpeq(u_0, (vector unsigned int)zero); + a = vec_sel(ones, a, b_1); + b = vec_sel(aspect2, b, b_1); + r = vec_and(r, b_1); + a_line[off] = a; + b_line[off] = b; + r_line[off] = r; + + iir_line++; + off++; + } + ctx->e = e; + ctx->e_i_1 = e_i_1; + ctx->r = r; + ctx->a = a; + ctx->b = b; + + /* repack output */ + u8_0 = tmpbuf[0]; /* 0a0b0c0d1a1b1c1d2a2b2c2d3a3b3c3d */ + u8_1 = tmpbuf[1]; + u8_2 = tmpbuf[2]; + u8_3 = tmpbuf[3]; + u8_4 = vec_mergeh(u8_0, u8_2); /* 0a8a0b8b0c8c0d8d1a9a1b8b1c8c1d8d */ + u8_5 = vec_mergel(u8_0, u8_2); /* 2aAa... 3dBd */ + u8_6 = vec_mergeh(u8_1, u8_3); /* 4aCa... 5dDd */ + u8_7 = vec_mergel(u8_1, u8_3); /* 6aEa... 7dFd */ + u8_0 = vec_mergeh(u8_4, u8_6); /* 0a4a8aCa0b4b8bCb... 8dCd */ + u8_1 = vec_mergel(u8_4, u8_6); /* 1a5a9aDa0b5b9bDb... 9dDd */ + u8_2 = vec_mergeh(u8_5, u8_7); /* 2a6aAaEa... AdEd */ + u8_3 = vec_mergel(u8_5, u8_7); /* 3a7aBaFa.. . BdFd */ + u8_4 = vec_mergeh(u8_0, u8_2); /* 0a2a4a6a8aAaCaEa... CbEb */ + u8_5 = vec_mergel(u8_0, u8_2); /* 0c2c... CdEd */ + u8_6 = vec_mergeh(u8_1, u8_3); /* 1a3a... DbFb */ + u8_7 = vec_mergel(u8_1, u8_3); /* 1c3c... DdFd */ + u8_0 = vec_mergeh(u8_4, u8_6); /* 0a1a2a3a... EaFa */ + u8_1 = vec_mergel(u8_4, u8_6); /* 0b1b2b3b... EbFb */ + u8_2 = vec_mergeh(u8_5, u8_7); /* 0c1c2c3c... EcFc */ + u8_3 = vec_mergel(u8_5, u8_7); /* 0d1d2d3d... . EcFd */ + destbuf[0][offset >> 4] = u8_0; + destbuf[1][offset >> 4] = u8_1; + destbuf[2][offset >> 4] = u8_2; + destbuf[3][offset >> 4] = u8_3; + +} + +void +eb_avec_rev_rs(eb_ctx_avec *ctx, int offset) +{ + int i; + vector unsigned int *r_line = ctx->r_line; + vector unsigned int *a_line = ctx->a_line; + vector unsigned int *b_line = ctx->b_line; + vector unsigned int r; + vector unsigned int a; + vector unsigned int b; + vector unsigned int r_i; + vector unsigned int a_i; + vector unsigned int b_i; + vector unsigned int u_0, u_1, u_2, u_3, u_4, u_5; + vector unsigned int aspect2 = ctx->aspect2; + vector unsigned int twice_aspect2 = vec_add(aspect2, aspect2); + vector unsigned int twos = vec_splat_u32(2); + vector bool int b_0; + unsigned int ctrl_w = 0x1010fff0; + + r = ctx->r; + a = ctx->a; + b = ctx->b; + + vec_dst(&a_line[offset], ctrl_w, 0); + vec_dst(&b_line[offset], ctrl_w, 1); + vec_dst(&r_line[offset], ctrl_w, 2); + + for (i = 0; i < 16; i++) { + r_i = r_line[offset]; + a_i = a_line[offset]; + b_i = b_line[offset]; + u_0 = vec_adds(r, a); + u_1 = vec_adds(u_0, b); + u_2 = vec_adds(r_i, b_i); + b_0 = vec_cmpgt(u_2, u_1); + u_3 = vec_adds(a, twos); + r = vec_sel(r_i, u_0, b_0); + a = vec_sel(a_i, u_3, b_0); + b = vec_sel(b_i, b, b_0); + a_line[offset] = a; + u_4 = vec_adds(b, twice_aspect2); + b_line[offset] = u_4; + u_5 = vec_adds(r, b); + r_line[offset] = u_5; + offset--; + } + ctx->r = r; + ctx->a = a; + ctx->b = b; +} + +/* Prepare a source buffer from 8-bit input. Return 0 if source is + all-zero. */ +int +eb_avec_prep_srcbuf(eb_ctx_avec *ctx, int n_planes, + eb_srcbuf *srcbuf, const ET_SrcPixel *const *src, + int off) +{ + vector unsigned char c0, c1, c2, c3, c4, c5, c6, c7; + vector unsigned char zero = vec_splat_u8(0); + vector unsigned short s0, s1; + vector unsigned int u0; + vector float f0, f1; + vector bool int b0; + vector float imscale1 = ctx->imscale1; + vector float imscale2 = ctx->imscale2; + vector float rbmul = ctx->rbmul; + vector float rsbase = ctx->rsbase; + vector float onehalf = { 0.5, 0.5, 0.5, 0.5 }; + + c0 = ((vector unsigned char *)src[0])[off >> 4]; + c1 = n_planes > 1 ? ((vector unsigned char *)src[1])[off >> 4] : zero; + c2 = n_planes > 2 ? ((vector unsigned char *)src[2])[off >> 4] : zero; + c3 = n_planes > 3 ? ((vector unsigned char *)src[3])[off >> 4] : zero; + + /* check for zeros */ + c4 = vec_or(c0, c1); + c5 = vec_or(c2, c3); + c4 = vec_or(c4, c5); + if (vec_all_eq(c4, zero)) + return 0; + + c4 = vec_mergeh(c0, c2); /* C0 Y0 .. C7 Y7 */ + c5 = vec_mergeh(c1, c3); /* M0 K0 .. M7 K7 */ + c6 = vec_mergel(c0, c2); /* C8 Y8 ... */ + c7 = vec_mergel(c1, c3); + + c0 = vec_mergeh(c4, c5); /* C0 M0 Y0 K0 ... C3 M3 Y3 K3 */ + + if (*((float *)&ctx->imscale2) == 0.0) { + s0 = (vector unsigned short)vec_mergeh(zero, c0); + s1 = (vector unsigned short)vec_mergel(zero, c0); + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[0] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[0] = (vector float)f0; + srcbuf->rs[0] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[1] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[1] = (vector float)f0; + srcbuf->rs[1] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[2] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[2] = (vector float)f0; + srcbuf->rs[2] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[3] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[3] = (vector float)f0; + srcbuf->rs[3] = (vector float)rsbase; + + c0 = vec_mergel(c4, c5); /* C4 M4 Y4 K4 ... C7 M7 Y7 K7 */ + s0 = (vector unsigned short)vec_mergeh(zero, c0); + s1 = (vector unsigned short)vec_mergel(zero, c0); + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[4] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[4] = (vector float)f0; + srcbuf->rs[4] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[5] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[5] = (vector float)f0; + srcbuf->rs[5] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[6] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[6] = (vector float)f0; + srcbuf->rs[6] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[7] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[7] = (vector float)f0; + srcbuf->rs[7] = (vector float)rsbase; + + c0 = vec_mergeh(c6, c7); /* C8 M8 Y8 K8 ... Cb Mb Yb Kb */ + s0 = (vector unsigned short)vec_mergeh(zero, c0); + s1 = (vector unsigned short)vec_mergel(zero, c0); + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[8] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[8] = (vector float)f0; + srcbuf->rs[8] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[9] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[9] = (vector float)f0; + srcbuf->rs[9] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[10] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[10] = (vector float)f0; + srcbuf->rs[10] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[11] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[11] = (vector float)f0; + srcbuf->rs[11] = (vector float)rsbase; + + c0 = vec_mergel(c6, c7); /* Cc Mc Yc Kc ... Cf Mf Yf Kf */ + s0 = (vector unsigned short)vec_mergeh(zero, c0); + s1 = (vector unsigned short)vec_mergel(zero, c0); + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[12] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[12] = (vector float)f0; + srcbuf->rs[12] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[13] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[13] = (vector float)f0; + srcbuf->rs[13] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[14] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[14] = (vector float)f0; + srcbuf->rs[14] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f0 = vec_madd(f0, imscale1, (vector float)zero); + srcbuf->im[15] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[15] = (vector float)f0; + srcbuf->rs[15] = (vector float)rsbase; + } else { + vector float foff = ctx->foff; + c0 = vec_nor(c0, c0); + s0 = (vector unsigned short)vec_mergeh(zero, c0); + s1 = (vector unsigned short)vec_mergel(zero, c0); + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[0] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[0] = (vector float)f0; + srcbuf->rs[0] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[1] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[1] = (vector float)f0; + srcbuf->rs[1] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[2] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[2] = (vector float)f0; + srcbuf->rs[2] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[3] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[3] = (vector float)f0; + srcbuf->rs[3] = (vector float)rsbase; + + c0 = vec_mergel(c4, c5); /* C4 M4 Y4 K4 ... C7 M7 Y7 K7 */ + c0 = vec_nor(c0, c0); + s0 = (vector unsigned short)vec_mergeh(zero, c0); + s1 = (vector unsigned short)vec_mergel(zero, c0); + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[4] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[4] = (vector float)f0; + srcbuf->rs[4] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[5] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[5] = (vector float)f0; + srcbuf->rs[5] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[6] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[6] = (vector float)f0; + srcbuf->rs[6] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[7] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[7] = (vector float)f0; + srcbuf->rs[7] = (vector float)rsbase; + + c0 = vec_mergeh(c6, c7); /* C8 M8 Y8 K8 ... Cb Mb Yb Kb */ + c0 = vec_nor(c0, c0); + s0 = (vector unsigned short)vec_mergeh(zero, c0); + s1 = (vector unsigned short)vec_mergel(zero, c0); + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[8] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[8] = (vector float)f0; + srcbuf->rs[8] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[9] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[9] = (vector float)f0; + srcbuf->rs[9] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[10] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[10] = (vector float)f0; + srcbuf->rs[10] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[11] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[11] = (vector float)f0; + srcbuf->rs[11] = (vector float)rsbase; + + c0 = vec_mergel(c6, c7); /* Cc Mc Yc Kc ... Cf Mf Yf Kf */ + c0 = vec_nor(c0, c0); + s0 = (vector unsigned short)vec_mergeh(zero, c0); + s1 = (vector unsigned short)vec_mergel(zero, c0); + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[12] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[12] = (vector float)f0; + srcbuf->rs[12] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s0); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[13] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[13] = (vector float)f0; + srcbuf->rs[13] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergeh((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[14] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[14] = (vector float)f0; + srcbuf->rs[14] = (vector float)rsbase; + + u0 = (vector unsigned int)vec_mergel((vector unsigned short)zero, s1); + f0 = vec_ctf(u0, 8); + /* scale, do gamma here */ + f1 = vec_rsqrte(f0); + f1 = vec_madd(f1, f0, (vector float)zero); + f1 = vec_nmsub(f1, imscale2, foff); + f0 = vec_nmsub(f0, imscale1, f1); + b0 = vec_cmpge(f0, (vector float)zero); + f0 = vec_sel(foff, f0, b0); + srcbuf->im[15] = f0; + f0 = vec_re(f0); + f0 = vec_madd(f0, rbmul, onehalf); + srcbuf->rb[15] = (vector float)f0; + srcbuf->rs[15] = (vector float)rsbase; + } + + return 1; +} diff --git a/gs/toolbin/halftone/ETS/eb_avec.h b/gs/toolbin/halftone/ETS/eb_avec.h new file mode 100644 index 000000000..fcdb56821 --- /dev/null +++ b/gs/toolbin/halftone/ETS/eb_avec.h @@ -0,0 +1,44 @@ +typedef struct _eb_ctx_avec eb_ctx_avec; +typedef struct _eb_srcbuf eb_srcbuf; + +struct _eb_ctx_avec { + int xs; + float *luts[4]; + vector float *iir_line; + vector unsigned int *r_line; + vector unsigned int *a_line; + vector unsigned int *b_line; + char *skip_line; + vector float e; + vector float e_i_1; + vector unsigned int r; + vector unsigned int a; + vector unsigned int b; + vector unsigned int aspect2; + vector float ehi; + vector float elo; + vector float ohi; + vector float r_mul; + vector float kernel; + vector float imscale1; + vector float imscale2; + vector float foff; + vector float rbmul; + vector float rsbase; +}; + +struct _eb_srcbuf { + vector float im[16]; + vector float rb[16]; + vector float rs[16]; +}; + +void eb_avec_core(eb_ctx_avec *ctx, vector unsigned char *destbuf[4], + eb_srcbuf *srcbuf, int offset, const signed char *tmbase); + +void eb_avec_rev_rs(eb_ctx_avec *ctx, int offset); + +int +eb_avec_prep_srcbuf(eb_ctx_avec *ctx, int n_planes, + eb_srcbuf *srcbuf, const ET_SrcPixel *const *src, + int off); diff --git a/gs/toolbin/halftone/ETS/eb_sse2.s b/gs/toolbin/halftone/ETS/eb_sse2.s new file mode 100644 index 000000000..835e767ff --- /dev/null +++ b/gs/toolbin/halftone/ETS/eb_sse2.s @@ -0,0 +1,344 @@ +;;; Implementation of Even Better core in SSE2 instruction set + + struc ebctx +.xs resd 1 +.iir_line resd 1 +.r_line resd 1 +.a_line resd 1 +.b_line resd 1 +.dummy resd 3 +.luts resd 4 +.e resb 16 +.e_i_1 resb 16 +.r resb 16 +.a resb 16 +.b resb 16 +.ones resb 16 +.twos resb 16 +.aspect2 resb 16 +.ehi resd 4 +.elo resd 4 +.ohi resd 4 +.r_mul resd 4 +.kernel resd 4 +.seed1 resd 4 +.seed2 resd 4 +.tmmat resd 4 +.y resd 4 + endstruc + + struc srcbuf +.im resd 64 ; image in floating pt +.rb resd 64 ; 0.5 - rb_lut, in floating pt +.rs resd 64 ; scale for randomness + endstruc + +;;; some of the optimization is tricky. For a = c ? a : b, we write: +;;; pandn a, c ; a = (~a & c) +;;; por b, c ; b = (b | c) +;;; pandn a, b ; a = (~(~a & c)) & (b | c) +;;; For the converse, a = c ? b : a, we write: +;;; pxor b, a ; b = (a ^ b) +;;; pand b, c ; b = (a ^ b) & c +;;; pxor a, b ; a = a ^ ((a ^ b) & c) + + global eb_test_sse2 +eb_test_sse2: + push ebx + mov eax, 1 + cpuid + mov eax, edx + shr eax, 26 + and eax, byte 1 + jz eb_test_sse2_1 + +eb_test_sse2_1: + pop ebx + ret + + global eb_sse2_set_daz +eb_sse2_set_daz: + sub esp, 4 + stmxcsr [esp] + mov eax, [esp] + or word [esp], 0x8040 + ldmxcsr [esp] + add esp, 4 + ret + + global eb_sse2_restore_daz +eb_sse2_restore_daz: + ldmxcsr [esp + 4] + ret + + global eb_sse2_core +eb_sse2_core: +;;; screen one block of 16 pixels, 4 planes + struc args +.header resb 8 +.ctx resd 1 ; context +.destbuf resd 1 ; dest buffers +.srcbuf resd 1 ; source buffer struct +.offset resd 1 ; offset (in pixels) +.tmbase resd 1 ; base addr of threshold mod matrix + endstruc + push ebp + mov ebp, esp + push ebx + push edi + push esi + + struc frame +.obuf resb 64 + endstruc + sub esp, frame_size +;;; align esp to 128-bit boundary + and esp, byte -0x10 + + mov eax, [ebp + args.ctx] + mov ebx, [ebp + args.srcbuf] + mov ecx, 0 + mov edx, [ebp + args.offset] + shl edx, 4 + mov edi, [eax + ebctx.iir_line] + + movaps xmm6, [eax + ebctx.e] + movdqa xmm4, [eax + ebctx.r] + movdqa xmm0, [eax + ebctx.a] + movdqa xmm1, [eax + ebctx.b] + +eb_sse2_core1: +;;; pixel loop + ;; invariant: xmm4 = r, xmm0 = a, xmm1 = b + mov esi, [eax + ebctx.r_line] + paddd xmm4, xmm0 + movdqa xmm3, [esi + edx] ; r[i] + movdqa xmm2, xmm3 + movaps xmm7, [eax + ebctx.e_i_1] + pcmpgtd xmm3, xmm4 ; xmm3 is ones if r + a < rline[x] + mov esi, [eax + ebctx.a_line] + pxor xmm4, xmm2 + movdqa xmm5, [esi + edx] ; a[i] + pand xmm4, xmm3 + paddd xmm0, [eax + ebctx.twos] + pxor xmm2, xmm4 ; r = ... ? r + a : r[i] + movdqa [eax + ebctx.r], xmm2 + pandn xmm0, xmm3 + mov esi, [eax + ebctx.b_line] + por xmm5, xmm3 + + pandn xmm0, xmm5 ; a = ... ? a + 2 : a[i] + movdqa xmm5, [esi + edx] ; b[i] + pandn xmm1, xmm3 + movdqa [eax + ebctx.a], xmm0 + por xmm5, xmm3 + movaps xmm3, [eax + ebctx.kernel] + pandn xmm1, xmm5 ; b = ... ? b : b[i] + movdqa [eax + ebctx.b], xmm1 + + ;; xmm2 = r (updated) + + + mov esi, [ebp + args.tmbase] + xor eax, eax + mov al, [esi + ecx] + shl eax, 24 ; could avoid this by changing the rand lut + cvtsi2ss xmm4, eax + pshufd xmm4, xmm4, 0 + ;; note: if we swapped eax and esi, we could probably avoid this + mov eax, [ebp + args.ctx] + + ;; compute FS kernel + pshufd xmm1, xmm3, 0x00 ; 1/16 + mulps xmm1, xmm7 + movaps xmm7, [edi + edx] ; e_i + pshufd xmm5, xmm3, 0xff ; 7/16 + mulps xmm6, xmm5 + cvtdq2ps xmm2, xmm2 + mulps xmm2, [eax + ebctx.r_mul] + addps xmm6, xmm1 + mulps xmm4, [ebx + srcbuf.rs] + pshufd xmm0, xmm3, 0xaa ; 5/16 + mulps xmm0, xmm7 + addps xmm2, [ebx + srcbuf.rb] + pshufd xmm3, xmm3, 0x55 ; 3/16 + movaps [eax + ebctx.e_i_1], xmm7 + addps xmm0, xmm6 + movdqa xmm5, [ebx + srcbuf.im] + mulps xmm3, [edi + edx + 0x10] ; e[i+1] + addps xmm2, xmm4 + + addps xmm0, xmm3 + + movaps xmm6, xmm0 + addps xmm0, xmm2 + minps xmm0, [eax + ebctx.ehi] + pxor xmm4, xmm4 + maxps xmm0, [eax + ebctx.elo] + addps xmm0, xmm5 + subps xmm2, xmm2 + minps xmm0, [eax + ebctx.ohi] + addps xmm6, xmm5 + maxps xmm0, xmm2 + cvttps2dq xmm1, xmm0 ; this is where the actual quantization is + cmpneqps xmm2, xmm5 + pand xmm1, xmm2 ; force 0 if im == 0.0 + cvtdq2ps xmm3, xmm1 + subps xmm6, xmm3 + movdqa xmm0, [eax + ebctx.a] + pcmpeqd xmm4, xmm1 ; 1's when pixel is 0 + ;movdqa xmm1, [eax + ebctx.r] ; for visualizing r buf when testing + movaps xmm7, [edi + edx] + packssdw xmm1, xmm1 + movaps [edi + edx], xmm6 + packuswb xmm1, xmm1 + movd [esp + ecx * 4], xmm1 + + ;; update r + mov esi, [eax + ebctx.a_line] + movdqa xmm2, [eax + ebctx.ones] + pandn xmm0, xmm4 + por xmm2, xmm4 + movdqa xmm1, [eax + ebctx.b] + pandn xmm0, xmm2 + movdqa [esi + edx], xmm0 + mov esi, [eax + ebctx.b_line] + pandn xmm1, xmm4 + movdqa xmm2, [eax + ebctx.aspect2] + por xmm2, xmm4 + pand xmm4, [eax + ebctx.r] + pandn xmm1, xmm2 + movdqa [esi + edx], xmm1 + add ebx, byte 0x10 + mov esi, [eax + ebctx.r_line] + movdqa [esi + edx], xmm4 + add edx, byte 0x10 + add ecx, byte 1 + + cmp ecx, byte 0x10 + jne eb_sse2_core1 + + movdqa [eax + ebctx.r], xmm4 + movdqa [eax + ebctx.a], xmm0 + movdqa [eax + ebctx.b], xmm1 + movaps [eax + ebctx.e], xmm6 + +;;; repack output + mov eax, [ebp + args.destbuf] + mov ecx, [ebp + args.offset] + mov ebx, [eax] + mov edx, [eax + 4] + mov esi, [eax + 8] + mov edi, [eax + 12] + movdqa xmm0, [esp] ; 3d3c3b3a2d2c2b2a1d1c1b1a0d0c0b0a + ;; 0 1 2 3 + movdqa xmm4, xmm0 + movdqa xmm2, [esp + 0x20] + punpckhbw xmm4, xmm2 ; Bd3dBc3cBb3cBa3aAd2dAc2cAb2bAa2a + punpcklbw xmm0, xmm2 ; 9d1d9c1c9b1b9a1a8d0d8c0c8b0b8a0a + movdqa xmm1, [esp + 0x10] ; 7d7c7b7a6d6c6b6a5d5c5b5a4d4c4b4a + movdqa xmm2, xmm1 + movdqa xmm3, [esp + 0x30] + punpcklbw xmm2, xmm3 ; Dd5dDc5cDb5cDa5aCd4dCc4cCb4bCa4a + punpckhbw xmm1, xmm3 ; Fd7dFc7cFb7bFa7aEd6dEc6cEb6bEa6a + ;; 0 4 2 1 + movdqa xmm3, xmm0 + punpckhbw xmm3, xmm2 + punpcklbw xmm0, xmm2 + movdqa xmm2, xmm4 + punpcklbw xmm4, xmm1 + punpckhbw xmm2, xmm1 + ;; 0 3 4 2 + movdqa xmm1, xmm0 + punpckhbw xmm1, xmm4 + punpcklbw xmm0, xmm4 + movdqa xmm4, xmm3 + punpcklbw xmm4, xmm2 + punpckhbw xmm3, xmm2 + ;; 0 1 4 3 + movdqa xmm2, xmm0 + punpckhbw xmm2, xmm4 + movdqa [edx + ecx], xmm2 + punpcklbw xmm0, xmm4 + movdqa [ebx + ecx], xmm0 ; FaEaDaCaBaAa9a8a7a6a5a4a3a2a1a0a + movdqa xmm4, xmm1 + punpcklbw xmm4, xmm3 + movdqa [esi + ecx], xmm4 + punpckhbw xmm1, xmm3 + movdqa [edi + ecx], xmm1 + ;; 0 2 4 1 + + mov esi, [ebp - 12] + mov edi, [ebp - 8] + mov ebx, [ebp - 4] + leave + ret + + global eb_sse2_rev_rs +eb_sse2_rev_rs: + struc rargs +.header resb 8 +.ctx resd 1 ; context +.offset resd 1 ; offset (in pixels) + endstruc + push ebp + mov ebp, esp + push edi + push esi + + mov eax, [ebp + rargs.ctx] + mov ecx, [ebp + rargs.offset] + shl ecx, 4 + mov esi, [eax + ebctx.r_line] + add esi, ecx + mov edi, [eax + ebctx.a_line] + add edi, ecx + mov edx, [eax + ebctx.b_line] + add edx, ecx + movdqa xmm0, [eax + ebctx.r] + movdqa xmm1, [eax + ebctx.a] + movdqa xmm7, [eax + ebctx.aspect2] + paddd xmm7, xmm7 + movdqa xmm2, [eax + ebctx.b] + mov ecx, 0x10 +eb_rev_rs1: + movdqa xmm3, [esi] ; pr[i] + paddd xmm0, xmm1 + movdqa xmm4, [edx] ; pb[i] + movdqa xmm6, xmm4 + movdqa xmm5, xmm0 + paddd xmm6, xmm3 + paddd xmm5, xmm2 + pcmpgtd xmm5, xmm6 ; 1's if rv + bv + av > pr[i] + pb[i] + paddd xmm1, [eax + ebctx.twos] + pxor xmm3, xmm0 + pxor xmm4, xmm2 + pand xmm3, xmm5 + pand xmm4, xmm5 + pxor xmm0, xmm3 + pxor xmm2, xmm4 + movdqa xmm4, [edi] ; pa[i] + movdqa xmm3, xmm0 + pxor xmm4, xmm1 + movdqa xmm6, xmm2 + paddd xmm3, xmm2 + paddd xmm6, xmm7 + movdqa [esi], xmm3 ; pr[i] = rv + bv + pand xmm4, xmm5 + movdqa [edx], xmm6 ; pb[i] = bv + 2 * aspect_2 + pxor xmm1, xmm4 + movdqa [edi], xmm1 ; pa[i] = av + sub edi, byte 0x10 + sub edx, byte 0x10 + sub esi, byte 0x10 + sub ecx, byte 1 + jne eb_rev_rs1 + movdqa [eax + ebctx.r], xmm0 + movdqa [eax + ebctx.a], xmm1 + movdqa [eax + ebctx.b], xmm2 + + pop esi + pop edi + leave + ret + diff --git a/gs/toolbin/halftone/ETS/ei03.pdf b/gs/toolbin/halftone/ETS/ei03.pdf Binary files differnew file mode 100644 index 000000000..0a6a54b2b --- /dev/null +++ b/gs/toolbin/halftone/ETS/ei03.pdf diff --git a/gs/toolbin/halftone/ETS/ets.c b/gs/toolbin/halftone/ETS/ets.c new file mode 100644 index 000000000..3e8ecbd98 --- /dev/null +++ b/gs/toolbin/halftone/ETS/ets.c @@ -0,0 +1,900 @@ + /* + * Testbed implementation of Even Better Screening. Please see + * http://www.artofcode.com/eventone/ for more details. + * + * Copyright 2001-2004 Raph Levien <raph@acm.org> + * + * Code in this module is covered by US Patents 5,055,942 and + * 5,917,614, and corresponding international patents. This version + * of ETS is for commercial licensees and is governed by the licensing + * agreement between artofcode LLC and the licensee. Please see + * http://www.artofcode.com/eventone/ for information on licensing. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> +#include "ets.h" + +/* source for threshold matrix - need to improve build process */ +#include "tm.h" + +#define ETS_VERSION 150 + +#define ETS_SHIFT 16 +#define IMO_SHIFT 14 + +#define FANCY_COUPLING + +typedef struct _ETS_PlaneCtx ETS_PlaneCtx; +typedef unsigned int uint32; + +struct _ETS_Ctx { + int width; + int n_planes; + int levels; /* Number of levels on output, <= 256 */ + ETS_PlaneCtx **plane_ctx; + int aspect_x; + int aspect_y; + int *strengths; + int elo; + int ehi; + int *c_line; + + int ets_style; + int r_style; + + uint32 seed1; + uint32 seed2; + + FILE *dump_file; + ETS_DumpLevel dump_level; + + /* Threshold modulation array */ + int y; + int tmwid; + int tmheight; + const signed char *tmmat; +}; + +struct _ETS_PlaneCtx { + int width; /* Width of plane in pixels */ + int *dst_line; /* Output pointer */ + int *err_line; /* Total error carried out of pixel in the line above */ + int *r_line; /* expected distance table (see paper for details) */ + int *a_line; /* expected distance intermediate table (see paper) */ + int *b_line; /* expected distance intermediate table (see paper) */ + int *lut; /* Table to map from input source value to internal + * intensity level. Internal intensity level is 0 to + * 1<<ETS_SHIFT. */ + int *dist_lut; /* A table of "expected distance between set pixels" + * values, stored in fixed point format with (ETS_SHIFT-c1) + * fractional bits. Values outside of the 'level 0-1' band + * will be set to 0 to avoid ETS weighting being used. */ + char *rs_lut; /* Random noise table; values between 0 and 24. x meaning + * use 32-x bits of random noise, */ + int c1; /* Shift adjustment for the dist_lut. */ + int tm_offset;/* Plane offset within tm data */ +}; + +void * +ets_malloc_aligned(int size, int align) +{ + void *result; + void *alloced = malloc(size + align); + int pad; + + if (alloced == 0) + return 0; + pad = ((12 - (int)alloced) & 15) + 4; + result = (void *)(pad + (char *)alloced); + ((int *)result)[-1] = pad; + return result; +} + +void +ets_free_aligned(void *p) +{ + int pad = ((int *)p)[-1]; + free((char*)p - pad); +} + +static double +compute_distscale(const ETS_Params *params) +{ + double distscale = params->distscale; + + if (distscale == 0.0) + { + distscale = -1; + switch(params->aspect_x) + { + case 1: + switch(params->aspect_y) + { + case 1: + distscale = 0.95; + break; + case 2: + distscale = 1.8; + break; + case 3: + distscale = 2.4; /* FIXME */ + break; + case 4: + distscale = 3.6; + break; + } + break; + case 2: + switch(params->aspect_y) + { + case 1: + distscale = 1.8; + break; + case 2: + break; + case 3: + distscale = 1.35; /* FIXME */ + break; + case 4: + break; + } + break; + case 3: + switch(params->aspect_y) + { + case 1: + distscale = 2.4; /* FIXME */ + break; + case 2: + distscale = 1.35; /* FIXME */ + break; + case 3: + break; + case 4: + distscale = 0.675; /* FIXME */ + break; + } + break; + case 4: + switch(params->aspect_y) + { + case 1: + distscale = 3.6; + break; + case 2: + break; + case 3: + distscale = 0.675; /* FIXME */ + break; + case 4: + break; + } + break; + } + if (distscale == -1) + { + fprintf(stderr, "aspect ratio of %d:%d not supported\n", + params->aspect_x, params->aspect_y); + exit(1); + } + } + return distscale; +} + +static int +ets_log2(int x) +{ + int y = 0; + int z; + + for (z = x; z > 1; z = z >> 1) + y++; + return y; +} + +static int +ets_log2up(int x) +{ + return ets_log2(x-1)+1; +} + +static int +compute_randshift(int nl, int rs_base, int levels) +{ + int rs = rs_base; + + if ((nl > (90 << (ETS_SHIFT - 10)) && + nl < (129 << (ETS_SHIFT - 10))) || + (nl > (162 << (ETS_SHIFT - 10)) && + nl < (180 << (ETS_SHIFT - 10)))) + rs--; + else if (nl > (321 << (ETS_SHIFT - 10)) && + nl < (361 << (ETS_SHIFT - 10))) + { + rs--; + if (nl > (331 << (ETS_SHIFT - 10)) && + nl < (351 << (ETS_SHIFT - 10))) + rs--; + } + else if ((nl == (levels - 1) << ETS_SHIFT) && + nl > (((levels - 1) << ETS_SHIFT) - + (1 << (ETS_SHIFT - 2)))) + { + /* don't add randomness in extreme shadows */ + } + else if ((nl > (3 << (ETS_SHIFT - 2)))) + { + nl -= (nl + (1 << (ETS_SHIFT - 2))) & -(1 << (ETS_SHIFT - 1)); + if (nl < 0) nl = -nl; + if (nl < (1 << (ETS_SHIFT - 4))) rs--; + if (nl < (1 << (ETS_SHIFT - 5))) rs--; + if (nl < (1 << (ETS_SHIFT - 6))) rs--; + } + else + { + if (nl < (3 << (ETS_SHIFT - 3))) nl += 1 << (ETS_SHIFT - 2); + nl = nl - (1 << (ETS_SHIFT - 1)); + if (nl < 0) nl = -nl; + if (nl < (1 << (ETS_SHIFT - 4))) rs--; + if (nl < (1 << (ETS_SHIFT - 5))) rs--; + if (nl < (1 << (ETS_SHIFT - 6))) rs--; + } + return rs; +} + +/* Maximum number of planes, but actually we want to dynamically + allocate all scratch buffers that depend on this. */ +#define M 16 + +/** + * ets_line: Screen a line using Even TonenFS screeing. + * @ctx: An #EBPlaneCtx context. + * @dest: Array of destination buffers, 8 bpp pixels each. + * @src: Array of source buffer, ET_SrcPixel pixels each. + * + * Screens a single line using Even ToneFS screening. + **/ +void +ets_line(ETS_Ctx *etc, uchar **dest, const ETS_SrcPixel *const *src) +{ + int a[M], b[M]; + int e_1_0[M], e_m1_1[M], e_0_1[M], e_1_1[M]; + int i; + int im; + int *pa, *pb, *piir, *pr; + int r[M], rg; + int xd; + uint32 seed1 = etc->seed1; + uint32 seed2 = etc->seed2; + uint32 sum; + int plane_idx; + int n_planes = etc->n_planes; + int levels = etc->levels; +#ifdef OLD_QUANT + int dith_mul = levels << 8; +#else + int dith_mul = (levels - 1) << 8; +#endif + int imo_mul = (1 << (ETS_SHIFT + IMO_SHIFT)) / (levels - 1); + int aspect_x2 = etc->aspect_x * etc->aspect_x; + int aspect_y2 = etc->aspect_y * etc->aspect_y; + int *strengths = etc->strengths; + int elo = etc->elo; + int ehi = etc->ehi; + int coupling; + int *c_line = etc->c_line; + int rand_shift; + const signed char *tmline = etc->tmmat + (etc->y % etc->tmheight) * etc->tmwid; + int tmmask = etc->tmwid - 1; + + xd = etc->width; + + /* Setup initial conditions for walking across the scanline. Because we + * are dealing with multiple planes, we have arrays of each variable, + * indexed by p = plane number. + * a[p] = 2x+1 (where x is the horizontal distance to the nearest set pixel) + * b[p] = 2y+1 (where y is the vertical distance to the nearest set pixel) + * r[p] = distance^2 to the nearest set pixel in this plane. + * e_0_1[p] = error from pixel above + * e_1_0[p] = error from pixel to the left + * e_m1_1[p]= error from pixel above right + * e_1_1[p] = error from pixel above left + * Because the source line is run length compressed, we need to run + * length decode it. We do this using the following: + * count[p] = number of pixels left in this run + * src_idx[p] = which run length entry we are currently on. + */ + + /* A potted recap of the distance calculations in the paper for easy + * reference. + * distance to last dot = SQR( (aspect_y * x)^2 + (aspect_x * y)^2 ) + * r = distance^2 = (aspect_y * x)^2 + (aspect_x * y)^2 + * = aspect_y^2 * x^2 + aspect_x^2 * y^2 + * r_below - r = (aspect_x^2 * (y+1)^2) - (aspect_x^2 * y^2) + * = aspect_x^2 * ( (y+1)^2 - y^2 ) + * = aspect_x^2 * ( 2y + 1 ) + * r_under - r = (aspect_y^2 * (x+1)^2) - (aspect_y^2 * x^2) + * = aspect_y^2 * ( (x+1)^2 - x^2 ) + * = aspect_y^2 * ( 2x + 1 ) + * So, we keep: + * a = aspect_y^2 * (2x+1) + * b = aspect_x^2 * (2y+1) + * And we can then update r by adding either a or b at each stage. + */ + for (plane_idx = 0; plane_idx < n_planes; plane_idx++) + { + ETS_PlaneCtx *ctx = etc->plane_ctx[plane_idx]; + + a[plane_idx] = aspect_y2; /* aspect_y^2 * (2x + 1) where x = 0 */ + b[plane_idx] = aspect_x2; /* aspect_x^2 * (2y + 1) where y = 0 */ + r[plane_idx] = 0; + e_0_1[plane_idx] = 0; + e_1_0[plane_idx] = 0; + e_m1_1[plane_idx] = ctx->err_line[0]; + } + + coupling = 0; + + for (i = 0; i < xd; i++) + { +#ifdef FANCY_COUPLING + coupling += c_line[i]; +#else + coupling = 0; +#endif + /* Lookup image data and compute R for all planes. */ + for (plane_idx = 0; plane_idx < n_planes; plane_idx++) + { + ETS_PlaneCtx *ctx = etc->plane_ctx[plane_idx]; + ETS_SrcPixel src_pixel = src[plane_idx][i]; + int new_r; + int c1 = ctx->c1; + int rlimit = 1 << (30 - ETS_SHIFT + c1); + uchar *dst_ptr = dest[plane_idx]; + int new_e_1_0; + int achieved_error; + int err; + int imo; + int expected_r; + + pr = ctx->r_line; + pa = ctx->a_line; + pb = ctx->b_line; + piir = ctx->err_line; + + im = ctx->lut[src_pixel]; /* image pixel (ink level) */ + expected_r = ctx->dist_lut[src_pixel]; /* expected distance */ + rand_shift = ctx->rs_lut[src_pixel]; /* random noise shift */ + + /* Forward pass distance computation; equation 2 from paper */ + if (r[plane_idx] + a[plane_idx] < pr[i]) + { + r[plane_idx] += a[plane_idx]; + a[plane_idx] += 2*aspect_y2; + } + else + { + a[plane_idx] = pa[i]; + b[plane_idx] = pb[i]; + r[plane_idx] = pr[i]; + } + + /* Shuffle all the errors and read the next one. */ + e_1_1[plane_idx] = e_0_1[plane_idx]; + e_0_1[plane_idx] = e_m1_1[plane_idx]; + e_m1_1[plane_idx] = i == xd - 1 ? 0 : piir[i + 1]; + /* Reuse of variables here; new_e_1_0 is the total error passed + * into this pixel, with the traditional fs weights. */ + new_e_1_0 = ((e_1_0[plane_idx] * 7 + e_m1_1[plane_idx] * 3 + + e_0_1[plane_idx] * 5 + e_1_1[plane_idx] * 1) >> 4); + + /* White pixels stay white */ + if (im == 0) + { + dst_ptr[i] = 0; + /* If we are forcing white pixels to stay white, we should + * not propagate errors through them. Or at the very least + * we should attenuate such errors. */ + new_e_1_0 = 0; + } + else + { + /* The guts of ets (Equation 5) */ + int ets_bias; + + if (expected_r == 0) + { + ets_bias = 0; + } + else + { + /* Read the current distance, and clamp to avoid overflow + * in subsequent calculations. */ + new_r = r[plane_idx]; + if (new_r > rlimit) + new_r = rlimit; + /* Should we store back with the limit? */ + + /* Change the units on the distance to match our lut + * and subtract our actual distance (rg) from the expected + * distance (expected_r). */ + rg = new_r << (ETS_SHIFT - c1); + ets_bias = rg - expected_r; + + /* So ets_bias is the difference that we want to base our + * threshold modulation on (section 2.1 of the paper). + * Exactly how do we do that? We present various options + * here. + * 0 no modulation + * 1 what the code did when it came to me. No reference + * to this in the paper. + * 2 use it unchanged. + * 3 like 1, but same shift either side of 0. + * 4+ scale the modulation down. + */ + switch (etc->ets_style) + { + case 0: + ets_bias = 0; + break; + case 1: + if (ets_bias > 0) ets_bias >>= 3; + break; + case 2: + break; + case 3: + ets_bias >>= 3; + break; + default: + ets_bias /= etc->ets_style-3; + } + } + + /* Non white pixels get biased, and have the error + * applied. The error starts from the total error passed + * in. */ + err = new_e_1_0; + + /* Plus any ETS bias (calculated above) */ + err += ets_bias; + + /* Plus any random noise. Again various options here: + * 0 No random noise + * 1 The code as it came to me, using lookup table + * 2 commented out when it came to me; using pseudo + * random numbers generated from seed. + */ + switch(etc->r_style) + { + case 0: + break; + case 2: + /* Add the two seeds together */ + sum = seed1 + seed2; + + /* If the add generated a carry, increment + * the result of the addition. + */ + if (sum < seed1 || sum < seed2) sum++; + + /* Seed2 becomes old seed1, seed1 becomes result */ + seed2 = seed1; + seed1 = sum; + + err -= (sum >> rand_shift) - (0x80000000 >> rand_shift); + break; + case 1: + err += tmline[(i+ctx->tm_offset) & tmmask] << (24 - rand_shift); + break; + } + + /* Clamp the error; this is explained in the paper in + * section 6 just after equation 7. */ + /* FIXME: Understand this better */ + if (err < elo) + err = elo; + else if (err > ehi) + err = ehi; + + /* Add the coupling to our combined 'error + bias' value */ + /* FIXME: Are we sure this shouldn't be clamped? */ + err += coupling; + + /* Calculate imo = the quantised image value (Equation 7) */ +#ifdef OLD_QUANT + imo = ((err + im) * dith_mul) >> (ETS_SHIFT + 8); +#else + imo = ((err + im) * dith_mul + (1 << (ETS_SHIFT + 7))) >> (ETS_SHIFT + 8); +#endif + /* Clamp to allow for over/underflow due to large errors */ + if (imo < 0) imo = 0; + else if (imo > levels - 1) imo = levels - 1; + + /* Store final output pixel */ + dst_ptr[i] = imo; + + /* Calculate the error between the desired and the obtained + * pixel values. */ + achieved_error = im - ((imo * imo_mul) >> IMO_SHIFT); + + /* And the error passed in is updated with the error for + * this pixel. */ + new_e_1_0 += achieved_error; + + /* Do the magic coupling here; strengths is 0 when + * multiplane optimisation is turned off, hence coupling + * remains 0 always. Equation 6. */ + coupling += (achieved_error * strengths[plane_idx]) >> 8; + + /* If we output a set pixel, then reset our distances. */ + if (imo != 0) + { + a[plane_idx] = aspect_y2; + b[plane_idx] = aspect_x2; + r[plane_idx] = 0; + } + } + + /* Store the values back for the next pass (Equation 3) */ + pa[i] = a[plane_idx]; + pb[i] = b[plane_idx]; + pr[i] = r[plane_idx]; + piir[i] = new_e_1_0; + e_1_0[plane_idx] = new_e_1_0; + } +#ifdef FANCY_COUPLING + coupling = coupling >> 1; + c_line[i] = coupling; +#endif + } + + /* Note: this isn't white optimized, but the payoff is probably not + that important. */ +#ifdef FANCY_COUPLING + coupling = 0; + for (i = xd - 1; i >= 0; i--) + { + coupling = (coupling + c_line[i]) >> 1; + c_line[i] = (coupling - (coupling >> 4)); + } +#endif + + /* Update distances. Reverse scanline pass. */ + for (plane_idx = 0; plane_idx < n_planes; plane_idx++) + { + ETS_PlaneCtx *ctx = etc->plane_ctx[plane_idx]; + int av, bv, rv; + int c1 = ctx->c1; + int rlimit = 1 << (30 - ETS_SHIFT + c1); + + pr = ctx->r_line; + pa = ctx->a_line; + pb = ctx->b_line; + + av = aspect_y2; + bv = aspect_x2; + rv = 0; + for (i = xd - 1; i >= 0; i--) + { + /* Equation 4 from the paper */ + if (rv + bv + av < pr[i] + pb[i]) + { + rv += av; + av += (aspect_y2<<1); + } + else + { + rv = pr[i]; + av = pa[i]; + bv = pb[i]; + } + if (rv > rlimit) rv = rlimit; + pa[i] = av; + pb[i] = bv + (aspect_x2 << 1); + pr[i] = rv + bv; + } + } + + etc->seed1 = seed1; + etc->seed2 = seed2; + etc->y++; +} + +/** + * ets_plane_free: Free an #EBPlaneCtx context. + * @ctx: The #EBPlaneCtx context to free. + * + * Frees @ctx. + **/ +static void +ets_plane_free(ETS_PlaneCtx *ctx) +{ + free(ctx->err_line); + free(ctx->r_line); + free(ctx->a_line); + free(ctx->b_line); + free(ctx->lut); + free(ctx->dist_lut); + free(ctx->rs_lut); + free(ctx); +} + +/** + * ets_new: Create new Even ToneFS screening context. + * @source_width: Width of source buffer. + * @dest_width: Width of destination buffer, in pixels. + * @lut: Lookup table for gray values. + * + * Creates a new context for Even ToneFS screening. + * + * If @dest_width is larger than @source_width, then input lines will + * be expanded using nearest-neighbor sampling. + * + * @lut should be an array of 256 values, one for each possible input + * gray value. @lut is a lookup table for gray values. Output is from + * 0 for white (no ink) to .... + * + * + * Return value: The new #EBPlaneCtx context. + **/ +static ETS_PlaneCtx * +ets_plane_new(const ETS_Params *params, ETS_Ctx *etc, int plane_idx) +{ + int width = params->width; + int *lut = params->luts[plane_idx]; + ETS_PlaneCtx *result; + int i; + int *new_lut; + int *dist_lut; + char *rs_lut; + double distscale = compute_distscale(params); + int c1; + int rlimit; + int log2_levels, log2_aspect; + int rs_base; + + result = (ETS_PlaneCtx *)malloc(sizeof(ETS_PlaneCtx)); + + result->width = width; + + log2_levels = ets_log2(params->levels); + log2_aspect = ets_log2(params->aspect_x) + ets_log2(params->aspect_y); /* FIXME */ + c1 = 6 + log2_aspect + log2_levels; + if (params->c1_scale) + c1 -= params->c1_scale[plane_idx]; + result->c1 = c1; + rlimit = 1 << (30 - ETS_SHIFT + c1); + result->tm_offset = TM_WIDTH/ets_log2up(params->n_planes); + + /* Set up a lut to map input values from the source domain to the + * amount of ink. Callers can provide a lut of their own, which can be + * used for gamma correction etc. In the absence of this, a linear + * distribution is assumed. The user supplied lut should map from + * 'amount of light' to 'gamma adjusted amount of light', as the code + * subtracts the final value from (1<<ETS_SHIFT) (typically 65536) to + * get 'amount of ink'. */ + new_lut = (int *)malloc((ETS_SRC_MAX + 1) * sizeof(int)); + for (i = 0; i < ETS_SRC_MAX + 1; i++) + { + int nli; + + if (lut == NULL) + { +#if ETS_SRC_MAX == 255 + nli = (i * 65793 + (i >> 7)) >> (24 - ETS_SHIFT); +#else + nli = (i * ((double) (1 << ETS_SHIFT)) / ETS_SRC_MAX) + 0.5; +#endif + } + else + nli = lut[i] >> (24 - ETS_SHIFT); + if (params->polarity == ETS_BLACK_IS_ZERO) + new_lut[i] = (1 << ETS_SHIFT) - nli; + else + new_lut[i] = nli; + } + + /* Here we calculate 2 more lookup tables. These could be separated out + * into 2 different loops, but are done in 1 to avoid a small amount of + * recalculation. + * dist_lut[i] = expected distance between dots for a greyscale of level i + * rs_lut[i] = whacky random noise scale factor. + */ + dist_lut = (int *)malloc((ETS_SRC_MAX + 1) * sizeof(int)); + rs_lut = (char *)malloc((ETS_SRC_MAX + 1) * sizeof(int)); + + rs_base = 35 - ETS_SHIFT + log2_levels - params->rand_scale; + + /* The paper says that the expected 'value' for a grayshade g is: + * d_avg = 0.95 / 0.95/(g^2) + * This seems wrong to me. Let's consider some common cases; for a given + * greyscale, lay out the 'ideal' dithering, then consider removing each + * set pixel in turn and measuring the distance between that pixel and + * the closest set pixel. + * + * g = 1/2 #.#.#.#. visibly, expected distance = SQR(2) + * .#.#.#.# + * #.#.#.#. + * .#.#.#.# + * + * g = 1/4 #.#.#.#. expected distance = 2 + * ........ + * #.#.#.#. + * ........ + * + * g = 1/16 #...#... expected distance = 4 + * ........ + * ........ + * ........ + * #...#... + * ........ + * ........ + * ........ + * + * This rough approach leads us to suspect that we should be finding + * values roughly proportional to 1/SQR(g). Given the algorithm works in + * terms of square distance, this means 1/g. This is at odds with the + * value given in the paper. Being charitable and assuming that the paper + * means 'squared distance' when it says 'value', we are still a square + * off. + * + * Nonetheless, the code as supplied uses 0.95/g for the squared distance + * (i.e. it appears to agree with our logic here). + */ + for (i = 0; i <= ETS_SRC_MAX; i++) + { + double dist; + int nl = new_lut[i] * (params->levels - 1); + int rs; + + /* This is (or is supposed to be) equation 5 from the paper. If nl + * is g, why aren't we dividing by nl*nl ? */ + if (nl == 0) + { + /* The expected distance for an ink level of 0 is infinite. Just + * put 0! */ + dist = 0; + } + else if (nl >= ((1<<ETS_SHIFT)/(params->levels-1))) + { + /* New from RJW: Our distance measurements are only meaningful + * within the bottom 'level band' of the output. Do not apply + * ETS to higher ink levels. */ + dist = 0; + } + else + { + dist = (distscale * (1 << (2 * ETS_SHIFT - c1))) / nl; + if (dist > rlimit << (ETS_SHIFT - c1)) + dist = rlimit << (ETS_SHIFT - c1); + } + + if (params->rand_scale_luts == NULL) + { + rs = compute_randshift(nl, rs_base, params->levels); + rs_lut[i] = rs; + } + else + { + int val = params->rand_scale_luts[plane_idx][i]; + + rs_lut[i] = rs_base + 16 - ets_log2(val + (val >> 1)); + } + dist_lut[i] = (int)dist; + } + + result->lut = new_lut; + result->dist_lut = dist_lut; + result->rs_lut = rs_lut; + + result->err_line = (int *)calloc(width, sizeof(int)); + result->r_line = (int *)calloc(width, sizeof(int)); + result->a_line = (int *)calloc(width, sizeof(int)); + result->b_line = (int *)calloc(width, sizeof(int)); + for (i = 0; i < width; i++) + { + result->a_line[i] = 1; + result->b_line[i] = 1; + /* Initialize error with a non zero random value to ensure dots don't + land on dots when we have same planes with same gray level and + the plane interaction option is turned off. Ideally the level + of this error should be based upon the values of the first line + to ensure that things get primed properly */ + result->err_line[i] = -((rand () & 0x7fff) << 6) >> (24 - ETS_SHIFT); + } + + return result; +} + +ETS_Ctx * +ets_new(const ETS_Params *params) +{ + ETS_Ctx *result = (ETS_Ctx *)malloc(sizeof(ETS_Ctx)); + int n_planes = params->n_planes; + int i; + int using_vectors = 0; + + if (params->dump_file) + { + int header[5]; + + header[0] = 0x70644245; + header[1] = 'M' * 0x1010000 + 'I' * 0x101; + header[2] = ETS_VERSION; + header[3] = ETS_SRC_MAX; + header[4] = sizeof(ETS_SrcPixel); + fwrite(header, sizeof(int), sizeof(header) / sizeof(header[0]), + params->dump_file); + if (params->dump_level >= ETS_DUMP_PARAMS) + { + fwrite(params, 1, sizeof(ETS_Params), params->dump_file); + } + if (params->dump_level >= ETS_DUMP_LUTS) + { + for (i = 0; i < params->n_planes; i++) + fwrite(params->luts[i], sizeof(int), ETS_SRC_MAX + 1, + params->dump_file); + } + } + + result->width = params->width; + result->n_planes = n_planes; + result->levels = params->levels; + + result->aspect_x = params->aspect_x; + result->aspect_y = params->aspect_y; + + result->ehi = (int)(0.6 * (1 << ETS_SHIFT) / (params->levels - 1)); + result->elo = -result->ehi; + + result->strengths = (int *)malloc(sizeof(int) * n_planes); + memcpy(result->strengths, params->strengths, + sizeof(int) * n_planes); + + result->ets_style = params->ets_style; + result->r_style = params->r_style; + + result->c_line = (int *)calloc(params->width, sizeof(int)); + + result->seed1 = 0x5324879f; + result->seed2 = 0xb78d0945; + + result->dump_file = params->dump_file; + result->dump_level = params->dump_level; + + result->plane_ctx = (ETS_PlaneCtx **)malloc(sizeof(ETS_PlaneCtx *) * n_planes); + for (i = 0; i < n_planes; i++) + result->plane_ctx[i] = ets_plane_new(params, result, i); + result->y = 0; + result->tmmat = tmmat; + result->tmwid = TM_WIDTH; + result->tmheight = TM_HEIGHT; + return result; +} + +/** + * even_better_free: Free an #EvenBetterCtx context. + * @ctx: The #EvenBetterCtx context to free. + * + * Frees @ctx. + **/ +void +ets_free(ETS_Ctx *ctx) +{ + int i; + int n_planes = ctx->n_planes; + + if (ctx->dump_file) + fclose(ctx->dump_file); + + for (i = 0; i < n_planes; i++) + ets_plane_free(ctx->plane_ctx[i]); + free(ctx->plane_ctx); + free(ctx->strengths); + free(ctx->c_line); + + free(ctx); +} diff --git a/gs/toolbin/halftone/ETS/ets.h b/gs/toolbin/halftone/ETS/ets.h new file mode 100644 index 000000000..9c11d8bf8 --- /dev/null +++ b/gs/toolbin/halftone/ETS/ets.h @@ -0,0 +1,93 @@ +#ifdef __cplusplus +extern "C" { +#endif + +/* Definitions for source pixel format. + * Reasonable settings are as follows: + * 8-bit: unsigned char ETS_SrcPixel; ETS_SRC_MAX = 255 + * 12-bit 0..4095: unsigned short (or int) ETS_SrcPixel; ETS_SRC_MAX = 4095 + * 12-bit 0..4096: unsigned short (or int) ETS_SrcPixel; ETS_SRC_MAX = 4096 + * 16-bit 0..65535: unsigned short (or int) ETS_SrcPixel; ETS_SRC_MAX = 65535 + * 16-bit 0..65536: unsigned int ETS_SrcPixel; ETS_SRC_MAX = 65536 + */ + +/* A quick and dirty switch for 8 or 16 bit data */ +#define CHAR_SOURCE + +#ifdef CHAR_SOURCE + typedef unsigned char ETS_SrcPixel; + #define ETS_SRC_MAX 255 +#else + typedef unsigned short ETS_SrcPixel; + #define ETS_SRC_MAX 65535 +#endif + +/* Photoshop (and possibly other image formats define white in a CMYK image with a + value of 255 (65535). This is opposite of the PAM files that Robin has created. + The ETS code expects white to be at 0. Adjustments to the values in gray level + will be baked into the LUT if needed */ +typedef enum { + ETS_BLACK_IS_ZERO = 0, + ETS_BLACK_IS_ONE +} ETS_POLARITY; + +typedef unsigned char uchar; + +/* To use the file dump capability: + + Open a file as with: fopen ("dumpfile", "wb"); + Put the resulting FILE * pointer in params->dump_file. + Set params->dump_level to the desired level. ET_DUMP_ALL dumps all + inputs and outputs. Other values will lead to much smaller files, + but may not be as insightful. + + If no dump file is desired, set params->dump_file to NULL. +*/ + +typedef enum { + ETS_DUMP_MINIMAL, + ETS_DUMP_PARAMS, + ETS_DUMP_LUTS, + ETS_DUMP_INPUT, + ETS_DUMP_ALL +} ETS_DumpLevel; + +typedef struct { + int width; + int n_planes; + int levels; /* Number of levels on output, <= 256 */ + int **luts; + double distscale; /* 0 to autoselect based on aspect */ + int aspect_x; + int aspect_y; + int *strengths; + int rand_scale; /* 0 is default. Larger means more random. */ + int *c1_scale; /* now an array, one per channel; 0 is default */ + int ets_style; + int r_style; + FILE *dump_file; + ETS_DumpLevel dump_level; + int **rand_scale_luts; + ETS_POLARITY polarity; +} ETS_Params; + +typedef struct _ETS_Ctx ETS_Ctx; + +ETS_Ctx * +ets_new(const ETS_Params *params); + +void +ets_line(ETS_Ctx *ctx, uchar **dest, const ETS_SrcPixel *const *src); + +void +ets_free(ETS_Ctx *ctx); + +void * +ets_malloc_aligned(int size, int align); + +void +ets_free_aligned(void *p); + +#ifdef __cplusplus +} +#endif diff --git a/gs/toolbin/halftone/ETS/ipview.html b/gs/toolbin/halftone/ETS/ipview.html new file mode 100644 index 000000000..97be637bb --- /dev/null +++ b/gs/toolbin/halftone/ETS/ipview.html @@ -0,0 +1,386 @@ +<html> +<head> +<title>Image Plane viewer</title> +<script> + +// Check that we have a modern browser +if (window.File && window.FileReader && window.FileList && window.Blob) { +} else { + alert("Get a better browser!"); +} + +var imageDataBlock = function(block) +{ + this.block = block; + this.pos = 0; + this.width = 100; + this.height = 100; + this.depth = 1; + this.maxval = 255; + this.planar = false; +} + +function error(message) +{ + alert(message); +} + +imageDataBlock.prototype.getLine = function () +{ + var line=""; + var c; + + while ((c = this.block[this.pos++]).charCodeAt(0) >= 32) + line += c; + return line; +} + +imageDataBlock.prototype.updateImage = function() +{ + var w = this.width; + var h = this.height; + var d = this.depth; + var x, y, z; + var R, G, B; + var p = this.pos; + var canvas = this.canvas.getContext("2d") + var id = canvas.getImageData(0, 0, w, h); + var q = 0; + + if (!this.planar) + { + for (y = h; y > 0; y--) + { + for (x = w; x > 0; x--) + { + var C = 0; + var M = 0; + var Y = 0; + var K = 0; + for (z = 0; z < d; z++) + { + var a = this.block.charCodeAt(p++); + var pl = this.planes[z]; + if (pl.enabled) + { + C += a * pl.c; + M += a * pl.m; + Y += a * pl.y; + K += a * pl.k; + } + } + R = 255 - C - K; + if (R < 0) R = 0; + G = 255 - M - K; + if (G < 0) G = 0; + B = 255 - Y - K; + if (B < 0) B = 0; + id.data[q++] = R; + id.data[q++] = G; + id.data[q++] = B; + id.data[q++] = 255; + } + } + } + else + { + var fwd = w*h; + var back = w*h*d-1 + for (y = h; y > 0; y--) + { + for (x = w; x > 0; x--) + { + R = 0; + G = 0; + B = 0; + for (z = 0; z < d; z++) + { + var a = this.block.charCodeAt(p); + p += fwd; + var pl = this.planes[z]; + if (pl.enabled) + { + R += a * pl.c; + G += a * pl.m; + B += a * pl.y; + } + } + p -= back; + if (R > 255) R = 255; + if (G > 255) G = 255; + if (B > 255) B = 255; + id.data[q++] = R; + id.data[q++] = G; + id.data[q++] = B; + id.data[q++] = 255; + } + } + } + canvas.putImageData(id, 0, 0); +} + +imageDataBlock.prototype.setDepth = function(depth_) +{ + var i; + this.depth = depth_; + this.planes = new Array(this.depth); + for (i=0; i < this.depth; i++) + { + this.planes[i] = new Object(); + this.planes[i].c = 0; + this.planes[i].m = 0; + this.planes[i].y = 0; + this.planes[i].k = 1; + this.planes[i].name = "Spot"; + this.planes[i].enabled = true; + } + if (this.depth == 1) + { + this.planes[0].name = "K"; + } + else if (this.planar) + { + if (this.depth >= 3) + { + this.planes[0].c = 1; + this.planes[0].k = 0; + this.planes[0].name = "R"; + this.planes[1].m = 1; + this.planes[1].k = 0; + this.planes[1].name = "G"; + this.planes[2].y = 1; + this.planes[2].k = 0; + this.planes[2].name = "B"; + i = 3; + } + else + { + this.planes[0].c = 1; + this.planes[0].m = 1; + this.planes[0].y = 1; + this.planes[0].k = 0; + this.planes[0].name = "Gray"; + i = 1; + } + for (; i < this.depth; i++) + { + this.planes[i].c = 1; + this.planes[i].m = 1; + this.planes[i].y = 1; + this.planes[i].k = 0; + this.planes[i].name = "Plane"; + this.planes[i].enabled = false; + } + } + else if (this.depth >= 4) + { + this.planes[0].c = 1; + this.planes[0].k = 0; + this.planes[0].name = "C"; + this.planes[1].m = 1; + this.planes[1].k = 0; + this.planes[1].name = "M"; + this.planes[2].y = 1; + this.planes[2].k = 0; + this.planes[2].name = "Y"; + this.planes[3].name = "K"; + } +} + +imageDataBlock.prototype.planeChange = function(plane,checked) +{ + this.planes[plane].enabled = checked; + this.updateImage(); +} + +function strip(line) +{ + while (line.substring(0,1) == " ") + line = line.substring(1); + return line; +} + +imageDataBlock.prototype.readPAM = function () +{ + while (1) + { + var line = this.getLine(); + if (line.substring(0, 5) == "WIDTH") + this.width = parseInt(line.substring(6), 10); + else if (line.substring(0, 6) == "HEIGHT") + this.height = parseInt(line.substring(7), 10); + else if (line.substring(0, 5) == "DEPTH") + this.setDepth(parseInt(line.substring(6), 10)); + else if (line.substring(0, 6) == "MAXVAL") + this.maxval = parseInt(line.substring(7), 10); + else if (line.substring(0, 8) == "TUPLTYPE") + { + if (line.substring(9,13) == "CMYK") + {} + else if (line.substring(9,13) == "DEVN") + {} + else + return error("Not a CMYK or DEVN file!"); + } + else if (line.substring(0, 1) == "#") + { + line = strip(line.substring(1)); + if (line.split(" ")[0] == "PLANE") + { + line = strip(line.substring((line+" ").indexOf(" "))); + var p = parseInt(line, 10); + line = strip(line.substring((line+" ").indexOf(" "))); + this.planes[p].name = line.split(" ")[0]; + line = strip(line.substring((line+" ").indexOf(" "))); + this.planes[p].c = parseFloat(line); + line = strip(line.substring((line+" ").indexOf(" "))); + this.planes[p].m = parseFloat(line); + line = strip(line.substring((line+" ").indexOf(" "))); + this.planes[p].y = parseFloat(line); + line = strip(line.substring((line+" ").indexOf(" "))); + this.planes[p].k = parseFloat(line); + } + } + else if (line.substring(0, 1) == "#") + { + } + else if (line.substring(0, 6) == "ENDHDR") + break; + else + return error("Unknown header field: "+line); + } +} + +imageDataBlock.prototype.readPGM = function () +{ + var i = 0; + var line = ""; + while (i < 3) + { + if (line == "") + line = this.getLine(); + else if (line.substring(0, 1) == "#") + line = ""; + else if (line.substring(0, 1) == " ") + line = line.substring(1); + else if (line.substring(0, 1) == "\t") + line = line.substring(1); + else + { + if (i == 0) + this.width = parseInt(line, 10); + else if (i == 1) + this.height = parseInt(line, 10); + else if (i == 2) + this.maxval = parseInt(line, 10); + i++; + var idx = line.indexOf(" "); + if (idx >= 0) + line = line.substring(idx+1); + else + line = ""; + } + } + this.setDepth(1); + + var m = this.pos; + var n = ""; + for (i = this.width * this.height; i > 0; i--) + { + n += String.fromCharCode(this.block.charCodeAt(m++)^255); + } + this.block = n; + this.pos = 0; +} + +imageDataBlock.prototype.readRAW = function (name) +{ + this.planar = true; + name = name.substring(name.indexOf(name, "_")+1); + this.width = parseInt(name,10); + name = name.substring(name.indexOf(name, "x")+1); + this.height = parseInt(name,10); + name = name.substring(name.indexOf(name, "x")+1); + this.maxval = 255; + this.setDepth = this.setDepth(parseInt(name, 10)); +} + +function imageView(file, event) +{ + var viewsdiv = document.getElementById('views'); + var viewdiv = document.createElement('div'); + viewsdiv.appendChild(viewdiv); + + var data = new imageDataBlock(event.target.result); + var line = ""; + if (file.name.indexOf("raw") >= 0) + { + data.readRAW(file.name); + } + else + { + line = data.getLine(); + if (line == "P7") + data.readPAM(); + else if (line == "P5") + data.readPGM(); + else + return error("Not a PAM/PGM file!"); + } + + var fixdiv = document.createElement('div'); + fixdiv.setAttribute("style", "display:block; position:fixed; top:0px;right:0px;width:auto;height:auto;"); + var text = file.name + " W="+data.width+" H="+data.height+" D="+data.depth; + fixdiv.appendChild(document.createTextNode(text)); + fixdiv.appendChild(document.createElement('br')); + var form = document.createElement('form'); + fixdiv.appendChild(form); + for (i=0; i < data.depth; i++) + { + var span = document.createElement('span'); + var button = document.createElement('input'); + var label = document.createElement('label'); + button.setAttribute("type", "checkbox"); + button.setAttribute("name", "plane"+i); + button.setAttribute("value", "yes"); + button.setAttribute("onchange", "this.data.planeChange("+i+", this.checked)"); + button.checked = 1; + button.data = data; + label.innerHTML=data.planes[i].name; + span.appendChild(button); + span.appendChild(label); + form.appendChild(span); + } + viewdiv.appendChild(fixdiv); + + data.canvas = document.createElement('canvas'); + data.canvas.setAttribute("width", data.width); + data.canvas.setAttribute("height", data.height); + viewdiv.appendChild(data.canvas); + + data.updateImage(); +} + +function handleFileSelect(event) +{ + var files = event.target.files; + var f, i; + + for (i=0; f=files[i]; i++) + { + var reader = new FileReader(); + reader.onload = (function (theFile) { return function (e) { imageView(theFile, e); } })(f); + reader.readAsBinaryString(f); + } +} + +</script> +</head> +<body> +<input type="file" id="files" name="files[]">Select a .pam or .pgm</input> +<div id=views> +<script> + document.getElementById('files').addEventListener('change', handleFileSelect, false); +</script> +</body> +</html> diff --git a/gs/toolbin/halftone/ETS/test_ets.c b/gs/toolbin/halftone/ETS/test_ets.c new file mode 100644 index 000000000..617f17948 --- /dev/null +++ b/gs/toolbin/halftone/ETS/test_ets.c @@ -0,0 +1,855 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> +#include "ets.h" + +#define noDUMP_FILE_NAME "dump.ebdp" + +#define LITTLE_ENDIAN /* Needed for PSD support */ +//#define TEST_PSD_DUMP + +/* PSD structure. Since this data can be compressed planar data we need an object + to maintain our context state. */ +struct psd_ctx_s { + int width; + int height; + int num_channels; + int depth; + int curr_row; + void *rle_row; + int *row_lengths; + int *band_row_length_index; + long *band_file_offset; + void *output_buffer; + void (*read_line)(ETS_SrcPixel **ibufs, int xs, FILE *fi, int planes, void *image_ctx); + void (*write_line)(uchar **obufs, int xs, FILE *fo, int planes, void *image_ctx); + void (*finalize)(void *image_ctx); + uchar *permute; +}; + +typedef struct psd_ctx_s psd_ctx_t; + +static void +die(char *why) +{ + fprintf(stderr, "%s\n", why); + exit(1); +} + +#define MAX_SIZE 65536 + +#define M 16 + +static const char * get_arg (int argc, char **argv, int *pi, const char *arg) +{ + if (arg[0] != 0) { + return arg; + } else { + (*pi)++; + if (*pi == argc) { + return NULL; + } else { + return argv[*pi]; + } + } +} + +static int usage (void) +{ + printf("Usage: ETS\n"); + printf("ETS <options>\n"); + printf(" -i <inputfile .pam or .pgm - omit for stdin\n"); + printf(" -o <outputfile> same format as input - omit for stdout\n"); + printf(" -g <gammafile> optional textual table of gamma values\n"); + printf(" -e <style> ets style (0 off, 1 = normal, etc)\n"); + printf(" -r <style> random noise style (0 off, 1 = rnd, 2 = tm\n"); + printf(" -m <0 or 1> enable/disable multiplane optimisations\n"); + printf(" -l <levels> number of levels in the output\n"); + printf(" -a X:Y aspect ratio of input\n"); + printf(" -n <noise level> noise level (0 to 8)\n"); + printf("\n\nDefaults: -e1 -r1 -m1 -l2 -a1:1 -n0\n"); + return 1; +} + +static void get4(int *value, uchar *buf) +{ +#ifdef LITTLE_ENDIAN + *value = buf[3] + (buf[2] << 8) + (buf[1] << 16) + (buf[0] << 24); +#else + *value = buf[0] + (buf[1] << 8) + (buf[2] << 16) + (buf[3] << 24); +#endif +} + +static void get2(int *value, uchar *buf) +{ +#ifdef LITTLE_ENDIAN + *value = buf[1] + (buf[0] << 8); +#else + *value = buf[0] + (buf[1] << 8); +#endif +} + +/* PSD uses PackBits RLE */ +static void rle_decode(uchar *in_buff, int in_length, + uchar *out_buff, int out_length) +{ + signed char hvalue, *input_buf; + char value; + int in_pos = 0, out_pos = 0; + + input_buf = (signed char*) in_buff; + while (out_pos < out_length) + { + hvalue = input_buf[in_pos]; + if (hvalue >= 0) + { + /* 1+hvalue literal bytes follow */ + memcpy(&(out_buff[out_pos]), &(in_buff[in_pos + 1]), (1 + hvalue)); + in_pos += (1 + (1 + hvalue)); + out_pos += (1 + hvalue); + } + else if (hvalue > -128) + { + /* Repeat next byte 1-n times */ + value = in_buff[in_pos+1]; + memset(&(out_buff[out_pos]), value, (1 - hvalue)); + in_pos += 2; + out_pos += (1 - hvalue); + } + else + in_pos += 1; + } +} + +/* Photoshop RLE 8 bit case */ +static void read_psd_line_rle8(ETS_SrcPixel **ibufs, int xs, FILE *fi, int planes, + void *image_ctx) +{ + int kk; + psd_ctx_t *psd_ctx = (psd_ctx_t*) image_ctx; + long curr_file_offset; + int curr_row_length_index; + int curr_length; + + /* Loop across each band */ + for (kk = 0; kk < planes; kk++) + { + /* Get a pointer and a length for the current one */ + curr_file_offset = psd_ctx->band_file_offset[kk]; + curr_row_length_index = psd_ctx->band_row_length_index[kk]; + curr_length = psd_ctx->row_lengths[curr_row_length_index]; + /* Get to where we are located in the file, read and decode */ + fseek(fi, curr_file_offset, SEEK_SET); + fread(psd_ctx->rle_row, 1, curr_length, fi); + rle_decode((uchar*) psd_ctx->rle_row, curr_length, ibufs[psd_ctx->permute[kk]], + psd_ctx->width); + /* Update where we are in each band */ + psd_ctx->band_file_offset[kk] += curr_length; + psd_ctx->band_row_length_index[kk] += 1; + } +} + +/* Photoshop unencoded 8 bit case */ +static void read_psd_line8(ETS_SrcPixel **ibufs, int xs, FILE *fi, int planes, + void *image_ctx) +{ + int kk; + psd_ctx_t *psd_ctx = (psd_ctx_t*) image_ctx; + long curr_file_offset; + int curr_length = psd_ctx->width; + + /* Loop across each band */ + for (kk = 0; kk < planes; kk++) + { + /* Get a pointer and a length for the current one */ + curr_file_offset = psd_ctx->band_file_offset[kk]; + /* Get to where we are located in the file, read and decode */ + fseek(fi, curr_file_offset, SEEK_SET); + fread(ibufs[psd_ctx->permute[kk]], 1, curr_length, fi); + /* Update where we are in each band */ + psd_ctx->band_file_offset[kk] += curr_length; + } +} + +/* Photoshop 8 bit unencoded output. Due to its planar form, this is stored in a + temp buffer until we reach the final line, at which point we write out the + entire thing. */ +static void write_psd_line8(uchar **obufs, int xs, FILE *fo, int planes, + void *image_ctx) +{ + int kk; + psd_ctx_t *psd_ctx = (psd_ctx_t*) image_ctx; + const void *input_buf; + uchar *output_buff = (uchar*) psd_ctx->output_buffer; + long plane_size = (psd_ctx->width) * (psd_ctx->height); + long buffer_size = plane_size * planes; + + output_buff += ((psd_ctx->curr_row) * (psd_ctx->width)); + for (kk = 0; kk < planes; kk++) + { + input_buf = (const void*) obufs[psd_ctx->permute[kk]]; + memcpy(output_buff, input_buf, psd_ctx->width); + output_buff += plane_size; + } + psd_ctx->curr_row += 1; + /* If at end, then dump the buffer */ + if (psd_ctx->curr_row == psd_ctx->height) + fwrite(psd_ctx->output_buffer, 1, buffer_size, fo); +} + +/* Photoshop unencoded 16 bit case */ +static void read_psd_line16(ETS_SrcPixel **ibufs, int xs, FILE *fi, int planes, + void *image_ctx) +{ + int kk; + psd_ctx_t *psd_ctx = (psd_ctx_t*) image_ctx; + long curr_file_offset; + int curr_length = psd_ctx->width * 2; + int i; + unsigned short temp_value1, temp_value2; + + /* Loop across each band */ + for (kk = 0; kk < planes; kk++) + { + /* Get a pointer and a length for the current one */ + curr_file_offset = psd_ctx->band_file_offset[kk]; + /* Get to where we are located in the file, read and decode */ + fseek(fi, curr_file_offset, SEEK_SET); + fread(ibufs[psd_ctx->permute[kk]], 1, curr_length, fi); +#ifdef LITTLE_ENDIAN + for (i = 0; i < psd_ctx->width; i++) + { + temp_value1 = ibufs[psd_ctx->permute[kk]][i]; + temp_value2 = ((temp_value1 & 0xff) << 8) + ((temp_value1 & 0xff00) >> 8); + ibufs[psd_ctx->permute[kk]][i] = temp_value2; + } +#endif + /* Update where we are in each band */ + psd_ctx->band_file_offset[kk] += curr_length; + } +} + +/* Photoshop 16 bit unencoded output. Due to its planar form, this is stored in a + temp buffer until we reach the final line, at which point we write out the entire + thing. This is not used really, but here for completeness and some testing. + Needs fix for little endian */ +static void write_psd_line16(uchar **obufs, int xs, FILE *fo, int planes, + void *image_ctx) +{ + int kk; + psd_ctx_t *psd_ctx = (psd_ctx_t*) image_ctx; + const void *input_buf; + uchar *output_buff = (uchar*) psd_ctx->output_buffer; + long plane_size = (psd_ctx->width) * (psd_ctx->height) * 2; + long buffer_size = plane_size * planes; + + output_buff += ((psd_ctx->curr_row) * (psd_ctx->width)) * 2; + for (kk = 0; kk < planes; kk++) + { + input_buf = (const void*) obufs[psd_ctx->permute[kk]]; + memcpy(output_buff, input_buf, psd_ctx->width * 2); + output_buff += plane_size; + } + psd_ctx->curr_row += 1; + /* If at end, then dump the buffer */ + if (psd_ctx->curr_row == psd_ctx->height) + fwrite(psd_ctx->output_buffer, 1, buffer_size, fo); +} + +static void finalize_psd(void *image_ctx) +{ + psd_ctx_t *psd_ctx = (psd_ctx_t*) image_ctx; + + if (psd_ctx->output_buffer != NULL) + free(psd_ctx->output_buffer); + if (psd_ctx->band_row_length_index != NULL) + free(psd_ctx->band_row_length_index); + if (psd_ctx->band_file_offset != NULL) + free(psd_ctx->band_file_offset); + if (psd_ctx->rle_row != NULL) + free(psd_ctx->rle_row); + if (psd_ctx->permute != NULL) + free(psd_ctx->permute); +} + +static void read_psd(FILE *fi, psd_ctx_t *psd_ctx, FILE *fo) +{ + uchar buf[256]; + int depth; + uchar num_channel; + int height, width, color_mode; + int size; + int bytes; + uchar *temp_buff; + int kk, jj; + long data_size; + int codec, maxlength = 0; + long count = 0; + long curr_count = 0; + int index = 0; +#ifdef TEST_PSD_DUMP + uchar *in_buff, *out_buff; +#endif + + psd_ctx->curr_row = 0; + + /* rewind and get the header information */ + rewind(fi); + + fread(buf, 1, 26, fi); + count += 26; + + num_channel = buf[13]; + get4(&height, &(buf[14])); + get4(&width, &(buf[18])); + + depth = buf[23]; + color_mode = buf[25]; + + if (!(depth == 8 || depth == 16)) + die("Only 8 or 16 bit PSD files supported"); + + if (depth == 16 && (sizeof(ETS_SrcPixel) != 2 || ETS_SRC_MAX != 65535)) + die("ETS_SrcPixel type and ETS_SRC_MAX in ets.h not set for 16 bit support!"); + + if (depth == 8 && (sizeof(ETS_SrcPixel) != 1 || ETS_SRC_MAX != 255)) + die("ETS_SrcPixel type and ETS_SRC_MAX in ets.h not set for 8 bit support!"); + + /* Dont handle duotone or indexed data at this time */ + if (color_mode == 2 || color_mode == 8) + die("Indexed and Duotone PSD files not supported"); + + psd_ctx->depth = depth; + psd_ctx->height = height; + psd_ctx->width = width; + psd_ctx->num_channels = num_channel; + + if (depth == 8) + bytes = 1; + else + bytes = 2; + + /* Change the output to 8 bit */ + buf[23] = 8; + + /* Write out the header information */ + fwrite(buf, 1, 26, fo); + + /* Index or duotone information */ + fread(buf, 1, 4, fi); + fwrite(buf, 1, 4, fo); + count += 4; + + /* Record information. Pass along... */ + fread(buf, 1, 4, fi); + get4(&size, buf); + fwrite(buf, 1, 4, fo); + temp_buff = (uchar*) malloc(size); + fread(temp_buff, 1, size, fi); + fwrite(temp_buff, 1, size, fo); + free(temp_buff); + count += (size + 4); + + /* Layer information. Pass along... */ + fread(buf, 1, 4, fi); + get4(&size, buf); + fwrite(buf, 1, 4, fo); + temp_buff = (uchar*) malloc(size); + fread(temp_buff, 1, size, fi); + fwrite(temp_buff, 1, size, fo); + free(temp_buff); + count += (size + 4); + + /* Image information. The stuff we want. Only support raw or RLE types for + input. Output is uncompressed */ + fread(buf, 1, 2, fi); + codec = buf[1]; + if (!(codec == 0 || codec == 1)) + die("ZIP data in PSD files not supported"); + + buf[1] = 0; + fwrite(buf, 1, 2, fo); + count += 2; + + if (codec == 1 && depth == 16) + die("PSD RLE 16 bit files not supported"); + + /* Allocate the output buffer */ + psd_ctx->output_buffer = malloc(num_channel * height * width * bytes); + + if (codec == 1) + { + /* RLE. Need to decompress the data. Each scan line is individually + compressed. First read in the size for each compressed line */ + data_size = num_channel * height; + psd_ctx->row_lengths = (int*) malloc(data_size * sizeof(int)); + psd_ctx->band_file_offset = (long*) malloc(num_channel * sizeof(long)); + psd_ctx->band_row_length_index = (int*) malloc(num_channel * sizeof(int)); + count += (2 * data_size); /* This gets us to the start of the image data */ + /* Here we compute where in the file we need to go, to get the start of + the scan line in each band, we compute the max length of all the + encoded bands and get the length of each encoded band */ + for (jj = 0; jj < num_channel; jj++) + { + (psd_ctx->band_file_offset)[jj] = count + curr_count; + for (kk = 0; kk < height; kk++) + { + fread(buf, 1, 2, fi); + get2(&((psd_ctx->row_lengths)[index]), buf); + if (maxlength < (psd_ctx->row_lengths)[index]) + maxlength = (psd_ctx->row_lengths)[index]; + curr_count = curr_count + (psd_ctx->row_lengths)[index]; + index++; + } + } + psd_ctx->rle_row = (void*) malloc(maxlength); + psd_ctx->read_line = read_psd_line_rle8; + psd_ctx->write_line = write_psd_line8; + for (kk = 0; kk < num_channel; kk++) + { + (psd_ctx->band_row_length_index)[kk] = kk * height; + } +#ifdef TEST_PSD_DUMP + /* Now do the decode for testing */ + in_buff = (uchar*) malloc(maxlength); + out_buff = (uchar*) malloc(width); + for (kk = 0; kk < data_size; kk++) + { + fread(in_buff, 1, (psd_ctx->row_lengths)[kk], fi); + rle_decode(in_buff, (psd_ctx->row_lengths)[kk], out_buff, width); + fwrite(out_buff, 1, width, fo); + } + fclose(fo); + free(in_buff); + free(out_buff); + die("Testing case"); +#endif + } + else + { + /* Uncompressed data. Read directly */ + psd_ctx->row_lengths = NULL; + psd_ctx->rle_row = NULL; + psd_ctx->band_row_length_index = NULL; + psd_ctx->band_file_offset = (long*) malloc(num_channel * sizeof(long)); + for (kk = 0; kk < num_channel; kk++) + { + (psd_ctx->band_file_offset)[kk] = count + height * width * kk * bytes; + } + if (depth == 8) + { + psd_ctx->read_line = read_psd_line8; + psd_ctx->write_line = write_psd_line8; + } + else + { + psd_ctx->read_line = read_psd_line16; + psd_ctx->write_line = write_psd_line8; + } + } + psd_ctx->finalize = finalize_psd; + psd_ctx->permute = (uchar*) malloc(num_channel); + /* A default initialization */ + for (kk = 0; kk < num_channel; kk++) + { + psd_ctx->permute[kk] = kk; + } +} + +static void read_pgm(FILE *fi, int *xs, int *ys, FILE *fo) +{ + char buf[256]; + int depth; + + do + fgets(buf, sizeof(buf), fi); + while (buf[0] == '#'); + sscanf (buf, "%d", xs); + do + fgets (buf, sizeof(buf), fi); + while (buf[0] == '#'); + sscanf (buf, "%d", ys); + if (*xs <= 0 || *ys <= 0 || *xs > MAX_SIZE || *ys > MAX_SIZE) + die("Input image size out of range"); + + do + fgets(buf, sizeof(buf), fi); + while (buf[0] == '#'); + sscanf(buf, "%d", &depth); + if (depth != 255) + die("Only works with depth=255 images"); + + fprintf(fo, "P5\n%d %d\n255\n", *xs, *ys); +} + +static int read_pam(FILE *fi, int *xs, int *ys, FILE *fo) +{ + char buf[256]; + int i, depth; + char c; + + fprintf(fo, "P7\n"); + + do + { + fgets(buf, sizeof(buf), fi); + if (buf[0] == '#') + { + fprintf(fo, "%s", buf); + continue; + } + if (buf[0] == '\n' || buf[0] == '\r') + continue; + if (sscanf(buf, "WIDTH %d", xs)) + { + fprintf(fo, "WIDTH %d\n", *xs); + } + else if (sscanf(buf, "HEIGHT %d", ys)) + { + fprintf(fo, "HEIGHT %d\n", *ys); + } + else if (sscanf(buf, "DEPTH %d", &depth)) + { + if (depth < 4) + die("Only CMYK/DEVN pams supported"); + fprintf(fo, "DEPTH %d\n", depth); + } + else if (sscanf(buf, "MAXVAL %d", &i)) + { + if (i != 255) + die("Only pams with MAXVAL=255 supported"); + fprintf(fo, "MAXVAL 255\n"); + } + else if (sscanf(buf, "TUPLTYPE DEV%c", &c) && c == 'N') + { + fprintf(fo, "TUPLTYPE DEVN\n"); + } + else if (sscanf(buf, "TUPLTYPE CMY%c", &c) && c == 'K') + { + fprintf(fo, "TUPLTYPE CMYK\n"); + } + else if (sscanf(buf, "TUPLTYP%c") && c == 'E') + { + die("Only CMYK/DEVN pams supported"); + } + else if (sscanf(buf, "ENDHD%c", &c) && c == 'R') + { + fprintf(fo, "ENDHDR\n"); + break; + } + else + { + printf(stderr, "Unknown header field: %s\n", buf); + die("Unknown header field\n"); + } + } + while (1); + + return depth; +} + +static void read_pgm_line(ETS_SrcPixel **ibufs, int xs, FILE *fi, int planes, + void *image_ctx) +{ + int nbytes; + nbytes = fread(ibufs[0], 1, xs, fi); + if (nbytes != xs) + die("Error reading image (file truncated?)"); +} + +static void read_pam_line(ETS_SrcPixel **ibufs, int xs, FILE *fi, int planes, + void *image_ctx) +{ + int i, j, c = 0; + + for (i = 0; i < xs && c != EOF; i++) + { + ibufs[1][i] = 255-fgetc(fi); + ibufs[2][i] = 255-fgetc(fi); + ibufs[3][i] = 255-fgetc(fi); + ibufs[0][i] = 255-(c = fgetc(fi)); + for (j=4; j < planes; j++) + ibufs[j][i] = 255-(c = fgetc(fi)); + } + if (c == EOF) + die("Error reading image (file truncated?)"); +} + +static void write_pgm_line(uchar **obufs, int xs, FILE *fo, int planes, + void *image_ctx) +{ + fwrite(obufs[0], 1, xs, fo); +} + +static void write_pam_line(uchar **obufs, int xs, FILE *fo, int planes, + void *image_ctx) +{ + int i, j; + + for (i = 0; i < xs; i++) + { + fputc(255-obufs[1][i], fo); + fputc(255-obufs[2][i], fo); + fputc(255-obufs[3][i], fo); + fputc(255-obufs[0][i], fo); + for (j = 4; j < planes; j++) + { + fputc(255-obufs[j][i], fo); + } + } +} + +int +main(int argc, char **argv) +{ + FILE *fi = stdin; + FILE *fo = stdout; + char buf[256]; + int xs, ys; + int xsb; + ETS_POLARITY polarity; + ETS_Params params; + ETS_Ctx *ctx; + int lut[ETS_SRC_MAX+1], i; + int *luts[M]; + int rs_lut[ETS_SRC_MAX+1]; + int *rs_luts[M]; + int strengths[M][M] = { { 0 }, + { 0 }, + { 0 }, + { 128, 51, 51, 13 }, // KCMY + { 0 }, + { 128, 51, 51, 13, 13, 13 }, // KCMYcm + { 128, 51, 51, 13, 13, 13, 13 }, // KCMYcmk + { 128, 51, 51, 13, 13, 13, 13, 13}, // KCMYcmkk + }; + /* Used now in PSD case so that we can reorder the planes according to the above weights */ + uchar permutes[M][M] = { { 0 }, + { 0 }, + { 0 }, + { 3, 0, 1, 2 }, // KCMY + { 0 }, + { 3, 0, 1, 2, 4, 5 }, // KCMYcm + { 3, 0, 1, 2, 4, 5, 6 }, // KCMYcmk + {3, 0, 1, 2, 4, 5, 6, 7}, // KCMYcmkk + }; + int c1_scale[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 }; + ETS_SrcPixel *ibufs[M] = { 0 }; + uchar *obufs[M] = { 0 }; + int planes; + void (*read_line)(ETS_SrcPixel **ibufs, int xs, FILE *fi, int planes, void *image_ctx); + void (*write_line)(uchar **obufs, int xs, FILE *fo, int planes, void *image_ctx); + void (*finalize)(void *image_ctx); + char *gamma_tab = NULL; + int multiplane = 1; + int ets_style = 1; + int r_style = 1; + int levels = 2; + int aspect_x = 1; + int aspect_y = 1; + int noise = 0; + psd_ctx_t psd_ctx; + void *image_ctx = NULL; + uchar byte_count = 1; + + int y; + + for (i = 1; i < argc; i++) + { + const char *arg = argv[i]; + const char *arg_value; + + if (arg[0] == '-') + { + if ((arg_value = get_arg(argc, argv, &i, arg + 2)) == NULL) + goto usage_exit; + + switch (arg[1]) + { + case 'i': + fi = fopen(arg_value,"rb"); + if (fi == NULL) + die ("Input not found"); + break; + case 'o': + fo = fopen(arg_value,"wb"); + if (fo == NULL) + die ("Output failed to open"); + break; + case 'g': + gamma_tab = arg_value; + break; + case 'm': + multiplane = atoi(arg_value); + break; + case 'l': + levels = atoi(arg_value); + break; + case 'e': + ets_style = atoi(arg_value); + break; + case 'r': + r_style = atoi(arg_value); + break; + case 'n': + noise = atoi(arg_value); + break; + case 'a': + sscanf(arg_value, "%d:%d", &aspect_x, &aspect_y); + break; + default: + goto usage_exit; + } + } + } + + fgets(buf, sizeof(buf), fi); + xs = ys = 0; + if (buf[0] == 'P' && buf[1] == '5') + { + read_pgm(fi, &xs, &ys, fo); + read_line = read_pgm_line; + write_line = write_pgm_line; + planes = 1; + finalize = NULL; + polarity = ETS_BLACK_IS_ZERO; + } + else if (buf[0] == 'P' && buf[1] == '7') + { + planes = read_pam(fi, &xs, &ys, fo); + read_line = read_pam_line; + write_line = write_pam_line; + finalize = NULL; + polarity = ETS_BLACK_IS_ZERO; + } + else if (buf[0] == '8' && buf[1] == 'B' && buf[2] == 'P' && buf[3] == 'S') + { + read_psd(fi, &psd_ctx, fo); + read_line = psd_ctx.read_line; + write_line = psd_ctx.write_line; + finalize = psd_ctx.finalize; + planes = psd_ctx.num_channels; + xs = psd_ctx.width; + ys = psd_ctx.height; + image_ctx = (void*) &psd_ctx; + if (psd_ctx.depth == 16) + byte_count = 2; + polarity = ETS_BLACK_IS_ONE; + /* Set the read and write permutation order according to permutes array */ + if (permutes[planes-1] != 0) + { + int sum = 0; /* an error check */ + for (i = 0; i < planes; i++) + { + psd_ctx.permute[i] = permutes[planes-1][i]; + sum += psd_ctx.permute[i]; + } + if (sum != ((float) planes/2.0) * (float) (planes - 1.0)) + die ("Permutation vector values are not valid"); + } + } + else + die("Need pgmraw, pamraw or psd image on input"); + + xsb = xs; + for (i = 0; i < planes; i++) + { + ibufs[i] = (ETS_SrcPixel*) malloc(xs * byte_count); + obufs[i] = (uchar*) ets_malloc_aligned(xsb + 16, 16); + } + + /* This sets up a simple gamma lookup table. */ + if (gamma_tab) + { + FILE *lutf = fopen(gamma_tab, "r"); + for (i = 0; i < (ETS_SRC_MAX+1); i++) + fscanf(lutf, "%d", &lut[i]); + fclose(lutf); + } + else + { + double scale = ETS_SRC_MAX; + for (i = 0; i < (ETS_SRC_MAX+1); i++) +#if 1 + lut[i] = (int)((1 << 24) * (pow (i / scale, 1.0))); +#else + lut[i] = (1 << 24) * (0.88 + 0.02 * i / 255.0); +#endif + } + + for (i = 0; i < (ETS_SRC_MAX+1); i++) + rs_lut[i] = 2 << 16; + +#ifdef DUMP_FILE_NAME + params.dump_file = fopen(DUMP_FILE_NAME, "wb"); +#else + params.dump_file = NULL; +#endif + params.dump_level = ETS_DUMP_ALL; + + params.width = xs; + params.n_planes = planes; + params.levels = levels; + for (i = 0; i < planes; i++) + luts[i] = lut; + params.luts = luts; + params.strengths = (multiplane ? strengths[planes-1] : strengths[0]); + params.aspect_x = aspect_x; + params.aspect_y = aspect_y; + params.distscale = 0; + params.rand_scale = noise; + params.c1_scale = c1_scale; + params.ets_style = ets_style; + params.r_style = r_style; + params.polarity = polarity; + for (i = 0; i < planes; i++) + rs_luts[i] = rs_lut; + params.rand_scale_luts = rs_luts; + params.rand_scale_luts = NULL; + ctx = ets_new(¶ms); + for (y = 0; y < ys; y++) + { + int x; + + read_line(ibufs, xs, fi, planes, image_ctx); + ets_line(ctx, obufs, (const ETS_SrcPixel *const *)&ibufs); + + for (i = 0; i < planes; i++) + { + uchar *obuf = obufs[i]; + if (polarity == ETS_BLACK_IS_ONE) + { + for (x = 0; x < xs; x++) + { + obuf[x] = obuf[x] * 255 / (params.levels - 1); + } + } + else + { + for (x = 0; x < xs; x++) + { + obuf[x] = 255 - obuf[x] * 255 / (params.levels - 1); + } + } + } + write_line(obufs, xs, fo, planes, image_ctx); + } + if (finalize != NULL) + finalize(image_ctx); + + ets_free(ctx); + for (i=0; i < planes; i++) + { + ets_free_aligned(obufs[i]); + free(ibufs[i]); + } + if (fi != stdin) + fclose(fi); + if (fo != stdout) + fclose(fo); + + return 0; + usage_exit: + return usage(); +} diff --git a/gs/toolbin/halftone/ETS/tm.h b/gs/toolbin/halftone/ETS/tm.h new file mode 100644 index 000000000..e96074f1d --- /dev/null +++ b/gs/toolbin/halftone/ETS/tm.h @@ -0,0 +1,4099 @@ +#define TM_WIDTH 256 +#define TM_HEIGHT 256 +const signed char tmmat[] = { + 51, -28, 14, 31, 43, -58, -27, 45, -45, 38, 1, 2, -30, -1, 62, 42, + 10, 35, -60, 36, -80, -8, -55, 84, -59, 15, -43, -42, 84, -47, 0, 3, + 9, -50, 44, -2, -22, 48, -68, 42, -20, 37, -33, 55, -41, -24, 10, 30, + -100, 70, 0, -35, -35, 21, 36, -33, -22, -33, 46, -43, -55, 75, 33, 54, + -40, 26, -15, 36, -31, 20, 43, -22, -3, 41, 14, 13, -53, 14, 16, -16, + 56, -34, 6, 41, 44, -7, -16, 46, -27, 39, 68, 21, 12, 43, -29, 71, + -44, 17, 10, 63, -31, -47, 49, 49, -68, 68, -4, -28, 22, -50, 45, -24, + 12, -20, -46, -18, 21, 8, -59, 62, -33, -17, -23, 7, 50, 54, -11, -23, + 60, -8, -23, -35, 35, 1, -45, 66, -61, 95, -31, 74, -68, 84, -104, 38, + -36, -36, 21, -6, -10, 61, -1, 18, -61, -13, 33, -44, -28, -13, -8, 33, + 10, 56, -60, -51, 87, -43, 88, -75, 110, -84, 88, -58, -59, 88, 15, -33, + -47, -21, 63, 47, -13, 3, 9, -21, 45, -46, 3, 50, -31, 63, -17, 48, + 27, 51, -67, 48, 26, 37, 38, 8, 49, -3, 16, 14, -18, 0, -41, 30, + 41, -47, 65, -44, 50, -33, 43, -7, 10, -24, -62, 43, -22, 55, -11, 66, + -34, 19, 44, -66, 24, 28, 71, 4, -41, 41, 20, -51, -20, 0, 47, -42, + 24, -2, 17, -38, 37, -54, 24, -56, -4, 18, -12, -8, -24, -56, 36, -26, + 3, -51, 38, -83, 28, -3, 20, -49, 31, -64, -44, 40, 14, -48, -50, -39, + -12, -17, 47, -43, 68, -9, 9, -82, 88, -89, 85, -24, -41, -11, 45, 34, + 5, 55, -68, 36, -43, 13, 53, 12, 41, -49, 32, -3, -30, 50, 27, 34, + 7, 11, -23, -16, 55, -29, -28, 48, 2, -11, -25, 52, 41, -72, 19, -21, + 36, 6, -44, -27, 22, -55, -54, -7, -45, 15, 19, -14, 43, 19, -26, -14, + -36, 8, 21, -31, -45, -33, -45, 31, -25, -44, -18, -47, -17, 30, -1, -39, + 25, 20, -13, -84, 69, 3, -10, -44, 42, -29, 39, -22, -23, -18, 40, -7, + 67, -33, 106, -41, 36, -78, 47, 4, -20, -54, 62, 20, -78, -41, 40, 5, + -32, 1, 52, -35, -45, -3, -8, 8, 36, -44, -36, -52, 1, 5, 41, 13, + -18, 43, -7, 5, 22, -17, -48, 63, 26, -16, 26, 6, 14, 36, -47, 61, + -48, -55, 92, -40, 19, -61, 37, -14, -22, 66, -61, 43, 39, -79, -14, 50, + 19, 46, -55, -24, -48, 27, -56, 43, 1, 30, -46, -12, -32, -4, -41, -19, + -6, -46, 46, -53, 6, -7, -36, 41, -61, 31, -44, 16, 6, 17, 28, -35, + 30, -47, 0, 37, -15, 3, -9, -5, -23, 46, 46, 17, -32, -17, -62, 35, + -35, 14, 8, 37, -51, -55, -19, -20, 14, 41, -34, 0, 27, 20, 18, -46, + 47, -49, -22, -1, 27, -7, 65, -23, 16, 4, 20, -13, 21, 58, -79, 39, + -14, 63, -2, 29, 52, 7, 28, -3, -9, 50, 62, -40, 56, 9, 13, 45, + 34, 43, -55, 21, 6, -58, 32, 42, 13, 11, -35, 35, 14, 2, -12, -80, + 43, -88, 39, -13, 54, 0, -70, 7, 0, -54, 63, -45, 17, -2, -71, -15, + -31, 13, -50, 47, -26, 45, -2, 0, -4, 85, -32, -48, 22, 14, -32, -18, + -7, 33, 35, -13, -25, 60, 65, 40, 37, 30, -36, 28, -41, -13, 72, -21, + 52, 55, -41, -2, 35, 16, 47, -61, 45, 76, -15, 20, 0, 1, 26, -34, + 0, -35, 15, 71, -73, -3, 39, -38, -3, -37, 21, 17, 18, 26, -70, 0, + -18, -25, -76, 13, -68, 79, -21, 14, 23, 80, -74, 0, 20, 60, -19, 48, + -51, -32, 54, -33, 70, 30, -2, -36, 72, -54, 87, 19, 6, 28, -50, -7, + -30, -51, 41, -33, -24, -44, 72, -78, -16, -37, -8, -18, 46, -59, 54, -66, + 8, 4, -8, 7, -46, 74, 9, -10, -33, -10, 27, 29, -48, 92, -74, 33, + -64, 2, 41, -18, 67, 17, 9, -53, 20, 9, 12, 2, 65, -41, 70, -33, + 78, -45, 45, -23, -19, -21, 6, -40, 40, -63, 57, 55, -73, 42, -11, -35, + 21, -37, 36, -15, 11, 29, 1, -5, 43, -60, -42, 6, 32, -68, 74, -32, + -14, 22, -17, -20, 36, 40, 14, -28, 29, -28, -37, 53, -55, 56, -72, 64, + 7, 29, -9, 26, -17, 46, -54, 1, -40, 10, 39, -14, -32, -8, 45, 12, + -4, -10, -42, -47, -73, 0, -38, 31, 31, -13, -15, -54, -23, -30, 66, -82, + -37, -35, 39, 18, -72, 52, 13, -54, 13, 25, 36, -88, 29, 16, 19, 79, + -76, 46, 64, -52, -8, -39, 77, -85, 53, -5, -60, 45, 38, -77, 77, 40, + -21, 18, -12, -7, 10, -56, 33, -42, -53, 6, -50, 48, -67, 69, 28, -22, + 23, -5, -55, 65, 26, -52, -77, 0, -27, -50, 2, -41, -4, 17, -71, 30, + -73, -4, -39, 52, -4, -1, 27, 43, -53, -49, 25, -72, 86, -75, 3, 9, + 25, 9, -12, -51, 63, -20, 66, -58, 72, -4, 9, -78, 42, -35, 26, 20, + 20, 21, 44, 33, 14, 0, -21, -12, 19, -92, 54, 19, -46, -42, -23, 18, + 29, 31, -60, 22, -23, -71, 70, -61, 0, -5, -29, -26, -2, 58, -24, 31, + 44, 70, -40, 4, 18, 21, 57, -20, 40, 8, 38, 15, 43, -61, 6, 0, + 33, 30, -17, -53, 93, -60, -38, -11, 10, -13, 34, -46, -7, 24, 36, -57, + 46, 15, -38, -20, -22, -61, 28, -57, 62, -44, 36, -12, -33, 3, -27, -7, + -51, 25, -12, -26, 53, -7, 8, -40, 56, -29, -25, -22, -50, 78, -62, 54, + -4, 28, -22, -44, 35, 4, -73, 75, -68, 96, 6, 33, -30, 40, 22, 9, + -8, -62, 57, -61, 37, -42, 0, 30, -20, 4, 37, -17, 20, -53, 6, -49, + 11, -30, -39, 23, -48, -4, 35, 16, 21, -17, -44, 52, 15, 42, -31, -30, + -23, 11, 9, 66, 32, 40, -8, -57, 2, -60, 23, 96, -50, 92, -81, 91, + 5, 21, -22, -17, 35, 7, 51, -36, -36, -60, 31, 63, -77, 14, -24, -34, + 41, 8, -75, 8, -8, 4, -16, 61, 3, -50, 55, 17, -65, 72, -42, -4, + -10, 41, 63, -62, 58, 55, -70, 39, 64, -60, 54, 31, 6, -63, -26, -23, + 20, -40, 72, -98, 33, -15, 82, -27, 41, 28, 48, 21, 2, 20, -44, 98, + -36, 90, -44, -41, 36, -22, -56, 33, 5, -23, 17, 71, -95, 98, -47, 58, + -86, 58, -12, 49, -62, 28, -90, 63, -49, -35, -7, 63, 6, -14, 19, 28, + -41, 53, -59, -29, -3, -4, 40, 0, -6, 39, -4, -11, 27, 66, -67, 12, + -31, 18, -18, 59, -42, 28, -1, 1, 54, -41, 14, -9, 32, -64, 9, -35, + -50, -6, -26, -24, 41, -55, -43, -38, 37, -31, -17, -24, -29, 16, 49, 41, + -54, -28, 31, 18, -62, 6, 52, 14, 29, -1, -20, -2, -10, -9, -33, 3, + 15, -36, 62, 7, 24, 68, 43, -5, 19, -14, 8, 7, 45, -20, 39, -55, + 98, -38, 42, -50, 39, -27, 75, -39, 50, -59, 77, -32, 39, -95, 78, -41, + -3, 35, -28, -14, 14, 32, 5, -33, -5, -21, -30, -30, 31, -6, -49, 22, + 28, 35, 11, 31, -40, 51, -28, -61, 26, 27, -27, -31, 65, -46, 60, -36, + 26, 53, 16, 2, 52, -44, -35, -22, -3, -37, 14, -67, 28, -46, 18, 31, + -3, -2, -47, 0, -60, -2, -5, 76, -31, 100, -60, -36, -16, -56, 51, -53, + -39, -33, 17, 49, -81, 49, -54, 13, 48, -7, 22, -24, 68, -28, -15, -37, + 26, -26, 40, 37, 30, -24, 49, -70, -17, 58, -55, 9, -65, 43, 14, -21, + -22, 8, -46, 26, -39, -34, 42, 31, -19, -4, -15, -13, 32, -4, 56, -3, + 32, -27, -19, 23, 59, -79, 22, -42, -36, -61, 39, -86, 89, -48, -6, -61, + 22, -59, 7, 51, 9, -17, 65, -50, 50, -61, 38, -26, 1, -18, -17, -61, + 63, -47, -8, 15, 14, -35, 86, -2, 9, 31, 9, -7, -80, 40, -46, 28, + -85, 33, -21, 61, -49, -50, 24, 24, -82, 9, -25, 24, -74, -12, 20, 27, + 45, -35, 52, -49, 9, 0, 47, -58, 9, 22, -1, -4, -34, 91, -40, -9, + 59, -31, 30, 40, -17, 36, 8, 31, -38, 49, 47, -46, 14, 1, -59, -44, + 23, 24, -1, -25, 40, 11, -24, 66, -58, -48, 38, -26, 74, -13, 24, 4, + 53, -15, -16, -9, -48, -44, -47, 0, -16, -24, 20, -16, -15, 13, 5, -29, + -16, -65, 46, -74, 56, -6, -55, 50, -23, 39, -38, -10, 52, 41, -98, 82, + -45, 17, 6, -25, 2, -30, 9, 14, 1, -33, 15, -41, 8, 10, 4, -67, + 48, -56, -38, 6, 3, -40, 0, 48, -8, 0, -27, 52, -25, -31, 41, -5, + 47, -46, -55, 21, 20, 17, 16, 1, 43, 21, 24, 26, -58, 50, 15, -34, + -49, 46, 29, 49, -21, 10, 54, -60, 2, -65, 63, 14, 5, 38, -20, -12, + 96, -45, 41, -19, 64, -39, -39, 33, -2, -3, -32, -47, -10, 45, -29, 53, + 32, -60, 33, -94, 37, -6, -55, 82, -46, 42, -11, 68, 1, 38, -55, 41, + -20, -30, 25, -20, 17, -29, 46, -102, 42, 40, -53, 6, 24, -36, -36, -3, + -31, 65, 5, -50, -4, 8, 23, 19, 20, -23, 47, -1, -48, 54, 30, -41, + 50, 52, -35, -41, 1, -26, -7, -30, 63, -49, 19, 27, -13, 82, -67, 56, + 7, 0, 64, -45, -25, 41, -68, -29, -46, 42, -43, 14, 37, 21, 15, -3, + 40, 39, 15, -91, 78, 35, -42, 49, 49, 28, 7, -18, 67, 40, -64, 44, + -38, -37, -61, 33, 47, -67, 38, -21, -11, -38, 11, 50, -44, 5, -32, 59, + -61, 58, 32, -75, 33, -56, 66, -16, -57, -15, -11, 69, -80, 62, 29, -3, + 45, 23, -37, 73, -80, 7, -13, -18, -3, 101, -76, 17, -35, 6, -21, 0, + -33, -13, -1, 31, -3, 46, -9, 32, -35, -21, 7, -60, 73, -62, 32, 25, + 32, 52, 7, 40, -45, -3, -48, 52, -39, -16, 6, -4, -20, 18, 25, 14, + -28, 7, 6, 31, 34, 28, -63, 58, 31, 43, -65, 49, 34, -5, 7, 33, + 11, 20, 10, 31, 2, 35, 12, 4, 1, 54, -33, 0, 2, 65, -96, 41, + -72, 44, 10, -27, -33, 34, -39, 5, 5, -42, -46, -10, 41, 27, -77, 44, + 2, 28, -11, -49, 23, -20, -47, 4, 1, -11, -23, 32, -57, 23, 7, 9, + -73, 46, -26, -3, -6, -4, 61, -49, 31, 46, 3, 11, 6, 20, -22, -11, + -17, 35, -38, 85, -79, 53, -18, -43, 47, 6, -50, -51, -14, 1, -24, -4, + -22, 45, -49, -4, -22, 85, -65, 72, -7, 1, -22, 15, -10, 28, 25, 36, + -2, -43, 34, 20, -52, 65, -8, 30, 0, 83, -52, -26, 15, -46, -6, 68, + -89, -19, 54, -14, 9, -11, 0, -32, 22, -10, 17, -32, -33, -32, 64, -43, + 23, 23, -92, 58, -4, 38, 32, -18, 55, 4, 2, -12, -81, 71, -45, -31, + 18, -43, -20, 97, -59, 27, -33, -26, -68, 46, -33, -4, -13, -60, 52, -76, + 74, 20, 55, -6, 3, 3, 40, -20, 20, 11, 29, -31, 19, -66, 27, 37, + -14, -91, 43, -14, 44, -50, -8, 0, 63, -15, 37, -73, 64, -21, -62, 23, + -30, -29, -30, 19, 33, -28, 16, -46, 37, -82, 19, 83, -50, -50, 66, -14, + -38, 44, -2, -13, 58, -48, -8, 18, 33, -38, 91, -8, 36, -32, -62, 60, + -76, -31, -6, 18, 40, -43, 97, -52, -2, 19, -25, -5, 30, -50, 2, 15, + -38, -25, 5, -40, -34, 19, 48, -56, -76, 38, -7, 23, -89, 40, 15, -32, + -26, 29, -46, 38, 6, -31, -46, 33, -22, -11, -31, -50, -4, -30, 30, -8, + 56, -68, 48, -56, 66, -6, -12, -41, 17, 42, 41, -13, -14, -25, 39, 11, + -33, -47, 21, 49, -68, 49, 14, 49, -60, 50, 27, 10, -7, -1, -8, -43, + 21, 45, -68, 22, 12, -24, 33, -39, -46, -21, 2, -5, 52, -47, -6, -30, + -10, 42, 38, -46, 23, -1, -37, 72, -55, 66, -2, 52, -15, 39, 15, 48, + 6, 49, 1, -10, -12, -58, 5, -22, -8, 6, 36, -17, -40, -30, 0, 8, + -47, 67, -61, 76, -50, -31, 5, 2, -36, -50, -20, 16, 36, 62, -38, -19, + 45, 15, 34, -64, 93, -67, 24, -23, 53, -45, 71, -62, 40, 10, -19, 46, + -55, 11, 36, -38, 35, -86, 12, 24, -81, 68, -54, 60, 21, -26, 4, 9, + -9, -20, 43, -62, 19, -32, 61, -37, 22, -1, -6, -4, -13, 34, 29, -18, + -18, -44, 0, -74, 15, -45, 16, 20, -33, -59, 15, 20, -39, 93, -72, 47, + -64, 83, 15, -23, -52, 44, 0, 33, -49, 26, 16, -6, -37, 29, 34, 47, + -28, -26, 24, 12, -11, 19, -25, 17, -14, 54, -27, -76, 55, 0, 34, -72, + 50, 15, -26, 28, -28, -47, 39, 13, 35, -12, -56, 5, -34, 32, 77, -69, + 71, -15, 59, -31, -29, -1, -75, 84, -35, -1, 63, -38, -17, 70, -76, 60, + -2, 19, 36, -65, 39, -32, 15, -34, 33, 19, -35, 54, -7, -11, -24, 39, + -37, 4, -28, -1, -2, -34, -6, 29, 25, -29, 54, 32, 38, 33, 3, -6, + -10, 0, 36, -48, 43, -19, 14, 31, -28, -46, 17, 26, -34, 67, -39, 30, + -40, 39, -38, 32, 23, -9, -5, -49, 42, -12, -83, 50, -51, 55, -50, 78, + -45, 11, 45, -22, -7, 10, -51, 34, 25, 36, 3, -34, -1, 29, 15, 23, + 4, -39, -37, 60, -34, 67, -54, -5, -19, -27, -35, 34, -50, -7, -26, -25, + -33, -31, 5, 0, 40, 56, -25, 5, -12, 44, -41, 53, 42, -17, 54, -44, + 34, -61, -20, -62, 103, -38, 36, -39, -9, 33, 29, -36, -32, -54, 41, 3, + 13, -6, -24, 21, -46, 36, 23, -3, -7, -19, 27, -12, 26, -30, 21, -36, + -5, 16, -37, -29, 7, 59, -32, 61, 0, -32, -38, 33, -39, 85, -71, 83, + -32, 5, -23, 59, -52, 10, -46, 35, 13, 53, -68, 25, -42, 14, 10, 21, + -49, 85, 17, 12, 43, -21, 49, -17, -6, 70, -78, 63, 47, -88, 86, -36, + 49, -73, 47, 25, 40, -22, 3, -7, -37, -35, 44, -49, 81, -11, -58, -40, + 6, 48, 34, -39, 0, 16, 0, 51, -2, 8, 60, -19, 18, 0, 3, 36, + -53, 54, -35, 17, 49, 24, -61, -11, -71, 72, 1, -52, 0, 7, -73, 55, + -47, 63, -91, 57, -19, 39, 41, -57, 20, -1, 15, -2, -21, -50, 65, -60, + 67, -106, 62, 35, 29, -74, 80, 5, 40, -29, 62, -81, 39, 45, -61, -29, + 76, -20, 0, 1, 48, 28, 5, -33, 1, -41, 24, -33, -25, -36, 15, -24, + 2, 29, -28, -21, 28, -24, -21, 30, 47, -27, -39, 24, 70, -71, -32, 73, + 9, 0, 3, -17, -72, 34, 8, -2, 61, -57, 102, -56, 38, 8, 14, -35, + -8, 50, 11, -7, -42, 88, -82, 96, -80, -27, 53, -56, -4, 23, 33, 16, + -35, -22, 60, -82, 80, -71, 9, 40, -7, 18, -10, 10, -34, 63, 4, 18, + 54, -3, 38, 24, -16, -77, 65, 1, -34, -4, -2, -18, -13, 11, -61, 9, + -18, 61, 35, 36, -43, -27, -23, 17, 24, -8, 15, 49, -1, 21, 0, -22, + -52, 4, -18, 23, 30, -51, 57, -17, 16, -6, -14, -31, 78, -63, 23, -49, + 58, -49, 59, 35, 1, -35, 25, -83, 54, -22, 67, -45, -25, -30, 30, -56, + 43, 2, 29, -62, 51, -17, 54, -3, -82, 54, -3, 15, 49, -43, -51, 38, + -14, -95, 20, 42, -33, 19, -62, -34, 60, 31, -19, -57, -24, 68, -57, -37, + -18, 63, -35, -58, 15, -54, -2, -26, 62, 63, -75, 88, -88, 2, 40, 2, + -6, 0, -56, 52, -63, -23, 43, -66, -12, -38, -59, 22, 40, -53, 52, -49, + -16, -48, -13, -1, -68, 17, 64, -64, 92, -75, 56, 59, -4, 37, -38, 45, + -58, 7, 9, -61, 74, -44, 4, 6, -14, 4, -52, -1, 53, 17, 27, -57, + 44, 37, -18, -62, 48, 3, -60, -10, 1, -38, -37, 47, -8, -8, 34, 65, + -44, -20, 0, -21, -34, 2, -25, 62, -53, 26, -43, 73, -50, 43, 41, -47, + 53, -18, -5, 39, 23, -15, -27, -12, -32, 24, 7, -22, -81, 109, -38, -21, + -55, -6, -18, -8, 60, 29, -14, -47, -17, 31, -81, 22, 17, -65, 43, 10, + 14, -71, -6, 0, 11, -41, 90, -105, 90, -25, -38, 94, -48, -9, -47, -57, + 41, -4, -8, 14, -61, 74, -6, 21, 16, 8, -22, -28, 39, -79, 50, -53, + -17, -63, -14, 17, 2, -11, 10, -44, -12, 70, -32, 42, -36, -20, 10, 32, + 44, -67, -25, -24, -38, 73, 31, -5, -10, -55, 69, -68, -4, 53, -48, 14, + 29, 34, -26, -32, -17, -36, -8, -33, 19, 11, -55, -14, -70, 11, 21, 36, + 18, -19, -48, 59, -50, -37, 38, 38, -27, 14, -5, 30, -20, 73, -59, -11, + 10, -25, -14, 33, -39, 68, -63, 0, 55, -46, -16, 13, 27, -27, 31, 20, + 19, 47, 21, -63, -22, 1, 63, 0, -44, -36, 50, 25, 16, -63, 44, 44, + -19, -35, 14, 34, -56, 59, 58, 18, -87, -18, 37, -91, 88, -66, 24, 26, + -41, 22, 75, -50, 85, -2, 31, -39, 77, 2, 64, -57, 6, 25, -59, 75, + 18, 51, 15, 52, 10, 13, 3, 41, -36, -24, 17, -89, -27, -25, 51, -41, + 58, -5, -2, 70, -57, 23, -18, -28, 58, 25, 6, 0, -46, 30, -22, -27, + -13, 4, 49, -68, -5, -19, 41, 19, 0, -11, 36, -2, -2, -2, -85, 21, + -39, 54, 0, -37, 69, 9, -10, 33, -37, 64, -42, 16, -3, -2, 15, -44, + 24, 27, -20, -91, 48, 6, 35, -8, 101, -27, -35, 28, 24, -52, -11, 37, + 28, 32, 33, 37, -28, -35, 1, 40, -42, 73, -15, 25, 4, -63, 71, -79, + 0, 82, -64, 23, 20, 24, -83, 55, 15, -32, 30, -13, -19, 20, 25, 68, + -41, 32, 18, -14, 55, -45, -9, -51, -37, 6, 38, -1, 3, 9, 17, -26, + 43, 12, 60, -23, -22, 24, 32, 27, 32, -46, -16, -60, 42, 32, 46, -72, + 12, 2, 64, -1, 52, -93, -16, 38, 19, -11, 8, -9, -23, -36, 25, 0, + 30, -47, 31, 72, -39, 30, 3, 49, 23, 15, 58, 34, 61, 12, 22, -33, + -24, 43, -26, -22, 50, 43, -58, 5, -67, 12, 24, -94, 66, -50, 42, 0, + 4, 10, -16, 45, -16, -47, 69, -34, -34, 21, 59, -75, 13, 41, 15, -75, + -2, 8, -14, 30, -9, 23, -72, 29, -23, 52, -4, -22, -22, -26, 15, 0, + 10, -28, -3, 52, 7, -33, -77, 42, 17, 50, -64, 39, 29, 11, -9, -1, + 31, -71, -35, -40, 26, -86, 32, -74, 38, -50, -50, 69, -25, -61, 54, -88, + 3, -23, -53, -46, 9, -35, -59, 0, -7, -31, 47, 49, 56, -3, -6, -18, + -3, 7, 22, -46, 31, -55, -14, 5, -66, -2, -6, 2, 35, -76, 49, -25, + 9, 24, -35, 51, 52, 0, 4, -63, 34, 11, -38, -12, 44, -22, 75, 21, + -36, -12, 35, 15, -2, -32, -29, 32, -12, -2, 11, -27, 45, -69, 46, -14, + -49, -16, -13, 102, -19, 17, -64, -22, -66, -45, -3, 42, -10, 10, 3, 9, + 26, -64, 4, -37, -29, 9, 26, 20, -33, -14, -48, 50, -38, 69, -49, 18, + 47, -43, 16, 31, -47, 16, 48, -47, 40, -25, -24, -39, 15, -3, 45, -56, + 35, -53, -24, 24, 12, -43, 20, 57, -13, 12, -37, 16, -15, 50, -30, 40, + -69, 43, -70, -10, -39, 46, -64, -12, 19, -27, 61, -21, 38, -40, -7, 8, + 11, 8, -65, -40, 35, 19, 53, -46, -4, 23, -54, 76, -32, 11, -22, 9, + -38, 23, 14, -41, -33, 49, 38, -69, -34, 24, -37, -32, -68, 11, -32, 45, + -26, 37, -57, 6, -11, -64, 59, 26, 18, 39, 4, 56, -17, -1, -2, 0, + 52, -76, 83, -71, -51, 96, -85, 12, 43, -16, -23, 69, -32, -44, 23, 4, + 18, 2, -52, -19, 22, 40, -18, -12, 68, -49, 14, -4, 14, 32, 35, -63, + 61, 45, -13, -85, 62, -1, 25, -17, 31, 51, -4, -26, -52, 39, 36, -57, + 18, 75, 18, -17, 24, 12, 37, -7, 76, -54, 100, -63, 45, 15, 8, 36, + 24, -49, 82, -20, 45, -32, 88, 14, -8, -19, 13, -16, -65, 16, -7, 42, + 8, -29, -30, -9, 46, 28, 54, 17, 65, 54, -71, 45, 1, 58, 13, 25, + -58, 71, -65, 48, -41, -34, -2, 44, -27, -21, -15, 2, -8, 25, -52, -75, + 59, -19, -48, 43, -21, -26, 35, -50, 76, -5, -77, 51, -46, 68, -56, 26, + 70, -23, 7, -68, -34, 32, 23, 6, 56, 33, 42, -32, 44, -44, 2, -9, + -21, 45, -34, 11, 39, -6, -24, 36, -47, 37, -15, 14, -3, 21, -28, -33, + 24, 5, -21, -40, 15, -68, 21, -40, -56, 33, 3, 37, 34, -68, -13, -63, + 46, 11, 9, 5, -55, 74, -41, -39, 7, 22, 28, 44, -27, -64, -15, -23, + 37, 1, 7, 51, 29, -88, 74, 2, 16, 3, -23, -33, -20, 25, -26, -9, + -22, 51, 64, -20, 36, -80, 32, 17, -47, 34, -9, -9, 32, 9, 61, -17, + 8, -1, -32, 66, 2, -50, 42, -54, 63, -45, 26, -30, 49, 18, 31, -42, + 34, -14, 32, 8, 38, 9, -78, 77, -68, 17, -39, 35, -43, 4, -15, -6, + -10, 13, -31, 49, 56, -83, 96, -22, -40, -25, 41, -58, 2, 8, -42, 35, + 10, 26, 11, 61, -45, -1, 24, -3, -22, -20, -2, -5, -2, -20, -16, 53, + -68, -66, 44, 53, -99, 43, -41, -15, -33, -47, -24, 4, 9, -25, -29, -6, + -10, -42, -12, 17, 9, 62, -91, 90, -97, 4, -47, 12, 18, 44, -56, 8, + 30, -30, -1, 60, -79, 69, -57, -50, 80, -44, 24, -31, 67, -78, 66, -81, + -15, -43, 66, -33, -40, 33, -76, -3, -54, -43, 24, 37, -57, -60, 55, -59, + 0, -2, -32, -13, 8, -18, 32, -12, 49, -17, 55, -23, 9, 25, 8, 54, + 51, -63, 85, -49, -44, 72, -33, -31, -66, 29, 70, -61, 35, -6, 8, -21, + -38, 5, 0, 35, 63, -72, 83, -39, -23, -7, 7, -44, 37, -62, 69, -13, + -36, 26, 23, -11, 4, 34, -15, 3, 29, -39, 57, -26, -32, -17, 49, -7, + 63, -58, 89, 9, -20, 75, 18, 40, 53, -41, 51, -46, -9, 34, 49, 57, + -38, 8, -57, 63, -65, 42, -2, 79, -67, 9, -23, -36, 46, 70, 11, 41, + -54, 64, -53, -11, -3, 61, -34, -5, -20, -35, 55, 37, 29, -3, 63, -6, + -21, -56, -23, -24, 14, 47, -35, -50, 19, 0, 0, -18, 0, -21, -85, 50, + -56, 12, -30, 51, -73, 34, -44, 0, 20, -61, 14, 11, 31, -19, -23, -49, + 29, -9, -15, -22, -20, 1, 23, -54, 18, -30, 10, 25, -31, -2, 4, -9, + 26, 44, -56, 59, -57, -1, -66, 70, -33, 59, 21, -22, -31, 72, -59, 44, + -38, 0, -25, -42, -24, 79, -53, 35, -61, 64, -21, 17, -32, 66, -9, 36, + 3, 32, -14, -12, 47, 29, 33, -10, 50, 0, 20, 56, -31, 39, 27, 69, + -3, -3, -53, 39, -47, -24, 1, -65, 89, -10, 44, -39, -16, -72, 54, -14, + 17, -20, -33, 12, -68, 64, -74, 96, -52, 17, 14, 17, -20, 48, -10, 38, + 60, 28, 14, -4, -34, 53, 13, -26, 4, 80, -45, -17, 64, -43, -32, 53, + -7, 29, 0, 33, 11, -7, 23, -61, -54, 1, 11, -17, -34, 4, -21, -46, + -35, 62, -56, -1, 12, -5, -16, 92, 12, 7, -31, 15, 17, 29, -26, -14, + 22, -2, 37, -66, -35, 27, -50, -31, 43, 25, 18, -57, -1, 64, -75, 44, + 27, -21, -46, 32, -72, 9, -20, 45, -59, 91, -77, 70, 5, -9, -25, -31, + -41, -14, -22, -14, 12, -54, -21, -1, -58, 57, -30, 12, 33, -17, -65, -33, + 53, -36, 38, 12, 61, -79, 22, -91, 64, 6, -50, 57, -69, -57, 48, -50, + 2, -23, 0, 22, -12, 49, -83, 34, 48, 7, -59, -21, 20, -20, -73, 18, + -7, 59, 22, -3, 3, 27, -35, 45, 3, 11, 0, -1, 21, -1, 48, 12, + 27, -50, 35, -76, 98, -19, 22, 24, 23, 54, -20, 49, -72, 12, 6, 54, + -82, 91, -56, 64, 16, 11, 29, 33, -24, 9, -36, 32, -3, 45, 15, -5, + -34, -13, 10, -61, 30, 49, 27, -17, 33, -63, -28, 63, -7, 11, 7, -10, + -2, 28, 8, 26, -12, -14, -17, 7, 12, -14, 1, -18, -9, -78, 2, -44, + -32, 56, -44, 32, 11, -56, -22, -2, -36, 43, -77, 30, -55, 5, -32, -74, + -13, 51, -1, 34, -31, 60, -46, 94, -67, 32, -66, 4, 18, 23, -24, 23, + -48, 66, -11, 39, 26, 42, -8, -54, 46, -44, -7, 30, -67, -54, 44, -13, + -61, 22, -55, 9, 8, 8, -40, 55, -31, 15, -47, 35, 17, -6, 30, -29, + -5, -16, -25, -4, -4, 1, -28, 67, 51, -53, 46, 40, -56, 41, -25, 28, + 7, -16, 23, 18, 17, 24, 6, -66, -35, -8, 58, -38, -65, 19, -6, 24, + -53, 44, 15, 10, 18, -7, 17, 3, 18, -31, -50, 101, -65, 19, -14, -5, + -77, 77, -6, -66, 58, 41, -47, -31, 32, -49, -11, -38, 30, 62, -70, 77, + 43, -52, 23, -39, 1, 64, 27, -32, -30, 74, -68, -1, -8, -10, 80, 0, + -2, -24, 6, -33, -45, 61, -28, 28, 7, 20, -42, 13, 18, -11, 37, -5, + 18, -36, 15, 36, -69, -39, 94, -45, -30, -28, 30, 29, -14, 6, -6, 41, + 43, -71, -22, -35, 31, -28, 56, 6, -9, -43, -3, 40, -13, -21, -27, 46, + -39, 66, -7, 19, -46, -6, -6, -57, -1, -47, -25, -39, 56, -8, -67, 45, + 21, -22, -15, -39, 65, -51, -20, -3, -1, 37, -49, 22, 0, -49, 1, -29, + 26, -40, 20, 5, 28, -78, 46, -35, -16, 55, -19, -48, -15, 24, -63, 45, + 10, -44, -24, 31, -5, 27, -33, 26, 46, -52, 16, 34, 0, 82, 2, 89, + -53, -36, -11, 27, -50, -15, 58, -13, -18, -13, 35, -24, 61, 39, -14, 99, + -41, 31, -21, 20, -59, 57, 6, -23, -59, 63, 36, -5, 38, -23, 18, 46, + -5, -55, 14, -1, -49, 17, -50, 41, -68, 61, 25, 30, 59, -12, 58, -50, + -17, 14, 62, -18, 9, -12, 13, 0, -22, -9, -37, 47, -11, 11, 36, -48, + 64, -16, 48, -12, -57, 57, 20, -61, 51, 10, -61, 24, 60, 14, 24, -67, + -4, 1, -22, 31, -25, 21, -53, 52, 43, -55, 43, -35, 53, 12, 10, 40, + -26, -44, 57, -35, -10, 12, 0, -20, -24, 0, 60, -65, 19, 41, -43, 88, + -34, 9, 10, 51, -37, 23, 31, 21, -32, 24, 34, 84, -67, -21, 56, -36, + -4, 23, -3, 76, -23, -29, -27, 35, 30, -97, 101, -43, 70, -30, -74, 63, + -85, 52, 22, -17, 41, -41, 15, -7, 13, -11, 18, 38, 26, -21, -30, 31, + -53, 62, -20, -4, 62, 8, -64, 26, 44, -65, 40, -28, -24, 70, -18, -51, + 32, -25, 63, -2, 4, 10, -59, 17, -61, 91, -60, 37, -30, 14, -42, -16, + -31, -29, 22, -25, -37, 62, 41, 34, 27, 58, 9, -27, 26, 23, 11, 31, + -74, 45, -34, 58, -80, 39, -29, -8, -8, -25, 43, -29, 24, 40, 45, -66, + 16, 43, -29, -6, 4, -16, -3, 36, -32, 33, 23, 67, -16, -26, 19, -16, + 40, 62, -65, 55, -48, 6, -26, 23, -28, 86, -38, -39, 58, -65, -7, -55, + 46, -12, 53, -45, 68, -25, 23, 58, -47, 22, 10, -2, -72, 14, -29, -64, + 1, -57, 59, -6, 41, -63, -8, -48, 85, -56, -55, 58, -50, -3, -16, -67, + 79, -24, -9, 15, 19, -14, 39, 24, -33, 6, -42, -5, -47, -8, -40, 22, + 38, -16, -40, -13, -14, -29, -1, -7, 9, 47, -46, 62, -53, -30, 55, -74, + 9, -32, 47, -81, 91, -46, 10, -43, -61, 60, -19, -45, -72, 8, 10, 47, + 26, 25, -27, -39, 66, -30, 10, -24, 32, -14, -52, 37, 12, -30, -52, -4, + 4, 54, -52, 34, -45, 51, -18, -8, 20, 21, -35, 55, -39, -58, 59, -52, + 14, 28, -55, 33, -42, 50, -53, -34, -5, -13, -53, -77, 54, -37, -9, -71, + 53, -15, 23, -63, 49, -59, 19, -58, 19, 80, -65, -8, -77, 67, -16, 37, + 14, -5, -44, 46, -25, 10, 48, -26, 36, -64, 30, -47, -70, 78, -21, -53, + 2, 23, -19, -67, 19, 24, -23, 18, 15, 0, 22, 39, -28, -33, 5, 14, + 27, -73, 42, -37, 7, -17, 41, -35, 15, -28, 20, 13, -46, 65, 16, 39, + 34, 31, 23, 27, 20, -74, -20, -61, 18, -34, -46, 50, -32, -16, 2, -36, + 49, -49, 25, -47, 77, -42, 26, -41, 70, -47, 36, 45, -81, -7, 9, 45, + -41, 7, -24, 55, -3, 30, -41, -1, -40, -13, -49, -34, 33, 35, 24, -12, + -76, -43, 34, 32, 20, -21, -9, -7, 11, -61, 6, -2, 25, -35, -43, 80, + -3, -15, 33, -5, -6, -41, 22, -49, -27, 37, -13, 40, 6, -11, -5, 31, + 5, 66, -43, -5, -24, 47, 13, 18, -16, 13, 50, -84, 30, 57, -34, 3, + 17, -72, 55, 38, -78, 49, -42, 2, -12, 42, -33, -22, 0, 26, 65, -68, + 30, -17, -5, 28, 23, 68, -10, -28, 41, -60, 1, -17, -27, 0, 7, 19, + -3, 5, -5, 40, -72, 21, 33, 17, 39, -58, 16, 58, 64, -17, -69, -14, + -17, -14, -5, -23, -46, 0, 12, -56, 21, 49, -7, 49, -8, -32, 77, -86, + 69, -73, 64, -73, 55, -43, 46, -44, 24, -1, -4, -13, 78, 19, -42, 40, + 56, -27, 43, -35, -10, 0, -38, 108, -16, 22, 49, 74, -82, 24, 12, 46, + -8, 9, -47, 54, -69, 66, 33, 26, 5, -36, 12, 22, 43, 0, -56, 24, + -60, 63, 39, -33, 0, -28, -22, -1, 18, -37, -13, 26, 56, -72, 50, 26, + 28, 40, -53, 58, 45, -77, 50, -24, 16, -79, 58, -86, 66, -54, 45, -3, + 38, 11, -48, -37, 58, -24, 41, 7, 46, -13, -23, -3, 42, -41, -47, 0, + -73, -9, 4, -51, 4, 94, -13, 90, -71, 56, -53, 52, -19, 57, 24, -2, + 0, 28, 20, -3, -29, 32, 22, 71, -75, 3, -23, 28, -5, 36, -29, -15, + 44, 13, -8, -38, -9, 36, -51, 57, 7, 1, 3, 61, -63, -41, -44, 37, + 43, 51, -70, -37, -38, 51, -38, 30, -44, 51, -20, 15, -21, 17, 57, -69, + 2, -13, 24, -69, 34, -58, 56, 38, 0, 0, 1, -2, 11, 54, -24, 26, + -1, -67, 59, -56, -4, -72, 31, -55, 5, 17, -17, 54, -23, 25, -60, 78, + -84, 104, -84, -22, 66, -58, 15, -32, -3, 38, 64, -45, 64, -31, -72, 35, + 39, -74, 43, 61, -87, -12, -33, 58, -57, 69, 0, 61, -16, 21, 32, 0, + -15, 74, -51, -6, 78, -47, 23, -25, -35, 23, 27, -28, -69, 55, 42, 13, + 40, -3, 5, 54, 46, 45, 20, -43, 37, -43, -62, 3, -58, 100, -96, 57, + 49, -18, -40, 66, -47, 50, -48, 50, 5, -12, -40, 38, -65, -38, 49, -69, + 26, -56, 67, 0, -33, 16, 43, -61, -57, 48, -2, -54, 70, 2, 42, -19, + 43, -35, 25, 4, -19, 39, -85, 55, -82, 19, 22, -40, -38, 74, -66, 66, + -43, -28, -2, -19, 43, -42, -8, 20, 16, 15, 31, 12, -41, 78, -35, -31, + -60, 22, 19, -41, -18, 43, -81, 43, -33, 49, 34, 4, 23, -34, -3, 7, + -61, 60, 13, 78, -73, -35, 33, -72, -73, 29, 19, -25, 17, -40, 48, 24, + 74, -17, -46, 32, -41, -41, -24, -55, 63, -91, 41, -11, -21, -21, -69, 15, + -56, 40, -40, -1, -9, -35, 1, -68, 71, -54, 19, -12, -35, -12, 23, -16, + 34, -38, 14, 31, 1, 24, 31, 0, -52, 18, 48, -70, 78, 56, 10, -37, + 30, -6, -13, 67, 28, 58, -67, 79, -71, 48, -13, 11, -58, 44, -30, 45, + -21, 3, -4, 71, -15, 11, -31, -8, -31, -36, 23, -19, -3, -45, 31, -58, + 59, 15, 21, 25, 30, 56, -32, 68, -3, 34, -30, -2, 5, -41, 11, 19, + 4, -82, 54, 24, -12, 2, 0, 53, 22, -35, -61, 69, -48, 10, 78, -55, + -9, 64, -64, -39, 53, 41, -5, -2, -4, 17, -32, -50, 30, 5, -59, -19, + 53, -66, -16, 14, -41, 42, -51, 54, 34, -25, 28, -38, -7, 8, -51, 0, + -17, -39, 52, -62, -35, -52, -1, -13, 43, 0, 42, 12, 12, -90, 93, -40, + -50, -27, 47, -42, 23, 42, -46, 16, 0, -47, 39, -28, 69, -29, -6, -24, + 21, -15, -42, 16, -7, 46, -49, 18, 49, -41, -1, -2, -39, -50, -6, -37, + 1, -25, 18, -47, -37, 35, 6, -34, 81, -22, -54, 49, 20, -33, 23, 28, + 6, -42, 59, -89, 70, 28, -12, -16, 21, -33, 47, -78, 52, -54, -21, 89, + -42, 68, -55, 27, 45, 12, 38, 23, -42, -51, -20, -11, -18, -21, 8, 42, + -29, -65, 55, -103, 103, -26, 34, 53, 60, -28, 34, -27, 57, -55, 26, -29, + -49, 31, 20, 52, -19, 39, 22, 9, 23, 59, 69, -31, -12, 15, 77, -57, + 41, 40, -27, 41, -20, -6, 39, -31, 67, 1, 12, 14, 57, 5, -39, -31, + -53, 41, 19, -55, -17, -27, 52, -29, 3, 57, -35, 6, -31, -68, 31, -43, + -52, 69, 17, -48, -37, -38, 10, -65, 88, -35, -41, 46, 20, -44, 50, 28, + -72, 49, -55, 12, -47, 64, 4, 2, 34, 28, 20, -28, -30, 37, -9, -27, + -31, 43, -47, 12, -52, 26, 30, -37, -52, 60, -55, 48, 68, -60, 6, 26, + 7, 60, -23, 28, 25, -45, -13, 15, -45, -20, 62, -48, 12, 40, -95, 54, + -4, -10, -3, 85, -49, -34, -29, -26, 50, -15, -44, 65, -54, 23, 66, -49, + 22, -30, 76, -57, 27, -37, 32, -39, -28, 5, 4, 49, -58, 55, 2, 55, + -59, 57, -5, 34, -59, 75, -5, 58, -81, 45, -14, -16, 41, 18, 4, -38, + 64, -21, 8, -17, 20, -59, 81, -73, 43, -18, 38, 49, -61, 0, 33, -30, + -21, -25, 57, 1, -18, 29, -8, -17, 5, -17, -18, -13, 36, 18, 20, 26, + -23, -41, 70, 51, -30, 28, -2, 59, -82, 49, 44, -20, -47, -12, 15, -5, + 20, 22, -49, 97, -86, 11, -10, 34, 11, 13, -43, 52, -39, 72, -19, -42, + 43, -38, -20, -29, -46, -84, 71, -62, 66, 29, -8, 46, 47, -32, 10, 0, + 19, 21, -20, 61, -31, -35, 28, -89, -3, 12, 3, 25, -51, 78, -41, 16, + -15, -6, -12, -36, 11, -5, -8, -30, -33, -62, -38, -22, -22, -9, -24, 54, + -42, -42, 25, -11, 28, -11, 33, -42, -44, -38, 48, -16, -41, -56, 96, -1, + 41, -14, 1, 48, 61, -36, -35, -10, 5, -47, -26, 16, 16, 57, -46, 71, + -21, -40, -9, 41, -16, 66, 22, 27, -38, 49, -50, 19, 52, -46, -42, 5, + 0, 45, -18, 33, -52, 11, 12, -52, -17, -18, 37, -23, 44, -48, -53, 84, + -27, 8, -16, 10, -8, -4, -69, 58, -26, -18, 9, -64, -46, 25, 1, 22, + -18, -44, -16, -36, -7, 24, 12, -40, 23, 4, -7, -39, 2, -27, 89, -40, + 35, 13, -20, -72, 64, -23, 58, 25, -7, -31, 63, -35, 34, -32, -8, -15, + 3, 30, -23, 51, 6, -40, 42, 50, 4, -22, -48, 31, 38, -58, -1, -23, + 17, 14, 9, -56, 80, -75, 44, -66, 33, -23, 33, 0, -37, -10, 21, -22, + 21, 44, -19, -40, 69, -52, -11, 5, -7, 0, -13, -67, 13, 57, -34, 59, + -23, 73, -58, 22, -30, -42, 22, 35, 26, 32, -29, 47, 10, 7, -69, 47, + -2, 30, -45, -27, 6, -36, 59, -94, 75, -62, -33, -12, 93, -1, -20, 0, + -37, 16, -38, 11, 0, 27, -32, -30, -10, 2, -25, 15, -54, -2, -26, 18, + 33, -46, 90, -12, 62, 49, -46, 20, -67, -8, 68, -110, 71, -55, 36, -33, + 7, -14, 46, -68, 24, -17, 1, 45, 21, 8, -67, 26, 42, -40, -15, 0, + 9, -31, 55, -9, -26, -30, 82, -42, 47, 56, -38, 40, 42, 10, 48, -16, + -21, 59, -19, 16, -60, -10, -3, 23, 23, 27, -4, 4, 43, 33, -56, 17, + -23, -28, 43, -71, -34, 24, 24, -24, -10, 28, 46, -32, -24, 19, 1, -25, + 8, -5, -33, 17, -38, -8, -22, -35, -11, 32, 25, -60, 1, 28, -8, 0, + 34, -65, 74, -64, 58, -39, -47, 79, 24, 54, -55, -35, 9, 44, 41, -37, + -20, -51, 86, -21, 42, -28, 7, 52, -27, -26, 50, 6, 70, -21, -16, 1, + 4, -36, 34, 59, -45, 39, 43, -64, 97, -49, 16, 43, 58, -52, -80, 99, + -48, -54, 14, 57, -20, -46, 17, -20, -48, 49, -78, 48, 13, -26, 29, -40, + -18, -4, -34, 18, -18, -29, 24, -14, -53, 96, -63, 79, -69, -4, 78, -43, + -39, -4, -50, 37, -17, 5, 11, 36, -46, 66, 12, -54, 1, -18, -37, 20, + 5, -6, -47, 89, -46, 78, -18, 4, 27, -21, -17, 68, -18, -30, -44, 32, + 19, -66, -1, -25, 74, -59, 72, -81, -15, 20, -37, -18, 38, -45, 73, -56, + 37, -41, -26, 54, 33, 6, -35, 1, 2, 35, 10, 4, -71, 29, -42, 61, + 29, 22, -34, 9, -27, 36, -11, 37, -40, 47, -9, -35, 99, -32, 2, 0, + -44, 30, -9, -46, -69, 16, -13, 45, 24, -19, -5, 22, -2, 5, -10, -12, + 57, -61, 28, 9, -16, 23, -22, 24, -60, -4, 63, -59, 23, -31, 23, 21, + 46, -55, 92, -91, 68, 0, -55, 14, 9, -56, 76, -67, 32, -51, 1, -21, + -1, -47, 32, 4, 80, -56, -16, 42, -4, -55, -36, -9, -25, 40, -37, -3, + -37, -12, -32, 61, 31, -33, -9, 1, 52, -35, 16, -24, 32, -46, 32, 53, + 14, 29, 33, 1, 32, 44, -16, 13, -44, 7, -16, 2, -2, 9, 22, -17, + 58, -73, -14, 14, -38, 31, 53, -93, -57, 9, -6, 34, 64, -81, 26, 2, + 42, -10, -61, 6, -35, 17, 36, -44, 2, 1, 13, 15, -54, 10, -59, 79, + -37, 28, -6, 15, -35, -5, -13, 3, -21, -24, -29, -31, -34, 59, 40, -85, + -2, 76, -16, -15, 2, -3, 6, -5, 61, -42, -12, 45, -5, -43, 27, 13, + 54, -5, 12, -49, 93, -77, 25, -30, -26, 20, -34, -30, 63, -49, -26, 48, + 24, 60, -18, -1, -36, 37, 49, -65, 0, -22, -49, 63, -9, 45, 16, -20, + 6, -40, 20, -40, -14, -59, -5, -50, 40, 3, 15, -28, 19, 55, -37, -14, + 38, 7, 73, -61, -14, 57, -64, 86, -58, -13, 11, 0, -35, -32, 33, -3, + -7, -29, 57, -36, -23, -37, 20, 41, 36, -28, -11, 22, -32, 48, -28, -51, + -23, -45, -19, 37, 54, -17, -4, 16, 58, -53, 21, -16, -20, -41, 50, 28, + -8, 17, -30, 43, 45, 20, 9, 13, -19, -30, -28, -27, 52, -58, 22, -26, + -26, 29, 46, -49, -14, 0, -25, -7, 48, -12, 7, -44, 65, -56, 57, -58, + 62, -54, -38, 36, 26, 26, -4, -46, 71, -41, 0, 16, 4, -42, 38, 12, + 31, 8, 30, -55, -52, 99, -46, 30, -29, 53, 45, -3, -51, 33, -8, 36, + 8, 19, 10, 8, -49, 28, 26, -14, -41, -13, 36, 4, -21, 28, -36, -35, + -30, -42, -30, -16, -36, -10, 33, -10, -15, 28, 50, -16, -9, 15, -16, -21, + -22, 59, 19, 19, 28, -26, 41, 45, 32, 11, -18, -32, -55, 40, -25, -15, + 34, 7, 1, 74, -28, -15, -3, 47, -64, 54, -67, 33, -19, 22, 26, -21, + -18, -17, 5, -50, 84, -47, 56, 11, -31, 8, 86, 4, -31, -12, 8, 93, + -66, -51, 64, -37, 29, 1, 38, 29, -74, 105, -45, -22, -11, 57, 7, 30, + -48, -54, 80, -64, -34, 61, 20, 14, -10, 43, 42, 10, -41, 29, 11, -43, + 39, -64, 8, -30, 38, -9, -89, 65, -15, 7, -39, 50, -81, 39, -20, 6, + -36, 42, -1, 18, 25, -1, 59, 68, -70, 37, -22, 27, -34, 19, 6, 55, + -42, -15, -39, 67, 9, -42, 71, -67, 51, 31, 11, 4, 35, 9, -55, 63, + -52, 41, -58, 70, -29, 19, 35, -44, -37, -37, 42, -43, 43, -16, -23, 43, + 36, 30, 41, -26, -85, 23, -30, 24, -42, -12, 36, -60, 52, 36, -58, -26, + 12, 26, -63, 46, -110, 82, -62, 1, -49, 91, -22, 65, -63, 45, 37, -53, + 8, -22, -18, -9, 37, 50, -14, -29, -38, 47, -25, -18, -1, 3, -10, -11, + -27, 58, -23, -28, 10, -51, 18, 30, -102, 61, -8, -34, 50, -42, 8, -44, + 19, -90, 58, 20, -21, -61, 59, -70, 63, -70, 14, -16, 43, -56, 50, 9, + -2, 41, -44, -44, 56, -36, 45, -80, 52, -5, 0, -6, 39, -72, 71, -13, + -7, 58, 43, -14, -21, 43, -24, 65, 36, -75, -8, 16, 0, 11, 40, -33, + -10, 11, -29, -17, 0, -12, -23, -63, 23, 17, 23, -3, 64, -21, 45, -62, + -17, 21, -23, -16, -39, 44, -9, -58, 107, -91, 69, -35, 15, -29, -5, 41, + 24, 35, -38, 28, -39, -7, -37, 47, -15, -19, -21, -61, 59, -39, -12, -65, + 84, -12, 0, -18, 14, -60, -6, -12, -10, -66, 46, -2, 6, -50, 16, -37, + 56, -4, -5, 29, 60, -78, 61, -61, 5, -32, -15, -31, 40, -9, -29, 25, + -73, 67, 45, -2, 44, -55, 48, 18, -25, 36, -8, 11, 17, 7, 35, 2, + -29, 18, 16, -43, 37, -36, -26, -51, 51, 17, -17, -4, -13, -7, 5, -65, + -17, -5, 22, -97, 29, 9, -62, 11, -44, -10, 10, 38, -34, 57, -26, 34, + -16, 27, 51, -29, 0, -42, -19, 47, 7, -13, 44, -18, 8, -5, 7, 62, + -79, 9, -58, 52, 91, -93, 93, -48, 26, 45, -81, 78, 3, -10, 51, -7, + -14, -1, 24, 17, 66, -61, 39, -10, 16, -65, 39, -72, 71, -7, -61, 46, + 63, -16, 18, 54, -64, 15, -62, 91, 5, -44, 78, -22, 44, -7, 38, -7, + -29, 27, -66, 60, -16, 48, -78, 43, 37, 37, -61, 59, -10, 3, 47, -7, + 42, 30, -12, -24, 9, 55, -61, 44, 26, -42, 7, 35, 37, -28, -67, 30, + -6, -55, 25, 45, 4, 11, 29, 17, 40, -42, 16, -42, 33, -13, 15, 24, + -39, -41, 30, -1, -17, -28, 19, -84, -10, 47, 57, -37, -42, -18, -68, 44, + -10, 27, 34, -37, 3, -21, 55, -27, 24, -47, 0, -35, 9, -58, 41, 27, + 8, 18, -55, 25, 57, -10, 31, -22, -23, 51, -28, -3, 42, -1, -12, -67, + 38, 0, -39, 19, -68, 71, -7, 13, -5, -31, 55, 35, -27, 31, 34, -14, + -13, 24, 24, -24, -1, 30, 12, 38, -58, 90, -66, 87, -53, 13, -42, -30, + 42, -54, -3, 37, -46, -12, -3, 9, 8, 19, 20, -23, -54, 84, -44, 33, + 54, -62, -24, -50, 0, 15, 21, 3, 10, -41, 29, 15, -27, 4, 20, -48, + 89, -25, -22, -21, 33, 22, 23, -31, -25, -25, 1, -8, -37, -13, 51, 57, + -33, 58, 32, 52, -13, 15, 24, -50, 79, -53, 41, -24, -63, -9, 28, -72, + 28, -12, -68, -4, -40, 49, -4, -34, 53, -1, -40, 12, 52, -25, 33, -51, + 6, 33, -9, -39, -45, 67, -54, 5, -52, 46, 43, -46, 10, -19, -22, -25, + 73, -30, 10, -47, -38, -33, 29, -44, 43, 48, 10, 20, -42, -28, 55, 24, + -52, -57, 40, -68, 48, 18, 34, -96, 60, -21, -38, -29, 24, -40, -12, -10, + 30, -67, 56, 21, -37, -37, 35, 27, -65, 18, -21, -5, -43, 8, -11, -33, + 20, -67, 32, 9, -39, 0, 10, 22, 8, 34, -70, 10, -63, 18, 72, 4, + -27, 36, -14, 0, -64, 3, -12, -38, 0, -51, 64, -22, 0, -52, 57, -77, + 26, 24, 0, 13, -6, 17, -28, 105, -72, -3, -18, -52, 84, -7, 80, -16, + -37, 2, -45, -11, 83, 1, -4, -28, 24, -17, 69, -47, 52, 46, -28, -25, + -19, 21, 10, -1, -61, -41, 49, -46, 60, -70, 7, 0, -14, -14, -37, 43, + 38, -51, 68, 10, 53, -41, 43, -19, -45, 51, -55, 29, -24, 7, -25, -41, + 41, -68, 35, 40, -50, 18, -67, 66, 15, -32, 5, -59, 29, -7, 87, -42, + 14, 14, 24, -40, -8, 43, -3, -31, 43, -61, 5, -3, 57, -35, -13, -37, + -13, 2, -12, 34, 23, -59, 12, -35, 17, -55, 18, -66, 18, 1, -1, -19, + -31, -14, 5, 34, -53, -65, 73, 46, -17, 25, -43, 57, 17, 9, -39, -34, + 18, -29, -75, -11, 8, -6, 67, -38, 44, 12, -27, -13, 88, -17, 5, -12, + 40, 37, 40, 44, 30, 8, 33, -22, -56, 12, 28, 17, -69, 0, -59, 58, + -6, -38, 29, -57, 50, -35, -31, 64, -36, 27, -57, -8, -21, 11, 5, -48, + 24, -71, 64, -12, 84, -9, 30, -52, -21, -52, 25, -25, 25, 69, -30, -39, + -34, 106, -71, 85, -27, -6, 6, 41, -43, 29, 15, 6, -50, 48, -15, 38, + 38, 15, -45, 58, -58, 54, 24, -6, -11, 38, 19, 39, 34, 9, -45, 64, + -22, 18, 6, 43, -59, 34, -21, -5, -41, 31, 41, -19, 39, -35, -61, -10, + 33, 2, -18, 46, -19, 25, 0, 67, -15, -3, -6, 46, -3, 43, -20, 61, + -43, -7, 10, -14, -5, -34, 42, -66, 58, -41, 52, 0, 18, -55, -28, 23, + 21, 14, 42, -34, -32, -59, 67, -26, 8, 24, -8, -38, 3, -27, -31, 23, + -3, 13, 38, 20, 46, 22, -78, 69, -93, 102, -51, 26, 43, -10, 19, 27, + -68, -43, 33, -48, -60, 40, -1, 7, -31, 50, 1, -21, 47, 34, -32, 50, + 8, -25, -1, -49, 50, 17, 2, -61, 11, -19, 62, -4, 19, -21, -63, 43, + -54, 34, 41, -15, 16, -26, 39, 10, -34, 48, -10, -24, -23, 24, 63, 19, + 61, -10, -22, 4, 34, -33, 55, -18, 46, 1, 55, -9, 62, -89, 21, -38, + 58, -46, 47, -29, 61, 23, -71, -18, -22, -3, -5, -17, 43, -12, -14, 41, + 16, 16, 26, 53, -47, 11, -29, -45, -7, -49, 48, -12, -67, 55, 20, -43, + -9, -40, -9, -86, 59, -30, -26, -28, 42, -11, 0, -10, 79, -59, 43, 17, + 22, -33, 16, 60, 12, 41, 50, -63, -39, 38, 18, -3, 2, 68, -52, 61, + -53, 37, 33, -27, -60, 70, -59, 57, 0, 86, -18, 18, -54, -46, -21, 69, + 9, -76, 61, -40, -62, 58, -16, -35, -3, 32, -54, 33, 24, -3, 21, -84, + -1, 2, -22, 17, 7, -16, 1, -52, 28, -80, 19, -27, -33, -31, 15, 11, + -40, -48, 75, -81, 77, -42, -20, 16, -36, 30, -53, 64, -40, 54, 35, 33, + -13, -44, -15, 29, 28, -45, -22, -32, -34, 28, 17, -66, 35, -65, 53, 11, + -35, 28, 32, -20, -2, -52, 22, -6, 13, 35, -10, -60, 62, 25, -43, -14, + -3, -13, -13, 4, 45, -2, -29, 37, -64, -9, -52, 59, -6, -53, 21, 12, + 26, -36, -32, -38, -33, 12, 57, -41, 70, -60, -1, 25, 2, -3, -39, -25, + 96, 5, 18, 0, 70, -54, -53, 60, -4, -36, -2, 49, -41, -67, 65, -72, + -10, 61, -35, 60, 18, -49, -24, 29, -8, -2, -33, -45, 75, -18, 6, 28, + 45, -58, -33, 9, -52, 12, -8, 7, 30, -67, -1, 87, -38, -26, -87, 38, + -90, 11, 0, 34, -10, 43, -33, -22, -5, 16, -27, -27, 27, 60, -15, 42, + 27, 8, 0, -22, -38, 38, 58, -71, 87, -50, 93, -61, 42, -60, 49, -10, + 33, -12, 1, -24, -24, 33, -22, 48, -18, 52, -53, -13, 38, -1, -43, 40, + -22, 29, 19, 3, -17, 3, 28, -5, 56, -21, 10, -12, 18, 18, -27, -35, + 40, 0, 5, -81, 8, -84, 30, 15, 68, -48, -22, 5, 10, -64, 41, -24, + 18, -4, -49, 11, -26, 9, -9, 56, -59, -61, -18, 29, -5, 26, 52, -65, + -4, 37, -42, 29, 18, -40, 20, -4, -26, 30, 23, 54, -64, 55, -13, 61, + -26, 51, -45, 20, -30, 30, 6, 0, -9, 66, -68, 82, 13, 2, -23, 35, + 19, 29, -25, -22, 21, 46, 31, -32, 43, 2, -53, 45, -61, 5, -8, -11, + -17, 27, 16, -15, -44, 40, -52, 79, -2, -24, 22, 36, 1, -27, 16, -43, + 34, 35, -32, -2, 51, 52, 21, 7, -51, 24, -10, 24, -1, -77, 62, 1, + 22, 29, -5, -22, -24, -3, 57, -35, 31, 52, 11, -29, 45, 43, -21, -4, + 14, 38, -44, 52, 28, 36, -47, -52, -3, 29, 8, -70, 31, -32, 33, 5, + -58, -56, 30, -34, -10, 17, 75, -46, 14, -17, 17, -2, -34, 95, -106, 82, + 21, -50, 18, -8, -80, 79, 3, 11, -23, 67, 5, -20, -24, -36, 20, -20, + -8, -6, 60, 36, 44, 24, -32, -14, 42, 1, 49, -91, 30, 37, 92, -66, + 84, -24, 57, -73, 30, -45, 41, -27, 1, -26, -13, -1, 12, -60, -15, -32, + -34, 57, -51, 16, 33, -62, 38, -1, 36, -18, -24, -6, -31, -10, 29, -42, + -54, 20, -32, 9, 1, 46, -4, 40, -55, 60, -38, 100, -74, 29, -32, 35, + -14, -57, 34, 12, -30, 23, -16, -20, -57, 28, -28, 2, -32, -65, 36, -20, + -8, 3, 2, 61, 22, -13, 33, 22, -32, -27, 60, -35, -10, 23, 34, 8, + 23, 16, 22, -33, 0, 47, -60, 15, 19, 18, 39, -20, 5, -50, 11, 61, + -67, -12, 50, 4, -2, 24, -27, 25, 15, -25, -32, -29, -49, -17, -61, 83, + -79, 35, -53, 36, 8, -7, -55, 56, -20, 14, -1, -32, -30, -14, 2, -29, + 45, -76, 77, -55, 16, -24, -42, -7, 11, -45, 24, 10, -4, 6, -7, -9, + -27, 3, 55, 14, 60, -65, 68, 8, -38, -18, 51, -50, 38, -54, 27, -23, + -57, 5, -45, 46, -78, 14, -86, 12, 27, 17, -20, -34, -15, 67, -12, 21, + -24, 5, 5, -31, 38, -57, 13, 24, -5, -5, -50, -32, 12, 10, -25, 32, + -46, 37, 5, -18, -50, -41, 52, 7, 76, -77, 56, -52, 75, -40, 76, -59, + 90, 6, -11, 10, 28, -48, -19, -22, 22, -16, -17, 15, -29, -13, 61, -41, + 2, -19, 36, -15, 30, -12, -65, 29, 53, -106, 75, 15, 2, 53, 31, -29, + 6, 0, -51, -39, -6, -16, 18, -39, 6, 14, -34, 48, -17, -32, -63, 44, + -31, 34, -66, 6, 7, -43, 66, -40, -18, 54, 14, -1, 12, 42, -25, -13, + 83, -48, 12, -20, -6, 14, -31, -28, -13, -2, 54, 1, 24, 52, -49, 26, + 39, -28, 7, 58, -43, -14, -49, 38, -66, 39, -8, -69, 39, -2, -37, -4, + 3, 17, 2, 74, -70, 75, -56, 18, 4, 26, 35, -54, 21, 80, 1, -9, + -51, 83, -47, 10, -47, 11, -60, 2, -18, 12, -23, 24, 32, 12, -76, 15, + -41, 52, -9, -2, 29, -35, 31, -24, -38, 3, -27, 48, -37, 87, -63, 11, + 55, -8, -4, -37, 30, -34, 23, 5, 39, -63, 3, 51, 51, 12, 1, -48, + 0, 54, 0, -30, -7, -26, 5, -5, 17, 44, 9, -9, 53, 42, -73, 50, + -69, -18, 36, -13, 8, 0, -4, 22, -2, 55, 2, -13, -35, 69, -12, 28, + 58, -39, -66, -12, -37, 31, -45, -39, 8, 15, -34, 8, 7, -15, 89, -9, + 36, 27, 76, -22, 24, -23, 50, 37, -71, 0, -15, 28, 36, -55, -13, -4, + -23, -15, 24, -29, 44, 39, -10, -43, -40, 47, 20, 66, -71, 53, -51, 21, + 0, -21, -71, 56, -23, 53, -4, -3, -11, -37, 52, 37, -58, 9, -9, -35, + 20, -66, 44, -37, 53, -71, 76, -55, 80, -43, 74, -66, -19, 61, -25, 16, + -69, 44, -34, 2, -3, 30, 62, -40, -73, 81, -60, -3, -41, -12, -41, 50, + -1, -24, 40, -12, 0, -2, -3, -39, 59, -16, -35, 60, -67, 51, -17, -31, + -1, 11, 38, -32, 10, 30, -40, 23, 19, -49, 10, -18, 43, -56, 46, -30, + -18, -50, 21, 11, -13, 53, 40, -5, -35, 60, -86, -2, 12, -39, 28, -71, + 36, -27, -15, -15, 31, 31, -8, -1, 39, 32, -83, 67, -55, 26, 69, -3, + 35, -4, -28, -33, -12, 42, -25, 22, 9, -37, 15, 49, -24, -18, -52, 27, + 40, -43, -59, -7, 78, -70, 72, 39, -76, 53, 0, -34, 12, -24, 51, -6, + -15, -39, 12, -43, 34, 13, 51, -51, 73, 3, -23, -13, 38, -59, -16, 6, + -12, -20, -39, 10, -66, 63, -53, -42, 21, 43, 17, -30, -48, 4, 59, -8, + 41, -57, 50, -30, 64, -1, 11, 26, -61, -47, 20, -46, -7, -1, 16, 29, + 14, 49, -58, 50, 11, 20, -22, 10, -7, -58, -43, 41, 13, -72, 9, -14, + -2, -34, 100, -33, 25, 9, -36, 24, 0, 14, 44, -71, -13, -2, -76, -25, + -18, -11, -71, -23, -13, 11, 17, 22, -17, 40, 34, -39, -36, -11, 54, 25, + -20, 19, 9, 25, -27, -54, -3, 69, 62, -22, -28, -51, 73, -62, -9, 68, + -14, -43, 76, 1, -11, -1, -4, -64, 45, -36, -31, 36, 12, -40, 6, 17, + 45, -6, -12, 72, -66, 38, 32, -39, -76, 67, -68, 110, -66, -6, 44, -7, + 37, 29, -32, 0, 2, 14, -33, -15, 48, 22, -29, -32, 75, -32, 53, -20, + 14, -26, -15, 57, -34, 2, 86, -15, -14, -12, -6, -14, 49, 27, 31, -9, + 69, -102, 48, -38, 52, -54, 17, 37, -50, 57, 34, 57, -87, 56, -30, 17, + 32, 60, -47, 49, -41, -18, -72, 0, 29, -39, 84, -9, -34, 18, 36, 39, + -11, 18, -3, -34, 63, -55, -20, -47, 21, 8, 32, -3, 27, -20, -52, 17, + -53, 29, -17, -27, 33, -62, 32, -63, -6, -15, -4, -18, 72, -25, 6, 14, + -73, 80, 38, 61, -116, 121, -98, 17, 16, 13, -29, 33, -39, 18, 44, -41, + -8, 0, 0, 59, -28, -29, -62, 48, -50, -5, 7, 0, 20, 89, -78, 35, + 58, -50, 72, 35, 55, 11, 23, 54, 19, -62, -13, 38, 57, -25, -27, -20, + -8, 30, -51, 59, -10, -46, 21, 41, 39, -22, 11, 28, -42, 34, -31, 33, + -15, -50, 68, -9, -46, 37, -32, 36, 27, 20, 13, 19, 10, 41, -55, 18, + 3, -18, -62, 55, -39, 41, 32, 31, 24, -41, -3, 79, 11, 31, 78, -22, + -19, 58, 50, -5, 21, -49, -38, -40, 22, 31, -86, 57, 43, -24, -30, -53, + 23, -25, 34, 21, -46, 49, 14, -65, -71, 17, -52, 79, -91, 91, -62, -41, + 47, 22, 0, -45, 43, -5, 3, 55, -2, 38, 4, -16, -49, 71, -51, 10, + -52, -17, -25, -41, 30, 23, -30, 31, 72, -17, 44, -81, 39, 18, -34, -4, + -54, 27, 5, -35, 32, -63, 86, -70, 72, -38, -32, 94, -61, 12, -17, -14, + 5, -14, 43, -21, -24, -28, -27, -59, 14, 48, -34, -9, -35, -7, -17, 12, + -69, 82, -13, 52, -61, 36, 42, -57, -7, -56, -60, -41, 32, -16, 47, -60, + 30, -46, -17, 41, -37, -1, 54, 45, -25, -8, -66, 6, 6, 19, -66, 31, + -4, 40, -4, 31, -14, -16, 38, 0, -31, 9, -14, 30, -26, -30, 72, -55, + 30, -51, 49, 11, 11, 47, 6, 49, 34, 35, -7, -19, -46, -17, 40, 32, + -33, -23, -43, 10, 48, -55, -14, 53, 5, 6, 44, -44, -22, 50, -69, 31, + 65, -56, -14, -38, 49, -45, 30, 24, 18, 41, -29, -21, -4, -84, 64, -6, + -8, -45, -30, -20, -39, -12, -34, -49, -45, 78, -64, -7, -9, -13, -38, 36, + -6, 10, -26, -41, -10, 28, -54, -19, 0, -19, -20, 34, -9, -39, -36, 61, + -47, 45, -59, 15, -43, -14, 22, -15, -28, 15, 35, -89, 48, 20, 0, -16, + -27, 44, 0, 36, -67, 12, -64, -16, 15, -7, -13, -76, -2, 22, -82, 81, + -37, -25, -3, -35, 16, 68, 7, 50, -4, -43, 76, -31, -48, 17, 51, 24, + -29, 22, -7, -69, 57, -51, 18, 23, 92, -65, 79, -43, 17, 43, -24, 89, + -93, 46, -52, 31, -24, 20, 4, -64, -55, 24, 7, -8, -6, -6, 71, -48, + 95, 0, -13, 50, 17, -75, 16, 25, -85, 0, -72, 70, -61, -2, 30, -49, + 79, -30, 37, -11, -6, 22, -11, -8, -71, 64, 4, -58, 0, 12, -7, -5, + 37, 21, -50, 1, 39, 38, -17, 67, 59, -72, 39, -28, 71, -39, -1, 8, + 63, -76, 61, -87, 46, -53, -28, 69, -37, 82, 43, 25, -8, -2, -39, -32, + 92, -58, 36, 4, 30, 32, -37, 23, -28, -23, 70, 30, -32, -5, 10, -66, + -5, -22, -29, -27, 24, -30, 34, 43, -46, 54, -25, 8, -49, 23, 34, -63, + 60, -21, 39, -3, -19, -24, -37, -27, -21, -29, -19, 47, 32, -6, 33, -82, + 57, 38, -10, -1, -27, 34, -26, -4, -53, 52, -67, 25, 15, -85, 62, -56, + -11, 0, 56, 33, 54, -18, -16, -35, -17, 27, -14, -12, -9, 86, -37, -45, + 62, 48, 49, -19, -14, 47, -2, 0, 44, -10, 46, -29, 44, 6, 49, -3, + -50, 40, -36, 66, 8, 14, 1, 5, -19, 17, 12, 5, -2, 45, 44, -41, + 18, -8, -4, 73, -18, 81, -39, -34, 41, -58, 35, -20, 12, -49, 45, -12, + 78, -82, 12, 2, 20, 64, -59, 78, -38, 22, 0, 70, -8, -11, -7, -40, + 29, 12, -76, 83, -51, -21, -56, 63, -58, 47, -51, 56, 56, -59, 7, 31, + -49, -36, 11, 35, 48, 16, 14, -30, -38, 13, -55, 52, -7, -38, -29, -28, + 59, -31, -33, 48, -33, -51, 54, 11, 54, -57, 2, 30, -27, -21, 18, -30, + -25, -80, 83, -85, 47, 24, 4, -55, 89, -2, 63, -60, 97, -61, 18, 21, + -70, 45, -19, 26, -37, 4, -60, 81, -24, -2, -7, 16, 73, -51, 52, -54, + -18, 47, -41, 90, -65, 18, -50, -42, -50, 79, -1, -18, -43, -9, 34, -58, + -15, -12, 42, -16, 26, 75, 3, -65, 64, -106, 32, 12, -19, 0, 19, 21, + -87, 38, -25, -16, -35, 0, 11, 17, 21, -22, 22, -36, 9, -3, 13, 54, + 32, -7, -2, 14, 2, 18, 16, -53, 44, -45, 20, 23, 50, -17, -13, 93, + -77, 56, -58, -5, -6, 24, 31, 21, 27, 29, -19, 4, -82, 60, -78, 87, + -51, 14, -14, 48, -26, -52, 46, 18, -6, 9, 44, -42, 45, 86, -81, 76, + 44, -9, -40, -32, -53, -46, 54, 32, 12, -53, -34, 68, -65, -18, 16, 22, + -66, -57, -33, -1, -46, 57, 10, -23, 6, -37, 25, -15, 16, -57, -3, -9, + -1, 14, 0, -32, 38, -11, -27, 23, 16, 9, -44, 29, -72, 65, -77, -24, + 84, -41, -5, -60, -19, -52, 18, 19, 4, 19, -83, 78, -13, 16, -59, 56, + -76, 82, -46, 76, -82, 2, -24, 23, -58, 49, -24, -55, 53, 1, -25, 45, + -12, 9, 56, -24, 25, 19, -2, -63, 59, -33, -11, -51, 2, -14, -49, 1, + 54, 0, 41, -52, -27, -77, 64, -52, 85, -54, 27, 4, -23, 64, 34, -30, + 7, -9, -6, 26, 28, 57, -69, -14, 55, -59, 50, 0, 26, -40, 13, 14, + 1, 80, -36, 27, -45, -39, 64, -71, 7, -42, 5, 70, -66, -30, 71, -31, + 26, 4, -3, -8, 0, 19, 75, -73, 19, 32, 55, -58, -61, 2, 20, 17, + -13, -39, -23, -28, -19, 60, -36, 99, -10, -59, 67, -18, -18, 43, 8, 58, + -11, 15, -58, 42, -76, -30, -72, 88, -66, 101, -67, -22, -8, 19, 14, -17, + 41, 0, 49, -37, 60, -22, -11, -56, 17, -38, 1, 13, 42, -29, 20, -43, + 4, 21, -54, 67, -74, -15, 18, -38, -20, 51, -38, 3, -35, -13, -46, -19, + -49, 70, -37, 50, -51, -10, 9, -38, 9, -17, -12, 29, 20, 4, 45, -75, + 27, -22, -26, 15, -17, 28, 0, -2, 13, -22, -63, 36, -47, -71, 79, -72, + -29, -47, 79, -46, 53, 29, 10, -77, 55, 24, 44, -29, 32, 35, 32, -76, + 72, 37, 15, -9, 35, -84, 13, 40, -83, 48, -11, -8, -44, 10, 25, -22, + 34, 2, -3, 10, -18, -29, 58, -35, -26, 13, 31, 29, -16, 11, 47, -61, + -17, -14, 6, 77, 4, -4, 48, -2, -45, 7, 53, -33, -42, 22, -2, 24, + -41, -23, -7, -22, 3, 69, 0, 8, 1, 11, -32, 51, -46, -49, 55, -7, + 0, -39, -34, 18, -28, -13, 0, 14, 24, 1, -47, 86, 14, 20, 43, 6, + 45, -52, -16, 31, -44, 121, -63, 23, -15, 30, -32, 14, 39, -72, -32, -20, + -15, 1, 30, 28, -67, -20, 11, 64, -30, -13, 47, -46, -25, 65, -34, -30, + 33, -59, 25, 27, -36, 63, -50, 84, -31, 18, -3, -51, 41, 29, -77, 53, + -30, -58, 47, -30, 1, -32, -29, 38, 16, -39, -66, 60, 46, -41, -29, 33, + -7, 61, -37, 59, 7, -22, 34, -62, -9, 12, -42, 24, 29, -29, 24, -54, + 30, -21, 17, 44, 6, 58, 40, -1, -61, 41, -51, 92, -70, 22, -11, 29, + -30, 46, -19, -38, 25, -34, 3, 48, -30, 11, 15, -61, 75, -63, -12, 14, + 0, 53, -1, -38, 80, -46, 20, 75, -33, -57, 70, -49, 67, -37, 71, -21, + 19, -6, -9, 41, -23, 29, -1, 48, -23, -13, -19, -6, -23, -35, 36, 69, + -39, 6, -12, -17, 8, 63, -65, 40, -57, -52, 76, 42, -28, 64, -82, 98, + -43, 45, 0, 18, -32, -30, 8, 43, -60, 19, -62, 60, -48, -48, 22, 10, + -14, -4, 11, -60, 13, 39, 13, -7, 49, 26, 11, -3, 51, 47, -5, -26, + 38, -77, 66, -60, 29, 40, -73, 95, -38, -39, 20, -26, 4, -54, 22, 55, + 27, 6, -65, -6, -18, -61, 9, -29, 67, -57, 29, 20, 2, -35, 49, 41, + -28, 64, -59, 72, -11, -65, 28, 22, -6, -31, 57, -8, -18, 56, -14, -33, + 3, 28, 39, 24, 37, 13, -33, 32, 45, -68, 58, -53, -15, 23, -54, 27, + -17, -1, -5, 38, -27, -65, -5, 6, -8, 10, -27, 30, -68, 67, 55, 0, + 26, 62, -46, -1, -2, 19, -34, -47, 11, 60, -72, 63, -9, -29, -19, 36, + -13, 52, -52, 3, 1, 6, -18, -68, 69, -53, 60, -46, -22, 27, 5, 42, + -17, 56, -64, 85, -34, 45, -68, 43, -33, -6, 3, 19, -17, 54, -6, -51, + 0, 0, 36, -47, -10, 50, -50, 43, 9, -55, 16, -15, 35, -45, 26, -3, + -57, 92, -61, -22, 22, -30, -9, -21, 25, -8, 61, -51, 45, -1, -8, -44, + 11, -26, -5, 58, -75, 42, -38, 0, 8, 48, -47, 29, -54, 73, 42, -43, + 71, -77, 18, 3, -41, 22, 13, -81, 21, 15, -1, 13, -52, 78, -10, 15, + -17, -31, 17, -19, 31, 52, -91, -7, 25, -4, -49, 74, -63, 96, -50, -84, + 72, -3, 23, 3, 4, -22, -19, 25, 48, 72, -23, -67, 58, 19, 17, -95, + 88, -75, -2, 27, 49, -5, -29, 15, 53, -19, 30, -78, 6, 46, -62, 16, + -15, 25, 27, 13, 58, -56, 9, 33, -39, -76, 53, -50, -40, 0, -37, -50, + 6, 4, 18, 11, -30, -18, 5, -71, 57, 59, -48, 8, 54, -25, 61, -113, + 57, -20, 47, 23, 61, 13, 30, -53, 35, 21, -62, 58, -46, 31, -96, 30, + -72, 69, -29, -18, -14, 23, -5, -47, -19, 1, -14, 29, 2, -53, 54, 39, + -66, 20, -18, -76, 3, -23, -2, -9, -57, 61, -24, 9, -50, -6, -32, -13, + -13, -25, 17, -21, 25, 57, -13, 39, -18, -51, -8, 49, -12, -17, -9, 6, + -52, -52, -1, 25, -3, -3, 37, 4, -36, -47, 67, -58, -29, 70, -4, 27, + -13, -77, 68, 1, 34, -8, 20, -2, 0, 74, -88, 82, -36, 2, -41, -20, + 12, -5, 60, -77, -2, 33, 18, -13, 60, -15, 63, -27, 2, -44, 62, 11, + -15, 66, -44, 14, -10, 26, 30, -73, 38, 3, 32, 32, -62, 16, -22, 47, + -27, -46, 54, 7, -37, 14, -37, -44, 29, 38, -43, 0, 10, -46, 32, 45, + -43, -1, 0, 14, 53, 27, 30, 6, -2, 13, -1, 27, -40, -50, 15, -62, + -20, -16, 19, -12, 32, 12, -19, 37, -3, 47, -68, -22, 7, -56, -35, 29, + -8, 24, -24, -19, -10, -84, 77, 18, 18, 16, 12, 33, 23, -56, -32, 100, + -57, 14, -13, -28, -1, -66, 64, 52, -81, -30, -24, 25, -52, -36, 63, 0, + 33, -31, 53, -59, -14, -10, 57, -67, -46, 5, 31, 49, 11, 16, 44, -38, + 38, -38, -38, 28, -46, -28, 58, -55, -22, 59, 1, 16, -30, 5, 46, 44, + 9, -8, 61, -40, 7, 82, -45, 17, -4, -45, 26, -22, -53, -30, 2, 62, + -31, 26, -44, 9, -64, -5, 48, 0, -29, -12, 32, -6, -39, 63, -1, 77, + -16, 2, -51, 60, -27, -20, -36, 83, -37, 34, -38, -22, 23, 34, -67, -34, + 22, 4, 39, 40, -32, 102, -70, 26, 14, -50, -20, 15, 66, 13, 12, 39, + -21, 74, -39, 55, -87, 18, -3, -20, -7, 60, 55, -44, 36, -44, 25, -69, + 88, -2, 59, -54, -2, 21, 0, 8, 73, -51, 3, 39, 56, -56, 7, -38, + -39, 58, 8, -63, 32, -22, 4, -54, -16, -3, -25, 18, -23, 30, 44, 0, + -39, 4, -23, 16, 0, -22, -1, 3, -11, -35, -15, -32, -14, 53, -69, -6, + 26, -91, 35, -8, 30, -50, -18, 39, -23, 20, -37, 56, 8, -16, -21, 43, + -83, 98, -51, 16, -31, 52, 45, -17, 57, -60, 52, 4, -59, 71, 9, -4, + 47, -17, -41, -22, -54, 9, -79, 55, -72, -14, 13, -22, 51, -23, -11, 59, + -57, 65, -7, -5, 17, -65, 40, -26, -25, 2, 83, 6, 6, 61, -33, 29, + -17, -8, 64, 1, 27, 58, -70, 45, -27, -42, 30, -33, -46, 81, -70, -24, + 49, -42, 41, -19, 25, 51, -65, -38, 60, -47, 67, -74, 118, -78, 28, -57, + -5, -17, 25, -15, -6, 14, 34, -7, 77, -33, 21, -74, -8, 16, 4, -18, + -20, 27, -5, 35, -18, 61, -76, 67, -7, 54, -69, 17, 35, -23, 9, -74, + 72, -37, -19, -15, -43, -21, 10, 22, 16, 5, -72, 68, 44, 32, -43, -45, + -14, 13, 44, 4, 8, -59, 31, -62, 62, -10, 28, 43, -58, 33, -30, -82, + 55, 23, -25, 51, 24, 19, 52, -51, 28, 7, -15, 62, -25, -29, 71, 38, + -53, 58, -47, 7, -38, -65, 43, 25, 13, 19, 26, 18, -85, 36, 26, -84, + 26, -107, 64, -74, 51, 21, 4, 15, 33, -82, 8, -57, 19, -17, 36, 21, + -18, -40, -26, 26, -43, 54, -55, 35, -33, -15, 26, 1, -70, 34, 25, 24, + 25, -6, 47, -28, -5, -16, 55, 56, 6, -28, 24, 8, 19, -39, 8, -28, + 28, 15, -8, 10, 38, -59, 55, -63, -2, -19, 60, -18, 48, -56, 110, -56, + 49, 42, 10, -38, -30, -8, 54, -13, -8, 12, -31, -20, -53, 79, -22, 5, + 25, -63, 22, 5, 10, -49, 12, 18, -30, -1, -20, -26, 46, -50, -20, -43, + 21, 11, -6, 57, 72, -51, 20, 1, 55, 20, 4, 25, 6, -12, 33, -9, + 40, -33, -50, -3, 23, 27, 27, 6, 59, -62, -52, 8, -15, -12, 59, -50, + -27, -11, -21, -21, 0, -17, 39, -32, 11, 7, -38, -11, 55, -5, 52, 62, + -64, 32, 36, 9, -40, 27, 12, 31, -59, 24, 26, -11, -68, 64, 10, -27, + 57, 5, -26, -1, -35, 42, -50, 4, -50, 11, -17, 72, -56, -19, 25, -31, + -24, -2, -5, -3, -4, -40, -4, 10, 43, -62, -23, 45, 27, -22, 42, 23, + -63, -27, 93, -50, 92, -55, -3, 23, -18, -47, 74, -24, -10, -1, 7, 62, + -23, -12, -10, 7, -1, 48, 0, -5, 5, -11, -55, -34, 55, -38, -32, 86, + -36, -45, -32, -11, -48, 23, -88, 36, 10, 58, -56, -22, -19, 63, -78, 27, + -63, 35, -31, 60, -27, 78, -98, 78, -75, -9, -21, 64, 0, -16, 10, 28, + 0, 60, 36, 10, -11, -45, 14, 3, -53, 30, 38, 5, -12, 71, -69, 30, + 0, 43, -24, 32, -32, -8, 53, -39, 42, -32, -1, -18, 78, -62, -34, 4, + -36, -19, -48, 52, -40, 37, -75, -35, -43, 38, -3, 21, -19, 58, -17, -10, + -3, -10, 45, 3, -55, 78, -69, 80, 40, -14, -48, 19, -17, -11, -69, 6, + -41, -16, -21, 14, 89, -65, 20, -78, 79, -51, 74, 26, -13, -48, 43, 5, + 37, 38, 11, -44, 10, 26, -55, -4, 44, -18, 6, -4, 0, -35, 48, 26, + -15, 55, -60, 10, -75, 53, 21, -54, -56, 0, 32, -39, 18, 4, -59, 54, + 0, 1, 81, -39, -31, -57, -10, 40, -75, 94, -22, 31, -20, -28, -11, 29, + 74, -4, -24, -17, -49, 68, -54, -31, -26, 47, 12, -30, -7, 9, -77, -51, + -53, 66, -58, -42, 47, 36, -32, -22, 56, -30, 38, 30, 3, -46, 1, -26, + 11, 13, -12, 31, -20, -25, 19, 28, -5, -54, 57, 13, -16, 19, -8, -3, + 30, 39, 12, 27, 8, 72, -71, 6, -62, 98, -70, 7, -73, 0, 10, -40, + 75, -32, -26, -12, -32, 16, 18, -6, 26, 6, -18, -19, 12, -50, 65, -27, + -43, 52, -67, 59, -8, -38, -36, -11, 58, -68, 72, 46, -10, 12, 12, -35, + 9, 19, 58, -47, 16, 15, 79, -27, -37, -37, 14, 37, 7, -8, -17, 31, + 66, -61, 19, -35, -18, -28, 61, -39, 27, 28, -32, -39, -31, 51, -14, 43, + -37, -20, -61, 40, 54, -43, -11, -7, 3, 63, -83, 73, -45, -38, 42, -35, + 16, -62, 31, 40, 12, -6, -37, -24, 50, -16, -3, -36, -62, 114, -46, 47, + -8, -6, 53, -14, -35, 41, 6, 50, 45, -20, 24, -91, 64, -35, 5, -7, + -33, 68, -103, 78, -41, -12, -7, -46, 0, 15, -7, 52, 0, 12, 35, 62, + 25, -6, 16, -38, -35, 44, -2, 65, -39, 19, -56, -35, 49, -20, 16, -38, + -23, 1, -58, 3, 60, -40, 32, -34, 44, -50, -9, 7, -4, 72, -29, -13, + -30, 18, -28, 6, 35, -52, 1, 60, -7, 13, -36, -51, 50, 41, -25, -39, + 35, -34, 4, -15, 77, -22, 27, -17, 18, -48, -47, 78, -70, 37, -40, 0, + -45, 3, 56, 23, 38, -23, 17, 57, 4, 12, -61, 64, -9, -21, 69, 47, + 13, 12, 5, -18, 34, -76, -32, 25, -26, -10, -20, -37, 20, 11, -6, 49, + -58, -8, -3, 12, 15, 55, 0, -29, 22, 37, -57, -48, 46, 24, 58, -4, + 2, -12, -53, 3, -22, -60, 73, 11, 6, -41, 43, 17, 26, -23, 9, 28, + 31, -57, 23, -13, 63, 7, 20, -9, -6, 48, 3, -25, 42, 15, -51, -15, + 66, -83, 90, -52, -41, 33, 31, -20, 29, 5, -68, 19, -76, 75, -47, 28, + 37, -1, -57, 73, 10, -72, -6, -57, 73, 26, -26, 16, -57, 46, -28, -44, + -16, 70, -63, 52, 12, 70, -80, 11, 11, -38, 62, 2, 5, -15, -9, -39, + 75, 0, -28, -5, -16, -6, 29, -6, -11, -20, -8, 2, 49, -30, 12, 12, + -22, 43, -46, -77, 41, -27, 43, -35, 34, 0, 34, 61, 51, -73, -13, 32, + 13, -19, 0, -22, 42, 22, -6, -66, -59, 55, -34, 58, -38, -8, -28, -7, + 56, -46, 24, -21, 55, -43, 45, -13, 25, 9, -20, -30, -5, -7, -35, -84, + 36, -4, -50, 26, -33, 14, -12, -21, 42, -32, 4, 61, -59, 29, -4, -13, + -42, 85, 14, 43, -58, 0, 53, -18, 50, -60, 91, -33, 33, -71, 25, -15, + -4, 0, 33, 19, -51, 8, -34, 24, -17, 7, 21, 57, -27, -78, 91, -20, + -58, 18, 58, -28, -82, 37, -22, 62, -77, 86, -33, -5, 26, -12, 66, -27, + -42, 48, -83, 3, -55, -8, -38, 4, 12, 21, 8, -73, 68, -26, -57, 25, + 11, -55, -46, 33, 19, 36, 73, -58, 52, -63, 64, -11, 19, -4, 8, 5, + -12, 76, -58, 43, -50, -18, -53, 77, -68, -16, 70, -57, 25, -53, -74, 9, + -13, -29, 36, -26, 76, -32, -20, 11, -24, -56, 36, 13, 12, 15, 25, -68, + -8, 28, -7, 13, -90, 44, -37, -24, -34, -30, -55, 56, -17, -27, -17, 63, + -34, 46, -53, 10, 76, -24, 59, -52, -6, 20, 71, -30, 17, -7, -44, 67, + -78, 60, -14, -61, -1, 58, -27, 71, -72, 9, 7, 11, 74, -74, 50, -20, + 31, -18, 9, 3, -70, -25, 46, 21, -58, 14, -1, 14, -21, -20, 22, -2, + -69, 72, -16, 37, 3, 22, -25, 58, -25, -13, 32, -42, -38, 73, -6, -61, + 27, 32, 7, 69, -18, -6, -29, 9, -54, -8, -43, -50, -15, 21, -25, -16, + -40, 60, -42, -34, -7, -13, 28, 28, 34, -65, 34, 18, -21, -31, 51, 42, + -54, 36, 2, 10, -32, -42, 79, -64, 15, -53, -3, 44, -13, 44, -27, 88, + -23, -15, 79, 0, 27, 15, -11, -3, -63, 2, -13, -17, 33, -5, -42, 61, + -42, -55, 2, -44, -4, 3, -37, 8, -25, 11, -17, -24, -3, 44, -70, 25, + 77, -47, 2, 23, 16, 56, -56, 61, -45, 11, -4, -28, -33, 95, -63, -18, + 40, -17, -21, -37, 90, 7, 34, -31, 21, -51, 3, 15, 27, -5, -49, 50, + -3, 19, 39, 1, 41, 51, 13, -21, -4, 43, -35, 27, 11, -33, 52, -11, + 22, 56, 0, 7, 23, -37, -55, -9, 12, 46, -59, 15, -24, 32, -33, 50, + -34, -57, 31, -12, -32, 87, -26, -6, 66, -24, 45, -25, 43, -6, 63, -11, + 26, 21, -32, -27, 20, -38, 45, -56, 53, -1, 25, -65, -32, -8, -46, 41, + 3, -7, 47, -5, 57, -70, 85, -15, 39, 62, 34, -30, 2, 14, 49, -44, + -42, 35, 0, -57, -9, -34, -8, -57, 75, -60, -19, -31, 8, -8, 43, -50, + 0, -4, -4, 44, 16, -16, -9, -14, 23, -41, 44, -49, -48, 66, -34, -6, + 23, 34, -57, 56, 29, 30, -63, 6, 33, -13, 55, -18, -52, 23, -19, 4, + -1, -41, 19, -52, 5, 1, 0, -76, 55, -17, -59, 77, -38, 12, -61, 89, + -56, -15, 29, -56, -57, 70, 20, 42, -14, 49, -10, 41, -16, 28, 40, 8, + 86, -72, 52, 14, 35, -49, 14, -10, -3, 56, -27, 38, -1, 54, -20, 1, + -36, -9, 37, -25, 2, 31, -52, 58, -21, 72, -50, 16, 31, -61, -22, 17, + -17, -16, -56, 47, -83, 40, -25, 62, 28, 48, 20, -37, 30, -60, 61, 30, + -7, 46, -30, 98, -32, 15, 6, 25, -19, 68, 4, -7, -68, 53, 40, -13, + -28, -28, -37, -47, 23, 3, -17, 36, -18, 64, -66, 26, -9, -38, -12, 52, + 51, -19, 56, -23, -44, -5, -69, 41, 3, 37, 21, -7, -5, 2, 38, -2, + -6, 37, -84, 7, -36, -36, 7, -36, -9, 6, -16, -11, 0, 31, -55, 0, + -87, 27, 3, -18, -27, 11, 37, 33, -58, 29, -34, 66, -36, -51, 22, -7, + 39, 52, -25, 17, -62, 16, 1, 5, -72, 17, -12, 23, -40, 26, 19, -36, + 1, -33, 11, 36, 46, -11, -19, 43, 9, 6, 16, 39, 48, -12, 30, 20, + -77, 68, -61, -27, -14, 8, -32, 6, -32, -84, 64, -50, 26, 21, -6, -36, + 61, 19, 26, 42, -21, 8, 22, 71, -47, 8, 90, -69, 85, -22, 51, -50, + -11, 56, -55, 44, -36, 42, -31, -2, 24, -27, 50, -12, -18, -2, 43, -24, + -7, -30, 40, -49, 34, -6, -21, 49, 24, -46, -84, 49, 38, 31, 66, -62, + 82, -30, -36, -12, 49, -54, 61, 13, 21, 8, 56, 17, -56, 8, 55, -78, + 43, -7, 17, -12, 94, -81, -30, 52, -28, -20, 42, -55, -16, 43, -58, -32, + -38, -6, 29, -55, 47, -16, 21, 0, -39, 15, -16, -37, -50, -56, -15, 33, + 40, -23, -12, 37, -59, 57, -5, -19, -30, -20, 16, 29, -68, 32, 58, -3, + -35, 26, -4, 12, 34, 42, -31, -62, -13, -9, -38, 20, 0, 36, -46, -57, + 28, 35, -49, -51, 29, 15, -10, 38, -70, -50, 27, -45, 79, -40, -2, -50, + -41, 50, 20, 57, 40, -35, -36, -6, 15, -53, 75, -22, 6, 2, 55, -61, + -56, 36, -61, 40, -42, 73, 9, -23, -48, -32, 26, -59, 69, -35, -53, 59, + -82, 33, 9, 20, 17, 42, -50, 34, -1, -36, 43, -15, -5, -26, 21, 1, + 75, 22, -60, -7, 23, 4, 0, 5, 53, -35, 38, -11, -11, 57, -17, 11, + 12, -73, -6, 0, 64, -1, -52, -5, 21, 14, 12, -51, 4, -40, 14, -28, + 58, 3, -2, -29, -46, -67, 44, -3, -69, 33, -45, 13, -48, 37, -78, 75, + 25, -15, 16, -5, 41, -19, 29, -3, 16, 13, 12, 4, 5, -82, 45, -49, + 25, -55, -1, -1, -23, 23, -35, 4, -39, 26, -83, 44, -36, -19, -13, 52, + -17, 36, -21, -2, 26, -49, 49, 31, -14, -1, -54, 37, 1, -39, -30, -34, + 2, 3, 1, 18, -25, -53, 77, -81, 5, 72, 35, 28, -59, -46, -21, 20, + -67, 64, 45, -21, 40, 34, -53, -10, -34, 15, -60, 17, 36, -50, 5, 41, + 13, -12, -3, 29, -42, -22, 96, -74, -9, 23, 20, -40, 49, -64, 49, 70, + -57, 29, -15, -53, -31, 19, -31, 35, -21, 17, -51, 91, 25, 61, 29, -31, + -34, -11, -48, 17, 34, -74, 36, 23, 38, 37, -51, -3, 29, 23, -35, -59, + 21, 50, -92, 63, -31, -10, 4, 29, 20, -18, 15, -27, 5, -17, 48, 37, + 40, -100, 31, 46, -58, -21, -34, 12, 34, 19, -16, 36, -59, 46, 4, 42, + 26, 13, 1, -62, -31, -61, 98, -77, 27, 9, 1, -9, -38, 6, -37, -5, + -16, -4, 21, -25, 58, -82, -2, 38, 68, -45, 50, -29, -68, 57, -53, 22, + -20, 24, 22, -16, 19, -5, 31, 6, -23, -30, 38, -29, 13, 25, 6, -51, + -2, -36, 67, 4, 17, -31, -7, -25, -15, -28, 17, -26, 25, -14, -37, -48, + -12, 52, 27, -27, 18, -15, 91, -70, 63, 17, 2, 3, 30, -58, 63, -45, + -27, -13, 4, 45, 7, 49, 23, 7, 51, -22, -14, -12, 34, -60, 34, -51, + -38, -10, -9, 36, 19, -21, 28, 13, -37, -2, -43, 22, -34, 55, 13, 27, + -45, 21, -20, 49, -31, -25, 54, -38, 4, 30, 9, -19, -22, -25, 22, -30, + -41, 42, -22, -14, -12, -58, 27, -53, -22, 17, 34, 9, 12, 59, -25, 97, + -59, 46, 3, -31, -19, 29, -42, 56, 0, -69, -72, 36, -21, 32, 37, -6, + 9, -81, 7, 20, -66, -47, 65, 4, -55, 85, -66, 16, -5, 6, 15, 7, + -26, -3, -51, -1, 58, 0, -46, 25, 34, -56, 66, -4, 5, 68, -55, -54, + 77, -18, 2, 69, 37, 7, 8, -55, 24, -6, 48, -45, -63, -38, 35, -21, + 43, 47, 26, 32, -54, 79, -75, 47, -48, -36, 15, 20, 16, -45, 31, 72, + -56, -9, 82, -54, 6, -4, -61, 15, 18, 27, 11, 56, -62, 47, -36, -63, + 29, 57, 27, -81, 75, 13, 31, 24, 37, -51, 13, 0, 28, -21, 9, 22, + -64, 2, 31, -25, 63, 61, -74, 43, 31, -72, 44, -61, 80, 33, -30, 51, + 28, 27, 16, 9, 16, 55, 0, 12, -66, 4, -10, 51, 52, -55, 53, 46, + -5, -10, -48, -6, -8, 0, -19, 3, 29, 44, -39, 13, 17, 24, 0, 21, + 18, -14, -45, -11, -55, 8, 40, -59, 55, -34, -29, 39, -37, 65, -13, 68, + -52, 27, -6, -56, 46, -60, 0, -1, -66, -32, -37, 36, 15, 10, -24, -4, + 74, -18, 32, -93, 58, -40, -50, 24, -4, -19, 3, 22, 27, 24, 22, -18, + 66, -12, -4, -34, -3, -70, 42, -14, -41, 75, -68, 81, -8, -7, -19, -2, + 79, -57, 8, 8, -24, 10, 8, -55, 60, 6, -3, 21, 34, 28, -25, 6, + 42, 29, -49, 7, 29, 54, -5, 51, 0, 14, 27, -42, -20, -58, 48, -75, + 18, -32, 36, 60, -32, 14, 61, -87, 9, 29, 74, -25, -5, -64, 72, -61, + 41, 49, -20, 1, 9, 55, -42, -20, 37, -74, 32, 59, -32, 33, -89, 61, + -63, 85, 9, -40, -2, -26, 7, -27, -24, 11, -19, -37, -8, -50, -3, -1, + -52, 25, 62, -113, 26, -53, 7, 0, 11, -27, 42, -53, 84, -25, 34, -63, + -3, -40, 5, -55, 44, 7, -60, 58, -79, 59, -49, -17, 46, -18, 37, -44, + -15, 73, -59, -15, -35, 42, 18, 42, -67, -44, 43, -97, 59, 10, -47, 39, + -46, -22, -33, 65, -82, 13, 9, -54, -63, 39, -24, 44, -52, 34, -67, 39, + 7, -16, 12, 32, -74, 2, 50, -51, 27, 37, -19, 23, -59, 26, -35, 18, + -54, -1, 3, -43, -51, -43, 0, -51, 98, -45, -2, -20, 5, -14, -40, -41, + 34, 34, 28, 56, -19, 49, -28, -27, -20, 13, 33, 27, -26, -64, -3, -26, + -3, 38, 3, 17, 34, 27, -4, 30, 8, 48, -45, 27, -25, -56, 12, -3, + 42, -18, 32, 9, -1, -31, 56, 4, 48, 13, 9, -41, 18, 28, 4, -21, + 18, -74, 65, -23, 34, 28, -10, 5, -24, 5, -31, 19, -27, 12, -5, 14, + -4, -46, 55, 26, -4, 48, -2, 10, -1, 30, 18, -81, 33, -41, 34, -21, + -49, -3, -1, 36, 16, 39, 18, -4, -51, 14, 11, 17, -3, -27, -24, 55, + -16, -63, 64, -63, 46, -86, 46, -89, 85, -67, -27, 59, -6, 26, 40, 6, + -37, 38, 3, -96, 38, -45, -23, 53, 34, -59, 16, -27, 13, 52, -21, -31, + 14, 22, -25, 11, 42, 7, -11, 33, 9, 45, 1, -74, 5, 10, 27, -8, + -15, -33, -10, 66, -35, 62, 20, -7, 12, -23, 27, 13, 31, 34, 51, 14, + 63, -41, -30, 45, 35, 41, -7, 33, 24, -14, -55, -13, 29, -19, 55, -42, + 94, 16, -37, 8, -28, 15, 27, -14, 82, -39, -1, 46, -77, -17, 42, -78, + 74, -101, 67, 1, 73, -21, -15, -7, 31, -16, 53, 35, -50, 31, 45, -35, + -10, 76, -24, 22, 54, -52, 9, 54, -5, 43, 5, 16, -1, -14, 57, -58, + 16, -24, 18, -45, 63, -34, -42, 20, 9, -60, -2, 44, 74, -45, -26, 2, + -25, 56, -76, 78, 46, -1, 30, -20, 2, -4, 1, -50, 50, 44, -18, 1, + -29, -77, 51, -77, -7, -87, 44, 56, -35, -52, 32, -69, 0, 81, -7, 15, + 0, -28, 21, -53, 59, -78, 30, -4, -8, 15, 31, -16, 7, 42, -19, 6, + -1, -39, 63, -71, 12, 44, -75, -6, 21, 20, 23, -48, 49, -92, 62, -58, + 18, -13, 4, 3, -25, -37, -56, 64, 10, 14, -27, -3, -16, 54, -72, -3, + -44, 96, -54, -5, 1, -32, -42, 13, -74, 12, -6, 42, 20, 0, -38, 6, + 59, -23, 46, -68, 49, -72, -30, 22, 42, -57, 48, -64, -36, 78, -45, -51, + 80, -32, -2, -4, 0, 60, -76, 53, -64, 43, -2, -42, -27, 20, -48, 59, + -60, 7, -32, 100, 1, 2, 26, -66, 36, 17, -67, 53, -8, -23, -27, 21, + 2, 8, -43, -32, -5, -60, 57, -8, 17, -77, 21, 52, 21, -58, 22, 16, + 18, -34, 88, -94, 20, -22, -26, 30, -34, 32, -32, 29, 5, -40, -50, 8, + -63, 0, 13, -44, -24, -63, 53, -84, 4, -4, 80, -50, 16, 30, -51, 14, + -66, -35, 26, 28, 14, 37, -74, 75, -69, 28, 10, 49, 42, 38, -46, 78, + -100, 108, -65, 0, -23, -29, -18, 17, 26, -2, -59, 8, -30, -24, 36, -32, + 11, -70, 48, -36, -66, 107, -61, -26, -7, 14, -58, -7, 7, 4, -34, 40, + -13, 9, 39, -5, 7, -9, 20, -19, 14, 46, -34, -39, -84, 100, -20, 38, + 7, -49, 44, -28, -37, 51, -31, 28, -31, 53, -86, 71, -78, -9, 18, 0, + 61, 0, -29, 40, 19, 73, -40, 2, 7, -6, 31, 33, -14, -50, -36, 55, + -47, 83, -65, 26, 0, 8, -13, -15, -9, 4, -38, -24, 18, -24, 39, -49, + 79, -25, -34, 59, -61, 23, 0, 53, -57, 0, -8, 29, -16, 55, -34, 63, + 39, -7, -10, -24, 63, 4, 60, -81, 36, 8, -3, 27, 2, -66, 108, -20, + 0, -31, -22, 9, 52, 20, -41, 56, 37, 17, -6, -12, -35, 42, -11, -24, + -32, 40, 15, -28, -15, 4, 20, -4, -47, 39, 11, 20, -53, 30, 11, 12, + -59, 25, 37, 52, -23, -71, 78, -48, 80, -32, 39, 9, 31, -37, 46, -3, + 59, 33, -36, -24, -73, 12, 31, -13, -9, -12, 60, 5, -10, 57, -55, 25, + -53, 48, -24, 63, -46, 32, -53, -75, 37, 36, 0, -73, 67, -60, 64, -8, + 28, -43, -46, 60, 1, 54, -20, -35, 41, -64, 57, -102, 25, 26, 35, -53, + 88, -54, 64, 25, -18, 32, 17, -16, 56, -27, -19, 37, -12, 2, 18, -12, + 30, 59, -54, -36, 4, -45, 22, -39, 26, -20, -53, -47, -56, 36, -43, 36, + 46, -79, 69, -2, -32, 51, 30, 36, -64, -10, 13, -19, 86, -68, 33, -26, + 25, 30, 15, 4, 0, -29, 20, 14, -12, 12, 27, 9, -52, 39, 13, -66, + 55, -56, -6, 2, 29, -39, 13, 14, 14, -32, -1, 42, 31, -39, -13, 13, + -63, 59, 13, -14, -22, -51, 27, -10, 54, -74, 90, 29, 32, 0, -62, 23, + -29, 9, 16, -34, 38, -42, -10, 28, 30, 10, -33, -36, 75, -12, 49, -54, + 25, 5, -13, -4, 8, 43, -54, 36, -35, -16, -2, 63, -28, 5, -34, 71, + -86, -15, -23, 54, -23, -1, 13, -24, 23, -41, 36, -49, 2, -19, -8, -34, + -72, 7, 20, 45, -46, 31, -57, 28, 10, 6, -12, -12, -60, 87, -69, -49, + 60, 13, -22, 14, -96, 18, 49, -41, 10, -42, 7, -44, 45, 32, -49, 72, + 14, -86, 12, 32, 7, 56, -43, -8, 5, 18, 0, 11, 4, 0, 16, 20, + -54, 67, -70, -44, 23, 58, -6, -26, -14, -31, 24, -36, -27, -16, -19, 11, + -50, -56, 12, 34, 64, 13, -53, 39, 2, 38, -53, -53, 36, -63, 30, 3, + 40, -7, 44, -35, 15, -22, 45, 67, -16, 9, -19, 27, -15, 28, -65, 8, + -3, 22, -4, 0, -40, 5, -56, 64, -21, 0, 40, 56, 4, 3, -13, 4, + -36, 9, -84, 49, 17, 20, 31, -35, 3, -63, 95, -82, 48, -77, 59, -68, + 42, -75, 43, 38, 3, 14, 35, -49, -21, 19, 66, 47, -29, 36, -18, -38, + 28, 0, -56, 22, -23, -17, -68, 52, -56, 62, 29, 47, -77, 36, 20, 0, + 27, -6, -20, -15, -21, -13, 3, -14, 30, -28, -66, 25, 56, -9, -46, 37, + 10, 2, -27, 63, -25, 5, 25, 18, -38, 32, 0, -21, -9, 35, -24, -3, + 80, -20, 24, -20, 30, 45, -6, -34, -49, 54, -64, -83, 76, -48, 57, -10, + 52, -41, 29, -46, 24, 18, -13, -13, -55, 21, 26, 15, -80, 31, 33, -50, + -18, -6, -46, 78, -60, 54, -19, 29, 15, -15, 36, -36, 31, -42, 53, -55, + 61, 10, 32, -56, 54, 5, 4, -30, 1, -49, 57, -16, 68, -8, 34, -44, + 81, 42, -63, -47, 40, -52, 85, -82, 27, -12, 24, -40, 80, -65, 37, 8, + 47, -36, -44, 48, 68, 22, -44, -23, 6, 37, 28, 34, 0, -43, 44, -19, + -59, 84, -1, 10, -41, -9, 27, 16, 30, -45, -56, 28, -19, 33, -26, -28, + 43, -37, -18, 70, -68, 5, -55, 75, 11, -17, 9, 66, -7, -1, -19, 35, + -27, 85, -32, 4, -80, 61, -12, -20, -59, -4, 72, 20, -20, 6, 59, -70, + 62, -25, -55, 68, 38, -21, 44, -53, 9, -6, -46, 28, 9, -23, -2, 58, + -57, 37, -13, 16, -2, 50, 2, 8, -22, 42, -74, 2, -48, -32, 35, 55, + -32, 37, 54, -54, -51, 9, -52, -3, 67, -5, -30, 13, -12, 27, -26, 69, + -67, 68, -66, 30, -33, 49, -59, 81, -2, -4, -45, -17, 6, -61, 12, 35, + 42, -56, 79, 16, 52, -34, 13, 27, 13, 6, -57, -14, 8, -28, 37, -44, + -17, -77, 57, 4, 69, -40, 33, -31, -8, 54, 14, 40, -73, -25, 44, 21, + -51, 18, 41, -104, 75, -78, 13, -42, 35, 17, -35, 66, -32, -20, 0, -20, + -64, -6, -22, -36, -19, 41, -32, 77, 73, -74, 48, 57, -80, -5, 10, -10, + -40, 2, -22, 62, -4, -42, -12, -31, 69, -6, -75, 66, 29, -35, -30, 55, + 18, 13, 51, -65, 33, -17, -31, 9, -47, 50, -37, 13, -44, 51, 20, -19, + -43, 1, -21, 51, -2, -34, 40, -24, 56, 61, -55, 13, -82, 39, -51, 55, + -41, -55, 55, 61, -56, 65, -73, 43, 13, 3, -88, 74, -59, 82, -52, 8, + -58, 43, -19, 41, -78, -24, -19, 55, 27, -46, -26, -45, -31, 22, 11, -34, + 21, -23, -80, 65, -22, -11, -32, 27, 9, -9, 37, 47, -40, -25, 28, 5, + 33, 60, -31, 69, -41, 23, 46, -69, -34, -29, -14, -35, -5, 53, -8, -35, + 5, 8, -71, 24, 55, -34, -8, -6, 84, -39, -15, -34, 32, -61, 39, -13, + -49, 9, -2, -44, -33, -12, -17, -25, -1, 35, -36, 63, -45, 56, -89, 42, + -4, -54, 24, -44, 36, -82, 55, -15, -17, -17, 31, 43, -2, 33, -64, -40, + 39, -36, -18, 47, -9, 3, 44, 8, -66, -19, 13, -11, 64, -13, 0, -29, + 18, 16, 32, -67, 72, -49, 15, -55, 32, -53, 62, 22, -17, 87, -51, 2, + -55, 34, -93, 29, -108, 84, -30, -37, -65, 44, 4, -52, -33, 75, -51, 66, + 1, 34, 20, 10, -38, 2, 26, 19, -20, 23, -28, 24, 4, 29, -74, 17, + 46, -55, -17, 86, -63, 24, 70, -25, -27, -10, -24, 16, -44, 23, -29, 60, + 4, 8, 42, 14, 34, -24, -32, -51, -77, 9, 33, -36, 69, 66, -48, 67, + -67, 36, 42, -66, -41, 68, -2, 33, -57, 44, -16, 14, -75, 62, 6, -17, + -33, -51, 64, -69, 21, -28, -8, 12, 9, 60, -55, 22, 46, -42, -9, 41, + 48, -18, -22, -26, -24, 8, 37, -20, -39, -74, 92, -45, 96, -32, 36, -48, + 23, 23, -43, -59, 67, -61, 51, -16, -37, 21, 28, 49, -53, -33, 15, 36, + -7, 39, -66, 50, -25, 90, -47, -34, 0, 48, -16, 65, 18, -52, 48, 30, + -25, 39, 40, -15, -23, 24, 33, -27, -46, 35, -16, -37, 92, -51, -41, 29, + -91, -39, 1, -39, -28, 32, -26, 58, 13, 45, 17, -62, 61, -39, 33, -6, + -28, 6, 41, 5, -32, 9, 36, 8, -40, -13, 83, -45, 38, -34, 67, -1, + 0, 1, 21, 34, -20, 3, 19, 40, -45, -62, 68, -82, 35, 15, 7, 35, + -19, 28, 7, 49, -63, 44, -32, -23, 69, -60, -2, -34, -30, -8, 47, -2, + 25, 7, -59, 27, -6, -10, -25, 16, 23, -39, 48, -37, -58, 33, -39, 33, + -42, 67, -55, 22, -10, 4, 37, -8, 20, -38, -7, 7, -14, -28, 10, -47, + 80, -63, 86, -15, 64, -3, 7, 19, 91, -32, 47, 54, 66, -98, 26, -81, + 61, -9, -23, -18, -19, -24, 4, 13, -28, -26, -30, 21, 7, -24, 40, -6, + 12, 50, -52, 5, -23, 41, -43, -24, 68, 59, -65, 39, 53, -9, 56, 18, + -41, 1, -29, -38, 4, 16, 10, 19, 54, 35, -60, 30, -54, -56, -42, 30, + 44, -54, -29, 66, 8, -15, -65, 51, 20, -27, 19, -14, 48, -11, -56, 34, + 58, -56, 37, -4, 65, 2, -54, 76, -54, -20, 8, 0, -23, 13, 2, -53, + 5, 30, -25, 37, -13, -17, -46, 45, -26, 48, -45, -39, -36, -39, 62, -36, + 11, 29, 24, 10, -64, 67, -49, 25, -17, 43, 5, -1, -50, 88, -10, 0, + 5, 43, -75, 75, -63, -51, 44, -7, 25, 1, -19, -45, -26, 20, -46, -23, + 47, -37, 38, -74, 41, -34, -26, 8, 68, -75, 9, -9, -57, 61, 14, 26, + 42, 50, -5, 56, -44, 25, -59, 39, -42, -6, 64, -41, 52, -83, 43, 24, + 30, 13, 17, -34, 0, -42, 77, -73, 20, -17, -54, 8, -3, -41, -17, -70, + 109, -97, 84, -69, 54, -7, -47, 48, 15, 85, -52, 68, -63, -36, -6, 57, + -51, 21, -39, -35, 79, -22, 34, -1, 3, 3, 26, 20, 45, -66, 41, 9, + -55, 33, 10, -7, 29, 0, 12, 21, 7, 58, -6, 49, -14, 0, 38, -20, + -32, -57, 51, -64, 24, -60, 15, -59, 53, -39, 75, -39, -3, 62, -52, 57, + -32, 51, -48, -6, -15, -68, 18, -37, -55, -22, -46, -46, -24, 64, -20, 43, + -50, -29, 46, 26, 9, -36, 72, -68, 32, 43, 22, -42, 20, -13, 41, -51, + -9, -38, 9, 38, -9, -27, -15, 6, -53, -28, 28, 28, -36, -45, -36, -18, + -44, 91, -64, 58, -55, 42, -26, 27, -8, -66, 94, -54, 25, 74, -43, 69, + -93, 67, 33, -62, 32, 50, 45, -47, -14, -28, 46, -21, -43, 44, 21, -40, + 30, 10, 48, -92, 2, -16, 83, -68, 19, 74, -23, -22, 50, -6, -65, 60, + -72, 72, -41, -32, 42, 35, -55, 38, 20, 31, -46, 93, 5, 35, -46, 3, + -13, -66, -17, 41, 23, -63, 72, -60, -16, -53, -54, 64, -4, -53, -9, 30, + -74, 20, 12, 17, -16, 67, 14, -45, -1, -10, 72, -27, 34, -42, 8, 49, + -76, 61, 2, 39, -39, 17, 44, -19, -6, 76, -14, 5, -29, 32, 20, -46, + -11, -27, 20, 2, -18, 9, 15, 43, -61, 60, -85, 30, 18, 12, 21, -64, + 3, -41, 31, 34, -59, 53, -88, 65, 29, -6, 69, 32, -32, 28, 40, 22, + -88, 67, -35, -7, -19, -11, -3, -21, 35, -60, -16, 30, 17, 27, 31, -39, + -37, 32, 52, -36, 19, -44, -35, -11, -18, 17, 10, 3, -45, 62, -25, 3, + 0, 0, 12, 20, -26, 41, -74, 34, -55, -23, -43, 52, -27, -32, 75, -32, + 63, 22, -3, 21, 52, -15, 46, 3, -12, 57, -88, 67, -11, -26, 4, -70, + 70, -86, 54, -16, 26, 73, -81, 105, -3, 17, 63, 7, 6, 3, 18, -34, + 34, 16, -49, 32, -69, 97, -68, 17, 20, -63, -7, -10, -21, 17, -6, -22, + 47, -32, 61, -9, -13, -15, 29, -4, 19, 5, -46, -34, -20, 46, -12, 65, + -35, 13, 10, -30, 44, -19, 21, -30, 35, -63, 27, -73, 63, -57, 11, 6, + 16, -16, -24, 23, -8, -90, -10, -22, 21, 14, -64, 63, -61, 19, -12, -2, + 10, -52, -2, 74, 6, -27, -9, -11, 18, -52, -17, -16, -38, -3, 58, -19, + 67, -59, 6, 36, -46, 30, 4, 43, -83, 13, -8, -46, -43, 58, -25, 4, + 36, 65, -16, 12, -56, 69, -7, -7, 51, 41, 42, -47, 15, 4, 58, -53, + 41, -32, 9, 19, -33, -14, -4, -54, 35, 22, -33, -40, 27, 22, -4, 0, + 24, -47, -58, 62, -46, 59, -39, -35, 47, -66, 14, -51, 37, -30, 4, -55, + 51, -47, 38, -4, 15, -36, 52, -62, 93, -56, 14, -15, 32, -68, -1, 32, + -16, 10, 2, -5, -26, 26, 53, -42, -26, 4, -70, 4, 5, 1, -16, 43, + 18, -35, -14, 47, -12, 4, 0, 24, -23, 41, -21, -51, 30, -33, 50, -83, + 84, -57, 10, -16, -3, 35, 19, -11, 46, -24, 69, -72, 74, -23, -58, -12, + 38, -19, -16, -65, 51, -16, 52, -36, -7, 66, 7, -32, 12, -19, -26, -40, + 0, 39, 14, -73, -8, 50, -26, -35, 1, -24, 23, -51, 58, -42, 41, -6, + 47, -48, 36, -15, 31, -49, 80, -78, -20, -18, -28, -13, 0, -8, -14, 73, + -32, 16, -37, 59, -41, 9, -43, 29, 39, -21, 47, -4, 26, 16, -25, 24, + 28, -30, -29, 26, 20, -52, 46, 40, -36, 91, -29, 76, -26, 60, -2, 6, + -36, 41, -8, -6, -24, -23, 55, -57, 17, 24, 56, 7, 21, -10, -15, 19, + -21, 9, -46, 68, -17, 68, 60, -83, 96, -84, 89, -66, 78, -43, 75, -62, + 0, 2, -4, -41, 9, -14, 19, -14, -40, 1, 60, 10, 13, 77, -109, 55, + -16, -20, 65, -66, -21, 50, -57, -51, 37, 27, -22, 56, -3, -40, 51, -15, + 22, -83, 81, -66, 11, -40, -3, -10, 25, -42, -30, 5, -26, -19, -23, 54, + -3, -19, 51, 1, -20, -24, 47, 32, 34, -78, 45, -14, 15, -12, 53, -63, + 49, 30, 5, -9, 9, -74, 88, -32, -4, -47, 46, 19, 4, -35, 21, 50, + -37, 0, -1, 0, 5, -28, -18, -1, -5, -46, 21, 26, 9, 53, -33, 27, + 2, 29, -81, 91, -25, 67, -42, -23, 14, -49, 63, 20, -31, -16, -16, -8, + -22, 10, 19, 15, 43, -27, -12, -24, -25, 50, -64, 93, -3, -28, -12, 65, + -13, -1, 72, -35, 28, -39, -36, 36, -29, -39, -34, 0, -31, 17, 56, 54, + -75, 59, 0, 98, -110, 60, -66, 9, 34, -68, -11, -18, -47, 76, -42, 76, + -32, -28, -27, 73, -47, -21, 14, 35, -11, 52, -76, 67, -75, 52, -20, -18, + 9, -14, -16, 32, -52, 52, -99, 62, 38, 12, -51, 102, -53, -35, 35, -60, + -18, -46, -20, 6, -20, 38, -1, -43, 23, -41, 13, 38, -42, -4, 29, -64, + 89, -92, 67, -62, 24, 60, -67, 5, -34, -33, 3, -35, -10, -73, 5, 17, + -70, 29, -53, 32, 0, -14, 21, -40, 55, -5, -67, -22, -32, 20, -28, -38, + 1, 68, -13, -58, 63, -55, -38, 57, -56, 74, -67, 36, -8, 13, -50, 70, + -26, 3, 8, 9, 55, -74, 21, 42, 18, 48, -81, 47, -58, -60, 61, 18, + -24, -41, 6, 65, 3, -44, 72, 13, 11, 38, -22, 19, -25, 32, -17, 22, + -70, 96, -78, 79, 8, 43, 25, -25, -10, 45, -39, 34, 73, -32, 25, -61, + -11, -2, -44, 10, 9, -39, -2, -46, 35, 0, 38, -30, 8, -39, 14, -14, + -64, 57, -25, -52, 72, -38, 13, -37, 40, 62, -62, 81, -68, 53, -69, -14, + 84, -9, -25, 1, -18, 0, 58, -20, -20, 37, -16, 37, -59, -30, -42, 5, + -22, 2, 38, -80, 29, -75, 17, 39, -35, 45, -15, -42, 6, 19, 7, -26, + 48, -27, 36, -36, -52, 31, 2, 21, -24, 55, -53, -15, -39, -18, 45, -66, + 46, -45, -43, 5, -8, 30, 52, -21, 21, 24, 2, 50, -16, -23, -15, -74, + 80, -76, 16, -66, 64, 11, 17, -55, 41, 35, 3, 31, 68, -43, -37, 24, + 5, 20, -63, 18, 30, 57, -66, -5, -3, 36, -15, 19, 42, -22, 38, -8, + 36, -38, 24, -1, -15, -18, 39, 47, -60, -32, 39, -82, 14, 41, 9, 58, + 61, 43, 13, 36, 18, 15, -8, -4, -14, 0, 39, -34, -19, 79, -41, -15, + -54, 48, 5, -6, -41, -16, 13, -35, 52, -32, 11, -16, 37, 80, -62, 54, + 19, 44, 36, -26, -4, 47, -2, -60, -12, 4, 7, 38, -9, 1, 44, 32, + -24, -4, -49, 39, -84, 14, 29, 6, 30, -51, -9, -22, 44, -45, -22, 35, + -76, 81, -98, 16, -4, 0, 27, -37, -31, 9, -24, 32, 25, 49, -8, -44, + 9, 21, 22, -10, -41, 21, -77, 23, -8, -43, -31, -12, -9, -11, -46, 28, + -5, -42, 23, -63, 48, -52, -33, 50, -6, 0, 51, -44, -16, -23, 7, 54, + 34, -8, -12, 57, 8, -26, 57, -23, -8, 16, 28, -39, -17, 42, 25, 6, + 66, -87, 42, 10, -4, -19, 17, 37, 9, -33, 7, -32, 10, 33, 78, -18, + -44, -5, -23, 63, -33, 53, -57, -31, 40, 22, -49, -29, 8, 62, 31, 9, + -61, 43, -40, 30, 15, 41, -29, 29, -64, 37, 27, 18, 16, 12, 23, -3, + -3, 24, -30, -25, 54, -1, -36, 35, -39, -17, 28, 41, -27, 40, -25, 10, + -11, 1, 65, -26, -20, -32, 30, -25, -46, -10, 4, 29, -33, 21, -5, 79, + -61, 94, -14, -23, -17, 14, 3, 44, -72, 3, -33, -5, -58, 54, -66, 36, + -47, -57, 101, -26, -25, 12, 4, 24, -17, -35, -21, -13, -39, 10, -33, 42, + -32, 11, 1, 46, -42, 13, -18, -14, -36, 73, 37, -17, 62, -57, -13, -54, + -57, -45, -22, 21, -88, 52, -53, -3, 74, -40, 17, 7, -29, -15, -17, 37, + 21, 19, -51, 84, -29, 78, -34, 24, 47, 4, -25, 41, -21, -51, 22, -2, + 9, -48, -46, 11, 35, -67, 51, 50, 32, 34, -43, 22, 32, -21, -44, 34, + -29, 49, 16, 40, 15, 47, -45, 8, -23, 34, -23, 35, 0, 76, -3, -43, + 85, -53, 66, 37, 11, 10, 18, 2, 46, -50, -13, -6, -17, 19, -69, 57, + -45, 5, -18, -48, 21, 44, 13, 47, -58, 61, 0, 54, -3, 64, -41, 35, + 2, -28, 24, -17, -38, 22, 41, -8, -6, -29, -72, 42, 24, -46, 40, -96, + 55, -39, -8, -49, 34, 26, -31, -17, 18, 31, -69, -6, 57, -48, -46, -25, + -17, 46, -11, 29, -26, -6, -38, 24, -34, -19, 14, -53, 33, -48, -40, -1, + 26, -19, 19, -71, 40, 8, -19, -4, 21, -33, 59, -20, 55, -96, 62, -34, + 60, 6, -12, -44, 75, -72, 58, -31, 55, -29, -16, -53, -15, -37, -43, 39, + -9, 1, 36, -11, 18, -54, 86, -59, 47, 7, 12, -33, 42, 16, -55, 70, + -1, -53, 64, -29, 18, 24, 15, -59, 61, 54, -36, -1, -13, 12, -69, 33, + -24, -58, -37, 48, -8, -80, 60, -73, 68, 19, 38, 52, 2, 45, 25, 30, + 53, 35, -66, -2, -1, 34, -30, 0, 19, -9, 28, 14, 30, 19, -13, -95, + 57, -29, 32, -46, 30, 25, -6, 28, 9, -49, -23, 55, -65, -20, 66, -42, + 87, 56, -10, -11, 28, 11, 48, -48, -25, 0, 28, -34, 37, -19, 7, -34, + -17, 34, 11, -78, 27, -79, 51, -64, -18, -9, -47, 7, -22, 47, 20, -32, + 26, -60, 82, -38, 53, -12, -18, -57, -65, -30, 18, 5, -13, 19, 69, -86, + 16, -26, -43, -40, -37, 38, -73, 57, -30, -13, -13, 17, -41, -37, -64, 97, + -85, 80, -41, -56, -31, 44, -52, 10, -45, 39, 42, 2, -41, 17, 3, 7, + 59, -2, 74, 6, 34, -35, -44, 37, -31, 23, -14, -38, -1, 3, -8, 25, + -23, 27, 23, 18, 2, -54, -28, 14, 50, -46, 85, -4, -4, -13, 15, 63, + -43, 49, -33, 58, 8, -38, 24, -11, -47, 55, 4, 31, -52, 77, -4, 31, + 1, -21, 17, -57, 0, 48, 26, -77, 70, 3, 46, 29, -57, 59, -4, -22, + -23, -14, 30, 12, 18, -38, 59, 30, -50, 8, -4, 15, -9, -12, 24, -55, + 38, -30, -14, 6, -67, 64, -14, -34, 8, -36, 36, 12, 69, 55, 25, -60, + -19, -17, 42, -29, -47, 78, -60, 21, -41, 70, -54, 84, -77, 61, -40, -16, + -8, 10, -20, 16, -48, 24, -24, -7, 47, -60, -62, 81, -72, 24, 43, -15, + -23, 74, 13, -15, 27, 40, 42, -44, 51, -63, -35, -17, -30, -44, -14, -37, + -40, -5, 19, 16, 0, -68, 67, -48, -20, 35, 24, -72, 3, 18, 6, 84, + 28, -11, 2, 11, -29, -33, 25, -46, -16, 59, -18, -6, 52, -11, 22, -22, + -38, -36, 26, -16, -3, 6, -35, 25, 26, -35, 52, -38, -18, 26, -56, 65, + 10, -23, -9, 41, 50, -40, 75, -42, 96, -28, 51, -1, 29, -1, -75, 50, + 15, 38, -53, 5, -40, 2, 41, 44, 39, 64, -60, -16, -7, -19, -79, 68, + 21, 9, 53, 3, 30, 24, 50, 19, -43, 46, -25, 56, -55, 3, 74, -77, + 20, -36, -1, 2, 33, -30, 11, 35, -36, -26, 3, -9, 25, 27, -35, 12, + -31, -17, -61, -44, -14, -32, 79, -59, 69, -35, -32, 82, 20, -41, -61, 71, + -29, 1, -35, 35, 21, 43, 12, -37, -8, -13, -22, 13, 12, 44, -39, -19, + -29, 1, 3, -50, -36, 79, -19, 8, -21, 11, -47, 32, 18, -70, -6, 13, + 22, -56, 69, -25, 45, -62, 0, 52, -8, -81, 50, -66, 65, -59, 24, 69, + -19, 31, 16, 0, 20, 6, -78, 23, 68, -56, 29, -2, -2, -9, 38, -24, + 7, -7, 56, -55, 72, -42, -16, 2, -15, 53, -5, -53, -65, -86, 47, -22, + 56, 38, -48, 39, -21, -14, 6, -12, 19, -34, -38, -51, 24, 18, -14, -42, + 27, -21, 4, 1, 5, -22, 33, 14, -23, 11, 65, -32, 28, 16, 40, -24, + 66, -91, 80, -65, 14, -25, -1, -44, 22, 19, 14, -15, -18, 62, -28, 40, + 49, -37, 60, -55, -54, 32, 30, 8, -54, 0, 33, 39, -43, 39, -58, -56, + -41, -31, -16, 35, -5, 7, 76, -59, 97, -65, 17, -65, 32, -26, 4, 10, + -44, 40, 24, -48, 15, -3, 14, 24, -40, 25, -37, 47, 5, -19, 57, 4, + -56, 82, -60, 21, -12, -64, 27, -26, -46, -24, -13, 43, -8, -30, 44, -5, + 53, -69, 55, -57, 75, -77, 45, -85, 53, -108, 82, -12, 9, 6, 55, -26, + -11, -34, -28, 60, -62, -25, -40, -12, -17, 44, -55, 42, 37, 43, -32, 74, + -49, -41, 46, 36, -58, 62, -56, -32, 56, 51, 27, -31, -4, -31, 76, -81, + 49, -49, 99, 39, -14, 19, -71, 54, -60, 3, 28, -78, -54, 65, 13, -39, + -49, 51, -26, 0, -16, -28, 15, -23, 2, -25, 10, -6, 13, -52, 47, -4, + -4, 42, -58, 46, 66, -70, 13, -20, -10, 70, -67, 2, 5, 20, 26, 29, + -3, -28, -44, 72, -56, 85, -42, 52, -41, 62, -54, 29, 37, -36, -35, -71, + 59, -77, 40, -2, -44, -42, 34, 11, -72, 61, -59, 34, 10, -59, 22, -21, + -29, 78, -70, 39, 15, -8, -16, 72, -90, 31, 9, 22, 57, 48, 18, 12, + -96, 28, -9, -52, 82, -68, 89, -96, 101, -68, 75, 9, -27, 2, 59, 29, + 20, -48, 12, -19, -2, 63, -45, -24, 57, -63, -43, 51, -54, -22, -23, -21, + -52, 59, -3, -35, 55, -15, -22, 56, 4, -52, -1, 33, 10, -38, 33, -60, + -57, 74, -47, 51, 48, 31, -75, 11, 62, -18, 8, -83, 46, 50, -39, 106, + 10, 48, -29, -29, 41, -35, -66, 13, -56, 35, -33, 61, -1, 1, 28, 37, + 13, -22, 19, 32, -51, 69, -19, -42, 11, 50, -42, -25, 25, -28, -22, -56, + 43, -65, 16, 3, 8, 14, 59, -21, 81, -45, 18, -30, 22, -34, -17, -48, + -22, 28, -1, 16, -27, 41, 5, -35, 17, 46, -34, 11, -32, 36, -13, 5, + 45, -58, 17, -18, 25, -33, 65, -10, -7, -32, 64, -97, 8, -59, 16, -73, + 73, 27, -10, -14, 61, -52, 44, 31, -60, -29, -47, -33, 48, 36, -80, 54, + 0, 14, -57, -46, 86, -59, 61, -20, 20, 16, -50, 59, 32, -43, 48, 51, + -1, -3, -4, -47, 47, -51, 57, 46, -47, 105, -84, 61, 8, -33, 29, -24, + 11, -2, 7, -43, 4, -45, 47, -88, 82, -107, 73, 8, -15, 21, -12, -56, + 2, 46, -2, -51, 55, -59, -33, -57, -13, -51, 72, 24, -53, 0, 68, 53, + -52, 59, -46, 43, 6, 28, 18, 29, -77, 77, -28, 1, 4, 26, 40, -24, + 48, -72, 20, 14, -19, 13, 20, 0, 24, 10, -44, 59, -64, -35, 11, -15, + 49, 24, -38, 31, 11, -38, -12, 66, -97, 59, -39, 32, 17, -22, -57, -26, + -5, 29, 16, 36, -53, -8, -6, 75, -78, 62, 33, -36, -4, 19, 35, -24, + 43, -37, -22, -1, -16, 27, -37, -17, -13, 41, -44, 40, -1, 2, -39, 55, + 60, -87, 68, -102, 17, -61, 76, 41, -72, 50, -62, 54, 0, -56, -6, -51, + -9, -33, -19, 15, 35, -52, 100, -42, 84, -49, 3, -25, -22, 15, -21, -62, + 31, -25, -20, -11, 10, -37, -34, 74, -53, 8, 24, 22, 7, 30, 7, 42, + 28, 54, -45, 38, -46, -6, -76, 62, -36, 0, -22, 12, 12, -9, 58, -6, + 35, 15, 16, -51, 85, -35, 65, -81, 76, -49, 14, 9, -41, -23, -31, 44, + 18, 6, 58, -87, 64, -3, 51, -67, 111, -72, 55, 24, 22, 38, -49, 11, + -2, 13, -14, 7, -35, 9, 5, -38, 71, -51, 55, 34, -46, -56, 68, -66, + 60, -7, -8, 53, -54, -46, 51, -56, -51, 45, 31, 15, -46, 70, -71, -79, + 21, 14, 7, 53, 51, -30, -38, 15, -26, -49, 31, -9, -4, -33, 21, -42, + 30, -6, 16, 33, 30, 15, 39, 58, -28, 36, 20, -67, 43, 10, -40, 52, + -41, 13, 6, -13, 22, 34, 40, 59, 49, -26, -18, -54, 13, 64, -39, -57, + 30, -61, -22, -4, 17, 38, -38, -9, 84, -88, 13, 5, 13, -6, -39, -21, + -13, 65, -7, -61, 28, 0, -31, -13, 26, -23, 21, -42, -9, 47, -1, -77, + 51, 2, -21, 13, -14, 31, -26, -16, 28, 20, -41, 22, -16, -15, 28, 37, + -17, -40, 29, 12, -15, 63, -40, -1, 4, 12, -3, 32, 32, -56, 39, 59, + -55, 4, 6, 26, -78, 85, -60, 66, -3, -35, -25, 50, 0, -52, 27, 39, + -69, 37, -9, 55, 6, 57, -60, -46, 42, 10, 62, -16, -44, 90, -22, 2, + -6, 58, 40, -53, 7, 44, -64, 15, -63, 16, -23, 46, 20, -48, 33, 9, + 9, -7, 36, -59, 72, 0, -12, 18, -27, -3, -37, 18, -48, -19, 0, -32, + -35, -38, 1, 42, -59, 53, -12, 0, -42, 39, -29, 46, 4, 25, -52, -32, + -84, 48, -20, -23, -47, -1, -8, -9, -4, -13, 13, -1, 66, -41, 65, -95, + 18, 7, -81, 90, -35, 9, -49, 45, -89, 21, -43, 9, -54, -21, 56, -21, + -29, -19, 25, -19, 54, -89, 46, -31, 11, -21, 43, -24, 48, 17, 4, -2, + -65, 15, -45, -12, 59, -29, 49, 23, 63, -67, 18, -48, 46, -16, 34, 73, + 32, -51, -14, -25, -32, -29, 52, 3, 12, 38, -22, -1, -41, 52, 23, -16, + -23, 38, -3, -37, -55, 0, -34, -53, 34, 12, -44, 17, -30, 70, -15, -63, + 85, -30, 15, -51, 37, -75, 49, -87, -1, 58, -11, 50, 12, -56, -28, 62, + 3, 71, 1, -36, -23, -5, 0, -15, -51, 51, 1, 10, -4, 21, 10, 22, + -10, -75, 6, 86, -46, 5, -61, 51, -32, 25, -3, 54, -16, -3, 45, 0, + 5, -51, 15, 43, -37, 56, -73, 52, -33, 26, -7, -21, -24, 61, -16, 26, + -41, 10, 18, -50, 25, 29, -38, -17, -21, 68, -73, 37, -51, 65, -35, -36, + -23, 41, 25, 9, 76, -65, 25, -49, 20, 46, 28, -65, 90, -52, 54, -80, + 56, -23, -5, -15, -59, -23, -2, 3, -60, 17, -67, 29, -23, -36, 11, 18, + -56, 15, -66, 88, -27, 26, -18, 1, 47, 35, -20, 38, -41, -21, 12, 7, + 23, -52, -28, 66, -42, 36, -59, -2, 75, -28, 0, 6, -6, 9, 17, 16, + -33, 64, -42, 47, 7, 38, -32, 3, 27, 22, -31, -27, -62, 61, 45, 27, + 55, -70, 44, -9, 34, -28, 57, -23, 9, 41, 47, -63, 31, -4, 11, 51, + -3, -29, 66, -62, -19, -62, 73, -74, 56, 38, -70, 66, 33, 37, -17, 3, + 81, -32, -36, 7, -6, 42, 52, -61, 35, 26, -60, -1, -37, 33, -40, 30, + 39, 15, 73, -78, 50, 7, -90, 34, -14, -44, 37, -15, -45, -7, -43, -63, + 10, -5, 16, 77, -64, 41, -88, 64, -25, -19, -32, 16, 34, -48, -51, 49, + -20, -38, 71, -26, 72, 71, -51, 38, -75, 13, 47, -23, -24, -44, 15, 25, + -67, 67, -4, 8, 9, 20, -54, 58, -10, -36, -28, -30, 6, 30, -41, 9, + 41, -71, -50, 49, 66, -46, 28, -43, 95, -66, -1, -27, -6, 5, -16, -7, + 12, 53, 19, -68, 0, 53, 12, 47, -46, -30, -16, -7, -13, -17, -20, -30, + 1, 27, -25, 1, 39, -11, 24, -1, 64, -82, 75, -45, 63, -37, 45, -16, + 15, 0, -25, 41, -6, -67, 55, 5, -43, -43, -32, 14, -2, 23, -43, 11, + 18, -10, 37, -38, -55, -5, 27, 38, -55, 40, -44, -14, -54, 60, -11, 31, + -34, 55, -57, 33, 48, 44, 25, -13, 64, -59, 15, -6, 61, -10, 36, -51, + 82, -26, 23, -83, 73, -51, 55, -14, -73, 42, -3, -48, 12, 48, -2, 15, + -32, 70, 6, -46, 44, -69, 71, 7, -28, 13, -21, -34, 39, 43, -24, 53, + -52, 18, 35, -65, -29, 32, -21, 5, 18, 4, 8, 2, 22, -60, -89, 38, + 55, 3, -60, 17, -39, 75, -100, 69, -36, -22, -36, 15, -53, 42, -60, -5, + 40, -42, -12, 44, 21, 61, -53, 11, -1, 17, 24, -35, -85, 49, -53, 66, + -80, -8, 19, 35, -32, -3, -3, -2, -1, 0, 8, 51, -50, 57, -59, 18, + -8, 1, -11, 23, -26, -3, 65, -53, 30, 37, -4, 48, -2, 39, 14, 52, + -31, -19, 2, -37, 36, 37, 20, -28, 7, -32, 76, -55, 50, 26, 59, -22, + -10, 9, -59, -43, -23, -57, -9, 31, 12, 23, -13, -22, 54, 6, -78, 46, + 7, -30, -23, -7, -36, 20, -9, -34, 52, -14, 41, 43, -28, 38, -19, 64, + -71, 30, 80, -65, -5, -15, -22, 9, -54, 60, 46, -52, -24, 35, 18, 20, + -62, 24, 30, -28, 35, -38, 0, -6, 38, -13, 4, 45, 9, 22, 10, 68, + -20, 29, -38, -10, -44, 8, -9, -7, -21, 16, -7, 6, -44, -8, -42, -9, + -48, 65, -56, 59, -75, 80, -47, 29, 48, 28, 41, 28, -25, -18, 63, -48, + 13, -41, -26, 25, 14, 26, 17, -24, 71, -46, -38, 86, -38, -16, -48, 9, + -49, -31, 92, -71, -45, -53, 29, 34, 6, 4, 39, -21, -45, 36, 3, -4, + -1, -10, 51, -21, -25, -1, 14, -52, 47, 34, -90, 34, 35, -71, -47, 53, + -10, -37, -47, 15, -27, 86, -17, -47, 28, -37, 24, 3, 25, -75, -18, 7, + 16, 36, -29, 52, 9, -38, 81, -51, -62, 20, 46, -86, 49, 31, 80, -42, + -18, -33, 95, -30, 89, -53, 55, -23, 4, 13, 0, 3, 39, -34, 74, -42, + -33, -27, 46, -14, -33, 3, 38, -5, 3, -3, 7, 31, 30, 19, -65, 28, + 0, 66, -81, 28, -69, 40, -56, 6, 42, -65, 40, -56, -6, -15, 2, -6, + 26, -49, -3, -65, 45, 21, -11, 10, -15, -42, 10, -83, 34, -29, 34, -20, + -36, 54, -51, 2, -11, -82, 71, -19, -11, 24, -13, 48, -90, 48, -88, 42, + 68, -27, 68, 52, -28, 38, 3, 17, -11, 5, -3, -1, -11, 3, 70, 26, + -46, 89, -80, 58, -60, 73, 19, -29, 24, -13, -60, 39, -32, -39, 38, -45, + 11, 13, -56, 38, 48, 6, -14, 41, 15, -50, -22, 64, 2, -33, 13, 31, + -50, 46, -9, -20, 42, -51, 12, -27, -10, 7, -50, -2, -11, -8, 7, -63, + -42, 17, 66, -59, 28, -51, 73, -57, 0, -18, -46, 63, -29, 36, 0, 24, + -14, 11, 35, -92, 95, -59, 8, -12, 16, -24, -63, -17, 50, 3, -12, -31, + 35, 23, 11, -45, 30, -54, -56, 57, -63, -13, 35, -34, 84, -56, 90, -58, + 83, -11, -56, 85, 3, 41, -16, -79, 50, -58, -33, 67, -37, -38, -60, 16, + 13, -19, 45, -48, -7, 9, 46, 14, -67, 25, 49, 18, -4, 77, -40, 56, + -45, 7, 34, 55, -37, -33, -54, 84, -37, 9, 53, -10, 1, 100, -54, -21, + -31, 19, -44, -2, -8, -19, -44, 36, 28, 30, -37, 27, 33, -23, -29, -35, + -47, -15, -56, -28, -31, -33, -42, 30, 30, -43, -11, -3, -46, -1, -27, -10, + 96, -18, 20, -4, -1, 28, -66, -2, 21, -7, -82, 24, -68, -3, 51, -44, + 5, 4, -15, 53, 33, 14, 20, -22, 25, 12, 5, 48, 8, 74, -62, 44, + -44, 92, -70, 55, 18, -34, -6, 21, 47, 11, -34, 47, 30, -43, -31, -16, + 57, 15, -32, 72, -4, 84, -55, -12, -14, 40, -63, -29, 89, -58, 70, -58, + -37, -32, -62, 75, -48, -14, 36, -91, 25, 30, 14, 22, -42, -17, -31, -14, + -30, 5, 72, -7, 20, -68, 0, 41, -90, 74, -87, 69, -69, 86, -57, -32, + 68, -50, -13, -33, -34, 50, -29, -34, 52, -1, -69, 40, 1, -24, -30, 1, + 32, -47, -30, -2, -13, 29, 41, -10, 8, 64, -20, 16, 51, -39, 33, 69, + -40, 47, -92, 60, 33, 17, -28, 31, 39, -13, 47, -18, 22, 9, 46, -73, + 20, 43, -79, 58, -26, -29, 22, -8, -26, 24, 64, -83, 40, -44, 87, -36, + 14, -52, 3, -15, 46, -5, 54, -28, 52, -38, 47, -29, -46, 30, -46, 33, + -16, 0, 41, -99, 58, -70, -4, 65, -10, 50, 42, -29, -23, 66, 29, 55, + -47, -20, -60, 57, -8, 55, -59, 16, 33, -44, 7, -33, 24, -67, 12, -45, + 34, 44, -62, 19, -51, 39, -25, 5, 14, -1, -27, -33, -6, -97, 78, 22, + -49, 93, -56, 14, 47, 9, -37, -20, -10, 5, 7, -3, -86, 61, 1, 49, + 43, 86, -19, 70, -14, 20, 37, -20, -49, 71, -28, -19, 84, -80, 95, -49, + -41, -34, 76, -64, 19, 55, -14, -14, 3, 26, 44, 21, 58, -11, 4, 37, + -30, 48, 39, -79, 23, -17, -48, 47, -36, -11, -30, -23, 2, -64, 7, 15, + -28, -18, 22, 40, -22, -20, -2, -25, -30, -58, 50, 16, -13, 6, 36, 42, + -51, -20, 52, -85, -30, -52, 68, -1, 14, 28, 46, -14, -64, -21, 40, -29, + 41, 28, -10, -78, 68, 15, -34, 73, 22, -83, 72, -58, 50, 40, -31, 0, + 19, -37, -23, -4, -55, 82, -9, 16, 45, -21, 49, 52, -77, 76, -50, 60, + 12, -2, 69, -10, 78, -72, 39, 26, -56, 12, 27, 51, -76, 81, -47, 15, + 34, -39, 72, -57, -18, -13, 20, -35, -37, 11, -29, -40, -13, -11, -39, -25, + 45, 25, 21, 30, -80, -6, -7, -56, 36, -41, 3, -30, -51, -18, -20, 48, + 13, -39, 64, 18, 54, 16, -45, -18, 5, -8, -25, 60, 21, 2, -62, 43, + -39, 94, -23, 4, -46, 22, 15, -55, 21, 53, -62, 72, -61, 45, -8, 48, + -62, 33, -3, 85, -78, 91, -72, 20, -48, 3, -47, 36, 30, -17, -19, -34, + 14, 25, 24, 30, -6, -47, 59, -52, -24, -35, 96, -55, 39, 53, -72, 71, + -52, 34, 47, -27, 14, 39, 37, 6, -15, -35, 43, -42, 50, 55, -22, -43, + 41, -91, 57, 28, -77, 27, 77, -39, 30, 36, -7, 7, 27, 18, -30, 19, + -21, -39, -43, 21, 24, 40, -18, -2, -26, 60, -31, 49, -25, 77, -41, -3, + 85, -56, -28, -36, 43, -84, 22, 1, 17, 35, -90, 10, -23, -16, -43, 27, + -2, -52, -20, 14, -32, 68, 23, -30, 27, 58, -51, 17, 49, -41, 38, 30, + 9, -57, 59, -52, -2, -15, 51, -19, 7, 57, -16, 27, -54, 35, -56, -20, + 52, -3, 14, 73, 5, 10, -33, -12, -27, -29, 36, -51, 76, 8, 49, -72, + 17, 44, -24, 72, -34, 0, -51, 30, -74, 66, -41, -3, -28, -9, 31, -9, + -4, 22, -33, 18, 24, -77, 74, -98, 27, 17, -51, -3, 35, -62, 44, -41, + -20, -31, -29, 5, -32, 17, -44, -18, 80, -63, 18, -42, 73, -41, 52, -68, + 54, 2, 17, 9, 71, -1, -17, 35, -10, 69, -31, 64, 18, 52, -39, -22, + -45, -6, 7, -44, 41, 0, 41, 27, 32, -8, -41, 32, 47, 9, 29, -3, + -49, 15, -58, -16, -88, 18, 50, 0, 20, -13, -5, -1, -62, 5, 40, -82, + 59, -85, 0, 2, 57, -23, -18, 6, -8, -47, -7, -29, 92, -82, 73, -67, + 36, -50, -10, -35, 42, -72, 73, -40, 16, -32, 37, -30, 10, -25, -3, 7, + -42, 49, -47, -11, -37, -7, 29, 17, 45, -44, -71, 33, -26, -54, 62, -1, + -43, -38, -61, 55, -20, -29, -46, 35, -48, 95, -94, 96, -76, 0, 6, 34, + -8, 28, 1, -45, 79, -29, -61, 27, -17, -28, -27, 19, -37, -47, -13, -11, + -35, 14, -11, -1, -45, -14, -33, 39, -31, -27, 8, -28, 70, -81, -29, -11, + 6, 26, 55, -8, 32, 45, -54, -18, 49, -62, 74, -36, -6, 57, -26, -8, + -33, 41, 40, -20, -52, -26, -38, -10, -20, 0, 58, -47, -10, 44, 17, -70, + 21, -7, 29, 16, -46, 21, 22, -30, -39, 31, -45, -18, -5, 0, 29, 27, + -70, 40, -47, -58, 41, -56, 45, -34, 58, -35, 22, 1, -45, -35, 11, 41, + 0, -26, -34, 37, -25, -31, 73, -69, 73, -71, 44, -34, 68, -28, 62, -35, + -45, 70, -27, 39, 14, 50, -61, 82, -59, 55, -46, 38, -84, 70, -30, 60, + -30, 38, -2, -27, 34, -32, 27, 10, -30, 56, 9, -33, -37, -1, -42, 14, + -52, -7, -10, -30, -28, -18, 41, 2, -28, -65, -25, -48, 21, -51, 29, 56, + -39, 6, -39, 59, -6, 13, -37, -53, 5, 65, -32, 77, -65, -9, -35, -13, + 45, -23, 58, -40, 105, -42, 29, -71, 32, -64, 31, -9, 27, 3, -9, 41, + 37, 20, 38, 2, -35, -62, 16, 39, 43, 18, 58, -48, -21, -43, 39, -44, + 42, -14, 23, 2, 50, -21, 45, 0, 32, -35, 66, -86, 76, -53, 60, 5, + 36, -4, -13, -27, 29, 58, -83, 11, 0, 40, 21, 50, -73, 29, -58, 38, + 33, 63, -17, 61, -27, -8, -3, 25, 12, -61, 65, -37, 17, 40, -65, -15, + -8, -9, -15, 64, -83, 34, 5, 26, -1, -29, 39, -32, 16, 84, -32, 48, + 38, 2, -20, 39, 15, 15, 2, -30, 83, -25, 29, -3, -85, 58, 49, 4, + -32, -2, -33, -34, 35, -41, 56, -62, 31, -8, -2, -21, -23, 0, 27, 53, + -28, -49, 21, 50, 68, 7, 0, 43, 30, -35, -41, 23, 52, -54, -61, 104, + -18, -7, -23, -10, 46, 22, -4, 17, 27, -60, 59, 5, 29, -4, 25, -68, + 87, -11, -41, 57, 45, -25, 6, 8, -42, 50, -18, -18, 94, -23, -11, -35, + 1, -9, 24, -44, 15, -21, 33, 31, -54, 31, 9, -35, 0, -34, -33, -16, + 49, -19, -48, 1, -27, 13, -17, -55, 37, -5, -16, 8, 25, 3, -56, -1, + -45, 33, 8, -25, 47, 21, -20, -8, -36, 19, -38, 25, 64, -8, 49, -14, + 29, 59, -68, 6, 27, -24, 18, -27, 33, 35, 37, 4, -11, 45, 23, 1, + 9, 48, -22, 4, -27, 0, 53, -1, -8, -8, -12, -45, 37, 36, 3, 3, + 33, 31, -55, 57, -97, 31, 28, 36, 1, 60, -28, -22, 39, -11, -48, 27, + -63, -10, -35, -21, 51, 50, 26, -57, -61, 44, -86, 48, 21, 14, -22, 30, + -29, 17, -43, 7, -15, -14, -19, -12, -49, 38, -41, 90, -62, 43, -2, -66, + 27, -5, 9, 44, -15, -50, 45, 0, -64, 60, -66, 57, 11, 48, 17, -70, + 39, -94, 22, -72, -40, 71, -19, -10, 9, 43, -57, 52, -51, 5, 4, 85, + -34, -35, 21, -19, -7, 20, -56, 24, -13, 22, -26, 64, -5, -36, -38, -25, + -42, 33, -20, 2, 9, -15, 50, -41, -26, -50, 44, -18, 68, -19, 3, -76, + 39, -37, 52, -65, 21, 19, -12, 62, -15, -26, 39, 43, -6, 46, -72, 28, + -2, 46, 3, -49, -44, -23, -21, -15, 12, -79, 72, -30, -17, 0, 38, -89, + 28, -15, -13, -10, -56, 72, -80, 26, -66, 59, -38, 0, -9, -4, -1, 9, + -70, 59, -18, -11, -48, 28, 4, -3, 17, 16, -31, 3, -54, 40, -14, 54, + 23, -37, 29, 36, 6, -31, -1, -21, 46, 22, -51, 54, -9, 13, 57, 13, + 12, -46, 61, -7, 51, 12, -12, 37, -10, -12, 34, -24, 18, 47, -33, 61, + 11, -30, 30, 43, -37, -45, 33, -24, 47, -30, 57, -35, -51, 8, 10, -18, + 34, -56, 79, 7, 45, -43, -3, -26, 7, 10, 13, -36, 29, -60, 0, -17, + 35, -38, -39, 61, -61, 31, -72, 87, -72, -32, -5, -19, 8, 3, -13, 13, + -80, -8, -5, -57, 50, -25, -28, -41, 6, -52, 61, -38, 8, -7, 47, -52, + 17, 50, -62, 59, -32, -34, 25, 12, -6, 59, -23, 43, -49, 70, -13, 13, + 0, 50, 39, -41, 34, -49, 45, -61, 43, 4, 3, -24, -22, -52, -17, 20, + 28, -27, -14, -30, 3, 36, -32, 21, 27, -75, 65, -44, -42, -16, 54, 14, + -19, 43, 42, 69, 55, -12, -67, 35, -33, -6, 39, -60, -22, 55, 13, -56, + -6, 73, -26, 63, 49, -80, 52, 9, -70, 12, 34, -50, -19, 40, 21, 19, + -1, -3, -2, 6, -46, 0, 34, -61, 69, 13, -18, -37, 33, -68, 14, 54, + 75, -82, 59, 53, -74, 54, 3, -53, 9, -18, -54, 54, -90, 39, -40, 32, + -2, -63, -36, 19, 7, 66, -12, 4, -11, 49, 34, -73, 55, 1, -36, 95, + 16, -34, 44, 29, -45, -34, 31, -4, 0, 47, -42, 19, 22, 10, -19, -37, + 51, -30, 34, -6, 9, -35, 47, 48, -84, 64, -28, -20, 32, -5, -40, -45, + 18, 44, 7, 1, -38, 16, -44, 37, -37, 14, 8, -35, -17, 16, -26, -49, + -71, 78, -35, -4, -59, -6, -21, -7, -7, 15, -38, 18, 16, -50, 30, -38, + -37, 46, -65, -40, 63, -9, -28, -7, 32, -20, 25, -28, -18, 73, -54, -34, + 30, -35, -7, -87, 35, 33, -64, 84, -72, 0, -23, 33, 38, -7, 0, -24, + -57, 31, -4, 35, 14, 6, 6, -40, 70, 61, 14, -45, 40, -20, -14, 10, + 49, 47, 16, 20, 7, 55, 14, 35, -16, -6, 44, -16, 43, -67, 0, 34, + -36, 19, 34, -49, 35, -49, -6, -7, -19, -51, 8, 12, 22, -89, 14, 11, + -59, -15, -44, 56, -63, 70, -9, 43, -43, 31, -25, -33, 34, 32, 65, -71, + 31, 9, 16, -32, 26, 32, 4, 2, 46, -46, 23, 2, -11, 21, -43, -10, + 30, -32, -54, -69, -51, 7, 43, 2, -21, -36, 0, 37, 45, -28, -59, 65, + -55, 12, -42, -49, -18, 10, 51, -30, 74, 11, 28, -35, -32, 41, -60, 53, + -10, -5, 63, -20, -27, 14, 44, -27, 30, -26, -17, 97, -72, 49, 23, -32, + -74, 46, -53, 4, 2, -25, -26, -14, 40, 32, 8, -72, 56, 9, 78, -79, + -20, 88, -6, 1, 35, -68, 44, -22, 43, -70, -4, 43, 9, -16, -6, -70, + -27, -4, 4, -24, 35, 8, 20, 14, 19, -39, 27, 2, -52, 47, -12, 10, + 35, -50, -5, 12, 0, -23, -27, -12, -2, 20, -31, 16, -29, 34, 12, 18, + -65, -9, -75, 78, -65, 95, -13, 29, -25, 2, -10, 61, -50, 88, -30, 56, + 49, -5, -20, 0, 66, -26, 41, -36, -3, -44, 48, -36, 20, -35, 51, 16, + 28, -58, 69, -10, 52, -47, 21, 3, -17, 34, -72, 19, 7, -41, 13, 12, + 47, 11, 46, 42, -74, 16, 71, -52, 37, -5, 38, -4, -73, 56, -21, 14, + 61, -47, -30, 58, -76, 17, -43, 51, -52, -41, -29, 42, -26, 52, -12, -2, + -11, -30, -36, 48, -47, -15, -73, 43, 67, -94, 17, -71, 34, 51, -17, 0, + 34, 9, 30, -22, -36, 54, 53, 24, -19, 7, -6, 62, -85, 93, -19, 19, + -11, 52, -6, -22, 49, -44, -32, 56, 5, -81, 95, -34, 38, -3, -57, 83, + -51, 61, -78, 37, 18, -53, -40, 63, -63, 21, 28, -20, 47, -26, 0, -57, + 52, -9, 30, 55, 9, 12, 15, -53, 57, 12, -26, 31, -39, 44, 13, 0, + 2, 39, -20, -21, 74, 6, -27, -24, -32, -66, 28, 47, -23, 23, 58, -31, + -26, 20, -86, 75, -38, 66, -51, 2, 19, 54, -23, -61, 57, -82, 40, -62, + 63, 43, -34, 50, -21, 39, -41, 53, -13, 14, -25, 58, -36, 10, -68, 39, + 56, -96, 40, 2, -53, 65, -9, 18, -13, 25, 20, -48, 51, -11, -13, 87, + -21, 48, -7, 60, -53, 40, 25, -92, 35, -39, 74, -69, 77, -101, 64, 26, + -58, 50, -37, -17, 16, 51, -62, 11, 13, 20, 23, 31, -19, -25, 15, 3, + 83, -11, 38, -10, -11, -43, -45, 18, 15, 0, -42, -5, -18, -68, 0, -12, + 5, -40, 28, -30, -50, 28, 6, 64, 13, 1, 0, 14, 40, -37, -9, 9, + 1, 0, -53, 24, -7, 3, 18, -56, 36, 9, 11, 65, 3, 47, -11, -17, + -26, -40, 11, -52, 91, -40, -42, 7, 14, 20, -50, 36, -53, 48, -22, -11, + 26, -6, -14, -30, 61, 38, -3, 6, -21, 76, -33, 40, 11, -58, -14, 50, + -73, 75, -31, -37, -5, -3, 52, -33, -48, 68, 52, -34, 54, -72, 45, -12, + 22, -35, -42, 12, 55, -19, -75, -26, 18, 17, -23, -52, 37, 0, -76, 65, + -31, 2, -36, 38, 17, 12, 58, -92, 15, 32, -33, -35, 35, -22, -34, -16, + 3, -51, 106, -68, 62, -29, 44, -47, 54, 9, -13, 6, -46, 41, -16, 21, + 37, -32, -44, -11, 36, 15, -8, 0, -11, 15, 30, -5, -34, -69, 71, 0, + -58, 59, -12, 51, -76, -26, -21, 52, 8, 37, -81, 53, -61, -1, -25, -27, + 58, -31, 13, 11, -13, -32, 19, -27, -45, -58, 23, -15, -17, 44, 13, 8, + 2, -27, 0, 0, 0, 8, 10, -17, -14, 2, 63, -50, 69, -48, 7, -7, + -27, 76, -14, -34, -24, 24, -28, -32, 45, 18, 11, -42, 15, -24, 41, -93, + 50, -96, 48, -84, 55, -65, -37, 52, 8, -11, -48, 31, 0, 41, -21, -14, + 18, 24, 7, 28, -40, 0, 48, -30, 5, -47, -3, -54, 43, -33, 3, -6, + -25, -62, 47, -27, -13, 80, 30, 46, -27, -12, 16, 40, 22, 66, -43, -14, + 26, 34, 27, 45, -26, 24, -27, -49, -50, 74, -74, 64, -97, 19, 0, -9, + 21, -44, 12, 29, -67, 7, 19, -3, 18, -32, -33, -30, -68, -14, 3, 22, + -40, 19, 3, 25, -91, 71, 0, -34, 16, 24, -38, 63, -40, 34, -55, 24, + 3, 26, -15, 36, -73, -21, -30, 52, -24, -28, 55, -57, 20, 9, -62, 44, + 11, -1, -37, 62, -31, 56, -51, -27, 35, -18, -77, 66, -61, 14, -8, 40, + -61, -34, 49, -25, -34, 24, 45, 19, -77, 83, -75, 88, -12, -39, 93, -53, + 43, -43, -32, -17, -42, -18, -18, 26, 31, -20, 9, 30, 18, -54, 49, 52, + -34, 9, -54, 26, -35, -30, -34, 19, -49, -5, 5, 0, 9, -31, 34, -49, + -9, 41, 4, 23, -102, 59, -57, 62, -32, 9, -1, -43, 83, -10, -20, -52, + 54, -49, -26, 55, -13, 48, -24, -39, 30, -24, 71, -51, 55, 0, 12, -1, + -32, 57, 23, -57, 63, -33, -17, -1, 51, 46, 24, 24, 3, -77, 71, -72, + 11, 26, -46, 59, -63, 33, -11, -25, -15, -45, 17, -59, -9, 44, -53, 46, + 58, -63, -39, 92, -31, 3, -2, -19, -26, -8, -48, 59, -9, -43, 24, 26, + -18, 74, -15, 48, -28, 36, 58, -17, 19, -22, 57, -18, 3, -32, 0, -6, + -31, 11, -41, 1, 42, -11, 50, -50, 55, 25, 55, -61, 44, 30, -64, 21, + 22, 36, -19, -44, 6, -82, 1, -71, 33, -41, 1, 27, -75, -9, 51, -6, + -55, -44, -63, 54, -33, 53, -18, 26, 42, -73, 18, -6, 63, 19, -49, 15, + -11, 21, 6, 23, 53, -54, 49, -55, 17, -10, 57, 4, 54, 52, -58, 56, + 28, -71, 53, -68, 89, -72, 31, 21, -40, -11, -12, -11, -23, 4, 21, 34, + -35, 11, -6, 43, 51, 20, -30, -44, 71, -81, 25, 22, 7, 15, 25, -37, + 16, -13, 33, -2, 9, 10, -31, 96, -70, 62, -20, 19, 24, -16, -14, 25, + 13, 37, -9, -3, -35, 28, -19, 29, 38, -44, 17, -29, -31, 19, -56, -45, + 41, 41, 58, 25, 21, -5, 20, 46, -89, 61, -40, -1, 29, 6, -50, 14, + -53, 83, -46, 15, 4, 43, 13, 23, -9, 9, -35, 23, 26, -52, 45, 45, + -43, 41, -41, 4, 47, 11, -16, -59, 41, 14, -2, 44, -82, 41, -31, 6, + 33, -12, 72, -54, -6, -16, 64, 17, 0, 54, -53, -16, 65, -82, 91, -78, + 39, -69, 22, 10, 74, -70, 55, 6, 0, -57, -41, 55, -72, 71, -42, 60, + -54, 8, -33, -28, 77, -64, -34, 44, 50, 2, -52, 85, -44, 33, 63, -59, + -63, 46, 53, -99, 48, -28, 49, -14, 58, -55, 54, -91, 78, -56, 40, 8, + 13, -59, 0, 1, -25, 13, -50, -63, 79, -41, -42, -3, -7, -40, 10, -21, + 70, -27, 18, -11, 37, -36, -45, 56, -63, -13, -25, 40, 6, -15, 68, -44, + 21, -41, 26, 17, 24, 49, 20, 45, -60, 105, -47, -30, 89, -1, -22, 33, + 26, 56, -38, -27, 42, -38, -22, -46, 54, 11, 64, 0, -68, 28, 13, 51, + -28, 5, 10, -44, -10, -6, 69, -12, 12, -52, 42, -45, 34, -49, -24, -33, + 73, -42, 52, 39, -3, -56, 74, -56, 31, 27, 46, -76, 71, -9, 72, -61, + -19, 14, -43, -2, -52, -37, 79, -10, -13, 27, 57, -82, 17, 7, -5, 28, + 42, -40, 23, -5, -22, -10, 31, -69, -1, 11, -23, -35, -17, -15, -33, -42, + 30, -41, 30, 53, -19, 16, -57, 59, -85, 60, 7, 43, 43, -32, 38, 39, + -3, -57, -22, -72, 67, -54, -6, -60, 41, -3, 7, -61, 57, -5, 5, 29, + 49, -76, 46, -30, 29, 9, -36, -51, 71, -23, -15, 19, -32, 35, -37, -37, + -45, 14, -45, 36, -4, -16, 68, -21, -47, -27, 6, -53, 72, -1, 26, 25, + -82, 18, -65, 75, -54, 27, -71, -48, 32, -96, 82, -68, 52, -56, -19, 57, + 7, -19, 9, -46, -62, 43, -4, -55, 59, 67, -39, 36, 51, -77, 30, 9, + -4, 38, 18, 48, -29, 46, 58, -93, 47, 3, -27, 3, 10, -35, -15, -20, + 84, -74, -2, 48, -31, 51, -76, 2, 41, -30, 9, 45, -16, -18, -7, 46, + -44, 1, 13, 15, -55, 30, 16, 61, -104, 52, -7, 49, -42, 71, 40, -19, + -26, 11, -49, 40, -37, -19, 16, -44, 14, 64, -7, 16, -55, -38, 30, -49, + 24, -1, 34, -14, 44, -52, -19, 61, -29, -78, 35, 15, -66, -12, 28, -63, + 27, -26, 45, 25, 22, -29, 72, -40, -32, 27, -79, -37, 37, 20, -23, -16, + -7, -53, 68, -30, 30, -13, -62, 21, -32, 49, -48, 45, -53, 46, -3, 36, + -46, -21, -1, -63, 22, 6, -25, 3, 45, -78, 34, 48, -56, -15, -63, 27, + -42, 73, -18, 22, -9, 28, -68, 29, -33, -23, -59, 8, 53, 6, -46, -61, + 17, 2, -45, -33, 56, -54, 48, 37, -8, 21, 28, 28, 36, 26, 50, 47, + 14, -33, -1, -105, 55, -12, 37, -69, 43, -7, -39, -14, -60, 3, 32, -100, + 47, 45, -26, 69, -36, -11, 50, 9, 23, -14, 1, 17, -47, -15, 5, -77, + 21, 66, -74, 49, -30, 16, 45, -15, -14, 3, -47, 26, 7, 22, 21, 42, + -2, 57, -2, 22, -68, -3, -45, 23, 33, 34, -14, -10, -49, 64, -70, 49, + 64, -41, 34, -29, 61, -30, 63, -16, 17, 64, -60, 29, -13, 48, -35, -41, + 47, 30, 4, 41, 1, -37, 35, 1, -33, -44, 1, -11, -43, 83, -75, 92, + -75, 61, -10, -67, 0, -13, -31, 83, -73, 17, 1, 16, -29, 40, 26, -59, + 3, 30, -81, 35, 12, 31, -34, 89, -87, 84, -37, -30, 28, -1, -45, 28, + -49, 8, 19, -10, 57, -72, -34, 42, 2, 47, 24, -62, 48, -14, -24, 2, + -52, 23, -29, 67, -23, 11, 40, -17, -9, -79, 9, 63, -24, 32, -6, 29, + -28, -28, -42, -30, -34, 26, -12, -51, 5, 80, -24, 11, 1, 16, 0, 17, + -57, 74, -60, -22, 23, -68, 22, 77, -47, -20, 85, -13, 22, -26, -7, -27, + 40, -27, 4, -16, -68, 59, -13, 18, 1, 25, -52, -49, -1, 11, -14, 12, + 33, -3, 60, -40, 17, 9, -54, 29, -16, 55, -81, 12, 0, -29, 87, -53, + 34, -32, -6, 40, -43, 56, -19, 37, 14, 3, 78, -50, -46, -39, 31, 12, + 32, -17, 66, -15, 25, 27, -78, 15, 24, -69, 8, -46, -5, -39, 5, -65, + -5, 27, 22, 48, 29, -36, 22, -1, 26, 5, 31, 46, 67, -43, -6, 20, + 32, -16, -29, 64, -46, -16, -19, 42, -57, 61, -55, 38, 51, -19, 41, 16, + -46, 13, 7, -66, 84, -76, 3, -3, 29, -8, 16, -17, 37, -63, -27, 0, + -22, -19, -20, 12, 24, 45, -9, 40, -10, -3, 6, 56, -56, -8, 2, -11, + -66, 36, 13, -71, 64, -51, 26, 9, 6, -21, 17, -15, 11, -15, 89, -75, + -65, -19, -3, 21, -17, -3, 55, -50, -31, 9, 71, -35, -33, -21, 34, -28, + -9, -34, -46, 88, -27, -33, 7, 8, -43, 61, -74, 40, 3, -73, 34, 43, + -27, 12, 29, 50, -98, 39, -41, -31, 8, -54, 15, 8, -48, 44, 4, -42, + 71, 28, -27, -49, 44, 40, 70, -55, 67, -78, -40, 50, -20, -35, 1, 2, + 67, -24, 47, -52, -25, 46, -28, 23, 50, 52, -63, -50, 30, 3, -17, 13, + 7, 55, 29, 24, 38, 50, -60, 49, 32, -58, 2, -50, 0, 23, 14, -21, + 0, 7, 17, 20, -45, 78, -57, -52, 58, -33, -18, -31, 38, 39, -47, 49, + 24, 46, -27, 39, 63, -28, 14, 11, -26, 23, 16, 47, 17, 16, -15, -34, + -53, 25, -35, 0, 20, 9, 41, -38, 3, 24, 24, 17, 25, 39, -43, 35, + 14, 23, -30, 29, -82, 57, -36, -5, 33, -74, 1, 30, 40, 52, -8, 3, + -11, -32, -15, -52, 36, 24, -1, -20, -20, 80, -73, 23, 25, -24, -30, -15, + 64, -47, 34, -95, 22, -62, 42, -8, -25, -30, -39, -65, -71, 51, 9, 16, + -38, 3, -28, -69, 87, 0, 7, 15, -15, 18, -22, -58, 58, -39, -4, 15, + 51, -65, 40, 0, -25, -17, 43, -7, 24, -61, 34, 50, -63, 58, 46, -3, + 51, 18, -28, 51, -98, 38, -46, -8, -5, 2, -8, -40, 20, 79, -80, 58, + -26, 67, -76, 45, -18, -35, 21, -21, 0, -6, -49, 36, -62, 76, -124, 109, + 44, -8, 15, 17, -6, -14, -20, 54, 4, 57, -85, 5, 76, -27, -8, -2, + 1, -12, 67, -27, 8, -11, 18, 13, 5, 42, -29, 19, 51, -17, 23, -42, + 29, -2, -9, -34, 74, 32, -48, 29, 25, -3, -26, 46, 28, 4, 37, 49, + -118, 46, -2, 24, -19, -21, -41, -13, -25, 22, 66, -50, -52, 55, 11, 29, + -41, -23, -34, 44, -22, 5, -27, -20, -65, 10, 50, 27, -54, 40, 14, -37, + 52, -93, 71, -69, -4, -31, -12, -14, 29, -28, 40, 67, -64, 29, 5, 17, + -24, -16, -38, -19, 40, -23, -10, 48, -45, 21, 4, 40, -81, 76, -44, -7, + -86, 61, -58, 20, -71, 38, -90, 37, -13, 21, -1, 17, -27, -16, 4, 18, + 24, 4, 64, -24, -25, -11, -47, 0, 27, -10, -36, -35, 31, -43, -15, 15, + -41, -3, 63, -71, 55, 40, -73, 30, 21, 30, 15, -29, -19, -47, 23, 31, + 17, 23, -56, 87, -90, -4, -11, 47, 46, -40, 75, -17, 7, 50, 28, 19, + -45, 32, 49, -5, 41, 63, -80, 28, -3, 27, 43, 43, 46, -6, 8, -5, + 17, -50, 57, 15, -23, -56, 3, -45, 32, -52, 33, 11, -57, 33, -55, 23, + -28, 49, 32, -46, 61, 3, 6, -9, 6, 47, -37, -17, 36, -60, -28, -44, + -46, 24, 6, -28, 45, 14, 19, 23, -34, -12, 66, -42, 63, -93, 76, -5, + -40, 14, 2, 41, -9, 18, -5, -34, -32, 60, 8, 45, -62, 21, 59, -74, + 4, -30, 15, 4, -11, 6, -40, -22, 54, -64, 72, 48, -72, 46, -13, 17, + -43, 55, -73, 57, -21, 30, 2, -20, -5, -4, -6, 26, -54, -13, 22, 27, + 2, 5, 1, -8, -52, 15, 27, 32, 9, -3, 59, -69, -15, -60, -17, -19, + 67, 11, -32, -22, 12, -56, 106, -66, 38, -14, 3, 37, 49, -17, 3, -11, + 58, 23, 40, -60, 19, 3, 69, -8, -14, 34, -47, 2, 37, -1, -89, 42, + -27, 20, -63, 44, -4, -26, 45, 18, -8, -24, 22, -67, 61, -74, 18, 43, + -72, 21, 48, 8, -37, 29, 17, -2, 32, -25, -26, -29, 69, -46, -12, -16, + 68, -44, 88, -74, 25, 10, 33, 1, 47, -29, -57, 26, -18, 63, -26, 4, + 7, 5, -97, 77, -63, 69, -26, 66, -60, 53, 3, -12, -60, 60, -50, 64, + -46, -46, 14, -3, 19, -10, 0, 53, -82, 6, 4, -7, 8, -74, 62, -79, + -6, 29, 28, -11, 68, -16, 20, -62, -67, 53, -90, -26, 26, -69, 33, 6, + -11, 15, -61, -25, -24, -35, 67, -45, 79, -61, 7, -23, -36, 10, -30, 19, + 12, 2, -16, 5, 15, 64, -13, 12, 33, -9, 46, -46, 56, -18, 51, -51, + -33, 25, -54, 11, -76, 49, 17, -43, -10, -29, 19, 30, -86, 97, -25, 69, + -40, 65, -63, 42, -21, 16, -23, -11, 9, -38, 40, -72, 39, -4, -27, -21, + 4, -10, 12, 1, 4, -23, 48, 27, 42, -26, -51, 50, -31, 29, -24, 22, + 0, 49, -1, -49, -3, 43, -8, 44, -62, 4, -61, -51, 73, -55, -5, -16, + 28, 5, 44, -60, -15, -13, 33, 17, 26, -88, 43, -79, 84, -49, 25, -84, + 69, -85, 7, 30, -28, -24, 13, -38, -15, 10, -17, -5, 65, 36, 13, -15, + 5, -49, 25, 19, 37, -18, -17, 15, 0, -47, 18, -68, 8, -31, -1, -24, + -49, -6, 44, -63, 39, -45, 4, -49, 40, 9, -26, 3, -52, 43, 51, 62, + -45, 12, 15, 16, 16, -30, -52, 51, -50, 67, -62, 31, 32, -36, 80, -82, + 88, 29, -51, 33, -33, 11, 43, -50, 26, -14, 14, 71, -67, 33, 68, -18, + -57, 28, -61, 65, -12, -44, 18, 45, -84, 58, -26, 73, -48, -42, 76, -48, + -3, -34, 83, -53, 31, -6, 14, 2, -41, -3, 12, -27, 93, -47, 65, -55, + 50, 19, 44, -25, -45, 66, -47, -40, 26, 31, -61, 50, 43, 34, 30, -22, + -16, 8, 8, -50, 8, -39, 19, 36, 1, 31, 72, -4, -42, 33, 0, -62, + -6, 14, 7, 7, -6, 20, -11, -49, -38, -13, 65, -55, 2, 30, -21, 5, + 15, -81, 53, -34, -8, -30, 19, 12, -67, 36, -59, 28, -32, 43, -22, 46, + -15, 69, -56, 87, 11, 13, -73, 78, -79, 108, -90, 24, 29, -15, -6, -13, + 27, -72, 15, 17, -4, -8, 4, 35, -50, 76, -47, 35, 22, 33, 7, -10, + 20, 4, -27, -21, -23, 1, -56, -12, -20, -43, 90, -80, 34, -46, 42, -33, + 0, -39, -40, 67, 2, 4, -12, 29, 12, 49, 25, 12, -21, 49, 19, -49, + -12, 26, -52, 44, -35, 37, -93, 8, 16, 62, 26, 19, -45, -4, 26, 26, + -3, 48, -7, -32, 48, -53, 5, -34, 64, -79, 47, -26, -60, -32, -20, 36, + -59, 66, -58, -2, 0, -56, 73, -40, -17, 60, 12, 30, -28, 38, -48, 97, + -40, 41, -36, 79, -16, 58, -41, 13, 3, -5, 30, 15, 62, -51, -16, -38, + -7, 27, -9, -5, 41, 3, 14, 48, -31, -5, 1, -33, 22, -25, -36, -5, + -50, 16, -63, 41, -29, -10, -5, -21, -5, -17, 60, -86, 38, -12, -61, 21, + 44, -3, -44, -8, 21, 25, -22, -32, -10, 41, -13, -38, -6, 48, -57, 13, + -6, 15, -51, 38, 33, 14, -36, -43, 89, -69, 3, 29, -21, -3, -40, -40, + 53, -64, 20, 41, -55, -39, 77, -43, 65, -31, 8, -35, -46, 19, 2, 17, + -64, 57, -4, -15, 41, 17, -38, 0, -8, -5, -66, 40, 52, -66, 72, 16, + 1, 22, 1, -2, 49, -22, 28, 54, 9, 61, -80, 98, -19, 26, -22, 17, + -10, 64, 26, -45, 22, -43, 26, 24, 8, 33, 25, 0, -38, 51, -55, 28, + -41, 17, -51, -4, -89, 83, -52, 31, 36, -71, 67, -35, 44, -15, -45, 36, + -42, 70, -15, 44, -74, 17, -13, -6, 9, 8, -43, 34, -60, -27, -11, -20, + 41, -11, -1, 63, -27, 37, 76, -38, 65, -3, -22, 8, 48, -7, -15, 10, + -3, 104, -47, -8, -29, 50, -88, 90, -63, -56, 47, -36, -30, 62, -42, 81, + -20, 35, 7, 13, 1, -19, 60, 3, -43, -32, -17, -29, 62, -11, 15, -44, + -3, -6, 3, 67, -46, 49, 64, -46, 19, 30, -58, 45, 31, 5, 59, -57, + 32, -4, 57, -29, -1, 50, -1, -1, 0, -56, 42, -79, 43, -16, 18, -103, + 82, -41, -13, -74, 69, -85, 22, 24, 15, 13, -25, -33, -14, 1, 19, -9, + -27, 1, -15, -10, -36, -53, 48, -38, -33, 37, -15, 11, 27, 38, 4, 46, + -61, 57, 37, 4, 27, -4, 2, 37, -15, -56, 39, -3, 5, -39, 54, -19, + -11, 31, 29, -14, 46, -41, 69, -42, 4, -42, 53, -36, 0, -4, 65, -30, + 20, 46, -25, 21, -67, 34, -36, 26, -4, 62, -46, -10, -38, 38, 31, 20, + 9, 4, -23, -7, 89, -54, 42, -46, 7, 2, -45, 71, -27, -36, -34, 25, + 57, -26, -23, -25, -34, -24, 18, 50, -55, 57, -32, 11, -48, 61, -110, 65, + -43, -2, 0, -45, 7, -25, -12, -60, 44, -2, -12, -77, 18, -55, 54, -15, + 17, -69, 5, 41, 10, 0, -9, 12, -85, 59, -48, 18, 9, -57, -20, 14, + -4, 10, 68, -59, 125, -74, -20, 33, -3, -15, 33, -60, 4, 5, 40, -57, + 50, -67, 58, -80, 44, -12, 36, 22, -18, -42, -34, 68, -39, 23, 15, 17, + -36, -11, 47, -48, 38, -37, -46, -37, -22, 58, -51, 80, -66, 46, -43, -12, + -9, -47, -32, 23, 38, -51, 42, -29, -7, 54, -63, 14, -45, 20, -71, 25, + -66, 18, 1, -16, 12, 30, 2, -33, 23, 50, -13, -31, 27, 2, -46, 49, + -12, -12, 14, -35, 20, -72, -3, 9, 12, -39, 51, 42, -92, 50, -29, -19, + 41, -52, 17, 17, -52, -39, 16, 30, -7, -28, 30, 38, 1, -51, 37, 83, + -42, -10, -15, 79, -50, 39, -10, -69, -26, -13, 76, -20, 25, -20, 18, -45, + 64, -52, 41, 4, 12, 32, -16, 19, 23, -23, -5, 46, -55, -59, 65, -1, + 18, -44, -16, -6, 61, -83, 62, -66, 34, 40, -23, 85, -73, 102, -100, 61, + -61, 55, -40, 50, -49, 48, -43, 72, -86, 65, 16, 0, -39, 71, -76, 45, + -79, 39, -31, -31, 51, 41, -45, -5, 13, 34, -19, 42, 24, -8, -51, 33, + -64, 21, 4, -8, -46, 69, -31, 12, 0, 52, -13, -8, 17, 58, -29, 49, + -43, -10, 30, 85, -47, 95, -58, 28, 10, -13, -8, -39, 33, -19, 49, -2, + -23, -33, 75, -47, 76, -62, 31, 34, -63, -9, -2, 49, 42, -6, 6, -67, + 76, -67, 82, -80, -1, -43, 47, 15, 37, -44, -29, -30, 28, 58, 26, 34, + -44, 75, -72, 28, -84, 12, 64, -94, 41, -46, 32, -1, 67, -45, 9, 29, + -6, -8, 26, 17, 5, 0, -2, -52, 51, 34, 19, -16, 15, 13, -55, 45, + -5, 4, -55, 41, -47, -14, 50, 53, -25, -29, -11, -57, 24, -1, 62, -36, + -29, 37, 29, 58, -36, 10, 4, -8, -59, 51, -11, 43, 8, 45, 13, -15, + 9, 21, 16, -40, 31, -41, -5, -27, 29, -31, -1, -5, -23, -29, 18, -13, + 63, -46, 25, -36, 27, 64, -49, 1, 18, 38, -32, -24, 40, 12, 11, -44, + 42, -14, 21, -23, 53, 33, 11, -19, -26, -50, 47, -28, -4, 28, -63, -47, + 52, -4, 11, -16, -7, 27, 42, 73, 5, -14, -27, 8, -68, 46, -34, 75, + -100, 85, -48, 49, 5, -56, -27, 50, -49, 2, -3, -11, 52, 9, -92, 45, + -69, 26, 53, -42, -44, 69, -79, 85, -77, 31, -45, -39, -26, -41, 56, -51, + 11, -16, -38, -32, -23, 2, -44, 9, 45, -8, -47, 47, -37, -9, 0, -36, + 79, -37, 46, -4, -60, -10, 68, -35, -31, -62, -23, -32, -7, -54, 16, 44, + -46, 49, -61, 43, -19, -33, -26, -62, 48, -69, 25, 49, -18, -48, -18, -5, + -19, 23, -22, -47, -11, -8, -26, -2, 2, -5, 26, 23, -7, -11, 2, 50, + -64, 50, -7, -22, 41, -1, -14, -1, 55, -55, 53, -34, -70, 36, -5, -19, + -26, 78, -47, 40, -19, 64, -79, 51, -61, 59, 8, 75, -58, -48, 21, -30, + -23, -46, 37, -75, 61, 15, -6, 7, 66, -52, 51, -45, -36, 10, -31, 23, + -33, 45, -68, 9, 11, -2, 2, 62, -25, -56, 29, -14, 5, 2, 47, -32, + 18, -7, 22, 7, 18, 12, -49, -15, 18, 72, -24, 58, -57, 43, -56, 21, + 18, 8, -49, -15, -35, 50, -56, 10, 26, 10, 48, -71, -22, -7, 23, -32, + 0, -13, 10, 12, -3, 58, -62, 23, 19, 21, -18, 73, -12, 60, 8, -42, + -30, 31, -41, 35, -41, -44, 29, 55, -97, 36, -48, 21, -31, 50, -28, 36, + -31, -5, -50, 86, -90, -16, -11, 43, 54, 27, 14, -20, 21, -2, 23, 97, + -105, 35, -8, -4, -38, -25, -20, -73, 38, -40, 28, -49, 76, 8, 15, -55, + 71, -14, -24, -74, 69, -14, 18, 25, -17, 33, -40, 71, -104, 53, 89, -63, + 64, -10, -22, 26, 1, -11, 62, -60, 52, -53, 31, 30, 28, 39, 4, 26, + 32, -54, 89, 6, 27, 14, 32, -52, -21, 64, -49, 6, 52, -50, 60, -20, + 0, -31, -12, -30, 28, 46, -15, -55, 58, 33, 43, 19, 42, 43, 19, -23, + 45, 15, -21, 12, -12, 45, 19, 71, -19, 27, -25, -69, 67, -22, 48, 7, + -21, 33, 7, 28, 17, -40, 67, 0, -83, 48, -46, 54, 27, -47, -2, -15, + 14, 2, -38, -7, -21, 46, -74, 59, -32, 34, -42, 21, 34, 2, 8, 36, + -29, -43, 0, 41, -43, 13, 11, -11, -1, 33, -34, -65, 48, 28, -16, 10, + 0, 45, 29, 50, -49, 13, 37, -62, -12, 45, -17, -44, 68, -73, 87, -63, + 14, -8, 39, 37, -60, -5, -61, -1, -30, 26, -7, 40, -57, -26, -5, 7, + 47, -41, 22, 2, -26, 1, 7, 25, -7, -79, 27, 45, -51, 4, 45, 7, + -29, 57, -7, 3, -13, -23, 51, -48, 45, -42, -59, 94, -32, 34, 6, 6, + -38, -34, 38, -45, 42, -58, 84, -60, -1, 15, -83, 1, -20, -56, -6, 7, + 61, -25, 71, -83, 84, 34, -21, 1, 48, -29, 31, -26, -32, -56, 44, -52, + 14, -16, 11, -47, 71, -6, -17, -39, -45, -35, 29, -24, 3, -38, -44, -32, + 39, 67, -44, 26, 31, 50, -25, 14, 51, -14, 17, -57, 41, -35, 8, -12, + -11, 37, 9, 27, -55, 52, 20, 4, -37, 67, -51, 10, 42, -56, -58, 25, + -70, 30, -40, 25, 65, -41, -56, 89, -23, 55, -57, -16, 47, -66, 10, 12, + -17, 22, -66, 19, -61, 62, -85, 48, 22, -64, 12, 16, -42, 21, -50, -5, + 52, -29, -35, 59, -25, -64, 19, 52, -15, 23, -54, 41, -33, -40, -7, 12, + -32, 2, -38, 55, -5, -20, -3, -42, -26, 19, 43, 32, -14, -41, -6, -26, + -18, -13, -56, 30, 15, -65, 26, -17, 65, 38, -44, -24, -36, 15, 39, -20, + 35, 45, -6, 14, -44, 31, -2, -7, 16, -21, 20, -56, -2, 18, -43, 19, + 30, -4, -2, -7, 28, 1, -32, 25, -30, -39, 58, -32, 31, -31, 34, 10, + 12, -35, -78, -6, 51, -2, -43, 46, -60, 18, 10, 35, -68, 57, -4, -33, + 26, -41, 52, -75, 26, 59, 17, 64, -53, 8, -44, 49, 80, -33, 31, -6, + -44, 46, -31, 11, 8, -12, 37, -22, -29, 71, -42, 6, -1, 7, -4, -35, + -23, 26, -56, 32, -22, 27, -11, 36, -58, 43, 21, -84, 64, -87, 49, -43, + 66, 38, 38, -17, -26, 16, -20, -3, -42, 45, 58, 29, 13, 37, -58, 63, + -43, -1, -9, 42, -49, -51, -25, -41, 24, 24, -28, 41, 37, 83, -62, 51, + 26, 25, 61, -35, 9, 15, 27, 68, -5, 28, 12, 66, -41, 60, 34, 13, + -48, -78, 71, -67, -20, -47, 23, -55, 23, -13, 62, -4, 12, -51, -9, -11, + 55, -62, 25, -12, 56, -56, -1, -62, 60, -60, -54, 43, 24, 48, -39, 49, + 62, -27, -9, -16, -37, 3, 11, -90, 61, -77, 46, 5, -73, 56, 28, -67, + -32, -6, 17, 26, 3, 11, 56, -60, 40, 38, -47, 52, 15, 6, 66, -15, + -4, 52, -3, 51, -52, 67, 66, -95, 57, -26, 13, -65, 3, 9, -37, 2, + 35, 9, -5, -26, 15, -44, 41, -26, 45, 13, -82, 34, -47, 91, -80, 84, + 47, 18, 67, -72, 16, 67, -41, 3, -68, 27, -5, 54, -64, 36, -57, 40, + -64, 11, -62, 25, 15, -16, 12, 15, -35, 73, -48, 18, 53, -69, 2, 8, + 41, -32, 58, -10, -29, -15, -30, 15, 31, 9, -37, 69, -57, 16, 0, -19, + -49, 25, 58, 48, -66, 22, -16, 8, 15, 1, -43, 23, 22, 21, -27, 69, + -33, 29, -26, 28, 3, -35, -52, -23, 59, 11, 27, -63, -43, -34, 17, -29, + 53, -25, -15, -2, -30, 28, 26, 25, -1, -44, 7, -77, 42, 6, 24, -17, + -1, -39, 33, 45, -18, 56, -39, -13, 1, 49, -45, 31, 17, 65, -92, 76, + -63, -22, -57, -30, 30, 3, 27, 35, 50, -55, -87, 73, -92, 80, -20, -4, + -42, -27, -3, 8, -41, 75, 57, -9, 20, -16, -18, 36, -56, -24, 20, -51, + -20, -15, -50, -16, 7, -60, -48, -38, -27, -24, -24, -5, -44, -7, 2, -54, + 33, 82, -5, 14, 52, 18, -26, 2, 26, -22, -86, 28, 21, -1, 86, -94, + 59, -34, 1, -33, -20, 12, 6, 17, -7, 47, 41, 11, -53, -39, 43, 1, + -29, 10, 16, -43, 63, -23, -7, 23, 27, 1, -1, -23, 56, -50, -9, 63, + 14, 53, -78, 63, -74, 34, -57, 60, -64, 57, -42, -15, -26, -44, -49, 23, + 0, -32, 10, -40, 38, -69, -73, 29, 4, -20, 51, 0, 69, 0, 3, 19, + -52, 18, -19, 17, -43, 65, -35, -6, 30, -7, 73, -73, 9, 9, 36, -57, + -50, -17, -37, 60, -49, -17, -34, 55, 69, -33, -14, 33, 7, 19, -43, 67, + -61, 53, 5, -3, 12, 12, 43, -11, -26, 20, -42, 46, -21, 73, 11, -3, + -40, -11, -8, 8, 30, 27, -8, 2, 32, 10, -28, 0, -42, 30, -2, 11, + 4, 74, -81, -33, 18, 39, -26, 25, -8, 38, 12, -60, 43, -49, 37, -100, + 39, -49, 15, -35, 25, -2, 37, 29, -15, -28, -36, 38, 35, 20, -52, 8, + 37, -36, 33, -5, -29, -12, -44, 30, -77, 33, 37, 36, 42, -60, 38, 20, + 46, -15, 47, -16, -38, -21, 77, -28, 24, -88, 76, -61, 41, -88, 57, -29, + -10, 1, 66, -5, 12, 56, -86, 2, -28, 60, 7, 5, -9, -11, -66, 65, + 20, 58, -54, 62, -5, -39, -79, 78, -32, -25, 9, -30, -2, -22, 11, 0, + 49, -11, 92, -9, -24, 74, 54, 19, 30, -4, 17, -72, 71, -49, 55, 34, + -28, -73, -12, 6, -54, 13, 3, 16, -16, 49, 21, 44, -47, -1, -26, 52, + 14, 2, -46, 73, -20, -28, 57, -62, 61, -64, -39, 8, -18, 80, -92, 34, + -54, 35, -26, -5, 42, -27, 43, -6, -13, -2, 4, 11, 28, 45, -35, 5, + -56, 11, 20, -13, 42, -42, 24, -21, -6, -8, 37, 15, 4, 83, -60, 5, + -12, -62, 63, -33, 16, 9, 99, -37, -3, -9, 37, -61, -17, -37, 18, -22, + 87, -50, 67, -6, -7, -1, -50, 45, -53, -38, -6, 10, 39, -1, -34, -1, + 72, -64, 62, -61, 44, 29, 33, -74, -49, 0, -30, 2, 7, 21, 42, -30, + 53, 15, -35, 30, -24, -22, -21, -7, -33, 12, 69, -54, -25, -64, -2, 39, + -32, 3, -18, -19, -41, 47, -41, 24, -36, -29, 45, 0, 41, 5, -71, 44, + -29, -33, 15, 32, -9, -9, 12, 26, -55, -12, 26, -30, 36, -33, 46, 16, + 47, -40, 99, -94, 41, 44, -7, -37, -3, -26, 69, -63, 40, 12, 83, -43, + -38, 0, 45, -20, 52, 0, -58, 28, 40, 33, -104, 15, -59, 71, -27, -63, + -58, 2, -48, -17, -3, 44, -56, -19, 13, 33, -13, 28, 0, 9, 46, 9, + 31, 30, -46, 21, -70, -4, -12, 91, -39, -16, -5, 1, -49, 77, 13, -7, + -51, 32, -13, -24, -23, 34, 62, -65, 42, -27, 56, -36, 46, -12, 40, 8, + -36, -44, -56, -8, 13, -37, -26, 11, -1, 50, -82, 92, -4, 20, -19, -48, + -3, 75, -6, 8, 43, -41, 26, -56, 31, -24, -32, 6, -18, 23, -29, 2, + -19, -28, 25, -6, 27, -46, 8, 11, -60, 57, -27, 65, -54, 18, 41, -28, + 13, -21, -24, -33, -4, 27, -32, 3, -21, 52, -64, 23, -66, -35, 63, -13, + 3, 33, -19, -23, 42, 16, -27, 47, -63, 42, 7, -20, -10, -3, 39, 49, + 6, 83, -45, 9, 13, 12, -58, -29, 0, -29, 5, -4, 18, -2, 78, -50, + -24, -17, -51, 46, 27, -8, -9, 65, 2, 21, -15, 15, 39, -68, 37, 43, + -90, 80, -43, 69, -42, 0, -66, 74, 37, 42, -3, -11, -32, -24, -10, -24, + -10, 5, -44, 0, -42, 53, -30, -6, 56, -25, -90, 75, 0, 50, -4, -17, + -11, 51, 5, -26, 13, 13, -35, -5, -19, -8, 1, -12, -2, 27, -11, 62, + -32, 49, -51, -14, 2, -12, 35, -66, 25, -20, 77, -42, -1, 5, -1, 14, + -11, -21, -74, 68, 22, -81, 4, -22, 10, 27, -14, -52, 30, -47, -57, 57, + 15, -37, -49, 49, -60, 28, 45, 32, -58, 37, 48, 9, 0, -6, -15, 82, + 42, -21, 70, -15, 13, -63, 0, 51, -3, 47, -57, -35, 55, -64, -31, 14, + -37, -18, -18, 0, 73, -28, -10, -55, 0, -12, 19, -2, 72, -65, -4, -3, + 8, -56, 50, 56, -16, -25, 33, -55, -27, 34, -18, -37, 54, 1, 23, -79, + 61, 56, -12, 65, -80, 81, -56, -3, -39, 14, 49, -105, 51, -47, 37, -4, + 18, 11, -54, 60, -102, 53, 34, -32, 39, -14, 5, 59, -36, -56, 66, -83, + 75, -40, 44, 27, -66, 83, -50, -16, 42, -62, 12, -5, -2, -51, 17, 48, + 22, 38, 12, 22, 22, 27, -38, 70, -62, 16, 29, -28, 65, 9, -54, -8, + 55, -71, 23, -42, -47, 32, -17, 21, 45, -63, 3, -22, 9, -41, -3, -72, + 77, -86, -44, 38, 27, -56, 22, 20, 59, -49, 56, -25, 20, -37, -50, 7, + -40, 39, 7, -26, -41, 45, 59, -59, -50, -8, 4, -13, -40, 33, -19, -21, + 44, -4, -40, -22, 26, 47, -29, 26, -59, -28, -28, 38, -10, 39, -46, 49, + -56, 21, 42, -5, 3, 16, -13, -18, 14, 22, 73, -61, -2, -17, -25, 40, + 8, -4, -16, 21, -3, 26, -20, 20, 44, 30, -9, -18, -31, 5, 14, -31, + -39, 8, 21, 36, -34, -14, -43, 82, -2, 49, -82, 7, -27, 23, -64, 61, + -55, 39, 0, 12, -83, 89, -4, -23, 7, 20, -13, 72, -10, -13, -21, -9, + 9, 72, -42, 23, 40, -61, -7, 12, -68, 8, 4, -29, -32, 62, -52, -29, + -30, 25, -71, 38, 20, 32, 35, -26, 21, -37, -13, 80, -35, 29, 34, -42, + 3, 15, 66, -61, 19, -37, 58, 46, -40, 0, 35, -56, 0, -64, 34, 42, + -9, 20, -13, -64, -18, 2, 23, 61, -8, 24, 47, -46, -5, -23, -54, 36, + 29, -96, 51, -10, 9, 14, 0, 29, -4, -13, 32, 58, -18, -3, 36, -67, + -4, 4, -28, 7, 33, 16, -22, -15, 46, -43, 0, -61, 38, 4, 61, 7, + -24, 41, -101, 52, -3, 2, 14, 58, 36, -10, 57, -51, 53, 27, -18, -22, + -32, -19, 7, 30, -31, -41, -17, -44, 7, 23, -16, -47, -40, -19, 22, 44, + -68, 18, 24, 64, -10, -15, 51, -70, 23, 5, -35, 44, -34, 46, -42, 51, + -74, 76, 6, 32, -65, 68, 33, 2, -7, -35, 26, 18, 13, -15, 45, 37, + 62, -41, 38, -54, 36, -40, -65, -5, 73, -10, -5, -26, 67, -73, 61, -45, + -19, 0, 46, 7, -28, 29, -65, 72, -65, 70, -15, 40, -20, -40, 46, -55, + 54, -7, -11, -11, 54, -57, 57, 22, 6, -26, -53, 24, 9, -57, 49, 6, + -28, 43, -49, 35, -27, -9, 33, 0, -14, -37, 5, 28, 18, -71, 77, -30, + 59, -38, 26, -32, 2, 18, -22, -73, 26, -49, 62, -27, -17, 52, -41, 54, + -11, -26, 21, 35, 55, -32, 28, -16, 28, 68, -86, 24, -37, 61, 5, 54, + -52, -14, -14, -20, 29, 2, 20, 0, 51, -23, 40, -26, -47, 55, -43, 61, + -27, 48, 10, -45, -16, -64, 29, -48, -51, 40, -7, -59, 38, -17, -35, 48, + -3, -12, -29, 12, 19, 72, -90, 34, -24, 47, 8, 8, 41, 50, -46, -23, + 10, 22, -3, 71, 65, -44, -44, -56, 35, -22, -9, -24, 38, -20, 95, -60, + 74, -32, 14, 14, -62, 53, -47, -16, 23, -37, -38, 3, -43, 12, 40, 28, + -24, 0, 62, -19, -17, 14, -12, -1, -32, 36, -1, 73, -50, 25, -61, -49, + 31, 21, 32, 0, -1, -36, -15, -62, -11, -30, 12, -31, 18, -17, -26, 9, + -45, 73, -31, -18, -8, 56, 30, 30, 22, -24, 32, 42, 33, 44, -78, 4, + 18, 53, -37, -30, -58, 16, -30, -32, 29, 41, 1, 33, -5, 43, -47, 18, + 10, 18, -47, -24, 39, -75, -27, 7, -4, 60, -49, -29, 34, 0, -71, -6, + -41, 0, 33, -27, 53, 27, 17, 43, 8, -58, 50, -31, 28, 26, 21, -4, + 34, -58, 41, -30, -58, 40, 3, -7, 3, 9, 13, -16, -38, 46, 4, 15, + -52, 9, -41, 6, -29, 57, -30, -58, 66, -82, 28, 18, 43, 5, 5, 5, + 16, -57, 43, -20, 48, -10, -56, 28, -61, 97, -55, 0, 33, 54, -55, -3, + -5, -38, 10, 30, 26, -7, 42, 38, 13, -8, 28, -15, 64, -35, -43, 17, + -32, 67, -68, -11, -50, 8, -43, 18, -38, -67, 73, -49, -53, 47, -39, 20, + -50, 82, -54, 83, 5, -74, 46, -58, -12, -19, 24, -8, 49, 53, -64, -24, + 30, -59, 13, 70, -22, 70, -29, 28, 93, -48, 38, 73, -61, -20, 23, -49, + 44, -6, -20, -26, 19, -77, 66, -54, 47, -45, -7, -6, -23, -2, 61, -63, + 28, 6, -26, -71, -21, 3, 65, -22, 10, 3, -12, 41, -31, 37, -68, -13, + -31, -32, 0, 54, -1, -56, 60, 39, -8, 36, -30, 61, -38, 3, -73, 57, + 32, -28, -39, -42, 31, 22, -11, 16, -40, 77, -44, -3, 20, -31, 56, 52, + -44, -47, 10, 15, -11, 23, -17, 73, -80, 54, 27, -50, 45, 52, -60, 49, + -14, -57, 30, 14, 15, -30, -40, 42, -56, 27, -56, 27, -38, 31, -12, 65, + -52, -16, 11, 7, 51, 62, -27, 67, 13, -26, -57, 26, -47, -14, 18, 9, + -22, 0, 37, -24, 25, 55, -37, -23, -16, -34, 32, 15, -38, -4, 53, -13, + 62, -35, -51, 48, -68, 5, 18, -87, 48, -8, 45, -74, 48, -78, 53, -48, + 62, -30, 5, -16, 67, -27, 36, -49, 53, -38, 77, -58, 63, -13, 21, -5, + 52, 22, 19, -17, 40, -55, -9, 16, 17, 50, -24, 22, -42, -9, -43, -46, + 29, 7, 7, -38, 53, -66, 20, 31, -5, -7, -61, 37, -52, 18, -5, -24, + 17, 40, -14, -48, 25, -3, 4, -33, 18, -8, -25, 30, -18, -19, 99, -57, + 59, -39, 14, 43, 9, -45, 46, -58, 56, 15, -33, 67, -26, 69, -24, -34, + 32, -16, -32, -28, -52, 45, 8, 6, 27, 33, -13, 2, -57, -17, 14, 60, + 43, -48, 45, -54, -17, -17, 19, -36, -29, -9, -56, -30, 84, -55, 32, 0, + -1, 27, 6, 42, -10, 12, -22, 6, -56, 27, 37, -8, -20, -10, -53, 50, + 6, -25, -26, 90, -15, 21, -77, 54, 42, -55, -4, 43, -63, 65, -56, 74, + -1, 43, 8, -46, -47, 48, -53, -43, 11, -79, 42, 17, 10, -33, 72, -76, + -45, 73, -52, 71, -4, -58, 59, -14, -5, -36, -32, -29, 44, -43, -61, -19, + 74, 12, 2, -38, -32, 33, -19, 16, 56, -63, 40, -23, -4, -6, -5, 49, + -28, 6, 20, 39, -5, 25, -32, 23, 18, -49, 52, -22, -10, 18, 13, -41, + 6, -15, -21, 29, -37, -65, 55, -76, -25, 1, 10, 23, 67, -67, 43, -36, + 33, -9, -24, -47, 52, -46, 46, -4, 15, 3, 4, 60, -2, 34, -60, 56, + -84, 66, 27, -50, 66, -41, 15, -25, 21, 38, -64, 58, 36, 36, -76, 37, + -61, -5, 2, 37, -11, -18, -9, -41, 45, -50, -25, -29, 10, -19, -63, 34, + -64, 66, -55, 10, -37, 20, 45, -44, -30, -2, 47, -17, -18, 34, 39, 11, + -32, 16, -13, 20, 1, 26, 21, -22, 12, 20, 42, -25, -38, 83, -65, 33, + 46, -93, 81, -49, 0, -9, -62, 56, -29, -49, -27, 3, 53, -54, -46, -23, + 6, -13, 37, -77, 81, -10, 40, 23, -54, 15, 59, -44, 33, -72, -34, 60, + -63, 80, 2, 37, 7, 8, -48, 6, -12, -10, -49, 14, 45, -41, 28, -67, + 8, -8, 10, -5, 49, -15, -2, 0, 15, -6, 19, 48, -55, 45, -16, -28, + 38, -77, 70, -102, 36, -49, 49, -37, 47, 51, -84, 54, -52, 48, 28, 16, + -56, 7, 15, -68, 43, 40, -8, -30, -72, 66, -61, -16, 18, -10, 45, -75, + 2, 15, -34, -17, 44, 32, 10, 35, 35, 51, -10, -51, 27, 20, -58, 72, + 27, 23, -67, 53, -8, -2, -51, 25, -29, -2, 61, -17, 49, 25, 53, -13, + -14, -70, 64, -33, 73, 9, -32, 42, -54, 60, -84, 74, -47, -52, 41, -85, + 25, 42, -62, -39, -16, -22, 41, -51, 3, 13, 30, -21, -19, 7, 33, -5, + 12, 26, 58, -16, 7, 0, -9, 18, 49, -8, 32, -75, 3, 12, -17, -4, + -17, 2, 32, -5, 24, -31, 46, -48, 59, -29, 1, -69, -50, -5, 25, 35, + -36, 19, -20, 2, 3, 65, -82, 59, -37, 45, -41, -24, -33, -5, 46, -20, + 67, -68, 39, -21, -17, -19, 42, -39, 66, -25, -33, 67, -28, 46, 7, -2, + 32, -67, -4, 10, 55, -42, -15, -18, 78, -38, -5, -52, 18, 25, -11, 20, + -40, 6, -24, -42, 48, -86, -12, 41, -46, 9, -14, 16, 24, -32, 18, -34, + -1, 34, 11, -51, 32, 49, 5, 44, -47, 84, 59, -94, 54, -23, 71, -86, + 89, -69, -9, 65, -37, -70, 26, -34, 49, -19, -31, 13, 21, 41, 42, -54, + 15, -19, -9, -18, -33, 21, 56, -16, 11, 20, 16, 22, -30, 7, 46, -32, + 27, 0, -33, 70, -47, 53, -27, -28, -33, 3, -24, 45, -9, -41, 53, -7, + 6, -53, 20, 31, 31, 11, -15, 32, -5, -35, 45, -63, 74, -57, -9, 31, + 38, 12, 34, -37, 46, -50, -8, 49, 15, 46, 29, 68, -65, 31, -32, 33, + 45, -45, 35, 2, 54, -76, 14, -18, -21, -87, 60, -8, -2, -23, -3, -74, + 57, -74, 23, 11, -65, 53, -8, 14, 21, -35, 12, 58, -73, -52, -19, 28, + 2, 2, 12, -14, -27, -37, -54, 58, -57, 41, -16, 9, 43, 14, 40, 49, + -1, -28, 25, 59, -41, -8, 11, 13, 14, -38, 10, 3, 9, -25, -27, 31, + 1, -47, -67, 74, -27, -53, 71, -57, 46, -35, -28, 59, 74, -70, 50, 26, + -3, 8, -9, -38, 32, -27, -36, -23, -32, -8, 17, 44, 74, -37, 10, -32, + -29, 40, -46, -31, 52, -101, 54, -4, -6, -45, 33, -2, -16, 22, -74, -3, + 36, -16, 41, 0, -5, 14, 41, -75, -12, -13, 66, -42, 49, -14, -11, 52, + -64, 67, -4, -76, 63, -43, 62, -19, -18, -6, 25, -13, 45, 12, -81, 97, + -39, 60, -6, 58, 16, 12, 78, -28, -19, 55, -19, 57, -24, -20, 38, 0, + -48, -20, -9, 38, 1, -26, -31, -80, 102, -114, -2, 58, 1, -21, 22, 46, + -24, 24, 38, -49, -24, 86, -15, -24, 43, -38, 9, -55, 2, -59, 16, -25, + 26, -26, -6, -29, 48, -7, -52, 32, -20, 8, -4, -11, 0, 24, -63, 39, + -47, -15, -23, -13, -53, 24, 15, 60, 20, 18, 36, -37, -31, 27, -2, -3, + 37, 46, -1, -8, -18, 34, -6, -58, 60, -45, 16, -49, 12, 46, -39, -39, + -35, -2, 9, 9, -45, 4, -28, 61, -54, -18, -46, -44, 33, -17, 10, 0, + -32, 14, -33, 49, -80, 61, -78, 47, 37, 50, -74, 19, 25, -21, 48, 23, + 8, 32, -54, 52, 23, -49, 18, 41, -13, 75, -72, -33, 26, 51, 35, 26, + -42, -31, 43, -57, 59, 67, -44, 40, 0, -25, 27, -61, 38, -25, -69, -23, + 41, -65, 8, 4, 0, 3, -21, 48, -54, 50, -48, 33, -9, -11, 35, -23, + -14, 15, 41, -48, -16, 89, -87, 90, -69, 38, -43, -24, -37, -23, 58, -61, + 11, -27, 51, 39, 10, -33, 30, 20, 46, 40, -3, -35, -44, -40, 50, 7, + 15, -7, 48, 66, -42, 58, 16, 14, 38, -53, 52, 17, -41, 22, 67, -39, + 19, 2, -56, 1, 38, 30, -35, 64, 39, 51, -37, -28, -11, -46, 3, -4, + 0, -7, 26, 48, -41, 7, 31, -47, 30, -11, -2, 32, -49, 38, 0, -52, + -23, -32, 28, -72, -2, -36, -41, 5, -48, -13, 6, -61, 31, -50, 37, 26, + 7, 7, 10, 46, -42, 28, 63, 37, -77, 75, 14, -36, -22, 44, -34, 24, + -11, -59, 50, 10, 4, -83, 78, -47, 5, -8, -7, 65, -16, 3, 30, 77, + -63, 53, 65, -15, -24, 73, -47, -6, 11, -5, 43, -77, 8, -19, 47, 33, + 40, 39, -26, 53, 15, -6, -15, -76, 13, -33, 48, -33, -23, 50, -48, -31, + 5, -45, -26, 47, -71, 31, -29, 32, -48, -9, 28, 21, 8, -28, 13, 32, + 21, -44, 14, -58, 42, 28, -41, -3, 10, -15, 30, -27, 34, 0, 12, -14, + 59, -51, -30, 42, 0, 12, 6, 54, -74, -25, 45, 65, -83, 36, -6, -10, + 52, -86, 34, -34, 11, 14, 24, -41, -57, -8, 24, 74, -72, -31, -56, 51, + -55, 24, -1, 43, -43, -47, 27, -47, 22, 24, -47, 66, -71, 88, -31, 54, + -13, 58, -45, 0, 45, -47, 56, 17, 4, -19, 24, -4, 15, -52, -14, 18, + 33, -42, 8, 51, -28, -21, 17, -68, 71, -12, 65, -60, 44, -4, -46, 31, + -33, 22, -36, -50, 2, 51, -1, 32, -67, 1, -37, 49, 17, 47, -25, -57, + 61, -51, -31, -63, -6, 5, -28, -33, -25, 6, -31, 39, 0, -21, -61, 29, + 40, -20, 49, -27, -39, 17, -64, -2, -63, 8, -24, 64, -49, 16, 27, 19, + 23, -22, -68, 46, 9, -2, -3, -43, 29, -15, 66, -18, -29, 10, -63, 69, + 6, 64, -63, 85, 2, -19, 9, 25, 32, 22, -49, 85, -27, -9, -2, 23, + -45, 21, 45, -56, -5, -24, -74, 45, 24, -43, -38, 55, -8, -25, 48, -46, + -41, 88, -78, 69, -42, 39, -41, 67, -47, 45, 14, -57, 50, -11, -25, -45, + 12, -41, -56, 7, -38, -24, -10, 57, -41, 0, 17, 52, 36, 7, -33, -39, + -11, -48, 64, -41, 43, -30, -36, 54, 6, 40, -56, 68, -36, -23, 48, -19, + 37, -61, 55, 20, 7, -37, 16, 23, 61, -28, 10, -12, 6, 11, 51, -58, + -37, 64, -5, 76, -70, 15, 64, -52, 56, -58, 44, 45, -14, 21, -19, -62, + 30, -34, 100, -57, 20, 18, -64, 25, -39, 84, -56, -62, 91, -61, 4, -31, + -48, 50, 36, -57, 13, 36, -16, -31, 80, -47, -38, -14, 41, 0, 48, -23, + 63, 1, 7, -10, 7, 8, 45, 14, 3, -50, 53, -10, 30, -83, 20, -37, + 45, -38, 35, 23, -13, -28, -65, -4, -13, -43, 91, -101, 51, 29, 4, 15, + 3, -20, -49, 30, 44, -42, 21, 2, -21, -23, 30, 23, -2, -2, 4, -28, + 56, -33, 17, 15, 1, -64, 3, -14, -3, 3, 19, -24, 0, -84, 59, 36, + -32, -20, 49, 72, -35, 13, -11, 27, 48, -52, 4, -15, 13, 27, 59, 3, + -67, -39, 44, -8, 9, -2, 41, 29, -29, 39, -65, 1, 4, 70, -56, 34, + -52, 0, 40, -31, 37, -35, -27, 49, -20, 25, -63, -44, 25, -30, 64, -10, + -42, 25, -59, 29, -57, 93, -15, -22, 0, -12, 71, -86, 25, -49, 53, 0, + -12, 25, -50, -16, 52, -63, 82, -72, 67, -45, 30, -5, 16, -4, -42, 40, + 68, -62, 41, -37, -34, 58, -41, -3, -15, -60, 7, 53, -39, 0, -19, 38, + -42, 31, 55, 14, 23, 70, -50, 4, 40, -4, -56, -44, 6, -42, -18, 12, + -54, 17, -3, -40, -24, 25, 18, -1, 31, -39, 22, -77, 51, 33, -14, 37, + -29, 40, 22, -60, 14, 30, 28, -3, -75, 34, 25, 8, 17, 33, -82, 90, + -29, 24, -73, 26, -22, 52, -49, -12, -24, 36, -37, -65, 49, -76, 41, 45, + -2, -8, -52, -15, -34, 43, 0, -43, 42, -72, 75, 13, -74, 95, -9, 3, + 15, -9, 20, 28, 3, -41, -45, 44, 24, -21, 56, 13, 1, 18, -15, -32, + -69, 36, -22, -9, -15, 25, -28, -68, 67, -24, 14, -46, -19, 101, -43, 28, + -4, -23, 30, -71, -7, 38, 48, -11, -3, 63, -104, 93, -40, 20, -46, 26, + -9, 1, 35, 7, -30, -19, 79, -30, 27, -5, -41, 35, -39, 5, -5, 47, + 9, 2, -52, -3, -14, 63, 14, 17, -3, 29, 0, -56, 25, 60, -15, 38, + -36, -1, 13, -47, 9, -7, 27, -65, 57, 33, 38, -51, -10, -1, -31, -31, + 109, -21, 35, -13, -18, -22, 25, 28, -46, 5, 30, 39, -29, -44, 14, -9, + 56, -69, 81, -39, 2, 1, -2, 19, -9, -27, 78, 35, 35, -26, -66, 41, + -29, 37, -34, 63, -27, -55, 19, -6, 6, -5, -64, 69, 15, 14, -32, -28, + 38, -51, 37, -22, 28, 42, 31, -17, -35, 60, -57, 0, -61, 11, -27, 19, + -56, 9, -29, 19, -22, 1, 9, 19, 25, 39, -12, -27, -50, 56, 3, 63, + -33, 13, -68, 53, -39, -20, -32, -14, 40, -45, 12, 59, -7, 19, -21, 54, + 20, 26, -41, 98, -36, 33, 1, -78, 6, -29, -10, 55, -41, -33, 51, -40, + 31, -67, -47, 53, -63, -17, -25, -35, 26, 18, -91, -4, -39, 4, -45, 48, + -55, -2, 73, -19, -20, 32, -20, 89, -66, 68, 46, 0, -33, 41, 3, -2, + -6, 65, -12, 37, -56, 5, 10, 41, -49, 72, -70, 22, -7, -42, 5, -24, + 39, -38, -26, 53, -72, 53, 44, -83, 26, -9, -2, -48, -15, -53, 61, -5, + 73, -61, 17, -54, 84, -73, 103, -71, 73, -85, 60, -10, 23, -80, 0, 43, + -11, -60, 51, 2, 63, -8, -14, 45, -31, -41, 75, -32, -38, 36, -30, 10, + -55, 47, -57, 91, -50, 9, -53, -46, -8, 36, -57, 10, 20, 4, 31, -56, + 10, -23, 43, 39, -54, -4, -11, -35, 15, -21, 33, 32, -25, -26, -21, -37, + 46, -11, -42, 38, 26, -36, 52, -42, -19, -74, 35, 50, -4, 1, -21, -3, + -62, -14, -23, -22, 20, -6, 20, -59, 75, -57, 69, -80, -8, 75, -20, -17, + -23, 49, -64, -31, 55, 30, -1, -69, 57, -40, -74, -25, 27, -37, 57, 39, + -13, 62, -52, -50, 18, 28, -16, -30, 70, -42, 27, -3, -64, 22, 7, 7, + -7, 24, 6, -32, 1, -60, 2, -11, -19, -18, 86, -56, 79, 67, -52, -2, + 68, -45, 51, -7, 16, 9, 0, -22, 33, -78, 57, 34, 54, -39, -23, -27, + -9, -35, 44, -10, -26, -47, 80, -27, -2, 29, 0, -30, 43, -22, 28, -16, + -18, -13, -26, -15, -81, 14, 33, 31, 32, 21, -1, 12, -12, -8, -41, 11, + -18, 35, 58, -14, 40, 55, -36, 7, 15, -4, 73, 11, -28, 54, -51, 80, + -43, 3, -24, -8, -18, -2, -18, -11, 6, -34, -73, 24, 2, -8, -58, 62, + -47, -46, 0, 34, 46, 3, -28, 45, -13, -10, -17, 27, -36, 49, -4, 22, + -87, 80, 8, -32, -23, 56, -28, 30, 50, -1, 3, 1, 46, -2, -70, 69, + -28, 33, 40, -7, -35, 14, -53, 3, 0, 21, -21, -37, -31, 74, -8, -55, + 62, -29, 32, -69, 2, -62, 35, -52, 69, -77, 11, 21, -6, 32, 32, -64, + 38, 5, 19, -59, -35, 61, 14, 62, -39, 17, 21, 0, 21, -13, -58, 28, + 20, -4, 30, -79, 64, -32, 13, 40, -9, -34, -35, 72, -32, 16, -27, 34, + 7, -1, 21, 1, -8, 11, -25, 65, -27, -3, 11, -70, 51, 2, 19, 42, + 17, 25, -28, 20, 44, 1, -30, -24, 16, 25, -34, 49, 30, -40, 19, -30, + 54, -96, 80, -27, -15, -16, -36, 42, 10, 26, 44, 39, -20, 22, 2, -48, + -57, 9, -8, 73, -58, 62, -64, 64, -47, -5, 12, -70, 55, 68, -39, 47, + -44, -24, 56, 0, 62, -48, 23, 2, 41, -17, -24, 1, -45, -47, 61, -41, + 60, -43, -32, -63, 88, -70, 84, -21, 37, -8, -30, -21, -36, 23, 59, 22, + -63, 88, -56, 26, 26, 29, -45, 46, -49, 74, -43, 47, -72, 50, -7, 36, + 37, 31, -63, 76, 50, 44, -56, 17, -35, 14, 24, 36, -35, 62, -15, 0, + 12, 24, -47, 22, -22, 14, -43, 42, -15, 23, -62, 47, -35, 39, -3, -50, + 24, 37, -10, 23, -2, 20, -22, -52, 34, -47, 71, 67, -55, 35, -8, 24, + -49, 56, -60, 9, -34, 4, 13, -35, -40, 25, 32, -6, 35, -68, 43, -35, + 113, -115, 56, -24, 46, -69, 29, -61, -24, 25, -42, -27, 60, -24, 71, -89, + 10, -60, 19, -1, 49, -59, 40, 27, 37, -3, 4, 36, 74, -97, 62, 47, + -83, 53, -41, 95, -68, 49, 26, -26, -12, 77, 11, -18, -1, 4, -37, 31, + 14, -48, 18, 25, -12, -22, -5, -48, 46, 24, 12, 21, -67, 60, 32, -52, + 12, 62, -92, 76, 11, 57, -56, -30, 34, 5, 17, -27, -20, -19, -26, 62, + -77, 29, -6, 14, -19, -67, 61, -73, 63, 0, 51, -79, 11, 11, -40, -16, + 6, -21, -3, -2, -52, 2, 0, 74, -45, -8, -12, -9, -39, 3, 3, -15, + 61, 29, 59, -60, 65, 16, -33, 46, 8, -54, 62, -98, 60, -75, 38, 19, + 17, 34, 6, -18, -4, -10, 30, -14, 40, 18, 8, 86, -73, -57, 16, -86, + 62, -25, -51, 21, -72, 39, -12, -13, 21, -5, 41, 14, 20, 2, -32, -5, + -33, 42, 37, 27, -32, 5, -59, -29, -67, 36, 63, -76, 88, -22, -69, 18, + 11, -53, -7, 10, -23, 38, -22, 11, -6, -59, -9, -52, 31, -5, -58, 0, + -66, 46, -24, 3, -88, -5, 34, -43, 7, 2, -33, -36, 80, -81, 50, -2, + 0, -24, -13, -12, -7, -6, 50, -22, 20, -79, 63, -70, 5, 0, 15, 17, + 8, -30, -51, 26, 26, 24, 2, 99, -74, 63, -43, -23, -17, -44, 37, 20, + -9, 53, 26, 16, -22, 20, -9, -26, 31, 44, -46, -48, 15, 60, -12, -34, + -65, 33, -2, 22, -40, 5, 27, 11, 12, -38, 46, -15, -44, -17, 27, 40, + -13, 63, -46, 48, -12, 3, 39, -51, -4, -33, -1, -55, -73, 82, -55, -27, + 21, 71, -35, -46, 2, 54, -48, 41, -45, -29, -35, -6, 29, -60, 63, -8, + 34, -55, 30, -26, 48, 3, 42, -32, 35, -64, -13, 66, -77, 25, -65, 41, + -3, -67, 54, -62, -30, -57, 52, -13, -4, 41, 10, -38, 78, 10, -42, 47, + 7, 18, -45, -3, -13, 50, 28, -77, 57, -91, 61, 27, 37, -68, 58, 2, + 6, 16, 11, 14, 33, -36, 62, -47, -15, 9, 5, -27, 84, -9, -55, 35, + -68, -36, -65, 24, -80, 56, 4, -39, -63, 37, -70, 78, -3, 48, -26, -38, + -48, 11, -27, 64, -51, 52, -63, 0, -73, 10, 22, -77, 68, 2, -5, 69, + -2, 28, 1, 54, 31, -84, 64, -9, 16, -78, 4, -53, 33, 6, 4, -27, + -4, 47, -76, 18, 27, -55, 77, -7, 48, -28, 5, 43, -60, 5, 27, 3, + 22, 49, -7, -14, 57, -4, -50, 4, 16, 26, 48, 22, 1, -39, 21, 66, + -33, 21, 12, 9, 51, 0, -41, 39, -69, 72, -48, -20, -50, 33, 34, -56, + 25, -3, 20, 18, -81, 68, -79, 52, -15, 80, -74, 99, -67, 25, 25, -68, + 17, -5, 64, -31, -43, -68, 60, -110, 62, 8, -36, -8, 20, 50, -48, -48, + 20, -85, 28, -57, 41, 23, -41, 10, 25, -41, 13, 61, -49, -20, 64, -11, + 76, -2, -15, 17, 31, -46, 41, -11, -18, -36, 47, -13, 61, -63, 53, -68, + -45, 6, 13, -61, -16, -11, 21, -50, 85, -77, 41, 52, 15, 35, -16, 11, + 4, -72, 7, 7, 15, -52, 70, 15, -21, 60, 19, -34, 56, -35, -25, 37, + -14, 9, 40, -69, -8, -16, -25, 0, 20, -20, 3, -82, 80, 1, 3, -4, + 32, 24, 37, -53, 73, 7, 51, -61, 2, -33, 6, -39, -6, 30, -24, -6, + -17, 49, -23, 84, -37, 22, -41, 76, -5, 49, -92, 49, -16, 28, -17, -26, + -15, -48, 20, -41, 63, -34, 3, -29, 37, 25, -3, -25, -31, 6, 17, 35, + -9, 77, 7, 16, 55, -59, 34, -14, 50, 36, 3, -30, -37, 14, -16, 25, + 47, 34, 6, 5, -30, -50, 75, 4, 69, -24, -39, -21, 41, -35, 67, -72, + 5, 8, -48, -41, 0, 17, 5, -7, -5, 78, -4, 22, -33, 67, -26, 23, + 12, 50, -77, 65, -80, 70, -48, 62, -61, 51, -28, -32, 19, -18, -18, 14, + 19, -61, 43, -1, -67, -9, 55, 14, -1, -22, -1, -31, 23, 35, 3, -30, + 3, 7, -54, 41, -38, 44, 1, 17, -12, 7, 33, -1, 45, -39, 0, 0, + 29, -57, 30, 13, 32, 32, -6, -32, -24, 25, -13, 35, -41, 38, 6, 60, + -67, 46, -52, 14, 18, 65, -76, 83, -41, 66, 6, 20, -46, 45, 43, 53, + -77, 83, -32, 50, -27, 36, -67, 58, -18, 1, -24, 12, -36, 3, -39, -4, + -58, -5, 29, 10, -48, 52, -44, 42, 43, -25, -25, 26, 38, -52, 18, 57, + 63, -73, 75, -27, 40, 41, -38, -3, -20, 40, 46, -3, -57, -44, 56, -79, + 45, -1, 31, -52, 24, -13, -58, 3, -14, -35, 0, -24, -27, 80, -29, -55, + 35, 35, -24, 44, 13, 29, -13, -11, 13, -41, 56, 22, -19, 16, 7, -42, + -11, -24, -27, 42, -13, -23, -35, 55, 1, 46, -76, 78, -2, -2, -53, 37, + -40, 19, -19, -50, 12, -6, -3, -69, 56, -47, 47, -26, -46, -8, 21, 15, + 39, 56, -36, -1, -62, 54, -45, 67, -38, -17, 13, 26, -7, 32, -43, 22, + -62, -21, 17, 28, -56, -32, 16, 28, -61, -26, -30, 0, 27, -4, 25, -43, + -20, -77, 25, -7, 12, 44, -83, 73, -83, 78, -4, 15, -31, 35, -70, 63, + -55, 63, -18, 3, 49, 30, -39, 7, -28, -45, -11, 26, 15, -37, -36, -33, + -11, 31, -19, 68, -32, 10, 40, -37, 9, -7, -65, 81, -56, -20, 35, 4, + -60, 45, 10, -73, 52, 28, -51, -28, -37, 75, -63, -16, -34, -35, -20, 3, + -6, -4, -8, -39, 3, -53, 4, 10, -9, 13, -1, 10, 44, -20, -56, 73, + -71, 24, 61, -78, 14, -45, -21, 87, -68, 24, -36, -22, 36, -49, 20, -77, + 37, 60, -51, 75, -76, 51, -15, 16, 0, -71, -4, -13, -11, -29, -62, -25, + 84, -58, -4, 13, -42, 10, 30, -3, -35, 41, 29, 1, 53, -39, 55, 7, + -15, 59, -55, -25, 18, -11, 60, -72, 51, -41, -26, 32, -37, 14, -10, -45, + -30, 44, -95, 69, -46, 15, -2, 18, -9, -43, -50, -11, 16, 30, 18, 23, + -1, 14, 25, -4, 20, 10, 13, -19, 26, 49, -53, 92, -43, 4, -20, 2, + 34, -78, 14, -28, 27, 35, -40, -5, 61, -36, 37, -32, -25, -5, 22, 28, + -15, 61, -55, 71, -36, 62, -65, 58, -38, -50, 88, -51, 6, -59, 85, -20, + 0, -33, 48, -33, -21, 64, 23, -21, -23, -6, 14, -31, 52, 5, -30, -37, + -33, -58, 70, -7, 68, -64, 36, -37, -11, -6, -15, 13, -1, 19, -58, 36, + 36, 58, -68, -38, 52, 13, -35, 28, 36, 48, -34, 32, -16, -36, 36, 20, + 11, 78, -41, -30, 32, 12, 39, -30, 13, -70, 40, 12, 0, 15, 11, -23, + 23, -28, 23, -7, -88, 54, -9, -70, 70, 15, 31, -70, 44, -40, 78, 13, + -24, -78, 51, -87, 71, -34, -61, 84, -55, 50, -6, 48, -10, 70, -49, -34, + 3, 53, -6, 22, 17, 40, 9, 27, 25, -64, 79, 11, 21, 65, -68, 60, + 33, 17, 26, 38, -54, 67, -10, -10, 43, -41, 2, -29, -69, 51, -5, 10, + 3, 44, -73, 4, 57, 35, -36, -14, 76, -49, -5, 46, -57, 0, 2, 105, + -86, -34, 28, -45, 9, -30, 36, -42, -15, 72, -40, 12, 32, 14, 84, -52, + 35, -62, 42, -3, 25, 63, -56, 54, -60, 6, -36, -43, -7, 28, -79, 37, + -70, 30, 21, -31, 63, -32, -18, -18, -55, 29, 22, 46, -51, 42, -86, 61, + 4, 31, 17, -20, 12, 31, -72, 22, 58, -32, 52, 27, -79, 72, -67, -38, + 4, 21, -52, 1, -73, 32, 10, -34, 0, 21, -62, 22, -38, -35, 3, 36, + 8, 55, -49, 0, -22, -23, -5, -19, 21, -15, -46, 83, -39, -19, 31, 29, + -64, -4, 4, -38, -5, -30, 16, 9, 22, 22, -71, 54, 7, 35, -4, -14, + -11, 39, 4, 62, -17, -25, -52, 64, -12, -6, 24, 0, 1, 29, -21, 33, + 60, -26, 23, -83, 46, -30, 26, -35, 28, 5, 50, -30, -14, -23, 4, 28, + -48, -10, 33, 8, -13, 49, -62, 78, -94, 65, -36, 18, -8, 46, -58, 17, + -17, -68, 4, 67, -24, -23, -41, -22, -54, 82, -73, 0, -42, 43, -77, 66, + -33, 68, -79, 63, 46, -31, 23, 53, -37, -26, -1, 15, 18, 37, -20, -55, + 78, 47, 47, -12, -76, 67, -16, -65, 59, -26, -10, -29, -15, -18, 55, 25, + 14, -87, 13, -45, -31, -16, -43, 20, -13, 26, -26, -26, -5, 18, 12, -30, + -12, -37, 14, 17, -26, 25, 11, -27, 13, -27, 4, 34, 51, -10, -8, -28, + -7, 48, -40, 59, -81, -19, -20, 54, -94, 101, -51, 13, 10, 26, -45, -85, + 56, 37, 41, -36, 38, -25, 0, -14, 23, -11, 44, -21, -12, -20, -29, 43, + -66, 60, 4, -17, -20, -29, 3, -42, 95, -50, 65, -22, 15, 39, 4, 8, + 55, -64, 62, -10, -13, -43, 28, 54, 57, 5, -21, -55, 46, 16, 52, 0, + -21, -5, -83, 32, 30, -79, 81, -1, -28, 0, 34, -54, 65, -65, 80, -14, + 0, 13, 52, 43, 37, -30, 41, 51, -48, -47, 50, -13, 24, 40, -5, -17, + -20, -24, 37, 40, -9, 35, -29, 50, -21, 6, -28, -67, 73, -49, 25, -58, + 60, 0, -47, 66, -26, -8, 22, -62, -26, -16, 58, -68, 4, -52, -21, 6, + 26, -46, 26, -48, -8, -29, 77, -44, 16, -57, 34, -12, -28, -52, 62, -76, + 19, 40, 1, 53, -45, -14, 64, -27, 45, -13, 9, -49, 45, 40, 31, 8, + -17, -6, 19, -47, -3, -7, 52, -94, 43, -41, 0, 29, 5, -64, 90, -32, + -30, 56, 46, -69, -56, 50, -4, 56, -26, 33, 70, -35, 53, 4, 59, -78, + -39, 16, -20, 15, -47, -24, 22, 15, -12, -34, 30, 52, -74, 24, -42, 7, + -23, -67, -28, -14, 57, 24, -12, 7, 32, -39, 24, 17, -29, 22, -11, -43, + -48, 70, 46, -30, 76, 4, -36, 0, -11, 22, -44, 57, -22, -16, -69, 55, + -3, 0, -5, -16, -37, 34, 12, -38, -23, 6, 34, -42, -32, 6, 15, 5, + -9, -42, 34, -34, 71, 29, 24, -15, 20, -81, 5, 58, -43, 11, 38, 36, + 32, -51, -38, -37, 59, 33, -7, 0, -53, 58, -19, -20, 33, -57, 18, 17, + -7, -5, -8, 26, -7, -9, -52, 38, -76, 24, 7, -19, 62, -23, -51, 29, + -10, 0, -51, -11, 67, -15, 21, -56, -15, -60, -4, 51, -54, -48, 0, 2, + -22, 65, 55, -5, -87, 101, -66, -28, -2, 17, 10, 9, -76, 95, -62, 49, + -31, 9, -55, -64, 26, 25, -43, -50, 39, 8, 45, 16, 23, 16, -13, -32, + 54, -44, 15, 27, -44, 19, 24, -13, 7, 14, 53, 25, 12, -10, -13, 40, + 3, -9, 76, -29, -2, 0, 0, 58, 42, -25, 11, 39, -63, 73, 25, 52, + -46, 22, 10, 0, 11, -22, 5, 3, 23, 22, -27, -28, 49, 41, -43, 56, + -27, -65, 52, -50, 1, 18, -47, 16, -76, 64, -47, -13, 63, -62, -24, -44, + 17, 13, -10, 29, 59, -34, -19, 54, 19, 35, -73, 44, -19, 8, -28, 2, + -4, -41, -6, 33, 50, 52, -55, 44, 43, -34, -72, 47, -36, -69, 12, 51, + 54, -31, 15, 5, 26, -45, 0, -15, 58, 12, -31, -59, 54, -5, 51, -47, + 106, -22, 57, 44, -32, -38, 60, -57, -8, 20, 0, 43, -73, 23, 39, 10, + 42, -15, -19, -3, -20, 2, 53, -50, 50, 11, -21, 11, -25, 56, 24, -23, + -35, 42, -35, -13, 70, -67, 38, -11, 48, -30, -21, 71, -36, -15, 47, -58, + 42, 55, -21, -11, -3, -77, 33, -2, 30, 70, -15, -20, 69, -103, 53, -82, + 61, -44, 23, 45, -47, -52, 17, -29, 13, 31, -51, 75, -49, 65, 4, 21, + 21, -41, -23, -2, -56, 38, 18, 36, 54, -57, -8, 12, -59, -15, 47, 49, + -24, 0, 44, -24, 19, -38, 54, -63, 72, 24, 5, 33, -3, -17, 73, -51, + 32, -60, -22, 3, 87, -60, 14, 51, -31, 23, -32, -31, 69, -83, 27, -33, + 16, -32, 22, 61, -28, -41, 97, -34, 47, -7, -62, -30, -45, -25, 18, 18, + -54, 55, -47, -13, -31, 0, 16, -30, 0, -85, 30, -42, -20, -5, 1, -20, + -9, -48, -20, 12, -26, -23, 36, -78, 45, 33, -67, 26, 26, -30, -24, -72, + 0, 0, -36, 41, -68, 43, 48, -39, 33, 11, 0, 25, 37, -71, 15, -32, + -17, 28, 18, -15, 41, -13, 4, 24, -5, 22, 24, -31, 3, -12, -8, 34, + 8, -14, -24, 0, -36, -47, 66, -118, 44, -45, 57, -19, -8, -58, 53, -8, + 48, 6, 44, 12, -79, -17, -23, -14, -95, 66, 19, -27, 57, 24, 35, -49, + -54, -29, 69, -31, 0, 65, -3, -31, -35, -51, 48, 13, -37, 30, -49, -6, + -26, -50, 49, -81, 12, -35, 13, -25, 36, 11, -28, 24, 12, 1, -78, 7, + 34, -34, 0, -22, 58, -21, -60, 46, -43, 59, -64, 51, -1, -45, 41, 8, + -23, 10, 26, 10, 32, -29, -42, 10, 43, 16, -22, 27, -15, 20, -12, -36, + 5, -33, 5, -28, 50, 12, -39, -28, 6, -16, -35, -58, 3, 68, 20, -46, + 24, -42, 53, -4, -24, 99, -50, 20, 13, 12, -22, -23, -33, -6, -61, 5, + 26, -31, 75, -21, 39, 23, 12, -10, -51, 42, -45, 53, 28, -36, -29, -22, + -8, -64, 38, 13, -50, -13, -55, 45, -8, -78, 27, 1, -20, 55, -59, 6, + 2, -11, 85, -59, -53, 38, 13, -40, -22, 83, -45, 46, 25, -4, -3, -6, + 25, -32, 39, -51, 24, -35, -16, -45, -48, 45, 23, 27, 42, -27, -66, 72, + -60, 94, -46, -8, 20, 8, -28, 42, -11, 58, 27, 26, -16, -44, 45, 6, + -7, 71, -60, 43, 60, -51, 69, -47, -60, -7, 29, 10, -10, 48, 20, 34, + 25, 38, -55, 2, 9, 13, -54, -31, 8, -60, 17, 17, -40, 50, -10, 41, + -19, -11, 20, -47, 25, 0, -37, 60, -40, -17, -10, 40, -52, -15, -1, 45, + -82, 53, -23, 35, 2, 23, -5, 75, -5, -17, -4, 9, 24, 45, -10, -26, + 0, -65, 21, -58, 46, 15, 28, -2, 87, -40, 9, -70, 15, -85, 55, -6, + 79, -3, -41, 5, -38, -49, -16, 49, -2, 75, -4, -19, 69, -85, 63, 4, + 1, -13, -10, 23, 61, -26, -35, 39, -24, -1, 53, -78, 18, 31, 19, 32, + -21, -26, -29, -2, -46, -3, 82, 9, -10, -26, 84, -49, -10, 17, -13, 16, + 40, 27, -78, 35, -57, 23, 16, 6, -68, 1, 21, -74, 15, -21, 9, 25, + -17, 58, -75, 64, -93, 70, -27, 34, -19, -24, 39, 29, 56, -76, -24, 7, + 57, -6, 5, -80, 83, -91, 68, -62, 30, -6, 5, -19, 40, 2, 36, -33, + -1, 56, -99, 41, 33, -33, -22, -36, 34, 5, 54, -49, 28, -4, -10, 49, + 28, -2, 12, 12, 16, 8, 67, -56, 48, 53, -45, -13, 31, -77, 82, -4, + -10, -26, -56, 89, -27, -6, -50, 111, -39, -50, -18, 22, -30, -1, 39, -6, + -26, 24, 42, 56, -61, 74, -75, 80, 24, -31, -5, -1, 10, -15, 64, -3, + 20, -84, 12, 56, -37, 38, 40, -44, 69, -70, -17, -25, 29, 57, -35, 29, + -23, -18, 5, 16, -48, 30, -37, 44, 19, 33, -19, 7, -24, -19, -66, 63, + -52, 22, 30, 11, -11, -25, 67, -37, 45, -49, 41, -24, -24, -25, -32, 26, + 7, 22, -56, 64, -46, 0, 36, -89, 26, -38, 14, 44, 6, 51, 8, 19, + 8, 17, -3, -28, -4, -8, 35, -101, 43, 7, -19, 14, -18, 7, -21, 1, + 6, 56, -31, 51, -79, 67, -19, 20, -35, -22, 35, 29, 52, -20, -7, 14, + -38, -46, 92, -14, 19, 30, 16, -38, 9, -41, -12, -39, 34, 11, -6, -34, + -28, 12, 12, -49, 34, -33, 72, 29, -25, 1, 11, -19, 86, -77, 67, -66, + -14, 60, 20, 25, 32, -32, -50, -52, -9, -2, -16, -39, 45, -3, 1, -50, + -56, 74, -16, 66, -32, -10, 29, 1, 60, -24, 50, 30, -2, 18, 30, -1, + 13, -13, 30, -9, 57, -15, 24, -82, 74, 34, -59, 22, -57, 6, 51, 3, + -22, -38, 5, 37, -4, -1, -12, 12, 34, -44, -9, -14, 39, 36, 25, -11, + 3, -42, 69, -43, -54, 40, -30, 77, -54, -17, 5, -10, 41, -9, -37, -15, + 23, -15, 64, -88, 86, -64, -11, 15, -68, 3, 11, 32, -13, 39, -15, -16, + -2, 32, 11, -61, 54, 5, -20, -53, -54, 95, -34, 62, -46, 26, -17, -11, + -10, -28, -41, -58, -20, 16, 23, -24, -9, 16, 10, -47, -9, 56, -77, 23, + -32, 36, 58, -36, 10, -57, -31, 18, -89, 70, -19, 1, -39, -7, 8, -11, + 34, 1, 20, -42, 23, -39, -4, 15, -3, 31, -69, -23, 64, -43, 60, -30, + -36, 54, -13, -34, 64, 26, -26, 64, -38, 54, -72, 62, -24, 47, 6, -38, + -29, 69, -65, 69, -73, 41, 8, 74, 1, 73, -62, -2, -44, -68, 64, -55, + 48, -46, 2, 41, -42, -18, 17, 49, -24, -46, 40, -20, 54, -75, 71, -5, + -43, -35, 3, -56, 65, -43, -17, 8, -42, 16, -58, -14, -21, 36, -5, -20, + 5, 3, -46, 15, -27, 65, -38, 49, -46, -17, 34, -23, 5, 2, 12, 23, + 18, 38, 29, 25, -31, -15, -30, -53, 33, -53, 0, -49, -35, -42, -1, 31, + -42, 44, -87, 33, 7, 19, 28, 36, 53, -40, -41, 29, 25, 19, -49, 27, + 20, -40, -66, 13, 9, -22, 31, -89, 21, -41, -65, 44, -54, 32, -51, 12, + 8, 1, -33, 1, -91, 62, -62, 112, -86, -9, 7, 19, 36, 17, -34, -37, + 48, -30, 81, -86, 12, 35, -34, -74, 48, -46, 53, -39, -30, -61, 3, 1, + -21, 10, 28, -13, 42, -53, -5, 19, -42, 33, 4, -35, -7, 34, 19, -21, + -24, 12, -50, 78, -59, 11, 46, 40, 7, -26, 30, -13, 4, 1, 8, -13, + 23, -33, -12, 60, -57, 58, 14, 38, 67, -81, 56, -78, 87, -54, 1, -49, + 25, 6, 53, 22, 47, -5, -3, 19, -38, 34, -57, 94, -49, 9, 73, -31, + 36, -38, -37, -17, -29, 66, 54, -59, 88, -1, -37, 45, 11, 23, -59, 17, + -75, 78, -30, -14, 31, 31, -13, 32, -60, 40, 53, -19, -19, 28, 6, -14, + -18, -60, 4, 6, -84, -18, 46, -87, 56, -1, 48, 11, -15, 50, -74, 49, + 39, -78, 52, -53, 70, -52, -17, -57, -15, -57, 31, 33, 76, 5, -38, -14, + 10, 15, 34, -15, 64, -17, -10, 15, -20, 16, -2, 34, -23, 46, -16, -54, + 107, -17, 23, 48, 23, -23, -28, 82, -28, 62, 41, -10, -28, 56, -34, 36, + 0, -29, 1, 7, 40, -65, 3, 51, 0, 61, 24, -64, 54, -29, -22, 14, + 10, -66, 41, -28, -38, 69, -41, 34, 5, 54, 12, 35, 57, -19, 48, -46, + 45, -56, 95, -38, 0, 3, -59, 50, -56, 65, 49, -69, -14, -29, 53, 6, + -36, 3, 94, -10, -19, -55, 48, 73, -78, 61, 82, -58, 18, 27, 11, -32, + -24, 17, 24, 5, 52, -1, -13, -72, 66, -14, -49, 33, -24, -52, 37, 38, + -27, 23, -60, 49, 40, -67, 70, 46, 21, 8, 40, -34, 46, -10, -2, 13, + -10, 39, -41, 16, 0, 2, 35, -42, 45, 55, -47, 40, -66, 50, -58, 42, + 4, -19, 25, -45, -6, -11, -28, -51, 28, 32, -12, 23, -3, -18, 0, -48, + -47, 54, 6, 24, -6, -15, -27, -28, -30, -7, 16, 9, -47, 17, 50, 22, + 70, -66, 37, -50, -27, 27, -20, -30, 81, -79, 92, -65, -1, -2, -35, -24, + 62, -5, 85, -52, 112, -91, 2, -23, 11, -47, 25, -19, 31, 6, -14, 28, + 42, -44, -37, 16, -35, 0, -12, 44, -25, -7, -51, 37, 22, -57, 53, -22, + 38, 27, -4, 15, 72, -31, -30, 14, -61, 50, -64, -22, -1, -21, 67, -82, + -4, 65, -35, 64, -35, 62, -4, 54, -22, 51, -22, -69, -36, 0, 41, -27, + 2, 0, -45, -25, 22, -46, 14, 69, -60, 55, -61, 8, -40, -43, 24, 51, + -84, -44, 45, -22, -79, 24, -11, -50, 9, -79, -18, 31, -7, -64, 44, 15, + 5, 23, 45, -30, -47, 34, -33, -36, -14, -32, 3, 12, -4, -5, 18, 9, + -11, 4, -35, -3, 63, -15, 48, -27, 7, -59, 45, 11, -67, 29, -32, 36, + -9, 34, -62, 41, -60, -25, 62, -39, 12, -65, 8, 54, -6, -36, -34, 40, + 9, 17, -61, -34, 72, 49, -17, -29, 81, -40, -39, -7, -77, 66, -67, 54, + -8, -31, -45, -5, -43, 31, 13, 75, -72, 3, 65, -10, 31, -2, -3, -74, + 53, 0, -46, 27, -54, 15, -64, -62, 42, -28, -34, 64, -28, 29, -11, 33, + 27, 22, -37, -23, 14, 76, -54, 38, -24, -49, 31, -25, 10, 56, -44, -18, + 20, 10, -57, 39, 47, -14, -44, 42, 12, -24, 9, -55, -18, -60, 49, 65, + 64, -57, -30, 13, -48, 43, -38, 39, 27, 13, 30, -63, 18, 45, -28, -67, + -30, 4, 55, -39, 27, 20, 30, -29, -21, 7, -19, 14, 17, -36, 25, -22, + -65, 7, -19, -17, -63, 39, 11, 15, -32, -20, 15, 36, -21, -42, 40, -1, + 0, 28, 54, -42, 16, -7, -18, -5, 29, 30, -21, -43, 41, -1, -35, 11, + 9, -21, 27, 10, -46, 11, 8, 10, 62, -43, 33, -2, 16, -23, 29, 41, + 31, -9, -34, -8, -49, -21, 36, 18, -58, 50, 30, 65, -17, -31, 31, -8, + -55, 45, -25, 37, -42, 77, -48, -4, -35, 19, 13, -10, 88, -10, -44, 20, + 76, 20, -74, 59, 18, 28, 7, 70, 18, 2, 65, -72, 63, -3, -11, -52, + -21, 20, -17, 0, 5, 26, 17, 0, 28, -27, 45, -30, 19, -37, -24, -14, + 10, -12, 21, -1, -43, -47, 6, -60, 52, -38, -30, 23, 25, -11, 26, 32, + -28, -22, -31, 5, 34, 41, -51, 1, 38, 16, 8, -38, 51, 11, 53, -42, + -50, -21, 64, -48, -10, -69, -12, -14, -31, -17, 39, 19, 60, -33, 22, -62, + 41, 25, 43, 26, 2, 46, -77, 17, 30, 23, -84, 17, 0, -55, 80, -3, + -20, 19, 9, 7, 23, 39, 45, 62, -81, 15, 42, -50, -15, -2, 9, -37, + -41, -49, 45, 17, -66, -57, -23, 25, 25, -10, -16, -6, -2, -28, 53, 32, + -77, 14, 0, 39, -21, -5, 55, -10, -52, 18, 37, 0, 47, 62, -12, -66, + -45, 1, 64, -54, 51, -62, 74, -76, -6, -38, 2, 47, -7, -40, 35, 17, + 68, -65, -6, -27, 31, -74, 36, -6, 5, 4, -26, 15, -18, 15, -8, -4, + 95, -37, 52, 2, 4, 23, 4, 19, 18, 65, -20, -24, 6, -25, 57, -65, + 10, -49, -27, 70, -59, 81, -29, 21, -56, 19, -43, 73, -67, 24, -38, 62, + -33, 53, -69, 67, -27, 37, 8, -44, 39, -41, 32, -28, 0, -8, -23, 1, + -30, 20, -22, 16, -7, 62, -111, 42, -33, -41, 0, -67, 31, 39, -29, 16, + 49, -4, 6, -11, 35, -71, 32, -14, -48, 61, -22, -18, -78, 16, 52, -9, + -59, -33, 59, -38, 24, 12, -20, -101, 27, 41, -61, 9, 27, -37, 51, 9, + -27, -34, 21, -5, -4, -34, 41, -1, -33, -40, 52, -52, 55, 6, 3, 54, + 15, -35, -7, -23, 43, 32, -21, 13, 15, 46, -43, 24, -69, 74, -77, -12, + -23, 57, 35, 1, 43, 13, -22, -45, 41, 23, -36, 41, -73, 17, -42, 76, + -66, 89, -53, 65, -3, 61, 15, -12, 1, 4, 24, -26, -24, 31, 9, 20, + -21, -22, -51, 24, -33, -6, 35, -43, -51, 58, 18, -21, 49, -48, -16, 71, + -56, 35, -1, 25, -15, -36, -58, 17, 22, 45, -40, -23, 69, -21, -28, -8, + 63, -17, 17, 16, 45, -6, 74, -79, 31, 19, 35, -20, 41, -49, -38, 44, + 17, 31, 0, -16, -43, 49, -75, 80, -5, -16, -45, -32, 21, -48, 33, -7, + 71, 5, -47, 67, -55, -13, 26, 35, 52, -6, -44, 21, 3, 14, 0, -49, + -24, 72, -1, 0, -8, 22, -46, 57, 27, 3, -32, -2, 16, 15, 15, 14, + -36, -43, -6, -2, -24, -40, -25, -35, 11, -82, 60, -45, 28, -42, -57, 71, + -61, 69, -33, 30, -56, 20, -22, 16, 42, -12, -28, 33, -70, 91, -40, -33, + 47, -52, 31, -62, 7, -7, 9, -42, 54, -44, -16, 10, -15, 9, -37, 17, + -43, -11, 75, -72, 76, -78, 84, 29, 36, -29, 35, 73, -82, 51, -37, -28, + -31, 23, -1, -36, -39, 64, -50, 75, 13, 0, -29, 67, 43, -11, -13, -74, + 85, -34, -39, 60, -41, -61, 30, 87, -38, -24, 54, -27, -38, 53, -35, 37, + -16, 37, 27, 5, 0, -52, 25, -42, 36, 57, -65, 38, -43, 2, 31, -62, + -1, 14, 36, 13, 10, 5, 0, 68, -61, 2, -4, 12, -14, 48, -29, 34, + -1, -69, 8, -58, -21, -21, -14, 71, -96, -15, -17, -42, 54, 61, -43, 19, + 54, -46, -11, -43, 49, -80, -35, 56, -24, 9, -38, 39, -18, -4, -33, 47, + -1, 51, 58, -50, 5, -48, 81, -40, 43, -26, 4, 34, -27, 88, -38, -46, + -16, 6, 8, -40, -10, 45, -82, 74, -62, -24, 37, 55, -64, -16, 32, 23, + -65, 25, 35, -40, 38, 13, -16, 48, -31, -39, -16, -5, 51, -24, 52, -90, + 1, 45, -40, -23, 55, -31, 21, -51, 2, 58, 32, 9, -51, 6, -37, -2, + -29, -33, 61, -87, 93, -29, 42, -84, -31, 40, 13, -31, -7, -32, -29, 106, + -74, 19, -57, 46, 20, -39, 51, -77, -10, -11, 25, -41, 69, -104, 64, -57, + 4, 60, -1, -40, 71, 50, -18, -17, 43, 15, 5, -62, 56, 28, 39, 0, + -8, -41, 59, -51, 54, -6, -26, 44, -25, 57, -19, 23, 77, -91, 56, -50, + 4, 73, -54, 41, 30, 9, -71, 72, -61, 19, 50, -43, 30, 18, 61, -81, + 82, 11, -58, 5, 36, 3, -49, -19, -44, 21, -33, -53, 32, 55, -34, 14, + 67, -4, -38, 35, 58, -53, 52, -74, 62, -32, -18, -44, 49, -61, 21, 67, + -20, 5, -11, -49, 39, 5, 32, -69, -27, 66, -92, 44, 22, -29, -11, -4, + 13, -27, -35, 21, 18, 45, 6, 25, -49, 1, 45, -54, 43, -8, -37, -4, + 69, -27, -18, 41, -43, -39, 31, -39, -45, 87, -76, 47, -60, -10, -29, 42, + 22, 48, 0, 8, 30, 2, -25, 43, 42, 49, 53, 17, -18, -92, 77, -52, + 9, -5, 58, -9, 15, 14, 39, 3, -11, 41, -20, 14, -52, 64, 19, -56, + 35, -93, 40, -34, -24, 66, -73, -20, 50, -28, -16, -34, -25, -42, 18, 51, + 16, -18, -18, -39, 47, 8, 55, -47, 61, 17, -39, -24, 12, 49, -21, 44, + 25, -31, -14, -23, -15, -32, 19, -56, 28, 29, -21, 7, -19, 19, -75, 98, + 37, -25, -5, 55, -18, -10, -24, -25, 25, -68, -22, 27, 10, 30, 51, 6, + 5, -26, 45, 8, 0, -38, -18, 63, -4, 27, -35, 66, -46, 17, 60, -117, + 83, -41, 79, -63, -24, 79, -58, 114, -48, 24, 30, 25, -53, 58, -36, 45, + -40, -20, -25, 34, -65, 29, -41, 57, -49, 32, 29, 31, -47, 33, -22, 40, + 46, -9, -58, 29, -34, -24, 4, -56, 53, -47, -29, -32, -44, 28, 50, -58, + 83, -110, 50, -62, 70, -95, 111, -90, 43, -7, 10, -76, 45, -85, 60, -9, + 15, -66, 63, -5, -20, -64, 46, 67, -42, 77, -49, 35, 5, -73, 34, -22, + -50, -10, -6, 37, -42, 10, -41, 8, -49, 36, -35, 24, 22, -33, -15, 0, + -31, 45, 61, -19, 48, 0, -17, 10, 22, -16, 32, 23, -36, 14, -16, 21, + 22, 20, 33, -39, -47, 24, -11, -30, 6, 20, 57, -75, 84, -53, 60, -21, + -32, 14, 14, -42, -35, 54, -41, 52, 5, -38, 43, 42, 2, 65, -5, -45, + 7, -76, 12, 18, 18, -32, -23, -78, 50, -77, -52, 36, -47, 31, 19, -36, + -31, 13, -14, 19, -31, 40, -71, 52, -70, 54, -23, 1, 78, -80, -47, 70, + -55, 70, -22, 57, 36, -22, 44, -1, 8, -46, -16, 36, 47, -24, -15, -66, + 13, 4, -10, 82, -43, 20, -4, -20, -4, -52, -17, 62, -47, -39, 0, -33, + 7, 37, -45, 27, -64, 93, -81, 79, -55, 6, -21, 26, -27, 6, 59, -82, + -63, 19, -61, 19, -61, 33, 28, 9, 16, 77, -53, 47, 21, -28, -63, 51, + -36, 18, -57, -28, 20, -29, 83, -45, -6, -25, -37, 28, 40, -71, 59, 37, + -21, -31, -30, 0, 40, -58, -53, -14, -53, -4, -32, 44, 17, 17, -2, 54, + -68, 85, -27, -20, 73, -74, 68, -25, 27, -68, -17, -4, -11, -15, -54, -15, + -19, -15, 86, -69, 21, 35, -15, 46, -71, 55, -17, 50, -2, -49, 4, 19, + -90, 69, 60, -47, -63, 67, -44, 18, 36, 6, 16, 87, -79, 94, -26, -6, + -20, 2, -21, 65, -55, 99, -31, -70, 56, -107, 65, -47, -9, 14, 45, -11, + 26, 53, -38, 23, 0, 47, -33, 41, -18, 42, -8, 1, 0, 60, -39, -3, + -11, 15, -51, -5, -18, 22, -1, -33, 14, -29, -7, 27, 44, -15, -21, 7, + -33, 7, -87, 104, -11, -37, 3, 67, -45, -24, -33, 81, -91, 29, -60, 6, + -18, 2, 33, -5, 47, 23, -9, 0, -29, -9, 4, -56, -6, -27, -10, 33, + 59, -3, 50, -55, 53, -44, 76, 26, -25, 19, 34, -36, 36, 3, -2, 47, + -31, 2, -1, -33, -39, 58, -13, 0, -53, 37, -11, 21, -93, 83, -12, -63, + 36, -70, 2, -48, -17, -48, 48, -37, 3, 15, 61, -24, -5, 26, 0, 32, + 22, -12, 23, -87, 25, -48, 8, 8, 52, 66, -37, -71, 79, 13, -40, 2, + 13, -35, 19, 31, 15, 19, 6, -15, 10, -25, 26, 25, 64, -82, 4, 56, + 57, -43, 80, -24, 54, -19, 48, -14, -4, -62, 46, -63, -7, 32, 40, -58, + 10, 5, 64, 51, -41, 1, -65, 31, 9, 53, 1, -23, 33, -38, -22, 9, + 28, -56, 98, -34, -2, 38, 34, 51, 38, -13, -10, 4, -15, -71, 3, -5, + 19, -28, -27, 16, 5, 11, -20, -13, -27, 68, 19, -12, -62, 56, 21, 42, + -64, 54, -98, 60, -10, 30, -7, -21, -17, 46, 38, -35, 77, -12, 63, -30, + 89, -35, -35, 24, 51, -45, 53, -51, -28, 0, -40, -30, 24, -38, -23, 23, + 72, -29, -5, 4, -24, -80, 83, -44, 35, 27, 23, 46, -52, 44, -20, -27, + -16, -8, 30, -98, 51, -27, -6, -38, 51, -24, 3, -18, 0, 39, -53, 81, + -50, 0, 0, -7, 19, -57, 14, -16, 43, -5, 4, -37, -20, 40, -42, 41, + -55, 55, 36, -60, -37, 54, -10, -37, 44, -33, 51, -50, 68, -12, 55, 43, + -50, -10, -61, 23, -32, -21, 75, -84, 73, -36, -18, -7, 90, -43, 61, -50, + -48, 29, -43, -19, -37, 8, -27, 25, 9, -88, 71, -22, 4, 39, -72, 46, + -20, 4, 19, -1, 41, -28, 7, 23, 0, 10, -44, 1, 52, 12, -25, 75, + -13, 77, -44, 92, -13, 32, -8, 65, 3, 7, -26, -15, 8, 2, -39, 9, + 39, -19, 45, 16, 46, -7, 7, -17, -75, -11, 34, 55, -26, -10, 53, 58, + -74, 73, 9, -32, -7, -31, -1, -58, 38, -1, -15, -10, -45, 37, 66, -87, + -43, 66, -9, -68, 0, -66, -16, -13, 0, -11, -15, 68, 9, -51, 32, 49, + -49, 12, -78, 9, 17, -9, 51, -4, -37, -36, 49, -64, 47, 50, -13, -61, + 34, 59, -67, -24, 45, -34, -4, -62, 18, 45, -51, 0, -35, 80, 36, -50, + -29, 65, 13, 21, -46, 0, -9, 2, 35, -60, 37, -21, 65, 10, -26, 1, + 19, 5, 42, -3, -47, -14, 37, 35, -4, -33, -37, 24, -58, -61, 21, -23, + -60, 17, -27, -18, 15, -12, 22, -16, 39, -34, 64, 2, -23, 10, 7, -28, + -10, -14, 31, -37, 29, 46, -68, 57, 31, -40, -48, 42, -45, 52, -48, 6, + 0, -7, 18, 73, 15, 8, 6, -33, 38, -45, 72, -53, 75, -63, 15, -42, + -10, 71, -21, -48, 33, -2, 51, -44, 26, -33, 7, -43, -8, 19, -14, -25, + 72, -66, -13, 52, 9, 49, -39, 13, -20, -47, 13, -46, -40, 63, -56, 15, + 47, 21, 33, 20, -40, 55, -79, 41, 52, -12, 63, -35, -45, -29, 51, -32, + 21, -62, 52, 16, 52, 36, -26, -27, 54, 50, -3, -44, 20, -11, 35, 16, + -15, -2, -37, -34, 71, -57, -55, 72, -51, 76, -57, 36, -81, 64, -14, -1, + -68, 2, -19, -49, -22, -16, -25, -55, -36, 31, -73, 62, -51, 67, -4, 1, + -72, -13, 20, -52, -13, 27, -75, 78, 38, -15, -24, 15, -28, -19, -42, -34, + 19, -17, -48, 37, 39, -5, 19, 27, 20, -2, 29, -55, 32, -73, 2, 24, + 27, -66, 44, 37, 31, 24, 64, -31, 64, 2, 4, -73, 14, -20, -33, -57, + 69, -28, 55, -31, 22, -11, -29, 8, 2, -29, 18, 47, -67, -48, 15, 42, + -18, -42, 67, -62, 42, -11, 6, 83, -92, 24, 29, 22, -17, -62, 24, 44, + -33, 11, -51, 26, 33, 20, 9, -29, 47, -8, -59, 66, -65, 17, -1, 12, + 34, -75, 45, 15, 9, -13, -6, 0, -50, 38, -14, -31, 30, 86, -84, 64, + -1, -34, 52, -31, 52, -76, 42, 28, -60, 33, -27, 14, -19, 71, -44, -15, + -35, -54, 60, 2, -7, 28, -29, 11, -66, 0, 27, 6, -27, 20, -8, 42, + -60, 16, -19, -83, 11, -80, 27, 7, 28, -23, 5, -36, -42, 52, -9, -24, + 66, -85, 84, -36, 54, -82, 44, 36, -17, 14, 13, 49, -4, -18, 35, -2, + 35, -46, 60, -23, -63, 16, -65, 49, 23, 4, 59, 72, -29, -20, -11, -35, + 21, -41, -1, 0, -16, -19, -17, 47, -68, -38, 13, 17, 17, 21, -40, -28, + 0, 75, -52, 3, -40, -18, -4, -4, -46, -17, -33, -14, 33, -13, -24, -30, + 9, 46, -8, 34, -70, 78, 28, -82, 74, -84, 69, -18, 45, -83, 66, -58, + 104, -52, 53, 1, -4, 43, -5, 54, -21, 32, 17, 35, -47, -18, -37, 11, + 80, 23, -15, -15, 12, 44, -12, 19, -43, -45, 63, 28, -50, 26, 68, -58, + 36, -21, 12, -44, -7, -72, 37, -14, -2, 4, 1, 11, 35, 35, -45, 55, + -54, 36, -95, 58, -36, -7, -23, -12, -23, -15, -49, 23, 44, 48, 23, 15, + -8, -65, 29, 48, -64, 53, -17, 45, -3, -15, 3, -27, 47, 49, -24, -33, + 10, 13, -75, 42, 33, 2, -25, -58, 53, -38, 28, -5, -29, 24, -46, 19, + 20, -35, 22, -29, 40, -69, 3, -8, -7, -69, 75, -76, 88, -59, -4, -39, + 19, 11, -45, -15, 47, -47, 41, 7, 1, 36, -23, 75, -75, 22, -3, 18, + 3, 47, -38, 19, 5, 57, -67, -33, 58, 29, -47, 53, -60, -22, 43, 33, + 49, 62, -75, 35, -26, -26, 6, 18, 28, 23, -22, 65, -54, 49, -27, 20, + 60, -46, 45, 38, 40, 3, 28, 0, -4, -56, -3, 35, 19, -28, -1, 33, + -32, 55, -59, -3, 7, 18, -47, 19, -24, 30, -21, -14, 40, -37, 5, 0, + -21, -20, 15, -59, 86, -24, 80, -22, 21, -6, -46, -69, 32, -17, 70, -34, + 23, -25, 45, -41, 31, 12, 47, -53, 60, -12, 31, -42, 16, -69, 69, 46, + -13, -54, 92, -59, 56, 38, 6, 6, -20, 64, 6, 40, -50, -21, 73, 11, + -16, -16, 5, 74, -37, -6, -54, 80, -21, 35, -52, -38, 60, -17, -33, -26, + 22, -51, 13, -22, 55, 8, 18, -71, 43, -76, 36, 20, -40, 55, -26, 3, + -34, -42, 18, -4, -31, -11, -19, -36, 2, 28, -8, -61, 38, -30, -15, 6, + 3, 21, 17, -1, 59, 6, 33, -1, -6, 5, -49, 49, -40, 23, -9, 9, + 12, 1, 68, -79, 8, -8, -17, 33, 20, -3, 69, -3, -64, -6, -67, 69, + -39, 58, 2, -51, 30, -43, 71, -76, 71, -89, 82, -72, 41, -70, 34, 18, + -49, 34, 35, 11, -38, -18, -5, 74, 0, -38, -19, 37, 22, 2, 55, -52, + 3, 10, -40, 56, 19, -64, 85, 15, -42, 53, 42, -38, -25, 46, 12, -12, + 22, 12, -27, 49, -10, -19, 28, -40, 45, -29, -24, -41, 75, -67, 14, -22, + -22, 25, -10, -38, 62, -71, 76, -26, -65, 54, -37, 1, 13, 34, 3, -60, + -50, -1, 12, 40, -40, 52, -63, 35, 3, -19, -22, -2, -37, 26, 5, 4, + -14, -41, -34, 19, -46, 29, -6, -40, 37, 52, 19, -57, 23, -4, 22, -55, + 5, -57, 81, 4, 25, 49, -23, 6, -39, -13, 25, -8, -23, 41, -34, 37, + -7, -6, -27, 71, -34, -36, -32, -29, -40, -40, 21, 53, -20, 63, -70, -15, + 12, -60, 50, -68, 58, 6, -29, -51, 5, -36, 8, 11, 11, 38, -17, -27, + -33, 90, -89, 31, -47, -21, 34, -24, 28, -41, -77, 35, 51, -47, -33, 2, + -38, 47, -32, -70, 32, 38, -16, -53, 40, -19, 62, 16, -4, -19, 43, 22, + -23, 61, -44, 28, -63, 26, -3, 10, 14, 22, -13, 5, 34, -18, 42, 27, + -21, -14, 9, 0, 58, 31, 10, 30, 3, 3, -54, 61, 10, 54, 16, -46, + 10, 0, 9, 3, -46, -25, -17, -60, 60, -2, 41, 5, -49, 53, -31, -57, + 32, 9, -27, 62, 9, -22, 27, -51, 40, 30, -89, 35, 21, 63, -41, 9, + -23, 29, -87, 75, -58, 34, -49, -52, 55, 48, -45, 64, -8, 11, 37, -14, + 21, 12, -20, 0, 5, -19, 38, -93, 56, 10, 45, -29, 13, -72, 78, -82, + 104, -75, 97, -90, -6, 58, -80, -16, 26, -5, -5, 10, -20, -38, 19, 18, + -56, 20, -44, -25, 0, 31, -18, -14, -15, -41, 57, 52, -41, 33, 37, -41, + 63, 0, -39, -19, 10, -29, 41, -36, 79, -79, 56, -55, 18, -26, 42, -5, + 38, 25, 28, -34, 27, -56, 14, 32, -26, -18, 17, -16, 76, -71, 3, 15, + 21, 60, -32, 7, -65, 75, -35, 62, -68, -47, 37, 16, 29, 9, -61, 68, + -3, 64, -71, -33, -65, -26, 21, -21, 17, 40, -17, 35, -28, -12, -13, 11, + 43, -18, 73, -88, 33, 3, 44, -17, 52, 48, -68, 18, -6, -29, 56, -22, + 0, 53, -32, 40, -61, 61, 10, 53, 37, -31, -10, 65, -56, -1, 15, 0, + -48, -1, 0, 43, -28, 17, -37, -7, -27, -7, 78, 0, 14, 43, -29, 1, + -27, -27, 53, 30, -39, -7, 9, -27, -15, 27, -63, -64, -6, 26, -50, 21, + -52, 23, -45, 30, -22, -11, 12, -59, 29, -7, -53, 52, -53, -53, 34, -35, + -24, 30, 61, -3, -70, -27, 13, 18, -57, 37, 14, 5, -9, -80, -5, 49, + -2, -7, -55, 50, 37, 27, -36, 76, -46, -34, 0, -10, -21, -19, 25, -20, + 53, -53, 78, -128, 63, -7, 34, -27, 11, -50, 52, 21, -42, -54, 41, -67, + 41, 12, 40, 10, 33, -66, 57, 45, -34, -68, 66, -71, -20, -9, 7, -4, + -41, 13, 6, -46, 8, -31, -2, 50, -25, -51, 10, -6, -4, -37, 25, -1, + -56, 24, -52, 46, -14, 45, 0, 17, 26, -31, -51, -17, 29, 14, 9, 51, + 2, -50, 65, 7, -29, -26, -5, 17, -19, 73, -58, -51, -31, 29, -24, -24, + -37, -5, 48, 47, 14, -22, 5, 3, -16, 6, 23, -21, -5, 35, -57, 7, + 35, -58, -2, -45, 11, 17, 27, -61, -4, 34, -51, 31, -26, -9, 4, 0, + -84, -4, 15, -12, 68, -111, 67, -44, 33, 21, 8, -78, -3, 38, 31, -17, + -46, 61, -40, 46, 23, 59, 33, -70, 30, 8, 21, -55, 6, -3, 40, -76, + 59, -76, 15, 31, -47, 10, 24, 38, -19, 2, 21, 36, -19, 32, -54, 27, + -13, -2, 5, -51, 28, -56, -30, -73, 46, 15, -22, -65, 54, 41, -42, 21, + 29, 29, -13, -43, 47, -55, 90, -72, 49, 42, -68, -1, -16, -21, -37, 91, + 63, -2, -63, 0, 45, -32, 39, -3, 50, 7, 2, 82, 15, 13, 27, 1, + 9, 50, 34, -33, -36, 69, -51, 78, -1, 13, 17, -52, 53, -31, 63, -9, + 71, -73, -62, 20, -10, 82, -38, -16, 39, 13, -53, 10, -12, 76, -39, -59, + 53, 33, -4, -67, 0, 33, -57, 6, -13, 18, 27, -59, 56, -21, 24, -4, + -34, 62, -67, 86, 4, -16, -39, 21, -36, 6, 9, -8, -6, 46, 21, -20, + 42, -44, 0, -2, -42, 90, -69, 13, -22, 27, -21, 37, 61, -48, 6, 4, + -63, 66, -55, 82, -19, 47, -43, 18, -49, 92, -68, 45, 21, 55, -79, 54, + -28, 69, -25, 3, 12, -22, -61, 28, 25, 22, 44, 21, 19, -16, 0, -68, + -13, 45, -2, 37, -1, 70, -54, 14, 40, -51, -6, 84, -31, 16, -3, 44, + -15, 62, -58, -33, -22, -26, 68, -92, 63, -32, 27, 48, -31, -35, 38, 20, + -47, 54, -9, 41, 12, 3, -6, 1, 41, 40, -20, -14, -4, 40, 12, 44, + 9, 68, -94, 87, -59, 72, 14, -57, 14, 10, 12, 46, -55, 31, -45, -3, + -22, -12, 40, 18, -61, -12, -58, 93, -74, 1, -33, 53, -2, -30, 19, 69, + -69, 61, 27, -39, 36, 10, -41, -54, 0, -59, 58, -34, 38, -76, 29, 36, + 7, 18, 0, 19, 24, 15, 10, 90, -85, 45, 6, -27, 30, -36, -49, 20, + 11, 36, -42, 29, -19, 7, 10, 37, -19, 4, -10, -12, -13, 67, -38, -51, + -2, 17, 38, -14, -26, 10, -26, 9, -38, 41, -8, -59, -57, 52, -103, 58, + -25, -46, -4, 56, 21, -55, 77, -73, 40, -77, 18, -35, 64, 2, -39, 22, + -63, 56, 40, 6, -8, -49, -63, 66, -72, 21, 59, -49, -6, 61, -59, 117, + -88, 2, 35, 26, 16, -11, 55, -42, 47, -30, -12, 10, 7, 40, -48, 73, + 30, -69, 40, -66, -22, 9, 32, -29, 1, 41, -22, 26, -6, -18, 1, 43, + -44, 25, -32, 59, -35, -31, -32, 59, -49, 27, -36, 59, -69, 17, 29, 23, + 41, -14, 90, -81, -35, 60, -20, 4, -8, 14, -12, -17, -40, 26, 42, -19, + 7, -42, -2, 17, -52, 47, 7, 0, -29, -58, -9, -9, 29, -35, -5, 0, + 47, -49, 14, -50, -48, 16, 7, 28, -19, 31, 58, -91, 32, 6, 20, -89, + 65, -84, 71, -54, 73, -27, -24, 58, -51, 68, -7, -53, -28, 48, 0, -45, + 2, -45, -39, 21, -90, 41, -53, 17, -19, -50, 62, -52, 57, -53, -35, 26, + -72, 15, 34, -63, -3, -56, 63, 4, -39, -2, 15, -11, 18, -36, 9, 19, + -29, 47, -53, 0, 15, 39, -50, 33, -3, 53, -51, 39, -43, 9, -34, -4, + -3, -54, -8, -11, -11, -33, 71, 12, 63, 14, -54, -20, 38, -3, 37, -57, + -12, -52, 5, -8, -14, 10, 2, -48, -1, -14, 28, -22, 70, -60, 43, 58, + -50, -20, -15, -6, 41, -16, -50, 0, 35, -59, 53, 2, 43, -10, 60, -32, + 45, -75, 61, -44, 52, -39, 19, -26, -32, -16, 27, 52, -22, -22, 46, -14, + 56, -23, -45, -2, -15, -19, -52, -1, -5, 55, 36, -42, -4, -13, -9, -24, + 13, 41, -42, 6, -10, 84, 39, -19, -5, 5, -47, 60, -48, -19, 5, -85, + 44, -11, 17, -64, 5, 15, -65, 46, -12, -63, 50, 31, -12, -56, -21, -29, + -46, 6, 30, 7, -3, 14, 34, 41, -48, -33, 3, -22, 8, 24, -22, -33, + -56, 59, -73, 27, 7, 5, 10, 30, -9, -21, 71, -72, 11, 49, -41, 30, + -43, -35, -64, 43, 37, -51, -12, 56, -22, 71, -37, -34, 55, -15, -56, 75, + -23, 7, 3, 16, 28, -79, 46, -49, 31, 33, 11, -27, -10, 20, 37, 10, + -22, 35, -2, -8, 47, 50, -55, -44, 49, -62, -14, 16, 10, -12, -2, 42, + 25, -32, 40, 4, -49, -8, 27, 41, -34, -27, -43, 53, 10, 17, -1, 7, + 23, 57, 15, 10, 72, -5, 60, -9, 26, -27, -15, -7, -2, 59, -41, -13, + 66, 20, 27, -7, 20, 59, -65, 8, 53, -19, -38, 13, -68, 53, 2, 21, + 40, -35, -6, 46, -54, 22, -27, 41, -11, 16, -36, -6, 18, -13, 60, -11, + -24, 36, 25, 33, -8, 50, -67, -17, -64, -7, 57, -33, 1, -3, 53, -62, + 101, -26, 25, 36, 28, -67, 50, -8, 45, 5, 9, -1, -59, 2, 40, -63, + -22, 15, 56, -7, -22, -28, 75, -63, 36, 1, -2, -40, -16, -25, -39, -30, + 10, 68, -62, -22, 31, 35, 0, 46, 12, 3, -46, 13, 42, 30, 42, -79, + -20, 36, 8, -19, 77, -10, 49, 32, -61, -28, 35, -21, -8, 53, -9, -29, + 62, -45, -21, 33, -49, -67, -21, 33, -34, 40, 23, -16, 34, 11, -3, 73, + -16, -29, 21, -9, 26, -30, 71, -19, 17, 39, 20, -61, 39, 75, -37, 56, + -6, 34, -10, 4, 24, -85, 19, -60, 47, 71, 11, -12, -27, 65, -37, 29, + 63, -16, 39, 0, -54, 83, -94, 61, -11, 27, -78, 12, 27, -21, -34, -68, + 77, -24, 44, 2, -9, -35, 73, -65, -36, -14, 10, 7, -44, 37, -32, -32, + 15, -47, 52, -36, 31, 30, 0, 41, -16, 0, -45, -13, 82, -61, -55, 33, + -20, 12, 16, -66, 29, -41, -25, 70, -23, 19, -57, 65, -47, 15, -29, 32, + -8, -37, -19, -3, 56, 63, -56, -23, 3, -5, 16, -35, -8, 29, -27, -52, + 1, 13, -59, 20, -56, -26, -44, 25, 18, -9, 48, -63, 77, -89, 81, -10, + -50, -53, 58, -80, -6, -36, 8, 16, -3, -69, 92, 9, 57, -65, 57, -32, + -74, 59, 14, -28, 16, -55, 92, -102, 5, 38, -20, 13, 40, -39, -53, 93, + -67, 65, -80, -3, -34, 0, 80, 0, -12, 75, -25, -24, -20, -31, 9, -10, + -21, -9, -3, -23, 8, -2, 6, -50, -22, 8, 24, -67, 30, 31, -72, 76, + 30, -51, -31, 32, 1, -10, -38, 82, -67, 43, -42, 49, -51, 39, 67, -19, + -32, -24, 30, -1, 37, -95, 52, -87, 52, 13, -26, -14, -57, -42, -41, 83, + -30, 1, 14, 63, -71, -48, 52, -51, 100, -84, 69, -96, 54, -1, -2, -7, + -50, 53, -6, 14, 67, -5, 67, -19, 68, -69, -27, -18, -22, -5, -61, 42, + -33, -35, 60, -23, -11, 10, -5, -46, 27, -44, -38, 27, -68, -16, 37, -56, + 2, -17, -40, -10, 26, 83, -70, 72, -67, -29, -44, 29, 23, -30, -23, 48, + -78, 38, 22, -21, 24, -36, 52, -61, 17, 11, 22, 10, -29, -20, 45, 15, + -21, 63, -70, -8, 47, -49, -37, 89, -11, 28, -13, 40, 6, 13, -8, 33, + 3, -1, -58, 70, -23, 18, -68, -35, 8, 17, 70, -47, -37, 62, 26, 10, + -3, 17, -38, 22, 38, 15, 20, -82, 64, 8, 59, -21, 19, -12, 7, -62, + 46, -34, 66, -43, -32, -73, -3, 38, 40, -31, 51, 62, -62, 23, -5, 40, + -24, 57, -38, -14, 6, 47, -3, -29, 32, -45, 69, -57, 47, -27, -19, -13, + 49, -22, 19, 69, -18, -28, 49, -49, 5, 41, -87, 35, -39, 40, -63, 42, + 30, -38, 75, -63, 10, 10, -29, 66, 30, -23, -51, 10, 9, 23, -30, -34, + 20, 56, -63, 103, -41, -32, -55, 24, 27, -39, -30, 63, 27, 4, 12, 21, + -64, 55, -13, 15, -65, 79, -64, 70, -41, -8, -19, 66, 1, 22, -4, -28, + -1, 36, -21, 31, -11, 25, 2, -37, 37, 25, -36, 45, -42, 69, -77, 5, + 18, -12, -13, 35, -25, 59, 0, 27, -55, -41, 26, 54, 39, 66, -8, -11, + -12, 34, -21, -42, -7, 70, -17, -33, 5, 31, 6, 61, -22, 30, -46, 13, + -12, 4, 37, -17, -37, 7, -61, 5, -39, 37, 0, 13, 40, 14, 53, -65, + 46, -2, -27, -27, -20, 48, -60, 55, -47, 82, -19, 33, 1, 46, -64, 95, + -57, 88, -38, 16, -46, 15, -47, 67, -15, 24, 0, -43, -2, -5, 15, -43, + 28, 14, -75, 40, -35, -1, -16, 18, -69, 72, -65, 43, 8, -13, 20, 19, + 6, -24, 2, 23, 14, 22, 34, -37, -29, -37, -13, 7, -43, 0, -23, 50, + -48, 44, -14, -14, -62, 55, 56, -24, 53, -30, -27, 36, -38, -31, -15, -4, + -28, 60, -6, -15, 17, -43, 14, 63, -77, 27, -74, 15, -41, 47, -34, 15, + -5, 27, 17, -7, 24, 51, 17, -23, -5, 1, -52, -13, -3, -26, 35, -6, + -33, -25, 42, 15, -6, -2, 2, 49, -69, 37, -36, 28, -16, 38, -54, 73, + -5, -37, 44, -88, 72, -6, 29, -32, 33, -6, 51, -57, -21, 29, 28, -26, + -62, 53, -80, 70, -48, 21, -13, -17, -43, 22, 38, 9, -7, -44, 56, 51, + -53, -32, 91, -112, 58, 25, -3, -3, -3, -19, 32, -42, 43, -81, 69, -86, + 119, -90, 62, -74, 72, -42, 23, 17, 36, -4, 40, -44, 10, -7, -43, 45, + 34, -84, 59, -45, 43, -97, 60, -31, -3, -9, 35, -68, 14, 2, -9, 3, + -36, 44, 2, -45, -37, -3, -51, 62, 15, 52, -43, -8, -62, 6, -66, 41, + -49, 28, -27, -26, 68, -76, 16, -9, 24, -60, 31, -63, 18, 5, 46, -41, + 19, -13, -46, 17, 16, -38, 64, -31, 75, 3, 17, -53, -42, 11, 13, 10, + 26, -74, 89, 27, -14, -35, 47, -4, 0, -50, 3, 11, 18, -10, -15, -16, + 31, -70, 60, 46, -16, 31, -31, -12, -32, 52, -4, 31, 17, -18, -16, 0, + 1, -26, 62, -18, -8, 23, -40, 56, 71, -93, 78, 0, -57, 90, -81, 48, + -56, -40, 58, -16, 18, -103, 68, -84, 101, -2, 16, -23, 15, 26, 49, -39, + -35, 11, 25, 27, 8, -80, 43, -22, -51, 70, -48, -11, 51, 4, -20, 61, + -22, -62, 18, -40, -24, 25, -29, -67, 56, 17, 22, 9, 17, -1, 21, 36, + -50, -13, 3, 13, 0, -46, 52, 8, -39, -18, -30, 48, -4, 10, 16, 41, + 38, -47, 33, -4, 6, -16, -48, 0, 48, 25, -55, 39, -47, 26, -28, 1, + -16, -13, -52, 53, 1, -58, -1, 54, -55, 35, 3, 43, -31, 4, -15, 38, + 12, -9, 44, -51, 30, 20, 8, -1, 14, -15, 16, -5, -13, 6, -78, -1, + 17, -21, -46, 91, -58, 17, 9, -15, 18, -1, -42, 20, 0, 41, 2, 4, + -30, 6, -9, 91, -64, -36, -17, -27, 10, -27, -20, -34, 52, -39, 30, -58, + -38, 79, -56, 31, 13, 57, 42, -42, 4, -73, 14, 51, 33, -15, -36, 65, + -7, -20, 29, 13, 43, -19, -38, -11, 17, -46, 30, 14, 28, -38, 56, 15, + 39, 28, -14, 7, 23, -15, 40, -53, 20, 17, -45, -14, 24, -33, -7, -24, + 89, -80, 52, -6, -38, 62, -81, -14, -70, 11, 2, 21, 39, -2, 1, 6, + -52, 70, -87, -20, -9, 59, -45, 50, -14, 13, 25, 1, 7, -41, -49, 32, + -69, 69, -73, -11, 3, -46, 46, 8, 28, -20, -33, -15, 32, -16, 68, -50, + 44, -52, -4, 32, 36, 12, 10, -42, -47, 43, -103, 57, 20, -76, 19, -5, + 47, 17, -49, -32, 29, 25, 40, 21, -23, -63, 50, 39, -9, 13, -70, -31, + 59, 24, -66, 37, -34, 84, -93, 59, -13, -68, 39, 46, -58, -26, 36, -74, + 61, 45, -11, 29, 35, -4, -1, 80, -6, -58, 50, -91, 61, -80, -16, 21, + 8, 11, 4, -46, -8, 42, -80, 49, 21, 32, -11, 65, -54, 2, -38, -24, + -15, 0, 1, 20, 34, -80, 67, -38, -32, 21, 4, -30, 13, 17, 59, -40, + -1, 33, 3, 15, -49, 46, 4, -53, 45, -32, -54, 17, 29, -65, 26, 5, + -32, -6, 33, -27, 7, -19, -13, 41, -62, 32, 8, 17, -18, 39, 66, 17, + -26, 16, -4, 16, -71, 66, -15, 40, -65, 57, -27, 21, 14, -78, 9, -52, + 56, -26, -9, -75, 27, 40, 45, 22, -14, 45, 16, -38, 32, -19, 35, 30, + 63, -64, 49, -46, -25, -77, 33, -37, 28, 61, 21, -25, -38, -1, -6, 4, + -13, 13, 39, -74, 5, 42, 57, -56, 50, -1, -29, -40, 45, -32, -27, 4, + -67, 7, 0, -34, 48, -34, 31, 31, -24, -21, 73, -38, 52, 12, -19, -8, + -75, 78, -41, 26, 44, -51, 100, 17, 58, -68, 49, -48, -40, -14, -51, 0, + 64, -16, 60, 53, -51, 26, -16, -14, -55, -33, 7, 25, -16, 15, 49, 2, + 36, -24, 33, 16, 21, 20, -29, -39, 50, -44, 64, -42, 18, 26, -19, 13, + -19, 43, -26, -6, -55, 19, 40, -45, 62, -47, 76, -25, -61, 98, -66, 50, + -72, 37, -12, 62, -45, 28, -49, -8, -50, 79, -72, -8, -24, 18, 40, 54, + -43, -20, 21, -2, 58, -70, 39, 13, 12, 63, -39, 21, 18, -5, 38, -38, + -11, 0, -49, 44, -44, 9, -46, -29, -15, -3, 39, 24, 39, 0, 34, -40, + 74, -85, 60, 35, -22, -5, 22, -69, -11, 35, 44, -84, 1, 46, -32, -33, + 1, -19, 43, -48, -13, 70, -2, 30, -28, 3, 30, -62, 95, -80, -31, 71, + -30, -14, 20, -29, 50, -56, 22, -22, -39, 39, -12, 27, -35, 21, 18, -6, + 30, 3, -46, 14, 4, 47, -52, 47, -20, 7, 5, -45, 59, -54, -65, 54, + -43, 18, -4, -47, 97, -83, 29, -46, 67, -96, 83, -73, 37, 39, 53, -6, + 18, -63, 77, 50, 42, -86, 35, -50, 32, -29, 6, -11, -23, 7, -44, 30, + -77, 51, -47, -4, 38, 43, -11, -2, 16, -70, 22, -13, -7, 8, 36, 7, + 18, 5, -2, 17, 34, -85, 37, -10, -2, -57, 61, 28, 20, -51, 10, 34, + 42, -5, 55, 2, -27, 6, -25, -44, 43, 33, -35, 53, -60, -29, -10, 44, + 46, 8, -38, -20, 20, -32, -47, -19, -58, 36, 22, 27, 61, 2, 24, 22, + -79, 23, -51, 22, -33, 5, 2, 12, 61, 35, 6, -61, 40, -12, 10, -9, + 4, -22, -21, -7, -24, -4, 23, 18, -26, 10, -27, -16, -18, -68, 80, -74, + 58, -68, 17, 10, 5, -45, 0, -6, 19, 21, -37, 32, 13, -10, -9, 52, + -10, 45, -57, 62, -72, 46, -28, 8, -13, 16, 27, 6, 51, -33, -11, -31, + 41, -19, -9, -50, -4, 16, 12, -3, 4, -54, -46, 53, -10, 6, 37, -41, + 54, -31, -49, 79, -58, 34, 18, 39, 17, -21, -34, -30, 13, 14, 0, -7, + -58, 60, -73, 2, -22, 42, 16, 51, -34, -46, 8, 17, 65, -22, 76, 9, + 39, -70, 4, 37, 25, -77, -34, 69, -42, 3, -59, 72, -72, 50, 57, -78, + 45, -37, -4, 11, 32, -14, 13, 47, 28, -16, 5, -6, 53, -21, -23, 31, + -34, 33, -1, 8, -74, 66, -29, -40, -7, -12, 54, -18, -61, 52, -31, -12, + 38, 27, -27, 43, -27, -18, 72, -67, 30, 7, 27, 16, -39, -32, -22, 28, + -63, 84, -70, -74, 56, 1, -13, -40, 49, -61, 7, 47, 24, 4, -32, 14, + 1, 27, 25, -55, 68, -47, -16, 6, -5, 75, -68, 58, -71, 16, -14, -67, + -18, 23, -43, -39, 53, 0, -4, 5, -28, 54, -39, -43, 5, 18, 56, -66, + -14, -24, -22, 1, 4, 12, -14, 9, -26, -30, -28, -16, 52, 27, 8, -5, + -55, 35, 25, 32, 59, -49, 21, -8, 73, -4, -17, -30, -43, -28, 5, 18, + -12, 47, -6, -34, -6, 0, -8, 7, -34, -10, -31, -2, 43, -33, -11, 51, + -56, -19, 60, -33, 31, -30, 5, 4, -54, 52, 35, 11, 4, 54, -72, 72, + -25, 17, 39, -2, 50, 0, -8, -19, 32, -29, 22, 37, -54, -26, 32, -55, + 7, -5, 11, -47, 64, 21, 8, 41, 3, -13, -22, -26, -55, 8, 56, 15, + -79, 92, -58, 68, -35, 25, -50, -33, -57, 67, 64, -46, -23, 46, -48, 41, + -59, 21, 74, -44, 4, 21, -48, -19, -60, 31, -3, -19, -49, -13, 51, -35, + -10, 21, 56, -14, 24, -52, 6, 16, -51, 14, 27, -55, -43, -13, -72, -8, + 8, 35, 8, -49, -34, 65, 2, -18, -33, 62, 9, -22, -11, -35, -5, 37, + -28, -14, 46, 15, -29, 18, -26, 7, -25, -18, 47, -37, -33, 76, -67, -16, + 50, 4, 29, -42, 33, -53, 19, 62, -21, 7, -26, 28, 9, 5, 53, 37, + -103, 47, -20, -8, 41, -32, -33, 73, -20, -14, -56, 68, -37, 16, -49, 92, + -95, 60, -31, 47, -38, -30, 38, 2, -25, 79, -31, -45, -21, 54, 13, -28, + 31, -27, -34, 11, -27, 27, -40, 39, 6, -35, 11, 7, 28, 7, 20, 50, + 28, -61, 19, 81, -60, -41, 20, 0, 34, -22, 24, -4, 6, -3, -56, 20, + 69, 2, -25, -24, 45, -7, -43, -1, 57, 40, -27, 21, -1, -75, 31, -31, + -4, -45, -20, -16, -52, 32, 50, -47, -5, 10, -21, 36, 48, 8, -39, 16, + 28, -9, -38, 56, 38, -21, 0, 6, 38, 1, -5, -19, -8, 63, -13, -15, + 44, -10, 27, -72, 5, 59, -48, 63, -31, 18, 30, -54, -5, -54, 98, -70, + 53, -89, 58, -54, -27, -52, 91, -68, 29, -21, -19, -20, -8, 45, 25, -32, + 30, 18, -43, -30, -24, -34, -64, -18, 43, 0, 36, -48, 57, -17, -55, -7, + 45, -55, 43, 36, -40, 8, 39, 39, 46, -48, -39, 2, -20, -51, 5, 39, + 33, 18, -45, -51, 84, -81, 41, 35, 57, -41, 52, 0, 54, -38, -52, 32, + -34, 53, -57, 16, -4, -14, 1, -11, 33, 18, 18, 19, 71, -41, 70, 5, + 13, 8, 19, 36, 59, -49, 7, 9, 10, -3, -10, 6, 18, 30, -18, -48, + 19, 9, 17, -85, 72, -49, 31, 9, -57, 17, -30, 65, 0, -59, 37, 15, + -51, 0, -53, 68, 3, 23, 16, -10, -14, 6, 3, -63, 55, -32, -64, -14, + 49, 2, -27, 56, -81, -1, 41, -88, 48, -63, 84, -52, 7, 20, 22, -51, + 41, 4, -13, 27, 19, -13, -43, 59, -21, -15, -55, 17, 60, -99, 41, 11, + 37, -23, 16, 32, 9, -46, 91, -41, -39, 83, -29, 31, -31, 65, -55, -7, + 31, 29, -40, -46, 39, 13, 2, -39, 67, -33, 7, 18, 0, 17, 6, -8, + -49, -11, 3, 26, 4, -27, 42, 20, -55, -42, 11, 62, -39, 75, -49, 83, + -38, 49, 12, -8, -5, 30, -32, -6, -23, -58, 79, -44, -10, -12, 52, -31, + 14, -39, 6, -47, 21, -13, -56, 38, -36, 2, 30, 20, -2, -77, 3, -10, + -2, 53, 1, 56, 18, -65, -49, 52, -30, -23, -45, 50, 35, -18, -3, -24, + -35, 61, -27, 22, 44, -32, 5, -59, 67, -66, 77, -38, -2, -23, 52, -43, + 6, -15, 50, 52, -12, 70, 11, 54, -87, 55, -28, 0, 26, 33, 55, -32, + 31, -22, -38, -20, 14, 15, -5, -25, 62, -35, 48, -49, 75, 27, -24, -26, + -25, 0, -32, 83, -65, 62, 0, -42, 32, -56, 43, -19, 48, -17, 65, -31, + 38, -86, 94, -56, 43, 9, 22, 29, -55, 41, -79, 77, -75, 29, -46, -30, + 11, -46, -5, -52, -45, 61, -47, 45, 36, -71, 12, 10, 0, -3, 1, 9, + 49, -45, 17, -13, 31, -30, -40, 38, 62, -61, 60, -96, 32, 47, -37, -14, + -28, 27, -7, -9, -11, 5, -27, -35, 54, -52, -6, 30, 26, -17, 73, -33, + 41, -19, 23, -31, 93, -54, 21, 57, -6, 10, 57, -49, 36, -38, 0, 40, + 20, 25, -37, -17, 2, -10, 42, -23, 11, 29, 66, -36, -48, 63, -2, -81, + 0, -19, 24, -17, 35, -26, -18, -53, 87, -69, -34, -4, -5, -16, -28, 6, + -19, -35, 59, 19, 17, 0, -42, -7, -26, -39, 22, 15, -61, -8, 20, 34, + -44, 62, -58, 46, -64, 28, -14, 31, 27, 52, -37, -43, -37, -44, 34, -19, + 15, 0, -42, 4, -26, -11, 32, -16, 37, 31, -61, 9, 51, -61, -17, 58, + -11, 23, 5, 21, -46, 11, 11, 52, -51, 49, -73, 25, -52, 75, 30, 31, + -26, -66, -27, -19, -17, 71, 59, -76, 40, -38, 66, -11, -45, -29, 0, 34, + 65, -58, -35, 41, -23, 46, 27, 34, -3, 54, -81, 33, 26, -77, 36, -32, + -40, 34, -55, -12, 16, -58, 10, -40, 6, -15, 27, -13, 26, -49, -41, 15, + -35, 22, -24, 63, -30, -27, 37, -57, -69, 42, 0, 51, -87, -22, 81, -33, + 5, -34, 53, -86, 48, -26, 25, -47, 67, -67, 8, 18, -37, -14, 39, -26, + 49, -20, -6, -20, 16, -41, -13, 37, -48, -36, 25, -72, 38, -13, -40, 67, + -11, 73, -76, 45, -10, -7, 16, -40, -37, 51, 6, 18, -17, 60, -46, 0, + -62, 18, 13, -6, -2, 73, -39, 49, -63, 61, -6, 47, -89, 48, 8, 41, + 19, 26, 2, 0, -49, 57, 6, 13, 49, 16, -8, -4, -31, -19, 26, 5, + -60, -14, 55, -2, -42, -5, 4, -12, -52, -21, -29, -3, -42, 73, -40, -73, + -6, -3, -24, 54, -39, 74, -39, -19, -12, -16, 2, -9, 68, -51, 62, 30, + -1, 47, -7, -35, -51, 60, 18, 3, -50, 81, -4, -24, 27, 29, -8, -3, + -55, 31, -50, 15, -22, -10, 55, 23, 38, 2, -13, 2, 48, -14, 7, 1, + 0, -35, 32, 14, 2, -17, 42, -31, -34, -22, 3, 66, 37, 63, -28, -31, + 18, -5, 14, 93, -59, 17, 9, 36, -55, -19, 10, 16, 19, -20, 7, -43, + 42, -56, 43, 36, -14, 54, -61, 25, -34, 52, 24, -55, 70, -81, -28, -31, + 8, 81, -33, 14, -7, -49, -10, 33, 35, -38, -7, -11, 20, 61, 12, -41, + -57, 23, 56, -9, -17, -21, -54, 10, -74, 35, 17, 38, -13, 78, -18, 0, + 59, -2, 88, -39, 58, -35, 65, -15, 36, -50, 39, -57, -8, 20, 15, -13, + 75, -68, 77, -47, 53, -76, 36, -6, 67, -9, 2, -11, 3, 75, -81, 5, + 0, 59, -9, 33, -4, 7, -52, -38, 21, 41, -19, -48, 9, 16, 6, -46, + 53, -28, 13, -5, 9, 6, -23, -34, 59, 1, 50, -2, 16, 23, 28, -53, + 30, -53, 81, -78, 89, -66, -4, 14, 42, -37, 24, -43, -18, -36, -1, 71, + -6, 41, -71, 67, -53, 0, -3, -12, -31, -45, 7, 3, 77, -19, -68, 6, + 12, -45, -56, 40, -27, 1, -5, -47, -67, -12, 3, -13, 21, 33, -47, -40, + 40, 13, -73, 21, 33, 0, -59, 78, 8, 21, 9, 36, -44, 51, -23, 51, + 58, -6, 27, -70, 76, -67, -16, 79, -20, 28, -64, 72, -57, -15, -70, 19, + 14, -38, 23, -7, 44, -9, -11, -15, 14, -59, 53, -42, 56, -71, -27, 61, + -14, 66, -41, -21, 50, -38, -3, -22, 36, -12, -6, 51, -42, -25, 25, -52, + 70, -25, 0, 11, -22, -35, 42, 11, -10, -6, 70, -100, 21, -93, 81, -26, + -39, 57, -35, -48, -4, 35, -46, 78, -47, 45, 26, 13, -32, 26, 46, -26, + -20, -21, 5, -58, 11, -7, 20, 23, -49, -5, -23, 3, 13, 5, 11, 24, + 3, -80, 68, -5, 48, -39, 49, -71, -54, 48, 42, -2, -15, -22, -5, -8, + 75, -67, 37, -47, 60, -44, 39, 7, 53, -40, -22, -33, 49, -75, 2, -11, + -17, -24, -71, -36, -4, 42, -74, 4, -32, 32, -3, 54, -11, -8, 2, -34, + -7, 67, -48, -3, -66, 79, 1, 48, -66, -9, -17, 61, -67, 25, -13, -8, + 53, -78, 11, -8, -63, 45, 65, 3, 10, 33, -53, 99, -80, 22, -72, 17, + -37, -22, 37, -8, -40, 40, -22, 0, 18, -10, -9, -28, -10, 1, 28, -16, + 57, -49, 5, 46, -73, 49, -28, 38, -22, 0, 26, 14, -49, 98, -75, 13, + -29, 40, 30, 0, 17, -11, -36, -19, 67, -15, 20, -2, -45, -11, 40, 39, + -4, -6, 48, 47, -25, -28, 21, 19, 61, 25, -5, -53, 15, -12, -7, 85, + -42, -4, 23, 49, -32, 21, -13, 13, -74, 41, 31, -39, -16, 22, -51, 43, + -62, -53, 35, 14, -21, 29, -6, -18, -17, 30, -63, 42, -47, 44, 27, 13, + -65, 0, -23, 35, -85, 77, -6, -13, 55, -31, -33, 42, -15, 26, 34, 19, + 7, -22, -34, 36, 29, 2, -47, -9, -33, -5, -34, -19, 67, 24, 51, -62, + -1, -2, 39, -30, 24, -46, 13, -24, -54, 71, -101, 60, -32, 70, 7, -30, + -17, 9, 66, -9, -56, 43, -36, -25, -21, -2, 7, -44, -9, -3, -55, 49, + -62, 82, 54, 28, -51, 3, 17, -43, 21, 30, 44, 10, -7, -6, 38, 34, + -28, 83, -79, 11, 33, -12, 15, 45, 45, -45, -32, -56, 46, -12, 30, 9, + -38, 57, -65, 8, -37, 59, -11, 14, -24, 9, -2, 73, -61, 16, 31, 2, + -45, 24, 39, 59, -55, -4, 33, 20, 3, 0, 21, -37, -21, 31, -54, 44, + -13, -63, 46, -31, 68, -97, 44, -89, 51, 10, -45, 11, 8, 31, -64, 69, + -58, 49, 18, 19, 6, -13, -39, -25, -3, -37, 35, -28, 50, 15, 47, 31, + 18, 28, -48, 9, 67, -66, 52, -18, 5, 41, -37, -10, 27, -31, -16, -22, + -50, 64, -14, 27, -14, 63, -72, 60, -62, 46, -44, 60, -16, -26, 62, -24, + -20, -60, 46, -54, -1, 6, 21, 65, -51, 49, -23, -38, -11, 24, -45, 4, + -7, 41, -8, -67, 61, -10, 38, 33, -63, -28, 72, -16, 43, 2, 22, -81, + 81, 2, -34, -57, 40, 12, -17, 13, 36, -1, -51, 58, -42, 50, -14, 29, + -4, 52, 3, -39, -21, 49, -38, 17, -78, 70, 23, 35, 10, -53, 39, -5, + 21, 32, 40, -3, 21, -43, -35, -48, 11, -26, 51, -39, 49, -71, -8, -14, + 24, 56, -30, 26, -17, -38, 90, 5, -28, 50, 6, -40, -32, -40, 2, 43, + -63, 17, -26, 12, 3, 3, 47, -41, 83, -46, 50, 32, 19, -66, -2, -30, + 49, -14, -63, 6, 46, 25, 51, -39, 49, -39, -28, 52, -24, 48, 0, 12, + 25, -54, -47, -63, 15, 52, -36, 42, -28, -61, -27, 59, -59, 34, -70, -32, + -10, -39, 36, -25, -44, -17, -46, 28, -26, 28, -4, 53, -1, -39, -41, 62, + -56, -19, 56, 19, -30, -37, -44, 11, -33, 40, -42, -27, -25, -3, -9, 7, + 26, 36, -40, 16, -53, 62, -53, 35, -24, 56, -56, 81, -85, 36, 27, -48, + -11, 44, 32, -10, 0, 27, 34, 61, -35, 2, -2, 16, -8, 26, -17, -26, + 19, 43, -40, -52, 38, 6, 49, -11, 28, -7, -26, 31, -31, -55, 41, -53, + 17, -24, 36, -10, -30, 38, -50, 74, -90, 23, 6, 44, -53, 66, -18, -18, + 50, -2, -48, 38, -70, 65, -85, 70, -13, -28, -1, -11, 2, -16, 33, -79, + 66, 4, -18, 3, -14, 60, -58, -5, -21, 28, -31, 62, -13, 54, -57, 24, + -21, -8, -50, 22, -15, -21, -14, 13, -38, 56, -106, 64, -60, 29, 14, -57, + 2, -41, -20, 55, 24, -19, -21, -30, -62, -13, 53, -7, -35, -31, -19, 5, + -16, -71, 62, 8, -32, -9, -10, -9, 101, -49, -40, -55, 41, 37, -40, -14, + 29, -18, -51, 24, 24, -38, 69, 30, 11, 29, -67, 34, 31, 19, -6, -53, + -7, -47, 19, 2, -28, 76, -64, -19, 84, -39, -16, 68, -62, 37, -34, 34, + 33, -18, 40, 1, 26, -1, -35, -5, -33, 34, -33, -24, -49, 55, -46, 27, + 2, 38, 3, -49, 16, -38, -47, 6, -15, 36, -10, 16, -35, 17, 8, -53, + -7, -2, 52, 46, 28, -49, 16, -70, 55, 51, 13, -58, 6, 14, 67, -20, + 35, -35, 20, -12, 37, 36, 72, -47, 13, -38, 17, -2, -41, 17, 49, -57, + 33, 34, -34, 4, 49, 15, 40, 36, -3, -52, 79, 29, 24, 50, -20, 26, + -93, 27, 13, 12, 36, -8, 43, -44, -38, -34, 55, -58, 45, 8, 20, 18, + 13, -56, -34, -33, 16, 20, -57, -56, 99, -40, -17, 26, 28, -6, -39, 63, + -7, -52, 39, -34, 71, -56, 17, -45, 53, -32, 0, 29, -41, 16, -33, 26, + -5, -12, 48, -48, -11, 52, -15, -43, 67, -5, -37, 32, 41, -56, 40, -7, + -8, -20, 32, -10, 0, 46, 9, -10, -54, 30, 40, -31, -4, -29, 58, 5, + -8, 2, 57, -63, 42, -68, -1, 16, -6, 10, -4, -31, 52, -103, 63, -34, + -17, 5, 26, 29, -18, -25, -39, -4, 34, 25, 52, -61, -23, 13, 0, 58, + 7, -1, 88, -98, -5, -12, 24, 55, 33, 43, -32, 23, 73, 2, -26, -1, + 29, 56, -99, 37, 46, -45, 0, 51, -81, -39, 95, -41, 34, -14, -6, -32, + 56, -46, 12, -15, -21, 51, -33, -28, 4, -8, 61, 13, -61, -77, 66, 32, + 58, -59, 41, 34, -15, -56, 31, -37, -37, -1, -18, 29, 16, 32, -64, 13, + 38, -27, -70, 26, -36, 4, 38, 73, -63, 28, 23, -40, 55, -6, 48, -38, + -3, 24, -36, 43, 0, 0, 44, 24, 24, -47, 17, 21, -74, 61, -39, 105, + -36, 16, -4, -45, 40, -24, 8, 60, 27, -76, -40, 51, 56, -57, -10, 16, + 24, 13, 10, 21, -54, -28, -17, -53, 28, 35, -4, 19, 65, -80, 19, 56, + 3, -45, -7, -23, -42, 13, -57, -36, 42, -5, -77, 40, -38, -32, 2, -33, + 88, 12, 9, -53, -51, 60, -87, 53, 27, 38, -28, 1, 50, -49, -2, -10, + -25, 49, -1, 30, -31, 47, -37, 34, -62, -19, -27, 1, -25, -21, 23, -3, + -39, 4, 37, -26, -68, 49, -34, -35, -5, 18, 29, -45, 73, -44, 44, -18, + -19, 14, -48, 51, -18, -13, -11, 33, -13, 18, -26, -58, 36, 16, 15, -74, + 95, -58, 12, -47, 28, -49, -42, -33, 83, 18, -19, 56, -55, 28, -15, -43, + 73, -5, -45, -3, 49, -7, 66, -66, 86, -72, -14, 15, -7, 47, 27, 16, + 68, -78, 35, -3, -13, 53, 27, -35, 10, -18, -35, 52, 28, 17, -52, 42, + -66, -10, -47, 86, 51, -12, -38, 26, -58, 2, -3, -70, -12, -23, 39, -53, + 1, -16, 44, 21, -16, 40, -5, -26, 81, 20, -80, 49, -30, 7, 35, -30, + -13, 44, -37, -23, 55, -20, -3, -20, 56, 3, -57, -23, 56, 43, -2, -49, + -3, 8, -15, -45, -42, 55, -28, 78, -25, 0, 28, -36, 27, -54, 61, -6, + -64, 54, 58, -67, 50, -60, -41, -39, 14, -29, 40, 6, -16, -33, 8, 38, + 44, -54, -28, 28, 14, -24, 42, -117, 76, 12, -12, 4, 45, -49, 3, -53, + 6, 5, -52, 52, -23, 3, -15, -66, 35, 54, 15, -48, -39, 15, -23, -29, + 20, -6, -53, -22, 38, 54, -38, 54, -33, 30, -8, -6, -84, 95, -25, -40, + -26, 13, 39, 13, 18, 25, 19, -10, 45, -42, 73, -92, 16, 65, -25, -21, + -46, -53, -24, 71, -63, 37, 19, -29, 31, -68, 52, 8, -54, 2, 72, -61, + 49, 9, 44, 3, 38, 2, -14, 15, 23, 48, 18, -19, 60, 14, 18, -45, + 97, -35, -64, 55, 62, -12, -3, 39, 39, -41, -9, 25, -5, -34, 56, 5, + -52, 79, -64, 53, 10, -10, -6, -35, 12, -46, 77, -40, 40, -42, -16, 31, + -7, -4, 9, -9, 49, 33, 64, 16, -82, -17, -17, 11, 38, -10, -52, 48, + -67, -20, 37, -2, -2, -65, 36, 19, -63, 50, 19, 17, 46, -80, -6, -42, + -42, 53, 27, -32, 25, -18, 21, 6, 65, -61, -6, 10, -15, -6, -26, 21, + 5, 76, -43, -44, -48, -44, 50, -54, 48, -39, 61, 20, 29, -35, 52, 79, + -41, 55, -56, 42, -28, -32, 12, -26, -35, 4, 45, 19, -35, -37, -26, 28, + 67, -40, 20, 44, -15, 10, -41, -44, 32, -84, 86, -7, -25, 35, -25, 27, + 6, 14, -29, 74, -1, 16, -59, 42, -59, 63, -5, -6, 42, 33, -84, 82, + -48, 8, 15, 37, -87, 83, 37, 22, 25, 10, -51, -24, 30, 12, 32, -32, + -66, 90, -73, 39, 0, -57, 16, 86, -66, -15, -24, 37, 43, -41, 57, -23, + -31, 10, 34, -56, 31, 5, -39, 38, -39, -42, 3, 11, 46, -33, 74, -60, + 38, -56, 43, 57, -59, -10, 57, -70, 45, -26, -18, 27, 58, -70, 27, 12, + 44, -40, 50, -54, 29, 0, -29, 47, -57, -10, -1, 79, -21, 18, -78, 80, + 19, 45, 35, 27, -45, 79, -88, 78, -61, -1, -4, 33, -23, -37, -25, 47, + -47, -26, -41, -42, -64, 32, -54, -16, 39, 14, -40, 3, -37, -26, 20, -13, + -53, -10, 69, -24, -67, 59, -29, -21, -55, 73, -51, 2, 23, -17, -4, -40, + 46, -15, -30, 21, -79, -7, 59, 42, -59, -6, -26, 1, -27, 24, -13, 5, + -37, 0, 35, -49, 1, -86, -13, -18, 61, 43, -45, 27, -77, 6, 44, 3, + 59, -36, 1, 39, -17, 7, 25, -25, 35, -108, 82, -104, 28, 11, 21, 42, + 50, -47, -34, 16, -22, -17, 28, -65, -33, 76, 19, -54, 1, 2, 50, -79, + 26, -90, 101, -50, 61, 23, 27, -48, 29, 43, -44, 15, -42, 51, -48, -58, + -24, -14, -13, -46, 57, -31, -14, 91, -89, 78, -75, 16, 7, 44, -9, -24, + -70, 32, -21, 15, -33, -55, 67, 18, 57, -8, 6, -19, -45, 27, -16, -31, + 47, 1, -22, -26, 21, 33, -34, 41, 29, -32, -24, -16, -55, 31, -11, -13, + -33, 70, -65, -1, 105, -68, -51, 48, -40, 30, 66, -25, -7, -44, -6, -63, + 27, 1, 9, 0, 0, 74, -40, -23, 5, 10, -11, 11, -87, 40, 12, -54, + 17, 45, -31, 38, -81, 57, -10, -28, 19, 5, 12, 29, 27, -62, 63, -12, + -44, 6, 38, -17, 35, -49, 17, 21, -19, -17, -22, -19, -41, -21, -4, 39, + -40, -18, 12, -23, -61, 73, -26, 22, 11, -18, 29, -65, 14, 6, 15, 1, + -57, 2, -53, 8, 10, -46, -2, 32, -17, 51, -50, -15, 39, 56, -36, 37, + 13, 43, -47, 93, 14, 26, 38, -8, -52, -22, -3, -16, 76, -43, -9, -45, + 63, 0, 22, -49, 7, 59, -83, 92, 14, -34, -1, -35, 71, 22, -58, 54, + -38, -7, 45, 41, 64, 0, -68, 30, 26, 27, -1, 9, 6, 11, 28, 8, + -14, -3, 10, 52, -35, 65, 19, 64, -85, -16, -35, 52, 37, -29, 46, -64, + 12, 28, -49, -20, 86, -62, -10, 25, 19, 74, -19, 32, 24, -37, -28, -65, + -13, 46, -29, -43, 8, 36, 21, 23, -35, -47, 11, 60, -12, -31, 20, 25, + 36, 67, -91, 88, -69, -9, -12, 52, -40, -69, 21, -39, -6, 33, -33, 97, + -19, -32, 62, 58, -62, 54, -28, -66, 61, 27, -45, 0, -35, 34, 54, -27, + 81, -32, -30, 41, -18, 60, -43, 38, -81, -6, -33, -15, 47, -14, 14, -33, + 6, -50, 55, 37, -46, -37, 89, -72, -36, 78, -40, 22, 60, -55, 51, -5, + 5, -42, 47, -46, -44, -18, 107, -57, 8, -71, -19, 44, -45, 24, 53, 27, + 32, 10, -6, -44, -23, -1, -26, 9, 12, -49, 54, -14, 31, -12, 49, 29, + 35, -36, 47, 17, 4, 16, 20, 5, 45, -31, 25, -32, -61, 82, -73, 68, + -14, 63, -75, 31, -48, -40, 68, 4, -17, 32, 40, 38, -8, 52, -9, -31, + -15, 11, -51, 84, -1, -54, 55, -49, 13, 21, -21, 51, -24, 6, 4, 33, + -38, 44, -6, -13, 11, 2, -51, 59, -45, -56, 51, 46, -72, -13, -25, -11, + 28, -16, 6, -75, 21, -68, 11, -26, 22, 13, 12, 56, -49, 1, 53, 40, + -34, -11, -37, 77, 14, -59, 76, -91, -29, 4, 54, -2, -61, -33, 45, 27, + 20, -45, -36, -20, -51, 5, -6, 44, -41, -28, 26, -24, 33, -10, -13, -61, + 66, 0, -36, 19, 38, -99, 27, -85, 52, 26, -17, 7, 20, -72, 42, -13, + -47, 29, -2, 5, -86, 83, -55, 4, -8, -54, -20, -35, 30, 0, 10, 48, + 39, -12, 5, 38, 27, -60, 22, -37, 68, -22, -18, -10, -41, 52, 18, -30, + -4, -51, 38, 5, -48, 45, 36, -58, 61, 55, 0, 26, 14, -55, -5, -52, + 14, 69, -73, -8, -54, 53, 13, 86, -111, 69, 7, -18, 54, -72, 12, -29, + -21, -48, 55, -48, 58, -43, 22, 22, 20, -6, 19, 54, -7, -37, 17, -44, + 41, -24, 0, -56, 29, 27, -67, 41, 0, -33, 43, -47, 29, -5, -21, 68, + 12, -31, -8, 5, 55, -62, -35, -35, -5, 95, -61, 54, 35, 22, -71, 44, + -76, 11, 46, 26, -69, 87, -74, 31, -12, 44, 10, -39, -62, 80, -112, 24, + -53, 28, -68, 36, -10, -21, 22, 16, -28, -36, 51, -50, 70, -75, -28, 28, + 14, -74, -7, 20, 75, -16, -52, 0, -68, 50, -13, -60, 39, -16, 26, 24, + 30, 28, 26, -31, -34, 29, -41, -7, 17, -62, 33, -38, -51, 34, -69, 45, + 9, -46, 24, 2, -2, 80, -59, 33, 36, 61, -96, 57, -24, 60, 14, -60, + 22, -19, 2, 53, 7, 50, -40, -5, 49, 18, 25, -79, 25, 47, -80, -12, + -29, 52, -42, -59, 37, -47, 40, 14, 51, 28, -20, -50, 97, -32, -14, -16, + -22, 80, -18, -7, 42, -9, 2, -7, -17, 11, 7, 36, -47, 36, -39, 62, + -15, 14, -24, -29, -11, 40, 52, -29, 39, -48, 14, 8, -43, 96, -66, 24, + 51, -26, 46, -40, 60, -44, 78, -27, -33, 68, -26, 22, 2, -10, 12, -82, + 25, -18, -7, -15, 0, -32, 64, -24, -14, 5, -39, 78, 12, -49, 0, -37, + 21, -19, -3, -33, 32, -20, -30, 57, -90, 4, -30, 49, -67, 61, 34, 75, + -23, -26, -2, 40, 20, -32, -19, -49, 65, -29, -37, -13, 15, 23, 31, -23, + 46, 37, -35, 15, -39, 69, -58, 11, -32, 43, -46, 6, 6, -31, 16, 32, + -40, 39, 30, -6, 8, -63, 48, -23, 6, 31, 36, -38, 3, -10, -10, -57, + -28, 20, 18, 4, -10, 59, 48, 65, 8, -76, 42, -49, -12, -33, -28, 86, + -64, 62, -60, 9, 51, -13, 47, -28, -10, -9, -40, 50, 14, -10, 54, 27, + -64, 13, -14, 0, -8, -28, 1, 33, -6, -46, 41, 4, -50, 75, -11, -50, + 36, 31, 16, -8, -53, -1, 70, -4, 57, -37, -7, 4, 36, -50, -33, 36, + -22, -16, -60, 45, -26, 8, 13, 28, 22, 41, -24, 73, 13, 73, -25, 1, + -7, 96, -74, 73, -11, -76, 35, -16, -16, -81, 93, -51, 3, -47, 62, 39, + 16, -33, 67, -91, 78, -53, 40, 30, -43, -41, -5, 63, -78, 77, -9, 26, + 59, -25, 29, 0, 31, -37, 55, -68, -43, 38, -47, 58, -62, -18, 14, 37, + -16, -60, 44, -41, 17, -37, 61, 8, 12, -5, -37, 33, 10, 23, -24, 19, + -12, -10, -50, 82, -22, 69, -117, 72, 21, -27, 4, 55, -25, -48, 31, 17, + -41, -46, 7, 4, -23, 10, -20, 6, -26, 44, -72, 53, -42, 17, -18, 55, + 36, -4, 31, -11, 5, 38, -33, -11, 43, 64, -25, -43, -48, 44, 44, -24, + 71, -53, 55, -26, 63, -69, 56, -56, 74, 22, -35, 6, -1, 33, -53, -35, + -36, 49, -32, 35, -9, 41, -38, 21, 29, -20, 26, 49, -48, 5, -40, -50, + -17, 39, 2, 22, -21, -51, 60, -91, 105, -76, 50, -28, 25, 19, -39, 24, + -22, 0, -12, -56, 10, 44, -15, 7, -10, -15, -34, -2, 18, -8, -19, 110, + -66, 48, -17, -26, -30, -18, -37, -64, -18, 82, -30, -18, 8, 55, -61, -41, + 20, -2, -36, -19, -22, 5, -17, 1, 19, -26, 68, -61, 56, -45, -48, 23, + 52, 51, -76, 95, -32, 39, -70, 47, -18, 0, 23, 59, -72, 30, 42, 19, + 3, -63, 27, 14, 57, -22, -42, 0, 48, -73, 50, 14, -57, 62, -16, -62, + 52, -27, 59, 19, 5, 46, 5, -35, -21, -4, -46, -4, -44, -54, -23, 31, + -27, -81, 41, -64, 3, 61, 15, -54, 62, -12, 39, -45, 40, -21, -41, -54, + 17, -28, -50, 28, -73, 18, -19, 4, -42, 7, 64, -48, 38, -37, -56, 44, + -62, 1, 35, -13, -20, 14, 15, -39, 90, -14, 17, -17, 27, -7, 4, -51, + 32, 22, 1, 30, -61, 83, -76, -39, -16, 63, 8, -25, -48, -13, 70, -43, + -38, 55, 4, -12, -17, -46, 82, -68, 27, -43, 54, -82, 57, -4, 0, -40, + 46, 34, 23, 15, 17, 46, -60, -23, 31, -24, 7, 18, 59, -46, 64, -86, + -50, 0, 5, -42, 23, -50, 27, -17, -20, -52, 3, 77, -30, 31, -62, -26, + -29, 14, 53, -39, 9, 43, -34, -13, -51, 29, -30, 25, -43, -22, 39, -15, + 12, 41, -5, -18, -68, 51, -25, -17, -70, 51, -52, 3, 19, -39, 14, 53, + 39, -29, -57, 13, -13, 11, 26, 41, -50, -2, -31, 4, -29, 45, 5, 21, + -7, 37, 51, -14, 59, -71, 67, -41, -2, -50, 25, 9, -26, -23, 33, -58, + 30, -12, 23, 58, -65, 54, 49, -21, 78, -124, 84, -52, 65, -48, 92, -10, + 0, 38, 58, -6, -16, 66, -13, -27, 47, 74, -80, 28, -44, 22, -5, 24, + -64, -10, 43, -31, -27, -7, 42, -43, 11, 10, -27, -65, 99, -73, -13, -3, + -22, 23, 26, -35, -10, -25, 67, -25, -32, 44, -15, -19, -24, 39, 24, 7, + -24, 7, 1, -61, 36, -55, -3, -52, 32, 21, -16, 22, 34, 45, -47, 78, + -49, 86, -24, 40, -41, -53, 38, -29, 65, -48, 22, -9, -16, 6, 48, -18, + 59, -19, 47, -5, 27, 33, 2, -25, 15, 50, -89, 0, 13, -27, 5, 43, + -61, 51, -16, -32, 59, -75, 4, 48, -60, -47, -35, 23, -4, 33, 27, 0, + -20, 17, -75, 72, -29, 36, -28, 78, 15, -52, -37, -16, 5, 41, -75, 44, + -9, -32, 36, -35, 21, 16, -74, 60, 0, -6, -50, 95, -47, -44, 22, 7, + -12, -20, -62, 43, -56, -10, 42, 42, -6, 80, -45, -22, 21, -58, 19, 47, + 7, 36, -51, 51, 39, -29, 49, -21, -9, 64, -57, -36, 37, -30, 37, -14, + 47, 30, -68, -33, -38, 33, 0, 47, 31, 50, -37, -17, 83, -53, 3, -19, + 2, -26, -23, 18, 3, 31, -7, 60, 24, 42, -41, 20, -32, 55, 16, -47, + -3, 50, -13, 52, 25, -54, 43, -61, 99, -60, 62, 39, -48, -35, -32, 12, + -36, 10, -95, 69, -55, 28, 21, -58, 29, 83, -19, 28, 36, -27, -15, 51, + -42, 29, -38, 6, 29, -16, -52, 31, -22, 86, -55, 22, -93, 51, -60, 6, + -38, -15, -21, 33, -28, -52, -2, 32, -71, -83, 66, -62, -13, 45, 7, -24, + 49, -41, -17, -11, 40, -42, 49, -51, 14, -25, 42, 21, -66, 77, 25, -40, + 6, -67, 21, 13, -9, -3, -14, 11, -61, 47, -13, -11, 67, -90, 55, -14, + -3, -55, 45, 20, -25, 5, 9, 37, 36, -7, -40, 64, -65, 54, -90, 53, + -78, 36, -39, -24, 63, -22, 56, -60, 9, -30, 34, 10, -16, -15, 25, -37, + -10, 19, -75, 94, -87, 37, -4, 62, -79, 34, 54, 3, 11, 42, -60, 43, + 15, 2, -47, -12, 37, 30, 1, -39, 75, 58, 29, -45, -14, -3, -29, 39, + -53, 1, 24, -27, 0, 11, -21, -12, -64, 87, 45, 18, 50, -67, 56, -19, + 25, 3, 5, -3, 8, -66, 52, -18, -41, 18, 21, -15, -51, 102, -54, -29, + 2, 55, -12, 46, -52, 48, -49, -49, 15, -57, -35, 15, -35, 21, -5, 43, + -46, 1, -16, 0, -6, -23, -43, 16, -9, -20, 59, 15, -5, 34, 38, -77, + 53, -63, 67, 21, 52, -84, 76, -35, -44, -63, 57, -28, -6, 14, -31, 45, + 20, 12, 23, -19, 21, -34, 25, -53, -50, -10, 15, -2, 6, -40, 27, -32, + 25, -17, -39, 4, 0, -52, 43, 18, -79, 32, -72, 10, 48, -10, 3, 20, + 69, -73, 84, -55, -11, 12, 0, 34, -21, -46, -60, 48, -23, 63, -50, 0, + -18, -21, 48, 21, -47, 30, 3, 5, -35, -42, 42, 47, 45, -16, 19, 10, + -5, 37, -38, -37, 26, 53, -10, 6, 71, 35, -8, 55, -11, 44, -73, 80, + -91, 69, -7, 0, -39, 61, 2, 22, -7, 7, -2, -30, -1, -43, 35, -12, + 26, 59, 11, -46, 40, -33, -36, 18, 52, 21, -31, 18, 20, -7, -33, 33, + -48, 89, -72, 19, 20, -15, 66, -49, -26, 4, -14, -28, -9, 21, 49, -42, + 51, -31, 35, 2, -10, 54, -72, 19, 11, 11, -51, -37, 32, -25, 32, 28, + -60, 47, -25, -67, 40, -8, -62, 11, 15, -5, -60, -10, -19, 27, 28, -24, + -42, 10, 35, 53, -62, 61, -66, 38, -64, -56, 22, 12, -18, 33, -19, 13, + 15, 29, 29, -28, -23, -23, -41, 67, -12, -63, -60, 43, -105, 84, -54, -6, + -44, 22, 26, -11, -5, 64, 12, 6, -19, 56, -63, 34, -24, 23, -30, 73, + -28, -21, -30, 22, 5, -22, 20, 47, -30, 42, 21, -1, 24, -2, 8, -72, + 32, 14, -30, 47, -20, -4, 14, -5, 38, -8, -45, -9, -55, 23, -68, 62, + -59, 8, -19, -18, 38, -28, 12, -64, 119, -41, 6, 0, 64, -62, 61, -44, + 20, -45, 17, -36, -13, 28, 27, 1, -3, 76, -10, 10, -4, 55, -68, 37, + -37, 48, -7, -52, 48, 16, -54, 26, 5, 33, 19, -31, 44, -38, 34, -24, + 6, -50, 27, 47, 48, -15, -16, -28, -1, 59, 44, -71, 60, -105, 98, -44, + 86, -45, -42, -10, 4, -6, -2, -16, -22, 73, -21, -51, -17, -15, 37, 11, + -1, 3, 32, 6, -41, -53, 42, 13, -81, -18, 39, -96, 21, 3, -42, -24, + 58, -56, 65, -64, 77, -71, -19, -18, -24, 61, -32, 31, -25, -10, -17, 5, + 37, -49, -44, 72, -68, 67, 16, -18, -18, -33, 13, -13, -55, 39, -16, 69, + -41, 29, 7, -53, 49, 11, -36, -28, 20, 18, -3, -7, 31, 38, -65, 17, + 52, -53, 27, -15, -8, -55, 33, -1, 9, -43, 58, 10, 34, -25, -16, 10, + 30, 26, 56, 28, 9, -46, 64, 25, 27, -32, 23, 31, -60, 17, -8, -39, + 99, -88, 10, -56, -8, -79, 46, 33, -20, 51, -14, 27, 52, -62, 13, 56, + -72, 2, -11, -1, 55, 21, -10, 18, 10, 83, -35, 52, -12, 46, -56, 27, + 48, -49, 44, -50, -4, -39, 12, -4, -50, 4, -1, 63, -1, -42, 59, -47, + 51, 31, -47, 82, -56, 13, -11, 49, -51, 44, 32, -88, 32, 40, 1, 27, + -10, -24, 4, 17, 36, -7, -16, 16, -9, 6, 31, -33, 61, -5, 40, 10, + -46, 61, -3, -37, 6, -8, -45, 71, -49, -43, 17, 42, -62, 24, 5, -17, + 36, -15, -15, 34, 33, -16, -38, 18, -6, -78, 43, -81, 49, -36, 31, 24, + -35, 0, -45, 60, -11, -27, 21, 43, -7, -22, 22, -22, 37, -35, 43, -15, + -16, 65, -58, -53, -14, -3, 7, 15, 23, -46, 38, -31, 26, 39, -25, -22, + -57, -14, 86, 3, 30, 0, 17, -53, 69, -69, 8, 38, 1, -22, -55, 66, + -49, -26, 47, 0, 43, 27, -34, -34, 45, 29, -5, 44, -19, 34, 44, 20, + -46, 73, -54, 76, -56, 58, 61, -5, -6, -34, 45, -15, -4, 53, -47, 18, + -34, 24, -46, 28, 24, -19, -40, 53, -18, 56, -11, -44, 87, -62, 61, -56, + -25, -24, -42, 40, -24, -42, 61, -16, -10, -15, 3, 47, -24, -65, 39, 2, + -59, 51, 5, -27, -22, 67, 14, -16, 63, -61, 25, 7, -28, 0, 65, -20, + 37, -73, -82, 63, -85, 81, -85, 0, -34, 54, -55, 45, 9, 17, -15, -42, + -24, 87, -43, 60, 28, 72, -33, 28, -39, -27, 9, -36, 3, -22, 70, -60, + -20, 54, 45, -64, 43, -80, 79, -86, 54, -121, 57, -42, 42, -55, 46, -5, + -24, 61, -45, -25, 65, -13, 29, 21, 18, -22, -5, -51, 22, -2, -43, 51, + -42, -9, -2, -54, -15, 64, -36, -46, 91, -80, 15, 65, -39, -35, -34, 21, + -30, 16, 54, -59, -38, 58, -66, 40, 35, -47, 56, -46, 15, -19, -46, 74, + 1, -52, 39, 49, -32, -29, 97, -49, -7, 13, 46, 0, -49, -9, 3, -24, + 36, -50, 6, -30, -33, 2, 78, -30, -32, 78, -8, 80, -72, 34, 17, -4, + 40, 4, 26, -62, 69, -7, -20, -55, -21, -33, 50, -48, 38, -60, -3, 4, + -29, 32, 9, 35, 15, -5, 20, 0, -24, -18, -9, -17, 43, -64, -41, 60, + 43, 36, -104, 36, -67, -24, 56, -25, 22, 12, -3, -48, 23, 9, 22, -69, + 61, -36, 32, -71, 20, -52, 0, 53, -38, 46, -15, -55, 35, -35, -56, 56, + -59, -26, 36, -62, 16, -37, -36, -31, -50, 65, -50, 49, -19, 43, 0, 72, + -59, -34, 62, -1, -13, 8, 47, -76, -20, 49, -35, 5, -11, 36, -60, 26, + 48, 36, 25, -5, -19, -41, 36, -45, 25, 6, 29, -91, 60, 35, -79, 28, + 65, -72, 30, 14, 23, -61, -30, 39, -97, 66, -51, 34, 9, -23, -57, -2, + -83, 71, 67, -69, 52, -29, 19, 20, -9, -19, 60, -81, 48, 3, 43, 17, + 25, -34, 10, -23, -42, 5, -71, 9, 12, -20, -36, 65, -25, -23, -25, -14, + 73, -101, 4, 37, 13, -9, -36, 44, -26, 80, 4, -11, 19, 42, -29, 13, + -59, 12, 20, 7, -39, 42, -79, 49, 40, -55, 64, -19, -5, -41, 64, -35, + 0, 42, -57, 61, 18, -32, 12, -52, -13, -23, 32, -92, 56, 35, -16, 62, + -16, -26, -22, 75, -42, -6, 64, -67, 31, 28, -47, 43, 28, -48, 17, -82, + 51, -11, 55, -64, 53, -40, -9, -27, 9, 40, -50, 11, 43, 19, 2, -65, + 57, 37, 81, -59, 2, 36, -69, 0, 8, -9, -52, -58, 40, -3, -29, -33, + 12, 35, -38, 12, -57, 19, 10, 67, 8, 52, -29, -10, -28, 69, -7, 3, + 57, -28, -9, -20, -45, 13, -17, -35, 44, -14, 10, -11, 23, 29, 27, -35, + 4, -71, 82, 17, 49, -6, 14, -20, -56, 36, -28, 6, -15, 23, 58, 1, + -29, -19, 18, -16, 37, 28, 12, 15, -42, -33, -54, 73, 22, 36, -15, -32, + 49, -2, -11, 4, 10, 38, 25, 47, 41, -42, 19, -38, -48, -18, -8, -47, + 38, 70, -38, -30, 33, -51, -38, 84, -18, -18, 60, -40, -8, -30, 64, -71, + 31, -89, 38, -29, 82, 16, -30, 23, 14, 13, 23, 60, -62, -18, 67, -4, + -40, 2, -25, -38, 22, 5, 47, -7, 36, 43, -49, -11, -53, 81, -8, 24, + 84, -70, -72, 65, 14, -13, -8, -3, -6, -7, -38, -6, 30, -54, -69, 53, + -27, 8, -38, -20, 75, 43, 17, 15, 7, 72, -64, 34, 18, -7, 16, 11, + -22, 47, 29, -47, -38, -43, 59, -16, 22, -89, 48, -50, -1, -55, -14, 34, + 18, -19, 30, -8, -12, 26, 0, -68, 37, -42, 30, -14, 49, 6, -12, 18, + -5, -56, 73, -21, -23, 4, 39, 58, -6, 53, -45, 44, -5, -36, 20, -82, + 37, -13, 3, -41, -19, 29, -54, -5, -26, -57, 14, 10, -56, 65, -35, 82, + -54, -22, -43, -5, 3, 61, -13, 3, 20, 0, -52, 27, -68, 32, 4, 75, + -45, -28, -62, 33, 73, -48, 68, -53, 21, -5, 60, 32, -15, -37, 4, 0, + -29, 3, 13, 41, -32, 62, -60, -50, -13, -56, 13, -10, 82, -89, 8, -14, + -29, -37, 71, -56, 44, 6, -37, 55, 58, -51, 67, -21, 12, -33, 10, 0, + 49, -37, 5, -29, -45, 12, -40, 20, 38, -4, 41, 19, 41, -52, -31, -30, + 12, 68, -23, -9, 14, -9, -44, 14, 0, 43, 59, -58, -42, 2, 11, 54, + 27, -33, -26, 52, 5, -47, -26, 14, -50, 33, -23, 57, 36, -18, 60, -48, + -15, -39, 14, 65, -9, 22, 16, -43, -5, -31, -30, 11, 40, -49, 15, 39, + -16, 41, 11, -14, -27, -50, 71, -57, 10, -50, -23, -55, 59, -26, -32, 75, + -27, 34, 80, -44, -4, -14, -18, 18, 27, -73, 46, 48, -1, -25, -23, 31, + -89, 68, 47, -13, -73, 62, 19, 35, -51, 63, 2, 47, -66, 75, 15, -32, + 36, 0, 41, -39, -65, -78, 49, 28, -59, 7, 4, -25, -6, 30, -58, 51, + 29, -73, -34, 57, 55, 51, -12, -62, 84, -35, 21, 69, -59, 48, -4, 36, + -54, -50, 67, -55, -37, 61, -53, 43, 5, -11, 38, -28, 0, -29, -4, -6, + -29, 49, -46, -8, 8, 24, -42, -49, 47, -51, 0, 51, -10, 31, -1, 25, + 45, -3, 70, -47, 38, 43, 49, -27, 10, 54, -22, 36, 28, 34, -34, -64, + 16, 31, -14, 56, -49, 11, -21, -50, 13, -31, 68, -32, -21, 35, -74, -48, + 44, -21, 31, -25, -45, -20, 4, 51, -28, -38, -21, 57, -58, 60, 56, -14, + 16, -14, -21, 0, 21, -44, 51, -11, 70, 26, 47, -59, -31, 62, -2, -38, + 58, 47, -48, 87, -72, 62, -2, -34, -42, -3, -38, -17, -10, -27, 33, 4, + -61, 71, -20, -11, 8, 55, 18, -33, 12, -4, 10, -54, -29, 90, -43, -19, + 39, -45, -2, -18, -39, 30, -19, -22, 64, -32, -6, -37, 74, -68, 25, -51, + -50, 58, -50, -17, 21, 36, 15, -22, 2, -42, 4, 29, -42, -17, 8, 27, + 43, -18, -40, -75, 69, -36, -23, 43, 41, 35, 70, -26, 62, -8, 27, -57, + 0, 25, -15, -46, 47, -35, -13, 73, -42, 64, 15, 10, -24, 17, -20, -78, + 28, -38, -80, 40, 24, -1, -6, 2, -39, 28, -59, -11, -53, 36, -8, 30, + 4, -2, 29, -81, 59, -43, -41, -10, -13, 37, -19, 4, -35, 31, -25, 72, + -65, 34, -21, 35, 52, 69, -64, -17, 30, -21, 29, -9, 38, 50, -56, -23, + -11, 74, -14, -14, -67, -31, 10, 16, -38, -43, 46, -58, 58, -38, -17, 24, + 26, 29, -42, 54, 30, 21, -39, 0, -34, 14, 46, -66, 50, -49, 51, -36, + 96, -105, 98, -41, 7, -2, 29, 22, -3, 6, -31, -45, 2, -53, 76, -29, + -53, 36, -77, 69, -49, -42, -25, 13, 63, -77, 47, 11, -56, -32, 37, 75, + -50, 36, -68, 65, -30, 34, -21, 27, 70, -18, 19, 6, 22, 1, 46, 35, + -29, -68, 32, 27, -51, 84, -26, -7, -52, 89, 29, -39, -23, 11, -79, 38, + -16, -3, 1, -9, 14, 47, -47, 43, -52, -59, -33, 39, 38, -58, 49, -39, + -43, 34, -67, -12, 12, -48, 33, 28, -18, 9, 37, 33, -38, 54, -71, -15, + 75, -27, -67, 59, -65, -42, 18, -3, 0, -46, -17, 1, 31, -63, 37, 27, + 0, 42, -2, -19, 50, 24, 37, -37, -18, -23, 52, -3, -58, 36, 42, -37, + -20, 39, 51, -12, -53, 6, 2, -3, -2, 83, -65, 11, -44, 41, 31, 5, + -6, -38, 84, 18, -28, 22, -1, 11, -71, -17, -52, 4, -73, 52, -45, -30, + 38, -51, 16, 37, 15, -15, 16, -14, -29, -24, 12, -11, -1, 22, 65, 12, + 20, 14, 88, -78, 11, -21, 23, -24, 30, 6, 4, 36, 3, 55, -79, -4, + -46, 48, -57, 75, 18, 20, 4, -31, -7, -45, -7, -20, 30, -9, -65, 15, + -30, -44, 33, -37, 2, -37, 77, -22, -50, 44, -61, 15, -32, -69, 74, -7, + 39, -58, 17, 30, 36, 35, 32, -83, 87, -51, 12, 25, -33, 36, -15, 5, + -23, 13, 64, -80, -47, 47, -14, 5, -7, 28, -66, 54, 16, -31, -7, 17, + -56, 63, -43, -24, 72, -45, -49, 27, -39, 28, -5, 32, 53, 4, -67, 1, + 23, -55, 18, -19, 40, 38, -49, -16, -1, 6, -18, -36, 5, 11, 7, -21, + -18, 66, 10, -39, -48, 25, 45, -25, -33, -66, 71, -82, 10, 33, -59, 28, + 32, 68, -14, 20, 30, -4, -25, -23, 52, -56, -5, -28, 56, 27, 18, -66, + 66, -41, -12, 46, 17, -58, -32, 83, -48, 78, 20, -14, 38, -21, -10, 42, + -24, -54, 34, 70, -11, 38, -50, -14, 38, -30, -20, 0, -73, 67, -3, 69, + -114, 49, 15, 19, 49, 20, 26, -75, 58, 18, 37, 28, -41, -3, 15, -11, + 0, -49, 33, -43, 52, -31, -22, 4, -1, 59, -89, 28, 25, 10, -35, 41, + 27, -50, -6, -32, 61, -47, 11, 16, 31, -61, 58, -78, 67, -58, 11, -34, + -35, 61, -47, -47, -25, 31, -17, 2, -2, 36, -38, -1, 14, -11, 39, 33, + 0, 2, -18, -13, 54, -44, -16, 26, -10, 43, 6, -36, -17, -47, -42, -31, + 52, -23, -50, 90, -89, 82, -7, 11, 6, 23, -6, 43, -70, 17, 42, 31, + -17, -28, 11, -52, -18, -7, 21, 29, 15, 4, 30, 14, 35, -75, 88, -12, + 35, -13, 16, 43, -31, -16, -49, 24, 57, -72, 50, 16, 41, 0, 21, -61, + 68, -64, -3, -68, 37, -88, 53, -23, 32, 37, -60, -12, 58, -71, -19, -1, + -23, 31, -54, 44, 38, -34, 3, 27, 16, -46, 25, -21, 51, -25, 32, 23, + -18, 16, 27, -48, -59, 45, -6, 38, -14, -6, -12, -41, -19, 5, 25, 60, + -68, 67, -47, 74, -74, 73, -6, 44, -45, -3, -42, 69, -43, 17, -39, 7, + -3, -72, 18, 4, 66, -49, 7, -37, 11, 66, -74, 85, -65, 12, 46, -21, + 4, -54, -35, 32, -88, 37, -25, -32, 53, 0, -21, -9, -55, 0, 19, 13, + -9, 13, -10, -37, -4, 27, 11, -60, -13, -37, 46, -33, -49, 31, -8, -1, + 51, 55, -46, -62, 31, -9, -26, -2, 53, -56, 24, 66, 39, -47, 8, -62, + 64, 34, -15, -39, -44, 32, -41, 61, -31, -16, -50, 56, -45, 77, -30, -54, + 36, 16, -59, 11, -50, -22, 37, 28, -17, -39, 100, -71, 33, -15, -8, -4, + -5, -54, 68, 13, 50, -18, 16, -47, 24, 39, -59, 83, -21, 9, -29, -2, + 88, -69, 16, 61, -28, -43, 33, 19, 6, 0, 68, -15, -12, -31, 16, -1, + -52, 43, 24, -2, -32, -20, 8, 55, -81, 19, 32, 35, -33, 67, 59, -6, + -59, 44, -3, -24, 87, -70, -43, 34, -59, -61, 49, -34, 7, 50, -74, 51, + -12, 64, -56, 62, -60, 64, 20, -46, 16, -7, 49, -82, 2, 43, -29, 33, + -43, 49, -51, -46, 75, -57, 61, 19, -60, 58, -58, 41, -36, -31, 33, -24, + -25, 37, 60, 6, 15, 11, 13, -10, -56, 1, 6, 50, -51, 79, -18, 49, + -6, 0, -35, -18, -15, 48, -19, -64, 11, 9, 40, -46, -39, 34, -50, -14, + -47, 40, -25, 64, 19, 6, -46, 62, -63, 68, 8, -10, 46, -37, -35, -28, + 55, -42, 61, -16, -16, -61, -17, 16, 22, -34, 40, 0, 9, 25, 19, 22, + 41, 4, 26, -9, -22, -15, 37, -31, 79, -97, 19, 27, -27, 52, -63, -29, + -58, 74, 15, -32, 73, 2, 41, 31, -64, 54, -34, 40, 50, -70, 35, -14, + 19, 3, -42, 58, -19, 18, -30, 49, 18, 33, -57, 52, 8, -16, 49, 0, + -21, -36, 69, -28, -28, 16, 45, -26, -29, 83, -58, -31, -64, 47, 11, 29, + -29, -82, 22, 61, -7, 31, 1, -54, 15, 73, -35, -33, 19, -79, 43, 41, + -7, 17, 66, 21, -1, 66, -78, 40, 9, 5, -68, 58, -58, 52, -11, -12, + 54, -19, -19, -25, -45, -37, 13, 71, -67, 49, -39, -8, 16, 40, -28, -27, + -6, -22, 28, 17, 34, 44, 0, -14, -49, 71, -54, -9, 60, -3, 6, 21, + 50, -45, 2, -31, 10, 42, 23, -19, -8, 60, -62, -14, 61, -41, -4, -6, + 31, -38, -18, 0, -93, 83, 48, -44, 53, 56, -24, 11, -16, -28, 35, -26, + -15, 28, -37, 58, 12, -72, 1, -56, 79, -43, -31, 48, 10, 19, -50, -45, + 73, -30, -22, 90, -88, 92, -103, 38, 7, -31, 19, -51, 38, 50, -31, -42, + 18, -6, -49, -32, 22, 9, -11, 11, 71, 15, -43, 16, 2, -32, 28, -50, + -6, 43, -27, 48, 39, -30, 16, 16, 70, -66, 30, 28, -2, -31, 34, 39, + 0, 12, 51, -53, 3, -37, 55, -24, -17, -52, 58, -29, 16, -7, 59, -19, + 12, -13, -37, -15, 29, 35, 44, -43, 37, -14, 67, -72, 29, -16, 38, -41, + -26, 46, -31, 34, -48, 29, -51, -9, -13, 70, 31, -32, -4, -6, 9, 48, + 39, -3, -45, 7, -67, 19, -10, -54, 15, 30, -71, 76, -86, 107, -69, 33, + 16, 0, -39, 40, 17, -24, -36, 2, -61, 23, -2, 13, -10, -23, 21, -55, + 18, 11, -64, 64, -34, 71, -91, 60, 25, -77, 23, 54, -47, 64, -34, 48, + -5, 39, 12, -15, -60, 14, 15, -9, 9, -9, -34, 67, -11, 17, 28, -46, + -39, -26, -44, 30, -31, -24, -12, 31, -19, -34, 40, 6, -46, 81, -53, 13, + 53, -65, 66, 21, 7, 14, -29, -38, -31, 10, -48, 71, -75, 18, 45, -52, + 99, -92, 44, -68, -3, -68, 30, 31, -42, -23, -27, -23, -35, -24, 55, -81, + -32, 46, -48, -15, 4, -17, -21, -22, 46, -41, -19, -22, -10, -35, -11, -12, + -55, 59, -12, 2, 93, -55, -27, -12, 25, -62, -35, 50, 19, -10, -11, -39, + 73, -40, 12, -50, 6, 17, 30, 29, -78, 70, 0, 7, -58, 27, 51, -49, + 21, -52, 35, -20, -4, 12, 6, 26, 11, 32, 7, 8, -83, 31, -2, 61, + 10, 40, -14, 33, -14, -22, -39, 28, -93, -8, 64, -48, -7, 30, -71, 79, + -1, -2, -3, -70, 10, -64, 86, -43, -54, 29, 2, -55, 44, -76, 63, -81, + 67, -93, 19, -12, -39, 34, 18, -44, 6, 56, -71, 33, -5, -22, 41, -39, + -17, 15, -1, 11, -17, -61, 15, -24, 58, -60, 2, -14, -16, -6, -15, -61, + 46, -65, -2, 17, 78, -86, 79, -53, 38, -77, -37, 0, 12, 37, -50, 20, + -82, 51, -19, 10, 23, 23, 22, 40, -23, -7, 55, -48, 50, -89, 22, -39, + -46, 36, 78, -103, 26, 55, -13, 4, 66, -28, 27, -27, -27, -16, -24, 1, + 61, -18, 37, 19, -31, 24, -15, 19, -95, 87, 12, 27, -43, 20, -51, -19, + -50, 60, -42, -32, 64, -4, -11, 54, -66, 23, -27, -36, 40, -26, 1, 9, + 60, -3, 2, -30, -17, 24, 34, -38, 8, 35, -57, 38, -25, -57, 60, -35, + -56, -5, -43, 38, 18, 50, 3, 62, -37, 84, -20, -46, -8, 39, 19, -9, + -35, 77, -7, 12, 6, -39, 66, -83, 65, 42, 16, 35, 38, 18, -84, 76, + 49, -32, 46, 31, -20, 20, -9, 39, -21, 40, 82, -61, 47, 41, -11, 74, + -13, 35, 14, -35, -38, 31, 8, -36, -29, 46, 64, -57, 34, -33, -11, 4, + -2, -30, -42, 72, -10, -2, 9, -38, 11, 0, -12, -5, -25, 39, -69, 66, + -23, 57, -67, 87, -53, -20, 25, -17, -44, 34, -10, 22, 38, 3, -62, -31, + 31, -42, -18, -54, 88, -65, 46, -22, 44, 32, 21, -49, 13, 11, 47, -72, + 17, 10, 27, 40, -45, 73, -86, 4, 16, -11, 53, -4, -66, 89, 1, 30, + -71, 72, 53, -86, 75, -39, -13, 45, 1, -21, 30, 39, -73, 56, -67, 46, + 24, -59, 7, 10, 46, -8, 51, -14, -76, 66, 21, -56, 70, -44, 39, 81, + -64, 84, -28, -20, -50, 40, 24, 3, 58, 33, 49, -45, -18, 7, 28, 13, + 43, -27, -2, -23, 53, -58, 38, -61, -7, -11, -55, 56, -31, 47, 10, 29, + 27, -40, -51, 68, 27, -93, 12, 3, -6, -69, 36, 39, 45, 30, 24, -13, + -51, -59, 57, -64, -4, 41, -27, -17, 91, -47, -26, 1, -31, -1, -1, 63, + -18, -18, 71, -60, 12, -11, 55, -54, 57, -13, 78, 2, -40, 0, 41, -47, + -24, 40, -48, 67, -7, -8, -18, -3, -2, 19, -73, 76, -53, 1, 35, -10, + 69, 13, -7, -23, -57, -53, -23, -6, 22, -31, -34, 53, 50, -45, -57, 38, + -27, -7, -29, -4, 46, 52, -71, 27, -28, -56, 6, -18, 8, -19, 71, -33, + -63, -13, 46, -60, 44, -36, 71, -68, 31, -64, -44, 51, -18, -35, -31, -8, + 16, 16, -48, 46, 5, -34, -31, 82, -18, 39, -36, -35, 3, 9, 38, -3, + 45, -18, 42, -61, 21, 9, 21, -15, 18, 32, -39, -20, 92, -46, 36, -18, + 24, 4, -27, -72, 68, -65, 79, -43, -5, 11, -56, -14, 17, 4, 49, 33, + -65, -5, 59, 53, -57, 56, -40, 54, -59, -17, -19, 17, 23, 3, 28, -1, + -55, 63, -48, 38, -31, -32, 95, -46, 78, -55, 12, -5, 46, -42, -67, 27, + 46, -66, -14, 48, -16, 10, 49, -68, -4, -37, -27, 21, 50, -39, -19, 60, + -56, 38, 35, -20, -63, 26, 0, -51, 115, -89, 9, 19, -31, 21, -31, -58, + 63, -81, -23, 8, 69, -80, 46, -38, -46, -49, -43, 68, -28, -21, 29, -21, + -52, 40, 19, -22, 24, -8, -10, 39, -39, 94, -33, 31, -3, -7, 44, -36, + 43, -40, -22, 14, -53, 51, 51, -34, 39, 71, -35, -62, -14, -71, 12, 10, + 92, -26, 47, -10, 25, -38, -38, 87, -81, -2, 21, 12, 40, 0, -27, 0, + 1, -12, -50, 53, -32, -25, -21, -26, -17, 3, -58, 0, 5, -12, 64, -46, + 64, 3, 36, -39, 15, 30, -42, 39, 17, 43, 12, 15, -35, 54, -23, -43, + -26, -6, 34, 16, 32, 54, -17, 53, -73, 61, -21, -11, -19, -13, 64, -18, + -49, 13, 30, 34, -62, -44, 44, 12, 62, -25, 33, -11, 1, -28, -18, 33, + 68, -4, -9, 22, -21, -37, 12, 4, 16, 63, -33, 5, -24, 54, 1, -37, + -42, 5, -34, -5, -20, 83, -17, -21, -22, -45, 73, 0, -12, -19, -28, -57, + 7, 11, -20, 47, 16, -46, -7, -10, 43, -64, 57, -57, -33, -7, -27, -10, + 6, -31, 7, 96, -76, 91, -59, 23, -21, -17, 96, -45, 10, -28, -2, -55, + 51, 67, -73, 9, -51, 17, -62, 70, 15, 39, -58, -14, -30, -17, -26, 0, + 45, -71, -5, 65, -78, 75, -47, -8, -37, -14, -18, 19, -41, 15, 69, -43, + 24, -62, 64, -27, -16, 32, -25, 4, 36, 20, 13, 43, -108, 84, -68, 51, + -61, 37, 2, -32, 49, 30, -14, -19, -50, 22, 29, 11, -14, 34, 74, -61, + 35, 26, 40, -26, 31, 11, -44, 3, 51, 29, -48, 40, -2, -8, -7, 8, + -1, -29, 59, -50, 4, -22, -3, -19, 63, -69, 1, -51, 57, -52, -60, 61, + -95, 80, -32, 50, -49, 14, -54, -17, -29, -8, -32, 52, 7, 49, 0, -45, + -39, -20, -42, 24, -27, 47, -15, -55, 40, -13, -13, 9, -8, 30, 8, 3, + 2, 62, -30, 32, -3, 61, -61, 85, -53, 9, -3, 60, -87, 89, -104, 10, + -33, -11, -59, 10, 62, -73, 46, -25, -27, -28, -48, 27, 25, 2, -10, 10, + 20, 20, -27, -35, 10, -32, 41, -41, 29, -20, -15, 53, -26, 13, -42, 10, + 60, -31, -44, 29, 23, -10, -23, 50, -58, -10, 19, -20, 9, -29, 56, -49, + -31, -47, -18, 13, 22, 1, -16, -46, 7, -13, -30, -10, -20, 3, 27, 41, + 74, -37, 48, -6, 35, -77, -16, 43, 20, -22, -74, 76, -50, 41, 80, -16, + 71, -72, 64, -57, 30, -56, 46, -56, 11, 47, -33, 84, 7, -7, 69, -37, + 22, 13, 63, -94, 42, -91, 88, -36, 21, -20, -43, 18, 46, -31, -41, 79, + -14, -42, -25, 86, -46, 88, -15, -89, 25, -22, 85, 2, -52, 58, -3, 21, + -17, 23, 64, -72, 33, 4, 2, -44, 63, 7, 18, 17, 40, -10, 2, -38, + 3, 62, -84, 27, 18, -61, 23, 23, -87, 51, -74, -35, 52, -5, 67, -24, + -14, 39, -5, -40, -10, 37, -58, 31, 22, 51, -20, -10, 12, -88, 14, -53, + 53, 15, -80, 81, -39, -55, 54, -31, 34, 4, -11, 30, 13, -28, 49, 34, + -29, 26, -78, 66, -9, 2, -15, 82, -86, 73, -25, 30, -17, 19, 44, 19, + 9, 23, -6, -4, 66, -39, 58, 33, -55, 24, -8, -25, 49, -14, 11, -19, + 83, -9, 66, -68, 48, -24, -37, 60, 37, -33, -7, 23, -55, -22, -38, 58, + -77, 33, -60, 70, -53, -17, 67, -83, 66, -30, 18, -18, 64, -59, 43, 76, + -63, 79, -54, 77, -82, 5, 5, 27, 23, -16, 26, 37, -62, 28, -1, 3, + -11, 51, -32, 39, -30, -16, 11, 33, 16, 8, -7, -20, 29, -26, 29, 62, + -90, 66, 43, -37, -31, 15, -11, -57, 71, 4, 40, -67, 5, -2, 5, -33, + 0, 71, 26, -3, -18, 10, -9, 72, 6, 50, 22, 44, -16, -16, 4, -23, + -48, -12, -6, 15, -83, 90, -13, 8, -3, -10, 86, -91, 89, -21, -72, -19, + -37, 13, 4, 53, -66, 92, -18, 25, 36, -59, 37, -84, 9, -51, 0, 23, + 2, -67, -43, 20, 49, 37, -35, 10, -7, -19, 50, -39, 36, 0, 9, -43, + -6, -44, 60, -27, -20, -7, -29, 90, -5, 46, -58, -21, 87, -36, 41, -42, + 36, -44, -45, 11, 36, -26, 64, -68, 48, -26, -38, 14, -79, 28, 11, -24, + 55, -16, 20, 26, 9, 23, 22, 4, 36, 23, 39, 27, -45, 10, -40, -39, + 68, -69, 9, 9, 3, -17, 38, -14, -45, -30, -23, -20, 38, 46, -2, 50, + -28, -26, 51, -61, -1, 35, 30, -76, 1, 3, 45, -73, -46, 68, -96, 64, + -77, 25, 0, 30, -41, 24, -12, -40, 24, -39, -5, -36, 31, 39, -80, -29, + -53, 40, -32, 9, -19, -30, 0, 38, 35, -45, 62, 47, -70, -59, 92, -71, + 9, -36, 11, 11, 69, -62, 64, -45, -36, 50, 12, -25, 76, 1, 28, -58, + 9, 40, -2, 23, -30, -15, -2, 36, -42, 29, 38, -23, -3, 25, -16, -44, + -1, -41, 59, -59, 36, 28, -10, 18, 26, -27, -42, 4, 41, -15, -1, -50, + 20, -92, 64, -14, -20, 37, -31, -5, -25, -62, 31, 3, 26, -10, -37, -69, + 81, -65, -3, -12, 30, 50, -25, 23, -79, -16, 34, 23, 75, -40, 43, -6, + -10, 9, -88, 41, -43, 16, -32, -41, 10, -57, -37, -24, -3, -7, 13, -5, + -2, 33, 40, -37, 96, -92, 12, 13, -27, 8, -29, 5, -52, -7, 72, -24, + 34, 43, -50, -41, -7, -45, -24, 50, -45, 22, -35, 35, 32, 39, -44, -1, + 11, 59, 20, 10, -68, 4, -11, 43, -51, 96, -64, 0, -51, 34, 19, -28, + 55, 31, -15, 12, -49, 67, -53, -21, -30, -19, -21, -11, -46, -8, -18, 59, + -46, 6, 48, -25, 37, -93, 46, 36, -77, 53, 28, -38, 67, -7, 16, 16, + -35, -69, 59, -55, -8, -5, -11, -60, -44, 28, -48, -21, 47, 29, -17, 4, + -54, 87, -19, 1, 56, -36, -20, 63, -13, 21, 29, -54, 67, -100, 39, -41, + -50, 33, -23, 30, 11, -62, 36, 27, 69, -71, -44, 57, 19, -4, -37, 69, + 12, 10, 20, 22, -30, -16, 9, -23, -10, 34, -8, -3, 47, -66, 38, 48, + 34, -59, 49, -24, 10, 18, -48, -27, 10, -10, -33, -28, 83, -11, -25, 13, + -62, 62, 43, -78, -54, 24, -41, 39, -32, 50, -36, -3, -101, 91, -66, 74, + -80, 55, -62, 46, 6, -44, 42, 12, 13, -23, -42, -9, 38, -42, 25, 27, + -9, 47, 8, -2, -32, -15, -34, 11, -71, -1, 55, -58, -41, 24, 33, -4, + 17, 78, -99, 91, -40, -45, 33, 8, -37, 62, 15, 24, -44, 21, 17, 48, + -9, 1, -23, 32, -4, -30, -18, 28, 77, -47, 26, -70, -51, 35, -16, 23, + 9, 0, 52, 4, -8, 29, -21, 49, -5, -19, 44, 9, 54, -42, 20, -17, + 12, 21, -42, -10, -73, 40, 20, -4, 11, -12, 28, 48, -8, -21, -22, 21, + 24, -29, 39, 1, 57, 47, -24, 4, -56, 84, -71, 64, -68, 54, 10, -29, + 11, -2, -62, 40, 7, -25, 26, -41, -52, 32, -21, -16, 70, 33, -59, 66, + -70, 38, -37, -36, 44, -22, 12, 35, -7, 53, -9, 20, 48, -57, 57, -49, + 45, -43, -2, -39, -3, 63, -55, 14, 0, -48, 51, 8, -18, -38, -8, -19, + 74, 10, -19, -14, 63, 19, 55, -12, 42, -21, -10, 14, 23, -61, 95, -31, + -7, -34, -13, 52, -98, 66, -30, 5, -26, -3, -48, 25, 2, 0, 46, -35, + 78, -52, 15, 31, -29, 37, -10, -22, -52, 34, 18, -9, -8, 61, -38, -35, + -50, 54, -55, -37, 14, -15, 31, 37, 13, 39, -22, 2, -19, -20, 28, -77, + 25, 19, -24, 0, -10, 20, 5, 41, -38, -3, 39, -38, -50, 35, -25, 0, + 5, -41, -25, 81, 39, -24, 56, 12, -18, 2, -48, 26, 76, -62, -41, 40, + 42, 1, -17, -21, -49, 51, 5, -22, -46, 17, 30, 11, -81, 38, 11, 14, + -41, -36, -6, 26, 30, -9, -25, 42, 47, -2, 4, 29, 19, 29, -25, 2, + -46, 15, 4, -28, 15, -17, 40, -4, 16, 12, -53, 45, -56, 68, -60, -19, + -45, 85, -72, 63, -31, 20, 57, -48, -69, 0, 41, 21, -3, -7, -53, 59, + -57, 15, -77, 25, 58, -54, -4, 19, 11, 2, -38, 56, -65, 51, -30, 32, + -2, -24, -8, 33, 78, -73, 17, 7, 3, 25, -8, -25, -6, 41, 55, -28, + 1, -9, -34, -5, -48, 25, -79, 72, -68, -2, 52, -16, 7, -24, 6, -53, + 9, 3, 50, 28, -67, 67, -27, 62, 32, -18, -38, 82, -94, -33, -6, 12, + -20, -2, 35, 40, -72, 56, 0, -37, 16, -27, 30, 19, 17, -57, 39, -40, + 36, 54, -67, 61, -8, -13, 61, -61, 46, 58, -44, -29, -7, 47, 0, -8, + -58, -24, 94, -35, -54, -5, -49, -12, 2, 49, -52, 23, -73, -5, -76, 22, + 78, -50, 34, -27, 64, -38, 25, 17, -8, 50, 6, 4, 0, -56, 63, -3, + -31, 63, 0, 10, -29, 48, -64, -12, 68, -49, 40, 31, 11, -96, 56, 32, + -23, 5, -33, 68, 17, 26, -22, -58, 42, -78, 48, -22, 14, 45, 18, 33, + 22, -23, 2, -6, 3, -1, 33, -62, 72, 14, -61, 53, 13, 34, -53, 47, + -22, 10, 21, -78, 1, -37, 1, -45, 15, -4, 32, 44, -59, 11, 72, -33, + -41, -19, 15, -12, 75, -74, 30, 12, 75, -68, 9, -13, 65, 18, -23, -23, + -32, 92, -47, 10, -78, 60, 17, 10, -51, -6, -11, 23, -60, -25, 50, -76, + 62, -24, 10, 5, -4, 1, -3, 4, 37, -54, -34, 6, 51, -54, 39, 61, + -4, -60, 26, -11, -44, -8, -37, 17, 56, 59, -94, 90, -37, 97, -21, -29, + -5, 61, 64, -69, 6, -15, 29, -50, -3, 17, 51, -69, 88, -10, -7, -11, + 20, 20, 31, 11, -84, 64, 13, -4, 20, -75, 89, -48, -19, -25, -20, 29, + -22, -24, 21, 9, 29, -36, 47, 18, 29, 13, -56, 58, -42, 35, -45, 44, + 37, 5, -47, -78, 42, -70, 44, -42, -48, 34, -13, -33, 87, -11, 57, -80, + 66, -22, 23, -51, 33, 13, -19, 8, -46, 26, -30, -57, 46, -55, 50, 44, + -58, -33, 30, 6, -34, 31, -98, 54, -39, -16, -15, 24, -28, -47, 6, 67, + 31, -26, -36, -39, 52, 12, 13, 28, 28, -32, 65, 12, 48, 57, 1, 71, + -78, 7, 5, 26, -100, 52, -18, 6, -39, -2, 49, -56, 47, 0, -16, -21, + -2, -37, -26, -53, 35, -30, 37, 36, -59, 39, -22, -75, 18, 85, -79, 45, + -56, 37, 0, -40, -23, 23, 25, 18, 4, 14, 44, -19, -46, -40, -11, -28, + -11, 26, 17, -28, -8, -3, -53, 67, -56, -14, 78, -62, -1, 30, 11, 22, + 26, -40, 29, 49, -34, 35, -11, 56, -19, 6, -71, 2, 24, 28, -52, -2, + 18, 36, -9, 74, -67, 37, 8, 5, -50, 34, 3, 16, -40, -6, -28, 57, + 10, -55, 46, 3, 66, -62, 25, -48, 40, -3, 44, -29, -6, 56, -10, 73, + -7, -50, 55, -18, 43, 5, -5, -32, -59, 58, 32, 7, -82, 79, -78, 31, + -85, 114, -73, 90, -52, 96, -24, -51, 9, -82, 44, -52, -57, -34, -41, 38, + 12, -78, -11, 1, 22, 16, -10, 27, 8, -22, -39, 25, -80, -4, -49, -25, + -33, -15, -76, 17, -15, -34, -2, 34, -18, -10, -46, 21, 18, -24, -35, -21, + -12, 21, 0, 39, -27, -23, 0, 17, -30, 32, -53, 33, -38, -37, 22, -41, + -16, -4, 55, 29, 54, 17, 42, -23, 67, 11, 18, -11, -79, 47, -4, 14, + -20, -29, 3, 55, 0, -57, 1, 39, 23, -20, -22, 54, -25, 67, -41, -37, + 35, -28, 59, -44, 49, -6, 57, 13, 13, 61, -38, 35, 2, 53, -54, -36, + -46, 3, 45, -6, 1, -56, -28, -36, -6, 14, -38, -30, -18, -34, -8, -69, + 75, -41, 20, -15, 79, -28, -33, 31, -1, 38, -63, 71, -48, 10, -30, -18, + 46, 15, 39, -5, 24, 38, -11, -43, -9, 44, -45, 91, -53, 16, -60, 68, + 22, 2, -27, 57, -62, 49, -57, -2, -30, 14, -27, -10, 59, -24, 28, 54, + -40, 38, -57, 77, -25, 64, -37, -63, 37, 7, -43, 0, 4, -68, 84, -89, + 25, -27, 14, 47, -90, 64, -20, -15, -20, 25, 68, -12, -40, 29, -43, 16, + -4, -6, -11, -43, -2, 10, -21, -20, 0, -6, -30, -10, 27, -36, 19, -19, + 23, -23, -35, 30, -64, 64, -80, 60, -25, 48, -95, 79, 8, -39, 0, -80, + 18, 53, -67, 82, -62, 13, -38, 35, 40, -6, -32, 7, 19, -25, 60, -48, + 85, -108, 112, -111, 81, -117, 51, 0, 51, 42, -2, 23, 67, 56, 1, -14, + -1, 39, -28, 43, -61, 35, -26, 55, -74, 45, -37, 13, 42, 17, 55, 28, + 41, 36, 24, 24, 18, 3, -38, 32, -58, 74, -12, -19, 25, 49, 62, -24, + 51, 0, -48, 64, -65, 24, 12, -33, -31, 42, 27, -81, 59, 27, 43, 39, + 4, -12, -15, -17, -40, -45, -45, 21, -65, 13, 5, 65, 8, 3, -23, -44, + 64, 14, -47, -68, -20, 72, -45, -12, 13, 55, -11, 15, 11, -37, 25, -54, + 84, -57, -31, 68, -67, 25, -31, 2, -36, -48, 3, 6, 9, 16, 54, 20, + -21, 74, -25, -15, 28, 2, 62, 12, -10, -18, -1, -55, 49, 54, -49, 74, + -78, 12, 6, -2, -65, 84, 22, -27, -35, -66, 29, -25, 8, 34, -40, 77, + -32, -2, -5, -5, -28, -36, 40, -12, 48, -52, 11, -5, -44, 72, -6, -40, + -31, 41, 2, -23, 57, -64, 11, 63, -34, -17, 7, 36, -3, -1, 54, -60, + -36, -9, 4, -69, 53, -55, 50, 43, 24, 0, 17, -54, -2, 37, -73, 36, + -13, 55, -72, 0, 50, -8, -6, -33, 28, 24, -103, 31, -34, 61, 36, -5, + -4, -19, 53, -51, 19, 38, -34, 48, -28, 39, -9, 43, -27, 41, 15, -55, + 6, 31, 28, 8, -37, 33, 19, -72, 35, -12, 26, -70, 16, -31, -12, 64, + -22, -26, -5, -69, 76, -61, 53, -54, 34, -30, -28, -54, 70, 9, -53, 20, + -55, 67, -72, 36, 14, 51, -4, -23, -26, -57, 12, -78, 13, -101, 52, 61, + -47, 40, 8, 55, -53, 44, -62, 16, 32, -60, 54, -9, 8, 29, -47, -38, + 39, -63, 31, -47, 59, -42, 79, -37, 47, -9, 22, -29, 26, -21, -72, 56, + -35, -44, 51, -55, 24, 21, 48, -26, -30, 10, 17, 39, 14, -64, -63, -10, + -57, 36, 53, -24, -23, 61, 35, -40, 62, -51, -16, -54, -8, -25, 46, 19, + -36, 8, 59, 88, -31, 41, -22, 0, 21, -62, 2, -15, -21, -19, 34, 7, + -74, 58, 19, -44, 61, -52, 3, -6, -3, 45, -40, 20, -54, -43, -30, 1, + 13, -58, -6, 45, 1, -7, -14, 4, 33, 28, 42, 68, -98, 22, -20, -37, + 27, 32, -1, -10, -8, -69, 10, -26, 47, 42, 31, -6, 55, -58, -28, 17, + -21, 26, 7, -8, -38, 58, -17, 17, -17, 6, 27, 30, -4, -35, -62, 95, + -73, 51, -18, -45, 11, 59, -20, -41, 35, 16, -42, 8, 13, -42, -69, 55, + 46, 0, 34, 31, -33, 24, 19, -65, -28, -14, 21, 30, 12, 41, 29, 3, + 15, -83, 76, -72, 42, -44, 29, -25, 5, -28, 99, -49, 59, -87, -54, 0, + 10, -50, -16, 58, 9, -36, -19, -63, 83, -95, 34, -2, -41, 32, -29, 32, + 12, -23, -63, -8, 31, 4, 39, 10, -11, 24, 24, -16, 51, -7, 59, -46, + 46, -33, -4, 21, -1, -1, -7, -16, 19, -34, 76, 32, -58, 24, 6, 13, + 31, 6, -19, 33, -20, -89, 74, -12, 49, 7, 60, 24, -20, 85, -50, -43, + -56, 13, 0, 12, -13, -32, 56, 0, -8, 51, -42, 24, -59, 55, -26, -23, + 1, -21, 9, 5, -44, 15, -44, 0, -13, -8, -74, 48, -53, -24, 77, -75, + 46, -23, 2, 23, -27, 0, -44, 59, -55, 54, -41, -15, 11, 36, 29, 44, + 65, -69, 15, -45, 39, -7, -22, -37, -37, 4, 61, -28, 47, -1, -5, -44, + 71, -75, -49, -53, -16, 19, -48, 39, -39, 50, -47, 72, -64, 36, 51, -54, + 98, -33, -44, 45, -64, 41, 32, -29, -23, 38, -2, 67, -21, 90, -6, -39, + 70, -26, 10, -28, 55, 25, -52, -12, -33, -14, -35, -24, 59, 53, -27, 63, + -60, 31, 8, 16, 3, 28, 10, 45, -37, -27, 4, -2, -57, 60, 13, -45, + 1, -45, 15, -38, 45, -17, -18, 50, 4, 11, -48, -2, -21, 33, -7, 30, + 10, -48, -19, 47, -10, -73, 40, 46, -32, -11, -22, 6, -52, 71, 12, 12, + -72, -30, 39, 0, 15, -46, 36, -7, 39, 9, 53, -46, 4, -24, -82, 46, + -3, 0, 20, 65, -35, 0, 20, 22, 21, 60, -70, -28, 39, 40, 32, 24, + 38, 1, 8, -52, 28, -24, 72, 26, -38, 62, 7, 23, -27, -60, 48, 13, + -37, 51, 28, 44, -51, -26, 0, -39, -23, 29, -29, -15, -32, 52, -91, 20, + -6, 14, 62, -36, -39, 38, 53, -21, 2, 63, -71, 38, -38, -35, -6, -20, + 32, -44, 0, -50, -2, 70, -84, 37, -35, 14, -76, 73, -32, -30, -3, 38, + 77, -26, -28, -26, -16, -7, -27, 45, -74, 4, 29, -43, 66, -59, 35, 38, + -38, 38, -17, 18, -13, 29, 35, -42, -13, 20, 61, -14, 60, -11, -39, 36, + 25, -10, 11, 28, 14, -41, 32, -5, 56, -71, 40, -6, -41, -18, -72, 8, + -76, 61, -61, 42, -15, 38, 25, 73, -6, 20, -24, 20, -59, 72, -79, 73, + -38, 72, 14, 44, 41, -58, 25, 5, -8, 13, -30, 16, 62, -29, -41, -32, + -42, -8, 35, 19, -8, 5, 12, 43, -7, -19, -51, -2, -59, -20, -35, 45, + -51, 69, -16, -41, -53, -55, 60, -6, 36, -25, -12, -4, -35, -39, 0, -8, + 56, -58, -7, -66, 80, -104, 85, -66, 20, -23, 45, -8, -13, 2, 34, -10, + 59, -8, 13, 21, -28, 13, -2, -62, 7, -26, 1, 58, 1, 31, -24, 2, + -52, 67, -35, 28, 33, 24, -29, -16, 21, 45, 6, 41, 21, -23, -6, -14, + 95, -56, -12, -1, 23, 3, 0, -70, 2, 23, -76, -14, 30, 11, 43, 8, + -11, -33, 9, -60, 19, 0, -4, -58, 17, -95, 117, -65, 18, -31, -16, 7, + -9, -7, 42, 36, 29, -25, -61, 31, -24, -81, 49, 2, 23, 22, 21, -68, + 91, -82, -28, -18, 28, 31, 10, -16, 68, -23, -13, -13, 54, -32, 93, -18, + -36, 67, -92, 88, -23, -16, -13, -15, -10, 17, -43, 85, -22, 33, 71, -53, + 63, -25, 40, 12, 79, -77, 63, 9, 7, -47, 8, -43, 35, -25, 23, 25, + -92, 28, 21, -49, 76, -61, 38, -27, 58, 16, -10, -30, 12, -16, -17, -33, + -2, 0, 47, -20, 25, 3, -40, 1, 48, -43, 24, -46, -3, -45, 56, -14, + -65, 0, 43, -89, 48, -25, -30, 11, -67, 51, 24, 6, 41, 29, 47, -17, + 35, -17, 39, -2, 3, -26, -35, -51, -12, 27, 13, -39, -9, 2, 43, -20, + -52, -12, -62, 21, 0, 24, -15, 62, -31, -23, 34, -21, -67, 19, 45, 36, + -22, 69, -46, 43, -68, 40, -73, 33, -42, 5, 63, -11, 74, -23, 58, -54, + -19, -64, 42, 30, 64, -6, 46, -44, 27, -24, 11, 19, 69, 2, 24, -23, + -34, 45, 39, 8, -44, 92, -88, 43, 1, -30, -37, 7, 8, 48, -51, 44, + -79, -3, -9, 39, 16, -26, -28, 20, 13, 46, -58, 10, -63, 1, 39, 1, + -20, 14, 29, -39, 15, -58, 7, -7, -24, -35, -20, 16, -89, 74, -29, -31, + -39, 90, -58, -7, -32, -28, 12, 48, 14, -3, -5, 77, -51, -30, -25, -21, + 43, -43, 52, 17, -32, 52, -2, 18, -41, 85, -73, 1, 57, -32, 0, -32, + -33, -7, -42, -33, -34, 37, -16, -7, -10, 80, -68, 15, -63, 50, -64, 11, + -56, 86, 23, -30, 71, -89, 32, -41, -61, 64, -37, 88, -104, 56, -82, 0, + -48, -6, 23, -17, -7, -49, 59, 20, -42, 6, -10, -37, -48, -5, 0, -47, + -5, -53, 12, -42, -34, -8, 0, -39, 45, 23, -48, 83, -15, 8, -21, -24, + 31, 32, 14, 14, 12, 45, 8, -27, -47, 34, -36, 7, -13, 61, -38, 40, + 11, 38, -49, -51, 59, -16, 6, 44, -55, 22, 5, -10, 29, 1, 17, 0, + 45, 39, -49, 29, -6, 24, 31, 12, 35, -41, -46, -53, 56, -65, 9, 11, + -45, 62, 25, -47, 5, 0, -21, 50, 43, -1, -65, 73, 6, -42, 6, -39, + 56, 22, 62, -16, -15, 7, -46, -49, 74, -33, -29, 42, 37, -45, -14, 40, + -57, -6, -33, 22, 45, -32, 0, 6, 54, -14, -21, -38, -28, 43, -8, 0, + 50, 8, 47, -41, 0, -45, 13, -25, 1, 31, 43, -65, -45, -4, -46, -31, + 60, -90, 53, -35, 11, -54, 111, -76, 40, -13, 30, -24, -9, -53, 86, -66, + 65, 21, -4, -70, 46, 30, 3, -17, 37, -53, -15, 37, 19, -6, -46, 10, + 40, -56, 21, 40, -44, 71, -31, -1, -4, 33, 14, 19, 49, -39, 38, 40, + 6, -62, 99, -50, 107, -30, 0, 12, -27, 9, 16, -24, -20, 75, 22, 7, + 40, -25, 15, -39, -23, 23, -49, 7, -50, 35, -14, -20, -34, 54, 15, -10, + 66, 20, 4, 40, 11, 21, 22, -6, 28, -45, 27, 42, -1, -15, 42, 7, + -41, -33, -10, -1, -63, 54, 38, -18, 65, -85, 22, -72, 107, -61, 27, 33, + 52, -80, 41, 39, -55, 80, -41, 33, -3, -31, 41, 37, 32, 28, -50, 55, + 19, 44, -35, 87, 32, -36, 0, 33, -55, 50, 24, -43, -42, 14, -33, 69, + -43, -44, 48, -45, 63, -59, 2, 0, -17, 29, 58, -56, 26, -72, 95, -57, + 40, -46, 6, 34, -50, 28, -63, 28, -20, 0, 5, -22, 39, 41, -12, -27, + -36, -27, 19, 55, -56, 47, -78, 9, 16, -44, 97, -16, -46, 58, -8, 45, + -50, -70, -14, -7, 24, 23, -50, -23, -37, 28, 50, -57, 42, -29, 15, 28, + 7, -75, 29, -80, 53, 20, 42, 43, -84, 29, 46, -81, 19, 44, -55, 45, + 0, 20, -28, -3, -51, -4, 30, -24, -44, 28, 22, 33, 62, -69, 39, -9, + -39, -3, -16, -55, 5, -10, 46, 3, -39, 31, -15, 54, -10, 67, -6, 84, + -54, 70, -46, 31, -2, 1, -66, 26, 46, 17, -7, 39, 43, -32, -20, -28, + -3, 20, -55, 104, -85, 58, -29, -24, 0, 58, 16, 3, 17, -12, 55, -41, + -6, -24, 17, -9, -5, 17, -21, 18, -1, 28, -44, -50, 20, -1, -12, -4, + -55, 22, -36, -38, -49, 30, -68, 20, -2, 47, -18, -13, -1, -62, -23, 1, + -56, 62, -47, 47, 14, -31, 48, 23, 19, 39, -60, 56, -28, -44, 50, -56, + 9, -51, -24, 21, 19, -24, 2, -6, -13, 53, -43, 23, -83, 77, -24, -30, + 68, 1, 63, 0, -37, 41, -13, -50, 56, 21, 45, -6, -41, 58, -33, 23, + 10, 41, -9, 1, -26, -30, -42, 70, -50, 25, -11, -74, 38, -53, 25, -21, + 35, -13, -22, -66, 0, 34, -15, 0, 33, -72, 16, 11, 58, -42, 18, -7, + 63, -61, 7, -21, -31, 30, -38, -28, 47, -24, -21, -6, 61, -27, -37, 24, + -1, -32, 67, -66, 39, 39, 4, -58, 62, 19, 9, 25, -57, -34, -17, 71, + -74, 63, -42, -42, 87, -48, 37, 42, 26, -32, -25, 12, -25, 34, -48, 31, + 27, 59, 34, -5, 35, -66, 60, 41, -48, 4, -9, -38, -4, 48, -68, 19, + -8, -10, 72, -22, -5, -8, -47, -48, 33, -1, -1, 65, 9, -76, 63, -70, + 71, -8, 34, 36, 19, -1, 6, 64, -22, -13, -63, 30, -65, 10, -6, 18, + 26, -26, 61, 39, 30, -17, -29, 26, -14, -25, 0, 9, -50, -73, 43, -77, + 27, -30, 54, -32, -56, 35, 3, -17, -79, 10, -43, -45, 15, -30, 48, -59, + 12, 32, -44, 5, -40, -43, 60, -34, -8, -42, 15, -30, -4, -41, 31, -43, + 72, -12, -14, 48, -70, 60, -40, -6, 0, -11, -15, 52, -3, -44, -34, -24, + 93, -42, 45, 40, -20, 16, 32, 23, -88, 29, -31, 10, 19, 32, -12, 0, + -56, 44, -29, -43, 24, 7, -26, 30, -12, 20, 23, -51, 39, 16, -12, 3, + 48, 0, 20, -13, -54, 28, -19, -8, -37, 13, 25, 55, 6, -34, 9, 32, + -73, 86, -110, 65, -9, -23, 33, -14, -34, -19, -7, -35, -15, -59, 74, -74, + 13, -40, 4, 18, 47, 50, -26, -37, -8, 24, 32, 75, -74, 16, 5, -12, + -26, 34, -49, 111, -72, 49, -55, 20, -63, 47, 25, -53, 14, -10, -29, -27, + 16, 37, -44, 46, 20, -50, 30, 44, 13, 3, 19, 50, -82, 22, -23, -12, + 53, -54, 3, -50, 54, -24, -35, 98, -108, 56, -85, 51, -23, 32, -49, 35, + 77, -69, 24, 4, -55, -22, -5, -88, 54, -53, 80, -2, 2, -50, -8, -4, + -42, -27, -21, -41, 23, 37, -69, 45, 27, -8, 34, 36, -2, 8, 14, -14, + 26, -31, -63, 62, -40, 1, 55, 39, -28, 29, 8, -46, -55, 59, -18, 3, + -11, -75, 20, -53, 30, 16, -32, 6, -78, 98, -13, 29, 39, -33, -16, 5, + -32, -20, -19, -21, 2, -27, -1, -21, 9, -30, 4, -48, 71, 41, -9, -40, + 66, -55, 17, 38, 28, 40, -60, 54, 39, 21, 12, 17, 23, 17, 21, 37, + 35, -26, 9, 8, 7, 22, 60, -79, 95, -3, -29, 70, -28, 84, -73, 10, + -74, 76, -55, 54, 7, -41, 31, -11, -20, -13, 23, -16, 31, 25, 41, 58, + -78, -19, 8, -5, 61, -30, 20, 30, 89, -73, 68, -49, 36, 24, -5, 76, + 16, 9, 14, 82, -66, 22, 4, -62, 41, -98, 53, 5, 19, -6, 19, 0, + -1, -47, 3, 6, 51, -36, 5, 38, -26, 15, -69, -19, -29, 29, -59, 46, + 1, -63, 57, -44, -15, 43, -37, -45, 83, -77, 72, 0, 50, 18, -24, -16, + 0, 38, -69, 30, -66, 29, -30, -25, 76, -60, 16, -82, 61, -17, 33, -74, + 49, -16, -22, -39, 11, 2, 24, 1, 51, -13, -62, 1, 79, -26, 50, 18, + -57, 37, -23, -20, 6, 21, 14, -51, 21, -66, 17, -22, 61, -18, 42, -29, + 6, 36, 13, -20, 29, -35, 50, -61, 24, 8, 0, 6, -22, 15, -15, -9, + -37, 33, 0, 0, 95, -51, 67, 37, -48, 40, -77, 26, 21, 64, -27, 32, + 17, 38, 52, -58, 67, -8, -16, -7, -29, -56, -35, 20, 0, -14, 43, -5, + 52, 12, -26, 43, 12, -31, -14, 17, 6, 6, -15, 4, 12, 10, 53, -72, + 29, 69, -32, 31, -35, 30, -74, 40, 38, -50, -11, -60, 34, -32, 32, -10, + 8, 26, 9, -29, 59, 14, 47, -2, 4, -1, 25, 62, -75, 12, 52, 2, + 28, -22, -23, -58, 40, -79, 93, -46, 0, -20, 31, -68, 23, -72, 39, -76, + 63, -68, -7, 13, 52, -28, -39, 43, -56, -15, 18, -39, -34, -23, 61, 25, + 18, -61, -20, 8, -52, 72, 15, 19, -6, -6, 21, 20, -13, -13, -89, 24, + 26, 7, -26, 16, -89, 65, -73, -41, -48, 17, -14, -5, 24, -53, -43, -29, + -16, -32, 11, -39, -26, 45, -51, 6, 27, 40, -44, 18, -37, 2, -60, 20, + 31, 29, -27, 36, -10, -34, 58, -25, 50, -57, 70, 9, -42, 44, 18, -39, + -43, 10, 22, -32, 54, 6, -1, 54, -23, 42, -61, 41, -94, 9, 0, 36, + 34, 29, 10, -3, -35, -12, 59, 35, -51, 32, -43, 43, -16, 7, 26, 38, + -33, 18, 71, -10, -5, 30, -26, -30, -20, 11, 75, -15, -81, 18, -83, 61, + -18, 51, -25, 20, -15, -22, -37, 34, 46, -29, -27, 31, -54, -11, -16, -5, + 50, -44, 43, -4, -30, -24, 11, 1, 27, -2, 52, 13, -15, -6, 36, 26, + -19, -54, 73, -62, -28, -48, 47, -61, 41, -55, 59, 3, -25, -39, -15, -22, + 22, -75, 20, 2, -45, -37, 44, -3, 30, 69, 15, -62, -1, -20, 1, -50, + -31, 1, -1, -39, 35, -54, 15, -58, -1, -34, 51, -11, -5, -63, 43, 43, + -76, 2, -13, -65, 70, -53, 58, 20, -41, 8, 68, -16, 22, -4, 8, 18, + 32, 36, -57, 42, -77, 13, 15, -55, 44, -34, 43, -58, 3, 32, -80, 23, + -27, -21, 57, -6, 24, 21, -92, 68, -33, -16, -12, 48, -25, 52, -34, -19, + 31, 3, 55, 10, -73, 6, 80, -52, -15, 62, -59, 48, 33, 5, -66, 36, + -2, 98, -44, 0, 40, -32, -32, 39, -33, 27, -49, 2, -24, 17, 77, -56, + -51, 30, 44, -16, 11, 35, 8, 28, 3, 5, -33, -67, 71, -31, 73, 17, + 9, -36, 41, 39, -5, -47, 47, -7, -7, 26, -29, -19, 41, -38, 10, 59, + -83, -9, -38, 34, -67, 70, -80, 30, -44, -19, 30, -39, 45, 6, 7, 72, + 38, -24, 49, -78, 24, -43, 17, -17, -29, 21, -3, 4, 79, -51, 72, -79, + 1, -60, 30, -7, 47, 2, -38, -56, 52, 53, -36, -5, -3, 31, -29, -6, + -12, -23, -8, -71, 77, -88, 32, -27, 71, -43, -48, 80, 1, 57, 32, 23, + -80, 4, -24, 40, -56, 42, 39, -74, -1, 61, 30, -41, 87, -35, 65, -41, + 17, -55, 9, 18, 6, -35, 68, -44, -11, -54, -55, 35, -29, -54, 28, -77, + 42, -49, 39, 8, 34, 7, 16, -46, 24, -4, -19, -4, 45, -27, 70, -21, + -3, -25, 40, 4, -18, 38, 7, -21, 23, -84, 0, 89, -30, -31, 51, 38, + -44, 62, -52, 74, -55, 57, 14, 56, -39, 4, -40, 53, 7, 8, -54, 55, + 0, 56, 2, 40, -11, 5, -5, -11, 22, -39, -22, 9, -12, 10, -55, 0, + -66, 3, 1, 13, -5, 0, -23, 12, 1, 20, -22, -22, 52, -20, 5, 4, + -8, 63, -37, -51, -30, 53, 3, 62, -50, -6, 12, -30, -5, -2, 35, 26, + -60, 9, -61, -7, 45, 13, -61, 12, -26, 5, 51, -31, -51, -45, 61, 2, + -42, -63, 42, 27, -35, -3, 19, -17, -22, 32, -14, 49, 7, -6, -28, 38, + 44, 16, -71, 21, -39, 8, -61, 5, 31, 31, 38, 94, -81, 35, -6, -50, + 55, -39, -10, 30, -62, 79, -88, 25, 17, 2, -4, 32, -44, 66, -35, -27, + 66, 0, 91, -104, 98, -71, 39, -2, 59, -34, 38, -61, -13, -6, -27, -76, + -15, -5, 24, 26, -17, 69, -45, 9, 0, -21, 22, 23, -22, -45, -25, 8, + 63, -34, -33, 19, -80, 60, 4, -20, -3, -31, -11, 54, 2, -48, 80, -73, + 77, 1, 29, 24, -10, 24, 53, -48, -27, 43, -47, -43, -62, -13, -39, 48, + 11, 38, -31, -3, 60, -99, 75, 2, 15, -45, -4, -29, 7, -37, -34, 13, + 15, 71, -47, -12, 37, -66, 44, -46, 55, 63, -25, 68, -52, 74, 13, 23, + 45, -25, -7, 2, -20, -36, 46, 3, 28, -59, 88, -44, -10, -65, 49, -79, + 55, 11, -6, -5, 54, -78, 55, -2, 54, -42, 41, -77, 1, 10, 51, -99, + 87, -64, 52, -66, 36, -45, 50, -39, 45, 28, 32, -73, 35, -34, -52, 34, + -81, 24, -71, 38, 18, -43, 19, -7, 3, 0, 25, 34, -49, 16, 39, 44, + 45, -4, -13, -20, 49, -67, 47, -17, 34, -27, 26, 3, -24, 26, -61, 30, + -48, -19, 13, 75, 29, -27, 4, -71, 98, -69, 30, 36, 8, -32, 50, -47, + 87, -59, 75, 35, -74, 18, -22, 51, 52, -70, 4, -7, 56, 43, -37, -10, + -6, 71, -45, -37, -21, 20, -11, -18, 19, 36, 41, -80, -27, 30, 10, -45, + 29, -55, 74, 17, 24, -58, 50, 9, -36, -12, -33, -54, 7, 30, -37, 19, + -28, -28, 23, -15, 28, 6, 51, -45, 9, 0, 1, -37, 5, 36, -13, 12, + -59, -19, -60, 59, -11, -35, 10, 41, -47, 45, 19, 15, 14, -10, -10, 83, + -44, 33, -6, -48, 46, -54, 31, -38, 43, 35, -8, -43, 51, 63, 28, -43, + -40, 16, 57, 11, 50, -29, 16, -1, 29, 42, -47, -69, 50, -3, -44, 8, + -23, 1, -11, -78, 16, 14, -41, 28, 35, 30, 48, 45, 77, -27, 63, -74, + -42, 17, 20, 38, -36, 50, -24, -54, -8, 19, -8, -25, 61, -33, 63, -40, + 34, -86, 24, -7, 33, 33, -65, 28, -1, -94, 42, -16, 4, -25, -6, -2, + -65, 33, 4, 28, -48, 48, -31, 14, -37, 51, -73, -2, 49, 10, -1, 24, + -13, 42, -81, -3, 13, -19, -31, -2, -46, 37, 33, 30, -13, 10, -46, 64, + -49, 63, -53, 33, 12, 52, -25, -50, 1, -44, -23, -15, 45, 29, 74, -34, + 89, -68, 96, -27, -30, -42, 60, 12, -55, 68, -71, 2, 8, -6, -87, 23, + -49, 0, -38, 28, 45, -38, 48, -15, 31, -87, 35, -39, 48, 8, 65, 1, + 36, 55, -33, -63, -17, -36, 17, 25, -85, 39, 13, -4, -58, 69, -71, -4, + -29, 9, -49, -33, 46, 23, 8, -64, 36, -19, 9, 45, -71, 21, 14, -60, + 11, 40, -59, 36, 28, 10, -35, -47, 30, -79, 18, 38, 61, -1, -26, -23, + 79, -51, -33, -9, 44, 35, -4, 20, -35, 4, 14, 25, -39, -29, 17, 23, + 61, 21, -49, 51, -40, 11, -95, 72, -10, -12, 9, 18, -53, 6, 9, -67, + 61, 45, -11, 0, 23, -27, 35, -87, 47, -59, 0, 31, 3, -44, 17, -22, + 35, 34, 4, -12, -28, 17, -48, 95, -109, 24, -25, -29, -4, -74, -8, -3, + 37, 37, -91, 28, -79, 33, 35, -65, -50, -30, 68, 23, -5, 25, -25, 2, + -6, 8, 20, 34, 45, -2, 30, -61, 23, -61, -25, -42, -62, 29, -40, 83, + -16, 7, 8, -1, -26, -16, 27, -8, 61, -1, -51, 24, 48, -61, -33, 15, + 13, 51, -47, 31, -24, 42, -4, 40, 13, 80, -99, 49, -32, 5, 35, -19, + 62, -22, -17, -21, 59, -1, -10, 31, -28, 26, 23, -37, 22, -17, 8, -22, + -27, 26, 65, 14, 5, 0, 45, -12, -28, 50, -65, 41, -58, 74, -13, -50, + -25, -4, 18, -17, -36, -52, -9, 33, 38, 8, 32, 32, -68, 0, -55, 25, + -44, -10, -63, 22, 17, 88, -50, -35, 68, -45, 35, 52, -49, 57, 64, 3, + -4, -7, 42, -12, -33, 55, -70, -24, -29, 58, 43, -1, 0, -31, -77, 18, + -56, -27, -15, 66, -32, 29, 58, -101, 85, -13, 52, -61, 16, 16, -12, 70, + -52, 14, 33, 2, -66, 24, 8, 4, 28, -22, 59, -79, 87, -65, 46, 53, + -4, -50, 55, -15, 38, 24, 15, 48, -18, 34, -52, -34, -58, 34, -57, 14, + -53, 36, 50, -54, -30, -16, -18, 9, 34, -30, 32, -22, 33, 10, 8, -72, + 33, -63, 32, 26, -29, 29, 33, 5, -77, 51, -1, -26, 30, 16, 22, 37, + -21, -28, 43, -17, 29, -8, 4, 28, 28, 3, -14, 2, -48, 57, 11, -21, + -36, -9, -39, -7, 42, 27, -35, -53, 55, 35, 12, 19, 57, 3, 39, -34, + 70, -57, 50, -3, 42, -22, 2, 38, 46, 45, -27, -72, 69, -68, -7, 66, + -18, -8, -12, -9, -38, -9, 30, -46, 36, -27, 70, -22, 47, -40, 16, -35, + -1, -11, -24, -16, 28, 42, -41, 10, -20, -11, 34, -42, -17, 66, 0, -30, + -43, 8, -17, -15, -20, -38, -8, 3, -39, -63, 79, 39, -2, -3, -54, 61, + -23, 20, -14, -15, -39, 9, 20, 44, -70, 45, -33, 44, 10, 3, -5, 35, + -18, -35, -54, 20, -59, 46, -59, 6, 75, -73, 10, -8, 3, -9, -49, 61, + 68, 4, -25, -26, 66, 60, -51, -35, 37, -32, 36, -56, 75, 7, -1, -6, + 62, -28, 54, 66, -45, -77, 36, -17, -64, 42, -46, 6, -26, 6, -43, -54, + 68, -38, -56, 75, -34, -40, 67, 35, -8, 2, -84, 29, -45, -30, 60, 39, + 4, 13, 40, 8, 28, -55, 28, 16, 24, -44, -60, 54, 22, -63, 70, -33, + 15, -49, -25, 43, 9, -40, 9, -40, -60, 21, 20, -10, -78, 44, -82, 18, + -45, 60, -71, 48, -92, -32, -6, 36, -20, 3, 75, -46, 68, 18, 35, 26, + -18, -13, -25, 37, 46, -66, 43, 3, 24, -3, 20, 41, -80, 70, 0, 2, + 17, 61, -39, 41, -48, -59, 50, 6, 40, 2, 36, 9, -20, 14, -75, 60, + -52, 38, -34, 14, -9, -27, 1, -26, 36, -11, -44, 57, -41, 15, -1, -24, + 10, 60, -45, 38, -22, 43, 3, 3, 1, -21, -32, 0, -72, 14, -43, -26, + -68, 30, 16, -17, 28, -10, -35, 6, -8, -46, -2, 71, -107, 101, -62, 3, + 16, -34, 8, 27, -66, 75, -86, 72, -46, 17, -15, -13, 36, 6, -33, 36, + 69, -40, 21, 40, -36, 3, -46, 34, 14, 26, 5, 44, -6, 1, -18, -11, + 60, 28, 37, 26, 37, -40, 37, 26, -28, 82, -92, -54, -14, -27, 71, -69, + 27, -47, 36, 10, 32, -75, 25, -57, 42, -39, -46, 2, -65, 3, 18, 27, + -32, 27, 64, -54, 84, -37, 54, -50, -45, 65, -46, 15, -60, 66, -5, -7, + -86, 9, -14, 36, -69, 5, 73, -49, -17, -31, 28, -26, 4, -30, -33, -27, + -59, 85, -70, -66, -7, 94, -58, 7, 64, -43, 89, -56, -8, -12, 42, -29, + 0, 16, 74, -98, 30, 53, -84, 3, 25, 0, 51, -29, 35, 35, -30, -83, + 37, -3, -56, -25, 2, -22, 55, -35, 2, 40, -24, 56, -70, 75, -111, 61, + 1, 64, 57, -54, 14, 25, 43, 27, -7, 61, -38, -3, 47, 32, 9, 38, + -30, 16, 37, 9, 52, 38, -19, -5, -5, 16, -63, 25, -14, -42, 26, -44, + -10, 17, 29, -60, 21, -4, 28, -68, 16, -52, 40, -48, 77, -58, -34, -17, + 54, -74, -31, 37, 62, 1, -40, -5, -61, 26, -63, -1, 44, 0, 55, -57, + -22, 17, -12, -3, 63, -55, 33, -2, -34, -25, 19, 36, -29, 50, -44, -6, + 36, -23, -34, 12, 37, -12, -55, 38, 40, -45, 19, 16, 43, -13, 56, 15, + 64, -63, -17, 23, -26, -10, -1, 4, -19, 65, -40, 24, 40, 15, -47, 32, + 52, -25, -24, 21, 20, -9, 48, -4, 28, -32, -16, -44, 19, -70, 76, -62, + -39, -5, -59, -5, 14, -11, 51, 28, -19, -49, 17, -79, 31, 3, 14, 54, + -53, -44, -12, -9, -1, 12, -66, 58, -23, -47, 88, 64, -21, 72, -62, 39, + -27, -12, 56, -16, -7, 56, -45, 36, 4, 37, 53, 16, 34, 12, -29, 11, + -13, 51, -59, -38, -32, -30, 55, 12, -19, 46, -26, 21, 19, 11, -45, 62, + 63, -40, 8, -8, 43, -8, -38, 45, 23, -19, 0, -46, 30, 28, 72, -15, + 62, -81, 17, 89, -25, -25, 6, 48, -9, -44, 8, -20, 35, 51, -51, 27, + 40, -12, -46, 89, -53, 16, 5, -5, 33, -101, 53, -17, 38, -9, 76, -4, + 40, -17, 63, -48, 85, -41, -53, 13, -18, 5, 16, -73, 4, 31, 47, -18, + -13, -64, -36, 4, 16, 35, -61, -22, 58, -69, -24, 37, 2, -59, 1, -27, + 49, -67, 14, 4, -52, 16, -88, 43, -34, 14, 18, 6, -12, 40, -78, 73, + 2, -20, 13, 28, -36, 5, 75, -32, 35, -25, -47, 6, -14, 6, 55, -72, + 38, 4, 40, -66, -73, 14, 40, 1, 6, 31, -65, 83, -61, -49, 18, 37, + 25, -17, -34, 0, 14, -59, 73, -13, -10, 43, -16, 3, -5, -25, 70, -57, + 46, 13, -30, 37, -64, -11, 6, 7, 4, -34, -3, 39, -33, -41, 4, 22, + -69, 84, -32, 82, -48, 21, -16, 13, -40, 48, -58, 26, -42, -47, 89, -100, + 34, -34, 50, 28, -13, -53, 4, -41, -22, 29, 72, 14, 26, 24, -54, 92, + 7, 16, 66, 30, -41, -3, -36, -16, -42, 9, 73, -21, -4, 28, -23, -41, + -12, -8, 55, -6, 9, -33, 12, -28, 26, -15, -83, 22, -66, -4, 9, 8, + -29, 22, -26, -35, 45, -33, 6, -1, 6, -21, -59, -1, -14, -22, -3, 0, + 36, -46, 56, 65, 24, 0, -15, -23, 52, -35, 36, -16, 22, -11, 12, -76, + 35, -1, -5, -4, -6, 27, -30, 13, -19, 1, 52, 1, 13, -30, -62, -14, + -18, 55, -16, -24, 0, 37, 9, -41, 12, -25, 53, -47, 32, -50, -6, 7, + -21, 13, -19, -16, -26, -25, 63, -17, 7, 85, -74, 23, -46, -36, -97, 71, + -85, 5, -55, 11, -62, 62, -1, 11, -18, -7, 30, 44, 1, -68, 19, -45, + 35, 38, 5, 34, -67, 16, -49, 78, -31, 8, 25, -7, -9, 20, 3, 42, + -84, 89, -41, -4, 27, 35, 58, 35, -55, 31, 7, 1, 17, -59, 90, -87, + 70, -1, -42, -61, 72, -43, -40, -30, 28, 12, 66, -44, 10, -4, 31, -5, + 14, -56, 29, 47, 55, -12, 19, -54, -4, -2, 56, -88, 40, 19, -38, 42, + -74, -23, 52, 39, -30, 73, -83, -34, 18, 46, -50, 60, -16, -14, -34, 38, + -37, -27, 30, 31, 25, 15, -42, -48, 49, 42, -78, 29, 3, 14, 22, -5, + 10, -24, -5, -53, 18, 12, -31, 77, -49, -13, 38, -2, 28, -14, -12, 74, + -9, -53, 42, -91, 3, 68, -39, 27, 51, -34, -46, -45, 4, -4, 12, -52, + -56, 70, -86, 0, -8, 20, -6, 15, 57, -32, -21, 16, -18, 31, -28, 28, + 34, -48, 28, -29, -64, 43, 27, 18, 18, 45, 45, -36, 52, 2, -2, 39, + -28, 23, -69, 67, -63, 34, -27, 36, -16, 29, 27, -20, -6, 53, 25, -35, + -44, 23, 0, -61, -22, -33, 58, -41, -39, 26, -14, 3, 56, -81, 12, 0, + 7, 6, -58, 6, 58, -51, 5, 18, -26, -33, 20, -52, 59, -4, 16, 40, + 13, 41, -43, 3, -61, 35, -18, -26, -27, 55, 10, -38, 86, -49, 31, -10, + 27, -4, -37, 30, 31, 25, -43, -61, 67, -95, 27, 32, 0, 69, 46, -12, + 46, 25, 11, 55, 34, -64, 44, 35, -73, 61, -96, 40, -4, 0, 1, 35, + -79, 57, -78, 61, 0, -18, 58, -63, -25, 23, -59, 70, -41, 37, -18, -20, + 65, -43, 4, 1, -28, -48, -58, -27, 74, -53, -10, 23, 0, 51, -76, 60, + -21, -53, 55, 73, -55, 67, -20, 57, -41, -15, -14, 8, -1, -60, 55, -81, + -18, -2, 5, 0, -56, -1, 60, -39, 54, -70, 48, -15, 51, 25, -42, 0, + 36, 35, -30, -48, 2, -21, 36, 62, -59, -3, -23, -9, 0, -30, 28, 31, + 0, -33, -20, 0, 0, -27, 69, -14, 5, -16, 68, -1, 13, -47, -39, -14, + 56, -36, 8, 36, -53, 8, 0, -47, 73, 4, 7, -25, 42, -40, -15, -33, + -6, 24, 19, 26, 20, -24, -21, -5, -32, -40, 89, 19, -46, 45, 38, -10, + 16, -21, 58, -16, 53, -51, 28, -19, 24, -25, -20, 11, -3, -51, 48, -18, + 38, -1, -5, 28, 45, 19, -31, -59, 41, -77, -9, 83, -67, 2, -34, -21, + 2, 22, 52, 8, -30, 21, -38, 32, 21, -39, 8, -48, 37, -74, 43, -27, + 33, -14, -43, 6, 82, -62, -12, 56, -2, -53, 53, -45, -18, 47, 34, -51, + 43, -7, 15, 43, -78, 77, -20, 36, 8, -32, 48, 46, -74, 28, -41, 13, + 8, -26, -46, 70, 5, 11, 6, 20, 48, -70, 44, -45, -42, 39, -62, 57, + -97, 53, 38, -77, 67, -45, 92, -19, -16, 75, -69, 23, -32, -21, -28, -41, + 19, -44, 51, -74, -26, -3, -14, 8, 27, -27, 29, -19, 42, 29, 4, -80, + 90, -46, -26, 21, -2, -74, 38, 34, 69, -59, 38, -30, -6, 43, -3, -21, + -24, 20, -26, -19, 59, 20, 56, -15, -46, 51, -40, -29, 13, -6, -12, -18, + 36, 18, -49, -27, 36, -71, 9, 2, -43, 51, 10, 9, 40, -25, 31, 78, + 53, -48, -2, -25, 89, -56, 26, -71, 64, 40, -18, 15, -47, -21, 68, -72, + 57, 13, 4, 11, 43, 1, 45, -104, 32, 15, 19, -27, 62, 0, -19, -19, + -9, 0, 59, -52, 43, -25, -32, 37, -38, 39, -75, 5, -44, 73, 25, -33, + 25, 38, -2, 0, 24, 8, 31, -48, -33, -25, 26, -41, 16, 24, 41, -14, + 4, -3, -54, 34, 6, 29, -15, 69, -39, 45, -38, -19, -13, 10, -32, -63, + 64, -65, 34, -47, 43, -20, -18, 78, -50, 61, -72, 60, -42, 82, -94, 64, + -56, -24, 41, -83, 55, -34, 3, -6, 52, -8, 1, -56, -19, 69, -51, 55, + 19, 16, -95, 40, -41, 30, 6, -19, -51, 54, -28, 45, 2, 6, -13, 29, + 13, -36, 57, 2, -35, 45, 32, -55, 7, 6, -17, 29, -25, 18, -20, 4, + -15, -18, 30, 2, -50, -13, 29, -42, -20, 10, -55, 9, 5, -8, -10, -42, + 50, -44, 94, -62, -61, 53, -51, 12, -62, 25, 35, -2, -1, -15, 36, 3, + 59, 12, -67, 66, -62, -21, -44, -19, 21, -77, 93, -65, 59, -12, 25, -4, + 4, -12, 9, 34, -44, 47, 39, -44, -16, 11, 7, 43, -69, -5, 0, 90, + -96, 38, 56, -53, 46, 44, -5, -6, -47, 8, 35, -63, 66, -89, 37, -5, + 37, -56, 59, 6, -97, 30, 13, -13, 21, 8, -15, 60, -62, 62, 8, -26, + 32, -25, 0, 23, -42, 84, -76, 54, 2, 13, 13, -63, 27, -60, 1, -88, + -15, 2, 39, -11, -60, -5, 33, 28, -54, -43, -19, -63, 48, 24, -41, 26, + -60, 22, -57, -7, 8, -64, 42, 36, 21, -20, 37, -65, 0, -27, -26, 64, + 0, 40, -84, 50, -63, 95, -18, 18, -50, 38, -24, 76, -45, -4, -47, -6, + -45, -21, 11, -8, -32, 24, -58, 77, 80, -52, -34, 44, -15, -11, 13, -51, + -26, 28, 35, -25, 26, -89, 43, -25, 36, -34, 26, 27, -10, 25, 49, 49, + -64, 37, -20, 33, -62, 0, 6, -85, 12, 8, 35, 20, 58, -91, 76, -98, + 79, 2, 9, 6, 23, -19, -17, -16, -28, 0, 45, 57, -45, 36, -8, -17, + -20, 40, 43, 13, -21, -43, 18, 18, 58, -49, 12, 12, -35, -19, 54, -68, + 68, -51, 12, 10, -27, -14, 0, 35, -35, 16, -9, -29, 32, -73, 62, -93, + 65, -11, 31, -60, 87, -56, 67, 12, -7, 8, -29, 13, 25, 20, 8, 60, + -53, -19, -16, 4, 81, -75, 106, -97, 81, -15, -11, 6, 15, -32, -13, 5, + -61, -14, 46, 24, -11, 55, 7, 38, -39, 79, -22, -39, 24, -41, -39, 65, + -24, 9, -24, -12, 55, -43, -9, 11, 4, 62, -73, -3, -31, 46, -61, -25, + 42, 16, -61, 0, 3, 29, -53, -21, 56, 7, -34, 12, 11, 21, -3, -13, + -37, 34, -25, 18, 82, -54, 1, 49, -65, 55, -23, -29, -13, -48, 5, -24, + -58, 41, -26, 38, -11, -19, 61, -61, -35, -31, -5, 29, -5, 47, 55, 19, + -14, -11, -34, 3, 26, 62, -42, 19, 15, 16, 60, 43, 16, 9, -44, 59, + -54, 37, -3, 29, -44, -26, 33, -64, -18, -37, 50, 27, 46, 32, -24, -5, + -36, 9, 27, 11, 5, -88, 5, -48, 53, -70, 54, -61, 9, 47, 65, 15, + 20, 2, -12, 28, 46, -78, 75, -89, -50, 40, 46, -50, 31, -43, 18, 45, + 29, -27, 4, -33, -12, 82, -80, 68, -55, -21, -50, 8, 50, -86, -4, -32, + 2, 42, -64, -11, 23, 50, -30, 80, -5, -53, -44, -32, -26, 44, 4, 57, + -79, 26, -44, -1, -27, 9, 12, 30, 14, -2, -52, 2, 4, -23, 74, -47, + 26, -81, 23, -76, 57, 60, -63, 31, -50, -4, 29, -52, 71, 0, -11, -43, + 60, -40, 4, -27, 37, 7, 29, -40, -29, 67, -2, 42, -16, 8, 14, 31, + -2, 17, -70, 50, -17, -14, -44, -2, -19, 43, 42, -1, -43, 49, -25, -7, + -11, 70, 27, -75, 14, -19, -48, 74, -6, -53, 64, -95, 57, 6, 39, 15, + 8, -35, -28, 21, -65, 25, -52, 25, 3, -61, -11, 55, 21, 30, -16, -22, + -1, 33, 0, -3, -48, 38, -49, 8, 49, -86, 48, 12, 17, 10, 9, -35, + 44, 0, 48, -48, 15, -74, 81, -68, -29, -44, 107, -86, 55, -61, -9, 23, + -39, 15, 11, -27, -3, -44, -8, 22, -33, -24, -25, 46, 56, 9, 32, 37, + 24, 3, 58, -70, 28, 34, -57, 59, 69, -57, 40, 16, -21, -36, -49, 11, + 60, 23, 41, 13, -50, -1, -23, -10, 1, -23, -78, -7, -41, -33, 0, 4, + 57, -60, 58, -8, 41, 55, -34, 38, 61, -42, 0, -63, -15, 1, 11, -26, + 12, -23, 13, -7, 21, 58, 44, -6, -21, 62, 23, -34, 51, -75, -59, 44, + -81, 62, -19, -73, 24, -4, 3, 21, 76, -72, 64, -47, 39, -35, 30, -60, + 51, -58, 39, 31, -24, -25, 54, -18, 21, 47, 39, -26, 4, 78, -64, 65, + 40, -51, 87, -18, 31, -17, -33, -1, 12, 69, 61, -14, -29, -21, -3, 45, + -10, -33, 28, 23, 34, 16, -40, -19, -30, 27, 12, -46, 34, 31, -86, 61, + -66, 100, -60, 79, -23, -29, 43, -34, 4, 0, 11, -5, 20, -36, 24, -29, + 4, 37, 19, -29, 0, 11, -22, 33, 18, -75, 45, -76, 28, 14, 26, -13, + 23, -75, 75, -30, 2, -5, 42, -11, 27, -19, -75, -22, 16, -25, 19, -46, + 20, -57, -18, 55, -8, 52, 27, -25, -42, 41, -33, 69, -23, -16, 36, -39, + 10, 17, 2, -1, 80, -18, -3, 7, 11, 15, -32, -30, 10, -29, 18, -16, + 12, 53, -63, 5, 53, 31, 5, 35, -23, -17, 42, -3, 3, -11, 57, -66, + -38, -13, 38, -74, 99, -66, 46, 41, 54, -32, -36, -5, 17, 44, 41, -32, + 34, 1, 29, -4, 9, 33, 39, -92, 81, -16, 40, 7, -83, 29, 18, -48, + -36, -3, -19, -33, 37, -12, -39, -28, -13, -28, 45, -57, 3, 18, 37, -74, + -15, -7, 25, -33, 19, 3, -3, -33, 8, 35, 51, 26, 0, 48, -63, 70, + -56, 13, -28, -46, 27, -84, 36, -43, -1, 15, 2, 58, -10, -26, 24, -5, + 35, -10, 68, -86, 54, -85, -18, 25, -36, -37, -10, 16, 43, -7, 40, -37, + 72, -5, -12, 50, 19, 5, 36, -51, -44, 4, -49, 0, 0, 64, -65, 17, + -35, 59, -16, -6, -47, 34, 11, -58, -33, -66, 59, -55, 35, -41, -5, 5, + -75, 47, -91, 43, -51, 97, -70, 58, -44, -66, -86, 61, 70, -42, -15, -55, + 46, 27, -2, -69, 31, -10, -18, 72, -39, 34, 46, -33, 13, -13, 25, 0, + -33, 47, -31, -12, 33, -18, -57, 96, -25, -36, 69, -51, -17, -9, 20, -2, + -73, 76, -47, 64, -31, 6, 6, 21, -26, 25, 18, 12, 34, -17, -78, 30, + 57, -12, -7, 27, -19, -9, -5, 14, 13, -15, 67, 50, 2, -1, -48, 51, + -29, 8, -5, -35, 65, -68, 3, -21, 51, -79, 85, -49, 2, -32, 0, -5, + -21, 8, 47, 23, -90, 19, -21, 21, 68, -51, 39, 7, 8, 52, 1, -54, + 33, -64, 52, -3, -39, -79, 32, 11, -59, 57, -57, 3, 19, -40, 1, 60, + 34, -6, -7, 74, -78, 58, -5, -49, -21, 9, 48, 39, -40, -11, -78, 60, + -25, 43, -33, 6, 44, -55, -12, 51, 2, -16, -32, -3, 45, -70, 1, 22, + 10, 50, 0, 13, 12, -64, 35, 60, 9, 18, 0, 59, -95, 55, 18, 22, + 47, -36, -35, 18, -46, 7, -21, 63, 24, 5, -46, 6, 17, 18, -7, -20, + 0, 58, -32, -8, 51, 60, -50, 21, 16, -49, 13, 3, -59, -22, 51, -2, + 1, -48, -40, 24, -7, 39, -5, 16, -23, 80, -37, -19, 3, -20, 13, -29, + -51, 34, -21, -70, -3, -2, -18, 50, 6, 72, -41, 51, -22, -3, 16, 40, + -35, 5, -3, -32, 10, 47, -24, 62, 38, 65, -57, 38, -53, 53, 0, 6, + -11, 53, -5, 28, 16, -87, 61, -78, 77, 62, 76, -48, -16, -17, 94, -31, + 25, -50, 36, 6, 15, -37, -2, -57, 86, -65, 12, -40, -43, -18, 27, 5, + -30, -37, -33, 52, -72, 23, 31, -93, 23, 0, -42, 32, 49, -20, -20, 8, + 64, -45, -4, -22, 4, -16, -15, -32, 50, -66, 6, -9, -9, -59, 70, -20, + -39, -31, -21, -16, 35, 39, -11, 3, -17, 27, -30, -57, 40, -27, 49, 13, + 25, 39, 11, 64, -67, 13, -35, 44, -35, 33, -49, 18, 26, -6, -59, 46, + -4, -13, -29, -60, 84, -16, 3, -30, -89, 38, -31, 49, -52, -30, -4, 63, + -57, -19, 20, -34, 16, 98, -79, 49, -8, -5, 4, -40, 56, -26, 43, -81, + 15, 37, -78, 6, -45, -5, 33, -25, -2, -18, -43, 21, 2, 30, -12, 40, + -64, -1, -64, 19, -12, -9, -3, 13, -24, -1, 45, -72, 66, 20, -47, 14, + -11, -26, -38, 20, 27, 24, 14, -77, -16, -51, 44, 8, 74, -60, 25, -92, + -5, -6, -13, 50, 6, 26, 32, -79, -16, 16, -21, 31, -31, 24, -48, 35, + 9, -56, -14, 36, -57, -57, 61, -20, -39, 42, -27, -22, 81, 27, -50, 49, + -49, 40, 5, 15, -4, -34, 70, -83, 91, -91, 50, -47, 6, -16, 27, -50, + 70, -81, 69, 71, -38, 35, -43, 14, -22, -44, 38, -32, -18, -37, -49, -1, + 21, 27, -5, 22, -34, 1, 4, -80, 5, -59, 18, -53, 75, -62, -1, 3, + -16, 2, -29, 5, -64, 73, -41, 62, -44, -62, -74, 43, -28, -9, -82, 57, + 39, 13, -16, -21, -51, 94, -34, 62, -85, 12, 40, 54, 53, 3, 0, -62, + 72, 33, 8, -48, 50, 30, 10, 44, 0, 42, -42, 66, -72, 10, 26, 63, + -88, -9, -28, -5, -10, 8, 76, -26, -48, 88, -82, 72, -32, 7, 37, -20, + 23, 14, 24, -30, -19, -3, -29, -10, -27, 25, -38, -32, 25, 51, -31, -50, + -60, 0, -28, -69, 74, -43, -14, 63, -50, 6, 32, 15, -51, 49, 46, 29, + -39, 12, -35, 43, 29, -62, 24, 49, 30, 49, -57, 27, 35, -25, -1, 12, + 12, 39, 43, 28, -37, -43, 24, -55, 59, -37, 53, -24, -44, -6, 30, 14, + -72, 26, 48, -2, 56, -17, 4, 23, -1, 70, -20, -24, -21, 35, 42, -64, + 51, 27, 9, 47, -49, 18, -42, 49, -24, 10, 13, 25, -43, -15, 56, -20, + -12, 51, -43, -12, -34, 21, 34, 34, 34, -14, -33, -7, -82, 75, -51, 75, + -19, 61, 24, 23, -66, 47, -39, 20, 34, -10, 0, -15, -17, -27, 14, -41, + 54, 7, 41, -10, 11, 45, -10, -17, 85, -21, 36, -26, -47, 28, -42, -59, + 58, 7, -26, 33, 35, -50, 19, -5, -38, 42, -18, 8, 48, 25, 30, 36, + -27, 36, -44, -59, 16, 44, -15, 13, -30, 82, -16, 30, 51, 36, 52, 18, + 16, -44, 20, -21, 36, -59, 44, 19, 58, 3, -6, 60, -45, 0, 34, 49, + -48, -29, 66, -8, 79, -23, -28, -27, 2, 45, 67, -48, 14, 10, 58, -65, + -52, 7, 12, 5, 12, -49, -13, -2, 18, 39, -28, -73, -18, -26, 88, -16, + -20, 13, 41, -9, -22, -65, -2, -16, 21, -41, 35, -27, -17, 30, -33, -51, + 86, 34, 47, 37, -41, 6, -65, 61, -38, 9, 58, -62, 48, 16, -16, -39, + 42, -19, -18, 42, -3, -46, 55, -25, 36, -30, 41, 38, 37, -89, -31, 56, + 78, -41, 4, 62, -51, 39, 30, -23, -17, 5, 24, -62, 36, -57, -11, -37, + 27, 70, -23, -5, -40, 63, -35, 17, -72, -48, 68, -55, -42, 56, 68, -99, + 65, -39, -70, -9, -26, 69, 21, -14, 14, -11, 18, -52, 37, 73, -27, -26, + 74, -19, -44, 64, -90, 57, -7, -30, -61, 11, 6, -1, 12, -17, -16, -11, + 35, -52, 8, 47, -23, 7, -34, 22, -10, 12, 28, -61, 26, 61, -32, 10, + -30, 33, 12, 14, 21, -7, -80, 24, 17, -6, -5, -25, 70, -25, -7, -12, + 48, -97, -8, -65, 14, 1, 11, 32, -62, 11, -18, -24, 10, 12, 5, 47, + -17, -40, 27, -27, 1, 2, -30, -3, -59, -10, 1, -45, 69, 33, -8, 48, + -91, 57, 7, -42, -18, -7, -34, 21, 42, -23, 57, -49, -42, 6, -62, 0, + -3, -5, 79, -18, 8, -58, 9, 3, 1, -84, 17, -38, -49, -22, -52, -8, + -57, 60, -27, 27, -79, 71, -52, 55, -61, -25, -13, 0, 48, -18, -19, -23, + 74, -56, 23, -26, -39, -29, 55, 21, -12, -22, 43, -33, 3, 29, -11, 10, + 34, -24, -28, 11, 42, 15, 60, -48, 56, -93, 61, 38, -1, -34, -41, -1, + -23, 5, -15, -49, 52, -20, 89, -63, 33, 27, 6, -37, 73, -77, 71, 4, + -37, -34, -1, -67, 84, -41, 26, 46, -43, -14, -11, 14, -26, -18, 48, 9, + -33, 10, 32, 30, 10, 46, -71, 50, 12, 23, -50, 0, -27, 56, 36, -8, + -77, -25, 15, 34, 0, -45, 15, -5, -17, 77, -88, 95, -52, 65, -3, 10, + -38, -31, 2, -13, -16, -5, 22, 9, 52, 36, -63, 22, 50, -55, -73, 78, + -45, 56, 17, 55, -38, -16, -32, 46, -43, -18, 5, 40, -33, -54, -16, -2, + -24, 20, 10, -41, 88, -96, 62, 39, 73, -69, -3, 18, -39, -1, 6, 19, + -56, 90, -69, -24, 0, 5, 47, -36, 40, 2, -55, 73, -35, -36, -26, 46, + 5, 3, -62, 35, 27, -62, 47, 11, -79, 80, -33, 20, -28, 5, 25, -21, + -7, 67, 21, 70, -45, 10, -38, 37, 69, -21, 37, -21, -6, 66, -37, -20, + 9, -3, -44, 16, -9, 72, -37, 46, 51, -43, 90, -38, -75, 16, 1, 21, + 19, -31, -10, 12, 33, 25, 1, 41, -49, -10, -56, 87, -40, 12, -33, 34, + 26, -19, -53, -13, 20, 0, 71, -61, 26, 63, -26, 42, 27, -20, 39, -30, + 74, -80, 73, -30, 76, -21, 19, -53, 67, 61, -37, -8, -29, 19, -34, -53, + 63, -30, 11, -15, 49, -31, 19, -6, 3, -35, -20, 84, -74, 72, -70, 25, + 48, -58, 9, 30, -15, -51, -20, 8, 52, -34, 38, -78, 46, 23, -32, 59, + -56, 29, 50, 12, 27, -8, -53, -35, 20, 9, -69, 69, -11, -16, 39, -24, + -9, -10, -14, 60, -71, 21, -21, -79, 43, 47, -61, 9, 13, -4, -66, 45, + -44, -45, -7, -70, 19, 0, -6, -20, -50, 15, -42, 7, -3, -10, -28, 14, + 43, 56, 14, -45, -26, 61, -79, 66, 10, -42, 6, -31, 35, -19, -41, 64, + -3, -13, 51, -20, -3, -11, 27, -65, -4, 6, 46, -32, 19, -16, 71, -49, + -26, -12, -15, -14, -23, 9, 17, -56, 51, 24, -3, 0, -28, 67, -32, 65, + -55, 3, -13, 3, -24, 42, -32, -83, -44, 106, -54, 91, -49, 80, -74, 0, + -7, -7, 34, 47, -31, -37, 1, 51, -74, -17, -9, -40, 62, -3, 0, -52, + 51, 24, 17, -29, -23, 76, -61, 34, 47, -51, 39, -58, -2, 45, -34, 20, + 4, -60, -34, 7, -31, 79, -37, -9, -77, -16, 9, 18, 33, -50, -51, 27, + 27, -18, 87, -35, -5, -37, -32, -51, 2, 45, -109, 65, 37, -10, 32, -54, + -17, 35, -15, 15, -22, 42, -59, 50, -33, 56, 39, -90, 57, 7, 25, 27, + -61, 56, 64, -2, -8, -32, -21, 17, 15, -53, 3, -26, 35, -64, 54, -7, + -55, 49, -42, 52, -41, -1, 2, 13, -49, -60, 58, -51, 55, -45, 38, 43, + -54, 38, -24, -2, -3, 43, -68, 29, -62, 52, -24, -84, 82, -81, 7, 29, + -40, 24, -7, -22, 53, -28, 8, -25, -33, 54, -81, 92, -81, 56, 32, -46, + 29, -56, 9, -69, 30, 0, 34, 56, -28, -53, 74, -42, -40, 13, -63, 2, + 30, 17, -49, 30, 49, -43, 28, 90, -83, 47, 70, -67, 36, 45, 17, -19, + 60, 45, 9, 26, -14, -3, -10, 45, 7, -28, 66, -17, -14, 32, 52, -37, + 16, -65, -42, 6, -15, 53, -3, -39, 30, -18, 10, 47, -69, 83, -53, -60, + 62, 11, 22, 23, -17, -17, -27, 47, 18, -18, -38, -36, -20, -18, -8, 72, + -19, 30, -53, 42, 9, 44, -37, 27, -79, 70, -32, -3, 81, -61, -16, 19, + 76, -61, 18, -31, -4, 11, 21, 37, 63, -81, -31, -58, -7, 1, 73, 16, + 0, -4, 18, -47, -28, 80, 1, -68, 54, 29, -26, 81, -88, 45, 34, -28, + -40, -50, -37, 2, 33, -81, 18, 33, -66, 22, 41, 35, -42, 55, -57, 13, + -42, 64, 6, -45, 40, -64, 7, 9, 35, 43, -36, 31, 35, -29, 58, 11, + -9, -34, 0, 0, -14, 45, 61, 7, -23, 10, 64, -14, 2, -25, -49, 51, + 43, -31, 35, -8, 10, -15, -34, 6, -50, 14, -63, 55, 15, -61, 49, -61, + 5, -53, -42, 2, -29, -33, 47, -35, 52, 13, 54, -3, 19, 54, -50, 28, + 23, -49, -14, -33, 0, -23, 4, -15, 32, 32, -55, 11, 2, 52, -54, 72, + -55, 41, -14, -55, 73, -66, 7, 19, 34, -4, 17, 62, -17, 52, -45, 41, + 5, -29, 37, 23, -17, 0, -22, 14, -16, -10, 22, 11, -19, -59, 26, -24, + 86, -46, 34, 57, -15, -44, 50, -87, 60, -44, 45, -73, 91, -74, 80, -8, + 7, 49, 19, -38, -40, 58, -1, -32, -17, -31, -42, 18, 5, -41, -59, 22, + -66, 32, -8, -20, 65, -13, 29, -21, 19, 0, -13, 7, 35, -8, -29, 4, + -16, 60, 29, 43, 18, -30, -47, 74, -2, 2, 5, -57, 25, -19, 31, 27, + -51, -32, -27, -53, 13, 25, 27, -32, 0, -46, 79, 62, 43, -8, 6, -43, + -20, 57, 17, 31, -42, -52, 36, 14, 5, -10, -39, -27, -64, 63, 20, -7, + -61, 95, -32, 13, 22, -64, 37, 10, -88, 67, 21, 82, -11, 0, -67, 24, + -17, -38, -5, 8, -9, -21, -34, 34, 27, -46, 71, -61, -4, 35, -14, -18, + 44, 52, 70, -30, 52, 43, -43, -42, 74, -59, -26, -45, 1, -27, 49, -4, + -24, -46, 48, -16, 40, -11, 0, -6, 6, -39, 37, -68, -18, -9, -19, 76, + -51, 13, 7, -40, -11, 19, -17, -29, 36, -23, 0, -62, 52, -46, 62, -70, + -15, 3, 29, -91, 64, -85, 47, 4, 23, -5, 43, -18, 12, -44, 2, 15, + -32, 76, 17, 25, 3, 51, 23, -55, 0, -47, -22, -51, -20, 32, -51, 30, + -20, 37, 42, -42, 52, -43, 64, -68, 44, -5, 68, -48, 32, -42, 69, -74, + 7, 12, 9, 33, -19, 1, 42, 4, 24, -35, -42, -23, -27, -25, 70, -56, + 39, -16, 5, -8, 46, -3, 34, 18, -31, 24, 0, -8, 50, 12, 44, -5, + -40, 13, -71, 28, -38, -5, 9, 44, -48, 29, 65, -22, 42, 31, -18, 12, + -47, -39, -25, 56, 15, -48, -15, 51, 1, 79, -24, 24, 25, -48, 84, 12, + 28, -76, 11, 2, -63, -44, -2, -25, 22, -42, 16, 17, -68, 6, 10, -12, + 19, 12, -60, -63, 30, -18, 43, -67, 4, -47, 22, 49, -43, 47, -36, 16, + 24, 49, -35, 62, 22, 18, -62, 62, -82, 77, -55, -57, -50, 20, -48, 50, + -53, -34, 8, 5, 18, 1, 39, 12, 13, 35, 0, 63, 18, -63, 45, -29, + -16, -90, 51, 2, 35, -29, 17, 10, 52, -22, 12, -67, -12, -63, 58, -41, + 7, 8, 57, 50, -52, 75, -7, 13, 11, -35, 23, -47, 24, -28, -5, 37, + -21, -61, -16, -51, -55, 14, 60, -32, 15, 18, -20, 62, 18, -30, -44, 61, + 38, -35, 43, 29, -65, 31, -6, -2, 38, -44, 52, -8, 31, -32, -26, -57, + 11, 22, -34, 61, 17, -38, -30, -30, 27, -5, -19, 19, 24, -16, -13, 23, + 17, -9, -26, 38, 30, 57, -29, 64, -60, -7, -44, 39, -2, 2, 46, 7, + 55, -91, 6, 6, -39, 4, -28, 67, -57, 86, -46, 100, -70, 47, -27, 51, + -69, 48, -61, 55, -27, 15, -7, 50, -46, -42, -16, 1, -9, -27, -3, 10, + 16, -60, 53, -32, 12, 2, -29, 40, -52, 23, 33, -17, 19, -43, -37, 20, + 37, -38, -14, -20, -40, -63, 54, -68, 3, -10, 10, -18, 25, -66, -32, -22, + -24, 60, 7, 14, -10, -55, 18, 1, 27, -44, -43, -46, -22, -56, 12, 51, + -27, 62, -33, -36, 52, -65, 32, -80, 20, -66, 38, -48, -29, 40, -45, -26, + 0, 102, -70, 71, 42, 9, 14, 5, 28, -5, 39, -48, 76, -20, -5, -19, + -28, -5, 14, 67, -12, -52, 61, 36, -48, 6, 49, -23, 1, -44, 14, 29, + -77, 28, 33, -65, 13, -14, 43, -66, 77, -23, -9, 53, 32, 3, 39, -14, + 58, -18, 37, -19, -17, 24, -75, 15, -50, -52, 55, -34, -38, 44, -58, 23, + 14, 84, -17, 53, -40, -9, -43, -28, 29, -30, 70, -38, 69, 25, 14, 55, + -53, 45, -62, -5, -26, -40, 69, -38, -28, 39, -12, 32, -5, 52, -46, -54, + 38, 33, 31, 29, 49, 50, -96, 51, -52, 20, 26, -50, -6, 51, -46, 29, + -2, 2, -57, 14, 42, -48, 37, 0, 50, -50, 15, -21, 38, 17, 29, 45, + -10, 14, -3, -33, -2, 1, 47, 40, -24, 53, -33, -33, 25, -37, 74, -81, + 50, -63, 44, -27, -44, 0, -3, -53, 53, 34, 24, -5, -13, -17, -31, 1, + -5, 0, 43, -33, -24, 29, 38, -41, 20, -65, 55, -58, 32, 1, 3, -45, + 36, -49, 41, 21, -15, 27, 29, -63, 33, 23, 40, 17, 1, 58, -41, -5, + 27, -31, 0, -5, 21, -29, -33, -4, 4, 29, -16, 79, -35, 97, -37, -26, + -57, 64, 22, -6, 27, 35, -5, 91, -52, 0, -1, 46, -72, 97, -54, 96, + -81, 11, -25, 24, 39, 57, -22, -6, 2, 74, -34, 74, 26, 36, -93, 43, + -51, 43, -44, 57, -33, 49, 7, 51, -14, 27, -5, 41, 12, 6, 0, 42, + -18, -81, 17, -77, 24, -5, 7, -14, 0, 30, -50, -7, -43, -4, -29, 56, + -32, 34, -33, -12, 16, -11, -65, 24, 33, 25, -22, -6, -39, 25, 23, -25, + 54, -47, -2, 10, -42, -63, 58, -21, 44, -91, 81, -73, 6, -57, 25, -13, + 16, -37, -36, -37, 26, -55, 72, -40, 75, -64, 55, -64, 74, 6, 10, 13, + -70, -34, -33, -42, -21, 58, 32, -6, -44, 5, -45, 0, 35, -89, 71, -52, + 16, -36, -10, 33, 7, -6, -35, -15, -9, 43, -15, -42, 29, -76, 77, 19, + -36, -52, 34, -9, -46, -23, 52, -65, 57, 36, 17, -5, 50, -20, 34, -59, + 45, -71, 96, -83, 7, -35, -34, 31, -78, 83, -71, 5, 37, -61, 1, -45, + -3, -48, 65, -13, 27, -18, 15, -25, -7, -43, 63, -62, 43, -2, -19, 16, + 34, -33, 42, -20, 36, -14, -55, 51, -42, -26, -51, 74, -60, 37, -22, 6, + 11, 30, 13, -31, 26, -37, -26, 52, 18, 15, -36, 66, -53, 34, -47, 38, + 56, -33, -44, -2, 8, -74, 53, 2, -6, -58, -27, -39, 8, -17, 62, -39, + 28, 8, -45, 48, 2, 23, 35, -4, -78, 63, -43, -58, -6, -67, 72, 3, + 42, -69, 29, 35, -45, 20, -59, -28, 37, -20, 43, -49, 67, -33, 1, -39, + 69, 19, -12, 14, -43, -44, -29, 23, -36, -40, 16, -10, -9, -31, 54, 27, + -34, 0, -3, 18, -41, 4, 52, -73, -36, 24, -31, -33, -32, 35, 8, -49, + -11, 68, 25, 65, -67, 64, -62, -6, -42, 2, 47, 24, 41, 2, 16, -36, + 2, -47, 50, 31, -92, 73, 58, -65, 38, -64, -44, 38, 41, 0, 58, -67, + 5, 20, 21, 31, 27, 94, -79, 47, -36, 61, -27, -3, 49, -39, 69, -51, + 14, 9, 48, 1, 33, 32, -4, -21, 36, 34, -30, 40, -24, -47, 8, 39, + 47, 5, 48, 5, -11, 25, -20, -47, 25, 52, 18, 9, -49, 15, -12, 18, + -29, 6, 40, 31, -59, 49, -23, 83, -45, 4, -4, 32, 18, -20, 18, -14, + 72, 2, -34, 32, -27, 10, -25, 52, -38, -67, -34, 1, -22, -15, 60, -22, + 7, 40, -59, 99, 0, 18, 41, 22, -51, 9, 18, 32, 17, -20, 3, 59, + 2, 16, -56, 28, -76, 53, -45, -10, 51, -36, 25, 52, 5, 18, -31, 19, + -1, 3, 21, -42, -9, -1, 66, -27, -20, 44, -28, 24, -2, -6, 5, -21, + -51, 19, 4, -31, -13, 56, 17, -59, -20, 5, -32, -11, -28, -2, 37, 28, + -54, 0, 52, -3, -57, 61, -14, -54, 4, 56, 30, 42, -45, 12, -85, 25, + -67, 23, 18, -14, 19, -50, -15, 41, 24, 22, -66, 60, 43, 43, -11, -55, + -22, 15, 0, -16, -54, 58, -8, 21, 13, -22, -3, -66, 17, -30, -9, 54, + -67, -13, -31, 24, 4, 63, 23, -33, 2, 56, -70, 18, 5, 16, -9, 11, + 26, 20, 56, -93, 84, -52, -12, 35, -3, 31, 34, -9, 7, -1, -13, 37, + 10, 8, -45, -56, -1, 52, -24, 74, 10, -6, -10, -90, 28, 36, -4, 30, + 46, 14, -4, -17, 55, -55, -46, 20, -46, 60, 36, 16, -46, -43, -40, 55, + 3, -61, 34, -68, -46, -22, -19, 31, 0, -33, 42, 7, -23, -7, -30, 20, + -40, 57, 33, -53, 15, -42, 5, 15, -71, 6, -24, -27, 34, -7, 73, -77, + -4, 27, -76, 14, 50, -67, 31, 27, 24, -37, -23, -33, 63, -18, -13, 39, + -13, -15, 24, -11, 13, -1, -24, -36, 32, -16, 39, -67, 43, 0, -43, 10, + -46, -5, 2, -19, -16, 18, 46, -85, 53, 55, -48, 28, -31, 22, -60, -18, + -8, 65, -54, -48, -13, -16, -26, 25, 33, -3, -39, -26, 26, -64, 47, -91, + -28, 86, -29, 31, 47, -42, 69, 39, -97, 68, -65, -28, -3, -28, 53, -22, + -28, 26, -47, 70, -82, 67, -42, 52, -51, 21, -76, 48, -12, 19, 57, -67, + 85, -72, 54, 27, -25, 20, -20, 9, 38, 2, 41, -62, 68, -11, -20, -23, + -36, 17, 32, -62, 58, -31, 50, 45, -32, -47, 18, -20, 31, -11, 49, 18, + 42, 0, 17, -17, -36, 58, -23, 13, -35, -45, 86, -60, 12, -72, 23, 35, + 23, -11, -47, -5, 56, 18, -29, -80, 83, -74, 45, 39, 25, 23, 36, -14, + -5, -2, 34, 3, -45, -23, -1, 19, 35, -46, 58, -19, -11, -27, -4, -56, + 29, -64, 0, 61, -67, 24, 52, -83, 48, 27, -67, 33, 20, -66, -1, -59, + 24, -60, 32, 42, 20, -69, -3, -22, -12, -40, 42, 30, 23, -73, 48, -68, + -35, -60, 79, -42, 41, 29, 6, 34, -6, -15, -24, -41, 22, 35, -23, -49, + 38, 15, 35, -2, 84, -1, -44, 1, -8, 48, -60, -59, 46, 45, -13, -22, + -32, -51, 2, -30, -7, -28, 40, 0, 37, -48, 60, -16, -30, -50, 8, -65, + 87, -27, 36, 29, -5, 44, -31, -46, 0, 6, -6, 23, -46, -9, 28, -44, + 37, -28, -35, 50, -30, -23, 2, 64, -14, 0, -39, 12, -43, 21, 18, -56, + 86, -44, -19, 20, 65, -55, 39, 4, 10, 15, 12, 29, -11, -4, 46, 27, + -7, -81, 16, 63, -7, -34, 66, 0, -21, -41, -7, 40, 13, 0, 52, 40, + 49, -81, -10, 1, -11, -40, -48, -61, 85, 2, 32, -14, 1, 41, -54, -42, + 57, -16, 55, -93, 74, -22, 15, -40, 41, 22, 63, -9, -5, 33, -31, -20, + 16, 12, -61, -24, 41, -54, -19, 22, -45, -49, 73, -27, 68, -49, 7, 22, + 68, -43, 36, 51, -57, 51, -85, 40, 0, -39, 2, 33, 15, 32, -54, 39, + -24, 7, -34, -3, 17, -32, 61, 9, -6, 72, -81, -11, 52, 15, -51, 27, + -13, 48, -19, 25, -46, 5, 13, 57, -18, -20, 63, -9, -55, -25, -25, 25, + 50, -39, 47, -22, 39, 51, -49, -17, 27, -46, 40, -10, -1, 54, -11, 1, + 31, 37, -43, -6, 0, 67, -79, 75, -53, -34, 36, -42, -2, 45, 71, -6, + -11, 50, 18, -59, 17, 22, 42, -20, 50, -28, 58, -41, -30, -15, 0, 61, + 53, 18, -39, -18, -11, 5, -40, -3, 24, 7, 46, -34, 22, 12, 43, -57, + 54, -3, -19, -10, -6, -51, 101, -54, -10, 29, 21, 13, 46, -87, 10, 28, + 28, 28, 55, -23, 50, -61, 76, -61, 20, 36, 3, -28, 45, 14, 14, 49, + -46, -45, -15, 10, -30, -32, 51, -19, 69, -33, -36, 47, -20, 46, 22, -55, + 47, 2, 19, -39, 54, -14, -1, -3, -19, -36, 38, 35, 16, -12, 0, 28, + -38, 56, -35, 26, -110, 80, -56, -32, -10, -22, 47, -5, -42, 9, -13, 5, + 49, 35, 20, -10, -48, 19, -66, -4, 18, 74, -41, -31, -11, 54, -76, -78, + 54, 1, 19, 57, -41, 58, 52, 6, -65, 0, 46, -48, -18, -19, 80, -42, + -5, 33, -14, 43, -26, 15, 61, -72, 62, -41, -15, -5, -31, 12, -51, 46, + 1, 24, 43, -38, 29, 32, 20, 57, -31, 43, -61, 10, -40, -35, 26, 10, + -64, 20, -50, -4, -32, -16, -14, 38, -33, 69, -42, 32, -57, -25, 21, -46, + 12, -4, 7, -40, 90, -46, -33, -45, 20, -74, 42, 42, -40, 4, 29, -39, + 26, -17, 19, 30, 64, -89, 61, -71, 82, -44, -51, -12, 38, 27, 7, -50, + -71, 60, -14, -75, 37, -40, -7, 12, 23, -30, -36, 32, -38, 19, -44, -27, + -37, 41, -32, 41, -50, -52, 22, 58, -66, 69, -54, 74, -17, 24, -86, 16, + 14, -38, 13, 15, -10, 48, -73, -23, 50, -24, -29, 2, 96, -53, 30, -32, + -74, 18, 38, -49, 29, 3, -52, 63, -35, -32, 22, 52, -85, 51, -31, 36, + -65, -34, -20, 66, -48, 12, -63, 68, 13, -29, -31, 13, -26, 35, 52, -32, + -1, 16, -27, -28, -13, 45, -60, 10, 39, -58, 16, 10, 41, -84, 27, -43, + -26, 79, -48, -7, -17, -1, -41, 63, -55, 33, -10, 53, -40, -18, -59, 65, + -98, 49, -63, 19, -33, -33, 68, -57, 14, 11, 57, -43, -6, -7, -19, 25, + -25, 34, -43, 37, 54, -19, 32, 2, -17, -5, -48, 5, 3, -3, -13, -12, + -49, -15, 25, -11, 35, 23, 25, -17, -26, -16, 26, 76, -51, -9, 76, 52, + -45, -42, 36, -98, 58, -50, -40, 38, -19, 26, -46, 83, -51, 43, -19, 24, + -29, -23, 68, -75, -20, -3, -36, 14, -45, -31, 30, -47, 11, -31, 71, -8, + 6, -13, 22, -41, 31, -86, -20, -49, 25, 33, -31, 50, -21, 53, -57, 37, + -24, -13, 67, -21, 89, -28, 28, 25, -3, -5, -4, -42, 62, 54, 1, -2, + 18, -40, 59, -16, -10, -32, 7, 47, 13, 30, 26, -51, 15, -21, -42, 46, + -47, 53, -78, -13, -57, 87, -47, 49, -55, 1, 64, -20, -2, -36, -1, 45, + 20, 5, -67, 73, 10, 6, 13, -20, -7, -16, 27, 49, -8, 33, -6, 50, + 7, 19, -9, -69, 45, -2, 46, -99, 66, 8, -25, 4, -58, 72, -49, 38, + 6, -20, 6, -63, 71, -67, 65, -28, 12, -6, -17, -37, -51, 77, -86, 66, + 8, -23, 53, -56, 41, 36, -62, 44, -19, 10, -48, 34, 8, 6, -35, 51, + 29, 76, -75, 51, -76, 91, -50, 40, -54, 2, 29, 5, -20, 44, -76, 44, + -48, -32, 17, 50, -28, -67, 68, 13, -5, -40, -19, 33, -11, 46, 19, -4, + 16, 36, -30, 50, 28, -17, 30, -86, 91, -41, 15, -69, 74, 11, 49, 20, + 39, -4, 84, -61, 68, 13, 25, -45, 76, -68, -30, -6, 54, 1, 21, 5, + 50, -74, 20, -32, 1, -49, 29, 13, 15, -55, 96, -10, 19, 35, -20, 25, + 12, -38, 23, -72, 39, -27, -15, 17, 5, 15, -51, -12, 10, -52, -46, -4, + -39, 91, -80, 112, -58, 47, 3, 16, 4, -5, -28, 3, -12, 13, -3, -58, + 98, -50, -21, 89, -20, 30, 9, 59, -34, 71, -22, 50, 39, 44, -54, -61, + 23, -41, -50, 70, 31, 46, 28, 13, 2, -32, -19, 27, -4, -30, 40, 6, + 11, -26, 32, -48, -58, -25, 41, -34, -9, -2, -28, -4, -31, -11, -32, 33, + -22, -28, 39, -32, -39, 36, 44, -59, 28, -40, -7, 4, 62, -11, -11, 13, + 0, 51, 0, 41, 3, 14, -70, 21, 82, -66, 46, -49, -11, 46, 23, 18, + -45, 12, 79, -65, -53, 34, -26, 84, -53, 95, -22, -50, -24, -7, -21, 14, + 8, -32, 23, 77, 0, 10, 9, 8, 12, -44, 28, -32, 14, -6, 37, -6, + -55, 36, 28, -2, 18, -28, -35, 48, -58, 13, 56, 29, -18, -15, 5, 11, + -3, -73, 68, -34, 13, -35, 53, -43, 62, -18, 17, -30, -52, -8, 52, -41, + -27, -11, 8, 17, 55, -86, 73, -70, 64, 2, 19, -32, -3, -68, 77, 26, + -37, 47, 19, 24, -43, 80, -57, -12, 2, 59, 12, -11, -38, -24, 35, -41, + 27, -9, -17, 21, -35, 50, 18, -6, -4, -33, -2, 54, -37, -33, -16, -57, + 42, -17, -31, 0, -40, -23, -16, 25, -96, 102, -48, 1, -55, 43, -13, -48, + -29, 37, 34, 44, 32, 22, -32, -3, 46, 13, -47, -58, 21, -35, -10, 12, + 56, -11, 19, 34, 36, -52, 4, 70, -57, 50, -27, 34, 0, 16, 74, -42, + 16, 32, -54, -21, -8, -29, 36, -48, 28, 55, -38, 24, -9, 44, -37, 5, + 1, -24, -17, -35, -25, 46, -63, -6, -8, -29, -19, -31, -50, -48, 22, 45, + 55, 32, -6, -19, -60, -36, -10, 51, -30, -30, 17, -13, 48, 3, 22, -55, + 84, -64, 52, -33, 62, 8, 20, -7, -51, 59, 24, 6, -9, -14, -55, 64, + 3, 5, -5, 41, 33, -78, 10, 60, -38, -2, 17, -43, -28, 4, 33, -47, + 8, -48, 14, -6, -40, -15, 82, -59, -58, 13, 8, -2, 31, 4, -39, 14, + -50, 53, -77, 60, 34, 32, 10, -72, -13, -64, -18, 28, 12, 57, -24, 49, + -56, -35, -18, -45, 10, -50, 0, 12, 0, 27, 47, -41, 10, -52, 30, -12, + 28, 15, -62, -10, -19, 49, -7, 11, 11, 34, -65, -40, 16, 44, -53, 33, + 35, 34, -31, -18, 41, -11, 30, -35, -38, 13, -12, 30, 61, -3, -10, 21, + -52, -10, 39, -9, -20, 36, -1, -1, -26, -15, -11, -32, 2, 64, -64, -19, + -3, -36, 32, -59, 49, -37, 37, -13, -19, -36, -56, 68, -22, 0, -6, -16, + 47, -31, -21, -32, 39, -36, 0, -57, 67, 40, -49, -39, 17, -11, 11, 44, + -15, -27, -4, 7, 41, 25, -9, 50, 47, -44, 51, -68, 90, -47, 11, 43, + 12, 14, -66, -15, -56, -1, 25, -45, -22, 10, -13, 62, -7, 18, 15, -46, + -73, 28, -29, 29, -77, 52, 6, -86, 10, 6, -37, -28, 14, 35, -54, -5, + 27, -38, 53, 15, 59, -46, 70, -72, 61, -95, 58, 12, -64, 4, 55, -47, + -10, -3, 46, 6, -7, 0, 2, 7, 25, 38, -52, 56, 44, 31, -52, 1, + -83, -24, -14, 66, 3, -8, 69, -45, -7, 18, 27, -18, -67, 26, -1, 12, + -39, 19, -51, 9, 0, 7, -41, 48, 14, 2, -5, -4, -42, 50, 65, -84, + 59, -15, -43, -16, 4, 74, 10, -71, 39, 0, -21, 74, 3, -44, 17, 30, + 0, 29, -49, 18, 6, -1, -74, 58, 59, -4, -10, -50, -16, -5, 0, -20, + 41, -62, 27, -50, -17, -29, -14, 60, 6, 33, 65, -25, -52, -14, 34, -27, + 50, 43, 50, 2, -52, 65, -42, -26, 2, 2, -79, 48, 24, -18, -24, 13, + -28, 1, 39, 34, 64, -75, 23, -34, 47, -35, 20, 52, 18, -11, -2, 36, + -38, -17, -32, 38, -38, -13, 10, 27, 19, -9, 18, 15, -72, -41, -32, 8, + 13, 72, -59, 20, -37, -35, -4, -47, 25, 38, 66, 15, -1, 0, -16, 28, + 40, -26, -23, -18, 12, 43, -62, 9, -10, 60, -38, 2, 40, 1, -18, 34, + -31, 54, -10, -1, 11, -15, 13, 8, -45, -22, 51, 15, 75, -66, 11, 27, + -37, 78, -27, -52, 14, -58, 12, -44, -60, 50, 13, 48, -59, -25, 16, 15, + -83, 90, -56, 90, -8, 34, -56, 83, -63, 66, -14, -73, 54, -1, 13, -16, + -4, 57, -25, -49, 62, 16, -36, 77, 28, -45, 56, 40, -22, -12, 22, 32, + -31, 23, -38, 18, -87, 14, -27, -15, -3, 60, -57, -11, 70, -77, 44, -50, + 73, -56, -7, 31, -25, -38, 52, 30, -27, 13, 68, -56, 3, -16, 48, 1, + 85, -50, 37, -76, 59, -76, -14, -18, 63, -16, 46, 10, 40, 25, -74, 55, + -59, 19, 24, -25, 42, 20, -20, -31, 0, -49, -13, 44, 38, -75, 15, 10, + -24, -21, 48, -33, 18, -80, 25, -20, 20, -4, 46, -48, -21, 69, -63, -14, + -14, 22, 14, -26, -24, 61, -5, 27, -104, 45, 1, 13, 61, -39, -9, 2, + 1, 77, -9, 89, -59, 24, -37, 8, -1, 30, -69, -32, 81, -66, 16, -31, + 55, -103, 43, -66, 62, 22, 38, -67, 55, -26, 42, 15, -8, 54, -43, -26, + 65, 8, -24, -62, -35, 10, 12, 41, -46, 2, 33, -70, 32, -48, 4, -11, + -46, 72, -6, -59, 72, -37, -57, 29, -5, 33, -14, -30, 69, 38, 28, 32, + 14, -88, 70, 11, 14, 31, -18, 54, -33, -7, -41, -65, -1, 1, -14, 18, + -28, 52, 11, -6, -51, 57, -48, 59, 13, 44, -21, 20, 2, -60, 20, -7, + -21, 0, -27, 24, 47, -9, 19, -46, 85, 11, -44, 21, -62, 49, -60, 8, + 34, -63, -28, 59, 47, -35, 47, 41, -30, -37, -40, 37, -37, 84, -73, 11, + -19, -23, -24, -31, -74, 34, 15, -37, 11, 13, 11, 19, -35, 16, 18, 35, + 52, -102, 55, 27, -57, 48, -4, -21, -65, 93, -55, -33, 48, 14, -60, -32, + 45, -35, 16, 17, 60, 23, 38, -28, 4, -24, 19, 27, -67, 46, 0, 36, + 3, 36, 4, 48, 5, -19, -48, 9, -60, 32, -57, 5, -12, -11, -40, 51, + -63, 31, 4, -29, 38, 15, 40, 10, -40, -10, -67, -13, -104, 72, -46, 10, + -9, 29, 18, -19, -26, -60, 55, -20, 13, 64, -32, 16, -88, 71, -15, -13, + 49, -41, 39, 11, -49, 20, 59, -82, 42, -72, -28, 51, -58, 31, -15, 36, + 30, -43, 43, 27, -40, 46, -65, 39, 42, 20, -21, 24, -51, 66, -18, 8, + -15, -40, -41, -44, 67, -44, 14, 28, -49, 63, 5, -10, -19, 54, -43, 27, + -87, 93, -76, -2, 37, -80, 53, -21, 32, -29, -19, -9, -24, 27, 14, 35, + -110, 85, -70, 115, -64, 43, -6, -49, 35, 36, -9, -30, 37, 3, -13, 43, + 9, -38, 66, -13, 20, 23, 35, -19, -25, -39, 32, 7, -80, 16, -32, -49, + 8, 35, -79, 37, -58, -17, 43, 44, -46, 17, -49, 88, 43, -9, 21, 1, + -43, 2, 34, 39, -11, 25, -28, 24, -61, -43, -2, -27, 46, 35, -17, 21, + -33, 33, -47, 15, -89, 75, -46, 8, -52, -2, -14, 9, -40, 43, 57, -14, + -24, 75, -62, 26, -14, -14, -16, -3, -5, 54, 30, -25, 28, -49, 60, 29, + 0, 57, -14, 64, 28, 38, -41, -13, -34, -23, -20, -9, -3, -18, 2, 6, + -53, 65, -2, 9, -9, -28, -29, 53, -15, -14, -38, 45, -15, -81, 84, -37, + 63, -43, -51, 52, -62, -27, 42, -31, 52, -32, -5, 33, 10, -40, 6, 16, + -67, -23, -6, -50, 8, 2, 64, -7, 80, -43, 39, -9, -28, -22, 62, -52, + 13, 31, 37, 35, -59, 41, -61, -34, -16, 38, 62, 22, 63, -20, 4, 58, + 14, 33, -63, -9, 53, -37, 51, -12, -16, -18, 60, -8, 71, -18, 20, -24, + -12, 31, -44, 58, 13, -46, 25, 25, 33, 53, 20, 16, -7, -35, 73, -22, + -29, -53, 0, 40, -66, 24, -28, 15, -65, 6, -63, 72, 7, -11, -24, 7, + -14, 73, -31, 97, -67, -5, 54, -43, -19, 10, -58, 42, 2, 54, -37, -61, + 66, -9, 73, -58, 31, -15, 28, 22, -8, 21, 39, -29, 14, -40, 32, -16, + 86, -92, 47, -89, 25, 14, -66, 78, -73, -48, 16, 54, -92, 38, 47, -94, + 7, 29, -56, 0, -74, 22, 22, 5, 20, -2, -4, 21, 27, 7, 26, 9, + 8, -35, 59, -57, 54, 43, -73, -79, 84, -30, 64, -77, -20, 62, -73, 53, + -15, -19, -76, 12, -74, 85, -85, 60, -15, 48, 14, -61, -19, -38, 41, -72, + 72, 0, -2, 65, -9, -48, 71, -60, 51, 16, 2, 0, 11, -9, -44, -62, + 58, -53, 18, 62, -62, 37, 21, 12, 22, -37, 52, -60, 34, -12, -70, 5, + 53, -51, 5, -69, 20, -47, 17, 7, 70, 12, 42, -19, 5, -33, 19, -46, + 32, -17, -64, 71, -88, 56, -21, 36, -46, -24, 25, 15, -7, 63, -37, 13, + -45, 73, 57, -46, 2, -33, 19, -34, -43, 18, 17, -46, 52, -22, 0, -2, + 25, 27, -25, 41, -60, 46, -57, -6, -52, -7, -13, 38, 49, 45, -41, -33, + 59, -51, -23, -31, 20, 59, -31, 37, 41, -48, -42, 34, -53, 44, -21, -53, + -31, 14, 52, 6, 0, -44, 33, -24, -5, -12, -47, -35, -66, 16, -36, 65, + -10, -2, -34, -19, 26, -8, 44, -62, 2, -37, -72, 53, 43, -6, -50, -44, + 68, 20, 36, -59, 91, -6, 55, -57, 90, -62, 46, -70, 26, 3, 66, -23, + 14, -76, 59, -69, 21, 21, -14, -41, 64, 1, -37, 14, 14, -105, 67, 24, + 4, 1, -60, 60, -36, -11, -26, -12, -40, 14, -60, 46, -20, -12, -33, 64, + -64, 60, 27, 27, -1, -20, 73, -64, 38, 57, -73, -3, 75, -64, 7, 58, + 0, 1, 61, -68, 61, 28, -48, -42, 22, -12, 44, 2, -4, -61, 4, -14, + 33, 5, -10, -15, 43, -66, 55, 55, -68, 39, -10, 25, -18, -30, -23, 38, + 30, 29, 26, 30, 69, -88, 84, -48, -8, -10, 20, 48, 44, 0, 14, 31, + -38, -24, -17, -47, -11, 74, -84, 66, 13, -4, -18, -62, 55, -49, 70, 64, + -45, 25, 23, -77, 56, -16, -32, -16, -17, -8, -27, -50, 55, 14, 54, -33, + -71, 74, -21, 37, 50, -14, -6, 44, -88, 6, 0, 74, -68, 49, 35, -16, + -11, 7, -8, -27, 86, -16, 20, -53, 41, 49, -30, 38, 33, -85, 54, 28, + -40, -45, -13, -53, 39, 47, 23, 14, 1, 31, -5, 14, 23, -46, 53, -46, + 36, -65, 31, 12, 61, -46, 57, 6, 10, -19, 9, -59, -7, -43, 76, -25, + -8, -38, 29, -43, -45, -25, 25, 6, -15, -1, 2, -61, 63, -50, -5, 25, + 28, -47, -20, -23, 41, -23, 60, 26, -7, -3, 49, 48, 32, 13, 2, -51, + 42, 52, 10, -32, 8, -60, 46, 13, 19, -20, 81, -67, -3, -25, 21, 46, + -41, 28, -103, 90, -91, -45, 25, -11, -15, 35, 8, -21, -41, 25, -45, -31, + 29, 18, -30, -31, 73, -57, 83, -24, -9, 27, -28, 13, 44, 58, -1, -28, + 29, 22, -27, 24, 42, -26, 31, -29, 36, 40, -31, 64, 3, 22, -42, -23, + -25, -9, -39, 34, -9, -9, -47, 48, 36, -9, 31, 55, -16, -10, -3, -61, + 35, -6, -49, 51, -7, -36, 52, 0, -28, -51, -38, 0, 6, -8, 49, 2, + 10, -63, 53, -21, -5, 66, -43, 10, -7, 48, -6, -55, -33, 53, -17, -54, + -15, -7, 57, -52, -62, 40, -21, -28, 31, 1, 36, -35, -79, 81, -95, 74, + -39, 67, -22, 60, 23, 12, -10, -44, -10, 55, -35, 57, 2, 55, -69, -37, + -20, 59, -30, -4, 5, 9, 16, -12, 17, -6, 48, 44, -58, 13, -31, 2, + 4, 22, -54, -35, -5, 8, -55, 51, -34, 13, 38, -85, -14, 35, -74, 13, + 33, -38, 52, -9, -58, -20, 34, -14, 25, -22, -40, -62, -27, 42, -36, 5, + -3, 29, 37, 52, -65, -52, 44, -49, 20, -11, -9, -46, 8, 8, 41, -54, + 40, -8, 33, -49, -54, 8, -7, 34, -70, 56, 33, -29, 38, 16, -93, 57, + 29, 36, -7, 51, 52, 19, -19, 50, -57, 22, 29, 33, -56, 6, 75, -50, + -30, 52, 0, 8, -7, -48, -47, -45, 82, -80, 14, -26, -41, 16, -15, -5, + -5, -63, -20, 13, 11, 21, -62, 38, -51, -31, 19, -13, 13, 2, -1, 34, + -67, 57, 76, -78, 86, -34, 14, 54, -48, -7, -8, 3, 53, 1, 37, -20, + 7, 3, 62, -19, -37, -38, -32, 5, -70, 20, 21, 0, -77, -10, -28, -20, + -13, -14, 26, -22, 5, -28, -28, 18, -39, -5, -40, -9, -76, 33, 17, 42, + 0, 36, -41, 44, 8, -3, -15, 30, -51, -14, -37, -64, 2, 6, -19, 63, + -7, 34, -30, -66, 46, -28, 27, -59, 63, 54, 0, 52, -3, -49, 23, -64, + 44, 80, -83, 21, -25, -8, -33, -13, -7, -26, -15, 73, 36, -5, 30, 37, + 9, -34, -56, 17, 0, 27, 23, -38, 28, -19, -34, -8, 71, -75, 20, 10, + -75, 30, -42, 4, -78, -38, 46, -1, 22, -55, -6, 30, -59, -31, 0, 51, + -17, 21, -48, 56, -53, 87, -90, 74, -44, 3, -47, -66, 18, 20, 12, 19, + -17, 9, 51, 20, -55, 13, 40, -3, 41, -23, -32, 58, 4, 45, 1, 47, + -34, 24, 12, 0, 10, 29, -34, 65, -59, 37, 63, 57, -21, 9, -30, 67, + -18, -40, -17, -12, 66, 0, -34, 45, 4, -7, 43, -21, 24, -27, -59, 36, + 26, 18, -26, 12, 11, 35, -52, 47, -3, -16, -4, 66, -68, -62, 80, -27, + -36, -40, 69, -79, 23, -48, -50, -38, 39, 17, -21, -26, 66, 0, -79, 64, + -13, -15, 1, -24, 0, 55, 48, 17, -59, 44, 39, -29, 59, -19, 44, -85, + 57, 40, -15, -21, 65, -54, 44, -16, 65, -21, -59, 50, 16, -58, 38, -60, + 61, -52, -46, 39, 29, -71, 41, -62, 87, -25, 3, -7, 19, -68, 16, 3, + 9, 17, -77, 22, 63, 32, -23, 37, 71, -31, 4, -5, 44, -15, 68, -30, + 61, -42, -18, 21, -44, 54, -3, 33, 19, 54, -29, 23, 46, 21, -43, 3, + 0, -21, -21, 6, -54, 46, -21, 0, -8, -42, 84, 27, 2, 50, -36, -46, + 38, -53, 52, 48, 27, -59, 28, 44, -29, -40, 31, -76, 41, 13, 28, 10, + -24, -102, 84, -23, 22, -30, 34, 36, -7, 21, 24, -76, 8, 15, -18, -55, + 48, -26, 17, 40, 7, -59, 33, 33, -36, -31, 61, -41, -39, 43, 9, 2, + 51, 41, -18, -11, 68, 78, -46, -9, 28, 40, 12, -16, -6, 63, 17, -21, + -1, -23, -4, 38, -42, -59, 46, -16, 7, 20, 51, 68, -33, 19, -11, -40, + 0, 29, -9, -34, 43, 3, -16, -22, 22, -23, 19, 36, -71, -16, -16, -32, + -37, 24, -59, 9, -20, 54, -37, -28, 34, -58, -33, -61, 64, 24, -4, -29, + -8, 52, 0, -58, 30, -57, 15, -7, -50, 56, -66, 15, -20, 32, 41, 24, + -79, 50, -69, 36, 36, -43, 71, -48, 28, -26, 29, -38, 60, 45, -6, -15, + 86, -43, -8, 45, -52, 58, 74, -19, 64, -92, 63, -67, 0, 1, 25, 11, + -13, 49, -8, 1, -37, -41, 5, 26, 30, -21, -44, 17, -72, 16, -3, 34, + -4, -41, -11, 53, -71, 43, -26, 41, 12, -31, 110, -54, 46, -9, 61, -37, + 9, -19, -4, 3, -25, 63, -25, -28, -58, -17, 27, -57, 74, 3, -44, 34, + -13, 13, 30, 10, -96, 70, -24, 24, -63, 1, 23, 46, -79, 59, -72, 41, + -74, 32, -16, 44, -9, -16, -1, -30, 40, -57, 35, 13, -38, 22, -46, 53, + -75, 86, 0, -29, 93, -86, 82, -72, 8, 74, -88, -1, -2, -22, -19, 37, + -1, -12, -22, -69, 41, 44, -36, 12, -45, -21, -1, -16, 25, 16, -24, -48, + 47, 71, -43, 3, 52, -31, 34, -35, -51, 76, -95, 88, -47, -14, -8, 59, + -1, 26, -85, 41, -23, 11, -34, -7, 23, 22, 11, 11, 56, -45, 26, -14, + -49, -51, -41, 59, -67, -64, -1, 28, -50, 3, -18, 1, 11, -5, -41, 28, + -12, 9, -34, 34, 49, 34, -32, 36, -15, -24, -22, -71, 62, -42, 30, 36, + -36, -68, 51, 3, -75, 51, 56, -55, -5, -30, -32, 13, 31, 31, -62, 80, + 36, -34, 42, 1, 60, -63, 18, -17, 8, 33, 13, 11, -79, 0, -17, -13, + -10, 29, 8, -17, 34, 2, 16, -69, 38, 8, 35, -28, 7, -68, -28, -30, + -30, 33, 38, -36, -22, -7, -31, 39, -36, -15, -10, -19, 20, -33, 27, -53, + -19, -40, 39, -63, 66, -52, -37, 33, -93, 56, 16, -26, 69, -78, 35, -32, + -33, 9, -14, -28, 68, 60, -44, -26, -25, 1, -13, 37, 6, 2, 21, 8, + 39, -42, 54, 2, 0, -51, -15, -3, -52, -1, -53, -21, -39, 41, -60, -7, + 7, 26, 22, -7, 17, 5, -16, 38, 76, 36, -25, 4, -29, -47, 26, -19, + 0, -9, -87, 71, 0, -23, -2, -15, 4, 15, -49, 28, -34, 28, -45, 45, + -16, 44, -53, -54, 21, 6, 46, 0, -27, -16, -52, 40, -25, -21, 48, 0, + 64, -98, 40, -44, 4, -19, 16, 61, 35, -70, 40, 22, 55, -70, 71, -65, + 39, 47, -11, -2, -3, -74, 60, 37, -26, 79, 9, 36, -44, -5, 8, -13, + 22, -90, -22, 48, -71, -45, 24, 46, -42, -6, 46, -58, 54, 19, -24, -18, + -17, 17, 88, -80, 53, 9, 52, -50, 34, -47, 49, -47, -37, -12, -21, 59, + -22, 58, 47, -32, 78, 52, -13, -39, 19, -38, 3, -35, 18, 5, 21, -64, + 34, 11, -18, 14, -35, -80, 61, -61, 22, 19, 3, 78, -58, -60, 36, -27, + 55, 32, -97, 68, 10, -13, -72, 57, 2, 4, 25, 48, -85, -14, 73, -59, + 49, -67, 48, -34, -42, 51, -34, 42, -33, 30, 16, -22, 63, 38, -47, 61, + -6, -43, 28, 34, -46, 28, 0, 56, -30, 6, 39, -25, 58, 26, 17, 14, + 54, -36, 42, -52, 26, -17, 48, 23, -16, 40, -7, -12, -30, 12, -48, 58, + -6, 44, 3, -54, 46, -23, -21, -10, 74, 5, -12, 24, 0, 0, 18, 28, + -34, 39, 31, 19, -55, 21, -28, 37, -25, 34, 9, -36, 33, 27, -68, -4, + -19, 18, -24, -35, 67, 10, 14, 47, 18, -1, 50, -47, 62, -32, 43, 46, + -71, 13, -36, -25, -26, 7, 29, -32, -66, -50, 28, 44, 14, 59, -24, -7, + -7, 16, 46, -30, -19, 28, -13, 24, 49, -65, 77, 16, -7, 59, -7, 23, + -32, 35, 59, 49, -30, 24, -83, 9, 37, 50, -10, -7, 9, -7, 33, -61, + -24, 26, 1, 25, -7, -50, -5, -67, -51, 10, 13, 0, -30, 16, -41, 65, + -40, -13, 13, 22, 41, 32, -66, 18, -27, -22, -27, -67, 67, 46, -31, -12, + 14, 63, 49, -3, 83, -25, 80, -78, 53, 16, 25, -55, -12, -57, 80, 9, + 6, -9, -32, -33, 53, -81, 54, -28, 10, 50, -26, 9, 41, 21, 25, -56, + 11, 5, -59, 33, -54, -55, 19, 19, 34, -18, 73, -44, 4, 17, -12, 62, + -88, 47, -38, -50, 71, 52, -22, 12, -3, 29, -84, 10, 29, 43, 20, -43, + -18, 19, 41, 2, -70, 50, -8, 69, -39, -28, 48, -43, 51, -13, -39, 39, + -50, -21, 70, -53, 6, -12, 4, 35, -46, 5, -55, 47, -36, -18, -44, 48, + -40, -11, 17, -30, 25, 47, -66, 48, -56, -41, 13, -65, -1, -11, 27, 34, + -81, 42, 39, -18, -8, 29, -54, 14, -46, 29, -6, 2, 60, -5, 19, -31, + 1, 25, -3, 3, 16, 20, 16, -27, -91, 71, -70, 21, 32, -57, -15, 45, + -56, 9, -51, 8, -25, -28, 48, -87, 58, -91, 25, 24, 11, -96, 105, -56, + 71, -41, 21, 41, -42, -67, 66, -67, -16, -55, 45, 34, -50, -18, 20, -37, + 52, 18, 1, 86, -49, 33, -90, 82, 9, 30, 16, -83, 17, -17, -5, 32, + 0, 35, -54, 63, -52, 32, -38, -12, 40, -47, 6, -78, 30, -75, 22, -49, + 76, -82, -29, -76, 49, -50, 104, -41, -55, 18, -35, 0, 34, -8, -25, 58, + -1, 13, 4, 9, -20, 40, 23, 56, 61, -76, 72, -45, -3, -8, 40, -44, + 20, -57, -1, -68, -9, -5, -1, -31, 52, 29, -60, 100, -82, -36, 12, 10, + -58, -2, -57, -15, -28, -33, -26, -31, 0, -19, -7, 46, 46, -4, -43, -42, + -35, 14, -31, 21, 17, 25, -68, 40, -54, -39, 18, -40, 17, -53, 34, 32, + -15, 52, -87, 62, -35, -4, 54, -7, 33, -25, -14, 1, 1, -22, -4, 0, + 49, 31, -4, 41, -57, -14, -12, -2, 15, 45, 25, -20, -39, -43, 21, 42, + -45, 44, -3, 19, 0, 30, -37, -25, -23, 23, -23, 15, 18, 32, -50, 28, + 10, 45, -76, 78, -69, 19, -32, 58, -46, 32, 45, -6, -39, 50, 0, 14, + 58, -26, -4, -41, 27, -37, -12, 22, 40, 63, -32, 46, 32, 18, -38, 0, + -7, 14, -55, 32, -43, 17, -18, 24, 8, 8, -65, 35, -52, 2, 10, -45, + 36, 9, -24, -20, 22, -2, -35, 51, 19, -1, 17, -6, -34, 47, 9, 8, + -18, 62, -32, 22, 2, 12, 32, 57, 22, 63, -1, -60, 3, 74, -83, -17, + 21, -15, -7, 19, -44, 96, -28, 40, -22, 89, -103, 54, 31, 2, 21, -32, + -11, 4, 8, -64, 27, -27, 77, -52, 2, 8, -53, 73, -6, -4, -37, -44, + 38, -10, 0, 15, 6, -52, 51, -30, -40, 41, -81, 97, -56, 81, -72, 66, + -52, 44, 56, 50, -63, 80, -81, 52, -5, 12, -3, 53, -15, 22, -66, -2, + -69, 45, -52, 54, -88, 41, 33, -89, -18, 96, -84, 61, 30, -66, 61, -40, + 66, 20, 30, 57, 18, -37, 13, 59, -8, -55, 86, -62, 31, 66, 5, 29, + 67, -59, 53, 51, -48, 38, 59, -13, 37, -62, 23, -32, -41, -10, -5, 51, + 54, -44, 78, -9, -29, -2, -3, 44, 43, -37, 78, -27, -8, 47, -23, -41, + 6, 25, 70, -9, -14, 62, -60, -30, -65, 60, -1, -33, 50, 14, -47, 77, + -77, -20, 0, -10, 34, 39, -28, 14, -48, -48, 9, -33, 34, 51, -3, -21, + 33, 0, -37, -31, -2, -2, -5, 42, -37, 14, 23, -45, -31, 36, 57, -55, + 47, -62, 47, -18, 53, 43, -28, -74, 82, 10, -52, 30, -4, 68, -67, -23, + -1, -7, -22, 72, -9, 10, 9, 12, -53, -51, 25, -26, -73, -11, 29, -55, + 52, -52, 17, 17, -40, 51, 27, -53, 29, -42, 60, 67, -71, 105, -60, 65, + -37, -15, 0, 20, 3, 51, -74, 60, -83, 66, -41, -2, -9, 63, -88, 83, + -63, 38, -7, -35, 27, -32, 3, -83, -14, -68, 52, 5, -44, 20, 58, -25, + -16, -9, 52, -48, 12, -55, -51, 3, 68, -57, 52, -30, -55, 67, -49, -12, + 20, 16, -22, 16, -74, 80, -34, 7, -30, -1, 64, -19, -5, 35, 9, 31, + -65, 6, 45, -6, 11, 59, -74, 63, -26, 50, 56, -50, 57, -95, 36, -21, + 51, -49, -69, 74, -31, 4, -13, -41, 56, -87, 34, -78, 51, -46, 64, 47, + 28, 10, 0, 15, 29, 24, -57, 75, 7, -65, -16, 5, -61, 82, -42, -35, + -26, -53, 73, -62, 20, -48, 31, -50, -23, -28, 8, -36, 23, -38, -59, 21, + -56, 69, -78, 41, -16, -30, -23, 61, -42, 67, -30, 4, 54, -6, -6, 21, + -38, 4, -24, -35, 30, 39, 2, -46, -54, 79, -98, 47, -13, -22, -30, 3, + 36, -65, -95, 61, -46, -4, 27, 18, 28, -28, -12, -11, -17, 41, -43, -38, + 27, -6, -20, 5, -33, 15, -30, -10, 51, -24, 35, 31, 12, -61, 2, -8, + -30, 14, -2, -8, 68, -39, -18, -2, -3, -6, 61, -45, 54, -47, -56, 49, + -10, 22, -58, 51, -59, 18, -69, 92, -78, -49, 59, -4, -52, -58, 87, -48, + 55, -45, 24, -12, -66, 37, -79, 44, -28, 54, -25, 26, 35, 18, 30, -20, + -24, 37, 47, -15, 24, -71, 5, 47, -34, 9, -21, -58, 33, -60, 9, -39, + -45, 43, 8, -38, -11, 3, 24, -1, 18, -23, 20, 11, -41, -35, 56, 0, + -29, 15, 40, -7, -2, -9, -11, 60, 36, -4, 32, -28, -6, 40, -36, 9, + 61, -58, 76, -54, 52, 1, 71, -34, -46, -4, 49, -27, 24, -26, 34, -21, + 48, -60, 75, -19, 58, -54, -11, 18, 29, -21, -36, -32, -47, -8, 3, 37, + 30, 19, -84, 12, -50, 22, 30, -29, -20, -11, -42, 0, 0, 59, 6, 14, + -33, 80, -37, -33, -39, 8, 38, 31, -13, 77, 27, 2, 5, -1, -32, -68, + 45, -54, 18, -60, -23, -5, 4, -46, 9, 29, 52, -17, 13, 30, -72, 83, + 13, -5, -58, 11, -14, 91, -57, 71, 30, 58, 0, 4, -35, 68, 10, -13, + -18, -37, 27, -1, -11, 21, 17, -59, 19, 4, -24, 67, -59, 2, 16, -2, + 18, 60, -33, -24, 43, -31, -27, 55, -34, -2, 52, -42, -8, 2, 31, 3, + -35, 58, 62, 15, 15, 15, 8, 56, -43, -9, 63, -40, 60, -11, 44, 10, + -15, 65, 35, -27, -25, 41, 53, -6, -35, 40, 3, 14, -53, 20, -7, 34, + -28, -9, -17, 7, 26, -35, 14, 39, -17, 16, -59, 1, -28, -46, 75, -25, + -85, 17, 48, -59, -13, 45, 8, 8, 29, -12, -13, 26, 2, 63, -79, 34, + -76, 42, -34, 49, 29, 40, 48, -42, -11, 39, 15, -19, 12, 4, -75, 80, + -77, 78, -87, 14, 7, 35, -15, -8, -58, 77, -59, 23, 34, 9, -36, 42, + 63, -41, 12, 36, -4, -25, 12, 12, -14, 32, -36, -17, 100, -56, -41, -34, + -9, -25, -1, 2, 30, 44, -42, -60, 57, -77, -1, 11, -8, 15, -13, -5, + -35, 3, -58, 19, -36, 46, -71, 61, -15, -8, -60, -13, -2, -31, -13, -9, + -30, 58, -67, -34, 46, -6, -18, 13, 11, -49, 6, 64, 16, 51, -29, -35, + -41, 5, 47, 36, -41, 47, -17, 17, -23, 29, 42, -25, 22, -114, 69, -43, + -33, -31, 25, 66, 24, -57, 56, -61, -18, -39, -66, 58, -47, -20, 93, -50, + 49, 6, 6, 58, -4, -35, 4, 3, 55, -26, -48, 40, 7, -42, 62, -39, + -22, 1, 8, 66, -26, -37, -51, 13, -43, -46, -6, 5, 30, -55, 12, -27, + 92, -16, -32, -22, 5, 0, 38, -1, -35, -40, 67, -41, -26, 16, 7, -17, + -51, -41, 18, 24, -47, 7, -48, 7, -16, -15, 8, 14, 31, 0, -41, 25, + 8, -17, -59, -12, -32, -46, 16, -47, -17, 27, 9, -21, -18, -41, 19, -37, + 13, -43, -63, 61, 18, -56, -22, -52, 62, -35, -56, 30, 57, -44, -3, 0, + 12, -1, 24, 3, 0, -23, 29, -6, 42, -59, 45, 52, -1, 46, -51, 66}; diff --git a/gs/toolbin/halftone/ETS/win32/ETS.sln b/gs/toolbin/halftone/ETS/win32/ETS.sln new file mode 100644 index 000000000..63c293e38 --- /dev/null +++ b/gs/toolbin/halftone/ETS/win32/ETS.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ETS", "ETS.vcproj", "{9F937420-ED89-4C41-AED3-52937666B60E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9F937420-ED89-4C41-AED3-52937666B60E}.Debug|Win32.ActiveCfg = Debug|Win32 + {9F937420-ED89-4C41-AED3-52937666B60E}.Debug|Win32.Build.0 = Debug|Win32 + {9F937420-ED89-4C41-AED3-52937666B60E}.Release|Win32.ActiveCfg = Release|Win32 + {9F937420-ED89-4C41-AED3-52937666B60E}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/gs/toolbin/halftone/ETS/win32/ETS.vcproj b/gs/toolbin/halftone/ETS/win32/ETS.vcproj new file mode 100644 index 000000000..09f6c14d2 --- /dev/null +++ b/gs/toolbin/halftone/ETS/win32/ETS.vcproj @@ -0,0 +1,196 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="ETS" + ProjectGUID="{9F937420-ED89-4C41-AED3-52937666B60E}" + RootNamespace="ETS" + TargetFrameworkVersion="196613" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="2" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + WarningLevel="3" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + GenerateDebugInformation="true" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + EnableIntrinsicFunctions="true" + RuntimeLibrary="2" + EnableFunctionLevelLinking="true" + WarningLevel="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + GenerateDebugInformation="true" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath="..\ets.c" + > + </File> + <File + RelativePath="..\test_ets.c" + > + </File> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath="..\ets.h" + > + </File> + <File + RelativePath="..\tm.h" + > + </File> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> |