[llvm-commits] CVS: llvm-www/pubs/2004-01-30-CGO-LLVM.pdf 2004-01-30-CGO-LLVM.ps

Chris Lattner lattner at cs.uiuc.edu
Fri Jan 30 19:25:03 PST 2004


Changes in directory llvm-www/pubs:

2004-01-30-CGO-LLVM.pdf added (r1.1)
2004-01-30-CGO-LLVM.ps added (r1.1)

---
Log message:

Initial checkin of the final version of our CGO paper.  finally!


---
Diffs of the changes:  (+8294 -0)

Index: llvm-www/pubs/2004-01-30-CGO-LLVM.pdf


Index: llvm-www/pubs/2004-01-30-CGO-LLVM.ps
diff -c /dev/null llvm-www/pubs/2004-01-30-CGO-LLVM.ps:1.1
*** /dev/null	Fri Jan 30 19:24:19 2004
--- llvm-www/pubs/2004-01-30-CGO-LLVM.ps	Fri Jan 30 19:24:09 2004
***************
*** 0 ****
--- 1,8294 ----
+ %!PS-Adobe-2.0
+ %%Creator: dvips(k) 5.90a Copyright 2002 Radical Eye Software
+ %%Title: paper.dvi
+ %%Pages: 12
+ %%PageOrder: Ascend
+ %%BoundingBox: 0 0 612 792
+ %%DocumentFonts: Helvetica-Bold Helvetica CMSY9 CMTT9 Times-Bold CMR9
+ %%+ CMTI9 CMBX9 CMR6 CMMI9 CMTT8 CMSL9 Times-Italic CMMI6
+ %%EndComments
+ %DVIPSWebPage: (www.radicaleye.com)
+ %DVIPSCommandLine: dvips -o paper.ps paper.dvi -t letter
+ %DVIPSParameters: dpi=1200, compressed
+ %DVIPSSource:  TeX output 2004.01.30:0651
+ %%BeginProcSet: texc.pro
+ %!
+ /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+ N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+ mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+ 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+ mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+ exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+ N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+ /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+ /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+ array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+ df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+ definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+ }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+ B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+ 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
+ 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
+ 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
+ sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
+ rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
+ gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
+ /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
+ /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
+ A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
+ get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
+ ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
+ fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
+ {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
+ chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
+ 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
+ forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+ /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+ }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+ mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+ 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+ index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+ /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+ (LaserWriter 16/600)]{A length product length le{A length product exch 0
+ exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+ end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+ grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+ imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+ exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+ fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+ delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+ B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+ rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+ 
+ %%EndProcSet
+ %%BeginProcSet: 8r.enc
+ % @@psencodingfile@{
+ %   author = "S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry",
+ %   version = "0.6",
+ %   date = "1 July 1998",
+ %   filename = "8r.enc",
+ %   email = "tex-fonts@@tug.org",
+ %   docstring = "Encoding for TrueType or Type 1 fonts
+ %                to be used with TeX."
+ % @}
+ % 
+ % Idea is to have all the characters normally included in Type 1 fonts
+ % available for typesetting. This is effectively the characters in Adobe
+ % Standard Encoding + ISO Latin 1 + extra characters from Lucida.
+ % 
+ % Character code assignments were made as follows:
+ % 
+ % (1) the Windows ANSI characters are almost all in their Windows ANSI
+ % positions, because some Windows users cannot easily reencode the
+ % fonts, and it makes no difference on other systems. The only Windows
+ % ANSI characters not available are those that make no sense for
+ % typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen
+ % (173). quotesingle and grave are moved just because it's such an
+ % irritation not having them in TeX positions.
+ % 
+ % (2) Remaining characters are assigned arbitrarily to the lower part
+ % of the range, avoiding 0, 10 and 13 in case we meet dumb software.
+ % 
+ % (3) Y&Y Lucida Bright includes some extra text characters; in the
+ % hopes that other PostScript fonts, perhaps created for public
+ % consumption, will include them, they are included starting at 0x12.
+ % 
+ % (4) Remaining positions left undefined are for use in (hopefully)
+ % upward-compatible revisions, if someday more characters are generally
+ % available.
+ % 
+ % (5) hyphen appears twice for compatibility with both 
+ % ASCII and Windows.
+ % 
+ /TeXBase1Encoding [
+ % 0x00 (encoded characters from Adobe Standard not in Windows 3.1)
+   /.notdef /dotaccent /fi /fl
+   /fraction /hungarumlaut /Lslash /lslash
+   /ogonek /ring /.notdef
+   /breve /minus /.notdef 
+ % These are the only two remaining unencoded characters, so may as
+ % well include them.
+   /Zcaron /zcaron 
+ % 0x10
+  /caron /dotlessi 
+ % (unusual TeX characters available in, e.g., Lucida Bright)
+  /dotlessj /ff /ffi /ffl 
+  /.notdef /.notdef /.notdef /.notdef
+  /.notdef /.notdef /.notdef /.notdef
+  % very contentious; it's so painful not having quoteleft and quoteright
+  % at 96 and 145 that we move the things normally found there to here.
+  /grave /quotesingle 
+ % 0x20 (ASCII begins)
+  /space /exclam /quotedbl /numbersign
+  /dollar /percent /ampersand /quoteright
+  /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+ % 0x30
+  /zero /one /two /three /four /five /six /seven
+  /eight /nine /colon /semicolon /less /equal /greater /question
+ % 0x40
+  /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+ % 0x50
+  /P /Q /R /S /T /U /V /W
+  /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+ % 0x60
+  /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+ % 0x70
+  /p /q /r /s /t /u /v /w
+  /x /y /z /braceleft /bar /braceright /asciitilde
+  /.notdef % rubout; ASCII ends
+ % 0x80
+  /.notdef /.notdef /quotesinglbase /florin
+  /quotedblbase /ellipsis /dagger /daggerdbl
+  /circumflex /perthousand /Scaron /guilsinglleft
+  /OE /.notdef /.notdef /.notdef
+ % 0x90
+  /.notdef /.notdef /.notdef /quotedblleft
+  /quotedblright /bullet /endash /emdash
+  /tilde /trademark /scaron /guilsinglright
+  /oe /.notdef /.notdef /Ydieresis
+ % 0xA0
+  /.notdef % nobreakspace
+  /exclamdown /cent /sterling
+  /currency /yen /brokenbar /section
+  /dieresis /copyright /ordfeminine /guillemotleft
+  /logicalnot
+  /hyphen % Y&Y (also at 45); Windows' softhyphen
+  /registered
+  /macron
+ % 0xD0
+  /degree /plusminus /twosuperior /threesuperior
+  /acute /mu /paragraph /periodcentered
+  /cedilla /onesuperior /ordmasculine /guillemotright
+  /onequarter /onehalf /threequarters /questiondown
+ % 0xC0
+  /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+  /Egrave /Eacute /Ecircumflex /Edieresis
+  /Igrave /Iacute /Icircumflex /Idieresis
+ % 0xD0
+  /Eth /Ntilde /Ograve /Oacute
+  /Ocircumflex /Otilde /Odieresis /multiply
+  /Oslash /Ugrave /Uacute /Ucircumflex
+  /Udieresis /Yacute /Thorn /germandbls
+ % 0xE0
+  /agrave /aacute /acircumflex /atilde
+  /adieresis /aring /ae /ccedilla
+  /egrave /eacute /ecircumflex /edieresis
+  /igrave /iacute /icircumflex /idieresis
+ % 0xF0
+  /eth /ntilde /ograve /oacute
+  /ocircumflex /otilde /odieresis /divide
+  /oslash /ugrave /uacute /ucircumflex
+  /udieresis /yacute /thorn /ydieresis
+ ] def
+ 
+ %%EndProcSet
+ %%BeginProcSet: texps.pro
+ %!
+ TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+ index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+ exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]/Metrics
+ exch def dict begin Encoding{exch dup type/integertype ne{pop pop 1 sub
+ dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}
+ ifelse}forall Metrics/Metrics currentdict end def[2 index currentdict
+ end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{
+ dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1
+ roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def
+ dup[exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}
+ if}forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}
+ def end
+ 
+ %%EndProcSet
+ %%BeginProcSet: special.pro
+ %!
+ TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N
+ /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N
+ /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N
+ /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{
+ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho
+ X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B
+ /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{
+ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known
+ {userdict/md get type/dicttype eq{userdict begin md length 10 add md
+ maxlength ge{/md md dup length 20 add dict copy def}if end md begin
+ /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S
+ atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{
+ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll
+ transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll
+ curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf
+ pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}
+ if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1
+ -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
+ get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip
+ yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub
+ neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{
+ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop
+ 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
+ neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr
+ 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr
+ 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4
+ -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S
+ TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{
+ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale
+ }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState
+ save N userdict maxlength dict begin/magscale true def normalscale
+ currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts
+ /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x
+ psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx
+ psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub
+ TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def
+ @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll
+ newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto
+ closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N
+ /@beginspecial{SDict begin/SpecialSave save N gsave normalscale
+ currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N}
+ N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs
+ neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate
+ rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse
+ scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg
+ lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx
+ ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N
+ /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{
+ pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave
+ restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B
+ /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1
+ setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY
+ moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix
+ matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc
+ savematrix setmatrix}N end
+ 
+ %%EndProcSet
+ %%BeginFont: CMMI6
+ %!PS-AdobeFont-1.1: CMMI6 1.100
+ %%CreationDate: 1996 Jul 23 07:53:52
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.100) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMMI6) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -14.04 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMMI6 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 104 /h put
+ dup 115 /s put
+ dup 116 /t put
+ readonly def
+ /FontBBox{11 -250 1241 750}readonly def
+ /UniqueID 5087381 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+ 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+ 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+ B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+ 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+ D919C2DDD26BDC0D99398B9F4D03D6A8F05B47AF95EF28A9C561DBDC98C47CF5
+ 5250011D19E9366EB6FD153D3A100CAA6212E3D5D93990737F8D326D347B7EDC
+ 4391C9DF440285B8FC159D0E98D4258FC57892DDF0342CA1080743A076089583
+ 6AD6FB2DC4C13F077F17789476E48402796E685107AF60A63FB0DE0266D55CF1
+ 8D0AD65B9342CB686E564758C96164FFA711B11C1CE8C726F3C7BB1044BBD283
+ 9AA4675747DF61E130A55E297CA5F0182A3F12F9085AF2F503481071724077A9
+ 387E27879A9649AD5F186F33500FAC8F7FA26634BDCE1221EC0ED0E359E5EA5E
+ 6166526FEB90C30D30099FBDC1BC2F9B62EFEEC48345160804AA98F8D0AA54B7
+ A480E715426651865C8E444EDB798C7E11040AF6E5A7ED1888653C6DBF5E6169
+ 70BCD9C063B63B561EF165BF3AF11F8E519F37C6FDA2827685739DE2C48B5ADE
+ EE84F067D704D4511DBFA49E166D543CFD9ECD7417055D8A827F51E087CD2927
+ BAFC7E6CFBD70B0FE969F890A11149D3D44D422C3370495DA9951AEE7253A49F
+ 3A9444C8CD9158D84117299F7F2332FEB0F94E6ED8BC7AA789A3219BC2F227D3
+ 3B5BC75FB53B55D72AF4A6A7BB613FA235B11BB37D059FD87127CEF73D5B3FBF
+ 9F91ABAD78BD9240BD9525EBA78095EA0BDB25D1A19E876F292882EAD5619D46
+ D20317A345D931F4FF4EAE6216C27044CBA525E3B917CEA25A04C120466C4B93
+ FC720E6BA832A06CCA0A3916CEF0968D49085AEBD243C41A448289A6F05CE3F5
+ 79148DC112A3CC7E8FF810B8C1A09E05F496C0F1EBA334E42E05C376C98F5F69
+ C06C71BFC0A2F3AC9951CFBB143C66FB84F9C4ED27DF70869352D61BD5E11508
+ 0797B87C774354F518712BED10630585E99E1C29B15CE456B91F6B436B3DF227
+ 48FCF196D59D9E4387069AB9ACA28A30765A92E743265BADC90E7E4FE648A8ED
+ 7C48FCF8858C21728C701EB8B7AF14F029CBA75374624C80F58823D631331CD9
+ C0E98E3F85F7590156692D0FFC03A84F59E93BABA36BA451C648A70766F4FAF7
+ 268FDE48AF9B68586811848A6C6723C5C3A145044C14DCB8389D5A2EC9A9B2CD
+ 5157F034C1818B90DAA641E7A8A48DA311DC2E7CCDD0E4C4B848BF46802079FC
+ F3EC6C176DB011F7D0072A64863024AF7F05D27CE22BD5E7F9C6A2A3135F1971
+ FFDDA47D88B13D28E3CFA59664F000FD3A2B13F9A5213CC22AF6E8B5733A393D
+ A58B7820740E6AD8337C4FA1CC3C5F41D0FE4F6849377A49C3DAB12ABDF361D6
+ 2717EE125EBEADE24C4DAEF5E3E41E69CD654D43560C64808BF4C0114B01552E
+ E7E1DB88CEA6A72575FED193A0014F93B54C9B21D5D7A8499E119CFE9C0418A5
+ 0AE00CB24F89ACBDEABB82B70E4AF5A5D266A835295202956C8A8F54FB36BCA9
+ 75EB132AA18212C8D7DE517605F70DEECB3DCB97D05037F12CE5692A59C0140F
+ FB4A7A112E7A4C21B88BA3D33D4826D6D2F036FACC0F808AF97200A7612CDD70
+ D695AB4022466564D7356657C76A519DCE0CF991F5B5491FEBB090D5B270356D
+ 0CCC2CF062A562C096511EEA9ED06286D3064144A89FAA49B9A73098A7A1FBD4
+ 9FC6B0632468F7771DE5E2D9C67B3B7348F5BEE1E339CA2B66B832955D5E7E52
+ CCE3F1D61DBF7519FDB722DA6B19E16B588550C7E73A5DFCF1E44E0E4F3176DE
+ 366AAE4E6F4DFCB8CB78FB656949063B5BADBEB405C4578CDE9618A4F1E94F00
+ CFB0F6C2B30690E8E5809ABB626DE58801F481B460050CD6C1E6F2A72AA79853
+ 852DAF38E062551C86099C32D4DE97BD45F7C4F68EFE2EA3C593C94FB1D6F1ED
+ 34CC82E6ACC5E693A8D05B1D0FDAC7D920F9CBFF72F25BF7501B4118FB46E593
+ 081751B0258136CD208CFCE1DCC6E4D488036A9F78AB7535545A12913B7B2E53
+ 3AAEBEDE222365AA97
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ %%BeginFont: CMSL9
+ %!PS-AdobeFont-1.1: CMSL9 1.0
+ %%CreationDate: 1991 Aug 20 16:41:23
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMSL9) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -9.46 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMSL9 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 12 /fi put
+ dup 13 /fl put
+ dup 40 /parenleft put
+ dup 41 /parenright put
+ dup 43 /plus put
+ dup 44 /comma put
+ dup 45 /hyphen put
+ dup 46 /period put
+ dup 54 /six put
+ dup 56 /eight put
+ dup 66 /B put
+ dup 67 /C put
+ dup 69 /E put
+ dup 73 /I put
+ dup 75 /K put
+ dup 76 /L put
+ dup 77 /M put
+ dup 83 /S put
+ dup 84 /T put
+ dup 86 /V put
+ dup 88 /X put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 120 /x put
+ dup 121 /y put
+ dup 122 /z put
+ readonly def
+ /FontBBox{-61 -250 1150 750}readonly def
+ /UniqueID 5000797 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+ 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+ 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+ B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+ 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+ D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+ 9429B9D40924DC059325D9D4CC0344F3F997A99E6CC0676735EBCD685AAC9142
+ 08DAFEC78BB41AFC2F1C219910BDF41D6279284EF600B69776CA15BC8A34347C
+ 30783C5D479C203738F62EFD2B5B2E4411A9E9B1B2D1062E3E115E0B0A27F7D4
+ B189B800FD287297D86CAC19A7E78541E5DB5B518DD757D0412CFA5CCA38AD55
+ 111D0E1D779819A83100AD907EE41C6039B64502BD92D4E720EE46DA8C5FFB58
+ DD34C4123DBF588726E01FB3EB389F02B041F752811ECBB8A808008A4E48EA11
+ C1D6C0351461EE08AADEBC932102C6DC259F56B14D408A4A565061B547A1D97E
+ 41E364802889380AE998A80611C1906D5187732BE0BF0FB1E460B6F569C6E1DD
+ 7C627D6577387FAD7A819AA83868916F251DCC25C015EC27CD8943A81511F9FB
+ 34B8BE2AB72AD659A61EFB9BCF0502DE0A99C24BE1119B6D1C8E6E305187D1FD
+ 353F808B8425E04C04C5C64A87289DECF8BD576E9A57627938BCF7681BA7D1DB
+ 953556F92472A07851F01AAA08139761939C4D79BF3910BF10434729D6461061
+ C3C76F898F8322B982CEA71F5E4F385CD457F84F58EA00F5F560C815D62C2B78
+ 96A5F48BF55B2FA5437B7ECB49CD6D72355A2B401945E1CBFB0F203E19CD384E
+ C1555EB30C93FD7EE042F4BC7A85B5A9D8A9F9244093919954F5874C627A6E3C
+ 819DF33C5A46E851536CDDC8F125D8700496D3FB5AC1DF7E809C01EA71DA655F
+ 2B2974626D7EC1D4B56E0E8FAC5B739A2DE69A90A733DF8E98FBB11D9AA75DC4
+ B7C084AB034878D9A72C83F80BF014B243B2FD2432035FA2828A2B260F63FCDC
+ F00F334E5A22A1A816C52730C67883839F3229F583420FA82395D8EBF0C83089
+ 93B95CE8CF40E62F33047719F88DB2E09CE7B808B264A70FB73511F304111990
+ A461857FC1242782D2AD81D0E5E72253776F4B0BED4821F561946664A275AAAC
+ EAEE954A7B2FD49C71B9BF1F81E3A637AB35A3901F41A1FA62DE0ACA73CAB55A
+ 5B7F986C77A0EA07DB43A402F7DB2970B09BFB12BB1DD22ADCAA9E29E1C2B7A8
+ DA86BEE28D126A718E8FEA3ED8879382EA8574DF33F15BA1364FA57C0E799A1C
+ AEB025E7B90B08C4179F11144015566ED8C4F3B562E0D14F84B9210A90635500
+ CB2E5513B61869CBEEC761174C4BDF6C1C72FA75FC80E73F967D4EA7B839C963
+ FA713F481B4D5AE1111F68858A62446A96B2BEDB68C73C8BFAA2359122B70F34
+ E3F02B5685FB569C3CF9A056D3C8806308C90859C0531EB2ADAA1B0ABAA039B3
+ 21D1D1783AB795F992747DC9D192FBFAFDF3D8EFE4909D84C741F0FFA55EAE2C
+ 91EFBA7DD21758D9DD06BB1718833CAF261CE4DF453AEC914FFF6FAB85B17490
+ 27EA745670F3F4579AA8223A9D94859C5B91B660020F79D57EE73D27DA6DAA98
+ 00B84EB4EBB1C3130869FB40A572DE25FC5707CE84885E66DE2CC8879F471C48
+ 5DF6406ECA752EAC2FE83732BE071EF213E902340E99795A52BC0DB579A142E0
+ 3DBDAC6F86407EF014C098FF5D29A600D0B928BCA5A94E1AA9AF7760B6756AE1
+ FD0E8BEE5A1D6C14F12D721C974E62EE79E340A7AED3CA4371FCEA631C7C086E
+ 922669A1041214EEE71CDEE5191CFE17E3FB966EF073EBA55DC1E3561C684A81
+ 0F7BEC263DF479A3D934B3B3E4341C850B8639199EFD7CE3E5422CBEC7330BDF
+ 917531EC6276B181E02E85F76AA217C0696F19DF55E90899F23E97AA7EE5F305
+ D26BBFC676EC5FC457FC71543808311AD3B7E150672F8B49603622E88B07EC13
+ 7AAF49538A2E40753EF93CF18D2BA578DD70B1B9A10973B630A07B62AD6BE325
+ BB91F4FBF417DF7EA7D5624B3DF17F2FF26E91833CE899AD5171599A1C85FA31
+ A04C8D2D2813C67F642F147F6F6FF3B68A5EA027D668A802E7D65BF69A73E7AC
+ 6F863DD56EC19A37FDB0E9FA485DB2181F0A0D9E6EB55E5122989EF26B528FFA
+ CF391385D7EED20AB0F1963D27FEABD3EE06FD6E0D82F40D298986A21E9D5741
+ 50BB9011CB972739DDFF52160711B2E9978A0E22B02B1E4F387CB7F0EACF14A1
+ D808F1583F9F09B3833DD3F81399764EB1DB376943CE5603C465F30F1BC5DA43
+ AB2675D3FF36D1FEA937FF05A32DCFB370D2F2429B8D3DF3D5344226B575FAF6
+ F2D256DC7B93E77DF6D9C93AE1C99768A6882E44E0BAD09BA4377307BF051EA0
+ 6ED6EB74E85F0DA3C369F1E73DE480B8F5746C5886D72FC563E0D51EEFB49DE5
+ D97224B0524C7AAD4670FEBB3DFA5A3740DF7AA9664946C39F77AD14F7C47051
+ EC888037B361F5B1091676647BEC3514FA04E3D67F0D176AAE63E36FF5D5EBCD
+ F0E6C2C461247C172DE41E2A011C15B60970400955D1D77BE070A846D74D729F
+ 189202BC178AE858B67C650F13A2CBBEA046AAA23F7CB1EE0759FEE3BB1958D7
+ B45DA658C28847D542B1750F460702A2BC5AF8FD37384AA62CEC6464D5C3597E
+ BC1C5B66EEBA9A0AE6029363D07B8B367A1B575456578E3AC613C396DF7AA79E
+ 134A495B78D3B8B59CB6DA9E7DF74662F1DD494BFF7C011024AC91B5F452FA1C
+ F710675A0EF7BBCF53AB1A99DCFD083BBE1EAE1A4AB92D31AD424B169B589FE3
+ 0D8E2D73EEB6C6EB12A77EC00FFE5FCFA6780358B8F563A6382520E32D8B0D9E
+ B44121AD27FCE3054C15C3C08FEA15D0C7AA72FC999D313C99B00035CA7A699D
+ F174F951ADD696CB7AC9577E345D1CEF8448ADB8896AA8FFA914F1872CB1BF02
+ AFE51AB15365A47C803D3BA195906B187D2E55037CCEA6841352A9A5A69D9BCF
+ 93DB39DA763D4931A9787CED904E34E7EF6F77291FDAE5991E875C9110052F0F
+ 47B19D8E526E2B2BE7C72C8ADFCF9077D99BA17EA7BCD4ED7FA8D6C4153615BB
+ 19EBA70089FAF08385CB7F88943F7A521B6B6526E0184203F19291FCEDB569E8
+ A869FDC4AC40329067034801997DB8E78E96FFEFCBC0F177F0AE0DE0F3E6F395
+ 8CA60E21294AE57B1334020065D0A094D47356D241224B5CED395645B07BD1BC
+ 80C908CB2D23B41919CB4B9EF5ECB70F78A5058F9B1419A820620C6974D9074F
+ BB530244B6A993717421FA55B81EC684BDA8C10C87E78C5B1FCB513D9472049E
+ C82EFE1BE38D53E1CEF7A0BCDDD55C3A7BB992DAF0BCB7F02B0F0E8A7BAA32A1
+ 62EE4DB9E4E98F48FEDA8E0412F33BF92AD8E50CFCE3204D22308C56C772471B
+ 69246E774A05672E08A4243A59C3717371E079746C27DA143936AACBD754819E
+ FE831269EA2304B4C4EA7115D0746B29AA15968EA1640B7F57D13AB39F0ED1E5
+ DC648280B274A225C7878978B0BC4A0B85D5976BC23C410A686E363ABF448DDE
+ E4887AC271AD5709D30C42B4E48AFE780D760F2606C89F5207BCFF90AC794256
+ 67197E747A2B11D3610C8B75C120656F1412EEC83464D1324AE3C6654BC269C0
+ 0F7D0B53677C63D5D0043490367B226F4DFE26EC6BF846AC2AC6428DD513AE50
+ 7ADA97E728611D882CFD2FB46ED686F563EE4A56A6ECAF8AD087B2E65AABBFC3
+ 6033E6A830F4B6430C4FA4549F62D4F1E687152C7003B1968D1906B215C6B0D4
+ C73B7DF245517D59915382C8E5E31EE4800E3B63D7F68977C0D33673C6558FBC
+ 93FA2E1035DF12635AAD27BC3531A4F41CD89D7BB139AE3DAFD09A7D314E4149
+ 3C37F9C78F991765B7D1D57C18EF190E94E6348347F020C0A15FC3CB916FDE86
+ 68E371BA87568D015035E6473E4B3C95D37DD03F4787D0B6E501BEFFDF0F4D8B
+ 58BF78C8DC4C3416D4F7A893877A069559262F31D0E2FF902C31100AB2C99F7F
+ B814C1FD8ACD3646A7307D210EB382A6BEDC8821A74E6E8A0B2B380A9ACB8B79
+ F493A11957467F528571CF29FC173CA8E46F3EEDAA4E7B0D792EB430A21C8B07
+ 5F806D8AD1F0664C3E0FEF70A217DCAD1957BD3914C986B956FBCE604D4AB00F
+ 41F0A01539F802791ADA9AC57DE0D54E2F91CDE0F51D8068529D21C7EAC508A4
+ 35C457A1162A2B05B1EE232948FCBC5F61109843F78DAC5A87EB94D55775A323
+ 427FC8DA79C6CA726716B1ED13E80770B270535FAE9C54E2507CCB38A518C9F9
+ DCCDC3989A1BB511A06EB8D1711F056A5743DCF3A54A9E565FB58697923D2484
+ C35A89B495884A139AF13508C85954AE21A89C71E1DEBB87316D8F3D486BE79E
+ F177FFF1823730A720D8566EB680B42E15D511D516B71E3ECF7B9AA0D865923E
+ 285FE43284535133CCC688157472FB5064DE2F305482E6F70818831DD5D0FD76
+ 51790189145E9F7B7313A4EFE90D6FDCEABE62127B701AC1BC3D571D7D4D732E
+ AB4DB24BA35AA44B1514836CB9FC8145E253400334EE1ADB633077EBD6455B6F
+ 9934FCAF043FA9E705963E86365DFC0696894B03398FE2B8222B6FD8ABFC26DD
+ FA0A8939BCB0DEF41C92C946292B440CAD5664372D59DF0E6B8FF9C5D47A4861
+ 3CF63814D3AE7251D734AFB8D7D11FFEAE5F2DA4129652052165A3A8E6AE7E8C
+ 9DBF4803B08D10AE6C4FF3720A02538D0D3E075739698EFBE3DC7D74B9011D79
+ DBCF14BCEFBCB7F88EC693C0C8836A101702F17B833A6C00EC1FF8F8BDBF7AAE
+ D59285FA189FDAD87119C65BDFF5EEF55BC814C3931189963EB48B1D25C3F043
+ D4AF5E91B6ACC30A05CD3D827FBFA981B0539CB2AF9ACFA15CED43DBF29E192E
+ 5A49114AFD451023241993FF1E3B6DE440E7CF679B771D76E047D8D04B8C7ABE
+ 5758A87E30CFEB15214FBD06F492E6B471B7B9B05FE7C1FF34064561B48ED725
+ D57F838129EDCCD09D54AF4A4768851AB9503207D9C75DA37928D31C5296CF85
+ 5EB2DE388B3D3C4557BBD5FBB2D3A3FB9D496532134F077C404EEC46A5733B7C
+ 742BD5916AD3EC5A3C36E990244BEB642E3233A5A1EA65A938B92E0E7B46EB32
+ 12A07A9459229D01B4EBD2DF6E31C241DF6314EEDBC7751F88986E2120C99F68
+ D4F3AD6F2DD18F316C11433E213FD800A6D80B020229F7C4D285A79994C13EBD
+ 3DA88EF55D42DBF3ACFCB3340BBF973D6CC53405477417CFDFB732420052E1D2
+ E8D296CE9BF47C93095FE8A05F0A3F3BA47435D76CBEB0295D775CCA99AEB0CC
+ 3BBA89613419C29ABE01FD025D7BD06BD45D2011AE6BE0CE0D6698796F2795EE
+ AD684EA2B27DFAA501D11694652CF2B9350D0DA3AB2096DD85795434EC46FE45
+ 4502DC8F7CE6EBA0A832FDAAF1E2CEBC9C6870D392F209E2164393B9CB114945
+ CBD38CB58DD317E5D3D63BFFA608A463FECCF462D914338424B33265F6C16323
+ 5F257F7F84688A47D08BE073998B3CF8657BCC47C4BEAE8CA9780BC889E0388D
+ 1976A140E18CC952AC654CEEDF16144607058D0A91C438391CA3F50BDB619F08
+ AE8CBF783CC7E6E968A78F69762000F5100AF0C6878499F24C7A5908B24E764D
+ FCCDF6F789A83007DBF64B145A9F50084C938138D4A36E0FEE0FD820B566418B
+ 81922D15795DCE165BF4360AC96FF5F20EF830A8C710D540E04C969E7A0D46FE
+ 9EEBB85D9EBFC8E8A8C930F20CFC0FA0E9AE95A91EC60CFA8BD9A112C0059A9A
+ 44E094A896B38ADEA7E2193F81200FA6BDB0C7E8ACA50A7A74F5E068F59C2752
+ 905DC77E8AC9F0B25F5B97B3906F2B3757B0B32D307355A576ECE039F5311D6F
+ 018C67D77B1A72B43789ED6BD5CD24CA4015581BA50E47F6D88BEF98DA31814F
+ 7E66B3FDB78E447F73BE6F1FB386E65277E5409A10B3A0F7852E5FCE8939B196
+ D3C5A360710F05F3C14DB5326E697BC5D87B569D6D531BFE47A7602419CC8B62
+ 3C014A964D00DD59A293B2A341EB91CB0713CBA10C2EAC4B93843D8AFAF0A4A2
+ A750909099439102F552D10F5D0362DE89E49FDF804F50AC076A1988F0A8E577
+ F974480D91159E424DFCE2C2773F903326A22FFB47EE1A2AF215CF023CBF0F3E
+ A0A93A10DCC000413BC2CB25F6CA4812AE2FC8FD461083C1C7708AFC159AAD03
+ D050F04D3E73B59272672C3CD61B434B96F6F1587302E83F9934C9D7E797C6F5
+ 33F72E1B620ECB266E38CD3B5FB3E77AD41C8F21836022E82314A913D9FD9C0B
+ 92E5C09BFC9E40E1DFAFE82FA0F559C889D5BDDC761A4418A501ACE7D787226A
+ 3AE3638DE4E12F5F75FA7CC895F312BA63CB837AE532D3658928D135423E5C3E
+ 4E3AF90F4F85B5AF3ECFF1E92854298F16D10177F71129E86BCD66265C62F6AA
+ C0659746F700548155E107097B17315E399D02AF5F24D3F45D5D5240FDCFCA92
+ D6C7D5DEFDF621E4960600D4250BC2E009D8AF43874B549AF3C414F52497A872
+ 148A661D116E7CD02D1A2F246F3CC30FC37713284C71913DB2496726306C9629
+ DAC9AE00D2F708F5093C0FDA33C09E8E53D00D8EC177458C64F53A0E6366837A
+ C0BAF1B750A0D152ED67AE7CCE435EC3CF8C4EE647F8DEE7F29A363C0E62C368
+ AB05555D087655815E1D671AC254F64869437EAE4B0B72972F299C4C6095A524
+ 756437ABC68CB93DF89210EA3BA6522419079F18714FA46784BEBBCE98C05450
+ 187A2A4A2FBE892ACE86483A396635D93A64788DCC8A6AD14F0DE2DD73EEBE16
+ 85EEAC86E94BC4F106C04001A88B90D88AD9A24E994195C6DF20A9179237791B
+ 62582CC3EF9AAD3F75BC6D86667289D35C94D4DE4A2655056EADC780A7857F26
+ 7A3BD068B5CB993C2F4F1315EBF9F360F15B763295A31F6AEBF485DD4211CA47
+ 451C8AABB10E3295F6317AC976AA0F60300EE5655DB604831927967F138C4223
+ 58579AAB2DEAEA3F633CD9E362F1A9473567DD056B785FD3DC2F90FFF11693CB
+ 8A34BE6DF28209A3A761A8BEF400D46E9A0DF887E0417C7BAFCB59EF77A3ECF9
+ 43F7C0EB28542B43BAAEE06943D6E5FCF85797855645076227B8F211909BD411
+ 5DF6813D1504B252C16C9037EC7CC0B23F8A022083722670CFC7B4E99F249FF8
+ 24C151472ABCBC64B61D918C0386FC44EA9E16CEA040AA07871C478016245EDD
+ 5362A88ECD4A94F0788A04E9BFA63A3614A0422C194B9390FAC69D670558BEA6
+ C13E1AF935D3CFCD1B69FEB85C45B854D199278CF0ACED3C2A52D569D48C9BCD
+ D78EA95F98CE3BA95E28432B3C2069A627CF4F9D5D85D8BE09AD0D6B89A8B676
+ 842E897078656041F1C023CB57EC87BA5AB58E6EFB672C537810EF46C208A0D8
+ 26D00B13F51A28DA5FF7B639DC6900BFC4993A1E8BB37EC26D4DAAA7307A1A12
+ 7D678F5FA5657C3C069FCC273B7FB60198FF5CEE3A6541C60656CB7E7245DB3E
+ 2864032F10C1CA5B138A53E5F92358E49D4A69F1286D44143FA915431F8E1814
+ D64FFA28EAE0DA59BB9BD417C4882A00E5CF590D1B907E0C5B3DD28CFCCD4BCD
+ 502D31AB61D7907F5CD81050E7C75D7CFD607E6066EAB011A5578490A842B831
+ B40BC4E282D28FA55FFD280CC03493D482A7E8877EBEFBEE6F653FC5423C6A38
+ 6F6F261B073F49B6E30D04663CCFE8B33DD672B3C79C4C23945EBA8433F10C03
+ 02F8167656EF6C681B74E1828CFEB835CD2B7B9635485401B9749727F0126BC0
+ F24401D2CD935B7B455FE1A08791298117E7D46F0D0722FD1D2E0DA55CE8A4CD
+ 689179240130C2D4F8835634BC1B6E4220ED01FF526ED4794D7E9171FDD3F0BC
+ 0EC3B6AE8B074B0E7F619777E1D955C91039A652650DA9F613B8E26EBAE96E61
+ D3A721F2DFB3AE504BF587C70C022FB575592C4B93D4E7391760FDE4113E43C0
+ F676F046EA28AF3AC1D02B4B838EFF0DC79FE5FDB5892BC7F7FBF02ACAAF1682
+ D9B5BB28EABAE575B67C26B8C033B95F513F81FF09451D6ADA6EA58D0E99B9F6
+ B1D7A4B04FFC91254B993356F38F05449E830744AE6F64F5B1792A4AE8D2CD23
+ 56E6CB0E9A68F3A8A118B6EFE818983A05EEB085DD7CEABAF5485D7777541759
+ FA396B191D4305387BCEC660A26CE9037B0B6A7F16D8A2DE148F290A92F55B54
+ 1BB5DB87FAA3E91D6A3DF821B1BFCEFB0189CCC2676B8F64311056850A23BF4A
+ 463BEB47B7C9A01CE3392FC4A8CA7276462E191BDBF48C53A2B2CA79D9E1568C
+ 9912024B74F86188FA901D0B739BE38B061B330971AF876952DD7F98A5AC53C6
+ F32A74C601B6951710934ECFC9B5A145A722ECE781FDA4757016464884128056
+ 2C082B51D52A801179E885DF2189D9C632104A405244A31D0B307750E580A3F1
+ B67F36AB3F790EF1271A28B29A168C28F408EA45922EF3AC77473DE1D92F0D15
+ 71F2AAB556E0BF237EC7A37EEEBD200ED5AFB080DD2C266D74390023B619180F
+ 1BCE01E8B027E8B98E902378DA16FCDC78579176577CCD1E12678D8C93599D9E
+ FD2479771FCE003F3F327E1CE29A1B5E89D730941F9378D3B1439775B7B07F30
+ 4C3ED284B6FED338752F8EAF1904B1485A1309BA485787CB9AA7FF3FCDF1F845
+ 8FD20276B7141F616032C01B157948ACAEE56C7695E13664FBDBBDD211B861AB
+ 99E47CA6C6DEAA71563F367DAD54D82336C10E005D2F44306AC702A7B846A799
+ 2C131582ED2B7D7C25FC7AA6D9D69BEFF052BF7E51DFC73C8F521F51DB2C9D60
+ 8CD0A0F53DDD33D614BBB58FBE22A5D6D9E2EC63D923B653D12309AD76C90785
+ 79650416D008B1E433832F7F56CB0958AF0B9C8A4589ED1FE4A0D008F55070F0
+ B350E6B9DB25D8996B5FBA5DB5A13BE476E3B77B849B232F759B951C0898E79A
+ 6E7D893851AF09F5403228A2C274005262827251C36FA22868BE25B4B866BC90
+ 7FEB45ED0813AD9BFC08D34F6CAD596FF74653EDD4C6EF8CE2F024A80F6AE095
+ D81195F11CDE5AE7710BFF160B89798EA06615170530845EF0B3AADBADAD83CE
+ 9B740706BB7528E6E8899F02C0A09FD33FC478906FEEC6282D5F8D9F6984F2DB
+ A4F4AB7E884F00F11B051ED8E3E7C020681EFED798DB1E57E1B71674507D85E1
+ 148D5A52A1483C090377D06948DB5883CD3ABBCC6AABA1DDBC01AE3B705325CB
+ AB7624EE889F4C2F6C56251BF4F977604E22E6FEF44C6BD9FB21A0C870892268
+ 217D44E6056DCD949B9E39EB81AABF5386449815BBEEDC2D0CCFF3A91EA63D8A
+ DBEAA7B81DC49E62D1B46F644144F6D1D282B01A6AE2BF4D46C0B167DB004938
+ 1728CE1307425739C21CE1D7D3CA864253B90ED339272052957DCAA0D7FFAB18
+ C49AB1D98056C6C5848D7919BB5FF5A0486E341491FCB4F0A18E292250CF5741
+ AAB9D24211BB6E9191AEA7CCBF3436F7F65F822900DEDFBFD948EF135766523A
+ 858DF9CCE14A8A80CD2557964B207A85C9D9C194C8192A5B5F1939F14FFB1560
+ 543DD19CD2672193D8DBA08C6502A4956FD366BA202F639FC2221A16DE847388
+ 273F5246D2FDBFA36C8826DDEA9FD86525ED72A43C2CB76F788D85DD189E0CC3
+ B224230D32607666EC7BE7164117009339B986C68CC6537176E2951FD92F7BD7
+ 6E9F5BA5CD182C341DF20DF7C8DEDCB632F7192F80FF9CD13493B3B8B0BB23F3
+ 77E1E8FE995A2020F238E1EB9E5CAB9741C8FEC02DD0320F771CFD3AEBD51E0D
+ CDF9B178FF11B537D9EFCD7DFE0B8B70778AD43C1549F2C0D90F0EFE1AA1A9CE
+ 122CE6C4457030EB7F4747B80EED1E499D74585C63EE7A72D7C793572D1B3D9C
+ 153443ED251F1BA697574A1136259D178A41E8EF9BA479F0C55CDC38108E51B9
+ F2EAFCA2A0E8D35CFD7DDD49AB1CB7DC4224FD72B3AFDDD1A215A4179072506A
+ FC4195FAF42EBC55BEB350E0724560F13B87284EECB8296A362526570600799E
+ E4EF0CAFD31D3F1C71D61C3A6214F8F39514DC4BABA99B6E6474A27451FA5F92
+ 34D3468B393C379CBEAD8B35D0217001DB4D56F0B47917E1AB188500E1CC93E6
+ 0CA77B8BD3EC66930048344D49E3DAAA178C8F242C2C443889711BE424392D61
+ 5B391E3415F6AD5474795881090EE55E5EA50DE0E08F391DB439E8353CD48A35
+ CE2D2A35060B265609A7F5FA76DE855E3932868CC91424B3855DE9AAC244BA2F
+ 8ACD28F7605ACD4D29B617A2245A72E06E39FDFE6AB8D3FB4DBA1EA80280539E
+ AA76ED8F63F79B00867EC0CF5B32B1792C7A0902C78E22F548A7983711E47190
+ DBB1FA8B8C933860BEC2640661D9667BB70B2AE644A75F8877526C6B394A4203
+ 4E239C9D0184F64503540878378AF90E98099A3E614D02774045D8E982E0FA1E
+ 1A5690FBB2D73DF7630351BDE77CCE2D717F67CD6BEA02955EBD04ADFFAC9429
+ 3A890276E2FCD7782D8C83FA87953197E2ADC2142B7EF76E72263FF81EEAA0F7
+ BE5CF5DFB78F3CA69A1ACA921134E9766EA16F00CB8CEEF893BFCB1B3F0BEA08
+ 66980CF9C1C85DA6C9F7DA7528AFE82E335A8575BA806EEC354F4EA631DCD3BF
+ 1EDB0F17D47057FC0A63387EADB664414EBE9E2A7DBB6EECCB4C1AC12FD09871
+ 9F1EACA82947C4D07582F9A641B627DA388585B79E9A9ABE6DA7D761A262DD2F
+ A52EFC6C1BE2436D8A8C5746D55B666391E83EE918482B5137B26BAEA96BE9C4
+ 5EB480CB7224E9B218AC6FF1000F8911DE604AF5AD1E22F7F93EE700C062563B
+ 69D24A210DADF527BA222448CE8B02AFF9D71EC1F0E3B83069725D4D524FEA70
+ 93477E63204538A5699370A5B7D82E0EDF794C0A9DEFB5773A45EA6A3F777E40
+ 21BB16AC2B3B1EC1AF1710ACA9CAB325B00E680B0C8C526BAF2DE407CF7098CF
+ 19718AD5898A44F49BF71D7F1DA42DDC3F7B1C9E5CA4A3022CBAA05034EF7285
+ 37D68DF28E0ED1B0F65717696110F143244EA15E22B7C1DB994FAB4069EC5BCD
+ 5330EF2EAA739871358E4E76D79BB99EC0D3AC040E7A2371ED56E68353F721E6
+ D93AE1A2C52E11324A3F4202F9C4C1353F2DEF0AADD286FE1B335D0E60BCB3EA
+ D8A47B673231F821883563D4E719528A6A5DB41E545675C5EBFEBF523A8B2203
+ 422B8C706EBCF6AFCAA3CC063A6BECB128B194B18754CFC75F709B827C50E74B
+ F3CBD9A186225E4966D1196A26557A165D6B281112C46B3A819005F32AFD4AE9
+ 94ADD14512095E0C4405D8AC2494EDD1A754B127DDDFDBA703A011E55F7250C4
+ 13256622AE94EDFFFE6150BAB5D6C1C32F8434879911621E2691DA6A47FF5824
+ CFA3EDA2FF69CFE4FE9B26C3DF96A48A4827CBEAB4C3C6AC653CE0ECC4098705
+ 276D3857FE34D97FA486719A9C68E8F7EF7F6EA5E9A27ACDABCD387BE80DB56C
+ 419EEAE9D7195F013733976CB3FDDE22083076711592ED7D4A48CE378DE21908
+ 189C5848AAE9C4FABC8520AEF076BE3A7CAA1CC72B358EDD743C465E87D3993D
+ C9FC9E2827B088F0C7B03F2FBAB316BAC0009064A402878126D4AED6D954C06B
+ 527770DB0F80EB8263A89804ADCB527948B997D1E51DE57B19ED6AF6A2CB5484
+ CDF0851D2E8950DB2E10AB1F70405113EE72FB0D1FB807D581EDFD80456CE9FF
+ 98A04A70AC1205AA73D5A04D7BA3DEEFB1A48EEA37F453B429AE0D540FE15F9F
+ BF575A8BCA51CE41C6A3944DBB060757F0A0F563099F757C7DDFCB8E448BEC81
+ F73FF9DA0ABA67DEFE2783ACF52EA54582AE39583498EA0C0A69AFA1F8F3A262
+ 50D8743A978026019409A647881B9E945DE8B11422BB82D51D00975128251825
+ 94993CD8D293C22D3DBD8CDBCB9766DFFA5B4786EC779AA8E364CA00AEE3C3D8
+ 0051F37E6CD5002CE969F71869C25D863FACF5C779580BC900356AFCEE4A606B
+ D1E4E85B490F56A844DAE30CD235B1CEE8748FEB1648537EAEFB575E2E61205C
+ 2D173507CC96B135A741750604B916489B0BF12CF98E4BB26AA4986452A40A15
+ C308978FE53E8ED11FCA05B34FC58ED62C4851B1E7300F788382245D7D12F94D
+ 743367BF4394E329C58ADAC5C531ACFBF6BEC3607A26202EBD96FB9B16D99B89
+ 1BBC2EA101B84FBE92C308A28A997B87E68824341BF04D898E658BDB140B0517
+ ACFA8FC82235BAEC9EF19765848A64D90C2EB2167F7F40D2A7AEE502501B5CF3
+ CFB065178CC031F0BA9F7999AD95A6052BF88C8C80AB44A41D1C7847ED116FE1
+ 5942B63DC3572AD46D499C66C7525B9D604A167C19436737CD6A72EA2AD132E6
+ 8FEE9BAAFCF74FBF08C1463ADEB963E5FA8760822186AAF3FEFBBA15D7970010
+ A738680A42F3743FC66B1B04643BFB6E1E5C10E490F5B9DEB2CC67AB591FBD2F
+ 5339C921F4107F9794EA
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ %%BeginFont: CMTT8
+ %!PS-AdobeFont-1.1: CMTT8 1.0
+ %%CreationDate: 1991 Aug 20 16:46:05
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMTT8) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch true def
+ end readonly def
+ /FontName /CMTT8 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 37 /percent put
+ dup 39 /quoteright put
+ dup 40 /parenleft put
+ dup 41 /parenright put
+ dup 42 /asterisk put
+ dup 44 /comma put
+ dup 46 /period put
+ dup 47 /slash put
+ dup 49 /one put
+ dup 50 /two put
+ dup 52 /four put
+ dup 58 /colon put
+ dup 59 /semicolon put
+ dup 60 /less put
+ dup 61 /equal put
+ dup 62 /greater put
+ dup 65 /A put
+ dup 67 /C put
+ dup 69 /E put
+ dup 70 /F put
+ dup 72 /H put
+ dup 73 /I put
+ dup 76 /L put
+ dup 77 /M put
+ dup 78 /N put
+ dup 79 /O put
+ dup 84 /T put
+ dup 85 /U put
+ dup 95 /underscore put
+ dup 96 /quoteleft put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 106 /j put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 120 /x put
+ dup 121 /y put
+ dup 123 /braceleft put
+ dup 125 /braceright put
+ dup 126 /asciitilde put
+ readonly def
+ /FontBBox{-5 -232 545 699}readonly def
+ /UniqueID 5000830 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5F0187316F83DDE3E2D27FCDF6C5CE4F95B6EE
+ 3317BD91B7921F3039DD35FEA387D5CFB6C6E9DC84C178F3432994FC7FAC6E5A
+ ED41A1E2EBA350178FBFEB45944511731BA827167DDAC238FC69A5486B995477
+ C469E2E27493B0B711DF8E267D3D5613B450011921685147114106C9472580BD
+ F531022F6DF5432B2A4EBC51A8032C7F9689B6FA942D849B29709631613DA68D
+ 4DF7B6F059A19304F40A3C3580CE3B51D79D42984194D4F178801720892FB6E7
+ 61FF43C63F9256B5E9F4227B1378222BAAD4D52C77462DF01892220E11129C16
+ 6C9E45BB9F01ED7C1AD5D8B4D72BE0E12969AFEA90FEF170603CDB91CB243173
+ B19A56084D10293B80A35275F41BF78A054DDC98F4A1FFF592463D944960FB31
+ 6BE5F03960F9B1F213CBCC7FD448657FE388F10104D42B0715FC9571CC60CF23
+ C72560CBB8835A0CA208FE06676B3B48B093CB7FB2C0C53AF17EC5B372A9771B
+ BFD52FFB7062B4FE0106A01A2A1A1DD4EF5C8C7623EC9324A2CB3B402FCC1FCE
+ 52BFC8662F8A39D5F1B41C97E7CE34E16AC28A1E94007AEA7D4C519399F1B7A9
+ 48FA7DDB671067244F09C29F95DD60668223F45BBDA8B1C452E930A9F3F341C5
+ 351D59EA87462FFB30277D3B24E2104D4AAB873BB2B16DA5B23BEE25BE2C8128
+ C4CF2F4F438A4E520CD932BAC455BF8775C27AEA6C73EED3EB2F8DB5E356AE27
+ 41B35C8AEFE73C4CD6A591AAE4F45762EBD6D3636C03F08C552BBFD0A13D11D5
+ 491F8369B4BAB8ED9D6F1DE7DB7AFD383986C4338D3AA71C9AF2B8A0955CFD86
+ 0345F16D9798B25156DDF826A7CB6A0CC4CB43078BEBD3E499DA95562A08EED9
+ 7CA27B7A0CE3FA7EBDAA87A606A7E954D2DBE3DC63F426480305650674FAA61B
+ 6B0A60D80DBBE6DEDB66F8B9A15A6DB718379EE8091168C8281268494C88558C
+ 09AFBAEB24A25CB93EB3674D0D2F410FC14B6EE6A95CA46BCC4DCB4697BCEDDA
+ 6B0B3D32E900546F76EC1DF215EBA85646FD39D99F79C16E7C4BD4FFB2EAC2A7
+ A586535FD1F502D197A1F2D1E72BB1D25495D1009779C1C43982595371D3A171
+ 65F430ABDB12D269DF94C0AEEB5C489D167C9AEDFE9227AF77EC01E94F82EE2B
+ F8484D21933806A890E51199D81E277C01A38C7F639F4A9530791391FAF056C5
+ A5E54BD665CB641E1BF8CD956B3D6466987A20F171DFA3EB1AA6C4BDDDC2F835
+ 2E0B80ECBBE12CA5DB2967310366C6FF863B35FD9E411A2632660DD5DCD4AF9F
+ A582F973AA60E1F06E485A78A412E1C1931A445A33859CD70E9B85E828E24AA1
+ 037D8974E2CE264F3A37642D56D944BCC50F14E98B9D34C2DECD7D062A2AAC8B
+ 39E82326570ED8838923344CB18FC4B11F1442550A77BDBCDEA92E1BD2BB312C
+ 239D5270CB90B5371D00A04A22788D0F6EAECDC64CA6C5E6417AD4CE98FD014A
+ 872DC627A5B3221DEC90CC0B17BA71D96EE003423BD405F87F761D5AC8CBF2A9
+ 916A67625C5BCFA786936D42F6E444343C6B1C182416DCBF65C04DDFF1A3C486
+ 66D9EF349344D043E3A4684F97D55A0ED42A61B5BAC8608AFF93A0C7ACB9B6ED
+ 6741E283B19642BF3ABF45ADBEAA1AA2DAE03EBEAE72AA9895E17553FD56CFF8
+ 966F8C89F85E4DABBDDE9CC44C3684422B43D8CCF4DD63B0A3AD4C32DD4A125E
+ 9C58D4BC97B4E935D738D734333E6E3C05037F59002C44F6FC7160CE8BB7F5D2
+ 0C1A3701934BFA35ABE15B8979BC2CFD64706364D0F341758E9D28395F531345
+ F7672BE08FC5A8B86AAE5C05173A3AA61386C6FDDFC21C2662FDB6F185B11BEA
+ 461141431B3D265A51071098726391F24BE51E0FE57498FDE091C3F83D51FBAC
+ 25DB0AF7E34F74A7EF0656F4D2037A87989C31D4FBFED08DCDE320EF750AC3A5
+ 45D766F9304C58C6A76AFA27A83A6632AF2C387EFDE6F9F276BAA430D161F021
+ 275BDD3AB4B1C09D717F3D7CE6AE842D666A4BC15A23876C65CCFBFE7E54E0C3
+ 81ED0630A2D0DC77CE8B74B4354E19FEEF87DBD3A240E26F0BFF705859B5FF0B
+ 23721E1B86EA74184198524EB487E50DE821D75A550E92DF5776235302C28A8D
+ BE9BCA39576EB3C4AA448EC8E0CA002AD0663D7F9B4383BDE0117BC8BDF178BF
+ 20C8998C691E3D2FB7934D59D9DE509369770A8F4B1A0E43266BFEB1753FEF03
+ 59776AF08C15D80F88A2E6B2576C7E46B694D8F27F41FE874E88476C160AE0D4
+ 5FB56A532432752712FA2E91E4D4B63AD9B4BFBED827FC79A75ECE4E1BA61D94
+ 681142179D3BEB5574A8CD65BCE71A53100F5401DBE3403EF8969DD7010FBAD5
+ 92601734E445534AD99225CA9BDED86FA985619DC41B131C8F5723DCA92C1270
+ F8CA62203F43508DAB05ED34F72A06ED53FF79BEBA867FF0D72295CEE913C847
+ 4AB38F907C9BC8C3096245829280449480BBBFFF598A0CC965103EBE119B49E4
+ 5E338973455B0BD3A6F8926749134F9DAB695AD556A5AD1BFEFE3AEA2ED71158
+ 992E2010B7D791020D453EFA55C6ABEC31BBD48D887E13FF759F9E2A1A7CCCB1
+ 35309ABE7C018AE0AB2FFEE5B11708DA263E27BE5237C77F052ECA61F309B1E5
+ BF9536ACFBE0C5F910F5932622172E4AB65662A0251E335DF8DC88A35EF48030
+ 5512122BEC126B899D44CFB96D576A4EB147C0AE7813D40CD712C5F4B024E488
+ D94C5ADC6BB459177D4CCC8BFF4F29A342C473DE591FAD6B8905E0880FB0ED74
+ 75CE26F8B9B33697C2299D8604E0F33709B9B83110DFF60E039772BAF095F0D6
+ F949305D79FA2CF46145FFF530314C95DF13A2EAF4EFEC047F64CC4A890D1676
+ 411A0CE46E53FFFA6779AC72C89BED6CF1778037D16D20AD13EC597820C65EAB
+ 08DD4FC9E0B3DF184D199A17459662F48EB1743438796BF008D0A8388FAF99DF
+ 3B4482DE3E42C74C62A1D36CCFC83DF1DB153E65DF75AE5E8F9210EEF831FDC5
+ 864252F2E38BF5ED4C3D40A51682B1B5B64D88859CCD5FF643A72841EE32470A
+ 3380ED2B6048D026238D9F1052C18B69C7B18CC6BC052EB252687CF37425376D
+ F807C8EA08A78A3D65B7B7EAD48BC394496B4D75722C9F55365251C54677B9EB
+ 0FC114BDD07F04B64DAE8709B6F4080EE22685DBD3B3427416414E5267782C7E
+ 4AF0284DE4145230E4502EB08E4E7DBC6F008193089F19901BA5E4491CFD21C6
+ 4350A35C67C7C0D3F65AF340AD1E8B0F67B9C2016DBA498ADD716630D21E1257
+ 2B70BA39F770B77014CA9747E52C938FC52C6B14298D1F175CC172881693467D
+ 62E96D2550AD47993D8D6B0FD9E41F039A467BF0F651925CFBCF482C6A6913DD
+ 2EBA1241670639B07CEF374B923FA58637CE0622EBEEAA338361F8DA3C2A7602
+ 2988B77C951857F6362383F7B9BEA0A3C45497C5D19DEF84D7F40F5F5C340CA9
+ DC718060B9083BD0C1244D3A0EE80088CDB4285FC8537BEFF44105F0ABACABB8
+ 3E207E747A1ABC976D72A4845B144A7550242ACB6ABD30C0D1B928B08A9CF8C9
+ F5C04EA12D79A521850910EB7EEE720D02F40B2E74FA2649D4AED6739C0829E6
+ 6D45980D19E2CCBC81DA5F2E2563AA91EA6A9995FA284DFF2517DFADABAEA44B
+ 312853B3D6E0F3238277726FD9FFA4B7CE8708ED743420968DADE11760D902F7
+ C8A43E5505455B919D4F2223D950F63A35E5B8411D0F5EF9DBA250FB7B488984
+ DFCD263BF8F29D2F0AE05C072260C22EAD5BB2DF880579B62047C1BD245B86EA
+ AFA5FBA8DF9011B8FD0B1DA4F08D3C301729787CD8A9BE945D2C8D2E9EC00A5F
+ C4626BFA15926D30C480F1D6EF3B25EC6A03B1E058ACC75FD206688580913F04
+ 6EE1F0172655F4DBF72D5390A73649F6D515187B6FA9514432D9C1573CC23F0A
+ 1629B89B7C29DD07C02DA5D0F3746BFBBF152BE383284AE35E7DC8E241A6BA39
+ D762A59D21879C9A170E4ACBB1F401F1CCA43F4A1E02776CFD06A0B889B32E8E
+ F0514605BAF6E1A4B3038D9B4931950DB4402D8032310222934EB38AA06895E0
+ FF2A5CADF83155740FBC157583A4DEA7A341AA4A40971AB1F224D9222D4AB048
+ 057F44B32FF37979DAE55E2C002298B606C712E861205B4A78887FF5EEC8553E
+ ABDB4C54BCACE690A9E784B68382EAF489D9A3EACFCAD86C69B36216D618DD95
+ 382EC4BCCA3D8ABC61902C026AEBA3F8E02DC599CCCD781182AC690E77AF31CB
+ 0A63F4D65FC67929BCD6D9101AE4356A97DD696AD3F50713024A44528C6E3B7C
+ B3A1E6803E7EF1558CE657DB574E12AF33923FF9551D64BE3E9A2C4FB32C3B04
+ FAEE7B1E613A8BFA93BFD021FB54FE1DD5FC22D944E8DB203E3F06E785FBBAB4
+ 7FD23D3EDCBDDD980CA4AD9089D6B5665D1A6BBD25B1E29E31B6FDA7A62522B5
+ 4002BE92AEE4F9FAC0918D0A1A610523BF74F09950E5E12295D3A207086F1271
+ 96D6C15C90E15CA777B82197D1C619031E5F6225759A0318830951C76F814FC7
+ CD5F1D1F981B6DEC617F093D3C6857DD5DA4B7F69301D3A44266F7A8EEF64A84
+ B2B03D2F057B70CEEBB858570596E4E97A243E32B03D1CE5E2196629ECD7AFC1
+ 86AC177609D1CA52554D647C2FC6E980DFC7C37450A8C2F23B91DCB1BA61CE6D
+ 8490A5239337B4F7CDE51FF1AE5979C8EEDB5C37622C45F707221B27124DF8E4
+ 8E551AF9838F9D913FD37A0B6116A60961A6E66E1CA45F7B4947EE0BA3689AD0
+ 7CACB08F381893ED7B48E58B072747A0C52EAE7248F1743086283F74271F0DC2
+ B2FF906240214A7367BFB6D0AFAAB1C2A30DFF39A84F300CD74A4A17473A3D53
+ 9CB37737CEB94DE51799BF25C343F1ADF62EBBA007778D4883AD0F38429A74CF
+ 86992BF5FD4611A9B19EF9328ED2C8FDD7C14FC682EEF1AD5D6419BF98695401
+ B2B8559854A15ECC1C7F2BD15367317BF5432EB836316E7B5D0D97CF0A4FE99B
+ 01A5F7B50A6F1987C39FB73AB398FC91B94B735F768D6B3C2FBA46D97CDA20C9
+ 6C02257EBBBEB6F59D33C6189EA28E88B5D34EFDBD867299ADFD96E7C71EB141
+ 1F0ECE7B6DBDA02DF2CBDBAD4927E2A891DA6614886B5371A5AFE35CF184D974
+ 7656D49E26E4D63F503BB25AACA066C575E9B768B5AD41F7E26942A7396EF1E8
+ 96F5040D3F37FBC8D70DEBEE706E220BAA53B8886421C58CF7999CF13EBC7FF5
+ 698459B94A9C79077664AC900954FDCAC83F1EEB3882758F4B5458AE72BF48A8
+ 684FF083E4ED8295087A656011F61A1D689D2BE273E394DB24F1AE6BE123FFD7
+ 04DFAE6274FDDA400D7AED0A45CB74E2E3201C27FDE3325041F7597B3E54E8C5
+ F6C8B3339BA7CDD9A628CB8D8C5A89775FB115ECCBA1A838CEA73862776B1843
+ 000C0A56C49AE30BA6EC996695BB3ADA025818B3C7367CBBFBEA0028DE1459F3
+ 8EAE0D4416B1EC3500B719043DC3400F95004BC202ABA1DFAC0885F10083BF39
+ 0C7B223226221867F1D5613DC9B847AB6AD26B81BD9830D01239CB82D0858691
+ 4F9B145954BFB50B812BBA0D431027F237947742822DE0F87231771ABE1F07DC
+ 49D62BAEA77982460BC63E0E87A96D076877931EF0799AD8B135EBB7EE9EF094
+ C3132C8A9277E7320934342BB3ED9EAC2C18646F2D96D907C1A3033821F74E9C
+ CA788825603BFD2CB5519C0D51FC6F5DAB4F40BA5FCFBA4049149FB43B93F5A5
+ 201E85BF9C8CCF247B92138276D1606F6774ECEAA74614993FE085402C4B4085
+ 1CF4014B5A23B2F32A29813B2EB4DF2AC68A1F023AF7A36ECFDE1712A45AC218
+ B2137DB950A4BB0815BC4BA712DC56A88F59AD772F46A15975095C6918E00B60
+ 91A3FDADE5E63F4C662F28D960B782EA31129A74D5EC50B155146010453EF5EA
+ 837B1CCFBCC989F2C0A17DFB43669DB45818C6D6DC9C1FA68FABF0AEAC36D3BB
+ ACF5D636A612263AC3004929B415965BC46F1E7A711D0995C51B6280103D8910
+ 957800581AE7FB3F280AA480BBB3F367938C3CB029106B17326E26307B2D15F3
+ CCAD17EDC2CBA92322DC8AE7F4B12025971C8F4347858747503DB6C5F89FA692
+ 042A743300B80798AD22DFB42CA59B6034D8646235D4B827DB29812E958B0712
+ 4F4BB134D974AB87E0ECED100D9C1AFBB5BC1BF93B70214885C56E233E24ED19
+ 895183B6B9F9E02B2AC2B7AB95679B70360373F467475715587C37295872E0F6
+ 357794BD8061FA7F68D0791E279E735601D8C1031DEC249D2C41EFE7A306CE41
+ 097C7EE08FE679F656CB14861B52D5C76E4B761844B9E2DC3BBEE8340F234686
+ 24EC3B1852F05C684AB9C17662EE08D75ABC428E157D3BC71B2B53CCC3EABD3E
+ CCBDEE8004C722ABCD79319B9D43938E28A5A91CF46B6C6F20DCB4D595DA4288
+ AC25B09C80BD3EEA0AC6A8A77B7750B33FA71FAEFE580AC17EAC8D8F195C01E0
+ F60D059679BDD39AB195B45A23F0678D32EC4F6D0286283C0E14507ECC3B2033
+ 27EBC3B9765EB1747CB812CCACB3B8FE1259D3738084F475CFF8F69DDBD8DEF6
+ 14B2D4B8E101C7B06DED8F32CB19CFF3BEF49C7C68CCE8023CCC9BD0304F026F
+ 97A49FBF431A4E61E371353F2E58AECADAC7DA144B2B344C3DACB311046BDBB3
+ 153E98566A981EE8228142319777E79922325826D84AF4E727263F860BC031F3
+ 9451D894A5EDCB6CFEEDAD6E419D48CA38ACF0CA72C380554E0460113BA4E609
+ BF44C08BAC54CD6F52C74A6D007968C703DCB3F335E1FD345B2F457B098A8F0A
+ 15E8AC910C422B05FA5D87005C30009A0A16030A0A7A487B831C7390AAFEFD80
+ 64C299192861917FA0924D3E1C1131E5B125D4B2CF2002EED185AA4393CECB65
+ 90D73370611B671F7084A327E044C3CEA77535AC5099F9FF0A680470D995A385
+ 59143C79DA5C559BEDA470BE84F254F5E6C08BA8BB372041ADBED67A3ACD7453
+ DAC231AF5277827C5A26F2D1DA24E0DB10A2B464F7F1C834C5B219402B881ED1
+ CDA65DD277C4EE99E5E1BE93E1C10FC7309665608A715FC84B6F6B55CD37B227
+ D5CA6CC3F17E34FDAF07A5F9CED0C622A73375D4C9B92078EC10F0918664F205
+ A6DAC50B13F84B050B2BF403765325A8EC745D01AD81147A3B52E74D80BE2CAD
+ 8C671B0C3FBDE0DEAF305B52181F8B479203B9B307597C81BD6955D0EBCA9755
+ DD7A79E242C0C4DA7D65CBA82A473C202C33747B308DCBF25E8969F5F803BE3B
+ 68C81F29ED37C7F42D2D3A32D625858B172782D808EC4E22C89AF3D8CE58C03F
+ 2849FDCA7BE07967851C73983B7ACCE300A04FE77F6DC716E30E2245BA1C0A7E
+ A38679ECA592BE58C9741AC04BD12F06A6EAEEAE90EF9FF2CFA389892CDBB295
+ C2CB85F058CB2F38F573D5EE9565F81E157C67CE801768481B83AD93DAD15386
+ C542386164F5AE380D3310A09CDA8EC4D2325C97C5A06095E5DFE98316D1400D
+ E7AFD465AAB8BFE559C0F8D5F0A4BC4EE0053FE6DD70DDCF3E334816BA3BE3F3
+ 9B50DE79AAD6DDDE87273D9AA2383536B0E1503EF50430695804A91309016A38
+ F1F41BD2F55C9D19A9C5A6E600C3360103CD1C35854FD28B7995992C9F9425D8
+ 8182D4641A533E3E98087136CEBE025C012EA50464B21D7E75E10B54090C60F5
+ 30E75A0A70BFB7C3484AAF5A9A3E30E0EF37065B7578A61103B1EA6272E72CB7
+ 76ABC5660393F197949E347D19FF94E023E7315A70F570E5EE31F4665613DE47
+ 744D11760A6CBBD95EF3F71EB11F26009A9F4BBBF5519C0E9892585A21DD2837
+ 262C97309985B08755D10D1C2C574A5F807FDA550F1966AE3A0D9A0DB25DB471
+ 97E45B411B3B345B404552DF85FCEE06812B9E28A5CF35B666FC5FF2A9F32F4B
+ A4E82AD05BD0C3C08757600262965B069D5ADFA70E2D4C069D08791C5D430C57
+ 03725B0F2608A7EF731AB5351D99356135BD6CDB0454264C1AB29E91587D4F2C
+ D9779501E05682BC3964447E1B119C34352C8D62BE7F234C3BFE92B4DD44DDC7
+ 8FF53976CFDE8FB53E4F689AB69DEAF6DA3119B50D587A00214F1061229C7566
+ 73186551F87592896ECF54673FDEC298F90FF7ECC66FA640E83972E998336341
+ FDC82472B8B9CDB52EADE727CE00AA2C2D0926840B3C20B5F65EAC0D9B6297BE
+ E507CD0CC1362EB3F3EDF0B5C9C0089D9CC6E9720EFB4DDE02AFA6B3B0A54E7D
+ D38987E83B836C3C01CEBD6C27B2DCA853B7149048310A09448600D5D690E5DF
+ F3AC643C670AC47F23D7C9456FD706998DEDEBD58E28E1232909AC263DA28D23
+ B53857825BA8109E3A7BA704FF99F4C98C92188A25B609131B2C5E4D4FA246B4
+ B1737FF58878F3B86D9868E446A203F0BD5EED4BC151DCD2EFD8058AAF91791C
+ 96648D201D0A518F3FF76990D026F05A3C859B09246EDA39346987F26B6D9AB5
+ 2A7CAED97839EEE04C4449204DDAF589D5AE96C05228206C6E608867DDDBE092
+ 07AB2BB346EE45A9DC86040A59671B6B14231FEA85E7CEF07DBB857488C68AB1
+ 261E8A5B4338AB8310A3414790C5F03016696892ED874FAE0DE4F15A7949523B
+ 586ECAE204BFDFDAB58BE2476426CC5FBA4E4EF7F0DC2D4CBA195D4FC784DB33
+ 9D6F9B019A14E49C640AAE245EF7E0BB97F306AE91F65A88DCC3BE42AC91A632
+ D6DD8131A706023BFC8F044B686BF0ECD09085FD3F258B7139FED4C7077A683D
+ B1DDF48AE31F61E2F0976512851C2A17029E884E3D11F7AE78E28A71750F9FC3
+ 1D2897F9403721C8B1695DE7AF9FDE65BB9A3B982E641B1525B5B2969E022E03
+ D826D27CBD0B5EC0C601E5242CACF2861A6C2782C6D629E18FA6D028EC5A1C5C
+ 46B5EB3AFF0A787C80E558CAD39CFB846AAA5C8D040BF88CF43E8AC9DEFD3F89
+ 211A4E60099C0CDDD49380153620E6E0D7B70D2F8D18C7EF325D21622C1242E5
+ 104618EE8C46E92B8070F6F8AEFCC08552C7BCD1C2643DA7B8C2F094D25DBB01
+ 3C9D90E84014AA0FD3D4F847BC2BA70CAD2B4121CA9C1D070D20B51F7F082460
+ D997DC71250755565DA4FBFD359638B1839CE752A6A696897D5E073D42A8AA81
+ 55A7B80C5E58FD7CFAC092C6948666A58454FEBC841C681B99BB2894136304CE
+ B566D2D66A6C8A1B9531CD0A845981CA4F15801F2C886128E1022B3C0B85C5FE
+ A1DCF7D37184283B41A192A33A78200C66AED5B31A3F2E01E532ED4E1A89398B
+ D3EB712B8C789FFEE2F605DB916CB0715C4E3E316D68760D9C766D738E16B468
+ 5F6A4B403DAA60F2F4BCEFD223759F7A4AF4AFD25104947027A1BEC3B39D1692
+ EC2857803B0AA3A3A37B35970915BBE871E92E5E486D997787E83A8686D0EAD4
+ 89BD3C41F141FDF015FB7239FF4CF5BB50B2F807C78B20C67AA9F7799A7E4F3C
+ F917F5AF101AA06A197A84FA9146F54393DA17E0F897782A54F19A98100C5116
+ 21C1D5920217EB7152F240BCB5809B6835BAA846E2ED7FF83F9D5C8D47483F29
+ 404F3A8E5DCC5A3B6069414A15F36774EC26427807BFCD7E30D3548A6A8D739D
+ 626762FFC6BF52E3B1DE0985DC1AD9B679D257004DED7A90FE711C70143A4ADB
+ 3532E1BD988905D44F6EBA613956477BBE3C543BD8C39E2CF2CF20564A093384
+ 84E7AA7F74D3723298C8A32CAF48914862076587386C07F200043DDA9914D960
+ 6C77989FF7DBCF23EFBE268BE673997F5BDAF93AECB4A8756394B3088B067CC2
+ A53550673DA02C119D9207AAB9B86A7EE56E6CCB26EEDE48AABE7B25C125FF28
+ 9B48704BEAF82A0B22694B7FFCA4243B5DF8A3878056FFCFC9D6A550C8129AA5
+ 234629CA95C2D40C9311A6E76CEEF83C1359247EBAB0C9F78222D37D501AD14C
+ AEF44B3BDF76E88A04C4719F72C3EBCF977835C8B3D008DCB6694B7BEF8974AF
+ A86CA6D9C0B93E687DCF0BAF29558BF4E71392B1E61D980AC98EF1F8A35BC0F1
+ 42D86D3C4943E376AAACA14B316D0BF23B4488925237A63DB07EB13DD31D31C4
+ 49B0B76428E6E194B822B08F28372FE9DCF77B4ACF896138F19DB8F46CF2322D
+ 991545C5A7E8E377DAF3D91705DD83979D3DD8A681BD5C2A5772F3B93F44DCDD
+ FAF6CDE69C0653827F8032AB4D972F63B336DF30676B2DDF636AF095FEC84DCE
+ 443158C09E2790C99034F1A9ABC95B2E43D7D2C58F11600173C253756C52D81F
+ D0F86AF99AF932ADE8B638B0088C0401A07FFF680582D7A4DA2D0DB60F982B3A
+ E17F5A1F78AD29816F041D9630529F91F2639A79E62D4506B23B2600A08AF488
+ 3BFAC055A47EBE4D85C7BEF64B6C46AAD0B19FA7C720F75D8A4A7B7D16D9AE47
+ D24AB74078E817B8E55F3CDC23A3904D33356170B9E5A8382129D17FF6EDE6A1
+ 121B4ECB79466E55F6C1D54441DF63D5B29F2A0859B0A3C01759DE7D7B87F638
+ 82B5A4F3897C1EF961E810B575BBF4DB5BCA0B026EE3EC330C4396496782C6C7
+ 5F19B55409B7E8F8E7F0B1791D8DB7BA3AB100CA3032B667C94ECF3DFF9F578D
+ BBBAF87E2850EBAE543F2D5E4AD142E3621B5762F8F33EED3CF484073A3C5705
+ 92608EB4100812A35974CC85978F81180C6D9198E5581DA87B79C3D61E365FDF
+ BC6AEC36E0895A5166CA6DB2605742E5363597AF6994D73D9DA20705FA75FF37
+ 832504B060430C0E2F16EB906D1054707E4CA9B9BB57FF6F60AC93F15910A7B0
+ 2FCE78084120F24038E3F5810D84EF51457719992F647CDD3CEC0899E65D3E7F
+ 82467BF5354845CB44C8F25883035CE98CC6D1EB0F925B5DB2F9E61AA22C6E29
+ C5AF9081499158BF71C9CA9247903AE304FE147D8DED317CBB601268484BB370
+ 78E91D023F2990A24357D34EA90EBEFCAE8EACE29ED533ECF864FB32E5054133
+ 574391C5F52225886E3232A0589EFFE3E215E53A731C191F98047133FFEE7D09
+ 865D6D4671B0FF9703B22B0DF421E971D59DC785CCA559ACBAE82B13EC3FD9F7
+ 2A2102EC7CFFDD1F04650C8B4F56750E0EC946F49B1BC516A1F786D4B73EDEC7
+ B6CCECCC5F20CDBC98153178F0BB392A776B32728CBE47B9EEC67A27EA1E5A7F
+ 60023798E1429F714EFD576F82A0523E592770A7D5931D35EF8CA0293243B398
+ 8987FB5A97EC3C8F1E1706567B7C41F78325BFE9F841DC943D68A56E92DB7AD4
+ 14E96D303E057DFB6FA8DEE4F3507E470278A976F4C7EAA88724ADC39DE0C8CD
+ C658B6E12070E27A06FF2926E07692D6071D2B525BB805F0A959143BF93DCEA6
+ 4F01E0B80D215061657F42BE77CEBDB3B577E1AE6E5E00EB4DCCAFCF07D275A0
+ B42E608924EE2C7721851B1E2B90E612BB69FF84A02CF89997927AAB0D4D11F4
+ 8357D00D0969AAF6D9C1E1FD06BF45BAF22DA09AA51E3AC8A62BDD547F7DA7DB
+ 7AE6DEDDD96FDB2C39A41527F8883C3FCA179CD5B237A08F6AAF6F26ED8430FC
+ 617E8418B865D1B9FD754E9F934D24B5E51D8982E1FE7C5A4B67BC6FB2F90CE8
+ A50D9CA0D401EEFEA7CEF38451092060E9A47FBE09D6FEBC3CA921B79EF11974
+ 9F103BAB5EE41ADF34C08D3C46BDBA0CE56E8D6BACAC352513D1AF2FEE255C2E
+ CF417E104495E0871A43D06411ADD53A5CC5BB389D3EE84B8113CCF5E911CF30
+ A8EC72850D7806EDD4672D4485EC736395EAA4C17D699A1EF14BDDFA00981242
+ 69930894B45C1F966723DD8D79E082B363C2D12EA5E3EC3ADAE0DD3E30AA778C
+ 7C8C242E092EF3680FF2014758AB1DFE6E2784F307C9064FEB3A51CB961B63C1
+ A9FC7C176247D617829462C2EF4B0B4E9449AF33019258F03F4208E0498D9508
+ C1382C7BC4A6A72879AC57B4A179F1644AE732C0F23DF39DC60877F481010451
+ 4DF58722129647CD711EC4F0FDC09E94D2A63E95BA756C1F0D81BA44B54D8DBF
+ 6B9E86CA408F8B7EF31624D1105D15999ACE84482EA251979617D32EE6701184
+ 6FA2125A7AE44AC214A5A8C1090954392AD624B8597565C42C2AF3142D30A61E
+ 8396FC5283647D28D031482F08E1676366676A3CCF390F37305A32119F33ADA3
+ 7A25C78DD94A11DC970C9D2B66E42A0CD2196C55FC61676672D7B609AE2DA740
+ A648E7173CD73C11BBFDB1396C2FD7606D05B122D1310C3146E90BE53B10D97E
+ 675047D03A4EB8B5ED3A6F8B4E696882A2540E975C9598EEDCEC1304E9AB9D38
+ B6F8FA7E0CE9DF9863C58123F9E86C563D5BB924ECDBEDD6586BA9604AD56120
+ 8446CAD41F81BE480C8F5773506E34081BAA89DB57ABF01AC91CFA14E17D1492
+ 3DDBA42DFB179F66F1D1B1E205D7C7635BD9BE3B6FE574CEA46A188355543244
+ AB5FF108467BF5F73E745B0D2839B4222DC318F2C1226C340B8E70D80D1E9CAD
+ 4C905F25ECFD7CFB5953D8AE43BCA7B576796AF05092E908F7DDC63F9EDFE889
+ AF5CAAC6B3A7422B64005DB609F6DFD372D9A3255ECC79C9AE28741178054D88
+ EA396427B9B9F47295C36A37DAB2A65E435C6199220034D27B9EB24F704AB065
+ 6F41CA9193D80F9EFA62BFFBD9ABBB5E88695116B15FB5BE51F8ABAE31357743
+ 4C82B280A0E0CFCCD3E1F16382F9DADF98530101B32FB6E8A81917965E32FAB9
+ 6763A40A015FBD68F97F774ABFE8446123916AD88A1FCF2FF298D9017F3C6363
+ F2E1C97F5D18377FDD831A03DF2AB051E55CA1907C33E526DBFC8AE8EDDF7A60
+ 5B809761DE6FB4226A4967F0950FA0497C70577CC9CAA565370A27BA2EFA631C
+ DE43ABE1102573F6175A842155FE0AAC21DC01DF627B4F230E6B506D47EB9493
+ 7CE5562BED7316A92EFC8E3D939E5A99139D7011D23039A2DF8D9B29FD3A3CD2
+ 331D8A91A675B5481B11EA4F519D53A63FB3B3E2AA41E1FE85A27F9FFF1979
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ %%BeginFont: CMMI9
+ %!PS-AdobeFont-1.1: CMMI9 1.100
+ %%CreationDate: 1996 Jul 23 07:53:55
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.100) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMMI9) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -14.04 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMMI9 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 30 /phi put
+ dup 97 /a put
+ readonly def
+ /FontBBox{-29 -250 1075 750}readonly def
+ /UniqueID 5087384 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+ 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+ 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+ B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+ 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+ D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+ 9E394A533A081C36D6F5CA5FED4F9AC9ADE41E04F9FC52E758C9F45A92BED935
+ 86F9CFDB57732045913A6422AD4206418610C81D882EE493DE9523CC1BFE1505
+ DD1390B19BC1947A01B93BC668BE9B2A0E69A968554239B88C00AF9FBDF09CCD
+ 67D3B2094C11A04762FE8CC1E91D020A28B3C122D24BEAACF82313F4604F2FEF
+ 6E176D730A879BE45DD0D4996EF0247AEB1CA0AB08FF374D99F06D47B36F9554
+ FAD9A2D3CE451B7791C3709D8A1DDDEFBD840C1B42AB824D5A0DFF0E0F15B0B7
+ 22AEEB877FF489581DA6FA8DA64944555101EB16F7AB0B717E148B7B98D8DBFD
+ 730C52937E226545CF8DC3E07C5BA30739BAFCD0F2B44275A6D503F582C0FB4F
+ 449963D0AD2FAFDE33BA3D77BCA9D1DF878DDAFCA2E22CC4BACD542B282164C7
+ 97C2BDE318AF9D501CA21F6E662E7AAB75A5F24D2C182E598D175D44E88AB19A
+ E7CD59584F95B389183EE21B525BF52A3F23C0FE5383A5565A19361D716F508C
+ AAB78411CA5A4D27552CC1C435760D5A89D535B71C593E755C616661363308DA
+ A683F54ED0C23FB2C225A008392B0B719F66F11A946A090B7C00B662A3C69599
+ B4ECB0CC70C85C4BBBF207E0026F6C7A19F2ACFB7A60804FC98A4BFFD7BFFF2B
+ 9529E6D9D4238002BBC255BC62959D6F3381FE06E0621B879D5FE5B541D45A1E
+ 759A6E7DC32B1D1632368D09A97039DF255B6492B1B2B7E2C1434E8306ECA7D3
+ 5A79B6D614B4979F10988BC76ED53A5F45315CD7DA216221F842FD0F3E050DD2
+ BAC23C984D506D8F7D614BCB6B244F5F41321549BB0BD041FBF3053307168680
+ 3435E9C9456846433DF6235D79BA455E54E35184F4200D552CED4954C3EB2B8A
+ 20D379C6C5B088E17DB73C56B72975576ED8566E2B6084101E4CFA45443CCE6A
+ 9D92619B0A277788ECCE6A6707C1FF676AFCF866958D65532F18057542EB0E0E
+ DA12951694C2165D1E8758E3CBA7CAF1666DC0CDC7C44CCD8A15A595076D7E57
+ 3B24203B46700BE54E13B14D2E27C6AE68CF1E82D11A9EC72A6E77AD55B5299A
+ 468FE00B55F494283D3F403B3FB5BA568D0C7D4137CC9273A1BF8503084365B5
+ 2474A890F9AA9F53469A8EE5F40F99392E1D1D917A8366BCDB3601BBD63AE2F4
+ 8ECF8F3320A07FB398B09EC24669054893B6C04BD37365339D808B990142BA40
+ E8A00A4504F955F2529BBF426C2F2F9D1CD2F0D7A51EC2D7EB4F139FB784D067
+ 77041827D96E1F278EE47689D3B39BDC1386180CA152738F9B4CC715D7398028
+ ACE72206FC7C834BF25D856B1B8DC4438997E7BFDBB7E01986E81FC04DF790C8
+ E95E78C2A5097169C4A7A38EAF2A91A99538F2247E0978E6834CD86E04042DAD
+ D9B3D095D79F6ED457EA63199362DFDBD216CC003E5E9AB7BDF4ABD390C6218D
+ BE08D76FF82E799ED5E4873F314A5CF9B66CDA4FBD95606B93FF9AD0BFBC3023
+ F4EDE2A1B37F6B4CAEB61246DA735C56306605B4C6CF7F7222EFCBBB7E10EE7B
+ D3F721F52BDE594EAE8F304FB89194765D128EFFE4D30D234DB09BAF9EAA4CF9
+ DA1D1DCF75561D807099B68CFB383EA4331DEA55D10605A88B7141BD19135BC5
+ A61DBD17CE93864884
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ %%BeginFont: CMR6
+ %!PS-AdobeFont-1.1: CMR6 1.0
+ %%CreationDate: 1991 Aug 20 16:39:02
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMR6) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMR6 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 48 /zero put
+ dup 49 /one put
+ dup 50 /two put
+ dup 51 /three put
+ dup 52 /four put
+ dup 53 /five put
+ dup 54 /six put
+ dup 55 /seven put
+ dup 56 /eight put
+ dup 57 /nine put
+ readonly def
+ /FontBBox{-20 -250 1193 750}readonly def
+ /UniqueID 5000789 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5CF4E9D2405B169CD5365D6ECED5D768D66D6C
+ 68618B8C482B341F8CA38E9BB9BAFCFAAD9C2F3FD033B62690986ED43D9C9361
+ 3645B82392D5CAE11A7CB49D7E2E82DCD485CBA17D1AFFF95F4224CF7ECEE45C
+ BFB7C8C77C22A01C345078D28D3ECBF804CDC2FE5025FA0D05CCC5EFC0C4F87E
+ CBED13DDDF8F34E404F471C6DD2E43331D73E89BBC71E7BF889F6293793FEF5A
+ C9DD3792F032E37A364C70914843F7AA314413D022AE3238730B420A7E9D0CF5
+ D0E24F501451F9CDECE10AF7E14FF15C4F12F3FCA47DD9CD3C7AEA8D1551017D
+ 23131C09ED104C052054520268A4FA3C6338BA6CF14C3DE3BAF2EA35296EE3D8
+ D6496277E11DFF6076FE64C8A8C3419FA774473D63223FFA41CBAE609C3D976B
+ 93DFB4079ADC7C4EF07303F93808DDA9F651F61BCCF79555059A44CBAF84A711
+ 6D98083CEF58230D54AD486C74C4A257FC703ACF918219D0A597A5F680B606E4
+ EF94ADF8BF91A5096A806DB64EC96636A98397D22A74932EB7346A9C4B5EE953
+ CB3C80AA634BFC28AA938C704BDA8DC4D13551CCFE2B2784BE8BF54502EBA9AF
+ D49B79237B9C56310550BC30E9108BB06EAC755D6AA4E688EFE2A0AAB17F20FE
+ 00CD0BFF1B9CB6BDA0FA3A29A3117388B6686657A150CE6421FD5D420F4F7FB5
+ B0DAA1BA19D638676E9CF159AC7325EF17B9F74E082BEF75E10A31C7011C0FFA
+ 99B797CE549B5C45238DD0FADD6B99D233AC69282DF0D91EA2DBD08CE0083904
+ A6D968D5AE3BD159D01BDFF42D16111BC0A517C66B43972080D9DD4F3B9AE7FB
+ 11B035CE715C1218B2D779761D8D7E9DEBE277531BD58F313EBD27E33BEF9DC5
+ 50C7821A8BBC3B9FDF899D7EAA0B94493B97AFEAC503EB5ED7A7AB65763C9AE4
+ 247C7C9B60444EFCA66AB8108DF1085D4F3D758CA672BC89FD250646AAFC9585
+ F7F8583BEF48D4A97DCEAABEB778FDFC2AC2789D6F4E1F0D9237205E6210893F
+ 77BC26458D7CB35B844DE20BC63A4057AEDA379413FB28B0C7C9A6AAC97CEB9D
+ 5F712AB7B25A697092C13D2042A04EA2FB36836E425CB0C97A9F30C6758FD6F5
+ 2E4A4AFF054C14C7507A4D90B76F44A240D2709F26814A24C405E59D5109948F
+ 87A93BFABAFE124C8D58EDF774E060F599847C6DA5E7349BBD7791505BA1AA41
+ C047310EA5BE5555F3908ABC457CF1E806AE9D9ED134577DA0DCAA9120B78425
+ 571445724A1D1BE4A49A88C16F64C3E73CE74A68CE9F413A0186BF50527E3378
+ 0BDC374D6775CD1A60D04A2936D6613D91023157B2277815D3EACBBD0F5EC49B
+ E10FB601A820B3FBFDE967AE881960711947F2C00DF744E3E29D6783D3F10D95
+ 0140A5B62877AA3A89794368D3866910416393C21EB2C8D48B36A3175ED20B45
+ D3389ECE0C0FD0B8219CC0FE131BCADF70835C1ECF5B3B45D25467E7035313D4
+ C9D0DA39FEA7F03DD763174C09C7F59D83D484E2C8151DB2A52428C5EA3A0649
+ 0AE2EA79DE5DC679CF978D3CE71BA42811E1DE2CADA4FD5618AAB6CA11976402
+ 57E5F5448863B4B0123088E8B1C22853F731BA9797197646BD327D873769B322
+ 12479C1813D4DEB5E9C7CFE623DC65CC67B381FD18537BD381FE8B0EB0E65407
+ D5C970329E61082E5BC69152FE91373CB3773CA987742586E6ED8C3016011724
+ E3F5266ACC8161A3E60B779F99C62483289B8F5FAB2A65A2B3EF026F50521673
+ 94318A800C2BADBE0F256E2B0B1BB9DB90996B17E39E5732E0932EE71D94AFA8
+ 6B5B0E5DAE5C3DE55A167544D9F315D7DA1DC1DE8B00E14164B941F136801A81
+ FDBA98CA9A96D881EE331F4B45FF396B54F7BDF32408863D62F39AABCB5B45DB
+ 5E1DFB417F9E79FA062244A32D847C0CE041A90A2375EA44ED95DFD6A7BE97A4
+ 69A896ACA2A8F3D1838AE43D8315F69DEA5DDFDB068CC94C5B0890474075E320
+ A5EDFB9E13A5060BD2C45E855F51AEF305CA576A9785324F98652B3340F6858C
+ 0F936ACC0280DEBC3084E0C3BEA789D8E5CF803B7D72F2E96AD34D947DAFC787
+ 806C936F0F9D8C7C8C7AF64EBB2EBAD3A97DC56A775279BFE6FE5A17209A5DD7
+ BA86A542B70E8AEEE4B53A6A7E389709156BD02E37648648A8C4E6366A255D4F
+ B6D33EB9F9A7E96AEFA0E9D68268C3A5A1A8CEC390A244C6CB8F210C608F51B7
+ 769E52259B2EFBF44DE98ADA262AF6132C829EDE71A0883DC517E14DC0312DB3
+ 10899A3662CF88797DDE4BE8507121E7EE58D83F0761A5F9DFE463637560BE31
+ EA5E7931C115F68D02EE832D60E974D5BB0F6025D28E24058E8E3CEE6B45156A
+ 70B4C4DB0C784FC5D4A95959C6C71C70233E3EBB696E813A2AE3CB830D6D07E7
+ 4F790752D9E8E6BD41C3EA514EFF1ACA2DD8D1111BE62A17120A17A6BF806CF0
+ 9E8FB18AFCBDBF67B15E4D45A3688E4A7108380FD6DE1491CDB932A7A8CBA1C1
+ 5D6770AEE80289FA6D6CF1460C151A78147DCFE4CF3A0A91BD7A14091CC7BA0B
+ 87F2E10493A80BC1E88A382088CA09806D7324018B3C832C984EAF9E801F08CB
+ AB1EABE8C8A6E14AF293B5776C6F75CCDEA7F25431F902A1247CF5A101BAA8AF
+ 846E3366916058BAD88CD99BE5369D7CC3B143CDC0E48DA50BD130997962726E
+ D50E227D7171951F42C60857453E6574084AFFC583423E902277E7F86BCC93F1
+ C7A8CE812F89B20FD8FBED0005CFE83303F61369405336DF24CC15745443E9AD
+ 8B49D9F29798735EF6892E925C254400DA606C657DE585088692AE468276EEC8
+ 4544F24C068ADBAE403BB7D643AB02A289097A3E87E464D1E2DB0E7885AE8B96
+ 44C08FC42CE55281BC901F194CF9FC24755DB18845D8FFE03F70A9A2D70C7097
+ 46B7CA5F10AAE098D99DFEC165BA71A67381F49D1F09BEEC2C0348A290C1A1EF
+ 298DC0B5931CEE66FB6836A3C7A09CA9D8B37043478539426F6269EAC21F5ED5
+ 59AB35645218CDE8946FD4468608D539E0AFC73812F41C6AB6508CB796B50483
+ C268C21A06BEA059D0EE331836A4E242E243439655BF0EEB18E45E6DF5BD75D3
+ 1B5E0112FF2080818146214D1A6F1CF66F2FAB4A4A975B99FE8282FB68D29032
+ EA0AA51B2810F66E0B72A8CEC2BAA30E88AEA22B3A30EE6C66A1DF6D4273EF6A
+ FA09EC1CA0BE4E156FBCD5029381E0368F42E466B2078639AE281C31F5B282C6
+ 6F621D7371113AB536EFC242766FAC1696D1902CC514E8444D8C977FEB555E82
+ 32C08EEEAF5A8820E4341EDCC6E98AB6F0EF6EA5F5CD18D1922FDD273C61ABA3
+ 1AE8EF4874E27B005CE5D1308EC915999E62E44638BCB9116A69A202392A8463
+ CD263C86FDB8E0CF5E25CAFFD32F824F9475232A27862EF2723B84B35DBB0627
+ 37579F19E21253433D9BF96F4C8841331190F924CBAE983DFB9728B0B896879B
+ DE3A0D087C1E16BC93D734757D327C31866CE6B15DD65EC169CC2B9C5FEEE538
+ E5B8FFBFD3BE85FDFDFCA09EA4491C539D79D4F7
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ %%BeginFont: CMBX9
+ %!PS-AdobeFont-1.1: CMBX9 1.0
+ %%CreationDate: 1991 Aug 20 16:36:25
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMBX9) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Bold) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMBX9 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 65 /A put
+ dup 66 /B put
+ dup 67 /C put
+ dup 68 /D put
+ dup 69 /E put
+ dup 71 /G put
+ dup 76 /L put
+ dup 77 /M put
+ dup 78 /N put
+ dup 80 /P put
+ dup 83 /S put
+ dup 84 /T put
+ dup 85 /U put
+ dup 86 /V put
+ dup 97 /a put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 104 /h put
+ dup 105 /i put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 112 /p put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 121 /y put
+ readonly def
+ /FontBBox{-58 -250 1195 750}readonly def
+ /UniqueID 5000767 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5F0364CD5660F74BEE96790DE35AFA90CCF712
+ B1805DA88AE375A04D99598EADFC625BDC1F9C315B6CF28C9BD427F32C745C99
+ AEBE70DAAED49EA45AF94F081934AA47894A370D635D93B1823EC35EB8316AA1
+ 86031FCC99F57CB21E8400E54AA474B57112F0D4754A16BEC19117E9D3638986
+ 0777A71B135CC18E20E193AE6C2BCD89F4A27516DBD2BFE69FF9920D547796F9
+ 89E0825B6BD5F492B36AF136EA91B826501ADB1979A4204B2CB5C0517F2B9494
+ 9B2077F316D2B3DA256C99F7549E6BC4B04FE12072B09B4F5D482A126AE351F3
+ 97DB85F3026A793B51E6B28B54661FEB087F011F0BFF67272DD1E8825C180723
+ 22AE77CD6166D2605D0C0F131537417CB60086F08E7197AA916D590944BD801B
+ DEE8F29FFC516E11396CCB8395CFEC9262E22521882DC0316B0A129DBFA5FB57
+ E656890C2471675E0566FE461028FB05532E274E6DF77E7D320D09B2203BBB5A
+ 8B185B66B2F8A18A49589C4EE27596DD56260D0D759D2A12CEF7FC3010BA1B36
+ 85A2FD45129DC01A0C7570423305C25D957DFF9215102FFF35F428C823D549E5
+ 014E7F99ACA6C10B3C92805376D0F3F280D65852CEA54F5CC9DEF9EC1347824B
+ 0733D3341B34937316E77E952AD9366D3B2ED045165565F07CB636385E5A5911
+ 2620E185B105EF6C93890833054E05B6301137338A3F1D6AB2F80095E57AE60D
+ 6E5EE2764624849978C811EC38E014AE4A5823734C5CEB2BC22DDA46BB408D00
+ 4F25CA8ED287D35E26A4CACA77D2D4B986ED2ADD3BC0C3405741CAD56DE28C7C
+ 68E8944967C022CC55907B3DFACC1EFAFD38D3EDDA1AADB6E2C006ECBEFAC8D7
+ 18ED3C46C331623D8FAACC6CF9292B8F1B407806A0D4808F51A5BC97FD1872DE
+ A47514220D23859E20A186A7EE791E478ECBF2D81C738DF9F1C3DBDED94E6AC6
+ BFACA4DFA65CAA39A3A2645601697902C1F18D65896D0D5BA10C314CC8F0B00A
+ AAEE5BF1F9D7EC73ECB11E5B7D96F31DEAC88E56776BB6C81F0CBC163520C093
+ AAFE3BD8CECEB8A488686C45F49D98726A9F1A8D3B73B6E18EA61315D2A25A0D
+ 4DC5E295B289DB9BB621796BBB6E4F51265C1CE987928757322411CAEE28ABAF
+ 057B305EC97B77E8515574AEC91141EF875FD8E002455E90D7F7CE61B6B756E8
+ 64D28503851A6AF757FFC73CF532E3AE10D1C79A26C6461B6058EBE1B6BC6DA1
+ 38A373A7D056E02279F034BDA55DE2D5C552CFD16B893E99C7C6DC1F75C4700F
+ A2437383FC208FC41FBE65DCDE0EAA7ABDDD7CD2EC52DE3A676C9913D725DB56
+ 0E040F9145E6F6D596744FAB74D75D19180883A57DF85E3A7A3EDE250701F24C
+ 8725F6AB93FDEB330D51C912D24386F8A4DB751A63E57ABD95C3A4E466814562
+ E8A77B4C9DF74ADDFD70D8650E40DA17C452954C50EDD72CEF8027CB474619E2
+ D1180CB54C0D83D50BFE1923D08C10F489A4012DCF5526B1C525071F94BE5FC1
+ A4F8E67AFF6B4585082E5ABC079E2A34E7361F92CCA0A302416EC0CBA0B31701
+ E6E3E37ADBEF73F73E850E7805B083153D5B043AC989F182DA31C1D1B399DC83
+ 8C7E5EA5FEDADD7779F5E53F18D550A41D5E82B52D3CCB7F2691FCD6D5503434
+ 8DDB31479B98DB6E4E5BA59090A693224A0FBD355445521B905A4132578B8CE3
+ C7C668CDCD7A48AE523301B5674BABEF7E98F4BAE9875EE9EC8A706F5B7FA780
+ 50D9F66EE665F4080CC17A17FC95B41695DC5D8FF8E2C2BCF40407183D7AD6A6
+ 6DE1454BD9D6F228E8FE5420A82DC9C50573C94C212C18C748FD4C1BC0CDF769
+ 297DBCDFE7938890D40F4E2B924523C5BF71B14601DAE991B31853B42E8B4D67
+ D291017C8E60068B385FDBE83AB2A717E54040A10EC09EE2970C26FF7A9FC896
+ F28828AFFB366A7A2179149C0885A70AD8AECAC8098544686081CDE46FEEF6E7
+ A6347E966781BF1D3724EF852C1DB28AE2BFEB5C5B69FBBB09CD42A934EC9E50
+ B278AF702E17777F4AE36029EB4CA120522CDE771FD1015FBA6AEFE2736C5B60
+ 7F21F1638345B35E8F98A64E33AC3AF0F5AC3C6F775107EEE05B3FA83DCFD5D3
+ 65FDAC191B3F5768AAA41FA91F89FE7C11C881E69C565BAEF39056F75BC2ACE0
+ 032CED8DC12D7B8C5A4EBD1FE5BF609A5BF1B3BF81416D44BC18BF9519DBFEFB
+ E45D91546857DC81F8472B5642634BE0A11274596D4DAE85D1262DE3F02C11E4
+ 6AD92B2BC81C33128282BAC362117DD42E63686800461DE8B82D8AC7C6CBD815
+ FBB99B92BC8FF06F5880A29B3BE4D72F04E4FCA524FCD4731C045F8780975509
+ 0BACD1D8EC53CCAB384F18C063D999FD218CC4097FEEF87B159B2277FD684448
+ 382F0195C8F8864BD84EFE2E90067B0F605FE70DBB5C91D66482077916C4EC7D
+ 494C70B6361DC2DF91073AB327EF46F08DAB743B26A11C7F27D2DDFCC2412B32
+ A6D1596F9256A7FF8759D6E8B1F9B1F4DDBBF8D18868F7AAF9A5371611CB6D81
+ 8E70C8771D041EA4E3ADC6E4F9C3CA9A77CC036A9B39050D948A8C35A1592C41
+ C1F649F55E3441A69036159F4B83F2BA0E4DAE6D1385195D1D669FCA7E978981
+ 223D88553D00D208C3108CA7BE4F06AA85A2CA2957F6F18FA2587BED717854D6
+ 525E50A5ECCBA4DAAE7646626817BD53937DA59D8992B9B22EC8B888B4B9DF78
+ A8E4308D2C0988FEB63DE1468E171E095B24194C631559EF46322D1FCE32176E
+ 12915A8F8937206955A31061643D0FC58EA6FBD86DC184577F9989B6E6A76DDB
+ D1DD29D42B091A12EEE3B98C9C9CCF500F4B739FC245892A66B15633EA5B0232
+ 3D66F9BF43A80C4CE7074686ABEE2CEFD5B2DFD8BF494F9AA865C6993546EEC3
+ 430994737523A5762232AD7CC41639C7F85B0B30D03AC2B5104EA5B4735DFE0D
+ 75293A86C2A1EC2CB7474D0149663FE39D97EA2433CC936D49B24913C42BF847
+ 973AFBB9747CDA3077EE11F817EBAB7064A7C80F5B07983B910664F4885B6C0C
+ 9DEEE2898EAB749819BFA25E5A4390C700B2F7FE1CE4135ECC5E1395DC56B1DC
+ 8E63E6ACE08DCFCB3806BC5A00076931B25B4629779FF28DAE3A2A90A48D56EF
+ 206C7C1F3539EAD5103A579A2D9ECB7EDDE0B52008A2B44D69A22BA3D3274E4D
+ 4971F29FC2C30E4F47A940813AA9AF1F080A994C4E39FBB3AE283E55CEFD8694
+ E34F671514E5BB3787633652E274E0C7758E47E7F0689E33C62DE693D600DBF4
+ A7E96C01FF549D3DC323687F57D1450EAA44E0A5BFD33D2C924B4562408F3333
+ AEE1CBDD062F6F90AEDD97048791337B2DE4FD14001399B3B5DF4AB58D336938
+ 37F14C071A193CE7FDBBA63618F63F59269D3A8AD16C840EF70235A9D4F65919
+ 30BF79191A08AB6587341203D976264B80322A16580F09F2C68B33C844CEB708
+ 38F6E9621A40CD33FE0F38FEF76450EE0560B1882D994F46473E9EB9B300D859
+ 0CC2E751B6881AD755ADE9F21B941AC32F749C29371B93A9BEEE6A440BFB3286
+ D4B3107B03123AB20151E1874794E23441A7A967A2904F250638EF92502E2A1D
+ 588834A23384033D2C1D3733BCBA82D07F3D87ED7835053FD5F3C5FFFE8B858A
+ 37D41415C43E140332404EE5CE0A0A3C8CE01BB458C90E8FF17917D25ED08F5E
+ 104748B9C0C5FFBA78AD5165362D33FD1AFB758FC916E57E004788FC73FF0C13
+ 74D27F97886DC8F2FADE5DF5A4CD27FB67F0E9DFCC4A777A524851BF2D9B651C
+ EF32619B09452B6ED80DF1A2EED9EC1843CAAE24FB136C56B13598326F7F1C1D
+ 1710C58D1B74E2905E6CEFDDCE4B4E6750574AA48AD0221E7ADA61E166B42B2C
+ 5F8CAAA86FB2A890F6D6A509DF33FD20639DE0AA45D735C074D52309320A3FA7
+ 2C8A17722D2C94ECF6572AEF96229A7D42CE8C18B2BAC6A8C37921630E45BB45
+ 5E2333196C65497B048FCFF8D95050CC5907BCD8618F311E27E0E6B16369A785
+ 6CF19881C22A5CF1F64FD6292E1BB5EB78EEEB7B82E156B9F957F691E1B0D76A
+ C69E0A26A8FA896D9319964933384392119A72A1E4BF69952BD6CCEB251827D7
+ 439A99B3C36C40C12111236352737990AA5F7E3E8F16F3C264A5349C60709981
+ 16505CC410D35D763F3D966D687932B17ABDDE3E92D9812FD33548E716ECADC5
+ 1F301AA42E42FF814BFD26729E663463F3AB7C08D1189864DD35CE0483260B76
+ 0F4F4F9522819E08AB31A8426CBC88837B75E9696B735CBE7DA7E6BE9ED7C5C7
+ 516E0A08ADEFB1CEBA6423D6CD79CD52D24A0ED882AB2D41AF760F970A992F6F
+ DB56AF228F2315A9C9C7E198813C4BED80EED5803A92F3509807A721DE43B289
+ 2C0A3C0300DB5A4C2BEE7C4E151A5AFAE630CCDD664660F84412843D762F8B81
+ 81A0AD03210202770342A38C31D55A6979CEB391E3994E0A162769288352926E
+ 952D3E4D91958347A72D43F4FDDC87F40F095E91646E770E9789B73D44F996E3
+ B4AE990ABBDF7A61167ACC3D8B65DDB55D91ADF0A3127459046D818FF8B5DF43
+ FC3F5BD4B75003B448A1147FBCF4225A1978FB25FAD71226049CBE03EE679A37
+ 3181952A558C4353CAA20798B9F5CE3E518E3242E3ED0A399B53D66E2EA6CC92
+ 26FEE377368E961BAF92717139B0DCB52ADC06F91DF69D7B5AA608BA5D4AE187
+ BAC8B33B28C60AAD5194C39C78340B109EAF0B6A7CF40749147B477FE2757263
+ 0E134CD731943C98696BE41405D3B7C4E962DE60C503B72E908C2A242541BB1F
+ FE415F56F0199D8B37A588663DE84A5D60D9AC28B52032DE1340358313D10D1A
+ 8B0A5455CB40D5540D6572819CB94FC11BAE839410FF506C744EADD97E4E2626
+ 438175136DEA145B07420903B34038B707E9A5C4140464CF4E696A4FC5D6EA85
+ 5B4739A18A12FDAB632E3BE523FE5C2A65980A7BCFBB59210A34641CCF8BEFFA
+ 017BD408039B9FF6559F263F84C3505A7B47F7123B37ECD916A85B513618D8C0
+ D04043C4EFD3B1ACC98953D03A99A24D8F1D95956ADF4E9A732B65312CE0AFB4
+ 5FE6887128350263C08D8E10AFEF450B6555358CD218CFC4BB4972A74E179025
+ F3B4A81E23A85E826D980E6E964A1BC52C2F1F8D40167E70A05B60E76100226D
+ E86F9A289895322D8A8B9C473938E1976289D84B4D2D689E3BD302C7029BBC56
+ 59A283FFCF0D45C0C3BA3CADFDEB1B7BFDD0460E974B434D634C0DCC2B71C269
+ 69288CB84B3BEBE920321B9FE9AB1584984518DAF7C994CF6275487531EF6135
+ E0A70C9D0CEE49C9C1DE2E7FD101888884E0102D239164E88D8B65340E9E2AE6
+ B92306D3AF5E4FE874526330E7CA575F88E63BBAAEC9B53F82EDBAF1187A8060
+ 4F99FD08B97874B85ABA6F031A942D27CD1C87CE1A45C712BA5E483D8FD65C36
+ 74ABC87F5AB629109BCE28A530450A27368A5CC214CFD3ED76A24991A1653AB5
+ A789D285E9FC92BF02FA63638457EC61AA2998942A6D63BC03D4E4636A746864
+ 61C1C9AAF6A4FFB097072320DCF9C8E1032B6CED404EC8DFB2F8AF75ABC5CECE
+ 42A0FB7E6F4BE81698C3D4C070A7539347EC48A331B1A68836AABFB6FA5DA841
+ 83B2B9F24668E8A2E3C2942F2E440292704329EEFA594B3828C02507C0BDA6F9
+ 420BA82BCF15963242CCCC041318144681B3269BAA83A40794F8DC7AB5AEA4F5
+ F76B77A2102905DE862E20F526A42C0129561855DF19C77D5FA83EA825AA74D7
+ 73F6DC6B788E981366D8A2460583381B83C738C94BF8F25104B9B64A46AB416B
+ B30E2161EC73091F505C18E6BE3E0B2795B12FE40C12C0409346E2A0083E53FC
+ DC3880516B2E6502BE9DE87FADF18436AF01417EBD604FD0A760417032BD17DE
+ 88DE33F716CD1B4E27A3ADE9F7835E93482D3AF9A1CAAEAB02D3AF05EDDB5E6C
+ 349FFCCA55A4C1D852C78357A23B9CEC9E56099C05BAF39B47D91BD6F8578CAE
+ 9D3E87DD0DCC0CB4CDDAEBAFE8467481FF359BFECC14FB8CCE7C60A7E4CEFC7E
+ 9222919CE025E62CE483BEB079256CF7BF3F535D30287B2C58FCF97A17414371
+ 0AAAC52CA48321D1475044F3F35A540C426C33E7D9CA94EDD672E6EB8C05641D
+ 01D05E1883319E57C07CE371E2199055391A6828B7BE7955927585A780377757
+ C5C8F620565AA32C4DA9C63C1B6A017A8B0C971EDDFA9F4F4586C8A5A46B6A7C
+ 1C7FF5235B9D75A3E85081AA00EF1486D251169D8E3428BD2E513F9E548FAC59
+ 997B2CB0878E31D5BD506218A1A042CE4762644468B1064627296E11176E648E
+ D55C870968CF9CC69955B89D17181521045EAEE394E10C1709D4F9D90FA88F6C
+ 26FEEE2BC8461C6EDAEBB367F8FB126186193E6A20B05A4FEA5070236A4E06D8
+ 3CC8CED7ACB11E1086DDFB56150F9CC821D9A3CC52537DEB9500317807D2DD6A
+ 79107BA11CD90EAE447165574F29BE5FE3140A44FFBEDDA3DF3481B7156DCA44
+ A9B7FA730B87F23B2A11873E45E1208FA4B343F21F6E402B1703B840CC126B57
+ 9472F00F674DE7C03C58DE1F284F0921B452A542E923931DEEBCACA7692C8613
+ 41CFB9B894381B996115424FF149F7D78A1F1E993360BA667575ECF196C2364D
+ 217432B9FF06264913FDD7B04BADDE00A1FA8E8128E699356D955B55B25B7229
+ 58FF60DF0A09BBA9F30145C269C79B474E2558757AD54A8036CDF62235E265E7
+ 8DF91AC231EF0AF62AE2041C27D2ABFEED323CAC60082CD3778AFBED4BD1D047
+ 9B0F8B064179C12F7524A9781BF50F848B8C10833F4BCA6B49D944B80D8D79DA
+ 996CEF7217BE29548F771B1D6E912B11676E1AE6A543FC227D5B64ACB54138BA
+ E87E5BA6BC59C1309E67CE46CB627C6023E3E6124B2645086169B07C209537AC
+ 9884B38DB31AB3CD01693E08CAEBEC2E6C6BFDBCC2980F613B92E6BE985805A4
+ 3FDDD5B7D5A4C87C65120E22D9575086E139FE6E99EEE2E2279D7FAEC5053427
+ FAEAB682EE13375B59E1A06E9E9011F0F029B8097D8AEB687678C860C5806DB0
+ 762F624CA10091CA5511B3A13BEB77775A4EE9984EE2BC8236650D6340127EDD
+ C9CF355583208AAE8252F654C96AD8AE456D0D515A6D75523F03FEB8FC7FA01B
+ D6565ABE6445E9B1E87E6A039E727429E0058C03B30546AAB5C2A1A9D947022B
+ 6E5585F5FB5722E44BA09609E18B6D7749B5A70651DBF68F5FC961B0BAD775BE
+ F5627FBE3F479B7423C9A354E8E347D8132547AFDAA0E8E76DE70B425F15FE41
+ CF854005BA58C67AC16DDD46656A41139B6063159C32FBA0D8B2C1D7247590B5
+ CD743923CEBFFC55B66D1FBDA1D340C242FD41446B33BF80F7AD00608B1937BC
+ 0B903963D6C494A704C1AA3D95BB4313D1BF2E3C2E7B39750E8F9A55F4537371
+ E66C2A6B4D94F09ABF15DCD13AA10A3A910EE030D07494AC31ACB5338C72A6C5
+ 579C8797D43CD9F9DC299E
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ %%BeginFont: CMTI9
+ %!PS-AdobeFont-1.1: CMTI9 1.0
+ %%CreationDate: 1991 Aug 18 21:08:07
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMTI9) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -14.04 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMTI9 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 12 /fi put
+ dup 13 /fl put
+ dup 14 /ffi put
+ dup 15 /ffl put
+ dup 39 /quoteright put
+ dup 40 /parenleft put
+ dup 41 /parenright put
+ dup 44 /comma put
+ dup 45 /hyphen put
+ dup 46 /period put
+ dup 47 /slash put
+ dup 49 /one put
+ dup 50 /two put
+ dup 51 /three put
+ dup 54 /six put
+ dup 56 /eight put
+ dup 57 /nine put
+ dup 58 /colon put
+ dup 65 /A put
+ dup 67 /C put
+ dup 68 /D put
+ dup 69 /E put
+ dup 70 /F put
+ dup 71 /G put
+ dup 73 /I put
+ dup 74 /J put
+ dup 76 /L put
+ dup 77 /M put
+ dup 78 /N put
+ dup 79 /O put
+ dup 80 /P put
+ dup 82 /R put
+ dup 83 /S put
+ dup 84 /T put
+ dup 85 /U put
+ dup 86 /V put
+ dup 87 /W put
+ dup 88 /X put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 106 /j put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 120 /x put
+ dup 121 /y put
+ dup 122 /z put
+ readonly def
+ /FontBBox{-35 -250 1148 750}readonly def
+ /UniqueID 5000827 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+ 3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+ 532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+ B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+ 986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+ D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+ 9E3948FFB3DF7BFF10C9BDA4EFE5F68A8CB1526990D1357AE6D2F7C2D2EF8496
+ 4E47B39E6712EB8908A3265E5FAB40567E866C244814449F1E993AAB422C3F1D
+ DFA8C7118584F2E5197FD4BFA3A8AE9E953C6CD4672C0FF51E41C3A919749C1A
+ F06650DF4C5E17492164BDBCDF22609A74BFA7F69960A64B9F949FFC2A807458
+ 8579366C4F41BDE1FDFBCC4845FA19BBB6963D65EE8532549274BAEBDFF24FA6
+ 03235D1BE37C06B1938AF369DA75BF38DDBC87A1FF445EAA16E1895ABE9506B9
+ 211955753E447865D33CEF007391D2666A046277A30A49804FFCED3FEA5EB2C3
+ E52EE14A9F75241EA10C91974CDA6236EB840FD44D6DDE4D9B3266C3B99BD38B
+ D835BCA8CB819C073480FB972CC028D218F6A1D344CE1B63F4FBF2C826F412E1
+ 6E0B05A26125865A14FD7B7030B478BB8BC6BC395335C3BA940E1C348267F4F9
+ 0AF97BBEE253511940F1048E175D3569F7D05A28851B6F50765FEB6C9654FEDC
+ 1BF52F535DB5BB90C1BD5D2EBF75E0AEBE82B20507F3C28A03746781018D4EB2
+ 298E4F2C27ACF73FA73EBE43F014BB575AAD516C0407B29E1653375135ECB74D
+ C91372F06FA8EF37C31AF3FA48AE65318EAA6C34830A5377ABB2DFA5DA53A574
+ 4266FD34C25C8025FD7DD45F44301DCF03F51335198F9EE71CBD72BB906F445D
+ EE6AFBA2FA06A0A045D56CDE98A6F0DE807D81F26D017B74D1C7A5AE254B7705
+ 7D96CFB3C342DD38DB5730ED913639C2BF3CEBFA6F3D493DCE5F8218F8BD8035
+ 9E6CDFB95628F7198CFA2EBDE1905F051BFC4F835C5A787E3B43EAD947EC893D
+ 9D1B04A9A7EE7CF3E02A58BB0867AA7C77F30CFEBCB4B3E6EC68F6B234FB6B26
+ 7A9D88A3CBF7A29ADDD1D212562AAE1F7506A592ACA0720C2FF4E162274961AE
+ 2595E81820B04A9E0695A13DDC27AAE1D1D4336D4A5EA976E627A55572B3354C
+ 9AE1D011E54B0FF279A63962341FC7B0E71B46855BD31F45CB80F02FA1005F14
+ 7D56C2DC7AB765E2C9BD3986ADC36D63373718B1564D72B4EE59A393C94B3C4B
+ 1ABB6A2D11E7324063259AA6ED1D3D4BEFCAF094189AAF89E17614117D6553D8
+ 97910E0091E130C8613B5EC556775B8B17D6F4B967EB1B7FE6C9A77AFB974B9E
+ 31CF0DAD81F6A6D87FF1F4F6FAF29EF67234DFA0C7A992BB8D727536BB3250B0
+ C339FA0237D1A84877B856517ADE5E0C0CA58CA5D0C12070DCCF9EC1D28761C2
+ 4055936908ED8069B3899B6A449E15CCA6C2AC37596789060B7FAA0009211D27
+ 685B9573F4819CF21FE46ABB3B5B77F9D7965DDCDA39D125B395C46F56FA986A
+ 7F0B23917560368F150906484834DCED76F20A91F98A3AEC772D495DD0A237CB
+ 9DEB7666686F903202E64A157C187C43C2B9E15ABECDC3AC4CF29BEE2F942ACE
+ BC0A71348A494BB3DA3B776CF0682DCD5F4DA7507C10AEA4B3EC4384F8486DCB
+ 3CF8167BD34C503D76DDF4018060477B07B1AD2205561824317DB05774D8FD9C
+ 8A2F54842756C5484E4038E1FEAC5BE5D5A7DEAE4794392838AA4E64B1BB5F73
+ 97BB21CC589F5DA84F4BEBEC1D13450F6CAAA1CAEF6B94F24453504F83115774
+ 268CCF3B0A57A64D5B893764471D97737AE25E4F6953AC2A4E8422E594A19C15
+ 1BB8299E2B890B7303B8A292C4F1EDDC87501D4A186173E6F71FA24EE53A0C1E
+ 1307360EBD44CC8839EDAAC49F306B8A9A1530078F3F0EDABDB94021BFE48A3D
+ AE7733552ABCEDA8535BAD14D0ED8DBCCF89ED7986A9801C3B73396E6A45EDA8
+ E267057FDE2CBA0C330A77076B80191AEFA60E72199F68FA36DF6BAD882E9F4F
+ D441735BD001A958D44B20BA3085FCB5D1AEF942FBA8B178D0B00CD2756619F4
+ 1EC0FE340316BD5B5502F8AD767A0CE17D2759BE64009040D7F1BA16E002D2F7
+ 6308366CC03D0CBCA48339F017500CD8AE1D9192D178E292EE9B653C4AADABC2
+ EA01B3A33EB86C7A8CCB975B8DB50526AEFF71DB7B472BAC3567D8BB44062CAC
+ 4E2AD3C975C196C45264D0B79E0B702556526F7FE78D22F79D484B04F9CCE6E1
+ 194EF34B7A4BD70FCD389C9F0EE51AC69C95938E0AA10A6B8C9E8BF479D77BC0
+ C2866C17C1BFBA8A70D8FFA6BDE1A26BDFF92FB958CA6AB52EAD03A46CA69403
+ 589683B041DF6622EF07AC5CC6E6F8E0A9F32ADCE50D7BCDE58431C6D3092BF7
+ 5812AB842B23C0B5AD11D72F38F32ACDCBF7B64E5B26A4D608A0E504D4AF68EB
+ 04273EBE4B1BD82F441F27FA4749D553A27834116A3A2510A36BF35B208E270E
+ 194648F76D712B488595D56C471FDA3776F1A87E8D144E069066D35079D0EB4E
+ B4A72E2AAC1F2C4DBF14B6CAEB8E4F9089C2E8E7FE9162BB88051C622D5FC90F
+ D368D71D8ADB532973BAA991D414DA88DA9FD5410B7E2F31B4EF4E9B7A1EF535
+ 9AD0491C7C3C1B4F3F0F9499B94714566C1B64E4FA03E9FD5D5C65F78827A355
+ 78E49D6C56FA3E1906F32DDEB934C507249B2F8FD30EA958A34B0ED4FAD7471E
+ 0FA6049DE31131BD70F78A6703A33BFF0C77A8BBE201F48158EFF4B6FD714C6C
+ 0C82D8C1233EBCA432423AD90BFD18F11123F4B818722631D964FF47D31D1798
+ 4741E93AF2DB293196E7F0FF4239E51865A1AEC2020F577837B8CC4FC67C8C8A
+ FE4C112539D0EF3E60BB6A3A3ED3BB3B1DC04B73F4771E8290E6E1D4363A1A71
+ 290E6508AD25C42748B74DD2907D42A01C7FA46FE20BB62CD952DE48E624041B
+ 337E4E03685169AA5A443F3E8D6126E122CD22BC74E31631D96214370FE0E220
+ 97B960809E616CA5491D0EC702174108D5CD1E765B66D0425BB95A1362984815
+ 745A9A76D70BC59747593B5329CC3E3988109565E686D3997FA25757EA429E02
+ A81A7A8A32FF35CCAEDAD30E0786B1AB1ECBAAF69FF4114A6BFAC7494937E779
+ 9FF24073560DB980F9CF1D562B0D926053A42AD61E5B2F9F9AE5639DE335B7C9
+ 95E8500B5DCB3C126365B8A9BFAD0AD1A9208F282EC151BBE2172F8903538D2D
+ B9C37A19B6C16A7A61C6274FBA1F44E395EA358A57F877F35F085E1E46CFD69C
+ 6B9E3C78CD6C793C8F93A196FE6D68B60E55CBD93FF7AF2C2AFD5E8E3660A765
+ 8E92C3C89D561E4C4F26C049A99AEA697EE3DA286209B4CE552304FF393BFF25
+ A1DDD8A5B07A14CFEFD657DB3D68E0D0604003557E966BEACF64F468A9373D2E
+ 31404ED1C4E18689B6EBA9C004113F48ED436C754782D69BD5BB973FBD2410D5
+ 87EA1AA852461506A9F7509501D8F5A08101E845A482DA5FF46C17F2F6590609
+ BBE42E9B25B273205E21863AC496C78F222FC8F5AE4C78D7BCF788AE51805560
+ 965FE8CCEE0E81529DC2BBF01C68CEA89FC29ED0E5BBF08637CA2F0C4C3AF81F
+ 881F3D0E5F88B69361C112C55F47E8F00EE24DEC8BD240D953653248DA496205
+ E6E5A6C347CC4F272C68F695332A1CB59B344F969153148BC8EE5AA5E4214753
+ A547B8D8A16BBADB13F27E5F9522353F7A0C19A95E0C3E9390722F2EFA9AB382
+ A615ED29F31235FA283BB2FF3BD54F60A7FE66A5C9D87B407682018C091DD842
+ 0AE925620D5BDB70A8AA4F61EA91B83CFA43B6E6657D7F4B916B9B758ED0F342
+ 51A2BB374D34D8B2072335C5480F7D846867C70E931222C83489C33E0AE0F416
+ F3145E32E658378DCE17A7244FD725EEAC49755DE55B2FCF4F9592CF17547246
+ BFACC079D5584B6180DCF305D1649105FFF99A506A25984A0716637F5C71E7FE
+ 546DC79B49BF6A42756F38FCB3299557E77E880CDD8CED7DD4B12472841D4150
+ DCFC2D4448CBCFBB33312CFD1C3B923AE85CC727C4DA475006C65722335AC493
+ 456DB4CE9FAD6CC3473500412AADF44E7019F9AB62BB5B86EEEAA02CF057255F
+ BD222DE2A80EFD5768BA20379949D2198BAAD2B090A34634A9901731B7E48386
+ E7765F3E1BB648B26A6E25734EB6565B32190E0723934A17A10F51B35E15600A
+ 529404FD3ECBBF514ADB613F7A837AC3A12C44636E9DF49774A2020D0B42881A
+ 610382E5E223DC6380DDB5557BAB7C6C9FF4B928E66998ADB380291BDCC18096
+ 6FFB84FE0D892755B4B2A55C5E0B0E47174410AAFDE15B1C43FD06E67F505751
+ 961FB3AEF1F19B5A436592184DCBDCE16895B67CD0B8EFD4BDE7F99BEE2AC0C4
+ E5805F49454A2D9BC941C98D2618863A211E90B3C344E060401222CF34B0C2BA
+ 4C041523D08EA488D18819DDDAFFB6772C20CECD2793DFEE34ABDEB594496CAF
+ 0E6E40FB1EBAAFF1A5EAB3AE9D5A4BDB9BF3F0282378DC9F740D108F342DFF7D
+ 835078E7BA33432258321C3FD1ED4E37E35F1365D9886368F9A2AE62DD5CC47D
+ AA2CF712E6C681E66F8240297F92EA6DDE04024B3D45B209A6DF52888AADEA39
+ FBE9DBEBAC0EF32ED036E3737D808A63CB4AE9A545CEE4179EABCEC784A43978
+ 2F4E017ADB9314D7DAE3AF7240C8B07AE32FF916B73B9A88CF24F99F0C41FE39
+ A5547BF343DA930DBFCA79474A38E7EEAB905233D892B3A46648176CC6E036FC
+ C17E701E1F4F24A66C8C3200E16A00F77BF553CF8561D6D0E668683DCBA5C8D9
+ ED5FDFB3A6C662DC3F29BD036C8C88512028EAD6D5F213BCA1595A483C77908C
+ 0A0EA3739D8F26A0460644AA5703624757BC70B3456652B2A7EE05EC4A53DF40
+ 40BBB888ADCA26C4061C2C698CB2CF4239BB0C9D4205DF02895728EDAB504383
+ E14BB252B70CAC38A401A9327767DEAC4557345A14DAB504FA42F53B5D4DD142
+ 284AE0D5680C7368709F6CD607D99A254AC772E6BD01B0855EBD21D4EA7A29F0
+ 8CC48B22C62D206BD673271D6DC3D40716CC203060A3DB1188433CDB1CD3B3CB
+ 7BC32E6481B184BD5725F0178E0EA5B4B3661E4D2CC4B031FF0AE74B34FC2BE8
+ F3E1B472629D9BEEB929ADF8A5E2524A49673793DBC87CEFD443B779550B9AB2
+ 862542DA58F3B2D57DF38FB1C30853F9348226756D56F448D2EF10A66A98A40E
+ DA6D556CB5ECB2FAEB427EE93EB22EA7966301C38204254BD73DE19AEBF2DE95
+ 597029E8BD36C1D834521AAAA6898DFC650CCF6B632081A1FA6C585E89AF00FE
+ E9A30AA9B30006D8DE580ED604F2279A5A148DCF1EF958AE5A97E8AB1EDB8F46
+ 663549D60FB74DD679108A53266B3F80AE5E5DE2A9300309204CEC028862E1FC
+ A7076E571484DE24BC84FB19BFCB9E6AE784E2E1278858CD48C6A1C2FB9CD803
+ 1A095AB21AEA779BE917AF63DF3951799A2447FDACC9BE6D96AFD1039D5942C5
+ 3DE87EF83587543AF871F27FDCB398821A53594780BE96F07696EF2D9077D29F
+ A8F0F2B5503B4E46B46F5382421820C6B9AB6F2BBE621CE6F33D637325CC92C7
+ 4EF637092D6E8BFD60A0F52383676A8E0F3A04C5F52D3F4BB81EA900D99E15C6
+ E4D5DE7035C20F00C75DDB3A136678E1B4E375A533D6F3C4DB5FDD916C9FE7A2
+ 11AE052C21206697FDA650E46D4D72CE3A1F2A3901D9902543AEE61A9F6D88EB
+ 934220C0886C084DCDC740B20426B5E3F95A85B042875515D475FC3C1AC6C763
+ BA2E305B0E0BB21A0CD707D75DF0294B4E89388D8256002F3F5153A09883B92C
+ 7399EFEDDD9AAF582BF952694EDDD1056AE6EF6F8C40735B2D271A870B33E07A
+ B3EBBE9D4AE4C5E1599385F80707FF110E7CF9BE1F1A6B17EEB344EED29FC9E6
+ 2439D66CA9D82D2850108B6B5EC23D55BEE6F1196FC2BCE8A159096F2DFCC896
+ C4D85A5A2C67D32DB4AE7A6621BC3D14B69DC2C0E7A9F59339F933D97856FCF5
+ F5AFE321D17CD7C9406CC0C55484ABB172F380E886B50E3A82AF1D155C080C6F
+ FE150189263111678FFB6D24CE4258EB23F0964B7D5FE7A98C9A3CC75E79EF63
+ E08CD9C6257A7FD97BC49A6FB9F0CCAAD1B3DC4301F6FABBB745047CA02A667A
+ AC18FCE3290B1AA372D217C5D84F9A7BAB1AE34990818A15A3E2A59A5EB7BBE6
+ E4067808DCBA259A168669C28C264081412BB461F09309012CF9077EF64BF09C
+ 0B0F60DE0B9EED910DF5DAAAEBC228DEE7B2CC105FC9FF8915CB7E20E2895431
+ BAADAAC47EB5B1D2A69C75260ABD5ADFB9C160CD7B1F6A2BC59909367A1C9238
+ 28707469327C186F670EE7E0EFC0A66E82EB76073B5C8D8FFB96E158A5F37676
+ 0C8AAD263667EBAFF1B7C556889C914CD3938D1740E7C049120D023C6BC1A8DE
+ A1C0A381B4B60AA7A9AB9FEF3E8F1F7835A671DBE7793B87D7D5AA7FE23CF0C1
+ EDE7EF42B98F02AF16A365E815747DD5989DAF9E8611FF674A4CC3D2602AA9E2
+ 1EBC1C2810A7ED3717A9644A8D337A8EDAAF5F7C4132DDBD448145F7AF50C688
+ 012FA81FEE531718B3A0B6CF588502680E4051CA33C5BF8C507763D162F23ECE
+ 19D0BD3F8C590FFFA6C081FB0218FF37AF5A6A24D848E017E0677110AC37FCD6
+ 85D72FE5E3AF58795C27168A81BECC201668BAD533F13FBF64C173936E02A5C2
+ 4784A2C13C5A51D99524D890E2C35B2CCABC2D6C2A2DD3242ACD115B14C89F03
+ 42098F4FD5F10BE2364C105CDF955BE2318539AC48EE7A16B138F64B89704440
+ C5F71B56ACACE1B3C25B90ECDBE85D931E3EEBA7D4AFABC0AC378A3E3770C511
+ EE7024A4A0FE90D4882FEE32A9DD4D7AB0FCB2E44AFE4F3AA4DFC76063A01040
+ ED0030C0D81A9A6FB84218D7B8EA73B55FC1C7AF13C7A647DA780BB6F6E58BB2
+ 082CB9401FB515C1482728A3A9D48EE332591A6B90564EB3DFB9569D05E2CA96
+ 539516890121963F607C07C61D51BB540F9B58815FAFAB3F1A07B757A49E515B
+ 0CA5F581A0C8872823F8ACCE3FEABB96C3563F5FF8A22B2FF29988EB87CA18CF
+ CA8BD163A691A2876A9427A9A0718FCEBC93B5849B90E95695BD97713BAE640D
+ 78051428F2A2866453227F23BF7A759B50A58C40FF45C0626F2AA3C80EF1CBF0
+ 15630AA5180AC0A684BAD3CA3B525DA8838584A9CB62FF94D7AF72D53828F38F
+ 17498F79F13730885E5E83DEAC39AE794CBE968220C8811D02AAA36BB1071B65
+ 09A8CC6F0207B7E3CA41D714F9D7D51952B13A51936CA838CC927D7BCB9386DE
+ D790B9F03628D4473FB60BC2FAFF6CDBBBB0112D37171B96F358747420DAECC1
+ 2D470E256DAF95CDC225287472786F0294ED2E84703169369475694B2997BDEA
+ 866BD6E6BB252C0C73DB5E675229B8F305453F17EA650D9B9BC64F2DF0C470BB
+ 12931101F3DF25990836A181521971B306D6F356D5DF798CA7E1155E1B5684F5
+ 623947E82893A165BF691EF770F6309732924520604997796CF667600D0CB1ED
+ 4278BE81E9F7C6E59A4C8A949E0FC0478798135B98B7F834922E3686C07DBE4C
+ E552293BE6E3348BE36306144CE8A1499DB05E76240AA7ED077C7DB8F3D87E52
+ 712A32A9611B132EB6918EAB1AC9096D31E43153FE7D5B43F27EE8338E52FD73
+ DC3E7A51EDC9D861A575C850687213E2A509EF106C2A42A833E50DD4BC6AC52B
+ 71373DE170E5832B8A4785EAAAED396736CF0DD9AB94D9738026191EBCE2DAEE
+ 1DEFD536D74464674E02D2FBF0872A88DFB2B8812ABD61D3CF706E05D19E4EC8
+ 156C897E529A95EDC4230A3AE6CD2EAE85F8725EB094F1C30E15BD4AC0D30E61
+ B0A91ADBCCE46F81A13411A6A8BD809AA1E1CCED8CD5B067943CFDA41E94D13F
+ C9096BAAA5EB2BA7F942E84CACCAB801846E4D0F806FEB46851B98F0EA855873
+ C19FAA78D4A86DEAEA36DA2EE10ACB9AFF3A006454535F627C6D21EDF3087EFE
+ 84857E2FA161C826A4D700EA98F6AB6B41ECFED920A00BAD935EBF9B26E121BF
+ 5B279F7F044EDED32AA73D0DE2D409B30B37C8E4238B2B7BB89A0F1AD377B7B0
+ C491CCF93A9A6CB37600606A721B8B2CB1EAAE4D9041170F553F6C5D5B0233B1
+ D4554209A94ADD54ACF2729D45777C5D513C4C91AAB86B28F8E732F261D86942
+ C1E2F2DA7B908DA7878B17A07DC3ECA42A4A3637F797669B06D7349C34F46CC0
+ E3EA6295583EB647BA8BEFFF751081F59B7125A09A2A544A8BDE54ABB2D208B7
+ C77F59840B1EB0D173965A1408F6AC8BE12F9CFBAEDC7FB45913D118E08EF85F
+ 8566142C495A7AD5D071DB872CABFF0DE1D392651358783CFA444B50EE02D674
+ 3945962D18B4D4162D5433A025FB0CB167FB194B705468462BBA0E1C80679CB8
+ 9681672D3FFBC6B70569C31482408E5ACDBB3829471D63835A6E8245539BD40A
+ 8A491557ADDCD57E52C3E32A01990D107BE3253EFEF76996EEA9A85762E461B3
+ 7D67EA88F9FFEE5D534189E6BE640CE2ED9026FCACF9A468636F193AA31A5AAA
+ 3753C853486346E94F129A7E4D7862AAD1EA4BF4D0323D324ADEC02F5AE132D6
+ 35E3FB11FE1CCE8DAAB0FB95037D6EF06241B2D4DC8EFBB42B3C53C644EE235C
+ 16DC34ADDC4189F24E7468649B6EDE4116BA57B40D7603CC6005CC957334CE84
+ 852DB6486961B49577236E715FB12BC05FA5F20AA4A3CFDEABDB127EC9A0C08E
+ E7E3BAFDEFDB6354D12583F26EA250B7009AE11A426CDF92581A03558557BEF4
+ 2A82DAEC2D88D5F15294253A968B6283B6E20685E5167650A777FC8A80603822
+ CC91972DF5B31136A1E7F6713D82B0AB574870789ADFBEBBC8771AD29BB56CFB
+ 4A1D37512D350335F010BFDA0D0C503F8E0D02BFF35F3C1D15126800931F4E21
+ EEE504729D6DEDA689D8CC5CDB357C658E3F844C54771A8FDC9F550EDB9ABEFA
+ D1CA27E6A94030B367386378A5961803C631A1603E9D70F3F86C50774442038B
+ 89C8C1D50371D9C3241067BD2932C12F60B739312E4A947CEF31C12B92AA1CC5
+ F4ED7CF621C83E46537A33B3FE67D6BE0A14B976F9FC519A3FB60C303A975828
+ EEBC5E072A233253E64AC5A9BBB51FB05DC311313921DFF6839553963560DD82
+ 514A0AEC43D9F061CDD14063AEA1D60625A2885F7991B1FF4BC909A647B72F2A
+ 9427E079B11AE5E69CF030FA911A5965C144A29D28E8F095EACC02394A9E4DA4
+ 62603013D887B8FB6AA1AA8906F6F1E2D2C75FCC26C2B22A0595CB128098B90B
+ 594A4290CB93601525549DB2AACEB419A19C2312DE8BD21F4E639ABA8F963937
+ 8294B798BB4BA0F348F074D3C216D36F418334BAC6CDB525535982225D45ED79
+ A762E1B188CD55206674D5AB6A1E3675AB164E1A8D20F1CAF41E4294BCC51BAF
+ 20DF7BA230CC68D10043A0ED9819E2E1EB4B628F22EFB196ADCBDA22DAD09D62
+ 998C401DC676B87DD64B530C1873C826F51FE17F3DC97F238E1FE1165D591BCB
+ 77F3986EEAED4854ABAC1787FEA922DAF58EEC7B8A7B25B62A18357D1FD82370
+ 095D191E4F30FFB208B09771C3C6AB6810E10DFA40351ECDCEA598597C04A83A
+ 2285069017BA72D69EA888790AD784593505047F1D1436320049B8E8FB6C0604
+ 41E1E91DABD430364D1DB3A2C7C116EC8305BCB5B09E09CCEBFE83B6A017E84D
+ 795650EBA1A255533173FB803DD59FEB4C4F8E60CDA847CB09DE3CC76B4454BD
+ 5234E8527E0B9DF773D7463AF9E821284BB128A01594340C2F54144D1728A383
+ EA5DF10C2E005252888E115C54F342B7D0F32B380D039CE437D3333C857ED3B5
+ 4ED9B427A922A038A821ED5B0317650AB3DB0E5A35596E49DE08C40104A6F8BC
+ 59BBA1CF7A961657DF4E9C33E1E16BBD094EB124C392760893062ED0A1CB5A28
+ 904413CBF6F4114F80BD8A62A47712A2F7E28729D9E20C8D9CEC379ABD35429F
+ 3656D89AC353EF48A4C30600791EC5D9910B2F5057BCBB798E1EFAA0842AC4DD
+ FCC55D6E4D6BE183DD8CF8A6146C0B172395A8E0BD2DE63D05933CFA95DA9A93
+ D560D316CE85C233ED0C84D7236F4601B2340D04D75505447DBA94E2AE2192B0
+ B0AB807EFCBB9BFBEC65A06F0A45BC166A7B32CA82A90F02E68B7F3334ED80E0
+ B084766F14E950B0956DF8BA9F9268EBF2A0D599504AD283071B8DE29E4319D3
+ 53F8AAB27AA9D5B4B5894DD8419F4482FF984D5890C02D2C9F45632C1717D1E8
+ 2A5ED08CA334DA38C8BCD1BCBE04C77D3617EFCB5954D3F9D83AB699A1CE7C0D
+ F4480D8A206C1FAC4D8C12F3563C7EDF8160EBDAB7846CE471E0C9B45EC7BD22
+ 3F20134EBFECD620FB7A00BD89A4546AE686EED5CC08434F981E7EE108AC2806
+ B6A2821289CA24053D0C88F5445E7D45289F5EE331F2093D03C5A677275CAA2E
+ 403299D6BE2BBBA8790BD81B185112E99BC0713D815D4542A2637C762DD063CC
+ 8EBC782CBAA8341CE101DF7C3E5AE0DE1CD6F21EE6425CFAEF83D36DFD22A79C
+ 8BE6DF6F08FDDCF6BEE15619C5B50B88283910209F86818912B9CDC542297D74
+ 58FC880EB54B8B56E7E94747F8641D5346D7D91CBA9C6E677FBF514DC7043551
+ 9C507073519DA26926E8BFDD1C8B709DD5FA10A8E67FF09AA6E378B89200D901
+ D29108495A4DBAAC3501F085B30B8E467B33BFE1432E8AF81EEB92BB713207BF
+ C1C7BC2AD2C4CB7D1A581B5559065244D1EF96853FD201C0A5196E3D13149BDA
+ CFB03344E1EE1C700360676C811412FBE295CF5BA99AAB0FAC68D0723CB717DF
+ A852D3E1744B16E63ABA56675D9E6D517F2AEC7CF9245734DBE2E8DA7B0F31E0
+ CCA1AB692D41D367B4CA08FC8B1AB98FBFEB9230FC8C92A5D3A770799C7C0FB9
+ EE6A5C6A6C8E2E7AF11B31E829BEDC9334739E6278D6BDF6C9F35D2FDE69BFB2
+ 8889FEA5A8A19676302877ACDD6B8527D679C5FEF15F7F13A1B4756673030AE5
+ 26BF6977A78A607C454BC8FCA41B35A7EB3ABFF954D5967CBA94DAB4C257361D
+ 5CE9090DD2B6E1AD033448BFE60A9EAE5947D5295B3764853168355BD2238672
+ 47EF84EFB919523329D2F6B6A954EEEA06A31B2C2F7E658511D8FBA2199BFADB
+ 9F22082052DE155FACFADEBE4CEC13D29FAFCD481250E702FD87541AF2EBCBAF
+ 74E76716FA7CA8A8B75AA62F48868D8125D5C20E07B85C892C2DE53F469CE66B
+ A3E85010C7BA693349C5DFF2DFD09290D00C4E61D4E1784C70F8930BA0CE158E
+ 2F3F9AE080C5ED441252042E2298E3FC97E0D9B391D6456D0BDCA68C9905DDCB
+ 9105678339B0F4CCDA95A3182A15E4F715CA8AEB93EE80EE4DFDC654A4A25F92
+ 8850CB4894561A24867BF7FDA330AA8FDD3B1CDE71125BE8E9050691374E770B
+ 629779FD58E81519F36B3056E014D992E4009C16174185FD53AA5C786794D103
+ 56B183D52A7A6A91B572AC0F949FB7671F5A3ABA45CFA94F92240D5D6C6A316B
+ 8D9D66FD4610F89D2F15D2C484D92086A2BD6E26421F751F07D6763416309ADD
+ 54842910CBBBD0574DEF688D050210089F9DBAF79ED7C647525956AA6DABFC90
+ FCA4A609AC5934896BF25FBBD2C9059372F217BDD15F1B28A1B480B909C8A3B3
+ 653F6D2A0C4CAAEA3382D618DC52B243FB0881F6E15F0F2945C5740E43EF781F
+ 0509E60E5A03C7E025F34B5B6818434BF78FAF7C295DC9BF62F4BF6DEA1F07B3
+ D220AC3BFC48C213A3FAD88B5A18D5D750C13D77DAFC67EDD34663F7672B8BC5
+ C94964B39FDEECDFE6233C7A8865C4AC4A3248ED5F2E4831E3076301B3217870
+ F2D8F49C430DD3D8691C6739BFC99DB8755A902AAF3560CF5A67C6E93CAE56AF
+ 2C828DB3F50DA01BD93A12A75E123DF4B8838E77E762428943C7633D13598974
+ 7280385E0CD6D0F3302C667B9913ED3080313F8979979A0E0A762C9B70A6CFCF
+ 914C86BE2B8243D3B430AE32BDEC82A2F5960400E1F2849DE942EA40F295A07A
+ F902216DB8C6FCCDB5738C7C742E5FB4DF665C07446367B3DDCECBF005820023
+ B1B023A4464F3EA043A483A98E1A4E1FB95C3C0A4CE29119284196F24EF1E585
+ 430BAA759D5BC8F6DAD2C3596F04CE340377F57D5D098040D9FFB16F8285CFB4
+ D6DB3D4D438FA053BC4E1A7290E7B1AFDE711056ABE54B4A326D209AF5D15103
+ ECA33F5564DD16C5EF8B13BE9C11989232B969D137675A001C7BE488A4A86964
+ 2F90D4F98891BAF1A482F4D09F8D872EA2BCC69742695AD06E7B2BB542147AFC
+ C3FA68BBEFFD7953E6C813FE8C177BCF97DEE11E82DCF42843F261C4C244BB5F
+ 191C47BA071FA3D9EB89690EFCD17908AF8F78AA361B01333BB6896C5126F71C
+ C045207F2238713AA48F207AF560A21B962421B3D9E954CBB910979C1DF8ED6D
+ 79FE2FB68DA4FE66725DD369343143246578CC371915DFFC5E8BEE15A79006EF
+ 9F6D64FF3A54F43B806B98623E8DBDA4B6F739B0B851417DCE28C4451B603561
+ 444B1A305AFFE94782E6B48767D47E223943804AE005434C8528778B7B670F09
+ 451822DFC72B9B858A23962F76D5BB303122ED18BC4B1A2E5E7374AB06D8DD1C
+ 03B5C6E4818BB2B9C21FEE7D5226D129A54C5BC30492F19BCB836DC3C463C313
+ 303BA9413236580C78C81F372B88F9F7A1351E23B9EE5218A511EB419F8F96E9
+ 59A2C453DCA9B10FD6232995C487E0C66EFA55378A6E143C5C5C646D9B2B0BAE
+ CE3D574647D86B26117B36F89DF420782C0B87952F4F63FCA78B0D90CDDA4832
+ FDA637A59F6A366ED9DD070DC8165B9C33AA52B9B97B8F5026BA2F95BFB6FDEB
+ D1777666B12396D584595A2FDD29A97C22EB4B1308F3C8E55E68DB76A5373E80
+ 4DDA6E74F9F203FC02C83227C97F473FE1D66FDD77AF6EC25057E3B95BF31308
+ 99CE13283CD1CD74F74F628734BF9685364BE288873182473BFAD4C703D4F5FF
+ F2BE722D82CB03CE81D171FCD282E452DB20ED271F4FD08795A966344A4D2059
+ F68A4717A6712CE1A74DA191569A39F11ECD5C2CCD543A88B4D7B603515BD45B
+ 11CCB54A9D69CA4C78095901E8A6C7A9A2D8EC974644E6FA88D2AF469455C824
+ 850431E15A9ADE01B81A5F9A3647B2D4E4833368CEF1AB96665B472334CDAC3B
+ 0ECBD6CC765F56FA92824C6E9DBFA1DBB191CC280F66CBC196B810C5EC1A03EC
+ 201CC9E83EDD46728889AA4AF70EB547FBA01C131AD900035B297EC5039047D7
+ C494F5B866F4AB8F58C1C080AE8D9179CE7E1CD3490C1C965839883B594A0852
+ 3D9B1F3A7666BA55A60229A3D9C35A75D97B0ED49E6A65EDFA2BF5E0437DF313
+ 88958079B3CB2E548CE3110CEABF1EC0283013BB8744E31EB09E1F0DAE67DB01
+ 7258DF2F744BAF11D0EA2CA9DCF7D99B39B8E81F554C3B5683260237954AF438
+ 97B3C5E243523A53C9F3832DD49731038BEB2B505BAD8F140689C6E01B63B892
+ 9D0AC8598DEFE60F6B84074AD3B8B725403D8691ACD856A95E0711120D9C34E8
+ D69212C2FEEE13D66B289509A1BDDC533BDA2A1CDEE4B8B3463DB821440F5C15
+ 1BA8687E36F1AAFE01DCF6B1F192A6CBCF923013620E2BD734059CD34704A51E
+ C68A012C4A7E7DB6A3DDC388F94270745920D7A7FE8570DC335D01D8824A42B4
+ 3682FB35DDDF5C16C1C5E572E3968287E0D64992D9FC95AD8A0F7099CF10A4AC
+ FB54EF30779AF077AD09B21554CD4190B6B3F3A8963EA2CB1C34E148BF1C5AF7
+ 79E1E8ACFF25E9CB2C731157B65423719F019843B879B0ADE206961DBCE8D2BC
+ E0818FAF559F917B093F8F73824960B1A681E6FD05DDBD49DDBD9A2FF59200F3
+ F57EEDE2CA5E34D693A78C6BD78DB08711D1E27DE69F19EA09CD1419315CAFC1
+ 7405F713628FFB6EDEE4D47151520E35278C975D97C7C62E4B90969E15C4C590
+ 37E6D448B3254C5A3E544230592EC9D0F367D6CC67CB0A49BC9BD6FD52A8AAFC
+ DE816D75B4AAA6BFC086867E05E35B7B05DC3720CFF1F83765125177465E23C4
+ A5704832418E67925158757ED24BE004F3B1AAF97FC8FCC724F8C302685B75CA
+ B6D08DC5A4EC538357DE16BF54A807788224D8D0993B19C84C4A89FBE07A3B01
+ E17578E93EA70573448EB2EFBA23538F54E69DDA4E7C89FADD579CAB7FBBF319
+ D3F4B741D2D669891831D2167CC03382BED351FC73AD316714F5A517CD8F5293
+ ECA17E6C4A66DBCAC79B771CDDF01E7A75C64E4164A32DDBC20C71A388866450
+ 422F8AE7815E6813E8002A99AD95D7001304BE9AB09DAB4E0074A2D49393F80B
+ 462825A6C1AF5FEB7FFCDB1C1A19A9AB034F77CF121A4169A5198782070883D0
+ 95FE5ED103137876664191E2A19ED1BE12A6B215E9201903B3CE5E64EE35DF02
+ 253E4445B8B0599419B94AF7804D4F69FDF1A01923727CD5130374C00723A982
+ 24A0BE1BDB91D9C7F1457205F668F45560F8E20C1728CF4ABE2C11A73A08CC77
+ 10D86D96A884B3A3FC23DEDCCF07E0870D30205FFF8EA634CEC1BE00B2D7FB64
+ 27AB4B5714F435EAE5742772827C9221BCCD16A26C77A35B6CD30903DE3EC423
+ 570655E1868E200C23548E322EE390D23ED094E9EB4CEA83CD89FE3218F9B511
+ FD1AB66D40C5618093ECA3F32543DB2652FAE743F4CD20B11AC1D34B64D3BA20
+ D0DC4FB7D127F83DB2013374C086600D371BA8F4F01A5B4236101C98DC4F3F07
+ 82E3DF713B7D877D85815CD8A9F651DABE1C9DA374C50992643FF0A8A67632C7
+ 9CCC3D58D694F4282A4E9D3C7BE92745F0270770FAE21C96FFBC6457B8456E0D
+ 2B072222B1623FEA831497AC4C0F4C851523807F0CDF37CE940DC30381A907FC
+ E1D757B66F9DDE56C02C8DF14FF421C1F6DB41544B4BB28692F49A0E02ECDC24
+ DAFBFDF3A1F5905868DC4B5FAE40B2E04C6AC90DB4E278B8EA1EC1FB92438DF9
+ D44350A9918EEF4927994C24CDB9EFC9E4AE9CEF1FB22165BE3AA3064A32FE91
+ 5BAC05D37A493C15251E67029F242D8562D88EC52D48876D25FF71570C943F38
+ 623D80F033C4EBEFFBD1F5BD57C89189857A4F127D153F1D30AAD8F72A7A2969
+ A0EBBA58CB105963CA340EDABAB450B43DA5EB4EA1F866CAA315B743CE4E98CD
+ 75C6DB42EA3E35399B90139E27FDD606CC0EBE7422CE11C76E371989149FC514
+ A71C389E58EFFBED637793A50C0AC335B5C2BEEC6F06DCE4BF6FD1015AF0FAC4
+ 08184A3564B362B37FC85D162E50B97EF431E83F27E3FB1CE6EA4684530914BD
+ 4FD5E9F4586B506F19F3A3B4CB590160CF64B3B1B4B175196548D8199DCB19FF
+ 02B0947195F257611DF7CDB4E0C29D69ED1FA96A4B732555782673199CAE349F
+ 3169612CB42C0849BB2A5E2616AA3F08AC08B4CA0882CEE04EFA0EEE9A3084F2
+ 36EB31440CA249D5CE04E1A3D6BB4359F8C89FB9BD76EB8952549C7D46F0CCE9
+ 652CEBB0A71E1934BC53B2021D2DEC632C1B5782A3E6ED7DB6688FB33196CD3D
+ 6213059C32A6FD51FAEB393D9A218BC50192C31999670C6B19F2205B081D1495
+ 9219EF6C147D0185A8141F2B3616509739A9372EC68248659C6583E917A4F896
+ 8E127A8BB6A8503EE3091E0AD20EF0D09AC24E273339157BD60FC8800BA96DE9
+ 502EB08759131FCC9FA83E4CEF0A5781D93F5358BD5307A13BC3F28A16E724F5
+ 8C40BDF91CA1AC838B1698488A268164E9C1881AC9701FA86A2BDD2D44C3C09F
+ 8CB6F938B8554E9B9539F53D262F6BDE7AD900A45E77074456D2399D63B9923D
+ 5C98FCF5BF89EAE36C34720B72503B3D44D0A53C916934CAE53B2F9FBE4D9CEB
+ 4D591BA242BBDA8F317430BD668D7F59586A47791FECEC3EC539FFEB818875FC
+ 78BB40AA7E96F93F16008F6F1C63FB2EFEC282A8D9BB74451D0799519276BDC7
+ BA8751BE71E4F0B62B633EC93B9ED5F07743B91DF4B997C95388FA509C072C32
+ B144CBB10B2C7FA522D7E8B9A628B6EC48CC5F2EC3CEDDA53774CC5754B9069A
+ 6FC8EA3FA7F1C1B7877572832BFEC50EA7C6FB9D5527ADC459A9DC17E04FF94A
+ 4EB1CB90ED10F8267C3ED0E15253AC24D8EADC7BBE7008F9BB07BCFAF64696F3
+ EE953AD09CC2F47B09205875ABC65B4DD5FDF55D90D71A7F4EE4ED8A95EB9C90
+ F06562888D686E31F7719027202A580CBD1382A71A5EA0CB45F98A731C7D6B7C
+ 6238262D6F3290233D43C7AEADEA055F79F1C7341552CE47FF361011FFC1B22C
+ 53F2560D6836798391CB278DFB2BD6980FAAF23B34DE90BD689D0EE6EB7890DF
+ B703A5965DB4AA9CDBD879E71560FFB07F48107464C0C0503E307B0A62C92E2A
+ 162A4BACE57169FC5D8600D032F4CD4BB9AA587D637F552E0F77E799CD4B2EFB
+ FE3E2AC011F9B1ADC786A6B96366628A9B0E8779BC8A8AD0459F3691F5E034FA
+ 6C505A9D551830ABF251ECF8D37D76E8DFEE58BF95EA2D5B08708D6898E324A9
+ 3A2C5180A091E14B51717A2AF3B72E4D2D557BF7D63BA9788F944B52D3116144
+ 0D7AC98FADD30279D780111899333525B49F242AB06EE6CA0DFCBB72784F01ED
+ E774DB44F5E6E4527ECDE8F9B832DBB9B6B729D0058CB47477470916DB0F316F
+ 17C6D8C8F3CA746E97362936CA19B78C0FFFDAEE66259F9495AB9067DECE2070
+ B99D6D89D8C67E50D44CE3C1C2C90487FAA49017039398C59254E681E2DE11AD
+ F7C37193669257E443AC1ECB38C4DBA82CC0959051F5D69D16CB92645FE32933
+ E197C056EB064F9C4FF912C95186806B47B187F81A0EF0D75D7CB52CD700EB4B
+ D4009A052ADB27EB3E519FAF902777A2D29511C1CBBF75F9F326DAD29DD70BDE
+ 1DB918E57DF4463F5A58DB504A167529FD2E52CA102329F110F3F1DB720179D7
+ 903C2B4C8F60E5EDE93DB75C06570FE5857714408F99C5B0171B7E0F008D1705
+ E1A6A633EF7EC97CABE603E5A3A06CBE93BF1D5193C42C877F8BA3EE02487683
+ 07D5AF1CCB55D91300CDEB654398680E0F9E4AFC6E582ED9E77F7912FFC1CA30
+ 23AF9162AA4282B5DBDAEBFD0392A241B4952771D780E82A586F9C82A7B1626C
+ 5A2063AFA090F5F25436016E538567BDCAAE1AE25DD271BCD5961EB10F3C7AE8
+ 5C0B332C22D791C028B676CF9DE88452028BCFC367C3E8AE360BC5DBCEC6C55C
+ 5AB06AB802BB817E3950CAFF94152F4247561F78D801600DC9C599A2C2F75B23
+ ACE6062E58FE0D88C2673F4A3171C9FAF21504E15B7CA629965D2848CACFC97C
+ 878A5CAE43C1E62011530AF27A09C313F4E010AFAB52ADC12FFF81B574224A59
+ 936905EF77AC5EAAF28F181A05001CEE2ED6C638C5E201FEFAE1ABF0DD18F00B
+ 55C51E534B2ACFB40810278E95A7C194B1CFE2E645C445ED4731C43BADAF5F14
+ D9FB8EB80E04670AC4049B988362CD8D215DF7428A70BB0AA69D472D106EE294
+ 356703078E5CEE7CBBE6BF3C89134DA725F9B8D5B347A31F5A142652D30031F2
+ FA963D0C8A02C340D57197FE73AA7B4926508A843E24D7B3A5F495D96D3546AE
+ B02624A33299C539570BD85ECB324A8FBF87FCF82BD60EBE2EDCE7A1E874EACB
+ 975A9AF294AAE5C8F6D7A53B8594645E79CDF18935772FF3F669017754A5E14A
+ 55BEDF0EB08CDDA39430C6F19B4DCB6CF6A47D8D229164D0C90CF790331A7AF2
+ 321C582D2FEFDFBFD66FC764E1E7B7D4BD9176E1711465E4B104E2504CC94434
+ 1ED27BA1B8696A887CB3D37CA64DEBB28EFFECE6D54DE9E965E1D808A5529193
+ E5317C2937D40B60B0D7E46B6BB02EAA20EA97D2B8CCE58D85EB2312513C3613
+ 97A19625D8B349C68B77BA94C3F6738A2F2FD3299F5959B211D1FA121837D47E
+ 2C3BC63BA5D14BCA398D464A1E46E3A7619A6864CF4A777CF4B20383DFD13412
+ 82ACBB8F9766126BDD1FDDCF9ACE5DDB4C74086950022C2BE1C4DB94E2434C87
+ E51D8D49CA6A382D125D9F34DE6D31E8569B0100A1C138448EE13BE6EA1CAF10
+ 9B354F5E8576197E328B3A60E3D57B68441AF6D5B724129C5B528400934377FE
+ F0D68504D5FD4E232B0FCFFD53649830FCF9E65C354F843D4EECF6DC982E505F
+ 0599C13DFD30BB036A31CF9BF75921801D2688CA6C4D41382F7B9DE0618FE575
+ 109A38DFA07613E4C72895C92F4B7EA95EF3695635B605960717B3E33BE6AB46
+ D094E4358FD801E565080E82FE1D6BA13344E8AE6EFC8D6212457926F741F43E
+ EB3574A436E1CFF8DB453D5BCB67967146E954043BEA8C3E99E778E9A35705B0
+ 41F63BD7E1AA2C309046D3E544A2D6669BDB9B72747D13927B261D19B5BA22AE
+ 0E3ABD87CAA8A7A60837535AF3C959C4CF146BC3298EE7090EEF5A1FDA9BF0B8
+ 01DE14C35DFA0A791EB4D751848132242EACBE836DA416DDF3ABB86754C2BBF3
+ 4240FF80101CF9417CE90B5A1C652F171B6410EA6C4818A1ACC1EE83141FC1FC
+ B200C13C345839438327A5BD7956B493CC704E5E79EAD9973E9E9EA54BAF66E0
+ 9E281B4C84FDE2C6EFC433C7C6883A9F1E95087A53F74B1F8DBFF8796034AF14
+ 1F2CF2283E2238B9BF63F530A749D8A365180C2BB43EA8CFD0587F580BC1F9AC
+ E362C75D8681402C549E25F15E69E05FFF72715F8F05215F21408DB5452B2683
+ E9880496197A20B96F31FCAD13859871435ACDA737BA1ACEFE41D8090A801563
+ 074A260287F96D9E6A276B3F8041C86088C7745EBADC77D06AC027676D1203EA
+ BFDC60B63E8FB30E1341C6F1BF053187E7A0A3443A5FFA0D55663A6D95ECBFC1
+ 60BFCB21E7672B7932FF6B0A87425A4FF6700646C9A57939DBEA0628A4B70660
+ F9FCA81C366D877303E874EDDC0C179C2E3AB9A7D2C0EE86526625F6CEC940D7
+ 9FFFCAD811077C4C5A203DF5C14EB31A786024190B3AD9D3B967E99A6A3002FF
+ 60E0CDAB87DC917494FB9421DF1CE952F0E81BE65187B1D50099A115B454A703
+ AFC9B74CDE4E43D4515CF1D15ED200420E171F3BF7F13DA9B8DDE6B6E35789B9
+ 7CC52FFAC5C84F83465DDAFC1C700807F9D9BCBE3D178BBFE4564CB859CE81B8
+ 644744DFBBA8A1BAEBD5121508A49B185E5259F3069509DEFB55DAA5971A598D
+ FF6D174F357FB7A19441870BCF9DC443526380DCCDF4F7A680330226A9FD9854
+ ADDACDFB3BA9EA69A28835908F154CD13EF2FB6060CFB6C9BE53FDD4135DB278
+ 7F9522A015EE1CCAF2ED57A32E8CFAC8E621C3A99364F5C8F082BD6332B787B0
+ 1918C780F540A3CE105FAF392C4520216C15890E504FB24D4344068D546AB01B
+ ABC616C1EDC3B8E870612026AE3BB6770646659EF070ED2F1100E99B1CCFC6E0
+ 21174DDC11C001259146F0FB45C09F2E122DE922BBE54B02687F014606AE300E
+ 24F144353D12B1698F20FEF6E9B0CF61F8E82E0CAD63A3166A62A862EAEC0DB5
+ 6157B7CB8336AC1EC8B56CCA151030D0919758975318DBB5019B212428316178
+ 1527C8629357D4635739F0FEA92D59BFF07DF6FF7D7500209F6FF2BA56AC630A
+ 1C012740EBD5BD2F15FFF91041723981BA76C9C78049CD1846A7FD67703B06CE
+ 272A5AE8D4625EE750E2A4F504871A48713B68A5AD78FC889181CFD753A5B5BE
+ ACBDF15623646BC8E2622F7213D33DA46490A067575AB4C8611C54FC0222602D
+ ABEDF98141F3A6A4FEDB31888DBC7623D351AA68FBB97AF333863492C9F59D66
+ 8948B0C177A3BA1AEB
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ %%BeginFont: CMR9
+ %!PS-AdobeFont-1.1: CMR9 1.0
+ %%CreationDate: 1991 Aug 20 16:39:59
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMR9) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMR9 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 11 /ff put
+ dup 12 /fi put
+ dup 13 /fl put
+ dup 14 /ffi put
+ dup 15 /ffl put
+ dup 19 /acute put
+ dup 33 /exclam put
+ dup 34 /quotedblright put
+ dup 35 /numbersign put
+ dup 37 /percent put
+ dup 38 /ampersand put
+ dup 39 /quoteright put
+ dup 40 /parenleft put
+ dup 41 /parenright put
+ dup 43 /plus put
+ dup 44 /comma put
+ dup 45 /hyphen put
+ dup 46 /period put
+ dup 47 /slash put
+ dup 48 /zero put
+ dup 49 /one put
+ dup 50 /two put
+ dup 51 /three put
+ dup 52 /four put
+ dup 53 /five put
+ dup 54 /six put
+ dup 55 /seven put
+ dup 56 /eight put
+ dup 57 /nine put
+ dup 58 /colon put
+ dup 59 /semicolon put
+ dup 63 /question put
+ dup 65 /A put
+ dup 66 /B put
+ dup 67 /C put
+ dup 68 /D put
+ dup 69 /E put
+ dup 70 /F put
+ dup 71 /G put
+ dup 72 /H put
+ dup 73 /I put
+ dup 74 /J put
+ dup 75 /K put
+ dup 76 /L put
+ dup 77 /M put
+ dup 78 /N put
+ dup 79 /O put
+ dup 80 /P put
+ dup 82 /R put
+ dup 83 /S put
+ dup 84 /T put
+ dup 85 /U put
+ dup 86 /V put
+ dup 87 /W put
+ dup 88 /X put
+ dup 89 /Y put
+ dup 90 /Z put
+ dup 91 /bracketleft put
+ dup 92 /quotedblleft put
+ dup 93 /bracketright put
+ dup 96 /quoteleft put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 106 /j put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 113 /q put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 120 /x put
+ dup 121 /y put
+ dup 122 /z put
+ dup 123 /endash put
+ dup 124 /emdash put
+ dup 126 /tilde put
+ readonly def
+ /FontBBox{-39 -250 1036 750}readonly def
+ /UniqueID 5000792 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5CF7158F1163BC1F3352E22A1452E73FECA8A4
+ 87100FB1FFC4C8AF409B2067537220E605DA0852CA49839E1386AF9D7A1A455F
+ D1F017CE45884D76EF2CB9BC5821FD25365DDEA6E45F332B5F68A44AD8A530F0
+ 92A36FADB679CF58BAFDD3E51DFDD314B91A605515D729EE20C42505FD4E0835
+ 3C9D365B14C003BC6DD352F0228A8C161F172D2551CD1C67CD0B1B21DED53203
+ 046FAFF9B1129167921DD82C5964F9DDDFE0D2686875BD075FC81831A941F20E
+ C5CD90040A092E559F6D1D3B0E9BB71733595AE0EA6093F986377A96060BF12A
+ A1B525CD9FA741FE051DD54A32BECD55A868DD63119A4370F8322CCBEC889BC2
+ A723CB4015FC4AA90AE873EA14DE13382CA9CF0D8DFB65F0ABEDFD9A64BB3F4D
+ 731E2E1C9A1789228FF44116230A70C339C9819676022AB31B5C9C589AE9094B
+ 09882051AD4637C1710D93E8DD117B4E7B478493B91EA6306FDB3FA6D738AAB1
+ 49FBB21A00AC2A999C21445DE3177F21D8B6AAB33869C882613EA6B5EC56476B
+ 5634181ECBF03BFEDB57F079EACE3B334F6F384BDF9D70AEBD592C8ECF21378B
+ 54A8B5DBF7CB9282E16AA517E14843909339B5E7C55B038BF3BB493F3B884A1C
+ C25F9E8FB912CBE23199AD9D2C3E573727701BA301526C66C3617B9514D6F11F
+ 11930B1D97C17816C85B1BFD9B973A191B33CC3B391815AC46268691C741B2D4
+ 48A840F1128D9B2F9CF07D0709FE796B23A836417BF7B5B12D67F74453C82F5F
+ 25F7B30701D6F6D4F4DC623C0C27D6A6FBECC7312A3CD10932FC7C10851C3C52
+ 24B75DEA8A648B7F34F5711DB0E843C914E25663C510185BC37BDB7593C1C259
+ 21D8DDAD33982C336BF272BAB2F48E68217403FE9F54877B243614A87E64784D
+ 2796EE4179FBF96123D1BEE3EF89D682B427BA4F12A1318A57F18BE5DD903815
+ 26186B4BD52B26D219A0C777A8A63429D794C8B1A6406E7FF8587C733B68B8F7
+ C5D158423902FC3E8FABD69CCD45630642FF783C45041AB306038FDE74575269
+ 087022886B30FC01CC4B098A0CEF232CC190540D17C75CF4FE6E3D053B46E4A1
+ 20C4CD3B44A1CAD9814CF62C46D1B1A75911CBEF732BAB92A86D607166A87FE1
+ 49EAB2E03F26E224739890FCB078553F39084CE228A05CD42072333F29612104
+ C154B64A2C629727DAB4B4D57EFEF9A40E1C9B30C75E34407E6938FCD3118E47
+ E0879FF0EDE72BBCAB6FEEBEAA78E8C09F8CA038B8B8F04DFDECE67A69BCAD63
+ 733D2C6280B79D3382A97236947BDD2F47ED976138ECBD37F7719CFD5238B615
+ D0916DDE76B6950490EBB51B627BA4EE583D70B02D8293388723066461C9B481
+ 1C08C54DFC1CEC50416425E2B678FBEF88618F635C620A6F846E05FD9C5D5F2E
+ 6072079220312629AC3792A0FBB027B7158E48782F93CA495397423B652125A6
+ D5FC5B563F10906081A03EEFE3DB93020EABCE00CD23A8F18CFA7772A3A530E4
+ CC33D921C3402B7C47E497F6C7B92A9A76FCE1A90F28738DE0007852A8709282
+ D1E7A9FCDE427995E925BFF1534A7A37D946FE6125AC6D5E471B35401D48B8CA
+ 79846A8C9A676D20A319E51023EF12B1F214C735651C32094150FE894B75D062
+ CC6AB35AD4C7C2D2604A01B346570D3C417BFF0E41065856B339DEAEEB37885E
+ F5F349686BB7E2F4E5F695AE92448EFC76471FE665CB4712895C82129501DD36
+ 8182DBE6C25EF4E5EFFD9261ACEB309C417CD084065FB456D14C9A248EF97870
+ B3005115D0B39482BD7E4537B2CF23BED92FB0764F1248293162416C71068496
+ 4DB89DB28FBFE666CE316D036FD1EA548CDE0C48E4195CFD82586427BD9EBC4E
+ 775950CA557E792D410BD4B4698A16FFCA8F836BEC6B86B857A22BF886C6196B
+ 20B8A42B10DAAFB9265E009276A406B3F7769B8ED64174D0DCD7197B0F81880E
+ C097087B7B6A2EB816F62EBBCB910920F0EFFCE4B0A4046D535D295F6DF18921
+ 6408AFD211A4DCA4BAE7EF3E5E043141D7C31597C70231614152F3111D347A2D
+ 0F755E1840B2442DFB191D52279374E6C9FAEA63B096354D026B35013D27ED11
+ CCDE961293DB013AC861F41427C247490535D64B283034CE4212CE7D8381BE62
+ 47573FA2D783ED1D17FF63F2E6CB336E8E0D91B895AAAAE2B8EC019CC27D1B7C
+ 4E6E3EDCD6A5759FE7D7712EAECA1D89A7370652901D54D68BD95BB57BC34EA4
+ 3B6A2D776A6AA26C669F52697AB06B8E696DCBEAA92192A4CD31925815F5829C
+ 786A4BC15F52D1529286E60F6F9F0F55A4C4DC54053C2B3B51DB6F91ECAB9102
+ 252EA18E5F888953CD65248A05A4DDD0997EA946148BE80E596C3CA3FB563122
+ D90FE6FC533AE87318FF306D057478300E80758C974685C6FAE089282778838C
+ 59ACB9DDC040FB4B7A2C843C11FDD9987486C2989FB1B44FA70F2C3A18B1B30F
+ 48F0413BD2F1A5E9BE522E3D1AD2B4D6A97D1230DFDC528B5BE3367CF03970E3
+ A7F603F08A4CF2EB51020DBD6E58461E54EDA11A6275679F217602C5DE280546
+ 39EEE1AD8EBD1184BBB0A04911AE18D5ED0EF762398B354E9BF63BEF1B911171
+ 8329EADD0DD56B99829708FA7DC6EBF00B110FFDEDF80ADA043FDBC66286ADF6
+ 9286070273529DED31CFCA6E33B42D50D67E7E7B7BA9FEC577A694E0AC68F086
+ 6510AD2D5A883E6B496B02C8154E78AD0937F41C3C72EE2CC782C64B7588BC1D
+ 3500BCEBFF674EB8D70D197800BF15F8D9D7ED94F99B9906ACBC24A146CC45BB
+ 930760EEC8A9176DEDA684AB2167C667838773E990F7E80F285CF8F3A60063F3
+ 188572EA8D28CB71CFF3DD6403F57F5DF0877937F0524E9B9E240E0AB86C5EE9
+ 82118ACCE0C182666B90343240279AFF732BC4CF7DDA31965E90B308C36FCA68
+ 3EAB1E90BFDB1FBDCA08D0B5EAF331248C0A25ABE71C06494B53296575EC17F5
+ 41657CB0D4D312C92BCD0CC98A290634F33BC75A1EA2D692F83BADB44C87BAE5
+ 55DE93B6DBBD0C20D2DFF050803630C9216FDCF3785A1AE286FCD3AEB4E06F06
+ B08860C067C66B553154CEF72403B24B2D909699A796421DC28FCCE11CCA9E06
+ 09DC1ED5255E66F433E78B68C97630122A124B77EED9D64711B84B36E66AAFDF
+ ECE0D88872F2257789EC67B16B32287A893324522837B18C13EF2F3096C26471
+ 1AAC1C982A65FD2BCC826BDB5D1843BBE2CD5E49C91E4AFFEFCCA87D1D87771F
+ 540681DC4CE840E15A9963AFC8785604B38D796471D5B85187C4A551D66FD9B6
+ D601033A4C31607D71C70DD966512784C5AEE5C7D284E3780D80410263030937
+ C53ADCF9C577A767082B4084FF89E8B6CADB9B9679D41A169897CCEAF9A0B628
+ EE1E624DC01A1F8313DC9F80775DD316B53CADDECEF4D81942D4E73C8065DA2C
+ DA572A5DF8CC98515D5FD947CD58A527DEA9634902A0E93CC3AD9BBF54949999
+ D15627772F5EB2B675B62FC15790D84C7ADDD8D371A41EB7F1A1DD495A43E081
+ 8E640B11CC8F6766F2A48636B69CF15BFB7B76D05DB8D1E8DCDBA9876D8146D5
+ E5F5136BF6B7F660F6FCBF0B53C0CEDB1AF2EBD933708BA17E64F53FA2D2EC0B
+ 36C6C34EADF296ED0E10C77FB3E51254AA5BD326F0DC724CAE16C7155A5EA0DF
+ 088A52A801B8856CC55D5FAD718973277AB5E8177672533A5208628DD8B9D646
+ ADDA414CCCEEC4621CAA48EF7634C11D087DFDA60A4C884543261302B2E5F6CA
+ CC2DF2339DFB67B4A0DADB33ED7EC506419C6F62DA5E8FFFE8201C24F84FA9F4
+ A322D96DD81D6C12B78C9A1521B03A9EB4D295EEEAC407649E5FD112ABD1B1A2
+ D8A1488651137695639108F36DD5F2C1EA627C64DCB0366937FFE63C7FAC336B
+ 1938F8B545E10D10F7FF571BD03F8AA9A66F5A7A565A6B2948E4FE7F42A99E9D
+ 54B93059A3A8D64B8B05EED51E89D7CBF0934584D5DC59377F411DE40815A63C
+ 856C86920FAF205972A022913914E4C10079AAFC3688EEB8369C4510609064FB
+ 8EAED569B810D73EA614D3228E433A844D66BA7C65F5915E45B3D72E31063864
+ A9ACC0320C7E15DAE488E106AE41B2E7112AEB2755A7F1D8B19F62F1C14F3790
+ 0503C94BA958EB02F59280CBE99BC611A2186B30A76EF75AA9D19216B20C371A
+ A329B8AEA42D7231DB7E8A57A3D096CDC021456E7131E50DE47BDDFB47ACA038
+ 2C63244D1ACAB042541030DD81FE005D19ED804CAFC42BA9EE8930E6FC081915
+ E66B112314A95D52F54E12F4790F4C8C14C4ABF501D06A71E711A5F6EC2517FE
+ 2F9652CF340B49617069468D6BF0B095EB2BB18FC943AC7C597467E8EB92EC74
+ D6D950F65C419635BCB2D65585719EAD96C4D6682648E132ADED1C30AECC5620
+ 9B9363262F68C27EB0ABAF2772C62CF3F865860F920DDB58A22785D2D1EC5F55
+ DFD0D4020ED07FD91C89A2661617B97D237B62D87AFD7371D3CE1B1808C3BE95
+ DF9E6B2F0DD98B5CEEFCE88EA31AA573EE339C86FF1185B168C26353EBB3454C
+ 275520AAC79D45C84591B0E5D607312AE764C85FD2F0EF172C279983A7A51836
+ 57C78FFE59F0C7A0677861985EB6C1B221D6CDF4F279B60B20F5B33620FD5745
+ 29C7630C1D8B5AAADF008CF1056AAF64FACDDBDA9E2797FE83E75A80F2B7086C
+ 2F8DF3D6702A518400FF046B1EAF67B480B0FD7BE59B1472408A32882F4AC617
+ 1A2275C0A43D6477FCB647AA5C91C9F5C5C03A49F8EE235D4C99B1B0C6479ABB
+ 6E0EC03F06F9BBA6CAFD0AC83BA8567A0113386F148FEF179B9C74E3A3A8BE8B
+ 292836782DD7B01E9E98D6A88E28EFCCA0097243BE910C36B89F517E55AA055F
+ 28D26AF2C17FAABDA4BA22B973BA6C3E688496B01FAB2B340CE4133C59B61BCA
+ 14D98A2B828C90DD046A92BD0E474A1149475EC7291BBBD0317F9EB2D58802B2
+ DFC22DC2A6BCB36FFFB763C76F090029CA496DA9F4904EC98E42B46344307E3B
+ D4B7F2310A150C332FEBE27FD846E35444044A7FA1F4534539C9770370B9C714
+ 85C7B04C5651B6A53696A625FFBA59F81DA0AC3D80EFB7FC5DFB8CC07AB76A6F
+ 59B0155A990D6ED265141547FA1A874163834F6FDDE2BD8DAADFE2DFEEA4688C
+ 78098F396EC538AAB3284E5BE04A91D34C4348ECC730E6CC87FBB2EDCF41D1DF
+ 9E1326311EDB0BA642CA8AA007A66EEA96BFA3B08784A5CA23646DB9366BB541
+ 0237DF2222F32AF829F643863E0B29427119F76E4A9458985B58805701AA0D9E
+ B44121A0AB438F9DA32205D4EB4DFBCF63D5F21D50DC0708B5137FA48B24EE13
+ 5981DE1A15C65D29072AD2FC4129628C9BEDC5A2FBAFA3595D4D1681CB24F1FF
+ 5179E502EA63D86FDBE804EA82249AE14A564EA1156DB394BB833FF11E75976D
+ 169D0F82088FAE417B45F50837CC23C12BDE23088CF59B03AD1255B0D4FEB565
+ 5A5A517EFA589420601C683082F532F6AB428D5B4F399FC6FFC30B6B63E04116
+ 85831211DB3F26B64B30C489F7A0F180C1B7A21A15EACC5C7F09DAF0682BAF3D
+ 5C6E82D344E1A5DADFDD30CDEEF957160A13A00535AA8515B4149D6D45CA13F7
+ C539F60B7EC1235804CDB0E2BD46D28DFE968F0595E02CF6F7680F8A07A0335A
+ 234804131F2D4B2BE505E0BB42F7D7965B2CF637D7B5BE83BB5A20CDA03D38E3
+ BC3A93D88DD00D2685127CCC0B7DE8AE4A7C56AAFE50B88852A1C6978A41F5A1
+ C7F1A23006BEF33DABA1BA839A585374253AD97D4AEEE32A78ADCBC78863A513
+ D98F147310287EC3E343D108ECD7E878CA15E22BACC8B3F98F0756A572E086C4
+ A760EF44FF7EACEB2E8900C87816206E47F7ED5E9595ACF32C709508C4467215
+ E149153DF01243D08A0990846DC59FC9C10C82D9A2D5DCF359CC87C988BFCF79
+ 2BF77903F867D115D29EA9EE2FD9296B53A0BF3140596A236A26450024AAEC2D
+ 9FF1752B73C09BA29D755BACB7F29AC0D64E32DBF4E55FD7E508689D9E93A158
+ 7B506B95D2CF9772F1A7774928CECF53DEA20E9752B51021C6987AB09B0C2EAF
+ 04BC40DFB48769FF9ADA292881B2FAA2247F23E9C05EB6DA90193297EFA9886E
+ FEA3EBA837998652FE9AD07DE3DAEBBEBA7FFE5D34303E06D18038A2175C3C1A
+ EDEE2B62E164177D433820691280150E6FF6729970895CD52A01AD7F8F162953
+ 67FC5DA3E5AD92F31B68D614DB0D7372F0A7EC5DD8E0112D26278D1E5A82639A
+ 515D9C52F3F5AC051703FDEF22842F211221EC3093422FABC06F32D7F9DA431C
+ 71AEF1FA9B2149C7D13A8C5B829B03FA9A99BB57B67813C3A5A0A6EE23D016D1
+ 9287D69712D9AB69FAB5FB3343CD92E203AFB82D9A0111BFE052DB8A6D81136C
+ F9665F819B8E2DC9F2083A7453585D38BA80EDEA4BD3EF7C0CE3914775380067
+ 65253C5F2264999061B828E06F29CC8BD0976C7C3B8D4B3EF8F9F873538704F5
+ 28DE2B189F9E4E70AB87D7F60197B810FC0561AEE7566AC03A0A57F817F94AC8
+ 8311C5B16F703AA2520A6C39706665BD666FE158CA510454108FBC968AF34D30
+ 44E1355016F1C0B4F49B5446FC5FCFBB94BAD6C39B578BA9E094C1195FB8F0D2
+ 447010D3EFAAF4C07D5372C39814B772635FA9CC653C3E8F2521FEFC131BD16F
+ 08E58D28251366D2767AD516E33257065FE3BC7EA5CDB8D00CDD63998811CE49
+ 22B3E0DF7279F5D378F204322D69E9DEFE026FD31867CD69002CF207ADA8995C
+ 44DA3819F1DE9033B60A1968BB1BB9605E01A7860789413B0128C3007F8B1568
+ 8076AAB22AF3C2E2B3C2139BD562AA1B0ACE549FC146D5C2A8ECDD99AA2FD9E6
+ 17A23B9F4C5FE06F7A72B7A4D5B22CA9A63525C1643BA1EDFC22CFDC36C9F83C
+ D945A02E97464A36344ED5439C2E6CFB47DE443882DC5085D9D89E03282815F2
+ 54C2A4416F0E6D554E19D01426F8969828CFB3C7651758BEF4A6B593102F3031
+ 76A11BFEB7E2E91101B3ED7CB03216C7EDDA599BE1AB68DE5DDEDB7EF48FC7A3
+ 24F3DF12EF2F806B4FB592D22B55DDAF736E9BAD0BA1B0B20018ED290E7C7DF6
+ 1148E464C293A816036D5F61A40ACA644586948C3A9117177646D070DCD8649C
+ A5306090C13A27E63ABBB295D732CE8F52ED0403F76C8971ED4CEA0C3926BF2A
+ E35BABBB404C50167B781C840F3A48011D97C4DB48B77945728166EE91862C23
+ 66399BD07592EC468CC6E6AF1A63AFB38B739D1BE61052C704289DD2ED984237
+ DE438B44833DFACB1C62D8F73640B26C31BFFFA26B51EB599A69D630725ED083
+ 221B84DBA64C53817F24E3EE84CA911518B4756C5C4D7117A5F65213FE7F8688
+ 79E1734C6CEDC399A9456A31D135F4143D0AB85DC21B36A193D1EB6E360561BF
+ 2ED61CC0E233277DD78A5DB9948D609AAAC828CFB944D6732F67A625D6D08CC7
+ 5D9E767AC0AE124982D32BCFB48D62781A6A9AEB81A50FD5F5782486A3FA5D7B
+ 229FB5AD9445D79D447BD587B0633AA332E266403C84DB078D5B18C24B691936
+ 53C5FB0C57BA4BFE6157A6DB5C5A28FDF2BF4A21822EF749985F9590E3F74895
+ A1B69A34406EEC923797250D0FB0DD23AFECDA237098C7195EE467349817ED35
+ 86ADE366FC9155A1CEDF235B25E30E044907174DBFB600FE919506EE0EF1E790
+ BEBE66BFECBFBFCBAE3259F98FCC55B7BA1E5872F720F6B170874EC947A6DDD0
+ C8507AD1927402A4534E6E46FDE4138D04BB276E7B801C4189E320F74943625C
+ 1508E030EC5501FAEDBF5C6F95C156350F53A6ED994BC74B8F34BD10A85421F6
+ 3F191E9540CA91831C3B7BB1CC2046D0DCC8B5B0AE62B99141E4039080165221
+ E65BC11E13DF68E1AA9F87DCE923BA6EF660DDD7D4C0BB9B52C914879E310A06
+ 6DEA06D08FC81B05A920E3CC01D33FC994AAF2495914683AF8841F4A0F6AE9BD
+ 29D95AFFCB0D8F17D01A86462EB5323C141137ECBB0950E7A6476A2EAAEA35DD
+ 98EFD07A99D3B4150BFB586E63CD877A465E0B1C96D978EA723A6F5A5D1BA499
+ F8E35D0D99CF129C967ADF4B7942E405ACE8D6B73DF5DD9EB8BA018E5716308A
+ 2752558E0549B1ABC33A5851202BD606788E9FD74A83F32ECACAAA624127E24B
+ 6900D034CF7B0952812C4EBFB238B5E7E29F36DF3D3F4CA017C5895E6267F83F
+ 47B861C04D5AA541E9083EC6EC9EDCAB53E174EC763F158CB583BA5EC09586BF
+ 5F62D80ED42483F8956CDF6C64A43C54F4D050EBE2C4CFDD0A86FBA671327AD0
+ D2173FAFE8A6E251D07319066F29622FD75993EC9E6B34479A4EE2DBE89481A1
+ 470E115E0DC3B04B19E91EFAF7225152A05EFF5A8BE3620C847EF26DC24E3331
+ 24752FD99B0007A6A17F43CF4EA7D67656810B5A46599AB312F01430F56A0BD6
+ 2716A11DB0B5FF0664BD84EE85305D0CBFCAD87E4DEA05A1816E853DE624CD70
+ 58E2D27A17B1775641DB0A2CD30BA1425FB2540CFA2C654C5AD9FBCFFFCABB7D
+ 2DC08C8AEF51F974510598FB51D0BA11881F90C059F35F12020A30068877FA46
+ 16CC2C8B4E23DA3E15731F7C30D97849DC27BA1AE7D1E92146446EE0432D582B
+ 4772A9E6DABAE00D74FD992C158A8648CD8FBC89EB4A9EE76E3229560776889A
+ AD57BAFF450B362850AA9B9A06CAEA7AF10952A3E2716372A71D563E422C5F2A
+ 74A5FD3752821485E8F8B0C9574120B9887E5B6E60D49F9083E06168091E728D
+ 2C052361DFD4518BC5A63F930DE4EE3C63BB31537F12AD70034E9B4172C5708E
+ 012FBC7A2AC7312D7344F8F3574398E96C903AC85AC77B8EF36E69674709E064
+ B4A7E8540703B60A16B05F5B3A98049E5EB9BE90C93B1FAB1C6F1576E40A818B
+ 92879F8458B3F24269B324AAE88E1A6420B567F05C92C2E62909495B112E8A1E
+ 86108C477EFA5BA7D8359EAF842DB929CADFC02937663992F5BC24F5970BAC79
+ 2BA97C497169868D806F86B3C14E98D77689F3A7F47F64D2785EFE9056E5B146
+ 6BBAD70D2D9E01877A874F705E8A786345A54E5F75FBCB313CF0CD450754E970
+ B5DC55A93D4120E6EDD90B9A74669527F2ABE06D50B897800A0FFE78F3D10437
+ 4F04B1FD07417466DC4C9956832F7BF49A4879C77154B68B222A7656D4A8524C
+ E0C65BD44EFD7EED7A4FDDA57F507AF10481AA85AC807AAA396F78A66F67B9CB
+ 0B895171AB98A8AFD63B78D78168342AE36605FBBFDAD9AFBFAAD6B19678280D
+ AD401B578E5784B2C5269C84DA8D4E89CDDEF434A290300C4B511A6202CF01E3
+ B6C5115A216AB47B8B03E455B31A2610C22F920867BDEDF9A0C1CACFBEE3902E
+ CCFB50C6877CD7C1F631A43DD761C72C111B4F85804837E345DA6719CC13343F
+ 8F7C65DB91CCCB1438651B7087C0F9A4A1B5E444E823F262C84178303A76616E
+ 40A40E1FB268EE2303F1F7946F6E45E5C2956612A1D4966EA6F76FF4B42E066C
+ 12B83C732C3082CE4E2B08E505AA167EEF7256D5158C2C9FAD6403C8EC014EEB
+ 91D18C1DA570BCDFF3A74EFD0781BCFD399F0217953CFA0F85201A3B946B398E
+ 2ABA71AD20782C272332098D04FE5850879082FCDC8CCEC064E258390C39CC06
+ 3582BFFF80E6D6D18082266B3896DD234F10267DC3D6FC99347B6055A04C87ED
+ C2BDE0F076F5E766053ED74876DA3A0469D9FAFED7E43CF156178A3A26D7E791
+ D06D68369BD407579C1ADAB56DF1EEBFE299933133090CEDF60B9023A9A25563
+ 9FAFB1CFD76467C77E8627958701A370683B7505AD1104A545EA163AD751D55B
+ 7791E9F5A95997901CFA68378D1D6F5AFD74A10448D0DA3DF8A5DEC3E984DFDA
+ AC41DEDE91B3AB5889EAD3CE96DC913F047740B1C02F7B9106C50F4C0B4B3A82
+ 20FABC324F29E2A9B2CA2ACB53D48DD5421B9D3526F54A0B50AC9201AB1A54F6
+ 7F7F3603784610E3330A8D0488B4F2683FB24DF6536F5C1D06138947F14B0645
+ 3632F2F8F8C7149178315491E91D6159462EC79125FD0EDE46C24C67ECCC25F3
+ DF8A20D56538A052FDFE414B0141BB4F80BBEB4CD4D79AD73A51B4EF7775057A
+ 36878A49BD5278E5BC81D2F6D4E5EF046E463ECF34F4CC88F1879FBF9026832B
+ 69770E5DFD941A34E38B8D10C3E32E4A5064F046138F5414BFB71C9AF94F59B8
+ C8262DAD70FCD25BD6464923E4A3222D58CC7A00B8D8C8D75BB16D1582B3B663
+ 94D9DF915BE2E605FB8031CA7CE25FEBFF87279476DD35457A0D072A40931854
+ 37189A2F48640A969C757BFEFF0D4EA7765759201FB038BA8CD61B10A183448E
+ 09BD9C441B62F778625B86FBF4379BE2B33A6EA5DF1603D031C31AF81A56B38B
+ 93D64FD5EA6A5DC19300DDA017BA0C810AD50963F521D822BBA0DD9197763DF7
+ 0D1CCA6C7CB7DA7BC1E318FD3CF0D279CC990F4EB8EDCB8CABB7016B731A4A8F
+ 3A2FC4E42398535777B6DFA3C98AF7BE5C106A087F0F01208C3059D460050E09
+ 3B800EC273D2BAF8ED602CCA071D5550C203F0796D4DB0E4A831E84EF6EB5EEE
+ 31A17B7F1F4DDEFA7226C48AD174E83124F9589D7AAD0FABBDF57EE3F255A686
+ 9E850641E96B3069415E2BDFEF27CA5E741330372D5BB7FEED97C0C00035AB06
+ 070FEE0E2C4B77B1DA3B847E25DD25CE4B563255885E0CED7C23265CF42F2286
+ 294423F6B96AA5E592FD30B77BC9C1CE0FE742F72BAEF34976BA1CD3319D7488
+ 77C33B289CBE9A6CB43428667059665A0018D35FA9A5F08530CA56156896C2DF
+ 8AE910CF1288988A7F0653E93C9814438F643DD272FE64BC73F622A1EF95A802
+ 009A4F625EEAB3EB78208EFC55B313D8616D0726D10576679510EEAA469B59CE
+ 4B0E18402ECC9554D227507F19876BF2F8D385D03FC915A6E34CC4684D0E8D2D
+ 219DE7737CAEA8E3DFF768A81A015FA2E22DAFCC67C87A764E19D186BF0632F8
+ A2A3B694833026B56388660CA90297B01D14D33C7D4B520CE6176D568F2B2A71
+ 77B086EDDFD822510ABC6C475BEFD298C5A01BCAD2386ADEF4D4BF0D3A9E71CF
+ B5BEF0F69B70CB6474672E56B249C04AAFEB7746CA6B8C8EB457F44324360C7D
+ F4E957363FCD247FAC875AE4005B0639A446166154D11F6FB13A5CC35E970F80
+ A4B4AED65401AEDBF82174940FE5659D176154AD27DFA9EC86DA1F896BA4B4C5
+ 0B23A90BBFB5B64FEEE0EEF18276843FEDD785E5FC3EACBAD0751686D73FA3B4
+ 6730333CA2C8C662D5EACC4424BD2BF15FE9A2659E5C7CA8B641BFDB7262CAF2
+ 56A4C2394520B492D56E8524ACB561ACAB30385E22F08A6E77A15C8F03A9F3F4
+ 7C28457AFC084F797256F920C5A97EA0FB4A3602C2A610353ED1D40B4009FD49
+ 27187598F9BE66B1CCE3052ED78F11106D0B9C484D808E68760BD522980E5AFF
+ 8B6CDB3DC9D36E3AD1C102825A9D07000BF2E3E8D03CEA50A163EC9D84023C9D
+ FE5C943B9B8130C246ED1E176D3A5FBB096793BE9D0CF2EB6929951C4280B1FB
+ D892254CFA7EEB215DBE5A791668BE214641626164C9DF0C1C0582BA00E1DBB4
+ 7041F77D7C4E9E148310C8440A5F0549F036EA38E60C6B2EF9411BFFCCF9F072
+ D5BA81567DFF3C92F082122F2618719857CA793F6A1B1ADECDE30D6795BB352C
+ D74FE086F4523012A4324C131F0E1EA2927F6FCE5B395FDBC5D6CF69473AD1CF
+ EE5C4E282B417AEA9CE0ED64C434FF23EA685ED8A041708884E1AA02DAEE9327
+ 3F37D321EDE5EB0DA0DC0367969772F4607E8BAC0C940B19E2B9ACDAAB45D014
+ 08B4F2F592C1C26174BF0DB7AAFD1DFB7921355128FE8DDDF1AE6746C8CA7083
+ F0574C1D56EC922CC82F940F5B5479BF46DB9B065134488DE5671BD2AA201915
+ C133EA0807BA66471E40AABB7D44D71FE3907C94EB5A9148334DBDC55DFA1998
+ 876EADB738659749341A31D91C8713C15F4EED22B80DC02326B428B5F0C81D9A
+ 26185F6BE6B1A1A9BDF82478014FB0C4E1E295E4873074F48863FD9A8632B938
+ EFAD2AC8C24EE8EC691B020EBC5575CD9C39F8574ADF83EAD3331F14D2D4B494
+ A1DFB64403309EA30E91FC568F23535257F60F10BC7DB16EB7C20B79A02FA67D
+ 2E9C9287EABCBAC431AC4F596272DD7AFDA050666487845B39435BC626A6FA19
+ C29E9402776075ECD3E4DECC3CFE69414336BAE555C498AD5C196B147E6D427F
+ 0C043A47CF4E6B9E31EFB78521D96C477A52E837020F9DE6843C204177A4816D
+ C6960EA3C0B8761064B509A338846982817141EAD89BEC6DFF08DFC11558A812
+ 78D8E8A224A86B2DAECCF3120DED9BB2F64FACD14E8D275694472FE0495DFB79
+ 9C767CA37C48D3D1DE10F8ADED8D669DC8A5667795195F3ECAB2BA441D8B8823
+ 4852BBAFBB928E8EB7D8228E2DB1947D9DD21C39BED95092C294F91FAC6FC3F2
+ E6173A5851AF22F2ABAA85CEFC8DD84A61DDF3A059DB2DD56DF68E5D1256C163
+ 76130BC2751DC23DA1D98C6EBBFC49AF42CC67DBEEC1025CECF1E58AF2615215
+ 0EDE366871D2B4816FB3E82EB783B9BB32C8A94885271E1CA743032C567AAB23
+ F52DE87F515C827BE29677F5C41023A67747DEB99869BE31267BB629EDBD2429
+ EC96A5E18E1AC4BAEDC926034B21EA0183399A1A31ECBC1C65146B80EB3AF09E
+ 00661BA83E0365FCE259D5AACC18B1A3297BA06FEE15A42146E0B388DE832775
+ C16C4D5243530FCCB63550E40272C307919237B076FB9B85BEC926784E96C001
+ 7A306D90DF84428B3EED4D1672E069FB6C05192449BAD4D51BC06F95C9E53ECB
+ 8DEE7825D0A6148079E0AB68B592DE855BA3AD715AE3CF71EBDD492BD282344A
+ BDEB60694CC44927A73B43EEFD916FFDF822F2C418BDBFBB6A5BF5A9D852EAD8
+ 926623B9CFA2101034D2F0522B3059FB21515599DE682A4C8F6B12A47DB6AEEF
+ CF3ED1E01287BD9E5B8B4A2B8E962737F4C049543A48F1A0AEFA958A6C41722C
+ BAF11084545A17318E345FDC94D7299A07EFFC58A71CC21F9E7E73EBFF0781D9
+ 80A245A3721565EC4E65FC277CC4C049F0CA4BFC79DE52DC0680D60B0714B188
+ 4A724C187B154BD79A821622D6D934E94C28B757B6477EFF47798EB2A59F5241
+ EF29370FAC2D7056F572F1F409A3E5ED260CE95CCFD292F0F3FF49FCDFEB4EF6
+ 147F67576B7C240CE5A9AF56D4DEEF8D845754A6A2390C2AD10146CB16A3616B
+ 64376A7DAA48BE0990DC31BED4624DEFF55F7BA45C83E707E366354BFAB59798
+ B1ECB62A67FF9388770A36A38B3032BCEC965EB201B80A7E160A198E92A996B2
+ B21EC97653820511041853AA364EB7179E2446CBB85731390E905BCA56D2252A
+ 4CDE609ACE29CE46F3FF6ADD0A03347B32C58BA4B50DBD41F557CB9BDFCE13B7
+ 7B4887B09E8040013B1A136FD1ABC27EB7626613757EFEE918F351642C522535
+ 75FD574AE349CA84D6652BAC2D53E718530F9DE7ABB3CAEB9500E876284D0581
+ 3E7B2931DB6280A1718559E4CF01D5A9081763A9D13452D78B722692290B1E04
+ 02FFA192D9E2CA8470FA94D0827718F0F0CE9068D330281D4635217C12EF2931
+ 8645AA66560DD9FC2F83E925E2361BCA6B7BC9FC28D652B6FEC829BDB4EAB326
+ 7287B681D49DE2F687C4666C8A4F441571362BE4C65D2D82165A9B1D3A63A9A0
+ 4EEAA85F1107879719AC55BA3E9CB82AE30242653A89C123B6C8B3083FAE7598
+ 1E9706D7167A2FDFE49D70C8B6294DFF49C799B0A2C8FA7F3067C5677DBDEFA5
+ 28C3821C12496CBBF36746BA709CFDBCAC991990A0DB7605D6C52C6C3E53949F
+ 48DF0B3323C1A78D1D2201E71449EDBC99A98396564E8609DAB8A1C34AFFCF7E
+ CD3F1EB80BF7EE85690DD29F74CE8F1CE28DCA799ACAD55124448D4E4CCCA853
+ 96DFFE67126B95FAFD4182041FB1A0E98B1442004664E3E54DDABF291F899C1A
+ 3A1ACE5812756B4C6067A458674EA22B6D45DF442C5837C8C79C062427574F9C
+ C0A5E10722A41B83962958DDD539A38ACACDD0A428432DF2B31B452E95AA364B
+ 5FDE2AEC5E26A4ECC74DC9B989B12807CE22DE7B404165E453E2B9F77A8DBC2B
+ 700FB413FE81983BF4B1CCF807EFE4C787BE2DC848C8BFC4436A70E1BDFAF012
+ 3DC1F61EB40A84008A759BCF206AB0F55D8A093D027526EAA957A9034F9BF192
+ 698DF09EB8F7D23003E7314ABDE3C6789C36AEF931CD1ED8D54E50D77A8E991C
+ 5D82CBBE6072C6CBF2AB10D79D430FFF3862BA23547F48E1C70B53C3B137A971
+ 6E294F46798E3B3840258D0B870456829848F829B778841C3094443E4AF7DC29
+ 70E87AB84BB63138E969084DD0CB07666364DBDA3AE96D4E1F31CA07C316C71D
+ 858CB5C58E44E4E9F90E18DB56B8D6C978AE1DBF2C70ACEDB179416336BD5BA8
+ FBFFD662602046D9D423067C99F70E2CF071FEC1D22A39400C8CDCD3CE9AE310
+ D784152D7609653C4F9542A6519FE11FB771C6311FC9243891862FDF770E9120
+ 154E410CECDFAD2534B6BA7C691A0DBEECEB562DEF3C39D3E9643351185CAADB
+ F27B4ED137AD1F80F453FE0C3B66A19481364F37897E3E57FA98B6E45E26BD27
+ 06C83391F5C2D7E6ABCB29D11A7E9B2B3F0F05464753E085502B9ECEA942DE3D
+ 9FFD3299EE0C795B83E1BB4853A814CBA021DD1E3BD87C7B71DF10DFEDB3DE7B
+ A8B87F00BAF93CF40330A633019F2B56D6B5C5BDBDB83751797CB342745568E6
+ 0CB7B719698F06C5319B0264473D000B58C643BAE4B84C13DC34BA0DF45BA963
+ 23F3638CC44FA819B0DEECCDFB93F21AD3D9EC3CC85A7EC02FF909B89B3D911D
+ F3495AD5B748CE53563954DDFF75977019886FE9EF51890B6B88D162D73E69A6
+ 5D76B6065D2F54B066A22EC3868C3B484CB196B6A97057DE69C738CC1D29A04C
+ DCF1B9C80F7ADE7AAFAAD3A9C06451FCB5E15F594C8428E5E2657FA250211262
+ 45F4B00C7CC921F1E627CB8465E79191FB3977611B06353ABCCD7ECC09D0D8CF
+ 01C86CEF098A03513B3F20100CD75A80CDA4CC4A176B14C040CA35E4B0844DC1
+ 2A56D2BB6EE483F62C5FE72846D8E28B120C4F65064870E63595729B46D79429
+ 024AD5A53C5B6E15E7C5780A6995D66E83FF67C6F24C3CCABF761FCCEEF458AE
+ 05DA2FCCB23D307E393AC603033FBB3DF632C8230D6C83DE6E9867E85CF6EE35
+ 5E2B4B27544B4C48B3C34008C886BF96C771307343781B40ED4805F92651D3B4
+ BB608B982A47B591901B75727F9F002A560FC55D45C5D261EDBB475F53B687FA
+ B904F16F974F767F9396718F4A29592F3C5BE2E1713AB733082AE675DD6DEAD3
+ 4CB85FE59CB332C361CE704E577770C613E0170FD5C2640E0EBA1108BE461CEB
+ 79EE3530036F382FA8ACBCAC2ECE4C0F4D13A1538ECE22D776145B4259A313E6
+ 3158A13949B7B11F45D3A4B2C1E22D55B8B99E0851820847F92B13628F40C505
+ 6675BE2049E944303DBF4FF7B21957BCB9D8B5B2DC374802EEE4136B594003E4
+ 5928B09AA7D5E1D979C2129A5E394A80702F6DAF6C1FBE1A55E6E609585DC99E
+ 106692E0FF57E135B1D24F8358A55717CCD3CCE73B061D4D9FDC3E448A82FA98
+ 3665C51D6707C6A17CA078F97625E484505785ACEE631995ACDA42812C0892C1
+ D09DFFC40DCF0CE51493A5DFB4E106A25C3C6A37885833388BDC7ACC52C1212C
+ EABFA5213B0806BCD399C53445751501250AF5D1C33F87CCA9104125ECE6B000
+ E3F86908AB1AF4E6BE764C038D71C856357D33F48F7A12EADF95E8D57B8C2D02
+ AD2074ABC520BCC468040D3C1A0D052BD4103963C54A187F3FC6E43D8021D330
+ DC3EC2F7962DBB64F2FAD00EB51E81B20A219003EB1B84B3D05FFEE777B0F9D7
+ 03DBA334B3F17D1C6D050BD46081F8B2B79C3BF568A9562FB9B6606F83E2CB83
+ 617887D7A8538894CE89A1548317B6D40A0D1B2E39BE8EBEE0B7180C8F606863
+ 4B3D546430F8D0A4FDB06C933290AAEFD053F14350B9EF5FD3BFC1B5BEBD5563
+ 08BD42CBAEC644129380569A96C26B1BA6631F2AE1988BF28BA996CFCC941E88
+ D5500F4446D20387231D51A9CDB35E94C1E10020FA227719B6893CB1762E46A1
+ C0A177CCC06080F74502BC40C72442FB24CA4896ED87FD1279A6E0B74E95C77A
+ 1897A4B9E0A57590D19113210AFF3E66E0B9C18907857C35AA47E7B8FE720BBE
+ 55E48F45F35A9B9034FBBA9BE733C410E403C31568CC7792299E299E12DC786D
+ C7EC99283A02F46BA217E757C16EBBFAE6981258E6D11317A12AA29B81ACEDD6
+ C2EF9F87C3478913BF07DE4F87DAED56FA3AC3BBDED07307AE58C21F03DE1607
+ D41A5DFE67C5B03CD24A07BEBA67080883D333B07C93EA2580EA348EF2B48FB8
+ E13EDD098BE7AC14B8F71400886176676A2E28B783008649048103C3091E803A
+ 7CCC54A0E82EC33AB8CE90860D30879479E481C9CE5244ED00C605C607A503B1
+ C1B87DA0970C9A3D385DC4C3CCBAC6B29E1816A4594C173EFB3A54271E5D0DD6
+ F05AAA7136640DF2A9CFBFF8DE4FECEADF651590B9AB16E1C78E31DB11BCB253
+ 48E28D53EB4A616D3410B607A76B41FC3182E2C47EDE66F26BAC5F020328224C
+ A6CAE123DF797C79D73B00ACE50C5D7095D27F56AE7F644EB66137F5F4036387
+ EE9FF9FD049B460ED5BC31C40FC9E578405B92EF9404ADF1C0B577B150DA2425
+ 90CE3776DFC091E30543C003E01F7400BF238E9FC7027BF579B2BEE04AC9C773
+ C4BDB075CD35BC5CEDE47904E0B4E4FE1C8667543998E40E59DBA8203FC0EEA5
+ 614180987D5B15DB3AC3C8675BB4C0A2CDBF83C395FB93E9A3533A93D6DC8F47
+ 985EAFC0D7BAED6CB9E46F2503EF0827B72279F89FDB5D0D1E3344697C7B35BC
+ 6AFBBF1D2C07E537E3199C9B1FD3CD9351D5EE63EA311DDF190AD9A22CF2D968
+ 8318C3A5FAD93F18E5B278E954BA37F3369A1251109B71A8DE13E6E1D423A906
+ A03D13C7B7B8E0F66190132256EDC33CAECE06640E947863D28FB8D45B3C52E1
+ D9DF92D3EE72EE24851F7E12420809AA3555FF0706731722B738465645A60FB2
+ 6CE364CC8322D7D5012B3EA651F57ACA5CDCDA65A57AD8A7B486E3CC557A336A
+ 796815554CFC906645105514D2BB69BC66C37B7E6D57099001381E3A16311448
+ 090D37DC70131138FC35F08255B439F7C2F2F9FD57A677FD4B56C9D6D39057D6
+ 73B0318EB1343FC01621B9726BC5A2782EE11E336F98F9AC83A40355EE855C2A
+ 9E8E41E27FE9313E1CD38998CDB4808FD3846FC5E12724B6EB919DAC0433509C
+ 46A35083F2C2C5F793D06CC543CDD1E5C171655A89D7C22C18E5C38C39594CB6
+ 775AD41E6F2731A99A123DDEE9714BFA0C3014635EE82D666A187E368BA7ECA5
+ 5904C6F9A362132CDAA87988230A33AED28B512FEC2BD6D94252CE7012014810
+ EE9BAABDD8EBFA16831702A4C04DD7243E7AD264A63CC32523E5499D19B2ABCF
+ 9C96F86528CFC22D86D0625633BF8038F82820441A10C2D841FC0FCE44DD4FB5
+ 9C847EB364F94CCCE5104B9FB627B727AB8682C765FF681500EE6DD9DB821A99
+ 6A4A2436DF942CDA8FCC24F9503B72EC43A35C0D899F7401F7A3A7019A3C2C2C
+ 01BC8C942EAF2957F8645144A9EB6973676E5754A4A27E94D36BBAAE5F1B85F8
+ 95E7672E017DED9A67A49E63F236FF8C9CC5B21CDE03D528C103013118973CAF
+ 4B61B26BA599C01F74C5279FAC791DF3DB0B93AD983691722DEBE3969C8D7F6C
+ 29E1E420BFF6BDA3DB39556D58CB082D3A5E23396E3930F10849C96FB6BD6E04
+ 9C813EF1983AA9A9DCBE4909A4B543714322D76F202B71F11D9F3E09B9F8D11E
+ BAB4BD19FF979AF6F274DB12A4E119BCA31B65B396D1639E3D2480ADCA5E7080
+ 6F747537CF2A29DC1AEA05FE4E2B2BECC8B35970B539D1EB699FE2AF735E2B57
+ 621D6E779DB16F150F48D370BA8AFAD532B307A6CD1FA4A6FC1DA6BA77C4920F
+ C6A08A8138A10BD2ABAAC75800EBF469A9AC3BD4692C5524813D22DE6D5CD66F
+ 868BAA9141A85BCE330AE84BFC8448EA1797E084E39047917E8533160163D3A3
+ 275A5640C3F2820A527994A0A182BCBD3B0CA789E86D08DBE356EFFC2FA09D65
+ 8D19D0CA6B6515636663464FDEEFB0FD6107BC3B03CB1AD1AF0D207E364E64BC
+ AC1710425BCDFE9357B19C77B3FCAE8EDCC5283AF9C0B86DF72A4217DF42B7F8
+ 4E204BC7FD05F1874EDC3CC21FAC95FE5F5AA6703C6508A5B80F071E34AC90F7
+ 7A046041EA05FB4FE18B5177004188623B15877A1668269B08E65818310C0AB3
+ 3AFE31509D13D54A1361FDB3B5C103E647DD7B98384FDB4F284D7AA84A24E424
+ E46C0B03C219F5E5C3293A99DFDDD63425833DA991B0459A071535F5AD33387B
+ B5CE3C8322048CA0474D35A00FC89F3086C97F6274A8FE4D67BEECF499338A76
+ B6B5F8329190A87F436E216762D61708265F2F42FA029BC9068A3963A9714453
+ D904683C5E7C5D9ED8CEAA2C23F04B6148F0AE9B81DA254FB75237D04D8EF4FF
+ 26820758546F747022E46568ECC9A7FA9053322C78D29C026A5A36B0F6EED062
+ 8402502C2FF02FCA35C05FABE35B625CB5F3CAE9DA19D19D1C36A95DF0CD2384
+ A9B72F64683E6CCCE025865920C255D8A4D057FAEF8586CB2059358401B15484
+ 3C24F245A167A2EA640EEBB1CA6C34726A3F446AB65B74B0CC58E4F58A07CEEE
+ 6C84395117FC23A11A1FDEE55DAE39456725DC08CB3FABEDBB5C2BA59A85A527
+ 9B98ABC0F4DFD752EBA75343FFA4F2F1C2C977E39FE6349041CC28028B99F729
+ F9A8F8A3849898D12D0B2E973DC274A57C6175E9F56D6565CA110B3DAA799F73
+ 4FFEDE6B5E882CE07FA88C444036EF6686FDB6943D11DE14D5A6A836D15E88AA
+ 18EF9070B5B9A2B0A80F41220CAC362F1755B0D640BBAF3B4187F8B8339BDB9A
+ D8DE67738DBD370176FC60B2C17B9E576B74BC9E9559D55AD320FA3B85473CA7
+ 271F035098D061361F3C162D2689EAFBEDE4A00BBB99C0A5EF6E04622BE326A0
+ 88B7F27739555AA848EC8926DFD3FA7755FDBB96A5FF0DA3FBC7E0515F6CA41A
+ 0F32DD3A0469D982BBF9C4712916338CAA1FF1289AD6654C73649CBAED4895E8
+ 4D24B11F984F0B981BA6F8FEB68DAD1997F39F6BC9C77D67B3C1B503C979ABDF
+ 393CD9DA8A99B9146566A1CDDA8878E5A169F29A7E21DA6C68DFA8A6EFED8371
+ C998189D2E2F7418DD4E859363DA1A97BAC60D7CFF56E6D53A9A5D24E1BDEEF9
+ B35730F83E0945852ADB0270B3985633F21284DF5B0EACD6FF1FD3483F68DF03
+ 59756A34B42A80B4EC9E8512A9DF0BA67A0A679784E62074ED72B56B10A9FF0D
+ 2133E926A6EA393A1C811B7A37C8107836EF8A35A6C172BE96F6034BD0BB723E
+ 858F0D9F6FF516ED83C3F0DFBF47B7F08AE94510EF1DEE9CA46E4B24F5BB26E2
+ A48F5D7E58342AE3F30065CDEE716FBBC52E2FF386D1F0BDF77A45C90D5AD607
+ 567E1E564230B4A6C8A0C1C9E4E3D57C3A801289AC4BD05D66995CC0995F2DDB
+ E932B36360E868B36BC8F8594E9D948C87AB29B9683750460E234FC559B8A24B
+ 57D3D199B2C09282980A03B6FC27E5D73AA4A41B4651C8F898DC5A6987792520
+ 7EEF3343F8D2C9751976823A454B38ED973397203144084EAF8A5220CDB4249D
+ 08AE60E891AABB03EBA6DA89B9B14DAC71ECA8DC01AECF936CA0EFCDFAFEFD12
+ 4431A6D679FB914D4FC812D7CE97CFC53922CA54D885FA2C1FB1108ED73B7210
+ 5AC0621DE4899C40C45BAB76214C3C8C5AD343FC712174BC8C4A0EF0FCF7C849
+ 15F38C15E33728A9C7F5A984535D80E323AA8DD5ECE2C94EF2666C32EB11CB88
+ 26BE7B0CCE52066509942D4766765A2FFE6B309F3B938418F8CCBCC1AE0091CC
+ 30B06DD775001ABF6787035C668FE1DB4DDBCF949F523B4DA9EAD39B9AB7F071
+ 159A7FDC76BEEDBD1CFDE1322040B917D4C5F6CB60F63722D919B09A328E8669
+ 503569DD71DEBC1B95ADB5FA99E4A4DEB9970595502650A4E8D238F36EE68829
+ ECF78C8EEFFC0177ABD24AD53BE35294394DE37F35E407D420A608456752AA38
+ 2C1B8C8D1DD73B55A83487E2FC3B1397802C01E81524DAA6AFE31E7BF0D15C86
+ 58DCD48162527CBAAEEECB5384EBB82E79F13001F705A7809C29BB91EEE2BF60
+ A7435808636D5D9416C6F4E5F079170D0639E8F4E2FBDFD037A46CD986F7D5F6
+ C8433463F2D026C8F4BE2CC7B33955B63D95FC94095647E8F385AD1C592E30D9
+ 5D88C5D816E3797A294C45B221B472B8D383D0A7EC3BC876F7F15381D88109E2
+ 1043E1CCE624498E96004011E4EBD10120B962AD873116B6301D53805729EA9F
+ BD17D57EF189E68AD80E3862D0DED24B3DB00EF349AFB6F85AD17F3231CF2347
+ 0644614A81A2FF365B20B51214DA0ACD60919516B4E0B767D2FD27BB79B41B7E
+ 9A6BF953FD8A6ABEDC2A37256A79D74DF47E4C7F755DC9FD375E244944E5D448
+ BDD24069794C4D51180E3641F306581C123B6715731ACEA1AFB1D4FD3397FF12
+ 52084352C7609C862D1B0041DFC3BF1FF308C3AEB3D8785C4EBB93932D57466C
+ 10290DA4281F7349DB405C484108537CC78F19284FAAD4F02D4799A47EB582E3
+ 204841FCAEEDB1D0BB9F2704D9F55342369A7E16787AACE017A42C8203A1F847
+ 66FC110268D26DAC0DDE92177E7A2B0705BD10BDF89A3BE7B1AF948F7D9170F7
+ 1E20BCA7C188CF45F4E7C47077CD5BDF52EE303BA575B8DC42821F7B332327B4
+ 337109E991B9C549F4A3F8CF346939DBEE725C57316AB62A3D1ADAE9A5DB40D5
+ DFA5F4830CF12FAB8181A11EEE415A9E58F0A8F4C5D5706735E55B863E630F19
+ 81D57021C27F3A5DE5F8E98D0851E6DDF37D94DCEE3017F9AEBE6F57E68D764C
+ F687F2D0922E94E29CC0A043109C75C78D9CF3A0474F28E46230640C85F14AA0
+ 435DA84442A8B6B37D818CDF5D7C5D3383594637194B57E8BDE5DEC30D90CACD
+ 95CB7B83519073B3C78B6017E9F3306B36875CC55F115DB6471E7B331DC2BF46
+ D47B57299F3EC6519B09CA4062E10427500D4DFAB45339F193C8E743FC4F56F5
+ 9830F7D986DDA4CBEF20E276DD9A90F5475524CFF37100D1563EA771A2A808F1
+ 830758060F91B4E4B357531769100D89980C30A9BE2D46225CA5ACC7472271B7
+ F67EB638C72F25390B8E1A9270A63A7C0F1E4E91CA7F3E77B53D54C68A7F0C2C
+ EAED024603DD4A9EBB4E7F0117A4B56C73EC06031A8984398F92C46A29749D24
+ 155467F24FEAC3C0042B48169B802BA4EF971D1326F74D9353AE67EE050F6B9F
+ CAE617A6C652F87889E6383D7E9E7F9E40D506FE850CC784B9051F18E3443AEE
+ C2D4859311867575A19F3AB02D3F1E3FE993666C82BD0615114372B0A0843770
+ 2C862331469E7F3EBE545D83ECE68B5FC9675C3278603B7A2F775B1B1A570563
+ 222C4FDB25A4D957B19392F0BCFCC6A2F024121F2A43251C2E3AC77EAAD7D3C1
+ C79931B0D5575A89A138C301E793806A10D69D405D07F9C46901EE08D75AF692
+ 3ABDC2076F749A581E8939B80BC436485C37B2325191F1558037E82BC82F4D91
+ 5C6A9FA42FFCB41F41863D9204744574A0FB79D3E16416313752B0944E2B3790
+ 6571A63CA8EAEEB48871E11CE618646ED2A9C4470F83677D7DCF87EF82AE2E56
+ 
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ %%BeginFont: CMTT9
+ %!PS-AdobeFont-1.1: CMTT9 1.0
+ %%CreationDate: 1991 Aug 20 16:46:24
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMTT9) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle 0 def
+ /isFixedPitch true def
+ end readonly def
+ /FontName /CMTT9 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 37 /percent put
+ dup 40 /parenleft put
+ dup 41 /parenright put
+ dup 42 /asterisk put
+ dup 44 /comma put
+ dup 45 /hyphen put
+ dup 46 /period put
+ dup 47 /slash put
+ dup 49 /one put
+ dup 50 /two put
+ dup 51 /three put
+ dup 58 /colon put
+ dup 59 /semicolon put
+ dup 61 /equal put
+ dup 64 /at put
+ dup 67 /C put
+ dup 76 /L put
+ dup 79 /O put
+ dup 80 /P put
+ dup 82 /R put
+ dup 88 /X put
+ dup 89 /Y put
+ dup 90 /Z put
+ dup 91 /bracketleft put
+ dup 93 /bracketright put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 106 /j put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 120 /x put
+ dup 121 /y put
+ dup 122 /z put
+ dup 123 /braceleft put
+ dup 125 /braceright put
+ dup 126 /asciitilde put
+ readonly def
+ /FontBBox{-6 -233 542 698}readonly def
+ /UniqueID 5000831 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052A014267B7904EB3C0D3BD0B83D891
+ 016CA6CA4B712ADEB258FAAB9A130EE605E61F77FC1B738ABC7C51CD46EF8171
+ 9098D5FEE67660E69A7AB91B58F29A4D79E57022F783EB0FBBB6D4F4EC35014F
+ D2DECBA99459A4C59DF0C6EBA150284454E707DC2100C15B76B4C19B84363758
+ 469A6C558785B226332152109871A9883487DD7710949204DDCF837E6A8708B8
+ 2BDBF16FBC7512FAA308A093FE5F00F963068B8232429ED8B7CF6A3D879A2D1E
+ 2931CE5F5D18C658602059F07BE66E6EFC9239D7AB2FB8A4CBD41675B8ECF279
+ 650C29E53B14AC0E392A664848C1844B1CECBB2D5CFB72D0916B675C9A9A1E35
+ F12696A6F628473C604A95376468E06E295AD6F76CEB939D94113532050B9D5A
+ D2F41A9EFB9424D986612313B89EFE9C8A71313340B248F6853B1EDBF02B7F9E
+ F447220FE131D7D54CFB8AA1281DBAEA73E665BACB1F164552CC0CEDB63BD4B1
+ 4A9AE8AC6FA02242DBE8DA46B64B6BFC11762F0784F216FC8B9120D688D1705A
+ 438B14F5E5DEAF2A98408B3B64620DE3732A4DAE6D08D5D97E34C75DAE19EABD
+ BA0796165C1151BCBFB1DF8D29A63A8300DBDB9E3323CB82D0337598B83F4F2B
+ A97CF5196D4D1CEC1EDB8966E548C0D9C194C932319610FB43EA1B86322FE641
+ AB48770FF13BD475A7267E142388563D1A400419C585B22A9886074687BEDF74
+ D905BE8EE440BA2ABF28EAB673399B7F129B9729DD5564C681954621903B84BB
+ CAF89AC5ADB2932472DF29ADA2BDBDB4D05F65F28F5F4C529613D61858E0074A
+ 082A852710A62A147C966F2B85B51B0BE85F11D2057C66FDD61F6C5755367980
+ 9F4DE680601D4DA41B46F8D2148450000413C27AA39B586B74B977B25F0FD3C0
+ 4BA1EBFAFDBEC531EA1210365091671CE3C86A6D4BC591C37DCC02570042575A
+ 9D24252D6E01A8603753934D7EA5CAC1BE4E5AD2BA047DE8F3983B23A8A1511F
+ B08D373B69E5076CE4300137B8805EBCC0AAB89BBB312A77835795E3C069322D
+ 42C893A30AD739E2BDD299679B158F7493764F2321E3965141B5ED1C6F4765ED
+ F46D391A646B30C90002B1C461AEE79E5F094CACCA656CEA3DB921CC5205F328
+ A2C69F817061D6C60B121EEE844CA5008F23DF0ABE08642EF69D6C681B6BDCBC
+ 5586F5DD6A164DD02E64A546CB15219EBE8C1F90FF4435A191008F9399928854
+ E7CBFD951A77C48D0EF7792F097F556280282FEB29FDB1C1D9469FA25A9418E0
+ C451EF141F7B42986F54C8294A035D2076159C99A3320A7356725385F0096DFA
+ 415BEF1ECCAC2820BFD5895F8F979B8A0BCD282017849D73619C389F5C370198
+ 04958FF979A895D6367722C828E141466DE4999CCCF24CF4C130F68BF79069D7
+ 8FA7C6DBEF52BEE6AE291F79BFC5D2B680D612188C3EAA36D1BF0C4B5A081BAC
+ 342A78E06FD6B8FC9D70C307D657FF3CD9248AAE32DD0BFCD88998269294FC1A
+ B0AA0F39883F04D07B979E7B7334DD2753367F00C20FBF3CD59CE8626E6919AB
+ 227F49469D470C6CDFC586389EAB53523332E37F6DC6DE868A82457E0F1AEFEB
+ 761A98D8399A00FEB6E6A822E237E7D73806DF472F565598B8E850C141D28580
+ E16428B581043B4D1D8C392B1FD0DC51963EFB51DAFE01997049871D106BAF05
+ 3EB7776CDBFCC213DECCED57D28486C8E93CE7D5F975DB0740CBF03B9D0C5450
+ B6057CD053658BCC1A8FC19FE5726135F8C6FEFE6D709563ABD81DEF10619AEE
+ F794EC1CA1A58F9A2023D8B0DA5A399AD51CDF16B035E13A5A774B42378B6B06
+ 5D6D980D12C0CCA2BB1D3979EFE8A8EA90FABF1300510C2F03A7F6BD7E1B3841
+ BF3E1E022273AEFDAFA68CDB7BADF20F6FC15FEA51CBE3A02D3B2ECCD1D86D3E
+ 243E55999D7D55EC114F497D26C3EEB5697743B7D7384D6B4FB8379F0984B5E1
+ C650F7D75402D3ED36E10CD1AFA8CF896B7E14A7C50429943EFC50EC51117148
+ 455ADCE5C42B29284687CB80CCE523925185E38F44521BE2120DBEF18F8D3298
+ 7051105FEF3B2055E2FF2ACF645169ACD21C8A191868CE1C4AF4B3250818F705
+ DE5168E670ADDB1DD85FE256BDADA35ECA9DE30735637FC4753277257A777F33
+ B49A4F9A4CBB6DF15C220EC08EC1C514DD11D3FC45CDD10B27D3A3DC98C04F92
+ E06542290B234D7A758CCD7813D8604C6D00B8A59C43E4A9F0F489B679A8E98B
+ B0287BD4BD628529BDAA7E6F886EF7DE84005509B42FC9E17B8C98444B88FE3B
+ A1689EBA5F2FCB7E30F3BC49838A2585D83E28B497894F94AF2B5010A6BDBBEE
+ 38B3B391FDEBDB406CF210327845E661AF7FA48AF6A0F6EB4B41A1D2A767D40D
+ 9D3C2A8AF76EF2310E7AFCE698F2A0BB57095274EC65F07DF0827E01DD7FEBB8
+ FA9DBCAC8F527CFF801A19DFAEF148E08D81377465E896D52155A1384B059D01
+ B9AEEDE7395A30C8C1C5A4E2F166E35B8D72F5234A89B8FF73E19E525B507C8C
+ 302056E7D6882148B49B32785A397D4A6FCF11BE8113F3F2BF4C4C8D103D4DD2
+ 0062427A0BBC5C31BE02544C976E561E3E0E53C4CE2206F597A54105CC400ED0
+ BB7ED2D0F40C2E7E40DF279F4D54A27095295FB7054E6781DB1B21F275884003
+ 2EA9BC3EEC7729CEBF7A11E4596ACE758E45A23CEFF1A273E0436C06F55E176C
+ A47E9C058980236A5A564B6BA5A05EE5A7996F2794B19D824582C61FCBEC12B0
+ FBACF4B72B0E468E51C11C4163CEC721B7F38D5A957DA2830F957B1FEFE8AF41
+ 59DE9DA594D2631E74BBE218AD84B6889ED599F8BD00C307AB44CF153183A029
+ 26D0FDCAE981A71620B3CFB30116B2CFD06C36D6C196BC9992FEA4CBD904B519
+ 246C8E0471670C8179EEBA67C71E2A57B479FAC8F422425B76DD093D140248F6
+ 36EF06DA72137EE974BB9687E17673B89F0E26932B31C6D31B2545349F1DB94B
+ A95A95A339B50C053339E0048DCD6CE51B16361EFA1FA9C908EC786C5B56BD93
+ 6366D27BFBFB3BB81B79D81C3E927A40F14DF535FE5033733F427C763C27FD89
+ A6C76D367E67FA994D0315B98D67511F3C3ABAAF94CDBC682F6D7F96C69C0C32
+ BE9ECD74D0FEBAAA760A600DF7D413477F72D88A65AC0C50D5ACD3C404222CF6
+ D6E772D2068180FEE7E4FA3D05BE66A78597FC7C3FCB842CF914852CDC444331
+ 65E92BDDF2156B6D67E2F9CBCB6FF09E4870CCD1BA4EC78483899B92CF5E7D45
+ BEA1FB4723C7165A15FEBD9F290190BCDE3E068B5BC146E296B925C5EA671844
+ 80C12F2BCDB8E422FF50EB8AC96829BCBDD80D831F33990F6282A6682C502890
+ B0F5754D4AC7732A882FD6C133525F14DC384FA07E767AE2F275ECB68C11C6F1
+ E83D48146A7E72BF6D776234BC5502E15ADE71E34C5941CA2B8E0C02CDC72B97
+ 680E76E088F8DC3D8F04B4F6AEE1A4A87DD1588A01676EB54F406E0CDE90E2F8
+ 0493696771D1DD78A8EF11D3E5F75A6B114EE232722646484A0F0BBA190F3DA6
+ C3CC6CAAB3C920487310789E9B628DBC47996B5C87D15366E950F2F2871EE77F
+ 1633A232E62F8777ACE63ACB716CAB0B20DE6687BE4DE0C91B234DF30CC889DC
+ 59B493B1D33068C1CAC38FD6FF88E3960B18C6ED756E86BF7F68E4C2104C7C56
+ CFF3BD62B7CD5417BECB4F749FF62CB8DC83A45B3563583B369F05AF8B58D18F
+ 1E8AD53158D8913429807A50076BAD5E9B03E65CE14E26B05A47B90153DDB33A
+ 63BE0741A582BFC794C998E3EF85835D3A4EA332E7CEBAF45843C6C9A33828DE
+ AF29BDCE9148618CE5249D0E98FD1043CE5882CEE64BF22D8F70650E09E5A686
+ 48CD493950FA6AECA90F6ACF58347EF317A377CEE96C1466E4C5D3E8F378CE68
+ FCF16057B52277D779DA73CD77BC2D55CA94EB25C51CD8B4D3ABBC9352CA6D74
+ E26EEF57A21F3CED4F6635A9BEF452A619FC12CB6A97D9082A2BE2CCC80559F5
+ 41AB804B19C20E4730CC2BC3674431AA67E18D141E44E5CE650967DF98E99C8C
+ 1E34D301E3346B687766B3401F5D47A6052E747E184840F502404AF2235A27B7
+ 0FFAE11263A16452F90D941AE6FDD069E9DD9E9C76868714CB8B1AF5F3BFF788
+ EC573DDF94F7B9F2F7CA1F3D95B3A616300772EB40F00B68AFB9D8BA659A77B5
+ D792806D75AD83466D6D4996BD3B43C2BA2E82F820E8364582CB111B2D746E11
+ 4AA1DC8DF12F8C784BE97F5728B443672B6FC69DE42EC3E43DBBE480BE50BB8D
+ 47BEE7A248DE166DF87CB15BEA84062285B2C9146AE514E2E566DE9DBC75FC0F
+ 9D777309C30C4474E7558D2C7B17CDE6BA7EE1DF3C92EC4BFAD5617946182C3B
+ 2797202F3A2088539CE1F87EBD88C5DF867A2B49544CF0DE8495E2992502F9C4
+ 2F41F9BFFC9D28B67257B4CFDD9DA7231E30750F8B4640E65162490FA9FCCC41
+ 92FA5DF0E2B1026451585B99F82C03EECE0B798963E3252652BED61025670168
+ 1529A44C8037B0EB4F1A228F94FE49BC60B81C5B8C8A9E5DF6A92721E6C7DE2C
+ 3B25668894B62131B1EE6965484F53E29E2825543064179D05644BD2EF98BFA9
+ CF2C3E30CDD754630EB7A500AFC3E0124E2173A7FC0E06F1AE3A4FAEF0FD0FA4
+ 49DF46307AA60AD2CB038EE3B1D2CD792A134039DB1C5F0C4E91371C36493DE8
+ 2575AA791582325B550C89D71EC5F9DF32465C36CE0003B04E16ED959DA4964D
+ 3E57AFBF26180C4D0B2AB84DB0614B9CEE82EB7E77B5C5FC4D2D0AA1E34126AE
+ E8688FFBB31405399D5811F06AFFD819FFBD74D84793B12241CD8550677D1E29
+ 32254E2D092EF45666543FEDB59DB8F1EB3CA53E1D50B637732C4A0A2F168B61
+ 2B73438DA55FD5F407D4A00D5DF0677C2B5E231FD9C6FC3F1763BB34EE30D6CB
+ B7EF3915327C108DF40E61C0BD2CC2802A3D62A58BD9FFE2AF216D3E49E9BFF0
+ 5BC9CDE082DB62B2AE2A3E4F290204387268D1A32EF8A966B6C2E43D595DD593
+ 52910F5328435018B4CA0DE9506858F92500B1A7CF2B86D4F582D4A9362CF368
+ EFD2DF984CB043CE8A6392829690AA829CA1C31D67CD3A0CD6F6875E2C133F1E
+ 36DF0C9D7ABC1F78C71D6FAD451FA74EFF9836482310A410F3FB1C014F1238D4
+ D220009A3A7B7E9D6295E90B9C72C335150CC4C869467829EE7053AA460D966B
+ 9BC0352E5D5016135410BB537075D57D59B3F68EE88840A5DBD730051E4CDB14
+ 9179029F28611E90393B71FB5D8ED2DF9240F3017E9FC96CA218CA9B1D0C39FA
+ 4404C70887998BBEDA7509763BD1098D36D6D8043E09581E4F5ADF1471D681A7
+ DA65179D773402C8CAD09BEAE4B01558F3FC1526A1032005A8E1843D0B4394C8
+ B9D19368D6A0A6F296C7A96AEE0F679A0DD349BD5F60E4F4B791959F301F61BA
+ F06A72C2382048744CEA9B1E090270F80411027C11279FECE016C0416F389126
+ A1FF3F246EE8182F636054CDDC94DF9D2F181FF4D3D30B5318D7AE6A17477208
+ A16790C364D7E34AEEE06539887EE83FB2CB3CF78E47E688BAB7582E0E2BFAFA
+ 01404A52DCBE8DAB8C8B9048A5B18E361E755E520DAFAD413A99E2E19CFCACE6
+ 75A06FF631BEAEAB5116B1BBDCEBA5868A01C58F38915AD8AD923E3D30DA87FE
+ CA9DD277AA680D8C42D3EB43EBBAECC197FEE547B4274DA9428641ADAB5A8967
+ 90BD52616CFCA1B9F1D8FD5B23403BC050C25AF170F6D615402C9EF051D60920
+ 10E35472E39A3E63193C35DA0C1AA78AB7BC8561B759DD21C279C02B4A36CEFF
+ BFD4690CB2E6594AE0891D3C22A44F3F8DCB894616E269B6EFDA8D48183D60D9
+ 7EE9728FDFAD02EA1FEC888A93301268EF5F4D787C8A60E2290B6B01550BA9F6
+ 60E2D4FB38DFBDE8D1E5E78A579EC83A55436362089C22B9F89BB7796A4C687C
+ 5F2C8554D05D49351BBEA9E43C82047F417FFC7E602DCDE74ADDBAD744C0421F
+ 79FD358DEEFDD1AE46A64EB9A29B078EACFB5FF8EC0C52ACD99EC8B4EE82EDDA
+ 33F74DC7BFB0D09AC08429BB7F19D2BDF2737EB9175A35769EADD9374011C299
+ 112D750C197611C2BD1A23ADD7B5E7D662DF1AA35A422A90DE2BD721C0D12F8D
+ 118F81B98B15914E118B4402BBB9FD7D6369D0BAE171FF4D5F81B6A882D67C5A
+ 11AC79D2AE253C88683B659A3E5EAF4A2432750EE2FA8AFA7A64F3471053522A
+ 93E293FD2FE89197E0C5921F26C5A7BE0E418B88FF9823F5653B4645018317F4
+ 62AF7B853DC73EB880515D69ACD22FB2646B7EE3F4C40AB2FD6820E9E22951A8
+ 214A8D881A3AC944260B7DDECCB2BC2A8D4EFBC02C96ED92BEA79E822ED65B65
+ F128EF56180018C9BD3C7E9FCC56389BC3E53C6EE0B76F9F8E75B5F105EBA2E0
+ 07A92AE5A47DDB708A8E7216325675A5D040E56CD37D65D517A7E232172E7412
+ 48069B095A4C03CF942E04606109CCE504F64827D840F043C9AE27E011492A0D
+ EAF98095476BCA186623006695810C34438430B2DEC2A7EAB0A53B71CF8A9C72
+ FD4C1658784974C6C30721F80AB3CEC56349BB65B6D08129AC08B9EC29C6C3FC
+ 5C52777F91F7527AD8E7F9E31E352AC6FC1F9284C5CEB08314C47852AA5BBB70
+ E14336673335145E1191533CCF2365D68BC0AB1C8DF975E9AC2FF587AE6C32C5
+ A006C0463574B21AEE302A06B43E0742D1B3CF4DB62979699B96BC0DB6C37961
+ FE92054AF2D45083F831FA41222CBF273548BE4A8DF6620E4DAAA5AFA8643DB3
+ B88B678EEB590212AF18E810C0D96CDAD741D407A75228AD48AB77D0E19FECEE
+ D2274540474E689DB973E8B148732C54D4F7A932C2F497AA7297ABC10DBAFD77
+ 71218831FB468C0A398D5411C15DA60A526E569C609F966042E761B0ADC2F496
+ B168F6FEFBDFC0FBE2B708ECFB4197C023CCA73469F6811C774E594E372F1770
+ 089F3CC38B54F634ED3FC21D8D3ED1B09AA2EE3970738BE5B23E281E9AC406FB
+ 08AD84F6A71C73A5CBACF68BE19C25D90BAC93C9F0BAA95853F66A2FB4862A39
+ 7084C02A18092DEDAE8EAF37CEC7796B107399F830D515EB638CFA5F0BFD4B98
+ 812419855097B7BFE9CEA40F75C6019A37D12D6CEA12F2ED926093E6704CBF66
+ EBF4D06D2B504215522E0B2558FF7385532435FFC55A0F0526AC54EFA983395E
+ 6283F9565E1D6DD4EA9878978E712A807A094C8D35AE1E29B46862C1B3A28274
+ 418F31FD86C8FCFB312A8B5F3F0D5DF300841B52CB973C4A965962B4F200E391
+ 36FD675A4E229787E509DB726E3962498E1D02387B8033FE76DA1FAD86460942
+ 773996F6536DA465DD96E66ECD384C1706C7A2764AC6849F40F42B9576CCFC5B
+ BCDFBF150777829BE976DACB3F7425C950C221FEBE63D93E4CB60679EDC44189
+ 4652245C769FD0C5B6CEAB3C8AA6C942D274580F2459E07234D4943DA6F0B67B
+ 5088117FE272E434E0EB3CCAC65B1791F9FF1E21EA957A77A9373ADE2E227F88
+ 237FE1356B6B54ED73BA9823AC0A8378CBB73CF9FD27B2307A29E41381F8A565
+ 1C9C949E122B74238AE078E462C2BE9AFC7B90ED3164D720DEE0926380DCD18E
+ B7F2E1A98D30B4D4363E2A8E3507A22B07E6B3CD3AE3BD3DE8300E8A373A308C
+ 79CC8BCBB6196120D6046A825B6C77BEA0C114713FD01FD5A32B8B1AC9A4EC31
+ 8545B0DE55B5EF612C810D1F4556EB6024705244E91F0098834003B36B188BBD
+ 345031FFD893975CEFA212CADBA9DC0581ED8E0088A54FC7CDC97555577D32C3
+ B251531234E1590BED8EF7996DA2A31AD05A04843D913853F44809F73858C5A3
+ 8C1E822F3A4E5D0F41EAF3589A04B48E1BB7773171896BF1BD6D2F2BB8BDF3E2
+ E6BE1A6AFFCC9807C7F45F8DB1C1A360188249DF21509D62FF19BB05D8302A44
+ 692C7F6CFC591B50BB2E82D9D77DEAB3A5798DE48422664FAFB07685BA45F4DB
+ 6B152B3094324E8EBFE15F5D7CD52B721A3137D14084428BD42F185B31FC313F
+ F0C4B3D22BE38FD38424E25544E4137646946B99C762A5408A1EC453A35D4BA6
+ 1E5B02DBCC569955088077559CE91C930724FFC77163DE8CCC66A936DB879BF1
+ 9DF31325AB6FAD1D07D490577D4A884E3D5675BBE926B9CA4B41A18D99848722
+ 64DC60152A405CCDD49C0BCA463FCFA8E158B2DD607F9D19E64976441E96CD60
+ CCB38C132091BAD174AA61913104C43DADA2599D4C89BA7FF1D44618CD4DE923
+ 78B6F969658A67A481B433F08073B45FF9588E992424A3B2B4C32EBE37D9136E
+ 313FC12BF4A48A4DC8C5489AD1B90349CA5DA7A41E2BD874C7CC9C317B0DDB5F
+ 1E9E4E549C5A56F38B85F331E04C17D2DFF639DA2532C14DB4AFC017E7B6E268
+ 611D15741A3B16A1A7C47D3068E2959CB8AF8B2D4EF8AF3E4118D10A0B312E2C
+ 3AB27D8E6365DF7866A06F0027EFEDA6D6934B6803939ACE02522B134EFC6E19
+ 0A19CF3CF0B550EA070C02BDB20D4CF99069B1D977F6F2129F14B78A28EDCEBF
+ 70402302A7454F26CFDEEBA41BA329912F98AD2AF4880FE40F1DB9ED4F925DA3
+ 515986E530F07630EE57FCC3DEDCE51DEA5151F5CB04A6622F22BFA48384C570
+ B767D740AFA1F468A8491BB5DC969BD3400F30A299D16D8E0D2499DA45E1F8EF
+ D30DB45B1296026382AB0CAF9ADE17682B2FCD009DF605E0EA1495D269681469
+ E8BE6B2FE54513310BBD3764D545511FC842EC81064239B113B13B9AC4BDE08A
+ 594198F13BE47BDB6BCC7ABB0C6545914B4D4D8026705A51E1FD08A0B332C9FD
+ 30E5FADF16045BC80E3FB9A6F0FC46DBD9C694D8A53F4AB38499856F4BFDAC3E
+ 6FDAA80140E70329A0DE859F51B201D587FAE1013A3887F9FB35CCC734413F2C
+ 137DEBBA8739299AC74F0C5B3BA0D33ECA7EB4571B1954EB847EE3D4F5599820
+ 44A50E7D8EA6095C72AB04F91AB4CE1964CC087D6B7B51EA1093773D9BA93ED0
+ 8BA46AC18A3A253325445FEA65086E1299C289E6DA70FC804647557C45576D7A
+ 65A3B7985758205598112A2A26C193B2422BB449517D494F80848AD0289F4FFC
+ 388827A11667E4909E7BF25B069E38E0FA183F88E16460C20C9835A6D4F3BCBE
+ 93ABAE3AFE76DB5C760CD859DC561EB5A31AAFBD038CE7B4014860C510427A25
+ 89C93322C731B7B2CA0C31A0D4AD8D10C2DDE3E56334B13DDB37F5FEC568AF6F
+ 7323204F81B3438026F4056060A8E71084DE0986207BF80A42ED7B9E3D1598B0
+ 77153BB6E349A0DB06EDCDFA5DB1EC7411CBAAB2A5016DAFECAB07A2E2CAC2EB
+ 755A874BFEB1F0C24077FBC10404563FDB8BBBD2343793BD698E0DD74B85A648
+ B407E89FB1C7D290A09F4FAE1DD371D045291338833AA6E42E8018F0DDBB5069
+ 18A2F92E04027C57B5AD3B8BD7EC476AEEB5A17734CD8FD22E8035C55332D19F
+ EA34A772A52951781D2C6077A5B43FF95B64CA447AF911254F2AB5B3936EC5A3
+ 65E5CC0A3D3ECD62D6A7A4DB18B5A4F39157E78C2E5E5270F25647B90EC1BE18
+ 1EABE9A97D3D4368F26917143DCBD5F5C00722817DB7C791C12EE1226CD463B6
+ 70D404059BB60375F2F201752165D513E7498D0D3D2160C4E56213EE1A6289FF
+ 3BAC30F5C14627A31944C16BC514D759A61BDF7EC77A5619EC235C647752A9C2
+ 3AC141B71C5CEAE083BAAA45E3344061A250F8F8CAA80845C894AEF45E10128A
+ 4F91A1EA4A8B20A93EA08C5A062BB7CB2CACA438C230F6E89FA0072A3AB4E49A
+ 114F212030A4DB171A65C8B5671380BF312C075964FB810D4CE0323B8EAA3F6D
+ 9076F23D66BB5AE3CDB978DDF2E247781B9435335F90A4A17F85AB3B3CBB2678
+ 9C6DE2BF5CCE4B34CF39792AE4FB0E7A667E06D473A7671E9E810883CB904EBA
+ C98F4A5DDC20A7775C7D1A7DBA36FCDEC3233304CE7488A9EE369056766A1C44
+ CA179858A9A94DE3B7182EFFB74C7BD2752FD65B0E652FF1ECF3AC816375EA0F
+ F1320698233F6F7EA35BF8D257D9F5B0C3DE3A3F4C8438C5B0E1E791E509E1B5
+ C26FF0E95311E7110C59F4A509CA773609C40F67F5AA625D55F01C7456CC745A
+ DE91524B04A8A320210DBF97601EBF1C372FEC1EFD75B6EEC33FCB89B2EF581F
+ 3235D530682AC958D52DCD6D4E88FE47B5189C279B5411F5603FF6054A6A8A82
+ 4EE729E700F24D51025E8DEFC1EB610F6BE76C3C70F8320F6363748182BD398D
+ B308B33AA589E5922528EED7407E6377D052D4DD95C36F9E5809BBA90FEFDC83
+ A5D0C52A22F2B7D763A90195B85B95BAAD91A4FB5BC73724B2B5631C8809225D
+ 5ED9C23C6914EDA2D7D1F406F46884A9D74B1443557E09B8E13572067EAA623E
+ 8ADCF43901C801CA4A2403E7EB308F71FEF9A105540AD7BF2120AC18E4B4B315
+ 9CA84E5D6DBC3EA141BF1132FF98A4CCCE269B8F0754F22BA882944E5ECAD9E9
+ 18C22FDD632CD2A5963B333147433B4095B1F36D2BDDC7FDAFE7523385DC4680
+ BEF9EF8FA262144741EA54BF8DBFA4CA130C71C783B9D1566D46B22F7994616D
+ AD1B0D89979C601BAC6CC3F057BD760CF3861800A28A7927423879A39C6AFC49
+ 8E5A19E083AA8334539D8C8D4581EED0885DE0F36A04011D35819A37650038AD
+ 649DC79526694FE42574D564D9CF1208B8256777018279B5C979DBE27752E69E
+ 434AD4C89303C64B42A38107A2775006DABBCEE0D45A46514FB6D7C8AC9A709A
+ 839A1FA6DAA520EB07551AAC03CEECD81608430A445D8B1D0CB339ED7099E7A2
+ 67DC49469261A3D44D9C46C13EFEBE6DC03D8BE03D46B0020520C760CE03EFE3
+ FB29BCAFC452E0F241BE4BDEB29ECC7044B0FFAB373C708C9CCC0861A5CE8155
+ 76238A9D5A66AB4F6680D1188634AB5944C1EE6FF33BE21B0B953D3076D6002B
+ 9214916C101F235289EFE5F9DE3405CCD17277478EFE4B1C2009AA8DA67BB88C
+ 34D719A61F3C764ADD5A8AE30297D89F32F11C54AEB49AB12376FB0AF533F0E0
+ 075DF9A67D0EF6F93DC3E7C6045517DCCC3DF45F02628E1A2F0ABAD263BD334E
+ E23528A17C219C6EC2876C0898532AA4F3274A7FA44A005F8A1BE9C435C2612C
+ B8FB31512D9BDDBFA9B638E1EA92CD2F4A4C66D314655D5DCBC06DF305BBC676
+ E91B409B65613C0B808A41529F79515D8B222F5FB26678455523C1A1CDFAE7B4
+ 0345E9F22D2B96419D64D3E629593211C45C7AF0D4A934452EE790B009AA15D6
+ 3D226E7FFE0A9D1E01A23987ABD599C70ECDA161579E3D58DA2DFF34E53DFE8A
+ E1EA6CABD94CD5B29BC46C3A0ED15B80AE2EA61CA0A82AFF78E026FEF7CA7CD9
+ 2C9F89B62D0CF610224ED383C3A3B0E894FE4EB0C2D7251D5D9CEE5DFCFD577E
+ 10BE74A28B69E9E5572748432A87471572B7E85CC06BB59E96158141CA6559A7
+ 3305429D4052B349E30CA420CBBEDB2139419822D766E05FC5D9DCA4D1B9CD36
+ 82961E692FABDC0BB54758B6F2525398242D087AD51BAF0B8E64491A918BF827
+ 276C1929F5F58C5CB636DFD04E5F1D0132DE3600EA8BA6368261FB6FDFBD8FD6
+ 988391B442B10DBE529817E722B11861090B7DC099837C2328CD068A284E62B6
+ DA0131263FDE8439918DB65C5ED48EDBCE043677BE6052911940795D4270ECC0
+ 9A21A090A7D7D5B8E73A11F1760BED6836A869B3C910F60504904FDD35A72A8F
+ E716A79AA041A29B3F1814795A6953F6F8855F764FFECBA097C08E34F547ABB3
+ B9154430C288E24678ED0EE89F315D577770CCB43475EE85C3F91DE43DE96510
+ 14BD7EE5D7CFE1975D75D8C3E248D9E193AA21A354F27E6E5A0D8CAF36868694
+ FCC5808D244F7638F1A1F8E53295734BAE25448046CA061B00EC5256B92B6FE2
+ 8BE1B6FAC589B75547935B5852492B084C042368C35D580C11DE7E97FFBB3617
+ 08A692E314574CCB2DA2D7283069B2E072613ADEAB6A9AAB688EEA1483225191
+ C0F819D8C0F479E346B4CE02F01B5D
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ %%BeginFont: CMSY9
+ %!PS-AdobeFont-1.1: CMSY9 1.0
+ %%CreationDate: 1991 Aug 15 07:22:27
+ % Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+ 11 dict begin
+ /FontInfo 7 dict dup begin
+ /version (1.0) readonly def
+ /Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+ /FullName (CMSY9) readonly def
+ /FamilyName (Computer Modern) readonly def
+ /Weight (Medium) readonly def
+ /ItalicAngle -14.035 def
+ /isFixedPitch false def
+ end readonly def
+ /FontName /CMSY9 def
+ /PaintType 0 def
+ /FontType 1 def
+ /FontMatrix [0.001 0 0 0.001 0 0] readonly def
+ /Encoding 256 array
+ 0 1 255 {1 index exch /.notdef put} for
+ dup 15 /bullet put
+ dup 102 /braceleft put
+ dup 103 /braceright put
+ readonly def
+ /FontBBox{-30 -958 1146 777}readonly def
+ /UniqueID 5000819 def
+ currentdict end
+ currentfile eexec
+ D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964
+ 7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4
+ A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85
+ E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A
+ 221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A
+ 27D1663E0B62F461F6E40A5D6676D0037D33F24E2FAC2B0009AD3C8350CDF8CC
+ 65BCA87979C36D14CB552E9A985E48BE4E88ECA16DF418749AF04FDD2B0E1380
+ D281BB2476BB45FF30946B247DFD7F57305FA87E50CA338121C71CDFDF927A9C
+ 77FF14CB4A1D6D80356FB1171ED38C37702350497B44E42CE31DB2F493807DAA
+ 15B887C671199A54C4C1294BC520F5538C15556BC43C9F62342B121C6DCD6C5F
+ 491DA47FF360201EE21C08A781ED0589A6DF91B99FE118B9B29E4F068672E52F
+ 1A06C514D91C4C937D4E642503392B1CD1B8F5332A2C13884EB17C99A3A4EC0D
+ 3790FC136B8D59FF9A7F7E85B08711D1A7528C6523F9E3E57AFEE126AB807F0E
+ EA8CFC6BC85A2837374D91A2086D21276F2D297AC8E9DC910A7165D03912FFD6
+ 8C8A88903E1B53923A709D53151BFA54F3872D4C0BE670F804C7B7450FE0BB79
+ A8B4E2539B4CD787DE000F9194A0F368E9E508CB31C496B53DC80D70C66B68AC
+ C12C2BD1AA281558DC4E225E79F193B48AD67513CD35D04A2F12D9C4FD1C4BE0
+ 8AE161743E2B36AAD5552C2E61753BFE58C763513D65EF21DCE798067DC56C23
+ 3DE3C50469A848FDAF2A73FCE6D567E9FFAB10938DA514DA018246986DE3FAAA
+ 5119425789233D25BA532CA8EC3B1F3D5B5B447FFFF72A9ECCA2FBDE79E8E50E
+ 66229DE314070ACFCCF08F56CD796BA9C652F0D490A3925201C65A48D6A6251B
+ 8C6F67F6E5BBF65824E14AEBB029532B3CDC40BF6CB2266968BB1BFA79EF7229
+ 94D3DA3B16E61D91C39DBBD3B1B605E3389D542F01F179DE1910F23112EDBE68
+ FDC2E7C90F36C0F0EDDBB6EDAFBBE4198DDA6407B333918446E4F23D0406E209
+ ECBF8F75CADE7BFBFEECCD831CBCBDDFC23CD100C8BF0C3C054BDC74BA1BA9B8
+ 56C501FA186850974317C985E4DDABCB06BB9E2661867DF4277F1AB20B9E4E70
+ 08105E002381E2B69BFE9BDF4FA9485F726E158314700D75877418AC318AD5F9
+ 46C13291CC8D7C265319D6C89D60E9D2300D60CE42BCDF0984F3A4249BB13DF7
+ F08660E1F65B65D3653291C708CBA63C6A31623FB1A4CF050114B702BDFBCBAB
+ D303C254B4D31916205A1700B140DA17463223748B1D73638C0DF8AF41AB0871
+ 7456190EE5AC64A4DD9E339122300D27F6DFC97C5A0F97D918A1F4AA
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndFont 
+ TeXDict begin 40258431 52099146 1000 1200 1200 (paper.dvi)
+ @start /Fa 139[48 58 10[72 104[{}3 99.6264 /CMMI6 rf
+ /Fb 82[61 51[81 81 122 81 91 51 71 71 1[91 91 91 132
+ 51 1[51 51 91 91 51 81 91 81 1[91 9[152 112 2[91 2[112
+ 2[152 102 2[61 132 1[112 112 1[122 1[112 1[91 4[61 5[91
+ 91 91 91 2[46 46[{TeXBase1Encoding ReEncodeFont}42 182.648
+ /Times-Italic rf /Fc 133[68 81 81 111 81 85 60 61 60
+ 1[85 77 85 128 43 2[43 85 77 47 68 85 68 85 77 8[115
+ 1[115 1[111 85 5[141 96 119 1[55 3[105 1[111 109 9[77
+ 1[77 7[43 51 43 119 1[60 60 26[85 85 12[{}44 149.44 /CMSL9
+ rf /Fd 129[71 71 1[71 1[71 71 71 71 71 71 71 71 1[71
+ 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 71 9[71
+ 71 4[71 71 71 71 2[71 71 1[71 71 1[71 1[71 2[71 71 71
+ 71 71 5[71 1[71 71 1[71 71 1[71 1[71 71 71 71 1[71 37[{}57
+ 132.835 /CMTT8 rf /Fe 158[81 66[91 30[{}2 149.44 /CMMI9
+ rf /Ff 198[61 61 61 61 61 61 61 61 61 61 48[{}10 99.6264
+ /CMR6 rf /Fg 134[93 4[69 70 73 1[98 1[98 147 49 93 1[49
+ 98 2[81 98 79 1[86 10[133 136 123 98 2[121 1[138 168
+ 106 4[139 1[116 135 128 126 133 65[{}29 149.44 /CMBX9
+ rf /Fh 133[63 74 71 102 71 82 51 63 65 1[78 78 86 125
+ 39 71 47 47 78 71 47 71 78 71 71 78 8[114 153 114 114
+ 110 86 112 1[104 118 114 138 96 1[81 59 1[119 100 104
+ 116 110 1[114 6[47 78 78 1[78 2[78 78 78 1[78 47 55 47
+ 2[63 63 47 23[137 135 90 86 12[{}63 149.44 /CMTI9 rf
+ /Fi 129[77 1[154 77 68 81 81 111 81 85 60 61 60 81 85
+ 77 85 128 43 81 47 43 85 77 47 68 85 68 85 77 43 2[43
+ 77 43 94 115 115 158 115 115 111 85 113 1[105 119 115
+ 141 96 119 79 55 115 121 100 105 117 111 109 115 1[73
+ 3[43 43 77 77 77 77 77 77 77 77 77 77 77 43 51 43 119
+ 1[60 60 43 119 128 1[128 77 43 13[77 3[128 128 85 85
+ 90 11[{}90 149.44 /CMR9 rf /Fj 82[66 50[88 100 100 144
+ 100 111 66 78 88 1[111 100 111 166 55 111 1[55 111 100
+ 66 88 111 88 111 100 8[144 199 144 144 133 111 144 1[122
+ 155 144 188 133 155 100 78 155 155 122 133 144 144 133
+ 144 6[66 2[100 100 100 100 100 100 100 2[50 1[50 5[166
+ 34[111 111 2[{TeXBase1Encoding ReEncodeFont}61 199.253
+ /Times-Bold rf /Fk 129[78 78 1[78 78 78 78 78 78 78 78
+ 78 78 1[78 78 78 78 78 78 78 78 78 78 78 78 78 78 78
+ 78 3[78 1[78 78 78 78 5[78 1[78 78 2[78 8[78 2[78 2[78
+ 1[78 78 6[78 78 78 1[78 78 78 78 1[78 78 78 2[78 37[{}53
+ 149.44 /CMTT9 rf /Fl 152[77 77 86[77 15[{}3 149.44 /CMSY9
+ rf /Fm 82[66 51[100 2[100 1[55 100 66 1[111 111 111 166
+ 44 100 1[44 111 111 55 111 111 1[111 111 10[133 144 8[111
+ 2[55 5[144 1[133 65[{TeXBase1Encoding ReEncodeFont}26
+ 199.253 /Helvetica rf /Fn 134[166 1[233 2[100 166 116
+ 1[183 183 183 266 83 166 1[83 1[183 100 166 3[166 10[199
+ 1[183 3[199 2[249 183 5[183 2[216 1[216 6[100 19[216
+ 38[{TeXBase1Encoding ReEncodeFont}26 298.879 /Helvetica-Bold
+ rf end
+ %%EndProlog
+ %%BeginSetup
+ %%Feature: *Resolution 1200dpi
+ TeXDict begin
+ %%BeginPaperSize: Letter
+ letter
+ %%EndPaperSize
+  end
+ %%EndSetup
+ %%Page: 1 1
+ TeXDict begin 1 0 bop 1315 222 a Fn(LL)-33 b(VM:)82 b(A)h(Compilation)e
+ (Frame)l(w)-6 b(ork)82 b(f)-6 b(or)722 554 y(Lif)m(elong)82
+ b(Pr)-6 b(ogram)83 b(Anal)l(ysis)g(&)g(T)-24 b(ransf)-6
+ b(ormation)2393 1242 y Fm(Chr)s(is)55 b(Lattner)711 b(Vikr)n(am)55
+ b(Adv)-5 b(e)2023 1440 y(Univ)g(ersity)55 b(of)h(Illinois)g(at)f
+ (Urbana\255Champaign)2823 1614 y Fl(f)p Fk(lattner,vadve)p
+ Fl(g)p Fk(@cs.uiuc)q(.e)q(du)2939 1789 y(http://llvm.cs.uiuc.)q(edu)q
+ (/)-303 2403 y Fj(ABSTRA)-11 b(CT)-303 2644 y Fi(This)61
+ b(pap)t(er)i(describ)t(es)f(LL)-17 b(VM)61 b(\(Lo)l(w)g(Lev)l(el)h
+ (Virtual)f(Mac)l(hine\),)-303 2818 y(a)49 b(compiler)g(framew)l(ork)h
+ (designed)g(to)f(supp)t(ort)g Fh(tr)-8 b(ansp)g(ar)g(ent,)55
+ b(life-)-303 2993 y(long)d(pr)-8 b(o)g(gr)g(am)52 b(analysis)h(and)g
+ (tr)-8 b(ansformation)50 b Fi(for)d(arbitrary)g(pro-)-303
+ 3167 y(grams,)112 b(b)l(y)100 b(pro)l(viding)h(high-lev)l(el)g
+ (information)e(to)i(compiler)-303 3341 y(transformations)37
+ b(at)j(compile-time,)h(link-time,)g(run-time,)i(and)d(in)-303
+ 3516 y(idle)51 b(time)g(b)t(et)l(w)l(een)i(runs.)68 b(LL)-17
+ b(VM)52 b(de\014nes)g(a)f(common,)h(lo)l(w-lev)l(el)-303
+ 3690 y(co)t(de)39 b(represen)l(tation)g(in)f(Static)g(Single)h
+ (Assignmen)l(t)e(\(SSA\))i(form,)-303 3864 y(with)53
+ b(sev)l(eral)h(no)l(v)l(el)f(features:)74 b(a)54 b(simple,)g
+ Fh(language-indep)-8 b(endent)-303 4039 y Fi(t)l(yp)t(e-system)55
+ b(that)h(exp)t(oses)g(the)g(primitiv)l(es)f(commonly)h(used)g(to)-303
+ 4213 y(implemen)l(t)67 b(high-lev)l(el)g(language)g(features;)75
+ b(an)67 b(instruction)g(for)-303 4387 y(t)l(yp)t(ed)47
+ b(address)f(arithmetic;)h(and)g(a)f(simple)f(mec)l(hanism)i(that)e(can)
+ -303 4562 y(b)t(e)77 b(used)f(to)g(implemen)l(t)g(the)g(exception)h
+ (handling)f(features)g(of)-303 4736 y(high-lev)l(el)57
+ b(languages)g(\(and)g Fk(setjmp)p Fi(/)p Fk(longjmp)63
+ b Fi(in)58 b(C\))f(uniformly)-303 4910 y(and)70 b(e\016cien)l(tly)-13
+ b(.)125 b(The)70 b(LL)-17 b(VM)70 b(compiler)g(framew)l(ork)g(and)h(co)
+ t(de)-303 5085 y(represen)l(tation)53 b(together)g(pro)l(vide)h(a)f
+ (com)l(bination)g(of)g(k)l(ey)g(capa-)-303 5259 y(bilities)37
+ b(that)i(are)h(imp)t(ortan)l(t)e(for)h(practical,)i(lifelong)e
+ (analysis)e(and)-303 5433 y(transformation)51 b(of)h(programs.)72
+ b(T)-13 b(o)52 b(our)h(kno)l(wledge,)g(no)g(existing)-303
+ 5608 y(compilation)41 b(approac)l(h)h(pro)l(vides)g(all)f(these)h
+ (capabilities.)64 b(W)-13 b(e)42 b(de-)-303 5782 y(scrib)t(e)53
+ b(the)g(design)g(of)g(the)g(LL)-17 b(VM)52 b(represen)l(tation)h(and)h
+ (compiler)-303 5956 y(framew)l(ork,)61 b(and)f(ev)-9
+ b(aluate)60 b(the)g(design)g(in)f(three)i(w)l(a)l(ys:)83
+ b(\(a\))59 b(the)-303 6131 y(size)73 b(and)h(e\013ectiv)l(eness)f(of)h
+ (the)g(represen)l(tation,)k(including)c(the)-303 6305
+ y(t)l(yp)t(e)59 b(information)g(it)g(pro)l(vides;)k(\(b\))c(compiler)g
+ (p)t(erformance)i(for)-303 6480 y(sev)l(eral)49 b(in)l(terpro)t
+ (cedural)h(problems;)g(and)g(\(c\))g(illustrativ)l(e)d(exam-)-303
+ 6654 y(ples)62 b(of)h(the)g(b)t(ene\014ts)h(LL)-17 b(VM)63
+ b(pro)l(vides)g(for)g(sev)l(eral)f(c)l(hallenging)-303
+ 6828 y(compiler)51 b(problems.)-303 7272 y Fj(1.)198
+ b(INTR)-6 b(ODUCTION)-154 7487 y Fi(Mo)t(dern)66 b(applications)d(are)i
+ (increasing)g(in)g(size,)i(c)l(hange)f(their)-303 7662
+ y(b)t(eha)l(vior)80 b(signi\014can)l(tly)f(during)h(execution,)88
+ b(supp)t(ort)80 b(dynamic)-303 7836 y(extensions)56 b(and)i(upgrades,)h
+ (and)e(often)g(ha)l(v)l(e)h(comp)t(onen)l(ts)f(writ-)-303
+ 8010 y(ten)41 b(in)h(m)l(ultiple)e(di\013eren)l(t)i(languages.)64
+ b(While)41 b(some)g(applications)-303 8185 y(ha)l(v)l(e)77
+ b(small)e(hot)i(sp)t(ots,)82 b(others)77 b(spread)g(their)g(execution)h
+ (time)-303 8359 y(ev)l(enly)65 b(throughout)h(the)f(application)g
+ ([14].)109 b(In)66 b(order)f(to)g(maxi-)-303 8533 y(mize)52
+ b(the)h(e\016ciency)g(of)f(all)f(of)h(these)h(programs,)e(w)l(e)h(b)t
+ (eliev)l(e)h(that)-303 8708 y(program)80 b(analysis)e(and)j
+ (transformation)e(m)l(ust)g(b)t(e)i(p)t(erformed)-303
+ 8882 y(throughout)62 b(the)g(lifetime)f(of)g(a)h(program.)99
+ b(Suc)l(h)63 b(\\lifelong)e(co)t(de)-303 9057 y(optimization")76
+ b(tec)l(hniques)j(encompass)f(in)l(terpro)t(cedural)h(opti-)4080
+ 2403 y(mizations)40 b(p)t(erformed)i(at)e(link-time)g(\(to)g(preserv)l
+ (e)h(the)g(b)t(ene\014ts)h(of)4080 2578 y(separate)52
+ b(compilation\),)e(mac)l(hine-dep)t(enden)l(t)55 b(optimizations)50
+ b(at)4080 2752 y(install)59 b(time)i(on)f(eac)l(h)i(system,)g(dynamic)f
+ (optimization)e(at)h(run-)4080 2926 y(time,)75 b(and)c
+ (pro\014le-guided)i(optimization)c(b)t(et)l(w)l(een)j(runs)f(\(\\idle)
+ 4080 3101 y(time"\))40 b(using)h(pro\014le)h(information)e(collected)h
+ (from)g(the)g(end-user.)4230 3275 y(Program)f(optimization)g(is)g(not)h
+ (the)h(only)f(use)g(for)g(lifelong)f(anal-)4080 3449
+ y(ysis)57 b(and)h(transformation.)86 b(Other)59 b(applications)e(of)g
+ (static)f(anal-)4080 3624 y(ysis)75 b(are)h(fundamen)l(tally)g(in)l
+ (terpro)t(cedural,)82 b(and)76 b(are)g(therefore)4080
+ 3798 y(most)56 b(con)l(v)l(enien)l(t)h(to)g(p)t(erform)h(at)e
+ (link-time)h(\(examples)f(include)4080 3972 y(static)78
+ b(debugging,)87 b(static)78 b(leak)h(detection)h([24],)85
+ b(and)80 b(memory)4080 4147 y(managemen)l(t)63 b(transformations)d
+ ([30]\).)101 b(Sophisticated)62 b(analyses)4080 4321
+ y(and)40 b(transformations)e(are)i(b)t(eing)g(dev)l(elop)t(ed)i(to)d
+ (enforce)h(program)4080 4495 y(safet)l(y)-13 b(,)77 b(but)c(m)l(ust)f
+ (b)t(e)h(done)g(at)f(soft)l(w)l(are)f(installation)f(time)i(or)4080
+ 4670 y(load-time)56 b([19].)80 b(Allo)l(wing)55 b(lifelong)g
+ (reoptimization)g(of)h(the)g(pro-)4080 4844 y(gram)73
+ b(giv)l(es)g(arc)l(hitects)g(the)g(p)t(o)l(w)l(er)h(to)f(ev)l(olv)l(e)g
+ (pro)t(cessors)g(and)4080 5018 y(exp)t(osed)64 b(in)l(terfaces)e(in)g
+ (more)h(\015exible)g(w)l(a)l(ys)f([11,)i(20],)g(while)f(al-)4080
+ 5193 y(lo)l(wing)50 b(legacy)h(applications)g(to)f(run)i
+ Fh(wel)8 b(l)51 b Fi(on)g(new)h(systems.)4230 5367 y(This)75
+ b(pap)t(er)i(presen)l(ts)f Fg(LL)-20 b(VM)76 b Fi(|)g(Lo)l(w-Lev)l(el)f
+ (Virtual)g(Ma-)4080 5541 y(c)l(hine)65 b(|)e(a)h(compiler)f(framew)l
+ (ork)h(that)f(aims)g(to)g(mak)l(e)h(lifelong)4080 5716
+ y(program)48 b(analysis)e(and)h(transformation)g(a)l(v)-9
+ b(ailable)46 b(for)i(arbitrary)4080 5890 y(soft)l(w)l(are,)58
+ b(and)h(in)f(a)g(manner)h(that)e(is)h(transparen)l(t)g(to)f(program-)
+ 4080 6064 y(mers.)63 b(LL)-17 b(VM)37 b(ac)l(hiev)l(es)h(this)e
+ (through)i(t)l(w)l(o)e(parts:)60 b(\(a\))37 b Fh(a)42
+ b(c)-8 b(o)g(de)43 b(r)-8 b(ep-)4080 6239 y(r)g(esentation)56
+ b Fi(with)44 b(sev)l(eral)f(no)l(v)l(el)h(features)g(that)f(serv)l(es)h
+ (as)f(a)h(com-)4080 6413 y(mon)66 b(represen)l(tation)f(for)h
+ (analysis,)h(transformation,)g(and)f(co)t(de)4080 6587
+ y(distribution;)80 b(and)72 b(\(b\))f Fh(a)j(c)-8 b(ompiler)74
+ b(design)83 b Fi(that)71 b(exploits)f(this)4080 6762
+ y(represen)l(tation)49 b(to)g(pro)l(vide)g(a)g(com)l(bination)f(of)h
+ (capabilities)f(that)4080 6936 y(is)72 b(not)h(a)l(v)-9
+ b(ailable)72 b(in)h(an)l(y)f(previous)h(compilation)f(approac)l(h)h(w)l
+ (e)4080 7111 y(kno)l(w)51 b(of.)4230 7285 y(The)42 b(LL)-17
+ b(VM)41 b(co)t(de)h(represen)l(tation)f(describ)t(es)h(a)f(program)h
+ (using)4080 7459 y(an)61 b(abstract)g(RISC-lik)l(e)g(instruction)g(set)
+ g(but)g(with)g(k)l(ey)h(higher-)4080 7634 y(lev)l(el)h(information)e
+ (for)i(e\013ectiv)l(e)f(analysis.)101 b(This)62 b(includes)h(t)l(yp)t
+ (e)4080 7808 y(information,)82 b(explicit)76 b(con)l(trol)g(\015o)l(w)g
+ (graphs,)83 b(and)77 b(an)g(explicit)4080 7982 y(data\015o)l(w)44
+ b(represen)l(tation)h(\(using)g(an)g(in\014nite,)h(t)l(yp)t(ed)f
+ (register)g(set)4080 8157 y(in)67 b(Static)f(Single)h(Assignmen)l(t)e
+ (form)i([15]\).)112 b(There)68 b(are)f(sev)l(eral)4080
+ 8331 y(no)l(v)l(el)48 b(features)h(in)f(the)h(LL)-17
+ b(VM)48 b(co)t(de)h(represen)l(tation:)67 b(\(a\))47
+ b(A)i(lo)l(w-)4080 8505 y(lev)l(el,)d Fh(language-indep)-8
+ b(endent)45 b Fi(t)l(yp)t(e)g(system)f(that)g(can)h(b)t(e)h(used)f(to)
+ 4080 8680 y Fh(implement)83 b Fi(data)67 b(t)l(yp)t(es)g(and)h(op)t
+ (erations)f(from)g(high-lev)l(el)g(lan-)4080 8854 y(guages,)41
+ b(exp)t(osing)f(their)f(implemen)l(tation)g(b)t(eha)l(vior)g(to)g(all)f
+ (stages)4080 9028 y(of)60 b(optimization.)92 b(This)59
+ b(t)l(yp)t(e)i(system)e(includes)h(the)g(t)l(yp)t(e)g(infor-)4080
+ 9203 y(mation)74 b(used)h(b)l(y)g(sophisticated)f(\(but)g
+ (language-indep)t(enden)l(t\))4080 9377 y(tec)l(hniques,)62
+ b(suc)l(h)e(as)f(algorithms)f(for)h(p)t(oin)l(ter)g(analysis,)h(dep)t
+ (en-)4080 9551 y(dence)h(analysis,)e(and)h(data)f(transformations.)90
+ b(\(b\))59 b(Instructions)4080 9726 y(for)46 b(p)t(erforming)g(t)l(yp)t
+ (e)g(con)l(v)l(ersions)e(and)i(lo)l(w-lev)l(el)f(address)g(arith-)4080
+ 9900 y(metic)54 b(while)h(preserving)f(t)l(yp)t(e)h(information.)77
+ b(\(c\))54 b(Tw)l(o)f(lo)l(w-lev)l(el)4080 10074 y(exception-handling)e
+ (instructions)e(for)g(implemen)l(ting)g(language-)4080
+ 10249 y(sp)t(eci\014c)72 b(exception)g(seman)l(tics,)j(while)c
+ (explicitly)f(exp)t(osing)i(ex-)4080 10423 y(ceptional)51
+ b(con)l(trol)g(\015o)l(w)g(to)g(the)g(compiler.)4230
+ 10597 y(The)37 b(LL)-17 b(VM)36 b(represen)l(tation)g(is)g
+ Fh(sour)-8 b(c)g(e-language-indep)g(endent)p Fi(,)p eop
+ end
+ %%Page: 2 2
+ TeXDict begin 2 1 bop -303 -137 a Fi(for)44 b(t)l(w)l(o)g(reasons.)66
+ b(First,)45 b(it)f(uses)h(a)g(lo)l(w-lev)l(el)f(instruction)h(set)f
+ (and)-303 37 y(memory)62 b(mo)t(del)h(that)f(are)h(only)f(sligh)l(tly)f
+ (ric)l(her)i(than)g(standard)-303 211 y(assem)l(bly)58
+ b(languages,)j(and)f(the)g(t)l(yp)t(e)g(system)f(do)t(es)h(not)g
+ Fh(pr)-8 b(event)-303 386 y Fi(represen)l(ting)67 b(co)t(de)h(with)e
+ (little)f(t)l(yp)t(e)i(information.)114 b(Second,)71
+ b(it)-303 560 y(do)t(es)50 b(not)g(imp)t(ose)g(an)l(y)f(particular)h
+ (run)l(time)g(requiremen)l(ts)h(or)f(se-)-303 734 y(man)l(tics)59
+ b(on)g(programs.)94 b(Nev)l(ertheless,)61 b(it's)e(imp)t(ortan)l(t)g
+ (to)h(note)-303 909 y(that)k(LL)-17 b(VM)65 b(is)g Fh(not)j(intende)-8
+ b(d)69 b(to)f(b)-8 b(e)67 b(a)h(universal)g(c)-8 b(ompiler)68
+ b(IR)p Fi(.)-303 1083 y(In)51 b(particular,)f(LL)-17
+ b(VM)51 b(do)t(es)g(not)g(represen)l(t)g(high-lev)l(el)g(language)-303
+ 1257 y(features)65 b(directly)g(\(so)f(it)g(cannot)h(b)t(e)h(used)f
+ (for)g(some)g(language-)-303 1432 y(dep)t(enden)l(t)70
+ b(transformations\),)f(nor)f(do)t(es)g(it)f(capture)h(mac)l(hine-)-303
+ 1606 y(dep)t(enden)l(t)42 b(features)e(or)g(co)t(de)h(sequences)g(used)
+ f(b)l(y)g(bac)l(k-end)i(co)t(de)-303 1780 y(generators)51
+ b(\(it)f(m)l(ust)h(b)t(e)h(lo)l(w)l(ered)f(to)f(do)i(so\).)-154
+ 1955 y(Because)e(of)f(the)h(di\013ering)f(goals)f(and)h(represen)l
+ (tations,)g Fh(LL)-16 b(VM)-303 2129 y(is)45 b(c)-8 b(omplementary)46
+ b(to)g(high-level)e(virtual)i(machines)41 b Fi(\(e.g.,)g(Small-)-303
+ 2304 y(T)-13 b(alk)45 b([18],)h(Self)g([43],)f(JVM)h([32],)g
+ (Microsoft's)d(CLI)k([33],)e(and)i(oth-)-303 2478 y(ers\),)g(and)g
+ Fh(not)52 b(an)f(alternative)g(to)g(these)f(systems)p
+ Fi(.)66 b(It)47 b(di\013ers)g(from)-303 2652 y(these)d(in)g(three)h(k)l
+ (ey)g(w)l(a)l(ys.)64 b(First,)45 b(LL)-17 b(VM)44 b(has)g(no)g(notion)g
+ (of)g(high-)-303 2827 y(lev)l(el)67 b(constructs)g(suc)l(h)g(as)g
+ (classes,)j(inheritance,)i(or)67 b(exception-)-303 3001
+ y(handling)58 b(seman)l(tics,)g(ev)l(en)h(when)g(compiling)f(source)g
+ (languages)-303 3175 y(with)85 b(these)h(features.)172
+ b(Second,)95 b(LL)-17 b(VM)86 b(do)t(es)g(not)g(sp)t(ecify)g(a)-303
+ 3350 y(run)l(time)66 b(system)g(or)g(particular)g(ob)9
+ b(ject)67 b(mo)t(del:)98 b(it)66 b(is)g(lo)l(w-lev)l(el)-303
+ 3524 y(enough)g(that)f(the)g(run)l(time)g(system)g(for)g(a)g
+ (particular)g(language)-303 3698 y(can)74 b(b)t(e)i(implemen)l(ted)f
+ (in)f(LL)-17 b(VM)75 b(itself.)136 b(Indeed,)82 b(LL)-17
+ b(VM)74 b(can)-303 3873 y(b)t(e)69 b(used)f(to)g Fh(implement)h
+ Fi(high-lev)l(el)f(virtual)g(mac)l(hines.)119 b(Third,)-303
+ 4047 y(LL)-17 b(VM)70 b(do)t(es)g(not)h(guaran)l(tee)f(t)l(yp)t(e)h
+ (safet)l(y)-13 b(,)74 b(memory)d(safet)l(y)-13 b(,)74
+ b(or)-303 4221 y(language)59 b(in)l(terop)t(erabilit)l(y)f(an)l(y)i
+ (more)f(than)h(the)f(assem)l(bly)g(lan-)-303 4396 y(guage)51
+ b(for)g(a)g(ph)l(ysical)f(pro)t(cessor)i(do)t(es.)-154
+ 4570 y(The)63 b(LL)-17 b(VM)62 b(compiler)h(framew)l(ork)f(exploits)f
+ (the)i(co)t(de)g(repre-)-303 4744 y(sen)l(tation)55 b(to)i(pro)l(vide)g
+ (a)g(com)l(bination)f(of)g(\014v)l(e)i(capabilities)d(that)-303
+ 4919 y(w)l(e)j(b)t(eliev)l(e)h(are)g(imp)t(ortan)l(t)f(in)g(order)h(to)
+ f(supp)t(ort)h(lifelong)f(anal-)-303 5093 y(ysis)50 b(and)j
+ (transformation)d(for)i(arbitrary)g(programs.)69 b(In)53
+ b(general,)-303 5267 y(these)36 b(capabilities)f(are)h(quite)g
+ (di\016cult)g(to)g(obtain)f(sim)l(ultaneously)-13 b(,)-303
+ 5442 y(but)51 b(the)h(LL)-17 b(VM)51 b(design)g(do)t(es)h(so)e(inheren)
+ l(tly:)-201 5762 y(\(1\))74 b Fh(Persistent)38 b(pr)-8
+ b(o)g(gr)g(am)40 b(information)12 b Fi(:)62 b(The)34
+ b(compilation)f(mo)t(del)70 5937 y(preserv)l(es)47 b(the)g(LL)-17
+ b(VM)46 b(represen)l(tation)h(throughout)g(an)f(ap-)70
+ 6111 y(plication's)80 b(lifetime,)87 b(allo)l(wing)80
+ b(sophisticated)g(optimiza-)70 6285 y(tions)52 b(to)h(b)t(e)h(p)t
+ (erformed)g(at)f(all)f(stages,)g(including)i(run)l(time)70
+ 6460 y(and)e(idle)f(time)g(b)t(et)l(w)l(een)h(runs.)-201
+ 6720 y(\(2\))74 b Fh(O\017ine)68 b(c)-8 b(o)g(de)69 b(gener)-8
+ b(ation)12 b Fi(:)97 b(Despite)66 b(the)g(last)e(p)t(oin)l(t,)69
+ b(it)c(is)70 6894 y(p)t(ossible)53 b(to)f(compile)h(programs)f(in)l(to)
+ g(e\016cien)l(t)h(nativ)l(e)g(ma-)70 7069 y(c)l(hine)84
+ b(co)t(de)g Fh(o\017ine)p Fi(,)91 b(using)83 b(exp)t(ensiv)l(e)h(co)t
+ (de)g(generation)70 7243 y(tec)l(hniques)70 b(not)e(suitable)h(for)f
+ (run)l(time)h(co)t(de)h(generation.)70 7417 y(This)51
+ b(is)f(crucial)i(for)f(p)t(erformance-critical)h(programs.)-201
+ 7678 y(\(3\))74 b Fh(User-b)-8 b(ase)g(d)94 b(pr)-8 b(o\014ling)95
+ b(and)h(optimization)12 b Fi(:)156 b(The)95 b(LL)-17
+ b(VM)70 7852 y(framew)l(ork)39 b(gathers)f(pro\014ling)h(information)f
+ (at)g(run-time)h Fh(in)70 8026 y(the)46 b(\014eld)41
+ b Fi(so)g(that)g(it)f(is)h(represen)l(tativ)l(e)g(of)g(actual)g(users,)
+ h(and)70 8201 y(can)i(apply)g(it)f(for)h(pro\014le-guided)h
+ (transformations)d(b)t(oth)i(at)70 8375 y(run-time)52
+ b(and)g(in)f(idle)g(time)1769 8311 y Ff(1)1838 8375 y
+ Fi(.)-201 8635 y(\(4\))74 b Fh(T)-12 b(r)k(ansp)g(ar)g(ent)93
+ b(runtime)f(mo)-8 b(del)15 b Fi(:)150 b(The)92 b(system)e(do)t(es)i
+ (not)70 8809 y(sp)t(ecify)49 b(an)l(y)f(particular)g(ob)9
+ b(ject)48 b(mo)t(del,)h(exception)f(seman-)70 8984 y(tics,)69
+ b(or)c(run)l(time)h(en)l(vironmen)l(t,)k(th)l(us)c(allo)l(wing)e(an)l
+ (y)i(lan-)70 9158 y(guage)j(\(or)g(com)l(bination)f(of)h(languages\))f
+ (to)g(b)t(e)i(compiled)70 9333 y(using)51 b(it.)-201
+ 9593 y(\(5\))74 b Fh(Uniform,)44 b(whole-pr)-8 b(o)g(gr)g(am)40
+ b(c)-8 b(ompilation)12 b Fi(:)62 b(Language-indep-)70
+ 9767 y(endence)54 b(mak)l(es)d(it)g(p)t(ossible)g(to)g(optimize)h(and)g
+ (compile)g(all)70 9941 y(co)t(de)65 b(comprising)d(an)i(application)f
+ (in)g(a)g(uniform)h(manner)70 10116 y(\(after)56 b(linking\),)g
+ (including)h(language-sp)t(eci\014c)g(run)l(time)f(li-)70
+ 10290 y(braries)51 b(and)h(system)e(libraries.)p -303
+ 10435 1594 7 v -295 10542 a Ff(1)-227 10606 y Fi(An)68
+ b(idle-time)g(optimizer)f(has)h(not)f(y)l(et)g(b)t(een)i(implemen)l
+ (ted)g(in)-303 10755 y(LL)-17 b(VM.)4230 -137 y(W)k(e)73
+ b(b)t(eliev)l(e)g(that)f Fh(no)j(pr)-8 b(evious)75 b(system)f(pr)-8
+ b(ovides)75 b(al)8 b(l)75 b(\014ve)f(of)4080 37 y(these)48
+ b(pr)-8 b(op)g(erties)p Fi(.)66 b(Source-lev)l(el)45
+ b(compilers)f(pro)l(vide)h(#2)f(and)h(#4,)4080 211 y(but)67
+ b(do)f(not)f(attempt)h(to)f(pro)l(vide)i(#1,)i(#3)d(or)f(#5.)112
+ b(Link-time)4080 386 y(in)l(terpro)t(cedural)58 b(optimizers)d([21,)i
+ (5,)g(26],)g(common)f(in)h(commer-)4080 560 y(cial)g(compilers,)i(pro)l
+ (vide)f(the)g(additional)f(capabilit)l(y)g(of)g(#1)h(and)4080
+ 734 y(#5)h(but)g(only)g(up)g(to)g(link-time.)91 b(Pro\014le-guided)59
+ b(optimizers)f(for)4080 909 y(static)74 b(languages)h(pro)l(vide)h(b)t
+ (ene\014t)h(#2)e(at)g(the)h(cost)e(of)i(trans-)4080 1083
+ y(parency)-13 b(,)61 b(and)d(most)e(crucially)i(do)g(not)f(pro)l(vide)h
+ (#3.)87 b(High-lev)l(el)4080 1257 y(virtual)53 b(mac)l(hines)h(suc)l(h)
+ g(as)f(JVM)h(or)g(CLI)g(pro)l(vide)g(#3)g(and)g(par-)4080
+ 1432 y(tially)62 b(pro)l(vide)i(#1)g(and)g(#5,)i(but)e(do)g(not)g(aim)f
+ (to)g(pro)l(vide)h(#4,)4080 1606 y(and)d(either)g(do)f(not)g(pro)l
+ (vide)h(#2)f(at)g(all)f(or)i(without)e(#1)i(or)f(#3.)4080
+ 1780 y(Binary)j(run)l(time)h(optimization)e(systems)g(pro)l(vide)i(#2,)
+ i(#4)d(and)4080 1955 y(#5,)44 b(but)f(pro)l(vide)f(#3)h(only)f(at)g
+ (run)l(time)g(and)h(to)f(a)h(limited)e(exten)l(t,)4080
+ 2129 y(and)48 b(most)f(imp)t(ortan)l(tly)g(do)h(not)g(pro)l(vide)g(#1.)
+ 67 b(W)-13 b(e)48 b(explain)g(these)4080 2304 y(in)j(more)h(detail)e
+ (in)i(Section)f(3.)4230 2478 y(W)-13 b(e)37 b(ev)-9 b(aluate)38
+ b(the)g(e\013ectiv)l(eness)g(of)f(the)h(LL)-17 b(VM)37
+ b(system)g(with)g(re-)4080 2652 y(sp)t(ect)g(to)f(three)h(issues:)59
+ b(\(a\))36 b(the)h(size)f(and)h(e\013ectiv)l(eness)f(of)g(the)g(rep-)
+ 4080 2827 y(resen)l(tation,)i(including)f(the)f(abilit)l(y)f(to)h
+ (extract)g(useful)g(t)l(yp)t(e)g(infor-)4080 3001 y(mation)56
+ b(for)g(C)g(programs;)i(\(b\))f(the)f(compiler)h(p)t(erformance)h
+ (\(not)4080 3175 y(the)71 b(p)t(erformance)g(of)f(generated)h(co)t(de)g
+ (whic)l(h)g(dep)t(ends)h(on)e(the)4080 3350 y(particular)60
+ b(co)t(de)i(generator)e(or)h(optimization)e(sequences)i(used\);)4080
+ 3524 y(and)39 b(\(c\))f(examples)h(illustrating)e(the)h(k)l(ey)h
+ (capabilities)f(LL)-17 b(VM)38 b(pro-)4080 3698 y(vides)51
+ b(for)g(sev)l(eral)g(c)l(hallenging)g(compiler)g(problems.)4230
+ 3873 y(Our)63 b(exp)t(erimen)l(tal)h(results)e(sho)l(w)g(that)g(the)i
+ (LL)-17 b(VM)62 b(compiler)4080 4047 y(can)53 b(extract)e(reliable)h(t)
+ l(yp)t(e)h(information)e(for)g(an)h(a)l(v)l(erage)g(of)g(68\045)4080
+ 4221 y(of)64 b(the)h(static)d(memory)j(access)f(instructions)f(across)g
+ (a)h(range)h(of)4080 4396 y(SPECINT)51 b(2000)g(C)h(b)t(enc)l(hmarks,)g
+ (and)g(for)f(virtually)g(all)f(the)i(ac-)4080 4570 y(cesses)h(in)h
+ (more)g(disciplined)g(programs.)74 b(W)-13 b(e)54 b(also)f(discuss)g
+ (based)4080 4744 y(on)74 b(our)g(exp)t(erience)j(ho)l(w)c(the)i(t)l(yp)
+ t(e)f(information)f(captured)i(b)l(y)4080 4919 y(LL)-17
+ b(VM)62 b(is)e(enough)j(to)e(safely)g(p)t(erform)h(a)g(n)l(um)l(b)t(er)
+ g(of)g(aggressiv)l(e)4080 5093 y(transformations)46 b(that)g(w)l(ould)h
+ (traditionally)f(b)t(e)i(attempted)f(only)4080 5267 y(on)56
+ b(t)l(yp)t(e-safe)g(languages)f(in)h(source-lev)l(el)g(compilers.)82
+ b(Co)t(de)56 b(size)4080 5442 y(measuremen)l(ts)i(sho)l(w)f(that)g(the)
+ i(LL)-17 b(VM)57 b(represen)l(tation)h(is)f(com-)4080
+ 5616 y(parable)g(in)f(size)g(to)g(X86)g(mac)l(hine)g(co)t(de)h(\(a)f
+ (CISC)h(arc)l(hitecture\))4080 5790 y(and)65 b(roughly)g(25\045)f
+ (smaller)g(than)h(RISC)g(co)t(de)g(on)g(a)l(v)l(erage,)i(de-)4080
+ 5965 y(spite)57 b(capturing)h(m)l(uc)l(h)g(ric)l(her)g(t)l(yp)t(e)f
+ (information)g(as)g(w)l(ell)f(as)h(an)4080 6139 y(in\014nite)c
+ (register)g(set)g(in)f(SSA)i(form.)73 b(Finally)-13 b(,)53
+ b(w)l(e)g(presen)l(t)g(exam-)4080 6313 y(ple)44 b(timings)e(sho)l(wing)
+ g(that)h(the)g(LL)-17 b(VM)43 b(represen)l(tation)g(supp)t(orts)4080
+ 6488 y(extremely)52 b(fast)e(in)l(terpro)t(cedural)i(optimizations.)
+ 4230 6662 y(Our)76 b(implemen)l(tation)g(of)g(LL)-17
+ b(VM)75 b(to)h(date)g(supp)t(orts)g(C)g(and)4080 6837
+ y(C++,)f(whic)l(h)c(are)f(traditionally)e(compiled)j(en)l(tirely)e
+ (statically)-13 b(.)4080 7011 y(W)g(e)45 b(are)g(curren)l(tly)g
+ (exploring)g(whether)g(LL)-17 b(VM)45 b(can)g(b)t(e)g(b)t(ene\014cial)
+ 4080 7185 y(for)52 b(implemen)l(ting)h(dynamic)g(run)l(times)f(suc)l(h)
+ g(as)g(JVM)g(and)h(CLI.)4080 7360 y(LL)-17 b(VM)51 b(is)g(freely)g(a)l
+ (v)-9 b(ailable)51 b(under)h(a)f(non-restrictiv)l(e)g(license)7783
+ 7296 y Ff(2)7853 7360 y Fi(.)4230 7534 y(The)60 b(rest)f(of)h(this)e
+ (pap)t(er)j(is)e(organized)h(as)f(follo)l(ws.)91 b(Section)60
+ b(2)4080 7708 y(describ)t(es)74 b(the)g(LL)-17 b(VM)74
+ b(co)t(de)g(represen)l(tation.)135 b(Section)74 b(3)g(then)4080
+ 7883 y(describ)t(es)47 b(the)f(design)g(of)g(the)g(LL)-17
+ b(VM)46 b(compiler)g(framew)l(ork.)66 b(Sec-)4080 8057
+ y(tion)57 b(4)g(discusses)g(our)h(ev)-9 b(aluation)57
+ b(of)g(the)h(LL)-17 b(VM)57 b(system)g(as)f(de-)4080
+ 8231 y(scrib)t(ed)e(ab)t(o)l(v)l(e.)72 b(Section)53 b(5)f(compares)h
+ (LL)-17 b(VM)52 b(with)h(related)f(pre-)4080 8406 y(vious)57
+ b(systems.)83 b(Section)58 b(6)e(concludes)i(with)f(a)g(summary)f(of)h
+ (the)4080 8580 y(pap)t(er.)4080 9018 y Fj(2.)199 b(PR)-6
+ b(OGRAM)49 b(REPRESENT)-18 b(A)f(TION)4230 9233 y Fi(The)46
+ b(co)t(de)h(represen)l(tation)g(is)e(one)i(of)e(the)i(k)l(ey)f(factors)
+ f(that)h(dif-)4080 9408 y(feren)l(tiates)c(LL)-17 b(VM)42
+ b(from)f(other)i(systems.)63 b(The)43 b(represen)l(tation)f(is)4080
+ 9582 y(designed)59 b(to)e(pro)l(vide)h(high-lev)l(el)g(information)f
+ (ab)t(out)h(programs)4080 9756 y(that)52 b(is)g(needed)i(to)e(supp)t
+ (ort)h(sophisticated)f(analyses)g(and)h(trans-)4080 9931
+ y(formations,)79 b(while)74 b(b)t(eing)h(lo)l(w-lev)l(el)e(enough)i(to)
+ f(represen)l(t)h(ar-)4080 10105 y(bitrary)68 b(programs)g(and)h(to)f(p)
+ t(ermit)h(extensiv)l(e)f(optimization)f(in)4080 10280
+ y(static)34 b(compilers.)62 b(This)35 b(section)g(giv)l(es)g(an)g(o)l
+ (v)l(erview)g(of)g(the)g(LL)-17 b(VM)4080 10454 y(instruction)42
+ b(set)f(and)i(describ)t(es)f(the)h(language-indep)t(enden)l(t)h(t)l(yp)
+ t(e)p 4080 10584 V 4088 10692 a Ff(2)4157 10755 y Fi(See)52
+ b(the)g(LL)-17 b(VM)51 b(home-page:)69 b Fk(http://llvm.cs.uiuc.ed)q
+ (u/)p Fi(.)p eop end
+ %%Page: 3 3
+ TeXDict begin 3 2 bop -303 -137 a Fi(system,)38 b(the)e(memory)g(mo)t
+ (del,)j(exception)e(handling)f(mec)l(hanisms,)-303 37
+ y(and)k(the)g(o\017ine)g(and)h(in-memory)f(represen)l(tations.)64
+ b(The)41 b(detailed)-303 211 y(syn)l(tax)36 b(and)i(seman)l(tics)f(of)g
+ (the)g(represen)l(tation)h(are)g(de\014ned)h(in)e(the)-303
+ 386 y(LL)-17 b(VM)51 b(reference)i(man)l(ual)e([29].)-303
+ 693 y Fj(2.1)198 b(Ov)n(er)n(view)51 b(of)f(the)g(LL)-18
+ b(VM)49 b(Instruction)h(Set)-154 909 y Fi(The)h(LL)-17
+ b(VM)50 b(instruction)f(set)h(captures)g(the)h(k)l(ey)f(op)t(erations)g
+ (of)-303 1083 y(ordinary)55 b(pro)t(cessors)f(but)h(a)l(v)l(oids)f(mac)
+ l(hine-sp)t(eci\014c)i(constrain)l(ts)-303 1258 y(suc)l(h)74
+ b(as)f(ph)l(ysical)g(registers,)78 b(pip)t(elines,)i(and)74
+ b(lo)l(w-lev)l(el)f(calling)-303 1432 y(con)l(v)l(en)l(tions.)66
+ b(LL)-17 b(VM)48 b(pro)l(vides)h(an)f(in\014nite)h(set)f(of)g(t)l(yp)t
+ (ed)h(virtual)-303 1607 y(registers)h(whic)l(h)i(can)g(hold)g(v)-9
+ b(alues)51 b(of)h Fh(primitive)j(typ)-8 b(es)52 b Fi(\(Bo)t(olean,)-303
+ 1781 y(in)l(teger,)66 b(\015oating)d(p)t(oin)l(t,)j(and)d(p)t(oin)l
+ (ter\).)105 b(The)64 b(virtual)f(registers)-303 1955
+ y(are)73 b(in)h(Static)f(Single)h(Assignmen)l(t)f(\(SSA\))g(form)h
+ ([15].)134 b(LL)-17 b(VM)-303 2130 y(is)68 b(a)i(load/store)e(arc)l
+ (hitecture:)105 b(programs)69 b(transfer)h(v)-9 b(alues)70
+ b(b)t(e-)-303 2304 y(t)l(w)l(een)57 b(registers)f(and)i(memory)f
+ (solely)g(via)f Fk(load)j Fi(and)f Fk(store)h Fi(op-)-303
+ 2478 y(erations)46 b(using)h(t)l(yp)t(ed)h(p)t(oin)l(ters.)66
+ b(The)48 b(LL)-17 b(VM)47 b(memory)g(mo)t(del)g(is)-303
+ 2653 y(describ)t(ed)52 b(in)f(Section)h(2.3.)-154 2827
+ y(The)62 b(en)l(tire)g(LL)-17 b(VM)61 b(instruction)g(set)g(consists)g
+ (of)g(only)g(31)g(op-)-303 3001 y(co)t(des.)71 b(This)52
+ b(is)f(p)t(ossible)h(b)t(ecause,)h(\014rst,)e(w)l(e)i(a)l(v)l(oid)e(m)l
+ (ultiple)g(op-)-303 3176 y(co)t(des)67 b(for)g(the)g(same)f(op)t
+ (erations)1755 3112 y Ff(3)1824 3176 y Fi(.)115 b(Second,)72
+ b(most)66 b(op)t(co)t(des)i(in)-303 3350 y(LL)-17 b(VM)49
+ b(are)g(o)l(v)l(erloaded)g(\(for)g(example,)h(the)f Fk(add)i
+ Fi(instruction)d(can)-303 3524 y(op)t(erate)41 b(on)g(op)t(erands)h(of)
+ f(an)l(y)g(in)l(teger)f(or)h(\015oating)g(p)t(oin)l(t)f(op)t(erand)-303
+ 3699 y(t)l(yp)t(e\).)81 b(Most)54 b(instructions,)h(including)h(all)f
+ (arithmetic)g(and)h(logi-)-303 3873 y(cal)g(op)t(erations,)i(are)f(in)g
+ (three-address)h(form:)79 b(they)58 b(tak)l(e)e(one)i(or)-303
+ 4047 y(t)l(w)l(o)50 b(op)t(erands)i(and)f(pro)t(duce)i(a)e(single)g
+ (result.)-154 4222 y(LL)-17 b(VM)50 b(uses)g(SSA)g(form)g(as)f(its)g
+ (primary)h(co)t(de)h(represen)l(tation,)-303 4396 y(i.e.,)64
+ b(eac)l(h)f(virtual)f(register)h(is)f(written)g(in)h(exactly)f(one)i
+ (instruc-)-303 4570 y(tion,)39 b(and)f(eac)l(h)g(use)f(of)g(a)g
+ (register)g(is)g(dominated)h(b)l(y)f(its)g(de\014nition.)-303
+ 4745 y(Memory)66 b(lo)t(cations)g(in)g(LL)-17 b(VM)67
+ b(are)g Fh(not)81 b Fi(in)67 b(SSA)g(form)f(b)t(ecause)-303
+ 4919 y(man)l(y)d(p)t(ossible)f(lo)t(cations)g(ma)l(y)h(b)t(e)g(mo)t
+ (di\014ed)i(at)d(a)h(single)f(store)-303 5093 y(through)73
+ b(a)f(p)t(oin)l(ter,)78 b(making)72 b(it)g(di\016cult)h(to)f(construct)
+ h(a)f(rea-)-303 5268 y(sonably)50 b(compact,)i(explicit)f(SSA)h(co)t
+ (de)g(represen)l(tation)f(for)g(suc)l(h)-303 5442 y(lo)t(cations.)124
+ b(The)70 b(LL)-17 b(VM)70 b(instruction)g(set)g(includes)h(an)f
+ (explicit)-303 5616 y Fk(phi)51 b Fi(instruction,)f(whic)l(h)h(corresp)
+ t(onds)g(directly)f(to)g(the)h(standard)-303 5791 y(\(non-gated\))59
+ b Fe(\036)g Fi(function)h(of)e(SSA)i(form.)91 b(SSA)60
+ b(form)f(pro)l(vides)g(a)-303 5965 y(compact)h(def-use)i(graph)f(that)f
+ (simpli\014es)g(man)l(y)g(data\015o)l(w)g(opti-)-303
+ 6140 y(mizations)75 b(and)h(enables)h(fast,)k(\015o)l(w-insensitiv)l(e)
+ 75 b(algorithms)g(to)-303 6314 y(ac)l(hiev)l(e)80 b(man)l(y)h(of)f(the)
+ h(b)t(ene\014ts)h(of)e(\015o)l(w-sensitiv)l(e)f(algorithms)-303
+ 6488 y(without)53 b(exp)t(ensiv)l(e)h(data\015o)l(w)g(analysis.)73
+ b(Non-lo)t(op)54 b(transforma-)-303 6663 y(tions)71 b(in)h(SSA)h(form)f
+ (are)g(further)h(simpli\014ed)f(b)t(ecause)h(they)g(do)-303
+ 6837 y(not)41 b(encoun)l(ter)h(an)l(ti-)e(or)h(output)h(dep)t(endences)
+ i(on)d(SSA)h(registers.)-303 7011 y(Non-memory)47 b(transformations)e
+ (are)i(also)f(greatly)g(simpli\014ed)h(b)t(e-)-303 7186
+ y(cause)k(\(unrelated)h(to)f(SSA\))g(registers)g(cannot)g(ha)l(v)l(e)g
+ (aliases.)-154 7360 y(LL)-17 b(VM)37 b(also)g(mak)l(es)f(the)i(Con)l
+ (trol)f(Flo)l(w)f(Graph)i(\(CF)l(G\))e(of)h(ev)l(ery)-303
+ 7534 y(function)60 b(explicit)f(in)h(the)g(represen)l(tation.)94
+ b(A)60 b(function)g(is)f(a)h(set)-303 7709 y(of)47 b(basic)g(blo)t(c)l
+ (ks,)g(and)h(eac)l(h)f(basic)g(blo)t(c)l(k)h(is)e(a)h(sequence)i(of)e
+ (LL)-17 b(VM)-303 7883 y(instructions,)74 b(ending)e(in)f(exactly)g
+ (one)h(terminator)e(instruction)-303 8057 y(\(branc)l(hes,)83
+ b(return,)h Fk(unwind)p Fi(,)i(or)76 b Fk(invoke)p Fi(;)92
+ b(the)78 b(latter)e(t)l(w)l(o)g(are)-303 8232 y(explained)55
+ b(later)f(b)t(elo)l(w\).)77 b(Eac)l(h)54 b(terminator)f(explicitly)h
+ (sp)t(eci\014es)-303 8406 y(its)c(successor)h(basic)g(blo)t(c)l(ks.)
+ -303 8714 y Fj(2.2)198 b(Language\255independent)37 b(T)-15
+ b(ype)37 b(Inf)-5 b(ormation,)145 8907 y(Cast,)49 b(and)g
+ (GetElementPtr)-154 9122 y Fi(One)41 b(of)e(the)g(fundamen)l(tal)h
+ (design)f(features)h(of)f(LL)-17 b(VM)39 b(is)g(the)h(in-)-303
+ 9297 y(clusion)52 b(of)h(a)g(language-indep)t(enden)l(t)i(t)l(yp)t(e)f
+ (system.)72 b(Ev)l(ery)53 b(SSA)-303 9471 y(register)48
+ b(and)i(explicit)e(memory)i(ob)9 b(ject)49 b(has)f(an)h(asso)t(ciated)g
+ (t)l(yp)t(e,)-303 9645 y(and)41 b(all)g(op)t(erations)g(ob)t(ey)h
+ (strict)f(t)l(yp)t(e)h(rules.)64 b(This)41 b(t)l(yp)t(e)h(informa-)-303
+ 9820 y(tion)62 b(is)g(used)h(in)g(conjunction)g(with)g(the)g
+ (instruction)f(op)t(co)t(de)i(to)-303 9994 y(determine)55
+ b(the)f(exact)g(seman)l(tics)f(of)g(an)h(instruction)f(\(e.g.)76
+ b(\015oat-)-303 10168 y(ing)51 b(p)t(oin)l(t)g(vs.)69
+ b(in)l(teger)52 b(add\).)69 b(This)51 b(t)l(yp)t(e)h(information)f
+ (enables)h(a)-303 10343 y(broad)66 b(class)f(of)h Fh(high-level)f
+ Fi(transformations)g(on)h Fh(low-level)g Fi(co)t(de)p
+ -303 10435 1594 7 v -295 10542 a Ff(3)-227 10606 y Fi(F)-13
+ b(or)64 b(example,)j(there)d(are)g(no)f(unary)h(op)t(erators:)93
+ b Fk(not)64 b Fi(and)g Fk(neg)-303 10755 y Fi(are)51
+ b(implemen)l(ted)h(in)f(terms)g(of)g Fk(xor)i Fi(and)e
+ Fk(sub)p Fi(,)h(resp)t(ectiv)l(ely)-13 b(.)4080 -137
+ y(\(for)80 b(example,)88 b(see)80 b(Section)h(4.1.1\).)153
+ b(In)81 b(addition,)87 b(t)l(yp)t(e)81 b(mis-)4080 37
+ y(matc)l(hes)51 b(are)h(useful)f(for)g(detecting)h(optimizer)f(bugs.)
+ 4230 211 y(The)64 b(LL)-17 b(VM)64 b(t)l(yp)t(e)h(system)e(includes)i
+ (source-language-indep-)4080 386 y(enden)l(t)81 b(primitiv)l(e)f(t)l
+ (yp)t(es)g(with)g(prede\014ned)j(sizes)c(\(v)l(oid,)86
+ b(b)t(o)t(ol,)4080 560 y(signed/unsigned)55 b(in)l(tegers)f(from)g(8)g
+ (to)g(64)g(bits,)g(and)h(single-)f(and)4080 734 y(double-precision)h
+ (\015oating-p)t(oin)l(t)e(t)l(yp)t(es\).)75 b(This)54
+ b(mak)l(es)f(it)g(p)t(ossi-)4080 909 y(ble)66 b(to)e(write)h(p)t
+ (ortable)h(co)t(de)g(using)e(these)i(t)l(yp)t(es,)i(though)e(non-)4080
+ 1083 y(p)t(ortable)50 b(co)t(de)g(can)f(b)t(e)h(expressed)g(directly)f
+ (as)g(w)l(ell.)66 b(LL)-17 b(VM)49 b(also)4080 1257 y(includes)63
+ b(\(only\))e(four)h(deriv)l(ed)h(t)l(yp)t(es:)89 b(p)t(oin)l(ters,)65
+ b(arra)l(ys,)e(struc-)4080 1432 y(tures,)h(and)e(functions.)100
+ b(W)-13 b(e)62 b(b)t(eliev)l(e)g(that)g(most)e(high-lev)l(el)i(lan-)
+ 4080 1606 y(guage)36 b(data)f(t)l(yp)t(es)h(are)g(ev)l(en)l(tually)f
+ (represen)l(ted)i(using)f(some)f(com-)4080 1780 y(bination)71
+ b(of)g(these)g(four)g(t)l(yp)t(es)h(in)f(terms)g(of)f(their)i(op)t
+ (erational)4080 1955 y(b)t(eha)l(vior.)114 b(F)-13 b(or)66
+ b(example,)k(C++)d(classes)e(with)h(inheritance)h(are)4080
+ 2129 y(implemen)l(ted)42 b(using)f(structures,)i(functions,)g(and)f
+ (arra)l(ys)e(of)h(func-)4080 2304 y(tion)51 b(p)t(oin)l(ters,)g(as)f
+ (describ)t(ed)j(in)e(Section)h(4.1.2.)4230 2478 y(Equally)j(imp)t
+ (ortan)l(t,)h(the)g(four)g(deriv)l(ed)h(t)l(yp)t(es)f(ab)t(o)l(v)l(e)f
+ (capture)4080 2652 y(the)61 b(t)l(yp)t(e)g(information)f(used)h(ev)l
+ (en)g(b)l(y)g(sophisticated)e(language-)4080 2827 y(indep)t(enden)l(t)
+ 43 b(analyses)c(and)i(optimizations.)62 b(F)-13 b(or)41
+ b(example,)h(\014eld-)4080 3001 y(sensitiv)l(e)77 b(p)t(oin)l(ts-to)h
+ (analyses)f([25,)84 b(31],)g(call)78 b(graph)h(construc-)4080
+ 3175 y(tion)87 b(\(including)g(for)g(ob)9 b(ject-orien)l(ted)88
+ b(languages)e(lik)l(e)h(C++\),)4080 3350 y(scalar)53
+ b(promotion)g(of)g(aggregates,)f(and)i(structure)g(\014eld)g(reorder-)
+ 4080 3524 y(ing)44 b(transformations)e([12],)j(only)f(use)g(p)t(oin)l
+ (ters,)h(structures,)g(func-)4080 3698 y(tions,)89 b(and)84
+ b(primitiv)l(e)e(data)g(t)l(yp)t(es,)90 b(while)83 b(arra)l(y)f(dep)t
+ (endence)4080 3873 y(analysis)63 b(and)j(lo)t(op)e(transformations)f
+ (use)i(all)f(those)g(plus)h(arra)l(y)4080 4047 y(t)l(yp)t(es.)4230
+ 4221 y(Because)38 b(LL)-17 b(VM)37 b(is)g(language)g(indep)t(enden)l(t)
+ j(and)e(m)l(ust)f(supp)t(ort)4080 4396 y(w)l(eakly-t)l(yp)t(ed)j
+ (languages,)g Fh(de)-8 b(clar)g(e)g(d)55 b Fi(t)l(yp)t(e)39
+ b(information)f(in)h(a)g(legal)4080 4570 y(LL)-17 b(VM)54
+ b(program)g(ma)l(y)f(not)h(b)t(e)g(reliable.)76 b(Instead,)55
+ b(some)e(p)t(oin)l(ter)4080 4744 y(analysis)e(algorithm)h(m)l(ust)g(b)t
+ (e)h(used)g(to)g(distinguish)e(memory)i(ac-)4080 4919
+ y(cesses)70 b(for)f(whic)l(h)i(the)f(t)l(yp)t(e)g(of)g(the)g(p)t(oin)l
+ (ter)g(target)g(is)f(reliably)4080 5093 y(kno)l(wn)56
+ b(from)f(those)g(for)h(whic)l(h)f(it)g(is)g(not.)81 b(LL)-17
+ b(VM)55 b(includes)h(suc)l(h)4080 5267 y(an)40 b(analysis)e(describ)t
+ (ed)j(in)f(Section)g(4.1.1.)63 b(Our)41 b(results)e(sho)l(w)g(that)4080
+ 5442 y(despite)48 b(allo)l(wing)e(v)-9 b(alues)47 b(to)g(b)t(e)h
+ (arbitrarily)e(cast)h(to)g(other)h(t)l(yp)t(es,)4080
+ 5616 y(reliable)57 b(t)l(yp)t(e)h(information)e(is)g(a)l(v)-9
+ b(ailable)56 b(for)h(a)g(large)g(fraction)g(of)4080 5790
+ y(memory)52 b(accesses)f(in)g(C)g(programs)f(compiled)i(to)f(LL)-17
+ b(VM.)4230 5965 y(The)44 b(LL)-17 b(VM)44 b(`)p Fk(cast)p
+ Fi(')h(instruction)e(is)g(used)h(to)g(con)l(v)l(ert)f(a)h(v)-9
+ b(alue)45 b(of)4080 6139 y(one)57 b(t)l(yp)t(e)f(to)g(another)h
+ (arbitrary)e(t)l(yp)t(e,)j(and)f(is)e(the)h Fh(only)71
+ b Fi(w)l(a)l(y)56 b(to)4080 6313 y(p)t(erform)51 b(suc)l(h)f(con)l(v)l
+ (ersions.)66 b(Casts)49 b(th)l(us)g(mak)l(e)h(all)f(t)l(yp)t(e)h(con)l
+ (v)l(er-)4080 6488 y(sions)k(explicit,)h(including)h(t)l(yp)t(e)f(co)t
+ (ercion)h(\(there)f(are)h(no)f(mixed-)4080 6662 y(t)l(yp)t(e)65
+ b(op)t(erations)e(in)h(LL)-17 b(VM\),)63 b(explicit)h(casts)f(for)g(ph)
+ l(ysical)h(sub-)4080 6837 y(t)l(yping,)h(and)e(rein)l(terpreting)h
+ (casts)d(for)i(non-t)l(yp)t(e-safe)h(co)t(de.)103 b(A)4080
+ 7011 y(program)62 b(without)f Fk(cast)p Fi(s)j(is)d(necessarily)h(t)l
+ (yp)t(e-safe)g(\(in)g(the)g(ab-)4080 7185 y(sence)52
+ b(of)f(memory)h(access)f(errors,)f(e.g.,)h(arra)l(y)f(o)l(v)l(er\015o)l
+ (w)h([19]\).)4230 7360 y(A)85 b(critical)f(di\016cult)l(y)h(in)f
+ (preserving)i(t)l(yp)t(e)f(information)f(for)4080 7534
+ y(lo)l(w-lev)l(el)h(co)t(de)h(is)f(implemen)l(ting)g(address)h
+ (arithmetic.)170 b(The)4080 7708 y Fk(getelementptr)60
+ b Fi(instruction)54 b(is)g(used)h(b)l(y)f(the)h(LL)-17
+ b(VM)54 b(system)g(to)4080 7883 y(p)t(erform)37 b(p)t(oin)l(ter)f
+ (arithmetic)g(in)g(a)g(w)l(a)l(y)f(that)h(b)t(oth)g(preserv)l(es)h(t)l
+ (yp)t(e)4080 8057 y(information)k(and)h(has)f(mac)l(hine-indep)t(enden)
+ l(t)j(seman)l(tics.)64 b(Giv)l(en)4080 8231 y(a)43 b(t)l(yp)t(ed)h(p)t
+ (oin)l(ter)f(to)g(an)g(ob)9 b(ject)43 b(of)g(some)f(aggregate)h(t)l(yp)
+ t(e,)i(this)d(in-)4080 8406 y(struction)53 b(calculates)f(the)h
+ (address)g(of)g(a)g(sub-elemen)l(t)h(of)f(the)g(ob-)4080
+ 8580 y(ject)i(in)f(a)g(t)l(yp)t(e-preserving)h(manner)g(\(e\013ectiv)l
+ (ely)e(a)h(com)l(bined)h(`.')4080 8754 y(and)48 b(`[)f(]')g(op)t
+ (erator)h(for)g(LL)-17 b(VM\).)47 b(F)-13 b(or)48 b(example,)g(the)g(C)
+ g(statemen)l(t)4080 8929 y(\\)p Fk(X[i].a)81 b(=)e(1;)p
+ Fi(")65 b(could)60 b(b)t(e)h(translated)f(in)l(to)f(the)h(pair)g(of)f
+ (LL)-17 b(VM)4080 9103 y(instructions:)4316 9277 y Fk(\045p)79
+ b(=)g(getelementptr)84 b(\045xty*)d(\045X,)f(long)g(\045i,)g(ubyte)h
+ (3;)4316 9452 y(store)f(int)g(1,)f(int*)i(\045p;)4080
+ 9626 y Fi(where)65 b(w)l(e)f(assume)f Fe(a)i Fi(is)e(\014eld)h(n)l(um)l
+ (b)t(er)h(3)f(within)g(the)g(structure)4080 9800 y Fk(X[i])p
+ Fi(,)52 b(and)f(the)f(structure)h(is)e(of)h(t)l(yp)t(e)h
+ Fk(\045xty)p Fi(.)69 b(Making)50 b(all)f(address)4080
+ 9975 y(arithmetic)57 b(explicit)g(is)f(imp)t(ortan)l(t)h(so)f(that)h
+ (it)g(is)f(exp)t(osed)i(to)f(all)4080 10149 y(LL)-17
+ b(VM)65 b(optimizations)f(\(most)f(imp)t(ortan)l(tly)-13
+ b(,)68 b(reasso)t(ciation)c(and)4080 10323 y(redundancy)59
+ b(elimination\);)d(getelemen)l(tptr)h(ac)l(hiev)l(es)f(this)f(with-)
+ 4080 10498 y(out)43 b(obscuring)h(the)g(t)l(yp)t(e)g(information.)64
+ b(Load)43 b(and)h(store)f(instruc-)4080 10672 y(tions)g(tak)l(e)g(a)h
+ (single)f(p)t(oin)l(ter)h(and)g(do)g(not)f(p)t(erform)i(an)l(y)e
+ (indexing,)p eop end
+ %%Page: 4 4
+ TeXDict begin 4 3 bop -303 -137 a Fi(whic)l(h)51 b(mak)l(es)g(the)h
+ (pro)t(cessing)f(of)h(memory)f(accesses)g(simple)g(and)-303
+ 37 y(uniform.)-303 357 y Fj(2.3)198 b(Explicit)83 b(Memory)f
+ (Allocation)g(and)f(Uni\002ed)145 550 y(Memory)50 b(Model)-154
+ 766 y Fi(LL)-17 b(VM)43 b(pro)l(vides)h(instructions)e(for)h(t)l(yp)t
+ (ed)i(memory)e(allo)t(cation.)-303 940 y(The)68 b Fk(malloc)j
+ Fi(instruction)d(allo)t(cates)f(one)h(or)h(more)f(elemen)l(ts)g(of)-303
+ 1114 y(a)h(sp)t(eci\014c)i(t)l(yp)t(e)f(on)g(the)g(heap,)75
+ b(returning)70 b(a)g(t)l(yp)t(ed)g(p)t(oin)l(ter)g(to)-303
+ 1289 y(the)49 b(new)h(memory)-13 b(.)68 b(The)49 b Fk(free)i
+ Fi(instruction)e(releases)g(memory)g(al-)-303 1463 y(lo)t(cated)i
+ (through)g Fk(malloc)1278 1400 y Ff(4)1350 1463 y Fi(.)67
+ b(The)52 b Fk(alloca)h Fi(instruction)d(is)g(similar)-303
+ 1637 y(to)37 b Fk(malloc)k Fi(except)e(that)f(it)f(allo)t(cates)g
+ (memory)h(in)g(the)g(stac)l(k)g(frame)-303 1812 y(of)60
+ b(the)g(curren)l(t)h(function)g(instead)f(of)g(the)g(heap,)j(and)e(the)
+ f(mem-)-303 1986 y(ory)36 b(is)g(automatically)f(deallo)t(cated)h(on)h
+ (return)g(from)g(the)g(function.)-303 2160 y(All)e(stac)l(k-residen)l
+ (t)g(data)g(\(including)h(\\automatic")e(v)-9 b(ariables\))36
+ b(are)-303 2335 y(allo)t(cated)50 b(explicitly)h(using)g
+ Fk(alloca)p Fi(.)-154 2509 y(In)40 b(LL)-17 b(VM,)38
+ b(all)h(addressable)g(ob)9 b(jects)38 b(\(\\lv)-9 b(alues"\))38
+ b(are)h(explicitly)-303 2683 y(allo)t(cated.)79 b(Global)54
+ b(v)-9 b(ariable)56 b(and)f(function)h(de\014nitions)f(de\014ne)i(a)
+ -303 2858 y(sym)l(b)t(ol)68 b(whic)l(h)i(pro)l(vides)f(the)g(address)h
+ (of)e(the)i(ob)9 b(ject,)73 b(not)c(the)-303 3032 y(ob)9
+ b(ject)61 b(itself.)97 b(This)61 b(giv)l(es)g(a)g(uni\014ed)i(memory)e
+ (mo)t(del)h(in)f(whic)l(h)-303 3207 y(all)80 b(memory)i(op)t(erations,)
+ 88 b(including)82 b(call)f(instructions,)88 b(o)t(ccur)-303
+ 3381 y(through)64 b(t)l(yp)t(ed)h(p)t(oin)l(ters.)106
+ b(There)64 b(are)h(no)f(implicit)f(accesses)g(to)-303
+ 3555 y(memory)-13 b(,)64 b(simplifying)d(memory)h(access)g(analysis,)g
+ (and)h(the)f(rep-)-303 3730 y(resen)l(tation)50 b(needs)i(no)g
+ (\\address)f(of)12 b(")50 b(op)t(erator.)-303 4050 y
+ Fj(2.4)198 b(Function)50 b(Calls)f(and)g(Exception)i(Handling)-154
+ 4265 y Fi(F)-13 b(or)75 b(ordinary)g(function)g(calls,)k(LL)-17
+ b(VM)74 b(pro)l(vides)h(a)f Fk(call)j Fi(in-)-303 4440
+ y(struction)42 b(that)h(tak)l(es)g(a)g(t)l(yp)t(ed)h(function)g(p)t
+ (oin)l(ter)g(\(whic)l(h)f(ma)l(y)g(b)t(e)-303 4614 y(a)58
+ b(function)h(name)f(or)h(an)f(actual)g(p)t(oin)l(ter)h(v)-9
+ b(alue\))58 b(and)h(t)l(yp)t(ed)g(ac-)-303 4789 y(tual)41
+ b(argumen)l(ts.)64 b(This)41 b(abstracts)g(a)l(w)l(a)l(y)f(the)i
+ (calling)f(con)l(v)l(en)l(tions)-303 4963 y(of)51 b(the)g(underlying)h
+ (mac)l(hine)g(and)f(simpli\014es)g(program)g(analysis.)-154
+ 5137 y(One)83 b(of)e(the)h(most)f(un)l(usual)g(features)h(of)f(LL)-17
+ b(VM)81 b(is)g(that)g(it)-303 5312 y(pro)l(vides)58 b(an)h(explicit,)h
+ (lo)l(w-lev)l(el,)f(mac)l(hine-indep)t(enden)l(t)j(mec)l(h-)-303
+ 5486 y(anism)72 b(to)h(implemen)l(t)g(exception)g(handling)h(in)f
+ (high-lev)l(el)g(lan-)-303 5660 y(guages.)80 b(In)56
+ b(fact,)g(the)g(same)g(mec)l(hanism)f(also)f(supp)t(orts)i
+ Fk(setjmp)-303 5835 y Fi(and)36 b Fk(longjmp)k Fi(op)t(erations)c(in)g
+ (C,)g(allo)l(wing)e(these)j(op)t(erations)f(to)g(b)t(e)-303
+ 6009 y(analyzed)45 b(and)g(optimized)f(in)h(the)f(same)g(w)l(a)l(y)g
+ (that)g(exception)h(fea-)-303 6183 y(tures)k(in)h(other)g(languages)f
+ (are.)67 b(The)51 b(common)e(exception)i(mec)l(h-)-303
+ 6358 y(anism)f(is)h(based)g(on)h(t)l(w)l(o)e(instructions,)g
+ Fk(invoke)j Fi(and)f Fk(unwind)p Fi(.)-154 6532 y(The)88
+ b Fk(invoke)i Fi(and)d Fk(unwind)j Fi(instructions)c(together)h(supp)t
+ (ort)-303 6706 y(an)81 b(abstract)f(exception)h(handling)g(mo)t(del)g
+ (logically)e(based)j(on)-303 6881 y(stac)l(k)67 b(un)l(winding)j
+ (\(though)e(LL)-17 b(VM-to-nativ)l(e)68 b(co)t(de)i(generators)-303
+ 7055 y(ma)l(y)92 b(use)h(either)g(\\zero)g(cost")f(table-driv)l(en)i
+ (metho)t(ds)f([9])f(or)-303 7229 y Fk(setjmp)p Fi(/)p
+ Fk(longjmp)62 b Fi(to)57 b(implemen)l(t)g(the)g(instructions\).)85
+ b Fk(invoke)59 b Fi(is)-303 7404 y(used)h(to)f(sp)t(ecify)g(exception)i
+ (handling)e(co)t(de)i(that)e(m)l(ust)f(b)t(e)j(exe-)-303
+ 7578 y(cuted)j(during)g(stac)l(k)e(un)l(winding)h(for)g(an)h
+ (exception.)105 b Fk(unwind)65 b Fi(is)-303 7752 y(used)f(to)f(thro)l
+ (w)g(an)h(exception)g(or)f(to)g(p)t(erform)i(a)e Fk(longjmp)p
+ Fi(.)108 b(W)-13 b(e)-303 7927 y(\014rst)63 b(describ)t(e)i(the)f(mec)l
+ (hanisms)g(and)g(then)h(describ)t(e)g(ho)l(w)e(they)-303
+ 8101 y(can)51 b(b)t(e)h(used)g(for)f(implemen)l(ting)g(exception)h
+ (handling.)-154 8275 y(The)g Fk(invoke)i Fi(instruction)d(w)l(orks)f
+ (just)h(lik)l(e)g(a)g Fk(call)p Fi(,)h(but)g(sp)t(eci-)-303
+ 8450 y(\014es)43 b(an)g(extra)g(basic)g(blo)t(c)l(k)g(that)g(indicates)
+ f(the)i(starting)e(blo)t(c)l(k)h(for)-303 8624 y(an)50
+ b(un)l(wind)h(handler.)68 b(When)51 b(the)g(program)f(executes)h(an)f
+ Fk(unwind)-303 8798 y Fi(instruction,)65 b(it)d(logically)g(un)l(winds)
+ h(the)h(stac)l(k)e(un)l(til)h(it)f(remo)l(v)l(es)-303
+ 8973 y(an)45 b(activ)-9 b(ation)44 b(record)i(created)g(b)l(y)f(an)g
+ Fk(invoke)p Fi(.)68 b(It)46 b(then)f(transfers)-303 9147
+ y(con)l(trol)36 b(to)g(the)h(basic)f(blo)t(c)l(k)g(sp)t(eci\014ed)i(b)l
+ (y)f(the)g Fk(invoke)p Fi(.)66 b(These)37 b(t)l(w)l(o)-303
+ 9322 y(instructions)69 b(exp)t(ose)i(exceptional)f(con)l(trol)g(\015o)l
+ (w)g(in)g(the)h(LL)-17 b(VM)-303 9496 y(CF)l(G.)-154
+ 9670 y(These)70 b(t)l(w)l(o)e(primitiv)l(es)g(can)i(b)t(e)g(used)g(to)f
+ (implemen)l(t)g(a)g(wide)-303 9845 y(v)-9 b(ariet)l(y)41
+ b(of)h(exception)h(handling)f(mec)l(hanisms.)64 b(T)-13
+ b(o)42 b(date,)i(w)l(e)e(ha)l(v)l(e)-303 10019 y(implemen)l(ted)52
+ b(full)f(supp)t(ort)g(for)g(C's)g Fk(setjmp)p Fi(/)p
+ Fk(longjmp)57 b Fi(calls)50 b(and)p -303 10136 1594 7
+ v -295 10243 a Ff(4)-227 10307 y Fi(When)i(nativ)l(e)f(co)t(de)i(is)d
+ (generated)i(for)f(a)g(program,)g Fk(malloc)j Fi(and)-303
+ 10456 y Fk(free)73 b Fi(instructions)d(are)h(con)l(v)l(erted)h(to)e
+ (the)i(appropriate)f(nativ)l(e)-303 10606 y(function)83
+ b(calls,)90 b(allo)l(wing)81 b(custom)i(memory)h(allo)t(cators)d(to)i
+ (b)t(e)-303 10755 y(used.)4080 -137 y(the)61 b(C++)g(exception)g(mo)t
+ (del;)k(in)60 b(fact,)i(b)t(oth)f(co)t(exist)f(cleanly)g(in)4080
+ 37 y(our)41 b(implemen)l(tation)f([13].)63 b(A)l(t)40
+ b(a)g(call)g(site,)h(if)f(some)g(co)t(de)i(m)l(ust)d(b)t(e)4080
+ 211 y(executed)j(when)g(an)e(exception)h(is)f(thro)l(wn)g(\(for)g
+ (example,)j Fk(setjmp)p Fi(,)4080 386 y(\\catc)l(h")51
+ b(blo)t(c)l(ks,)g(or)g(automatic)f(v)-9 b(ariable)52
+ b(destructors)f(in)g(C++\),)4080 560 y(the)73 b(co)t(de)h(uses)f(the)g
+ Fk(invoke)j Fi(instruction)c(for)h(the)g(call.)132 b(When)4080
+ 734 y(an)57 b(exception)h(is)d(thro)l(wn,)j(this)e(causes)h(the)g(stac)
+ l(k)f(un)l(winding)h(to)4080 909 y(stop)50 b(in)h(the)h(curren)l(t)f
+ (function,)g(execute)h(the)g(desired)f(co)t(de,)h(then)4080
+ 1083 y(con)l(tin)l(ue)g(execution)g(or)f(un)l(winding)g(as)g
+ (appropriate.)4292 1372 y Fd({)4433 1521 y(AClass)68
+ b(Obj;)210 b(//)70 b(Has)f(a)h(destructor)4433 1671 y(func\(\);)491
+ b(//)70 b(Might)e(throw;)g(must)h(execute)f(destructor)4433
+ 1820 y(...)4292 1970 y(})4602 2097 y Fi(Figure)51 b(1:)68
+ b Fc(C++)52 b(exception)g(handling)f(example)4230 2439
+ y Fi(F)-13 b(or)44 b(example,)h(consider)f(Figure)g(1,)h(whic)l(h)f
+ (sho)l(ws)e(a)i(case)f(where)4080 2614 y(\\clean)l(up)68
+ b(co)t(de")h(needs)f(to)f(b)t(e)i(generated)f(b)l(y)g(the)g(C++)g(fron)
+ l(t-)4080 2788 y(end.)g(If)48 b(the)g(`)p Fk(func\(\))p
+ Fi(')i(call)d(thro)l(ws)g(an)h(exception,)g(C++)h(guaran-)4080
+ 2962 y(tees)60 b(that)f(the)h(destructor)g(for)g(the)g
+ Fk(Object)i Fi(ob)9 b(ject)60 b(will)e(b)t(e)j(run.)4080
+ 3137 y(T)-13 b(o)43 b(implemen)l(t)g(this,)g(an)g Fk(invoke)j
+ Fi(instruction)c(is)g(used)i(to)e(halt)g(un-)4080 3311
+ y(winding,)49 b(the)h(destructor)f(is)f(run,)i(then)g(un)l(winding)f
+ (is)g(con)l(tin)l(ued)4080 3485 y(with)57 b(the)g Fk(unwind)i
+ Fi(instruction.)84 b(The)58 b(generated)g(LL)-17 b(VM)56
+ b(co)t(de)i(is)4080 3660 y(sho)l(wn)43 b(in)h(Figure)g(2.)65
+ b(Note)44 b(that)f(a)g(fron)l(t-end)h(for)f(Ja)l(v)-9
+ b(a)44 b(w)l(ould)f(use)4080 3834 y(similar)50 b(co)t(de)i(to)f(unlo)t
+ (c)l(k)h(lo)t(c)l(ks)e(that)h(are)g(acquired)h(through)g(syn-)4080
+ 4008 y(c)l(hronized)g(blo)t(c)l(ks)f(or)g(metho)t(ds)h(when)g
+ (exceptions)g(are)f(thro)l(wn.)4433 4223 y Fd(...)4433
+ 4372 y(;)70 b(Allocate)d(stack)i(space)f(for)h(object:)4433
+ 4522 y(\045Obj)g(=)h(alloca)e(\045AClass,)f(uint)i(1)4433
+ 4671 y(;)h(Construct)d(object:)4433 4821 y(call)i(void)g
+ (\045AClass::AClass\(\045AClas)o(s*)61 b(\045Obj\))4433
+ 4970 y(;)70 b(Call)f(``func\(\)'':)4433 5119 y(invoke)f(void)h
+ (\045func\(\))e(to)j(label)f(\045OkLabel)5562 5269 y(unwind)f(to)i
+ (label)e(\045ExceptionLabel)4292 5418 y(OkLabel:)4433
+ 5568 y(;)i(...)f(execution)e(continues...)4292 5717 y(ExceptionLabel:)
+ 4433 5867 y(;)j(If)g(unwind)e(occurs,)f(excecution)g(continues)4433
+ 6016 y(;)j(here.)139 b(First,)68 b(destroy)g(the)h(object:)4433
+ 6166 y(call)g(void)g(\045AClass::~AClass\(\045ACla)o(ss)o(*)62
+ b(\045Obj\))4433 6315 y(;)70 b(Next,)f(continue)e(unwinding:)4433
+ 6464 y(unwind)4080 6767 y Fi(Figure)60 b(2:)83 b Fc(LL)-17
+ b(VM)59 b(co)t(de)h(for)f(the)h(C++)g(example.)92 b(The)59
+ b(handler)4080 6941 y(co)t(de)52 b(sp)t(eci\014ed)h(b)l(y)e
+ Fk(invoke)j Fc(executes)e(the)g(destructor.)4230 7196
+ y Fi(A)98 b(k)l(ey)g(feature)g(of)g(our)g(approac)l(h)g(is)f(that)h
+ (the)g(complex,)4080 7370 y(language-sp)t(eci\014c)58
+ b(details)f(of)g(what)g(co)t(de)h(m)l(ust)f(b)t(e)h(executed)h(to)4080
+ 7544 y(thro)l(w)71 b(and)h(reco)l(v)l(er)g(from)g(exceptions)g(is)f
+ (isolated)f(to)h(the)h(lan-)4080 7719 y(guage)i(fron)l(t-end)h(and)g
+ (language-sp)t(eci\014c)g(run)l(time)f(library)g(\(so)4080
+ 7893 y(it)67 b(do)t(es)i(not)e(complicate)h(the)g(LL)-17
+ b(VM)68 b(represen)l(tation\),)j Fh(but)f(yet)4080 8067
+ y(the)h(exc)-8 b(eptional)71 b(c)-8 b(ontr)g(ol-\015ow)72
+ b(due)f(to)g(stack)f(unwinding)85 b Fi(is)70 b Fh(en-)4080
+ 8242 y(c)-8 b(o)g(de)g(d)65 b(within)g(the)f(applic)-8
+ b(ation)67 b(c)-8 b(o)g(de)73 b Fi(and)62 b(therefore)g(exp)t(osed)g
+ (in)4080 8416 y(a)53 b(language-indep)t(enen)l(t)i(manner)f(to)e(the)i
+ (optimizer.)73 b(The)53 b(C++)4080 8590 y(exception)68
+ b(handling)g(mo)t(del)f(is)g(v)l(ery)g(complicated,)k(supp)t(orting)
+ 4080 8765 y(man)l(y)50 b(related)f(features)h(suc)l(h)g(as)f(try/catc)l
+ (h)g(blo)t(c)l(ks,)g(c)l(hec)l(k)l(ed)i(ex-)4080 8939
+ y(ception)45 b(sp)t(eci\014cations,)h(function)f(try)f(blo)t(c)l(ks,)i
+ (etc.,)f(and)g(reqiring)4080 9113 y(complex)51 b(seman)l(tics)e(for)i
+ (the)f(dynamic)h(lifetime)f(of)g(an)g(exception)4080
+ 9288 y(ob)9 b(ject.)133 b(The)74 b(C++)f(fron)l(t-end)h(supp)t(orts)f
+ (these)g(seman)l(tics)f(b)l(y)4080 9462 y(generating)52
+ b(calls)e(to)g(a)h(simple)g(run)l(time)h(library)-13
+ b(.)4230 9636 y(F)g(or)41 b(example,)h(consider)f(the)g(expression)g(`)
+ p Fk(throw)80 b(1)p Fi('.)65 b(This)40 b(con-)4080 9811
+ y(structs)76 b(and)h(thro)l(ws)e(an)i(exception)g(with)f(in)l(teger)h
+ (t)l(yp)t(e.)144 b(The)4080 9985 y(generated)62 b(LL)-17
+ b(VM)62 b(co)t(de)g(is)e(sho)l(wn)h(in)g(Figure)h(3.)98
+ b(The)62 b(example)4080 10159 y(co)t(de)55 b(illustrates)c(the)j(k)l
+ (ey)g(feature)g(men)l(tioned)g(ab)t(o)l(v)l(e.)74 b(The)54
+ b(run-)4080 10334 y(time)47 b(handles)g(all)f(of)h(the)g(implemen)l
+ (tation-sp)t(eci\014c)h(details,)e(suc)l(h)4080 10508
+ y(as)55 b(allo)t(cating)e(memory)i(for)g(exceptions)6512
+ 10445 y Ff(5)6582 10508 y Fi(.)79 b(Second,)57 b(the)e(run)l(time)p
+ 4080 10584 V 4088 10692 a Ff(5)4157 10755 y Fi(F)-13
+ b(or)61 b(example,)j(the)d(implemen)l(tation)f(has)h(to)f(b)t(e)i
+ (careful)f(to)g(re-)p eop end
+ %%Page: 5 5
+ TeXDict begin 5 4 bop 49 -222 a Fd(;)71 b(Allocate)c(an)i(exception)e
+ (object)49 -73 y(\045t1)j(=)g(call)f(sbyte*)f
+ (\045__llvm_cxxeh_alloc_ex)o(c\()o(uin)o(t)61 b(4\))49
+ 77 y(\045t2)70 b(=)g(cast)f(sbyte*)f(\045t1)h(to)h(int*)49
+ 226 y(;)h(Construct)66 b(the)k(thrown)e(value)g(into)h(the)g(memory)49
+ 376 y(store)g(int)g(1,)h(int*)f(\045t2)49 525 y(;)i(``Throw'')66
+ b(an)k(integer)e(expression,)d(specifying)i(the)49 674
+ y(;)k(exception)66 b(object,)i(the)h(typeid)f(for)h(the)h(object,)d
+ (and)49 824 y(;)k(the)e(destructor)d(for)j(the)h(exception)c(\(null)j
+ (for)g(int\).)49 973 y(call)g(void)g(\045__llvm_cxxeh_throw\(sby)o(te)o
+ (*)62 b(\045t1,)2167 1123 y(<typeinfo)k(for)k(int>,)2167
+ 1272 y(void)e(\(sbyte*\)*)f(null\))49 1422 y(unwind)845
+ b(;)70 b(Unwind)e(the)h(stack.)-303 1724 y Fi(Figure)61
+ b(3:)88 b Fc(LL)-17 b(VM)61 b(co)t(de)h(uses)f(a)g(run)l(time)g
+ (library)g(for)g(C++)h(ex-)-303 1898 y(ceptions)51 b(supp)t(ort)g
+ (while)h(exp)t(osing)f(con)l(trol-\015o)l(w.)-303 2305
+ y Fi(functions)75 b(manipulate)g(the)h(thread-lo)t(cal)f(state)g(of)g
+ (the)g(excep-)-303 2480 y(tion)45 b(handling)i(run)l(time,)g(but)f
+ (don't)g(actually)g(un)l(wind)g(the)h(stac)l(k.)-303
+ 2654 y(Because)c(the)h(calling)e(co)t(de)j(p)t(erforms)e(the)h(stac)l
+ (k)f(un)l(wind,)i(the)e(op-)-303 2829 y(timizer)49 b(has)h(a)f(b)t
+ (etter)i(view)f(of)f(the)i(con)l(trol)e(\015o)l(w)h(of)f(the)h
+ (function)-303 3003 y(without)67 b(ha)l(ving)h(to)g(p)t(erform)h(in)l
+ (terpro)t(cedural)h(analysis.)117 b(This)-303 3177 y(allo)l(ws)41
+ b(LL)-17 b(VM)42 b(to)g(turn)i(stac)l(k)e(un)l(winding)h(op)t(erations)
+ f(in)l(to)g(direct)-303 3352 y(branc)l(hes)e(when)g(the)f(un)l(wind)h
+ (target)f(is)g(the)g(same)g(function)h(as)e(the)-303
+ 3526 y(un)l(winder)52 b(\(this)e(often)h(o)t(ccurs)h(due)g(to)f
+ (inlining,)f(for)h(example\).)-154 3700 y(Finally)-13
+ b(,)67 b(try/catc)l(h)c(blo)t(c)l(ks)h(are)g(implemen)l(ted)h(in)f(a)g
+ (straigh)l(t-)-303 3875 y(forw)l(ard)g(manner,)k(using)d(the)g(same)f
+ (mec)l(hanisms)g(and)i(run)l(time)-303 4049 y(supp)t(ort.)h(An)l(y)48
+ b(function)g(call)f(within)h(the)g(try)g(blo)t(c)l(k)g(b)t(ecomes)h(an)
+ -303 4223 y Fk(invoke)p Fi(.)92 b(An)l(y)58 b(thro)l(w)g(within)g(the)h
+ (try-blo)t(c)l(k)f(b)t(ecomes)h(a)f(call)g(to)-303 4398
+ y(the)35 b(run)l(time)h(library)f(\(as)f(in)i(the)f(example)h(ab)t(o)l
+ (v)l(e\),)i(follo)l(w)l(ed)c(b)l(y)i(an)-303 4572 y(explicit)54
+ b(branc)l(h)i(to)f(the)g(appropriate)g(catc)l(h)g(blo)t(c)l(k.)79
+ b(The)56 b(\\catc)l(h)-303 4746 y(blo)t(c)l(k")61 b(then)h(uses)f(the)g
+ (C++)i(run)l(time)e(library)g(to)g(determine)h(if)-303
+ 4921 y(the)50 b(top-lev)l(el)f(curren)l(t)i(exception)f(is)f(of)h(one)g
+ (of)f(the)h(t)l(yp)t(es)g(that)f(is)-303 5095 y(handled)j(in)g(the)g
+ (catc)l(h)f(blo)t(c)l(k.)70 b(If)52 b(so,)e(it)h(transfers)g(con)l
+ (trol)g(to)g(the)-303 5269 y(appropriate)e(blo)t(c)l(k,)g(otherwise)g
+ (it)f(calls)g Fk(unwind)k Fi(to)d(con)l(tin)l(ue)g(un-)-303
+ 5444 y(winding.)71 b(The)53 b(run)l(time)g(library)f(handles)h(the)g
+ (language-sp)t(eci\014c)-303 5618 y(seman)l(tics)61 b(of)i(determining)
+ g(whether)h(the)f(curren)l(t)h(exception)f(is)-303 5792
+ y(of)51 b(a)g(caugh)l(t)g(t)l(yp)t(e.)-303 6100 y Fj(2.5)198
+ b(Plain\255text,)43 b(Binary)-11 b(,)42 b(and)d(In\255memory)h(Repr)l
+ (e\255)145 6274 y(sentations)-154 6490 y Fi(The)58 b(LL)-17
+ b(VM)57 b(represen)l(tation)g(is)g(a)g Fh(\014rst)j(class)g(language)d
+ Fi(whic)l(h)-303 6665 y(de\014nes)40 b(equiv)-9 b(alen)l(t)41
+ b(textual,)g(binary)-13 b(,)42 b(and)e(in-memory)g(\(i.e.,)g(com-)-303
+ 6839 y(piler's)60 b(in)l(ternal\))g(represen)l(tations.)97
+ b(The)61 b(instruction)f(set)h(is)f(de-)-303 7013 y(signed)c(to)f(serv)
+ l(e)i(e\013ectiv)l(ely)f(b)t(oth)g(as)g(a)g(p)t(ersisten)l(t,)g
+ (o\017ine)h(co)t(de)-303 7188 y(represen)l(tation)81
+ b(and)g(as)f(a)h(compiler)g(in)l(ternal)g(represen)l(tation,)-303
+ 7362 y(with)45 b(no)h(seman)l(tic)f(con)l(v)l(ersions)g(needed)i(b)t
+ (et)l(w)l(een)g(the)f(t)l(w)l(o)3276 7299 y Ff(6)3344
+ 7362 y Fi(.)66 b(Be-)-303 7536 y(ing)f(able)g(to)g(con)l(v)l(ert)g(LL)
+ -17 b(VM)65 b(co)t(de)h(b)t(et)l(w)l(een)g(these)g(represen)l(ta-)-303
+ 7711 y(tions)73 b(without)h(information)g(loss)f(mak)l(es)h(debugging)h
+ (transfor-)-303 7885 y(mations)42 b(m)l(uc)l(h)i(simpler,)h(allo)l(ws)c
+ (test)i(cases)h(to)f(b)t(e)h(written)g(easily)-13 b(,)-303
+ 8059 y(and)67 b(decreases)h(the)g(amoun)l(t)f(of)g(time)f(required)j
+ (to)e(understand)-303 8234 y(the)51 b(in-memory)h(represen)l(tation.)
+ -303 8633 y Fj(3.)198 b(COMPILER)49 b(ARCHITECTURE)-154
+ 8849 y Fi(The)66 b(goal)e(of)h(the)h(LL)-17 b(VM)65 b(compiler)g
+ (framew)l(ork)g(is)f(to)h(enable)-303 9023 y(sophisticated)36
+ b(transformations)f(at)i(link-time,)i(install-time,)f(run-)-303
+ 9198 y(time,)52 b(and)h(idle-time,)f(b)l(y)h(op)t(erating)f(on)h(the)g
+ (LL)-17 b(VM)52 b(represen)l(ta-)-303 9372 y(tion)66
+ b(of)h(a)f(program)h(at)g(all)f(stages.)114 b(T)-13 b(o)67
+ b(b)t(e)g(practical)g(ho)l(w)l(ev)l(er,)-303 9546 y(it)c(m)l(ust)f(b)t
+ (e)j(transparen)l(t)e(to)g(application)g(dev)l(elop)t(ers)i(and)f(end-)
+ -303 9721 y(users,)42 b(and)f(it)f(m)l(ust)g(b)t(e)i(e\016cien)l(t)f
+ (enough)g(for)g(use)g(with)f(real-w)l(orld)-303 9895
+ y(applications.)73 b(This)53 b(section)g(describ)t(es)h(ho)l(w)f(the)g
+ (o)l(v)l(erall)f(system)p -303 9987 1594 7 v -303 10134
+ a(serv)l(e)f(space)g(for)g(thro)l(wing)g Fk(std::bad)p
+ 2005 10134 48 7 v 60 w(alloc)j Fi(exceptions.)-295 10243
+ y Ff(6)-227 10307 y Fi(In)40 b(con)l(trast,)g(t)l(ypical)d(JVM)i
+ (implemen)l(tations)e(con)l(v)l(ert)i(from)f(the)-303
+ 10456 y(stac)l(k-based)e(b)l(yteco)t(de)i(language)e(used)i(o\017ine)e
+ (to)h(an)f(appropriate)-303 10606 y(represen)l(tation)49
+ b(for)h(compiler)f(transformations,)f(and)i(some)f(ev)l(en)-303
+ 10755 y(con)l(v)l(ert)i(to)g(SSA)h(form)f(for)g(this)f(purp)t(ose)i
+ (\(e.g.,)e([8]\).)4080 -137 y(and)63 b(the)g(individual)g(comp)t(onen)l
+ (ts)g(are)g(designed)g(to)f(ac)l(hiev)l(e)h(all)4080
+ 37 y(these)52 b(goals.)4080 346 y Fj(3.1)199 b(High\255Le)m(v)n(el)40
+ b(Design)e(of)h(the)h(LL)-18 b(VM)38 b(Compiler)4529
+ 539 y(Framew)n(ork)4230 755 y Fi(Figure)64 b(4)h(sho)l(ws)e(the)i
+ (high-lev)l(el)f(arc)l(hitecture)h(of)g(the)f(LL)-17
+ b(VM)4080 930 y(system.)74 b(Brie\015y)-13 b(,)54 b(static)e(compiler)i
+ (fron)l(t-ends)g(emit)f(co)t(de)h(in)g(the)4080 1104
+ y(LL)-17 b(VM)71 b(represen)l(tation,)k(whic)l(h)c(is)f(com)l(bined)i
+ (together)f(b)l(y)g(the)4080 1278 y(LL)-17 b(VM)46 b(link)l(er.)66
+ b(The)46 b(link)l(er)g(p)t(erforms)g(a)f(v)-9 b(ariet)l(y)46
+ b(of)g(link-time)f(op-)4080 1453 y(timizations,)63 b(esp)t(ecially)f
+ (in)l(terpro)t(cedural)i(ones.)101 b(The)63 b(resulting)4080
+ 1627 y(LL)-17 b(VM)42 b(co)t(de)i(is)d(then)j(translated)d(to)h(nativ)l
+ (e)g(co)t(de)i(for)e(a)g(giv)l(en)g(tar-)4080 1801 y(get)i(at)f
+ (link-time)h(or)g(install-time,)f(and)i(the)f(LL)-17
+ b(VM)44 b(co)t(de)h(is)e(sa)l(v)l(ed)4080 1976 y(with)48
+ b(the)g(nativ)l(e)g(co)t(de.)68 b(\(It)47 b(is)h(also)e(p)t(ossible)i
+ (to)f(translate)g(LL)-17 b(VM)4080 2150 y(co)t(de)53
+ b(at)d(run)l(time)i(with)f(a)g(just-in-time)g(translator.\))67
+ b(The)52 b(nativ)l(e)4080 2324 y(co)t(de)69 b(generator)g(inserts)f
+ (ligh)l(t-w)l(eigh)l(t)e(instrumen)l(tation)i(to)f(de-)4080
+ 2499 y(tect)59 b(frequen)l(tly)g(executed)h(co)t(de)f(regions)g
+ (\(curren)l(tly)f(lo)t(op)h(nests)4080 2673 y(and)45
+ b(traces,)g(but)g(p)t(oten)l(tially)e(also)g(functions\),)i(and)g
+ (these)g(can)f(b)t(e)4080 2847 y(optimized)k(at)f(run)l(time.)67
+ b(The)48 b(pro\014le)g(data)f(collected)h(at)f(run)l(time)4080
+ 3022 y(represen)l(t)i(the)g(end-user's)g(\(not)e(the)i(dev)l(elop)t
+ (er's\))f(runs,)h(and)g(can)4080 3196 y(b)t(e)42 b(used)f(b)l(y)g(an)g
+ (o\017ine)g(optimizer)f(to)h(p)t(erform)g(aggressiv)l(e)f(pro\014le-)
+ 4080 3370 y(driv)l(en)i(optimizations)d Fh(in)45 b(the)h(\014eld)41
+ b Fi(during)g(idle-time,)i(tailored)d(to)4080 3545 y(the)52
+ b(sp)t(eci\014c)g(target)f(mac)l(hine.)4230 3719 y(This)e(strategy)g
+ (pro)l(vides)h(\014v)l(e)h(b)t(ene\014ts)g(that)f(are)g(not)g(a)l(v)-9
+ b(ailable)4080 3893 y(in)50 b(the)h(traditional)e(mo)t(del)h(of)g
+ (static)f(compilation)g(to)h(nativ)l(e)f(ma-)4080 4068
+ y(c)l(hine)h(co)t(de.)69 b(W)-13 b(e)49 b(argued)i(in)e(the)h(In)l(tro)
+ t(duction)g(that)f(these)h(capa-)4080 4242 y(bilities)61
+ b(are)i(imp)t(ortan)l(t)f(for)h(lifelong)f(analysis)f(and)i
+ (transforma-)4080 4416 y(tion,)51 b(and)g(w)l(e)g(named)h(them:)4260
+ 4660 y(1.)74 b Fh(p)-8 b(ersistent)54 b(pr)-8 b(o)g(gr)g(am)56
+ b(information)12 b Fi(,)4260 4854 y(2.)74 b Fh(o\017ine)55
+ b(c)-8 b(o)g(de)55 b(gener)-8 b(ation)12 b Fi(,)4260
+ 5047 y(3.)74 b Fh(user-b)-8 b(ase)g(d)54 b(pr)-8 b(o\014ling)56
+ b(and)g(optimization)12 b Fi(,)4260 5241 y(4.)74 b Fh(tr)-8
+ b(ansp)g(ar)g(ent)56 b(runtime)f(mo)-8 b(del)15 b Fi(,)52
+ b(and)4260 5435 y(5.)74 b Fh(uniform,)56 b(whole-pr)-8
+ b(o)g(gr)g(am)56 b(c)-8 b(ompilation)p Fi(.)4080 5678
+ y(These)51 b(are)f(di\016cult)h(to)e(obtain)h(sim)l(ultaneously)f(for)h
+ (at)g(least)f(t)l(w)l(o)4080 5853 y(reasons.)99 b(First,)63
+ b(o\017ine)e(co)t(de)i(generation)e(\(#2\))g(normally)g(do)t(es)4080
+ 6027 y(not)73 b(allo)l(w)e(optimization)h(at)g(later)g(stages)g(on)h
+ (the)g(higher-lev)l(el)4080 6201 y(represen)l(tation)44
+ b(instead)f(of)g(nativ)l(e)g(mac)l(hine)h(co)t(de)g(\(#1)f(and)h(#3\).)
+ 4080 6376 y(Second,)71 b(lifelong)65 b(compilation)f(has)i
+ (traditionally)e(b)t(een)j(asso)t(ci-)4080 6550 y(ated)44
+ b(only)g(with)f(b)l(yteco)t(de-based)j(languages,)e(whic)l(h)g(do)g
+ (not)g(pro-)4080 6724 y(vide)52 b(#4)f(and)g(often)h(not)f(#2)g(or)g
+ (#5.)4230 6899 y(In)39 b(fact,)h(w)l(e)e(noted)h(in)f(the)g(In)l(tro)t
+ (duction)h(that)f Fh(no)44 b(existing)e(c)-8 b(om-)4080
+ 7073 y(pilation)75 b(appr)-8 b(o)g(ach)75 b(pr)-8 b(ovides)73
+ b(al)8 b(l)74 b(the)f(c)-8 b(ap)g(abilities)74 b(liste)-8
+ b(d)73 b(ab)-8 b(ove)p Fi(.)4080 7247 y(Our)52 b(reasons)f(are)g(as)g
+ (follo)l(ws:)4302 7544 y Fl(\017)75 b Fi(T)-13 b(raditional)43
+ b(source-lev)l(el)i(compilers)g(pro)l(vide)f(#2)h(and)g(#4,)4454
+ 7718 y(but)77 b(do)g(not)f(attempt)h(#1,)82 b(#3)77 b(or)f(#5.)145
+ b(They)77 b(do)g(pro-)4454 7892 y(vide)56 b(in)l(terpro)t(cedural)h
+ (optimization,)f(but)g(require)h(signi\014-)4454 8067
+ y(can)l(t)51 b(c)l(hanges)g(to)g(application)f(Mak)l(e\014les.)4302
+ 8365 y Fl(\017)75 b Fi(Sev)l(eral)d(commercial)f(compilers)g(pro)l
+ (vide)h(the)g(additional)4454 8539 y(b)t(ene\014t)59
+ b(of)e(#1)g(and)h(#5)g(at)f(link-time)g(b)l(y)g(exp)t(orting)h(their)
+ 4454 8713 y(in)l(termediate)64 b(represen)l(tation)g(to)g(ob)9
+ b(ject)64 b(\014les)g([21,)i(5,)h(26])4454 8888 y(and)h(p)t(erforming)g
+ (optimizations)e(at)h(link-time.)117 b(No)68 b(suc)l(h)4454
+ 9062 y(system)73 b(w)l(e)h(kno)l(w)g(of)g(is)f(also)g(capable)h(of)g
+ (preserving)g(its)4454 9237 y(represen)l(tation)e(for)g(run)l(time)g
+ (or)g(idle-time)g(use)g(\(b)t(ene\014ts)4454 9411 y(#1)51
+ b(and)g(#3\).)4302 9709 y Fl(\017)75 b Fi(Higher-lev)l(el)58
+ b(virtual)f(mac)l(hines)h(lik)l(e)g(JVM)f(and)i(CLI)f(pro-)4454
+ 9883 y(vide)d(b)t(ene\014t)i(#3)e(and)g(partially)f(pro)l(vide)h(#1)g
+ (\(in)g(particu-)4454 10058 y(lar,)65 b(they)f(fo)t(cus)f(on)g(run)l
+ (time)g(optimization,)i(b)t(ecause)f(the)4454 10232 y(need)51
+ b(for)g(b)l(yteco)t(de)g(v)l(eri\014cation)f(greatly)g(restricts)f(the)
+ i(op-)4454 10406 y(timizations)41 b(that)i(ma)l(y)g(b)t(e)i(done)f(b)t
+ (efore)g(run)l(time)g([3]\).)64 b(CLI)4454 10581 y(partially)59
+ b(pro)l(vides)i(#5)f(b)t(ecause)i(it)e(can)h(supp)t(ort)g(co)t(de)g(in)
+ 4454 10755 y(m)l(ultiple)44 b(languages,)h(but)g(an)l(y)g(lo)l(w-lev)l
+ (el)f(system)g(co)t(de)i(and)p eop end
+ %%Page: 6 6
+ TeXDict begin 6 5 bop 281 897 a @beginspecial 0 @llx
+ 0 @lly 1350 @urx 225 @ury 4320 @rwi @setspecial
+ %%BeginDocument: figs/LLVMDiagramHighLevel.eps
+ %!PS-Adobe-2.0 EPSF-2.0
+ %%Title: LLVMDiagramHighLevel.dia
+ %%Creator: Dia v0.90
+ %%CreationDate: Thu Sep 25 03:44:58 2003
+ %%For: vadve
+ %%Magnification: 1.0000
+ %%Orientation: Portrait
+ %%BoundingBox: 0 0 1350 225
+ %%Pages: 1
+ %%EndComments
+ %%BeginProlog
+ /cp {closepath} bind def
+ /c {curveto} bind def
+ /f {fill} bind def
+ /a {arc} bind def
+ /ef {eofill} bind def
+ /ex {exch} bind def
+ /gr {grestore} bind def
+ /gs {gsave} bind def
+ /sa {save} bind def
+ /rs {restore} bind def
+ /l {lineto} bind def
+ /m {moveto} bind def
+ /rm {rmoveto} bind def
+ /n {newpath} bind def
+ /s {stroke} bind def
+ /sh {show} bind def
+ /slc {setlinecap} bind def
+ /slj {setlinejoin} bind def
+ /slw {setlinewidth} bind def
+ /srgb {setrgbcolor} bind def
+ /rot {rotate} bind def
+ /sc {scale} bind def
+ /sd {setdash} bind def
+ /ff {findfont} bind def
+ /sf {setfont} bind def
+ /scf {scalefont} bind def
+ /sw {stringwidth pop} bind def
+ /tr {translate} bind def
+ 
+ /ellipsedict 8 dict def
+ ellipsedict /mtrx matrix put
+ /ellipse
+ { ellipsedict begin
+    /endangle exch def
+    /startangle exch def
+    /yrad exch def
+    /xrad exch def
+    /y exch def
+    /x exch def   /savematrix mtrx currentmatrix def
+    x y tr xrad yrad sc
+    0 0 1 startangle endangle arc
+    savematrix setmatrix
+    end
+ } def
+ 
+ /mergeprocs {
+ dup length
+ 3 -1 roll
+ dup
+ length
+ dup
+ 5 1 roll
+ 3 -1 roll
+ add
+ array cvx
+ dup
+ 3 -1 roll
+ 0 exch
+ putinterval
+ dup
+ 4 2 roll
+ putinterval
+ } bind def
+ %%EndProlog
+ 
+ %%BeginSetup
+ %%EndSetup
+ 28.346000 -28.346000 scale
+ -2.392800 -23.157110 translate
+ 
+ 1.000000 1.000000 1.000000 srgb
+ n 23.400000 17.100000 m 23.400000 20.100000 l 28.400000 20.100000 l 28.400000 17.100000 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slj
+ 0.000000 0.000000 0.000000 srgb
+ n 23.400000 17.100000 m 23.400000 20.100000 l 28.400000 20.100000 l 28.400000 17.100000 l cp s
+  [ /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /N /a /t /i /v /e /C /o /xi /xi /d /G /n /space /L /k
+  /r /I /P /O /slash /A /period /R /u /m /p /z /f /l /ampersand /T
+  /c /V /M /b /s /F /E /one /x /U /J /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+  /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi /xi
+ ] /e0 exch def
+ /Times-Roman_e0 undefinefont
+ /Times-Roman_e0
+   /Times-Roman findfont
+   dup length dict begin
+   {1 index /FID ne {def} {pop pop} ifelse} forall
+   /Encoding e0 def
+   currentdict end
+ definefont pop
+ /Times-Roman_e0 ff 1.200000 scf sf
+ ( !"#$%) sw
+ 2 div 25.800000 ex sub 18.400000 m ( !"#$%)
+  gs 1 -1 sc sh gr
+ (&'*%+%,) sw
+ 2 div 25.800000 ex sub 19.600000 m (&'*%+%,)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ 0 slj
+ 0 slc
+ 0 slj
+ [] 0 sd
+ 1.000000 1.000000 1.000000 srgb
+ n 17.200000 15.300000 m 22.000000 15.300000 l 22.000000 17.228529 l 21.040000 16.907107 20.560000 16.907107 19.600000 17.228529 c 18.640000 17.549950 18.160000 17.549950 17.200000 17.228529 c 17.200000 15.300000 l f
+ 0.000000 0.000000 0.000000 srgb
+ n 17.200000 15.300000 m 22.000000 15.300000 l 22.000000 17.228529 l 21.040000 16.907107 20.560000 16.907107 19.600000 17.228529 c 18.640000 17.549950 18.160000 17.549950 17.200000 17.228529 c 17.200000 15.300000 l s
+ /Courier_e0 undefinefont
+ /Courier_e0
+   /Courier findfont
+   dup length dict begin
+   {1 index /FID ne {def} {pop pop} ifelse} forall
+   /Encoding e0 def
+   currentdict end
+ definefont pop
+ /Courier_e0 ff 0.800000 scf sf
+ (-----) sw
+ 2 div 19.600000 ex sub 16.336887 m (-----)
+  gs 1 -1 sc sh gr
+ 1.000000 1.000000 1.000000 srgb
+ n 16.900000 18.600000 m 16.900000 21.600000 l 22.300000 21.600000 l 22.300000 18.600000 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slj
+ 0.000000 0.000000 0.000000 srgb
+ n 16.900000 18.600000 m 16.900000 21.600000 l 22.300000 21.600000 l 22.300000 18.600000 l cp s
+ /Times-Roman_e0 ff 1.200000 scf sf
+ (.#,/%0) sw
+ 2 div 19.500000 ex sub 19.900000 m (.#,/%0)
+  gs 1 -1 sc sh gr
+ (1234125) sw
+ 2 div 19.500000 ex sub 21.100000 m (1234125)
+  gs 1 -1 sc sh gr
+ /Times-Bold_e0 undefinefont
+ /Times-Bold_e0
+   /Times-Bold findfont
+   dup length dict begin
+   {1 index /FID ne {def} {pop pop} ifelse} forall
+   /Encoding e0 def
+   currentdict end
+ definefont pop
+ /Times-Bold_e0 ff 1.000000 scf sf
+ (6) sw
+ 2 div 6.300000 ex sub 19.400000 m (6)
+  gs 1 -1 sc sh gr
+ (6) sw
+ 2 div 6.300000 ex sub 20.400000 m (6)
+  gs 1 -1 sc sh gr
+ 1.000000 1.000000 1.000000 srgb
+ n 43.800000 19.800000 m 43.800000 22.700000 l 49.900000 22.700000 l 49.900000 19.800000 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slj
+ 0.000000 0.000000 0.000000 srgb
+ n 43.800000 19.800000 m 43.800000 22.700000 l 49.900000 22.700000 l 49.900000 19.800000 l cp s
+ /Times-Roman_e0 ff 1.200000 scf sf
+ (78,"#9%) sw
+ 2 div 46.800000 ex sub 21.000000 m (78,"#9%)
+  gs 1 -1 sc sh gr
+ (3:"#9#;%0) sw
+ 2 div 46.800000 ex sub 22.200000 m (3:"#9#;%0)
+  gs 1 -1 sc sh gr
+ 1.000000 1.000000 1.000000 srgb
+ n 36.900000 16.000000 m 36.900000 17.600000 l 47.200000 17.600000 l 47.200000 16.000000 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slj
+ 0.000000 0.000000 0.000000 srgb
+ n 36.900000 16.000000 m 36.900000 17.600000 l 47.200000 17.600000 l 47.200000 16.000000 l cp s
+ /Times-Roman_e0 ff 1.200000 scf sf
+ (3<<=#,%-7%':"#9#;%0) sw
+ 2 div 42.100000 ex sub 17.100000 m (3<<=#,%-7%':"#9#;%0)
+  gs 1 -1 sc sh gr
+ /Helvetica_e0 undefinefont
+ /Helvetica_e0
+   /Helvetica findfont
+   dup length dict begin
+   {1 index /FID ne {def} {pop pop} ifelse} forall
+   /Encoding e0 def
+   currentdict end
+ definefont pop
+ /Helvetica_e0 ff 0.800000 scf sf
+ (20'<#=%) sw
+ 2 div 41.400000 ex sub 19.300000 m (20'<#=%)
+  gs 1 -1 sc sh gr
+ (>-?0!@%) sw
+ 2 div 41.400000 ex sub 20.100000 m (>-?0!@%)
+  gs 1 -1 sc sh gr
+ (1,<') sw
+ 2 div 41.400000 ex sub 20.900000 m (1,<')
+  gs 1 -1 sc sh gr
+ /Helvetica_e0 ff 0.800000 scf sf
+ (..AB) sw
+ 2 div 11.400000 ex sub 22.600000 m (..AB)
+  gs 1 -1 sc sh gr
+ /Helvetica_e0 ff 0.800000 scf sf
+ (..AB) sw
+ 2 div 11.300000 ex sub 17.700000 m (..AB)
+  gs 1 -1 sc sh gr
+ /Times-Roman_e0 ff 1.000000 scf sf
+ (.#C0!0#%D) sw
+ 2 div 19.600000 ex sub 16.600000 m (.#C0!0#%D)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 19.600000 17.228500 m 19.600000 18.600000 l s
+ 0 slj
+ n 19.200000 17.800000 m 19.600000 18.600000 l 20.000000 17.800000 l f
+ 1.000000 1.000000 1.000000 srgb
+ n 2.500000 17.300000 m 2.500000 18.900000 l 10.100000 18.900000 l 10.100000 17.300000 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slj
+ 0.000000 0.000000 0.000000 srgb
+ n 2.500000 17.300000 m 2.500000 18.900000 l 10.100000 18.900000 l 10.100000 17.300000 l cp s
+ /Times-Roman_e0 ff 1.200000 scf sf
+ (&'9:#=%0-EF-G) sw
+ 2 div 6.300000 ex sub 18.400000 m (&'9:#=%0-EF-G)
+  gs 1 -1 sc sh gr
+ 1.000000 1.000000 1.000000 srgb
+ n 2.500000 20.800000 m 2.500000 22.400000 l 10.100000 22.400000 l 10.100000 20.800000 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slj
+ 0.000000 0.000000 0.000000 srgb
+ n 2.500000 20.800000 m 2.500000 22.400000 l 10.100000 22.400000 l 10.100000 20.800000 l cp s
+ /Times-Roman_e0 ff 1.200000 scf sf
+ (&'9:#=%0-EF- ) sw
+ 2 div 6.300000 ex sub 22.000000 m (&'9:#=%0-EF- )
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ 0 slj
+ 0 slc
+ 0 slj
+ [] 0 sd
+ 1.000000 1.000000 1.000000 srgb
+ n 11.910402 18.370946 m 11.910402 21.529034 l 15.489568 21.529034 l 15.489568 18.370946 l f
+ 0 slc
+ 0 slj
+ [] 0 sd
+ n 13.699985 21.529034 1.789583 0.526348 0 360 ellipse f
+ 0 slc
+ 0 slj
+ [] 0 sd
+ n 13.699985 18.370946 1.789583 0.526348 0 360 ellipse f
+ 0.000000 0.000000 0.000000 srgb
+ n 13.699985 18.370946 1.789583 0.526348 0 360 ellipse cp s
+ 0 slc
+ 0 slj
+ [] 0 sd
+ n 15.489568 18.370946 m 15.489568 21.529034 l 15.489568 21.819728 14.688345 22.055382 13.699985 22.055382 c 12.711625 22.055382 11.910402 21.819728 11.910402 21.529034 c 11.910402 18.370946 l s
+ /Helvetica_e0 ff 0.800000 scf sf
+ (6'-<#=%D) sw
+ 2 div 13.718500 ex sub 20.700000 m (6'-<#=%D)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 10.100000 18.100000 m 11.900000 19.500000 l s
+ 0 slj
+ n 11.022942 19.324588 m 11.900000 19.500000 l 11.514094 18.693107 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 10.100000 21.600000 m 11.900000 20.600000 l s
+ 0 slj
+ n 11.394931 21.338177 m 11.900000 20.600000 l 11.006417 20.638851 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 15.500000 19.900000 m 16.900000 19.900000 l s
+ 0 slj
+ n 16.100000 20.300000 m 16.900000 19.900000 l 16.100000 19.500000 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 15.500000 20.100000 m 16.900000 20.100000 l s
+ 0 slj
+ n 16.100000 20.500000 m 16.900000 20.100000 l 16.100000 19.700000 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 15.500000 20.300000 m 16.900000 20.300000 l s
+ 0 slj
+ n 16.100000 20.700000 m 16.900000 20.300000 l 16.100000 19.900000 l f
+ /Helvetica_e0 ff 0.800000 scf sf
+ (..AB) sw
+ 2 div 16.200000 ex sub 19.400000 m (..AB)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 22.300000 18.900000 m 23.400000 18.600000 l s
+ 0 slj
+ n 22.733436 19.196399 m 23.400000 18.600000 l 22.522942 18.424588 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slj
+ 0 slc
+ n 33.800000 17.900000 m 35.800000 16.500000 34.500000 17.600000 36.900000 16.800000 c s
+ 0 slj
+ n 34.226001 17.113537 m 33.800000 17.900000 l 34.684770 17.768923 l f
+ 0 slj
+ n 36.267544 17.432456 m 36.900000 16.800000 l 36.014562 16.673509 l f
+ /Helvetica_e0 ff 0.800000 scf sf
+ (..AB) sw
+ 2 div 22.200000 ex sub 18.300000 m (..AB)
+  gs 1 -1 sc sh gr
+ /Helvetica_e0 ff 0.800000 scf sf
+ (%H%->) sw
+ 2 div 29.600000 ex sub 17.200000 m (%H%->)
+  gs 1 -1 sc sh gr
+ (..AB) sw
+ 2 div 29.600000 ex sub 18.000000 m (..AB)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ 0 slj
+ 0 slc
+ 0 slj
+ [] 0 sd
+ 1.000000 1.000000 1.000000 srgb
+ n 30.600002 18.226346 m 30.600002 21.384434 l 34.179168 21.384434 l 34.179168 18.226346 l f
+ 0 slc
+ 0 slj
+ [] 0 sd
+ n 32.389585 21.384434 1.789583 0.526348 0 360 ellipse f
+ 0 slc
+ 0 slj
+ [] 0 sd
+ n 32.389585 18.226346 1.789583 0.526348 0 360 ellipse f
+ 0.000000 0.000000 0.000000 srgb
+ n 32.389585 18.226346 1.789583 0.526348 0 360 ellipse cp s
+ 0 slc
+ 0 slj
+ [] 0 sd
+ n 34.179168 18.226346 m 34.179168 21.384434 l 34.179168 21.675128 33.377945 21.910782 32.389585 21.910782 c 31.401225 21.910782 30.600002 21.675128 30.600002 21.384434 c 30.600002 18.226346 l s
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 28.400000 18.600000 m 30.600000 18.900000 l s
+ 0 slj
+ n 29.753291 19.188242 m 30.600000 18.900000 l 29.861381 18.395577 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 22.300000 20.700000 m 30.600000 20.700000 l s
+ 0 slj
+ n 29.800000 21.100000 m 30.600000 20.700000 l 29.800000 20.300000 l f
+ /Helvetica_e0 ff 0.800000 scf sf
+ (..AB) sw
+ 2 div 26.400000 ex sub 21.500000 m (..AB)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ 0 slj
+ 0 slc
+ 0 slj
+ [] 0 sd
+ 0.827451 0.827451 0.827451 srgb
+ n 36.220781 18.100000 m 39.324689 18.100000 l 39.945470 19.103555 l 39.324689 20.107110 l 36.220781 20.107110 l 35.600000 19.103555 l 36.220781 18.100000 l f
+ 0.000000 0.000000 0.000000 srgb
+ n 36.220781 18.100000 m 39.324689 18.100000 l 39.945470 19.103555 l 39.324689 20.107110 l 36.220781 20.107110 l 35.600000 19.103555 l 36.220781 18.100000 l s
+ /Courier-Bold_e0 undefinefont
+ /Courier-Bold_e0
+   /Courier-Bold findfont
+   dup length dict begin
+   {1 index /FID ne {def} {pop pop} ifelse} forall
+   /Encoding e0 def
+   currentdict end
+ definefont pop
+ /Courier-Bold_e0 ff 1.200000 scf sf
+ (&2I) sw
+ 2 div 37.772735 ex sub 19.453555 m (&2I)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ 0 slj
+ 0 slc
+ 0 slj
+ [] 0 sd
+ 0.823529 0.823529 0.823529 srgb
+ n 36.206301 21.100000 m 39.283809 21.100000 l 39.899310 22.103555 l 39.283809 23.107110 l 36.206301 23.107110 l 35.590800 22.103555 l 36.206301 21.100000 l f
+ 0.000000 0.000000 0.000000 srgb
+ n 36.206301 21.100000 m 39.283809 21.100000 l 39.899310 22.103555 l 39.283809 23.107110 l 36.206301 23.107110 l 35.590800 22.103555 l 36.206301 21.100000 l s
+ /Courier-Bold_e0 ff 1.200000 scf sf
+ (J1?) sw
+ 2 div 37.745055 ex sub 22.453555 m (J1?)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 34.200000 20.700000 m 35.590800 22.103600 l s
+ 0 slj
+ n 34.743576 21.816874 m 35.590800 22.103600 l 35.311847 21.253785 l f
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 34.200000 19.500000 m 35.600000 19.103600 l s
+ 0 slj
+ n 34.939233 19.706416 m 35.600000 19.103600 l 34.721287 18.936676 l f
+ 0.100000 slw
+ [0.200000] 0 sd
+ [0.200000] 0 sd
+ 0 slj
+ 0 slc
+ n 39.635100 18.601800 m 41.300000 17.800000 42.400000 18.400000 43.800000 19.800000 c s
+ 0 slj
+ n 42.951472 19.517157 m 43.800000 19.800000 l 43.517157 18.951472 l f
+ 0.100000 slw
+ [0.200000] 0 sd
+ [0.200000] 0 sd
+ 0 slc
+ n 46.850000 19.800000 m 46.900000 17.600000 l s
+ 0 slj
+ n 47.281720 18.408882 m 46.900000 17.600000 l 46.481926 18.390705 l f
+ 0.100000 slw
+ [0.200000] 0 sd
+ [0.200000] 0 sd
+ 0 slc
+ n 46.600000 19.800000 m 45.600000 17.600000 l s
+ 0 slj
+ n 46.295189 18.162772 m 45.600000 17.600000 l 45.566896 18.493814 l f
+ 0.100000 slw
+ [0.200000] 0 sd
+ [0.200000] 0 sd
+ 0 slc
+ n 46.300000 19.800000 m 44.100000 17.600000 l s
+ 0 slj
+ n 44.948528 17.882843 m 44.100000 17.600000 l 44.382843 18.448528 l f
+ /Helvetica_e0 ff 0.800000 scf sf
+ (20'<#=%) sw
+ 2 div 48.800000 ex sub 18.300000 m (20'<#=%)
+  gs 1 -1 sc sh gr
+ (1,<') sw
+ 2 div 48.800000 ex sub 19.100000 m (1,<')
+  gs 1 -1 sc sh gr
+ /Helvetica_e0 ff 0.800000 scf sf
+ (%H%->) sw
+ 2 div 34.900000 ex sub 15.900000 m (%H%->)
+  gs 1 -1 sc sh gr
+ (..AB) sw
+ 2 div 34.900000 ex sub 16.700000 m (..AB)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 37.745000 21.100000 m 37.772700 20.107100 l s
+ 0 slj
+ n 38.008659 20.613877 m 37.772700 20.107100 l 37.508854 20.599934 l f
+ /Helvetica_e0 ff 0.800000 scf sf
+ (%H%) sw
+ 2 div 36.800000 ex sub 20.800000 m (%H%)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [] 0 sd
+ [] 0 sd
+ 0 slc
+ n 43.800000 21.250000 m 39.899300 22.103600 l s
+ 0 slj
+ n 40.595297 21.541828 m 39.899300 22.103600 l 40.766316 22.323334 l f
+ /Helvetica_e0 ff 0.800000 scf sf
+ (..AB) sw
+ 2 div 34.500000 ex sub 22.700000 m (..AB)
+  gs 1 -1 sc sh gr
+ /Helvetica_e0 ff 0.800000 scf sf
+ (%H%) sw
+ 2 div 35.000000 ex sub 18.700000 m (%H%)
+  gs 1 -1 sc sh gr
+ /Helvetica_e0 ff 0.800000 scf sf
+ (..AB) sw
+ 2 div 42.500000 ex sub 22.300000 m (..AB)
+  gs 1 -1 sc sh gr
+ 0.100000 slw
+ [0.200000] 0 sd
+ [0.200000] 0 sd
+ 0 slj
+ 0 slc
+ n 30.600000 18.900000 m 32.600000 19.300000 32.500000 19.800000 34.164900 19.498200 c s
+ 0.100000 slw
+ [0.200000] 0 sd
+ [0.200000] 0 sd
+ 0 slj
+ 0 slc
+ n 33.800000 17.900000 m 32.600000 18.600000 32.600000 19.800000 34.203600 19.456400 c s
+ 0.100000 slw
+ [0.200000] 0 sd
+ [0.200000] 0 sd
+ 0 slj
+ 0 slc
+ n 30.600000 20.700000 m 32.700000 20.700000 32.735100 19.701800 34.200000 20.700000 c s
+ showpage
+ 
+ %%EndDocument
+  @endspecial 2351 1071 a Fi(Figure)52 b(4:)67 b Fc(LL)-17
+ b(VM)51 b(system)g(arc)l(hitecture)h(diagram)70 1565
+ y Fi(co)t(de)h(in)e(non-conforming)i(languages)e(is)g(executed)i(as)e
+ (\\un-)70 1739 y(managed)73 b(co)t(de".)131 b(Suc)l(h)73
+ b(co)t(de)f(is)g(represen)l(ted)h(in)f(nativ)l(e)70 1914
+ y(form)56 b(and)g(not)f(in)h(the)g(CLI)g(in)l(termediate)g(represen)l
+ (tation,)70 2088 y(so)f(it)g(is)f(not)h(exp)t(osed)i(to)d(CLI)i
+ (optimizations.)79 b(These)55 b(sys-)70 2262 y(tems)i(do)f(not)h(pro)l
+ (vide)g(#2)f(with)h(#1)f(or)g(#3)h(b)t(ecause)h(run-)70
+ 2437 y(time)g(optimization)e(is)h(generally)g(only)h(p)t(ossible)f
+ (when)i(us-)70 2611 y(ing)54 b(JIT)g(co)t(de)h(generation.)76
+ b(They)54 b(do)g(not)g(aim)f(to)g(pro)l(vide)70 2785
+ y(#4,)d(and)g(instead)g(pro)l(vide)g(a)g(ric)l(h)g(run)l(time)g(framew)
+ l(ork)g(for)70 2960 y(languages)45 b(that)f(matc)l(h)h(their)h(run)l
+ (time)f(and)h(ob)9 b(ject)45 b(mo)t(del,)70 3134 y(e.g.,)78
+ b(Ja)l(v)-9 b(a)73 b(and)g(C#.)134 b(Omniw)l(are)73 b([1])f(pro)l
+ (vides)h(#5)g(and)70 3308 y(most)39 b(of)h(the)h(b)t(ene\014ts)g(of)f
+ (#2)f(\(b)t(ecause,)k(lik)l(e)d(LL)-17 b(VM,)39 b(it)h(uses)70
+ 3483 y(a)62 b(lo)l(w-lev)l(el)f(represen)l(tion)i(that)f(p)t(ermits)g
+ (extensiv)l(e)g(static)70 3657 y(optimization\),)e(but)g(at)f(the)h
+ (cost)f(of)g(not)g(pro)l(viding)h(infor-)70 3831 y(mation)66
+ b(for)h(high-lev)l(el)g(analysis)e(and)i(optimization)f(\(i.e.,)70
+ 4006 y(#1\).)i(It)51 b(do)t(es)h(not)f(aim)f(to)h(pro)l(vide)g(#3)g(or)
+ g(#4.)-81 4296 y Fl(\017)74 b Fi(T)-13 b(ransparen)l(t)50
+ b(binary)g(run)l(time)g(optimization)f(systems)f(lik)l(e)70
+ 4470 y(Dynamo)37 b(and)f(the)h(run)l(time)f(optimizers)f(in)h(T)-13
+ b(ransmeta)36 b(pro-)70 4644 y(cessors)56 b(pro)l(vide)g(b)t(ene\014ts)
+ i(#2,)f(#4)f(and)h(#5,)g(but)g(they)g(do)70 4819 y(not)47
+ b(pro)l(vide)g(#1.)66 b(They)47 b(pro)l(vide)g(b)t(ene\014t)i(#3)d
+ (only)h(at)f(run-)70 4993 y(time,)56 b(and)g(only)f(to)g(a)g(limited)g
+ (exten)l(t)h(b)t(ecause)g(they)g(w)l(ork)70 5167 y(only)48
+ b(on)h(nativ)l(e)e(binary)i(co)t(de,)g(limiting)e(the)h(optimizations)
+ 70 5342 y(they)k(can)f(p)t(erform.)-81 5631 y Fl(\017)74
+ b Fi(Pro\014le)54 b(Guided)h(Optimization)e(for)h(static)f(languages)g
+ (pro-)70 5806 y(vide)65 b(b)t(ene\014t)g(#3)f(at)f(the)i(cost)e(of)g
+ (not)h(b)t(eing)h(transparen)l(t)70 5980 y(\(they)49
+ b(require)g(a)f(m)l(ulti-phase)h(compilation)e(pro)t(cess\).)67
+ b(Ad-)70 6154 y(ditionally)-13 b(,)53 b(PGO)g(su\013ers)g(from)g(three)
+ h(problems:)72 b(\(1\))53 b(Em-)70 6329 y(pirically)-13
+ b(,)65 b(dev)l(elop)t(ers)f(are)f(unlik)l(ely)g(to)f(use)i(PGO,)e
+ (except)70 6503 y(when)53 b(compiling)e(b)t(enc)l(hmarks.)72
+ b(\(2\))51 b(When)h(PGO)g Fh(is)f Fi(used,)70 6677 y(the)59
+ b(application)g(is)f(tuned)h(to)g(the)g(b)t(eha)l(vior)g(of)g(the)g
+ (train-)70 6852 y(ing)44 b(run.)66 b(If)44 b(the)g(training)f(run)i(is)
+ e(not)g(represen)l(tativ)l(e)h(of)f(the)70 7026 y(end-user's)71
+ b(usage)e(patterns,)74 b(p)t(erformance)e(ma)l(y)d(not)h(im-)70
+ 7201 y(pro)l(v)l(e)44 b(and)h(ma)l(y)f(ev)l(en)h(b)t(e)g(h)l(urt)f(b)l
+ (y)g(the)h(pro\014le-driv)l(en)g(opti-)70 7375 y(mization.)84
+ b(\(3\))55 b(The)j(pro\014ling)e(information)g(is)g(completely)70
+ 7549 y(static,)d(meaning)h(that)f(the)h(compiler)g(cannot)g(mak)l(e)g
+ (use)g(of)70 7724 y(phase)63 b(b)t(eha)l(vior)h(in)f(the)g(program)g
+ (or)f(adapt)h(to)g(c)l(hanging)70 7898 y(usage)51 b(patterns.)-154
+ 8184 y(There)57 b(are)f(also)f(signi\014can)l(t)g(limitations)f(of)h
+ (the)i(LL)-17 b(VM)56 b(strat-)-303 8358 y(egy)-13 b(.)160
+ b(First,)89 b(language-sp)t(eci\014c)83 b(optimizations)d(m)l(ust)i(b)t
+ (e)h(p)t(er-)-303 8532 y(formed)97 b(in)f(the)i(fron)l(t-end)f(b)t
+ (efore)h(generating)f(LL)-17 b(VM)96 b(co)t(de.)-303
+ 8707 y(LL)-17 b(VM)59 b(is)g Fh(not)74 b Fi(designed)60
+ b(to)f(represen)l(t)i(source)f(languages)f(t)l(yp)t(es)-303
+ 8881 y(or)51 b(features)i(directly)-13 b(.)70 b(Second,)53
+ b(it)f(is)f(an)h(op)t(en)h(question)f(whether)-303 9055
+ y(languages)63 b(requiring)i(sophisticated)e(run)l(time)h(systems)f
+ (suc)l(h)h(as)-303 9230 y(Ja)l(v)-9 b(a)53 b(can)g(b)t(ene\014t)i
+ (directly)e(from)g(LL)-17 b(VM.)53 b(W)-13 b(e)53 b(are)g(curren)l(tly)
+ h(ex-)-303 9404 y(ploring)64 b(the)g(p)t(oten)l(tial)g(b)t(ene\014ts)i
+ (of)e(implemen)l(ting)g(higher-lev)l(el)-303 9578 y(virtual)50
+ b(mac)l(hines)h(suc)l(h)h(as)e(JVM)h(or)g(CLI)h(on)f(top)g(of)g(LL)-17
+ b(VM.)-154 9753 y(The)77 b(subsections)e(b)t(elo)l(w)h(describ)t(e)i
+ (the)e(k)l(ey)g(comp)t(onen)l(ts)h(of)-303 9927 y(the)c(LL)-17
+ b(VM)72 b(compiler)h(arc)l(hitecture,)78 b(emphasizing)73
+ b(design)f(and)-303 10101 y(implemen)l(tation)f(features)h(that)g(mak)l
+ (e)g(the)h(capabilities)e(ab)t(o)l(v)l(e)-303 10276 y(practical)50
+ b(and)i(e\016cien)l(t.)-303 10581 y Fj(3.2)198 b(Compile\255T)l(ime:)64
+ b(Exter)m(nal)30 b(fr)l(ont\255end)g(&)g(static)145 10755
+ y(optimizer)4230 1739 y Fi(External)j(static)g(LL)-17
+ b(VM)34 b(compilers)g(\(referred)i(to)e(as)f(fron)l(t-ends\))4080
+ 1914 y(translate)59 b(source-language)h(programs)f(in)l(to)g(the)h(LL)
+ -17 b(VM)60 b(virtual)4080 2088 y(instruction)51 b(set.)68
+ b(Eac)l(h)51 b(static)f(compiler)i(can)g(p)t(erform)g(three)g(k)l(ey)
+ 4080 2262 y(tasks,)47 b(of)h(whic)l(h)h(the)f(\014rst)g(and)h(third)f
+ (are)h(optional:)65 b(\(1\))48 b(P)l(erform)4080 2437
+ y(language-sp)t(eci\014c)57 b(optimizations,)e(e.g.,)i(optimizing)e
+ (closures)g(in)4080 2611 y(languages)50 b(with)g(higher-order)h
+ (functions.)68 b(\(2\))49 b(T)-13 b(ranslate)50 b(source)4080
+ 2785 y(programs)39 b(to)g(LL)-17 b(VM)40 b(co)t(de,)j(syn)l(thesizing)c
+ (as)g(m)l(uc)l(h)h(useful)f(LL)-17 b(VM)4080 2960 y(t)l(yp)t(e)57
+ b(information)f(as)h(p)t(ossible,)g(esp)t(ecially)g(to)f(exp)t(ose)i(p)
+ t(oin)l(ters,)4080 3134 y(structures,)k(and)e(arra)l(ys.)92
+ b(\(3\))59 b(In)l(v)l(ok)l(e)h(LL)-17 b(VM)60 b(passes)f(for)g(global)
+ 4080 3308 y(or)j(in)l(terpro)t(cedural)h(optimizations)d(at)h(the)i(mo)
+ t(dule)f(lev)l(el.)100 b(The)4080 3483 y(LL)-17 b(VM)51
+ b(optimizations)e(are)i(built)f(in)l(to)g(libraries,)g(making)g(it)g
+ (easy)4080 3657 y(for)h(fron)l(t-ends)h(to)e(use)i(them.)4230
+ 3831 y(The)71 b(fron)l(t-end)h(do)t(es)f(not)g(ha)l(v)l(e)g(to)g(p)t
+ (erform)h(SSA)g(construc-)4080 4006 y(tion.)65 b(Instead,)44
+ b(v)-9 b(ariables)41 b(can)h(b)t(e)h(allo)t(cated)f(on)g(the)g(stac)l
+ (k)f(\(whic)l(h)4080 4180 y(is)65 b(not)g(in)h(SSA)g(form\),)j(and)d
+ (the)g(LL)-17 b(VM)65 b(stac)l(k)g(promotion)g(and)4080
+ 4354 y(scalar)59 b(expansion)h(passes)e(can)i(b)t(e)h(used)f(to)f
+ (build)h(SSA)g(form)g(ef-)4080 4529 y(fectiv)l(ely)-13
+ b(.)127 b(Stac)l(k)71 b(promotion)f(con)l(v)l(erts)g(stac)l(k-allo)t
+ (cated)g(scalar)4080 4703 y(v)-9 b(alues)54 b(to)f(SSA)h(registers)f
+ (if)g(their)g(address)h(do)t(es)f(not)h(escap)t(e)g(the)4080
+ 4878 y(curren)l(t)k(function,)g(inserting)f Fe(\036)g
+ Fi(functions)g(as)g(necessary)g(to)f(pre-)4080 5052 y(serv)l(e)39
+ b(SSA)h(form.)63 b(Scalar)39 b(expansion)g(precedes)h(this)e(and)i
+ (expands)4080 5226 y(lo)t(cal)64 b(structures)h(to)f(scalars)g(wherev)l
+ (er)i(p)t(ossible,)h(so)d(that)g(their)4080 5401 y(\014elds)52
+ b(can)f(b)t(e)h(mapp)t(ed)h(to)e(SSA)h(registers)e(as)h(w)l(ell.)4230
+ 5575 y(Note)h(that)h(man)l(y)g(\\high-lev)l(el")f(optimizations)f(are)i
+ (not)g(really)4080 5749 y(language-dep)t(enden)l(t,)92
+ b(and)82 b(are)g(often)g(sp)t(ecial)g(cases)f(of)h(more)4080
+ 5924 y(general)87 b(optimizations)d(that)i(ma)l(y)g(b)t(e)h(p)t
+ (erformed)h(on)e(LL)-17 b(VM)4080 6098 y(co)t(de.)165
+ b(F)-13 b(or)83 b(example,)91 b(b)t(oth)83 b(virtual)g(function)g
+ (resolution)f(for)4080 6272 y(ob)9 b(ject-orien)l(ted)68
+ b(languages)e(\(describ)t(ed)j(in)e(Section)g(4.1.2\))f(and)4080
+ 6447 y(tail-recursion)44 b(elimination)f(whic)l(h)h(is)f(crucial)i(for)
+ e(functional)h(lan-)4080 6621 y(guages)56 b(can)g(b)t(e)h(done)g(in)f
+ (LL)-17 b(VM.)56 b(In)g(suc)l(h)h(cases,)f(it)g(is)f(b)t(etter)i(to)
+ 4080 6795 y(extend)50 b(the)g(LL)-17 b(VM)48 b(optimizer)h(to)g(p)t
+ (erform)h(the)f(transformation,)4080 6970 y(rather)69
+ b(than)g(in)l(v)l(esting)f(e\013ort)h(in)g(co)t(de)g(whic)l(h)h(only)e
+ (b)t(ene\014ts)i(a)4080 7144 y(particular)60 b(fron)l(t-end.)94
+ b(This)59 b(also)g(allo)l(ws)f(the)i(optimizations)e(to)4080
+ 7318 y(b)t(e)52 b(p)t(erformed)h(throughout)e(the)h(lifetime)e(of)h
+ (the)h(program.)4080 7654 y Fj(3.3)199 b(Link)n(er)50
+ b(&)g(Inter)n(pr)l(ocedural)i(Optimizer)4230 7870 y Fi(Link)74
+ b(time)g(is)f(the)h(\014rst)g(phase)h(of)e(the)i(compilation)e(pro)t
+ (cess)4080 8044 y(where)h(most)4872 7981 y Ff(7)5013
+ 8044 y Fi(of)f(the)g(program)g(is)f(a)l(v)-9 b(ailable)72
+ b(for)g(analysis)g(and)4080 8219 y(transformation.)143
+ b(As)76 b(suc)l(h,)83 b(link-time)76 b(is)g(a)g(natural)h(place)g(to)
+ 4080 8393 y(p)t(erform)49 b(aggressiv)l(e)e(in)l(terpro)t(cedural)i
+ (optimizations)e(across)g(the)4080 8568 y(en)l(tire)c(program.)65
+ b(The)43 b(link-time)g(optimizations)e(in)i(LL)-17 b(VM)42
+ b(op)t(er-)4080 8742 y(ate)55 b(on)g(the)h(LL)-17 b(VM)55
+ b(represen)l(tation)g(directly)-13 b(,)56 b(taking)e(adv)-9
+ b(an)l(tage)4080 8916 y(of)70 b(the)h(seman)l(tic)f(information)f(it)h
+ (con)l(tains.)125 b(LL)-17 b(VM)70 b(curren)l(tly)4080
+ 9091 y(includes)76 b(a)f(n)l(um)l(b)t(er)i(of)e(in)l(terpro)t(cedural)h
+ (analyses,)k(suc)l(h)c(as)e(a)4080 9265 y(con)l(text-sensitiv)l(e)c(p)t
+ (oin)l(ts-to)h(analysis)e(\(Data)i(Structure)h(Anal-)4080
+ 9439 y(ysis)155 b([31]\),)84 b(call)77 b(graph)i(construction,)84
+ b(and)79 b(Mo)t(d/Ref)f(analy-)4080 9614 y(sis,)60 b(and)f(in)l(terpro)
+ t(cedural)h(transformations)d(lik)l(e)i(inlining,)g(dead)4080
+ 9788 y(global)70 b(elimination,)k(dead)e(argumen)l(t)f(elimination,)j
+ (dead)e(t)l(yp)t(e)4080 9962 y(elimination,)42 b(constan)l(t)e
+ (propagation,)i(arra)l(y)e(b)t(ounds)i(c)l(hec)l(k)f(elim-)4080
+ 10137 y(ination)77 b([28],)83 b(simple)77 b(structure)h(\014eld)g
+ (reordering,)84 b(and)78 b(Auto-)p 4080 10285 1594 7
+ v 4088 10393 a Ff(7)4157 10456 y Fi(Note)73 b(that)f(shared)i
+ (libraries)e(and)h(system)f(libraries)g(ma)l(y)g(not)4080
+ 10606 y(b)t(e)64 b(a)l(v)-9 b(ailable)62 b(for)h(analysis)f(at)g(link)h
+ (time,)i(or)e(ma)l(y)g(b)t(e)h(compiled)4080 10755 y(directly)51
+ b(to)g(nativ)l(e)g(co)t(de.)p eop end
+ %%Page: 7 7
+ TeXDict begin 7 6 bop -303 -137 a Fi(matic)50 b(P)l(o)t(ol)g(Allo)t
+ (cation)h([30].)-154 37 y(The)73 b(design)g(of)g(the)g(compile-)g(and)g
+ (link-time)g(optimizers)f(in)-303 211 y(LL)-17 b(VM)53
+ b(p)t(ermit)h(the)g(use)g(of)g(a)g(w)l(ell-kno)l(wn)f(tec)l(hnique)i
+ (for)e(sp)t(eed-)-303 386 y(ing)h(up)i(in)l(terpro)t(cedural)g
+ (analysis.)77 b(A)l(t)55 b(compile-time,)g(in)l(terpro-)-303
+ 560 y(cedural)42 b(summaries)f(can)g(b)t(e)i(computed)f(for)f(eac)l(h)h
+ (function)g(in)f(the)-303 734 y(program)69 b(and)i(attac)l(hed)f(to)f
+ (the)h(LL)-17 b(VM)70 b(b)l(yteco)t(de.)125 b(The)71
+ b(link-)-303 909 y(time)44 b(in)l(terpro)t(cedural)h(optimizer)f(can)h
+ (then)g(pro)t(cess)g(these)g(in)l(ter-)-303 1083 y(pro)t(cedural)71
+ b(summaries)e(as)g(input)h(instead)g(of)g(ha)l(ving)f(to)g(com-)-303
+ 1257 y(pute)55 b(results)f(from)h(scratc)l(h.)79 b(This)55
+ b(tec)l(hnique)h(can)f(dramatically)-303 1432 y(sp)t(eed)k(up)g
+ (incremen)l(tal)g(compilation)e(when)i(a)f(small)g(n)l(um)l(b)t(er)h
+ (of)-303 1606 y(translation)42 b(units)i(are)g(mo)t(di\014ed)h([7].)65
+ b(Note)44 b(that)g(this)f(is)g(ac)l(hiev)l(ed)-303 1780
+ y(without)52 b(building)g(a)g(program)h(database)f(or)g(deferring)i
+ (the)e(com-)-303 1955 y(pilation)e(of)h(the)g(input)h(source)f(co)t(de)
+ i(un)l(til)d(link-time.)-303 2304 y Fj(3.4)198 b(Of\003ine)51
+ b(or)e(JIT)g(Nati)n(v)n(e)h(Code)g(Generation)-154 2519
+ y Fi(Before)73 b(execution,)78 b(a)73 b(co)t(de)h(generator)e(is)g
+ (used)h(to)g(translate)-303 2694 y(from)51 b(LL)-17 b(VM)52
+ b(to)f(nativ)l(e)h(co)t(de)h(for)e(the)i(target)e(platform)g(\(w)l(e)h
+ (cur-)-303 2868 y(ren)l(tly)i(supp)t(ort)h(the)g(Sparc)g(V9)g(and)g
+ (x86)f(arc)l(hitectures\),)h(in)f(one)-303 3042 y(of)59
+ b(t)l(w)l(o)f(w)l(a)l(ys.)91 b(In)60 b(the)f(\014rst)g(option,)i(the)f
+ (co)t(de)g(generator)f(is)g(run)-303 3217 y(statically)51
+ b(at)j(link)f(time)h(or)g(install)e(time,)i(to)f(generate)i(high)f(p)t
+ (er-)-303 3391 y(formance)49 b(nativ)l(e)f(co)t(de)h(for)g(the)g
+ (application,)f(using)g(p)t(ossibly)g(ex-)-303 3565 y(p)t(ensiv)l(e)63
+ b(co)t(de)h(generation)e(tec)l(hniques.)104 b(If)63 b(the)g(user)g
+ (decides)g(to)-303 3740 y(use)69 b(the)g(p)t(ost-link)g(\(run)l(time)f
+ (and)i(o\017ine\))e(optimizers,)73 b(a)c(cop)l(y)-303
+ 3914 y(of)52 b(the)g(LL)-17 b(VM)52 b(b)l(yteco)t(de)i(for)e(the)h
+ (program)f(is)f(included)j(in)l(to)d(the)-303 4089 y(executable)76
+ b(itself.)137 b(In)76 b(addition,)k(the)75 b(co)t(de)g(generator)g
+ (inserts)-303 4263 y(ligh)l(t-w)l(eigh)l(t)d(instrumen)l(tation)g(in)l
+ (to)h(the)h(program)g(to)f(iden)l(tify)-303 4437 y(frequen)l(tly)51
+ b(executed)i(regions)e(of)g(co)t(de.)-154 4612 y(Alternativ)l(ely)-13
+ b(,)37 b(a)d(just-in-time)h(Execution)f(Engine)h(can)g(b)t(e)g(used)
+ -303 4786 y(whic)l(h)69 b(in)l(v)l(ok)l(es)f(the)i(appropriate)f(co)t
+ (de)h(generator)f(at)g(run)l(time,)-303 4960 y(translating)k(one)j
+ (function)f(at)f(a)h(time)g(for)g(execution)g(\(or)g(uses)-303
+ 5135 y(the)59 b(p)t(ortable)g(LL)-17 b(VM)59 b(in)l(terpreter)g(if)g
+ (no)g(nativ)l(e)g(co)t(de)g(generator)-303 5309 y(is)k(a)l(v)-9
+ b(ailable\).)106 b(The)64 b(JIT)h(translator)d(can)j(also)e(insert)h
+ (the)g(same)-303 5483 y(instrumen)l(tation)50 b(as)h(the)g(o\017ine)g
+ (co)t(de)i(generator.)-303 5832 y Fj(3.5)198 b(Runtime)48
+ b(P)n(ath)e(Pr)l(o\002ling)i(&)f(Reoptimization)-154
+ 6048 y Fi(One)h(of)f(the)h(goals)d(of)i(the)h(LL)-17
+ b(VM)47 b(pro)9 b(ject)47 b(is)f(to)h(dev)l(elop)g(a)g(new)-303
+ 6222 y(strategy)57 b(for)h(run)l(time)h(optimization)e(of)i(ordinary)f
+ (applications.)-303 6397 y(Although)65 b(that)g(w)l(ork)g(is)g(outside)
+ g(the)g(scop)t(e)h(if)f(this)g(pap)t(er,)70 b(w)l(e)-303
+ 6571 y(brie\015y)52 b(describ)t(e)g(the)g(strategy)e(and)h(its)g(k)l
+ (ey)g(b)t(ene\014ts.)-154 6745 y(As)h(a)g(program)g(executes,)h(the)g
+ (most)e(frequen)l(tly)i(executed)h(ex-)-303 6920 y(ecution)72
+ b(paths)h(are)f(iden)l(ti\014ed)h(through)g(a)f(com)l(bination)g(of)g
+ (of-)-303 7094 y(\015ine)j(and)h(online)f(instrumen)l(tation)f([39].)
+ 139 b(The)76 b(o\017ine)f(instru-)-303 7268 y(men)l(tation)48
+ b(\(inserted)h(b)l(y)g(the)g(nativ)l(e)g(co)t(de)h(generator\))f(iden)l
+ (ti\014es)-303 7443 y(frequen)l(tly)61 b(executed)i(lo)t(op)e(regions)g
+ (in)g(the)g(co)t(de.)99 b(When)62 b(a)f(hot)-303 7617
+ y(lo)t(op)56 b(region)h(is)g(detected)h(at)f(run)l(time,)h(a)f(run)l
+ (time)g(instrumen)l(ta-)-303 7791 y(tion)e(library)h(instrumen)l(ts)g
+ (the)g(executing)h(nativ)l(e)f(co)t(de)h(to)f(iden-)-303
+ 7966 y(tify)47 b(frequen)l(tly-executed)j(paths)d(within)g(that)g
+ (region.)67 b(Once)49 b(hot)-303 8140 y(paths)63 b(are)g(iden)l
+ (ti\014ed,)k(w)l(e)d(duplicate)g(the)f(original)f(LL)-17
+ b(VM)64 b(co)t(de)-303 8314 y(in)l(to)c(a)g(trace,)k(p)t(erform)d(LL)
+ -17 b(VM)61 b(optimizations)e(on)i(it,)i(and)e(then)-303
+ 8489 y(regenerate)44 b(nativ)l(e)f(co)t(de)i(in)l(to)e(a)g(soft)l(w)l
+ (are-managed)g(trace)g(cac)l(he.)-303 8663 y(W)-13 b(e)54
+ b(then)h(insert)f(branc)l(hes)h(b)t(et)l(w)l(een)g(the)g(original)e(co)
+ t(de)i(and)f(the)-303 8837 y(new)d(nativ)l(e)g(co)t(de.)-154
+ 9012 y(The)63 b(strategy)e(describ)t(ed)j(here)f(is)f(p)t(o)l(w)l
+ (erful)g(b)t(ecause)i(it)d(com-)-303 9186 y(bines)74
+ b(the)g(follo)l(wing)e(three)i(c)l(haracteristics:)112
+ b(\(a\))73 b(Nativ)l(e)g(co)t(de)-303 9360 y(generation)63
+ b(can)h(b)t(e)g(p)t(erformed)h(ahead-of-time)f(using)f(sophisti-)-303
+ 9535 y(cated)73 b(algorithms)e(to)h(generate)i(high-p)t(erformance)g
+ (co)t(de.)134 b(\(b\))-303 9709 y(The)66 b(nativ)l(e)g(co)t(de)h
+ (generator)f(and)g(the)g(run)l(time)h(optimizer)e(can)-303
+ 9883 y(w)l(ork)48 b(together)h(since)g(they)g(are)g(b)t(oth)g(part)g
+ (of)g(the)g(LL)-17 b(VM)48 b(frame-)-303 10058 y(w)l(ork,)89
+ b(allo)l(wing)81 b(the)j(run)l(time)e(optimizer)h(to)f(exploit)g(supp)t
+ (ort)-303 10232 y(from)50 b(the)h(co)t(de)h(generator)f(\(e.g.,)f(for)g
+ (instrumen)l(tation)g(and)h(sim-)-303 10406 y(plifying)70
+ b(transformations\).)126 b(\(c\))70 b(The)i(run)l(time)f(optimizer)g
+ (can)-303 10581 y(use)43 b(high-lev)l(el)h(information)e(from)i(the)f
+ (LL)-17 b(VM)44 b(represen)l(tation)f(to)-303 10755 y(p)t(erform)52
+ b(sophisticated)e(run)l(time)h(optimizations.)4230 -137
+ y(W)-13 b(e)60 b(b)t(eliev)l(e)h(these)f(three)h(c)l(haracteristics)e
+ (together)h(represen)l(t)4080 37 y(one)49 b(\\optimal")e(design)h(p)t
+ (oin)l(t)g(for)g(a)g(run)l(time)g(optimizer)g(b)t(ecause)4080
+ 211 y(they)d(allo)l(w)e(the)i(b)t(est)f(c)l(hoice)h(in)f(three)h(k)l
+ (ey)g(asp)t(ects:)64 b(high-qualit)l(y)4080 386 y(initial)47
+ b(co)t(de)h(generation)g(\(o\017ine)g(rather)g(than)g(online\),)g(co)t
+ (op)t(era-)4080 560 y(tiv)l(e)41 b(supp)t(ort)h(from)f(the)g(co)t
+ (de-generator,)j(and)e(the)g(abilit)l(y)d(to)i(p)t(er-)4080
+ 734 y(form)h(sophisticated)g(analyses)g(and)h(optimizations)d(\(using)i
+ (LL)-17 b(VM)4080 909 y(rather)52 b(than)f(nativ)l(e)g(co)t(de)h(as)f
+ (the)g(input\).)4080 1211 y Fj(3.6)199 b(Of\003ine)30
+ b(Reoptimization)g(with)g(End\255user)g(Pr)l(o\255)4529
+ 1403 y(\002le)50 b(Inf)-5 b(ormation)4230 1619 y Fi(Because)82
+ b(the)g(LL)-17 b(VM)82 b(represen)l(tation)g(is)f(preserv)l(ed)i(p)t
+ (erma-)4080 1794 y(nen)l(tly)-13 b(,)62 b(it)d(enables)h(transparen)l
+ (t)g(o\017ine)f(optimization)g(of)g(appli-)4080 1968
+ y(cations)g(during)i(idle-time)f(on)g(an)g(end-user's)h(system.)94
+ b(Suc)l(h)61 b(an)4080 2142 y(optimizer)43 b(is)f(simply)g(a)g(mo)t
+ (di\014ed)i(v)l(ersion)e(of)h(the)g(link-time)f(in)l(ter-)4080
+ 2317 y(pro)t(cedural)36 b(optimizer,)i(but)d(with)g(a)f(greater)h
+ (emphasis)g(on)g(pro\014le-)4080 2491 y(driv)l(en)52
+ b(and)g(target-sp)t(eci\014c)f(optimizations.)4230 2665
+ y(An)j(o\017ine,)h(idle-time)f(reoptimizer)g(has)g(sev)l(eral)g(k)l(ey)
+ g(b)t(ene\014ts.)4080 2840 y(First,)59 b(as)e(noted)h(earlier,)h(unlik)
+ l(e)f(traditional)f(pro\014le-guided)i(op-)4080 3014
+ y(timizers)75 b(\(i.e.,)80 b(compile-time)75 b(or)h(link-time)f
+ (ones\),)80 b(it)75 b(can)h(use)4080 3188 y(pro\014le)62
+ b(information)d(gathered)j(from)f(end-user)h(runs)f(of)g(the)g(ap-)4080
+ 3363 y(plication.)130 b(It)72 b(can)g(ev)l(en)h(reoptimize)f(an)g
+ (application)g(m)l(ultiple)4080 3537 y(times)55 b(in)h(resp)t(onse)g
+ (to)g(c)l(hanging)f(usage)h(patterns)g(o)l(v)l(er)f(time)h(\(or)4080
+ 3711 y(optimize)i(di\013eren)l(tly)f(for)h(users)g(with)f(di\013ering)h
+ (patterns\).)87 b(Sec-)4080 3886 y(ond,)69 b(it)64 b(can)i(tailor)d
+ (the)j(co)t(de)g(to)e(detailed)h(features)g(of)g(a)g(single)4080
+ 4060 y(target)58 b(mac)l(hine,)h(whereas)g(traditional)d(binary)j
+ (distributions)e(of)4080 4234 y(co)t(de)62 b(m)l(ust)e(often)i(b)t(e)f
+ (run)h(on)f(man)l(y)g(di\013eren)l(t)g(mac)l(hine)h(con\014g-)4080
+ 4409 y(urations)68 b(with)f(compatible)i(arc)l(hitectures)f(and)h(op)t
+ (erating)f(sys-)4080 4583 y(tems.)73 b(Third,)54 b(unlik)l(e)f(the)g
+ (run)l(time)g(optimizer)g(\(whic)l(h)g(has)g(b)t(oth)4080
+ 4757 y(the)47 b(previous)f(b)t(ene\014ts\),)i(it)d(can)i(p)t(erform)g
+ (m)l(uc)l(h)f(more)h(aggressiv)l(e)4080 4932 y(optimizations)j(b)t
+ (ecause)i(it)f(is)f(run)i(o\017ine.)4230 5106 y(Nev)l(ertheless,)75
+ b(run)l(time)c(optimization)f(can)h(further)h(impro)l(v)l(e)4080
+ 5280 y(p)t(erformance)84 b(b)t(ecause)g(of)e(the)h(abilit)l(y)e(to)h(p)
+ t(erform)i(optimiza-)4080 5455 y(tions)46 b(based)g(on)g(run)l(time)h
+ (v)-9 b(alues)46 b(as)g(w)l(ell)f(as)h(path-sensitiv)l(e)g(opti-)4080
+ 5629 y(mizations)56 b(\(whic)l(h)g(can)h(cause)g(signi\014can)l(t)f(co)
+ t(de)i(gro)l(wth)e(if)g(done)4080 5804 y(aggressiv)l(ely)77
+ b(o\017ine\),)84 b(and)78 b(to)f(adaptiv)l(ely)h(optimize)g(co)t(de)g
+ (for)4080 5978 y(c)l(hanging)73 b(execution)g(b)t(eha)l(vior)g(within)g
+ (a)f(run.)133 b(F)-13 b(or)73 b(dynamic,)4080 6152 y(long-running)44
+ b(applications,)f(therefore,)j(the)d(run)l(time)h(and)f(o\017ine)4080
+ 6327 y(reoptimizers)54 b(could)g(co)t(ordinate)g(to)f(ensure)h(the)g
+ (highest)g(ac)l(hiev-)4080 6501 y(able)e(p)t(erformance.)4080
+ 6889 y Fj(4.)199 b(APPLICA)-19 b(TIONS)47 b(AND)j(EXPERIENCES)4230
+ 7105 y Fi(Sections)64 b(2)g(and)g(3)g(describ)t(e)h(the)g(design)f(of)g
+ (the)g(LL)-17 b(VM)64 b(co)t(de)4080 7279 y(represen)l(tation)71
+ b(and)g(compiler)f(arc)l(hitecture.)126 b(In)71 b(this)f(section,)4080
+ 7453 y(w)l(e)42 b(ev)-9 b(aluate)43 b(this)e(design)h(in)g(terms)f(of)h
+ (three)h(categories)e(of)h(issues:)4080 7628 y(\(a\))f(the)g(c)l
+ (haracteristics)f(of)h(the)h(represen)l(tation;)i(\(b\))d(the)h(sp)t
+ (eed)h(of)4080 7802 y(p)t(erforming)54 b(whole-program)g(analyses)f
+ (and)h(transformations)d(in)4080 7976 y(the)56 b(compiler;)i(and)e
+ (\(c\))f(illustrativ)l(e)f(uses)h(of)h(the)g(LL)-17 b(VM)55
+ b(system)4080 8151 y(for)37 b(c)l(hallenging)f(compiler)h(problems,)i
+ (fo)t(cusing)d(on)h(ho)l(w)g(the)g(no)l(v)l(el)4080 8325
+ y(capabilities)50 b(in)h(LL)-17 b(VM)51 b(b)t(ene\014t)i(these)f(uses.)
+ 4080 8627 y Fj(4.1)199 b(Repr)l(esentation)51 b(Issues)4230
+ 8843 y Fi(W)-13 b(e)48 b(ev)-9 b(aluate)48 b(three)g(imp)t(ortan)l(t)f
+ (c)l(haracteristics)g(of)g(the)h(LL)-17 b(VM)4080 9017
+ y(represen)l(tation.)91 b(First,)59 b(a)g(k)l(ey)g(asp)t(ect)g(of)f
+ (the)h(represen)l(tation)g(is)4080 9191 y(the)54 b(language-indep)t
+ (enden)l(t)h(t)l(yp)t(e)f(system.)73 b(Do)t(es)54 b(this)e(t)l(yp)t(e)i
+ (sys-)4080 9366 y(tem)c(pro)l(vide)h(an)l(y)f(useful)g(information)f
+ (when)i(it)e(can)i(b)t(e)g(violated)4080 9540 y(with)74
+ b(casts?)137 b(Second,)81 b(ho)l(w)74 b(do)g(high-lev)l(el)h(language)f
+ (features)4080 9714 y(map)54 b(on)l(to)f(the)g(LL)-17
+ b(VM)54 b(t)l(yp)t(e)g(system)e(and)i(co)t(de)h(represen)l(tation?)4080
+ 9889 y(Third,)f(ho)l(w)f(large)g(is)g(the)h(LL)-17 b(VM)53
+ b(represen)l(tation)g(when)h(written)4080 10063 y(to)d(disk?)4126
+ 10365 y Fb(4.1.1)183 b(What)46 b(value)g(does)h(type)f(information)g
+ (pr)-8 b(o)n(vide?)4230 10581 y Fi(Reliable)48 b(t)l(yp)t(e)g
+ (information)f(ab)t(out)i(programs)e(can)i(enable)g(the)4080
+ 10755 y(optimizer)e(to)g(p)t(erform)i(aggressiv)l(e)d(transformations)f
+ (that)i(w)l(ould)p eop end
+ %%Page: 8 8
+ TeXDict begin 8 7 bop -303 -137 a Fi(b)t(e)82 b(di\016cult)g
+ (otherwise,)88 b(suc)l(h)82 b(as)f(reordering)h(t)l(w)l(o)f(\014elds)h
+ (of)f(a)-303 37 y(structure)63 b(or)h(optimizing)e(memory)i(managemen)l
+ (t)f([12,)i(30].)104 b(As)-303 211 y(noted)52 b(in)g(Section)h(2.2,)e
+ (ho)l(w)l(ev)l(er,)h(declared)h(t)l(yp)t(e)g(information)e(in)-303
+ 386 y(LL)-17 b(VM)48 b(is)f(not)h(reliable)g(and)g(some)g(analysis)f
+ (\(t)l(ypically)f(including)-303 560 y(a)65 b(p)t(oin)l(ter)g
+ (analysis\))e(m)l(ust)i(c)l(hec)l(k)h(the)f(declared)h(t)l(yp)t(e)g
+ (informa-)-303 734 y(tion)71 b(b)t(efore)h(it)g(can)g(b)t(e)g(used.)130
+ b(A)72 b(k)l(ey)g(question)f(is)g(ho)l(w)g(m)l(uc)l(h)-303
+ 909 y Fh(r)-8 b(eliable)66 b Fi(t)l(yp)t(e)57 b(information)e(is)g(a)l
+ (v)-9 b(ailable)56 b(in)g(programs)f(compiled)-303 1083
+ y(to)50 b(LL)-17 b(VM?)-154 1257 y(LL)g(VM)34 b(includes)h(a)f(\015o)l
+ (w-insensitiv)l(e,)i(\014eld-sensitiv)l(e)e(and)g(con)l(text-)-303
+ 1432 y(sensitiv)l(e)63 b(p)t(oin)l(ts-to)g(analysis)f(called)i(Data)g
+ (Structure)h(Analysis)-303 1606 y(\(DSA\))51 b([31].)68
+ b(Sev)l(eral)52 b(transformations)d(in)j(LL)-17 b(VM)51
+ b(are)h(based)g(on)-303 1780 y(DSA,)45 b(including)h(Automatic)f(P)l(o)
+ t(ol)f(Allo)t(cation)g([30]\).)65 b(As)45 b(part)g(of)-303
+ 1955 y(the)38 b(analysis,)h(DSA)g(extracts)f(LL)-17 b(VM)38
+ b(t)l(yp)t(es)g(for)g(a)g(subset)g(of)g(mem-)-303 2129
+ y(ory)58 b(ob)9 b(jects)58 b(in)h(the)g(program.)90 b(It)59
+ b(do)t(es)g(this)f(b)l(y)g(using)h(declared)-303 2304
+ y(t)l(yp)t(es)34 b(in)g(the)h(LL)-17 b(VM)34 b(co)t(de)i(as)d(sp)t
+ (eculativ)l(e)i(t)l(yp)t(e)g(information,)h(and)-303
+ 2478 y(c)l(hec)l(ks)42 b(conserv)-9 b(ativ)l(ely)43 b(whether)g(memory)
+ g(accesses)f(to)g(an)h(ob)9 b(ject)-303 2652 y(are)51
+ b(consisten)l(t)f(with)h(those)f(declared)i(t)l(yp)t(es)2379
+ 2589 y Ff(8)2500 2652 y Fi(\(note)e(that)h(it)f(do)t(es)-303
+ 2827 y(not)h(p)t(erform)h(an)l(y)f(t)l(yp)t(e-inference)i(or)e(enforce)
+ h(t)l(yp)t(e)g(safet)l(y\).)-154 3001 y(F)-13 b(or)40
+ b(a)f(wide)h(range)g(of)f(b)t(enc)l(hmarks,)k(w)l(e)c(measured)h(the)g
+ Fh(fr)-8 b(action)-303 3175 y(of)70 b(static)h(lo)-8
+ b(ad)71 b(and)h(stor)-8 b(e)70 b(op)-8 b(er)g(ations)81
+ b Fi(for)68 b(whic)l(h)g(reliable)g(t)l(yp)t(e)-303 3350
+ y(information)75 b(ab)t(out)i(the)h(accessed)f(ob)9 b(jects)76
+ b(is)g(a)l(v)-9 b(ailable)76 b(using)-303 3524 y(DSA.)57
+ b(T)-13 b(able)58 b(1)f(sho)l(ws)f(this)h(statistic)e(for)i(the)g(C)g
+ (b)t(enc)l(hmarks)i(in)-303 3698 y(SPEC)46 b(CPU2000.)65
+ b(Benc)l(hmarks)47 b(written)f(in)h(a)g(more)g(disciplined)-303
+ 3873 y(st)l(yle,)55 b(\(e.g.,)g(the)h(Olden)h(and)f(Ptrdist)e(b)t(enc)l
+ (hmarks\))i(had)g(nearly)-303 4047 y(p)t(erfect)c(results,)e(scoring)h
+ (close)g(to)f(100\045)h(in)g(most)f(cases.)p -135 4256
+ 3547 7 v -138 4405 7 150 v -46 4361 a Fg(Benc)-5 b(hmark)p
+ 917 4405 V 947 4405 V 378 w(T)g(yp)5 b(ed)p 1789 4405
+ V 181 w(Un)-5 b(t)g(yp)5 b(ed)p 2637 4405 V 278 w(T)-5
+ b(yp)5 b(ed)p 3408 4405 V -138 4555 V -46 4510 a(Name)p
+ 917 4555 V 947 4555 V 634 w(Accesses)p 1789 4555 V 185
+ w(Accesses)p 2637 4555 V 179 w(P)-5 b(ercen)g(t)p 3408
+ 4555 V -135 4562 3547 7 v -135 4592 V -138 4748 7 157
+ v -46 4703 a Fi(164.gzip)p 917 4748 V 947 4748 V 894
+ w(1654)p 1789 4748 V 694 w(61)p 2637 4748 V 370 w(96.4\045)p
+ 3408 4748 V -138 4905 V -46 4860 a(175.vpr)p 917 4905
+ V 947 4905 V 941 w(4038)p 1789 4905 V 617 w(371)p 2637
+ 4905 V 370 w(91.6\045)p 3408 4905 V -138 5062 V -46 5017
+ a(176.gcc)p 917 5062 V 947 5062 V 877 w(25747)p 1789
+ 5062 V 464 w(33179)p 2637 5062 V 369 w(43.7\045)p 3408
+ 5062 V -138 5219 V -46 5174 a(177.mesa)p 917 5219 V 947
+ 5219 V 833 w(2811)p 1789 5219 V 464 w(19668)p 2637 5219
+ V 369 w(12.5\045)p 3408 5219 V -138 5376 V -46 5331 a(179.art)p
+ 917 5376 V 947 5376 V 1047 w(572)p 1789 5376 V 771 w(0)p
+ 2637 5376 V 293 w(100.0\045)p 3408 5376 V -138 5533 V
+ -46 5488 a(181.mcf)p 917 5533 V 947 5533 V 1001 w(571)p
+ 1789 5533 V 771 w(0)p 2637 5533 V 293 w(100.0\045)p 3408
+ 5533 V -138 5690 V -46 5645 a(183.equak)l(e)p 917 5690
+ V 947 5690 V 788 w(799)p 1789 5690 V 617 w(114)p 2637
+ 5690 V 370 w(87.5\045)p 3408 5690 V -138 5847 V -46 5802
+ a(186.craft)l(y)p 917 5847 V 947 5847 V 778 w(9734)p
+ 1789 5847 V 617 w(383)p 2637 5847 V 370 w(96.2\045)p
+ 3408 5847 V -138 6004 V -46 5959 a(188.ammp)p 917 6004
+ V 947 6004 V 749 w(2109)p 1789 6004 V 540 w(2598)p 2637
+ 6004 V 370 w(44.8\045)p 3408 6004 V -138 6161 V -46 6116
+ a(197.parser)p 917 6161 V 947 6161 V 756 w(1577)p 1789
+ 6161 V 540 w(2257)p 2637 6161 V 370 w(41.1\045)p 3408
+ 6161 V -138 6317 V -46 6273 a(253.p)t(erlbmk)p 917 6317
+ V 947 6317 V 613 w(9678)p 1789 6317 V 464 w(22302)p 2637
+ 6317 V 369 w(30.3\045)p 3408 6317 V -138 6474 V -46 6430
+ a(254.gap)p 917 6474 V 947 6474 V 928 w(6432)p 1789 6474
+ V 464 w(15117)p 2637 6474 V 369 w(29.8\045)p 3408 6474
+ V -138 6631 V -46 6586 a(255.v)l(ortex)p 917 6631 V 947
+ 6631 V 667 w(13397)p 1789 6631 V 540 w(8915)p 2637 6631
+ V 370 w(60.0\045)p 3408 6631 V -138 6788 V -46 6743 a(256.bzip2)p
+ 917 6788 V 947 6788 V 809 w(1011)p 1789 6788 V 694 w(52)p
+ 2637 6788 V 370 w(95.1\045)p 3408 6788 V -138 6945 V
+ -46 6900 a(300.t)l(w)l(olf)p 917 6945 V 947 6945 V 760
+ w(13028)p 1789 6945 V 540 w(1196)p 2637 6945 V 370 w(91.6\045)p
+ 3408 6945 V -135 6952 3547 7 v -138 7109 7 157 v -46
+ 7064 a(a)l(v)l(erage)p 917 7109 V 947 7109 V 1789 7109
+ V 2637 7109 V 2390 w(68.04\045)p 3408 7109 V -135 7115
+ 3547 7 v -71 7266 a(T)-13 b(able)51 b(1:)68 b Fc(Loads)51
+ b(and)g(Stores)g(whic)l(h)h(are)f(pro)l(v)-9 b(ably)52
+ b(t)l(yp)t(ed)-154 7613 y Fi(The)k(table)g(sho)l(ws)f(that)g(man)l(y)h
+ (of)g(these)g(programs)f(\(164,)h(175,)-303 7788 y(179,)44
+ b(181,)f(183,)h(186,)g(256,)g(&)g(300\))e(ha)l(v)l(e)h(a)h
+ (surprisingly)e(high)h(pro-)-303 7962 y(p)t(ortion)56
+ b(of)g(memory)g(accesses)g(with)f(reliable)h(t)l(yp)t(e)h(information,)
+ -303 8136 y(despite)40 b(using)h(a)f(language)h(that)f(do)t(es)h(not)f
+ (encourage)i(disciplined)-303 8311 y(use)d(of)g(t)l(yp)t(es.)64
+ b(The)40 b(leading)f(cause)g(of)g(loss)f(of)h(t)l(yp)t(e)g(information)
+ g(in)-303 8485 y(the)i(remaining)f(programs)h(is)e(the)j(use)e(of)h
+ (custom)f(memory)h(allo)t(ca-)-303 8659 y(tors)50 b(\(in)g(197,)g(254,)
+ g(&)h(255\),)f(inheren)l(tly)h(non-t)l(yp)t(e-safe)h(program)-303
+ 8834 y(constructs)75 b(suc)l(h)g(as)g(using)g(di\013eren)l(t)g
+ (structure)h(t)l(yp)t(es)f(for)g(the)-303 9008 y(same)43
+ b(ob)9 b(jects)43 b(in)g(di\013eren)l(t)h(places)f(\(176,)h(253)f(&)h
+ (254\))e(and)i(impre-)-303 9182 y(cision)53 b(due)i(to)f(DSA)g(\(in)g
+ (177)g(&)g(188\).)76 b(Ov)l(erall,)54 b(despite)g(the)g(use)-303
+ 9357 y(of)g(custom)h(allo)t(cators,)f(casting)g(to)g(and)i(from)e
+ Fk(void*)p Fi(,)k(and)d(other)-303 9531 y(C)48 b(tric)l(ks,)g(DSA)i(is)
+ e(still)f(able)h(to)g(v)l(erify)h(the)g(t)l(yp)t(e)g(information)f(for)
+ -303 9705 y(an)j(a)l(v)l(erage)g(of)g(68\045)f(of)h(accesses)g(across)g
+ (these)g(programs.)-154 9880 y(It)g(is)e(imp)t(ortan)l(t)h(to)g(note)g
+ (that)g(similar)f(results)g(w)l(ould)h(b)t(e)h(v)l(ery)-303
+ 10054 y(di\016cult)42 b(to)g(obtain)g(if)g(LL)-17 b(VM)43
+ b(had)g(b)t(een)h(an)e(un)l(t)l(yp)t(ed)i(represen)l(ta-)p
+ -303 10136 1594 7 v -295 10243 a Ff(8)-227 10307 y Fi(DSA)90
+ b(is)e(actually)f(quite)i(aggressiv)l(e:)141 b(it)88
+ b(can)h(often)g(extract)-303 10456 y(t)l(yp)t(e)61 b(information)g(for)
+ g(ob)9 b(jects)61 b(stored)g(in)l(to)f(and)i(loaded)g(out)f(of)-303
+ 10606 y(\\generic")35 b Fk(void*)i Fi(data)d(structure,)k(despite)d
+ (the)g(casts)f(to)g(and)h(from)-303 10755 y Fk(void*)p
+ Fi(.)4080 -137 y(tion.)67 b(In)l(tuitiv)l(ely)-13 b(,)48
+ b(c)l(hec)l(king)h(that)g(declared)g(t)l(yp)t(es)g(are)g(resp)t(ected)
+ 4080 37 y(is)k(m)l(uc)l(h)h(easier)g(than)g(inferring)g(those)f(t)l(yp)
+ t(es,)h(for)g(structure)g(and)4080 211 y(arra)l(y)48
+ b(t)l(yp)t(es)h(in)g(a)f(lo)l(w-lev)l(el)g(co)t(de)i(represen)l
+ (tation.)67 b(As)48 b(an)h(exam-)4080 386 y(ple,)60 b(an)e(earlier)g(v)
+ l(ersion)f(of)h(the)g(LL)-17 b(VM)58 b(C)f(fron)l(t-end)i(w)l(as)e
+ (based)4080 560 y(on)f(GCC's)f(R)-13 b(TL)56 b(in)l(ternal)f(represen)l
+ (tation,)i(whic)l(h)f(pro)l(vided)h(lit-)4080 734 y(tle)50
+ b(useful)h(t)l(yp)t(e)g(information,)e(and)i(b)t(oth)f(DSA)i(and)e(p)t
+ (o)t(ol)h(allo)t(ca-)4080 909 y(tion)64 b(w)l(ere)h(m)l(uc)l(h)g(less)f
+ (e\013ectiv)l(e.)108 b(Our)65 b(new)g(C/C++)g(fron)l(t-end)4080
+ 1083 y(is)55 b(based)h(on)g(the)g(GCC)g(Abstract)f(Syn)l(tax)h(T)-13
+ b(ree)56 b(represen)l(tation,)4080 1257 y(whic)l(h)c(mak)l(es)e(m)l(uc)
+ l(h)i(more)f(t)l(yp)t(e)h(information)e(a)l(v)-9 b(ailable.)4126
+ 1577 y Fb(4.1.2)183 b(How)45 b(do)i(high\255le)m(vel)f(featur)-7
+ b(es)47 b(map)f(onto)g(LL)-10 b(VM?)4230 1793 y Fi(Compared)72
+ b(to)f(source)g(languages,)76 b(LL)-17 b(VM)71 b(is)g(a)g(m)l(uc)l(h)h
+ (lo)l(w)l(er)4080 1967 y(lev)l(el)52 b(represen)l(tation.)70
+ b(Ev)l(en)52 b(C,)f(whic)l(h)i(itself)d(is)i(quite)g(lo)l(w-lev)l(el,)
+ 4080 2141 y(has)75 b(man)l(y)h(features)f(whic)l(h)h(m)l(ust)f(b)t(e)h
+ (lo)l(w)l(ered)f(b)l(y)h(a)f(compiler)4080 2316 y(targeting)87
+ b(LL)-17 b(VM.)86 b(F)-13 b(or)88 b(example,)96 b(complex)88
+ b(n)l(um)l(b)t(ers,)96 b(struc-)4080 2490 y(ture)84 b(copies,)90
+ b(unions,)h(bit-\014elds,)g(v)-9 b(ariable)83 b(sized)g(arra)l(ys,)90
+ b(and)4080 2664 y Fk(setjmp)p Fi(/)p Fk(longjmp)66 b
+ Fi(all)60 b(m)l(ust)g(b)t(e)h(lo)l(w)l(ered)g(b)l(y)g(an)f(LL)-17
+ b(VM)61 b(C)f(com-)4080 2839 y(piler.)122 b(In)70 b(order)f(for)g(the)h
+ (represen)l(tation)f(to)g(supp)t(ort)g(e\013ectiv)l(e)4080
+ 3013 y(analyses)83 b(and)h(transformations,)90 b(the)84
+ b(mapping)g(from)g(source-)4080 3187 y(language)73 b(features)g(to)f
+ (LL)-17 b(VM)73 b(should)f(capture)i(the)f(high-lev)l(el)4080
+ 3362 y(op)t(erational)51 b(b)t(eha)l(vior)h(as)e(cleanly)h(as)g(p)t
+ (ossible.)4230 3536 y(W)-13 b(e)51 b(discuss)g(this)f(issue)h(b)l(y)h
+ (using)f(C++)h(as)e(an)i(example,)f(since)4080 3710 y(it)46
+ b(is)g(the)h(ric)l(hest)g(language)f(for)h(whic)l(h)f(w)l(e)h(ha)l(v)l
+ (e)g(an)g(implemen)l(ted)4080 3885 y(fron)l(t-end.)97
+ b(W)-13 b(e)61 b(b)t(eliev)l(e)h(that)e(all)g(the)h(complex,)i
+ (high-lev)l(el)e(fea-)4080 4059 y(tures)48 b(of)f(C++)h(are)g
+ (expressed)g(clearly)f(in)g(LL)-17 b(VM,)47 b(allo)l(wing)f(their)4080
+ 4233 y(b)t(eha)l(vior)52 b(to)e(b)t(e)j(e\013ectiv)l(ely)e(analyzed)g
+ (and)h(optimized:)4302 4579 y Fl(\017)75 b Fi(Implicit)51
+ b(calls)f(\(e.g.)68 b(cop)l(y)52 b(constructors\))e(and)i(parameters)
+ 4454 4753 y(\(e.g.)67 b(`this')50 b(p)t(oin)l(ters\))h(are)g(made)h
+ (explicit.)4302 5071 y Fl(\017)75 b Fi(T)-13 b(emplates)81
+ b(are)h(fully)f(instan)l(tiated)g(b)l(y)g(the)h(C++)h(fron)l(t)4454
+ 5245 y(end)90 b(b)t(efore)h(LL)-17 b(VM)89 b(co)t(de)i(is)e(generated.)
+ 184 b(\(T)-13 b(rue)90 b(p)t(oly-)4454 5419 y(morphic)56
+ b(t)l(yp)t(es)g(in)g(other)g(languages)g(w)l(ould)g(b)t(e)g(expanded)
+ 4454 5594 y(in)l(to)66 b(equiv)-9 b(alen)l(t)67 b(co)t(de)h(using)e
+ (non-p)t(olymorphic)i(t)l(yp)t(es)f(in)4454 5768 y(LL)-17
+ b(VM.\))4302 6086 y Fl(\017)75 b Fi(Base)46 b(classes)f(are)i(expanded)
+ h(in)l(to)e(nested)h(structure)g(t)l(yp)t(es.)4454 6260
+ y(F)-13 b(or)51 b(this)g(C++)h(fragmen)l(t:)4768 6551
+ y Fk(class)80 b(base1)h({)e(int)h(Y;)f(};)4768 6725 y(class)h(base2)h
+ ({)e(float)i(X;)e(};)4768 6900 y(class)h(derived)i(:)d(base1,)i(base2)g
+ ({)e(short)h(Z;)g(};)4454 7155 y Fi(the)34 b(LL)-17 b(VM)34
+ b(t)l(yp)t(e)h(for)f(class)f Fk(derived)k Fi(is)c(`)p
+ Fl(f)78 b(f)p Fk(int)p Fl(g)p Fk(,)i Fl(f)p Fk(float)p
+ Fl(g)p Fk(,)4454 7330 y(short)h Fl(g)p Fi('.)121 b(If)69
+ b(the)h(classes)e(ha)l(v)l(e)h(virtual)g(functions,)k(a)c(v-)4454
+ 7504 y(table)48 b(p)t(oin)l(ter)g(w)l(ould)g(also)f(b)t(e)i(included)g
+ (and)g(initialized)e(at)4454 7678 y(ob)9 b(ject)51 b(allo)t(cation)f
+ (time)h(to)g(p)t(oin)l(t)g(to)g(the)h(virtual)f(function)4454
+ 7853 y(table,)f(describ)t(ed)j(b)t(elo)l(w.)4302 8171
+ y Fl(\017)75 b Fi(A)39 b(virtual)g(function)g(table)h(is)e(represen)l
+ (ted)j(as)e(a)g(global,)h Fh(c)-8 b(on-)4454 8345 y(stant)54
+ b Fi(arra)l(y)40 b(of)f(t)l(yp)t(ed)i(function)f(p)t(oin)l(ters,)i
+ (plus)d(the)i(t)l(yp)t(e-id)4454 8519 y(ob)9 b(ject)55
+ b(for)g(the)g(class.)78 b(With)55 b(this)f(represen)l(tation,)i
+ (virtual)4454 8694 y(metho)t(d)43 b(call)e(resolution)h(can)g(b)t(e)h
+ (p)t(erformed)h(b)l(y)e(the)g(LL)-17 b(VM)4454 8868 y(optimizer)44
+ b(as)g(e\013ectiv)l(ely)g(as)g(b)l(y)h(a)f(t)l(ypical)g(source)h
+ (compiler)4454 9042 y(\(more)53 b(e\013ectiv)l(ely)h(if)f(the)h(source)
+ g(compiler)f(uses)h(only)f(p)t(er-)4454 9217 y(mo)t(dule)f(instead)f
+ (of)g(cross-mo)t(dule)g(p)t(oin)l(ter)g(analysis\).)4302
+ 9535 y Fl(\017)75 b Fi(C++)101 b(exceptions)g(are)f(lo)l(w)l(ered)h(to)
+ f(the)g(`)p Fk(invoke)p Fi(')j(and)4454 9709 y(`)p Fk(unwind)p
+ Fi(')65 b(instructions)e(as)g(describ)t(ed)i(in)f(Section)g(2.4,)i(ex-)
+ 4454 9883 y(p)t(osing)i(exceptional)g(con)l(trol)f(\015o)l(w)h(in)g
+ (the)g(CF)l(G.)f(In)i(fact,)4454 10058 y(ha)l(ving)54
+ b(this)g(information)g(a)l(v)-9 b(ailable)54 b(at)h(link)f(time)h
+ (enables)4454 10232 y(LL)-17 b(VM)52 b(to)f(use)i(an)f(in)l(terpro)t
+ (cedural)h(analysis)e(to)h(eliminate)4454 10406 y(un)l(used)47
+ b(exception)g(handlers.)66 b(This)46 b(optimization)f(is)g(m)l(uc)l(h)
+ 4454 10581 y(less)d(e\013ectiv)l(e)h(if)g(done)h(on)f(a)g(p)t(er-mo)t
+ (dule)i(basis)e(in)g(a)g(source-)4454 10755 y(lev)l(el)51
+ b(compiler.)p eop end
+ %%Page: 9 9
+ TeXDict begin 9 8 bop -154 -137 a Fi(W)-13 b(e)72 b(b)t(eliev)l(e)g
+ (that)f(similarly)f(clean)h(LL)-17 b(VM)72 b(implemen)l(tations)-303
+ 37 y(exist)83 b(for)h(most)f(constructs)h(in)g(other)h(language)f
+ (families)e(lik)l(e)-303 211 y(Sc)l(heme,)45 b(the)d(ML)g(family)-13
+ b(,)43 b(SmallT)-13 b(alk,)42 b(Ja)l(v)-9 b(a)42 b(and)h(Microsoft)e
+ (CLI.)-303 386 y(W)-13 b(e)62 b(aim)g(to)g(explore)h(these)g(issues)e
+ (in)i(the)f(future,)k(and)d(prelimi-)-303 560 y(nary)54
+ b(w)l(ork)f(is)g(underw)l(a)l(y)h(on)g(the)f(implemen)l(tation)g(of)h
+ (JVM)f(and)-303 734 y(OCaml)e(fron)l(t-ends.)-258 1039
+ y Fb(4.1.3)183 b(How)46 b(compact)g(is)g(the)g(LL)-10
+ b(VM)44 b(r)-7 b(epr)g(esentation?)-154 1254 y Fi(Since)86
+ b(co)t(de)h(for)e(the)h(compiled)g(program)f(is)g(stored)g(in)g(the)
+ -303 1429 y(LL)-17 b(VM)69 b(represen)l(tation)h(throughout)f(its)g
+ (lifetime,)k(it)c(is)f(imp)t(or-)-303 1603 y(tan)l(t)43
+ b(that)g(it)g(not)h(b)t(e)g(to)t(o)g(large.)65 b(The)44
+ b(\015at,)h(three-address)f(form)g(of)-303 1777 y(LL)-17
+ b(VM)42 b(is)f(w)l(ell)g(suited)i(for)e(a)h(simple)g(linear)g(la)l(y)l
+ (out,)g(with)g(most)g(in-)-303 1952 y(structions)c(requiring)h(only)f
+ (a)h(single)f(32-bit)h(w)l(ord)f(eac)l(h)i(in)e(the)i(\014le.)-303
+ 2126 y(Figure)59 b(5)h(sho)l(ws)e(the)i(size)f(of)g(LL)-17
+ b(VM)59 b(\014les)g(for)g(SPEC)g(CPU2000)-303 2300 y(executables)j
+ (after)f(linking,)i(compared)f(to)f(nativ)l(e)g(X86)g(and)h(32-)-303
+ 2475 y(bit)47 b(Sparc)h(executables)f(compiled)h(b)l(y)f(GCC)g(3.3)f
+ (at)h(optimization)-303 2649 y(lev)l(el)k(-O3.)-303 2738
+ y
+  currentpoint currentpoint translate 0.33635 0.33635 scale neg exch
+ neg exch translate
+  -303 2738 a -303 2738 a
+  gsave currentpoint currentpoint translate 270 neg rotate neg exch
+ neg exch translate
+  -303 2738 a @beginspecial 0
+ @llx 0 @lly 612 @urx 792 @ury 6120 @rwi @setspecial
+ %%BeginDocument: figs/BytecodeSize.ps
+ %!PS-Adobe-3.0
+ %%BoundingBox: 0 0 612 792
+ %%Creator: OpenOffice.org 1.0.1 
+ %%For: lattner
+ %%CreationDate: Wed Jan 21 16:48:04 2004
+ %%Title: Untitled1
+ %%LanguageLevel: 2
+ %%DocumentData: Clean7Bit
+ %%Pages: (atend)
+ %%PageOrder: Ascend
+ %%EndComments
+ %%BeginProlog
+ /ISO1252Encoding [
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+ /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+ /at /A /B /C /D /E /F /G
+ /H /I /J /K /L /M /N /O
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+ /grave /a /b /c /d /e /f /g
+ /h /i /j /k /l /m /n /o
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde /unused
+ /Euro /unused /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
+ /circumflex /perthousand /Scaron /guilsinglleft /OE /unused /Zcaron /unused
+ /unused /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+ /tilde /trademark /scaron /guilsinglright /oe /unused /zcaron /Ydieresis
+ /space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
+ /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+ /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+ /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+ /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+ /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+ /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+ /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def
+ 
+ /psp_definefont { exch dup findfont dup length dict begin { 1 index /FID ne
+ { def } { pop pop } ifelse } forall /Encoding 3 -1 roll def
+ currentdict end exch pop definefont pop } def
+ 
+ /pathdict dup 8 dict def load begin
+ /rcmd { { currentfile 1 string readstring pop 0 get dup 32 gt { exit }
+ { pop } ifelse } loop dup 126 eq { pop exit } if 65 sub dup 16#3 and 1
+ add exch dup 16#C and -2 bitshift 16#3 and 1 add exch 16#10 and 16#10
+ eq 3 1 roll exch } def
+ /rhex { dup 1 sub exch currentfile exch string readhexstring pop dup 0
+ get dup 16#80 and 16#80 eq dup 3 1 roll { 16#7f and } if 2 index 0 3
+ -1 roll put 3 1 roll 0 0 1 5 -1 roll { 2 index exch get add 256 mul }
+ for 256 div exch pop exch { neg } if } def
+ /xcmd { rcmd exch rhex exch rhex exch 5 -1 roll add exch 4 -1 roll add
+ 1 index 1 index 5 -1 roll { moveto } { lineto } ifelse } def end
+ /readpath { 0 0 pathdict begin { xcmd } loop end pop pop } def
+ 
+ systemdict /languagelevel known not {
+ /xshow { exch dup length 0 1 3 -1 roll 1 sub { dup 3 index exch get
+ exch 2 index exch get 1 string dup 0 4 -1 roll put currentpoint 3 -1
+ roll show moveto 0 rmoveto } for pop pop } def
+ /rectangle { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0
+ rlineto closepath } def
+ /rectfill { rectangle fill } def
+ /rectstroke { rectangle stroke } def } if
+ 
+ /psp_lzwfilter { currentfile /ASCII85Decode filter /LZWDecode filter } def
+ /psp_ascii85filter { currentfile /ASCII85Decode filter } def
+ /psp_lzwstring { psp_lzwfilter 1024 string readstring } def
+ /psp_ascii85string { psp_ascii85filter 1024 string readstring } def
+ /psp_imagedict {
+ /psp_bitspercomponent { 3 eq { 1 }{ 8 } ifelse } def
+ /psp_decodearray { [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get }
+ def 7 dict dup
+ /ImageType 1 put dup
+ /Width 7 -1 roll put dup
+ /Height 5 index put dup
+ /BitsPerComponent 4 index psp_bitspercomponent put dup
+ /Decode 5 -1 roll psp_decodearray put dup
+ /ImageMatrix [1 0 0 1 0 0] dup 5 8 -1 roll put put dup
+ /DataSource 4 -1 roll 1 eq { psp_lzwfilter } { psp_ascii85filter } ifelse put
+ } def
+ %%EndProlog
+ %%Page: 1 1
+ %%PageBoundingBox: 18 18 594 774
+ %%BeginSetup
+ %
+ %%EndSetup
+ %%BeginPageSetup
+ %
+ gsave
+ [ 0 0.24 0.24 0 18 18] concat
+ gsave
+ %%EndPageSetup
+ %%BeginResource: font LuxiSans
+ %!PS-AdobeFont-1.0: LuxiSans 1.1000
+ %%CreationDate: Mon Nov 12 2001
+ % Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
+ % Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
+ 12 dict begin
+ /FontInfo 10 dict dup begin
+ /version (1.1000) readonly def
+ /Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
+ /Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
+ /FullName (Luxi Sans Regular) readonly def
+ /FamilyName (Luxi Sans) readonly def
+ /Weight (Regular) readonly def
+ /ItalicAngle 0.0 def
+ /isFixedPitch false def
+ /UnderlinePosition -36 def
+ /UnderlineThickness 72 def
+ end readonly def
+ /FontName /LuxiSans def
+ /PaintType 0 def
+ /WMode 0 def
+ /FontBBox {-215 -211 988 993} readonly def
+ /FontType 1 def
+ /FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
+ /Encoding 256 array 
+ 0 1 255 {1 index exch /.notdef put} for 
+ dup 65 /A put
+ dup 66 /B put
+ dup 67 /C put
+ dup 68 /D put
+ dup 69 /E put
+ dup 70 /F put
+ dup 71 /G put
+ dup 72 /H put
+ dup 73 /I put
+ dup 74 /J put
+ dup 75 /K put
+ dup 76 /L put
+ dup 77 /M put
+ dup 78 /N put
+ dup 79 /O put
+ dup 80 /P put
+ dup 81 /Q put
+ dup 82 /R put
+ dup 83 /S put
+ dup 84 /T put
+ dup 85 /U put
+ dup 86 /V put
+ dup 87 /W put
+ dup 88 /X put
+ dup 89 /Y put
+ dup 90 /Z put
+ dup 198 /AE put
+ dup 140 /OE put
+ dup 216 /Oslash put
+ dup 196 /Adieresis put
+ dup 193 /Aacute put
+ dup 192 /Agrave put
+ dup 194 /Acircumflex put
+ dup 195 /Atilde put
+ dup 197 /Aring put
+ dup 199 /Ccedilla put
+ dup 208 /Eth put
+ dup 203 /Edieresis put
+ dup 201 /Eacute put
+ dup 200 /Egrave put
+ dup 202 /Ecircumflex put
+ dup 207 /Idieresis put
+ dup 205 /Iacute put
+ dup 204 /Igrave put
+ dup 206 /Icircumflex put
+ dup 209 /Ntilde put
+ dup 214 /Odieresis put
+ dup 211 /Oacute put
+ dup 210 /Ograve put
+ dup 212 /Ocircumflex put
+ dup 213 /Otilde put
+ dup 138 /Scaron put
+ dup 220 /Udieresis put
+ dup 218 /Uacute put
+ dup 217 /Ugrave put
+ dup 219 /Ucircumflex put
+ dup 221 /Yacute put
+ dup 222 /Thorn put
+ dup 159 /Ydieresis put
+ dup 97 /a put
+ dup 98 /b put
+ dup 99 /c put
+ dup 100 /d put
+ dup 101 /e put
+ dup 102 /f put
+ dup 103 /g put
+ dup 104 /h put
+ dup 105 /i put
+ dup 106 /j put
+ dup 107 /k put
+ dup 108 /l put
+ dup 109 /m put
+ dup 110 /n put
+ dup 111 /o put
+ dup 112 /p put
+ dup 113 /q put
+ dup 114 /r put
+ dup 115 /s put
+ dup 116 /t put
+ dup 117 /u put
+ dup 118 /v put
+ dup 119 /w put
+ dup 120 /x put
+ dup 121 /y put
+ dup 122 /z put
+ dup 230 /ae put
+ dup 156 /oe put
+ dup 248 /oslash put
+ dup 223 /germandbls put
+ dup 228 /adieresis put
+ dup 225 /aacute put
+ dup 224 /agrave put
+ dup 226 /acircumflex put
+ dup 227 /atilde put
+ dup 229 /aring put
+ dup 231 /ccedilla put
+ dup 235 /edieresis put
+ dup 233 /eacute put
+ dup 232 /egrave put
+ dup 234 /ecircumflex put
+ dup 239 /idieresis put
+ dup 237 /iacute put
+ dup 236 /igrave put
+ dup 238 /icircumflex put
+ dup 241 /ntilde put
+ dup 246 /odieresis put
+ dup 243 /oacute put
+ dup 242 /ograve put
+ dup 244 /ocircumflex put
+ dup 245 /otilde put
+ dup 154 /scaron put
+ dup 252 /udieresis put
+ dup 250 /uacute put
+ dup 249 /ugrave put
+ dup 251 /ucircumflex put
+ dup 253 /yacute put
+ dup 240 /eth put
+ dup 254 /thorn put
+ dup 255 /ydieresis put
+ dup 49 /one put
+ dup 50 /two put
+ dup 51 /three put
+ dup 52 /four put
+ dup 53 /five put
+ dup 54 /six put
+ dup 55 /seven put
+ dup 56 /eight put
+ dup 57 /nine put
+ dup 48 /zero put
+ dup 163 /sterling put
+ dup 36 /dollar put
+ dup 162 /cent put
+ dup 131 /florin put
+ dup 128 /Euro put
+ dup 165 /yen put
+ dup 185 /onesuperior put
+ dup 178 /twosuperior put
+ dup 179 /threesuperior put
+ dup 46 /period put
+ dup 58 /colon put
+ dup 133 /ellipsis put
+ dup 44 /comma put
+ dup 59 /semicolon put
+ dup 145 /quoteleft put
+ dup 148 /quotedblright put
+ dup 147 /quotedblleft put
+ dup 132 /quotedblbase put
+ dup 33 /exclam put
+ dup 161 /exclamdown put
+ dup 63 /question put
+ dup 191 /questiondown put
+ dup 187 /guillemotright put
+ dup 171 /guillemotleft put
+ dup 155 /guilsinglright put
+ dup 139 /guilsinglleft put
+ dup 47 /slash put
+ dup 45 /hyphen put
+ dup 173 /sfthyphen put
+ dup 150 /endash put
+ dup 151 /emdash put
+ dup 40 /parenleft put
+ dup 41 /parenright put
+ dup 91 /bracketleft put
+ dup 93 /bracketright put
+ dup 38 /ampersand put
+ dup 167 /section put
+ dup 134 /dagger put
+ dup 135 /daggerdbl put
+ dup 42 /asterisk put
+ dup 39 /quotesingle put
+ dup 34 /quotedbl put
+ dup 64 /at put
+ dup 35 /numbersign put
+ dup 176 /degree put
+ dup 43 /plus put
+ dup 215 /multiply put
+ dup 247 /divide put
+ dup 61 /equal put
+ dup 153 /trademark put
+ dup 182 /paragraph put
+ dup 164 /currency put
+ dup 130 /quotesinglbase put
+ dup 146 /quoteright put
+ dup 123 /braceleft put
+ dup 125 /braceright put
+ dup 170 /ordfeminine put
+ dup 186 /ordmasculine put
+ dup 177 /plusminus put
+ dup 189 /onehalf put
+ dup 188 /onequarter put
+ dup 190 /threequarters put
+ dup 37 /percent put
+ dup 137 /perthousand put
+ dup 92 /backslash put
+ dup 168 /dieresis put
+ dup 180 /acute put
+ dup 96 /grave put
+ dup 136 /circumflex put
+ dup 152 /tilde put
+ dup 184 /cedilla put
+ dup 169 /copyright put
+ dup 174 /registered put
+ dup 32 /space put
+ dup 160 /nbspace put
+ dup 149 /bullet put
+ dup 60 /less put
+ dup 62 /greater put
+ dup 172 /logicalnot put
+ dup 94 /asciicircum put
+ dup 124 /bar put
+ dup 166 /brokenbar put
+ dup 95 /underscore put
+ dup 126 /asciitilde put
+ dup 181 /mu put
+ readonly def
+ /UniqueID 5078987 def
+ currentdict end
+ currentfile eexec
+ E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
+ F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
+ 2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
+ 592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
+ 44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
+ 9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83F2EBDEFED79F2D9B89C
+ 8EC53816C50F0AE382BCE732EEE6D88D5DBD81066D279225908FE82D1016823B
+ 76A6ECC3AE378CFA8D4858C797172833DBAD7A6E3394F8E694E1492FE4B67412
+ 7AD6A6ECC7A6ADC95E7AB30E84E5C6EAF70F5ADD2C2325538478BA68B505A016
+ 4E1EEE2C4BC00D82994B690B0A7F593DECA6BAC94DF9958F8C9D4A1B5E8CB301
+ F978E31D098ADAEF1A8B0C49BE16CF963236BC1C98BFABE641EB28E425926D7D
+ 121C3B5ED3F3B331A592397A0118B79F023A1F3427922D646B40F1535AC406FF
+ 9A6639600E9DE05CB8CB72DC1C2315FF3C04432895774FAF2E5BC8C409478E7C
+ 5E14212F16CCB01F40C090BB951FBF5866A7C22C10FC75DB5EF8F207AE4FD07B
+ 10C82861AF1C7831ACC5759E0B603A9D8292CC48BD8720C06CDFAC12C303437D
+ D3B5D1F4AF514EB57314E27DBDF3FF7C4F1B5DD60244CC8C383F433AC4D74E8A
+ E0C76F22042BCAF8E576FD489CFE0ABC503C5BCB003992FE159A65392A4AC64F
+ 4E555112A88333D6CF854A48727EF93AA0BB589426AACDC7C06FA3D61049F58C
+ 74416E873A6B6A2198A493F73834D5C19BE517A92C5ACF16093E2F797548DD37
+ FF9841B166114296FA9D03CAA6877981EC35D279B3795106CA671228224D0B4F
+ D4AF3640A59F9E44C59541F7F06DB11535289BE84587C698463286E342038704
+ 8D9B9A670A0D11A2B5C6C2E2A1E8F4AFDE915A03AE45CE5947909B1FC9A03413
+ 75AA4857E725120F78BF6CE2ECB35F685371843C3D95512572A7A0E3BD246ADE
+ AEAE95E62E9775AC24597907A8B56AEB88F46BD4B39018AB8432D9737C5CBE73
+ 77A82B56AF95293C7D0D847C7A508470CD6762AC896FE223E17730F05C9D3747
+ E340F37E7BAF694BDAC9ABDB97BC12ED7B01173D3C713E0A8E68E10DE647BB03
+ E4E67DE1972165C1796F5EBACF057A5AD7FEA38443D91ADBE54028CBA31F75EA
+ 0DA41FD14F15496382A0D8C9C27BCE1FDD6A5164F70BFA2C5B334A2D2DEF9AEC
+ F1C39CC0484EE7F97A39D31A46CE50FC7D2CC52420898E2052896488606A5328
+ FB195A9561E9D5A41A4C8117C86EDE60F80B6C70796B90EA9D3BD5BEB05E6656
+ A8BD35A2A884BF8677D05A1F8489FAEFED5C645AD23A141ABF3E78C69EBBF48D
+ 14884B29D1A4D7F03A66EEA0D0EAF7476E80EE45A894E706B5D681AEE8B31E58
+ 935CBE30E790B7A3995331BA9B0FA2F03F9A4D326F249BCAAC590345596F8369
+ 028CCB95F0D1CE8A44391C0E9526214EE28927FC98B3BF6676B1EF48DCE63F3F
+ 48695A3AC668FAD1ED3B50A1FCD29ECE9E01F8BC3012053AF96B0C7D276749B4
+ 8CF046E7406621979A92FBEB7B5DD5CBB154ED51C4A9A1C13F6223BB54F6F3BA
+ 326F6EAE74DBD8B370A25A7A1DC320E9A17CA230A868B752FA7FB1065F435BE8
+ A3EA5775CCDC33A360DDC25B2891F7D2AC399BCF6F789109CCB37DDD02BF9EB7
+ EAED7A9CE82793DF6FA7F68F9D45530A14EC91D71A19A9251BD810FBC9934F19
+ FE4FE1BED828FF3BFA6E91244AFBD8B430B53106AD18F41DF767E2DA16F57083
+ B8F66A0356F80C30B956C43416BA6E5CB805AC10ABBD18B31F8BEF14757877DF
+ 152D286CB6B478EFD4C88A3DC1745A32A56D845A7E61034C7907A7EE957A4C7D
+ A6525821611CBEF18947E727A49E0F765D648CFF974273D18A03080EEBB6211C
+ E96439F86431EFD0BCC4CA2D2D8A4FEFC65C768D28FCE6BBFAB055E0DF961A52
+ 81ACE5A300787BF4A458016DB1CDB671B4867E5F5103551007BA0F53117D733A
+ 0D3E8802208CE1C54965A28912A03CA12D9C34D7DE9599E6DAB5124713CD716D
+ 916701BE3D6318B19A9E2827E94D4FC3F4D7D5794228DC958B3FB82617CF21EF
+ D4A5129EF9051745A52DD66EC77E50F35A8793858819131F36413715416D372D
+ DBEE44AA952C566114C8E3A21EC8BB0669805F48BCB27C92E609905D39C7FB82
+ A62A627280ACF84937B0F10E132EF579B69992A1942133DA541F50CD3A51FF2F
+ C56C10C6ABDA32C83F1DBB4127843928A4F6E714E815E387588478BF941F1F74
+ E8632BD28851474673265AF4A18905C07A4EE77865CA41D23069615FD2176AB5
+ 2595D1E86B86DA9D0C416B67497B6B9FCB3E3F709C3A4E552E9EE130BAFF3810
+ C30F41795F68105BB700DE11773B6435AFD59D7815C17D2D0C33C824550CEFC3
+ 1285EE76EB1E72D6D3BFAF60973919F8FBB4E2904079F53927F7F1FEA66FE0AC
+ 5496A13D446B0FBADA61467346AAB2E5A9F61619E09C929FDE2BB660FF152DAD
+ AD834A43A906585B1B48E90D2AB718011880AD2A3431E5C9B2AAD5B9E401973B
+ AA944A69F49810FC10FF7B7FFF0BC5A2FE856D757DA569F34FD03953534315FC
+ BED3841FCAF428FBF5210F66C961BF468F25A82E0D6868D3E4B93F95F9B04BFB
+ D9B99488FC520678A862EC1AB774A0CE59CEB043230B6DFDB2309D0FECEFD69D
+ 8D49085ACB83B16034AE0835FE67AD57F38D369F4D9604CE276CBCBADA2F8C0F
+ 3230E3525204E3868B0AA1E8B387DD2567E000CCAB04929BB4F9F5DAA93914E2
+ A4C4F6C5E91C51725CC94DB972FD7B8B46C868D6D2FA9B63C84904E9C3EC77ED
+ FF4ED0FB21A310ABE4C54FC6D6D18CE039B4407F06B95CE7C262F789258D0585
+ BEB98AD999A28751FAAC37BF6ABE82331A9428F873E91254E820DA499C11F4FE
+ 85F0CC83DB4763D6B4C6B832D3AE8CFF77C0C883A0B41A21DE36A1D32DC13EF7
+ D35F3E86C7EF1D8461B171813160E56FDB2A0232D1BAFAE968A4FB67BEEEF61F
+ 7273B238C3E2371A05B71B15D8E0B460156A5FE5DA20D662247CC36385544C4B
+ A52BF88B7C20C78AA08BB0FA4835FAB7642F195D29A5EDAEEFD711169ACAEE55
+ 1350C30E459A4EF0D5E7F7C068D1EA4882230D157A51D639750E2550F96D752F
+ 97B0AC14EA6524AD772E10B6E420584990F0D622598832F519FF9CB6F6A20E79
+ 6E75AF675E3886621421E2B0DE3AB619E6D0C65AC4B7366BDBA74C76C5F6DDA8
+ 9E8D11F672D02ACF26766D7CB6185BEF931A4ED03E3745DE92BA86660BAC7865
+ 61F4A64F959A7B4D825E15FD9567A957B9C672ADADB83070795EE44D7022745A
+ 9E8B7D0C03ADE959A33ADAFD9FC69A0EEE08FEBF24674B0B6F16B31BF3BF0278
+ 68B511314B4C73FE31D640D6726EA6051A079A7F503C6C886C9DFFB6D03D2E6B
+ AAC0BAB66F9C06FC11A4D7C165CF97CCF9737899D41F602E326BF02394F6E438
+ A579EBA81C049CA9B773C10BC5BE33353775FFE01E3529DB4FDC9467564372CE
+ 1D2976040390CD1F1C0DD3DAC8936854A0E9B5074730AF4736C0E4F040759B69
+ 5AD6A1C46714E61914180D1F80ECBC33689CDFBE788204DEB11FA4E35DD610C2
+ B82E28A25991DC4E55331DB54345E3D11EC304B7B25CFB5F1762444C55AD642B
+ 8095CF31A30BD6C429497BC0904B1F06EE90FD9926125E77FD430AE3852CA235
+ 92428660C10A19470784FE02E536926779B248650A6315FB8B784DBA9D226B06
+ 09C6900E5797693983CDDCF08754C3159545042ED401B364A45A9FD7BE0AC6DA
+ ACD9120E8114EDF40F21D968935F1BF9DE05228EC140AFB1889AF353996B79C2
+ E6795E23B5D0CED1E0FB1E6A572C6746958619FAF88C368EBBD742570DB4CB4E
+ DED4D19E89AFDBF6092D5A0A48372685DD9639A32E4F91ACD9CA3A9E34D64E11
+ 9AF8E6BDF8674D52F1242D8FE11E19820F26BF1F533C34EA6471A4C96D4D5207
+ A9AE99536705F6934CB16165657EE6F6E7CAA7720D4AAFDC6C075346672B3E16
+ 001BC35A331F03524D28301FE77D9C8B5FAB0BB872D568D5B95B2DEA4322ED4D
+ 0DC15BA4F0C1D1AF924873193FB809B689646A4CF1D97A1660F953C82211E4D2
+ A58E370AF2693919EFBD3C1E18BEC7A472B20DECEBC0CF1861AFE3978C993CE2
+ 3D7E93946083689CD61E6C180B3EFA962E2BFC1D073F7FCFE39EC0F963C51C77
+ B2A77F81D20BCAF1F0B5DC1AABD9869D4497CFD90953EEE70993ADE80AB6CE15
+ 864AC0BA7FA4B666C54EDCA0A0F9F67CFBC21A3BFC4E2303F5849C130B9B7E46
+ 0A8F60048C57FF89DED4A6D5976635ED1AFB0331370E53EBEF3835107D02FEA6
+ 5E28A746BA8E0A4AD649E0CC03B6AB56398D922B96133DF7024BF83A46A0EA6B
+ E4B05CC77A461AA0FDCC59E90FBC96D16DA364C2DC55E618090800BB3E8A2D90
+ CD72A4C067A1C107EC6B0A648FDFF3D05C508C4DA9826E7082CE58C2B027C014
+ 6C001421F42F21B18221E7AAAA092EC197AF592EA3D432175856F58FE7EAFD05
+ B81FEDFADCCF38AE807B2DCD8E4260E348E3B561E72112DCD7BB0032120966E5
+ 5F131F2399D9C89AE65CB33A354903D37A9A5E480EBAAEAA485305462228C88A
+ 16F99457F7FCB1538C2BD86DCAF01F6D6404F02FD91C82562EAB72EE21268867
+ CE2C0F3A083719E62205D0090F64F694CEE7F0F38D57D01F3732839933DC0F8E
+ DF5F9CBB1FED7FB149AEF7A53C644E17A672DF4F8BD4A0ACDBCB32859117ED77
+ 82ED68468C311C51C8851ADBB6A9212DBBC84EC1B88A4AA31CC6D1F764AD69F5
+ CEBBE3F7983C3442FD91D7EBAFA16CA047165BD327BFFDC247F822314F346D2D
+ D3E28BB4C05C485438E70E62DF3E165DF4AB31B0CF7FE84F420304D3FB7D11D7
+ DA73EDB8834AC45479C13BFC5B845AF24C2F1A4711AE4BACE4D60276491D1BCA
+ E3A3667563FEF12FBE7667F1EA621D0C241E49D68B09BD92D5163246425565BC
+ FAD5051C5CEDAD508F387E192AD94FFC7184F8BD2530FC7DD585501E34AF3846
+ BB1295CF417B218758F11D342792D81C8CEC903D970E51BD263AB1BFD6E9B2C2
+ 76E1B061522A88930712D2C169877295EE5340A4D1C3F69B9874E5CE3E3C82C3
+ E7CC446BB33407B2F2B13722054B9E4286C06EB291D0410964FBF53E079D70C8
+ 1AEBE7D82ED6C7F95A0F83AE408196F9FA71BCA747448B3D94BDE6B25D9B1B17
+ 4C55496B3D0480CAF91E053B3FCD02C6140317DD0457EB98BC899CAFA6D274C5
+ 06FD587285251051CD5DEABD6E5B22A3F42189ED36F3A5DF75F8A1BAA892D296
+ 13A466A0FD134597DBCB91BBC63400CFFE7B77A8D09367F2252C22EE637A686F
+ C076ABFC10D88395D376ACE6CC23DB7F05CD6C457ACC83FEB49C6B50BDFA075C
+ ACF9D01E6DFA07227E28C3F651EB02303A658355BA5176FBAF95414C6A704FB3
+ C8025111091F5482A01628F05547A9ACB731A291F1CE05EA8D6574272DC2FC4D
+ 48006EE157BCD0AB293CABF3B6201A4D90350EEE2948A444F59C774847A5F3CE
+ 76E328F3A1AFCB732F339DED374E8FE3BF9B964C9A26B3E1C3524EB27FDA0B4B
+ EC483B16DB62FAAAB326B862529E0B284283AD28E80F362343BCC66DF8EA0E20
+ 38AFC2F98F623770538A38698293FDEF0B75E3C5D851094CE5928150C7296240
+ 1FB139409667CDEE7605B4F16339E2C4A9B94E316D7A6B271182A19CE5DDBE61
+ 458DA5B24620348E77D1EA20B096050013A299D52E51C07EB68C151F6EC394D0
+ 26D6AEEA446783C64E15E7C7602522500E789A4D38EDC317AB7CF6765DFC3190
+ FF1B84DB7A4A0194A4400DF94AEE615411313DDEBD12786D1720430E0DE1278C
+ 9AB02BF0705A2E75738D65B832DCE7751EFFEFC699B97CF4151AACA2D94623C4
+ 73748CC15AB6D1A07F5D13178979CE175326C5110B335E47A53F45818FC9E4EB
+ 5F7CB8332E12CB441FCEEACD64AC84BFEF1E858C5CDF1F0E895CF1AC75BF2105
+ D2B6B86C14E9145BE2F22792CF68CCFBD007C728E816783AFCA822730EF16766
+ 2626857E1E7C525793A38955C4F40CFB8E42F86AA9A0CBF0296F9C54626FF1BA
+ E25D62B530221D6421EDF9E5D7BE7A1311BA3AD0F48771252F4FBE4E55605F4A
+ 0A520DBE08CC94B181952D89633840FBD1F79BFFC71090E918076A9053947120
+ 70635D5EFCDE3A566101104D54B346DBECEE79FA87EBF54104904756ECF68B32
+ 2F6F26103CEE3B06A882DFFBB0B08BF9BDAE2C8D9AEF88837235BBC2CCF19C9B
+ E262B6F8748CD3B0224E2237CE0413A4AB2724B6BB3C3391CFD6E8C45AC32ACA
+ 7249A955656967035944D14823D7EBA0D4FD6F3747ED319A6B133AB8762AF94A
+ B43B1D03FCD9F63766753EC12609B8CDA51E65875B04A0DEE40F768D91715D29
+ A06076D2712CD5BB154CB9E3E77F322008C505F46FAFB3ADAA066285A50F77C5
+ 8A9695E324B6A24B1D96F4D4197EA627089D71EA7371D0D0348B8893E5261EB3
+ F41BCD40EE77A02264BAE486CB345CDEE0C00A98ED7F96A3AC6CE8C534F5CEAB
+ 889F7E3563092DFA96C44A28279AE30DCE4031150E2A4F03AAEA5E2D854D8AE1
+ 0E2DE62B83B05DD9C7F0BD5ED122FDFB6D4E5DDE5BA1C27E8961CF61119B482C
+ 69055C36E2C3A1DF9165FCD5F24CBB5D6143C9E43A0F93EB260CD66CD4BF54AB
+ 7AD064FD0D7B72E71F51464E7CF407BA9D90368ED4E9A5D11E63EC7F7E2563B6
+ 1678DB1300C88F3EB77DA3AC104B644C799344A7B93B7925991A065087ABCD6B
+ 4C72F2C60B3AB3E9B1B008DFC201E2F48E47C38ABE247B622A75ADAF193E5E9B
+ 301E0F19B8066429FC8F64E1E5D7822CEBBDF08B83A5E732FB45B211090F0A90
+ EFDF2FFC7BB6A847EA398CAE9BD0562F73DBBAEEBF83595E5774C5290373F3B1
+ 161905296921A55C4C8E9C925AA543338254E7D9855E01803A2EA96B4AD8ACF3
+ E4682030B7BA428C6C505C9F6A97567E568029A0FDA0652947ADFCB7FB74BFB6
+ F72CAB5267EE86F34D878C62DC81BBF22FFE13CB066760353039995E461AB2D2
+ 040ED87EA2CFC54F2D5BE13CC99FEBA37333228C7302A34A4F508EE6595797F3
+ 7BD211BF901C4055641869FEA3546B89D36949EE0FA2CE8DCE71842A52F05DAD
+ F63829F2B3184CF814FAA64C73B65E4ECE9B0517204981AF9957F1B6FB29BEF6
+ 8D47E887F8EC987889705FE17BDA506B1C9E521BCA46A10BD728BF9E21551C6F
+ E233316FB7F5CF3CA15F1DD7B827126C89D4EE7A4AA82FE71026107963523F09
+ 096FBD47DFD66CA1A69A4D7C076D9A2ABD9D5A87B70DF1016E29C3698AFDF479
+ 451C57823F7B5250315EC85A8E7B1367C2E9F064E2B716340EECF712EEA14886
+ 22F560B22B39BC1CF25CE9966AAF766BC606CA93C04ABBB3DCCC7E0BB8F4CF22
+ 2D37CAF0BCE43B93B2EE318BD72BA502D596EF36562A056E1413DE0700C776A2
+ 0B4791C90FC8ACA2EDA723CBED95908811C2ACFDB5258CA181AF38EA66E305A8
+ 046EC71857E31894C750CF59C4FFD7DDF405378FFA7C854A0E0E3C7BCA0AD237
+ 2023844F8E8D69C15608CBE17D84FE9C0C9404913D68B98A6BC8FB01479E0B60
+ E2E624A5B4E64213B4BF4734BD3C8B30B0E691B190B30CF2B49978BEA937BFD3
+ A18AB4FE7D77EB75837ECA25ADE86438AB48F6E2A6C7DF2CBA1A3006F4A89AC8
+ E9596510EC3FB24B33E24F8819A9129429376CDF5E84D61F79084346EFD83BE4
+ 55348D8E9BCDA1ED8096A3215600A1EAC278B99AC3FE8AC3BA9AD3B861A492CF
+ B38BEF7502F608907CD5418B768C795E3A31E7B6971E482FDF8265032FB63F2C
+ 4B9385860945B83E244B19B7769160D3E90CA5E81E39001085FB8AB7D7A855B2
+ 7F58B5AF4D7A04C214015A5112FF363981AF0C9F3A6E98C391630F839C8529D8
+ 79B2AD12D38181E9A57642AF6915E8EC894A2592A606753C7C6E67538B22B1A8
+ 18D836B53E4E775A9D745F4F0C2BDC493A1122F1DCEEC4F7E18445546FBB332F
+ 45A62F4A7D2BDA18491577A7EF07D19F1F48420944A2A8DF92D953AB628D2095
+ F02358B542AD8CFDA1E2C739EF10ABDAE3C7C17AFB2F0884175BD4BF29164836
+ 49A5AE6C7D7438D477D15F74939183B61119367149B32B38C4277EB60EEF82E6
+ AF4E94FF0D5DCFD77052C2FADBD0554964066239180611E193CAFED231F7CE82
+ 381A14BB9D908D842151883AEFA0C5C155184D2A6E82FB943792DF1D1B9ACE7D
+ 3695B87CDA9E22839448241DFE11886518AFA164707842599A964E65A2EABB2B
+ 1118F729EAADCFF6CB3DA1BD784DBC6BC6D41E895EFE4BD8355B65AAE7FCF6FA
+ 0B2E115F67B7F29210611955759DC3C52E6C67FF1AF9B69D0DC3B53867FE8DB5
+ E3E9F35BF158340E2E888D3A9DF0160F8150EBCB76D053689128B4DCE663EE5A
+ DC8526F46AF7DC1629A28BD8200EC03F6A11D2573C68580CC18B0DF7E138A6E2
+ 9C9022DD9093D3198ED133895B6EB49A5475EB0BB06016E646F3244D76218EB8
+ F26F00F8F507ABFD902788EDD8755DDAF9973C40D1B7CFF83E696C2B60AE9E33
+ DB98E520A33242F3B367287A519255AE92F2512E3BAA70DFA3D4FAA48B6E16D7
+ 167CECC79D41D27F714EB1029BF021EFCA5D4D9203062585F1C2EBCE61BDBCB8
+ A834CE84A1716F3A4FF8C8F596E5B4C607DF81D25995A76734AEC487BBB1D440
+ F1F11D2FC345317BC2928AB4F59091B4B3EED478E821E6A84ECE01C760698BF9
+ 19163E32D29ABF92C5E2805434C317C05F7B1BE3B47E26AF33FB53A720820B30
+ 771A2DCE04C0E9914B6E7A2902C4C4A91BC788FCC588C96AC517A2FFAB00889A
+ AA125ADDC939A6FAE98D809F8DB1DB49B6D1297EAACD08E94EADF3AFF59F8E0D
+ 1EF968E765BCA6FCC3D52B7DF57ACBF89E45D13F001325B796E11A5BD51AAA3C
+ 036C0AFB391EFD7984D3BC6EC248122CE2721DF837E44F58F9CCD0C06C045D2C
+ 5098854D31234CA2AE9C41B901CEE60220E0DEC181BD39A3EC3E3F355CADAEE7
+ 2BD3A09FFDA632139242B16207428E0578080CA7CD604A186154665B31877131
+ 4916A2C04C66E01C1B71821C44E5161DF2646899F1923FF90BC203D592B9C371
+ 58C88945B5D0EBABFE0924D01CF22B547CE7DFD556CB285F0BE5D9CC7AF56DDE
+ 5F61D0C66895199CDB61A39C944664CB438422E7FDFD2F3FC632058E5C8EC998
+ 673E8BA91DE92E64AC3FF9CDAA34DF107836B121B5259807ADE4324D0CE7B7CD
+ F2D94F1A5A0D2ADF7A6AFF0DDA5E98F72FC29A34B01ADD8682B57CF97610EA47
+ 5DAACF94FDB9E61CC14CD2B2CC361C9704EAC1F54E3EFBF743A551FAD5B52174
+ 486A5448637530218091DE0B4513443C8342CD18B669BFBF241C249BBC8080AB
+ 012361313B220C3943D4F82EB3A66173635047730A44797CD20753F196A19919
+ D1F75BB016E796214058908ED982F3C0D9A524C789D7F634759FDEA8C035E715
+ 190133B34E87347FC6E8C8671F50616030E5B199758E370F4E2BD838BDA6979C
+ 3815FF7625F1BD41B9C4B6BF0C7DE3DE69F1C6C1D3F4D387B9317C530A49A3ED
+ 37989944243F8DF2D60241CC6E4E5285289A7EA597D1DF92640A83360738B5A7
+ 26EB20D1E52850C829DB87E28B4717B8F2CC3C8942F38694A5DC5A5321DB5725
+ 89F49CA6D1A2AC555878CD43A023114FDE61FE8B8A08A840ECC2FBBF1041BC54
+ FF4681D0B755262384A664C98ED1D1A1A2AF0F1AE96971EE2E4A1EF9E7C0B2D4
+ A60B7A6108947C8BCCCEC3946984332F8AFE04AC9345FB60FEC9FD3534DF4E98
+ 585F371ACA9E10941CB122BB65D9AE82D16F0DDF13ED41D3A14448A83F120F7B
+ AEE9C6729E8D82DE68CA746554169CE6214842C399AF76CC78415B52508CD330
+ 0A776680685FEC3BA39A5C4AADFDE2EE53CF53C5569C54A59CB346033EA7FEA2
+ 3A5BCAF2442B4E18C9609220A1A334E71D0C4F7748F8068C3E42F3BA0D906155
+ 3EA8CBD989C0C7BEBA367E63C8484A2DF3E8EB27E50E60D09B1D71B8521336E2
+ 04EE168BD3077E6444266E1506F7D8F1A73254E5422A0FA4E5728712C3217829
+ 071803C4E65A4FDF9DDA27A2C4220EAA6F7520292FC1374DB4252886600780AB
+ BB1EB3C5F479E96AA17644BE204357F8073127B57B5058CE06C53475CF82B946
+ E7632666847BE56D1E37EF9B4CE247B80E2287B80E7C3DB45C4F90D49E0AD5C0
+ BF2B51C79F1D929FC84EC2B8EF66EA213E862A2F06759059D72931822D35695C
+ 82A834F08B21DB8F40C9BDE784C97BA483E15DEAC3552146AD67AE417836A024
+ 2F388EBB7E877AEB04C226031941BC5E00B62DF4C833303E8D09360345DD3DF2
+ 7C05793D4B8954D01DDC88C7852B722546691B0DE58D03671CA23B1F8015FE7B
+ 9E50DAD5AA41382C4E9CCB98FCEEF7785BF174171C4D386777DE16A4329C831D
+ FC04CD5AE48E6F13DEB41337FC48AD7C7B208CEC6587585768C24852122B70F5
+ DD3A54A92F38A4201C6D75C8DEB955471638A9EF4B81BC38DF39C4E4E6CEB929
+ 0B06974A9D40CD5622FF02A7D3CA2F25249A40E4F0B684E8FEE2A839FB365DE4
+ 50FB988F97B992C9E8AC58B74F840221865C6E48B044E0A1A4201490F74D82D7
+ 5383AB46CE69ACAD4B4B09F5FCF3C66A637DC529695C9442F19A15C927569161
+ 6BFEFC8CD1B7A7F3F9C67A445F8B6DCD2EE53FA25F68817012105E420A61D35D
+ 3741FBE996F921C24A4EA47CC5D2099A314183F55F4B098F3CC567E9DA4EB74F
+ 9865A8019106AFFE5C8BD34EC67228540A4F49747678FA79DAF3ECF142A4F3EE
+ 07E5B66F004EAF6FA3CBDE4782480D9541CA6E4BFDB69DAB7C72C607F56630ED
+ 2F3B78B7FCAE17BF13D3FDA9A092B0DCA9D75AD9D6EBB9DD649C3B032AF5A1E0
+ E18B31810E6CF3D26702B480D1D2F16D8A6BE47354FE17AA318AC16390AB1C4B
+ 10165DE80EA293822BB63DB8B72D78E94FADA203B0CE078A929C5B9BC681D560
+ B20A2DD69CFAC03D8F2EB16FAA431AB0E7EDC77DFC40AE2C8ECFC0CFD4A9E236
+ 15BF356CB6EAA90F6630801CCC05B577EC4A33463182DB9F40AD504669655370
+ 11CF974D7536EA8D8BDD56C268F2362E544CBC1D31E25F9E5D6F490D33026575
+ E45B367739D77DFB4D079BE7C379235C8095D6D4F52C8FF0FD4C6DFF2D6C7C0B
+ 13DBBAB39AF732C38348A4B170978410668CC1A2189A058A3EDAC1B08C09CD6B
+ ED16950A2DF3893B96CB35F551D7A8103380F1264FEEDE157C641B4783C6581C
+ 790DD7349D6703D0B61AC8196A0B787A9A1F0BD9C906CB00439FAA0A9C9CF7A2
+ 0F26A9CA013B8A737C921722C76B167269A8443FB1C894F35F7BD37EE31DA899
+ 75B4EDE61F409D8539472CE9805623105FD5E67E6FAC734A6E83151BBF93BD01
+ EE89EB5D4021777C423461554F2C2406D35FA6F94824EB29F88E20BFD6383C6B
+ 2499DF337517DFE6F01B0CF4E35C4E05EADCF5684E34B7A646F3FCCBF3811790
+ EE1B34FCA03BD9E6F65916C15C68D8E7B7D2306FBC705B90341415DB1262D49F
+ A6BB3BFCDA817AD7668A2528A76CA62AA8CDC02C9671D254B8427AA2F0CC354C
+ C9F2B673814A0637DEC6A052F3F279C23391148B4C9E761C5B811F89E737969C
+ 79E7666282A91CF9D865F25A1EA923C85660404A914C90C9CA6ED4EA1E552BF2
+ F03A64AD507EF630E917ACDAAF2CF94A6DFE99BAFB2309BF05F9B6CC991664E0
+ C477E1BE53A422CA0C85ED03933D3B210D6716E50022E0BC0DB4E5D5030A9FDC
+ 4DAE2DF78BF602F524F138F682A21CE9E1B929CAFF0F1006F289A94F5F0C9A68
+ A2DBED5009FB809985FB0E9DE0A0CD342366A329B0FB96601624415392B0CA13
+ F62538B0B96F27B6E24E8DF136800885C9A3CDD5615B8FA19529073873BC725D
+ DFB03865A17573CCDEE9572D13FD100ACA9EF2AAA0FDE0A60A3A219778146581
+ 92B520565791410F4E515A7B088C43D514B8B16BAE2A658E0AEC9E9A6E7849B4
+ 4051FFBD37916E095F56B93D56DF69B39B3AA423CF3021862F9BF963405DC9BF
+ 2A13467ED56E1EB1A8A874BA6FEB5E9B72ABF43BD10C709CC687482CF96806CF
+ 8BEFA8F7E7AD89186534A4795FA08224116ABF435509E9A6773F88589EF40C87
+ 7EDE77FE457008692EC223B98E0EF858DB4C8DFB275F6E631FBE611CF31D319E
+ C3E946180CD64A4D519BF3F311892C1A5462838271D03D5CE7C4960D675EC73B
+ 18D41303945FBA3504E55798D86E174BA38DD8B7B1D4F23109857567256AD067
+ AE8BBE62696CE29C95D4326E1BF4A5DCF73BC0C79E972518C558654D7CD8BDDF
+ 67A3E799A95B05426A1072ECAA116CA332E1D611CBA90BBF9D15DA7739FAB50F
+ E31BB619F7513BC6BC72617923EE35A2999EF78AB74EF7B3DCF32A6286EB096A
+ 920DA01F6DCF0693585165EA80543E74646D2DA147F9615D4914EB9690ABDE16
+ 92FD179A66FE9A0290AEF99733F5995943C88EAF7FB5F8B7E5CFAC2FA77EF9CC
+ 4F678820742A36D2D0AE01F11652063457DBF0A4C535708D4AF777D37E5A33C1
+ C3FBEE96010EB3112FADDE319A17ACC1AB36157CC1A5BA41B291CAFE448380FF
+ B11C7CE02791D702D70819E83C2ACD8939372B7DDD08E98D0F17940D94F825EF
+ F759BBF2BD70387DC2467AB0B21A536F5F50F2EE5368542AA42BF43008D17D4C
+ E9543A490AEA3FCB360B09198D649966BA730A06F8A2441F5408D5A7095B1A0B
+ 545FF0CFC72E831EAE74B4E3656F413CCB92A778D154F74E05BC0C1623EC926A
+ E86BBDFEBFACAA94B9A6127CB16336EE4A412B32FAF19B7C79942A8A399D9C15
+ A621EDED310FC33108673F0D6290FC882CE490FBF3FC65B26BF47A9FD3AF6BBD
+ 13539E842F08928531CDCF19DBE2CEF56C1FE7F6F617099F18CED9AD3B3B7C0B
+ 89DDD37A3CC1AEEB69C54C162ECCB17D73FA18405BD7F58B0E78021BEA22CB81
+ 1357F69CCACA5E090E658D1B6A826E621482991101CE50C62B343132BCA7E586
+ ED3DB34DFD1562D7AC57A088375B145F7ECD54BEFEED6791C53B4C0F475C0B69
+ F14A2196A701674C8845397E4BE0F13C66A2E28A98DC42EB96569E06F3D923C2
+ 18ABED5B8FF7B43DC738B9E2258D1C0F5A242350AFEAC5E95BD80C16F094246F
+ 182C53E12CE7B880D1A252999C8EBC6014AEEF1EC179C1F5175A7AD8163ED9A4
+ 07BE5B2D3EEDEB61826EFE3D65A9441701A76BFB637E5D5053988903DEF41C28
+ EAE257229172CE100FE8D5591BCF99F000C5459559B517D3818A9D65A94922E2
+ CD5517C8A5927378B580C048FF5D5E60317B469F4EE7889E4461050F2AA1B20D
+ D8A2F241D25635F195218A37F29112C2DEAAC7D8A3B1ECD4A68FCE0C24CEC87D
+ CDE22DBE1A0A73614C3DB14066448681DFAEF8D35598C6AAA8F70AF07A7DF0B6
+ 100113490C2131D5613ADC8ABC12FAA531B3EF0A45D19C72D77ED225F361BC0F
+ 86B70C9B531F4900C6CBB9500E532C5C50BCD2A1295434F1E763AC95E68D7C75
+ 2444EDA3C23FB50D2867CDA09A758D32E4E30B01EDBD02F917FED439D2F097FE
+ 0BD6B387FF89CA48E624295F91D96D6370FD42AA6A0BE14666D791E088BECB57
+ 2A391A8E87F2C6E50D188475B74CFC4F5BD1ED8D1EC22791BD31AAB92EAD4DDD
+ C7E610667BB1ABF783137436279D93A71E565923296866F9704D97AEF3876367
+ 5A063F8CD68C9223B621797F7070D5BF6F743EF717E754F94D6EBD201AB0164D
+ C240049723150C45374BBA15E0BD104091781F7CB67852002D31644B12E590DB
+ 82846375410D004AA8129575F45562C33862250858C46F72044D58FFED513301
+ F7881208CAB4E4C4459CE16CFDFC75F768CA513523C6C2AAAAE41C0A219B06C6
+ 7B4AA98F92C074356298A588B571A0A03B566128C0F62ADC9663E0EA2BB9F686
+ 609BDF8D6EB178B00E121632620CB7331995A63551F8373A22801915C7BFAAAE
+ 652D11CE7CAD9C7AB1CB646C605C6C4F2E42BCC872D94160024D4C0B2DBECB02
+ 25650FF58D1ACAE991CBB26FFB229D8355814F5CA8620C9E637F4A77AE88553E
+ E159519E232749E5D037EB2BD3DE28EFC4615515DE0F44BAABE6916F0FA7D61E
+ 2C56F5B0DD6B387A7C160EE009302BD3D1925D6372BBC8D72344100641B9A87A
+ 647386FC7F4A4F16CDCA462B9215D94E8C9068B760AC18660FA125B352FBF456
+ C145C0DDFF3E4F6D2C84937AC82BB53D0DF720BB8E0EF59CA0F1DF1AD8A139C0
+ 92DAD7B59892303822ABFD24EA1A922B09F5B4344290B3647CAF6E7622583798
+ 3DAA4155916D90B1142F2745304C46BA7E3F98F1319A3F6500C402133D8CEA89
+ A10360935E26ECDE1578D362C34DB7037FE312A5EEDC4054DB2CC52A88D2820D
+ C2ABA013AFD88CE47E09BAE8B40F7CA321DD86BAE6C82B919884C8B855D7F5E6
+ 72B791936EE754670A53E92AD0C74843D15445AF39B6C7C2B065ED1B3A29B81F
+ DFCA2F5D4191212ACB7FD331692C0ECEC8DC4F442A753F60024969BDA7E5A010
+ 3DB640453B353FCF772678C52781FD6DB32BAB10D6BC7DA3233D0DEF0EFB8B5D
+ 7009EB3F58D77C0B02B2341FB3D485EC340E80C842B6E1EC4DF85052FB2AF512
+ A48412CDA18DBBBDB5726EC1DC3D5838FABE8ACC5C3D19414DFCEAC70B857638
+ 5924531C3803BA645F902CA88F74367B09C70A1E8504F8A850100A5EB21ADE63
+ 3FB038C571150C9EBD3A75A2F670122E92855F6354919189E36374E91C59886B
+ 22899897F868B8720508F9BD5A161797F61EE40942EFB26C155359D4A6B2314F
+ CCE8C7059E214534FCC40EC602DDD283B2A931B5CA1E873773637BC9863CF916
+ 1B7B36B008EC1BB562C4FD883A631598831B1559C5D77136AD03E94DCD9C495F
+ 315470097E005FD022E53DCB7581DAB60FC791B4ED9C636E2DE5F5B22482374F
+ 088736F9E02EDAE88C55C5CEAF21EFD64EE282AB84452A1319AA8DA3695B7806
+ 0ABECD77CDC40FBF7D9FD09E1ACEF73DE682447FA18F45C93C03E7D8A70135EF
+ 2B18D6F397DD2885206DF5A8C52C89BD54B11B4F61376CA6D6342F44A57FBDFF
+ 171548EB957EB47C62C9B78FD5916FFC8B2D9F9D4B744E3D7B784BE985DC57A6
+ 92352900DF235A531109372BBD46A8B862298EB6967829DC163E55CE85F0D8B4
+ D952851ACA00BDCC981DAF1B15E5D53D29F55FFB46E81327ACC6C147B5627FCE
+ 9989428A788A98DC4DBC9DF0904DBFF8DB4C6F0BA3CDE8FE3248F29EF8003878
+ 132430F063596E34424CECC9C9FF6985D4DB0786EA1CF7D0DB7099A3C4D5E26A
+ 307080C45892678EA66C0A539C32E688222CA098EA3472814A995A5701E5307E
+ DAEB7C853A4B7B46F9910158BFC4B206F7E7CD0D9B5A1820773CBC23E6E43CD0
+ 6A4E88EF6F45285E85651FA56DA663DB16D356FEE528772A506397D9D86B3D18
+ 645D3FBC57199F8FE75913911FD64E03E24C6D0279718F7BBB0C8C502BBBA59F
+ 9B2CC3C21FACD744CED42569A8841D3867CBEBF2ED3486F5C187583E0E6B5D5E
+ 9441B9F0F659E5BE48A17B05F9D3D96F28D95D757BEF3CB83CDAE0E667F3F8B2
+ 42F4E6D5AA1511D320A2E1B96C3C7CC96A8737A70B974760159CE08941C3E06C
+ EF4B1F07AB12EAD4BA26C5C3627A231EDAB2197F8B0EB12584C9817D5BB6B39A
+ B415D59E2112DFC61B10A06EF9ED5252F9C0FF98FA4A2B49193F09F796BFC431
+ 38B88C7EC80A1E192DF7B6A0E5BA7EEFED908BB108AC20B5816DC41D57DEB1C3
+ 37E3BFD817772D44F7C1FC4F82F41685FE711220C8175D68F4C73727A6982190
+ 2894CBDA32FF2B70656B269657AEE710E75D8BB54659D46025405583BD30A344
+ EB026D2DED75300342807E34D661FECA07A39F567E0AC9053B3DE8330E6FA84C
+ 10A47732062EAD6DCFE4982DA630008C33823AAB374797946A17678938259C44
+ EE9BD6B2DBB700BD2CE90B2407DD6F7B48A62D3A9DAB971477E50CFD4F4BC72F
+ 5405120220EBCDFBF0034338D21BE2FEC949C90466E14DFDE981A70F2F6F26C6
+ 5F0A35C1ACDF277E7034066DE11C25984CB5511FBA51CA0EF84C1143F8CCB991
+ 116A2F8BDB68B1EC45CA2D0B3247F93B2905C146FB10A63104AD5F9C4B82C7A9
+ 5373F8783913A2F925B09245825E167EB08308B1691DF759C1E90FB2611AD646
+ 0F73248F56E90C86F99093486FD1B5736D4E0A6F880670C37F1AFBBF142C7865
+ C846921E34887D57187F0828675AE07826351005BC73158A2BBA59F5E9614BB5
+ B9E72334E760BEBF7E49E74F68525F9A017A34A18A1EF40ADC811DCA5D5835F1
+ 26132E606874DDC48E181F79D791DAF9B2668DDC6A833969FB573201E745DA5C
+ 8176B641258ADC5990C82F9A9C8E6EDDD446843278A83BFD4300F749EA148A28
+ 1CEB260198F38A5090427A0052FC91364EE8A2DE0317ECC66F676E2F9CAAF3D3
+ BC6E4FDDC0F31F9259EDA5AC75B969257E635391539330BF9AE0AF73738452D2
+ 6388C2975CD9727BF11E0C4E887511B0975F6813E77A08DD27826D609F0A2F12
+ 3FD49AAE57298D7D814409C4EF9C66F81A02BDF349FA0F4F8D46683A56165B06
+ CACC0EA3D648B47D501AD15F83EA655D5261DBD832A6C7131A73F3A25BFF3193
+ B9B37D19D2334F29808FE28BDF612DC38172E9F35CB9616CF9F2248B7159465F
+ FB90BB57BA61B00B4FC957644729F270FF485252643F9F16244BCF1178C7CA2B
+ CA532F178D44B8A7A47550BF1D1BD89C0A15AF41BA0735C486F61D5CDC421DAD
+ 17ECEEE048CB89F0CC319D0C3809893E441F85E2635CA10A869BFEE0B753FD0B
+ C9849370A0CF1631DE406FAA5C4A9C97EA07608ED72BBE10D82C17CEB10BC478
+ 1EA17F6336A773CCF515287E9646695A6A27E84A3ABE2EDCFC49656008B951E7
+ B3C0453409A7003D5E33F3CE248C108AA0553D8EA29F52ED17443716EC967F48
+ D3C2E15470F048D317210A67916ABE50E11F6199D769EB5C78E447D9164BFCB9
+ FA6565C7B3AEFA07018695F7D3D40868AFE8EE320D6BC24D55F972CA66BA98E5
+ 1E2149F7D205FBFF2E1C5EB06CB71F2F10A61DB1571726D0FC78F584294508A5
+ 844449982ABF95005A4DDFBE364DB40D81E573C937402ABC251B64F130BFFD0B
+ 5EEC2B739A109B89895F8EF47F6F180A4423ADCA8738735D1287AE5EE35B0CAD
+ 09086479AC06B5D0861D8EAFF2CB0EA7EFBFF7CA03CF6460DF5DC7FCD5795497
+ 57CC8EFEAF7AC8CF44670B8519825FA30825057A23DF1469CA1C14E4737FE199
+ 38064FF83880E04C863D4B16292084505129670B11BC5796C4F551770C2807BC
+ D5054771387B8FA34AB300BCA9447B952BCEEC98C72B7BA65504BF02BDAFE588
+ 0DCC68FB6AFAADECA915F572740233D78E6D3E652D6F8817B771B1E1B32BD1A3
+ 6DC2B632C92E6A2BAFD2ECC15F7316FEAB6229434E0FD979685202408F71CB8B
+ 1201512A065271EAC2BBF1B479798CF2E3A05F05F21E123C5644F701E3113EAE
+ 27B93EEA49A478484B91A844F9325CF0742AC676D55C9187EDEB708B4C8D1B1B
+ 37EF1B96CD3B554458B840A8C384B89A91D53E0C8EB72483BBB08CBD9FDA0BA1
+ 4E124713C547E137E60B37E88AD35B0FB9DCF2A29B8E191A2D8CA785576AF525
+ 938D5D856049CAFD10E949CAD5F42A390045D90F2CC97C981D1FC272435374DC
+ 3ED1E0E42C04E0984CA1E12960C2EC6BF263F4D74389F1761A6E87857967A6EA
+ 16BB17A46D36F1AD4D8BCCDB8988795D00C76677DAFC702EE863AE02392A840C
+ 03215E0CC08DC8385354022E7DD2923F419501297A3AB017FDA031D6616CEA5E
+ 888ACFBD83145CB8205DB631E632822AEEA28585015695A4B206D98EBD27BAB2
+ DADBEB6FC00C72CCA83AC401B367414306D36291AD777747A3C29E52992A8F25
+ D3DE12A79EDBF370AD7E9C4612C665C72E57B612FCC81CA23661FDEB7159CD5C
+ 1F159EB60B49085424F078081DC690399A5123240B698B7625AF0D34BFE324B6
+ A24B1D95C4BE19428DCE545E7626705A7CAED84460B44256125B829098D97FF8
+ FC319CD72C806D7BD7343ACAFD866D00AD8F5EA111E9089EF7902A56B7FFBE67
+ F9BBE8853D1734D146AEC85E28D0903A94163C1BA0F0E5220558F85966B0B787
+ 3EBE0329D0E243970B7FA61DF295E8493C92B30B2F5019D4E4F2C0C775C25AFF
+ 4F502727BAC48067217E5587EA0C6A24918AB20D6A7C7938380D1A342B76E99E
+ 0F12B4C6F5BB424E447A26CDBE25766DB8A1E7E374BAFB4EA2DD58ECBF0942FB
+ 6A54885EDA3D8CA43D8EB86A1DDC6572F468AFA03E20F0E882958AB7EA7E3ACC
+ 8DE675B4C35F6F9052E7850E7205849E8505FBDB8168C26FD29AB6E849CF6001
+ DD4FEA81FC83718F4C2F2BFA6E4C0C4FE66768B54A913D4A29499AE406B343BB
+ 450B3D7029E6C578F523974353DE37D522E8FB091EF6106819675179FD6BDBDA
+ B6A42B339DCC43717C6C12C56EB5C80EE2A7AA2FFC8097EC905DF5EF9656877C
+ 4CEA6360082D500D23BBB0AF4B4EFDF15A33360DEA36DD2591FB9DB7A1501A18
+ 6A31927BF5BFBA8FFFA22F9EBE0384939063BB305E307DDC3E595E525780CCC2
+ D4CFFFD19EA9BA61E2BD6CBABD1CE52C9B93DBED0F486833E7A252D818EA8040
+ 94213BFF2DB659ADD126AD0455EE85936D6C02E67A07B163DDC10C11B5A42327
+ 50348D881F4005572D61CC0DC9510C958A153D6434363A52DB4CB9B9E56FA46A
+ 0ABC1939A1FBD632E18C3D250798B27418403610477C6736004B1FBF6BE7561C
+ 950861BB6013CBAEF7ACC21C7096DCB7B99E8F4E17815C5D40BCF2218248AE02
+ 086353CD1E8B0856AB31A3C2474326F14D0CA9F6A0C52236D9FB89EC842DC8D4
+ 4857B0DB7F37131137AB222A517CB80C671CFF8A9A5889C8BB2ADDFCBDCADC06
+ CC2BC3540F12169D3C46E579E6185B218228603A4B3FA8AD8E840C3761C61217
+ 8861458EC8BF163C492B748FFD349E00996B78705D9DD932D6CCB6FE7D7B25C5
+ A92DEC2C6B950FECB4ADF57C5A95BF7ED12E431787DD29C6D4414FCF3C4E360A
+ 31E19B37E2722A94BCE47087C5E1845929FEB43E73D3EDA981A0FF9C0F757042
+ 48F6912DD892E2CF8880A9D1B19FF0A197921A2DC12881E913A4C7858A3B3B96
+ E9A4DA7FF3598E74D74B04B5F2545DB3B1D84E86E26AA8396D696E667C2970A0
+ DD9978187C583D415AE00359BBDDD7109C15547B9A56F978475531BE02542924
+ 65D23928DEAC21CC7D0C1E1B1BFF850ACF80E629EA46D71FCA2809061C61F65A
+ B881D56F270E8C776983E3CE0271E3F502818DB1E3EAF30D0C98BEA340673FBB
+ 23CD34CA17648735CD2A532A8B3A530C3E523CD013151B75FF664463DCB0B388
+ BF60CD928E28139A13575635F349BF70C798D0EFD52011E75A7B3A2841FC3D72
+ 65EF0CBC6286367F1F4B3A7EF9F1F4808954E6D973ADF0CB1893D49B47DBB0BA
+ AD66EA4E84BBC2F1604FDFC7C9FA0E131718053BA1BF946A6859DE3E452E05A0
+ 0E179B5F1D03659522BF22518338B6C98397F040F0E93F8E6A463D7D504D3690
+ 142E26C28172E8DB43E5DC2D45655F7D05D999F32B6BC9A9D0C89041C2031C32
+ C54C4ECD75FF3A95B871DA7155A73C3B2FFEDB148FD851AD87437BED46C10E99
+ 0BAED69E6900AA9F66D77F30873A508C6369C4F898788F8204FB5B5EEEC4068B
+ 2C58510223C6B23B668204B2423FE7146B7C5314969349CF72F100FEE07D4B8E
+ 9AF97E9B7B6EC0894C6E81DE8EFBBDD37641EDDE1D241E4C4440CC91F8E3E3BD
+ E70703769D9AF7227E7A16BE76336B46DB6573D0A195837471D18666342990BA
+ 4465913A45DCAB6420462C5FFB8BF1E546D0C5B009ED19C8B11F5E5D7A41A3DD
+ 4AA97192A047F29E8C8A195634E4778EA5F16472542D9A0B24C8741F547784B0
+ 3CB68F42169804AD537C0884BEFC4B5C0953A11F050117C86BAD3F5E151FA668
+ D83B462FC0BD10664F0962D62E31E163FBD8FEDFA0C300994421E54A9BDD620C
+ 42ADE78FED182C26595F8CD93190C4CAC7F46D7432B635725038A4FF6DCE92C3
+ 9385912E24C214AE42D5C72EC74EFE2017D4428F4961D416454F41738A6C3D2B
+ 4B59F8F915D7A5E03B6A6A9B982CD07BEEAE7760872646776324BA25AEDC88A0
+ 38A730B1FA17BE4BBAC909375FAFF664BC811439F269CE71B92CE5D30FA255EF
+ 5F5CD5ED0393DDFBBCA2C4008A6D58A1E470EED8CA803E56CFFFCD581793CE83
+ 1D49557CB4F47FAE9CEEDCFDE140E70F70D8AAB8B4A851D01F219538D8185042
+ 46E442E90954118BC348EB5896BB31B185D659503B9214885CC2600719EF8F58
+ F006E2EC11EF22C286B7F058E8F4535D7EF5F3B674FF0F5B476E8D75001ED67F
+ 48029504CD633DDEA56FC7750A9F9D707C9D3416430C210089F60B231526F4F5
+ 3962D40FD4C549EB4E494EC03DB95DEB23A6CBF25DF58F1327470CE13B9001FD
+ 04467E3C1FA4082DECD79B4CFF71E9284168794F2151C1BAFA164AD43CED97BC
+ A410DC015AD503B270D81AEBA9A963CDA9031FDAE6B51F0C1F3606A00215719D
+ 477402DA2B221AA885F6351EE8C4B17876409ACB320444E69B0DBDE6C90E4D10
+ 2F72593F2C36ECEEE2F293DDEEA74CE325E806D825F94B4280E94B8F5803A7A2
+ 3A47DECA7E1175BF08421112A67C59C1187570DA6B60528565F0AE1F9810AE20
+ E9A0990380605E0C186092B7F65E9C0F1602609DD44A8BC80376EFA0D406DE98
+ DA5E4D2BC78E67543927C6DB57C5C480CAA6D5D81041432F3EF05420341F369E
+ 499C5245507A621789317DC4C294265DB72AF96C7FE3825DBA6AB5C96773F1EB
+ 203AA5092F63C0DC5C8D47C28F86C5E41B280C77A8501F529B1AFAA5B1C64031
+ DE2E70D75D8A471E16EB1660D64F8F1000173206D82C807A7BCBE7C318934315
+ EED4B9B8403A58E18C1D4D7250FBD8DC638A3D13D1ACA9CB71D805D4809BDED7
+ 8F8732ED4C08DA5D6F705DC510892EBC39EB623095D6D7CDAE7FD01A9E4F3A63
+ 64BC83D0DA24AA2333F473ED023CF9189EAD1BFFF702E0B8E5BC6F6484B6C77F
+ E79842C4F56244E6A5816F0C76A4210F2B9A81E367A7B02CB683C6A19DF10F98
+ DEB661CF23424272183272EDFAF0871EC214A6261A93A7C8F9CD1C08CBACD9A8
+ 048961430AAEBB34A5EF5C0E321CD6C2B0AF1E3D81A8153CCE16C87CC7A24585
+ 62BBDB75E14CCC4EC692749432A52FF9827F1CA8ED6F47059CEEBBB945B701F8
+ 7ADE1DAA3C6FB9F3E95954CBDF0883BEC86A6F63C4A794634F503750B169A642
+ 3D73762550A657BF8A5B6388E41E7C8136062EE343EAF09C07FDB04A9972A91B
+ 6E9B192EF143F9E8D111CACA0540CFB62346A23938314B9EAADB27D5879E9376
+ DF4465948BBD6B1E845C90518802D5389900E1B98B68DF86066A90C7EFBAB98B
+ 58335EB75CF3E0572DE2BBA77E7F6AF3E199842DBBB7060ECAD3045E834E1BD8
+ 64BDED3FBF9306C2912811E237FF9D6CEEE5278F6613E371AAEC15620C4A2A15
+ 22150F8B1B0C81F9A18D49B2684640E7ED5CFBC31357A236FB1942982EE96B6C
+ E3C54F03A25C06968A53CB9D7FC3AE8C5B917BF33C2D4181280A0242E823E2FD
+ DDE615424F9A3FDCCBAF420542AC90A4D9856BD2C6371F75767A6BEA4F861909
+ 1444B6A5BB066C63E46B32B55F2D26B97D074661CC54BA96497B226A353CE86B
+ 62D435CC24BAC65985A947BC16218E15579F16FC8DB371582A15D3E510558BC7
+ EE6169F2D9D239F40C010AD8EC8EA128CE416E21637174D34F651E4DE30A024E
+ 0FBE8B5FEFB5C89772D5230B3AA652D6778299B048C4CB5D68455E18B66DF0AF
+ 851DF300836E15EAE115DBD03DE42716281E531D5B6994DEBB0897B97D21ADE1
+ 49F76FB3DF0FD481B322E2F3CBDE64B16BB7FFF8DAE55923757F1A65FCF48F36
+ E51BE3D300E0D251BBD18AC914B242D71E491F9CB99AE0909D326AE17D9D94F6
+ 6F8CBEC8421AE9941069126986D9C26DAAA474928B2BB477D14D7CC7A4B3301C
+ A9B795626F9FD0BFBDC870275229C5E67451D37BF4BF92090A5571158169BB81
+ D3F45B9C6D65E3DB921ACBFF42885AEF73285D3BDB6FB4B9B8C8864BE52156B5
+ B2F20F8627BBDC08D8AD002440E47A2C96D79240147936CEA7CFD7B09027FAE2
+ 60AB5109DBF7059DFF4FA0D8B8EB06DCC73A1D1405FC19CE7D23C18CF6B353F4
+ FBAF8AEC7E36B738F6B1CCD05A0B9C9A4C13D060273DCF6D39DF922B3797DCAC
+ 876E0635F4D60C3D5A5DB9715D09CA2C6D0D16B62B747BB8BFA0580D0BFC0469
+ 3D78A9331EE1C9E7D5FEB03C241B47C60E70AF08FCC5A37CD973B4C6DC83C6B7
+ 0D4BBA368135DB44092579F9FC257EFBC1CF7D915FFACB222D06C52E4E927178
+ 80EEA6947B47345342D24FC41FC24A90178BD358759247F8102EACAFB14F4BEB
+ 256AC2EA0E6D3446B1F1DB46922790290C38F16317FEB372898EA0854C333A01
+ 6A43B3DEE51F5A114B90B421C4CF9F874C8AE2CEA867C7C7A95DB46C30C1AA49
+ 6FA9F53DA9825F54B6653E509A079F2FF1C3615F0F34D04EC75EB02BF0ABF364
+ 12FB55935F20A858F30F7C86974A3485927694695DD500607183FCB73F1C3428
+ C9C24FDDFB844232A43D2C596605C70C9F0F14DE98F222CD610262EF9CB6AD1A
+ 41FE3C37051B2E591A879AA425118BFDC89B41D42E97EF93FD6E50A82B7F82B3
+ 267FD63506A2208D35FA855BED185FF6ABD8C5B5BC833D5CACF9C71AA6AB3DB4
+ 992C5BE71BB6DC0596ABBAA03F89A4FB0D77FEB283CE666DABC4AC06741D8B76
+ 05E80D80C8D95A5E340B8A23733960DC9283ADCBA0C75B0E78773B198C5A37E1
+ 27B7470CB6E15CE19E890BA07CA1A419F1F5FCC5C1CB6AFD5B530BA03585568E
+ 11063A0050CA5E8F3DCC804E440845869689478CE1D7388C4EBEF6FDFD245810
+ AB2C5860CD320AAB722534AEEB9E3483329BC97B693DCF7D3AF4D29E08E83F0F
+ A487B723EA2ACBA403B03F3D17F8380B2CCD6C269B6D201E465973BD821ED5AB
+ BC7AAEB05418DEA87619D40F4B1CD70E951CF7AD151A9B8B1A127871BFEB6997
+ 8A90798D6D075F8C74E1D3375A932A3B57136131826C83F2B4B4159456BF5DE6
+ ADBB4EE690FFD3F2D760310841CB6C21509871DF6CC08409617AB94A32FCC617
+ 632E3E8C98B5A2B3E7B4169E53C3FE3966CDDB526EA5A18DC4894660EC1C4FBA
+ 25BDA925174892535C368720C92C0EDEB4A245065266674C033D90D52009F5DC
+ 742F7289F36CE321838680EB9F8E667234E802E6EBF61B60E526E154F2BF3A43
+ 4925FD043EB471476117D86127AF7894C44DA04EDF2BACA67120DA53B1A116B2
+ B9BA47A8193D791E951735E33498D8C705E67E2986520D880110D35C0566FD8C
+ EF860427BF833331A7DF3F7EABEE61E25B667BB6A4584AECF704B45F24587AEB
+ B6DB1D7B6972FB4B4328B2160A91199CEA30020FD62EF0337A4D4F10AF923EC2
+ 247660A5AEC4D22E976972C71EBE9FD9CC9988D2E272D8FC20E15C68E9CF2621
+ 4778CD8C3CD42235F7FB33D3DA71F5D2C5CFA17421AB95587919AC1BA75C85E5
+ E459C9AA3DA52A0A8714594BE4F2AC32599DD6C3FA3340DBCCD87B8E7D567595
+ 14E3D254F660EF2C5EAB9373F33395BD7327777E3DCD4A11B7BFE54CE272439E
+ E2BCC6F8EF22672F81F20318CA95FBD8ADF3E18ED04A4E73C9B32EA493317B99
+ E7680A397A72692D0AB3877CEEB916F8D7D7E7B40D97E449F76BF4B1FDDD08E5
+ DE37609896DEBDE25CEE302A509968144061ECBB277142D3512485D11003E3DA
+ D57C8992A310C2968CDBCB65F3D975EC5E3685F0FB2D24B8E03774CAFA785BCA
+ F6AB8F5B958FB630B7DB2EFE66EC1C446E5EBF86C0F02EB9A96E582471E48BB8
+ 68AAB996C02DB531A45FD3AF2696E0A459629041E80D4B25CC6C9F60B5218C9D
+ 2BD697F050E194E664AC1F229082656351C8CBB04F8DE1584411800C19261918
+ FE7BA5FB2E4C02AB650D73B4A62E41C15D4A92EE8221C51A7C6998CE99BC505C
+ DA3F3F384215CE8EBD281393E8EFDB9EF91F03EC00DFFA1B2229D70143981563
+ 4B52A88FC1378607096431F6B8E1DF869CE2FBF2548B6C1A9D5A4E40821E3FAC
+ 9B15907958C13AB21017A3432D57A0190FCBD86287B5E2AF6DAE27E5F34D9EA3
+ 1B8DC48F1574D9484951F76BF3411788428D05874F0AF0048192CC05CA43EF70
+ E0E1358BF692F8B420358C131E06E33394317AD867CD47F5B91A075F5B72C49B
+ DF756D282F3702CE9F03BF86CFE4F51FA00D186145C002F25D4F897ECE7986A0
+ 5308DBB80B40B71FF4B776BB4B3F82782A76EEEBBBFC3278DA716868DCBC097C
+ D3D3A37B935809D7FEC58B537799E1527E7F0094B11490F9999D23D73C129A0A
+ 7048D4CBF9226064A31B3ADA9C19254A20DD1BFACABAF15B3DDB06C4D7E65591
+ 3624A68A5559C9BA94E47BC2C08AB8C6FA3E0A2494EC8B40F90E0CBF14E5076A
+ CB91AABADA49BBA79CE47E70955200256475BE67352A65C75292AA82FC3998D9
+ DB4D7E5366138B7C516819F0EDDF92351FE34CF73011FD339B0F8380B52D7C9F
+ B7EEFBEC433B3CC2EAF0BA105559172088AC7BEBED21F2243E7FA81C59554911
+ 08E9304C1C252908CA315F95A1A896C0C1F782724D3716D3236DDCB129AC356E
+ 06E4043FC93CA6BE977339C6527B4EA54EB74E89CC4E8D42F3AA2F7AA5BD9D3F
+ B7FEBDC1F174F5F594BC6AF14C89ACF1760ED6F173759AFA80476759CA2E7E80
+ 6BD05284C63764047A0AB8A545C67868236411D96751FDFFDD4990324951E071
+ 7A8E17659FCAAE93DBB7E387569959C4A4AE5F069207A13E1D1C7F40802A2D0B
+ 8B3DA376E109A1AA9A428F23B0F9B99650FDEF28AA801C1F9B7291D47880444E
+ 7EE09C0920ECD434CFF5B851A343BB70E2CFF06854E78A1F92CE831BCD253713
+ 4A92308D405B22D204FB7139CDBD1B14946F2CCAB6242DE87C5C7565EB1C9D99
+ 85CCA6865CFCD57DAA7291591A202492CD863A98E17F9AC2CD9867EB827E70D6
+ B8B81A6996ACE08112BF38BB07BB78C6C879FCF709F8D94729D06D3BAD9CBCEC
+ E85E1A08576B1B4192FF26B6F923D08EAAA58EB670D84361F9688229A9F103CB
+ 1D43978B1B067FC31CA0AEA33B5B244D7069C29B6BEF12907A78ED5128D678E1
+ 67C39DEE6E9BC38E134FC55DD7692F5219ED04924CE8163CC566BF6D6B331456
+ 4047FA2F3B2C10D95F1BA5E7E527C539144B135D3DA214B88DDD2B024E6F8F7C
+ D943E64B6097E559B860E235E2CD13395DD7177D7F93070B8C8EBADCB127162C
+ CFEC2895632A15CF1E55A525D342F96B023648E8C5479C6AA0A9BF9729DF2E70
+ DC54A2A26B1DFE7BC7669FE938FFEB7582386FDB2104E6A19042FE6DDA8F9850
+ D5AAD74050D5318F0F8D4D750A4492B50C2AA395795CD635C8A914B707B14E35
+ 844DDE1DF2912ED6B078D2685AFFB987D8C4D86A9DCEADDEAE4DA772B947299F
+ E5A438058A936C0AF23106FAA82C9D8BB8D414EC5371A2AE978F99513B7DD837
+ A6BDFF5551C9467EA26AA91C3900055EE65185DACE0D675A8BD6C9D4BE4B006A
+ FE0F89713E038B7372A86D4A40532D6AD87D2FE7B62B3D2EC605DD00377A55C4
+ E8392D8D3ACCC84664AC3E30C18D8C486E8C502196F4A36226C1538C4AFE302B
+ 846F2A87AF880514CE1CEFC5973FEB9E9A48C4E356EC79D3AC1B714E23B7562F
+ AE7199C0FA5345D37ECB4F371BA123B67CA068CF67BBDA93268F4E08A5427FD9
+ 0ECF6B33837F8A4F42B37530FA5AFFF10D8D558C9B55A930CAE49172A6D36079
+ 3F952690DC1D987F2D63015B3DD6E2642B97D7175E345E299FE57C3AF1E83E02
+ B34BD8A4244D95F7CB1AE5D501F358051477C15E534FCFE4C637E316E5701EDA
+ 1009743C789B2FD633798171F4E88DBDC447ABFC9C32701527F34BEE07FFDC36
+ 003856BFA9325A4F7D1611CC5B36A4D7604484471B74EA3D8D5A28E9DE243332
+ D3C6146772D773971E5BB3CA34D8EBD37C8F435B0BB57AC9352DFB3D09BC2C92
+ E9081DBA9D8BCBEBE3C2C42066DA13188A5DA5939BFA435FE5D2CD8466EB0EAC
+ 4F735302C75CBF6ECC96969E3AB91593FA24BA117BD0BED4E3F9A51384A5FBB0
+ BDCC7A14B31D8833C1B796B8667FAE8348A7589218988BD4C2094B1456099BCE
+ 0E925A5673C13BEF4F1D91A72B00B75524E9F2B6EEE39EDCD8436A239FD6194E
+ 02AF04CE213AF8A4DE0BEBE6103A1CA891C90F1F79E34E8D7217B59F1F8A146D
+ 94017DD36B2610883692D55453BD9300545764CA404E3699548992C65226F772
+ 19066C8DC53B6CD2E378C0773B10F16FDEE74FFD370EEC6963762A9EE64FCAD0
+ D793878A07386CDDC0B00A6E3500D50536E7CEF106105AEB4F7FD391C7825C96
+ 3D1492F6B4431AA74736462D14F63CBCDA4CA2808E3C55BDFBE668F6B1AE5F01
+ 4A4B8A8EA303C345CA242F0D9CC02F1BEDE134C6B4FFC0231CB3F16D0F5ED86B
+ 56A2D04CF64925215CC4DF3B51F59F69E99DA91BCE06D02872A60E8756EC89EC
+ 15FDA8D54067FEAC2E07483F66B00E8FBD5BAD31BB3DA45A549B205B2525BB6C
+ 74B4762CC4AD3BAF05C4A1A23B50BB22EB8D88603B7CA3052F83FBFF2D7E49D0
+ 438F3810F8076865973D1A4D2B06F3FC38498935E6CF0DF4DEEF6335403E4748
+ 611D63BFA4273A823E027AE5868907BA7124FBDF11C4E30446DBC2346B4595BF
+ 2CE8784006D1AD74432F5A3A1E5A7E6E69498995114830D4C7C9057B0AA4476C
+ A9F5F44B45861ED13CF485B3CAE0E0DA24D805B5FD78D96064EEECAD82FD881D
+ 6046574FB32545B5B9D65C46C7605925054241013115C1B0D112DABDF00B45EB
+ 11CB82077372FED9B125B9091129BEB6F8F71F093CDCC5F3ECE4A9D33B55803B
+ 33758CB9F82DF01DE13A7E8C800BEDEC6840E37AF32B40A412F6DFE46E9B0469
+ F96589AD547D14F75F9B694071F1F6F7A459EB8DB009B26B9DC8744E250A99BA
+ EA1421504C17BC772862BCE3F07EE747D57487DC8A611FEB526095B872A10902
+ 6839B37E552D2C798F761EC0F1698AE49FD98B8CCE873259B911D61724EA6C5F
+ 5AFB0E44655BF454D1D35936638684A5FA041CC0E1884E362ACBB04BBE704282
+ 86E87C674245143F5E35B598F431EA3DCCA443318EFB85242AEFABD64B8F1A21
+ CA7B1E372748A25ECCA6DED3A7E81737AEC77561723ED57A7006F96D17B8385D
+ 91BBEA3A651B5644FEF22A577543169056230A6FD1651EFC5140F2FDFDD1B417
+ 4B458D312D9B58176403D160628EAA9E99CB5CB7658DBB9A2217CFF17A3F5761
+ 39C720A5924739EABEB75FA12277C5389166FE5891B484C4F3317B2513FF0EEB
+ 18DE6D8CCF1306FD85C5C19D47C1C36BE1BC73957F8291A641E39877F3ECA3F8
+ 25A539CD09D32741C725A7F7520B288670AE6DB55BD2879005599744CB54B1BF
+ 8759C7EFFDAF992F557C13CC77A95FB0778628713ACA9A1A4F0F9B5304A2E828
+ 43F6DE633DC423B4AE3AFACE6D08A2CB7BA7CF2A0AE3D52100A3090637B446B5
+ 3D69CD48477185434B35884FF9A965BC434A6AED30C26537E14D7F5E27438F5C
+ CE5A8F4B01B0375092137154A9937719C3D6874C9D1136DC203C1F5811BE4C8C
+ 9E10437D27586D4FD8B4A8146B0C96A4F13FF403188A9EFA26D0974C731CBD7C
+ 143B1AF2EDBD2A87304C5FA205D285D324BD21C1B8CACB4F5AABDCF81186B08C
+ 19A8FCE8F94CED88BFEACF2A6E237BACEDECE38B60D581CCB5B5B5D86DB88486
+ 0123DB51D12D11E49379765CC5994D16666C886D18A8D44DD3EF0235E14156EB
+ EB767237EC9A93606E034375048396DAACA3D20F55666D0C1357222572E72404
+ 163C6F5F398A73ED1395AADF530282D61879A6DEA51473A286EA7F6243CADAE4
+ BA9342FBF4A5248C1915590189A4616A3C774304B6E88FDF20930552BCC493F5
+ 0FA5DF80C3C72608D532F4F5933A225DE0F261A1D33D866417E49DD3C5CAA669
+ 853AFB20D792FC6BA87A46049621030AC1B7176156B1D2F49A8DB24861C14445
+ 4E528E2653D4E4F41681655CAF55E57A8C1D27B60ACE5AFCFC0EC8839CD99387
+ 880E8CBAFA86B397E8E4B6B286A8BB53EB55CDEB3F8A238B15A3C1E5BD457450
+ E3DA8794F224C8EEE4A09CA8567A4E71FEADD076E0CE221A4834B817A5F5517B
+ 5FAEFA742EB1CA422822BB178B19225EC5B90387929145F7690A2ABF9043E595
+ E67E23C9482385C17038DC83B9AD1EA4B0D5E0E0A9BAF8355EA256808B55366E
+ FA65F8089A406983191238BDCA8F61C732D99E204CEFCB3F344BF39E240B8457
+ 5A6204C0257753542985E7AABE35B01B991AE9B4B10E87B3FC44BC3A14479902
+ CFA8572E0D255269B7ED30FCFA1023B8A614586C5A2722EBAEB9DB53E87BC93B
+ BDC9CABB3EA3BD4938893D2C8F2A198042744213F419C5571540E96741435FBF
+ 6AA57E260D84DCBE3A214954028AC1ED4DB2C6DE2DBF14A749647E1641A7863D
+ B91A9801261731B65BDA550A199941158AD9827527B9D37464B8614438AF6008
+ 2B285CD83AF213BC6AE6198208BE43540B76165A5D5617C01CA772BBC98F9C30
+ 52E67F6E25F7192D36A130AC18B71E38D20A724E28C109FEBA4A3F1D677C8B67
+ 42F22120C99FA00FC0122F18ABCC0D24CC32B09CA42D428508AC63E421F9C0C0
+ 87D277AD58DADEFDC187ABC7D79F8504DC1113D70D7CEA1B4783AFDA128EA7CD
+ C7860C3ABEA3BB53D7AD6EA3C116756E282C509058D599FC34B98F7022CEE941
+ 7108B44C0A6AFD98A6E79109F8685FDA6C2AFAE11BE2478FCD4E14BE04A19DE4
+ 822906ED944EDB5B532DBEA395A09C7156E45505D43215863F63B635C5A30F6F
+ C7E316DA9650D9B5EB90F6A45E36F2D2B2CC89E18A246FA7D391A7728D51B18A
+ D4C92D0E97BC88A78D5F3F5107938BAEAFADBE744EA9B9921177C86435A6475D
+ 5CB3F71FFAE0132E0F288BD509993DBF5C35A5C3B87EAEE7D3ED71B73091562E
+ 45B022CC7FF481142E18A8D98EFE703B4AC8904D275B08E51FA0DBA6C6FF4E11
+ 0D0334639A04311F6AC5ED7E2FD7E81D573B14DC0A7F5A6720D2F2F235554B8E
+ 7697BA92F17ACDD426E107A266D8DE4F774EE90C8FFE38193882015FB1FB1F77
+ DF9779C16BEBDCC6696915D5E977BB40BE17CEFDBF4BB2340B35610F2BD333A7
+ E0BBB08338C5BF12BB103756EA1BC94566FBC0F1549DE72DB4404D703DE8D566
+ 693DC9A8BD6D0679D54FE8FB5AC0934D2336600A1B528E0BED9F18B93F6CD0A1
+ 9363ED941A02704BE7C8EDB90C7CEEAF5FE0DE83DE1AD9398E42411BDBA8C9FF
+ 266FE82D375FF6B6B6B42E3C72F9D310A3CE90D112F7F0BABAA8FCD3DCBA9870
+ 91AA07E001EDB3C1B8452EAC75169E0A23C108FF9020C4CA9CF2A0E2A20E53E8
+ 42146154259263EE4BE01DFD078472363B0481B730FFF03E6B2322009818DF2F
+ 5B7BC17D57A70A9D02A1ECFB9CFAC92B4C43DA454E97EE9AB42FB800F397C403
+ 785B59D0961536165B7D5CE598913155A75310B331E633AF46A818FA0431F7B5
+ E408BBAB437A7B9B47BBC875F8B7B14B7B46A421CAA505B3C6FCE2D6B98FEEFA
+ BFC8DB0B5182FFE040461498573AFE9ACC85EC4AEDA3FA37086CFD35155115E4
+ 0F5EC7170E19913DC7EE88132663A1B1C04521A0216C73BBE09605D3D76CDEA0
+ 53C53126DF96298813CBF9FC2074167A41E9FAF05868D80CB78C1C114473667F
+ 52E8DA719E7427A6F688C5736E59FACD7B86856AF7AEAD82AEB9A3F3B76220E0
+ 1DB2ED0049230607E78DCA5CE38DA174A9CE4FEFA0EC187DE2020D472889E553
+ C988AC4A918C3CEF06EF3BB4EF02C2725D1A9EBA406967F8A4969694E929C1F8
+ 7D85E82A434C5C5E1C5D9F03AAB7FDD6DA21D3E95B0F6709BA6CCA5F37D6A7EC
+ 58CE5BD8C82FC1A5A1F0B90A6E49F14B04D8BDF6243CEE499B4303B9FC35E853
+ 1FA4804F9514F966FC5263567396E28A9F605235C797ABAEADA1C71646A2FF24
+ 2753C6D3A5348441F196294860D44C47DAF1E50B004CF0677CEDBB7FB842B7A4
+ 90E4E31E85314E9031A665CC3EC0B3F0368567E154A4A6CC206CD8AE3CD45061
+ AD67FA9594C4B3FD7BB01C6409D9C5E232323C60566E0C254DFEF45282E75676
+ 5BA6FBFAE1FEB9477BA7931C2C47F3EC2FA506E7DF6E1D4D7C60530F33F4FEF8
+ DBDB65507F002E7DA817695508896578D84E2124748EFACDD527F4190E7C8931
+ D7D30D8A7FAB5FFB4F55B8DEDFE2CB84230DDE12C54106FA697E84B320E0D508
+ ABD664C7FE500549229636138BF213EB55CB325210895024F8F748E9B8A85AD2
+ D5B1E888A503C4BCB2C5BEAFD980C202A0C580848AD9B7088A53AAF4AFE7EA35
+ D1F3E05C7D1348ED6EDEF9D477987420E79590D1EB76F33043A6D18644FD3F7E
+ E65597D5C699447573F37B082DF8D4527780A5B77A7A1C337759614B6B926183
+ 83B7585A16886CEB3A8EE1622BEAFF917B2397FD7FA803AFAF8F0DC99A0E202D
+ 795B4FE27345F3D275D29AE0A13C258C2EBEE48E5332C0064B1E08F82E2D7094
+ 705BE9F0BA6CE2ED4E7C34FD707F4DC9B586718D2FFA05108ED8F7623B9A11FA
+ 01D3A755250131A5BC85DE837F8F6E4C56721747A00830395E2274B7116C3845
+ EEA1DDF51FF498DF2F143DDDF413870FF42CC4F667802695233C8BCBFFB5BB9F
+ C416A5AD416CA61832DB67A517345F041A85AD1455D7B8580A04CED89CBC40B9
+ 6BFD0598668F99616579A960061DDBC5E4EE436730C932D645839848A1A0F5B0
+ B8DB725B2D83F436E23B81B04B3154F98DC99032AB08C897DA86C933ED50BCE1
+ 4A728A52FE09F910F7E47BC3F2DAF8C22DC78DF9EC66C2664782FA94B3B9B56E
+ 49481B999BC60526881A7AEE7DA30EAD63A32F65D3FEED5D8D6CF94BCB618A83
+ 82EBD5CB11DD9DF1527112E4AB18BA84D3006F0A0E2C2696C6730BE9C8056FA5
+ 22D5215932558B28D2CA5CCF2EF5075E928DB301202FFAFB2578BB25DFA6B1C3
+ 20077C418C1840245F73F8E9EA4C473E182A46A33C3CAFDBC0BDB2B67442BD6C
+ 77F2EDE389AA66AEA8E1047FD90830FFC5A53C05A9A5F02361953A9A6365F866
+ 68D2AFB36867724E5F1E4E15DB55CB82332AD2B50D1F4FF598743A5BD27770D2
+ E80178E01635596CC17D1625C55E7BE5C9B23FD330B1CD1AFC3B250A359F47F7
+ 25E6A837C96953EEDC5A4F3249F50435432A4268710DD9375AF252C2B1A90E67
+ 92545928DDD1FBC28971A075EF7F17AB44C51D4F5628AFC8F53B1EA0E92BB299
+ E50CC983132C0AB98BE00FD6E9E432876859B25B9835185DDF9F88BD9D1045B3
+ 3498F720E9A146FEE51225A5C72758350B48938E63D92D16EA5E700C48EA5C75
+ B493C810D5490EA12FEBB381ABBB5AFC1DBBBE50AEDCF797DDA608D4A4412F20
+ 4C697DECFA4990F5AF13CB7223442714F907D5C3E41A01CAD4744B346327D7CB
+ 2BC0B1CEBD3E711B8E63A7A28A21905488B6AE388BDEDBA2C4D81DB3E8AB4BEC
+ 105FB9C0A25BC6FF47973AAC6AA236B16D6EFE49EF27BFABBB061535970534E0
+ 04C6851F5129A7453CB74A1E4285B560ADA3D87305E0EA0BC89F0A6EEB2AC5F9
+ 14520E6F791AB083DE23866A4A84342D751D8494873F1064DD3CE7B7FEAABCAA
+ EA808E944DC0311ACFB1DF0DE76EA38DE7E33AC71EB7CC7135D94FCE33FCCCEF
+ AB068A62E2B9D20DFD65B57E7F436DBACB5E308A8E4502C37BA0E4DF7AB021B5
+ 33C6C93C8AB613AF3D96D7719E56809453BD1E0900E4AA9F01CABB634D972346
+ 081AF11A1E665F59E4BD86491205F43A6B21EFF8056478293CE34AE045DD7A57
+ 6C5C33AC194764C0DF930EDBCB162E093452D15A72934141F683498684C951D0
+ 733DB2FAAA862A3D7A4CB337366F8793A9B865D70EC280CD084E71484805D5C9
+ 7823ABCAF00585281C5F0934329F3265E38045E64752B28CFBB668C8077C39E7
+ 53704F2EBF5A95A8F6879E2135374CCF7A50EBB6DE63372975EC7A83770BDB60
+ EE4F9DA3CA3DF1E31E5B489AA62E29B92E90C3D95E2C5D9F285CF3800265D8B6
+ ED1822CD6F328059DF29C154ADEE3FB10D56D8600055A823E10D9EBFA3778A5C
+ BBCA59FE3F40EA37F67515E5F947025F64785F172213045E882BDD672F434B3B
+ 2B4BB66EBF9E85934F3F3794B9B320D1ED0AB3C3B68477A595DAC9536B2E4C47
+ E6B7057A96359B57E02F7282F35E9BB1A8F7DB62C9809BB21898B6402903487C
+ 2029C7300384B376346424D99E2CBA82126666335FA8DD0B5225823A733457EC
+ DBEBC89FA3FD249BCCF746F8434B8E60EDE335D0F515A063260D6C6F0B6F5691
+ 96CF588D856421AD4561C864E0ACF9FCCD4CFDB4EBC60656D66DA3C1DA212A55
+ 6B4617DEDA813739C6D3D07669EC10F669711A17B460C00AD47359276CB293D4
+ 79B41F1CA8CD1129A6313A2253A29DA8C2CF46997F71AF365954F5F612141198
+ 8DB049ED9F3263D3AACA68FACCED6F24BE3E5A9E602F775A79EF90AD4FB00789
+ D60896451A39A34648C7CFF8AF04BA351EFD772CD253BD902AE55EADB42E536A
+ C1E711854932A03A36D7C3863CAEC28E4FDC836265504FF8406675A625644168
+ 3FC2038FD2F050F8C23233E0481832BEA328A7FC5C45446EA919DA3ED28F8CD2
+ D8D93AF013B006C46E1508AAF9D159C348E04AA3E78119E361A34D67958DD040
+ DE1781D010C6F15D890C0EA00496E8ACA9E3440860FFF5AC4FD0507983749142
+ F92E2DC5B8082A5DFBC0CE442946ACD947E8127AAB82E5A60176735ABADE226E
+ 8A11D6D40F267030B3415603F18A59BF6F546F5C72DCB84B9810DBA500ACB230
+ 2105356AF679B3AF478E0B0FCF991FE2F2D046280CEB35647F7C63A7D6ADD948
+ D22E8714B263952E07716678B4A94B5A5764C69A6F268CD58285A82AA61BDD7F
+ 3CCD2DF266C35605FF93A95A46C44E93514094592EF43425FE5E1F49206F0551
+ DD35636F54BCE90746586FFEF34774E43D2DB09BD6A06733DB1D8648487BCCD3
+ F1DF35D24638B081A4F04A41DB88609F63CC2B720F96171360D74DE840EACFDD
+ 36E8D3172BDFD986A3F7EE97DF58B1BE6867C306C5DFBC9F625FF2F9F743A884
+ 16889BC87FC49247FFA31F3234815B6BBC0599A9463E3AEA983346F55DDF8F8C
+ A19517241D59B502D099BA9A1A254620F087DD37A20AE13AD23123873798DF22
+ F94E28ECD0B0BAA8DFD8896ADED992182F78D35FBB5CA8F95A69984FDB9480E1
+ 3D524CEA820DADCAF0184A565A18AD4B756A287880ED3125581E4F094C6D4AE5
+ 3B7C7820C12458DA98A99A97DD7F9587E9352F8AF642133C2F9E2A646B97920D
+ C9033A1E95F5F8A1EDADC9B6E7ABFD29F9CB8DB9365FC60B50BD8C0506A62EBC
+ EB8A8050C1ED1A9E0A7F975DEB2BB91EE0340BDF44538E03C102627691BEF28C
+ 4243BB73111382D1F4F2C9D328EDF7674C7CA2BFF1570E52C3034B13E805E75A
+ DC945433E1222B4A711B6508C26A4C3D0EAE6B81A664CC9024907319AA5E3423
+ F9BC4A45A2E2A1330D2D6E6D087ABB22BD7F1006C1E8763BE1338E1C993432E1
+ 654098913C062B102A53F26F4A730E0756BB4A47FE961EED2A60C6638C1EE93F
+ 75FB104D556413B2314375DB036F4225CF86CDCA28662730E5022B980EBCD6E4
+ ED29E615CDE69EE00F5DF937096A53CC303CD9A283950CBCE8BA1DC7592035AD
+ FB215A6E4D2D343FADBA32EF8B9CF34402B89CDC729DC57F526FE3CD4AD46D1F
+ 295BE9B0D53FF0CB06EFF1919E9BA9019446CB33ABE3DF3ACB7EE9F5E02F9795
+ BEF2E808CCC7FF21C9EA41C93E9672C035E37B75AEDEFC6384ADFA52A0762E41
+ 4557321D665719B7F4E43513C997DD56D526C10641CA654C19C2D35AC8CFC0FD
+ 6946C733A51BE65AE583F186BFAA4C8C112F94A24D33B435C8820F99E1D10F4F
+ BFDB89537ED95354FA009A4ED9F4E3CFBC93D8FCB674F0E1C2C4716A203389E5
+ A38E42C10A4C41EF6E63BC0B7D584A97FA508D4677F037CB1005C90816B90E96
+ 3B8AD64FC8D63E9DB21B4A8DA53C75F4BAC0137BFE9FD710D1B8E5EE3EF21E46
+ 4C6AF9F5E4676810CC19F9470FEAAB3D30F409AF9BE1BA0D03229F6F5BE5226B
+ 9471585C007D680F356F1F564D723049644039D1D3CB6124ACBE7C6BEFC36597
+ 6181E15716F691FCE490CB0F05F4E550AD35CC4D345B2BF4E85982D523BD919C
+ 73A974B806A1C8F78507798B5296D48F8A4B5BBB4D7B736C6ADBFD00D2590D3D
+ 924406CD1BB3C89636C55B1C90B69F51861A654D6683A0966FC413C1CED7CAAD
+ 243262B42908A3A16031EABCBCE4FFD02DFEBA01A0831BD1C8171D93635A1F4A
+ BAB522D93E4E00BB91F7C18B38EE47C5739C6D215E330BA68DDF5A16BB025E6D
+ EA4094D60332A289053C0380D456924C548588B9A6F0330D351B95E511E00C1E
+ 8D82BA7509A653A4EAFB2002048632D63B9883AF38567E3AC185A82B7DAF3237
+ 42DA7EE5A95115E5CE652D507D66073850363DF068282134BBB3928551DB1A18
+ 8FE10A825C388A73C1F3DB270504626154C4D6A61A750578A107F0BA4780246C
+ 6BE6C4B69611B7F01EDB605B19ECBB7A229300893504F5C32E0A3BD998194390
+ 5FA3CB3FFAEBAAA2175B85DB4B8EB762BDA274FB322FB39CCC73689232CC0A83
+ 8E1EFA281735FA00FAA4E955348A595240821D120D0C9ACB6CA8CD9ECA4980C5
+ 4B547873A58BC840A28592C3E66000CB4D7A28CAB1978083EE2847F2B681EEB5
+ 2D2D892D32904294C8E139B0FA4581782A244742226CA8911F83C1D7C98A2A92
+ 6025CBF85E82824CECDD6A9E18445BB815FE21E80DB10E2120D14DE94B453274
+ E5F65F6BBDB3146690B0B7FE4BDC1C4CC55754304AB6B61420164A88A76E8541
+ 4722CFFE8AA2664311FB7565B3F4FD6493CA2A30DDEDF03F5749515DF9214E7E
+ 0B219296F094F92637A427C30F9FB712C3E8F11533CF5C1F077E808AF37E3E39
+ 94D4B0417212312BEBF1F4F03F95A1799E3AA24352B93B2BA891DD6183DD124B
+ B9833C82F4BA2B41403233DA8ECCD88842625A8DBF00B5E3E83989273A3F7F01
+ DC31FADA68CD56C8B95479B21EBC2A295D76B68437B80DFCE037B3BF87CD2170
+ 8BAFC158730D3B2F695DD6C701C65011720B3376581D6BC79166EAECFEA6F9E0
+ 40E62651FC8C72F47B47CB2E36A4E7667B95E82C88E20921A52C76EBBCE06CFB
+ 29AB75D051007EF5BA5EAA35FACBF549A85B3B6F37E3D206F7C8D39C2085E3FA
+ 74D3211EF5E61592ADDA9092C0483B9ADEAD2C64B6778AAA14FB6CC8A4FC6EE1
+ 82999FE543B0F2DEDD7E442E0BCAD4212F38852D6F2183EF8C3DAC77666AF856
+ C410454D9F1CDD07DBBEB1547E6718FB9B79D00A9E3F744071CC75C3F48F8BBC
+ 3F09406F816A86BA4CB0D169E473AA3A62D68785283B8C5862E631A9BA78200E
+ 8718AF68C6215B68675C94B43EA901592FB2B8BBD53BFD835356FF45A200AD55
+ 3075927ECD06924B6DC3F7FD0C4FA9AE61AE9B1C332E2B996612E8D9F49257B7
+ 10D8C404213210CC338206109F6A0B5C7A1B9AD18E0979A790498C5BB0BBFE1A
+ 3F3249489FAC00A369470B697344E989099D9377DAF483C93EB7E7420DA436BD
+ 0ABA11777ADBB2716927806D95526AA226E1293E84EF76807953C52B515DB505
+ 7942B890DFB216807468A84788EC815677FBD55C02CACCDB2654585E42DA9A47
+ 16C0D5DC9D321C43C5E17EAD6E80DC8F3D11D50976FB342E1D16D2BF5C8CD121
+ 1DFC079858141F3631526ACF733A23E71C187A6E7933715841AADC7CAF7060A9
+ CBAC2B04E33B047684487D4BA94B16A4431374A8867504A4EA338E192532476C
+ D8EAD70E0CC6BD674A8AC75DC18C4E4C2E785FA52F89EFA5F0EFC6F624F30595
+ 1436CAF9F1682D2FCECD7AD11429EED4F64D82B51F8E8451802D4885418FC253
+ 41EC5ED0821E7BCAA89BD70A62D281E90938332744896875AA79038971E778D1
+ 2E350AD149AF542C44DC36C236272FB12BB8690F689C74736C6888E2884BC0C0
+ 4E105537BCF3C8F0CE8292BC5C044E2C99665F3247AC9330A516A76420D070D9
+ 0082116A6A43051DA9AC00B71879F1C9C1D43EE163635E87852088A6D3B77A4B
+ 574265A679334DE35F02698EC7884C8140207187933A36E2C577753E168F61C4
+ 21E2A3AB436CCA9C0BD7E996BACCB156867A89ED2B8F8DCB6DB9CE8FB870DE91
+ 4D1CDFA268E5BC6A4AFD1B0890998345F2754045257BF43591473F351B62AA97
+ D7307BB7AD7C8DB43A73D5EECC987F34CAB192480F570574227E2224A5CD0A07
+ 3E2BD0287A3C313EDF5781A4D9E1BF2B2B8DF35CAD3DB80E0C5B3972260BF124
+ BD3FC3EA966B57D552DE87822AFC04A46291CA66623FE48F0FADB5DD7CB571F6
+ F39F0CDD7F541C9503AF6008B389F3B1FA3743AB1774F0C9FD4EF228D1C0F9DE
+ E10F5839D69560391FC0AA8EFF9D4B83A970FE1351CF6478E4D91ADA69E3240A
+ B1B09C1F24ABE2B23CF8D74DE43E3301E60F21A12FFF51D03AC00C2B44F552F4
+ 0503BD7F3EDAE51A89BDE38ED6A4B16481E457517A7E363CCD3FACB112996A75
+ 771474432AB0F08DB7F5EA12C3036697CE979D321B7AE1E4A0C1323E05C0C4A0
+ 13C8F18B2F59A4D396182763B94A855CD4CE21E4923B6B9AB3F7A9127F5F5BCD
+ 3C4550F697B4BE1ED870525BC0EA67F994558375C9E6D28D618E9CD9675CBFE0
+ BF24A75A1B90B73079E2C7222B866C89D4D0BD9A041EF0FD603AAA9551A64C2F
+ EB53C41DF2CAC894B78F8C84510C79F11CDF8518D585A2A5018A55CB8EF9E30F
+ 77DE2200F679F9C3642ED792137130083C0F516C98B6EF34758207B799FADD76
+ E0939B3C1AB3AA12543AACC2B9BD2642B0FBF48E0427B64ACA02F1BFDC501413
+ 83E32E59F705BE89284AD702CB6F9BBB88F223ABE70B4256B8511EEE6E21E048
+ 148E8B4A7945A5A67D9819B632D86D6FA1CA5E0D040994D8165A5DC175245D68
+ 42FF80A82575AAB2B91C0472F97FDC8B537201F2E551D18CA39669DFCF0A1586
+ 370AA32695557CDE598771E158B023404861CC76464E098DC4EE83D9EE9B5250
+ FAE90B4E0B2D46BC459D99B706E8740DD701F4C5F5D1DFCF365B261405541665
+ B1E532AA3F9F03ECFF018E9FC36BFBBE50589308137B120975F70A3965582260
+ 1D975C394A11304AB7EB5A1448FC02CA062D2DF50D3611C2C00179501089BAF3
+ E57DB91CBD6812C695B0CFD658D3AA7C2C32713B18D420AF945D00850EA7A0BE
+ B98096A00D9AD0ACD656D4319377700D0BCB6FAE93A54BF27B3976B8353A6261
+ E25402861065694F507D81D099BC6E4EA8D851277A8273E6318739D74BBD7344
+ 5EEECC73CFAA72DC0B7EC2A8794A5DB64BA9D4668E3E9F330DFD7F27CB83ED92
+ C0A8480A15DCC3A16B7EABC23C594309845A4595164711333B2FBB9F877D8A9B
+ 426130F95F3D645A3336EF17DA63109B5BCCCD0EA1FD390E6F0DA649F81AFD8A
+ 1973EB6C74F7663D0BAEBBDD9B0738DBFAA9B7657E7B291E803D14F1EF7EB1C6
+ B9306C771E3A5AA3AADFE2060D2323A9758412BB6E44B95F82DCAFADDFFD1A6A
+ 7F194B3E4F67279EA49410DDCC1F7DED6C0B34515D5E203BCE36F8755EB1C2B4
+ 8184AE1B1B570817B73D46D498358C4ABBC349C283DAC96B3FB23D2981E47337
+ DCAA2F7C1010AF1C4FE80B7C22C534BE4FDCBBFB4731BF99A369E1E3D6231132
+ F5AE9D2A1D701CA8B9F7AD88A5E17BB90C305D6604986C41058C6CDB78CDD043
+ CBF6FE9D482363293156C6069C0ADBCDCF3710FC904361FA0CCAA012D3879556
+ 066E179E09FF5B001B52E838735AAAAFA899E71F2928562DA997133756576127
+ CD0FEAB3447B5EA57BE6C32701D248813EA8B93E869F2137F65D5C1A0AE5D5E4
+ 21393E16DA6FA116864D07D17B1C8F08560DA2532990E2FED66D0E0FFEFAEE49
+ 55418C41DF71AAE21318D1CFFF5B38C90F7763B278DC825CD31CE53CCE9CC805
+ C5A11B3CCE9EFCB43928C1E8482302CD6B66A2CF7CBEA7E98294F7F25C490478
+ 3080E7121F2ECAEC5F3563BA632F2E2019398B584284DF9EB96666FDF10AB2CD
+ 2D348D416D29200EA47B9F3CB5DA356DB357E0682943F0E5FA543987EEA76020
+ F633FC4553F3D4E2FA6B8666374200BA14F12E9384A8099712A2E17916C61934
+ 317D443E56D8C3B5B11B5ACF389C6DF35125D399D19EDAAA53049E119EB110D4
+ 201901CF7D967B9BFDE6A5ADACE2222CCD624B6889D3574CE6E94F956198ED5A
+ 0245956F031084B7539141D01C5B66F6DEBC3C4F2E90E7756FCA65708F755E61
+ 71533842008AF59B1A9AA5372FDDB7D0CA18BE1EC8E399B4787CDFAA931DCBBC
+ 2AE9687D973DA7EB4F2F764B8EC359017E1877F4EF5B81A4A7684F87C4F91BA4
+ 54644E4C2D45F320A4A58592AFEA5731D47A118C814136EA91A00BADC6946669
+ 5EC507D7854C1C3AFAD477A1D844A520159FCBA8AD708B522B2FF6FBF55D8A0F
+ 6FD97F7BB4C4F61DEA1237DA3B8E42409936DEDD8EACF155766889931C4A1740
+ 4C3C646904268114676AF5B0E5E614930B0836BCD5292128779645E2D8743D5B
+ 75D8442A911425C3932B61F14C97EAE0D895B97C957B9C0489D47254A4ED52DA
+ 99F6C27F314E03812E6B45B690890743EDA6CB6410952E4AACF4EDB38CC22C89
+ 2E569D597B91ED013F696F06BBA6E6549C4B74B0D6DA6C7251E744CAF092EA4B
+ D3ED88A4E5F8873528792A2549133E25C27A77F074142E38D2CAEFA2D83E7409
+ 83488D979E5EDBA0AF0EC16BD4D5E27E624765A93DCAFC7911604CD2530F754B
+ C64F3F70591B8E91B2C28DFB8A4DC3534C6C74206D562DE3567DD3C2AF1DC5CA
+ 52C91FDCC57B08E23D47A3F9E55E1CCE984991AA4701210857FD85A8C2171FAE
+ 6B08136B3A5A1D1B738D0627F2FBF722F64ACD86A083CEF02179FECC90E2E6F5
+ 3567678D46B877850E30000E2061F68102B8B8E92AF0B9183F250AAE6C1B7992
+ 6AB521E20196EE31A08892167103257B1A9671CA14DE2079CF8770EDB83BAF9F
+ 53DA650828761D27C50DE9FAD629BCAD28805CE37222CEAB505D9508558FB660
+ 04D5550F42CA25880E37B395583EB95891942B443DF0B3B8187D5715EA366766
+ E59E29DD4BB93A7D0876E35CC891EAA996CEE283EDAB491FCE06AE7B04D5A0DF
+ 31CEDEAC4FA7E7FA52A9DA00067A7D3BE15C0AD2166D5588B879E6019504F633
+ 95E783463A8C8418659F3ACA7DA1EC997D7A04D09F8D83784702EA9ECB3AE69D
+ C56A063B59A8FCA9762D3DA187DBDF3DF719778F9D2578163CA01DD9B5B78DA0
+ B5D9CF241A4B8ECFA244EE22D3B59BF9ABCE7320DEFADA12D442EAC7AECA3B40
+ 8EE795F3909C603B80DA8F2C1DD9441F84F9A41273ACF33D03F111FD78259500
+ 9BBBA8C3F021C09AD376B170C1C5FDCE2F8882593219D3955D73C0F9827A0A00
+ 262B4D50A92969469C1A3399F8580B67BA618D99947CC2D6001749FF6E90B2CC
+ 07617E54B52DC6C952B5CBB975CEFEA8E4FAEA7BC4B019BCEEF05729FA72E585
+ 001AF774F0F62C33C0D9C085AB8952CD7C05F0C4B63DC1C1C2EB91DCEB7A503F
+ F0627C145467F95C8E9DD49FF2E8513A3691B4EA94A96F90774B839E6A7150E6
+ 842331ED976434BDFFA7526B4D3B4204BFC3C550B68F8EC23C735D3C23F97796
+ 4F07C86CD3E76AB44A4883B21A75A70E7C10404E6EF46719B9D00772E515BB65
+ 7B28F43986A8BA067C6686E4BD54EFF94038750976D74D74833CF394D6ACCB7B
+ 40173D0B70757EBEF5FB4D30C487AD7839EEF48E78C4550FAE0F1DE33D6A472D
+ CD3031B2A3DFB0D743BA0FF56F6BE3E0EFF3A7471A74A1F55F4F4C1998BAC995
+ 3B5B456934344CE6D634E1F2D7D12523D1EA8720A55D5034D99543A80AFFB0C5
+ D352E32A35DDD0320956D21442B3A6E82E83D81CAA47043944FD10CE1B505B97
+ D6466083F1F5C6DC2B2929783F12658766898848C1442487D0091BF263CCD603
+ 52F2B00878D567075D442BD8731ABCF5D2C83F36A0F9A1E6513774501213BDB3
+ CD17CAA600F19DF66E0CE30233080DC6DC9D554D95FDD1AA2BD681D1C992AC48
+ 329206615E6CE9EB6DE557FAD1B93BCE7E629962E42E542996231E4F5DBB96F3
+ C98983D0F5AA6A21279618F524DB66C8863937BF8ACF9EE54C403A7E4F939388
+ 76F64E7201FE28C37D3745B817F282D9F85FC68693EC7532EC329DB55D4E69DE
+ 30F7515684E7F0D0EC089DE4784617BAFA338B369BE06ADD099DD7EAA13AE100
+ 6A36A3E098E41ED121FE71C1958477B1B592B32F9A772BB15A8CBE00C2CEF494
+ 4984A9C5C590BC158EE52960D641FBE2FC2F8D5D47E753F67C9581811A51E4F9
+ 9A4EA2F413DF149256CCC0F0F3A31207E8E3129A0E3B26A0775DF6FBD0DEE987
+ 3D30C1F5186B4E26F574B0CFEB2DCBF60DF97E82AFF543A366F9DD6696851741
+ AD6AB8351D633BE824CBEBBA9C5A98AE6F1E23B9587F171AAFB43611DC5BDF76
+ 2BD293B37EF19137CE825A6B8F6413A22ED5E46BB4C922AD40E2650A6B4D2277
+ 47281F7265F3ADB31C432B7A6B88489D10331A923B403310BC0BA06B85F48785
+ 72D3259E3737071BE8A118D9549F3479A928FEC0116DA2B41D12BC958D0918D4
+ 4A8C9CF30FEA2149B200FDFD03B4D0CB0F148E89C344B90C59936A4E7E290654
+ 81B2444128E79E3D5C8B8A4A4BEB8921C504050F4177959B25F33FD25744080B
+ 4F05595644171EA0FCBBE047F31BE2976FFC586B38B9982CBF76E2A67C8C50CD
+ 3C594701C91398605EF946D3FBD80B96ECB679CF5894525BFDB39690431FE060
+ 60689DF26CA49C37041EA77CA90E89EF6E78C4BAD0F4ABF33626ACD029FE4809
+ C409AE68C321A594E19A081D4835A538B63FE0B7AF8EE3B68F34E2F7976D4EAB
+ B865510896B0133C287A3B8FAB4FE04E9A9BAC9865A705EBEAE689D0736D39BC
+ 5181AF6B84701CDCB7176BB0F9107FF547299AA8B8C8E8058D6B7805F084CA22
+ CE4FB9F8A520835695A71D733CD28991F6158DCD0C43A09314BF520BC86BBF2D
+ 179F0AAD7E934A586F31A196F2A0718B30983D13F8DEF42C59B7F2FB0F8EB3A1
+ F8B519E9B9CD59E18B3D5240F9EFC306BBEC014FC566445BD8B76E5AF0252FEA
+ 372DDD3DAB04E6D574FB30653EF31F7D2CF6B6F3DFE397D84DFAB299B7983BCB
+ 8210FD423D64A0BDB250DADE971A61D08B78EDC48C167C579B8926C60081EA8D
+ 9BE64490D5A6CE67CDABBF06041AB535A21380D43ADACD1B5C62664BA44FAF70
+ 1CD47EAD956DECAC0115273386EA8F78B268DA881EC845EEE5F3FA5B39B0A258
+ E475B58AA506B250DBAA66059F7F420E3686FFD482CC9AEA884CB9DB881B4210
+ A41BA3023BE3F62F42744379A82B140130FD6037773E62E4ED9AA6DB831B23D6
+ 672115DF51AD99C61696594E9750E3F9D73B215345A1EC45FE47F8984C4ED919
+ B09A00582B00E72E38D602F5285C7F266D95AD1FC045E63BF653C8E781AE40BE
+ 84271632E81777B0FFE8AC6C53CEA0C785E4440D84216D2EE98D8A589278E06D
+ FC7B5AD41D3DAD85FB465F63D773899CE58DB1991E71F15FEDE9183743F20933
+ 3CFC0EAF71B9711022D5AF0030016F28D7D5651975C5ED9EFCC7CEF436464F29
+ 39332330A92D8F8225475BA5CB2A6FBABBA28930BF747396C2F2DC0542BCBC3B
+ 98ACAE77991DCA7C81A3EE50E03555E9578D516C511FCF7682C5203CA9E83F83
+ ABB3D68231F4F3445F8AAA41642C47E1400C48322E4276400D9CAE1A62213F4D
+ 55B854C7C255D24FFE8B20F3C67E796C7E8146330E43167FBC56434E40167A5F
+ 9B8A9273FF702A4F2A48B85874D309DB3B4824692E756981D7E53AFF26A1558F
+ 5D7BE49021311B18D34636D3C2572F3B0859014DEE1519D5FC47642A08FD5B7A
+ CCB41475ACFA477D496C491739D4F32B6239E220A742EF9479A6C09FDABD580E
+ E172FE89856018DA055DBE38097073833FDC90D9416B81B3B397C38ECB092D1F
+ 98831F1463319D89E2F978CD9F7554E6074FE7B1712560C5BEF1C7E1EA5816D0
+ B10C7309A4D7C13F2F5D88A0786D283975F98A4CB847B51EAA2E65A2E822AE1D
+ 1FF5C49B42711E1BF49ED933E1485717EDB08612C7B86B05DEF387C2B2951610
+ 626DB79C36F8CB5181768B4C297A5FE8D73EB470594CEE2D0B12659D9249D1C3
+ 70E9B0E02C5B74D16021F039173A98507B189ECF34E4C17F982738B9B48CF9D2
+ 2CA18E2405D929A1F0E75094956689D7B9407CE9A8B392E1E4212FDA5810FB81
+ E66BD56AC62D271947D981A459D0DA12E0FC520A54C7369AFFC40F698BBAC99D
+ 2128405FAC517E8E273869809965D208642C73531F4C670BCDF69847ADC008FF
+ 087487565C3353749DF7368566850EBB3E06B9C79D27E7792E48ABA5DAD5967C
+ D3F5FD33DE4A39DBCFB1AFB37DFEC440165A03CD0F9A0B0D72ED78A56A6A6C78
+ CF1E06EF1F4416F01576045A26722A346795FD4D4D76AB3A19660018B26C86B0
+ F45D403864D6EDBE6231764590EFA528FB31BA9ACE331D3EEBE9871F209336A3
+ 935E8842954CADAF5386325C4BF2A87969FAB335E9FF3704929E0D0D5BBA1D59
+ 795A5328AA2CC4FB411C0B5898C092B1911334948BA2109432AA5045264EA67F
+ 5126164BC3FD96EDC09A44809091872EFF39CA0EA66EAAAC6314C61B505141FE
+ A631F8B5862B04B1A4DE1DCF607286B2A3987922E0CFAC1D88FEEA2D2C027C7A
+ 121F76F9433E5314BC554360874933FD7AED268986B789FFBD6D6535772134A4
+ 52B2930E0207B273C98BF26A0F6515A4B42F39A4935E10F1BFED78D292DAB6B5
+ 105A43E5AB00181A6E3F035B28C5C3BAC2B6E9E6B495C08910101E47AF030DE4
+ 70208324CCE7E0421173166BB245B544B9BD102374B67D02E99FBA474E9C96FA
+ 963CF1B714340AA83F9AD5AF75B468A6DAD13E1F7420ACB51B0096EAB900C4B5
+ 2AC1D2866B273BF011E2C7C07F6FCBF0AC334A8A389D0F351D3C74D403EF66D9
+ 39DCB12D7DACA0F5EDC39F2FD220CEEFFF2E1B9617F305CDE3E740C066A0166D
+ EA8B7E08FD185D048CBAEC8EF574F59FB4F80DC8382AB91F56388F586D7C4B4C
+ 3823847086B9EC3CD99DB118DC89066090B20756EF990678BAEF4498694C0884
+ FB309CF7A22CFB79BBE1D4064021A647A957B773052A0CD872AFABF04478516C
+ 97F76772B6F511FC2EB58980103DA0FEB32E61D0C83FED84B967CE31C5F19D85
+ A566ED750CEB9C8BC798CDD9F0138BD650943137394BCCFCD97EF2DFC435B337
+ 4F45AF417F9388037B4C5FB681F5E11F3BAD9450632E1C2DCFB263EA3ECAE66F
+ AB78AEA057C18ACFC12098E0DD71D16EE1794904252BC427298F69D9FEA435A2
+ F00A5BD09DF5C57254EA62FB77B0248873AB68DB7A60413A96F53850EC693B1F
+ C5D2BBDFB6B197500C2CC5F35597D452A501E812C102F8C235542FB2E78278D0
+ E1C1D0C96CAF2628B54C98E3F32DB8D62CBA3441A63945A250EC21C4BB97CBA5
+ 4A80F71E30CBD8D974EB3FDD3ED45EB008ED54D76BD01766FCAA8F6753402C07
+ EF04B9B2308F66D56CEB917E0848C72ED4B1E290BF4A6FE7728CF68A23F6EA17
+ 3FF37E5F9574645DBED15C540C0DBA3C61E9C02697329BA57C29F3D28B5D76E9
+ 9EBA8F527DFEC6C96CF090804EFFB25E1458FC5897CB9E269BF2FF6880222F28
+ 1988909D794620E260521B65CBC1C495DB903F916F50D15F36034506E0838CF1
+ D741CA25C5C2B68679A056F03F65C842BD628A2AE8D73203876665372DE0B048
+ C2FFC030F600E500B5699A7CF7E9DEA818A5653700143FBEB970F2D51DF32730
+ FAA372EFAEA1A4E15E6C2096AAAA5AE7DA3D9C05FB11F83E853763DE89AB47FB
+ 89411C369F036A03D881664AF026D76B52742B74F6DA12469E8D560D3C2E2BDA
+ 3357A562201416BAD3F046BBBF27A5ED52C606C96CF2FBE7236F0D76E10097E3
+ 03ED4F6A70BACB2E52F00C260C61B66040946AC7A5B4866C61501A883897512E
+ FAFAA687ED471B7CCFF704B4674CBC082B07179B30F0A78459B6D23A16C49C07
+ BEDA6A23F17F25F1166EDEE0B17F43AF8D897DDBD715B9D9FB540949EB3FB4B9
+ 8B749FB156374E73FD7EBD72EC9C4FBE54E24F17AAEF29B1E846A42C84D3A1CF
+ 27E2E59BE76B3A8828A1EE70887CEA3DF74A7C7DE9A239CCC9E9770740E16E87
+ 84EDFDEA5B34168384C0F429178B7AACAE1D37A731AE1629F8971811F032A2F7
+ A88C26E73311F6BCEC83FFC99B01DE9BC5FF9F34999DBB568199CF8EF8836704
+ 192CD77B452622002C3DDF0D5BB06FE822B0583E00A425D85A4B29633B1DF56D
+ 9F5F7CCC9AF8C4333AAB65841CC7A4FEFBD07ABF367D0E691E22384362F43AC1
+ 4EF4FE416F8FB32F29EDB2A20BAC9D285D78F8DC79F7677DCD002E4A30C98DEE
+ 4AD9EA0B00AD161BDA8B6C19922E9840B3C2E96CAC90369FF71A3E5311A4334B
+ 10F53F90109B6C218EE7B8D23A95A766DE4D4541ADFCB4A488D8F913F9D07D35
+ 2B303F2518E0BE70549BA0F0D8D33EBA0CF23C610FAFE29C1302D7FD008972B0
+ D8E9DFD0DA84C8CEAB1B160056C2B69F7EDDDB93B069C8E4378C7777696A7ADE
+ 9DFD45125F9609D8403F72905B73B813F320B6AF2C9D62532328C65FA25FA75B
+ 9B57A65347488BCB948FCE4E3843E9A195F5D6CC1FC91CC9D474AFA91BDB9F0D
+ 457D08F869F21A78800D1744957848AB12982157748ACDB74814C05F40C5C630
+ 171553B9A547AB9650509B4C8A02740182C0E902120721DDEC1EAB1AF4F9EB81
+ 2EB8B93EBF9875D368D11696BC7AC7631C0C357E4E90F121B58009626C101972
+ BC86C45D2444AECDF6C734A9D14CBF243777B970247A6587AA078EB820DD9131
+ 2D729B6B7BC569A444460BA522284509F8F5A70BF465F20EA91733A07648AC0E
+ D7630DB0AF9FCF9FEBD09D8847C8CC6CF63424A784937F00594D311AEC11B55E
+ 8AC43A2FDC85DB70DE025FFE25F1D314CF06847BF2DF90EC2F78116EC8583A3E
+ 52D8B8F0C8EEB01DE18B3F288710FB14DD0E10A8A4E7704662CEB3CE6E856FE8
+ 21AA289801B84CEDC7FCBF815D2852247C8D06922F8FA940B93421F256CE37F0
+ 441F8095E1A3481AD60771C65113C61D844E489725EA5B34501709463897CB5F
+ B01CAAA3BE5109B4A49E
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ cleartomark
+ %%EndResource
+ /LuxiSans-iso1252 /LuxiSans ISO1252Encoding psp_definefont
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ readpath
+ QCBCBE0BB700B000872E8BB700B008872~
+ 1 1 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00BD075AE0A4200~
+ stroke
+ readpath
+ V00BD069EE0A4200~
+ stroke
+ readpath
+ V00BD05E2E0A4200~
+ stroke
+ readpath
+ V00BD0527E0A4200~
+ stroke
+ readpath
+ V00BD046BE0A4200~
+ stroke
+ readpath
+ V00BD03AFE0A4200~
+ stroke
+ readpath
+ V00BD02F3E0A4200~
+ stroke
+ readpath
+ V00BD0238E0A4200~
+ stroke
+ readpath
+ V00BD017CE0A4200~
+ stroke
+ readpath
+ V00BD00C0E0A4200~
+ stroke
+ readpath
+ U00BD04E0A4200~
+ stroke
+ readpath
+ V00BD075AE0A4200~
+ stroke
+ readpath
+ V00BD075AE0A4200~
+ stroke
+ readpath
+ V00BD076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V00E00777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 241 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313634>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V0161076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V01840777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 405 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313735>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V0205076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V02280777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 569 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313736>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V02A9076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V02CD0777B000081A5D00B008081~
+ closepath clip newpath
+ gsave
+ 733 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313737>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V034D076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V03710777B000081A5D00B008081~
+ closepath clip newpath
+ gsave
+ 898 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313739>
+ [42 41 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V03F1076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V04150777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 1062 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313831>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V0496076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V04B90777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 1226 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313833>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V053A076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V055D0777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 1390 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313836>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V05DE076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V06010777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 1554 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313838>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V0682076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V06A60777B000081A5D00B008081~
+ closepath clip newpath
+ gsave
+ 1718 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <313937>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V0726076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V074A0777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 1883 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <323533>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V07CA076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V07EE0777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 2047 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <323534>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V086F076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V08920777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 2211 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <323535>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V0913076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V09360777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 2375 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <323536>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V09B7076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V09DA0777B000081A5E00B008081~
+ closepath clip newpath
+ gsave
+ 2539 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <333030>
+ [42 42 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V0A5B076CA0092~
+ stroke
+ grestore
+ gsave
+ readpath
+ V0A7F0777B000085A5D00B008085~
+ closepath clip newpath
+ gsave
+ 2703 1912 translate
+ 90.0 rotate
+ 0 0 moveto
+ 0 0 0 setrgbcolor
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <417667>
+ [50 38 0]
+ xshow
+ grestore
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ readpath
+ V01230708A2900A0052AA900A00D2~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V0137075AA9400A00D2A2900A0052A9500~
+ stroke
+ readpath
+ V01C706B3A2900B0000A7AA900B0080A7~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V01DC075AA9500B0080A7A2900B0000A7A9400~
+ stroke
+ readpath
+ V026B009CA2900B0006BEAA900B0086BE~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0280075AA9500B0086BEA2900B0006BEA9400~
+ stroke
+ readpath
+ V030F0524A2900B000236AA900B008236~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0324075AA9500B008236A2900B000236A9400~
+ stroke
+ readpath
+ V03B3073AA2900A0020AA900A00A0~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V03C8075AA9500A00A0A2900A0020A9400~
+ stroke
+ readpath
+ V04570748A2900A0012AA900A0092~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V046C075AA9500A0092A2900A0012A9400~
+ stroke
+ readpath
+ V04FB073CA2900A001EAA900A009E~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0510075AA9500A009EA2900A001EA9400~
+ stroke
+ readpath
+ V059F0651A2900B000109AA900B008109~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V05B4075AA9500B008109A2900B000109A9400~
+ stroke
+ readpath
+ V064306D8A2900B000082AA900B008082~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0658075AA9500B008082A2900B000082A9400~
+ stroke
+ readpath
+ V06E806A5A2900B0000B5AA900B0080B5~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V06FC075AA9400B0080B5A2900B0000B5A9500~
+ stroke
+ readpath
+ V078C0485A2900B0002D5AA900B0082D5~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V07A0075AA9400B0082D5A2900B0002D5A9500~
+ stroke
+ readpath
+ V08300539A2900B000221AA900B008221~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0844075AA9400B008221A2900B000221A9500~
+ stroke
+ readpath
+ V08D404C3A2900B000297AA900B008297~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V08E8075AA9400B008297A2900B000297A9500~
+ stroke
+ readpath
+ V09780711A2900A0049AA900A00C9~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V098C075AA9400A00C9A2900A0049A9500~
+ stroke
+ readpath
+ V0A1C064EA2900B00010CAA900B00810C~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0A30075AA9400B00810CA2900B00010CA9500~
+ stroke
+ readpath
+ V0AC005EDA2900B00016DAA900B00816D~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0AD4075AA9400B00816DA2900B00016DA9500~
+ stroke
+ readpath
+ V00FA0729A2900A0031AA900A00B1~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V010E075AA9400A00B1A2900A0031A9500~
+ stroke
+ readpath
+ V019E06DFA2900A007BAA900A00FB~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V01B3075AA9500A00FBA2900A007BA9400~
+ stroke
+ readpath
+ V024202BDA2900B00049DAA900B00849D~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0257075AA9500B00849DA2900B00049DA9400~
+ stroke
+ readpath
+ V02E605C5A2900B000195AA900B008195~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V02FB075AA9500B008195A2900B000195A9400~
+ stroke
+ readpath
+ V038A0747A2900A0013AA900A0093~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V039F075AA9500A0093A2900A0013A9400~
+ stroke
+ readpath
+ V042E0749A2900A0011AA900A0091~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0443075AA9500A0091A2900A0011A9400~
+ stroke
+ readpath
+ V04D20744A2900A0016AA900A0096~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V04E7075AA9500A0096A2900A0016A9400~
+ stroke
+ readpath
+ V05760682A2900B0000D8AA900B0080D8~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V058B075AA9500B0080D8A2900B0000D8A9400~
+ stroke
+ readpath
+ V061A06FCA2900A005EAA900A00DE~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V062F075AA9500A00DEA2900A005EA9400~
+ stroke
+ readpath
+ V06BF06E8A2900A0072AA900A00F2~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V06D3075AA9400A00F2A2900A0072A9500~
+ stroke
+ readpath
+ V0763058EA2900B0001CCAA900B0081CC~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0777075AA9400B0081CCA2900B0001CCA9500~
+ stroke
+ readpath
+ V080705E2A2900B000178AA900B008178~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V081B075AA9400B008178A2900B000178A9500~
+ stroke
+ readpath
+ V08AB0558A2900B000202AA900B008202~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V08BF075AA9400B008202A2900B000202A9500~
+ stroke
+ readpath
+ V094F072CA2900A002EAA900A00AE~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0963075AA9400A00AEA2900A002EA9500~
+ stroke
+ readpath
+ V09F306B7A2900B0000A3AA900B0080A3~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0A07075AA9400B0080A3A2900B0000A3A9500~
+ stroke
+ readpath
+ V0A97065DA2900B0000FDAA900B0080FD~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0AAB075AA9400B0080FDA2900B0000FDA9500~
+ stroke
+ readpath
+ V00D10737A2900A0023AA900A00A3~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V00E5075AA9400A00A3A2900A0023A9500~
+ stroke
+ readpath
+ V017506EFA2900A006BAA900A00EB~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V018A075AA9500A00EBA2900A006BA9400~
+ stroke
+ readpath
+ V02190223A2900B000537AA900B008537~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V022E075AA9500B008537A2900B000537A9400~
+ stroke
+ readpath
+ V02BD05BBA2900B00019FAA900B00819F~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V02D2075AA9500B00819FA2900B00019FA9400~
+ stroke
+ readpath
+ V03610751A2900A0009AA900A0089~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0376075AA9500A0089A2900A0009A9400~
+ stroke
+ readpath
+ V04050751A2900A0009AA900A0089~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V041A075AA9500A0089A2900A0009A9400~
+ stroke
+ readpath
+ V04A9074DA2900A000DAA900A008D~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V04BE075AA9500A008DA2900A000DA9400~
+ stroke
+ readpath
+ V054D069DA2900B0000BDAA900B0080BD~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0562075AA9500B0080BDA2900B0000BDA9400~
+ stroke
+ readpath
+ V05F10700A2900A005AAA900A00DA~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0606075AA9500A00DAA2900A005AA9400~
+ stroke
+ readpath
+ V069606FFA2900A005BAA900A00DB~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V06AA075AA9400A00DBA2900A005BA9500~
+ stroke
+ readpath
+ V073A0508A2900B000252AA900B008252~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V074E075AA9400B008252A2900B000252A9500~
+ stroke
+ readpath
+ V07DE0585A2900B0001D5AA900B0081D5~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V07F2075AA9400B0081D5A2900B0001D5A9500~
+ stroke
+ readpath
+ V088205FAA2900B000160AA900B008160~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0896075AA9400B008160A2900B000160A9500~
+ stroke
+ readpath
+ V0926073FA2900A001BAA900A009B~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V093A075AA9400A009BA2900A001BA9500~
+ stroke
+ readpath
+ V09CA069DA2900B0000BDAA900B0080BD~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V09DE075AA9400B0080BDA2900B0000BDA9500~
+ stroke
+ readpath
+ V0A6E0654A2900B000106AA900B008106~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V0A82075AA9400B008106A2900B000106A9500~
+ stroke
+ readpath
+ V00BD075AB008756~
+ stroke
+ readpath
+ V00BD075AB008756~
+ stroke
+ readpath
+ V00AB075AA1200~
+ stroke
+ 117 1912 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <30>
+ show
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00AB069EA1200~
+ stroke
+ 33 1724 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <323530>
+ [42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00AB05E2A1200~
+ stroke
+ 33 1536 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <353030>
+ [42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00AB0527A1200~
+ stroke
+ 33 1348 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <373530>
+ [42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00AB046BA1200~
+ stroke
+ -10 1160 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <31303030>
+ [42 42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00AB03AFA1200~
+ stroke
+ -10 973 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <31323530>
+ [42 42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00AB02F3A1200~
+ stroke
+ -10 785 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <31353030>
+ [42 42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00AB0238A1200~
+ stroke
+ -10 597 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <31373530>
+ [42 42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00AB017CA1200~
+ stroke
+ -10 409 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <32303030>
+ [42 42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V00AB00C0A1200~
+ stroke
+ -10 221 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <32323530>
+ [42 42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ U00AB04A1200~
+ stroke
+ -10 34 moveto
+ /LuxiSans-iso1252  findfont 76 -76 matrix scale makefont setfont
+ <32353030>
+ [42 42 42 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ readpath
+ V09C903EEE012C00B000144E812C00B008144~
+ 1 1 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V0A5F0532E809600B008144E012C00B000144E809600~
+ stroke
+ readpath
+ V09DF040BA4100A0041AC100A00C1~
+ 0.6 0.6 1 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ readpath
+ V09FF044CAA000A00C1A4100A0041AA100~
+ stroke
+ 2614 1093 moveto
+ /LuxiSans-iso1252  findfont 65 -65 matrix scale makefont setfont
+ <4C4C564D>
+ [36 36 43 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ readpath
+ V09DF0470A4100A0041AC100A00C1~
+ 0.6 0.20000 0.40000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V09FF04B1AA000A00C1A4100A0041AA100~
+ stroke
+ 2614 1194 moveto
+ /LuxiSans-iso1252  findfont 65 -65 matrix scale makefont setfont
+ <583836>
+ [43 36 0]
+ xshow
+ grestore
+ gsave
+ readpath
+ QCBCBB000873E0BB800B008873~
+ closepath clip newpath
+ readpath
+ V09DF04D5A4100A0041AC100A00C1~
+ 1 1 0.80000 setrgbcolor
+ fill
+ 0 0 0 setrgbcolor
+ 1 setlinewidth
+ readpath
+ V09FF0516AA000A00C1A4100A0041AA100~
+ stroke
+ 2614 1294 moveto
+ /LuxiSans-iso1252  findfont 65 -65 matrix scale makefont setfont
+ <5370617263>
+ [43 36 36 22 0]
+ xshow
+ showpage
+ grestore grestore
+ %%PageTrailer
+ 
+ %%Trailer
+ %%Pages: 1
+ %%EOF
+ 
+ %%EndDocument
+  @endspecial 9897 2738 a
+  currentpoint grestore moveto
+  9897 2738 a -303 2738 a
+  currentpoint currentpoint translate 1 0.33635 div 1 0.33635 div scale
+ neg exch neg exch translate
+  -303
+ 2738 a -257 5837 a Fi(Figure)h(5:)68 b Fc(Executable)51
+ b(sizes)g(for)g(LL)-17 b(VM,)51 b(X86,)f(Sparc)i(\(in)f(KB\))-154
+ 6225 y Fi(The)h(\014gure)g(sho)l(ws)e(that)h(LL)-17 b(VM)51
+ b(co)t(de)h(is)e(ab)t(out)i(the)f(same)g(size)-303 6400
+ y(as)35 b(nativ)l(e)h(X86)f(executables)i(\(a)e(denser,)40
+ b(v)-9 b(ariable-size)36 b(instruction)-303 6574 y(set\),)74
+ b(and)e(signi\014can)l(tly)d(smaller)h(than)h(SP)-13
+ b(AR)l(C)71 b(\(a)f(traditional)-303 6748 y(32-bit)49
+ b(instruction)g(RISC)h(mac)l(hine\).)67 b(W)-13 b(e)50
+ b(b)t(eliev)l(e)h(this)d(is)h(a)g(v)l(ery)-303 6923 y(go)t(o)t(d)38
+ b(result)g(giv)l(en)h(that)f(LL)-17 b(VM)38 b(enco)t(des)h(an)g
+ (in\014nite)f(register)g(set,)-303 7097 y(ric)l(h)64
+ b(t)l(yp)t(e)i(information,)g(con)l(trol)e(\015o)l(w)h(information,)i
+ (and)e(data-)-303 7271 y(\015o)l(w)51 b(\(SSA\))g(information)f(that)h
+ (nativ)l(e)g(executables)h(do)f(not.)-154 7446 y(Curren)l(tly)-13
+ b(,)42 b(large)e(programs)f(are)h(enco)t(ded)i(less)d(e\016cien)l(tly)h
+ (than)-303 7620 y(smaller)h(ones)h(b)t(ecause)i(they)f(ha)l(v)l(e)f(a)g
+ (larger)g(set)g(of)h(register)e(v)-9 b(alues)-303 7794
+ y(a)l(v)g(ailable)59 b(at)g(an)l(y)g(p)t(oin)l(t,)j(making)d(it)g
+ (harder)i(to)e(\014t)h(instructions)-303 7969 y(in)l(to)68
+ b(a)g(32-bit)h(enco)t(ding.)122 b(When)69 b(an)g(instruction)g(do)t(es)
+ g(not)g(\014t)-303 8143 y(in)l(to)40 b(a)i(32-bit)f(enco)t(ding,)j(LL)
+ -17 b(VM)41 b(falls)g(bac)l(k)g(on)h(a)f(64-bit)h(or)f(larger)-303
+ 8317 y(enco)t(ding,)56 b(as)e(needed.)81 b(Though)55
+ b(it)f(w)l(ould)h(b)t(e)g(p)t(ossible)g(to)f(mak)l(e)-303
+ 8492 y(the)i(fall)f(bac)l(k)h(case)g(more)h(e\016cien)l(t,)g(w)l(e)f
+ (ha)l(v)l(e)g(not)g(attempted)g(to)-303 8666 y(do)48
+ b(so.)66 b(Also,)47 b(as)g(with)h(nativ)l(e)f(executables,)i(general)g
+ (purp)t(ose)f(\014le)-303 8840 y(compression)62 b(to)t(ols)g(\(e.g.)102
+ b Fk(bzip2)p Fi(\))65 b(are)e(able)g(to)f(reduce)j(the)e(size)-303
+ 9015 y(of)e(b)l(yteco)t(de)h(\014les)f(to)g(ab)t(out)g(50\045)g(of)g
+ (their)g(uncompressed)h(size,)-303 9189 y(indicating)50
+ b(substan)l(tial)g(margin)h(for)g(impro)l(v)l(emen)l(t.)-258
+ 9493 y Fb(4.1.4)183 b(How)46 b(fast)g(is)f(LL)-10 b(VM?)-154
+ 9709 y Fi(An)61 b(imp)t(ortan)l(t)f(asp)t(ect)h(of)f(LL)-17
+ b(VM)60 b(is)g(that)g(the)g(lo)l(w-lev)l(el)g(rep-)-303
+ 9883 y(resen)l(tation)82 b(enables)h Fh(e\016cient)g
+ Fi(analysis)e(and)i(transformation,)-303 10058 y(b)t(ecause)69
+ b(of)e(the)h(small,)j(uniform)c(instruction)h(set,)j(the)d(explicit)
+ -303 10232 y(CF)l(G)53 b(and)i(SSA)g(represen)l(tations,)g(and)g
+ (careful)f(implemen)l(tation)-303 10406 y(of)i(data)h(structures.)86
+ b(This)57 b(sp)t(eed)h(is)e(imp)t(ortan)l(t)h(for)g(uses)g(\\late")-303
+ 10581 y(in)64 b(the)h(compilation)e(pro)t(cess)h(\(i.e.,)j(at)d
+ (link-time)f(or)i(run-time\).)-303 10755 y(In)53 b(order)g(to)e(pro)l
+ (vide)i(a)f(sense)g(for)h(the)f(sp)t(eed)i(of)e(LL)-17
+ b(VM,)51 b(T)-13 b(able)53 b(2)4080 -137 y(sho)l(ws)k(the)h(table)g(of)
+ g(run)l(times)g(for)f(sev)l(eral)h(in)l(terpro)t(cedural)h(op-)4080
+ 37 y(timizations.)87 b(All)58 b(timings)f(w)l(ere)h(collected)h(on)f(a)
+ g(3.06GHz)f(In)l(tel)4080 211 y(Xeon)f(pro)t(cessor.)79
+ b(The)55 b(LL)-17 b(VM)55 b(compiler)g(system)f(w)l(as)g(compiled)4080
+ 386 y(using)d(the)h(GCC)e(3.3)h(compiler)g(at)g(optimization)f(lev)l
+ (el)h(-O3.)p 4277 598 3540 7 v 4274 747 7 150 v 4367
+ 702 a Fg(Benc)-5 b(hmark)p 5330 747 V 5360 747 V 210
+ w(DGE)p 5966 747 V 216 w(D)g(AE)p 6572 747 V 227 w(inline)p
+ 7178 747 V 7208 747 V 244 w(GCC)p 7814 747 V 4277 754
+ 3540 7 v 4274 903 7 150 v 4367 859 a Fi(164.gzip)p 5330
+ 903 V 5360 903 V 539 w(0.0018)p 5966 903 V 178 w(0.0063)p
+ 6572 903 V 178 w(0.0127)p 7178 903 V 7208 903 V 284 w(1.937)p
+ 7814 903 V 4274 1053 V 4367 1008 a(175.vpr)p 5330 1053
+ V 5360 1053 V 586 w(0.0096)p 5966 1053 V 178 w(0.0082)p
+ 6572 1053 V 178 w(0.0564)p 7178 1053 V 7208 1053 V 284
+ w(5.804)p 7814 1053 V 4274 1202 V 4367 1157 a(176.gcc)p
+ 5330 1202 V 5360 1202 V 599 w(0.0496)p 5966 1202 V 178
+ w(0.1058)p 6572 1202 V 178 w(0.6455)p 7178 1202 V 7208
+ 1202 V 208 w(55.436)p 7814 1202 V 4274 1352 V 4367 1307
+ a(177.mesa)p 5330 1352 V 5360 1352 V 478 w(0.0051)p 5966
+ 1352 V 178 w(0.0312)p 6572 1352 V 178 w(0.0788)p 7178
+ 1352 V 7208 1352 V 208 w(20.844)p 7814 1352 V 4274 1501
+ V 4367 1456 a(179.art)p 5330 1501 V 5360 1501 V 615 w(0.0002)p
+ 5966 1501 V 178 w(0.0007)p 6572 1501 V 178 w(0.0085)p
+ 7178 1501 V 7208 1501 V 284 w(0.591)p 7814 1501 V 4274
+ 1651 V 4367 1606 a(181.mcf)p 5330 1651 V 5360 1651 V
+ 569 w(0.0010)p 5966 1651 V 178 w(0.0007)p 6572 1651 V
+ 178 w(0.0174)p 7178 1651 V 7208 1651 V 284 w(1.193)p
+ 7814 1651 V 4274 1800 V 4367 1755 a(183.equak)l(e)p 5330
+ 1800 V 5360 1800 V 356 w(0.0000)p 5966 1800 V 178 w(0.0009)p
+ 6572 1800 V 178 w(0.0100)p 7178 1800 V 7208 1800 V 284
+ w(0.632)p 7814 1800 V 4274 1949 V 4367 1905 a(186.craft)l(y)p
+ 5330 1949 V 5360 1949 V 423 w(0.0016)p 5966 1949 V 178
+ w(0.0162)p 6572 1949 V 178 w(0.0531)p 7178 1949 V 7208
+ 1949 V 284 w(9.444)p 7814 1949 V 4274 2099 V 4367 2054
+ a(188.ammp)p 5330 2099 V 5360 2099 V 394 w(0.0200)p 5966
+ 2099 V 178 w(0.0072)p 6572 2099 V 178 w(0.1085)p 7178
+ 2099 V 7208 2099 V 284 w(5.663)p 7814 2099 V 4274 2248
+ V 4367 2203 a(197.parser)p 5330 2248 V 5360 2248 V 401
+ w(0.0021)p 5966 2248 V 178 w(0.0096)p 6572 2248 V 178
+ w(0.0516)p 7178 2248 V 7208 2248 V 284 w(5.593)p 7814
+ 2248 V 4274 2398 V 4367 2353 a(253.p)t(erlbmk)p 5330
+ 2398 V 5360 2398 V 258 w(0.0137)p 5966 2398 V 178 w(0.0439)p
+ 6572 2398 V 178 w(0.8861)p 7178 2398 V 7208 2398 V 208
+ w(25.644)p 7814 2398 V 4274 2547 V 4367 2502 a(254.gap)p
+ 5330 2547 V 5360 2547 V 573 w(0.0065)p 5966 2547 V 178
+ w(0.0384)p 6572 2547 V 178 w(0.1317)p 7178 2547 V 7208
+ 2547 V 208 w(18.250)p 7814 2547 V 4274 2697 V 4367 2652
+ a(255.v)l(ortex)p 5330 2697 V 5360 2697 V 389 w(0.1081)p
+ 5966 2697 V 178 w(0.0539)p 6572 2697 V 178 w(0.2462)p
+ 7178 2697 V 7208 2697 V 208 w(20.621)p 7814 2697 V 4274
+ 2846 V 4367 2801 a(256.bzip2)p 5330 2846 V 5360 2846
+ V 454 w(0.0015)p 5966 2846 V 178 w(0.0028)p 6572 2846
+ V 178 w(0.0122)p 7178 2846 V 7208 2846 V 284 w(1.520)p
+ 7814 2846 V 4274 2996 V 4367 2951 a(300.t)l(w)l(olf)p
+ 5330 2996 V 5360 2996 V 482 w(0.0712)p 5966 2996 V 178
+ w(0.0152)p 6572 2996 V 178 w(0.1742)p 7178 2996 V 7208
+ 2996 V 208 w(11.986)p 7814 2996 V 4277 3002 3540 7 v
+ 4100 3131 a(T)-13 b(able)51 b(2:)68 b Fc(In)l(terpro)t(cedural)53
+ b(optimization)d(timings)g(\(in)h(seconds\))4230 3490
+ y Fi(The)66 b(table)g(includes)g(n)l(um)l(b)t(ers)g(for)g(sev)l(eral)f
+ (transformations:)4080 3664 y Fg(DGE)45 b Fi(\(aggressiv)l(e)5244
+ 3601 y Ff(9)5357 3664 y Fi(Dead)g(Global)f(v)-9 b(ariable)45
+ b(and)g(function)g(Elim-)4080 3839 y(ination\),)40 b
+ Fg(D)-5 b(AE)39 b Fi(\(aggressiv)l(e)e(Dead)i(Argumen)l(t)g(and)g
+ (return)h(v)-9 b(alue)4080 4013 y(Elimination\),)55 b(and)h
+ Fg(inline)h Fi(\(a)f(function)g(in)l(tegration)f(pass\).)82
+ b(All)4080 4187 y(these)51 b(in)l(terpro)t(cedural)h(optimizations)d(w)
+ l(ork)h(on)h(the)g(whole)g(pro-)4080 4362 y(gram)34 b(at)h(link-time.)
+ 62 b(In)35 b(addition,)i(they)e(sp)t(end)h(most)e(of)g(their)h(time)
+ 4080 4536 y(tra)l(v)l(ersing)65 b(and)i(mo)t(difying)f(the)h(co)t(de)g
+ (represen)l(tation)f(directly)-13 b(,)4080 4710 y(so)48
+ b(they)g(re\015ect)h(the)g(costs)e(of)h(pro)t(cessing)g(the)g(represen)
+ l(tation.)7935 4647 y Ff(10)4080 4885 y Fi(As)58 b(a)g(reference)i(for)
+ e(comparison,)i(the)e Fg(GCC)g Fi(column)h(indicates)4080
+ 5059 y(the)k(total)f(time)h(the)g(GCC)f(3.3)g(compiler)h(tak)l(es)g(to)
+ f(compile)h(the)4080 5233 y(program)51 b(at)g(-O3.)4230
+ 5408 y(W)-13 b(e)67 b(\014nd)h(that)f(in)g(all)f(cases,)k(the)e
+ (optimization)e(time)g(is)h(sub-)4080 5582 y(stan)l(tially)46
+ b(less)h(than)h(that)f(to)h(compile)g(the)g(program)g(with)f(GCC,)4080
+ 5756 y(despite)58 b(the)g(fact)f(that)g(GCC)g(do)t(es)h
+ Fh(no)g Fi(cross)f(mo)t(dule)h(optimiza-)4080 5931 y(tion,)67
+ b(and)e(v)l(ery)g(little)e(in)l(terpro)t(cedural)j(optimization)d
+ (within)h(a)4080 6105 y(translation)51 b(unit.)72 b(In)53
+ b(addition,)f(the)h(in)l(terpro)t(cedural)h(optimiza-)4080
+ 6279 y(tions)39 b(scale)h(mostly)e(linear)i(with)f(the)i(n)l(um)l(b)t
+ (er)g(of)e(transformations)4080 6454 y(they)59 b(p)t(erform.)90
+ b(F)-13 b(or)59 b(example,)h(DGE)e(eliminates)g(331)f(functions)4080
+ 6628 y(and)75 b(557)f(global)f(v)-9 b(ariables)74 b(\(whic)l(h)h
+ (include)g(string)f(constan)l(ts\))4080 6802 y(from)52
+ b(255.v)l(ortex,)g(D)l(AE)g(eliminates)f(103)h(argumen)l(ts)g(and)h(96)
+ f(re-)4080 6977 y(turn)f(v)-9 b(alues)50 b(from)g(176.gcc,)g(and)h
+ (`inline')e(inlines)h(1368)f(functions)4080 7151 y(\(deleting)i(438)g
+ (whic)l(h)g(are)h(no)f(longer)g(referenced\))i(in)f(176.gcc.)4080
+ 7455 y Fj(4.2)199 b(A)-5 b(pplications)77 b(using)f(life\255time)k
+ (analysis)c(and)4529 7648 y(optimization)50 b(capabilities)h(of)f(LL)
+ -18 b(VM)4230 7864 y Fi(Finally)-13 b(,)44 b(to)g(illustrate)f(the)h
+ (capabilities)f(pro)l(vided)h(b)l(y)h(the)f(com-)4080
+ 8038 y(piler)57 b(framew)l(ork,)g(w)l(e)f(brie\015y)h(describ)t(e)h
+ (three)f(examples)f(of)g(ho)l(w)4080 8213 y(LL)-17 b(VM)49
+ b(has)f(b)t(een)i(used)f(for)f(widely)h(v)-9 b(arying)49
+ b(compiler)g(problems,)4080 8387 y(emphasizing)54 b(some)f(of)g(the)h
+ (no)l(v)l(el)f(capabilities)f(describ)t(ed)j(in)e(the)4080
+ 8561 y(in)l(tro)t(duction.)4126 8866 y Fb(4.2.1)183 b(Pr)-8
+ b(ojects)80 b(using)h(LL)-10 b(VM)79 b(as)i(a)f(g)n(ener)m(al)i
+ (compiler)4674 9040 y(infr)m(astructur)-7 b(e)4230 9256
+ y Fi(As)65 b(noted)h(earlier,)i(w)l(e)e(ha)l(v)l(e)f(implemen)l(ted)h
+ (sev)l(eral)f(compiler)4080 9430 y(tec)l(hniques)95 b(in)f(LL)-17
+ b(VM.)94 b(The)h(most)e(aggressiv)l(e)g(of)h(these)h(are)p
+ 4080 9515 1594 7 v 4088 9623 a Ff(9)4157 9686 y Fi(\\Aggressiv)l(e")59
+ b(DCEs)g(assume)h(ob)9 b(jects)59 b(are)i(dead)f(un)l(til)g(pro)l(v)l
+ (en)4080 9835 y(otherwise,)51 b(allo)l(wing)e(dead)j(ob)9
+ b(jects)51 b(with)g(cycles)g(to)g(b)t(e)h(deleted.)4027
+ 9944 y Ff(10)4157 10008 y Fg(DSA)60 b Fi(\(Data)f(Structure)h
+ (Analysis\))d(is)h(a)h(m)l(uc)l(h)h(more)f(complex)4080
+ 10157 y(analysis,)52 b(and)i(it)e(sp)t(ends)i(a)f(negligible)g
+ (fraction)g(of)g(its)f(time)h(pro-)4080 10307 y(cessing)37
+ b(the)g(co)t(de)h(represen)l(tation)f(itself,)h(so)f(its)e(run)j(times)
+ e(are)h(not)4080 10456 y(indicativ)l(e)51 b(of)f(the)h(e\016ciency)h
+ (of)f(the)g(represen)l(tation.)68 b(It)51 b(is)f(in)l(ter-)4080
+ 10606 y(esting)i(to)f(note,)h(ho)l(w)l(ev)l(er,)g(that)g(those)g(times)
+ f(also)g(are)h(relativ)l(ely)4080 10755 y(fast)e(compared)j(with)d(GCC)
+ h(compile)g(times)g([31].)p eop end
+ %%Page: 10 10
+ TeXDict begin 10 9 bop -303 -137 a Fi(Data)61 b(Structure)i(Analysis)d
+ (\(DSA\))i(and)g(Automatic)f(P)l(o)t(ol)f(Allo-)-303
+ 37 y(cation)46 b([30],)g(whic)l(h)h(analyze)g(and)h(transform)e
+ (programs)g(in)h(terms)-303 211 y(of)72 b(their)h(logical)f(data)g
+ (structures.)134 b(These)73 b(tec)l(hniques)h(inherit)-303
+ 386 y(a)61 b(few)g(signi\014can)l(t)f(b)t(ene\014ts)i(from)f(LL)-17
+ b(VM,)61 b(esp)t(ecially)-13 b(,)63 b(\(a\))d(these)-303
+ 560 y(tec)l(hniques)48 b(are)f(only)h(e\013ectiv)l(e)f(if)g(most)f(of)i
+ (the)f(program)h(is)e(a)l(v)-9 b(ail-)-303 734 y(able,)73
+ b(i.e.,)f(at)d(link-time;)77 b(\(b\))68 b(t)l(yp)t(e)i(information)e
+ (is)g(crucial)h(for)-303 909 y(their)37 b(e\013ectiv)l(eness,)j(esp)t
+ (ecially)e(p)t(oin)l(ters)f(and)h(structures;)k(\(c\))37
+ b(the)-303 1083 y(tec)l(hniques)69 b(are)g(source-language)f(indep)t
+ (enden)l(t;)80 b(and)69 b(\(d\))f(SSA)-303 1257 y(signi\014can)l(tly)60
+ b(impro)l(v)l(es)g(the)i(precision)f(of)f(DSA,)i(whic)l(h)f(is)g(\015o)
+ l(w-)-303 1432 y(insensitiv)l(e.)-154 1606 y(Other)50
+ b(researc)l(hers)f(not)f(a\016liated)g(with)g(our)h(group)g(ha)l(v)l(e)
+ f(b)t(een)-303 1780 y(activ)l(ely)65 b(using)h(or)g(exploring)g(the)g
+ (use)g(of)g(the)h(LL)-17 b(VM)66 b(compiler)-303 1955
+ y(framew)l(ork,)73 b(in)c(a)g(n)l(um)l(b)t(er)h(of)f(di\013eren)l(t)g
+ (w)l(a)l(ys.)121 b(These)70 b(include)-303 2129 y(using)63
+ b(LL)-17 b(VM)63 b(as)g(an)g(in)l(termediate)h(represen)l(tation)f(for)
+ g(binary-)-303 2304 y(to-binary)i(transformations,)j(as)d(a)h(compiler)
+ g(bac)l(k-end)h(to)e(sup-)-303 2478 y(p)t(ort)41 b(a)f(hardw)l
+ (are-based)i(trace)f(cac)l(he)h(and)f(optimization)f(system,)-303
+ 2652 y(as)53 b(a)h(basis)f(for)h(run)l(time)g(optimization)f(and)h
+ (adaptation)f(of)h(Grid)-303 2827 y(programs,)70 b(and)e(as)f(an)g
+ (implemen)l(tation)g(platform)g(for)g(a)g(no)l(v)l(el)-303
+ 3001 y(programming)50 b(language.)-258 3350 y Fb(4.2.2)183
+ b(SAFECode:)142 b(A)84 b(safe)g(low\255le)m(vel)g(r)-7
+ b(epr)g(esentation)290 3524 y(and)47 b(e)l(xecution)g(en)-7
+ b(vir)f(onment)-154 3740 y Fi(SAFECo)t(de)52 b(is)f(a)g(\\safe")f(co)t
+ (de)j(represen)l(tation)e(and)h(execution)-303 3914 y(en)l(vironmen)l
+ (t,)40 b(based)e(on)g(a)f(t)l(yp)t(e-safe)h(subset)g(of)f(LL)-17
+ b(VM.)37 b(The)i(goal)-303 4089 y(of)53 b(the)h(w)l(ork)f(is)g(to)g
+ (enforce)h(memory)g(safet)l(y)f(of)g(programs)g(in)g(the)-303
+ 4263 y(SAFECo)t(de)e(represen)l(tation)f(through)h(static)e(analysis,)g
+ (b)l(y)h(using)-303 4437 y(a)37 b(v)-9 b(arian)l(t)37
+ b(of)g(automatic)f(p)t(o)t(ol)h(allo)t(cation)g(instead)g(of)g(garbage)
+ g(col-)-303 4612 y(lection)46 b([19],)f(and)i(using)f(extensiv)l(e)h
+ (in)l(terpro)t(cedural)g(static)e(anal-)-303 4786 y(ysis)50
+ b(to)g(minimize)i(run)l(time)f(c)l(hec)l(ks)g([28,)f(19].)-154
+ 4960 y(The)57 b(SAFECo)t(de)g(system)e(exploits)g(nearly)i(all)e
+ (capabilities)g(of)-303 5135 y(the)60 b(LL)-17 b(VM)60
+ b(framew)l(ork,)h(except)g(run)l(time)f(optimization.)92
+ b(It)61 b(di-)-303 5309 y(rectly)i(uses)f(the)i(LL)-17
+ b(VM)62 b(co)t(de)i(represen)l(tation,)i(whic)l(h)d(pro)l(vides)-303
+ 5483 y(the)40 b(abilit)l(y)e(to)h(analyze)h(C)f(and)h(C++)h(programs,)g
+ (whic)l(h)f(is)f(crucial)-303 5658 y(for)73 b(supp)t(orting)g(em)l(b)t
+ (edded)j(soft)l(w)l(are,)h(middle-w)l(are,)i(and)74 b(sys-)-303
+ 5832 y(tem)56 b(libraries.)81 b(SAFECo)t(de)57 b(relies)f(on)g(the)g(t)
+ l(yp)t(e)h(information)e(in)-303 6006 y(LL)-17 b(VM)38
+ b(\(with)f(no)h(syn)l(tactic)g(c)l(hanges\))g(to)g(c)l(hec)l(k)g(and)h
+ (enforce)g(t)l(yp)t(e)-303 6181 y(safet)l(y)-13 b(.)87
+ b(It)59 b(relies)e(on)i(the)f(arra)l(y)g(t)l(yp)t(e)g(information)f(in)
+ h(LL)-17 b(VM)58 b(to)-303 6355 y(enforce)d(arra)l(y)e(b)t(ounds)i
+ (safet)l(y)-13 b(,)54 b(and)g(uses)g(in)l(terpro)t(cedural)h(anal-)-303
+ 6529 y(ysis)48 b(to)h(eliminate)g(run)l(time)h(b)t(ounds)h(c)l(hec)l
+ (ks)f(in)f(man)l(y)h(cases)f([28].)-303 6704 y(It)60
+ b(uses)g(in)l(terpro)t(cedural)h(safet)l(y)e(c)l(hec)l(king)h(tec)l
+ (hniques,)j(exploit-)-303 6878 y(ing)35 b(the)h(link-time)f(framew)l
+ (ork)h(to)f(retain)g(the)i(b)t(ene\014ts)f(of)g(separate)-303
+ 7052 y(compilation)48 b(\(a)h(k)l(ey)h(di\016cult)l(y)f(that)g(led)h
+ (previous)g(suc)l(h)g(systems)-303 7227 y(to)g(a)l(v)l(oid)h(using)g
+ (in)l(terpro)t(cedural)h(tec)l(hniques)g([17,)e(23]\).)-258
+ 7575 y Fb(4.2.3)183 b(External)47 b(ISA)f(design)i(for)f(V)-14
+ b(irtual)46 b(Instruction)h(Set)290 7750 y(Computer)n(s)-154
+ 7966 y Fi(Virtual)53 b(Instruction)h(Set)g(Computers)g([40,)f(16,)h(2])
+ f(are)h(pro)t(ces-)-303 8140 y(sor)e(designs)h(that)g(use)h(t)l(w)l(o)e
+ (distinct)h(instruction)g(sets:)71 b(an)54 b(exter-)-303
+ 8314 y(nally)70 b(visible,)75 b(virtual)c(instruction)f(set)h
+ (\(V-ISA\))h(whic)l(h)f(serv)l(es)-303 8489 y(as)64 b(the)h(program)g
+ (represen)l(tation)g(for)g(all)f(soft)l(w)l(are,)j(and)e(a)g(hid-)-303
+ 8663 y(den)g(implemen)l(tation-sp)t(eci\014c)f(instruction)g(set)g
+ (\(I-ISA\))h(that)e(is)-303 8837 y(the)50 b(actual)g(hardw)l(are)g
+ (ISA.)g(A)h(soft)l(w)l(are)d(translator)h(co-designed)-303
+ 9012 y(with)41 b(the)g(hardw)l(are)h(translates)e(V-ISA)i(co)t(de)h(to)
+ d(the)i(I-ISA)h(trans-)-303 9186 y(paren)l(tly)c(for)g(execution,)k
+ (and)d(is)e(the)i(only)f(soft)l(w)l(are)g(that)g(is)f(a)l(w)l(are)-303
+ 9360 y(of)63 b(the)g(I-ISA.)h(This)f(translator)f(is)g(essen)l(tially)g
+ (a)h(sophisticated,)-303 9535 y(implemen)l(tation-sp)t(eci\014c)51
+ b(bac)l(k-end)i(compiler.)-154 9709 y(In)45 b(recen)l(t)g(w)l(ork,)f(w)
+ l(e)g(argued)h(that)e(an)h(extended)i(v)l(ersion)e(of)f(the)-303
+ 9883 y(LL)-17 b(VM)37 b(instruction)g(set)h(could)g(b)t(e)g(a)g(go)t(o)
+ t(d)g(c)l(hoice)g(for)f(the)h(external)-303 10058 y(V-ISA)58
+ b(for)e(suc)l(h)h(pro)t(cessor)g(designs)g([2].)84 b(W)-13
+ b(e)57 b(prop)t(osed)g(a)g(no)l(v)l(el)-303 10232 y(implemen)l(tation)
+ 48 b(strategy)g(for)g(the)h(virtual-to-nativ)l(e)f(translator)-303
+ 10406 y(that)64 b(enables)i(o\017ine)f(co)t(de)h(translation)e(and)i
+ (cac)l(hing)f(of)g(trans-)-303 10581 y(lated)51 b(co)t(de)h(in)f(a)g
+ (completely)g(OS-indep)t(enden)l(t)k(manner.)-154 10755
+ y(That)50 b(w)l(ork)g Fh(exploits)63 b Fi(the)51 b(imp)t(ortan)l(t)f
+ (features)g(of)h(the)g(instruc-)4080 -137 y(tion)64 b(set)g(represen)l
+ (tation,)k(and)d(extends)g(it)f(to)f(b)t(e)j(suitable)e(as)f(a)4080
+ 37 y(V-ISA)78 b(for)f(hardw)l(are.)144 b(The)78 b(fundamen)l(tal)f(b)t
+ (ene\014t)h(of)e(LL)-17 b(VM)4080 211 y(for)56 b(this)g(w)l(ork)g(is)f
+ (that)h(the)h(LL)-17 b(VM)56 b(co)t(de)h(represen)l(tation)f(is)g(lo)l
+ (w-)4080 386 y(lev)l(el)75 b(enough)h(to)e(represen)l(t)i(arbitrary)f
+ (external)g(soft)l(w)l(are)e(\(in-)4080 560 y(cluding)f(op)t(erating)g
+ (system)g(co)t(de\),)77 b(y)l(et)72 b(pro)l(vides)f(ric)l(h)h(enough)
+ 4080 734 y(information)45 b(to)h(supp)t(ort)h(sophisticated)e(compiler)
+ h(tec)l(hniques)h(in)4080 909 y(the)42 b(translator.)63
+ b(A)41 b(second)g(k)l(ey)g(b)t(ene\014t)i(is)d(the)i(abilit)l(y)d(to)i
+ (do)g(b)t(oth)4080 1083 y(o\017ine)48 b(and)h(online)f(translation,)f
+ (whic)l(h)h(is)f(exploited)i(b)l(y)f(the)g(OS-)4080 1257
+ y(indep)t(enden)l(t)54 b(translation)49 b(strategy)-13
+ b(.)4080 1648 y Fj(5.)199 b(RELA)-19 b(TED)49 b(W)n(ORK)4230
+ 1864 y Fi(W)-13 b(e)58 b(fo)t(cus)g(on)g(comparing)g(LL)-17
+ b(VM)57 b(with)h(three)g(classes)f(of)g(pre-)4080 2038
+ y(vious)g(w)l(ork:)80 b(other)57 b(virtual-mac)l(hine-based)h(compiler)
+ g(systems,)4080 2212 y(researc)l(h)51 b(on)g(t)l(yp)t(ed)g(assem)l(bly)
+ f(languages,)g(and)h(link-time)f(or)h(dy-)4080 2387 y(namic)g
+ (optimization)f(systems.)4230 2561 y(As)43 b(noted)i(in)f(the)g(in)l
+ (tro)t(duction,)h(the)g(goals)d(of)i(LL)-17 b(VM)44 b(are)g(com-)4080
+ 2735 y(plemen)l(tary)81 b(to)e(those)h(of)g(higher-lev)l(el)h(language)
+ f(virtual)f(ma-)4080 2910 y(c)l(hines)38 b(suc)l(h)g(as)f(SmallT)-13
+ b(alk,)39 b(Self,)i(JVM,)c(and)h(the)g(managed)h(mo)t(de)4080
+ 3084 y(of)52 b(Microsoft)f(CLI.)i(High-lev)l(el)f(virtual)g(mac)l
+ (hines)g(suc)l(h)h(as)f(these)4080 3258 y(require)70
+ b(a)f(particular)f(ob)9 b(ject)69 b(mo)t(del)g(and)g(run)l(time)g
+ (system)f(for)4080 3433 y(use.)119 b(This)67 b(implies)g(that)h(they)g
+ (can)g(pro)l(vide)g(higher-lev)l(el)h(t)l(yp)t(e)4080
+ 3607 y(information)i(ab)t(out)g(the)h(program,)j(but)d(are)g(not)f
+ (able)g(to)g(sup-)4080 3781 y(p)t(ort)46 b(languages)f(that)g(do)h(not)
+ g(matc)l(h)f(their)h(design)g(\(ev)l(en)g(ob)9 b(ject-)4080
+ 3956 y(orien)l(ted)38 b(languages)e(suc)l(h)i(as)f(C++\).)63
+ b(Additionally)-13 b(,)40 b(programs)c(in)4080 4130 y(these)53
+ b(represen)l(tations)f(\(except)h(CLI\))g(are)g(required)g(to)f(b)t(e)i
+ (t)l(yp)t(e-)4080 4304 y(safe.)144 b(This)76 b(is)g(imp)t(ortan)l(t)g
+ (for)g(supp)t(orting)h(mobile)f(co)t(de,)84 b(but)4080
+ 4479 y(mak)l(es)61 b(these)h(virtual)f(mac)l(hines)h(insu\016cien)l(t)g
+ (for)f(non-t)l(yp)t(e-safe)4080 4653 y(languages)40 b(and)h(for)g(lo)l
+ (w-lev)l(el)f(system)g(co)t(de.)65 b(It)41 b(also)e(signi\014can)l(tly)
+ 4080 4827 y(limits)57 b(the)h(amoun)l(t)g(of)g(optimization)f(that)h
+ (can)g(b)t(e)h(done)g(b)t(efore)4080 5002 y(run)l(time)52
+ b(b)t(ecause)g(of)f(the)g(need)i(for)e(b)l(yteco)t(de)h(v)l
+ (eri\014cation.)4230 5176 y(The)k(Microsoft)f(CLI)h(virtual)f(mac)l
+ (hine)h(has)g(a)f(n)l(um)l(b)t(er)i(of)f(fea-)4080 5350
+ y(tures)67 b(that)f(distinguish)g(it)g(from)h(other)f(high-lev)l(el)h
+ (virtual)f(ma-)4080 5525 y(c)l(hines,)39 b(including)e(explicit)f(supp)
+ t(ort)g(for)g(a)g(wide)h(range)f(of)g(features)4080 5699
+ y(from)50 b(m)l(ultiple)f(languages,)g(language)g(in)l(terop)t
+ (erabilit)l(y)g(supp)t(ort,)4080 5873 y(non-t)l(yp)t(e-safe)44
+ b(co)t(de,)h(and)e(\\unmanaged")g(execution)h(mo)t(de.)66
+ b(Un-)4080 6048 y(managed)36 b(mo)t(de)g(allo)l(ws)e(CLI)h(to)g
+ (represen)l(t)i(co)t(de)f(in)f(arbitrary)g(lan-)4080
+ 6222 y(guages,)48 b(including)g(those)f(that)h(do)f(not)h(conform)g(to)
+ f(its)g(t)l(yp)t(e)h(sys-)4080 6397 y(tem)57 b(or)g(run)l(time)h
+ (framew)l(ork,)g(e.g.,)f(ANSI-standard)i(C++)f([34].)4080
+ 6571 y(Ho)l(w)l(ev)l(er,)79 b(co)t(de)74 b(in)g(unmanaged)h(mo)t(de)f
+ (is)f(not)g(represen)l(ted)i(in)4080 6745 y(the)56 b(CLI)g(in)l
+ (termediate)g(represen)l(tation)g(\(MSIL\),)f(and)h(therefore)4080
+ 6920 y(is)85 b(not)h(sub)9 b(ject)86 b(to)f(dynamic)i(optimization)d
+ (in)i(CLI.)g(In)h(con-)4080 7094 y(trast,)c(LL)-17 b(VM)77
+ b(allo)l(ws)f(co)t(de)j(from)e(arbitrary)g(languages)g(to)g(b)t(e)4080
+ 7268 y(represen)l(ted)50 b(in)e(a)g(uniform,)g(ric)l(h)g(represen)l
+ (tation)h(and)f(optimized)4080 7443 y(throughout)c(the)g(lifetime)g(of)
+ f(the)h(co)t(de.)67 b(A)44 b(second)g(k)l(ey)g(di\013erence)4080
+ 7617 y(is)50 b(that)g(LL)-17 b(VM)51 b(lac)l(ks)e(the)i(in)l(terop)t
+ (erabilit)l(y)f(features)h(of)f(CLI)h(but)4080 7791 y(also)41
+ b(do)t(es)h(not)g(require)h(source-languages)f(to)g(matc)l(h)g(the)g
+ (run)l(time)4080 7966 y(and)66 b(ob)9 b(ject)66 b(mo)t(del)g(for)f(in)l
+ (terop)t(erabilit)l(y)-13 b(.)111 b(Instead,)69 b(it)c(requires)4080
+ 8140 y(source-language)70 b(compilers)f(to)g(manage)g(in)l(terop)t
+ (erabilit)l(y)-13 b(,)73 b(but)4080 8314 y(then)44 b(allo)l(ws)e(all)h
+ (suc)l(h)h(co)t(de)g(to)f(b)t(e)i(exp)t(osed)f(to)f(LL)-17
+ b(VM)44 b(optimizers)4080 8489 y(at)51 b(all)f(stages.)4230
+ 8663 y(The)d(Omniw)l(are)h(virtual)e(mac)l(hine)i([1])e(is)g(closer)h
+ (to)g(LL)-17 b(VM,)46 b(b)t(e-)4080 8837 y(cause)53 b(they)g(use)g(an)g
+ (abstract)f(lo)l(w-lev)l(el)f(RISC)j(arc)l(hitecture)f(and)4080
+ 9012 y(can)67 b(supp)t(ort)g(arbitrary)f(co)t(de)h(\(including)f(non-t)
+ l(yp)t(e-safe)i(co)t(de\))4080 9186 y(from)49 b(an)l(y)f(source)h
+ (language.)67 b(Ho)l(w)l(ev)l(er,)48 b(the)h(Omniw)l(are)g(instruc-)
+ 4080 9360 y(tion)69 b(set)f(lac)l(ks)h(the)g(higher-lev)l(el)g(t)l(yp)t
+ (e)h(information)e(of)h(LL)-17 b(VM.)4080 9535 y(In)59
+ b(fact,)g(it)e(allo)l(ws)f(\(and)j(requires\))f(source)g(compilers)g
+ (to)f(c)l(ho)t(ose)4080 9709 y(data)c(la)l(y)l(outs,)f(p)t(erform)i
+ (address)g(arithmetic,)f(and)h(p)t(erform)g(reg-)4080
+ 9883 y(ister)43 b(allo)t(cation)f(\(to)g(a)h(small)f(set)h(of)g
+ (virtual)f(registers\).)64 b(All)43 b(these)4080 10058
+ y(features)38 b(mak)l(e)g(it)f(di\016cult)h(to)g(p)t(erform)h(an)l(y)e
+ (sophisticated)g(analy-)4080 10232 y(sis)50 b(on)i(the)g(resulting)f
+ (Omniw)l(are)h(co)t(de.)69 b(These)52 b(di\013erences)g(from)4080
+ 10406 y(LL)-17 b(VM)66 b(arise)f(b)t(ecause)i(the)f(goals)f(of)g(their)
+ h(w)l(ork)g(are)g(primarily)4080 10581 y(to)54 b(pro)l(vide)g(co)t(de)g
+ (mobilit)l(y)f(and)h(safet)l(y)-13 b(,)54 b(not)f(a)h(basis)f(for)g
+ (lifelong)4080 10755 y(co)t(de)66 b(optimization.)106
+ b(Their)64 b(virtual)g(mac)l(hine)h(compiles)f(Omni-)p
+ eop end
+ %%Page: 11 11
+ TeXDict begin 11 10 bop -303 -137 a Fi(w)l(are)76 b(co)t(de)h(to)f
+ (nativ)l(e)g(co)t(de)h(at)f(run)l(time,)82 b(and)77 b(p)t(erforms)g
+ (only)-303 37 y(relativ)l(ely)45 b(simple)g(optimizations)g(plus)h
+ (some)f(stronger)h(mac)l(hine-)-303 211 y(dep)t(enden)l(t)53
+ b(optimizations.)-154 386 y(Kistler)f(and)i(F)-13 b(ranz)53
+ b(describ)t(e)h(a)f(compilation)f(arc)l(hitecture)h(for)-303
+ 560 y(p)t(erforming)80 b(optimization)g(in)g(the)g(\014eld,)88
+ b(using)80 b(simple)g(initial)-303 734 y(load-time)67
+ b(co)t(de)h(generation,)j(follo)l(w)l(ed)66 b(b)l(y)i(pro\014le-guided)
+ h(run-)-303 909 y(time)i(optimization)f([27].)129 b(Their)72
+ b(system)e(targets)h(the)h(Ob)t(eron)-303 1083 y(language,)49
+ b(uses)g(Slim)h(Binaries)e([22])h(as)g(its)f(co)t(de)j(represen)l
+ (tation,)-303 1257 y(and)58 b(pro)l(vides)g(t)l(yp)t(e)g(safet)l(y)f
+ (and)i(memory)f(managemen)l(t)g(similar)-303 1432 y(to)f(other)g
+ (high-lev)l(el)h(virtual)f(mac)l(hines.)86 b(They)58
+ b(do)g(not)f(attempt)-303 1606 y(to)50 b(supp)t(ort)i(arbitrary)e
+ (languages)h(or)f(to)h(use)g(a)g(transparen)l(t)g(run-)-303
+ 1780 y(time)37 b(system,)j(as)d(LL)-17 b(VM)38 b(do)t(es.)64
+ b(They)39 b(also)d(do)i(not)g(prop)t(ose)h(doing)-303
+ 1955 y(static)50 b(or)h(link-time)f(optimization.)-154
+ 2129 y(There)f(has)f(b)t(een)h(a)f(wide)g(range)g(of)g(w)l(ork)g(on)g
+ (t)l(yp)t(ed)g(in)l(termedi-)-303 2304 y(ate)40 b(represen)l(tations.)
+ 65 b(F)-13 b(unctional)41 b(languages)f(often)h(use)h(strongly)-303
+ 2478 y(t)l(yp)t(ed)49 b(in)l(termediate)h(languages)e(\(e.g.)67
+ b([38]\))48 b(as)g(a)h(natural)g(exten-)-303 2652 y(sion)39
+ b(of)g(the)h(source)g(language.)64 b(Pro)9 b(jects)38
+ b(on)i(t)l(yp)t(ed)g(assem)l(bly)f(lan-)-303 2827 y(guages)58
+ b(\(e.g.,)h(T)-13 b(AL)59 b([35])e(and)i(L)-13 b(T)g(AL)59
+ b([10]\))e(fo)t(cus)i(on)f(preserving)-303 3001 y(high-lev)l(el)64
+ b(t)l(yp)t(e)h(information)e(and)i(t)l(yp)t(e)g(safet)l(y)f(during)g
+ (compi-)-303 3175 y(lation)g(and)i(optimizations.)108
+ b(The)66 b(SafeTSA)g([3])f(represen)l(tation)-303 3350
+ y(is)49 b(a)i(com)l(bination)f(of)g(t)l(yp)t(e)h(information)f(with)g
+ (SSA)h(form,)f(whic)l(h)-303 3524 y(aims)40 b(to)i(pro)l(vide)g(a)f
+ (safe)h(but)g(more)g(e\016cien)l(t)g(represen)l(tation)g(than)-303
+ 3698 y(JVM)61 b(b)l(yteco)t(de)i(for)f(Ja)l(v)-9 b(a)61
+ b(programs.)99 b(In)63 b(con)l(trast,)g(the)f(LL)-17
+ b(VM)-303 3873 y(virtual)72 b(instruction)h(set)h(do)t(es)f(not)h
+ (attempt)f(to)g(preserv)l(e)h(t)l(yp)t(e)-303 4047 y(safet)l(y)47
+ b(of)h(high-lev)l(el)g(languages,)g(to)g(capture)h(high-lev)l(el)f(t)l
+ (yp)t(e)h(in-)-303 4221 y(formation)72 b(from)h(suc)l(h)h(languages,)k
+ (or)c(to)f(enforce)h(co)t(de)h(safet)l(y)-303 4396 y(directly)55
+ b(\(though)g(it)g(can)g(b)t(e)h(used)g(to)f(do)g(so)g([19]\).)78
+ b(Instead,)56 b(the)-303 4570 y(goal)46 b(of)h(LL)-17
+ b(VM)47 b(is)g(to)f(enable)i(sophisticated)f(analyses)f(and)i(trans-)
+ -303 4744 y(formations)i(b)t(ey)l(ond)i(static)e(compile)h(time.)-154
+ 4919 y(There)f(ha)l(v)l(e)e(b)t(een)i(attempts)e(to)g(de\014ne)i(a)e
+ (uni\014ed,)i(generic,)g(in-)-303 5093 y(termediate)57
+ b(represen)l(tation.)85 b(These)58 b(ha)l(v)l(e)e(largely)h(failed,)h
+ (rang-)-303 5267 y(ing)74 b(from)h(the)g(original)f(UNiv)l(ersal)g
+ (Computer)i(Orien)l(ted)f(Lan-)-303 5442 y(guage)e([42])e(\(UNCOL\),)i
+ (whic)l(h)g(w)l(as)f(discussed)h(but)g(nev)l(er)h(im-)-303
+ 5616 y(plemen)l(ted,)h(to)69 b(the)h(more)g(recen)l(t)h(Arc)l
+ (hitecture)g(and)f(language)-303 5790 y(Neutral)77 b(Distribution)g(F)
+ -13 b(ormat)78 b([4])f(\(ANDF\),)g(whic)l(h)h(w)l(as)f(im-)-303
+ 5965 y(plemen)l(ted)69 b(but)g(has)e(seen)i(limited)f(use.)119
+ b(These)69 b(uni\014ed)g(repre-)-303 6139 y(sen)l(tations)57
+ b(attempt)h(to)g(describ)t(e)i(programs)e(at)g(the)h(AST)g(lev)l(el,)
+ -303 6313 y(b)l(y)i(including)g(features)g(from)f(all)g(supp)t(orted)i
+ (source)g(languages.)-303 6488 y(LL)-17 b(VM)53 b(is)f(m)l(uc)l(h)h
+ (less)g(am)l(bitious)f(and)h(is)f(more)i(lik)l(e)e(an)i(assem)l(bly)
+ -303 6662 y(language:)87 b(it)60 b(uses)h(a)f(small)g(set)g(of)h(t)l
+ (yp)t(es)g(and)g(lo)l(w-lev)l(el)f(op)t(era-)-303 6837
+ y(tions,)50 b(and)i(the)g(\\implemen)l(tation")f(of)g(high-lev)l(el)h
+ (language)f(fea-)-303 7011 y(tures)66 b(is)g(describ)t(ed)i(in)e(terms)
+ h(of)f(these)h(t)l(yp)t(es.)114 b(In)67 b(some)f(w)l(a)l(ys,)-303
+ 7185 y(LL)-17 b(VM)51 b(simply)f(app)t(ears)i(as)e(a)h(strict)g(RISC)h
+ (arc)l(hitecture.)-154 7360 y(Sev)l(eral)61 b(systems)e(p)t(erform)i
+ (in)l(terpro)t(cedural)h(optimization)d(at)-303 7534
+ y(link-time.)182 b(Some)89 b(op)t(erate)h(on)g(assem)l(bly)e(co)t(de)j
+ (for)e(a)g(giv)l(en)-303 7708 y(pro)t(cessor)67 b([36,)i(41,)h(14,)g
+ (37])c(\(fo)t(cusing)h(primarily)f(on)h(mac)l(hine-)-303
+ 7883 y(dep)t(enden)l(t)41 b(optimizations\),)e(while)g(others)g(exp)t
+ (ort)g(additional)g(in-)-303 8057 y(formation)49 b(from)h(the)g(static)
+ f(compiler,)h(either)g(in)h(the)f(form)g(of)g(an)-303
+ 8231 y(IR)j(or)g(annotations)e([44,)h(21,)h(5,)f(26].)72
+ b(None)54 b(of)e(these)h(approac)l(hes)-303 8406 y(attempt)h(to)g(supp)
+ t(ort)h(optimization)f(at)g(run)l(time)h(or)f(o\017ine)h(after)-303
+ 8580 y(soft)l(w)l(are)48 b(is)h(installed)g(in)h(the)g(\014eld,)g(and)g
+ (it)f(w)l(ould)h(b)t(e)g(di\016cult)g(to)-303 8754 y(directly)h(extend)
+ h(them)g(to)f(do)g(so.)-154 8929 y(There)f(ha)l(v)l(e)f(also)g(b)t(een)
+ h(sev)l(eral)f(systems)f(that)h(p)t(erform)h(trans-)-303
+ 9103 y(paren)l(t)36 b(run)l(time)g(optimization)f(of)g(nativ)l(e)h(co)t
+ (de)h([6,)h(20,)g(16].)62 b(These)-303 9277 y(systems)76
+ b(inherit)i(all)e(the)i(c)l(hallenges)f(of)g(optimizing)g(mac)l(hine-)
+ -303 9452 y(lev)l(el)e(co)t(de)i([36])d(in)i(addition)f(to)g(the)i
+ (constrain)l(t)d(of)i(op)t(erating)-303 9626 y(under)d(the)e(tigh)l(t)g
+ (time)g(constrain)l(ts)f(of)i(run)l(time)f(optimization.)-303
+ 9800 y(In)g(con)l(trast,)k(LL)-17 b(VM)71 b(aims)f(to)h(pro)l(vide)g(t)
+ l(yp)t(e,)76 b(data\015o)l(w)70 b(\(SSA\))-303 9975 y(information,)59
+ b(and)h(an)f(explicit)f(CF)l(G)h(for)g(use)g(b)l(y)g(run)l(time)g
+ (opti-)-303 10149 y(mizations.)65 b(F)-13 b(or)48 b(example,)h(our)e
+ (online)h(tracing)g(framew)l(ork)f(\(Sec-)-303 10323
+ y(tion)63 b(3.5\))f(directly)h(exploits)g(the)h(CF)l(G)f(at)f(run)l
+ (time)i(to)f(p)t(erform)-303 10498 y(limited)f(instrumen)l(tation)g(of)
+ g(hot)h(lo)t(op)f(regions.)102 b(Finally)-13 b(,)65 b(none)-303
+ 10672 y(of)c(these)h(systems)f(supp)t(orts)g(link-time,)j
+ (install-time,)e(or)g(o\017ine)4080 -137 y(optimizations,)49
+ b(with)i(or)g(without)g(pro\014le)h(information.)4080
+ 255 y Fj(6.)199 b(CONCLUSION)4230 471 y Fi(This)46 b(pap)t(er)j(has)e
+ (describ)t(ed)h(LL)-17 b(VM,)47 b(a)g(system)g(for)g(p)t(erforming)4080
+ 645 y(lifelong)61 b(co)t(de)h(analysis)e(and)i(transformation,)h(while)
+ e(remaining)4080 819 y(transparen)l(t)f(to)g(programmers.)96
+ b(The)61 b(system)e(uses)h(a)h(lo)l(w-lev)l(el,)4080
+ 994 y(t)l(yp)t(ed,)48 b(SSA-based)g(instruction)d(set)h(as)g(the)h(p)t
+ (ersisten)l(t)f(represen-)4080 1168 y(tation)64 b(of)g(a)g(program,)j
+ (but)d(without)g(imp)t(osing)g(a)g(sp)t(eci\014c)h(run-)4080
+ 1343 y(time)k(en)l(vironmen)l(t.)124 b(The)70 b(LL)-17
+ b(VM)69 b(represen)l(tation)h(is)e(language)4080 1517
+ y(indep)t(enden)l(t,)54 b(allo)l(wing)c(all)g(the)i(co)t(de)h(for)e(a)h
+ (program,)f(including)4080 1691 y(system)46 b(libraries)g(and)h(p)t
+ (ortions)f(written)h(in)f(di\013eren)l(t)h(languages,)4080
+ 1866 y(to)65 b(b)t(e)i(compiled)f(and)g(optimized)g(together.)111
+ b(The)67 b(LL)-17 b(VM)65 b(com-)4080 2040 y(piler)72
+ b(framew)l(ork)g(is)g(designed)g(to)g(p)t(ermit)h(optimization)d(at)i
+ (all)4080 2214 y(stages)59 b(of)h(a)f(soft)l(w)l(are)g(lifetime,)i
+ (including)f(extensiv)l(e)g(static)f(op-)4080 2389 y(timization,)h
+ (online)f(optimization)f(using)h(information)f(from)h(the)4080
+ 2563 y(LL)-17 b(VM)56 b(co)t(de,)j(and)d(idle-time)g(optimization)f
+ (using)h(pro\014le)h(infor-)4080 2737 y(mation)37 b(gathered)i(from)f
+ (programmers)g(in)f(the)i(\014eld.)64 b(The)38 b(curren)l(t)4080
+ 2912 y(implemen)l(tation)46 b(includes)g(a)g(p)t(o)l(w)l(erful)h
+ (link-time)e(global)g(and)i(in-)4080 3086 y(terpro)t(cedural)71
+ b(optimizer,)j(a)69 b(lo)l(w-o)l(v)l(erhead)g(tracing)g(tec)l(hnique)
+ 4080 3260 y(for)49 b(run)l(time)h(optimization,)e(and)i(Just-In-Time)f
+ (and)h(static)e(co)t(de)4080 3435 y(generators.)4230
+ 3609 y(W)-13 b(e)55 b(sho)l(w)l(ed)g(exp)t(erimen)l(tally)g(and)h
+ (based)f(on)g(exp)t(erience)j(that)4080 3783 y(LL)-17
+ b(VM)56 b(mak)l(es)g(a)l(v)-9 b(ailable)56 b(extensiv)l(e)g(t)l(yp)t(e)
+ h(information)e(ev)l(en)i(for)4080 3958 y(C)50 b(programs,)g(whic)l(h)h
+ (can)f(b)t(e)i(used)e(to)g(safely)g(p)t(erform)h(a)f(n)l(um)l(b)t(er)
+ 4080 4132 y(of)74 b(aggressiv)l(e)f(transformations)g(that)h(w)l(ould)g
+ (normally)f(b)t(e)j(at-)4080 4306 y(tempted)50 b(only)f(on)g(t)l(yp)t
+ (e-safe)g(languages)f(in)h(source-lev)l(el)g(compil-)4080
+ 4481 y(ers.)74 b(W)-13 b(e)53 b(also)f(sho)l(w)l(ed)h(that)f(the)i(LL)
+ -17 b(VM)53 b(represen)l(tation)g(is)f(com-)4080 4655
+ y(parable)47 b(in)g(size)f(to)h(X86)f(mac)l(hine)h(co)t(de)h(and)f(ab)t
+ (out)g(25\045)f(smaller)4080 4829 y(than)39 b(SP)-13
+ b(AR)l(C)38 b(co)t(de)h(on)g(a)l(v)l(erage,)h(despite)e(capturing)h(m)l
+ (uc)l(h)g(ric)l(her)4080 5004 y(t)l(yp)t(e)65 b(information)f(as)f(w)l
+ (ell)h(as)g(an)g(in\014nite)h(register)f(set)g(in)g(SSA)4080
+ 5178 y(form.)99 b(Finally)-13 b(,)64 b(w)l(e)e(ga)l(v)l(e)f(sev)l(eral)
+ g(examples)h(of)f(whole-program)4080 5352 y(optimizations)34
+ b(that)h(are)g(v)l(ery)h(e\016cien)l(t)f(to)g(p)t(erform)h(on)g(the)f
+ (LL)-17 b(VM)4080 5527 y(represen)l(tation.)66 b(A)45
+ b(k)l(ey)g(question)f(w)l(e)h(are)g(exploring)g(curren)l(tly)g(is)4080
+ 5701 y(whether)52 b(high-lev)l(el)e(language)g(virtual)g(mac)l(hines)g
+ (can)h(b)t(e)g(imple-)4080 5876 y(men)l(ted)39 b(e\013ectiv)l(ely)f(on)
+ h(top)f(of)g(the)h(LL)-17 b(VM)38 b(run)l(time)h(optimization)4080
+ 6050 y(and)52 b(co)t(de)g(generation)f(framew)l(ork.)4080
+ 6442 y Fj(7.)199 b(REFERENCES)4157 6646 y Fi([1])74 b(A.-R.)51
+ b(Adl-T)-13 b(abatabai,)50 b(G.)h(Langdale,)g(S.)g(Lucco,)g(and)4394
+ 6820 y(R.)g(W)-13 b(ah)l(b)t(e.)51 b(E\016cien)l(t)g(and)h
+ (language-indep)t(enden)l(t)h(mobile)4394 6994 y(programs.)d(In)i
+ Fh(Pr)-8 b(o)g(c.)55 b(A)l(CM)f(SIGPLAN)i(1996)g(Confer)-8
+ b(enc)g(e)4394 7169 y(on)55 b(Pr)-8 b(o)g(gr)g(amming)56
+ b(L)-8 b(anguage)56 b(Design)e(and)4394 7343 y(Implementation)p
+ Fi(,)f(pages)e(127{136.)e(A)l(CM)i(Press,)f(1996.)4157
+ 7534 y([2])74 b(V.)51 b(Adv)l(e,)g(C.)g(Lattner,)g(M.)g(Brukman,)g(A.)g
+ (Sh)l(ukla,)g(and)4394 7708 y(B.)f(Gaek)l(e.)h(LL)-17
+ b(V)g(A:)51 b(A)g(Lo)l(w-lev)l(el)g(Virtual)g(Instruction)g(Set)4394
+ 7883 y(Arc)l(hitecture.)e(In)g Fh(36)5667 7819 y Fa(th)5848
+ 7883 y Fh(Int'l)k(Symp.)h(on)f(Micr)-8 b(o)g(ar)g(chite)g(ctur)g(e)p
+ Fi(,)4394 8057 y(pages)51 b(205{216,)e(San)j(Diego,)f(CA,)g(Dec)h
+ (2003.)4157 8248 y([3])74 b(W.)51 b(Amme,)g(N.)g(Dalton,)f(J.)h(v)l(on)
+ g(Ronne,)h(and)g(M.)e(F)-13 b(ranz.)4394 8422 y(SafeTSA:)51
+ b(A)h(t)l(yp)t(e)f(safe)g(and)h(referen)l(tially)f(secure)4394
+ 8597 y(mobile-co)t(de)h(represen)l(tation)f(based)h(on)f(static)f
+ (single)4394 8771 y(assignmen)l(t)g(form.)h(In)g Fh(PLDI)p
+ Fi(,)h(June)g(2001.)4157 8962 y([4])74 b(ANDF)52 b(Consortium.)e(The)i
+ (Arc)l(hitectural)f(Neutral)4394 9136 y(Distribution)f(F)-13
+ b(ormat.)51 b Fk(http://www.andf.org/)p Fi(.)4157 9327
+ y([5])74 b(A.)51 b(Ay)l(ers,)g(S.)g(de)h(Jong,)e(J.)h(P)l(eyton,)g(and)
+ g(R.)g(Sc)l(ho)t(oler.)4394 9502 y(Scalable)g(cross-mo)t(dule)h
+ (optimization.)d Fh(A)l(CM)54 b(SIGPLAN)4394 9676 y(Notic)-8
+ b(es)p Fi(,)50 b(33\(5\):301{312,)e(1998.)4157 9867 y([6])74
+ b(V.)51 b(Bala,)f(E.)g(Duesterw)l(ald,)h(and)h(S.)f(Banerjia.)f
+ (Dynamo:)69 b(A)4394 10041 y(transparen)l(t)51 b(dynamic)g
+ (optimization)f(system.)h(In)h Fh(PLDI)p Fi(,)4394 10216
+ y(pages)f(1{12,)f(June)i(2000.)4157 10406 y([7])74 b(M.)50
+ b(Burk)l(e)i(and)g(L.)e(T)-13 b(orczon.)52 b(In)l(terpro)t(cedural)4394
+ 10581 y(optimization:)67 b(eliminating)50 b(unnecessary)i
+ (recompilation.)4394 10755 y Fh(T)-12 b(r)k(ans.)55 b(Pr)-8
+ b(o)g(g.)55 b(L)-8 b(ang.)56 b(and)f(Sys)p Fi(,)d(15\(3\):367{399,)c
+ (1993.)p eop end
+ %%Page: 12 12
+ TeXDict begin 12 11 bop -227 -137 a Fi([8])74 b(M.)51
+ b(G.)f(Burk)l(e)i(et)f(al.)f(The)i(Jalap)t(e)t(~)-81
+ b(no)52 b(Dynamic)f(Optimizing)10 37 y(Compiler)g(for)g(Ja)l(v)-9
+ b(a.)51 b(In)h Fh(Java)j(Gr)-8 b(ande)p Fi(,)51 b(pages)g(129{141,)10
+ 211 y(1999.)-227 402 y([9])74 b(D.)51 b(Chase.)g(Implemen)l(tation)h
+ (of)f(exception)h(handling.)f Fh(The)10 577 y(Journal)56
+ b(of)f(C)g(L)-8 b(anguage)55 b(T)-12 b(r)k(anslation)p
+ Fi(,)53 b(5\(4\):229{240,)10 751 y(June)f(1994.)-303
+ 942 y([10])73 b(J.)51 b(Chen,)h(D.)f(W)-13 b(u,)51 b(A.)g(W.)g(App)t
+ (el,)h(and)g(H.)f(F)-13 b(ang.)51 b(A)10 1116 y(pro)l(v)-9
+ b(ably)52 b(sound)f(T)-13 b(AL)52 b(for)f(bac)l(k-end)h(optimization.)e
+ (In)10 1291 y Fh(PLDI)p Fi(,)h(San)h(Diego,)f(CA,)g(Jun)g(2003.)-303
+ 1482 y([11])73 b(A.)51 b(Cherno\013,)h(et)f(al.)f(FX!32:)68
+ b(A)51 b(pro\014le-directed)i(binary)10 1656 y(translator.)d
+ Fh(IEEE)55 b(Micr)-8 b(o)p Fi(,)50 b(18\(2\):56{64,)f(1998.)-303
+ 1847 y([12])73 b(T.)51 b(M.)g(Chilim)l(bi,)f(B.)g(Da)l(vidson,)h(and)g
+ (J.)g(R.)g(Larus.)10 2021 y(Cac)l(he-conscious)h(structure)f
+ (de\014nition.)h(In)g Fh(A)l(CM)i(Symp.)10 2196 y(on)i(Pr)-8
+ b(o)g(g.)55 b(L)-8 b(ang.)55 b(Design)f(and)i(Implemenation)p
+ Fi(,)d(A)l(tlan)l(ta,)10 2370 y(GA,)e(Ma)l(y)f(1999.)-303
+ 2561 y([13])73 b(Co)t(deSourcery)-13 b(,)53 b(Compaq,)e(et)g(al.)g(C++)
+ h(ABI)f(for)g(Itanium.)10 2735 y Fk(http://www.codesource)q(ry)q(.c)q
+ (om)q(/cx)q(x-)q(ab)q(i/)q(ab)q(i.h)q(tm)q(l)p Fi(,)10
+ 2910 y(2001.)-303 3101 y([14])73 b(R.)51 b(Cohn,)g(D.)h(Go)t(o)t(dwin,)
+ e(and)i(P)-13 b(.)51 b(Lo)l(wney)-13 b(.)51 b(Optimizing)10
+ 3275 y(Alpha)f(executables)h(on)f(Windo)l(ws)f(NT)h(with)g(Spik)l(e.)g
+ Fh(Digital)10 3449 y(T)-12 b(e)k(chnic)g(al)56 b(Journal)p
+ Fi(,)51 b(9\(4\),)f(1997.)-303 3640 y([15])73 b(R.)51
+ b(Cytron,)g(J.)g(F)-13 b(erran)l(te,)51 b(B.)g(K.)g(Rosen,)g(M.)g(N.)g
+ (W)-13 b(egman,)10 3815 y(and)52 b(F.)f(K.)g(Zadec)l(k.)h(E\016cien)l
+ (tly)e(computing)h(static)f(single)10 3989 y(assignmen)l(t)g(form)h
+ (and)h(the)g(con)l(trol)e(dep)t(endence)55 b(graph.)10
+ 4163 y Fh(T)-12 b(r)k(ans.)55 b(Pr)-8 b(o)g(g.)55 b(L)-8
+ b(ang.)56 b(and)g(Sys.)p Fi(,)51 b(pages)g(13\(4\):451{490,)10
+ 4338 y(Octob)t(er)i(1991.)-303 4529 y([16])73 b(J.)51
+ b(C.)g(Dehnert,)h(et)f(al.)g(The)g(Transmeta)g(Co)t(de)h(Morphing)10
+ 4703 y(Soft)l(w)l(are:)68 b(Using)50 b(sp)t(eculation,)h(reco)l(v)l
+ (ery)h(and)f(adaptiv)l(e)10 4877 y(retranslation)f(to)h(address)g
+ (real-life)g(c)l(hallenges.)g(In)h Fh(1)3238 4814 y Fa(st)10
+ 5052 y Fh(IEEE/A)l(CM)j(Symp.)i(Co)-8 b(de)55 b(Gener)-8
+ b(ation)55 b(and)10 5226 y(Optimization)p Fi(,)d(San)g(F)-13
+ b(rancisco,)51 b(CA,)g(Mar)g(2003.)-303 5417 y([17])73
+ b(R.)51 b(DeLine)h(and)g(M.)f(F)-13 b(ahndric)l(h.)52
+ b(Enforcing)f(high-lev)l(el)10 5591 y(proto)t(cols)g(in)g(lo)l(w-lev)l
+ (el)f(soft)l(w)l(are.)g(In)i Fh(PLDI)p Fi(,)f(Sno)l(wbird,)10
+ 5766 y(UT,)g(June)h(2001.)-303 5956 y([18])73 b(L.)51
+ b(P)-13 b(.)51 b(Deutsc)l(h)g(and)h(A.)f(M.)g(Sc)l(hi\013man.)g
+ (E\016cien)l(t)10 6131 y(implemen)l(tation)g(of)g(the)g(smalltalk-80)e
+ (system.)h(In)i Fh(11th)10 6305 y(Symp.)57 b(on)e(Principles)g(of)g(Pr)
+ -8 b(o)g(gr)g(amming)56 b(L)-8 b(anguages)p Fi(,)10 6480
+ y(pages)51 b(297{301,)f(Jan)h(1984.)-303 6670 y([19])73
+ b(D.)51 b(Dh)l(urjati,)g(S.)g(Ko)l(wshik,)g(V.)g(Adv)l(e,)g(and)h(C.)f
+ (Lattner.)10 6845 y(Memory)g(safet)l(y)g(without)g(run)l(time)g(c)l
+ (hec)l(ks)g(or)g(garbage)10 7019 y(collection.)g(In)h
+ Fh(L)-8 b(anguages,)55 b(Compilers,)g(and)h(T)-12 b(o)k(ols)56
+ b(for)10 7194 y(Emb)-8 b(e)g(dde)g(d)56 b(Systems)f(\(LCTES\))p
+ Fi(,)c(San)g(Diego,)g(Jun)h(2003.)-303 7384 y([20])73
+ b(K.)52 b(Eb)t(cioglu)e(and)i(E.)e(R.)h(Altman.)g(D)l(AISY:)h(Dynamic)
+ 10 7559 y(compilation)e(for)h(100\045)g(arc)l(hitectural)g
+ (compatibilit)l(y)-13 b(.)49 b(In)10 7733 y Fh(ISCA)p
+ Fi(,)i(pages)g(26{37,)f(1997.)-303 7924 y([21])73 b(M.)51
+ b(F.)g(F)-13 b(ern\023)-77 b(andez.)53 b(Simple)f(and)f(e\013ectiv)l(e)
+ g(link-time)10 8098 y(optimization)f(of)h(Mo)t(dula-3)g(programs.)g
+ Fh(A)l(CM)j(SIGPLAN)10 8273 y(Notic)-8 b(es)p Fi(,)51
+ b(30\(6\):103{115,)d(1995.)-303 8464 y([22])73 b(M.)51
+ b(F)-13 b(ranz)52 b(and)g(T.)e(Kistler.)h(Slim)g(binaries.)10
+ 8638 y Fh(Communic)-8 b(ations)57 b(of)f(the)f(A)l(CM)p
+ Fi(,)50 b(40\(12\),)f(1997.)-303 8829 y([23])73 b(D.)51
+ b(Grossman,)f(G.)g(Morrisett,)g(T.)h(Jim,)f(M.)h(Hic)l(ks,)10
+ 9003 y(Y.)g(W)-13 b(ang,)51 b(and)h(J.)f(Cheney)-13 b(.)52
+ b(Region-based)g(memory)10 9178 y(managemen)l(t)g(in)f(cyclone.)g(In)h
+ Fh(PLDI)p Fi(,)f(Berlin,)g(German)l(y)-13 b(,)10 9352
+ y(June)52 b(2002.)-303 9543 y([24])73 b(D.)51 b(L.)g(Heine)h(and)g(M.)f
+ (S.)g(Lam.)f(A)i(practical)f(\015o)l(w-sensitiv)l(e)10
+ 9717 y(and)h(con)l(text-sensitiv)l(e)e(c)i(and)f(c++)i(memory)e(leak)10
+ 9892 y(detector.)h(In)g Fh(PLDI)p Fi(,)f(pages)g(168{181,)e(2003.)-303
+ 10083 y([25])73 b(M.)51 b(Hind.)g(Whic)l(h)h(p)t(oin)l(ter)f(analysis)f
+ (should)h(i)g(use?)68 b(In)52 b Fh(Int'l)10 10257 y(Symp.)57
+ b(on)e(Softwar)-8 b(e)56 b(T)-12 b(esting)54 b(and)i(A)l(nalysis)p
+ Fi(,)c(2000.)-303 10448 y([26])73 b(IBM)51 b(Corp.)g(XL)h(F)l(OR)-13
+ b(TRAN:)52 b(Eigh)l(t)e(W)-13 b(a)l(ys)50 b(to)h(Bo)t(ost)10
+ 10622 y(P)l(erformance.)g(White)g(P)l(ap)t(er,)g(2000.)4080
+ -137 y([27])74 b(T.)51 b(Kistler)f(and)i(M.)f(F)-13 b(ranz.)51
+ b(Con)l(tin)l(uous)g(program)4394 37 y(optimization:)67
+ b(A)51 b(case)g(study)-13 b(.)51 b Fh(A)l(CM)j(T)-12
+ b(r)k(ans.)56 b(on)f(Pr)-8 b(o)g(g.)4394 211 y(L)g(ang.)55
+ b(and)h(Sys.)p Fi(,)c(25\(4\):500{548,)c(Jul)j(2003.)4080
+ 402 y([28])74 b(S.)51 b(Ko)l(wshik,)f(D.)i(Dh)l(urjati,)e(and)i(V.)f
+ (Adv)l(e.)g(Ensuring)g(co)t(de)4394 577 y(safet)l(y)f(without)h(run)l
+ (time)g(c)l(hec)l(ks)h(for)f(real-time)g(con)l(trol)4394
+ 751 y(systems.)f(In)i Fh(Compilers,)j(A)l(r)-8 b(chite)g(ctur)g(e)54
+ b(and)i(Synthesis)f(for)4394 925 y(Emb)-8 b(e)g(dde)g(d)56
+ b(Systems)f(\(CASES\))p Fi(,)50 b(Grenoble,)i(Oct)f(2002.)4080
+ 1116 y([29])74 b(C.)51 b(Lattner)g(and)g(V.)g(Adv)l(e.)h(LL)-17
+ b(VM)51 b(Language)g(Reference)4394 1291 y(Man)l(ual.)4394
+ 1465 y Fk(http://llvm.cs.uiuc.ed)q(u/)q(do)q(cs)q(/La)q(ng)q(Re)q(f.)q
+ (ht)q(ml)p Fi(.)4080 1656 y([30])74 b(C.)51 b(Lattner)g(and)g(V.)g(Adv)
+ l(e.)h(Automatic)f(Po)t(ol)f(Allo)t(cation)4394 1830
+ y(for)f(Disjoin)l(t)f(Data)i(Structures.)f(In)i Fh(Pr)-8
+ b(o)g(c.)53 b(A)l(CM)g(SIGPLAN)4394 2005 y(Workshop)j(on)f(Memory)g
+ (System)h(Performanc)-8 b(e)p Fi(,)50 b(Berlin,)4394
+ 2179 y(German)l(y)-13 b(,)51 b(Jun)g(2002.)4080 2370
+ y([31])74 b(C.)51 b(Lattner)g(and)g(V.)g(Adv)l(e.)h(Data)f(Structure)h
+ (Analysis:)67 b(A)4394 2544 y(Fast)50 b(and)i(Scalable)f(Con)l
+ (text-Sensitiv)l(e)g(Heap)h(Analysis.)4394 2719 y(T)-13
+ b(ec)l(h.)51 b(Rep)t(ort)h(UIUCDCS-R-2003-2340,)f(Computer)4394
+ 2893 y(Science)i(Dept.,)e(Univ.)g(of)g(Illinois)f(at)g
+ (Urbana-Champaign,)4394 3067 y(Apr)i(2003.)4080 3258
+ y([32])74 b(T.)51 b(Lindholm)g(and)h(F.)f(Y)-13 b(ellin.)51
+ b Fh(The)j(Java)h(Virtual)h(Machine)4394 3433 y(Sp)-8
+ b(e)g(ci\014c)g(ation)p Fi(.)52 b(Addison-W)-13 b(esley)g(,)51
+ b(Reading,)g(MA,)g(1997.)4080 3624 y([33])74 b(E.)50
+ b(Meijer)h(and)h(J.)f(Gough.)g(A)g(tec)l(hnical)g(o)l(v)l(erview)g(of)g
+ (the)4394 3798 y(Commmon)g(Language)g(Infrastructure,)h(2002.)4394
+ 3972 y Fk(http://research.micros)q(of)q(t.)q(co)q(m/~)-77
+ b(eme)q(ij)q(er)q(/)4394 4147 y(Papers/CLR.pdf)p Fi(.)4080
+ 4338 y([34])74 b(Microsoft)50 b(Corp.)h(Managed)g(extensions)g(for)g
+ (c++)4394 4512 y(sp)t(eci\014cation.)g(.NET)f(F)-13 b(ramew)l(ork)52
+ b(Compiler)f(and)4394 4686 y(Language)g(Reference.)4080
+ 4877 y([35])74 b(G.)48 b(Morrisett,)g(D.)g(W)-13 b(alk)l(er,)49
+ b(K.)g(Crary)-13 b(,)49 b(and)g(N.)g(Glew.)f(F)-13 b(rom)4394
+ 5052 y(System)51 b(F)g(to)g(t)l(yp)t(ed)h(assem)l(bly)e(language.)h
+ Fh(T)-12 b(r)k(ans.)55 b(Pr)-8 b(o)g(g.)4394 5226 y(L)g(ang.)55
+ b(and)h(Systems)p Fi(,)51 b(21\(3\):528{569,)d(Ma)l(y)j(1999.)4080
+ 5417 y([36])74 b(R.)51 b(Muth.)g Fh(Alto:)71 b(A)55 b(Platform)h(for)f
+ (Obje)-8 b(ct)53 b(Co)-8 b(de)4394 5591 y(Mo)g(di\014c)g(ation)p
+ Fi(.)52 b(Ph.d.)f(Thesis,)f(Departmen)l(t)i(of)f(Computer)4394
+ 5766 y(Science,)h(Univ)l(ersit)l(y)e(of)h(Arizona,)g(1999.)4080
+ 5956 y([37])74 b(T.)51 b(Romer,)g(G.)f(V)-13 b(o)t(elk)l(er,)52
+ b(D.)f(Lee,)g(A.)g(W)-13 b(olman,)51 b(W.)f(W)-13 b(ong,)4394
+ 6131 y(H.)51 b(Levy)-13 b(,)51 b(B.)g(Bershad,)g(and)h(B.)e(Chen.)i
+ (Instrumen)l(tation)4394 6305 y(and)f(optimization)f(of)h(Win32/In)l
+ (tel)g(executables)h(using)4394 6480 y(Etc)l(h.)e(In)i
+ Fh(Pr)-8 b(o)g(c.)55 b(USENIX)h(Windows)f(NT)g(Workshop)p
+ Fi(,)4394 6654 y(August)c(1997.)4080 6845 y([38])74 b(Z.)51
+ b(Shao,)g(C.)f(League,)i(and)f(S.)h(Monnier.)f(Implemen)l(ting)4394
+ 7019 y(T)l(yp)t(ed)h(In)l(termediate)g(Languages.)f(In)h
+ Fh(Int'l)j(Conf.)g(on)4394 7194 y(F)-12 b(unctional)57
+ b(Pr)-8 b(o)g(g.)p Fi(,)50 b(pages)i(313{323,)d(1998.)4080
+ 7384 y([39])74 b(A.)51 b(Sh)l(ukla.)g(Ligh)l(t)l(w)l(eigh)l(t,)e
+ (cross-pro)t(cedure)k(tracing)e(for)4394 7559 y(run)l(time)g
+ (optimization.)f(Master's)g(thesis,)g(Comp.)g(Sci.)4394
+ 7733 y(Dept.,)h(Univ.)g(of)g(Illinois)f(at)h(Urbana-Champ)h(aign,)4394
+ 7908 y(Urbana,)f(IL,)g(Aug)h(2003.)4080 8098 y([40])74
+ b(J.)51 b(E.)f(Smith,)h(T.)g(Heil,)f(S.)i(Sastry)-13
+ b(,)50 b(and)i(T.)f(Bezenek.)4394 8273 y(Ac)l(hieving)g(high)h(p)t
+ (erformance)g(via)f(co-designed)h(virtual)4394 8447 y(mac)l(hines.)f
+ (In)h Fh(Int'l)j(Workshop)h(on)f(Innovative)4394 8622
+ y(A)l(r)-8 b(chite)g(ctur)g(e)54 b(\(IWIA\))p Fi(,)c(1999.)4080
+ 8812 y([41])74 b(A.)51 b(Sriv)-9 b(asta)l(v)g(a)51 b(and)g(D.)g(W.)g(W)
+ -13 b(all.)50 b(A)i(practical)e(system)h(for)4394 8987
+ y(in)l(termo)t(dule)g(co)t(de)g(optimization)e(at)g(link-time.)h
+ Fh(Journal)55 b(of)4394 9161 y(Pr)-8 b(o)g(gr)g(amming)56
+ b(L)-8 b(anguages)p Fi(,)51 b(1\(1\):1{18,)e(Dec.)i(1992.)4080
+ 9352 y([42])74 b(T.)51 b(Steel.)g(Uncol:)68 b(The)52
+ b(m)l(yth)f(and)g(the)h(fact.)f Fh(A)l(nnual)4394 9526
+ y(R)-8 b(eview)53 b(in)j(A)l(utomate)-8 b(d)56 b(Pr)-8
+ b(o)g(gr)g(amming)56 b(2)p Fi(,)c(1961.)4080 9717 y([43])74
+ b(D.)51 b(Ungar)g(and)h(R.)f(B.)g(Smith.)f(Self:)69 b(The)51
+ b(p)t(o)l(w)l(er)h(of)4394 9892 y(simplicit)l(y)-13 b(.)49
+ b(In)j Fh(OOPSLA)p Fi(,)f(1987.)4080 10083 y([44])74
+ b(D.)51 b(W)-13 b(all.)50 b(Global)g(register)h(allo)t(cation)f(at)g
+ (link-time.)h(In)4394 10257 y Fh(Pr)-8 b(o)g(c.)55 b(SIGPLAN)g('86)h
+ (Symp)-8 b(osium)57 b(on)f(Compiler)4394 10431 y(Construction)p
+ Fi(,)51 b(P)l(alo)f(Alto,)g(CA,)h(1986.)p eop end
+ %%Trailer
+ 
+ userdict /end-hook known{end-hook}if
+ %%EOF





More information about the llvm-commits mailing list