diff --git a/README.md b/README.md index 2585bf5..fdaa626 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ securely holds Ghostscripts in a laser containment field :-) ##Download -*Windows:* [ghost-trap-installer.exe](http://cdn.papercut.com/anonftp/pub/open-source/ghost-trap/ghost-trap-installer-1.1.9.07.exe) (version 1.1) +*Windows:* [ghost-trap-installer.exe](http://cdn.papercut.com/anonftp/pub/open-source/ghost-trap/ghost-trap-installer-1.2.9.07.exe) (version 1.2) ##Motivation Page Description Language (PDL) interpreters are large complex native code solutions. Adobe Reader is also a PDL viewer and as evident @@ -92,15 +92,20 @@ The Ghostscript interpreter code may only access: ##Release History -**2013-01-14** - * Initial public release. +**2013-03-04** + * Addressed an issue that would result in Ghost Trap returning the wrong exit code. + * Rolled to version 1.2 **2013-03-01** * Compiled against Ghostscript 9.07. * ```-dSAFER``` is now and enforced default. * Updated license to AFFERO GPL. * Minor code cleanup to remove some FIXME's. - + * Rolled to version 1.1 + +**2013-01-14** + * Initial public release. + ##Future diff --git a/build.bat b/build.bat index baac4e5..83261e7 100644 --- a/build.bat +++ b/build.bat @@ -1,6 +1,6 @@ @echo off -set GHOST_TRAP_VERSION=1.1 +set GHOST_TRAP_VERSION=1.2 set INNO_COMPILER=%programfiles(x86)%\Inno Setup 5\ISCC.exe SETLOCAL ENABLEDELAYEDEXPANSION diff --git a/src/gstrapped.cpp b/src/gstrapped.cpp index a3afc26..7b391a3 100644 --- a/src/gstrapped.cpp +++ b/src/gstrapped.cpp @@ -539,7 +539,7 @@ static int SandboxedMain(int argc, wchar_t* argv[]) { // GhostTrap is a secured version, so it's only appropriate to ensure // -dSAFER is always on by default. Always append (after arg 0). if (i == 1) { - nargv[nargc] = "-dSAFER"; + nargv[nargc] = _strdup("-dSAFER"); ++nargc; } diff --git a/tests/input/alphabet.ps b/tests/input/alphabet.ps new file mode 100644 index 0000000..33069fe --- /dev/null +++ b/tests/input/alphabet.ps @@ -0,0 +1,74 @@ +%! +% Check for command line parameters: +% Name, FirstSize, Ratio, NumSizes, UseOutline. + +/alphabetsave save def % prevent left over effects + +/FontName where { pop } { /FontName (Palatino-Italic) def } ifelse +/FirstSize where { pop } { /FirstSize 15 def } ifelse +/CurrentSize FirstSize def +/Ratio where { pop } { /Ratio 1.6 def } ifelse +/NumSizes where { pop } { /NumSizes 3 def } ifelse +/UseOutline where { pop } { /UseOutline false def } ifelse + +/Strings FirstSize 20 gt + { [ + (ABCDEFGHIJ) (KLMNOPQR) (STUVWXYZ) + (abcdefghijklm) (nopqrstuvwxyz) + (0123456789<=>) (:;?@ !"#$%&') + (\(\)*+,-./[\\]^_) (`{|}~) + ] } + { [ + (ABCDEFGHIJKLMNOPQRSTUVWXYZ) + (abcdefghijklmnopqrstuvwxyz) + (0123456789<=>:;?@ !"#$%&') + (\(\)*+,-./ [\\]^_ `{|}~) + ] } +ifelse def + +/sshow + { gsave UseOutline + { { gsave ( ) dup 0 4 -1 roll put + false charpath pathbbox 0 setlinewidth stroke grestore + pop 8 add currentpoint exch pop moveto pop + } forall + } + { 2 0 3 -1 roll ashow } + ifelse grestore + } def + +FontName findfont FirstSize scalefont setfont + +clippath pathbbox /top exch def pop pop pop newpath +10 10 moveto +NumSizes + { + gsave + CurrentSize 50 lt { + FontName findfont 50 scalefont setfont + (Q) false charpath pathbbox + exch pop exch sub exch pop 1.25 mul CurrentSize 50 div mul /height exch def + }{ + (Q) false charpath pathbbox + exch pop exch sub exch pop 1.25 mul /height exch def + } ifelse + grestore + Strings + { currentpoint exch pop top height 3 mul sub gt + { showpage 10 10 height sub moveto + } + if + dup sshow + UseOutline not + { 0 height rmoveto gsave 0.01 rotate sshow grestore } + if + 0 height rmoveto + } forall + /CurrentSize FirstSize Ratio mul def + FontName findfont CurrentSize scalefont setfont + /Ratio Ratio dup mul def + } repeat +showpage + +clear cleardictstack +alphabetsave restore diff --git a/tests/input/annots.pdf b/tests/input/annots.pdf new file mode 100644 index 0000000..0a22851 Binary files /dev/null and b/tests/input/annots.pdf differ diff --git a/tests/input/chess.ps b/tests/input/chess.ps new file mode 100644 index 0000000..b2f1524 --- /dev/null +++ b/tests/input/chess.ps @@ -0,0 +1,1052 @@ +%!PS-Adobe-2.1 +% %% HOW TO USE: from Unix, "cat Cheq Example | lpr -Pprintername " +%%Title: Cheq.cheqtxtx +%%Creator: Glenn Reid and still.ps (V 1.0d release 10 edit 08) +%%BoundingBox: (atend) +%%Pages: (atend) +%%DocumentProcSets: Adobe_distill 0.95 +%%EndComments +/chesssave save def % prevent left over effects +%%BeginProcSet: Adobe_distill 0.95 +/PROLOGUE 30 40 add dict def + % 30 procedure entries + room for 40 cached font dictionaries + PROLOGUE begin + /clip { } def % causes problems. remove if "clip" is needed + /bdef { bind def } bind def /ldef { load def } bdef + /T { moveto show } bdef /A { moveto ashow } bdef + /W { moveto widthshow } bdef /AW { moveto awidthshow } bdef + /f /fill ldef /R { { rlineto } repeat } bdef + /r /rlineto ldef /L { { lineto } repeat } bdef + /m /moveto ldef /l { moveto lineto stroke } bdef + /x { 0 rlineto } bdef /y { 0 exch rlineto } bdef + /c /curveto ldef /cp /closepath ldef + /s /stroke ldef /w /setlinewidth ldef + /g /setgray ldef /j /setlinejoin ldef + /d /setdash ldef /F /setfont ldef + /C /setcmykcolor where { /setcmykcolor get }{ %ifelse + { %def + 1 sub 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat + setrgbcolor + } bind + } ifelse def + /MF { findfont exch makefont setfont } bdef + /DF { findfont exch scalefont setfont currentfont def } bdef + /BEGINPAGE { pop /pagesave save def } bdef + /ENDPAGE { pop pagesave restore showpage } def + /REMAP { %def + FontDirectory 2 index known { pop pop pop } { %ifelse + findfont dup length dict begin + { 1 index /FID ne {def}{pop pop} ifelse } forall + exch dup length 0 gt { /Encoding exch def }{ pop } ifelse + currentdict end definefont pop + } ifelse + } bdef + /RECODE { %def + 3 -1 roll 1 index findfont /Encoding get 256 array copy exch + 0 exch { %forall + dup type/nametype eq + { 3 {2 index} repeat put pop 1 add }{ exch pop }ifelse + } forall pop 3 1 roll REMAP + } bdef + end %PROLOGUE +%%EndProcSet: Adobe_distill 0.95 + +% %%%%% Following section added by Artifex Software: +% %%%%% load the font explicitly so it doesn't have to be in Fontmap. +% %%%%% +% %%%%% This font was previously in a separate file which has caused +% %%%%% numerous spurious bug reports since examples were moved from +% %%%%% the 'lib' path to a separate directory. + +%!PS-AdobeFont-1.0: Cheq 001.000 +%%CreationDate: Wed May 24 10:41:05 1989 +%%VMusage: 23317 29750 +%% Adobe is licensing this font software "Cheq" to you royalty-free for your +%% use and not for sale to others. This font software is provided as is and +%% Adobe disclaims all warranties, including merchantability and fitness for +%% a particular purpose. Any and all copies of this software must contain +%% this notice intact. Design (D) 1989 John S. Renner, Adobe Systems, +%% Inc. +11 dict begin +/FontInfo 10 dict dup begin +/version (001.000) readonly def +/Notice (Copyright (c) 1989 Adobe Systems Incorporated. All rights reserved.) readonly def +/Copyright ( Adobe is licensing this font software "Cheq" to you + royalty-free for your use and not for sale to others. This + font software is provided as is and Adobe disclaims all + warranties, including merchantability and fitness for a + particular purpose. + Any and all copies of this software must contain this notice + intact. + + Design (D) 1989 John S. Renner, Adobe Systems, Inc. + ) readonly def +/FullName (Cheq) readonly def +/FamilyName (Cheq) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /Cheq def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for + %% Encoding below refers to Macintosh keyboard. + %% You may want to re-encode for your needs. + %% some entries are an attempt to accommodate + %% the German/Russian spelling mnemonics, + %% except for "B" which remains for Bishop, + %% and not for Bauer (the pawn). +dup 120 /BSquare put % x +dup 32 /space put % space +dup 66 /BBishop put % shift-b +dup 68 /BQueen put % shift-d +dup 75 /BKing put % shift-k +dup 76 /BBishop put % shift-l +dup 78 /BKnight put % shift-n +dup 80 /BPawn put % shift-p +dup 81 /BQueen put % shift-q +dup 82 /BRook put % shift-r +dup 83 /BKnight put % shift-s +dup 84 /BRook put % shift-t +dup 98 /WBishop put % b +dup 100 /WQueen put % d +dup 107 /WKing put % k +dup 108 /WBishop put % l +dup 110 /WKnight put % n +dup 112 /WPawn put % p +dup 113 /WQueen put % q +dup 114 /WRook put % r +dup 115 /WKnight put % s +dup 116 /WRook put % t +dup 245 /BBishopOnBlack put % shift-option-b +dup 235 /BQueenOnBlack put % shift-option-d +dup 240 /BKingOnBlack put % shift-option-k +dup 241 /BBishopOnBlack put % shift-option-l +dup 246 /BKnightOnBlack put % shift-option-n +dup 184 /BPawnOnBlack put % shift-option-p +dup 206 /BQueenOnBlack put % shift-option-q +dup 229 /BRookOnBlack put % shift-option-r +dup 234 /BKnightOnBlack put % shift-option-s +dup 230 /BRookOnBlack put % shift-option-t +dup 186 /WBishopOnBlack put % option-b +dup 182 /WQueenOnBlack put % option-d +dup 251 /WKingOnBlack put % option-k +dup 194 /WBishopOnBlack put % option-l +dup 181 /WKnightOnBlack put % option-m +dup 185 /WPawnOnBlack put % option-p +dup 207 /WQueenOnBlack put % option-q +dup 168 /WRookOnBlack put % option-r +dup 167 /WKnightOnBlack put % option-s +dup 160 /WRookOnBlack put % option-t +dup 47 /left put % slash +dup 92 /right put % backslash +dup 95 /top put % underscore +dup 45 /bottom put % hyphen/minus +def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/UniqueID 23368 def +/FontBBox{-50 -150 1050 950}readonly def +currentdict end +currentfile eexec +06ba7b33fcf5ae0f0b258ced9b9688e8a87f93db8efdacd17ec2401f2e7dac03 +bf5515b9e42d78a8037b743d280529fc7630d62bd4c75492c78fd28b2c2aba67 +9cc93d471b097ea30e29f7c89735dd88b4c3e9cb32e14ef50432a6ab37870a14 +af81e471af496fa0e292e1e8168461acf6191017048deb62dd5fd7c784ba88aa +a921563b3143218981a38441910687a3202a5135e58ce2ecdf9c2d521c6df45b +aab245f99427574c148904e2a60104e97e6b05bfd9be9a086246a797a03dab25 +948bf8e7996f70ffd6471eef9faeada641e245d63c4964a38500b4754836131f +86fc61b1de2e0b53ad441b1446fedcd2c533d44c69631a545c98d4c552e5f0b2 +27b40aa0443f7f88e1d6e5bd206ed737fffbe94e8bf001e3481cca5a45735979 +e41ea918a7c0ca5e26ab946df29d27b5ec2671d8e0d7d31b114c29e48ccd3e8d +7bc69903aeb804fc25aa2dda700de6ede9fc025f0db1aa478b53fa21ed455ec1 +98c7a20020a077a67b743f563cc4c4e59c2d8253bc8c3ea62d4a870f53b2515c +8b63b857664ab5f0ad71eb89d34decf825e81c10c3a7e676ddddd182cd6ff6da +631d2051ccb078bea7b2ffab7dc23ca08b337ecc454a8f743a71512149244b00 +72670c8978396cefa735113500de6cec50ab91084340db0ba24a01672dc3a3a5 +e860df42ef02350778cb8e77b5533227aa2f79cbed414f760d92cd071fb5db1b +669ef0196c6e95a530c8112a8a3ac716fb913a8a1332a590b46d2e267b97b1be +0e0ba7e4e8c90f1d37b8c1836fbdc93121c5758a31d3ef4650adc41f253ba07a +ab0dc45d90e8936672b1a47307903dbcbf8e15b70c862d25c57c6e2727f6674b +c47ff5eae01e0fe7d182742ac456f986d0eb460f4f7fc2693e37899a04b3684e +fd57e9b235b339017c36b1ef22f9659a0c7743e663e831be7faa602cff221701 +85b13653ad5269a88da74ed803beb08bc40f0bfcfd7cbc49531756b41171c22d +aae8ff9a454f9d68df7f4b23409634346d8e26ac2109391398ed37705e2e063a +065a871b78b2b0d4c74b6e4e42877a4450b1974474dc19437e9e1d8a6ff2a374 +0e399857e4f67056577a19f7e26542fae9a75f1e07ed1869c504625d701fdbea +392b4b2e83ea3c179991f5dded833a74df4d277fdd119f69e8209be9394473f3 +6d6383a762a518d04812f29ec4bb71f451882e9f89a52114215b31b225db3da5 +eb453e7f4f40861963d6412855582128dcd1677d94df95442aba41d3cdf32f0c +f1a6eace61e491f64152a57410902642145aca0104350bd8b19441072da5e142 +758ef9a1f6c6e0fe47335113843443a07c68606510af206677e764dc0e319ff0 +93d0fef01274205b370422182765a40ac3d23f4c326a732282c455a0eb737ac4 +11673164b7b35e42cb4be5dd4be49958b2c61a5bcc5a332b917d5525c0680a14 +b7c700339112eb47015e80cadfd5a6484af9201f57f6e15b70c0964ea5365173 +ba78aec0d5a7414a4636090b9eef9d71fa424c47fb191bfaeea8d1d29beebbe2 +fc78ea4a1edb5c325bba25851e72146eab86a69e57b6a4a31bc7a4cad9f8910d +3394c3a92e5189b3447df2fc1a5add98fb8e4ad616685beb6778fe7d444b5ef3 +f4847419c0013e6689e40860aaf46d77f172b86be22630674ac7d37354098a7b +08add07f1c48dc3dfd56716c3e126f674690d504fc771beaf5e12e9a32f2a17b +1f753b50c16bb45e2db812bb8e179f1641147da41ac30d08238141315c211f57 +fe8f9c86a087208ebd350f3d1381187a19850d4c2dc0428889c7776047f69574 +4ac1f676453ea360e0d5b18fdf2b2ac8f9e72369e221f447f0eb55bc80460149 +9e5e501c359e1656ab1bc4699569566ba8bee1463746ca84c51ce83cc98adcde +48f109d71339d0293ed3104a84287b15c3fc4ae425754f5fd66bec0c9f6e27b6 +ea6dbfdbdbdb3c3aaf935969d635a71a61fb4bd8a8384571c4671c98da20d1fd +accbcdcdd1cca1f44bdd6ea4827ebcf41ea97147921d6894eff290d1bda74208 +38e9c0453e9f9e6d522dcc5667c1b44f57d60be5239c5e58f4b1e16672608a3f +68f1b7c3d11f609ed4fe10ab359a5b5a7a9da15b44273fd38c303dad6832ace0 +81e7e85a836e4bd7e9f9149276be282442ae3ce0fa74d29a9b4e56a99aa06f2a +be39c7f4755745f07d29f9a4522a1a43f11f60c31538ea1a37ca793376ecdb2f +9dee32abb3fb035ad68e1b24d97ac3004508b514f33b86b6e19ab578c1a891ec +6a2e2f9cb6f784f2c1372978706102bd273bb721cddb3fa2659ff4485119cc94 +2e140051600bb66d0ae6db27205fc9c9e1c6f07a4eb6cda7adec4d86bfbf0748 +45dd09d9178745f790ef5f5679840deff1cc38810e49066d41743db0b6a087bc +93307d009dd566c4cc13ed3b634b7f60fd6a7e9fb2774eda2b106d2960dfe979 +c76d0fe4689ce8f4490c76c1064861624d909d678379f9602c2b9df3b0f9abcf +dab614aec38e22bf064950094d9201c6afa52cc5fc7779b279ef41231546f13d +f1ef498eae5c445f7691f96ebabef21e7f2d1ee2eedd9846c20b067a73aa2159 +a116bd056e733b00a847a9dcc82ce288f3037b76be87412ab5c0f86dc3959ab5 +85223a2465a11d0bc9b5d93805c5e4466081109f175fae62f82c5012ef4a2c7c +23ff8004c8704103f0dc1589270f8282f9d5a0f51408379ace784d0af862b548 +1c11650e865e17af7e04df20a4049295e93d32f22c1cc3c39a8626fa343d1f18 +a3495bc7dcab911cff66d60d29e1b45a7f16a477b83cf18c523c288c91adc74f +e6b3a91445a68313118abd7bd8a0a1ce9290f868f583a3ff80db71381eeb2de8 +e80b4d8d2cf70bcdafc08788ba8cd6cb2b6fd739ef809c3cb2ad1ded30e14240 +a7db077e83d18c867e22ba60a57ee2d825c2f7c8b9054d09d6049255a30c67d7 +3d01bca101e4e93d2e82e14a86f331b501736cdcac5f562d16f190aeecb5fe39 +7b434555d2b8a2bd4d363cdd4a19e69c6bf2e7856e3c9214b0931d392ae644b9 +bec489e739e7e091e0dea23212e398e9ae3194d52f42afb75079a63f9c39f205 +73acb5dc43426f3657575930d5c2a053f7fd5b43f2d011ad74070c1ebdd52aa9 +70961253b0715079e17a8339f7d48c9821bad9b4ea2ea0e03e19fefca01f36c8 +bb91586e2ded2b2fd7512bc9e6787340d78d6d308e8fcafc751707f243fb30f2 +5479cf7e89801c62ba25ff7548892e1e224878aeb4cb1f05287cb7febe450986 +5d8f2f6469bba902a8f7f0892a954d7ab83e600ceb2dc127239d570428fe9008 +ba45c4f6b1734a4019122ccea228571be3dee9302bbb7aff9f4ff06290422f91 +97f61416b4b19c2cf8225cb54dd3e8090c74abbe1080301cf19d61faebaee2db +9e5c3931c102eab99c20676b1920913273aaf753ba60d87773ca7215562fb612 +5f246db99d0b1381f716a7690efe7ab2b54c072853bb28705d12dc35b3722ff6 +11675754ee99e7323b2389024b7112be202194e142285227bf08270b560fcf34 +2d16392b6dd428e30a10e0d87977a5e6b035063b3f43f4fcaa21b30c90a194cc +5569a0c060b081a054de4bee53914c2bba4e3376b4a44ca48b58e18be2f84a62 +5039ec6f2ef3a6cd1d31d5eb6692420d89306f2e6a712d3f3220e2937f9c4e41 +33cdae5b6d2a09e0a141fb41d58d5ae2111e74501fe591bd3697d6592db2b425 +0ca00f66be5069fc5800e04fd4c4dc1c86f723c02684b7c353f90c4cffa5fd92 +8ee3d10b9b259048c67c3bbfe026185e8a5e8b097390dac73faeedd924ea3d24 +cf82c27494b4f0d7abb77821408175187ce0e81ee5d672000d1dfdb089864ead +599f8392cb7a14624c0624d8b1116645ecede619b1d864332d521b0124de044f +e576158176364601a6192366bfe9c3ca0491c91e53d21845b63b54ed4d1f37c1 +8214248152c57a2bfdf8499abb15e1b9dc565456e5765edab49357464a2597c0 +e4c987620bb512fa33b6c3f643f94e89d83b5778cf56e0cdf6c1721f58c4d3b2 +dc13d5372a854d1b4f0415d37e96f6ba8cc5685413ba4481f2fc489484461d6f +5e081b04a478b0a09139a26ab2944deb0ea32a61f1e787d90cb55ca1c88bbfcd +37233d2cc2f7deea0112a9ea83ede40232d5d97e4447e02dc450d0c944bd746c +8d33b0bf6a190614c016bc96dc7b58835bb0daeeeed1b306326a4c516ef39a43 +4e59f1d5e469678ddfb649bfb3ae3726c2a50e680701812e57f5f11056d3b6a4 +df4be50aa1edab57e5df5f5fa7af30f9fe9627b01871e88637ab68e7d7d9aef6 +7920bdfa66b77bcccbaa2f09cb59496e96a4f7cdd7986e6a1fac884a9c729771 +a3c7ce311151e93138e3e02bab11bdd4b1fc2e7073b5a35bb8601ad01da624d8 +2f578fefdd7f81db5ccf4e4eeabba67aac9b5e38a63ce7c1e591dccc86ccd17c +f978e4fa9ba685854464de478f113a9be8d6575cbed7d32723a879628b9f977c +42d4771fe17fa0a4cb918b6565dda1c28f7219851e917806cf7105efe42a9a94 +a76536077b3a9732c01dea56b938803a43f521faa3ab493383ddafd8b159f00e +87dcd4dd42de5bd113ea2ff055a2153bbb1fcf3b51a85fa18191ff143948de0b +cf606706cba9afc5db85c4911fd1fe2377f68514a3485b40b91c1aa46f526485 +ca9720dd285b3abad88fe5d9ff2afc628caddd01b044161f6c18ec243028b727 +b2aa343385c848560c52d6fb81791f3a2ff66fcadd3ea41691a2073ef984229f +07355f8a6a37a9489494fe02c233c4506f440043b4062755f0cf7ff4b32bc154 +dd96fc84a35f0f989a1c668a945a8032980f073469b84002a85bebf6ef17fa30 +d332c88ef5235cddf6a66addac6d66d1f8944d9fdf9e33740c319979ca36a0d2 +02e72221f5fa890d1b88734bf6504ff40a4777b27fab35ae19a46338f9542851 +ab50034d1a515fd8aa550bd7074b283b2206acf1c13da6d3a9430b1dc5463b95 +b631f28aa62edf5d9b273ba803e72145bf0dfae33223132539b0346c9de97ed2 +7e553e095c97f9b3a14da699c383840456823419906b5f4be20337e537e0e8ad +557795a68d1fd3e6f770b2cceadcf493d19d688e2e80f83d8dbaa95ece47f6a3 +5c028455cff81071c06eeb830496722a588204cbf52d18544b9ad755e21afb16 +7e27bd39aba20041bad3a99c66d6c16e67fee8ed79712f2a0a788c51e8f26d73 +54585dee498403b734f56cc3015e2a88a23dc6890f942690ee717ac457a1592a +ba7b038bf3f0e6f1e056879cf8d23660d8eb5db01951f0ef32ad2e6e8af7e06f +b81e7e945f45dfe64a264ffa6e8d9f0b03d2ff2ebe450e8b6d4969e49d0f5e1b +080eec0d7f9ec42dd64d2f2629db0769590fe62871df28a350379426cea16b52 +db14a5e5c23d13da4084723b9346011ac33caa39886424c31899460a5f35f405 +363e69085db6e55b069ded255dd172fe3df0b0d31a0053e234b3e2ec44f433a6 +7a638f9a55a445412fcf8c6ff4d01fdcf6e012ed305beb3fa0b1752441c56e51 +c30b82300e0b98ff032e3bc4e27d6485741e27a07ea8a131bd7e697e28854ef8 +c58801a100ba86d94ebc1213cb54a81083367f385d028644f213bc18eb70734e +8de376d680e8b71b530a5f235fb14d7f3d3059862cbb7ea9b6bc2d827bf71744 +87226be663ce0a9feb4f248e28b71649355bde7febf2b8cce5f674f6afea22cf +f42e98405fd872dc2afadb1d8b1630265913cd5452c7b6bfe516624c16e6133c +3b0152abf170701b5600882b3a4c2fabe4c9794a4bb48c3e2d9a4c03744662b8 +0ffa2ac877f5a0db47d26d97bece9f04220d7a19f7abae2346016a359f183271 +1a022c704e4bb9bf7215089e7979cefb7fd438fce318f3a900385d6162aaf8d6 +23f50ebd7b7de89e426631b59b1fdc688f36fc81ff8621e7adbc3b1aad6c2d19 +b9995b873acdce08661a25f30f551144e88bf163db7739c67fe4f26ed01fb8fa +9e0a8628ac2338778249c101bcb667f8e7d37f97fa68a680ebe80421ff943a33 +ddb2dd16c13f82c7100d6d4ca8fea5283518cc9004a9cf1e6b590bd8b9795599 +eb091c682528dcc8890bc45517ee013e146f6e2d37e4b20f007c47fbba8d600a +63288701ae7e57cb2905f5b71557f2d1599f1d5eda80f59896199e2aa744dd56 +74af44b9b87886ff41240188c6753248d30b7f1aec5520c18589120615e458f0 +65e158f2015098676e62329cbfb76bd5bacbe510ab5cd1df00c4b750eab9bc05 +b2a6d05a17ff8f198ddc48abe338e5aa4280080f5256bca57289511d5206dc65 +d77507048626e2483fd6239bd14d81b4e6ee321c957332629f004710adda7007 +04307317a3daa98a28ae9a788c025aba2e667f28e567678f7dd8e1ab1732e74c +886e342da3330094619b2a0fb6adb7189c0be350c4052e24ac09c307b4de27de +88b13f8c3690f42ffc6f9b3a16ea9fd3aad6d2529d507de80a66fb2974f96f5a +6ec51c306f3253a03720e45cdeff9d70d1383ef21e36f9d9a8236fb90504eecc +5cf90d24debe60c8c45e12ed3f6a61c29788d1c5cd7cada5a2f09dd01bfd1a4e +f57202691b773a337533dcaf80ed4dadcbbbaccd19765eff4d7316860502a30c +b422ebaf5d9b9bb9634abd56a40c0e5d05b1e8b76710abf46d8ae3be97ac19b0 +31f01237a0bf80b474cbfec8b863141298ddcc4bbe702d5cc574d64d21921615 +755553007b7a3e031ece5e2797d72e381c49f4c3976594f863660c1529b461fb +bbd4da0d101d5f1b7e3f00a0e0611758619f0624fffef8c234c224de122ba669 +2621eee9b5edc20b8071453f3773c076ff8025824aaf89ad9d17024b7bbd3db3 +477635edfff2293a9d9e5d7553bf5fdf6eed19a04bca31837facd884f5fa0735 +b2f244ecc17773995d753c3ec1f81fcf46b9c7fc35b6d8c073fe3700a2924c4a +673fafc2fc4bb02ec5d7e864176d5c87c5348c3b2a8d5c583196fdf8cf6108a0 +0b0381d126076f5ff5283d05b97b0a21091be3f73860f72b69b3a4dbd19372ae +b661219c6fc715f06d226bf54805fe97a1b03a69f6818a561a3c789ee6db3af6 +8fe31b152e9c8813a880c08295cb6e6167a145b4ab25e97855f7e058d02fa8ef +0f828432b6e9436ab01c7c6a320a33d542ca5e5446d08ebd597d8dd49ed5f83a +b9803bb48daaf7bdf9a0457e4247eb2fc41a96c19e562a5513494350acec5ed4 +75d010b13951fd6c1ff7ffdacc977e1f22da9d11636bd77d80c7742bec079523 +fb7036b4c65f16330cbb06bb4441ba6d9695d57f376a7faef1c5c051b0485d08 +25cf232eb12683489e97e46c1addae9f5147ae117c5744fc975eb90821791157 +110fd856d1bd00c7f9bc1040ae0d83b1ddf572d7d958c1af16549c7c9a498007 +002bc771b5286ba7af2ae748c03e5885407d7a5b56aa55e1d86e583fbbd9b88f +3fce64f8aeb894babf7521ad50dc5608d04765ca71b0a97ea4d4f67fda9efb5f +1d67b0fba08ddb711f63e52304e098f871ec1c7e9d58b2b2e58c887122e1fab6 +d3d4b391f3253170ace505c35c4877d32c9c36506cde3ae243d1de6aa33f5e18 +fd129165278045b075c43bcf0ced8580a81d702ba464102bdd123a6c2b2310cb +c2236427fb40b0f16dbcf46c31019d5beed1e6034949377fd5f7cd57bc04479a +8b53083904c373a63a4a09c60eca4229aff9209449eb78d245ad1cbf3d831867 +7d60c285af422f15d6cab2efe202a00c5f21635ba36b4bfb92bc54557de1c092 +7a3645afb9dc24dc97030dfffb5606c8db3dc60e35bc6a0086aae19ace912bfb +c12f209036c0d43f1aa6500f94ba24a0c4db2309a26f0960fe1426f4239d4551 +fc9a87d4add8c89cf7c5e40a181396b68043e0b9321caad83cc8a2a71b51c2ca +3efe240e26ddcb4d64eb6fdcb0b59ec196361f7897a2a16b25bfc5513129bb27 +24023176e04983e273b0780533fea226cedeff949967b1b9aa9815ba9e1cccda +bdf873229770b6d02b5bc81a2cdca77d93ebc04b79595d1eff2afd3d6ced3489 +b9d273766dfae70b459d5b94b1182cd11bd4beb370c4ef4d5c551063fec1ddb9 +8761995d160323356be08008e366649a771b54b5bf40f822ba6dfe66dcaa7caa +4ea1ee4ff8fca8aed14a2966baa5d3db25d0d2cb4062a06061adbb7b2a35b2df +5dc202bafbfeccae75c27aea6c7230320412c30a993e056d6288935160ef1ed2 +c9f6cfa3119948d4b63e5708cc6923dcd520d8a45a1fbbb34567f322d7a8676b +8fc31fca3c42b5a5528b5151127a445f34f897175f317579593251a920f0b4f6 +a0d85e4aabf120ed28263706965ae8564bf9fdca5fbff9721299b212d7562335 +f12569804a23475ae1f5ca757b91ea476efb0da9baadfa85b1c33f6e4ff91e1d +1863aca97bb5b63a07e76a2e0d9d88718871f4e9ff325aa7c5fcfcf40dbeeb1b +82536677ec6ed3e57fc50270ef1067354719a1b2026927e52d0e3e69521d8e8a +a0186da08d4cbf91f7cb7701ffe8f63ad558fe50e1a19550d6f769068b96f7a4 +7bf99f865c8b6d0de4c4b3a24c9deaf648c462cdd4892a544430ac0ff0932695 +8a9df434c065161b1adfb008cc3cd949c055fb8a99c7712789321628f72a498c +646096ad2f24620366f20fa7516c2535df0d3745143b62424254dd79e2f14d07 +ac4e4f623b95dfc1e3dc8a980451f248d55cf6b0257c95f72915c53e710cc7e4 +c770c7176434d40d1e2f6ac378dee3d56599be2e75dbb80b68aa0cb1a9b05640 +2eb87374757ebcd800ee8166a7c14344d534ec43c679f19a3faf0831f6ac06c5 +418d0cc5bd0202c8fb9ea4a4bbeec84746782b34f0cdf595537108c04fb2c4f0 +f734dfc1ab7b6e448c5466e596f550709be51ea4ad3d2e1809406081f24bedc2 +afe6b2f0dc106177f0f23e50a68087b935681700a73687311c047b7a3b959e94 +f1d66a5b9d363b07946af750f7c23c88ac57abe52753eee2ca1738ced53e343c +d7147f4e518e410268717ea1d47f935e68e37f1393f4643295cf9fe6bb6a8e4f +24eb7d36e5a73e95668dd0484b43dc7fa7a2e1a4771439af53b8292d4dd9ba0f +87090fa3fc1412e99fbbd9293d622389feab98221d1d17783f4e98f438807085 +f1c5248b0d6cc84306cdd2d6b4b49859030ecca03a3bc135fd0e2e0c4dbce468 +b2fb4d3149b24460809e7a40e7733fc69ff9e1f5034bdbbcf54b02de9ba72d97 +3e02f2391c4ffaad4155684839c9a1ad84259f7e0e0870b443f6065a9e6ba2f2 +5d2b7ed4ff02b658fd881882183a92a619e23b78e368deeac7731942c86e792f +575e124aba8bc9eb8f1ff27baa023b354cb58a1b4b7bca7ace708aa264079a54 +8a7291a7aa9ce597599c436314f0ce6bd9a91f7d7d6f5fc74311e3a43bca381f +84343da850a3b97a8b8647428fb3d7675a8c747a364af6733b624c37e119408e +2b8dbcd0ebf1128d3d622fb12811f6fa86734714fdacd66f22fbbed86e0eef19 +8165412707a465ab93c043d6ace1453d51a027eea5aee64dc20e6b1677bf0c51 +6d988d4c2dea53fd3220ae68b7ba8ec9b4a9e12740610db32c86ff6f9dbbc4be +c895877b4a50136972e64c5cec736350fcc746b9a35d227e861a84ea1b7a991d +df9923afa67b38558210e59584be3bc822be7b00f0b676d52860aff3fca1c731 +29ba85e325b7c525bedf73fd53f8cca733dc99afb00c7d35203ec104ab6ef99a +303c5320a7ae6961e7ad96e49801de1aadfb9a49a4e4938ec5c9866a2a073255 +3a0ca67cd73514e1925cc131a6201522d44caacaed554b6dce99a30ca2fcfbb8 +00b9b263fa2680d678a94aa745d1628c8722384af1a6ffa490b18e3d34d21ddd +6fb6a7d01123c8071d7325e30c1d0d29c069f00c2b3e6c2c337e4c19c151c5c9 +780d3e2b9fb69473e31406af3d3894edf3d56b15719b27bfbd18bf14e245b809 +f29ecae8d0d23194e99d15e3b3cfe3c6dadfffbf9f33c139f814ba96aaafab3d +7de097d6ec31f1bae09529750e5a124b1df043b0fcb630631fdcee4fc7238b1e +08a3a34498bf112ef7a8c543720cbaa77200a40b1cf72b5a6a05d66a0ed37d68 +22533e12b1393da9c1edaad4f2299558c82506af548eaf465c76ed43926797c0 +8c127e349a26c21006cde478eaffe17c59d981f045ae488880e427626ef9c073 +d5c9145af6f127bc9f127f0a859836c56b9f40b6ecc446e137e9d9fff367226e +73ca9add9ea28abad05f87cac5643bc07e91b82e0b35b36626444dfc50a6dafc +c37d6306d441ade0b998c7c98dc259e40d974a22d8900263f9421d506386ac95 +c1c00fef532fe5641f4cacd814ceb9cffceb23a219841e9e1b6c465ac9fcf270 +5408cd925a37ee97c64894e02c73d0df87b382622c074734a1e2370aa4a2642c +1fd382156fd054f3a5e2f66a623e396cf56f44273eccb27b5d11170338d4cf27 +3f61f8effe3e52b90bd1c49dc15e8416f3f1f839b2a5d900ec8a33b3bd8c3ead +6f51f1d68dd4e4202021adb52ce62191f848273c485a5f88dc1c09952bd38ad9 +4d0d9c08cac17187e36c4bef849ea1b5eae2c15ba8a299e9fb3e8d7353fbafa3 +0d7af0f616bd16a11d8e98b7c5f39155b2c8bc3a360c89961ab212a8520db33f +763c7caead9ed5815351fcc2026a35646336a498ff3bfc6a074e90f0395ff802 +48c1a6b403c1e57eca7068453f149eb8c5a6c1bd980a0215d90b9825372d8d3b +3fe32871eb3b517ed6e20e30477c0433de4d2cec73f7d7773210a10c4932e909 +eff2f2f83896892eb69f7d27014b55aca65dcc5e8bc62046fcb80a2a24a52165 +77e8ae37ef099a4dab23cd5979017ad30872aa6e94b2bf4e4d7f495f2eceb4f0 +b6d258f94077d191f62dd3f96f94ab43f4ec19a0c1182c13a8ba469601ff148a +57e007c07b6d305e3bacb2bc0a6708a1b17bef4ea41982a321240ef969390985 +d83828feea903855db4ed66f678dc7c5d6ab49070c4079106163e37cd1144057 +c781dfd270ee40e3c13b5d74f52324f85c84e55f750298ad9f145759c26b4528 +8e707897bbb2aed1037f30d37109a784174cfd5b0aa698c1e79f25d09c603628 +e23a3abc8d6ee13777f7f5f9e27cf34b97598d3d5bfa96d2499e91e2fa7c505e +3227f8217212bec21eb2f31622a28d292429ab899aaa92ea40a4ca1033217f4a +ef6666c16305389f149449a44a0adec2899fe892fba9d88b635668becd219657 +02d4b8792bdf922e4342dd5d6d27dd7392a427f153ff35552140a01d7dbb14b7 +57da81569ced971af93e59ec7a6927843ece2a555a58532c4a5c0c5aa2d27405 +72cab4d7f7b59b45fba1c9f61115ee87574e374554d2ea0c7bc7ef0a07843e37 +cfc76c2baf0bbc7d58a95b70f7ad9d2c2c1cbacc6f5190e4392fc5598792e623 +4f89f3b28442b8d37e3cc2c612b29f960005e68198ccdc8805d2887d9e9fab27 +70299a4eae741dca4c983967bb2275ab152a58299a35457759619c6dc3b25eab +68fa0ed545b09833bc269e15456c018ed4494d2c8529f176a03b340fb3d39c45 +726f023eaf1cbb5a0c776e2a65b77db5a17e47f75c0debec46166e3ad2804efc +2e41259900f9cbf3dde0d6b1ee4f16964e1f3df0c332021504140bb87e68694d +f8046216bc50fb9d7c68a5870ca8ef17d8d543dcc872a32d6421c5b30d561efb +e55607c7e21669fb949aee071954491d5ed28c97304eedb5941fc51aec6b7d4c +fb4efd4d49610ca7779e0c384e3435e4e9ad4346616667794b925d638355d76e +a0130cc84045ef68a6f45a9839d642faec80a9b817474fa8ecf3176570bcb441 +e9b7450ea2d3f2d5586db80b4218d41c3f256ab8d7bed7e59458b91872f91ceb +fcfad2965a08a73861fa7388dd75cac1924c202b26387b6129e5ba5830b9e88a +497c7e94c61c286ae8f4d596fee7c17ba5635b829029ff837c7d4c084df29bd1 +b318d69d487a679988ebc1751d7c944b83b6b44824cf91246fc75de3d8a2b092 +d1946b845f3f5ebb0b9b043215188cfe3a4f34fb4fd0d6dd89af38c49d8309f1 +b95e43c6e5a48a4684dd826e526d8bfd8318447b57aa8c210753b55039c057a4 +4a35faf9efa90f25e9c5336ac001e71374dd7e45588759e4c0a2689d82870948 +68f456a56dac56b2f0f60a1b7bd307ef18d7d86a3d0fb8e4599524341d8c57cc +3f20e4840cf87c11929718d250faeb37a28a5c230e9aac9abd7f0339d4128c54 +eb3cc09e4ec9eda06a4687cdf21d1f117e63aba8fe5079e879eb3d1309d24761 +32dd8f3ed3ec6a3ecefbbd5eddeab99521bd87f39f20b19ed0cbee4fbadb108a +8a25aef0f277ec0c2d49f30afed6975967c513a0772d8a1176d3a4e0a7768321 +2c85b1cd14ac7825d029b02cdecca22e891f3579ff5ef8304e74cf3dccdcb3a7 +254134118665dfbdff5427c0471b7d7c2b64118d995734a9cb4495bd347cac39 +8805fe76a5973959645a471df1bf99cd333f8a68815706fc4e365de7b496160a +4aba0c061e8509a1b39fd0f2582f813d21daa11c35a5350036dd993e83ef6c41 +dd17d079fcdc56e9bc4b1c0afd6eb855c7d347612938431ae72bceb78aab6efa +5ccb731cc337171d3e591140e9ec3436bb12ff9b39ee8631de4a6934bce1a4db +b61aae9a226e38b0db3afd189165d90812e6a8e74490e080d2d79eb010b96bc1 +548062cf654b1b627b7a8faec8f496cb6898635e123651996d2cb52afd58c014 +ab44719499d2eccbb5378666d6a0b14f8c336226b55f8e4fe55c975c84eda8b3 +cb66b0e4372f23966d4a1ec8e7e2333acd6f7a18423ab867dd5572e30ee1028c +8a172ab879715601ccc59e4431f3a1923fa3c5f79e1ef8ba28b54ff006bc380c +db98623bbf0604a247e87888a62fb03473a98e06c9879f158484d243b72b4d3e +04573192531beffc3202c5740209da69deeefa077d9497e9c5d2309b941d8397 +2d9f88eab63fe121bd4658a3bc09677772f7f63d27ee5374adf60c1cb4f37a43 +355567a8649aa36d60bb14b0ed70932de29a7ec4910b836fcf8662adf5d80f49 +362ed0e804b459be1c5315d4070b61bb6d1296a5a8b2516b11dcb8dfd0bbb426 +c5897ae6a20b531f8f251cc12bb52ae6406ddf28d77784229ce474b8b72b4329 +97073759a48cc211b122ac6e29e089d75b81a983c4c9aee019e5cf78a4c77bca +b335eebd138ba85807b57bbd7321283d1cc1793721189de7062dcae2c3533402 +06426a9edf0844911997187917ba23fe1d0718acd5c4d4ad8c2819de24db6ef2 +b2cb9701789ded9938eb436641d998078216ebdb97c418428e99b6abdef04853 +bc270a8bd461065d26efea3434e7d3b52eccd21e07f526881b3ea123e3c2329a +056ed88fb4089b69abb3746877771817f2fe9bb6728a7eb3fd2e64761463ac3d +669ad3d8928451303c7d645910521533282982bca604677f2bb2988b10f7b848 +2114cf7557798ce13952dea8adc2c68397f100a0ce55f5b790c6b8ead46fe7e3 +6e958c634bf76423a7a87c9448e0824f142d0a64ba8215e8cbc0da34e79d8589 +cc9baa0f29410ca4162c027383eb8260a8705f7f1c2c7676aeec54c4e0c42b08 +5b66dda1c9f7984877dc5219fa062d884266438b49c4a9aa6a1c469440c75a4b +ae1f5362b78a3c9f74181f0f28b0354af3c84affd618a156a3aad277065fc6cb +ffcae5406758d4add98169fe89d3e21f9d39e00d018da20350599a441b786cfe +74a43b7bc4659b5904b02ea88638622bb0096ac3b47af0476594fd3ca6753f65 +357d504941120a2aa326d006e5a69c6b806d3a0e928b926e253dc81ae13b1dfe +f4ddc4709ff15ecd4bd41b88d8ac189096ed4c56465d3dc7b76ad19f222f7397 +52426640589f5c13136131d42b814a8c40d6597572e6766dced40ecc45059318 +5cce8f0121abe54423c3b28e103a8660df4fbb1b95aa2ef9a9cb0a1253c49a94 +f32be151957c11ab2c0d522f57b245edb047eafed062c59ed0a6b82687caa7c9 +9b203a1c30ec063b4905ae31f0118f800c6c3f7759cdb6b3f043af3243b8ba8c +cc383e27aaba6334a74868e3f85d9a4fed0550257ef85cdbe8ecb69e7a5d7dc9 +3bfc2ccfc997e74ca7714fd25ddffb54650d15417471c95360ce43693abeeb42 +5804a13f77d03cc1b53084ffdab17f068e4f0c506cf6343b928251165853f6c7 +d337f6c3bd8aa64c57156ccc69050130f1206cbaff5f2202b8a17630d41b7b62 +0c4c276f8c6e76a9228b1756aaa31b87598b29d2bc5a268b45ee3720261cab35 +e5997e262ccbd3c464aa67d0074f1c4b04c786ee08c05d643e01acf498be936c +d83bf1800d6f30a4b5d7a08c15fb036d4e053e436c9260891534cbc3c8eda536 +2cdeccbc03a423e0f2e508ab719f6bf7c274d8ee7740b79b13a505102acdd25c +50637a1c6b75840b12e6dc77e1befb1b6e4f3877cf2e1c2ddc399e0098093d39 +c8951f6e32c75fd6ca02d74451fdf614a55007b0bd7b920aab1cbf2de7eb072a +4d57fd5734e35cbbf8b5693fa3a09e5842d938b609110d33b63dfa6c31bfb1d0 +7696ee850223891791a68294433e6b9d733eef2683785694539e5c9d34d5963e +22672ae0f47061e450c62df0596aa5742d7d720906e6d8b6002ba1b01a8f0732 +5aa66cb81ec1a2009f72790ffbbf58a0d6838a934c41aa1e9d34edb183e4715d +e1025b0a03a2b4d3083d5dc24bf1656751ff0d50ed96d3d03ba155a1de7ba075 +cb09c98ac1f7d7565fa3b826d89c02b966b978fd33ca5a42cb96345f356ee8dd +d392b5a04cc3333002d469e6e1efde17df13d5d2037545694b428a6a3706e769 +6d31cd8cf72cf7245865818fb45979507b876a83aa961312a92bfd0fea3f0037 +a3025364dba8603907e6f3641a4823a1bbc556638b27133a0071790fb8fcbd0e +abcb83a258007bd8e2fa723b72fc36ede7e4745e67f5ecd38db6278901e4559a +efb6761215e98f2dec27a53eb6a5090030c74c57d1d1b1a29f0a578ce26e4682 +bdd7854c35cf5690514eac890d2dddabf2b6aa6b66304abc6b9f012d4c70bfb3 +a3ba42cb4bdd4f3550172055a44dda0cec627935ad8d96aa1048ca98256417a8 +c56462c7ac76f1f7977d51a5a65c2ad9bc3115a0728235fcb438f18cf370e880 +684c90971014482b2ca100d46d3a3de6a16b75c1d8e9c4949985b753c4256ef2 +49aaa058a2d4795774325e21f92fd0350dd2ff1a3ea9f8f0e9142a4757b7e926 +8c8ada143c295cb86a21afdb5260b4afb8e3bb4a0902b9d4fe09e3b0a187f7d4 +bd129264d0f121a3e0ca622bee85bfef35a039f29ff88131ebd4ac4ee473773d +b5c0a258efc4a51dc8582089314ded2ae3d39c42f5a733585c5b32343e23681a +2c5207e7b8c1477e09a3f131ae893172b7d2ff21d7bd5e67e1fdce06450b5406 +0b163a8c31674c8d6749d270a15117df4a221fe98463eaddadb4c8c8c8638439 +bc34c47fae4ca32e13579ce1fd6d5448bf23fa791905adab3e42aeed0b5bb6c1 +1f541b58bc1355288c4557b690ab27616f462fea63bd490e1c481338e9d7d68f +daf78b3fed65606463aea70d124b4757f47db307487a0360d2a422dd6aeee042 +27a9f57f734e233a4153fb652c06ee776a4c64991cf2d3e69c90ec4e797273a3 +d1339ddbed5e2810f5b54aa0b611ca5f1565c3cea89bfdd721151f01d625f07d +0c551db5db902aa5fb2027c8e5513f2000bb5d5e33bd99132536d3e65fb52c4c +424688691e4801e9d00f29a61dd7493228a9a3c137bb298257714ef0ee4f9f16 +87f0fafa42a93bf619817a73f292ff65941ac480bb3f9e4a5612a98e24a5373c +30b5e0a5b5d4b55221199eb4f5a6f70b7330a182c3c195229155f9d3ed4d7fd2 +f08cef3911f7ab70cf3d7d4b7dc302623b383a236f3f7c985ab4828709ba1d4c +c2a0e4daca3ece4c41e53a853c98e7e840c59614a88fe1227be49c38154f024d +83c4f0339c7f1afdee7b6d58c003359d1bc4f460468448222c26258d81b1844d +40283e5db7bb6baa955d9effbbe88f9981bd204a79da80206033a5d3c0c1b8f5 +00ec8a79f2472396493eae9ebeafd1662b941db3c23e3e820c7e8f85988a2a53 +7d955f18d7869632f498be0d6f5a81fe7e6727d8e6d0fc88cafa99839629c1cf +b7ac3cf2b21c43da3f07a3cc1798909400e840f4f48bcd3e76be4f94d9f38ee7 +f480e76021b36b9306c16a51ec9bba0c6f9b98248f17d49dddfde34226e33622 +c94655b5afa1c372d4463bc68155803096a36b6cffb7cf261100a46c0ce8bae0 +9fd42e392888bc3431bc9212de09437d3b7ff15fff9320fe11b2a16adf4f8350 +564725a52e4183b11b06166e8ca561d4913fa14603baff5169b44ab1f9085d2f +0111e4c3b9f6f72f92b61a915f4b6aff97b5163c5e131f1e0083a00f45e5eb57 +3b5de28f5e51e6484af6eece850985170fae9a91040fd860faf7b6be1fa851f8 +2740f3f32906c221796fef28187ada916dfebc65e327533b83a9a63d164d8b2e +6a6d834bb6390399d564c91c1b998ec5f992d280ba2538098b91cbfb09379f9d +c35deb26723693e7ce021f80792262a4d2f6e0f9a4df9f5286705c04f982ec57 +f10d2ac027d949cc4b62304d987640a6bda12acc60644983811ae225a0869ee5 +d5d92ec5ca8571b372033c63c402b0c671c63c3677d129837e6e75528351562e +bc2f6fba03df82eb600e57094c370d1dc844143b30b7d5dd0f7e20b4dabf379c +6a2e401a6023773c8b85ee50e1949476341338f3477113e8deea7096b8255aa4 +1fc4bb718842713425c6385227e6fb1ccf1f3fe89cd7f7f153a8132be0fcf7ff +5e30259022e09ab8a3932cc33d1cb4f6d3e299adf4c15ed0be59df30c1d5ed5b +471ac14fc7b10192ce7d55a412628142ba12ff9b39dff0cc18176e9693ecfcf4 +452838dd87cc9059f1aff608182b12d37ad5c13ad77ada2114f1cae0951a4d58 +725b18973e4c5c3ce7d4454aab91090409fee42d3ccf5d09cd768712e2a73b6a +4c134b390e0209773af69e875de4f7903b65f8ac253eefa28de825e83ff35b5e +7357ae7de5445bc6e2022b3d4c161f3697b2ee9650552271020b06f802f5a418 +d20dd1def4368956c713a197321b545625093fab4cb41413f88b6ed006c8fd54 +296ec46e4834ced1987ce6739f21631e0b79de38542248c7afb9e08a9e8f68fd +243f7cfb11767e9e4647972dbead5ec136764ad4120e1431b38e2566c0c0bb81 +6117d1d5b188935ba2924653feb532cc4f900f7e81e2e6278a753fcd50fd04c7 +3b0edd77747e070c2bd18ceeea2eae31dbaa343678b28b05b037c7b6e604d048 +394b1e694d23096040a5e709eca5a8755a2f15df09c607843d8abdca62b82e42 +5d0dcfe5bec63ffabe011e9aae3322228a26b0358d7c6a740cf91c526d847b84 +87c084b7f813f6870a27535b9f727253a9c41f502ddefdc210d7367371a8a1ca +6dd58d8a7234bd5457772728fccb21f82b1b5d1d8c538661c92fdab651e02e56 +766e16d58fb6ec299dd0fab458a79ec777eefe57ef9919b5f966c7de075c87b0 +f624e4900d476b49ff754e3029607cac879c150f12b548cd78aa6a6fcf0dabee +40412bc17072ea2e951b2268eb3777a619a250fa18c1f25a0db6f5b8895565d1 +5ca1a6f296c7a95aea09063c817468ad8c76694f2025db959a3f476c0235f3cd +2dc07f725c862e3cc9ecad251596061eeb04156fe89cf21589f6e11082bf3c5b +8d61dfbdbe592a120402983939b99c7d38b4cd32429237421594e21a21841a6a +e3756576fc0b063ea6a439f193e4f1dd48edb446da9ae6dbc55f0983f0a5445b +1223abb431e6bb1683c0d07d33e42ff9c37b2d16a0fbc52ea27f53937ebb52f5 +bc7493f84915b1e4b8f5c05441cd09f43e0e5418cc9d82f31ad35a5a69f32289 +df6f52bca5f1fc74b2625a42185cbf40350779c94b75a4b9f551f30439acd9d8 +3f9b79c46694b87fa60ea3af78ab05a65df0fbd2491d8a33710137a2e7fa7559 +39941651fe072f868f92b80792a40673a91776b083156f36bec4a3120d0ddb82 +9296dcb0f5d70028c9838788b84b6d9a84a12dd167eb1afafede886c6e9e9d21 +4ef74aef4a070cc6ca07a88629d15241be5d62e4975b55c734cdbdf872471c4c +9bc047036203d37cff7a98848b58e6ebc04412dabba494d4bf25ad9e4b4ef4b4 +ee155539af0c4b9aa1b8b8195375f6d5444a7ba34c0586405946b2492652ddd3 +d3e034add236bfa5a8612e8d453736ecef2fca9d8cada78698cbe62f7a7d9611 +f4bf3e04813a874d0e5bab4de5e3c72a98f38457dfbc0852557f6fb9e376e7c7 +1d3a0c9492e439cfecfdac766b7b5c3b59c29b3239726e2d6f672352a15d2aa4 +14d150814d18468a2558a8b86d2642c2b83db6b296b5a943ef70eaf987be7ee7 +de41f5cd1b1280aaf49289de4f4865f6c1a3a303e77b80a9263b142cf080ab87 +8fb6ebcb18a9701ea271a21b287bb8436d780dbcb0f20cb1bf949f080680a92b +ea81f980230b41311c8f30e9e25f325c92c2fd4006211444a31f80c86919f8f0 +890e6c1ca1ff51741d0634ce4818c9c2f0c553e5e8a17ffa5b834fa7672fe319 +75c0731a3f73a51585f5815419d05a7b10a7e24abdfae5078f7f8f5b34581bac +224f8d63b4283dbc34a2a1573b5f69eeb158c93e844403f3bd4e7a3b3a4e1e8a +ac0878ec2eb7c1b7e1c9e6780233608d46b7c801c6c0c83eb67b5d080f4af67a +7b0ce2d1a392ece3e3a0b71f7f37ee8c333ac76bf8ccadbbe158caa15c6a2429 +9b350ae180c2ce885d870be5d8378fbc05643de7c8da7171ec14c923c59fa500 +4d4fca2d8f85e7ba1aa642c8a214ff8bce3b9f62ef6a4a88c8129bebdcbfe426 +808e6d59b712b2aa3d7edee5e45bfa7aec02429796717995785614d69721ed40 +c9c5a56c5b10e5fb4d5e30d02371ee0b7c7b67d8c7a9fe60b2b9cc7ff4efac5f +523fd88267950ec3d0640347966f43bd326def79b20ddf0421551168a43c8791 +627a6ee25d3d8a1200c504226211219c690f3e708465da2317bc25baa1e9efd7 +78c9daef857ecbec0449bc16dad92f9f054d68cb91de65caac086e95605ef628 +702bcb7e8dfe538d683263bef330c0d900bbf6f62fdaf663d6d1346274006ba0 +e321644c01e752faa7793efbeede43a7b83173f7f167f3d6fe970acb6646917f +d36bb285e6d96ff1fcfc668ae4d185d868c898f3964fda9f0463eb6f83d2cec9 +ed861f5027330eefe13163560908a7129990799e21a1e83e814c7df4dfe15365 +ff29765bd346019d69809f425c453ce0a3948fdf3565b83332e47cd65c73467f +efb2bf3791994d3172dcff4f82a8d7ae4f9fd53664d180d930dd20aa1001a935 +e61e9410667536058ec3fd7b97aabd163f8de60a45794196df0cee18e8c56276 +25217e4002862b3241a017e7b497ba015662ed624d48749b783f69b204792a35 +1212fcf465faa1d4d5905a68f5f17e25ea35b3bb33498162e88f3b0e44d0b2e5 +756156eaf47340a82db8a28fce1e0b26e104295e94ac9aa330a5292167d153dd +cdc91e47e273eeff554fd652213148655557763b3aef2797df0ab81b202d53ec +76f5f57865cd1835f7f94515efd2335b966b9e81c76335a29414e4372bc6f186 +7140b735589bac9c6a9203b83919f44ee6c51e805a5bed6d7ffb66c44ccfe988 +59c87bc52021a819b52b850573c5fff13bf7cb9c11f23387d486eee0afca0052 +334f4858f1643f6163936a27c472b8dafcd6e14d3bf3f91eecd70bb7856ef444 +9cc49c7b9788c6c095e968b2c59923dde8ed1628c62eebcd5f32681ced0dccd0 +8e1e61a074c1a78d340c3d873c1eddc97df7051e3d3feb313e054934d4f8696e +8d617c28f03d817a40572e3630f050091c8738fd3e40c231abe958a9f5868b3a +3c9120fcfd2dbc319a91289cba50898b43a409cbb612c040d2f33d43ad9d759a +4cce86ef8dd46945e33caf837a0a7ecfb6b5900204662c56c9cc1b943427074e +a3a81765d85dbe3ad77bf5c1162900b5f1ef594285ce655ca2a15ca431afcbc4 +6007c144597fbe8ca9638756b3ce61ffa44d524266d2d4c6d6b7a7273625c55d +56c00242b0ff2a150297e504b9fef2b0b478531e1cc7e1c14ab647dac9feb0c5 +b7b3b20dbfc4285db7745ebb9a3039b230282cdf2a19c1afc822775f3a8026d7 +d793498b915d792bbda081d45f89d9af12967de9e4f4e3779650d7c2dc3cf1dc +d91b8debee82d3d4fbcca89dd4e129a73968660b457da664d1cec437e17680bb +7094ab35e4f77fdcf34b40b84b76f8b7750346b1e2f133686110e9f1de217d4f +8eb81f8d1be2e871ce57632c635189116b9a0a7deaf78d9d6d85178a4f1edef5 +e30c05971c0d6746dd2e1104281b6148217916a8fcb3944217a35b1a98390849 +68cebde7f17a14ccb58bfc1b5440b5d8c75ada3f1a581db2cf6bba553cc32e52 +0b3c5f0a9f7cc12e549f3c65798f74123c5556c9e0173254c1eeb1e094e0d8ef +35ea280b388b3d393dc9b84e6400abf8493017c5de85bc0c23ac61919a053262 +9a05cf198df82d4f2fb5d6b837fa75bab14bc34c1b46b9ddc4deb67ef4444152 +c280be46a9f0aeb0fdd5e90e8bfa5449bae9315ab5184a01d4753af4286ceb79 +09dbef7f742f7a488c93ed0024ee725686ba71296a18e04aa758742844d37648 +5541087952778948eff1a7521fe37a8ab311c7a7e818841c1d39751430a7b656 +0453c931b40d6d15915b79a73bd0d06893c0cfa0517e76cd9bd87673f7e7fdc0 +317e639f78ba7baaa5f1b43bb52788807b2461e95cd8193414724d954ea066e4 +63f578d9ac9a67822057b4e61241b8b5c8f3ce019c767ea2b84fec80ee642ab5 +9af04e1490b930da33cee816e91a7ec3756343129efc90f36468b8286566fdd7 +3f94d19bbe2076959797ddd83a7b901741578486b79d8102942f71f70c72b2f7 +359de20293952d3fd821f6a164487ac420dbf4374463889ca97198ade2827ad7 +d08bcc071bf2e455b4703891e0ddd950b5f2a11ab246cd2e4bd5401721b8e9b1 +702b439fdc8f1ba1a4ed9ef30a18eb514ec61d3fee9e20822a84c3ea225e5652 +65eeb21129e3e950d1143cfb759f8ac5e097a42fbd4807034c2b375598b6c439 +a2e90d007a1995738c61217224cbb54be3ad5aab1fc60d9f9414146b0cacc853 +4a57c5aa095ac953a6c4f5c16f001cf51c9586a3e67e2abbbd304e5abd9fe25f +ad3d2ad2c8b193113bdca6d5cbe2ce54fbc7f7f8feccff8eb98fb09dd1e2b7ae +b2db85d4a4aa399585edfcd485ca6bbde307e546e39856f24d3ce215a5ca1bc1 +b6aba3df0bce9bfb7ada72b6a9e1d73ffeb9dcdbbbb0861651ff71373d040f9a +43bb1797bd93db1948fb3a28cb446a04f52c3c8ff33ab4a9d87708e0bb86efc2 +db4e9459f7213ad59a61d9d7790d346d7036d36a8aa2599241d59b8130b8a37b +0242a2b59220eae2c2b7a1b169b1729da75fb682f0d612c007372135fab5afb2 +a6c05076f0f08c198a8178e84b9943ec3c8321e0d5ffdb4e07004e2d17a8fe28 +632cb2949c1fe77b543318c7b107212b363f9ac881c7b868255952cf50cb9504 +9dfdb8d429d7a0f3337db9da3e48be60d69999be3df1093303c88f2bfc2982e5 +5e8b7004b75d5658f681fe30bfb471863a318d7d0fb496ceec4429bf71d9f07f +32c5af99df3e6fa0095b096a3ac03c9b8009471cae3cdbf81cb21baaca707ba3 +f0bd970b52a4844cfc81cd66da5930686163303bb503cf72f7bbbb6f47b14785 +f6c40dc6518227a76bdfc5f7788fbb79978b6de3cf37e0e4f8b284bf249fd602 +d5ef47d169eb36137bddb00ba693ab9974d37347e9f8f0eb9f06f87d515cbf4d +003396ecfcf3305e83ea35edd75e05b2b363111f45fbc056cd13d1cee1e96797 +adab632023d85dbbc2fa22e057c031a84f69448fac91d804e40e3d8861b30469 +2fd221c7d77e7742ff66aa06be2e20150f6ba142e6c2ce640291d2374b849eac +f6b4b970ec408a84c72aa94de175618cb50e0f0813b179066d3e41e644fcc92f +97558fd8523d73986daa8e1a598b5a151fa10ba8b0795d9dd932948ceb56fa1a +3b6a96166bdfb663301bdb0a3d559a7e398c117e425e9c9b809995e757c4423e +ee52c0271a7ed1fdeba6ff0c18fc199b3d73b8441d7d64b4bcd2231375412415 +85e7c8ce647a5b45e0f1378d7948ec1b69d676ead40dd592947249b4fbf8b75c +36631914cb78d3bc5cf506520d6f9c1cb2e9aaf47a213b804496242a77e7b160 +1be264e885bb92abbd28ca502653a98b811c244cd92de8d9b95a46457f7e0390 +0ac1f0f5f458f5052d069d7320cd09e76aebfae3b0a6676e4de1742acf1e2fa2 +d5369d5670e30c7bb46abc78f1bb601f1b652ddd740261811cda6d6215be2a58 +cf2c798f9a47abf9b59fc32046e927c413de487117ab003c4da86f1ef4a2a92c +5d1ba48d463b11fc9a455a56010bac81b71212e818f15b498882338b83053bfc +f2126947a623eec40ec7348718f95aca261e8de0f35b8cbd5f9412659725a2c4 +9f29bc32e865636e1ef039b0efc8443db058159aaf304477fe7c2dabfc81b3d4 +35499d35a59eb97061292996fa65c5a1c1b4762d31046dfe2dd4a33e3f8e390c +922447ce8ff34f911e68000e98d0a94e9c84ea366eca151a3b9ba00d021367f2 +03bc330c1ce0f955231ba61a54c655d8dd7b271a0eedd56a844bc77181f724d2 +42e49d31778f9fdeaf240c096ee364c1e9945fec04d9b2b3cd256c70390f8f00 +aa80d6608d747053bfb92005c8b204abfd262dc7f7d015f4b966d7831e4a506e +87cdc738974049daee1e1c945fa916b7d8a04885c7be53d7191ed6839fb61409 +9a9798c718a6e2d96c362b5ae30d79c432279ef0b7c8e1a53e7e7e7be0074459 +f4941bc1b6f3efb8a8a3df0f0c2fbbfadfc1f48fed0a1c9aad6a08a50bd7582b +cee2ddb5be2a5ce078cc8e8beb8119bd78e320d6890bc7dcb10aeb7b5562b9ee +7e3c2d1a6b38fbf551cc5a3b60054d4718fbb6c396753ec4c76f99b5ac70d9e8 +29d607bebc0fbfeb7d33e6c876f0f1ae24e25393d501aa2a5b18a393975da2f1 +0e048f2043c45126643b6827d80f45c649f44580845f0e8e8e1a04e743364248 +cbc3891cb409f801a153bb47c4672976c62caf5d87c2bf547d3ba11abdbda794 +6ac66599f6819bfcc0f6ee2bd9d94562322edb6b87a3767f30d82bad0e023b88 +602eed6dcd0b9e387e586aeefdc3a2ccdb482604f556ef16193355c437e382b5 +0b87aa275f70bafdd7d5fdab98635e4110030e18f7ddf58c3978c7967df99427 +592988661029f55423765dcea061f1ae72f3aeaae59400cf30f6104614e62825 +9ba0d0151dcb3f28aa6ff41f16ac640b01ba51627f923386c33013bdae4aea54 +eaeeeeef8da3109e8866aa8aab18217a1a1f890d10df396a74bd0e1057a2dedd +7986109646d103f44f1581821446c1f8cf0b3bb5ef8bf04b27938a6ebfcd5001 +c67de72985041253e4df6d5ab6048002bf1d16753cee57e3fd8414e43c2ff7f2 +b46e54c389c058073f7affacc5140294666f06e2ad2eae8a41add24dff1a32d7 +3c94032b739009b75cf1b8771764f48d1c57033e9ee582144e4af8255ee0d7b3 +ea36a8208a72147db694e21b144c29f0d07e4af8c01fda6c109ca8612a1a6fad +3d2308b8b6b064f2dab4203724b76c0ad3df3f6e03eb5ec4f42739173e2bd19f +8cd09a5b79a6b1d6851af6e5c47545e4273d0be5f0147d68c3af68f59bbbd05a +b913d069a61831cfaf101c2f2174aa0f1c3daa7a73074611624db7ebf1f5643e +2c5bb1da08b0e1418733d28d0da8f543e438076eea37da310b2f4e049d7d3a64 +2db23c12150dddd516ad182b31e7549fb791e28cb54b37655d95b3c23c879ed0 +c6956040b8c5bc89cbb2a8473df767ca889a2e1240b735313254e9294dc91e31 +b3ed5faa6f7b4267f70524bf8e81c0aebdd63dc94ffa5742b20acc20ec097eec +40f28ea5744a3ee3910dcaae093b74e694dce05ac03ed910eccb4133fba37d0e +99953a6a3e290725d5ee4c10d03bd7f254ba2a4d1bf25e6b98de5c940f6f5303 +2cb0d0f029f0985b418b1f07af698bbc601329f9fe9978e5038e749f5872f2eb +5572d9225f688d3e9c228f8c793e227bd5a9a28d0d5ce6cae9bb7a8372ff7519 +e40e2bab027992d8ba49458b42abc954fbfce21141a270468b9fdee484a7ebff +64cf291404eca8486b14d0a5614604d5b80f8eef6eca462f6e672d72908cc3f8 +57550b516fab7e03c4d74245f2fe2c35df1535196170e9653be1b5cdb555cb60 +2d46549c63987b12a4cb569223c13d255ecb9300ba7a38686eab1c0b4484671c +3523cab620c1d5670d4bc9e59d23bf85e9bb2f57764031e1840437832ed96e79 +4ecb47cb9b8c8f45a922179f111895947ebcd3fe38d2e54eed036ec309f28af4 +1d9964639cab6eeadd23691b8da7affa00b364817cbb5a2f1100bf653ae568e4 +6cee6fd265e715618c4270e482e5162d85cc1125c7f7218aaf555f518373057b +75e49bd4a6f0903e0c3345337e00a2c6e1ec2d30162aa033016253af30b9ddd8 +c16dbb6e053ff3ce4c5b052f3f00daccf580a0ab2244670597e8dbfd66f3f088 +a51db45be935a2f8042e2dff5424e3804cd135f96cc59da82cfcb7216e7f719b +a361f655f268616942e7b79bba5d73683ad747440c75e9d07569d8aa38824a46 +b20d8b3bb3e86297d45632d310abb735d92e2ecd158cefcb4a98c93bb3f13c0a +36af62f165ea7f5eede9cc125600127618e35d12f3bf700e58cae49b05e22c79 +e591171df2f348d5455eb23b1513521bdbb0eb06d5bcb69b982190e63e28eb39 +7da07c06e388ea6229223ee4f14a9c384dfdc2ba0d8f9ff3c5fe852d0d662628 +d103f681fa2b56421d40944ad0d0e750c84b8e6ff963f5f37b2e3116082662bc +59e3614531463a63ca3caa4af5fa82add2ba8ec478c04cec24104b3e608d0fb4 +611bc75b97c00d1729e8650a636a36861e8f7e6429c8ca0d2f566e73611a114a +8b8e9f96300bcafde0cf2324243e77fff438811aa9882989a8bd09c385609a4d +dcb6209312d4529ad9bc0969a05b91e42492cba53b5249a102662e6edac95704 +271d5502666bc5255d35aa2f20e77729e8ab3987b82521bebd459fee449f240c +6b1d52790b5ea81f4a4cdadb65d89bff4399fce28a200917fffef754fe24b734 +13186717c09a7579cc44b7946d1838026896e2ccc45f41f5b1354f3de87292be +7e6a7e66626b69c59cb697684023f79f832fee404e3a83bed6aa7376239c326d +4c30ce5b557e8670fe2ca161d3d28515a89e9d378c6f2b479a93be0584a26d3e +c35e7a54c2f25589da8f4c0577e177da9564d0a704e1559046299345d7c9f68c +3ecd1a372bace2ac0321805c103ac438985078a4766b0daf8590e683db158636 +ce4b7c3ea542584d1df38d2d8f0cdb679bd0b5c82423d902ef6f1fcfd746324b +50128d13ee0f5ac9957188c08b0eb413328ca4f8080d7beaab16cc3aacd51a8f +03839492b671138f3960de304ffb63286fe91486319e92ad8493045516b4636a +8e178794903a2252eef2e90806740071b9817742f87e074af21c498fa3f21dbb +e1b8e3c8146d7973d10dbb2708d5024eba4f333669bccc0a29312420c0dc7138 +463b986f41d8c25950d7ef64a99ffe90f6a3520939de3d0e516a4dc7be23bea4 +74f3fd1c2f2ad8d7ce4c327ffa20710e2bf6c5f815693a5b4025605314f715a3 +9ef8f5a86b7f260c8a6c345840443bc02d700d46bff7ce8667032a952d4063e7 +0dda03de1244830f0ccaadc7062abc6ff41ddc4ed9ca12488904ebed85608c97 +5d0e302df6ebd6c22a5e213d21019ca37446a679eac1bbe0de6317005f955de8 +6b2a301f0c903915981e74f2ef18c4671bec9f12c2595d7f51788d54009c46ea +e3e1af39badc71cef60d590ca95e47a8f1c53274a7e02c50e21c8bea2001dbf8 +5d787235e5f31bac2d4d489136d9491c83001256948fdcd34eb2da295a775fae +9e9fccbd0830a99cdc497bdb8cf2adc6bdbb7ff8c150f306e5875378457e79c0 +1a01ff998cc41965862136b37e22ef4d3aa1234bb3419bdc71a43d45f10f879b +925fe4aa3b48c736f989898c68d3fefcee68ce151a55590d4b1a5312a2558be5 +6066657d53fc820e84fcb162f67de282b513f80d182931c323959377f16c483b +fb0b65b28215a0dc15dacc09b82551f9a04cba42cdad1dd1aa8871c534e0413b +5e1dbdd772e4b0eafb21e01a245bfc273b2f8ad00d518dbc35d0ed6ff463c68d +00165563ec93b156cc00e7f945a8705726c752907283e71ae5bc8e1dd61ca3d6 +dea7fec8928d460243534d16dba851dd77e3176eed0d7b8284718a891a0e8091 +e8525ca038e4a358ba3fbd2089ad33bc7821bf753dbaa23c1708cd6c80fd8e04 +919a230b790ba7e65e2e6c99c6254ce61b1f23466843a12a87d0bb46993d114f +2cfa18545e813e0f0bcd42fb41ca0bb3843f5324d9f68825c520beb38e34c1aa +da4aa7c3e03c55fa023b2f4b4d3ae618a14b2b3555de7f2a55a644f2035fa18b +787abdf31401eef648529e4bd15d9b8e3e3ff5eed76afa2112a32716ca12e39b +08f6053b68c42944648bbfc34d02af7e6bd35d21127f9fa0a79406f7c2b6d278 +62103da11c6e1cb34512af560b3af2300882fa769716e84a435a9c6cefdcb0be +e0ce3c9fd5531cd4d66ea9f663889660385423c905663cbbe9bb46838799f9b2 +1d0485547700339b458c605f15f65030e4ab270ae1500e30a133ce0ddefa2190 +23d55a16daf62c8c788432c3b9813865a25edaaa731831ff905bd900434f2d69 +2f8880b60a14c12e99c74bb7550da6b5ce8d2228ac4b44cc7432b1dc58c96e4d +1f4390a3b6dcba3569110f0d5f98f77289d27feb69b656257aa14edc8bb3c00d +2da9a4cbbab69bf6ce190c1270be5fc5efc49df45c0b376f081dcfecd80b12e6 +cced2edb8423294bf8886bdba31002f5c673c0ec8772585640feea2a6e17f385 +1cfb1639e697548a5bd849e688ba187bc1b261c60e67cc84a4e5920fb753d5ca +5db41f5bca801c9cf1daf7b88c866d8c18c117ec29aa7087fc08ac4518eb94f6 +c761bdfae10843c4e6f279d7ffdc2eb36fe38f777745dd255415a9b2bd9c5b7c +efc7fbebefb52686382f76cfa9b6af9241d1573bcb8e1e7d2243f621380ea522 +a30c94f1b19e21e9f2e4ce61d1597e45aad5e4180b1d7069b7f9f2e9490722f0 +73f8c7dfb9c8f7514d97d18a2f4ad6a49985f7f4d6447bd439a6ed01e198440d +4b30845005396d3c346450902f88e470141d2cd45b253f8a7fb94342be3f8dfa +0fb042e016ce042d04f903e36519b2750136b94c1978a66b660e3c79a698abb2 +d7340e9097fc4bd724050ad42cec80696352c3c6e82558361b6421084a509a0c +40eaddcee7050ca7c43726daacab25ed87ad4c04bfd64047f24d7c8230cba804 +948d06cd0c1aa4fdba32b51f268dc4730b8d65c8b50a4bf0b2a9b43ece574336 +bd1cd5af9a1994f3709aa64583a2cd451e3a787307a84a7a159d34c2dd276b9d +a351f2751918509502ae9bc0590450916a99ed8b3778d1afed341f0584589c94 +f0dcca7db60869ff3f91493e636c35194d1dc1a396a48bd1f7e724c6ec46db60 +0a4a38ab1535ff3da2c64000dbbe240236143c66cf63742f621896406fcfcd43 +c4822c4d1c80e2f7722fea857c98180318338e1009afcbd10d5b65ecc2796a8c +14457624bad811cfe85533418fd87f901ae8b760df86e190e0682da9156b7476 +d6b0f81ba0c303e4dcf6607893de4f15b6ff0de435efcf8398dd55f416502d46 +99baaf44e39a29dc7d7c01332922934bb5fc9e5dadf4688f7a997ef9d8deaad3 +035640e40af15329b528ef163ecd867d31d008aae735f7a9498eaf20c4804f27 +a1ced03d39d4ca49791493e0e570e6fa9796e1f9fc79f3f74db5c1ccfa3c53b0 +182c636df0377c95d1d560da832244fdd446df61ed5cb36a2c5336cd59f63d0e +df7efd374fee9b2d35dc757ad2922bcf7441bb44167fa4c1e47ce46bb63a787a +90b9377fd9e42548091bae3db4a20bba6c4471dcb335b9b043c318577c96af23 +d046572134d38c2b38fdff6e5eda47689ef58ac2bcc0159d31355d7d063c4bb9 +5cf7a615ba26328a3173163f081c01aef825343386df17f0226890e536fe35c4 +1792b5115f3c92561da144315039f3f03d7eb6f450bb94931ea74ac6455dfe65 +b7c4b4993417f69ee10db426fc86681a697e7dc9abd96b7eac6b9a243cb6bc41 +f38340628ccf7bb442c089beffaa2ef864a31a736bff274ef95ce0cc2a77f695 +edadda05bc61825f4657bc14e579dcf1d05791a1b079cdccf6def41f026d4aeb +44604cd93e788fde233afd4d26aa71b111e2024e3b271d0e703022f52f635e5a +371c892ac55cb627caa3f36c14745b5fdf230211e076965f29ce80b102bd0b57 +a0322849da6cf05aa33b10384e32aee2ee65674e554eeac8cc9074b5d71c7988 +929b350b98950f6704c9448f2fdc0e4cd8c2f650be4a1ab53fced3c25a7bee82 +f35fae1c3bfe26407db5e7aceab1cc4b6dc4da552f5cd79ee8d5f068b1fff665 +e6fa41e77db2a0629507bfc547493051d4942405b0f01eb5deaf18dd9ade3631 +184ef75891ce7a1fafda1380d47e55767dd7d3c88baab501cbe0a87352716873 +8137bfb1a91b6c98b52dbadbee01a113655dcb67359a2314099b2866b3261773 +392aebd266a8fb6a11c04f40b345b4382ed8d2a25eabcf4ece87af1900c891aa +bd5a30cde2f1a0d3be3e5ce534299632521430f12084948a6ae70b75517ff665 +62e9268f2a454f3a10d7e5710f87ab29b96801b4fa815ce8a8acce2ea4404cba +5ff8b3a56c64ef081a75d664a6206fa341c605683b17d01abbcda227ef3c55a2 +3c56c79194138ea19d3cf3be55ddb73f45d00c4c681b667b8eda54a174968018 +5a5d990820dc716000a49c13d583bc06cff6a8f0f95ba7bb84e8d8673aef8817 +793f4981e1a4f4378958d7388db7ea6c9d1863d153a536a70a229a240aff8194 +e8ac2dcd2ea751a22d00784c7045c2c9d23e5fb214bc817b60425fc3e8a48f31 +e6e8a9342cc134e95c4e59026d9abdfc49900411c4a5d972027ffb7e1662a19c +56eeb69c9e67040399fd3913ade537cce040b8180c8c9e323a7d6b1e0c7d12f1 +52b135e2e4b589ce34338eff6bd405f1bb1d7ff5c2d7c221bcf320d672fcb97c +0bcf0649e70bc0f85b0c7462816a69f038e97fd614d97f82cb01d144c0743126 +e8b4b7a34995fbd9d870a22e9ef270926e0fb1f345e3f70f258a45f3c3af6036 +af94b49a7695dfffaba8d00d7c92687ef96b5f268b5ca004d10e38ee997df62a +cc19ee6387baeff268359df4880fe6a31bd113b4e10464365f31f7a1dd16bf3b +5fa72f13f53b1a0d61f7ae2e001b475ac61066bed04fcfbaa0dc7aac8dd693f4 +15eed8a4c33b7ae5d845a61c63d382a0b952b0672cccae58110544e7a7329441 +0bb1b2f7283a052228b7da6f5094202c0ed8eb09dbdf2ce10fa5c55cd44a35e7 +085258438bd77317fd7f990c408f4ad2ac594bf9d3f335e505cb3c024381c1bb +2fb22bac693761ca67bb1b8942103892402f006015466d5cb35492e507018581 +4ff9733b61051f2a0c71269d06af3c2a58bd5449a65a42d008a139c7beaa45ed +220a233174b00e35c77ee5a5e2995511f17a2eacd575007e666c2e57761e8385 +dba2ef66791e676bdfdc06efac4fbb27ab2ac285295b5ae013026e1bb7938a13 +e1fb9d071ae6f9fe3eb0f3b382695382783fa00c461d622a50ffe6b4651cd059 +c5cf8a359a5a2222b2ae48acea4f258460c8f69283f7e4554d37b18b691815ad +faab55eabbc37c18ea30eaaf5991d7e06574d94e9b87e631806c1d94ff0b7d78 +701743409efb366d7c405a11819f5472ffcb3f595ec7bf6146d8570caa949cab +15327fb424c04827148f1793c7041740ce61b521bdb5144e26bfa74be5adb8ca +b319e3ddd345b30662422673bbbbd23d30e71f6375c29bcd1ec632652f181c68 +efbc2026dae64875e32d6c7d8412c9724b72011f8a6615f972e5d4bd4f92d308 +ef8bb44cd603d22639fcdea9601ac016efd1284e4f899c1f977272926ff61d89 +89fea615693c7ad528befdc4277c2a50f335299cd065418407a0d3698ec60244 +dc7266dbda3270547e90eff22c65e2676a9fae32c088da780b75ea2ddd2bb617 +2eb6b68c19b0435652f8d5d2690a15747d6ee5180654fbee72f84a3051dcd4a4 +eb767370a85995016bac53ab3c0ee44a2e405903e8f6f33c36bf8feb48410d83 +cf3a04681cb878490415f09229bee9ca1d73da791c2c71313cb951713c5e450c +8482216a71f86f8a541122bea18446797554323764998165bac81b3096796faf +8538bf83af476e0bbabfa0813feed0dc578814b387a0473badf2da98a5f1a129 +b1385b2e4c9ab79424548e922b91cf56cb3f7a0dca6f4f04ac1ce5d4681d4062 +dc238c93ece3cb0f6c3523d07115a0c7c018a73490d5cdbb1985165ac41b14fe +de1352571c132e47e16915b04c85e16e57a07fd5aea653ad9491019970546d19 +3caf494886d2c197c8a39bb5ca92348b18ed84814a6fca4b9e07271c13598990 +08c821cf8044a71b89ee6b7c7581e5be5f0167f7f6c39f1e4eae183ac9a5b9da +9f71945962b981055d138d93acdafe0ff2162eb6e320a55fb6783e4755624762 +0326c12ae49da52f315f90646fa82072fc772a557b777ffbf2cc54c2c2f76b7f +09531e2890dce9f26157181c69e8fb98d1de277ea3ef5a9653198ca06524ff00 +248413ef8662efd204a4163e39b86c3d7a27f1e81052713179c5a39fea89b5e5 +5f7ddf87911339a827bdef19ab239624e7c0617ec03e0a6fb4fa29fe6e0b05fa +c50a614158995dfed1235c3b39fa966d848633c5a740632d285edce385929d15 +0d389b43f47da2171ca336cded4a0851470cc086c04a466e4cf03fddb92f9c20 +1f7c732e4a8077527ba27743f9dd4e207b97a1f7cd53778a99f64b092d66f4f9 +1b6a3455a72666386fbc9dd06631a041ae1c63452b5a0480fa75e9a5eeedb8d2 +7bd88740e3d38d5e954d622aacf4342f536ca534cab1e34d352f706b06e04630 +169bc810621d52699cedb96d4796ae1cc28fee4ba7e2223e77faafb9160e3571 +c013b910f1c61fe188625f318ffcc0a10f614d5716e806f14326aad495ea90a4 +4f7bcf589dba538895d4d3da8b5871eeea731f956594bf088a9c4a67794cf661 +ffb389ca93696eb5fb9589aa2c19f43cfeb41cac18b736775017ad51339e5ccf +de061c17b697242189fe127db52d26407b204a664a4d4ef5428ca588f07d5b3e +8d19ad7d2437cdafa87353498a304838433dd2b372b15ed83e7969a11f793b58 +40c2d5161aa2f7398f754e2ab2721cfa51915c1795bfdc775012050ac793768b +960744ec1b1e34a02bd28a03660e0da853be50177e0a22fe9e8355cebf20ee28 +332ac812ab318ab5a391fe54f18fb88d9effdbabffc20ca9a16d9ef29ea37b8d +5a10f7d36fb1e102528c65f9535683cbe3e31a5d5d1274ec5c7e57042b9b5126 +38015154d7080dc6068f4a5cad76cd02ccce389db91c27d9eeaaeb619569a4da +f8c6375fd2e2876111e6d481192007eb92f84674583ff8d706e922d31e97178d +1a0e968e64ceb0a703df1e3de767135b655e569c6fa83e1713b15532205a736f +cc3899b0df69a87d53a2f065f69988b35cbd395427bc6e6b688cc3d4a11bf0f4 +311b75cfab9955f347a91c8f3245c8fb5555075e8a3d529f33aedba49aaec0c6 +04a19a7bc5ed45f2f09c7548f6f59b933e96350221fb10d2e654e52f508060ac +b0082531fc830e5f4b059731a81ac8e36a2ad89735ecec3d1c30aea57af5d4da +a8769c1801f817e4f29c2214ec66d58c3918a9f233133120541f4938c0c8ab6a +e2dbf3b0deeb140cb17070d75a64e4b41a169534dd99ad8ee635779da4b131be +e1165e25aa26a2127fdcab0738d769117d8c4b7ee4dcf2caff4e126fa83dd96d +0373bfcda5e1a920756329ff21cd4445ebda128a491860b193a4d97d5605acb9 +9610029edc11f240a776c45f55997f7d94e5346e1a94d9d8c9ce272d16331f42 +e6158bd248136122b06bf617d6e51977f2ef2ca94fbfbec1ed369ed566da0a3f +0011484eea81b59772c52834f41208c87b06bcd4dda705404082ccd6280fe7c5 +72e8e5f7279d16bdb543488fdcdbc01e3781c3f2f1343c805c2f5d3b3b5ef19f +ebc207585693f4ad3b5333260b10a3fd73ae4c496d62bd0abf05f089a89ab658 +aadceec15421d25fbe0c5df76884133b05214e327cf0f6b872bd93160f69435c +fb012578b281d2d38ba93de5d992574e0ee2f0dad835146f4cec5373b1213fa3 +c8198b7dfbf455d73a7cc6fd50c37b7adcfb6d5c6b5be7c66bbcfe1f58245626 +96a7369a9d01fd31b358cdd12738bc129f571396931b3d14e65866e5881e92c0 +c57ce463d9af9663b21a4c47fe605cd91d220a72d57c5f5217031634e59a7fdc +784d90821ad69adf1bff61844e9f87bb12576a97d6a658daff1c8dfc6815df7e +8dc35d4dde5b42c440259bda1f8112756a956aeb85e59da6b13030837403d79b +726b4cea02e999a2bfdfe58428731cfaddba5504de48dbfc609d7989ebe36b0e +b4eaa7e5c3f285d51f3898d1b2e8d3e653374014629b506b8b3fc0bcdab045e0 +8a43aa4513e2355dcc5ac7a703c31dcaa61f24213832aca3bbc7e342d7ad27f3 +4152ae1fe6f4e28eba9245faf38fc3266cd5ae400635942efd22f0ff9dca428f +ce3a8d7d19b8eaa5b36f4e0057b37f83f1b10a83b5d1aab002d6d63bec695e6c +2b46ffa670650aa4f2dc3578114987faa786de2d6db7e6e6872282d0a86e1b82 +1cfb6be029aebf854dac8c88f35dab7cdd4a9ed0077dc7ba7c39a34df81662c3 +3a5f558328bd31934517e79a53563d330b41105a5329d1fa7053820da39a811d +74c4a92a9ee3f923a26d86c59a8908b9a042e1981da48642ff2298a9b05a5878 +5566e7be4c0aa5e34759faaefc41dfbbfc3af607411349681b5030e287d0b577 +a3eafa4753e746f1d71fd7a6915f7708cd60d15ecc6ce797ba3798a93265a03a +874a07745af0df81363002f3aadd88cb95d5fbb6c45fb044e4ce9e09502003d8 +7c4bef2b82b63f91910a0d4ead2f1ea8c8ba01dffbfade76731a8690dd289a7b +71ed0c03819641772101c6bf4c433ccc585d18f93f26fa41fdffe0ef8294296a +b9172a28f500fe5b75eef97ee0165ba4a878084ae651784d5de65f5b65cc479b +04116a57611681eba68c09f82efec26ae0c60ac40424bb0fdc8b987b75875464 +f59dd2e0b62dba0b3fd820cb03f00c2f7babbdf5e24267b9038b45966cb2ff3b +115ca8b0af271afd2b574a0153eebd04a87ab4b418c6a554682b3d2b5420d0e2 +e23e16ceb4953105df0355be7f31c233af2c0153858030f9fb16e7e9b4795718 +7b436b9788c463c7e8d8ab67a6cad843d27dce5caefedc3a76ec535ec979093e +723ca8bd8d0234e1f39973064946c79b93fc892e7b24cefce88d099b821a69c7 +7324c9ccf28db4b97f844fdcca54012b142a6f560426674c19839f5d776b29c4 +424979e3a16e398e7a792a5e92a7eee5727b6d033e3f305e204ce370dfe40997 +b7a84f7eb97795b9e243c8fd58ea4cc7371d9ad3949f1c8e9c174cb9af2b0c28 +633cfbce09b4a380aa29e9199e055d891e3d89d5589c5e83e8aa7770220551d1 +b10a88550cf10372add5884010c25359e45c821611a71adeeff841d5d8068918 +68f204fcb9f4c9493c8d91cc039baeb898efc4b5eec85623bfc6fdbf5bce605f +5c7c618e19ac01c68961d702b17d16d31368a0b7c3bc46c5b6da34a546e31b5b +c9ed437ae5209c91433d0e8df0021e606294a22edc3a02ece80bbd267bc3a1e4 +1ce2f5272f1db7002aac2a8d7dc2a649c8316662a941f6baf7fb8ee7e86922c2 +75588ff6af85f540bbcc5a380d86e81a37bf88a3c57a8deaed33d274e87720be +2d99585c5029538b2fee86082598a139ec39ca4e061c137f1ff59cfc69120c28 +3e654ecb7cc48649900801bb329736c7bf21b07ffba69534036cb85dc5f29396 +9ab322e19804863da9c5f0860ebadc5228badb80cfd4e9f31bc0052430e0f3cc +0b63b1cff9fa9f4467d43262d4f63eeae49ff8d1560ec55a06a3a92fdcf158bd +5089f8b188d3095666d4aa9679ffebc6786940132d259d42e7153760de7b6adc +d3e6056db55f124726cb20d0ac763b67c727e9789979882578ef2ae32c8d0a9e +2e2947f7ba52cf89944a36cd2f2e5dc4a02656202cb49ba081569584a335be14 +9cb5bd5b785123b7cd202158ba98a831edc01d6a461ba2641c07150d3f55b292 +bcf9c69d619746c9fc9d444a6132c5fc9ed2228bef99ca5c7e6dc772f194a1e7 +7a54a8d99c5e665422be3f13bd4e104e69ad02a479ac3c9ff61bb2e74dfa9735 +e80a744cc4d4674c5b33e674eec87362da4012b98ed0e7f05d75073897a40bc8 +d66140db1a850483fdd4606b3110ab5d7a6bb6229a6df028e8c8c62538a85884 +0abd25dcc84bfe9d13fe4ef567165eb72e0e246826cc67d0f35bcec135c2d4f7 +433f278e9948eb91b30f0c11de38e1c9b7484c5e3970b09d37334df686c704b7 +77fe267a0ce2ad7a5887e5dff00640e3f619dfcab32fbc28192876018f4fa492 +b2ed5983a9a1325acc22366a8c5c94412d26b75eee6a2bd08d3d2d9247d0673b +59e680ad1d3432849a695c8910b686533f3bd7d64c3fa3e9ccd76475b4e2d079 +0b9e58f792d619b0cc48defcf09cd6855293975b75e38847041662a1899686b7 +74d2bbeaeab5431d53aa8c380a57703a21c1306472c4420d33076c25a2bd2710 +cd7cbe3616afe747a410e03387ff9c5951a89c8818af2879d95d74c5c0734c5a +c84218c219a639ad2e8329e55f6d339c03c64452aaab6608a0829f6979a745ac +d351cdc8b67f351549aa6df608197e0eb65718f47b5513bbfbad13a5e32adcd4 +e7869dcfd53b918282c5916f756f6e8eac46cf58f5e9de2d073a4bdd54a54d0b +f2f4a61432c62430c1f9eb783018d1c7be62df2514f562f3a285e9584819c8da +91e15749bd71197cd549ef0f89638f560f42a3e02a9dc69a93da820d3748b983 +b1409f29e499401bd76037e195f9c50895b1034089d2bf6fa736591ef5cad597 +836512b623f94e85907d7706b8e3c0686b93432e3d3bf7f42c98de62ad150fdf +ee1569f3d3b8aad8fe31f00fed1c767736e9dc189d1ef18979d1725538b060bb +2dac78c707f717a0ecf9bb9f222ef8aff9fda74c4f07ea07b6f52d8b3bc3f02d +763abd9b9bb4305f4707fcd03750e033d502e9e69bbc3db91f4fc1ab9356f1e8 +b66649370d6e1099250e0638d0b5688bfff1bb8dc7ea038a7163502eee800e53 +a1bda9971e2ac70b7489492bafa8ef42dfe4851f9f1cc7c2c95a40ab25db455c +12b42cb94aebc3b1b3d7cabdbef637205ec1dec48bf04fe2c86c3f41ff127108 +9d8e5c37f7d406d743962f7fe013149b4c1291d9573a544f2bc8e2fea78fb276 +c5ea8cd6583182ee34fcd8ccdc4dbb7273f848b2c2005dae6e43f99086dd21b1 +0756bb1258696753248513daeaff92bfeaae1eabe8c063491a5fd6c00e1f445c +cc1ec75c816d6d27e62bc657ed551328c3b85afcd1ca9b09d00373f0053ff68c +97605c183bf8c30a2bfed48a3245ef6b584398f62024642832c88f24a24d3a01 +be6f512b9c3623843d388c792bc4add0805343713d7535f6a1d03d4a2fce724a +b91c4977150914ad0a34fef0addb71980c0a764375d91b86e9f379c438562dcf +11686d0794d26b07d4c59febaff8a93c43946d987e6c4b6ad650c932cd595fa5 +a2b46b2802463c70449af8e61fa30c6e83c748a33be7d81476376064716e3197 +f8703d525f95c6a2ddae5b66a9561d8b1440915286c30c345f599ac82fdd1a12 +a5be554ec240b610383f34d85a1ed94466ee7c0cd5cc1676570a73ac9c6d80df +f71c2b487882da466f9a08a2cd963653dc67957514976be58d40a12e9ff9962e +3407c304c750f81a7bfb458a44dcd8a04f8742c8d7ad67b9bc8e4fb9bd425abe +af4a2714d56d23dd7fe79d99c5d935b2b97d82415e55f326135fcf51db7e4a81 +8e6177e53ce48a628514e93ad45782277eeb78f5dbb51908db22e74825d31478 +f4a9f5ecd373d6f4fda7b89dcc1d124c3d09265a8835ef1b36c31cb078b4de28 +3435ae9df3477504a90b52a788093f0ee924d382b380295faba3c35f56b8f46b +0bfbe880af354d949dc30f0869b9ccb3f194782f4f784c37b79f575ed5dbb38a +d3819a668e204d528f6d6e05ba0a45371f7656c6d1be0aff866f9fa6a8ce5654 +fa485ab31cf114a531b1b674371119eb36ccba3350c58ec35af3c410c393f0a5 +d6c2149856ddaf28ed279ef64a66a77297f131a9981ca618b5941f28af7ee370 +30a59da5e4175b5806a786d4981081b31d306b96f4c7a54e024ea32b8892b12b +6161f3c880242602476dff9070e24a364d40e9a5fde87b26535e9f892c778c50 +98e10efa0b5b661971a3a018028789a71b363c7a62ed0944b0c2cbba0c79e4bb +9f7a05b1dc1fcc278e2546201c9d23ba42d67d68d1f4614b3735cbd6f50dc46f +8172cb5d3b6d099e43499c2c0b14c58aecacf63b00a58204f99026dc45994d28 +6de59019e2275322d4ce46ebe5ed630489886160a2bf9a7099abb49a864a6e0b +a9446b97ed62b61926520d26201f31a803e4bbd8c9bf89d154f3005950dd5721 +e7d1ccd7982ca0beca6a8cd2dcae488fd9edea9f09ecacc6b430ad9e644bfd94 +f43177ef3eaca6f2b22ed5c1f61657102792f438a6a8bcc721cf54d445ae5973 +ed53eef181537f66fe15498f408fce30eb7348a97857391ab7532865f48f7240 +5040adf2af45da7b6f5b03d8a37a94a2647936865b470ecd43dc0d4d72269950 +f0a668b72e6001519f6934380b80a2758686d4f99a618fc4bb61abbb58eddd87 +7bc4f0aabd28d596fb613ccffb0f26a75e53a7c7fd432754422538424fdbd636 +be60414dbede5fa639eeca055c7d0d0f80a121c24f3b2402f98ac91dea0d06de +0e1faab1c2e4ce5172a48a417c210c2ee4619edcadc89c4b69aec28c8b2efb81 +e37a006366876e99eaa815b69837baa67778e5e359fd316570fb52880a9ca629 +97dd0dbf406138783d84792cf7616dbf2c7a31825aa33670c6bdec650ca2698c +5c8546a3966159d66473b07c4c99f2d48c95238ad5352a1cb2f06afdd953475a +4e5dda657bb5f5f834b29b30fc9d9aee7f4d8797dcee9a35cfeb066d8317fb4a +41924f4a2e65cea7cb1fa8114e9e31c4be6847b0547b9712df4cdcf490709df9 +e76cb3fd933b03b8b7c786790c6ed880458500a3c66ae48306a3dacce3fc1663 +b0d7e2850a7d9d22c4e2b183ec58bfbf818b4fb7717ae53cf58d9b52020c02af +1686682b215aae195d6c82abf3d27a82a28b2a580a79c88ea264b478196848b3 +f8789685914564daec64c7798d8ceca706aecdbdf57ad457eb1b5058dd8d081b +b125ecd5b6c8cd541f4fe62c9c48a708df183f53b8ee3d1226bb909492ba6878 +e837627727fa290c2e9296f29991a366a2977ef4ee9c1b9a4635b424b78b0a92 +eea383038fd13201bf9724313c7bef7f3f86a6b854375077625cfd5c90de6f49 +c8f7a0da7c5f31b611ecabb893e90a470ca1bfced8b4b34c757869d0778a4934 +2a73cf77653d660d6815e3fe282d9d172522f351c58ee095b7dcdf3196b59c39 +20309447c3dc2e1679ca39c9efc65b587f0e4c879c8542869bee1ef90f562fb8 +02323011b77fd8e079009aabd0011f382de66d9cd74a581b8810251482c985ec +af0ca59367f51819c4532af37a5bd5926744b46a03f43da0560bd0eead27310e +3a3e522593a807ad4b8f800960f78894cb757e82f3476a2724d0ae623f5460f1 +67bf93d0b305322dca45e038a56b299c7ed6dff66fd747bfa55947b9ecb485db +681af9d82546e9096ae4d6172dcf0aff907642ef8d57ea3f84921041b8a29c94 +d5a8e867bb5d85576e08324ed1c18b9384fb2c0f5fa5aa87f48d4f2f6f2ed3ac +0cdadc949455fce9165d5e5f5bc4bf4d6314ae8ab1708d2774f95a808ac809fe +565d77765add2900affc +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndDocument +% %%%%% End inserted section +%%EndProlog +%%BeginSetup +PROLOGUE begin + +%%EndSetup +%%Page: 1 1 +%%PageFonts: (atend) +%%PageBoundingBox: (atend) + +1 BEGINPAGE +1 1 1 0 C +/F1 12 /Times-Roman DF +(Cheq \(gift of Adobe Systems\) "Chequed Board") +72 756 T +(p. 1) +558 756 T +/F2 30 /Cheq DF + + +% %%%%% Following line added by Aladdin Enterprises: +% %%%%% scale up and relocate the image. +-140 -800 translate 2 2 scale + +( ________) 72 714 T +(/R\366B\316K\365N\345\\) 72 684 T +(/\270P\270P\270P\270P\\) 72 654 T +(/ x x x x\\) 72 624 T +(/x xQ\360 x \\) 72 594 T +(/ x x x x\\) 72 564 T +(/x x \317kx \\) 72 534 T +(/p\271p\271p\271p\271\\) 72 504 T +(/\250n\272q\373b\265r\\) 72 474 T %%%%%% 277?? +( --------) 72 444 T +2 ENDPAGE +%%PageTrailer +%%PageFonts: Times-Roman Cheq +%%PageBoundingBox: 20 20 576 765 +%%Trailer +end %PROLOGUE +clear cleardictstack +chesssave restore +%%Pages: 1 +%%BoundingBox: 60 138 576 765 +%%DocumentFonts: Times-Roman Cheq +%%EOF diff --git a/tests/input/escher.ps b/tests/input/escher.ps new file mode 100644 index 0000000..9a01f4f --- /dev/null +++ b/tests/input/escher.ps @@ -0,0 +1,384 @@ +%! +% If you're concerned that the cpu in your PostScript printer will atrophy +% from disuse, here is another Escher-like contribution to to keep it busy +% for a while. It uses PostScript color commands, but will still work on +% a monochrome printer (but isn't very pretty in black & white). +% +% The butterflies are arranged in a hexagonal grid (wallpaper group p6), +% and the moveto, lineto, curveto commands used to render the tesselation +% are redefined so as to impose a nonlinear transform that shrinks the +% infinite plane to an ellipse. This is a sleazy way to mimic Escher's +% "circle limit" sorts of things. +% +% The butterfly permimeter was made by imposing all the symmetry constraints +% on a path, and then that path was filled in using Adobe Illustrator +% +% The routines Xform and next_color are easy to change if you want to hack +% with them. The code was written to sacrifice efficiency for readability. +% +% Bob Wallis +% +% UUCP {sun,pyramid,cae780,apple}!weitek!wallis + +/eschersave save def % prevent left over side effects + +%statusdict begin waittimeout 6000 lt % if you have a slow printer, you +% {0 60 6000 setdefaulttimeouts} % might need to uncomment this +%if end + +/nlayers 1 def % 1 takes about 10 minutes on a LW+; 2 takes 4x longer +/warp 1 def % 1 -> ellipsoidal distortion; 0 -> flat Euclidean +/inch {72 mul} def + +/x4 152 def /y4 205.6 def % 6 fold rotation center of bfly +/x12 387.20 def /y12 403.84 def % 3 fold center of bfly + +/dx x4 x12 sub def % [dx,dy] = distance between the +/dy y4 y12 sub def % two fixed points above + +/Dm dx dup mul dy dup mul % magnitude of basis vectors of + add sqrt 3 sqrt mul % parallelogram lattice +def % = |dx,dy| * sqrt(3) + +/Da dy dx atan 30 add def +/D1x Dm Da cos mul def % [D1x, D1y] = basis vector vector #1 +/D1y Dm Da sin mul def % = [Dm,0] exp(j30) + +/Da dy dx atan 30 sub def +/D2x Dm Da cos mul def % [D2x, D2y] = basis vector vector #2 +/D2y Dm Da sin mul def % = [Dm,0] exp(-j30) + +/m { moveto} def +/L {lineto} def +/S {stroke} def +/c {curveto} def +/f {closepath fill} def +/F {closepath fill} def +/g { setgray} def + +/FillStroke { % fill interior & stroke black border + closepath gsave fill grestore 0 setgray stroke +} def + +% +% Description of 1 butterfly +% +/body { + 314.96 280.19 m + 383.4 261.71 445.11 243.23 513.52 224.68 c + 463.68 256.59 490.26 328.83 446.99 360.76 c + 423.71 347.32 397.08 339.7 367.07 337.9 c + 388.93 358.28 414.14 372.84 442.73 381.58 c + 426.68 398.18 394.07 389.7 387.2 403.84 c + 371.52 404.96 362.56 372.48 340.16 366.88 c + 346.88 396.01 346.88 425.12 340.16 454.24 c + 326.72 427.35 320 400.48 320 373.6 c + 270.71 352.1 221.44 411.23 168.88 384.02 c + 189.04 388.03 202.48 380.4 212.57 366.95 c + 216.72 350.85 209.23 341.46 190.1 338.79 c + 177.34 343.57 167.94 354.17 161.9 370.59 c + 176.06 305.52 132.02 274.05 152 205.6 c + 201.29 257.12 250.56 234.72 299.84 279.52 c + 288.64 266.08 284.16 252.64 286.4 239.2 c + 298.27 223.97 310.15 222.18 322.02 233.82 c + 328.62 249.28 328.51 264.74 314.96 280.19 c + FillStroke +} def + +/eyes { + 294.8125 238.3246 m + 296.9115 238.3246 298.6132 242.7964 298.6132 248.3125 c + 298.6132 253.8286 296.9115 258.3004 294.8125 258.3004 c + 292.7135 258.3004 291.0118 253.8286 291.0118 248.3125 c + 291.0118 242.7964 292.7135 238.3246 294.8125 238.3246 c + closepath gsave 1 g fill grestore 0 g S + + 319.5 241.1782 m + 321.7455 241.1782 323.5659 245.4917 323.5659 250.8125 c + 323.5659 256.1333 321.7455 260.4468 319.5 260.4468 c + 317.2545 260.4468 315.4341 256.1333 315.4341 250.8125 c + 315.4341 245.4917 317.2545 241.1782 319.5 241.1782 c + closepath gsave 1 g fill grestore 0 g S + 0 g + 296.875 242.0939 m + 297.4608 242.0939 297.9356 243.479 297.9356 245.1875 c + 297.9356 246.896 297.4608 248.2811 296.875 248.2811 c + 296.2892 248.2811 295.8143 246.896 295.8143 245.1875 c + 295.8143 243.479 296.2892 242.0939 296.875 242.0939 c + f + 0 g + 318.5 243.7707 m + 319.281 243.7707 319.9142 245.0766 319.9142 246.6875 c + 319.9142 248.2984 319.281 249.6043 318.5 249.6043 c + 317.719 249.6043 317.0858 248.2984 317.0858 246.6875 c + 317.0858 245.0766 317.719 243.7707 318.5 243.7707 c + f +} def + +/stripes { + 292 289 m + 252 294 241 295 213 279 c + 185 263 175 252 159 222 c + S + 285 313 m + 239 326 226 325 206 315 c + 186 305 164 278 161 267 c + S + 298 353 m + 262 342 251 339 237 355 c + 223 371 213 380 201 383 c + S + 330 288 m + 384 293 385 292 418 280 c + 451 268 452 264 473 247 c + S + 342 306 m + 381 311 386 317 410 311 c + 434 305 460 287 474 262 c + S + 345 321 m + 352 357 359 367 379 377 c + 399 387 409 385 426 382 c + S + 327.75 367.75 m + 336.5 392.25 333.682 403.348 335.25 415.5 c + S + 320 364.75 m + 322 361.75 323.5 360.5 326.25 360 c + 329 359.5 332 360.5 334 362.75 c + S + 316.25 356.5 m + 318.75 353.25 320 353 323.25 352.25 c + 326.5 351.5 329 352 331.5 353.25 c + S + 312.5 349 m + 316.75 345.5 318.25 344.5 321.25 343.75 c + 324.25 343 327 344 329.75 346 c + S + 310.75 340.75 m + 314.25 336.5 316.25 335.25 320 335.25 c + 323.75 335.25 327 336.5 329.25 338 c + S + 308.5 332 m + 311.75 328.5 312.5 327.25 317 327 c + 321.5 326.75 325.75 328.25 327.75 329.75 c + S + 305 322 m + 309.5 317.75 310.75 317 315 316.5 c + 319.25 316 322.25 318 324.75 320 c + S + 302.25 311 m + 307 307.5 307.75 306.25 312.75 306 c + 317.75 305.75 320 307.25 323.75 309.5 c + S + 301.25 298.25 m + 304.5 292.75 305.25 292 308.25 292 c + 311.25 292 313.75 293.75 315.75 295.75 c + S +} def +/nostrils { + 0 g + 304.062 227.775 m + 304.599 227.775 305.034 228.883 305.034 230.25 c + 305.034 231.616 304.599 232.724 304.062 232.724 c + 303.525 232.724 303.09 231.616 303.09 230.25 c + 303.09 228.883 303.525 227.775 304.062 227.775 c + f + 304.062 230.25 m + F + 309.562 228.275 m + 310.099 228.275 310.534 229.383 310.534 230.75 c + 310.534 232.116 310.099 233.224 309.562 233.224 c + 309.025 233.224 308.59 232.116 308.59 230.75 c + 308.59 229.383 309.025 228.275 309.562 228.275 c + f +} def +/thorax +{ + 327.5 300 m + 316.5 283 315.5 275.5 308 277.5 c + 294 311.5 299 313.5 304 334 c + 309 354.5 315.5 362 322.5 372 c + 329.5 382 327.5 376.5 331 376 c + 334.5 375.5 339.1367 379.1109 339 369 c + 338.5 332 333.4999 324.5 330.5 311.5 c + 0 g S +} def +/spots { + next_color + 192 242.201 m + 202.1535 242.201 210.3848 251.0655 210.3848 262 c + 210.3848 272.9345 202.1535 281.799 192 281.799 c + 181.8465 281.799 173.6152 272.9345 173.6152 262 c + 173.6152 251.0655 181.8465 242.201 192 242.201 c + FillStroke + next_color + 447.5 250.2365 m + 459.6061 250.2365 469.4203 257.5181 469.4203 266.5 c + 469.4203 275.4819 459.6061 282.7635 447.5 282.7635 c + 435.3939 282.7635 425.5797 275.4819 425.5797 266.5 c + 425.5797 257.5181 435.3939 250.2365 447.5 250.2365 c + FillStroke + next_color + 401 369.1005 m + 409.5914 369.1005 416.5563 373.5327 416.5563 379 c + 416.5563 384.4673 409.5914 388.8995 401 388.8995 c + 392.4086 388.8995 385.4436 384.4673 385.4436 379 c + 385.4436 373.5327 392.4086 369.1005 401 369.1005 c + FillStroke + next_color + 249 348.2721 m + 261.4966 348.2721 271.6274 353.9707 271.6274 361 c + 271.6274 368.0293 261.4966 373.7279 249 373.7279 c + 236.5034 373.7279 226.3726 368.0293 226.3726 361 c + 226.3726 353.9707 236.5034 348.2721 249 348.2721 c + FillStroke +} def + +/ncolor 6 def +/cidx 0 def + +/next_color { + cidx ncolor div % hue + .75 % saturation (change these if you like) + .8 % lightness + sethsbcolor + /cidx cidx 1 add ncolor mod def +} def + +/cidx 0 def + +/max_r2 % radius^2 for center of outermost ring of butterflies + Dm nlayers mul 1.05 mul dup mul +def + +/max_radius max_r2 sqrt def +/max_radius_inv 1 max_radius div def +/Dm_inv 1 Dm div def + +% +% Ellipsoidal distortion, maps "nlayers" concentric rings of cells into +% an ellipse centered on page + +% D length of 1 basis vector separating hexagonal cells +% z0 center of 6-fold rotation = origin of shrink xform +% z' = (z - z0)/D new coord system +% |z'| = sqrt(x^2 + [(8.5/11)*y]^2) aspect ratio of paper +% z" = z' * a/M(|z'|) shrink by "a/M(|z|)" as fcn of radius + +% At the max radius, we want the shrunk ellipse to be "W" units wide so it +% just fits our output format - solve for scale factor "a" + +% zmax = n+0.5 for n layers of cells +% zmax * [a/M(zmax)] = W 1/2 width of output on paper +% a = M(zmax)*W/zmax solve for "a" + +%/M{dup mul 1 add sqrt}bind def % M(u) = sqrt(1+|u|^2) = one possible shrink +/M { 1.5 add } bind def % M(u) = (1.5+|u|) = another possible one +/W 3.8 inch def % 1/2 width of ellipse +/zmax 0.5 nlayers add def % radius at last layer of hexagons +/a zmax M W mul zmax div def % a = M(zmax)*W/zmax + +/Xform { % [x0,y0] = ctr ellipse + Matrix transform + /y exch def + /x exch def + /z x dup mul y .773 mul dup mul add sqrt def % ellipse radius + /Scale a z M div def % z=a/M(|z|) + x Scale mul x0 add % magnify back up + y Scale mul y0 add % [x0+x*s, y0+y*s] +} def + + +/Helvetica findfont 8 scalefont setfont +4.25 inch 0.5 inch moveto +(RHW) stringwidth pop -0.5 mul 0 rmoveto +(RHW) show % autograph + +warp 1 eq { % redefine commands to use Xform + /moveto { Xform //moveto} def + /lineto { Xform //lineto} def + /curveto { + Xform 6 -2 roll + Xform 6 -2 roll + Xform 6 -2 roll + //curveto + } def +}if + + +/bfly { % paint 1 butterfly + next_color body + 1 setgray eyes + stripes + 0 setgray nostrils + 0.5 setgray thorax next_color + spots +} def + +/x0 x4 def % center +/y0 y4 def + +/T1matrix % xlate to center of image + x0 neg y0 neg matrix translate +def + +/Smatrix % scale so that 1 basis vector = 1.0 + Dm_inv dup matrix scale +def + +/HexCell { % 6 butterflys rotated about center of + /cidx 0 def % 6 fold symmetry + /color 0 def + /T2matrix dx dy matrix translate def + 0 60 300 { + /angle exch def + /Rmatrix angle matrix rotate def + /Matrix % translate, rotate, scale - used by Xform + T1matrix Rmatrix matrix concatmatrix + T2matrix matrix concatmatrix + Smatrix matrix concatmatrix + def + gsave + warp 0 eq % then may use usual PostScript machinery + { % else using Xform + x0 y0 translate angle rotate + .5 dup scale + dx x0 sub dy y0 sub translate + } if + bfly + next_color + grestore + } for +} def + + +%320 x4 sub 240 y4 sub translate +4.25 inch x4 sub 5.5 inch y4 sub translate + + +0 setlinewidth +/N 2 def +N neg 1 N { + /i exch def % translate to + N neg 1 N { % i*D1 + j*D2 + /j exch def % and draw HexCell + gsave + /dx i D1x mul j D2x mul add def % translate HexCell by + /dy i D1y mul j D2y mul add def % [dx,dy] + /r2 dx dup mul dy dup mul add def % r^2 = |dx,dy|^2 + r2 max_r2 lt % inside radius? + { % yes + 1 r2 max_r2 div sub sqrt 2 div + setlinewidth % make skinnier lines + HexCell % 6 butterflies + } + if + grestore + } for +} for + +showpage + +clear cleardictstack +eschersave restore