From feeley@iro.umontreal.ca Thu Aug 24 09:54:18 2017 From: Marc Feeley To: gambit-list@iro.umontreal.ca Subject: Re: [gambit-list] gsc -report for finding non-reachable defines Date: Thu, 24 Aug 2017 09:54:33 -0400 Message-ID: <8D9C7319-EB1E-4C88-8C20-96FB3DD24A51@iro.umontreal.ca> In-Reply-To: <9B4AB0D4-08B3-4D40-9FA1-DFBB197C9966@iro.umontreal.ca> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3862614507057108621==" --===============3862614507057108621== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable By the way, without the optimize-dead-definitions declaration you would get t= his dependency graph: Which shows that nothing is dependent on =E2=80=9Ca=E2=80=9D (nothing points = to it) and also shows what =E2=80=9Ca=E2=80=9D depends on. A =E2=80=9Cgsc -report=E2=80=9D (with or without the optimize-dead-definition= s) will show that a, b, c, d, e and main are defined and called. The depende= ncy graph is more precise because it is computed using a reachability analysi= s (similar to a garbage collector) on the GVM code that is generated by the c= ompiler, so you can observe the result of various optimizations (inlining, de= ad definition removal, constant folding, etc). Marc > On Aug 24, 2017, at 8:00 AM, Marc Feeley wrote: >=20 > A better way to determine which definitions are live is to use the tree sha= ker. Use (declare (optimize-dead-definitions)) and =E2=80=9Cgsc -dg=E2=80=9D= to create a dependency graph file =E2=80=9Cfoo.dg=E2=80=9D and then look at = all the names in the foo.dg file (which can also be visualized with the =E2= =80=9Cdot=E2=80=9D program). You probably also want to disable inlining with= (declare (not inline)) if you want to disregard the fact that definitions ca= n become dead if they are inlined at all the call sites. >=20 > For example: >=20 > bash$ gsc -c -dg foo.scm;echo not defined:;fgrep '" [label =3D' foo.dg | se= d -e 's/^ //g' -e 's/" \[label =3D.*$/"/g' | sort | uniq;echo live including= not defined:;fgrep ' -> ' foo.dg | sed -e 's/^ //g' -e 's/;$//g' -e $'s/ ->= /\\\n/g' | sort | uniq > not defined: > "*" > "+" > "println" > live including not defined: > "*" > "+" > "c" > "d" > "e" > "main" > "println" > "| foo|" > bash$ cat foo.scm > (declare > (optimize-dead-definitions) > (block) > (not inline) > ) >=20 > (define (a x) (if (< x 100) (a (b x)) x)) >=20 > (define (b x) (* x 2)) >=20 > (define (c x) (d (e x))) >=20 > (define (d x) (* x x)) >=20 > (define (e x) (+ x 1)) >=20 > (define (main) (println (c 10))) >=20 > (main) > bash$ cat foo.dg > digraph "/Users/feeley/foo" { > graph [splines =3D true overlap =3D false rankdir =3D "TD"]; > node [fontname =3D "Courier New" shape =3D "none"]; > "println" [label =3D <
println
>]; > "+" [label =3D <
+
>]; > "*" [label =3D <
*
>]; > "main" -> "println"; > "main" -> "c"; > "e" -> "+"; > "d" -> "*"; > "c" -> "e"; > "c" -> "d"; > "| foo|" -> "main"; > } >=20 > The output of =E2=80=9Cdot -O -Tpdf foo.dg=E2=80=9D is: >=20 > >=20 > The black nodes indicate global variables that are not defined in the sourc= e file. The node | foo| represents the file=E2=80=99s toplevel expressions. = Arrows represent dependencies. >=20 > Marc >=20 >> On Aug 24, 2017, at 6:12 AM, Sven Hartrumpf wrote: >>=20 >> Hi. >>=20 >> Thanks to a suggestion by Marc on the Chicken mailing list, >> I am experimenting with using the output of 'gsc -report' >> to remove non-reachable defines. >> I assume each defined identifier reported with D and one of A or R or C >> as reachable, all others as non-reachable. >> The found set of non-reachable identifiers is incomplete, but >> it can be improved by repeating the analysis on the reduced source: >>=20 >>> scms r-matcher.scm >> cond-expand-command: ... >> alexpand-command: ... >> reachable-command: (gsc -:h3700000 -report r-matcher.alexp > r-matcher.ale= xp.gsc) >> reduce-command: (cfa-reduce -k r-matcher.alexp r-matcher.reach > r-matcher= .rea1) >> defines: #removed: 718 (24.73%) #kept: 2185 >> iter 1 size: 3822249 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea1 > r-matcher.rea1= .gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea1 r-matcher.reach > r-matcher.= rea2) >> defines: #removed: 252 (11.53%) #kept: 1933 >> iter 2 size: 3519136 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea2 > r-matcher.rea2= .gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea2 r-matcher.reach > r-matcher.= rea3) >> defines: #removed: 150 (7.76%) #kept: 1783 >> iter 3 size: 3277324 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea3 > r-matcher.rea3= .gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea3 r-matcher.reach > r-matcher.= rea4) >> defines: #removed: 93 (5.22%) #kept: 1690 >> iter 4 size: 3154753 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea4 > r-matcher.rea4= .gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea4 r-matcher.reach > r-matcher.= rea5) >> defines: #removed: 42 (2.49%) #kept: 1648 >> iter 5 size: 3000686 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea5 > r-matcher.rea5= .gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea5 r-matcher.reach > r-matcher.= rea6) >> defines: #removed: 60 (3.64%) #kept: 1588 >> iter 6 size: 2924187 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea6 > r-matcher.rea6= .gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea6 r-matcher.reach > r-matcher.= rea7) >> defines: #removed: 26 (1.64%) #kept: 1562 >> iter 7 size: 2600067 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea7 > r-matcher.rea7= .gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea7 r-matcher.reach > r-matcher.= rea8) >> defines: #removed: 16 (1.02%) #kept: 1546 >> iter 8 size: 2586789 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea8 > r-matcher.rea8= .gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea8 r-matcher.reach > r-matcher.= rea9) >> defines: #removed: 12 (0.78%) #kept: 1534 >> iter 9 size: 2584936 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea9 > r-matcher.rea9= .gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea9 r-matcher.reach > r-matcher.= rea10) >> defines: #removed: 6 (0.39%) #kept: 1528 >> iter 10 size: 2580332 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea10 > r-matcher.rea= 10.gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea10 r-matcher.reach > r-matcher= .rea11) >> defines: #removed: 1 (0.07%) #kept: 1527 >> iter 11 size: 2579734 bytes >> reachable-command: (gsc -:h3700000 -report r-matcher.rea11 > r-matcher.rea= 11.gsc) >> reduce-command: (cfa-reduce -k r-matcher.rea11 r-matcher.reach > r-matcher= .rea12) >> defines: #removed: 0 (0.00%) #kept: 1527 >> iter 12 size: 2579734 bytes >>=20 >> The loop is terminated if no change of the source file is achieved (fixed = point). >> Here are some questions: >>=20 >> 1. There are still non-reachable functions in the final source file, e.g. >> if two functions call each other but are never called from a third functi= on. >>=20 >> 2. Can the analysis by 'gsc -report' be made more aggressive or can it be = hinted >> by providing some identifiers that are known to be non-reachable? >>=20 >> 3. Is there a way to stop gsc when the report is ready? Without such a fea= ture, >> the above 12-step analysis takes 20 minutes because it also generates .o = files in >> each iteration. >>=20 >> Greetings >> Sven >> _______________________________________________ >> Gambit-list mailing list >> Gambit-list(a)iro.umontreal.ca >> https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list >=20 --===============3862614507057108621== Content-Type: application/pdf Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="foo.dg.pdf" MIME-Version: 1.0 JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmlsdGVyIC9G bGF0ZURlY29kZSA+PgpzdHJlYW0KeAGlls1uHDcQhO/zFDzGCUB1N/+BnCwEORvaF3A2duJAkmMr Rz98vp5Z7a5WM4qMYAVohkM2i9XV1fwS3oUv4er6QcP+Icj8e9gvA9c3QflJHKNK6zncXIerX5n5 xwNr+MBPQxb/299NKiWWoKWExr8cvn4Ib4nuITQQ8/mS8HZHdBHRsNv7kjliDh6pjtQJ1mKfdnfh arfzKLuP4Yfw99dP9//c3oc3YfdX+GXHFkfYK1toBlRPwRzT9D8w5dhHG8QqsYfd3XQO6edXgrEk TpEuaA4MTX6y72TIAzmcoGlGcyBomgn66ZVo1Ow5mhmLo5lWyNzKF4FW0Czp+jG8mV6TqK3YTaOO RgI5crPRDnKwgxzu3n+6v1TColNb12nQVmPNuQZTUplQxR1jGkttOZi02MSJrSXmxr5sHkdNDTGO 2Lshzz6iqPawDzdz+TwphWlPuGqxtcri3qIk5MdYQYnCo3aJWVMKt4zV2LP4Jhwu8/E2/DlXzQX5 HhSCTiViNmIbg5Wlz7QgSRfBIy37EycroXSMSEm3IwXgM8lEbP1EgalGsUTIRwpMKzC9lA4UTKsU 4AZEhi1RpvrRDLoZQyeW6jkDhoCHmI/VOEoZ0wYDHvMpA4mDOwMsRBd1XDDw4SS7CwZmeKlGa1Si ZioIETi81IDn+PioiSpli9Q6BBjgWk6TpRFzdnloJ4m1rmtg3iFbHEmWqa2J+Q5ZMDbXgPjylDit pRJHzz4PoYmOLQ08Y4DtnzJwURq/b2pgxscJVFzOZwwouWrGgQGVS55MlEMwx0pMBUp0eL78ASlo A/amAnTUmJJQOOS4JtijCKgHZemRAC+Cgcyq+bweLWP7L0iA74FaJWOpEs9fayZZgjP7C0XmiVpe cp1zlLYxokuKUnSapybzQvUwCID0gMnzM+YpYZmyWaLOqVboomlNjxAJ5z2MXlZCRWitwVxJUXsu jjVVyCQDSLlXeikdFPo3SJ2dpXB4QfUkrQ2z7jvkHE3Q4hlq9VBuKKD2abZF6jNnGW4Dg6rfqKvf NlU140PY0s+S5PjUSDBWcGQA7XS/KJwYMI1YwTgysG0sahlpajudjB2QZ3OdnjPg+h7SpiNTL8jq ibOQ8IWBS2+lU3uDfb/JgGvAV6vQHc7qCmPpwzzTB2ehvFoSKdOjs4REPmVklv2nsxBNig6qFMdI efaupDy10rmFLc5CvmmYiNcrnJDUxwvn93tWo7mdgZ6oK1JS3A7RUup1KbxOlpzvUlpobsFW3Lso mEJPW3UDF0ZXmm5xa/Hz9dwQRqdY8QVK4gSa5izdihsM++M5W7APwl29P3r7HcBKwgN3hovW8C18 /Pz52zGLazcd7TRCzOrQGpZXmbvC/Ny4FeMzGBrz2G7pBdPKfWD2BSzObeYwleJCs76y+MrlKgAZ 51O8NSxXgXf/AhWdXj8KZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjEwNzYKZW5kb2JqCjIgMCBv YmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAzIDAgUiAvUmVzb3VyY2VzIDYgMCBSIC9Db250ZW50 cyA0IDAgUiAvTWVkaWFCb3ggWzAgMCAzNTAgNDA0XQo+PgplbmRvYmoKNiAwIG9iago8PCAvUHJv Y1NldCBbIC9QREYgL1RleHQgXSAvQ29sb3JTcGFjZSA8PCAvQ3MxIDcgMCBSID4+IC9FeHRHU3Rh dGUgPDwgL0dzMQoxMCAwIFIgL0dzMiAxMSAwIFIgPj4gL0ZvbnQgPDwgL1RUMSA4IDAgUiAvVFQy IDkgMCBSID4+ID4+CmVuZG9iagoxMCAwIG9iago8PCAvVHlwZSAvRXh0R1N0YXRlIC9DQSAwID4+ CmVuZG9iagoxMSAwIG9iago8PCAvVHlwZSAvRXh0R1N0YXRlIC9DQSAxID4+CmVuZG9iagoxMiAw IG9iago8PCAvTGVuZ3RoIDEzIDAgUiAvTiAzIC9BbHRlcm5hdGUgL0RldmljZVJHQiAvRmlsdGVy IC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGdlndUU9kWh8+9N73QEiIgJfQaegkg0jtIFQRRiUmA UAKGhCZ2RAVGFBEpVmRUwAFHhyJjRRQLg4Ji1wnyEFDGwVFEReXdjGsJ7601896a/cdZ39nnt9fZ Z+9917oAUPyCBMJ0WAGANKFYFO7rwVwSE8vE9wIYEAEOWAHA4WZmBEf4RALU/L09mZmoSMaz9u4u gGS72yy/UCZz1v9/kSI3QyQGAApF1TY8fiYX5QKUU7PFGTL/BMr0lSkyhjEyFqEJoqwi48SvbPan 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 XNu5Tnddwbrh9b7rj20gbUjZ8MtGy41lG99uit7UUaBRsL5gaLPv5sZCuUJR4b0tzlsObMVsFWzt 3WazrWrblyJe0fViy+KK4k8l3JLr31l9V/ndzPaE7b2l9qX7d+B2CHfc3em681iZYlle2dCu4F2t 5czyovK3u1fsvlZhW3FgD2mPZI+0MqiyvUqvakfVp+qk6oEaj5rmvep7t+2d2sfb17/fbX/TAY0D xQc+HhQcvH/I91BrrUFtxWHc4azDz+ui6rq/Z39ff0TtSPGRz0eFR6XHwo911TvU1zeoN5Q2wo2S xrHjccdv/eD1Q3sTq+lQM6O5+AQ4ITnx4sf4H++eDDzZeYp9qukn/Z/2ttBailqh1tzWibakNml7 THvf6YDTnR3OHS0/m/989Iz2mZqzymdLz5HOFZybOZ93fvJCxoXxi4kXhzpXdD66tOTSna6wrt7L gZevXvG5cqnbvfv8VZerZ645XTt9nX297Yb9jdYeu56WX+x+aem172296XCz/ZbjrY6+BX3n+l37 L972un3ljv+dGwOLBvruLr57/17cPel93v3RB6kPXj/Mejj9aP1j7OOiJwpPKp6qP6391fjXZqm9 9Oyg12DPs4hnj4a4Qy//lfmvT8MFz6nPK0a0RupHrUfPjPmM3Xqx9MXwy4yX0+OFvyn+tveV0auf fnf7vWdiycTwa9HrmT9K3qi+OfrW9m3nZOjk03dp76anit6rvj/2gf2h+2P0x5Hp7E/4T5WfjT93 fAn88ngmbWbm3/eE8/sKZW5kc3RyZWFtCmVuZG9iagoxMyAwIG9iagoyNjEyCmVuZG9iago3IDAg b2JqClsgL0lDQ0Jhc2VkIDEyIDAgUiBdCmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAv TWVkaWFCb3ggWzAgMCAzNTAgNDA0XSAvQ291bnQgMSAvS2lkcyBbIDIgMCBSIF0gPj4KZW5kb2Jq CjE0IDAgb2JqCjw8IC9UeXBlIC9DYXRhbG9nIC9QYWdlcyAzIDAgUiAvVmVyc2lvbiAvMS40ID4+ CmVuZG9iago5IDAgb2JqCjw8IC9UeXBlIC9Gb250IC9TdWJ0eXBlIC9UcnVlVHlwZSAvQmFzZUZv bnQgL0dBSURPWitDb3VyaWVyTmV3UFNNVCAvRm9udERlc2NyaXB0b3IKMTUgMCBSIC9FbmNvZGlu ZyAvTWFjUm9tYW5FbmNvZGluZyAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAxMjQgL1dpZHRocyBb IDYwMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDYwMCA2MDAgNjAwIDYwMCA2MDAKNjAwIDAgMCA2MDAgMCAwIDAg NjAwIDYwMCA2MDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNjAwIF0gPj4KZW5kb2JqCjE1IDAg b2JqCjw8IC9UeXBlIC9Gb250RGVzY3JpcHRvciAvRm9udE5hbWUgL0dBSURPWitDb3VyaWVyTmV3 UFNNVCAvRmxhZ3MgMzMgL0ZvbnRCQm94ClstMTIyIC02ODAgNjIyIDEwMjFdIC9JdGFsaWNBbmds ZSAwIC9Bc2NlbnQgODMzIC9EZXNjZW50IC0zMDAgL0NhcEhlaWdodCA1NzEKL1N0ZW1WIDAgL1hI ZWlnaHQgNDIzIC9BdmdXaWR0aCA2MDAgL01heFdpZHRoIDYwMCAvRm9udEZpbGUyIDE2IDAgUiA+ PgplbmRvYmoKMTYgMCBvYmoKPDwgL0xlbmd0aCAxNyAwIFIgL0xlbmd0aDEgMTEyMTIgL0ZpbHRl ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBxXp5fJTVuf9zzvvOkplMZsksmZkkM+8MWSchISEh QEgmZGGJyBYgQSJJIGxCIQa0aCvR1qoBBfcFWvjU2lZRmSSICdiCLVq5qLggLqUX9GK9V5tqe8F7 byF5f9/zTlh72/vnb948Z3nOc7ZnO89536y/eUM7JVIXSRRdsqZ1HWk/bxmy95bcsj4YrycmEhm2 LFu3fE28nvwEkW718tUbl8Xrvmwie3RFe+vSeJ0uIC9dAUS8zsYiH7VizfrvxuteGfnY1WuXjLT7 MD6lrmn97sj8dBL14Hda17TH6SM/Q569bm3n+pH6CuTl625uH6FnjUSmHineSKr6QJ9WZEgtLETT 6AekI042KqB5RNJO3QKSURftOqLcY68+sNhafs6YYNS6PZ0xW1vXa+Z3f6Ia/rZNPm+MoCFBoxcU 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 CykDJPPiqMVMeHE/ymD0JrU/qxkCjk8Rl40pZBIuxdAku3Z15g8i4teO9xT5xb/dI3RDtxEqIySu /YbDePsvzsFrfxYgJO2baR1NwXeR+FeK2fjCjCsx6B0jffTiBJ1SNa1m5sJI9doNN69sv/n69ltn zZ3RQP8PaUbwBAplbmRzdHJlYW0KZW5kb2JqCjE3IDAgb2JqCjc3MzcKZW5kb2JqCjggMCBvYmoK PDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1RydWVUeXBlIC9CYXNlRm9udCAvVFlISENGK0NvdXJp ZXItQm9sZCAvRm9udERlc2NyaXB0b3IKMTggMCBSIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGlu ZyAvRmlyc3RDaGFyIDMyIC9MYXN0Q2hhciAxMTYgL1dpZHRocyBbIDYwMAowIDAgMCAwIDAgMCAw IDAgMCA2MDAgNjAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNjAwIDAgMCAwIDAg MCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAKMCA2MDAgMCAwIDYwMCAwIDYwMCAwIDYwMCAwIDYwMCAwIDYw MCBdID4+CmVuZG9iagoxOCAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1l IC9UWUhIQ0YrQ291cmllci1Cb2xkIC9GbGFncyAzMiAvRm9udEJCb3gKWy02NTYgLTQwMyAxMDc0 IDExMTldIC9JdGFsaWNBbmdsZSAwIC9Bc2NlbnQgNzU0IC9EZXNjZW50IC0yNDYgL0NhcEhlaWdo dAo1OTUgL1N0ZW1WIDEyNiAvWEhlaWdodCA0NjIgL1N0ZW1IIDEwOCAvTWF4V2lkdGggODIzIC9G b250RmlsZTIgMTkgMCBSID4+CmVuZG9iagoxOSAwIG9iago8PCAvTGVuZ3RoIDIwIDAgUiAvTGVu Z3RoMSAzODQ4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Aa1Xa2xU1xGes/fuy16v vcZru14/9vqxZr0vP9brfWAw9u7GFEpNTJNdSgHLDzDF2NimELVR3AdK5dAmIZXVVKmEqghFtD82 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 OfVsnMLZeEH6BZL4p1x7c1HgmsvFQ4JP3LOvwys2ZPpDgD0EqYYgEvu/YcagVJINWnPoudbQcwE9 F9BzAT0Aj/DZED434HYHcBX8T/zUglfPKa6L3IxHUCreS0QjyV2eeKQr+b6jduKXE8OzA9t8X69s /ZauLvtafm37wcmR9M7ozt7HuH7cuykfkt9BBp7IVQ1FqxqoFDCIq0e1ilUT32rutVvNzvljzxXq +7eaHbMtOS+70HkE9DjoMIi95EuvBkr50mt88NLjNFBPq8y3kV90rxXyGH8PqDegItq4gmev9Q7u /k2jO5b966uHX/Ip1QfikXDiQKS3NyKNsKf36NjAvu3+LzwVDm6e+nY5/glisba/JZBRfDbVJ/s7 ei3Xy3sXgpfwz2Hl+52+iJ+HQXxPPg6poFIQPwYUJ9qb7u/vS3r6Jk9Oj49O+3onj6k/cfe/PIOY 2QPib9RDIP7nmgM9BzoPyoCuglbuaQ/6tN4XOE0P8i15vCeP35LHj+fx/O+4Uf/xPJ7t2zg+ncfP Mv9viJ461AplbmRzdHJlYW0KZW5kb2JqCjIwIDAgb2JqCjIzMDMKZW5kb2JqCjIxIDAgb2JqCigv VXNlcnMvZmVlbGV5L2dhbWJpdC93b3JrL2c2L2dhbWJpdC9mb28pCmVuZG9iagoyMiAwIG9iagoo TWFjIE9TIFggMTAuMTIuMyBRdWFydHogUERGQ29udGV4dCkKZW5kb2JqCjIzIDAgb2JqCihncmFw aHZpeiAyLjQwLjEpCmVuZG9iagoyNCAwIG9iagooRDoyMDE3MDgyNDEyNTI1OFowMCcwMCcpCmVu ZG9iagoxIDAgb2JqCjw8IC9UaXRsZSAyMSAwIFIgL1Byb2R1Y2VyIDIyIDAgUiAvQ3JlYXRvciAy MyAwIFIgL0NyZWF0aW9uRGF0ZSAyNCAwIFIgL01vZERhdGUKMjQgMCBSID4+CmVuZG9iagp4cmVm CjAgMjUKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDE2MTM2IDAwMDAwIG4gCjAwMDAwMDExOTIg MDAwMDAgbiAKMDAwMDAwNDMwNyAwMDAwMCBuIAowMDAwMDAwMDIyIDAwMDAwIG4gCjAwMDAwMDEx NzIgMDAwMDAgbiAKMDAwMDAwMTI5NiAwMDAwMCBuIAowMDAwMDA0MjcxIDAwMDAwIG4gCjAwMDAw MTI5MzEgMDAwMDAgbiAKMDAwMDAwNDQ1NCAwMDAwMCBuIAowMDAwMDAxNDQ1IDAwMDAwIG4gCjAw MDAwMDE0OTAgMDAwMDAgbiAKMDAwMDAwMTUzNSAwMDAwMCBuIAowMDAwMDA0MjUwIDAwMDAwIG4g CjAwMDAwMDQzOTAgMDAwMDAgbiAKMDAwMDAwNDg0MCAwMDAwMCBuIAowMDAwMDA1MDgyIDAwMDAw IG4gCjAwMDAwMTI5MTAgMDAwMDAgbiAKMDAwMDAxMzI5NSAwMDAwMCBuIAowMDAwMDEzNTM1IDAw MDAwIG4gCjAwMDAwMTU5MjggMDAwMDAgbiAKMDAwMDAxNTk0OSAwMDAwMCBuIAowMDAwMDE2MDA3 IDAwMDAwIG4gCjAwMDAwMTYwNjAgMDAwMDAgbiAKMDAwMDAxNjA5NCAwMDAwMCBuIAp0cmFpbGVy Cjw8IC9TaXplIDI1IC9Sb290IDE0IDAgUiAvSW5mbyAxIDAgUiAvSUQgWyA8MTI3ODk5YmE1MzNk ZGM5ZDU0MDRiZmI4OTY5ZDJiOTI+CjwxMjc4OTliYTUzM2RkYzlkNTQwNGJmYjg5NjlkMmI5Mj4g XSA+PgpzdGFydHhyZWYKMTYyNDEKJSVFT0YK --===============3862614507057108621==--