commit 3c35cc25c3bd1586eeb80f3f9d8a0e929be13d77 Author: Thomas Tuerk Date: Mon Nov 11 10:22:43 2019 +0100 initial version cleaned-up the sources of the ITP course - remove internal notes - remove exercise solutions - remove KTH logo - add Creative Commons license diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..de5cbf9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +*.log +*~ +*.toc +*.nav +*.ent +*.aux +*.out +*.snm +*.dvi +/lectures/pdfs/* +/questionnaire/questionnaire-simple.pdf +/questionnaire/questionnaire.pdf +/lectures/version.inc +/#* +/.~* +/lectures/tmp/* +*eps-converted-to.pdf \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a642ce2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,17 @@ +The 'Interactive Theorem Proving Course' +by Thomas Tuerk (http://www.thomas-tuerk.de/en) +is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. +To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/. + +Except where otherwise noted, the license covers all the course +material, including the slides, the exercise sheets and the +questionnaires. + +One exception are the CC-logos in subdirectory 'lectures/images/cc', +which are covered by the Creative Commons Trademark Policy +(https://creativecommons.org/policies). + +The Latex sources of the material as well as a few technical aids +(like Makefiles) are also provided. Please use these sources as you +see fit. However, if you use significant parts of the source files, +please publish your modified sources as well. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ee555d9 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +Interactive Theorem Proving Course +================================== + +This repository contains the sources for an _Interactive Thereom Proving Course_ +that focuses on HOL 4. It was originally given by the PROSPER group at KTH in Stockholm in 2017. + +There is a live version at https://hol-theorem-prover.org/hol-course-print.pdf. + +Authors +-------- + +- Thomas Tuerk (http://www.thomas-tuerk.de) + +Copyright License +------------------ +Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. diff --git a/exercises/Makefile b/exercises/Makefile new file mode 100755 index 0000000..9a515e3 --- /dev/null +++ b/exercises/Makefile @@ -0,0 +1,5 @@ +all: + +clean: + rm -f *Theory.sig *Theory.sml *.ui *.uo \#* *.toc *.aux *.ps *.log *.lof *.bbl *.blg *.hix *.tid *.tde *.out *~ + diff --git a/exercises/README b/exercises/README new file mode 100644 index 0000000..57b4f64 --- /dev/null +++ b/exercises/README @@ -0,0 +1,82 @@ +This directory contains exercises that were used during a ITP Course +at KTH in Stockholm in 2017 (see +https://www.kth.se/social/group/interactive-theorem-/). These +exercises are intended to accompany the slides of this course that has +been made publicly available. + +When working on the exercises, you don't need to read to the end of +the whole sheet before starting to work on an exercise. However, I +highly recommend reading all subquestions first. Some are easier, if +the have already been considered while working on previous +parts. Often there are hints at the very end of an exercise sheet. The +intention is that you work on exercise first without these hints. If +you have trouble, they provide some help. Usually it is a valuable +learning experience thinking about what is explained by the hints. So, +I really recomment to first attempt the exercises without the hints +first. + + +There are the following exercise sheets: + + +0) Background Questionaire (before lecture started) + +This was handed out before the lecture even started. It's intention +was to get a feeling for the background of the students. It was +expected that students on average are able to solve half of the +questions within 1 h. + + +1) Exercise 1 (very beginning of Course) + +This exercise asks students to set up their HOL environment and +practise using SML. It was handed out at the very beginning of the +course and does not require any knowledge from the course. + + +2) Exercise 2 (after Part 6, i.e. after forward proofs) + +Learn basic usage of HOL and emacs. How to construct terms, simple +forward proofs and simple proof automation. + + +3) Exercise 3 (after part 9, i.e. after induction proofs) + +Play around with simple backward proofs. + + +4) Exercise 4 (after part 11, i.e. good definitions) + +Some simple proofs and definitions. The challange is how to structure your +proofs nicely. Moreover, this exercise requires some SML programming and +connects proofs and SML execution. + + +5) Exercise 5 (after part 12, i.e. deep/shallow embeddings, knowledge about simplifier from part 13 useful) + +This exercise focuses on the effect of different definitions on +proofs. Moreover, more so than in exercise 4 students are required to +structure their development by defining own auxiliary definitions and +lemmata. Some proof ideas are, while still rather simple, not trivial. +This exercise can be solved without using the simplifier. However, the +simplifier can help a lot. Similarlish it is encouraged to really +learn how to use Metis for this exercise. + + +6) Exercise 6 (final project, after part 13, simplifier) + +For organisational reasons, the final project was presented in +exercise 6, i.e. before exercise 7 and the end of the course. It +requires people to learn about part of HOL themselves, do a non +trivial formalisation and come up with some non trivial proofs. +Exercise 6 is intentend to take 3-4 times as much time as the other +exercises. + + +7) Exercise 7 (after part 14, advanced definitions) + +Some exercises about advanced usages of the simplifier and how to use +inductive relations. It is very short, since people were in parallel +working already on their final project. + + diff --git a/exercises/a2.dot b/exercises/a2.dot new file mode 100644 index 0000000..3ca950f --- /dev/null +++ b/exercises/a2.dot @@ -0,0 +1,39 @@ +digraph G { + node_0 [label="0: '0'"] + node_2 [label="2: -"] + node_6 [label="6: '2'"] + node_10 [label="10: -"] + node_18 [label="18: '6'"] + node_10 -> node_18 [label="r"] + node_6 -> node_10 [label="r"] + node_2 -> node_6 [label="l"] + node_4 [label="4: -"] + node_12 [label="12: '4'"] + node_4 -> node_12 [label="l"] + node_8 [label="8: -"] + node_24 [label="24: '8'"] + node_8 -> node_24 [label="l"] + node_4 -> node_8 [label="r"] + node_2 -> node_4 [label="r"] + node_0 -> node_2 [label="l"] + node_1 [label="1: -"] + node_5 [label="5: -"] + node_13 [label="13: -"] + node_21 [label="21: '7'"] + node_13 -> node_21 [label="r"] + node_5 -> node_13 [label="l"] + node_9 [label="9: '3'"] + node_5 -> node_9 [label="r"] + node_1 -> node_5 [label="l"] + node_3 [label="3: '1'"] + node_11 [label="11: -"] + node_27 [label="27: '9'"] + node_11 -> node_27 [label="l"] + node_3 -> node_11 [label="l"] + node_7 [label="7: -"] + node_15 [label="15: '5'"] + node_7 -> node_15 [label="r"] + node_3 -> node_7 [label="r"] + node_1 -> node_3 [label="r"] + node_0 -> node_1 [label="r"] +} \ No newline at end of file diff --git a/exercises/a2.eps b/exercises/a2.eps new file mode 100644 index 0000000..42dc115 --- /dev/null +++ b/exercises/a2.eps @@ -0,0 +1,781 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: graphviz version 2.38.0 (20140413.2041) +%%Title: G +%%Pages: 1 +%%BoundingBox: 36 36 559 428 +%%EndComments +save +%%BeginProlog +/DotDict 200 dict def +DotDict begin + +/setupLatin1 { +mark +/EncodingVector 256 array def + EncodingVector 0 + +ISOLatin1Encoding 0 255 getinterval putinterval +EncodingVector 45 /hyphen put + +% Set up ISO Latin 1 character encoding +/starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont +} def +/Times-Roman starnetISO def +/Times-Italic starnetISO def +/Times-Bold starnetISO def +/Times-BoldItalic starnetISO def +/Helvetica starnetISO def +/Helvetica-Oblique starnetISO def +/Helvetica-Bold starnetISO def +/Helvetica-BoldOblique starnetISO def +/Courier starnetISO def +/Courier-Oblique starnetISO def +/Courier-Bold starnetISO def +/Courier-BoldOblique starnetISO def +cleartomark +} bind def + +%%BeginResource: procset graphviz 0 0 +/coord-font-family /Times-Roman def +/default-font-family /Times-Roman def +/coordfont coord-font-family findfont 8 scalefont def + +/InvScaleFactor 1.0 def +/set_scale { + dup 1 exch div /InvScaleFactor exch def + scale +} bind def + +% styles +/solid { [] 0 setdash } bind def +/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def +/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def +/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def +/bold { 2 setlinewidth } bind def +/filled { } bind def +/unfilled { } bind def +/rounded { } bind def +/diagonals { } bind def +/tapered { } bind def + +% hooks for setting color +/nodecolor { sethsbcolor } bind def +/edgecolor { sethsbcolor } bind def +/graphcolor { sethsbcolor } bind def +/nopcolor {pop pop pop} bind def + +/beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if +} bind def + +/set_font { + findfont exch + scalefont setfont +} def + +% draw text fitted to its expected width +/alignedtext { % width text + /text exch def + /width exch def + gsave + width 0 gt { + [] 0 setdash + text stringwidth pop width exch sub text length div 0 text ashow + } if + grestore +} def + +/boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath +} bind def + +/ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix +} bind def + +/endpage { showpage } bind def +/showpage { } def + +/layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] +def + +/layerlen layercolorseq length def + +/setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def +} bind def + +/onlayer { curlayer ne {invis} if } def + +/onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if +} def + +/curlayer 0 def + +%%EndResource +%%EndProlog +%%BeginSetup +14 default-font-family set_font +1 setmiterlimit +% /arrowlength 10 def +% /arrowwidth 5 def + +% make sure pdfmark is harmless for PS-interpreters other than Distiller +/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse +% make '<<' and '>>' safe on PS Level 1 devices +/languagelevel where {pop languagelevel}{1} ifelse +2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put +} if + +%%EndSetup +setupLatin1 +%%Page: 1 1 +%%PageBoundingBox: 36 36 559 428 +%%PageOrientation: Portrait +0 0 1 beginpage +gsave +36 36 523 392 boxprim clip newpath +1 1 set_scale 0 rotate 40 40 translate +% node_0 +gsave +1 setlinewidth +0 0 0 nodecolor +245.85 366 27.1 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +232.85 362.3 moveto 26 (0: '0') alignedtext +grestore +% node_2 +gsave +1 setlinewidth +0 0 0 nodecolor +185.85 279 27 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +176.35 275.3 moveto 19 (2: -) alignedtext +grestore +% node_0->node_2 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 234.84 349.41 moveto +225.88 336.71 213.07 318.56 202.79 304.01 curveto +stroke +0 0 0 edgecolor +newpath 205.41 301.64 moveto +196.78 295.49 lineto +199.69 305.68 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 205.41 301.64 moveto +196.78 295.49 lineto +199.69 305.68 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +219.85 318.8 moveto 4 (l) alignedtext +grestore +% node_1 +gsave +1 setlinewidth +0 0 0 nodecolor +287.85 279 27 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +278.35 275.3 moveto 19 (1: -) alignedtext +grestore +% node_0->node_1 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 253.95 348.61 moveto +259.99 336.38 268.36 319.44 275.27 305.46 curveto +stroke +0 0 0 edgecolor +newpath 278.48 306.85 moveto +279.77 296.34 lineto +272.21 303.75 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 278.48 306.85 moveto +279.77 296.34 lineto +272.21 303.75 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +269.85 318.8 moveto 5 (r) alignedtext +grestore +% node_6 +gsave +1 setlinewidth +0 0 0 nodecolor +85.85 192 27.1 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +72.85 188.3 moveto 26 (6: '2') alignedtext +grestore +% node_2->node_6 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 169.78 264.34 moveto +153.52 250.53 128.21 229.01 109.63 213.21 curveto +stroke +0 0 0 edgecolor +newpath 111.76 210.43 moveto +101.87 206.62 lineto +107.23 215.77 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 111.76 210.43 moveto +101.87 206.62 lineto +107.23 215.77 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +141.85 231.8 moveto 4 (l) alignedtext +grestore +% node_4 +gsave +1 setlinewidth +0 0 0 nodecolor +185.85 192 27 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +176.35 188.3 moveto 19 (4: -) alignedtext +grestore +% node_2->node_4 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 185.85 260.8 moveto +185.85 249.16 185.85 233.55 185.85 220.24 curveto +stroke +0 0 0 edgecolor +newpath 189.35 220.18 moveto +185.85 210.18 lineto +182.35 220.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 189.35 220.18 moveto +185.85 210.18 lineto +182.35 220.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +185.85 231.8 moveto 5 (r) alignedtext +grestore +% node_10 +gsave +1 setlinewidth +0 0 0 nodecolor +31.85 105 27.1 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +18.85 101.3 moveto 26 (10: -) alignedtext +grestore +% node_6->node_10 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 75.69 175.01 moveto +67.77 162.55 56.63 145.01 47.56 130.74 curveto +stroke +0 0 0 edgecolor +newpath 50.28 128.48 moveto +41.96 121.92 lineto +44.37 132.23 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 50.28 128.48 moveto +41.96 121.92 lineto +44.37 132.23 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +62.85 144.8 moveto 5 (r) alignedtext +grestore +% node_18 +gsave +1 setlinewidth +0 0 0 nodecolor +31.85 18 31.7 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +15.35 14.3 moveto 33 (18: '6') alignedtext +grestore +% node_10->node_18 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 31.85 86.8 moveto +31.85 75.16 31.85 59.55 31.85 46.24 curveto +stroke +0 0 0 edgecolor +newpath 35.35 46.18 moveto +31.85 36.18 lineto +28.35 46.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 35.35 46.18 moveto +31.85 36.18 lineto +28.35 46.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +31.85 57.8 moveto 5 (r) alignedtext +grestore +% node_12 +gsave +1 setlinewidth +0 0 0 nodecolor +108.85 105 31.7 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +92.35 101.3 moveto 33 (12: '4') alignedtext +grestore +% node_4->node_12 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 172.43 176.19 moveto +160.62 163.15 143.22 143.95 129.61 128.92 curveto +stroke +0 0 0 edgecolor +newpath 132.19 126.56 moveto +122.89 121.5 lineto +127.01 131.26 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 132.19 126.56 moveto +122.89 121.5 lineto +127.01 131.26 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +152.85 144.8 moveto 4 (l) alignedtext +grestore +% node_8 +gsave +1 setlinewidth +0 0 0 nodecolor +185.85 105 27 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +176.35 101.3 moveto 19 (8: -) alignedtext +grestore +% node_4->node_8 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 185.85 173.8 moveto +185.85 162.16 185.85 146.55 185.85 133.24 curveto +stroke +0 0 0 edgecolor +newpath 189.35 133.18 moveto +185.85 123.18 lineto +182.35 133.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 189.35 133.18 moveto +185.85 123.18 lineto +182.35 133.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +185.85 144.8 moveto 5 (r) alignedtext +grestore +% node_24 +gsave +1 setlinewidth +0 0 0 nodecolor +180.85 18 31.7 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +164.35 14.3 moveto 33 (24: '8') alignedtext +grestore +% node_8->node_24 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 184.84 86.8 moveto +184.15 75.16 183.23 59.55 182.45 46.24 curveto +stroke +0 0 0 edgecolor +newpath 185.94 45.95 moveto +181.86 36.18 lineto +178.95 46.36 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 185.94 45.95 moveto +181.86 36.18 lineto +178.95 46.36 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +183.85 57.8 moveto 4 (l) alignedtext +grestore +% node_5 +gsave +1 setlinewidth +0 0 0 nodecolor +287.85 192 27 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +278.35 188.3 moveto 19 (5: -) alignedtext +grestore +% node_1->node_5 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 287.85 260.8 moveto +287.85 249.16 287.85 233.55 287.85 220.24 curveto +stroke +0 0 0 edgecolor +newpath 291.35 220.18 moveto +287.85 210.18 lineto +284.35 220.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 291.35 220.18 moveto +287.85 210.18 lineto +284.35 220.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +287.85 231.8 moveto 4 (l) alignedtext +grestore +% node_3 +gsave +1 setlinewidth +0 0 0 nodecolor +403.85 192 27.1 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +390.85 188.3 moveto 26 (3: '1') alignedtext +grestore +% node_1->node_3 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 305.47 265.09 moveto +324.71 250.99 355.74 228.25 377.8 212.09 curveto +stroke +0 0 0 edgecolor +newpath 380.07 214.77 moveto +386.06 206.03 lineto +375.93 209.12 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 380.07 214.77 moveto +386.06 206.03 lineto +375.93 209.12 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +352.85 231.8 moveto 5 (r) alignedtext +grestore +% node_13 +gsave +1 setlinewidth +0 0 0 nodecolor +257.85 105 27.1 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +244.85 101.3 moveto 26 (13: -) alignedtext +grestore +% node_5->node_13 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 281.92 174.21 moveto +277.73 162.33 272.02 146.17 267.22 132.56 curveto +stroke +0 0 0 edgecolor +newpath 270.39 131.02 moveto +263.76 122.76 lineto +263.79 133.35 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 270.39 131.02 moveto +263.76 122.76 lineto +263.79 133.35 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +274.85 144.8 moveto 4 (l) alignedtext +grestore +% node_9 +gsave +1 setlinewidth +0 0 0 nodecolor +330.85 105 27.1 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +317.85 101.3 moveto 26 (9: '3') alignedtext +grestore +% node_5->node_9 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 296.14 174.61 moveto +302.32 162.38 310.89 145.44 317.97 131.46 curveto +stroke +0 0 0 edgecolor +newpath 321.19 132.84 moveto +322.58 122.34 lineto +314.94 129.68 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 321.19 132.84 moveto +322.58 122.34 lineto +314.94 129.68 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +312.85 144.8 moveto 5 (r) alignedtext +grestore +% node_21 +gsave +1 setlinewidth +0 0 0 nodecolor +262.85 18 31.7 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +246.35 14.3 moveto 33 (21: '7') alignedtext +grestore +% node_13->node_21 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 258.86 86.8 moveto +259.54 75.16 260.46 59.55 261.25 46.24 curveto +stroke +0 0 0 edgecolor +newpath 264.74 46.36 moveto +261.84 36.18 lineto +257.76 45.95 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 264.74 46.36 moveto +261.84 36.18 lineto +257.76 45.95 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +260.85 57.8 moveto 5 (r) alignedtext +grestore +% node_11 +gsave +1 setlinewidth +0 0 0 nodecolor +403.85 105 27.1 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +390.85 101.3 moveto 26 (11: -) alignedtext +grestore +% node_3->node_11 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 403.85 173.8 moveto +403.85 162.16 403.85 146.55 403.85 133.24 curveto +stroke +0 0 0 edgecolor +newpath 407.35 133.18 moveto +403.85 123.18 lineto +400.35 133.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 407.35 133.18 moveto +403.85 123.18 lineto +400.35 133.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +403.85 144.8 moveto 4 (l) alignedtext +grestore +% node_7 +gsave +1 setlinewidth +0 0 0 nodecolor +480.85 105 27 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +471.35 101.3 moveto 19 (7: -) alignedtext +grestore +% node_3->node_7 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 417.26 176.19 moveto +429.22 162.99 446.91 143.47 460.59 128.36 curveto +stroke +0 0 0 edgecolor +newpath 463.21 130.68 moveto +467.33 120.92 lineto +458.02 125.98 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 463.21 130.68 moveto +467.33 120.92 lineto +458.02 125.98 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +447.85 144.8 moveto 5 (r) alignedtext +grestore +% node_27 +gsave +1 setlinewidth +0 0 0 nodecolor +400.85 18 31.7 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +384.35 14.3 moveto 33 (27: '9') alignedtext +grestore +% node_11->node_27 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 403.24 86.8 moveto +402.83 75.16 402.28 59.55 401.81 46.24 curveto +stroke +0 0 0 edgecolor +newpath 405.3 46.05 moveto +401.45 36.18 lineto +398.31 46.29 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 405.3 46.05 moveto +401.45 36.18 lineto +398.31 46.29 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +402.85 57.8 moveto 4 (l) alignedtext +grestore +% node_15 +gsave +1 setlinewidth +0 0 0 nodecolor +482.85 18 31.7 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +466.35 14.3 moveto 33 (15: '5') alignedtext +grestore +% node_7->node_15 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 481.25 86.8 moveto +481.53 75.16 481.89 59.55 482.21 46.24 curveto +stroke +0 0 0 edgecolor +newpath 485.71 46.26 moveto +482.44 36.18 lineto +478.71 46.09 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 485.71 46.26 moveto +482.44 36.18 lineto +478.71 46.09 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +482.85 57.8 moveto 5 (r) alignedtext +grestore +endpage +showpage +grestore +%%PageTrailer +%%EndPage: 1 +%%Trailer +end +restore +%%EOF diff --git a/exercises/e1.tex b/exercises/e1.tex new file mode 100644 index 0000000..c152c54 --- /dev/null +++ b/exercises/e1.tex @@ -0,0 +1,121 @@ +\documentclass[a4paper,10pt,oneside]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[a4paper]{geometry} +\usepackage{hyperref} +\usepackage{url} +\usepackage{color} +\usepackage{amsfonts} +\input{../hol_commands.inc} + +\title{Exercise 1} + +\begin{document} +\begin{center} +\usekomafont{sectioning}\usekomafont{part}ITP Exercise 1 +\webversion{}{\\\small{due Friday 28th April}} +\end{center} +\bigskip + + +\section{Setting up Environment} + +We will use the HOL theorem prover\footnote{\url{https://hol-theorem-prover.org}}. +For the practical sessions you will need to be able to use HOL on your own machine. Therefore, please set up the following software. + +\subsection{Standard ML} + +You will need to have Standard ML available. Please install PolyML 5.6\footnote{webpage \url{http://www.polyml.org}}\footnote{download link \url{https://github.com/polyml/polyml/releases/tag/v5.6}} or later. + +\subsection{HOL} + +Please install a recent version of the HOL theorem prover. I recommend installing the most recent version from the git repository. If for some reason you don't want to do this, the latest release should be fine as well. Installation instructions can be found on HOL's webpage\footnote{see \url{https://hol-theorem-prover.org/\#get}}. + +\subsection{Emacs} + +In the lecture GNU Emacs\footnote{https://www.gnu.org/software/emacs/} will be used as a user-interface. Please install a recent version of Emacs. Please make sure you use Emacs and not XEmacs. + +\subsection{HOL-Mode and SML mode} +We will use the \emph{hol-mode} for Emacs. It is distributed with HOL, but needs setting up in Emacs. Please set it up and familiarise yourself with its basic usage. Documentation can be found on HOL's webpage\footnote{see \url{https://hol-theorem-prover.org/hol-mode.html}}. +We will write SML programs all the time. Please install the SML mode\footnote{\url{https://elpa.gnu.org/packages/sml-mode.html}} to enable syntax highlighting for ML in Emacs. +Information on both the SML and the HOL mode can also be found in HOL's interaction +manual\footnote{\url{https://hol-theorem-prover.org/HOL-interaction.pdf}}. + + +\section{SML} + +Let's refresh our knowledge about Standard ML. Moreover, these +exercises are aimed at getting familiar with Emacs and using the HOL +mode. So, please use Emacs with HOL mode as a user-interface and treat +HOL like a ML REPL. + +To learn more about the Emacs mode, you can have a look at the HOL interaction manual. +If you need a brush-up on SML syntax, I recommend reading something compact like +\url{https://learnxinyminutes.com/docs/standard-ml/}. If you need more, the book +\emph{ML for the Working Programmer} by Prof.\ Larry Paulson is a good introduction. + +\subsection{Our Own Lists} + +Of course SML comes with a decent list library. However, as an exercise implement your own list datatype and implement the following list operations for your own datatype: +% +\begin{itemize} +\item \texttt{length} +\item \texttt{append} (\texttt{@}) +\item \texttt{rev} +\item \texttt{revAppend} +\item \texttt{exists} +\end{itemize} +% +If you don't know what these functions should do, you can find documentation of the Standard ML Basis Library at e.\,g.\ \url{http://sml-family.org}. + +In addition implement a function \texttt{replicate\ :\ 'a -> int -> 'a list}, which is supposed to +construct a list of the given length that only contains the given element. For example \texttt{replicate "a" 3} should return the list \texttt{["a", "a", "a"]}. + +\begin{enumerate} +\item Prove with pen and paper that for your implementation + \texttt{append l [] = l} holds for all \texttt{l}. +\item Similarly, prove \texttt{$\forall$l1 l2.\ length (append l1 l2) = length l1 + length l2}. +\item There are strong connections between \texttt{append}, \texttt{revAppend} and \texttt{rev}. +One can for example define \texttt{revAppend} by \texttt{revAppend l1 l2 = append (rev l1) l2}. +Write down similar definitions for \texttt{rev} and \texttt{append} using only \texttt{revAppend}. +\end{enumerate} + +\subsection{Making Change} + +In the following, let's use the standard list library again. Write a +program that given the coins and notes you have in your wallet, lists +\emph{all} the possible ways to pay a certain amount. Represent the +coins you have as a list of integers. If a number occurs twice in +this list, you have two coins with this value. The result should be +returned in the form of a list of lists. For simplicity, the output +may contain duplicates. + +An example implementation of the function +\texttt{make\_change\ :\ int list -> int -> int list list} should +shows for example the following outputs. Notice however, that the output of +your implementation is allowed to contain duplicates and use a different +order of the lists. + +\begin{itemize} +\item \texttt{make\_change [5,2,2,1,1,1] 6 =}\\ +\-\texttt{\ \ \ [[5, 1], [2, 2, 1, 1]]} +\item \texttt{make\_change [5,2,2,1,1,1] 15 = []} +\item \texttt{make\_change [10,5,5,5,2,2,1,1,1] 10 =}\\ + \-\texttt{\ \ \ [[10], [5, 5], [5, 2, 2, 1], [5, 2, 1, 1, 1]]} +\end{itemize} +\bigskip +Write down as formally as you can some properties of \texttt{make\_change}. An example +property is + +\begin{center}\texttt{ +$\forall$cs n. n > sum cs $\Longrightarrow$ make\_change cs n = []} +\end{center} +where \texttt{sum} is defined by \texttt{val sum = foldl (op+) 0} and we assume that \texttt{cs} contains no number less than 0. + + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/exercises/e2.tex b/exercises/e2.tex new file mode 100644 index 0000000..9c6282a --- /dev/null +++ b/exercises/e2.tex @@ -0,0 +1,166 @@ +\documentclass[a4paper,10pt,oneside]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[a4paper]{geometry} +\usepackage{hyperref} +\usepackage{url} +\usepackage{color} +\usepackage{amsfonts} + +\input{../hol_commands.inc} +\title{Exercise 2} + +\begin{document} + +\begin{center} +\usekomafont{sectioning}\usekomafont{part}ITP Exercise 2 +\webversion{}{\\\small{due Friday 5th May}} +\end{center} +\bigskip + + +\section{Self-Study} + +\subsection{Emacs} +If you don't know Emacs well, familiarise yourself with its basic usage. Learn the key combinations for common operations like +opening a file, saving current buffer, closing buffer, switching between buffers, searching in a file, copy and paste text etc. +You might consider printing the \emph{Emacs Reference Card}\footnote{\url{https://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf}} and putting +it next to your computer. + +\subsection{HOL Documentation} +Familiarise yourself with how to get help about HOL. + +\begin{itemize} +\item Build the various documentations in directory \texttt{Manual}. For this, call \texttt{make} in directory \texttt{HOL-HOME/Manual}. For building the manuals, \texttt{hol} and \texttt{Holmake} need to run. +Therefore make sure, \texttt{HOL-HOME/bin} is in your PATH. +\item Have a brief look at the various manuals in order to understand where which kind of information +can be found. +\item The lectures will cover the logic foundations of the HOL +theorem prover only very briefly and lightly. If you are interested in more +details, have a look at the \emph{Logic} manual. This is purely optional. +\item Familiarise yourself with the different ways to access the reference manual. + As an example read up on \texttt{MATCH\_MP} in the HTML reference manual, the PDF reference manual and the in-system help (type \texttt{help "MATCH\_MP"}). +\item Familiarise yourself with the different printing switches of HOL, in particular the ones in hol-mode's menu. Learn how to turn Unicode-output on/off, how to show assumptions of theorems and how to show type annotations. +\item Use \texttt{DB.match} and \texttt{DB.find} to find theorems stating \verb#A /\ A = A#. Use both the emacs-mode and the SML REPL. Look at the interface of \texttt{DB}. +\end{itemize} + +\subsection{Holmake} +Learn about \texttt{Holmake} by reading description manual sections 7.3 - 7.3.4. + +\subsection{Constructing Terms and Forward Proofs} + +To deepen the knowledge about how to construct terms, how to program in HOL and how to perform +forward proofs, please look at the following HOL modules: \ml{FinalThm.sml}, \ml{FinalTerm.sml}, +\ml{FinalType.sml}, \ml{Drule.sig}, \ml{Psyntax.sig}, \ml{boolSyntax.sig}, \ml{Lib.sig}. + + +\section{Terms} + +\subsection{Free and Bound Vars} + +List the free variables of the following terms: +\begin{itemize} +\item \verb#(\x. 2 + (7 * x) + y) z# +\item \verb#x + y + 2# +\item \verb#!x. x + 1 > x# +\item \verb#?x. x = y + 2# +\end{itemize} + +\subsection{Alpha Equivalence} + +Are the following pairs of terms alpha-equivalent? A simple mark on the sheet is a sufficient answer. Also take two colors and mark all occurences of free vars in one color and all occourences of bound vars in the other. Assume that \texttt{x}, \texttt{y}, \texttt{z}, \texttt{a} and \texttt{b} are variables. \bigskip + +\begin{tabular}{@{$\ \ \bullet\ \ $}ll} +\verb#\x. x# & \verb#\y. y# \\ +\verb#(\x. x) a# & \verb#(\y. y) a# \\ +\verb#(\x. x) a# & \verb#(\y. y) b# \\ +\verb#(\x. x)# & \verb#(\x. y)# \\ +\verb#(\x y. x /\ y)# & \verb#(\y x. x /\ y)# \\ +\verb#(\x y. x /\ y) a a# & \verb#(\y x. x /\ y) a a# \\ +\verb#a /\ b# & \verb#a /\ b# \\ +\verb#!x. x + 1 > x# & \verb#!y. y + 1 > y# \\ +\verb#?x. x = y + 2# & \verb#?x. x = z + 2# \\ +\verb#!y. ?x. x = y + 2# & \verb#!z. ?x. x = z + 2# \\ +\end{tabular} + +\subsection{Constructing Terms} + +Write a SML function \ml{mk\_imp\_conj\_term :\ int -> term} that constructs for inputs $n$ greater 1 the term \verb#!A1 ... An. A1 ==> ... ==> An ==> (A1 /\ ... /\ An)#. If $n$ is not greater one, a \ml{HOL\_ERR} exception (use \ml{failwith}). You might want to read up on \ml{boolSyntax} for this exercise. You can use list-make-functions like \ml{mk\_list\_conj}, but also use non-list ones. + + +\section{Basic Forward Proofs} + +\subsection{Commutativity of Conjunction} +Prove the lemma \verb#!A B. (A /\ B) <=> (B /\ A)# using only inferences presented in the lecture. + +\subsection{Simplifying Conjunction} +Prove the lemmas \verb#!A. (A /\ ~A) <=> F# and \verb#!A B. (A /\ ~A) /\ B <=> F#. + + +\section{Writing Own Automation} + +\subsection{Implications between Conjunctions} +Write a function \texttt{show\_big\_conj\_imp :\ term -> term -> thm} that assumes that both terms are conjunctions and tries to prove that the first one implies the second one. It should be clever enough to handle \texttt{T} and \texttt{F}. +\verb#show_big_conj_imp ``a /\ (b /\ a) /\ c`` ``c /\ T /\ a``# for example should succeed with \verb#|- (a /\ (b /\ a) /\ c) ==> (c /\ T /\ a)#. It should also be able to show \verb#|- (a /\ F) /\ c ==> d#. If the implication cannot be shown, the function \texttt{show\_big\_conj\_imp} should raise \texttt{HOL\_ERR}. + +For this exercise it might be useful to read up on \texttt{Term.compare} and the red-black sets and maps in directory \texttt{portableML}. + + + +\subsection{Equivalences between Conjunctions} +Use the function \texttt{show\_big\_conj\_imp} to now define a function \texttt{show\_big\_conj\_eq :\ term -> term -> thm} that tries to shows the equivalence between the input terms. If both input terms are alpha-equivalent, it should raise an \texttt{UNCHANGED} exception. If the equivalence cannot be proved, a \texttt{HOL\_ERR} exception should be raised. + +\subsection{Duplicates in Conjunctions} +Use the function \texttt{show\_big\_conj\_eq} to implement a conversion \texttt{remove\_dups\_in\_conj\_CONV} that replaces duplicate appearances of a term in a large conjunction with \texttt{T}. Given the term \begin{center}\verb#a /\ (b /\ a) /\ c /\ b /\ a# +\end{center} +it should for example return the theorem +\begin{center} +\verb#|- (a /\ (b /\ a) /\ c /\ b /\ a) = (a /\ (b /\ T) /\ c /\ T /\ T)#. +\end{center}. +If no duplicates are found, \texttt{UNCHANGED} should be raised. If the input is not of type +\texttt{bool}, a \texttt{HOL\_ERR} should be raised. + +\subsection{Contradictions in Conjunctions} +Use the function \texttt{show\_big\_conj\_eq} to implement a conversion \texttt{find\_contr\_in\_conj\_CONV} that searches for terms and their negations in a large conjunction. If such contradictions are found, the term should be converted to \texttt{F}. +Given the term \begin{center}\verb#a /\ (b /\ ~a) /\ c# +\end{center} +it should for example return the theorem +\begin{center} +\verb#|- (a /\ (b /\ ~a) /\ c) = F#. +\end{center}. +If no contradictions are found, \texttt{UNCHANGED} should be raised. If the input is not of type +\texttt{bool}, a \texttt{HOL\_ERR} should be raised. + + +\section{Squabbling Philosophers} + +Recently keen historians were finally able to deduce where the less well-known ancient philosophers +Platon, Diogenes and Euklid came from (see background-questionnaire). However, in order to avoid being embarrassed by announcing some wrong result, they asked you to check their reasoning using HOL. +Can you help and show that Platon indeed came from Sparta? + +\subsection{Download and Compile} +Get the file \texttt{philScript.sml}\webversion{}{ from the exercise repository\footnote{\url{https://gits-15.sys.kth.se/tuerk/ITP-exercises}}}. Compile it with \texttt{Holmake} to get a theory file. Read \texttt{philTheory.sig}. + +\subsection{Proof} +Open the theory \texttt{philTheory} and prove \verb#Sp platon#. This is a simple first order logic problem. Therefore automated methods like resolution can solve it easily. HOL has such methods build in in the form of \eg the resolution based prover \ml{METIS}. For example, +\begin{center} +\verb#METIS_PROVE [PHIL_KNOWLEDGE] ``Sp platon``# +\end{center} +would already prove it. However, for learning, let us prove it via a low-level forward proof. + +\begin{itemize} +\item Using the lemma \texttt{MONO\_NOT} and the inference rules \texttt{MATCH\_MP}, +\texttt{SPEC} and \texttt{IMP\_TRANS} show the lemma \verb#|- ~(W p) ==> Sp p#. +\item Similarly show \verb#|- ~(B p) ==> At p#. +\item Assume \verb#At platon# and using this show the lemma \verb#[At platon] |- F# with + \texttt{MP} and \texttt{MATCH\_MP}. You will need many steps and many different lemmata. +\item Using \texttt{DISCH}, \texttt{NOT\_INTRO} and \texttt{MATCH\_MP} show \verb#Sp platon#. +\end{itemize} + +Don't forget to turn printing of assumptions on in HOL or you will have a hard time figuring out what is going on. +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/exercises/e2Script.sml b/exercises/e2Script.sml new file mode 100644 index 0000000..05fd504 --- /dev/null +++ b/exercises/e2Script.sml @@ -0,0 +1,65 @@ +open HolKernel Parse boolLib bossLib; + +val _ = new_theory "e2"; + +val _ = Datatype `Philosopher = diogenes | platon | euklid`; +val Philosopher_nchotomy = DB.fetch "-" "Philosopher_nchotomy"; +val Philosopher_distinct = DB.fetch "-" "Philosopher_distinct"; + + +val PHIL_KNOWLEDGE = new_specification ("PHIL_KNOWLEDGE", ["At", "Sp", "W", "B"], +prove (``?At Sp W B. + (!p. (Sp p ==> B p)) /\ + (!p. (At p ==> W p)) /\ + (!p. ~(Sp p) \/ ~(At p)) /\ + (!p. (Sp p) \/ (At p)) /\ + ((Sp platon) ==> ~(W diogenes)) /\ + ((Sp euklid) ==> ~(B diogenes)) /\ + ((At diogenes) ==> ~(B euklid)) /\ + ((At platon) ==> ~(W euklid))``, + +Q.EXISTS_TAC `\p. Philosopher_CASE p F F T` THEN +Q.EXISTS_TAC `\p. Philosopher_CASE p T T F` THEN +Q.EXISTS_TAC `\p. Philosopher_CASE p F T T` THEN +Q.EXISTS_TAC `\p. Philosopher_CASE p T T F` THEN +SIMP_TAC (srw_ss()++DatatypeSimps.expand_type_quants_ss [``:Philosopher``]) [])); + + +val PHIL_KNOWLEDGE_a = store_thm ("PHIL_KNOWLEDGE_a", ``!p. Sp p ==> B p``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_b = store_thm ("PHIL_KNOWLEDGE_b", ``!p. At p ==> W p``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_c = store_thm ("PHIL_KNOWLEDGE_b", ``!p. ~(Sp p) \/ ~(At p)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_c1 = store_thm ("PHIL_KNOWLEDGE_c1", ``!p. Sp p ==> ~(At p)``, + PROVE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_c2 = store_thm ("PHIL_KNOWLEDGE_c2", ``!p. At p ==> ~(Sp p)``, + PROVE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_d = store_thm ("PHIL_KNOWLEDGE_d", ``!p. (Sp p) \/ (At p)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_d1 = store_thm ("PHIL_KNOWLEDGE_d1", ``!p. ~(Sp p) ==> At p``, + PROVE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_d2 = store_thm ("PHIL_KNOWLEDGE_d2", ``!p. ~(At p) ==> Sp p``, + PROVE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_e = store_thm ("PHIL_KNOWLEDGE_e", ``(Sp platon) ==> ~(W diogenes)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_f = store_thm ("PHIL_KNOWLEDGE_f", ``(Sp euklid) ==> ~(B diogenes)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_g = store_thm ("PHIL_KNOWLEDGE_g", ``(At diogenes) ==> ~(B euklid)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_h = store_thm ("PHIL_KNOWLEDGE_g", ``(At platon) ==> ~(W euklid)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val _ = export_theory(); + diff --git a/exercises/e3.tex b/exercises/e3.tex new file mode 100644 index 0000000..6263602 --- /dev/null +++ b/exercises/e3.tex @@ -0,0 +1,116 @@ +\documentclass[a4paper,10pt,oneside]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[a4paper]{geometry} +\usepackage{hyperref} +\usepackage{url} +\usepackage{color} +\usepackage{amsfonts} + +\input{../hol_commands.inc} + +\title{Exercise 3} + +\begin{document} + +\begin{center} +\usekomafont{sectioning}\usekomafont{part}ITP Exercise 3 +\webversion{}{\\\small{due Friday 12th May}} +\end{center} +\bigskip + + +\section{Self-Study} + +\subsection{Tactics and Tacticals} +You should read background information on the tactics mentioned in the +lecture. For each of the tactics and tacticals mentioned on the +slides, read the entry in the description manual. + +\subsection{hol-mode} + +Carefully study the \texttt{Goalstack} submenu of hol-mode. Learn the keycodes to +set goals, expand tactics, undo the last tactic expansion, restart the current proof and +drop the current goal. + +\subsection{num and list Theories} + +We will use the natural number theory \texttt{numTheory} as well as the list theories +\texttt{listTheory} and \texttt{rich\_listTheory} a lot. Please familiarise yourself with +these HOL theories (e.\,g.\ by looking at their signature in the HTML version of the HOL Reference). I also recommend reading up on other common theories like \texttt{optionTheory}, \texttt{oneTheory} and \texttt{pairTheory}. These won't be needed for this weeks exercises, though. + + +\section{Backward Proofs} + +Part of this exercise is searching for useful existing lemmata (\eg +useful rewrite rules). Another part is understanding the effect of +different rewrite rules and their combination. Even if you have +experience with using HOL, please refrain from using automated rewrite +tools that spoil these purposes and have not been covered in the +lecture yet. Please don't use HOL's simplifier and especially don't +use stateful simp-sets. Similarly, please don't use the compute lib +via \eg \texttt{EVAL\_TAC}. + +For these exercise, it might be beneficial to open the modules \texttt{listTheory} and \texttt{rich\_listTheory} via \ml{open listTheory rich\_listTheory}. You will notice that when opening them a lot of definitions are printed. This can consume quite some time when opening many large theories. Play around with the hol-mode commands +\texttt{Send region to HOL - hide non-errors} and \texttt{Quite - hide output except errors} to avoid this printout and the associated waiting time. + + +\subsection{Replay Proofs from Lecture} + +If you never did a tactical proof in HOL before, I recommend following the example interactive proofs from Part VIII. +Type them in your own HOL session, make the same mistakes shown in the lecture. Use hol-mode to control the goalStack via +commands like expand, back-up, set goal, drop goal. Get a feeling for how to interactively develop a tactical proof. + +This exercise is optional. If you are confident enough, feel free to skip it. + +\subsection{Formalise Induction Proofs from Exercise 1} + +For exercise sheet 1, some simple properties of appending lists were proved with pen and paper via induction. Let's now try to prove them formally using HOL. Prove \hol{!l.\ l ++ [] = l} via induction using the definition of \hol{APPEND} (\hol{++}). Similarly, prove the associativity of \texttt{APPEND}, \ie prove \hol{!l1 l2 l3.\ l1 ++ (l2 ++ l3) = (l1 ++ l2) ++ l3}. + +\subsection{Reverse} + +In HOL, \texttt{revAppend} is called \hol{REV}. Using any useful lemmata you can find, prove +the lemma \hol{!l1 l2.\ LENGTH (REV l1 l2) = (LENGTH l1 + LENGTH l2)}. Now, let us as an exercise reprove the existing lemmata \hol{REVERSE\_REV} and \hol{REV\_REVERSE\_LEM}. This means, prove, first prove \hol{!l1 l2.\ REV l1 l2 = REVERSE l1 ++ l2}. Then prove \hol{!l.\ REVERSE l = REV l []} using this theorem. You should not use the theorems \texttt{REVERSE\_REV} or \texttt{REV\_REVERSE\_LEM} in these proofs. + + +\subsection{Length of Drop} + +Prove \hol{!l1 l2.\ LENGTH (DROP (LENGTH l2) (l1 ++ l2)) = LENGTH l1} with induction, \ie +without using lemmata like \texttt{LENGTH\_DROP}. Do one proof with \texttt{Induct\_on} and a very similar proof with \texttt{Induct}. This is a bit tricky. +Please play around with the proof for some time. If you can't figure it out, look at the hints at the end of this exercise sheet. + + +\subsection{Making Change} + +On exercise sheet 1, you were asked to implement a function \texttt{make\_change} in SML. Let's now define it in HOL and prove some properties. Define the function \texttt{MAKE\_CHANGE} in HOL via + +\begin{verbatim} +val MAKE_CHANGE_def = Define ` + (MAKE_CHANGE [] a = if (a = 0) then [[]] else []) /\ + (MAKE_CHANGE (c::cs) a = ( + (if (c <= a /\ 0 < a) then + (MAP (\l. c::l) (MAKE_CHANGE cs (a - c))) + else []) ++ (MAKE_CHANGE cs a)))`; +\end{verbatim} + +Prove that \hol{!cs.\ MAKE\_CHANGE cs 0 = [[]]} and +\hol{!cs a l.\ MEM l (MAKE\_CHANGE cs a) ==> (SUM l = a)} hold. + + +\section{Hints} + +\subsection{Length of Drop} + +For proving \hol{!l1 l2.\ LENGTH (DROP (LENGTH l2) (l1 ++ l2)) = LENGTH l1} induction on +the structure of \hol{l2} is a good strategy. However, one needs to be careful that \hol{l1} stays +universally quantified. Expanding naively with \hol{GEN\_TAC >> Induct} will +remove the needed universal quantification of \hol{l1}. + +To solve this, you can either use \hol{Induct\_on `l2`} or get rid of both universal quantifiers and then introduce them in a different order again. This is achieved by \hol{REPEAT GEN\_TAC >> SPEC\_TAC (``l1:'a list``, ``l1:'a list``) >> SPEC\_TAC (``l2:'a list``, ``l2:'a list``)}. + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/exercises/e3Script.sml b/exercises/e3Script.sml new file mode 100644 index 0000000..8ce9a04 --- /dev/null +++ b/exercises/e3Script.sml @@ -0,0 +1,107 @@ +open HolKernel Parse boolLib bossLib; + +open rich_listTheory arithmeticTheory +val _ = new_theory "e3"; + + +``!l. APPEND l [] = l`` + +Induct >| [ + REWRITE_TAC [APPEND], + ASM_REWRITE_TAC [APPEN] +]) + + + +open listTheory + + +val``!l1 l2. REV l1 l2 = REVERSE l1 ++ l2`` + +Induct >| [ + REWRITE_TAC [REV_DEF, REVERSE, APPEND], + ASM_REWRITE_TAC [REVERSE, REV_DEF, APPEND_SNOC1] +]) + +``!l. REVERSE l = REV l []`` + +Induct >| [ + REWRITE_TAC [REV_DEF, REVERSE], + ASM_REWRITE_TAC [REVERSE, REV_DEF] +]) + + +``!l1 l2. LENGTH (DROP (LENGTH l2) (l1 ++ l2)) = LENGTH l1`` + +Induct >| [ + REWRITE_TAC[LENGTH, APPEND, DROP_LENGTH_NIL], + + Cases_on `l2` |> [ + REWRITE_TAC[APPEND_NIL, LENGTH, DROP], + + ASM_REWRITE_TAC[APPEND, LENGTH, DROP] + + +``!l1 l2. LENGTH (DROP (LENGTH l2) (l1 ++ l2)) = LENGTH l1`` + +REPEAT GEN_TAC >> +SPEC_TAC (``l1:'a list``, ``l1:'a list``) THEN +Induct_on `l2` >| [ + REWRITE_TAC[LENGTH, DROP, APPEND_NIL], + + Cases_on `l1` >| [ + REWRITE_TAC[LENGTH, DROP, APPEND, DROP_LENGTH_NIL], + + REPEAT GEN_TAC >> + REWRITE_TAC[LENGTH, DROP, APPEND] THEN + `t ++ h' :: l2 = (t ++ [h']) ++ l2` by REWRITE_TAC[APPEND, GSYM APPEND_ASSOC] >> + ASM_REWRITE_TAC[] >> + REWRITE_TAC[LENGTH_APPEND, LENGTH, ADD_CLAUSES] + ] +]) + + +val MAKE_CHANGE_def = Define ` + (MAKE_CHANGE [] a = if (a = 0) then [[]] else []) /\ + (MAKE_CHANGE (c::cs) a = ( + (if (c <= a /\ 0 < a) then + (MAP (\l. c::l) (MAKE_CHANGE cs (a - c))) + else []) ++ (MAKE_CHANGE cs a)))` + + +val MAKE_CHANGE_PROP = prove(``!cs. MAKE_CHANGE cs 0 = [[]]``, + +Induct >| [ + REWRITE_TAC[MAKE_CHANGE_def], + ASM_REWRITE_TAC[MAKE_CHANGE_def, prim_recTheory.LESS_REFL, APPEND] +]) + +val MAKE_CHANGE_PROP1 = prove (``!cs a l. + MEM l (MAKE_CHANGE cs a) ==> (SUM l = a)``, + +Induct >| [ + REPEAT GEN_TAC >> + REWRITE_TAC[MAKE_CHANGE_def] >> + Cases_on `a = 0` >> ( + ASM_REWRITE_TAC[MEM] THEN + REPEAT STRIP_TAC THEN + ASM_REWRITE_TAC[SUM] + ), + + REPEAT GEN_TAC >> + ASM_REWRITE_TAC [MAKE_CHANGE_def, MEM_APPEND, DISJ_IMP_THM] >> + Cases_on `h <= a /\ 0 < a` >| [ + ASM_REWRITE_TAC[MEM_MAP] THEN + BETA_TAC THEN + REPEAT STRIP_TAC THEN + `SUM y = (a - h)` by METIS_TAC[] >> + ASM_REWRITE_TAC [SUM] >> + DECIDE_TAC, + + ASM_REWRITE_TAC[MEM] + ] +]); + + +val _ = export_theory(); + diff --git a/exercises/e4-material/dot_graphsLib.sig b/exercises/e4-material/dot_graphsLib.sig new file mode 100644 index 0000000..9e709df --- /dev/null +++ b/exercises/e4-material/dot_graphsLib.sig @@ -0,0 +1,24 @@ +signature dot_graphsLib = +sig + type array_graph + + (* binary for running dot *) + val dot_binary : string ref; + + (* a fresh, empty one *) + val new_array_graph : array_graph + + (* add a node to a graph with number n and the term option content *) + val add_node : array_graph -> int -> Abbrev.term option -> array_graph + + (* adds a link between two nodes in the graph *) + val add_node_link : array_graph -> int -> int -> string -> array_graph + + (* Various outputs *) + val print_graph : array_graph -> unit + val graph_to_string : array_graph -> string + val show_graph : array_graph -> unit + val write_graph_to_dot_file : array_graph -> string -> unit + val write_graph_to_png_file : array_graph -> string -> unit + +end diff --git a/exercises/e4-material/dot_graphsLib.sml b/exercises/e4-material/dot_graphsLib.sml new file mode 100644 index 0000000..e76a727 --- /dev/null +++ b/exercises/e4-material/dot_graphsLib.sml @@ -0,0 +1,62 @@ +structure dot_graphsLib :> dot_graphsLib = +struct + +open HolKernel Parse + +datatype array_graph = AG of string + +val new_array_graph = AG ""; + +(* Auxiliary functions *) +fun AG_add (AG s) s' = AG (s ^ " " ^ s' ^ "\n") +fun node_name n = ("node_"^(int_to_string n)) + +(* create a new node with number n and value v in graph ag *) +fun add_node ag (n:int) (v : term option) = let + val n_s = node_name n; + val v_s = case v of NONE => "-" + | SOME t => "'" ^ (term_to_string t) ^ "'" + val new_s = (n_s ^ " [label=\"" ^ (int_to_string n) ^": "^v_s^"\"]") +in + AG_add ag new_s +end + +(* Add a link between nodes n1 and n2 *) +fun add_node_link ag (n1:int) (n2 : int) (label : string) = let + val new_s = (node_name n1) ^ " -> " ^ (node_name n2) ^ " [label=\""^label^"\"]"; +in + AG_add ag new_s +end + +fun graph_to_string (AG s) = "digraph G {\n" ^ s ^ "}\n\n" +fun print_graph ag = (TextIO.print (graph_to_string ag)) + +fun write_graph_to_dot_file ag file_name = let + val os = TextIO.openOut file_name; + val _ = TextIO.output (os, graph_to_string ag); + val _ = TextIO.closeOut os +in + () +end + +val dot_binary = ref "/usr/bin/dot"; + +fun show_graph ag = let + val p = Unix.execute (!dot_binary, ["-Tx11"]) + val os = Unix.textOutstreamOf p + val _ = TextIO.output (os, graph_to_string ag) + val _ = TextIO.closeOut os +in + () +end + +fun write_graph_to_png_file ag filename = let + val p = Unix.execute (!dot_binary, ["-Tpng", "-o", filename]) + val os = Unix.textOutstreamOf p + val _ = TextIO.output (os, graph_to_string ag) + val _ = TextIO.closeOut os +in + () +end + +end diff --git a/exercises/e4-material/e4_arraysLib.sml b/exercises/e4-material/e4_arraysLib.sml new file mode 100644 index 0000000..2ad967f --- /dev/null +++ b/exercises/e4-material/e4_arraysLib.sml @@ -0,0 +1,116 @@ +structure e4_arraysLib :> e4_arraysLib = +struct + +open HolKernel Parse bossLib e4_arraysTheory dot_graphsLib + +(* Example + +val ag = let + val ag = new_array_graph + val ag = add_node ag 1 NONE + val ag = add_node ag 2 NONE + val ag = add_node ag 3 NONE + val ag = add_node ag 4 (SOME ``A /\ B``) + val ag = add_node ag 5 NONE + val ag = add_node_link ag 1 2 "a"; + val ag = add_node_link ag 1 3 "b"; + val ag = add_node_link ag 3 4 "c"; + val ag = add_node_link ag 4 5 "d"; +in + ag +end + +val _ = (dot_binary := "/usr/bin/dot"); + + +val _ = print_graph ag +val _ = show_graph ag + + +*) + +fun simple_array n = let + val n_t = numSyntax.term_of_int n + val thm = EVAL ``FOLDL (\a n. UPDATE n a n) EMPTY_ARRAY (COUNT_LIST ^n_t)`` +in + rhs (concl thm) +end + +fun sparse_array n = let + val n_t = numSyntax.term_of_int n + val thm = EVAL ``FOLDL (\a n. UPDATE n a (n*3)) EMPTY_ARRAY (COUNT_LIST ^n_t)`` +in + rhs (concl thm) +end + +val a1 = simple_array 10; +val a2 = sparse_array 10; +val a3 = simple_array 20; +val a4 = simple_array 100; + + +fun is_array_leaf t = same_const t ``Leaf`` + +fun dest_array_node t = let + val (c, args) = strip_comb t + val _ = if (same_const c ``Node``) then () else fail() + + val vo = SOME (optionSyntax.dest_some (el 2 args)) handle HOL_ERR _ => NONE +in + (el 1 args, vo, el 3 args) +end + +val is_array_node = can dest_array_node + +fun graph_of_array_aux ag level suff t = + if (is_array_leaf t) then (NONE, ag) else + let + val (l, vo, r) = dest_array_node t + val n = level + suff + val m = n - 1; + val ag = add_node ag m vo + val (l_n, ag) = graph_of_array_aux ag (level*2) n l + val ag = case l_n of NONE => ag + | SOME ln => add_node_link ag m ln "l" + val (r_n, ag) = graph_of_array_aux ag (level*2) suff r + val ag = case r_n of NONE => ag + | SOME rn => add_node_link ag m rn "r" + in + (SOME m, ag) + end handle HOL_ERR _ => (NONE, ag) + +fun graph_of_array t = + snd (graph_of_array_aux new_array_graph 1 0 t) + + +show_graph (graph_of_array a1) +show_graph (graph_of_array a2) + +print_graph (graph_of_array a1) + +EVAL ``num2boolList 5`` +a1 + +Node + (Node (Node Leaf (SOME 6) Leaf) + (SOME 2) + (Node Leaf (SOME 5) Leaf)) + +(SOME 0) + + (Node + (Node Leaf (SOME 4) (Node Leaf (SOME 9) Leaf)) + + (SOME 1) + + (Node (Node Leaf (SOME 8) Leaf) (SOME 3) + + (Node Leaf (SOME 7) Leaf))) + +end + + +print_graph (graph_of_array a2); + + +show_graph (graph_of_array (simple_array 15)); diff --git a/exercises/e4-material/e4_arraysScript.sml b/exercises/e4-material/e4_arraysScript.sml new file mode 100644 index 0000000..b87e238 --- /dev/null +++ b/exercises/e4-material/e4_arraysScript.sml @@ -0,0 +1,235 @@ +open HolKernel Parse boolLib bossLib; + +val _ = new_theory "e4_arrays"; + + +(**************************************************) +(* Provided part *) +(**************************************************) + +val num2boolList_def = Define ` + (num2boolList 0 = []) /\ + (num2boolList 1 = []) /\ + (num2boolList n = (EVEN n) :: num2boolList (n DIV 2))` + +(* The resulting definition is hard to apply and + rewriting with it loops easily. So let's provide + a decent lemma capturing the semantics *) + +val num2boolList_REWRS = store_thm ("num2boolList_REWRS", + ``(num2boolList 0 = []) /\ + (num2boolList 1 = []) /\ + (!n. 2 <= n ==> ((num2boolList n = (EVEN n) :: num2boolList (n DIV 2))))``, +REPEAT STRIP_TAC >| [ + METIS_TAC[num2boolList_def], + METIS_TAC[num2boolList_def], + + `n <> 0 /\ n <> 1` by DECIDE_TAC >> + METIS_TAC[num2boolList_def] +]); + + +(* It is aslo useful to show when the list is empty *) +val num2boolList_EQ_NIL = store_thm ("num2boolList_EQ_NIL", + ``!n. (num2boolList n = []) <=> ((n = 0) \/ (n = 1))``, +GEN_TAC >> EQ_TAC >| [ + REPEAT STRIP_TAC >> + CCONTR_TAC >> + FULL_SIMP_TAC list_ss [num2boolList_REWRS], + + REPEAT STRIP_TAC >> ( + ASM_SIMP_TAC std_ss [num2boolList_REWRS] + ) +]); + + +(* Now the awkward arithmetic part. Let's show that num2boolList is injective *) + +(* For demonstration, let's define our own induction theorem *) +val MY_NUM_INDUCT = store_thm ("MY_NUM_INDUCT", + ``!P. P 1 /\ (!n. (2 <= n /\ (!m. (m < n /\ m <> 0) ==> P m)) ==> P n) ==> (!n. n <> 0 ==> P n)``, +REPEAT STRIP_TAC >> +completeInduct_on `n` >> +Cases_on `n` >> FULL_SIMP_TAC arith_ss [] >> +Cases_on `n'` >> ASM_SIMP_TAC arith_ss []) + +val num2boolList_INJ = store_thm ("num2boolList_INJ", + ``!n. n <> 0 ==> !m. m <> 0 ==> (num2boolList n = num2boolList m) ==> (n = m)``, + +HO_MATCH_MP_TAC MY_NUM_INDUCT >> +CONJ_TAC >- ( + SIMP_TAC list_ss [num2boolList_REWRS, num2boolList_EQ_NIL] +) >> +GEN_TAC >> STRIP_TAC >> GEN_TAC >> STRIP_TAC >> +Cases_on `m = 1` >- ( + ASM_SIMP_TAC list_ss [num2boolList_REWRS] +) >> +ASM_SIMP_TAC list_ss [num2boolList_REWRS] >> +REPEAT STRIP_TAC >> +`n DIV 2 = m DIV 2` by ( + `(m DIV 2 <> 0) /\ (n DIV 2 <> 0) /\ (n DIV 2 < n)` suffices_by METIS_TAC[] >> + + ASM_SIMP_TAC arith_ss [arithmeticTheory.NOT_ZERO_LT_ZERO, + arithmeticTheory.X_LT_DIV] +) >> +`n MOD 2 = m MOD 2` by ( + ASM_SIMP_TAC std_ss [arithmeticTheory.MOD_2] +) >> +`0 < 2` by DECIDE_TAC >> +METIS_TAC[arithmeticTheory.DIVISION]); + + + + +(* Shifting the keys by one is trivial and by this we get rid of the + preconditions of the injectivity theorem *) +val num2arrayIndex_def = Define `num2arrayIndex n = (num2boolList (SUC n))` +val num2arrayIndex_INJ = store_thm ("num2arrayIndex_INJ", + ``!n m. (num2arrayIndex n = num2arrayIndex m) <=> (n = m)``, + +SIMP_TAC list_ss [num2arrayIndex_def] >> +METIS_TAC [numTheory.NOT_SUC, num2boolList_INJ, numTheory.INV_SUC]); + + +(* Now let's define the inverse operation *) +val boolList2num_def = Define ` + (boolList2num [] = 1) /\ + (boolList2num (F::idx) = 2 * boolList2num idx + 1) /\ + (boolList2num (T::idx) = 2 * boolList2num idx)` + +(* We can show that the inverse is never 0 ... *) +val boolList2num_GT_0 = prove (``!idx. 0 < boolList2num idx``, +Induct >- SIMP_TAC arith_ss [boolList2num_def] >> +Cases >> ASM_SIMP_TAC arith_ss [boolList2num_def]); + +(* ... so we can subtract 1 for the index shift *) +val arrayIndex2num_def = Define `arrayIndex2num idx = PRE (boolList2num idx)` + + + +(* Now a fiddly prove that we indeed defined the inverse *) +val boolList2num_inv = prove (``!idx. num2boolList (boolList2num idx) = idx``, +Induct >- ( + SIMP_TAC arith_ss [boolList2num_def, num2boolList_REWRS] +) >> +`0 < boolList2num idx` by METIS_TAC[boolList2num_GT_0] >> +`0 < 2` by DECIDE_TAC >> +Cases >| [ + `!x. (2 * x) MOD 2 = 0` by + METIS_TAC[arithmeticTheory.MOD_EQ_0, arithmeticTheory.MULT_COMM] >> + `!x. (2 * x) DIV 2 = x` by + METIS_TAC[arithmeticTheory.MULT_DIV, arithmeticTheory.MULT_COMM] >> + ASM_SIMP_TAC list_ss [boolList2num_def, num2boolList_REWRS, + arithmeticTheory.EVEN_MOD2], + + `!x y. (2 * x + y) MOD 2 = (y MOD 2)` by + METIS_TAC[arithmeticTheory.MOD_TIMES, arithmeticTheory.MULT_COMM] >> + `!x y. (2 * x + y) DIV 2 = x + y DIV 2` by + METIS_TAC[arithmeticTheory.ADD_DIV_ADD_DIV, arithmeticTheory.MULT_COMM] >> + ASM_SIMP_TAC list_ss [boolList2num_def, num2boolList_REWRS, + arithmeticTheory.EVEN_MOD2] +]); + +(* Shifting is easy then *) +val arrayIndex2num_inv = store_thm ("arrayIndex2num_inv", + ``!idx. num2arrayIndex (arrayIndex2num idx) = idx``, +GEN_TAC >> +REWRITE_TAC[num2arrayIndex_def, arrayIndex2num_def] >> +`0 < boolList2num idx` by METIS_TAC[boolList2num_GT_0] >> +FULL_SIMP_TAC arith_ss [arithmeticTheory.SUC_PRE] >> +ASM_SIMP_TAC std_ss [boolList2num_inv]); + + +(* It is also very easy to derive other useful properties. *) +val num2arrayIndex_inv = store_thm ("num2arrayIndex_inv", + ``!n. arrayIndex2num (num2arrayIndex n) = n``, +METIS_TAC[ num2arrayIndex_INJ, arrayIndex2num_inv]); + +val arrayIndex2num_INJ = store_thm ("arrayIndex2num_INJ", + ``!idx1 idx2. (arrayIndex2num idx1 = arrayIndex2num idx2) <=> (idx1 = idx2)``, +METIS_TAC[ num2arrayIndex_INJ, arrayIndex2num_inv]); + + +(* A rewrite for the top-level inverse might be handy *) +val num2arrayIndex_REWRS = store_thm ("num2arrayIndex_REWRS", `` +!n. num2arrayIndex n = + if (n = 0) then [] else + ODD n :: num2arrayIndex ((n - 1) DIV 2)``, + +REWRITE_TAC[num2arrayIndex_def] >> +Cases >> SIMP_TAC arith_ss [num2boolList_REWRS] >> +SIMP_TAC arith_ss [arithmeticTheory.ODD, arithmeticTheory.EVEN, + arithmeticTheory.ODD_EVEN] >> +`(!x r. (2 * x + r) DIV 2 = x + r DIV 2) /\ (!x. (2*x) DIV 2 = x)` by ( + `0 < 2` by DECIDE_TAC >> + METIS_TAC[arithmeticTheory.ADD_DIV_ADD_DIV, arithmeticTheory.MULT_COMM, + arithmeticTheory.MULT_DIV] +) >> +Cases_on `EVEN n'` >> ASM_REWRITE_TAC[] >| [ + `?m. n' = 2* m` by METIS_TAC[arithmeticTheory.EVEN_ODD_EXISTS] >> + ASM_SIMP_TAC arith_ss [arithmeticTheory.ADD1], + + `?m. n' = SUC (2* m)` by METIS_TAC[arithmeticTheory.EVEN_ODD_EXISTS, + arithmeticTheory.ODD_EVEN] >> + ASM_SIMP_TAC arith_ss [arithmeticTheory.ADD1] +]); + + +(**************************************************) +(* YOU SHOULD WORK FROM HERE ON *) +(**************************************************) + +(* TODO: Define a datatype for arrays storing values of type 'a. *) +val _ = Datatype `array = DUMMY 'a` + + +(* TODO: Define a new, empty array *) +val EMPTY_ARRAY_def = Define `EMPTY_ARRAY : 'a array = ARB` + +(* TODO: define ILOOKUP, IUPDATE and IREMOVE *) +val IUPDATE_def = Define `IUPDATE (v : 'a) (a : 'a array) (k : bool list) = a:'a array` +val ILOOKUP_def = Define `ILOOKUP (a : 'a array) (k : bool list) = NONE:'a option` +val IREMOVE_def = Define `IREMOVE (a : 'a array) (k : bool list) = a:'a array` + + +(* With these, we can define the lifted operations *) +val LOOKUP_def = Define `LOOKUP a n = ILOOKUP a (num2arrayIndex n)` +val UPDATE_def = Define `UPDATE v a n = IUPDATE v a (num2arrayIndex n)` +val REMOVE_def = Define `REMOVE a n = IREMOVE a (num2arrayIndex n)` + + +(* TODO: show a few properties *) +val LOOKUP_EMPTY = store_thm ("LOOKUP_EMPTY", + ``!k. LOOKUP EMPTY_ARRAY k = NONE``, +cheat); + +val LOOKUP_UPDATE = store_thm ("LOOKUP_UPDATE", + ``!v n n' a. LOOKUP (UPDATE v a n) n' = + (if (n = n') then SOME v else LOOKUP a n')``, +cheat); + +val LOOKUP_REMOVE = store_thm ("LOOKUP_REMOVE", + ``!n n' a. LOOKUP (REMOVE a n) n' = + (if (n = n') then NONE else LOOKUP a n')``, +cheat); + + +val UPDATE_REMOVE_EQ = store_thm ("UPDATE_REMOVE_EQ", `` + (!v1 v2 n a. UPDATE v1 (UPDATE v2 a n) n = UPDATE v1 a n) /\ + (!v n a. UPDATE v (REMOVE a n) n = UPDATE v a n) /\ + (!v n a. REMOVE (UPDATE v a n) n = REMOVE a n) +``, +cheat); + + +val UPDATE_REMOVE_NEQ = store_thm ("UPDATE_REMOVE_NEQ", `` + (!v1 v2 a n1 n2. n1 <> n2 ==> + ((UPDATE v1 (UPDATE v2 a n2) n1) = (UPDATE v2 (UPDATE v1 a n1) n2))) /\ + (!v a n1 n2. n1 <> n2 ==> + ((UPDATE v (REMOVE a n2) n1) = (REMOVE (UPDATE v a n1) n2))) /\ + (!a n1 n2. n1 <> n2 ==> + ((REMOVE (REMOVE a n2) n1) = (REMOVE (REMOVE a n1) n2)))``, +cheat); + + +val _ = export_theory(); diff --git a/exercises/e4.tex b/exercises/e4.tex new file mode 100644 index 0000000..fb15bdd --- /dev/null +++ b/exercises/e4.tex @@ -0,0 +1,174 @@ +\documentclass[a4paper,10pt,oneside]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[a4paper]{geometry} +\usepackage{hyperref} +\usepackage{url} +\usepackage{color} +\usepackage{amsfonts} +\usepackage{graphicx} + +\input{../hol_commands.inc} + +\title{Exercise 4} + +\begin{document} + +\begin{center} +\usekomafont{sectioning}\usekomafont{part}ITP Exercise 4 +\webversion{}{\\\small{due Wednesday 24th May}} +\end{center} +\bigskip + + +\section{Functional Arrays} + +Arrays are not easily available in pure functional programs. However, +one can easily encode finite maps with natural numbers as keys. One +such finite map implementation is known as \emph{functional arrays}. +Functional arrays are binary trees that use the binary representation +of the key to determine the position in the tree. As a result, the +trees are always balanced. This is illustrated by the following picture: + +\begin{center} +\includegraphics[width=14cm]{func_array.eps} +\end{center} + +The nodes in this tree are annotated with the both the decimal and the binary representation of +their keys. The root node is for key 1, key 0 is not allowed. All values in +the right subtree are even, all in the left odd. This means that the last digit is +always 0 or always 1. We then continue with this scheme recursively. At level 2 we look at the +second bit, level 3 looks at the third bit and so on. + +Navigating to the node for key $k$ can easily be implemented recursively. We check whether +$k$ is 1. If so, we look at the root node of our tree. Otherwise, we check whether $k$ is even. +If it is, we search for key $k\ \textit{DIV}\ 2$ in the right subtree, otherwise we look for +$k\ \textit{DIV}\ 2$ in the left subtree. Another way of describing the procedure is that we +always look at the last bit. If we see 0, we go to the right subtree, if we see 1 we go to the left subtree. We then throw the last bit away and continue. Once we reach the number 1, we stop. + +\bigskip + +Let's implement functional arrays in HOL. Please use the file +\texttt{e4\_arraysScript.sml} for this purpose. It contains auxiliary +definitions and some outline. Please read all of the exercise sheet +(except perhaps the hints section) before you start working. + + +\subsection{Datatype} + +Define a datatype for functional arrays. This should be a binary tree type with leafs and nodes. +Leafs don't store any information. Each node should have a left and a right subtree as well as perhaps a value. Some keys might have a value stored, other not. So, please use an option type here. + +In C one would have nodes with a left- and right subtree pointer. NULL values in these pointers would indicate that we don't have a subtree. This role of NULL pointers is in our functional implementation taken by leafs. Notice that leafs are not shown in the picture above. Each node in the last row above has implicitly a left and a right subtree, which are leafs. + + +\subsection{Implement Basic Operations} + +Let's now implement a lookup, an update, a remove operation as well as a constant for empty arrays. +Checking the bits of the key directly in the recursive definitions of these operations is fiddly. +One has to reason about arithmetic a lot and deal with some awkward termination conditions. +Therefore, I took already care for you of this fiddly part. The function \hol{num2arrayIndex} takes +a key and returns an array index. An array index is encoded as a list of booleans. If the list is empty, we should stop at the current node. If it starts with \texttt{F} we should look at the left subtree, if it is \texttt{T} at the right one. There is also an inverse operation \hol{arrayIndex2num} as well as a few lemmata. Notice, that \hol{num2arrayIndex} adds implicitly 1 to the number before +looking at the bits. Thus, we can handle 0 and don't need a special case. + +\subsubsection{\texttt{EMPTY\_ARRAY}} + +Define a constant \texttt{EMPTY\_ARRAY} that represents an array, which has no values stored in it at all. + + +\subsubsection{\texttt{UPDATE} and \texttt{REMOVE}} + +Define an update function. Start with defining a function \texttt{IUPDATE v a idx} that updates array \texttt{a} to contain \texttt{v} for index \texttt{idx}. It should return the updated array. Then use the definition of \texttt{UPDATE} already present in the theory to lift this definition to keys that are natural numbers. +Similarish define a function \texttt{REMOVE a idx} that removes the value stored for index \texttt{idx} from array \texttt{a}. No value should be stored for this index in the resulting array. + +The remove and update functions are very similar. It is beneficial to define a generalised update function that takes an optional value argument. If a value is provided, the current value is updated with it. If no value is provided, the current one is removed. + +\subsection{Test your definition} + +Use \texttt{EVAL} to test whether your definitions work as expected. + + +\subsection{Visualise Trees} + +To install HOL, you needed to install the graphviz tool +(\url{http://www.graphviz.org/}). Let's use this tool to visualise your trees. +I already coded an auxiliary library to communicate with graphviz. You need to +write syntax functions for your array type. I recommend having a look at the implementation +of an existing syntax library like \texttt{optionSyntax}. Then code functions + +\begin{itemize} +\item \texttt{is\_array\_leaf :\ term -> bool} +\item \texttt{is\_array\_node :\ term -> bool} +\item \texttt{dest\_array\_node :\ term -> (term * term option * term)} +\end{itemize} + +Use the provided library \texttt{dot\_graphLib} to visualise your +arrays. Some example code is provided in +\texttt{e4\_arraysLib.sml}. Familiarise yourself with this code. The +example array \texttt{a2} should have for $n < 10$ the value $n$ +stored at key $3*n$ all other keys have no value stored. When you +visualise \texttt{a2} the result should look as follows: + +\begin{center} +\includegraphics[width=14cm]{a2.eps} +\end{center} + +This is a good test of whether your \texttt{UPDATE} works as expected. Feel free however, to +delay this exercise till after the proofs, if you prefer that. + + +\subsubsection{\texttt{LOOKUP}} + +Define a lookup function. Similar to \texttt{UPDATE} define \texttt{ILOOKUP} on indexes first and +then lift it to numbers. \texttt{LOOKUP a k} should return \texttt{SOME v} iff value \texttt{v} is +stored for key \texttt{k} and \texttt{NONE} if no value is stored. + + +\subsection{Test your definition} + +Use \texttt{EVAL} to test whether your definition of \texttt{LOOKUP} works as expected. + + +\subsection{Basic Properties} + +Show that you indeed implemented a finite map datastructure. For this purpose fill in the missing +proofs in \texttt{e4\_arraysScript.sml}. Make sure that the resulting theory compiles and can be loaded by \texttt{e4\_arraysLib.sml}. + +You should prove the following properties: + +\begin{enumerate} +\item \texttt{!k.\ LOOKUP EMPTY\_ARRAY k = NONE} +\item \texttt{!v n n' a.\ LOOKUP (UPDATE v a n) n' =\\ +\-\qquad (if (n = n') then SOME v else LOOKUP a n')} +\item \texttt{!n n' a.\ LOOKUP (REMOVE a n) n' = (if (n = n') then NONE else LOOKUP a n')} +\item \texttt{!v1 v2 n a.\ UPDATE v1 (UPDATE v2 a n) n = UPDATE v1 a n} +\item \texttt{!v n a.\ UPDATE v (REMOVE a n) n = UPDATE v a n} +\item \texttt{!v n a.\ REMOVE (UPDATE v a n) n = REMOVE a n} +\item \texttt{!v1 v2 a n1 n2.\ n1 <> n2 ==>\\\-\qquad + ((UPDATE v1 (UPDATE v2 a n2) n1) = (UPDATE v2 (UPDATE v1 a n1) n2))} + \item \texttt{!v a n1 n2.\ n1 <> n2 ==>\\\-\qquad + ((UPDATE v (REMOVE a n2) n1) = (REMOVE (UPDATE v a n1) n2))} + \item \texttt{!a n1 n2.\ n1 <> n2 ==>\\\-\qquad + ((REMOVE (REMOVE a n2) n1) = (REMOVE (REMOVE a n1) n2))} +\end{enumerate} + +\section{Hints} + +If you perform your proofs naively, you need a lot of case-splits and everything gets +very lengthy. It is beneficial to use many auxiliary definitions and use them and many tiny +lemmata about them to avoid case-splits. It might for example be beneficial to introduce auxiliary +functions \texttt{VAL\_OF\_ROOT} and \texttt{GEN\_GET\_SUBARRAY} and derive the following properties: +\begin{itemize} +\item \texttt{!a. ILOOKUP a [] = VAL\_OF\_ROOT a} +\item \texttt{!a i idx.\ ILOOKUP a (i::idx) = ILOOKUP (GEN\_GET\_SUBARRAY i a) idx} +\end{itemize} + + + + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/exercises/e5-material/e5-hints.txt b/exercises/e5-material/e5-hints.txt new file mode 100644 index 0000000..5aa8bb1 --- /dev/null +++ b/exercises/e5-material/e5-hints.txt @@ -0,0 +1,11 @@ +val IS_WEAK_SUBLIST_REC_def = Define ` + (IS_WEAK_SUBLIST_REC (l1 : 'a list) ([]:'a list) = T) /\ + (IS_WEAK_SUBLIST_REC [] (_::_) = F) /\ + (IS_WEAK_SUBLIST_REC (y::ys) (x::xs) = ( + (x = y) /\ IS_WEAK_SUBLIST_REC ys xs) \/ (IS_WEAK_SUBLIST_REC ys (x::xs)))`; + +val FILTER_BY_BOOLS_def = Define ` + FILTER_BY_BOOLS bl l = MAP SND (FILTER FST (ZIP (bl, l)))` + +val IS_WEAK_SUBLIST_FILTER_def = Define `IS_WEAK_SUBLIST_FILTER l1 l2 = + ?(bl : bool list). (LENGTH bl = LENGTH l1) /\ (l2 = FILTER_BY_BOOLS bl l1)` diff --git a/exercises/e5-material/e5Script.sml b/exercises/e5-material/e5Script.sml new file mode 100644 index 0000000..a823f60 --- /dev/null +++ b/exercises/e5-material/e5Script.sml @@ -0,0 +1,185 @@ +open HolKernel Parse boolLib bossLib; + +val _ = new_theory "e5"; + +open listTheory rich_listTheory arithmeticTheory + +(**************) +(* Question 1 *) +(**************) + +(*--- 1.1 --- *) + +(* TODO: Fill in a proper definition *) +val IS_WEAK_SUBLIST_REC_def = Define `IS_WEAK_SUBLIST_REC (l1 : 'a list) (l2 : 'a list) = T` + + +(* Some tests *) +val test1 = EVAL ``IS_WEAK_SUBLIST_REC [1;2;3;4;5;6;7] [2;5;6]``; +val test2 = EVAL ``IS_WEAK_SUBLIST_REC [1;2;3;4;5;6;7] [2;6;5]``; +val test3 = EVAL ``IS_WEAK_SUBLIST_REC [1;2;3;4;5;6;7] [2;5;6;8]``; + +(* TODO: at least 2 sanity check lemmata *) + + +(*--- 1.2 --- *) + +(* TODO: fill in Definition *) +val IS_WEAK_SUBLIST_FILTER_def = Define `IS_WEAK_SUBLIST_FILTER (l1 : 'a list) (l2 : 'a list) = T` + +(* TODO: at least 2 sanity check lemmata *) + + +(*--- 1.3 --- *) + +(* TODO: Prove of auxiliary lemmata *) + +val IS_WEAK_SUBLIST_EQUIV = store_thm ("IS_WEAK_SUBLIST_EQUIV", + ``IS_WEAK_SUBLIST_REC = IS_WEAK_SUBLIST_FILTER``, + +REWRITE_TAC[FUN_EQ_THM] >> +CONV_TAC (RENAME_VARS_CONV ["l1", "l2"]) >> +cheat) + + +(*--- 1.4 --- *) + +(* TODO: Prove of auxiliary lemmata and perhaps reorder lemmata below *) + +val IS_WEAK_SUBLIST_REC_APPEND_EXTEND_LEFT = store_thm ("IS_WEAK_SUBLIST_REC_APPEND_EXTEND_LEFT", + ``!l1a l1 l1b l2. IS_WEAK_SUBLIST_REC l1 l2 ==> IS_WEAK_SUBLIST_REC (l1a ++ l1 ++ l1b) l2``, +cheat); + +val IS_WEAK_SUBLIST_REC_APPEND = store_thm ("IS_WEAK_SUBLIST_REC_APPEND_EXTEND_LEFT", + ``!l1a l1b l2a l2b. IS_WEAK_SUBLIST_REC l1a l2a ==> + IS_WEAK_SUBLIST_REC l1b l2b ==> + IS_WEAK_SUBLIST_REC (l1a ++ l1b) (l2a ++ l2b)``, +cheat); + + +val IS_WEAK_SUBLIST_REC_REFL = store_thm ("IS_WEAK_SUBLIST_REC_REFL", + ``!l. IS_WEAK_SUBLIST_REC l l``, +cheat); + + +val IS_WEAK_SUBLIST_REC_TRANS = store_thm ("IS_WEAK_SUBLIST_REC_TRANS", + ``!l1 l2 l3. IS_WEAK_SUBLIST_REC l1 l2 ==> + IS_WEAK_SUBLIST_REC l2 l3 ==> + IS_WEAK_SUBLIST_REC l1 l3``, +cheat); + + +val IS_WEAK_SUBLIST_REC_ANTISYM = store_thm ("IS_WEAK_SUBLIST_REC_ANTISYM", + ``!l1 l2. IS_WEAK_SUBLIST_REC l1 l2 ==> + IS_WEAK_SUBLIST_REC l2 l1 ==> + (l1 = l2)``, +cheat); + + +val IS_WEAK_SUBLIST_FILTER_APPEND_EXTEND_LEFT = store_thm ("IS_WEAK_SUBLIST_FILTER_APPEND_EXTEND_LEFT", + ``!l1a l1 l1b l2. IS_WEAK_SUBLIST_FILTER l1 l2 ==> IS_WEAK_SUBLIST_FILTER (l1a ++ l1 ++ l1b) l2``, +cheat); + +val IS_WEAK_SUBLIST_FILTER_APPEND = store_thm ("IS_WEAK_SUBLIST_FILTER_APPEND_EXTEND_LEFT", + ``!l1a l1b l2a l2b. IS_WEAK_SUBLIST_FILTER l1a l2a ==> + IS_WEAK_SUBLIST_FILTER l1b l2b ==> + IS_WEAK_SUBLIST_FILTER (l1a ++ l1b) (l2a ++ l2b)``, +cheat); + + +val IS_WEAK_SUBLIST_FILTER_REFL = store_thm ("IS_WEAK_SUBLIST_FILTER_REFL", + ``!l. IS_WEAK_SUBLIST_FILTER l l``, +cheat); + + +val IS_WEAK_SUBLIST_FILTER_TRANS = store_thm ("IS_WEAK_SUBLIST_FILTER_TRANS", + ``!l1 l2 l3. IS_WEAK_SUBLIST_FILTER l1 l2 ==> + IS_WEAK_SUBLIST_FILTER l2 l3 ==> + IS_WEAK_SUBLIST_FILTER l1 l3``, +cheat); + + +val IS_WEAK_SUBLIST_FILTER_ANTISYM = store_thm ("IS_WEAK_SUBLIST_FILTER_ANTISYM", + ``!l1 l2. IS_WEAK_SUBLIST_FILTER l1 l2 ==> + IS_WEAK_SUBLIST_FILTER l2 l1 ==> + (l1 = l2)``, +cheat); + + + + + + +(**************) +(* Question 2 *) +(**************) + +val sh_true_def = Define `sh_true = T`; +val sh_var_def = Define `sh_var (v:bool) = v`; +val sh_not_def = Define `sh_not b = ~b`; +val sh_and_def = Define `sh_and b1 b2 = (b1 /\ b2)`; +val sh_or_def = Define `sh_or b1 b2 = (b1 \/ b2)`; +val sh_implies_def = Define `sh_implies b1 b2 = (b1 ==> b2)`; + + +val _ = Datatype `bvar = BVar num` +val _ = Datatype `prop = d_true | d_var bvar | d_not prop + | d_and prop prop | d_or prop prop + | d_implies prop prop`; + +val _ = Datatype `var_assignment = BAssign (bvar -> bool)` +val VAR_VALUE_def = Define `VAR_VALUE (BAssign a) v = (a v)` + +val PROP_SEM_def = Define ` + (PROP_SEM a d_true = T) /\ + (PROP_SEM a (d_var v) = VAR_VALUE a v) /\ + (PROP_SEM a (d_not p) = ~(PROP_SEM a p)) /\ + (PROP_SEM a (d_and p1 p2) = (PROP_SEM a p1 /\ PROP_SEM a p2)) /\ + (PROP_SEM a (d_or p1 p2) = (PROP_SEM a p1 \/ PROP_SEM a p2)) /\ + (PROP_SEM a (d_implies p1 p2) = (PROP_SEM a p1 ==> PROP_SEM a p2))` + + +(* TODO Work on question 2 *) + + + + +(**************) +(* Question 3 *) +(**************) + +val expunge_def = + Define + `(expunge x [] = []) + /\ (expunge x (h::t) = if x=h then expunge x t else h::expunge x t)`; + +val min_def = + Define + `(min [] m = m) + /\ (min (h::t) m = if m <= h then min t m else min t h)`; + +val minsort_defn = + Hol_defn "minsort" + `(minsort [] = []) + /\ (minsort (h::t) = + let m = min t h + in + m::minsort (expunge m (h::t)))`; + + + +(* TODO: prove some auxiliary lemmata and fill in termination proof *) + +(* For interactive use + +Defn.tgoal minsort_defn + +*) + +val (minsort_def, minsort_ind) = Defn.tprove (minsort_defn, + WF_REL_TAC `TODO` >> + cheat); + + + +val _ = export_theory(); diff --git a/exercises/e5.tex b/exercises/e5.tex new file mode 100644 index 0000000..5b4ec01 --- /dev/null +++ b/exercises/e5.tex @@ -0,0 +1,184 @@ +\documentclass[a4paper,10pt,oneside]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[a4paper]{geometry} +\usepackage{hyperref} +\usepackage{url} +\usepackage{color} +\usepackage{amsfonts} +\usepackage{graphicx} + +\input{../hol_commands.inc} + +\title{Exercise 5} + +\begin{document} + +\begin{center} +\usekomafont{sectioning}\usekomafont{part}ITP Exercise 5 +\webversion{}{\\\small{due Friday 26th May (except 1.3 and 1.4)\\ 1.3 and 1.4 due Friday 2nd June}} +\end{center} +\bigskip + +\section{Multiple Definitions / Formal Sanity} + +\ml{rich\_listTheory} provides a predicate \hol{IS\_SUBLIST}. It checks whether +a list appears somewhere as part of another list: + +\begin{center} +\begin{verbatim} +|- !l1 l2. IS_SUBLIST l1 l2 <=> ?l l'. l1 = l ++ (l2 ++ l') +\end{verbatim} +\end{center} + +Define a weaker version of such a predicate called \hol{IS\_WEAK\_SUBLIST} that allows additional elements between +the elements of \texttt{l2}. So, for example \hol{IS\_WEAK\_SUBLIST [1;2;3;4;5;6;7] [2;5;6]} should hold. In contrast the statements \hol{IS\_WEAK\_SUBLIST [1;2;3;4;5;6;7] [2;6;5]} or \hol{IS\_WEAK\_SUBLIST [1;2;3;4;5;6;7] [2;5;6;8]} do not hold. Another way of describing the semantics of \hol{IS\_WEAK\_SUBLIST l1 l2} is saying that one can get \texttt{l2} by removing elements from \hol{l1} while keeping the order. + +\subsection{Recursive Definition} + +Define \hol{IS\_WEAK\_SUBLIST} recursively using \hol{Define}. Name your function \hol{IS\_WEAK\_SUBLIST\_REC}. Test this definition via \hol{EVAL} and prove at least 2 sanity check lemmata, which do not coincide with the lemmata you are asked to show below. + +\subsection{Filter Definition} + +Define a version of \hol{IS\_WEAK\_SUBLIST} called \hol{IS\_WEAK\_SUBLIST\_FILTER} using the existing list function \hol{FILTER}. You might want to use \hol{ZIP}, \hol{MAP}, \hol{FST} and \hol{SND} as well. The idea is to check for the existence of a list of booleans of the same length as \hol{l1}, zip this list with \hol{l1} and filter. You probably want to introduce auxiliary definitions before defining \hol{IS\_WEAK\_SUBLIST\_FILTER}. + +The resulting definition is not executable via \hol{EVAL}. Anyhow, show at least 2 sanity check lemmata, which do not coincide with the lemmata you are asked to show below. + +\subsection{Equivalence Proof} + +Show \hol{IS\_WEAK\_SUBLIST\_REC = IS\_WEAK\_SUBLIST\_FILTER}. You might want to prove various auxiliary lemmata first. You might want to use among other things \hol{FUN\_EQ\_THM} and the list function \texttt{REPLICATE}. + +\subsection{Properties} + +Show the following properties of \texttt{IS\_WEAK\_SUBLIST\_REC} and \texttt{IS\_WEAK\_SUBLIST\_FILTER}. This means that for each property stated below in terms of \texttt{IS\_WEAK\_SUBLIST} you should prove one lemma using \texttt{IS\_WEAK\_SUBLIST\_REC} and another lemma using \texttt{IS\_WEAK\_SUBLIST\_FILTER}. Don't use the fact that both functions are equal. The point of this exercise is partly to demonstrate the impact of different definitions on proofs. You might of course use previously proved lemmata to prove additional ones. + +\begin{enumerate} +\item \hol{!l1a l1 l1b l2.\ IS\_WEAK\_SUBLIST l1 l2 ==>\\ +\-\qquad IS\_WEAK\_SUBLIST (l1a ++ l1 ++ l1b) l2} +\item \hol{!l1a l1b l2a l2b.\ IS\_WEAK\_SUBLIST l1a l2a ==> IS\_WEAK\_SUBLIST l1b l2b ==>\\ +\-\qquad IS\_WEAK\_SUBLIST (l1a ++ l1b) (l2a ++ l2b)} +\item \hol{!l.\ IS\_WEAK\_SUBLIST l l} +\item \hol{!l1 l2 l3.\ IS\_WEAK\_SUBLIST l1 l2 ==> IS\_WEAK\_SUBLIST l2 l3 ==>\\ +\-\qquad IS\_WEAK\_SUBLIST l1 l3} +\item \hol{!l1 l2.\ IS\_WEAK\_SUBLIST l1 l2 ==> IS\_WEAK\_SUBLIST l2 l1 ==> (l1 = l2)} +\end{enumerate} + +\section{Deep and Shallow Embeddings} + +As seen in the lecture let's define a deep and a shallow embedding of +propositional logic. Use the names and definitions from the lecture +notes. Add a definition stating that two propositional formulas are +equivalent, iff their semantics coincides for all variable +assignments, \ie + +\begin{center} +\verb#PROP_IS_EQUIV p1 p2 <=> (!a. PROP_SEM a p1 = PROP_SEM a p2)# +\end{center} + + +\subsection{Syntax for propositional formulas} + +Define in SML syntax functions for all shallowly embedded propositional formulas. +Define for each constructor a make - function, a destructor and a check. +For \hol{sh\_and} I would like to have for example +\begin{itemize} +\item \hol{mk\_sh\_and :\ term -> term -> term}, +\item \hol{dest\_sh\_and :\ term -> (term * term)} and +\item \hol{is\_sh\_and :\ term -> bool}. +\end{itemize} +Define a check \hol{is\_sh\_prop :\ term -> bool} that checks whether +a term is a shallowly embedded propositional formula. + +\subsection{Getting Rid of Conjunction and Implication} + +Define a function in HOL \hol{PROP\_CONTAINS\_NO\_AND\_IMPL : prop -> bool} that checks whether a propositional +formula contains no conjunction and implication operators. Define a similar function \hol{sh\_prop\_contains\_no\_and\_impl} in SML that checks the same property for shallowly embedded formulas. + +Define a function \hol{PROP\_REMOVE\_AND\_IMPL} in HOL that removes all conjunctions and implications +from a propositional formula and returns an equivalent one. Prove these properties, \ie prove + +\begin{itemize} +\item \verb#!p. PROP_IS_EQUIV (PROP_REMOVE_AND_IMPL p) p# +\item \verb#!p. PROP_CONTAINS_NO_AND_IMPL (PROP_REMOVE_AND_IMPL p)# +\end{itemize} + +Implement a similar function \hol{sh\_prop\_remove\_and\_impl :\ term -> thm} in SML that performs the same operation on the shallow embedding and returns a theorem stating that the input term is equal to a version without conjunctions and implications. The SML version is allowed to fail, if the input term does not satisfy \hol{is\_sh\_prop}. + +Notice, that \hol{PROP\_REMOVE\_AND\_IMPL} is a verified function, whereas +\hol{sh\_prop\_remove\_and\_impl} is a verifying one. + + +\section{Fancy Function Definitions} + +In the lecture the termination proof for quicksort was briefly discussed. +As an exercise, let's define \hol{minsort}. This function \hol{minsort} sorts +a list of natural numbers, by always searching a minimal element of the list, +put it in front of the list a recursively sort the rest of this list. In HOL, +it can be defined as + +\begin{verbatim} +val expunge_def = + Define + `(expunge x [] = []) + /\ (expunge x (h::t) = if x=h then expunge x t else h::expunge x t)`; + +val min_def = + Define + `(min [] m = m) + /\ (min (h::t) m = if m <= h then min t m else min t h)`; + +val minsort_defn = + Hol_defn "minsort" + `(minsort [] = []) + /\ (minsort (h::t) = + let m = min t h + in + m::minsort (expunge m (h::t)))`; +\end{verbatim} + +Notice, that TFL (\ie \hol{Define}) is not able to show automatically +that \hol{minsort} is terminating. You need to do this manually. Show +auxiliary lemmata about \hol{min} and \hol{expunge} and use them with +\hol{Defn.tprove} (and \hol{Defn.tgoal}) to show that \hol{minsort} +terminates. + +\clearpage +\section{Hints} + +\subsection{Definition of \hol{IS\_WEAK\_SUBLIST}} + +\hol{IS\_WEAK\_SUBLIST\_REC} and \hol{IS\_WEAK\_SUBLIST\_FILTER} can be defined by + +\begin{verbatim} +val IS_WEAK_SUBLIST_REC_def = Define ` + (IS_WEAK_SUBLIST_REC (l1 : 'a list) ([]:'a list) = T) /\ + (IS_WEAK_SUBLIST_REC [] (_::_) = F) /\ + (IS_WEAK_SUBLIST_REC (y::ys) (x::xs) = ( + (x = y) /\ IS_WEAK_SUBLIST_REC ys xs) \/ (IS_WEAK_SUBLIST_REC ys (x::xs)))`; + +val FILTER_BY_BOOLS_def = Define ` + FILTER_BY_BOOLS bl l = MAP SND (FILTER FST (ZIP (bl, l)))` + +val IS_WEAK_SUBLIST_FILTER_def = Define `IS_WEAK_SUBLIST_FILTER l1 l2 = + ?(bl : bool list). (LENGTH bl = LENGTH l1) /\ (l2 = FILTER_BY_BOOLS bl l1)` +\end{verbatim} + + +\subsection{Termination of \hol{minsort}} + +\hol{minsort} is an example of the TFL library. You can find a termination proof in the HOL sources. However, really try to prove termination yourself first. Before you start looking up the proof, here a few hints: + +\begin{itemize} +\item The main idea is that the length of \hol{expunge m (h::t)} is shorter than the length of \hol{h::t}, \ie start your termination proof with \hol{WF\_REL\_TAC LENGTH}. +\item show the lemma \hol{!x xs.\ LENGTH (expunge x xs) <= LENGTH xs} +\item show the lemma \hol{!x xs.\ MEM x xs ==> LENGTH (expunge x xs) < LENGTH xs} +\item show the lemma \hol{!x xs.\ MEM (min xs x) (x::xs)} +\end{itemize} + +\end{document} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/exercises/e6.tex b/exercises/e6.tex new file mode 100644 index 0000000..d29480f --- /dev/null +++ b/exercises/e6.tex @@ -0,0 +1,125 @@ +\documentclass[a4paper,10pt,oneside]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[a4paper]{geometry} +\usepackage{hyperref} +\usepackage{url} +\usepackage{color} +\usepackage{amsfonts} +\usepackage{graphicx} + +\input{../hol_commands.inc} + +\title{Exercise 6} +\def\ttwebflag{} +\begin{document} + +\begin{center} +\usekomafont{sectioning}\usekomafont{part}ITP Exercise 6 +\webversion{}{\\\small{due Friday 2nd June}} +\end{center} +\bigskip + +\webversion{}{ +\section{Exercise 5} + +Please finish question 1.3 and 1.4 from exercise 5. You might find the simplifier helpful. + + +\section{Final Project} + +We have 3 more weeks to go on the lecture. For the last 3 weeks, I would like to set a small project to solve for everyone. There will be a default project (see below). However, if you want you can also propose your own project. This has to be approved by me, before you can start working on it. It should satisfy the following requirements: + +\begin{itemize} +\item You should build a formal model of some description. This description can \eg be a natural language text or some computer program. +\item You should test your model against the description / implementation. +\item You should prove some interesting properties. +\item It should be do-able in a reasonable amount of time (ideally 3 weeks). You have to either convince me that it is doable in 3 weeks or worth both your and my additional time. +\end{itemize} + +Please read the default project proposal below. Either decide to do this project or think of an alternative final project. In any case, discuss your choice with me. \webversion{}{\textbf{Whoever has not discussed a final project with me by June 2nd will be forced to do the default project.}} + +\clearpage +} + +\webversion{\section{Final Project}}{\section{Default Project - Regular Expressions in HOL}} + +There is a fun paper on regular expressions: \emph{A Play on Regular + Expressions} by Sebastian Fischer, Frank Huch and Thomas Wilke +published as a functional pearl at ICFP 2010 +(\url{http://www-ps.informatik.uni-kiel.de/~sebf/pub/regexp-play.html}). +In this paper an implementation of marked regular expressions in +Haskell is described. The task is to formalise the simple parts of +this work in HOL, verify the correctness of the implementation and +export trustworthy code into an SML library. + +You should develop this project such that (in theory) it could be +added to the examples directory of HOL. Therefore, I want you to +create a git-repository for your project\webversion{}{ and give me access to it}. You +should create one or more HOL-theories that can be compiled by +Holmake. There will be multiple SML files as well. These should +compile decently and have a signature. Please provide a selftest for +your development. Write decent documentation. There should be a (very +short) \texttt{README} as well as sufficient comments in the code. + + + +\subsection{Basic Regular Expression Semantics} + +Read Act 1, Scene 1. Implement the \texttt{Reg} datatype in HOL. Like later in the paper, +replace the type \texttt{Char} with a free type variable \texttt{'a}. The intention is to define +regular expressions on lists of type \texttt{'a}. Define a function \texttt{language\_of :\ 'a Reg -> ('a list) set} that returns the language accepted by a regular expression. The definition of +\texttt{language\_of} should be as clean and simple as possible. It does not need to be executable. + +\subsection{Executable Semantics} +Now define the function \texttt{accept} in HOL. While doing so replace the type \texttt{String} with \texttt{'a list} to match the changes to \texttt{Reg}. You will need to implement the auxiliary functions \texttt{parts} and \texttt{split}. Test your definitions and apply formal sanity checks. + +\subsection{Code Extraction and Conformance Testing} + +Familiarise yourself with \texttt{EmitML}. Use it to extract your datatype \texttt{Reg} and the function \texttt{accept} to ML. Test \texttt{accept} against the regular expression implementation in \texttt{regexpMatch.sml} that comes with HOL. + +\texttt{EmitML} has not been discussed in the lecture and is not well documented. Part of this challenge is to find information for yourself about HOL libraries and learn from examples and source code. + +\subsection{Correctness Proof} + +Prove that \texttt{accept} and \texttt{language\_of} agree with each other, \ie prove the statement \texttt{!r w.\ accept r w <=> w IN (language\_of r)}. + +\subsection{Marked Regular Expressions} + +Continue reading the paper. Act 1, Scene 2 is interesting, but we are here not interested in weights. Instead focus in Act 2, Scene 1. Implement a datatype for marked regular expressions called \texttt{MReg}. Use first the simple version with caching the values of \texttt{empty} and \texttt{final}. Provide a function \texttt{MARK\_REG :\ 'a Reg -> 'a MReg} that turns a regular expression into a marked expression without any marks set. Implement a function \texttt{acceptM :\ 'a MReg -> 'a list -> bool} following the idea of the \texttt{accept} function in the paper. + +Test your definitions and perform formal sanity checks. + + +\subsection{Correctness Proof Marked Regular Expressions} + +Show that \texttt{acceptM} is correct, \ie show +\texttt{!r w.\ acceptM (MARK\_REG r) w <=> w IN (language\_of r)}. + + +\subsection{Cached Marked Regular Expressions} + +Now let's also implement the caching of \texttt{empty} and \texttt{final}. Call the resulting datatypes \texttt{CMReg}. It is tempting to define mutually recursive types \texttt{CMReg} and \texttt{CMRe} as in the paper. However, HOL's automation won't work well on such a type, so I advice manually encoding a cache (\ie adding extra boolean arguments to the constructors of \texttt{MReg}). Write a function \texttt{CACHE\_REG :\ 'a MReg -> 'a CMReg} that turns a marked regular expression into a cached marked one with valid caches. Implement a function \texttt{acceptCM :\ 'a CMReg -> 'a list -> bool} that is similar to \texttt{acceptM}, but more efficient due to using the caches. + +Test your definitions and perform formal sanity checks. As part of formal sanity, +define a well-formedness predicate for cached marked regular expressions stating that the cached values for \texttt{empty} and \texttt{final} are correct. +Moreover, define the inverse function \texttt{UNCACHE\_REG :\ 'a CMReg -> 'a MReg} of \texttt{CACHE\_REG} and show that these functions are really inverses. + +\subsection{Correctness Proof Caches} + +Show that \texttt{acceptCM} is correct, \ie show +\texttt{!r w.\ acceptCM (CACHE\_REG (MARK\_REG r)) w <=> w IN (language\_of r)}. + + +\subsection{SML Library} + +Use \texttt{EmitML} to extract your code to SML. Provide an interface for regular expressions on strings. The interface should contain a type for regular expression on strings similar to \texttt{char Reg}. It should provide a function \texttt{match} that checks whether such a regular expression matches a given string. Build 4 instances of this interface, one with the regular expression library \texttt{regexpMatch.sml} and ones for \texttt{accept}, \texttt{acceptM} and \texttt{acceptCM}. Write some simple tests and run them against all these instantiations (\eg via a functor). Perform some simple performance measurements. + + + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/exercises/e7.tex b/exercises/e7.tex new file mode 100644 index 0000000..72fc00d --- /dev/null +++ b/exercises/e7.tex @@ -0,0 +1,70 @@ +\documentclass[a4paper,10pt,oneside]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[a4paper]{geometry} +\usepackage{hyperref} +\usepackage{url} +\usepackage{color} +\usepackage{amsfonts} +\usepackage{graphicx} + +\input{../hol_commands.inc} + +\title{Exercise 7} +\begin{document} + +\begin{center} +\usekomafont{sectioning}\usekomafont{part}ITP Exercise 7 +\end{center} +\bigskip + +\webversion{}{ +\section{Final Project} + +You should all have started working on your final project by now. The last lecture will take place Monday, 12th June. Practical sessions will continue till 23rd June. There will be an additional practical session on 19 June during the slot normally used for the lecture. The final project is at the very latest due on the 23rd. If other agreements have been reached in person, these take precedence. Despite the late deadline, you are still required to turn up to at least one practical session each week. I highly recommend attending more than one each week. +} +\section{Exercise 7} + +\webversion{}{Since you are working on the final project, exercise 7 is optional. You are not required to +work it and there is no deadline.} + + +\subsection{Advanced Definition Principles} + +Define the reflexive, transitive closure of a relation using 3 different methods as shown below. +\hol{RTC\_REL} is defining it using the inductive relation library. \hol{RTC\_DIRECT} is +using a simple higher order logic definition and \hol{RTC\_REC} uses recursion on natural numbers to define it. Show that all three definitions are defining the same function, \ie show +\hol{(RTC\_REL = RTC\_DIRECT) \holAnd{} (RTC\_REL = RTC\_REC) \holAnd{} (RTC\_REC = RTC\_DIRECT)}. + + +\begin{verbatim} +val (RTC_REL_rules, RTC_REL_ind, RTC_REL_cases) = Hol_reln ` + (!x y. R x y ==> RTC_REL R x y) /\ + (!x. RTC_REL R x x) /\ + (!x y z. RTC_REL R x y /\ RTC_REL R y z ==> RTC_REL R x z)` + +val RTC_DIRECT_def = new_definition ("RTC_DIRECT", + ``RTC_DIRECT R = \(a:'a) (b:'a). !P. + ((!x. P x x) /\ (!x y. R x y ==> P x y) /\ + (!x y z. (P x y /\ P y z) ==> P x z)) ==> + (P a b)``); + +val RTC_REC_NUM_def = Define ` + (RTC_REC_NUM 0 R x y <=> (x = y)) /\ + (RTC_REC_NUM (SUC n) R x y <=> (?z. R x z /\ RTC_REC_NUM n R z y))` + +val RTC_REC_def = Define ` + RTC_REC R x y = ?n. RTC_REC_NUM n R x y`; +\end{verbatim} + + +\subsection{Simplifier} + +Dig out the code for \texttt{find\_contr\_in\_conj\_CONV} your wrote for execise 2, section 4.4. Create a simpset-fragment containing this conversion and use it on several examples. + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/exercises/func_array.dot b/exercises/func_array.dot new file mode 100644 index 0000000..c9ec77b --- /dev/null +++ b/exercises/func_array.dot @@ -0,0 +1,32 @@ +digraph G { + node_0 [label="1: 1"] + node_2 [label="3: 11"] + node_1 [label="2: 10"] + node_6 [label="7: 111"] + node_5 [label="6: 110"] + node_4 [label="5: 101"] + node_3 [label="4: 100"] + + node_14 [label="15: 1111"] + node_13 [label="14: 1110"] + node_12 [label="13: 1101"] + node_11 [label="12: 1100"] + node_10 [label="11: 1011"] + node_9 [label="10: 1010"] + node_8 [label="9: 1001"] + node_7 [label="8: 1000"] + node_1 -> node_3 [label="r"] + node_1 -> node_5 [label="l"] + node_0 -> node_2 [label="l"] + node_0 -> node_1 [label="r"] + node_2 -> node_4 [label="r"] + node_2 -> node_6 [label="l"] + node_3 -> node_11 [label="l"] + node_3 -> node_7 [label="r"] + node_4 -> node_12 [label="l"] + node_4 -> node_8 [label="r"] + node_5 -> node_13 [label="l"] + node_5 -> node_9 [label="r"] + node_6 -> node_10 [label="r"] + node_6 -> node_14 [label="l"] +} diff --git a/exercises/func_array.eps b/exercises/func_array.eps new file mode 100644 index 0000000..a588dca --- /dev/null +++ b/exercises/func_array.eps @@ -0,0 +1,653 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: graphviz version 2.38.0 (20140413.2041) +%%Title: G +%%Pages: 1 +%%BoundingBox: 36 36 826 341 +%%EndComments +save +%%BeginProlog +/DotDict 200 dict def +DotDict begin + +/setupLatin1 { +mark +/EncodingVector 256 array def + EncodingVector 0 + +ISOLatin1Encoding 0 255 getinterval putinterval +EncodingVector 45 /hyphen put + +% Set up ISO Latin 1 character encoding +/starnetISO { + dup dup findfont dup length dict begin + { 1 index /FID ne { def }{ pop pop } ifelse + } forall + /Encoding EncodingVector def + currentdict end definefont +} def +/Times-Roman starnetISO def +/Times-Italic starnetISO def +/Times-Bold starnetISO def +/Times-BoldItalic starnetISO def +/Helvetica starnetISO def +/Helvetica-Oblique starnetISO def +/Helvetica-Bold starnetISO def +/Helvetica-BoldOblique starnetISO def +/Courier starnetISO def +/Courier-Oblique starnetISO def +/Courier-Bold starnetISO def +/Courier-BoldOblique starnetISO def +cleartomark +} bind def + +%%BeginResource: procset graphviz 0 0 +/coord-font-family /Times-Roman def +/default-font-family /Times-Roman def +/coordfont coord-font-family findfont 8 scalefont def + +/InvScaleFactor 1.0 def +/set_scale { + dup 1 exch div /InvScaleFactor exch def + scale +} bind def + +% styles +/solid { [] 0 setdash } bind def +/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def +/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def +/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def +/bold { 2 setlinewidth } bind def +/filled { } bind def +/unfilled { } bind def +/rounded { } bind def +/diagonals { } bind def +/tapered { } bind def + +% hooks for setting color +/nodecolor { sethsbcolor } bind def +/edgecolor { sethsbcolor } bind def +/graphcolor { sethsbcolor } bind def +/nopcolor {pop pop pop} bind def + +/beginpage { % i j npages + /npages exch def + /j exch def + /i exch def + /str 10 string def + npages 1 gt { + gsave + coordfont setfont + 0 0 moveto + (\() show i str cvs show (,) show j str cvs show (\)) show + grestore + } if +} bind def + +/set_font { + findfont exch + scalefont setfont +} def + +% draw text fitted to its expected width +/alignedtext { % width text + /text exch def + /width exch def + gsave + width 0 gt { + [] 0 setdash + text stringwidth pop width exch sub text length div 0 text ashow + } if + grestore +} def + +/boxprim { % xcorner ycorner xsize ysize + 4 2 roll + moveto + 2 copy + exch 0 rlineto + 0 exch rlineto + pop neg 0 rlineto + closepath +} bind def + +/ellipse_path { + /ry exch def + /rx exch def + /y exch def + /x exch def + matrix currentmatrix + newpath + x y translate + rx ry scale + 0 0 1 0 360 arc + setmatrix +} bind def + +/endpage { showpage } bind def +/showpage { } def + +/layercolorseq + [ % layer color sequence - darkest to lightest + [0 0 0] + [.2 .8 .8] + [.4 .8 .8] + [.6 .8 .8] + [.8 .8 .8] + ] +def + +/layerlen layercolorseq length def + +/setlayer {/maxlayer exch def /curlayer exch def + layercolorseq curlayer 1 sub layerlen mod get + aload pop sethsbcolor + /nodecolor {nopcolor} def + /edgecolor {nopcolor} def + /graphcolor {nopcolor} def +} bind def + +/onlayer { curlayer ne {invis} if } def + +/onlayers { + /myupper exch def + /mylower exch def + curlayer mylower lt + curlayer myupper gt + or + {invis} if +} def + +/curlayer 0 def + +%%EndResource +%%EndProlog +%%BeginSetup +14 default-font-family set_font +1 setmiterlimit +% /arrowlength 10 def +% /arrowwidth 5 def + +% make sure pdfmark is harmless for PS-interpreters other than Distiller +/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse +% make '<<' and '>>' safe on PS Level 1 devices +/languagelevel where {pop languagelevel}{1} ifelse +2 lt { + userdict (<<) cvn ([) cvn load put + userdict (>>) cvn ([) cvn load put +} if + +%%EndSetup +setupLatin1 +%%Page: 1 1 +%%PageBoundingBox: 36 36 826 341 +%%PageOrientation: Portrait +0 0 1 beginpage +gsave +36 36 790 305 boxprim clip newpath +1 1 set_scale 0 rotate 40 40 translate +% node_0 +gsave +1 setlinewidth +0 0 0 nodecolor +424.25 279 27 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +413.25 275.3 moveto 22 (1: 1) alignedtext +grestore +% node_2 +gsave +1 setlinewidth +0 0 0 nodecolor +273.25 192 28.7 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +259.25 188.3 moveto 28 (3: 11) alignedtext +grestore +% node_0->node_2 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 404.19 266.71 moveto +378.17 252.06 332.54 226.38 302.61 209.53 curveto +stroke +0 0 0 edgecolor +newpath 304.3 206.46 moveto +293.87 204.61 lineto +300.86 212.56 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 304.3 206.46 moveto +293.87 204.61 lineto +300.86 212.56 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +358.25 231.8 moveto 4 (l) alignedtext +grestore +% node_1 +gsave +1 setlinewidth +0 0 0 nodecolor +493.25 192 28.7 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +479.25 188.3 moveto 28 (2: 10) alignedtext +grestore +% node_0->node_1 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 436.58 262.8 moveto +447.11 249.83 462.42 230.97 474.48 216.12 curveto +stroke +0 0 0 edgecolor +newpath 477.2 218.32 moveto +480.78 208.35 lineto +471.76 213.91 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 477.2 218.32 moveto +480.78 208.35 lineto +471.76 213.91 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +463.25 231.8 moveto 5 (r) alignedtext +grestore +% node_6 +gsave +1 setlinewidth +0 0 0 nodecolor +144.25 105 33.29 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +126.75 101.3 moveto 35 (7: 111) alignedtext +grestore +% node_2->node_6 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 254.21 178.46 moveto +232.86 164.39 198 141.42 173.25 125.11 curveto +stroke +0 0 0 edgecolor +newpath 174.91 122.02 moveto +164.64 119.44 lineto +171.06 127.86 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 174.91 122.02 moveto +164.64 119.44 lineto +171.06 127.86 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +217.25 144.8 moveto 4 (l) alignedtext +grestore +% node_4 +gsave +1 setlinewidth +0 0 0 nodecolor +273.25 105 33.29 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +255.75 101.3 moveto 35 (5: 101) alignedtext +grestore +% node_2->node_4 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 273.25 173.8 moveto +273.25 162.16 273.25 146.55 273.25 133.24 curveto +stroke +0 0 0 edgecolor +newpath 276.75 133.18 moveto +273.25 123.18 lineto +269.75 133.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 276.75 133.18 moveto +273.25 123.18 lineto +269.75 133.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +273.25 144.8 moveto 5 (r) alignedtext +grestore +% node_5 +gsave +1 setlinewidth +0 0 0 nodecolor +493.25 105 33.29 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +475.75 101.3 moveto 35 (6: 110) alignedtext +grestore +% node_1->node_5 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 493.25 173.8 moveto +493.25 162.16 493.25 146.55 493.25 133.24 curveto +stroke +0 0 0 edgecolor +newpath 496.75 133.18 moveto +493.25 123.18 lineto +489.75 133.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 496.75 133.18 moveto +493.25 123.18 lineto +489.75 133.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +493.25 144.8 moveto 4 (l) alignedtext +grestore +% node_3 +gsave +1 setlinewidth +0 0 0 nodecolor +646.25 105 33.29 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +628.75 101.3 moveto 35 (4: 100) alignedtext +grestore +% node_1->node_3 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 513.88 179.54 moveto +539.9 165.08 584.88 140.09 615.09 123.31 curveto +stroke +0 0 0 edgecolor +newpath 616.92 126.3 moveto +623.96 118.38 lineto +613.52 120.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 616.92 126.3 moveto +623.96 118.38 lineto +613.52 120.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +579.25 144.8 moveto 5 (r) alignedtext +grestore +% node_14 +gsave +1 setlinewidth +0 0 0 nodecolor +42.25 18 42.49 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +17.75 14.3 moveto 49 (15: 1111) alignedtext +grestore +% node_6->node_14 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 126.94 89.58 moveto +110.97 76.27 87.03 56.32 68.66 41.01 curveto +stroke +0 0 0 edgecolor +newpath 70.59 38.07 moveto +60.67 34.35 lineto +66.11 43.44 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 70.59 38.07 moveto +60.67 34.35 lineto +66.11 43.44 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +100.25 57.8 moveto 4 (l) alignedtext +grestore +% node_10 +gsave +1 setlinewidth +0 0 0 nodecolor +144.25 18 42.49 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +119.75 14.3 moveto 49 (11: 1011) alignedtext +grestore +% node_6->node_10 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 144.25 86.8 moveto +144.25 75.16 144.25 59.55 144.25 46.24 curveto +stroke +0 0 0 edgecolor +newpath 147.75 46.18 moveto +144.25 36.18 lineto +140.75 46.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 147.75 46.18 moveto +144.25 36.18 lineto +140.75 46.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +144.25 57.8 moveto 5 (r) alignedtext +grestore +% node_13 +gsave +1 setlinewidth +0 0 0 nodecolor +442.25 18 42.49 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +417.75 14.3 moveto 49 (14: 1110) alignedtext +grestore +% node_5->node_13 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 483.41 87.61 moveto +476.05 75.34 465.85 58.34 457.44 44.32 curveto +stroke +0 0 0 edgecolor +newpath 460.37 42.4 moveto +452.22 35.63 lineto +454.37 46 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 460.37 42.4 moveto +452.22 35.63 lineto +454.37 46 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +471.25 57.8 moveto 4 (l) alignedtext +grestore +% node_9 +gsave +1 setlinewidth +0 0 0 nodecolor +544.25 18 42.49 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +519.75 14.3 moveto 49 (10: 1010) alignedtext +grestore +% node_5->node_9 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 503.08 87.61 moveto +510.44 75.34 520.64 58.34 529.05 44.32 curveto +stroke +0 0 0 edgecolor +newpath 532.13 46 moveto +534.27 35.63 lineto +526.12 42.4 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 532.13 46 moveto +534.27 35.63 lineto +526.12 42.4 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +522.25 57.8 moveto 5 (r) alignedtext +grestore +% node_12 +gsave +1 setlinewidth +0 0 0 nodecolor +246.25 18 42.49 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +221.75 14.3 moveto 49 (13: 1101) alignedtext +grestore +% node_4->node_12 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 267.91 87.21 moveto +264.16 75.41 259.07 59.38 254.77 45.82 curveto +stroke +0 0 0 edgecolor +newpath 258.03 44.52 moveto +251.66 36.05 lineto +251.35 46.64 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 258.03 44.52 moveto +251.66 36.05 lineto +251.35 46.64 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +262.25 57.8 moveto 4 (l) alignedtext +grestore +% node_8 +gsave +1 setlinewidth +0 0 0 nodecolor +344.25 18 37.89 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +323.25 14.3 moveto 42 (9: 1001) alignedtext +grestore +% node_4->node_8 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 286.27 88.41 moveto +296.84 75.75 311.94 57.68 324.08 43.15 curveto +stroke +0 0 0 edgecolor +newpath 327.1 44.99 moveto +330.82 35.07 lineto +321.73 40.5 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 327.1 44.99 moveto +330.82 35.07 lineto +321.73 40.5 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +313.25 57.8 moveto 5 (r) alignedtext +grestore +% node_11 +gsave +1 setlinewidth +0 0 0 nodecolor +646.25 18 42.49 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +621.75 14.3 moveto 49 (12: 1100) alignedtext +grestore +% node_3->node_11 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 646.25 86.8 moveto +646.25 75.16 646.25 59.55 646.25 46.24 curveto +stroke +0 0 0 edgecolor +newpath 649.75 46.18 moveto +646.25 36.18 lineto +642.75 46.18 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 649.75 46.18 moveto +646.25 36.18 lineto +642.75 46.18 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +646.25 57.8 moveto 4 (l) alignedtext +grestore +% node_7 +gsave +1 setlinewidth +0 0 0 nodecolor +744.25 18 37.89 18 ellipse_path stroke +0 0 0 nodecolor +14 /Times-Roman set_font +723.25 14.3 moveto 42 (8: 1000) alignedtext +grestore +% node_3->node_7 +gsave +1 setlinewidth +0 0 0 edgecolor +newpath 663.32 89.19 moveto +678.72 75.83 701.59 55.99 719.09 40.82 curveto +stroke +0 0 0 edgecolor +newpath 721.45 43.4 moveto +726.71 34.21 lineto +716.86 38.12 lineto +closepath fill +1 setlinewidth +solid +0 0 0 edgecolor +newpath 721.45 43.4 moveto +726.71 34.21 lineto +716.86 38.12 lineto +closepath stroke +0 0 0 edgecolor +14 /Times-Roman set_font +701.25 57.8 moveto 5 (r) alignedtext +grestore +endpage +showpage +grestore +%%PageTrailer +%%EndPage: 1 +%%Trailer +end +restore +%%EOF diff --git a/exercises/philScript.sml b/exercises/philScript.sml new file mode 100644 index 0000000..c24fc40 --- /dev/null +++ b/exercises/philScript.sml @@ -0,0 +1,65 @@ +open HolKernel Parse boolLib bossLib; + +val _ = new_theory "phil"; + +val _ = Datatype `Philosopher = diogenes | platon | euklid`; +val Philosopher_nchotomy = DB.fetch "-" "Philosopher_nchotomy"; +val Philosopher_distinct = DB.fetch "-" "Philosopher_distinct"; + + +val PHIL_KNOWLEDGE = new_specification ("PHIL_KNOWLEDGE", ["At", "Sp", "W", "B"], +prove (``?At Sp W B. + (!p. (Sp p ==> B p)) /\ + (!p. (At p ==> W p)) /\ + (!p. ~(Sp p) \/ ~(At p)) /\ + (!p. (Sp p) \/ (At p)) /\ + ((Sp platon) ==> ~(W diogenes)) /\ + ((Sp euklid) ==> ~(B diogenes)) /\ + ((At diogenes) ==> ~(B euklid)) /\ + ((At platon) ==> ~(W euklid))``, + +Q.EXISTS_TAC `\p. Philosopher_CASE p F F T` THEN +Q.EXISTS_TAC `\p. Philosopher_CASE p T T F` THEN +Q.EXISTS_TAC `\p. Philosopher_CASE p F T T` THEN +Q.EXISTS_TAC `\p. Philosopher_CASE p T T F` THEN +SIMP_TAC (srw_ss()++DatatypeSimps.expand_type_quants_ss [``:Philosopher``]) [])); + + +val PHIL_KNOWLEDGE_a = store_thm ("PHIL_KNOWLEDGE_a", ``!p. Sp p ==> B p``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_b = store_thm ("PHIL_KNOWLEDGE_b", ``!p. At p ==> W p``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_c = store_thm ("PHIL_KNOWLEDGE_c", ``!p. ~(Sp p) \/ ~(At p)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_c1 = store_thm ("PHIL_KNOWLEDGE_c1", ``!p. Sp p ==> ~(At p)``, + PROVE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_c2 = store_thm ("PHIL_KNOWLEDGE_c2", ``!p. At p ==> ~(Sp p)``, + PROVE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_d = store_thm ("PHIL_KNOWLEDGE_d", ``!p. (Sp p) \/ (At p)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_d1 = store_thm ("PHIL_KNOWLEDGE_d1", ``!p. ~(Sp p) ==> At p``, + PROVE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_d2 = store_thm ("PHIL_KNOWLEDGE_d2", ``!p. ~(At p) ==> Sp p``, + PROVE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_e = store_thm ("PHIL_KNOWLEDGE_e", ``(Sp platon) ==> ~(W diogenes)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_f = store_thm ("PHIL_KNOWLEDGE_f", ``(Sp euklid) ==> ~(B diogenes)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_g = store_thm ("PHIL_KNOWLEDGE_g", ``(At diogenes) ==> ~(B euklid)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val PHIL_KNOWLEDGE_h = store_thm ("PHIL_KNOWLEDGE_h", ``(At platon) ==> ~(W euklid)``, + REWRITE_TAC[PHIL_KNOWLEDGE]); + +val _ = export_theory(); + diff --git a/hol_commands.inc b/hol_commands.inc new file mode 100644 index 0000000..da39979 --- /dev/null +++ b/hol_commands.inc @@ -0,0 +1,19 @@ +\newcommand{\ie}{i.\,e.\ } +\newcommand{\eg}{e.\,g.\ } +\newcommand{\wrt}{w.\,r.\,t.\ } +\newcommand{\aka}{a.\,k.\,a.\ } +\newcommand{\cf}{cf.\ } +\newcommand{\etc}{etc.\ } +\newcommand{\entails}{\vdash} +\newcommand{\hol}[1]{\texttt{#1}} +\newcommand{\ml}[1]{\texttt{#1}} +\newcommand{\textbsl}{\char`\\{}} +\newcommand{\holAnd}{/\textbsl{}} +\newcommand{\holOr}{\textbsl{}/} +\newcommand{\holLambda}{\textbsl{}} +\newcommand{\holImp}{==>} +\newcommand{\holEquiv}{<=>} +\newcommand{\holNeg}{\raisebox{0.5ex}{\texttildelow}} + + +\newcommand{\webversion}[2]{\ifdefined\ttwebflag #1 \else #2 \fi} diff --git a/lectures/00_webpage_intro.tex b/lectures/00_webpage_intro.tex new file mode 100644 index 0000000..c443373 --- /dev/null +++ b/lectures/00_webpage_intro.tex @@ -0,0 +1,40 @@ +\part{Preface} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{Preface} +\begin{itemize} +\item these slides originate from a course for advanced master students +\item it was given by the PROSPER group at KTH in Stockholm in 2017 (see \small{\url{https://www.kth.se/social/group/interactive-theorem-}}) +\item the course focused on how to use HOL~4 +\item students taking the course were expected to +\begin{itemize} +\item know functional programming, esp.\ SML +\item understand predicate logic +\item have some experience with pen and paper proofs +\end{itemize} +\item the course consisted of 9 lectures, which each took 90 minutes +\item there were 19 supervised practical sessions, which each took 2 h +\item usually there was 1 lecture and 2 practical sessions each week +\item students were expected to work about 10 h each week on exercises +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Preface II} +\begin{itemize} +\item usually, these slides present concepts and some high-level entry points +\item often some more details were explained than covered on the slides +\item technical details were covered in the practical sessions +\item they are provided as they are in the hope that they are useful\footnote{if you find errors, please contact Thomas Tuerk} (there are no guarentees of correctness :-)) +\item the exercise question-sheets are available as well +\item if you have questions, feel free to contact Thomas Tuerk (\texttt{thomas@tuerk-brechen.de}) +\end{itemize} +\end{frame} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "hol" +%%% End: diff --git a/lectures/01_introduction.tex b/lectures/01_introduction.tex new file mode 100644 index 0000000..f5b29c2 --- /dev/null +++ b/lectures/01_introduction.tex @@ -0,0 +1,261 @@ +\part{Introduction} + +\frame[plain]{\partpage} + +\section{Motivation} + +\begin{frame} +\frametitle{Motivation} +\begin{itemize} +\item Complex systems almost certainly contain bugs. +\item Critical systems (\eg avionics) need to meet very high standards. +\item It is infeasible in practice to achieve such high standards just by testing. +\item Debugging via testing suffers from diminishing returns. +\end{itemize} +\bigskip + +\begin{raggedleft} +\emph{``Program testing can be used to show the presence\\ +of bugs, but never to show their absence!''\\ +--- Edsger W. Dijkstra\\} +\end{raggedleft} + +\end{frame} + +\begin{frame} +\frametitle{Famous Bugs} +\begin{itemize} +\item Pentium FDIV bug (1994)\\(missing entry in lookup table, \$475 million damage) +\item Ariane V explosion (1996)\\(integer overflow, \$1 billion prototype destroyed) +\item Mars Climate Orbiter (1999)\\(destroyed in Mars orbit, mixup of units pound-force and newtons) +\item Knight Capital Group Error in Ultra Short Time Trading (2012)\\ +(faulty deployment, repurposing of critical flag, \$440 lost in 45 min on stock exchange) +\item \ldots +\end{itemize} + +\begin{block}{Fun to read} +\url{http://www.cs.tau.ac.il/~nachumd/verify/horror.html} +\url{https://en.wikipedia.org/wiki/List_of_software_bugs} +\end{block} + +\end{frame} + + +\begin{frame} +\frametitle{Proof} +\begin{itemize} +\item proof can show absence of errors in design +\item but proofs talk about a \emph{design}, not a \emph{real system} +\item $\Rightarrow$ testing and proving complement each other +\end{itemize} +\bigskip + +\begin{raggedleft} +\emph{``As far as the laws of mathematics\\ +refer to reality, they are not certain;\\ +and as far as they are certain,\\ +they do not refer to reality.''\\ +--- Albert Einstein\\} +\end{raggedleft} + +\end{frame} + + +\section{Types of Proofs} + +\begin{frame} +\frametitle{Mathematical vs.\ Formal Proof} + +\begin{columns} +\begin{column}{0.45\textwidth} + +\begin{block}{Mathematical Proof} +\begin{itemize} +\item informal, convince other mathematicians +\item checked by community of domain experts +\item subtle errors are hard to find +\item often provide some new insight about our world +\item often short, but require creativity and a brilliant idea +\end{itemize} +\end{block} +\end{column} + +\begin{column}{0.45\textwidth} +\begin{block}{Formal Proof} +\begin{itemize} +\item formal, rigorously use a logical formalism +\item checkable by \textit{stupid} machines +\item very reliable +\item often contain no new ideas and no amazing insights +\item often long, very tedious, but largely trivial +\end{itemize} +\end{block} +\end{column} +\end{columns} + +\begin{center} +\textbf{We are interested in formal proofs in this lecture.} +\end{center} + +\end{frame} + +% \begin{frame} +% \frametitle{Detail Level of Formal Proof} + +% \begin{center} +% In \emph{Principia Mathematica} it takes 300 pages to prove 1+1=2. +% \bigskip + +% This is nicely illustrated in \emph{Logicomix - An Epic Search for Truth}. +% \includegraphics[width=10cm]{images/1+12_Logicomix.png} +% \end{center} +% \end{frame} + +\begin{frame} +\frametitle{Automated vs Manual (Formal) Proof} + +\begin{block}{Fully Manual Proof} +\begin{itemize} +\item very tedious; one has to grind through many trivial but detailed proofs +\item easy to make mistakes +\item hard to keep track of all assumptions and preconditions +\item hard to maintain, if something changes (see Ariane V) +\end{itemize} +\end{block} + +\begin{block}{Automated Proof} +\begin{itemize} +\item amazing success in certain areas +\item but still often infeasible for interesting problems +\item hard to get insights in case a proof attempt fails +\item even if it works, it is often not that automated +\begin{itemize} +\item run automated tool for a few days +\item abort, change command line arguments to use different heuristics +\item run again and iterate till you find a set of heuristics that prove it fully automatically in a few seconds +\end{itemize} +\end{itemize} +\end{block} +\end{frame} + + + +\begin{frame} +\frametitle{Interactive Proofs} + +\begin{itemize} +\item combine strengths of manual and automated proofs +\item many different options to combine automated and manual proofs +\begin{itemize} +\item mainly check existing proofs (\eg HOL Zero) +\item user mainly provides lemmata statements, computer searches proofs using previous lemmata and very few hints (\eg ACL 2) +\item most systems are somewhere in the middle +\end{itemize} + +\item typically the human user +\begin{itemize} +\item provides insights into the problem +\item structures the proof +\item provides main arguments +\end{itemize} +\item typically the computer +\begin{itemize} +\item checks proof +\item keeps track of all used assumptions +\item provides automation to grind through lengthy, but trivial proofs +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Typical Interactive Proof Activities} + +\begin{itemize} +\item provide precise definitions of concepts +\item state properties of these concepts +\item prove these properties +\begin{itemize} +\item human provides insight and structure +\item computer does book-keeping and automates simple proofs +\end{itemize} +\item build and use libraries of formal definitions and proofs +\begin{itemize} +\item formalisations of mathematical theories like +\begin{itemize} +\item lists, sets, bags, \ldots +\item real numbers +\item probability theory +\end{itemize} +\item specifications of real-world artefacts like +\begin{itemize} +\item processors +\item programming languages +\item network protocols +\end{itemize} +\item reasoning tools +\end{itemize} +\end{itemize} + +\begin{center} +\textbf{There is a strong connection with programming.\\Lessons learned in Software Engineering apply.} +\end{center} +\end{frame} + + +\section{Interactive Theorem Provers} + +\begin{frame} +\frametitle{Different Interactive Provers} + +\begin{itemize} +\item there are many different interactive provers, \eg +\begin{itemize} +\item Isabelle/HOL +\item Coq +\item PVS +\item HOL family of provers +\item ACL2 +\item \ldots +\end{itemize} +\item important differences +\begin{itemize} +\item the formalism used +\item level of trustworthiness +\item level of automation +\item libraries +\item languages for writing proofs +\item user interface +\item \ldots +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Which theorem prover is the best one? :-)} + +\begin{itemize} +\item there is no \alert{best} theorem prover +\item better question: Which is the \alert{best one for a certain purpose}? +\item important points to consider +\begin{itemize} +\item existing libraries +\item used logic +\item level of automation +\item user interface +\item importance development speed versus trustworthiness +\item How familiar are you with the different provers? +\item Which prover do people in your vicinity use? +\item your personal preferences +\item \ldots +\end{itemize} +\end{itemize} + +\bottomstatement{In this course we use the HOL theorem prover,\\ because it is used by the TCS group.} +\end{frame} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "full" +%%% End: diff --git a/lectures/02_organisational_matters.tex b/lectures/02_organisational_matters.tex new file mode 100644 index 0000000..570e078 --- /dev/null +++ b/lectures/02_organisational_matters.tex @@ -0,0 +1,159 @@ +\part{Organisational Matters} + +\frame[plain]{\partpage} + + +\begin{frame} +\frametitle{Aims of this Course} + +\begin{block}{Aims} +\begin{itemize} +\item introduction to interactive theorem proving (ITP) +\item being able to evaluate whether a problem can benefit from ITP +\item hands-on experience with HOL +\item learn how to build a formal model +\item learn how to express and prove important properties of such a model +\item learn about basic conformance testing +\item use a theorem prover on a small project +\end{itemize} +\end{block} + +\begin{block}{Required Prerequisites} +\begin{itemize} +\item some experience with functional programming +\item knowing Standard ML syntax +\item basic knowledge about logic (\eg First Order Logic) +\end{itemize} +\end{block} + +\end{frame} + + +\begin{frame} +\frametitle{Dates} + +\begin{itemize} +\item Interactive Theorem Proving Course takes place in Period 4 of the academic year 2016/2017 +\item always in room 4523 or 4532 +\item each week\\\medskip\qquad +\begin{tabular}{lll} +Mondays & 10:15 - 11:45 & lecture \\ +Wednesdays & 10:00 - 12:00 & practical session \\ +Fridays & 13:00 - 15:00 & practical session +\end{tabular} +\item no lecture on Monday, 1st of May, instead on Wednesday, 3rd May +\item last lecture: 12th of June +\item last practical session: 21st of June +\item 9 lectures, 17 practical sessions +\end{itemize} +\end{frame} + + + +\begin{frame} +\frametitle{Exercises} + +\begin{itemize} +\item after each lecture an exercise sheet is handed out +\item work on these exercises alone, except if stated otherwise explicitly +\item exercise sheet contains due date +\begin{itemize} +\item usually 10 days time to work on it +\item hand in during practical sessions +\item lecture Monday $\longrightarrow$ hand in at latest in next week's Friday session +\end{itemize} +\item main purpose: understanding ITP and learn how to use HOL +\begin{itemize} +\item no detailed grading, just pass/fail +\item retries possible till pass +\item if stuck, ask me or one another +\item practical sessions intend to provide this opportunity +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Practical Sessions} + +\begin{itemize} +\item very informal +\item main purpose: work on exercises +\begin{itemize} +\item I have a look and provide feedback +\item you can ask questions +\item I might sometimes explain things not covered in the lectures +\item I might provide some concrete tips and tricks +\item you can also discuss with each other +\end{itemize} +\item attendance not required, but highly recommended +\begin{itemize} +\item exception: session on 21st April +\end{itemize} +\item only requirement: turn up long enough to hand in exercises +\item \alert{you need to bring your own computer} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Handing-in Exercises} + +\begin{itemize} +\item exercises are intended to be handed-in during practical sessions +\item attend at least one practical session each week +\item leave reasonable time to discuss exercises +\begin{itemize} +\item don't try to hand your solution in Friday 14:55 +\end{itemize} +\item retries possible, but reasonable attempt before deadline required +\item handing-in outside practical sessions +\begin{itemize} +\item only if you have a good reason +\item decided on a case-by-case basis +\end{itemize} +\item electronic hand-ins +\begin{itemize} +\item only to get detailed feedback +\item does not replace personal hand-in +\item exceptions on a case-by-case basis if there is a good reason +\item I recommend using a KTH GitHub repo +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Passing the ITP Course} + +\begin{itemize} +\item there is only a pass/fail mark +\item to pass you need to +\begin{itemize} +\item attend at least 7 of the 9 lectures +\item pass 8 of the 9 exercises +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Communication} +\begin{itemize} +\item we have the advantage of being a small group +\item therefore we are flexible +\item so please ask questions, even during lectures +\item there are many shy people, therefore +\begin{itemize} +\item anonymous checklist after each lecture +\item anonymous background questionnaire in first practical session +\end{itemize} +\item further information is posted on \emph{Interactive Theorem Proving Course} group on Group Web +\item contact me (Thomas Tuerk) directly, \eg via email \texttt{thomas@kth.se} +\end{itemize} +\end{frame} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "full" +%%% End: diff --git a/lectures/03_hol_overview.tex b/lectures/03_hol_overview.tex new file mode 100644 index 0000000..85eecec --- /dev/null +++ b/lectures/03_hol_overview.tex @@ -0,0 +1,175 @@ +\part{HOL~4 History and Architecture} + +\frame[plain]{\partpage} + +\section{LCF} + +\begin{frame} +\frametitle{LCF - Logic of Computable Functions} + +\begin{itemize} +\item \emph{Standford LCF} 1971-72 by Milner et al. +\item formalism devised by Dana Scott in 1969 +\item intended to reason about recursively defined functions +\item intended for computer science applications +\item strengths +\begin{itemize} +\item powerful simplification mechanism +\item support for backward proof +\end{itemize} +\item limitations +\begin{itemize} +\item proofs need a lot of memory +\item fixed, hard-coded set of proof commands +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{LCF - Logic of Computable Functions II} + +\begin{itemize} +\item Milner worked on improving LCF in Edinburgh +\item research assistants +\begin{itemize} +\item Lockwood Morris +\item Malcolm Newey +\item Chris Wadsworth +\item Mike Gordon +\end{itemize} +\item \emph{Edinburgh LCF} 1979 +\item introduction of \emph{Meta Language} (ML) +\item ML was invented to write proof procedures +\item ML became an influential functional programming language +\item using ML allowed implementing the \emph{LCF approach} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{LCF Approach} + +\begin{itemize} +\item implement an abstract datatype \alert{thm} to represent theorems +\item semantics of ML ensure that values of type thm can only be created using its interface +\item interface is very small +\begin{itemize} +\item predefined theorems are axioms +\item function with result type theorem are inferences +\end{itemize} +\item interface is carefully designed and checked +\begin{itemize} +\item size of interface and implementation allow careful checking +\item one checks that the interface really implements only axioms and inferences that are valid in the used logic +\end{itemize} +\item \emph{However you create a theorem, there is a proof for it.} +\item together with similar abstract datatypes for types and terms, this forms the \alert{kernel} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{LCF Approach II} + +\begin{exampleblock}{Modus Ponens Example} +\begin{columns} +\begin{column}{.4\textwidth} +\textbf{Inference Rule}\\\medskip +\inferrule{\Gamma \vdash a \Rightarrow b \\ \Delta \entails a}{\Gamma \cup \Delta \entails b} +\end{column} +\begin{column}{.5\textwidth} +\textbf{SML function}\\\medskip +\texttt{val MP\ :\ thm -> thm -> thm} +$\texttt{MP} (\Gamma \vdash a \Rightarrow b) (\Delta \entails a) = (\Gamma \cup \Delta \entails b)$ +\end{column} +\end{columns} +\end{exampleblock} + +\begin{itemize} +\item very trustworthy --- only the small kernel needs to be trusted +\item efficient --- no need to store proofs +\begin{block}{Easy to extend and automate} +However complicated and potentially buggy your code is, if a value of type theorem is produced, it has been created through the small trusted interface. Therefore the statement really holds. +\end{block} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{LCF Style Systems} + +There are now many interactive theorem provers out there that use +an approach similar to that of Edinburgh LCF. +\begin{itemize} +\item HOL family +\begin{itemize} + \item HOL theorem prover + \item HOL Light + \item HOL Zero + \item Proof Power + \item $\ldots$ +\end{itemize} +\item Isabelle +\item Nuprl +\item Coq +\item \ldots +\end{itemize} +\end{frame} + + +\section{History and Family of HOL} + +\begin{frame} +\frametitle{History of HOL} + +\begin{itemize} +\item 1979 Edinburgh LCF by Milner, Gordon, et al. +\item 1981 Mike Gordon becomes lecturer in Cambridge +\item 1985 Cambridge LCF +\begin{itemize} +\item Larry Paulson and G\`{e}rard Huet +\item implementation of ML compiler +\item powerful simplifier +\item various improvements and extensions +\end{itemize} +\item 1988 HOL +\begin{itemize} +\item Mike Gordon and Keith Hanna +\item adaption of Cambridge LCF to classical higher order logic +\item intention: hardware verification +\end{itemize} +\item 1990 HOL90\\ reimplementation in SML by Konrad Slind at University of Calgary +\item 1998 HOL98\\ implementation in Moscow ML and new library and theory mechanism +\item since then HOL Kananaskis releases, called informally \alert{HOL~4} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Family of HOL} +\begin{columns} +\begin{column}{.65\textwidth} +\begin{itemize} +\item \emph{ProofPower}\\commercial version of HOL88 by Roger Jones, Rob Arthan et al. +\item \emph{HOL Light}\\lean CAML / OCaml port by John Harrison +\item \emph{HOL Zero}\\trustworthy proof checker by Mark Adams +\item \emph{Isabelle} +\begin{itemize} +\item 1990 by Larry Paulson +\item meta-theorem prover that supports multiple logics +\item however, mainly HOL used, ZF a little +\item nowadays probably the most widely used HOL system +\item originally designed for software verification +\end{itemize} +\end{itemize} +\end{column} +\qquad +\begin{column}{.3\textwidth} +\includegraphics[width=3.2cm]{images/hol-family} +\end{column} +\end{columns} + +\end{frame} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "hol" +%%% End: diff --git a/lectures/04_hol_logic.tex b/lectures/04_hol_logic.tex new file mode 100644 index 0000000..2de6dd3 --- /dev/null +++ b/lectures/04_hol_logic.tex @@ -0,0 +1,267 @@ +\part{HOL's Logic} + +\frame[plain]{\partpage} + + +\section{HOL Logic} + +\begin{frame} +\frametitle{HOL Logic} +\begin{itemize} +\item the HOL theorem prover uses a version of classical \textbf{h}igher \textbf{o}rder \textbf{l}ogic:\\ +classical higher order predicate calculus with \\ +terms from the typed lambda calculus (\ie simple type theory) +\item this sounds complicated, but is intuitive for SML programmers +\item (S)ML and HOL logic designed to fit each other +\item if you understand SML, you understand HOL logic + +\bigskip +\begin{center} +\emph{HOL = functional programming + logic} +\end{center} +\bigskip + +\begin{alertblock}{Ambiguity Warning} +The acronym \textit{HOL} refers to both the \textit{HOL interactive theorem prover} and the \textit{HOL logic} used by it. It's also a common abbreviation for \textit{higher order logic} in general. +\end{alertblock} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Types} +\begin{itemize} +\item SML datatype for types +\begin{itemize} +\item \emph{Type Variables} ($\texttt{'a},\ \alpha,\ \texttt{'b},\ \beta,\ \ldots$)\\ +Type variables are implicitly universally quantified. Theorems containing type variables +hold for all instantiations of these. Proofs using type variables can be seen as proof schemata. +\item \emph{Atomic Types} ($\texttt{c}$)\\ +Atomic types denote fixed types. Examples: \texttt{num}, \texttt{bool}, \texttt{unit} +\item \emph{Compound Types} ($(\sigma_1, \ldots, \sigma_n) \textit{op}$)\\ +\textit{op} is a \alert{type operator} of arity \textit{n} and $\sigma_1, \ldots, \sigma_n$ \alert{argument types}. Type operators denote operations for constructing types.\\ +Examples: \texttt{num list} or \texttt{'a \# 'b}. +\item \emph{Function Types} ($\sigma_1 \to \sigma_2$)\\ +$\sigma_1 \to \sigma_2$ is the type of \alert{total} functions from $\sigma_1$ to $\sigma_2$. +\end{itemize} +\item types are never empty in HOL, \ie\\ +for each type at least one value exists +\item all HOL functions are total +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Terms} +\begin{itemize} +\item SML datatype for terms +\begin{itemize} +\item \emph{Variables} ($\texttt{x}, \texttt{y}, \ldots$) +\item \emph{Constants} ($\texttt{c}, \ldots$) +\item \emph{Function Application} ($\texttt{f a}$) +\item \emph{Lambda Abstraction} ($\texttt{\textbackslash x.\ f x}$\ \ or\ \ $\lambda x.\ f x$)\\ +Lambda abstraction represents anonymous function definition.\\The corresponding SML syntax is \texttt{fn x => f x}. +\end{itemize} +\item terms have to be well-typed +\item same typing rules and same type-inference as in SML take place +\item terms very similar to SML expressions +\item notice: predicates are functions with return type \texttt{bool}, \ie +no distinction between functions and predicates, terms and formulae +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Terms II} +\begin{tabular}{lll} +\textbf{HOL term} & \textbf{SML expression} & \textbf{type HOL / SML} \\ +\hol{0} & \ml{0} & \hol{num} / \ml{int} \\ +\hol{x:'a} & \ml{x:'a} & variable of type \hol{'a} \\ +\hol{x:bool} & \ml{x:bool} & variable of type \hol{bool} \\ +\hol{x + 5} & \ml{x + 5} & applying function \hol{+} to \hol{x} and \hol{5} \\ +\hol{\textbackslash x.\ x + 5} & \ml{fn x => x + 5} & anonymous (\aka inline) function \\ +& & of type \hol{num -> num} \\ +\hol{(5, T)} & \ml{(5, true)} & \hol{num \# bool} / \ml{int * bool}\\ +\hol{[5;3;2]++[6]} & \ml{[5,3,2]@[6]} & \hol{num list} / \ml{int list} +\end{tabular} +\end{frame} + +\begin{frame} +\frametitle{Free and Bound Variables / Alpha Equivalence} +\begin{itemize} +\item in SML, the names of function arguments does not matter (much) +\item similarly in HOL, the names of variables used by lambda-abstractions does not matter (much) +\item the lambda-expression $\lambda x.\ t$ is said to \emph{bind} the variables $x$ in term $t$ +\item variables that are guarded by a lambda expression are called \emph{bound} +\item all other variables are \emph{free} +\item Example: $x$ is free and $y$ is bound in \hol{$(x = 5) \wedge (\lambda y.\ (y < x))\ 3$} +\item the names of bound variables are unimportant semantically +\item two terms are called \emph{alpha-equivalent} iff they differ only in the names of bound variables +\item Example: \hol{$\lambda{}x.\ x$} and \hol{$\lambda{}y.\ y$} are alpha-equivalent +\item Example: \hol{$x$} and \hol{$y$} are not alpha-equivalent +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Theorems} +\begin{itemize} +\item theorems are of the form $\Gamma \entails p$ where +\begin{itemize} +\item $\Gamma$ is a set of hypothesis +\item $p$ is the conclusion of the theorem +\item all elements of $\Gamma$ and $p$ are formulae, \ie terms of type \texttt{bool} +\end{itemize} +\item $\Gamma \entails p$ records that using $\Gamma$ the statement $p$ \alert{has been} proved\\ +\item notice difference to logic: there it means \alert{can be} proved +\item the proof itself is not recorded +\item theorems can only be created through a small interface in the \emph{kernel} +\end{itemize} +\end{frame} + + +\section{Kernel} +\begin{frame} +\frametitle{HOL Light Kernel} + +\begin{itemize} +\item the HOL kernel is hard to explain +\begin{itemize} +\item for historic reasons some concepts are represented rather complicated +\item for speed reasons some derivable concepts have been added +\end{itemize} +\item instead consider the HOL Light kernel, which is a cleaned-up version +\item there are two predefined constants +\begin{itemize} +\item \texttt{= :\ 'a -> 'a -> bool} +\item \texttt{@ :\ ('a -> bool) -> 'a} +\end{itemize} +\item there are two predefined types +\begin{itemize} +\item \texttt{bool} +\item \texttt{ind} +\end{itemize} +\item the meaning of these types and constants is given by inference rules and axioms +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{HOL Light Inferences I} +\begin{columns} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule* [right=REFL] {\ }{\entails t = t}$\\[1em] +$\inferrule*[right=TRANS] {\Gamma \entails s = t\\\Delta \entails t = u}{\Gamma \cup \Delta \entails s = u}$\\[1em] +$\inferrule*[right=COMB]{\Gamma \entails s = t\\\Delta \entails u = v \\\\ \textit{types fit}}{\Gamma \cup \Delta \entails s(u) = t(v)}$\\[1em] +\end{center} +\end{column} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule*[right=ABS]{\Gamma \entails s = t\\x\ \textit{not free in}\ \Gamma}{\Gamma \entails \lambda{}x.\ s = \lambda{}x.\ t}$\\[1em] +$\inferrule*[right=BETA]{\ }{\entails (\lambda{}x.\ t)\, x = t}$\\[1em] +$\inferrule*[right=ASSUME]{\ }{\{p\}\entails p}$ +\end{center} +\end{column} +\end{columns} + +\end{frame} + + +\begin{frame} +\frametitle{HOL Light Inferences II} +\begin{center} +$\inferrule*[right=EQ\_MP]{\Gamma \entails p \Leftrightarrow q\\\Delta \entails p}{\Gamma \cup \Delta \entails q}$\\[1em] +$\inferrule*[right=DEDUCT\_ANTISYM\_RULE]{\Gamma \entails p\\\Delta \entails q} +{(\Gamma-\{q\}) \cup (\Delta - \{p\}) \entails p \Leftrightarrow q}$\\[1em] +$\inferrule*[right=INST]{\Gamma[x_1, \ldots, x_n] \entails p[x_1, \ldots, x_n]} +{\Gamma[t_1, \ldots, t_n] \entails p[t_1, \ldots, t_n]}$\\[1em] +$\inferrule*[right=INST\_TYPE]{\Gamma[\alpha_1, \ldots, \alpha_n] \entails p[\alpha_1, \ldots, \alpha_n]} +{\Gamma[\gamma_1, \ldots, \gamma_n] \entails p[\gamma_1, \ldots, \gamma_n]}$\\[1em] +\end{center} +\end{frame} + +\newcommand{\tabitem}{~~\llap{\textbullet}~~} + +\begin{frame} +\frametitle{HOL Light Axioms and Definition Principles} +\begin{itemize} +\item 3 axioms needed\medskip\\\qquad +\begin{tabular}{ll} +ETA\_AX & $|- (\lambda{}x.\ t\ x) = t$ \\ +SELECT\_AX & $|- P\ x \Longrightarrow P ((@) P))$ \\ +INFINITY\_AX & predefined type \texttt{ind} is infinite +\end{tabular} +\item definition principle for constants +\begin{itemize} +\item constants can be introduced as abbreviations +\item constraint: no free vars and no new type vars +\end{itemize} +\item definition principle for types +\begin{itemize} +\item new types can be defined as non-empty subtypes of existing types +\end{itemize} +\item both principles +\begin{itemize} +\item lead to conservative extensions +\item preserve consistency +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{HOL Light derived concepts} +Everything else is derived from this small kernel. +\[ +\begin{array}{ccl} +T & =_{\textit{def}} & (\lambda{}p.\ p) = (\lambda{}p.\ p)\\ +\wedge & =_{\textit{def}} & \lambda{}p\,q.\ (\lambda f.\ f\ p\ q) = (\lambda{}f.\ f\ T\ T) \\ +\Longrightarrow & =_{\textit{def}} & \lambda{}p\,q.\ (p \wedge q \Leftrightarrow p) \\ +\forall & =_{\textit{def}} & \lambda{}P.\ (P = \lambda{}x.\ T) \\ +\exists & =_{\textit{def}} & \lambda{}P.\ (\forall{}q.\ (\forall{}x.\ P(x) \Longrightarrow q) \Longrightarrow q) \\ +\ldots \\ +\end{array} +\] +\end{frame} + + +\begin{frame} +\frametitle{Multiple Kernels} +\begin{itemize} +\item Kernel defines abstract datatypes for types, terms and theorems +\item one does not need to look at the internal implementation +\item therefore, easy to exchange +\item there are at least 3 different kernels for HOL +\begin{itemize} +\item standard kernel (de Bruijn indices) +\item experimental kernel (name / type pairs) +\item OpenTheory kernel (for proof recording) +\end{itemize} +\end{itemize} +\end{frame} + + +\section{HOL Logic Summary} + +\begin{frame} +\frametitle{HOL Logic Summary} +\begin{itemize} +\item HOL theorem prover uses classical higher order logic +\item HOL logic is very similar to SML +\begin{itemize} +\item syntax +\item type system +\item type inference +\end{itemize} +\item HOL theorem prover very trustworthy because of LCF approach +\begin{itemize} +\item there is a small kernel +\item proofs are not stored explicitly +\end{itemize} +\item you don't need to know the details of the kernel +\item usually one works at a much higher level of abstraction +\end{itemize} +\end{frame} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/05_usage.tex b/lectures/05_usage.tex new file mode 100644 index 0000000..81224f3 --- /dev/null +++ b/lectures/05_usage.tex @@ -0,0 +1,181 @@ +\part{Basic HOL Usage} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{HOL Technical Usage Issues} +\begin{itemize} +\item practical issues are discussed in practical sessions +\begin{itemize} +\item how to install HOL +\item which key-combinations to use in emacs-mode +\item detailed signature of libraries and theories +\item all parameters and options of certain tools +\item \ldots +\end{itemize} +\item exercise sheets sometimes +\begin{itemize} +\item ask to read some documentation +\item provide examples +\item list references where to get additional information +\end{itemize} +\item if you have problems, ask me outside lecture (\href{mailto:thomas@tuerk-brechen.de}{thomas@tuerk-brechen.de}) +\item covered only very briefly in lectures +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Installing HOL} +\begin{itemize} +\item webpage: \url{https://hol-theorem-prover.org} +\item HOL supports two SML implementations +\begin{itemize} +\item Moscow ML (\url{http://mosml.org}) +\item \alert{PolyML} (\url{http://www.polyml.org}) +\end{itemize} +\item I recommend using PolyML +\item please use emacs with +\begin{itemize} +\item hol-mode +\item sml-mode +\item hol-unicode, if you want to type Unicode +\end{itemize} +\item please install recent revision from git repo or Kananaskis 11 release +\item documentation found on HOL webpage and with sources +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{General Architecture} +\begin{itemize} +\item HOL is a collection of SML modules +\item starting HOL starts a SML Read-Eval-Print-Loop (REPL) with +\begin{itemize} +\item some HOL modules loaded +\item some default modules opened +\item an input wrapper to help parsing terms called \texttt{unquote} +\end{itemize} +\item \texttt{unquote} provides special quotes for terms and types +\begin{itemize} +\item implemented as input filter +\item \hol{``my-term``\ } becomes \ml{Parse.Term [QUOTE "my-term"]} +\item \hol{``:my-type``} becomes \ml{Parse.Type [QUOTE ":my-type"]} +\end{itemize} +\item main interfaces +\begin{itemize} +\item \emph{emacs} (used in the course) +\item vim +\item bare shell +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Filenames} +\begin{itemize} +\item \emph{\texttt{*Script.sml}} --- HOL proof script file +\begin{itemize} +\item script files contain definitions and proof scripts +\item executing them results in HOL searching and checking proofs +\item this might take very long +\item resulting theorems are stored in \texttt{*Theory.\{sml|sig\}} files +\end{itemize} +\item \emph{\texttt{*Theory.\{sml|sig\}}} --- HOL theory\\ +\begin{itemize} +\item auto-generated by corresponding script file +\item load quickly, because they don't search/check proofs +\item do not edit theory files +\end{itemize} +\item \emph{\texttt{*Syntax.\{sml|sig\}}} --- syntax libraries \\ +\begin{itemize} +\item contain syntax related functions +\item \ie functions to construct and destruct terms and types +\end{itemize} +\item \emph{\texttt{*Lib.\{sml|sig\}}} --- general libraries +\item \emph{\texttt{*Simps.\{sml|sig\}}} --- simplifications +\item \emph{\texttt{selftest.sml}} --- selftest for current directory +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Directory Structure} +\begin{itemize} +\item \emph{\texttt{bin}} --- HOL binaries +\item \emph{\texttt{src}} --- HOL sources +\item \emph{\texttt{examples}} --- HOL examples +\begin{itemize} +\item interesting projects by various people +\item examples owned by their developer +\item coding style and level of maintenance differ a lot +\end{itemize} +\item \emph{\texttt{help}} --- sources for reference manual +\begin{itemize} +\item after compilation home of reference HTML page +\end{itemize} +\item \emph{\texttt{Manual}} --- HOL manuals +\begin{itemize} +\item Tutorial +\item Description +\item Reference (PDF version) +\item Interaction +\item Quick (cheat pages) +\item Style-guide +\item \ldots +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Unicode} +\begin{itemize} +\item HOL supports both Unicode and pure ASCII input and output +\item advantages of Unicode compared to ASCII +\begin{itemize} +\item easier to read (good fonts provided) +\item no need to learn special ASCII syntax +\end{itemize} +\item disadvanges of Unicode compared to ASCII +\begin{itemize} +\item harder to type (even with \texttt{hol-unicode.el}) +\item less portable between systems +\end{itemize} +\item whether you like Unicode is highly a matter of personal taste +\item HOL's policy +\begin{itemize} +\item no Unicode in HOL's source directory \texttt{src} +\item Unicode in examples directory \texttt{examples} is fine +\end{itemize} +\item I recommend turning Unicode output off initially +\begin{itemize} +\item this simplifies learning the ASCII syntax +\item no need for special fonts +\item it is easier to copy and paste terms from HOL's output +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Where to find help?} +\begin{itemize} +\item reference manual +\begin{itemize} +\item available as HTML pages, single PDF file and in-system help +\end{itemize} +\item description manual +\item Style-guide (still under development) +\item HOL webpage (\url{https://hol-theorem-prover.org}) +\item mailing-list \texttt{hol-info} +\item \ml{DB.match} and \ml{DB.find} +\item \ml{*Theory.sig} and \ml{selftest.sml} files +\item ask someone, \eg me :-) (\href{mailto:thomas@tuerk-brechen.de}{thomas@tuerk-brechen.de}) +\end{itemize} +\end{frame} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/06_forward_proofs.tex b/lectures/06_forward_proofs.tex new file mode 100644 index 0000000..c8d31eb --- /dev/null +++ b/lectures/06_forward_proofs.tex @@ -0,0 +1,419 @@ +\part{Forward Proofs} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{Kernel too detailed} +\begin{itemize} +\item we already discussed the HOL Logic +\item the kernel itself does not even contain basic logic operators +\item usually one uses a much higher level of abstraction +\begin{itemize} +\item many operations and datatypes are defined +\item high-level derived inference rules are used +\end{itemize} +\item let's now look at this more common abstraction level +\end{itemize} +\end{frame} + + +\section{Term Syntax} + +\begin{frame} +\frametitle{Common Terms and Types} + +\begin{tabular}{lcc} +& \emph{Unicode} & \emph{ASCII} \\ +type vars & \hol{$\alpha$}, \hol{$\beta$}, \ldots & \hol{'a}, \hol{'b}, \ldots \\ +type annotated term & \hol{term:type} & \hol{term:type} \\ +true & \hol{T} & \hol{T} \\ +false & \hol{F} & \hol{F} \\ +negation & \hol{$\neg$b} & \hol{\holNeg{}b} \\ +conjunction & \hol{b1\ $\wedge$\ b2} & \hol{b1 \holAnd{} b2} \\ +disjunction & \hol{b1\ $\vee$\ b2} & \hol{b1 \holOr{} b2} \\ +implication & \hol{b1\ $\Longrightarrow$\ b2} & \hol{b1 \holImp{} b2} \\ +equivalence & \hol{b1\ $\Longleftrightarrow$\ b2} & \hol{b1 \holEquiv{} b2} \\ +disequation & \hol{v1\ $\neq$\ v2} & \hol{v1 <> v2} \\ +all-quantification & \hol{$\forall$x.\ P x} & \hol{!x.\ P x} \\ +existential quantification & \hol{$\exists$x.\ P x} & \hol{?x.\ P x} \\ +Hilbert's choice operator & \hol{@x.\ P x} & \hol{@x.\ P x} +\end{tabular} +\bigskip + +There are similar restrictions to constant and variable names as in SML.\\ +HOL specific: don't start variable names with an underscore + +\end{frame} + +\begin{frame} +\frametitle{Syntax conventions} +\begin{itemize} +\item common function syntax +\begin{itemize} +\item prefix notation, \eg \hol{SUC x} +\item infix notation, \eg \hol{x + y} +\item quantifier notation, \eg \hol{$\forall$x.\ P x} means \hol{($\forall$)\ ($\lambda$x.\ P x)} +\end{itemize} +\item infix and quantifier notation can be turned into prefix notation \\ + Example: \hol{(+)\ x\ y} and \hol{\$+\ x\ y} are the same as \hol{x + y} +\item quantifiers of the same type don't need to be repeated \\ + Example:\ + \hol{$\forall$x\ y.\ P\ x\ y} is short for + \hol{$\forall$x.\ $\forall$y.\ P\ x\ y} +\item there is special syntax for some functions\\ + Example:\ + \hol{if c then v1 else v2} is nice syntax for + \hol{COND c v1 v2} +\item associative infix operators are usually right-associative\\ + Example:\ + \hol{b1 \holAnd{} b2 \holAnd{} b3} is parsed as + \hol{b1 \holAnd{} (b2 \holAnd{} b3)} +\end{itemize} +\end{frame} + + + + +\begin{frame} +\frametitle{Creating Terms} + +\begin{block}{Term Parser} +Use special quotation provided by \texttt{unquote}. +\end{block} + +\begin{alertblock}{Operator Precedence} +It is easy to misjudge the binding strength of certain operators. Therefore use plenty of parenthesis. +\end{alertblock} + +\begin{block}{Use Syntax Functions} +Terms are just SML values of type \texttt{term}. You can use syntax functions (usually defined in \texttt{*Syntax.sml} files) to create them. +\end{block} +\end{frame} + +\begin{frame} +\frametitle{Creating Terms II} +\begin{tabular}{lll} +\emph{Parser} & \emph{Syntax Funs} & \\ +\hol{``:bool``} & \ml{mk\_type ("bool", [])} or \ml{bool} & type of Booleans \\ +\hol{``T``} & \ml{mk\_const ("T", bool)} or \ml{T} & term true \\ +\hol{``\holNeg{}b``} & \hol{mk\_neg (} & negation of \\ +& \hol{\ \ mk\_var ("b", bool))} & \ \ Boolean var b\\ +\hol{``\ldots\ \holAnd{} \ldots``} & \hol{mk\_conj (\ldots, \ldots)} & conjunction \\ +\hol{``\ldots\ \holOr{} \ldots``} & \hol{mk\_disj (\ldots, \ldots)} & disjunction \\ +\hol{``\ldots\ \holImp{} \ldots``} & \hol{mk\_imp (\ldots, \ldots)} & implication \\ +\hol{``\ldots\ = \ldots``} & \hol{mk\_eq (\ldots, \ldots)} & equation \\ +\hol{``\ldots\ <=> \ldots``} & \hol{mk\_eq (\ldots, \ldots)} & equivalence \\ +\hol{``\ldots\ <> \ldots``} & \hol{mk\_neg (mk\_eq (\ldots, \ldots))} & negated equation +\end{tabular} +\end{frame} + + +\section{Inference Rules} + +\begin{frame} +\frametitle{Inference Rules for Equality} + +\begin{columns} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule*[right=REFL] {\ }{\entails t = t}$\\[1em] +$\inferrule*[right=ABS]{\Gamma \entails s = t\\x\ \textit{not free in}\ \Gamma}{\Gamma \entails \lambda{}x.\ s = \lambda{}x. t}$\\[1em] +$\inferrule*[right=MK\_COMB]{\Gamma \entails s = t\\\Delta \entails u = v \\\\ \textit{types fit}}{\Gamma \cup \Delta \entails s(u) = t(v)}$\\[1em] +\end{center} +\end{column} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule* [right={GSYM}] {\Gamma \entails s = t}{\Gamma \entails t = s}$\\[1em] +$\inferrule*[right=TRANS] {\Gamma \entails s = t\\\Delta \entails t = u}{\Gamma \cup \Delta \entails s = u}$\\[1em] +$\inferrule*[right=EQ\_MP]{\Gamma \entails p \Leftrightarrow q\\\Delta \entails p}{\Gamma \cup \Delta \entails q}$\\[1em] +$\inferrule*[right=BETA\_CONV]{\ }{\entails (\lambda{}x.\ t) v = t[v/x]}$\\[1em] +\end{center} +\end{column} +\end{columns} +\end{frame} + +\begin{frame} +\frametitle{Inference Rules for free Variables} +\begin{center} +$\inferrule*[right=INST]{\Gamma[x_1, \ldots, x_n] \entails p[x_1, \ldots, x_n]} +{\Gamma[t_1, \ldots, t_n] \entails p[t_1, \ldots, t_n]}$\\[1em] +$\inferrule*[right=INST\_TYPE]{\Gamma[\alpha_1, \ldots, \alpha_n] \entails p[\alpha_1, \ldots, \alpha_n]} +{\Gamma[\gamma_1, \ldots, \gamma_n] \entails p[\gamma_1, \ldots, \gamma_n]}$\\[1em] +\end{center} +\end{frame} + +\begin{frame} +\frametitle{Inference Rules for Implication} + +\begin{columns} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule*[right={MP, MATCH\_MP}]{\Gamma \entails p \Longrightarrow q\\\Delta \entails p}{\Gamma \cup \Delta \entails q}$\\[1em] +$\inferrule*[right=EQ\_IMP\_RULE] {\Gamma \entails p = q}{\Gamma \entails p \Longrightarrow q\\\\\Gamma \entails q \Longrightarrow p}$\\[1em] +$\inferrule*[right=IMP\_ANTISYM\_RULE]{\Gamma \entails p \Longrightarrow q\\\\\Delta \entails q \Longrightarrow p}{\Gamma \cup \Delta \entails p = q}$\\[1em] +$\inferrule*[right=IMP\_TRANS] {\Gamma \entails p \Longrightarrow q\\\Delta \entails q \Longrightarrow r}{\Gamma \cup \Delta \entails p \Longrightarrow r}$\\[1em] +\end{center} +\end{column} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule*[right=DISCH]{\Gamma \entails p}{\Gamma - \{q\} \entails q \Longrightarrow p}$\\[1em] +$\inferrule*[right=UNDISCH]{\Gamma \entails q \Longrightarrow p}{\Gamma \cup \{q\} \entails p}$\\[1em] +$\inferrule*[right=NOT\_INTRO]{\Gamma \entails p \Longrightarrow \text{F}}{\Gamma \entails \holNeg{}p}$\\[1em] +$\inferrule*[right=NOT\_ELIM]{\Gamma \entails \holNeg{}p}{\Gamma \entails p \Longrightarrow \text{F}}$\\[1em] +\end{center} +\end{column} +\end{columns} +\end{frame} + + +\begin{frame} +\frametitle{Inference Rules for Conjunction / Disjunction} + +\begin{columns} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule*[right={CONJ}]{\Gamma \entails p\\\Delta \entails q}{\Gamma \cup \Delta \entails p\ \wedge\ q}$\\[1em] +$\inferrule*[right={CONJUNCT1}]{\Gamma \entails p\ \wedge\ q}{\Gamma \entails p}$\\[1em] +$\inferrule*[right={CONJUNCT2}]{\Gamma \entails p\ \wedge\ q}{\Gamma \entails q}$\\[1em] +\end{center} +\end{column} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule*[right={DISJ1}]{\Gamma \entails p}{\Gamma \entails p\ \vee\ q}$\\[1em] +$\inferrule*[right={DISJ2}]{\Gamma \entails q}{\Gamma \entails p\ \vee\ q}$\\[1em] +$\inferrule*[right={DISJ\_CASES}]{\Gamma \entails p \vee q\\\Delta_1 \cup \{p\} \entails r\\\Delta_2 \cup \{q\} \entails r}{\Gamma \cup \Delta_1 \cup \Delta_2 \entails r}$\\[1em] +\end{center} +\end{column} +\end{columns} +\end{frame} + + +\begin{frame} +\frametitle{Inference Rules for Quantifiers} + +\begin{columns} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule*[right={GEN}]{\Gamma \entails p\\x \text{\ not free in\ }\Gamma}{\Gamma \entails \forall{}x.\ p}$\\[1em] +$\inferrule*[right={SPEC}]{\Gamma \entails \forall{}x.\ p}{\Gamma \entails p[u/x]}$\\[1em] +\end{center} +\end{column} +\begin{column}{.45\textwidth} +\begin{center} +$\inferrule*[right={EXISTS}]{\Gamma \entails p[u/x]}{\Gamma \entails \exists{}x.\ p}$\\[1em] +$\inferrule*[right={CHOOSE}]{\Gamma \entails \exists{}x.\ p\\\Delta \cup \{p[u/x]\} \entails r\\ +u \text{\ not free in\ } \Gamma, \Delta, p \text{ and } r} +{\Gamma \cup \Delta \entails r}$\\[1em] +\end{center} +\end{column} +\end{columns} +\end{frame} + +\section{Forward Proofs} + +\begin{frame} +\frametitle{Forward Proofs} + +\begin{itemize} +\item axioms and inference rules are used to derive theorems +\item this method is called \emph{forward proof} +\begin{itemize} +\item one starts with basic building blocks +\item one moves step by step forward +\item finally the theorem one is interested in is derived +\end{itemize} +\item one can also implement own proof tools +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Forward Proofs --- Example I} + +Let's prove $\forall{}p.\ p \Longrightarrow p$. +\bigskip + +\begin{columns} +\begin{column}{.45\textwidth} +\begin{semiverbatim} +val IMP_REFL_THM = let + val tm1 = ``p:bool``; + val thm1 = ASSUME tm1; + val thm2 = DISCH tm1 thm1; +in + GEN tm1 thm2 + +end + +fun IMP_REFL t = + SPEC t IMP_REFL_THM; +\end{semiverbatim} +\end{column} +\begin{column}{.45\textwidth} +\begin{semiverbatim} + +> val tm1 = ``p``: term +> val thm1 = [p] |- p: thm +> val thm2 = |- p ==> p: thm + +> val IMP_REFL_THM = + |- !p. p ==> p: thm + + +> val IMP_REFL = + fn: term -> thm +\end{semiverbatim} +\end{column} +\end{columns} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Forward Proofs --- Example II} + +Let's prove $\forall{}P\,v.\ (\exists{}x.\ (x = v) \wedge P\ x) \Longleftrightarrow P\ v$. +\bigskip + +\begin{columns} +\scriptsize +\begin{column}{.45\textwidth} +\begin{semiverbatim} +val tm_v = ``v:'a``; +val tm_P = ``P:'a -> bool``; +val tm_lhs = ``?x. (x = v) \holAnd{} P x`` +val tm_rhs = mk_comb (tm_P, tm_v); + +val thm1 = let + val thm1a = ASSUME tm_rhs; + val thm1b = + CONJ (REFL tm_v) thm1a; + val thm1c = + EXISTS (tm_lhs, tm_v) thm1b +in + DISCH tm_rhs thm1c +end +\end{semiverbatim} +\end{column} +\begin{column}{.45\textwidth} +\begin{semiverbatim} + + + + + + +> val thm1a = [P v] |- P v: thm +> val thm1b = + [P v] |- (v = v) \holAnd{} P v: thm +> val thm1c = + [P v] |- ?x. (x = v) \holAnd{} P x + +> val thm1 = [] |- + P v ==> ?x. (x = v) \holAnd{} P x: thm +\end{semiverbatim} +\end{column} +\end{columns} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Forward Proofs --- Example II cont.} + +\begin{columns} +\scriptsize +\begin{column}{.45\textwidth} +\begin{semiverbatim} +val thm2 = let + val thm2a = + ASSUME ``(u:'a = v) \holAnd{} P u`` + val thm2b = AP_TERM tm_P + (CONJUNCT1 thm2a); + val thm2c = EQ_MP thm2b + (CONJUNCT2 thm2a); + val thm2d = + CHOOSE (``u:'a``, + ASSUME tm_lhs) thm2c +in + DISCH tm_lhs thm2d +end + + +val thm3 = IMP_ANTISYM_RULE thm2 thm1 + +val thm4 = GENL [tm_P, tm_v] thm3 + +\end{semiverbatim} +\end{column} +\begin{column}{.45\textwidth} +\begin{semiverbatim} + +> val thm2a = [(u = v) \holAnd{} P u] |- + (u = v) \holAnd{} P u: thm +> val thm2b = [(u = v) \holAnd{} P u] |- + P u <=> P v +> val thm2c = [(u = v) \holAnd{} P u] |- + P v +> val thm2d = [?x. (x = v) \holAnd{} P x] |- + P v + + +> val thm2 = [] |- + ?x. (x = v) \holAnd{} P x ==> P v + + +> val thm3 = [] |- + ?x. (x = v) \holAnd{} P x <=> P v +> val thm4 = [] |- !P v. + ?x. (x = v) \holAnd{} P x <=> P v +\end{semiverbatim} +\end{column} +\end{columns} +\end{frame} + +% \section{Rules and Conversions} +% \begin{frame} +% \frametitle{Derived Tools} +% \begin{itemize} +% \item HOL lives from implementing reasoning tools in SML +% \item \emph{rules} --- use theorems to produce new theorems\\ +% \begin{itemize} +% \item SML-type \ml{thm -> thm} +% \item functions with similar type often called rule as well +% \end{itemize} +% \item \emph{conversions} --- convert a term into an equal one\\ +% \begin{itemize} +% \item SML-type \ml{term -> thm} +% \item given term \ml{t} produces theorem of form \ml{[] |- t = t'} +% \item may raise exceptions \ml{HOL\_ERR} or \ml{UNCHANGED} +% \end{itemize} +% \item \ldots +% \end{itemize} +% \end{frame} + +% \begin{frame} +% \frametitle{Conversions} + +% \begin{itemize} +% \item HOL has very good tool support for equality reasoning +% \item \emph{conversions} are important for HOL's automation +% \item there is a lot of infrastructure for conversions +% \begin{itemize} +% \item \ml{RAND\_CONV}, \ml{RATOR\_CONV}, \ml{ABS\_CONV} +% \item \ml{DEPTH\_CONV} +% \item \ml{THENC}, \ml{TRY\_CONV}, \ml{FIRST\_CONV} +% \item \ml{REPEAT\_CONV} +% \item \ml{CHANGED\_CONV}, \ml{QCHANGED\_CONV} +% \item \ml{NO\_CONV}, \ml{ALL\_CONV} +% \item \ldots +% \end{itemize} +% \item important conversions +% \begin{itemize} +% \item \ml{REWR\_CONV} +% \item \ml{REWRITE\_CONV} +% \item \ldots +% \end{itemize} +% \end{itemize} +% \end{frame} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/07_backward_proofs.tex b/lectures/07_backward_proofs.tex new file mode 100644 index 0000000..ccb2830 --- /dev/null +++ b/lectures/07_backward_proofs.tex @@ -0,0 +1,564 @@ +\part{Backward Proofs} + +\section{Motivation} +\frame[plain]{\partpage} + +\begin{frame}[fragile] +\frametitle{Motivation I} +\begin{itemize} +\item let's prove \hol{!A B. A \holAnd{} B <=> B \holAnd{} A} +\begin{semiverbatim} +\scriptsize +\mlcomment{Show |- A \holAnd{} B ==> B \holAnd{} A} +val thm1a = ASSUME ``A \holAnd{} B``; +val thm1b = CONJ (CONJUNCT2 thm1a) (CONJUNCT1 thm1a); +val thm1 = DISCH ``A \holAnd{} B`` thm1b + +\mlcomment{Show |- B \holAnd{} A ==> A \holAnd{} B} +val thm2a = ASSUME ``B \holAnd{} A``; +val thm2b = CONJ (CONJUNCT2 thm2a) (CONJUNCT1 thm2a); +val thm2 = DISCH ``B \holAnd{} A`` thm2b + +\mlcomment{Combine to get |- A \holAnd{} B <=> B \holAnd{} A} +val thm3 = IMP_ANTISYM_RULE thm1 thm2 + +\mlcomment{Add quantifiers} +val thm4 = GENL [``A:bool``, ``B:bool``] thm3 +\end{semiverbatim} +\bigskip +\item this is how you write down a proof +\item for finding a proof it is however often useful to think \emph{backwards} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Motivation II - thinking backwards} +\begin{itemize} +\item we want to prove \begin{itemize} + \item \hol{!A B. A \holAnd{} B <=> B \holAnd{} A} + \end{itemize} +\item all-quantifiers can easily be added later, so let's get rid of them \\ + \begin{itemize} + \item \hol{A \holAnd{} B <=> B \holAnd{} A} + \end{itemize} +\item now we have an equivalence, let's show 2 implications \\ + \begin{itemize} + \item \hol{A \holAnd{} B ==> B \holAnd{} A} + \item \hol{B \holAnd{} A ==> A \holAnd{} B} + \end{itemize} +\item we have an implication, so we can use the precondition as an assumption \\ + \begin{itemize} + \item using \hol{A \holAnd{} B} show \hol{B \holAnd{} A} + \item \hol{A \holAnd{} B ==> B \holAnd{} A} + \end{itemize} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Motivation III - thinking backwards} +\begin{itemize} +\item we have a conjunction as assumption, let's split it +\begin{itemize} +\item using \hol{A} and \hol{B} show \hol{B \holAnd{} A} + \item \hol{A \holAnd{} B ==> B \holAnd{} A} +\end{itemize} +\item we have to show a conjunction, so let's show both parts +\begin{itemize} + \item using \hol{A} and \hol{B} show \hol{B} + \item using \hol{A} and \hol{B} show \hol{A} + \item \hol{A \holAnd{} B ==> B \holAnd{} A} +\end{itemize} +\item the first two proof obligations are trivial +\begin{itemize} + \item \hol{A \holAnd{} B ==> B \holAnd{} A} +\end{itemize} +\item \ldots +\item we are done +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Motivation IV} +\begin{itemize} +\item common practise +\begin{itemize} +\item think backwards to find proof +\item write found proof down in forward style +\end{itemize} +\item often switch between backward and forward style within a proof\\ +Example: induction proof +\begin{itemize} +\item backward step: induct on \ldots +\item forward steps: prove base case and induction case +\end{itemize} +\item whether to use forward or backward proofs depend on +\begin{itemize} +\item support by the interactive theorem prover you use +\begin{itemize} +\item HOL~4 and close family: emphasis on backward proof +\item Isabelle/HOL: emphasis on forward proof +\item Coq : emphasis on backward proof +\end{itemize} +\item your way of thinking +\item the theorem you try to prove +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{HOL Implementation of Backward Proofs} +\begin{itemize} +\item in HOL +\begin{itemize} +\item proof tactics / backward proofs used for most user-level proofs +\item forward proofs used usually for writing automation +\end{itemize} +\item backward proofs are implemented by \emph{tactics} in HOL +\begin{itemize} +\item decomposition into subgoals implemented in SML +\item SML datastructures used to keep track of all open subgoals +\item forward proof used to construct theorems +\end{itemize} +\item to understand backward proofs in HOL we need to look at +\begin{itemize} +\item \ml{goal} --- SML datatype for proof obligations +\item \ml{goalStack} --- library for keeping track of goals +\item \ml{tactic} --- SML type for functions performing backward proofs +\end{itemize} +\end{itemize} +\end{frame} + + +\section{Backward Proofs} + +\begin{frame} +\frametitle{Goals} +\begin{itemize} +\item goals represent proof obligations, \ie theorems we need/want to prove +\item the SML type \ml{goal} is an abbreviation for \ml{term list * term} +\item the goal \ml{([asm\_1, ..., asm\_n], c)} records that we need/want to prove the theorem + \ml{\{asm\_1, ..., asm\_n\} |- c} +\end{itemize} + +\begin{exampleblock}{Example Goals} +\begin{tabular}{ll} +\textbf{Goal} & \textbf{Theorem} \\ +\ml{([``A``, ``B``], ``A \holAnd{} B``)} & \ml{\{A, B\} |- A \holAnd{} B} \\ +\ml{([``B``, ``A``], ``A \holAnd{} B``)} & \ml{\{A, B\} |- A \holAnd{} B} \\ +\ml{([``B \holAnd{} A``], ``A \holAnd{} B``)} & \ml{\{B \holAnd{} A\} |- A \holAnd{} B} \\ +\ml{([], ``(B \holAnd{} A) ==> (A \holAnd{} B)``)} & \ml{|- (B \holAnd{} A) ==> (A \holAnd{} B)} \\ +\end{tabular} +\end{exampleblock} + +\end{frame} + + +\begin{frame} +\frametitle{Tactics} +\begin{itemize} +\item the SML type \ml{tactic} is an abbreviation for\\ the type \ml{goal -> goal list * validation} +\item \ml{validation} is an abbreviation for \ml{thm list -> thm} +\item given a goal, a tactic +\begin{itemize} +\item decides into which subgoals to decompose the goal +\item returns this list of subgoals +\item returns a validation that +\begin{itemize} +\item given a list of theorems for the computed subgoals +\item produces a theorem for the original goal +\end{itemize} +\end{itemize} +\item special case: empty list of subgoals +\begin{itemize} +\item the validation (given \ml{[]}) needs to produce a theorem for the goal +\end{itemize} +\item notice: a tactic might be invalid +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Tactic Example --- \ml{CONJ\_TAC}} +\begin{center} +$\inferrule*[right={CONJ}]{\Gamma \entails p\\\Delta \entails q}{\Gamma \cup \Delta \entails p\ \wedge\ q}\qquad\qquad +\inferrule*{\texttt{t} \equiv \texttt{conj1 \holAnd{} conj2}\\\\ + \texttt{asl} \entails \texttt{conj1}\\\texttt{asl} \entails \texttt{conj2}} + {\texttt{asl} \entails \texttt{t}}$ +\end{center} +\begin{semiverbatim} +\small +val CONJ_TAC: tactic = fn (asl, t) => + let + val (conj1, conj2) = dest_conj t + in + ([(asl, conj1), (asl, conj2)], + fn [th1, th2] => CONJ th1 th2 | _ => raise Match) + end + handle HOL_ERR _ => raise ERR "CONJ_TAC" "" +\end{semiverbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Tactic Example --- \ml{EQ\_TAC}} +\begin{center} +$\inferrule*[right=IMP\_ANTISYM\_RULE]{\Gamma \entails p \Longrightarrow q\\\\\Delta \entails q \Longrightarrow p}{\Gamma \cup \Delta \entails p = q} +\qquad\qquad +\inferrule*{\texttt{t} \equiv \texttt{lhs = rhs}\\\\ + \texttt{asl} \entails \texttt{lhs ==> rhs}\\\\ + \texttt{asl} \entails \texttt{rhs ==> lhs}} + {\texttt{asl} \entails \texttt{t}}$ +\end{center} +\begin{semiverbatim} +\small +val EQ_TAC: tactic = fn (asl, t) => + let + val (lhs, rhs) = dest_eq t + in + ([(asl, mk_imp (lhs, rhs)), (asl, mk_imp (rhs, lhs))], + fn [th1, th2] => IMP_ANTISYM_RULE th1 th2 + | _ => raise Match) + end + handle HOL_ERR _ => raise ERR "EQ_TAC" "" +\end{semiverbatim} +\end{frame} + +\begin{frame} +\frametitle{proofManagerLib / goalStack} +\begin{itemize} +\item the \ml{proofManagerLib} keeps track of open goals +\item it uses \ml{goalStack} internally +\item important commands +\begin{itemize} +\item \emph{g} --- set up new goal +\item \emph{e} --- expand a tactic +\item \emph{p} --- print the current status +\item \emph{top\_thm} --- get the proved thm at the end +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example I} + +\begin{block}{Previous Goalstack} +\begin{semiverbatim} +- +\end{semiverbatim} +\end{block} + +\begin{block}{User Action} +\begin{semiverbatim} +g `!A B. A \holAnd{} B <=> B \holAnd{} A`; +\end{semiverbatim} +\end{block} + +\begin{block}{New Goalstack} +\begin{semiverbatim} +Initial goal: + +!A B. A \holAnd{} B <=> B \holAnd{} A + +: proof +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example II} + +\begin{block}{Previous Goalstack} +\begin{semiverbatim} +Initial goal: + +!A B. A \holAnd{} B <=> B \holAnd{} A + +: proof +\end{semiverbatim} +\end{block} + +\begin{block}{User Action} +\begin{semiverbatim} +e GEN_TAC; +e GEN_TAC; +\end{semiverbatim} +\end{block} + +\begin{block}{New Goalstack} +\begin{semiverbatim} +A \holAnd{} B <=> B \holAnd{} A + +: proof +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example III} + +\begin{block}{Previous Goalstack} +\begin{semiverbatim} +A \holAnd{} B <=> B \holAnd{} A + +: proof +\end{semiverbatim} +\end{block} + +\begin{block}{User Action} +\begin{semiverbatim} +e EQ_TAC; +\end{semiverbatim} +\end{block} + +\begin{block}{New Goalstack} +\begin{semiverbatim} +B \holAnd{} A ==> A \holAnd{} B + +A \holAnd{} B ==> B \holAnd{} A + +: proof +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example IV} + +\begin{block}{Previous Goalstack} +\begin{semiverbatim} +B \holAnd{} A ==> A \holAnd{} B + +A \holAnd{} B ==> B \holAnd{} A : proof +\end{semiverbatim} +\end{block} + +\begin{block}{User Action} +\begin{semiverbatim} +e STRIP_TAC; +\end{semiverbatim} +\end{block} + +\begin{block}{New Goalstack} +\begin{semiverbatim} +B \holAnd{} A +------------------------------------ + 0. A + 1. B +\end{semiverbatim} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example V} + +\begin{block}{Previous Goalstack} +\begin{semiverbatim} +\scriptsize{}B \holAnd{} A +------------------------------------ + 0. A + 1. B +\end{semiverbatim} +\end{block} + +\begin{block}{User Action} +\begin{semiverbatim} +\scriptsize{}e CONJ_TAC; +\end{semiverbatim} +\end{block} + +\begin{block}{New Goalstack} +\begin{semiverbatim} +\scriptsize{}A +------------------------------------ + 0. A + 1. B + +B +------------------------------------ + 0. A + 1. B +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example VI} + +\begin{block}{Previous Goalstack} +\begin{semiverbatim} +\scriptsize{}A +------------------------------------ + 0. A + 1. B + +B +------------------------------------ + 0. A + 1. B +\end{semiverbatim} +\end{block} + +\begin{block}{User Action} +\begin{semiverbatim} +\scriptsize{}e (ACCEPT_TAC (ASSUME ``B:bool``)); +e (ACCEPT_TAC (ASSUME ``A:bool``)); +\end{semiverbatim} +\end{block} + +\begin{block}{New Goalstack} +\begin{semiverbatim} +\scriptsize{}B \holAnd{} A ==> A \holAnd{} B + +: proof +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example VII} + +\begin{block}{Previous Goalstack} +\begin{semiverbatim} +\scriptsize{}B \holAnd{} A ==> A \holAnd{} B + +: proof +\end{semiverbatim} +\end{block} + +\begin{block}{User Action} +\begin{semiverbatim} +\scriptsize{}e STRIP_TAC; +e (ASM_REWRITE_TAC[]); +\end{semiverbatim} +\end{block} + +\begin{block}{New Goalstack} +\begin{semiverbatim} +\scriptsize{}Initial goal proved. +|- !A B. A \holAnd{} B <=> B \holAnd{} A: + proof +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example VIII} + +\begin{block}{Previous Goalstack} +\begin{semiverbatim} +\scriptsize{}Initial goal proved. +|- !A B. A \holAnd{} B <=> B \holAnd{} A: + proof +\end{semiverbatim} +\end{block} + +\begin{block}{User Action} +\begin{semiverbatim} +\scriptsize{}val thm = top_thm(); +\end{semiverbatim} +\end{block} + +\begin{block}{Result} +\begin{semiverbatim} +\scriptsize{}val thm = + |- !A B. A \holAnd{} B <=> B \holAnd{} A: + thm +\end{semiverbatim} +\end{block} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example IX} + +\begin{block}{Combined Tactic} +\begin{semiverbatim} +\scriptsize{}val thm = prove (``!A B. A \holAnd{} B <=> B \holAnd{} A``, + GEN_TAC >> GEN_TAC >> + EQ_TAC >| [ + STRIP_TAC >> + STRIP_TAC >| [ + ACCEPT_TAC (ASSUME ``B:bool``), + ACCEPT_TAC (ASSUME ``A:bool``) + ], + + STRIP_TAC >> + ASM_REWRITE_TAC[] + ]); +\end{semiverbatim} +\end{block} + +\begin{block}{Result} +\begin{semiverbatim} +\scriptsize{}val thm = + |- !A B. A \holAnd{} B <=> B \holAnd{} A: + thm +\end{semiverbatim} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Tactic Proof Example X} + +\begin{block}{Cleaned-up Tactic} +\begin{semiverbatim} +\scriptsize{}val thm = prove (``!A B. A \holAnd{} B <=> B \holAnd{} A``, + REPEAT GEN_TAC >> + EQ_TAC >> ( + REPEAT STRIP_TAC >> + ASM_REWRITE_TAC [] + )); +\end{semiverbatim} +\end{block} + +\begin{block}{Result} +\begin{semiverbatim} +\scriptsize{}val thm = + |- !A B. A \holAnd{} B <=> B \holAnd{} A: + thm +\end{semiverbatim} +\end{block} + +\end{frame} + + +\section{General Discussion} + +\begin{frame} +\frametitle{Summary Backward Proofs} +\begin{itemize} +\item in HOL most user-level proofs are tactic-based +\begin{itemize} +\item automation often written in forward style +\item low-level, basic proofs written in forward style +\item nearly everything else is written in backward (tactic) style +\end{itemize} +\item there are \emph{many} different tactics +\item in the lecture only the most basic ones will be discussed +\item \alert{you need to learn about tactics on your own} +\begin{itemize} +\item good starting point: \texttt{Quick} manual +\item learning finer points takes a lot of time +\item exercises require you to read up on tactics +\end{itemize} +\item often there are many ways to prove a statement, which tactics to use depends on +\begin{itemize} +\item personal way of thinking +\item personal style and preferences +\item maintainability, clarity, elegance, robustness +\item \ldots +\end{itemize} +\end{itemize} +\end{frame} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/08_basic_tactics.tex b/lectures/08_basic_tactics.tex new file mode 100644 index 0000000..fff8ac4 --- /dev/null +++ b/lectures/08_basic_tactics.tex @@ -0,0 +1,675 @@ +\part{Basic Tactics} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{Syntax of Tactics in HOL} +\begin{itemize} +\item originally tactics were written all in capital letters with underscores\\ +Example: \hol{ALL\_TAC} +\item since 2010 more and more tactics have overloaded lower-case syntax\\ +Example: \hol{all\_tac} +\item sometimes, the lower-case version is shortened\\ +Example: \hol{REPEAT}, \hol{rpt} +\item sometimes, there is special syntax\\ +Example: \hol{THEN}, \hol{\textbsl{}\textbsl{}}, \hol{>>} +\item which one to use is mostly a matter of personal taste +\begin{itemize} +\item all-capital names are hard to read and type +\item however, not for all tactics there are lower-case versions +\item mixed lower- and upper-case tactics are even harder to read +\item often shortened lower-case name is not \textit{speaking} +\end{itemize} +\end{itemize} +\bottomstatement{In the lecture we will use mostly the old-style names.} +\end{frame} + + +\section{Basic Tactics} + +\begin{frame} +\frametitle{Some Basic Tactics} + +\begin{tabular}{ll} +\hol{GEN\_TAC} & remove outermost all-quantifier \\ +\hol{DISCH\_TAC} & move antecedent of goal into assumptions \\ +\hol{CONJ\_TAC} & splits conjunctive goal \\ +\hol{STRIP\_TAC} & splits on outermost connective (combination\\ +& \quad of \hol{GEN\_TAC}, \hol{CONJ\_TAC}, \hol{DISCH\_TAC}, \ldots) \\ +\hol{DISJ1\_TAC} & selects left disjunct \\ +\hol{DISJ2\_TAC} & selects right disjunct \\ +\hol{EQ\_TAC} & reduce Boolean equality to implications \\ +\hol{ASSUME\_TAC}\ thm & add theorem to list of assumptions \\ +\hol{EXISTS\_TAC} term & provide witness for existential goal \\ +\end{tabular} +\end{frame} + + +\begin{frame} +\frametitle{Tacticals} + +\begin{itemize} +\item tacticals are SML functions that combine tactics to form new tactics +\item common workflow +\begin{itemize} +\item develop large tactic interactively +\item using \hol{goalStack} and editor support to execute tactics one by one +\item combine tactics manually with tacticals to create larger tactics +\item finally end up with one large tactic that solves your goal +\item use \hol{prove} or \hol{store\_thm} instead of \hol{goalStack} +\end{itemize} +\item make sure to \alert{clearly mark proof structure} by \eg +\begin{itemize} +\item use indentation +\item use parentheses +\item use appropriate connectives +\item \ldots +\end{itemize} +\item goalStack commands like \hol{e} or \hol{g} should not appear in your final proof +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Some Basic Tacticals} + +\begin{tabular}{lll} +tac1 \hol{>>} tac2 & \hol{THEN}, \hol{\textbsl{}\textbsl{}} & applies tactics in sequence \\ +tac \hol{>|} tacL & \hol{THENL} & applies list of tactics to subgoals \\ +tac1 \hol{>-} tac2 & \hol{THEN1} & applies tac2 to the first subgoal of tac1 \\ +\hol{REPEAT} tac & \hol{rpt} & repeats tac until it fails \\ +\hol{NTAC} n tac & & apply tac n times \\ +\hol{REVERSE} tac & \hol{reverse} & reverses the order of subgoals \\ +tac1 \hol{ORELSE} tac2 & & applies tac1 only if tac2 fails \\ +\hol{TRY} tac & & do nothing if tac fails \\ +\hol{ALL\_TAC} & \hol{all\_tac} & do nothing \\ +\hol{NO\_TAC} & & fail +\end{tabular} +\end{frame} + + +\begin{frame} +\frametitle{Basic Rewrite Tactics} + +\begin{itemize} +\item (equational) rewriting is at the core of HOL's automation +\item we will discuss it in detail later +\item details complex, but basic usage is straightforward +\begin{itemize} +\item given a theorem \hol{rewr\_thm} of form \hol{|- P\ x = Q\ x} and a term \hol{t} +\item rewriting \hol{t} with \hol{rewr\_thm} means +\item replacing each occurrence of a term \hol{P c} for some \hol{c} with \hol{Q c} in \hol{t} +\end{itemize} +\item \alert{warning:} rewriting may loop\\Example: rewriting with theorem \hol{|- X <=> (X \holAnd{} T)} +\end{itemize} + +\begin{tabular}{ll} +\hol{REWRITE\_TAC} thms & rewrite goal using equations found\\ +& in given list of theorems \\ +\hol{ASM\_REWRITE\_TAC} thms & in addition use assumptions \\ +\hol{ONCE\_REWRITE\_TAC} thms & rewrite once in goal using equations\\ +\hol{ONCE\_ASM\_REWRITE\_TAC} thms & rewrite once using assumptions +\end{tabular} +\end{frame} + + +\begin{frame} +\frametitle{Case-Split and Induction Tactics} + +\begin{tabular}{ll} +\hol{Induct\_on} `term` & induct on \texttt{term} \\ +\hol{Induct} & induct on all-quantifier \\ +\hol{Cases\_on} `term` & case-split on \texttt{term} \\ +\hol{Cases} & case-split on all-quantifier \\ +\hol{MATCH\_MP\_TAC} thm & apply rule \\ +\hol{IRULE\_TAC} thm & generalised apply rule +\end{tabular} +\end{frame} + + +\begin{frame} +\frametitle{Assumption Tactics} + +\begin{tabular}{ll} +\hol{POP\_ASSUM} thm-tac & use and remove first assumption \\ + & \-\quad common usage \hol{POP\_ASSUM MP\_TAC} \\[1em] +\hol{PAT\_ASSUM} term thm-tac& use (and remove) first \\ + \-\quad also \hol{PAT\_X\_ASSUM} term thm-tac& \quad assumption matching pattern \\[1em] +\hol{WEAKEN\_TAC} term-pred & removes first assumption \\ +& \quad{}satisfying predicate +\end{tabular} +\end{frame} + + + +\begin{frame} +\frametitle{Decision Procedure Tactics} + +\begin{itemize} +\item decision procedures try to solve the current goal completely +\item they either succeed or fail +\item no partial progress +\item decision procedures vital for automation +\end{itemize} +\bigskip + +\begin{tabular}{ll} +\hol{TAUT\_TAC} & propositional logic tautology checker \\ +\hol{DECIDE\_TAC} & linear arithmetic for \texttt{num} \\ +\hol{METIS\_TAC} thms & first order prover \\ +\hol{numLib.ARITH\_TAC} & Presburger arithmetic \\ +\hol{intLib.ARITH\_TAC} & uses Omega test +\end{tabular} +\end{frame} + +\begin{frame} +\frametitle{Subgoal Tactics} + +\begin{itemize} +\item it is vital to structure your proofs well +\begin{itemize} +\item improved maintainability +\item improved readability +\item improved reusability +\item saves time in medium-run +\end{itemize} +\item therefore, use many small lemmata +\item also, use many explicit subgoals +\end{itemize} +\bigskip +\begin{tabular}{ll} +`term-frag` \hol{by} tac & show term with tac and\\ +& add it to assumptions \\ +`term-frag` \hol{suffices\_by} tac & show it suffices to prove term +\end{tabular} +\end{frame} + +\begin{frame} +\frametitle{Term Fragments / Term Quotations} + +\begin{itemize} +\item notice that \hol{by} and \hol{suffices\_by} take \emph{term fragments} +\item term fragments are also called \emph{term quotations} +\item they represent (partially) unparsed terms +\item parsing takes place during execution of tactic in context of goal +\item this helps to avoid type annotations +\item however, this means syntax errors show late as well +\item the library \emph{Q} defines many tactics using term fragments +\end{itemize} + +\end{frame} + + +\section{Examples} + +\begin{frame} +\frametitle{Importance of Exercises} + +\begin{itemize} +\item here many tactics are presented in a very short amount of time +\item there are many, many more important tactics out there +\item few people can learn a programming language just by reading manuals +\item similar few people can learn HOL just by reading and listening +\item you should write your own proofs and play around with these tactics +\item solving the exercises is highly recommended\\(and actually required if you want credits for this course) +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example I - Slide 1} + +\begin{itemize} +\item we want to prove \hol{!l.\ LENGTH (APPEND l l) = 2 * LENGTH l} +\item first step: set up goal on \hol{goalStack} +\item at same time start writing proof script +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val LENGTH_APPEND_SAME = prove ( + ``!l. LENGTH (APPEND l l) = 2 * LENGTH l``, +\end{semiverbatim} +\end{block} + +\begin{block}{Actions} +\begin{itemize} +\item run \texttt{g ``!l.\ LENGTH (APPEND l l) = 2 * LENGTH l``} +\item this is done by hol-mode +\item move cursor inside term and press \texttt{M-h g}\\ + (menu-entry \texttt{HOL - Goalstack - New goal}) +\end{itemize} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example I - Slide 2} + +\begin{block}{Current Goal} +\begin{semiverbatim}\small +!l. LENGTH (l ++ l) = 2 * LENGTH l +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item the outermost connective is an all-quantifier +\item let's get rid of it via \hol{GEN\_TAC} +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val LENGTH_APPEND_SAME = prove ( + ``!l. LENGTH (l ++ l) = 2 * LENGTH l``, +GEN_TAC +\end{semiverbatim} +\end{block} + +\begin{block}{Actions} +\begin{itemize} +\item run \texttt{e GEN\_TAC} +\item this is done by hol-mode +\item mark line with \texttt{GEN\_TAC} and press \texttt{M-h e}\\ + (menu-entry \texttt{HOL - Goalstack - Apply tactic}) +\end{itemize} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example I - Slide 3} + +\begin{block}{Current Goal} +\begin{semiverbatim}\small +LENGTH (l ++ l) = 2 * LENGTH l +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item \hol{LENGTH} of \hol{APPEND} can be simplified +\item let's search an appropriate lemma with \ml{DB.match} +\end{itemize} + +\begin{block}{Actions} +\begin{itemize} +\item run \ml{DB.print\_match [] ``LENGTH (\_ ++ \_)``} +\item this is done via hol-mode +\item press \texttt{M-h m} and enter term pattern\\ + (menu-entry \texttt{HOL - Misc - DB match}) +\item this finds the theorem \ml{listTheory.LENGTH\_APPEND}\\ + \hol{|- !l1 l2. LENGTH (l1 ++ l2) = LENGTH l1 + LENGTH l2} +\end{itemize} +\end{block} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example I - Slide 4} + +\begin{block}{Current Goal} +\begin{semiverbatim}\small +LENGTH (l ++ l) = 2 * LENGTH l +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item let's rewrite with found theorem \ml{listTheory.LENGTH\_APPEND} +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val LENGTH_APPEND_SAME = prove ( + ``!l. LENGTH (APPEND l l) = 2 * LENGTH l``, +GEN_TAC >> +REWRITE_TAC[listTheory.LENGTH\_APPEND] +\end{semiverbatim} +\end{block} + +\begin{block}{Actions} +\begin{itemize} +\item connect the new tactic with tactical \hol{>>} (\hol{THEN}) +\item use hol-mode to expand the new tactic +\end{itemize} +\end{block} +\end{frame} + + + + + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example I - Slide 5} + +\begin{block}{Current Goal} +\begin{semiverbatim}\small +LENGTH l + LENGTH l = 2 * LENGTH l +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item let's search a theorem for simplifying \hol{2 * LENGTH l} +\item prepare for extending the previous rewrite tactic +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val LENGTH_APPEND_SAME = prove ( + ``!l. LENGTH (APPEND l l) = 2 * LENGTH l``, +GEN_TAC >> +REWRITE_TAC[listTheory.LENGTH\_APPEND] +\end{semiverbatim} +\end{block} + +\begin{block}{Actions} +\begin{itemize} +\item \hol{DB.match} finds theorem \hol{arithmeticTheory.TIMES2} +\item press \texttt{M-h b} and undo last tactic expansion\\ + (menu-entry \texttt{HOL - Goalstack - Back up}) +\end{itemize} +\end{block} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example I - Slide 6} + +\begin{block}{Current Goal} +\begin{semiverbatim}\small +LENGTH (l ++ l) = 2 * LENGTH l +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item extend the previous rewrite tactic +\item finish proof +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val LENGTH_APPEND_SAME = prove ( + ``!l. LENGTH (APPEND l l) = 2 * LENGTH l``, +GEN_TAC >> +REWRITE_TAC[listTheory.LENGTH\_APPEND, arithmeticTheory.TIMES2]); +\end{semiverbatim} +\end{block} + +\begin{block}{Actions} +\begin{itemize} +\item add \hol{TIMES2} to the list of theorems used by rewrite tactic +\item use hol-mode to expand the extended rewrite tactic +\item goal is solved, so let's add closing parenthesis and semicolon +\end{itemize} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example I - Slide 7} + +\begin{itemize} +\item we have a finished tactic proving our goal +\item notice that \hol{GEN\_TAC} is not needed +\item let's polish the proof script +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val LENGTH_APPEND_SAME = prove ( + ``!l. LENGTH (APPEND l l) = 2 * LENGTH l``, +GEN_TAC >> +REWRITE_TAC[listTheory.LENGTH\_APPEND, arithmeticTheory.TIMES2]); +\end{semiverbatim} +\end{block} + +\begin{block}{Polished Proof Script} +\begin{semiverbatim}\small +val LENGTH_APPEND_SAME = prove ( + ``!l. LENGTH (APPEND l l) = 2 * LENGTH l``, +REWRITE_TAC[listTheory.LENGTH\_APPEND, arithmeticTheory.TIMES2]); +\end{semiverbatim} +\end{block} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example II - Slide 1} + +\begin{itemize} +\item let's prove something slightly more complicated +\item drop old goal by pressing \texttt{M-h d}\\ + (menu-entry \texttt{HOL - Goalstack - Drop goal}) +\item set up goal on \hol{goalStack} (\texttt{M-h g}) +\item at same time start writing proof script +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val NOT_ALL_DISTINCT_LEMMA = prove (``!x1 x2 x3 l1 l2 l3. + (MEM x1 l1 \holAnd{} MEM x2 l2 \holAnd{} MEM x3 l3) \holAnd{} + ((x1 <= x2) \holAnd{} (x2 <= x3) \holAnd{} x3 <= SUC x1) ==> + ~(ALL_DISTINCT (l1 ++ l2 ++ l3))``, +\end{semiverbatim} +\end{block} + +\end{frame} + + + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example II - Slide 2} + +\begin{block}{Current Goal} +\begin{semiverbatim}\small +!x1 x2 x3 l1 l2 l3. + (MEM x1 l1 \holAnd{} MEM x2 l2 \holAnd{} MEM x3 l3) \holAnd{} + x1 <= x2 \holAnd{} x2 <= x3 \holAnd{} x3 <= SUC x1 ==> + ~ALL_DISTINCT (l1 ++ l2 ++ l3) +\end{semiverbatim} +\end{block} + + +\begin{itemize} +\item let's strip the goal +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val NOT_ALL_DISTINCT_LEMMA = prove (``!x1 x2 x3 l1 l2 l3. + (MEM x1 l1 \holAnd{} MEM x2 l2 \holAnd{} MEM x3 l3) \holAnd{} + ((x1 <= x2) \holAnd{} (x2 <= x3) \holAnd{} x3 <= SUC x1) ==> + ~(ALL_DISTINCT (l1 ++ l2 ++ l3))``, +REPEAT STRIP\_TAC +\end{semiverbatim} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example II - Slide 2} + +\begin{block}{Current Goal} +\begin{semiverbatim}\small +!x1 x2 x3 l1 l2 l3. + (MEM x1 l1 \holAnd{} MEM x2 l2 \holAnd{} MEM x3 l3) \holAnd{} + x1 <= x2 \holAnd{} x2 <= x3 \holAnd{} x3 <= SUC x1 ==> + ~ALL_DISTINCT (l1 ++ l2 ++ l3) +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item let's strip the goal +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val LENGTH_APPEND_SAME = prove ( + ``!l. LENGTH (APPEND l l) = 2 * LENGTH l``, +REPEAT STRIP\_TAC +\end{semiverbatim} +\end{block} + +\begin{block}{Actions} +\begin{itemize} +\item add \hol{REPEAT STRIP\_TAC} to proof script +\item expand this tactic using hol-mode +\end{itemize} +\end{block} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example II - Slide 3} + +\begin{block}{Current Goal} +\begin{semiverbatim}\small +F +------------------------------------ + 0. MEM x1 l1 4. x2 <= x3 + 1. MEM x2 l2 5. x3 <= SUC x1 + 2. MEM x3 l3 6. ALL_DISTINCT (l1 ++ l2 ++ l3) + 3. x1 <= x2 +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item oops, we did too much, we would like to keep \texttt{ALL\_DISTINCT} in goal +\end{itemize} +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val NOT_ALL_DISTINCT_LEMMA = prove (``...``, +REPEAT GEN\_TAC >> STRIP\_TAC +\end{semiverbatim} +\end{block} + +\begin{block}{Actions} +\begin{itemize} +\item undo \hol{REPEAT STRIP\_TAC} (\texttt{M-h b}) +\item expand more fine-tuned strip tactic +\end{itemize} +\end{block} +\end{frame} + + + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example II - Slide 4} + +\begin{block}{Current Goal} +\begin{semiverbatim}\small +~ALL_DISTINCT (l1 ++ l2 ++ l3) +------------------------------------ + 0. MEM x1 l1 3. x1 <= x2 + 1. MEM x2 l2 4. x2 <= x3 + 2. MEM x3 l3 5. x3 <= SUC x1 +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item now let's simplify \hol{ALL\_DISTINCT} +\item search suitable theorems with \hol{DB.match} +\item use them with rewrite tactic +\end{itemize} +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val NOT_ALL_DISTINCT_LEMMA = prove (``...``, +REPEAT GEN\_TAC >> STRIP\_TAC >> +REWRITE\_TAC[listTheory.ALL_DISTINCT\_APPEND, listTheory.MEM\_APPEND] +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example II - Slide 5} + +\begin{block}{Current Goal} +\begin{semiverbatim}\scriptsize +~((ALL_DISTINCT l1 \holAnd{} ALL_DISTINCT l2 \holAnd{} !e. MEM e l1 ==> ~MEM e l2) \holAnd{} + ALL_DISTINCT l3 \holAnd{} !e. MEM e l1 \holOr{} MEM e l2 ==> ~MEM e l3) +------------------------------------ + 0. MEM x1 l1 3. x1 <= x2 + 1. MEM x2 l2 4. x2 <= x3 + 2. MEM x3 l3 5. x3 <= SUC x1 +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item from assumptions 3, 4 and 5 we know \hol{x2 = x1 \holOr{} x2 = x3} +\item let's deduce this fact by \hol{DECIDE\_TAC} +\end{itemize} +\begin{block}{Proof Script} +\begin{semiverbatim}\scriptsize +val NOT_ALL_DISTINCT_LEMMA = prove (``...``, +REPEAT GEN\_TAC >> STRIP\_TAC >> +REWRITE\_TAC[listTheory.ALL_DISTINCT\_APPEND, listTheory.MEM\_APPEND] >> +`(x2 = x1) \holOr{} (x2 = x3)` by DECIDE_TAC +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example II - Slide 6} + +\begin{block}{Current Goals --- 2 subgoals, one for each disjunct} +\begin{semiverbatim}\scriptsize +~((ALL_DISTINCT l1 \holAnd{} ALL_DISTINCT l2 \holAnd{} !e. MEM e l1 ==> ~MEM e l2) \holAnd{} + ALL_DISTINCT l3 \holAnd{} !e. MEM e l1 \holOr{} MEM e l2 ==> ~MEM e l3) +------------------------------------ + 0. MEM x1 l1 4. x2 <= x3 + 1. MEM x2 l2 5. x3 <= SUC x1 + 2. MEM x3 l3 6a. x2 = x1 + 3. x1 <= x2 6b. x2 = x3 +\end{semiverbatim} +\end{block} + +\begin{itemize} +\item both goals are easily solved by first-order reasoning +\item let's use \hol{METIS\_TAC[]} for both subgoals +\end{itemize} +\begin{block}{Proof Script} +\begin{semiverbatim}\scriptsize +val NOT_ALL_DISTINCT_LEMMA = prove (``...``, +REPEAT GEN\_TAC >> STRIP\_TAC >> +REWRITE\_TAC[listTheory.ALL_DISTINCT\_APPEND, listTheory.MEM\_APPEND] >> +`(x2 = x1) \holOr{} (x2 = x3)` by DECIDE_TAC >> ( + METIS\_TAC[] +)); +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Tactical Proof - Example II - Slide 7} + +\begin{block}{Finished Proof Script} +\begin{semiverbatim}\scriptsize +val NOT_ALL_DISTINCT_LEMMA = prove ( +``!x1 x2 x3 l1 l2 l3. + (MEM x1 l1 \holAnd{} MEM x2 l2 \holAnd{} MEM x3 l3) \holAnd{} + ((x1 <= x2) \holAnd{} (x2 <= x3) \holAnd{} x3 <= SUC x1) ==> + ~(ALL_DISTINCT (l1 ++ l2 ++ l3))``, +REPEAT GEN\_TAC >> STRIP\_TAC >> +REWRITE\_TAC[listTheory.ALL_DISTINCT\_APPEND, listTheory.MEM\_APPEND] >> +`(x2 = x1) \holOr{} (x2 = x3)` by DECIDE_TAC >> ( + METIS\_TAC[] +)); +\end{semiverbatim} +\end{block} +\begin{itemize} +\item notice that proof structure is explicit +\item parentheses and indentation used to mark new subgoals +\end{itemize} +\end{frame} + + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/09_induction.tex b/lectures/09_induction.tex new file mode 100644 index 0000000..682e0f2 --- /dev/null +++ b/lectures/09_induction.tex @@ -0,0 +1,174 @@ +\part{Induction Proofs} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{Mathematical Induction} +\begin{itemize} +\item mathematical (\aka natural) induction principle:\\ + If a property $P$ holds for 0 and $P(n)$ implies $P(n+1)$ for all n,\\ + then $P(n)$ holds for all $n$. +\item HOL is expressive enough to encode this principle as a theorem.\\\medskip +\hol{|- !P. P 0 \holAnd{} (!n.\ P n ==> P (SUC n)) ==> !n.\ P n}\medskip +\item Performing mathematical induction in HOL means applying this theorem (\eg via \hol{HO\_MATCH\_MP\_TAC}) + +\item there are many similarish induction theorems in HOL +\item Example: complete induction principle\\\medskip +\hol{|- !P. (!n.\ (!m.\ m < n ==> P m) ==> P n) ==> !n.\ P n} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Structural Induction Theorems} +\begin{itemize} +\item \emph{structural induction} theorems are an important special form of induction theorems +\item they describe performing induction on the structure of a datatype +\item Example: \hol{\scriptsize|- !P.\ P [] \holAnd{} (!t.\ P t ==> !h.\ P (h::t)) ==> !l.\ P l} +\item structural induction is used very frequently in HOL +\item for each algabraic datatype, there is an induction theorem +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Other Induction Theorems} +\begin{itemize} +\item there are many induction theorems in HOL +\begin{itemize} +\item datatype definitions lead to induction theorems +\item recursive function definitions produce corresponding induction theorems +\item recursive relation definitions give rise to induction theorems +\item many are manually defined +\end{itemize} +\item Examples\\\bigskip{\scriptsize +\hol{|- !P.\ P [] \holAnd{} (!l.\ P l ==> !x.\ P (SNOC x l)) ==> !l.\ P l}\\\bigskip +\hol{|- !P.\ P FEMPTY \holAnd{} \\ +\-\qquad\quad(!f.\ P f ==> !x y.\ x NOTIN FDOM f ==> P (f |+ (x,y))) ==> !f.\ P f}\\\bigskip +\hol{|- !P.\ P \{\} \holAnd{} \\ +\-\qquad\quad(!s.\ FINITE s \holAnd{} P s ==> !e.\ e NOTIN s ==> P (e INSERT s)) ==> \\ +\-\qquad\quad!s.\ FINITE s ==> P s}\\\bigskip +\hol{|- !R P.\ (!x y.\ R x y ==> P x y) \holAnd{} (!x y z.\ P x y \holAnd{} P y z ==> P x z) ==>\\ +\-\qquad\quad!u v.\ R$^+$ u v ==> P u v}} + +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Induction (and Case-Split) Tactics} +\begin{itemize} +\item the tactic \hol{Induct} (or \hol{Induct\_on}) is usually used to start induction proofs +\item it looks at the type of the quantifier (or its argument) and applies the default induction theorem for this type +\item this is usually what one needs +\item other (non default) induction theorems can be applied via \hol{INDUCT\_THEN} or \hol{HO\_MATCH\_MP\_TAC} +\item similarish \hol{Cases\_on} picks and applies default case-split theorems +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Induction Proof - Example I - Slide 1} + +\begin{itemize} +\item let's prove via induction\\ + \hol{!l1 l2.\ REVERSE (l1 ++ l2) = REVERSE l2 ++ REVERSE l1} +\item we set up the goal and start an induction proof on \hol{l1} +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val REVERSE_APPEND = prove ( +``!l1 l2.\ REVERSE (l1 ++ l2) = REVERSE l2 ++ REVERSE l1``, +Induct +\end{semiverbatim} +\end{block} + +\end{frame} + +\begin{frame}[fragile] +\frametitle{Induction Proof - Example I - Slide 2} + +\begin{itemize} +\item the induction tactic produced two cases +\item base case:\\ +{\scriptsize\hol{!l2.\ REVERSE ([] ++ l2) = REVERSE l2 ++ REVERSE []}} +\item induction step:\\ +{\scriptsize +\begin{semiverbatim} +\hol{!h l2.\ REVERSE (h::l1 ++ l2) = REVERSE l2 ++ REVERSE (h::l1)} +----------------------------------------------------------- +\hol{!l2.\ REVERSE (l1 ++ l2) = REVERSE l2 ++ REVERSE l1} +\end{semiverbatim}} + +\item both goals can be easily proved by rewriting +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\scriptsize +val REVERSE_APPEND = prove (`` +!l1 l2.\ REVERSE (l1 ++ l2) = REVERSE l2 ++ REVERSE l1``, +Induct >| [ + REWRITE_TAC[REVERSE_DEF, APPEND, APPEND_NIL], + ASM_REWRITE_TAC[REVERSE_DEF, APPEND, APPEND_ASSOC] +]); +\end{semiverbatim} +\end{block} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Induction Proof - Example II - Slide 2} + +\begin{itemize} +\item let's prove via induction\\ + \hol{!l.\ REVERSE (REVERSE l) = l} +\item we set up the goal and start an induction proof on \hol{l} +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\small +val REVERSE_REVERSE = prove ( +``!l.\ REVERSE (REVERSE l) = l``, +Induct +\end{semiverbatim} +\end{block} + +\end{frame} + +\begin{frame}[fragile] +\frametitle{Induction Proof - Example II - Slide 2} + +\begin{itemize} +\item the induction tactic produced two cases +\item base case:\\ +{\scriptsize\hol{REVERSE (REVERSE []) = []}} +\item induction step:\\ +{\scriptsize +\begin{semiverbatim} +\hol{!h.\ REVERSE (REVERSE (h::l1)) = h::l1} +-------------------------------------------- +\hol{REVERSE (REVERSE l) = l} +\end{semiverbatim}} + +\item again both goals can be easily proved by rewriting +\end{itemize} + +\begin{block}{Proof Script} +\begin{semiverbatim}\scriptsize +val REVERSE_REVERSE = prove ( +``!l.\ REVERSE (REVERSE l) = l``, +Induct >| [ + REWRITE_TAC[REVERSE_DEF], + ASM_REWRITE_TAC[REVERSE_DEF, REVERSE_APPEND, APPEND] +]); +\end{semiverbatim} +\end{block} + +\end{frame} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/10_definitions.tex b/lectures/10_definitions.tex new file mode 100644 index 0000000..84fc488 --- /dev/null +++ b/lectures/10_definitions.tex @@ -0,0 +1,987 @@ +\part{Basic Definitions} + +\frame[plain]{\partpage} + +\section{Definitions, Axioms and Oracles} + +\begin{frame} +\frametitle{Definitional Extensions} +\begin{itemize} +\item there are \emph{conservative definition principles} for types and constants +\item conservative means that all theorems that can be proved in extended theory can also be proved in original one +\item however, such extensions make the theory more comfortable +\item definitions introduce \alert{no new inconsistencies} +\item the HOL community has a very strong tradition of a purely definitional approach +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Axiomatic Extensions} +\begin{itemize} +\item \alert{axioms} are a different approach +\item they allow postulating arbitrary properties, \ie extending the logic with arbitrary theorems +\item this approach might introduce new inconsistencies +\item in HOL axioms are very rarely needed +\item using definitions is often considered more elegant +\item it is hard to keep track of axioms +\item use axioms only if you really know what you are doing +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Oracles} +\begin{itemize} +\item \alert{oracles} are families of axioms +\item however, they are used differently than axioms +\item they are used to enable usage of external tools and knowledge +\item you might want to use an external automated prover +\item this external tool acts as an oracle +\begin{itemize} +\item it provides answers +\item it does not explain or justify these answers +\end{itemize} +\item you don't know, whether this external tool might be buggy +\item all theorems proved via it are tagged with a special oracle-tag +\item tags are propagated +\item this allows keeping track of everything depending on the correctness of this tool +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Oracles II} +\begin{itemize} +\item Common oracle-tags +\begin{itemize} +\item \ml{DISK\_THM} --- theorem was written to disk and read again +\item \ml{HolSatLib} --- proved by MiniSat +\item \ml{HolSmtLib} --- proved by external SMT solver +\item \ml{fast\_proof} --- proof was skipped to compile a theory rapidly +\item \ml{cheat} --- we cheated :-) +\end{itemize} +\item \alert{cheating} via \eg the \hol{cheat} tactic means skipping proofs +\item it can be helpful during proof development +\begin{itemize} +\item test whether some lemmata allow you finishing the proof +\item skip lengthy but boring cases and focus on critical parts first +\item experiment with exact form of invariants +\item \ldots +\end{itemize} +\item cheats should be removed reasonable quickly +\item HOL warns about cheats and skipped proofs +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Pitfalls of Definitional Approach} +\begin{itemize} +\item definitions can't introduce new inconsistencies +\item they force you to state all assumed properties at one location +\item however, you still need to be careful +\item Is your definition really expressing what you had in mind ? +\item Does your formalisation correspond to the real world artefact ? +\item How can you convince others that this is the case ? +\item we will discuss methods to deal with this later in this course +\begin{itemize} +\item formal sanity +\item conformance testing +\item code review +\item comments, good names, clear coding style +\item \ldots +\end{itemize} +\item this is highly complex and needs a lot of effort in general +\end{itemize} +\end{frame} + + + +\section{Primitive Definition Principles} + +\begin{frame}[fragile] +\frametitle{Specifications} +\begin{itemize} +\item HOL allows to introduce new constants with certain properties, provided the + existence of such constants has been shown +\begin{exampleblock}{Specification of \texttt{EVEN} and \texttt{ODD}} +\begin{semiverbatim}\scriptsize +> EVEN\_ODD\_EXISTS +val it = |- ?even odd. even 0 \holAnd{} ~odd 0 \holAnd{} (!n. even (SUC n) <=> odd n) \holAnd{} + (!n. odd (SUC n) <=> even n) + +> val EO\_SPEC = new\_specification ("EO\_SPEC", ["EVEN", "ODD"], EVEN\_ODD\_EXISTS); +val EO\_SPEC = |- EVEN 0 \holAnd{} ~ODD 0 \holAnd{} (!n. EVEN (SUC n) <=> ODD n) \holAnd{} + (!n. ODD (SUC n) <=> EVEN n) +\end{semiverbatim} +\end{exampleblock} +\item \hol{new\_specification} is a convenience wrapper +\begin{itemize} +\item it uses existential quantification instead of Hilbert's choice +\item deals with pair syntax +\item stores resulting definitions in theory +\end{itemize} +\item \hol{new\_specification} captures the underlying principle nicely +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Definitions} +\begin{itemize} +\item special case: new constant defined by equality +\begin{exampleblock}{Specification with Equality} +\begin{semiverbatim}\scriptsize +> double_EXISTS +val it = +|- ?double. (!n. double n = (n + n)) + +> val double_def = new_specification ("double_def", ["double"], double_EXISTS); +val double_def = + |- !n. double n = n + n +\end{semiverbatim} +\end{exampleblock} +\item there is a specialised methods for such simple definitions +\begin{exampleblock}{Non Recursive Definitions} +\begin{semiverbatim}\scriptsize +> val DOUBLE_DEF = new_definition ("DOUBLE_DEF", ``DOUBLE n = n + n``) +val DOUBLE_DEF = + |- !n. DOUBLE n = n + n +\end{semiverbatim} +\end{exampleblock} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Restrictions for Definitions} +\begin{itemize} +\item all variables occurring on right-hand-side (rhs) need to be arguments +\begin{itemize} +\item \eg \hol{new\_definition (..., ``F n = n + m``)} fails +\item \hol{m} is free on rhs +\end{itemize} +\item all type variables occurring on rhs need to occur on lhs +\begin{itemize} +\item \eg \hol{new\_definition ("IS\_FIN\_TY", \\ +\-\qquad\quad``IS\_FIN\_TY = FINITE (UNIV : 'a set)``)} fails +\item \hol{IS\_FIN\_TY} would lead to inconsistency +\item \hol{|- FINITE (UNIV : bool set)} +\item \hol{|- \holNeg{}FINITE (UNIV : num set)} +\item \hol {T <=> FINITE (UNIV:bool set) <=> \\ IS\_FIN\_TY <=>\\ FINITE (UNIV:num set) <=> F} +\item therefore, such definitions can't be allowed +\end{itemize} + +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Underspecified Functions} +\begin{itemize} +\item function specification do not need to define the function precisely +\item multiple different functions satisfying one spec are possible +\item functions resulting from such specs are called \emph{underspecified} +\item underspecified functions are still total, one just lacks knowledge +\item one common application: modelling \emph{partial functions} +\begin{itemize} +\item functions like \eg \hol{HD} and \hol{TL} are total +\item they are defined for empty lists +\item however, it is not specified, which value they have for empty lists +\item only known: \hol{HD [] = HD []} and \hol{TL [] = TL []} +\begin{minipage}{.7\textwidth}\medskip +\begin{semiverbatim}\scriptsize +val MY_HD_EXISTS = prove (``?hd. !x xs. (hd (x::xs) = x)``, ...); +val MY_HD_SPEC = + new_specification ("MY_HD_SPEC", ["MY_HD"], MY_HD_EXISTS) +\end{semiverbatim} +\end{minipage} +\end{itemize} +\end{itemize} +\end{frame} + + + +\begin{frame} +\frametitle{Primitive Type Definitions} +\begin{itemize} +\item HOL allows introducing non-empty subtypes of existing types +\item a predicate \hol{P : ty -> bool} describes a subset of an existing type \hol{ty} +\item \hol{ty} may contain type variables +\item only \emph{non-empty} types are allowed +\item therefore a non-emptyness proof \hol{ex-thm} of form \hol{?e.\ P e} is needed +\item \hol{new\_type\_definition (op-name, ex-thm)} then introduces a new type \hol{op-name} + specified by \hol{P} +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Primitive Type Definitions - Example 1} +\begin{itemize} +\item lets try to define a type \hol{dlist} of lists containing no duplicates +\item predicate \hol{ALL\_DISTINCT : 'a list -> bool} is used to define it +\item easy to prove theorem \texttt{dlist\_exists}: \hol{|- ?l.\ ALL\_DISTINCT l} +\item \hol{val dlist\_TY\_DEF = new\_type\_definitions("dlist", dlist\_exists)} defines + a new type \ml{'a dlist} and returns a theorem\bigskip +\begin{semiverbatim} +|- ?(rep :'a dlist -> 'a list). + TYPE_DEFINITION ALL_DISTINCT rep +\end{semiverbatim}\bigskip +\item \ml{rep} is a function taking a \hol{'a dlist} to the list representing it +\begin{itemize} +\item \hol{rep} is injective +\item a list satisfies \hol{ALL\_DISTINCT} iff there is a corresponding \hol{dlist} +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Primitive Type Definitions - Example 2} +\begin{itemize} +\item \hol{define\_new\_type\_bijections} can be used to define bijections between old and new type +\medskip +\begin{semiverbatim}\scriptsize +> \hol{define_new_type_bijections \{name="dlist_tybij", ABS="abs_dlist", + REP="rep_dlist", tyax=\alert{dlist_TY_DEF}\}} + +val it = + |- (!a. abs_dlist (rep_dlist a) = a) \holAnd{} + (!r. ALL_DISTINCT r <=> (rep_dlist (abs_dlist r) = r)) +\end{semiverbatim}\medskip +\item other useful theorems can be automatically proved by +\begin{itemize} +\item \hol{prove\_abs\_fn\_one\_one} +\item \hol{prove\_abs\_fn\_onto} +\item \hol{prove\_rep\_fn\_one\_one} +\item \hol{prove\_rep\_fn\_onto} +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Primitive Definition Principles Summary} +\begin{itemize} +\item primitive definition principles are easily explained +\item they lead to conservative extensions +\item however, they are cumbersome to use +\item LCF approach allows implementing more convenient definition tools +\begin{itemize} +\item \alert{\texttt{Datatype}} package +\item \alert{\texttt{TFL}} (Total Functional Language) package +\item \ml{IndDef} (Inductive Definition) package +\item \ml{quotientLib} Quotient Types Library +\item ... +\end{itemize} +\end{itemize} +\end{frame} + + + +\section{Functional Programming} + +\begin{frame} +\frametitle{Functional Programming} +\begin{itemize} +\item the \hol{Datatype} package allows to define datatypes conveniently +\item the \hol{TFL} package allows to define (mutually recursive) functions +\item the \hol{EVAL} conversion allows evaluating those definitions +\item this gives many HOL developments the feeling of a functional program +\item there is really a close connection between functional programming and definitions in HOL +\begin{itemize} +\item functional programming design principles apply +\item \hol{EVAL} is a great way to test quickly, whether your definitions are working as intended +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Functional Programming Example} + +\begin{semiverbatim}\scriptsize +> \hol{Datatype `mylist = E | L 'a mylist`} +val it = (): unit + +> \hol{Define `(mylen E = 0) \holAnd{} (mylen (L x xs) = SUC (mylen xs))`} +Definition has been stored under "mylen\_def" +val it = + |- (mylen E = 0) \holAnd{} !x xs. mylen (L x xs) = SUC (mylen xs): + thm + +> \hol{EVAL ``mylen (L 2 (L 3 (L 1 E)))``} +val it = + |- mylen (L 2 (L 3 (L 1 E))) = 3: + thm +\end{semiverbatim} + +\end{frame} + + +\section{Datatype Definitions} + +\begin{frame}[fragile] +\frametitle{Datatype Package} +\begin{itemize} +\item the \hol{Datatype} package allows to define SML style datatypes easily +\item there is support for +\begin{itemize} +\item algebraic datatypes +\item record types +\item mutually recursive types +\item ... +\end{itemize} +\item many constants are automatically introduced +\begin{itemize} +\item constructors +\item case-split constant +\item size function +\item field-update and accessor functions for records +\item ... +\end{itemize} +\item many theorems are derived and stored in current theory +\begin{itemize} +\item injectivity and distinctness of constructors +\item nchotomy and structural induction theorems +\item rewrites for case-split, size and record update functions +\item ... +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Datatype Package - Example I} +\begin{block}{Tree Datatype in SML} +\begin{semiverbatim}\scriptsize +datatype ('a,'b) btree = Leaf of 'a + | Node of ('a,'b) btree * 'b * ('a,'b) btree +\end{semiverbatim} +\end{block} + +\begin{block}{Tree Datatype in HOL} +\begin{semiverbatim}\scriptsize +Datatype `btree = Leaf 'a + | Node btree 'b btree` +\end{semiverbatim} +\end{block} + +\begin{block}{Tree Datatype in HOL --- Deprecated Syntax} +\begin{semiverbatim}\scriptsize +Hol_datatype `btree = Leaf of 'a + | Node of btree => 'b => btree` +\end{semiverbatim} +\end{block} + +\end{frame} + +\begin{frame}[fragile] +\frametitle{Datatype Package - Example I - Derived Theorems 1} +\begin{block}{\texttt{btree\_distinct}} +\begin{semiverbatim}\scriptsize +|- !a2 a1 a0 a. Leaf a <> Node a0 a1 a2 +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{btree\_11}} +\begin{semiverbatim}\scriptsize +|- (!a a'. (Leaf a = Leaf a') <=> (a = a')) \holAnd{} + (!a0 a1 a2 a0' a1' a2'. + (Node a0 a1 a2 = Node a0' a1' a2') <=> + (a0 = a0') \holAnd{} (a1 = a1') \holAnd{} (a2 = a2')) +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{btree\_nchotomy}} +\begin{semiverbatim}\scriptsize +|- !bb. (?a. bb = Leaf a) \holOr{} (?b b1 b0. bb = Node b b1 b0) +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{btree\_induction}} +\begin{semiverbatim}\scriptsize +|- !P. (!a. P (Leaf a)) \holAnd{} + (!b b0. P b \holAnd{} P b0 ==> !b1. P (Node b b1 b0)) ==> + !b. P b +\end{semiverbatim} +\end{block} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Datatype Package - Example I - Derived Theorems 2} + +\begin{block}{\texttt{btree\_size\_def}} +\begin{semiverbatim}\scriptsize +|- (!f f1 a. btree_size f f1 (Leaf a) = 1 + f a) \holAnd{} + (!f f1 a0 a1 a2. + btree_size f f1 (Node a0 a1 a2) = + 1 + (btree_size f f1 a0 + (f1 a1 + btree_size f f1 a2))) +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{btree\_case\_def}} +\begin{semiverbatim}\scriptsize +|- (!a f f1. btree_CASE (Leaf a) f f1 = f a) \holAnd{} + (!a0 a1 a2 f f1. btree_CASE (Node a0 a1 a2) f f1 = f1 a0 a1 a2) +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{btree\_case\_cong}} +\begin{semiverbatim}\scriptsize +|- !M M' f f1. + (M = M') \holAnd{} (!a. (M' = Leaf a) ==> (f a = f' a)) \holAnd{} + (!a0 a1 a2. + (M' = Node a0 a1 a2) ==> (f1 a0 a1 a2 = f1' a0 a1 a2)) ==> + (btree_CASE M f f1 = btree_CASE M' f' f1') +\end{semiverbatim} +\end{block} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Datatype Package - Example II} +\begin{block}{Enumeration type in SML} +\begin{semiverbatim}\scriptsize +datatype my_enum = E1 | E2 | E3 +\end{semiverbatim} +\end{block} + +\begin{block}{Enumeration type in HOL} +\begin{semiverbatim}\scriptsize +Datatype `my_enum = E1 | E2 | E3` +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Datatype Package - Example II - Derived Theorems} + +\begin{block}{\texttt{my\_enum\_nchotomy}} +\begin{semiverbatim}\scriptsize +|- !P. P E1 \holAnd{} P E2 \holAnd{} P E3 ==> !a. P a +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{my\_enum\_distinct}} +\begin{semiverbatim}\scriptsize +|- E1 <> E2 \holAnd{} E1 <> E3 \holAnd{} E2 <> E3 +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{my\_enum2num\_thm}} +\begin{semiverbatim}\scriptsize +|- (my_enum2num E1 = 0) \holAnd{} (my_enum2num E2 = 1) \holAnd{} (my_enum2num E3 = 2) +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{my\_enum2num\_num2my\_enum}} +\begin{semiverbatim}\scriptsize +|- !r. r < 3 <=> (my_enum2num (num2my_enum r) = r) +\end{semiverbatim} +\end{block} + + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Datatype Package - Example III} +\begin{block}{Record type in SML} +\begin{semiverbatim}\scriptsize +type rgb = \{ r : int, g : int, b : int \} +\end{semiverbatim} +\end{block} + +\begin{block}{Record type in HOL} +\begin{semiverbatim}\scriptsize +Datatype `rgb = <| r : num; g : num; b : num |>` +\end{semiverbatim} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Datatype Package - Example III - Derived Theorems} + +\begin{block}{\texttt{rgb\_component\_equality}} +\begin{semiverbatim}\scriptsize +|- !r1 r2. (r1 = r2) <=> + (r1.r = r2.r) \holAnd{} (r1.g = r2.g) \holAnd{} (r1.b = r2.b) +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{rgb\_nchotomy}} +\begin{semiverbatim}\scriptsize +|- !rr. ?n n0 n1. rr = rgb n n0 n1 +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{rgb\_r\_fupd}} +\begin{semiverbatim}\scriptsize +|- !f n n0 n1. rgb n n0 n1 with r updated_by f = rgb (f n) n0 n1 +\end{semiverbatim} +\end{block} + +\begin{block}{\texttt{rgb\_updates\_eq\_literal}} +\begin{semiverbatim}\scriptsize +|- !r n1 n0 n. + r with <|r := n1; g := n0; b := n|> = <|r := n1; g := n0; b := n|> +\end{semiverbatim} +\end{block} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Datatype Package - Example IV} +\begin{itemize} +\item nested record types are not allowed +\item however, mutual recursive types can mitigate this restriction +\end{itemize} + +\begin{block}{Filesystem Datatype in SML} +\begin{semiverbatim}\scriptsize +datatype file = Text of string + | Dir of \{owner : string , + files : (string * file) list\} +\end{semiverbatim} +\end{block} + +\begin{alertblock}{\textbf{Not Supported} Nested Record Type Example in HOL} +\begin{semiverbatim}\scriptsize +Datatype `file = Text string + | Dir <| owner : string ; + files : (string # file) list |>` +\end{semiverbatim} +\end{alertblock} + +\begin{block}{Filesystem Datatype - Mutual Recursion in HOL} +\begin{semiverbatim}\scriptsize +Datatype `file = Text string + | Dir directory + ; + directory = <| owner : string ; + files : (string # file) list |>` +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Datatype Package - No support for Co-Algebraic Types} +\begin{itemize} +\item there is no support for co-algebraic types +\item the \texttt{Datatype} package could be extended to do so +\item other systems like Isabelle/HOL provide high-level methods for defining such types +\end{itemize} +\begin{block}{Co-algebraic Type Example in SML --- Lazy Lists} +\begin{semiverbatim}\scriptsize +datatype 'a lazylist = Nil + | Cons of ('a * (unit -> 'a lazylist)) +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Datatype Package - Discussion} + +\begin{itemize} +\item \texttt{Datatype} package allows to define many useful datatypes +\item however, there are many limitations +\begin{itemize} +\item some types cannot be defined in HOL, \eg empty types +\item some types are not supported, \eg co-algebraic types +\item there are bugs (currently \eg some trouble with certain mutually recursive definitions) +\end{itemize} +\item biggest restrictions in practice (in my opinion and my line of work) +\begin{itemize} +\item no support for co-algebraic datatypes +\item no nested record datatypes +\end{itemize} +\item depending on datatype, different sets of useful lemmata are derived +\item most important ones are added to \hol{TypeBase} +\begin{itemize} +\item tools like \hol{Induct\_on}, \hol{Cases\_on} use them +\item there is support for pattern matching +\end{itemize} +\end{itemize} +\end{frame} + + +\section{Recursive Function Definitions} + +\begin{frame} +\frametitle{Total Functional Language (\texttt{TFL}) package} +\begin{itemize} +\item \ml{TFL} package implements support for terminating functional definitions +\item \hol{Define} defines functions from high-level descriptions +\item there is support for pattern matching +\item look and feel is like function definitions in SML +\item based on \emph{well-founded recursion} principle +\item \hol{Define} is the most common way for definitions in HOL +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Well-Founded Relations} +\begin{itemize} +\item a relation \texttt{R : 'a -> 'a -> bool} is called \emph{well-founded}, iff +there are no infinite descending chains\\[.5em] +\hol{wellfounded R = \holNeg{}?f.\ !n.\ R (f (SUC n)) (f n)} +\bigskip +\item Example: \texttt{\$< :\ num -> num -> bool} is well-founded +\item if arguments of recursive calls are smaller according to well-founded relation, +the recursion terminates +\item this is the essence of termination proofs +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Well-Founded Recursion} +\begin{itemize} +\item a well-founded relation \hol{R} can be used to define recursive functions +\item this recursion principle is called \hol{WFREC} in HOL +\item idea of \hol{WFREC} +\begin{itemize} +\item if arguments get smaller according to \hol{R}, perform recursive call +\item otherwise abort and return \hol{ARB} +\end{itemize} +\item \hol{WFREC} always defines a function +\item if all recursive calls indeed decrease according to \hol{R}, the original recursive + equations can be derived from the \hol{WFREC} representation +\item TFL uses this internally +\item however, this is well-hidden from the user +\end{itemize} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{\texttt{Define} - Initial Examples} + +\begin{block}{Simple Definitions} +\begin{semiverbatim}\scriptsize +> \hol{val DOUBLE_def = Define `DOUBLE n = n + n`} +val DOUBLE_def = + |- !n. DOUBLE n = n + n: + thm + +> \hol{val MY_LENGTH_def = Define `(MY_LENGTH [] = 0) \holAnd{} + (MY_LENGTH (x::xs) = SUC (MY_LENGTH xs))`} +val MY_LENGTH_def = + |- (MY_LENGTH [] = 0) \holAnd{} !x xs. MY_LENGTH (x::xs) = SUC (MY_LENGTH xs): + thm + +> \hol{val MY_APPEND_def = Define `(MY_APPEND [] ys = ys) \holAnd{} + (MY_APPEND (x::xs) ys = x :: (MY_APPEND xs ys))`} +val MY_APPEND_def = + |- (!ys. MY_APPEND [] ys = ys) \holAnd{} + (!x xs ys. MY_APPEND (x::xs) ys = x::MY_APPEND xs ys): + thm +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame} +\frametitle{\texttt{Define} discussion} +\begin{itemize} +\item \hol{Define} feels like a function definition in HOL +\item it can be used to define "terminating" recursive functions +\item \hol{Define} is implemented by a large, non-trivial piece of SML code +\item it uses many heuristics +\item outcome of \hol{Define} sometimes hard to predict +\item the input descriptions are only hints +\begin{itemize} +\item the produced function and the definitional theorem might be different +\item in simple examples, quantifiers added +\item pattern compilation takes place +\item earlier ``conjuncts'' have precedence +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{\texttt{Define} - More Examples} + +\begin{block}{} +\begin{semiverbatim}\scriptsize +> \hol{val MY_HD_def = Define `MY_HD (x :: xs) = x`} +val MY_HD_def = |- !x xs. MY_HD (x::xs) = x : thm + +> \hol{val IS_SORTED_def = Define ` + (IS_SORTED (x1 :: x2 :: xs) = ((x1 < x2) \holAnd{} (IS_SORTED (x2::xs)))) \holAnd{} + (IS_SORTED _ = T)`} +val IS_SORTED_def = + |- (!xs x2 x1. IS_SORTED (x1::x2::xs) <=> x1 < x2 \holAnd{} IS_SORTED (x2::xs)) \holAnd{} + (IS_SORTED [] <=> T) \holAnd{} (!v. IS_SORTED [v] <=> T) + +> \hol{val EVEN_def = Define `(EVEN 0 = T) \holAnd{} (ODD 0 = F) \holAnd{} + (EVEN (SUC n) = ODD n) \holAnd{} (ODD (SUC n) = EVEN n)`} +val EVEN_def = + |- (EVEN 0 <=> T) \holAnd{} (ODD 0 <=> F) \holAnd{} (!n. EVEN (SUC n) <=> ODD n) \holAnd{} + (!n. ODD (SUC n) <=> EVEN n) : thm + +> \hol{val ZIP_def = Define `(ZIP (x::xs) (y::ys) = (x,y)::(ZIP xs ys)) \holAnd{} + (ZIP \_ \_ = [])`} +val ZIP_def = + |- (!ys y xs x. ZIP (x::xs) (y::ys) = (x,y)::ZIP xs ys) \holAnd{} + (!v1. ZIP [] v1 = []) \holAnd{} (!v4 v3. ZIP (v3::v4) [] = []) : thm +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Primitive Definitions} +\begin{itemize} +\item \hol{Define} introduces (if needed) the function using \hol{WFREC} +\item intended definition derived as a theorem +\item the theorems are stored in current theory +\item usually, one never needs to look at it +\end{itemize} +\begin{block}{Examples} +\begin{semiverbatim}\scriptsize +val IS_SORTED_primitive_def = +|- IS_SORTED = + WFREC (@R.\ WF R \holAnd{} !x1 xs x2. R (x2::xs) (x1::x2::xs)) + (\textbsl{}IS_SORTED a. + case a of + [] => I T + | [x1] => I T + | x1::x2::xs => I (x1 < x2 \holAnd{} IS_SORTED (x2::xs))) + +|- !R M. WF R ==> !x. WFREC R M x = M (RESTRICT (WFREC R M) R x) x +|- !f R x. RESTRICT f R x = (\textbsl{}y. if R y x then f y else ARB) +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Induction Theorems} +\begin{itemize} +\item \hol{Define} automatically defines induction theorems +\item these theorems are stored in current theory with suffix \hol{ind} +\item use \hol{DB.fetch "-" "something\_ind"} to retrieve them +\item these induction theorems are useful to reason about corresponding recursive functions +\end{itemize} +\begin{block}{Example} +\begin{semiverbatim}\scriptsize +val IS_SORTED_ind = |- !P. + ((!x1 x2 xs. P (x2::xs) ==> P (x1::x2::xs)) \holAnd{} + P [] \holAnd{} + (!v. P [v])) ==> + !v. P v +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{\texttt{Define} failing} +\begin{itemize} +\item \hol{Define} might fail for various reasons to define a function +\begin{itemize} +\item such a function cannot be defined in HOL +\item such a function can be defined, but not via the methods used by TFL +\item TFL can define such a function, but its heuristics are too weak and user guidance is required +\item there is a bug :-) +\end{itemize} +\item \emph{termination} is an important concept for \hol{Define} +\item it is easy to misunderstand termination in the context of HOL +\item we need to understand what is meant by termination +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Termination in HOL} +\begin{itemize} +\item in SML it is natural to talk about termination of functions +\item in the HOL logic there is no concept of execution +\item thus, there is no concept of termination in HOL +\begin{minipage}{.8\textwidth} +\begin{exampleblock}{3 characterisations of a function \texttt{f :\ num -> num}} +\begin{itemize} +\item \hol{|- !n.\ f n = 0} +\item \hol{|- (f 0 = 0) \holAnd{} !n.\ (f (SUC n) = f n)} +\item \hol{|- (f 0 = 0) \holAnd{} !n.\ (f n = f (SUC n))} +\end{itemize} +Is \hol{f} terminating? All 3 theorems are equivalent. +\end{exampleblock} +\end{minipage}\bigskip +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Termination in HOL II} +\begin{itemize} +\item it is useful to think in terms of termination +\item the TFL package implements heuristics to define functions that would terminate in SML +\item the TFL package uses well-founded recursion +\item the required well-founded relation corresponds to a termination proof +\item therefore, it is very natural to think of \hol{Define} searching a termination proof +\item important: this is the idea behind this function definition package, not a property of HOL +\end{itemize} +\bottomstatement{\alert{HOL is not limited to "terminating" functions}} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Termination in HOL III} +\begin{itemize} +\item one can define "non-terminating" functions in HOL +\item however, one cannot do so (easily) with \hol{Define} +\end{itemize} +\begin{exampleblock}{Definition of \texttt{WHILE} in HOL} +\begin{semiverbatim}\scriptsize +\emph{|- !P g x. WHILE P g x = if P x then WHILE P g (g x) else x} +\end{semiverbatim} +\end{exampleblock} + + +\begin{exampleblock}{Execution Order}\scriptsize +There is no "execution order". One can easily define a complicated constant function: +\vspace{-.7em} +\begin{semiverbatim} +\emph{(myk : num -> num) (n:num) = (let x = myk (n+1) in 0)} +\end{semiverbatim} +\end{exampleblock} + +\begin{alertblock}{Unsound Definitions}\scriptsize +A function \hol{f : num -> num} with the following property cannot be defined in HOL unless HOL has an inconsistancy: +\begin{semiverbatim} +\hol{!n. f n = ((f n) + 1)} +\end{semiverbatim} +Such a function would allow to prove \hol{0 = 1}. +\end{alertblock} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Manual Termination Proofs I} +\begin{itemize} +\item TFL uses various heuristics to find a well-founded relation +\item however, these heuristics may not be strong enough +\item in such cases the user can provide a well-founded relation manually +\item the most common well-founded relations are \emph{measures} +\item measures map values to natural numbers and use the less relation\\ +\hol{|- !(\alert{f:'a -> num}) x y.\ measure f x y <=> (f x < f y)} +\item all measures are well-founded: \hol{|- !f.\ WF (measure f)} +\item moreover, existing well-founded relations can be combined +\begin{itemize} +\item lexicographic order \hol{LEX} +\item list lexicographic order \hol{LLEX} +\item \ldots +\end{itemize} +\end{itemize} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Manual Termination Proofs II} +\begin{itemize} +\item if \hol{Define} fails to find a termination proof, \hol{Hol\_defn} can be used +\item \hol{Hol\_defn} defers termination proofs +\item it derives termination conditions and + sets up the function definitions +\item all results are packaged as a value of type \hol{defn} +\item after calling \hol{Hol\_defn} the defined function(s) can be used +\item however, the intended definition theorem has not been derived yet +\item to derive it, one needs to +\begin{itemize} +\item provide a well-founded relation +\item show that termination conditions respect that relation +\end{itemize} +\item \hol{Defn.tprove} and \hol{Defn.tgoal} are intended for this +\item proofs usually start by providing relation via tactic \hol{WF\_REL\_TAC} +\end{itemize} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Manual Termination Proof Example 1} +\begin{semiverbatim}\scriptsize +> \hol{val qsort_defn = Hol_defn "qsort" ` + (qsort ord [] = []) \holAnd{} + (qsort ord (x::rst) = + (qsort ord (FILTER (\$\holNeg{} o ord x) rst)) ++ + [x] ++ + (qsort ord (FILTER (ord x) rst)))`} + +val qsort_defn = HOL function definition (recursive) + +Equation(s) : + [...] |- qsort ord [] = [] + [...] |- qsort ord (x::rst) = + qsort ord (FILTER ($\holNeg{} o ord x) rst) ++ [x] ++ + qsort ord (FILTER (ord x) rst) + +Induction : ... + +Termination conditions : + 0. !rst x ord. R (ord,FILTER (ord x) rst) (ord,x::rst) + 1. !rst x ord. R (ord,FILTER ($\holNeg{} o ord x) rst) (ord,x::rst) + 2. WF R +\end{semiverbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Manual Termination Proof Example 2} +\begin{semiverbatim}\scriptsize +> \hol{Defn.tgoal qsort_defn} + +Initial goal: + +?R. + WF R \holAnd{} + (!rst x ord. R (ord,FILTER (ord x) rst) (ord,x::rst)) \holAnd{} + (!rst x ord. R (ord,FILTER (\$\holNeg{} o ord x) rst) (ord,x::rst)) + +\pause +> \hol{e (WF_REL_TAC `measure (\textbsl{}(\_, l).\ LENGTH l)`)} + +1 subgoal : + +(!rst x ord. LENGTH (FILTER (ord x) rst) < LENGTH (x::rst)) \holAnd{} +(!rst x ord. LENGTH (FILTER (\textbsl{}x'.\ \holNeg{}ord x x') rst) < LENGTH (x::rst)) + +> \hol{...} +\end{semiverbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Manual Termination Proof Example 3} +\begin{semiverbatim}\scriptsize +> \hol{val (qsort_def, qsort_ind) = + Defn.tprove (qsort_defn, + WF_REL_TAC `measure (\textbsl{}(\_, l).\ LENGTH l)`) >> ...)} + +val qsort_def = +|- (qsort ord [] = []) \holAnd{} + (qsort ord (x::rst) = + qsort ord (FILTER ($~ o ord x) rst) ++ [x] ++ + qsort ord (FILTER (ord x) rst)) + +val qsort_ind = +|- !P. (!ord. P ord []) \holAnd{} + (!ord x rst. + P ord (FILTER (ord x) rst) \holAnd{} + P ord (FILTER ($~ o ord x) rst) ==> + P ord (x::rst)) ==> + !v v1. P v v1 +\end{semiverbatim} +\end{frame} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/11_good_definitions.tex b/lectures/11_good_definitions.tex new file mode 100644 index 0000000..2ce9cd4 --- /dev/null +++ b/lectures/11_good_definitions.tex @@ -0,0 +1,511 @@ +\part{Good Definitions} + +\frame[plain]{\partpage} + +\section{General Discussion} + +\begin{frame} +\frametitle{Importance of Good Definitions} +\begin{itemize} +\item using \textit{good} definitions is very important +\begin{itemize} +\item good definitions are vital for \emph{clarity} +\item \emph{proofs} depend a lot on the form of definitions +\end{itemize} +\item unluckily, it is hard to state what a good definition is +\item even harder to come up with good definitions +\item let's look at it a bit closer anyhow +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Importance of Good Definitions --- Clarity I} +\begin{itemize} +\item HOL guarantees that theorems do indeed hold +\item However, does the theorem mean what you think it does? +\item you can separate your development in +\begin{itemize} +\item main theorems you care for +\item auxiliary stuff used to derive your main theorems +\end{itemize} +\item it is essential to understand your main theorems +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Importance of Good Definitions --- Clarity II} +\begin{minipage}[t]{.45\textwidth} +\begin{block}{Guarded by HOL} +\begin{itemize} +\item proofs checked +\item internal, technical definitions +\item technical lemmata +\item proof tools +\end{itemize} +\end{block} +\end{minipage} +\qquad +\begin{minipage}[t]{.45\textwidth} +\begin{block}{Manual review needed for} +\begin{itemize} +\item meaning of main theorems +\item meaning of definitions used by main theorems +\item meaning of types used by main theorems +\end{itemize} +\end{block} +\end{minipage} +\end{frame} + + +\begin{frame} +\frametitle{Importance of Good Definitions --- Clarity III} +\begin{itemize} +\item it is essential to understand your main theorems +\begin{itemize} +\item you need to understand all the definitions directly used +\item you need to understand the indirectly used ones as well +\item you need to convince others that you express the intended statement +\item therefore, it is vital to \alert{use very simple, clear definitions} +\end{itemize} +\item defining concepts is often the main development task +\item checking resulting model against real artefact is vital +\begin{itemize} +\item testing via \eg \hol{EVAL} +\item formal sanity +\item conformance testing +\end{itemize} +\item wrong models are main source of error when using HOL +\item proofs, auxiliary lemmata and auxiliary definitions +\begin{itemize} +\item can be as technical and complicated as you like +\item correctness is guaranteed by HOL +\item reviewers don't need to care +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Importance of Good Definitions --- Proofs} +\begin{itemize} +\item good definitions can shorten proofs significantly +\item they improve maintainability +\item they can improve automation drastically +\item unluckily for proofs definitions often need to be technical +\item this contradicts clarity aims +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{How to come up with good definitions} +\begin{itemize} +\item unluckily, it is hard to state what a good definition is +\item it is even harder to come up with them +\begin{itemize} +\item there are often many competing interests +\item a lot of experience and detailed tool knowledge is needed +\item much depends on personal style and taste +\end{itemize} +\item general advice: use more than one definition +\begin{itemize} +\item in HOL you can derive equivalent definitions as theorems +\item define a concept as clearly and easily as possible +\item derive equivalent definitions for various purposes +\begin{itemize} +\item one very close to your favourite textbook +\item one nice for certain types of proofs +\item another one good for evaluation +\item \ldots +\end{itemize} +\end{itemize} +\item lessons from functional programming apply +\end{itemize} +\end{frame} + + +\section{Functional Programming} + +\begin{frame} +\frametitle{Good Definitions in Functional Programming} + +\begin{block}{Objectives} +\begin{itemize} +\item clarity (readability, maintainability) +\item performance (runtime speed, memory usage, ...) +\end{itemize} +\end{block} + +\begin{block}{General Advice} +\begin{itemize} +\item use the powerful type-system +\item use many small function definitions +\item encode invariants in types and function signatures +\end{itemize} +\end{block} + +\end{frame} + +\begin{frame}[fragile] +\frametitle{Good Definitions -- no number encodings} +\begin{itemize} +\item many programmers familiar with C encode everything as a number +\item enumeration types are very cheap in SML and HOL +\item use them instead +\end{itemize} + +\begin{exampleblock}{Example Enumeration Types}\scriptsize +In C the result of an order comparison is an integer with 3 equivalence classes: +0, negative and positive integers. In SML and HOL, it is better to use a variant type. +\begin{semiverbatim} +val _ = Datatype `ordering = LESS | EQUAL | GREATER`; + +val compare_def = Define ` + (compare LESS lt eq gt = lt) +\holAnd{} (compare EQUAL lt eq gt = eq) +\holAnd{} (compare GREATER lt eq gt = gt) `; + +val list_compare_def = Define ` + (list_compare cmp [] [] = EQUAL) \holAnd{} (list_compare cmp [] l2 = LESS) +\holAnd{} (list_compare cmp l1 [] = GREATER) +\holAnd{} (list_compare cmp (x::l1) (y::l2) = compare (cmp (x:'a) y) + (* xy *) GREATER) `; +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Good Definitions --- Isomorphic Types} +\begin{itemize} +\item the type-checker is your friend +\begin{itemize} +\item it helps you find errors +\item code becomes more robust +\item using good types is a great way of writing self-documenting code +\end{itemize} +\item therefore, use many types +\item even use types isomorphic to existing ones +\end{itemize} + +\begin{exampleblock}{Virtual and Physical Memory Addresses}\scriptsize +Virtual and physical addresses might in a development both be numbers. It is +still nice to use separate types to avoid mixing them up. +\begin{semiverbatim} +val _ = Datatype `vaddr = VAddr num`; +val _ = Datatype `paddr = PAddr num`; + +val virt_to_phys_addr_def = Define ` + virt_to_phys_addr (VAddr a) = PAddr( \textrm{\textit{translation of}} a )`; +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Good Definitions --- Record Types I} +\begin{itemize} +\item often people use tuples where records would be more appropriate +\item using large tuples quickly becomes awkward +\begin{itemize} +\item it is easy to mix up order of tuple entries +\begin{itemize} +\item often types coincide, so type-checker does not help +\end{itemize} +\item no good error messages for tuples +\begin{itemize} +\item hard to decipher type mismatch messages for long product types +\item hard to figure out which entry is missing at which position +\item non-local error messages +\item variable in last entry can hide missing entries +\end{itemize} +\end{itemize} +\item records sometimes require slightly more proof effort +\item however, records have many benefits +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Good Definitions --- Record Types II} +\begin{itemize} +\item using records +\begin{itemize} +\item introduces field names +\item provides automatically defined accessor and update functions +\item leads to better type-checking error messages +\end{itemize} +\item records improve readability +\begin{itemize} +\item accessors and update functions lead to shorter code +\item field names act as documentation +\end{itemize} +\item records improve maintainability +\begin{itemize} +\item improved error messages +\item much easier to add extra fields +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Good Definitions --- Encoding Invariants} +\begin{itemize} +\item try to encode as many invariants as possible in the types +\item this allows the type-checker to ensure them for you +\item you don't have to check them manually any more +\item your code becomes more robust and clearer +\end{itemize} + +\begin{exampleblock}{Network Connections (Example by Yaron Minsky from Jane Street)}\scriptsize +Consider the following datatype for network connections. It has many implicit invariants. +\begin{semiverbatim} +datatype connection_state = Connected | Disconnected | Connecting; + +type connection_info = \{ + state : connection_state, + server : inet_address, + last_ping_time : time option, + last_ping_id : int option, + session_id : string option, + when_initiated : time option, + when_disconnected : time option +\} +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Good Definitions --- Encoding Invariants II} +\begin{exampleblock}{Network Connections (Example by Yaron Minsky from Jane Street) II}\scriptsize +The following definition of \texttt{connection\_info} makes the invariants explicit: +\begin{semiverbatim} +type connected = \{ last_ping : (time * int) option, + session_id : string \}; +type disconnected = \{ when_disconnected : time \}; +type connecting = \{ when_initiated : time \}; + +datatype connection_state = + Connected of connected +| Disconnected of disconneted +| Connecting of connecting; + +type connection_info = \{ + state : connection_state, + server : inet_address +\} +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + + +\section{HOL} + +\begin{frame} +\frametitle{Good Definitions in HOL} + +\begin{block}{Objectives} +\begin{itemize} +\item clarity (readability) +\item good for proofs +\item performance (good for automation, easily evaluatable, ...) +\end{itemize} +\end{block} + +\begin{block}{General Advice} +\begin{itemize} +\item same advice as for functional programming applies +\item use even smaller definitions +\begin{itemize} +\item introduce auxiliary definitions for important function parts +\item use extra definitions for important constants +\item ... +\end{itemize} +\item tiny definitions +\begin{itemize} +\item allow keeping proof state small by unfolding only needed ones +\item allow many small lemmata +\item improve maintainability +\end{itemize} +\end{itemize} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Good Definitions in HOL II} + +\begin{block}{Technical Issues} +\begin{itemize} +\item write definitions such that they work well with HOL's tools +\item this requires you to know HOL well +\item a lot of experience is required +\item general advice +\begin{itemize} +\item avoid explicit case-expressions +\item prefer curried functions +\end{itemize} +\end{itemize} +\end{block} + +\begin{block}{Example} +\begin{semiverbatim}\scriptsize +val ZIP_GOOD_def = Define `(ZIP (x::xs) (y::ys) = (x,y)::(ZIP xs ys)) \holAnd{} + (ZIP _ _ = [])` + +val ZIP_BAD1_def = Define `ZIP xs ys = case (xs, ys) of + (x::xs, y::ys) => (x,y)::(ZIP xs ys) + | (_, _) => []` + +val ZIP_BAD2_def = Define `(ZIP (x::xs, y::ys) = (x,y)::(ZIP (xs, ys))) \holAnd{} + (ZIP _ = [])` +\end{semiverbatim} +\end{block} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Good Definitions in HOL III} + +\begin{block}{Multiple Equivalent Definitions} +\begin{itemize} +\item satisfy competing requirements by having multiple equivalent definitions +\item derive them as theorems +\item initial definition should be as clear as possible +\begin{itemize} +\item clarity allows simpler reviews +\item simplicity reduces the likelihood of errors +\end{itemize} +\end{itemize} +\end{block} + +\begin{block}{Example - \texttt{ALL\_DISTINCT}} +\begin{semiverbatim}\scriptsize +|- (ALL_DISTINCT [] <=> T) \holAnd{} + (!h t. ALL_DISTINCT (h::t) <=> \holNeg{}MEM h t \holAnd{} ALL_DISTINCT t) + +|- !l. ALL_DISTINCT l <=> + (!x. MEM x l ==> (FILTER (\$= x) l = [x])) + +|- !ls. ALL_DISTINCT ls <=> (CARD (set ls) = LENGTH ls): +\end{semiverbatim} +\end{block} +\end{frame} + + +\section{Formal Sanity} + +\begin{frame}[fragile] +\frametitle{Formal Sanity} + +\begin{block}{Formal Sanity} +\begin{itemize} +\item to ensure correctness test your definitions via \eg \hol{EVAL} +\item in HOL testing means symbolic evaluation, \ie proving lemmata +\item \emph{formally proving sanity check lemmata} is very beneficial +\begin{itemize} +\item they should express core properties of your definition +\item thereby they check your intuition against your actual definitions +\item these lemmata are often useful for following proofs +\item using them improves robustness and maintainability of your development +\end{itemize} +\item I highly recommend using formal sanity checks +\end{itemize} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Formal Sanity Example I} + +\begin{semiverbatim}\scriptsize +> \hol{val ALL_DISTINCT = Define ` + (ALL_DISTINCT [] = T) \holAnd{} + (ALL_DISTINCT (h::t) = \holNeg{}MEM h t \holAnd{} ALL_DISTINCT t)`}; +\end{semiverbatim} + +\begin{block}{Example Sanity Check Lemmata} +\begin{semiverbatim}\scriptsize +|- ALL_DISTINCT []\smallskip +|- !x xs. ALL_DISTINCT (x::xs) <=> \holNeg{}MEM x xs \holAnd{} ALL_DISTINCT xs\smallskip +|- !x. ALL_DISTINCT [x]\smallskip +|- !x xs. \holNeg{}(ALL_DISTINCT (x::x::xs))\smallskip +|- !l. ALL_DISTINCT (REVERSE l) <=> ALL_DISTINCT l\smallskip +|- !x l. ALL_DISTINCT (SNOC x l) <=> \holNeg{}MEM x l \holAnd{} ALL_DISTINCT l\smallskip +|- !l1 l2. ALL_DISTINCT (l1 ++ l2) <=> + ALL_DISTINCT l1 \holAnd{} ALL_DISTINCT l2 \holAnd{} !e. MEM e l1 ==> \holNeg{}MEM e l2 +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Formal Sanity Example II 1} + +\begin{semiverbatim}\scriptsize +> \hol{val ZIP_def = Define ` + (ZIP [] ys = []) \holAnd{} (ZIP xs [] = []) \holAnd{} + (ZIP (x::xs) (y::ys) = (x, y)::(ZIP xs ys))`} + +val ZIP_def = + |- (!ys. ZIP [] ys = []) \holAnd{} (!v3 v2. ZIP (v2::v3) [] = []) \holAnd{} + (!ys y xs x. ZIP (x::xs) (y::ys) = (x,y)::ZIP xs ys) +\end{semiverbatim}\vspace{-1em} +\begin{itemize} +\item above definition of \hol{ZIP} looks straightforward +\item small changes cause heuristics to produce different theorems +\item use formal sanity lemmata to compensate +\end{itemize} +\begin{semiverbatim}\scriptsize +> \hol{val ZIP_def = Define ` + (ZIP xs [] = []) \holAnd{} (ZIP [] ys = []) \holAnd{} + (ZIP (x::xs) (y::ys) = (x, y)::(ZIP xs ys))`} + +val ZIP_def = + |- (!xs. ZIP xs [] = []) \holAnd{} (!v3 v2. ZIP [] (v2::v3) = []) \holAnd{} + (!ys y xs x. ZIP (x::xs) (y::ys) = (x,y)::ZIP xs ys0 +\end{semiverbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Formal Sanity Example II 2} + +\begin{semiverbatim}\scriptsize +val ZIP_def = + |- (!ys. ZIP [] ys = []) \holAnd{} (!v3 v2. ZIP (v2::v3) [] = []) \holAnd{} + (!ys y xs x. ZIP (x::xs) (y::ys) = (x,y)::ZIP xs ys) +\end{semiverbatim} +\begin{block}{Example Formal Sanity Lemmata} +\begin{semiverbatim}\scriptsize +|- (!xs. ZIP xs [] = []) \holAnd{} (!ys. ZIP [] ys = []) \holAnd{} + (!y ys x xs. ZIP (x::xs) (y::ys) = (x,y)::ZIP xs ys)\smallskip +|- !xs ys. LENGTH (ZIP xs ys) = MIN (LENGTH xs) (LENGTH ys)\smallskip +|- !x y xs ys. MEM (x, y) (ZIP xs ys) ==> (MEM x xs \holAnd{} MEM y ys)\smallskip +|- !xs1 xs2 ys1 ys2. LENGTH xs1 = LENGTH ys1 ==> + (ZIP (xs1++xs2) (ys1++ys2) = (ZIP xs1 ys1 ++ ZIP xs2 ys2))\smallskip +... +\end{semiverbatim} +\end{block} +\begin{itemize} +\item in your proofs use sanity lemmata, not original definition +\item this makes your development robust against +\begin{itemize} +\item small changes to the definition required later +\item changes to \hol{Define} and its heuristics +\item bugs in function definition package +\end{itemize} +\end{itemize} +\end{frame} + + + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/12_deep_shallow.tex b/lectures/12_deep_shallow.tex new file mode 100644 index 0000000..8cbcea1 --- /dev/null +++ b/lectures/12_deep_shallow.tex @@ -0,0 +1,195 @@ +\part{Deep and Shallow Embeddings} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{Deep and Shallow Embeddings} + +\begin{itemize} +\item often one models some kind of formal language +\item important design decision: use \emph{deep} or \emph{shallow} embedding +\item in a nutshell: +\begin{itemize} +\item shallow embeddings just model semantics +\item deep embeddings model syntax as well +\end{itemize} +\item a shallow embedding directly uses the HOL logic +\item a deep embedding +\begin{itemize} +\item defines a datatype for the syntax of the language +\item provides a function to map this syntax to a semantic +\end{itemize} +\end{itemize} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: Embedding of Propositional Logic I} + +\begin{itemize} +\item propositional logic is a subset of HOL +\item a shallow embedding is therefore trivial +\end{itemize} + +\begin{semiverbatim}\scriptsize +val sh_true_def = Define `sh_true = T`; +val sh_var_def = Define `sh_var (v:bool) = v`; +val sh_not_def = Define `sh_not b = \holNeg{}b`; +val sh_and_def = Define `sh_and b1 b2 = (b1 \holAnd{} b2)`; +val sh_or_def = Define `sh_or b1 b2 = (b1 \holOr{} b2)`; +val sh_implies_def = Define `sh_implies b1 b2 = (b1 ==> b2)`; +\end{semiverbatim} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: Embedding of Propositional Logic II} + +\begin{itemize} +\item we can also define a datatype for propositional logic +\item this leads to a deep embedding + +\begin{semiverbatim}\scriptsize +val _ = Datatype `bvar = BVar num` +val _ = Datatype `prop = d_true | d_var bvar | d_not prop + | d_and prop prop | d_or prop prop + | d_implies prop prop`; + +val _ = Datatype `var_assignment = BAssign (bvar -> bool)` +val VAR_VALUE_def = Define `VAR_VALUE (BAssign a) v = (a v)` + +val PROP_SEM_def = Define ` + (PROP_SEM a d_true = T) \holAnd{} + (PROP_SEM a (d_var v) = VAR_VALUE a v) \holAnd{} + (PROP_SEM a (d_not p) = \holNeg{}(PROP_SEM a p)) \holAnd{} + (PROP_SEM a (d_and p1 p2) = (PROP_SEM a p1 \holAnd{} PROP_SEM a p2)) \holAnd{} + (PROP_SEM a (d_or p1 p2) = (PROP_SEM a p1 \holOr{} PROP_SEM a p2)) \holAnd{} + (PROP_SEM a (d_implies p1 p2) = (PROP_SEM a p1 ==> PROP_SEM a p2))` +\end{semiverbatim} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Shallow vs.\ Deep Embeddings} + +\newcommand{\dummyitem}{\item[] \leavevmode\phantom{gg}} + +\begin{minipage}[t]{.46\textwidth} +\begin{block}{Shallow} +\begin{itemize} +\item quick and easy to build +\item extensions are simple +\end{itemize} +\end{block} +\end{minipage}\qquad +\begin{minipage}[t]{.46\textwidth} +\begin{block}{Deep} +\begin{itemize} +\item can reason about syntax +\item allows verified implementations +\item sometimes tricky to define +\begin{itemize} +\item \eg bound variables +\end{itemize} +\end{itemize} +\end{block} +\end{minipage} +\bigskip + +\begin{block}{Important Questions for Deciding} +\begin{itemize} +\item Do I need to reason about syntax? +\item Do I have hard to define syntax like bound variables? +\item How much time do I have? +\end{itemize} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Example: Embedding of Propositional Logic III} + +\begin{itemize} +\item with deep embedding one can easily formalise syntactic properties like +\begin{itemize} +\item Which variables does a propositional formula contain? +\item Is a formula in negation-normal-form (NNF)? +\end{itemize} +\item with shallow embeddings +\begin{itemize} +\item syntactic concepts can't be defined in HOL +\item however, they can be defined in SML +\item no proofs about them possible +\end{itemize} +\end{itemize} + +\begin{semiverbatim}\scriptsize +val _ = Define ` + (IS_NNF (d_not d_true) = T) \holAnd{} (IS_NNF (d_not (d_var v)) = T) \holAnd{} + (IS_NNF (d_not _) = F) \holAnd{}\medskip + (IS_NNF d_true = T) \holAnd{} (IS_NNF (d_var v) = T) \holAnd{} + (IS_NNF (d_and p1 p2) = (IS_NNF p1 \holAnd{} IS_NNF p2)) \holAnd{} + (IS_NNF (d_or p1 p2) = (IS_NNF p1 \holAnd{} IS_NNF p2)) \holAnd{} + (IS_NNF (d_implies p1 p2) = (IS_NNF p1 \holAnd{} IS_NNF p2))` +\end{semiverbatim} +\end{frame} + + + + +\begin{frame} +\frametitle{Verified vs.\ Verifying Program} +\newcommand{\dummyitem}{\item[] \leavevmode\phantom{gg}} + +\begin{minipage}[t]{.46\textwidth} +\begin{block}{Verified Programs} +\begin{itemize} +\item are formalised in HOL +\item their properties have been proven once and for all +\item all runs have proven properties +\item are usually less sophisticated, since they need verification +\item is what one wants ideally +\item often require deep embedding +\end{itemize} +\end{block} +\end{minipage}\qquad +\begin{minipage}[t]{.46\textwidth} +\begin{block}{Verifying Programs} +\begin{itemize} +\item are written in meta-language +\item they produce a separate proof for each run +\item only certain that current run has properties +\item allow more flexibility, \eg fancy heuristics +\item good pragmatic solution +\item shallow embedding fine +\end{itemize} +\end{block} +\end{minipage} +\end{frame} + + +\begin{frame} +\frametitle{Summary Deep vs.\ Shallow Embeddings} +\begin{itemize} +\item deep embeddings require more work +\item they however allow reasoning about syntax +\begin{itemize} +\item induction and case-splits possible +\item a semantic subset can be carved out syntactically +\end{itemize} +\item syntax sometimes hard to define for deep embeddings +\item combinations of deep and shallow embeddings common +\begin{itemize} +\item certain parts are deeply embedded +\item others are embedded shallowly +\end{itemize} +\end{itemize} +\end{frame} + + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/13_rewriting.tex b/lectures/13_rewriting.tex new file mode 100644 index 0000000..c1b7617 --- /dev/null +++ b/lectures/13_rewriting.tex @@ -0,0 +1,1208 @@ +\part{Rewriting} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{Rewriting in HOL} + +\begin{itemize} +\item simplification via rewriting was already a strength of Edinburgh LCF +\item it was further improved for Cambridge LCF +\item HOL inherited this powerful rewriter +\item equational reasoning is still the main workhorse +\item there are many different equational reasoning tools in HOL +\begin{itemize} +\item \hol{Rewrite} library\\ +inherited from Cambridge LCF\\you have seen it in the form of \hol{REWRITE\_TAC} +\item \hol{computeLib} --- fast evaluation\\ +build for speed, optimised for ground terms\\seen in the form of \hol{EVAL} +\item \hol{simpLib} --- Simplification\\ +sophisticated rewrite engine, HOL's main workhorse\\ +not discussed in this lecture, yet +\item \ldots +\end{itemize} +\end{itemize} +\end{frame} + + +\section{Rewrite Library} + +\begin{frame} +\frametitle{Semantic Foundations} +\begin{itemize} +\item we have seen primitive inference rules for equality before + +\begin{columns} +\begin{column}{.35\textwidth} +\begin{center} +$\inferrule*[right=COMB]{\Gamma \entails s = t\\\Delta \entails u = v \\\\ \textit{types fit}}{\Gamma \cup \Delta \entails s(u) = t(v)}$\\[1em] +$\inferrule*[right=TRANS] {\Gamma \entails s = t\\\Delta \entails t = u}{\Gamma \cup \Delta \entails s = u}$\\[1em] +\end{center} +\end{column} +\begin{column}{.25\textwidth} +\begin{center} +$\inferrule*[right=ABS]{\Gamma \entails s = t\\x\ \textit{not free in}\ \Gamma}{\Gamma \entails \lambda{}x.\ s = \lambda{}x.\ t}$\\[1em] +$\inferrule* [right=REFL] {\ }{\entails t = t}$\\[1em] +\end{center} +\end{column} +\end{columns}\medskip +\item these rules allow us to replace any subterm with an equal one +\item this is the core of rewriting +\end{itemize} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Conversions} +\begin{itemize} +\item in HOL, equality reasoning is implemented by \emph{conversions} +\item a conversion is a SML function of type \hol{term -> thm} +\item given a term \hol{t}, a conversion +\begin{itemize} +\item produces a theorem of the form \hol{|- t = t'} +\item raises an \hol{UNCHANGED} exception or +\item fails, \ie raises an \hol{HOL\_ERR} exception +\end{itemize} +\end{itemize} +\begin{exampleblock}{Example} +\begin{semiverbatim}\scriptsize +> \hol{BETA\_CONV ``(\textbsl{}x. SUC x) y``} +val it = |- (\textbsl{}x. SUC x) y = SUC y + +> \hol{BETA\_CONV ``SUC y``} +Exception-HOL_ERR ... raised + +> \hol{REPEATC BETA\_CONV ``SUC y``} +Exception- UNCHANGED raised +\end{semiverbatim} +\end{exampleblock} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Conversionals} +\begin{itemize} +\item similar to tactics and tacticals there are \emph{conversionals} for conversions +\item conversionals allow building conversions from simpler ones +\item there are many of them +\begin{itemize} +\item \hol{THENC} +\item \hol{ORELSEC} +\item \hol{REPEATC} +\item \hol{TRY\_CONV} +\item \hol{RAND\_CONV} +\item \hol{RATOR\_CONV} +\item \hol{ABS\_CONV} +\item \ldots +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Depth Conversionals} +\begin{itemize} +\item for rewriting depth-conversionals are important +\item a depth-conversional applies a conversion to all subterms +\item there are many different ones +\begin{itemize} +\item \hol{ONCE\_DEPTH\_CONV c} --- top down, applies \hol{c} once at highest possible positions in distinct subterms +\item \hol{TOP\_SWEEP\_CONV c} --- top down, like \hol{ONCE\_DEPTH\_CONV}, but continues processing rewritten terms +\item \hol{TOP\_DEPTH\_CONV c} --- top down, like \hol{TOP\_SWEEP\_CONV}, but try top-level again after change +\item \hol{DEPTH\_CONV c} --- bottom up, recurse over subterms, then apply \hol{c} repeatedly at top-level +\item \hol{REDEPTH\_CONV c} --- bottom up, like \hol{DEPTH\_CONV}, but revisits subterms +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{\hol{REWR\_CONV}} +\begin{itemize} +\item it remains to rewrite terms at top-level +\item this is achieved by \hol{REWR\_CONV} +\item given a term \hol{t} and a theorem \hol{|- t1 = t2}, \texttt{REWR\_CONV t thm} +\begin{itemize} +\item searches an instantiation of term and type variables such that \hol{t1} becomes $\alpha$-equivalent to \hol{t} +\item fails, if no instantiation is found +\item otherwise, instantiate the theorem and get \hol{|- t1' = t2'} +\item return theorem \hol{|- t = t2'} +\end{itemize} +\begin{exampleblock}{Example}\scriptsize +term \hol{LENGTH [1;2;3]}, theorem \hol{|- LENGTH ((x:'a)::xs) = SUC (LENGTH xs)}\\ +found type instantiation: \hol{[``:'a`` |-> ``:num``]}\\ +found term instantiation: \hol{[``x:num`` |-> ``1``; ``xs`` |-> ``[2;3]``]}\\ +returned theorem: \hol{|- LENGTH [1;2;3] = SUC (LENGTH [2;3])} +\end{exampleblock} + +\item the tricky part is finding the instantiation +\item this problem is called the (term) \emph{matching} problem +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Term Matching} +\begin{itemize} +\item given term \hol{t\_org} and a term \hol{t\_goal} try to find +\begin{itemize} +\item type substitution \hol{ty\_s} +\item term substitution \hol{tm\_s} +\end{itemize} +\item such that \hol{subst tm\_s (inst ty\_s t\_org) \aequiv t\_goal} +\item this can be easily implemented by a recursive search +\bigskip + +{\small +\begin{tabular}{lll} +\emph{\texttt{t\_org}} & \emph{\texttt{t\_goal}} & \emph{action} \\ +\texttt{t1\_org t2\_org} & \texttt{t1\_goal t2\_goal} & recurse \\ +\texttt{t1\_org t2\_org} & otherwise & fail \\ +\texttt{\textbsl{}x.\ t\_org x} & \texttt{\textbsl{}y.\ t\_goal y} & match types of \texttt{x}, \texttt{y} and recurse \\ +\texttt{\textbsl{}x.\ t\_org x} & otherwise & fail \\ +\texttt{const} & same \texttt{const} & match types \\ +\texttt{const} & otherwise & fail \\ +\texttt{var} & anything & try to bind \texttt{var}, \\ & & take care of existing bindings +\end{tabular} +} +\end{itemize} +\end{frame} + + + +\begin{frame} +\frametitle{Examples Term Matching} + +{\scriptsize +\begin{tabular}{lll} +\emph{\texttt{t\_org}} & \emph{\texttt{t\_goal}} & \emph{substs}\\ +\texttt{LENGTH ((x:'a)::xs)} & \texttt{LENGTH [1;2;3]} & + \texttt{'a $\to$ num}, + \texttt{x $\to$ 1}, + \texttt{xs $\to$ [2;3]} \\ +\texttt{[]:'a list} & \texttt{[]:'b list} & + \texttt{'a $\to$ 'b} \\ +\texttt{0} & \texttt{0} & + \texttt{empty substitution} \\ +\texttt{b \holAnd{} T} & \texttt{(P (x:'a) ==> Q) \holAnd{} T} & + \texttt{b $\to$ P x ==> Q} \\ +\texttt{b \holAnd{} b} & \texttt{P x \holAnd{} P x} & + \texttt{b $\to$ P x} \\ +\texttt{b \holAnd{} b} & \texttt{P x \holAnd{} P y} & + fail \\ +\texttt{!x:num.\ P x \holAnd{} Q x} & \texttt{!y:num.\ P' y \holAnd{} Q' y} & + \texttt{P $\to$ P'}, + \texttt{Q $\to$ Q'} \\ +\texttt{!x:num.\ P x \holAnd{} Q x} & \texttt{!y.\ (2 = y) \holAnd{} Q' y} & + \texttt{P $\to$ (\$= 2)}, + \texttt{Q $\to$ Q'} \\ +\texttt{!x:num.\ P x \holAnd{} Q x} & \texttt{!y.\ (y = 2) \holAnd{} Q' y} & + fail +\end{tabular} +} +\bigskip + +\begin{itemize} +\item it is often very annoying that the last match in the list above fails +\item it prevents us for example rewriting \hol{!y.\ (2 = y) \holAnd{} Q y} to\\ + \hol{(!y.\ (2=y)) \holAnd{} (!y.\ Q y)} + \item Can we do better? Yes, with higher order (term) matching. +\end{itemize} + +\end{frame} + + +\begin{frame} +\frametitle{Higher Order Term Matching} + +\begin{itemize} +\item term matching searches for substitutions such that \texttt{t\_org} becomes $\alpha$-equivalent to \texttt{t\_goal} +\item \emph{higher order term matching} searches for substitutions such that \texttt{t\_org} becomes \texttt{t\_subst} such that the $\beta\eta$-normalform of \texttt{t\_subst} is $\alpha$-equivalent equivalent to $\beta\eta$-normalform of \texttt{t\_goal}, \ie + +\textbf{higher order term matching is aware of the semantics of $\lambda$} +\bigskip + +$\begin{array}{ll} +\beta\text{-reduction} & (\lambda x.\ f)\ y = f [y/x] \\ +\eta\text{-conversion} & (\lambda x.\ f\ x) = f \text{ where $x$ is not free in $f$} +\end{array}$\bigskip +\item the HOL implementation expects \texttt{t\_org} to be a \emph{higher-order pattern} +\begin{itemize} +\item \texttt{t\_org} is $\beta$-reduced +\item if \texttt{X} is a variable that should be instantiated, then all arguments should be + distinct variables +\end{itemize} +\item for other forms of \texttt{t\_org}, HOL's implementation might fail +\item higher order matching is used by \ml{HO\_REWR\_CONV} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Examples Higher Order Term Matching} + +{\scriptsize +\begin{tabular}{lll} +\emph{\texttt{t\_org}} & \emph{\texttt{t\_goal}} & \emph{substs}\\ +\texttt{!x:num.\ P x \holAnd{} Q x} & \texttt{!y.\ (y = 2) \holAnd{} Q' y} & + \texttt{P $\to$ (\textbsl{}y.\ y = 2)}, + \texttt{Q $\to$ Q'} \\ +\texttt{!x.\ P x \holAnd{} Q x} & \texttt{!x.\ P x \holAnd{} Q x \holAnd{} Z x} & + \texttt{Q $\to$ \textbsl{}x.\ Q x \holAnd{} Z x} \\ +\texttt{!x.\ P x \holAnd{} Q} & \texttt{!x.\ P x \holAnd{} Q x} & + \text{fails} \\ +\texttt{!x.\ P (x, x)} & \texttt{!x.\ Q x} & + \text{fails} \\ +\texttt{!x.\ P (x, x)} & \texttt{!x.\ FST (x,x) = SND (x,x)} & + \texttt{P $\to$ \textbsl{}xx.\ FST xx = SND xx} +\end{tabular}} + +\bottomstatement{Don't worry, it might look complicated, but\\in practice it is easy to get a feeling for higher order matching.} +\end{frame} + +\begin{frame} +\frametitle{\ml{Rewrite} Library} + +\begin{itemize} +\item the rewrite library combines \hol{REWR\_CONV} with depth conversions +\item there are many different conversions, rules and tactics +\item at their core, they all work very similarly +\begin{itemize} +\item given a list of theorems, a set of rewrite theorems is derived +\begin{itemize} +\item split conjunctions +\item remove outermost universal quantification +\item introduce equations by adding \hol{= T} (or \hol{= F}) if needed +\end{itemize} +\item \texttt{REWR\_CONV} is applied to all the resulting rewrite theorems +\item a depth-conversion is used with resulting conversion +\end{itemize} +\item for performance reasons an efficient indexing structure is used +\item by default implicit rewrites are added +\end{itemize} + +\end{frame} + +\begin{frame} +\frametitle{\ml{Rewrite} Library II} + +\begin{itemize} +\item \hol{REWRITE\_CONV} +\item \hol{REWRITE\_RULE} +\item \hol{REWRITE\_TAC} +\item \hol{ASM\_REWRITE\_TAC} +\item \hol{ONCE\_REWRITE\_TAC} +\item \hol{PURE\_REWRITE\_TAC} +\item \hol{PURE\_ONCE\_REWRITE\_TAC} +\item \ldots +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{\ml{Ho\_Rewrite} Library} + +\begin{itemize} +\item similar to \ml{Rewrite} lib, but uses higher order matching +\item internally uses \ml{HO\_REWR\_CONV} +\item similar conversions, rules and tactics as \ml{Rewrite} lib +\begin{itemize} +\item \hol{Ho\_Rewrite.REWRITE\_CONV} +\item \hol{Ho\_Rewrite.REWRITE\_RULE} +\item \hol{Ho\_Rewrite.REWRITE\_TAC} +\item \hol{Ho\_Rewrite.ASM\_REWRITE\_TAC} +\item \hol{Ho\_Rewrite.ONCE\_REWRITE\_TAC} +\item \hol{Ho\_Rewrite.PURE\_REWRITE\_TAC} +\item \hol{Ho\_Rewrite.PURE\_ONCE\_REWRITE\_TAC} +\item \ldots +\end{itemize} +\end{itemize} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Examples \ml{Rewrite} and \ml{Ho\_Rewrite} Library} + +\begin{semiverbatim}\scriptsize +> \hol{REWRITE\_CONV [LENGTH] ``LENGTH [1;2]``} +val it = |- LENGTH [1; 2] = SUC (SUC 0) + +> \hol{ONCE\_REWRITE\_CONV [LENGTH] ``LENGTH [1;2]``} +val it = |- LENGTH [1; 2] = SUC (LENGTH [2]) + +> \hol{REWRITE\_CONV [] ``A \holAnd{} A \holAnd{} \holNeg{}A``} +Exception- UNCHANGED raised + +> \hol{PURE\_REWRITE\_CONV [NOT\_AND] ``A \holAnd{} A \holAnd{} \holNeg{}A``} +val it = |- A \holAnd{} A \holAnd{} \holNeg{}A <=> A \holAnd{} F + +> \hol{REWRITE\_CONV [NOT\_AND] ``A \holAnd{} A \holAnd{} \holNeg{}A``} +val it = |- A \holAnd{} A \holAnd{} \holNeg{}A <=> F + +> \hol{REWRITE\_CONV [FORALL_AND_THM] ``!x. P x \holAnd{} Q x \holAnd{} R x``} +Exception- UNCHANGED raised + +> \hol{Ho_Rewrite.REWRITE\_CONV [FORALL_AND_THM] ``!x. P x \holAnd{} Q x \holAnd{} R x``} +val it = |- !x. P x \holAnd{} Q x \holAnd{} R x <=> (!x. P x) \holAnd{} (!x. Q x) \holAnd{} (!x. R x) +\end{semiverbatim} +\end{frame} + + +\begin{frame} +\frametitle{Summary \ml{Rewrite} and \ml{Ho\_Rewrite} Library} + +\begin{itemize} +\item the \ml{Rewrite} and \ml{Ho\_Rewrite} library provide powerful infrastructure for term rewriting +\item thanks to clever implementations they are reasonably efficient +\item basics are easily explained +\item however, efficient usage needs some experience +\end{itemize} +\end{frame} + + +\section{Term Rewriting Systems} + +\begin{frame} +\frametitle{Term Rewriting Systems} + +\begin{itemize} +\item to use rewriting efficiently, one needs to understand about term rewriting systems +\item this is a large topic +\item unluckily, it cannot be covered here in detail for time constraints +\item however, in practise you quickly get a feeling +\item important points in practise +\begin{itemize} +\item ensure termination of your rewrites +\item make sure they work nicely together +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Term Rewriting Systems --- Termination} + +\begin{block}{Theory} +\begin{itemize} +\item choose well-founded order $\prec$ +\item for each rewrite theorem \hol{|- t1 = t2} ensure \hol{t2 $\prec$ t1} +\end{itemize} +\end{block} + +\begin{block}{Practice} +\begin{itemize} +\item informally define for yourself what \emph{simpler} means +\item ensure each rewrite makes terms simpler +\item good heuristics +\begin{itemize} +\item subterms are simpler than whole term +\item use an order on functions +\end{itemize} +\end{itemize} +\end{block} + +\end{frame} + + +\begin{frame} +\frametitle{Termination --- Subterm examples} + +\begin{itemize} +\item a proper subterm is always simpler +\begin{itemize} +\item \hol{!l.\ APPEND [] l = l} +\item \hol{!n.\ n + 0 = n} +\item \hol{!l.\ REVERSE (REVERSE l) = l} +\item \hol{!t1 t2.\ if T then t1 else t2 <=> t1} +\item \hol{!n.\ n * 0 = 0} +\end{itemize}\medskip +\item the right hand side should not use extra vars, throwing parts away is usually simpler +\begin{itemize} +\item \hol{!x xs.\ (SNOC x xs = []) = F} +\item \hol{!x xs.\ LENGTH (x::xs) = SUC (LENGTH xs)} +\item \hol{!n x xs.\ DROP (SUC n) (x::xs) = DROP n xs} +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Termination --- use simpler terms} + +\begin{itemize} +\item it is useful to consider some functions simple and other complicated +\item replace complicated ones with simple ones +\item never do it in the opposite direction +\item clear examples +\begin{itemize} +\item \hol{|- !m n.\ MEM m (COUNT\_LIST n) <=> (m < n)} +\item \hol{|- !ls n.\ (DROP n ls = []) <=> (n >= LENGTH ls)} +\end{itemize}\medskip +\item unclear example +\begin{itemize} +\item \hol{|- !L.\ REVERSE L = REV L []} +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Termination --- Normalforms} + +\begin{itemize} +\item some equations can be used in both directions +\item one should decide on one direction +\item this implicitly defines a \emph{normalform} one wants terms to be in +\item examples +\begin{itemize} +\item \hol{|- !f l.\ MAP f (REVERSE l) = REVERSE (MAP f l)} +\item \hol{|- !l1 l2 l3.\ l1 ++ (l2 ++ l3) = l1 ++ l2 ++ l3} +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Termination --- Problematic rewrite rules} + +\begin{itemize} +\item some equations immediately lead to non-termination, \eg +\begin{itemize} +\item \hol{|- !m n.\ m + n = n + m} +\item \hol{|- !m.\ m = m + 0} +\end{itemize}\medskip +\item slightly more subtle are rules like +\begin{itemize} +\item \hol{|- !n.\ fact n = if (n = 0) then 1 else n * fact(n-1)} +\end{itemize}\medskip +\item often combination of multiple rules leads to non-termination\\ + this is especially problematic when adding to predefined sets of rewrites +\begin{itemize} +\item \hol{|- !m n p.\ m + (n + p) = (m + n) + p} and \\ + \hol{|- !m n p.\ (m + n) + p = m + (n + p)} +\end{itemize}\medskip +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Rewrites working together} + +\begin{itemize} +\item rewrite rules should not compete with each other +\item if a term \hol{ta} can be rewritten to \hol{ta1} and \hol{ta2} applying different rewrite rules, then \hol{ta1} and \hol{ta2} it should be possible to further rewrite them both to a common \hol{tb} +\item this can often be achieved by adding extra rewrite rules +\end{itemize} + +\begin{exampleblock}{Example} +Assume we have the rewrite rules \hol{|- DOUBLE n = n + n} and\\ +\hol{|- EVEN (DOUBLE n) = T}.\\ +With these the term \hol{EVEN (DOUBLE 2)} can be rewritten to +\begin{itemize} +\item \hol{T} or +\item \hol{EVEN (2 + 2)}. +\end{itemize} +To avoid a hard to predict result, \hol{EVEN (2+2)} should be rewritten to \hol{T}. Adding an extra rewrite rule \hol{|- EVEN (n + n) = T} achieves this. +\end{exampleblock} + +\end{frame} + + +\begin{frame} +\frametitle{Rewrites working together II} +\begin{itemize} +\item to design rewrite systems that work well, normalforms are vital +\item a term is in \emph{normalform}, if it cannot be rewritten any further +\item one should have a clear idea what the normalform of common terms looks like +\item all rules should work together to establish this normalform +\item the right-hand-side of each rule should be in normalform +\item the left-hand-side should not be simplifiable by any other rule +\item the order in which rules are applied should not influence the final result +\end{itemize} +\end{frame} + + +\section{\texttt{computeLib}} + +\begin{frame} +\frametitle{\hol{computeLib}} + +\begin{itemize} +\item \hol{computeLib} is the library behind \hol{EVAL} +\item it is a rewriting library designed for evaluating ground terms (\ie terms without variables) efficiently +\item it uses a call-by-value strategy similar to SML's +\item it uses first order term matching +\item it performs $\beta$ reduction in addition to rewrites +\end{itemize} + +\end{frame} + + +\begin{frame} +\frametitle{\hol{compset}} + +\begin{itemize} +\item \hol{computeLib} uses \hol{compset}s to store its rewrites +\item a \hol{compset} stores +\begin{itemize} +\item rewrite rules +\item extra conversions +\end{itemize} +\item the extra conversions are guarded by a term pattern for efficiency +\item users can define their own compsets +\item however, \hol{computeLib} maintains one special compset called \hol{the\_compset} +\item \hol{the\_compset} is used by \hol{EVAL} +\end{itemize} + +\end{frame} + + +\begin{frame} +\frametitle{\hol{EVAL}} + +\begin{itemize} +\item \hol{EVAL} uses \hol{the\_compset} +\item tools like the \hol{Datatype} or \hol{TFL} libraries automatically extend \hol{the\_compset} +\item this way, \hol{EVAL} knows about (nearly) all types and functions +\item one can extended \hol{the\_compset} manually as well +\item rewrites exported by \hol{Define} are good for ground terms but may lead to non-termination for non-ground terms +\item \hol{zDefine} prevents \hol{TFL} from automatically extending \hol{the\_compset} +\end{itemize} +\end{frame} + + +\section{\texttt{simpLib}} + +\begin{frame} +\frametitle{\hol{simpLib}} + +\begin{itemize} +\item \hol{simpLib} is a sophisticated rewrite engine +\item it is HOL's main workhorse +\item it provides +\begin{itemize} +\item higher order rewriting +\item usage of context information +\item conditional rewriting +\item arbitrary conversions +\item support for decision procedures +\item simple heuristics to avoid non-termination +\item fancier preprocessing of rewrite theorems +\item \ldots +\end{itemize} +\item it is very powerful, but compared to \hol{Rewrite} lib sometimes slow +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Basic Usage I} + +\begin{itemize} +\item \hol{simpLib} uses \emph{simpsets} +\item simpsets are special datatypes storing +\begin{itemize} +\item rewrite rules +\item conversions +\item decision procedures +\item congruence rules +\item \ldots +\end{itemize} +\item in addition there are simpset-fragments +\item simpset-fragments contain similar information as simpsets +\item fragments can be added to and removed from simpsets +\item common usage: basic simpset combined with one or more simpset-fragments, \eg + \begin{itemize} + \item \hol{list\_ss ++ pairSimps.gen\_beta\_ss} + \item \hol{std\_ss ++ QI\_ss} + \item \ldots + \end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Basic Usage II} + +\begin{itemize} +\item a call to the simplifier takes as arguments +\begin{itemize} +\item a simpset +\item a list of rewrite theorems +\end{itemize} +\item common high-level entry points are +\begin{itemize} +\item \hol{SIMP\_CONV ss thmL} --- conversion +\item \hol{SIMP\_RULE ss thmL} --- rule +\item \hol{SIMP\_TAC ss thmL} --- tactic without considering assumptions +\item \hol{ASM\_SIMP\_TAC ss thmL} --- tactic using assumptions to simplify goal +\item \hol{FULL\_SIMP\_TAC ss thmL} --- tactic simplifying assumptions with each other and goal with assumptions +\item \hol{REV\_FULL\_SIMP\_TAC ss thmL} --- similar to \texttt{FULL\_SIMP\_TAC} but with reversed order of assumptions +\end{itemize} +\item there are many derived tools not discussed here +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Basic Simplifier Examples} + +\begin{semiverbatim}\scriptsize +> \hol{SIMP_CONV bool_ss [LENGTH] ``LENGTH [1;2]``} +val it = |- LENGTH [1; 2] = SUC (SUC 0) + +> \hol{SIMP_CONV std_ss [LENGTH] ``LENGTH [1;2]``} +val it = |- LENGTH [1; 2] = 2 + +> \hol{SIMP_CONV list_ss [] ``LENGTH [1;2]``} +val it = |- LENGTH [1; 2] = 2 +\end{semiverbatim} +\end{frame} + +\begin{frame}[fragile] +\frametitle{\hol{FULL\_SIMP\_TAC} Example} + +\begin{exampleblock}{Current GoalStack} +\begin{semiverbatim}\scriptsize +P (SUC (SUC x0)) (SUC (SUC y0)) +------------------------------------ + 0. SUC y1 = y2 + 1. x1 = SUC x0 + 2. y1 = SUC y0 + 3. SUC x1 = x2 +\end{semiverbatim} +\end{exampleblock} + +\begin{exampleblock}{Action} +\begin{semiverbatim}\scriptsize +FULL_SIMP_TAC std_ss [] +\end{semiverbatim} +\end{exampleblock} + +\begin{exampleblock}{Resulting GoalStack} +\begin{semiverbatim}\scriptsize +P (SUC (SUC x0)) y2 +------------------------------------ + 0. SUC (SUC y0) = y2 + 1. x1 = SUC x0 + 2. y1 = SUC y0 + 3. SUC x1 = x2 +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{\hol{REV\_FULL\_SIMP\_TAC} Example} + +\begin{exampleblock}{Current GoalStack} +\begin{semiverbatim}\scriptsize +P (SUC (SUC x0)) y2 +------------------------------------ + 0. SUC (SUC y0) = y2 + 1. x1 = SUC x0 + 2. y1 = SUC y0 + 3. SUC x1 = x2 +\end{semiverbatim} +\end{exampleblock} + +\begin{exampleblock}{Action} +\begin{semiverbatim}\scriptsize +REV_FULL_SIMP_TAC std_ss [] +\end{semiverbatim} +\end{exampleblock} + +\begin{exampleblock}{Resulting GoalStack} +\begin{semiverbatim}\scriptsize +P x2 y2 +------------------------------------ + 0. SUC (SUC y0) = y2 + 1. x1 = SUC x0 + 2. y1 = SUC y0 + 3. SUC (SUC x0) = x2 +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Common simpsets} + +\begin{itemize} +\item \hol{pure\_ss} --- empty simpset +\item \hol{bool\_ss} --- basic simpset +\item \hol{std\_ss} --- standard simpset +\item \hol{arith\_ss} --- arithmetic simpset +\item \hol{list\_ss} --- list simpset +\item \hol{real\_ss} --- real simpset +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Common simpset-fragments} + +\begin{itemize} +\item many theories and libraries provide their own simpset-fragments +\item \hol{PRED\_SET\_ss} --- simplify sets +\item \hol{STRING\_ss} --- simplify strings +\item \hol{QI\_ss} --- extra quantifier instantiations +\item \hol{gen\_beta\_ss} --- $\beta$ reduction for pairs +\item \hol{ETA\_ss} --- $\eta$ conversion +\item \hol{EQUIV\_EXTRACT\_ss} --- extract common part of equivalence +\item \hol{CONJ\_ss} --- use conjunctions for context +\item \hol{LIFT\_COND\_ss} --- lifting if-then-else +\item \ldots +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Build-In Conversions and Decision Procedures} + +\begin{itemize} +\item in contrast to \hol{Rewrite} lib the simplifier can +run arbitrary conversions +\item most common and useful conversion is probably $\beta$-reduction +\item \hol{std\_ss} has support for basic arithmetic and numerals +\item it also has simple, syntactic conversions for instantiating quantifiers +\begin{itemize} +\item \hol{!x. ... \holAnd{} (x = c) \holAnd{} ... ==> ...} +\item \hol{!x. ... \holOr{} \holNeg(x = c) \holOr{} ...} +\item \hol{?x. ... \holAnd{} (x = c) \holAnd{} ...} +\end{itemize} + +\item besides very useful conversions, there are decision procedures as well +\item the most frequently used one is probably the arithmetic decision procedure you already know from \hol{DECIDE} + +\end{itemize} + + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Examples I} +\begin{semiverbatim}\scriptsize +> \hol{SIMP_CONV std_ss [] ``(\textbsl{}x. x + 2) 5``} +val it = |- (\textbsl{}x. x + 2) 5 = 7 + +> \hol{SIMP_CONV std_ss [] ``!x. Q x \holAnd{} (x = 7) ==> P x``} +val it = |- (!x. Q x \holAnd{} (x = 7) ==> P x) <=> (Q 7 ==> P 7)`` + +> \hol{SIMP_CONV std_ss [] ``?x. Q x \holAnd{} (x = 7) \holAnd{} P x``} +val it = |- (?x. Q x \holAnd{} (x = 7) \holAnd{} P x) <=> (Q 7 \holAnd{} P 7)`` + +> \hol{SIMP_CONV std_ss [] ``x > 7 ==> x > 5``} +Exception- UNCHANGED raised + +> \hol{SIMP_CONV arith_ss [] ``x > 7 ==> x > 5``} +val it = |- (x > 7 ==> x > 5) <=> T +\end{semiverbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Higher Order Rewriting} + +\begin{itemize} +\item the simplifier supports higher order rewriting +\item this is often very handy +\item for example it allows moving quantifiers around easily +\end{itemize} + +\begin{exampleblock}{Examples} +\begin{semiverbatim}\scriptsize +> \hol{SIMP_CONV std_ss [FORALL_AND_THM] ``!x. P x \holAnd{} Q \holAnd{} R x``} +val it = |- (!x. P x \holAnd{} Q \holAnd{} R x) <=> + (!x. P x) \holAnd{} Q \holAnd{} (!x. R x) + +> \hol{SIMP_CONV std_ss [GSYM RIGHT_EXISTS_AND_THM, GSYM LEFT_FORALL_IMP_THM] + ``!y. (P y \holAnd{} (?x. y = SUC x)) ==> Q y``} +val it = |- (!y. P y \holAnd{} (?x. y = SUC x) ==> Q y) <=> + !x. P (SUC x) ==> Q (SUC x) +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Context} + +\begin{itemize} +\item a great feature of the simplifier is that it can use context information +\item by default simple context information is used like +\begin{itemize} +\item the precondition of an implication +\item the condition of \hol{if-then-else} +\end{itemize} +\item one can configure which context to use via congruence rules +\begin{itemize} +\item \eg by using \hol{CONJ\_ss} one can easily use context of conjunctions +\item warning: using \hol{CONJ\_ss} can be slow +\end{itemize} +\item using context often simplifies proofs drastically +\begin{itemize} +\item using \hol{Rewrite} lib, often a goal needs to be split and a precondition moved to the assumptions +\item then \hol{ASM\_REWRITE\_TAC} can be used +\item with \hol{SIMP\_TAC} there is no need to split the goal +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Context Examples} + +\begin{semiverbatim}\scriptsize +> \hol{SIMP_CONV std_ss [] ``((l = []) ==> P l) \holAnd{} Q l``} +val it = |- ((l = []) ==> P l) \holAnd{} Q l <=> + ((l = []) ==> P []) \holAnd{} Q l + +> \hol{SIMP_CONV arith_ss [] ``if (c \holAnd{} x < 5) then (P c \holAnd{} x < 6) else Q c``} +val it = |- (if c \holAnd{} x < 5 then P c \holAnd{} x < 6 else Q c) <=> + if c \holAnd{} x < 5 then P T else Q c: + +> \hol{SIMP_CONV std_ss [] ``P x \holAnd{} (Q x \holAnd{} P x ==> Z x)``} +Exception- UNCHANGED raised + +> \hol{SIMP_CONV (std_ss++boolSimps.CONJ_ss) [] ``P x \holAnd{} (Q x \holAnd{} P x ==> Z x)``} +val it = |- P x \holAnd{} (Q x \holAnd{} P x ==> Z x) <=> P x \holAnd{} (Q x ==> Z x)\end{semiverbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Conditional Rewriting I} + +\begin{itemize} +\item perhaps the most powerful feature of the simplifier is that it supports conditional rewriting +\item this means it allows \emph{conditional} rewrite theorems of the form\\ + \hol{|- cond ==> (t1 = t2)} +\item if the simplifier finds a term \hol{t1'} it can rewrite via \hol{t1 = t2} to \hol{t2'}, it tries to discharge the assumption \hol{cond'} +\item for this, it calls itself recursively on \hol{cond'} +\begin{itemize} +\item all the decision procedures and all context information is used +\item conditional rewriting can be used +\item to prevent divergence, there is a limit on recursion depth +\end{itemize} +\item if \hol{cond' = T} can be shown, \hol{t1'} is rewritten to \hol{t2'} +\item otherwise \hol{t1'} is not modified +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Conditional Rewriting Example} + +\begin{itemize} +\item consider the conditional rewrite theorem \\\hol{!l n.\ LENGTH l <= n ==> (DROP n l = [])} +\item let's assume we want to prove \\\hol{(DROP 7 [1;2;3;4]) ++ [5;6;7] = [5;6;7]} +\item we can without conditional rewriting +\begin{itemize} +\item show \hol{|- LENGTH [1;2;3;4] <= 7} +\item use this to discharge the precondition of the rewrite theorem +\item use the resulting theorem to rewrite the goal +\end{itemize} +\item with conditional rewriting, this is all automated +\begin{semiverbatim} +> \hol{SIMP_CONV list_ss [DROP_LENGTH_TOO_LONG] + ``(DROP 7 [1;2;3;4]) ++ [5;6;7]``} +val it = |- DROP 7 [1; 2; 3; 4] ++ [5; 6; 7] = [5; 6; 7] +\end{semiverbatim} +\item conditional rewriting often shortens proofs considerably +\end{itemize} + +\end{frame} + +\begin{frame}[fragile] +\frametitle{Conditional Rewriting Example II} + +\begin{block}{Proof with Rewrite} +\begin{semiverbatim}\scriptsize +prove (``(DROP 7 [1;2;3;4]) ++ [5;6;7] = [5;6;7]``, +`DROP 7 [1;2;3;4] = []` by ( + MATCH_MP_TAC DROP_LENGTH_TOO_LONG >> + REWRITE_TAC[LENGTH] >> + DECIDE_TAC +) >> +ASM_REWRITE_TAC[APPEND]) +\end{semiverbatim} +\end{block} + +\begin{block}{Proof with Simplifier} +\begin{semiverbatim}\scriptsize +prove (``(DROP 7 [1;2;3;4]) ++ [5;6;7] = [5;6;7]``, +SIMP_TAC list_ss []) +\end{semiverbatim} +Notice that \hol{DROP\_LENGTH\_TOO\_LONG} is part of \hol{list\_ss}. +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Conditional Rewriting II} + +\begin{itemize} +\item conditional rewriting is a very powerful technique +\item decision procedures and sophisticated rewrites can be used to discharge preconditions without cluttering proof state +\item it provides a powerful search for theorems that apply +\item however, if used naively, it can be slow +\item moreover, to work well, rewrite theorems need to of a special form +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Conditional Rewriting Pitfalls I} + +\begin{itemize} +\item if the pattern is too general, the simplifier becomes very slow +\item consider the following, trivial but hopefully educational example +\begin{minipage}{.85\textwidth} +\begin{exampleblock}{Looping example} +\begin{semiverbatim}\scriptsize +> \hol{val my_thm = prove (``~P ==> (P = F)``, PROVE_TAC[])} +> \hol{time (SIMP_CONV std_ss [my_thm]) ``P1 \holAnd{} P2 \holAnd{} P3 \holAnd{} ... \holAnd{} P10``} +runtime: 0.84000s, gctime: 0.02400s, systime: 0.02400s. +Exception- UNCHANGED raised + +> \hol{time (SIMP_CONV std_ss []) ``P1 \holAnd{} P2 \holAnd{} P3 \holAnd{} ... \holAnd{} P10``} +runtime: 0.00000s, gctime: 0.00000s, systime: 0.00000s. +Exception- UNCHANGED raised +\end{semiverbatim} +\end{exampleblock} +\end{minipage} +\begin{itemize} +\item notice that the rewrite is applied at plenty of places (quadratic in number of conjuncts) +\item notice that each backchaining triggers many more backchainings +\item each has to be aborted to prevent diverging +\item as a result, the simplifier becomes very slow +\item incidentally, the conditional rewrite is useless +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Conditional Rewriting Pitfalls II} + +\begin{itemize} +\item good conditional rewrites \hol{|- c ==> (l = r)} should mention only variables in \hol{c} that appear in \hol{l} +\item if \hol{c} contains extra variables \hol{x1 ... xn}, the conditional rewrite engine has to search instantiations for them +\item this mean that conditional rewriting is trying discharge the precondition \hol{?x1 ... xn.\ c} +\item the simplifier is usually not able to find such instances + +\begin{exampleblock}{Transitivity} +\begin{semiverbatim}\scriptsize +> \hol{val P_def = Define `P x y = x < y`;} +> \hol{val my_thm = prove (``!x y z. P x y ==> P y z ==> P x z``, ...)} +> \hol{SIMP_CONV arith_ss [my_thm] ``P 2 3 \holAnd{} P 3 4 ==> P 2 4``} +Exception- UNCHANGED raised + +(* However transitivity of < build in via decision procedure *) +> \hol{SIMP_CONV arith_ss [P_def] ``P 2 3 \holAnd{} P 3 4 ==> P 2 4``} +val it = |- P 2 3 \holAnd{} P 3 4 ==> P 2 4 <=> T: +\end{semiverbatim} +\end{exampleblock} +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Conditional Rewriting Pitfalls III} + +\begin{itemize} +\item let's look in detail why \hol{SIMP\_CONV} did not make progress above +\end{itemize} + +\begin{semiverbatim}\scriptsize +> \hol{set_trace "simplifier" 2;} +> \hol{SIMP_CONV arith_ss [my_thm] ``P 2 3 \holAnd{} P 3 4 ==> P 2 4``} +[468000]: more context: |- !x y z. P x y ==> P y z ==> P x z +[468000]: New rewrite: |- (?y. P x y \holAnd{} P y z) ==> (P x z <=> T) +... +[584000]: more context: [.] |- P 2 3 \holAnd{} P 3 4 +[584000]: New rewrite: [.] |- P 2 3 <=> T +[584000]: New rewrite: [.] |- P 3 4 <=> T +[588000]: rewriting P 2 4 with |- (?y. P x y \holAnd{} P y z) ==> (P x z <=> T) +[588000]: trying to solve: ?y. P 2 y \holAnd{} P y 4 +[588000]: rewriting P 2 y with |- (?y. P x y \holAnd{} P y z) ==> (P x z <=> T) +[592000]: trying to solve: ?y'. P 2 y' \holAnd{} P y' y +... +[596000]: looping - cut +... +[608000]: looping - stack limit reached +... +[640000]: couldn't solve: ?y. P 2 y \holAnd{} P y 4 +Exception- UNCHANGED raised +\end{semiverbatim} +\end{frame} + + +\begin{frame} +\frametitle{Conditional vs.\ Unconditional Rewrite Rules} + +\begin{itemize} +\item conditional rewrite rules are often much more powerful +\item however, \ml{Rewrite} lib does not support them +\item for this reason there are often two versions of rewrite theorems +\end{itemize} + +\begin{exampleblock}{\hol{drop} example} +\begin{itemize} +\item \hol{DROP\_LENGTH\_NIL} is a useful rewrite rule:\\ +\hol{|- !l.\ DROP (LENGTH l) l = []} +\item in proofs, one needs to be careful though to preserve exactly this form +\begin{itemize} +\item one should not (partly) evaluate \hol{LENGTH l} or modify \hol{l} somehow +\end{itemize} +\item with the conditional rewrite rule \hol{DROP\_LENGTH\_TOO\_LONG} one does not need to be as careful \\\hol{|- !l n.\ LENGTH l <= n ==> (DROP n l = [])} +\begin{itemize} +\item the simplifier can use simplify the precondition using information about \hol{LENGTH} and even arithmetic decision procedures +\end{itemize} +\end{itemize} +\end{exampleblock} + +\end{frame} + + +\begin{frame} +\frametitle{Special Rewrite Forms} + +\begin{itemize} +\item some theorems given in the list of rewrites to the simplifier are used for special purposes +\item there are marking functions that mark these theorems +\begin{itemize} +\item \hol{Once :\ thm -> thm} use given theorem at most once +\item \hol{Ntimes :\ thm -> int -> thm} use given theorem at most the given number of times +\item \hol{AC :\ thm -> thm -> thm} use given associativity and commutativity theorems for AC rewriting +\item \hol{Cong :\ thm -> thm} use given theorem as a congruence rule +\end{itemize} +\item these special forms are easy ways to add this information to a simpset +\item it can be directly set in a simpset as well +\end{itemize} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example \hol{Once}} + +\begin{semiverbatim}\scriptsize +> \hol{SIMP_CONV pure_ss [Once ADD_COMM] ``a + b = c + d``} +val it = |- (a + b = c + d) <=> (b + a = c + d) + +> \hol{SIMP_CONV pure_ss [Ntimes ADD_COMM 2] ``a + b = c + d``} +val it = |- (a + b = c + d) <=> (a + b = c + d) + +> \hol{SIMP_CONV pure_ss [ADD_COMM] ``a + b = c + d``} +Exception- UNCHANGED raised + +> \hol{ONCE_REWRITE_CONV [ADD_COMM] ``a + b = c + d``} +val it = |- (a + b = c + d) <=> (b + a = d + c) + +> \hol{REWRITE_CONV [ADD_COMM] ``a + b = c + d``} +... diverges ... +\end{semiverbatim} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Stateful Simpset} + +\begin{itemize} +\item the simpset \hol{srw\_ss()} is maintained by the system +\begin{itemize} +\item it is automatically extended by new type-definitions +\item theories can extend it via \hol{export\_rewrites} +\item libs can augment it via \hol{augment\_srw\_ss} +\end{itemize} +\item the stateful simpset contains many rewrites +\item it is very powerful and easy to use +\end{itemize} + +\begin{exampleblock}{Example} +\begin{semiverbatim}\scriptsize +> \hol{SIMP_CONV (srw_ss()) [] ``case [] of [] => (2 + 4)``} +val it = |- (case [] of [] => 2 + 4 | v::v1 => ARB) = 6 +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame} +\frametitle{Discussion on Stateful Simpset} + +\begin{itemize} +\item the stateful simpset is very powerful and easy to use +\item however, results are hard to predict +\item proofs using it unwisely are hard to maintain +\item the stateful simpset can expand too much +\begin{itemize} +\item bigger, harder to read proof states +\item high level arguments become hard to see +\end{itemize} +\item whether to use the stateful simpset depends on personal proof style +\item I advise to not use \hol{srw\_ss} at the beginning +\item once you got a good intuition on how the simplifier works, make your own choice +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Adding Own Conversions} + +\begin{itemize} +\item it is complicated to add arbitrary decision procedures to a simpset +\item however, adding simple conversions is straightforward +\item a conversion is described by a \hol{stdconvdata} record +\begin{semiverbatim}\scriptsize +type stdconvdata = \{ + name: string, (* name for debugging *) + pats: term list, (* list of patterns, when to try conv *) + conv: conv (* the conversion *) +\} +\end{semiverbatim} +\item use \hol{std\_conv\_ss} to create simpset-fragement +\end{itemize} + +\begin{exampleblock}{Example} +\begin{semiverbatim}\scriptsize +val WORD_ADD_ss = + simpLib.std_conv_ss + \{conv = CHANGED_CONV WORD_ADD_CANON_CONV, + name = "WORD_ADD_CANON_CONV", + pats = [``words\$word_add (w:'a word) y``]\} +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame} +\frametitle{Summary Simplifier} + +\begin{itemize} +\item the simplifier is HOL's main workhorse for automation +\item it is very powerful +\item conditional rewriting very powerful +\begin{itemize} +\item here only simple examples were presented +\item experiment with it to get a feeling +\end{itemize} +\item many advanced features not discussed here at all +\begin{itemize} +\item using congruence rules +\item writing own decision procedures +\item rewriting with respect to arbitrary congruence relations +\end{itemize} +\end{itemize} + + +\begin{alertblock}{Warning} +The simplifier is very powerful. Make sure you understand it and are in control when using it. +Otherwise your proofs easily become lengthy, convoluted and hard to maintain. +\end{alertblock} + + +\end{frame} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/14_advanced_definitions.tex b/lectures/14_advanced_definitions.tex new file mode 100644 index 0000000..b71143a --- /dev/null +++ b/lectures/14_advanced_definitions.tex @@ -0,0 +1,469 @@ +\part{Advanced Definition Principles} + +\frame[plain]{\partpage} + +\section{Inductive and Coinductive Relations} + +\begin{frame} +\frametitle{Relations} + +\begin{itemize} +\item a relation is a function from some arguments to \texttt{bool} +\item the following example types are all types of relations: +\begin{itemize} +\item \hol{:\ 'a -> 'a -> bool} +\item \hol{:\ 'a -> 'b -> bool} +\item \hol{:\ 'a -> 'b -> 'c -> 'd -> bool} +\item \hol{:\ ('a \# 'b \# 'c) -> bool} +\item \hol{:\ bool} +\item \hol{:\ 'a -> bool} +\end{itemize} +\item relations are closely related to sets +\begin{itemize} +\item \hol{R a b c <=> (a, b, c) IN \{(a, b, c) | R a b c\}} +\item \hol{(a, b, c) IN S <=> (\textbsl{}a b c.\ (a, b, c) IN S) a b c} +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Relations II} + +\begin{itemize} +\item relations are often defined by a set of \emph{rules} +\begin{minipage}{.9\textwidth} +\begin{exampleblock}{Definition of Reflexive-Transitive Closure} +The transitive reflexive closure of a relation \hol{R : 'a -> 'a -> bool} can +be defined as the least relation \hol{RTC R} that satisfies the following rules: +\bigskip +\begin{center} +$\inferrule*{\hol{R x y}}{\hol{RTC R x y}}$\quad +$\inferrule*{\ }{\hol{RTC R x x}}$\quad +$\inferrule*{\hol{RTC R x y}\\\hol{RTC R y z}}{\hol{RTC R x z}}$ +\end{center} +\end{exampleblock} +\end{minipage} +\item if the rules are monoton, a least and a greatest fix point exists (Knaster-Tarski theorem) +\item least fixpoints give rise to \emph{inductive relations} +\item greatest fixpoints give rise to \emph{coinductive relations} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{(Co)inductive Relations in HOL} +\begin{itemize} +\item \ml{(Co)IndDefLib} provides infrastructure for defining (co)inductive relations +\item given a set of rules \hol{Hol\_(co)reln} defines (co)inductive relations +\item 3 theorems are returned and stored in current theory +\begin{itemize} +\item a rules theorem --- it states that the defined constant satisfies the rules +\item a cases theorem --- this is an equational form of the rules showing that the defined relation is indeed a fixpoint +\item a (co)induction theorem +\end{itemize} +\item additionally a strong (co)induction theorem is stored in current theory +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: Transitive Reflexive Closure} +\begin{semiverbatim}\scriptsize +> \hol{val (RTC_REL_rules, RTC_REL_ind, RTC_REL_cases) = Hol_reln ` + (!x y. R x y ==> RTC_REL R x y) \holAnd{} + (!x. RTC_REL R x x) \holAnd{} + (!x y z. RTC_REL R x y \holAnd{} RTC_REL R y z ==> RTC_REL R x z)`} + +val RTC_REL_rules = |- !R. + (!x y. R x y ==> RTC_REL R x y) \holAnd{} (!x. RTC_REL R x x) \holAnd{} + (!x y z. RTC_REL R x y \holAnd{} RTC_REL R y z ==> RTC_REL R x z) + +val RTC_REL_cases = |- !R a0 a1. + RTC_REL R a0 a1 <=> + (R a0 a1 \holOr{} (a1 = a0) \holOr{} ?y. RTC_REL R a0 y \holAnd{} RTC_REL R y a1) +\end{semiverbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: Transitive Reflexive Closure II} +\begin{semiverbatim}\scriptsize +val RTC_REL_ind = |- !R RTC_REL'. + ((!x y. R x y ==> RTC_REL' x y) \holAnd{} (!x. RTC_REL' x x) \holAnd{} + (!x y z. RTC_REL' x y \holAnd{} RTC_REL' y z ==> RTC_REL' x z)) ==> + (!a0 a1. RTC_REL R a0 a1 ==> RTC_REL' a0 a1) + + +> \hol{val RTC_REL_strongind = DB.fetch "-" "RTC_REL_strongind"} + +val RTC_REL_strongind = |- !R RTC_REL'. + (!x y. R x y ==> RTC_REL' x y) \holAnd{} (!x. RTC_REL' x x) \holAnd{} + (!x y z. + RTC_REL R x y \holAnd{} RTC_REL' x y \holAnd{} RTC_REL R y z \holAnd{} + RTC_REL' y z ==> + RTC_REL' x z) ==> + ( !a0 a1. RTC_REL R a0 a1 ==> RTC_REL' a0 a1) +\end{semiverbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: \hol{EVEN}} +\begin{semiverbatim}\scriptsize +> \hol{val (EVEN_REL_rules, EVEN_REL_ind, EVEN_REL_cases) = Hol_reln + `(EVEN_REL 0) \holAnd{} (!n. EVEN_REL n ==> (EVEN_REL (n + 2)))`}; + +val EVEN_REL_cases = + |- !a0. EVEN_REL a0 <=> (a0 = 0) \holOr{} ?n. (a0 = n + 2) \holAnd{} EVEN_REL n + +val EVEN_REL_rules = + |- EVEN_REL 0 \holAnd{} !n. EVEN_REL n ==> EVEN_REL (n + 2) + +val EVEN_REL_ind = |- !EVEN_REL'. + (EVEN_REL' 0 \holAnd{} (!n. EVEN_REL' n ==> EVEN_REL' (n + 2))) ==> + (!a0. EVEN_REL a0 ==> EVEN_REL' a0) +\end{semiverbatim} +\begin{itemize} +\item notice that in this example there is exactly one fixpoint +\item therefore, for these rules the inductive and coinductive relation coincide +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: Dummy Relations} +\begin{semiverbatim}\scriptsize +> \hol{val (DF_rules, DF_ind, DF_cases) = Hol_reln + `(!n. DF (n+1) ==> (DF n))`} + +> \hol{val (DT_rules, DT_coind, DT_cases) = Hol_coreln + `(!n. DT (n+1) ==> (DT n))`} + +val DT_coind = + |- !DT'. (!a0. DT' a0 ==> DT' (a0 + 1)) ==> !a0. DT' a0 ==> DT a0 + +val DF_ind = + |- !DF'. (!n. DF' (n + 1) ==> DF' n) ==> !a0. DF a0 ==> DF' a0 + +val DT_cases = |- !a0. DT a0 <=> DT (a0 + 1): +val DF_cases = |- !a0. DF a0 <=> DF (a0 + 1): +\end{semiverbatim} +\begin{itemize} +\item notice that the definitions of \hol{DT} and \hol{DF} look like a non-terminating recursive definition +\item \hol{DT} is always true, \ie \hol{|- !n.\ DT n} +\item \hol{DF} is always false, \ie \hol{|- !n.\ \holNeg{}(DF n)} +\end{itemize} +\end{frame} + + + +\section{Quotient Types} + +\begin{frame} +\frametitle{Quotient Types} + +\begin{itemize} +\item \ml{quotientLib} allows to define types as quotients of existing types with respect to \emph{partial equivalence relation} +\item each equivalence class becomes a value of the new type +\item partiality allows ignoring certain values of original type +\item \ml{quotientLib} allows to lift definitions and lemmata as well +\item details are technical and won't be presented here +\end{itemize} + +\end{frame} + + + +\begin{frame} +\frametitle{Quotient Types Example} + +\begin{itemize} +\item let's assume we have an implementation of finite sets of numbers as +binary trees with +\begin{itemize} +\item type \hol{binset} +\item binary tree invariant \hol{WF\_BINSET :\ binset -> bool} +\item constant \hol{empty\_binset} +\item add and member functions \hol{add :\ num -> binset -> binset},\\ \hol{mem :\ binset -> num -> bool} +\end{itemize} +\item we can define a partial equivalence relation by\\ +\hol{binset\_equiv b1 b2 := (\\ +\-\ \ WF\_BINSET b1 \holAnd{} WF\_BINSET b2 \holAnd{}\\ +\-\ \ (!n.\ mem b1 n <=> mem b2 n))} +\item this allows defining a quotient type of sets of numbers +\item functions \hol{empty\_binset}, \hol{add} and \hol{mem} as well as lemmata about them can be lifted automatically +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Quotient Types Summary} + +\begin{itemize} +\item quotient types are sometimes very useful +\begin{itemize} +\item \eg rational numbers are defined as a quotient type +\end{itemize} +\item there is powerful infrastructure for them +\item many tasks are automated +\item however, the details are technical and won't be discussed here +\end{itemize} + +\end{frame} + +\section{Case Expressions} + +\begin{frame} +\frametitle{Pattern Matching / Case Expressions} + +\begin{itemize} +\item pattern matching ubiquitous in functional programming +\item pattern matching is a powerful technique +\item it helps to write concise, readable definitions +\item very handy and frequently used for interactive theorem proving +\item however, it is \alert{not directly supported} by HOL's logic +\item representations in HOL +\begin{itemize} +\item sets of equations as produced by \hol{Define} +\item decision trees (printed as case-expressions) +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{TFL / \texttt{Define}} + +\begin{itemize} +\item we have already used top-level pattern matches with the TFL package +\item \hol{Define} is able to handle them +\begin{itemize} +\item all the semantic complexity is taken care of +\item no special syntax or functions remain +\item no special rewrite rules, reasoning tools needed afterwards +\end{itemize} +\item \hol{Define} produces a set of equations +\item this is the recommended way of using pattern matching in HOL +\end{itemize} + +\begin{exampleblock}{Example} +\begin{semiverbatim}\scriptsize +> \hol{val ZIP_def = Define `(ZIP (x::xs) (y::ys) = (x,y)::(ZIP xs ys)) \holAnd{} + (ZIP [] [] = [])`} +val ZIP_def = |- (!ys y xs x. ZIP (x::xs) (y::ys) = (x,y)::ZIP xs ys) \holAnd{} + (ZIP [] [] = []) +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expressions} + +\begin{itemize} +\item sometimes one does not want to use this compilation by TFL +\begin{itemize} +\item one wants to use pattern-matches somewhere nested in a term +\item one might not want to introduce a new constant +\item one might want to avoid using TFL for technical reasons +\end{itemize} +\item in such situations, case-expressions can be used +\item their syntax is similar to the syntax used by SML +\end{itemize} + +\begin{exampleblock}{Example} +\begin{semiverbatim}\scriptsize +> \hol{val ZIP_def = Define `ZIP xs ys = case (xs, ys) of + (x::xs, y::ys) => (x,y)::(ZIP xs ys) + | ([], []) => []`} +val ZIP_def = |- !ys xs. ZIP xs ys = + case (xs,ys) of + ([],[]) => [] + | ([],v4::v5) => ARB + | (x::xs',[]) => ARB + | (x::xs',y::ys') => (x,y)::ZIP xs' ys' +\end{semiverbatim} +\end{exampleblock} + +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Case Expressions II} + +\begin{itemize} +\item the datatype package defines case-constants for each datatype +\item the parser contains a pattern compilation algorithm +\item case-expressions are by the parser compiled to decision trees using case-constants +\item pretty printer prints these decision trees as case-expressions again +\end{itemize} + +\begin{exampleblock}{Example} +\begin{semiverbatim}\scriptsize +val ZIP_def = |- !ys xs. ZIP xs ys = + pair_CASE (xs,ys) + (\textbsl{}v v1. + list_CASE v (list_CASE v1 [] (\textbsl{}v4 v5. ARB)) + (\textbsl{}x xs'. list_CASE v1 ARB (\textbsl{}y ys'. (x,y)::ZIP xs' ys'))): +\end{semiverbatim} +\end{exampleblock} + +\end{frame} + +\begin{frame}[fragile] +\frametitle{Case Expression Issues} + +\begin{itemize} +\item using case expressions feels very natural to functional programmers +\item case-expressions allow concise, well-readable definitions +\item however, there are also many drawbacks +\item there is large, complicated code in the parser and pretty printer +\begin{itemize} +\item this is outside the kernel +\item parsing a pretty-printed term can result in a non $\alpha$-equivalent one +\item there are bugs in this code (see \eg Issue \#416 reported 8 May 2017) +\end{itemize} +\item the results are hard to predict +\begin{itemize} +\item heuristics involved in creating decision tree +\item however, it is beneficial that proofs follow this internal, volatile structure +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expression Issues II} + +\begin{itemize} +\item technical issues +\begin{itemize} +\item it is tricky to reason about decision trees +\item rewrite rules about case-constants needs to be fetched from \hol{TypeBase} +\begin{itemize} +\item alternative \hol{srw\_ss} often does more than wanted +\end{itemize} +\item partially evaluated decision-trees are not pretty printed nicely any more +\end{itemize} +\item underspecified functions +\begin{itemize} +\item decision trees are exhaustive +\item they list underspecified cases explicitly with value \hol{ARB} +\item this can be lengthy +\item \hol{Define} in contrast hides underspecified cases +\end{itemize} +\end{itemize} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expression Example I} + +\begin{block}{Partial Proof Script} +\begin{semiverbatim}\scriptsize +val _ = prove (``!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + ((ZIP l1 l2 = []) <=> ((l1 = []) \holAnd{} (l2 = [])))``, + +ONCE_REWRITE_TAC [ZIP_def] +\end{semiverbatim} +\end{block} + + +\begin{block}{Current Goal} +\begin{semiverbatim}\scriptsize +!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + (((case (l1,l2) of + ([],[]) => [] + | ([],v4::v5) => ARB + | (x::xs',[]) => ARB + | (x::xs',y::ys') => (x,y)::ZIP xs' ys') = + []) <=> (l1 = []) \holAnd{} (l2 = [])) +\end{semiverbatim} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Case Expression Example IIa -- partial evaluation} + +\begin{block}{Partial Proof Script} +\begin{semiverbatim}\scriptsize +val _ = prove (``!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + ((ZIP l1 l2 = []) <=> ((l1 = []) \holAnd{} (l2 = [])))``, + +ONCE_REWRITE_TAC [ZIP_def] >> +REWRITE_TAC[pairTheory.pair_case_def] >> BETA_TAC +\end{semiverbatim} +\end{block} + + +\begin{block}{Current Goal} +\begin{semiverbatim}\scriptsize +!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + (((case l1 of + [] => (case l2 of [] => [] | v4::v5 => ARB) + | x::xs' => case l2 of [] => ARB | y::ys' => (x,y)::ZIP xs' ys') = + []) <=> (l1 = []) \holAnd{} (l2 = [])) +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expression Example IIb --- following tree structure} + +\begin{block}{Partial Proof Script} +\begin{semiverbatim}\scriptsize +val _ = prove (``!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + ((ZIP l1 l2 = []) <=> ((l1 = []) \holAnd{} (l2 = [])))``, + +ONCE_REWRITE_TAC [ZIP_def] >> +Cases_on `l1` >| [ + REWRITE_TAC[listTheory.list_case_def] +\end{semiverbatim} +\end{block} + + +\begin{block}{Current Goal} +\begin{semiverbatim}\scriptsize +!l2. + (LENGTH [] = LENGTH l2) ==> + (((case ([],l2) of + ([],[]) => [] + | ([],v4::v5) => ARB + | (x::xs',[]) => ARB + | (x::xs',y::ys') => (x,y)::ZIP xs' ys') = + []) <=> (l2 = [])) +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expression Summary} + +\begin{itemize} +\item case expressions are natural to functional programmers +\item they allow concise, readable definitions +\item however, fancy parser and pretty-printer needed +\begin{itemize} +\item trustworthiness issues +\item sanity check lemmata advisable +\end{itemize} +\item reasoning about case expressions can be tricky and lengthy +\item proofs about case expression often hard to maintain +\item therefore, use top-level pattern matching via \hol{Define} if easily possible +\end{itemize} +\end{frame} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/14a_final_project.tex b/lectures/14a_final_project.tex new file mode 100644 index 0000000..86cab37 --- /dev/null +++ b/lectures/14a_final_project.tex @@ -0,0 +1,472 @@ +\part{Advanced Definition Principles} + +\frame[plain]{\partpage} + +\section{Inductive and Coinductive Relations} + +\begin{frame} +\frametitle{Relations} + +\begin{itemize} +\item a relation is a function from some arguments to \texttt{bool} +\item the following example types are all types of relations: +\begin{itemize} +\item \hol{:\ 'a -> 'a -> bool} +\item \hol{:\ 'a -> 'b -> bool} +\item \hol{:\ 'a -> 'b -> 'c -> 'd -> bool} +\item \hol{:\ ('a \# 'b \# 'c) -> bool} +\item \hol{:\ bool} +\item \hol{:\ 'a -> bool} +\end{itemize} +\item relations are closely related to sets +\begin{itemize} +\item \hol{R a b c <=> (a, b, c) IN \{(a, b, c) | R a b c\}} +\item \hol{(a, b, c) IN S <=> (\textbsl{}a b c.\ (a, b, c) IN S) a b c} +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Relations II} + +\begin{itemize} +\item relations are often defined by a set of \emph{rules} +\begin{minipage}{.9\textwidth} +\begin{exampleblock}{Definition of Reflexive-Transitive Closure} +The transitive reflexive closure of a relation \hol{R : 'a -> 'a -> bool} can +be defined as the least relation \hol{RTC R} that satisfies the following rules: +\bigskip +\begin{center} +$\inferrule*{\hol{R x y}}{\hol{RTC R x y}}$\quad +$\inferrule*{\ }{\hol{RTC R x x}}$\quad +$\inferrule*{\hol{RTC R x y}\\\hol{RTC R y z}}{\hol{RTC R x z}}$ +\end{center} +\end{exampleblock} +\end{minipage} +\item if the rules are monoton, a least and a greatest fix point exists (Knaster-Tarski theorem) +\item least fixpoints give rise to \emph{inductive relations} +\item greatest fixpoints give rise to \emph{coinductive relations} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{(Co)inductive Relations in HOL} +\begin{itemize} +\item \ml{(Co)IndDefLib} provides infrastructure for defining (co)inductive relations +\item given a set of rules \hol{Hol\_(co)reln} defines (co)inductive relations +\item 3 theorems are returned and stored in current theory +\begin{itemize} +\item a rules theorem --- it states that the defined constant satisfies the rules +\item a cases theorem --- this is an equational form of the rules showing that the defined relation is indeed a fixpoint +\item a (co)induction theorem +\end{itemize} +\item additionally a strong (co)induction theorem is stored in current theory +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: Transitive Reflexive Closure} +\begin{semiverbatim}\scriptsize +> \hol{val (RTC_REL_rules, RTC_REL_ind, RTC_REL_cases) = Hol_reln ` + (!x y. R x y ==> RTC_REL R x y) \holAnd{} + (!x. RTC_REL R x x) \holAnd{} + (!x y z. RTC_REL R x y \holAnd{} RTC_REL R x z ==> RTC_REL R x z)`} + +val RTC_REL_rules = |- !R. + (!x y. R x y ==> RTC_REL R x y) \holAnd{} (!x. RTC_REL R x x) \holAnd{} + (!x y z. RTC_REL R x y \holAnd{} RTC_REL R x z ==> RTC_REL R x z) + +val RTC_REL_cases = |- !R a0 a1. + RTC_REL R a0 a1 <=> + (R a0 a1 \holOr{} (a1 = a0) \holOr{} ?y. RTC_REL R a0 y \holAnd{} RTC_REL R a0 a1) +\end{semiverbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: Transitive Reflexive Closure II} +\begin{semiverbatim}\scriptsize +val RTC_REL_ind = |- !R RTC_REL'. + ((!x y. R x y ==> RTC_REL' x y) \holAnd{} (!x. RTC_REL' x x) \holAnd{} + (!x y z. RTC_REL' x y \holAnd{} RTC_REL' x z ==> RTC_REL' x z)) ==> + (!a0 a1. RTC_REL R a0 a1 ==> RTC_REL' a0 a1) + + +> \hol{val RTC_REL_strongind = DB.fetch "-" "RTC_REL_strongind"} + +val RTC_REL_strongind = |- !R RTC_REL'. + (!x y. R x y ==> RTC_REL' x y) \holAnd{} (!x. RTC_REL' x x) \holAnd{} + (!x y z. + RTC_REL R x y \holAnd{} RTC_REL' x y \holAnd{} RTC_REL R x z \holAnd{} + RTC_REL' x z ==> + RTC_REL' x z) ==> + ( !a0 a1. RTC_REL R a0 a1 ==> RTC_REL' a0 a1) +\end{semiverbatim} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: \hol{EVEN}} +\begin{semiverbatim}\scriptsize +> \hol{val (EVEN_REL_rules, EVEN_REL_ind, EVEN_REL_cases) = Hol_reln + `(EVEN_REL 0) \holAnd{} (!n. EVEN_REL n ==> (EVEN_REL (n + 2)))`}; + +val EVEN_REL_cases = + |- !a0. EVEN_REL a0 <=> (a0 = 0) \holOr{} ?n. (a0 = n + 2) \holAnd{} EVEN_REL n + +val EVEN_REL_rules = + |- EVEN_REL 0 \holAnd{} !n. EVEN_REL n ==> EVEN_REL (n + 2) + +val EVEN_REL_ind = |- !EVEN_REL'. + (!a0. + EVEN_REL' a0 ==> + (a0 = 0) \holOr{} ?n. (a0 = n + 2) \holAnd{} EVEN_REL' n) ==> + (!a0. EVEN_REL' a0 ==> EVEN_REL a0) +\end{semiverbatim} +\begin{itemize} +\item notice that in this example there is exactly one fixpoint +\item therefore for these rule, the induction and coinductive relation coincide +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Example: Dummy Relations} +\begin{semiverbatim}\scriptsize +> \hol{val (DF_rules, DF_ind, DF_cases) = Hol_reln + `(!n. DF (n+1) ==> (DF n))`} + +> \hol{val (DT_rules, DT_coind, DT_cases) = Hol_coreln + `(!n. DT (n+1) ==> (DT n))`} + +val DT_coind = + |- !DT'. (!a0. DT' a0 ==> DT' (a0 + 1)) ==> !a0. DT' a0 ==> DT a0 + +val DF_ind = + |- !DF'. (!n. DF' (n + 1) ==> DF' n) ==> !a0. DF a0 ==> DF' a0 + +val DT_cases = |- !a0. DT a0 <=> DT (a0 + 1): +val DF_cases = |- !a0. DF a0 <=> DF (a0 + 1): +\end{semiverbatim} +\begin{itemize} +\item notice that for both \hol{DT} and \hol{DF} we used essentially a non-terminating recursion +\item \hol{DT} is always true, \ie \hol{|- !n.\ DT n} +\item \hol{DF} is always false, \ie \hol{|- !n.\ \holNeg{}(DF n)} +\end{itemize} +\end{frame} + + + +\section{Quotient Types} + +\begin{frame} +\frametitle{Quotient Types} + +\begin{itemize} +\item \ml{quotientLib} allows to define types as quotients of existing types with respect to \emph{partial equivalence relation} +\item each equivalence class becomes a value of the new type +\item partiality allows ignoring certain types +\item \ml{quotientLib} allows to lift definitions and lemmata as well +\item details are technical and won't be presented here +\end{itemize} + +\end{frame} + + + +\begin{frame} +\frametitle{Quotient Types Example} + +\begin{itemize} +\item let's assume we have an implementation of finite sets of numbers as +binary trees with +\begin{itemize} +\item type \hol{binset} +\item binary tree invariant \hol{WF\_BINSET :\ binset -> bool} +\item constant \hol{empty\_binset} +\item add and member functions \hol{add :\ num -> binset -> binset},\\ \hol{mem :\ binset -> num -> bool} +\end{itemize} +\item we can define a partial equivalence relation by\\ +\hol{binset\_equiv b1 b2 := (\\ +\-\ \ WF\_BINSET b1 \holAnd{} WF\_BINSET b2 \holAnd{}\\ +\-\ \ (!n.\ mem b1 n <=> mem b2 n))} +\item this allows defining a quotient type of sets of numbers +\item functions \hol{empty\_binset}, \hol{add} and \hol{mem} as well as lemmata about them can be lifted automatically +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Quotient Types Summary} + +\begin{itemize} +\item quotient types are sometimes very useful +\begin{itemize} +\item \eg rational numbers are defined as a quotient type +\end{itemize} +\item there is powerful infrastructure for them +\item many tasks are automated +\item however, the details are technical and won't be discussed here +\end{itemize} + +\end{frame} + +\section{Case Expressions} + +\begin{frame} +\frametitle{Pattern Matching / Case Expressions} + +\begin{itemize} +\item pattern matching ubiquitous in functional programming +\item pattern matching is a powerful technique +\item it helps to write concise, readable definitions +\item very handy and frequently used for interactive theorem proving in higher-order logic (HOL) +\item however, it is \alert{not directly supported} by HOL's logic +\item representations in HOL +\begin{itemize} +\item sets of equations as produced by \hol{Define} +\item decision trees (printed as case-expressions) +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{TFL / \texttt{Define}} + +\begin{itemize} +\item we have already used top-level pattern matches with the TFL package +\item \hol{Define} is able to handle them +\begin{itemize} +\item all the semantic complexity is taken care of +\item no special syntax or functions remain +\item no special rewrite rules, reasoning tools needed afterwards +\end{itemize} +\item \hol{Define} produces a set of equations +\item this is the recommended way of using pattern matching in HOL +\end{itemize} + +\begin{exampleblock}{Example} +\begin{semiverbatim}\scriptsize +> \hol{val ZIP_def = Define `(ZIP (x::xs) (y::ys) = (x,y)::(ZIP xs ys)) \holAnd{} + (ZIP [] [] = [])`} +val ZIP_def = |- (!ys y xs x. ZIP (x::xs) (y::ys) = (x,y)::ZIP xs ys) \holAnd{} + (ZIP [] [] = []) +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expressions} + +\begin{itemize} +\item sometimes one does not want to use this compilation by TFL +\begin{itemize} +\item one wants to use pattern-matches somewhere nested in a term +\item one might not want to introduce a new constant +\item one might want to avoid using TFL for technical reasons +\end{itemize} +\item in such situations, case-expressions can be used +\item their syntax is similar to the syntax used by SML +\end{itemize} + +\begin{exampleblock}{Example} +\begin{semiverbatim}\scriptsize +> \hol{val ZIP_def = Define `ZIP xs ys = case (xs, ys) of + (x::xs, y::ys) => (x,y)::(ZIP xs ys) + | ([], []) => []`} +val ZIP_def = |- !ys xs. ZIP xs ys = + case (xs,ys) of + ([],[]) => [] + | ([],v4::v5) => ARB + | (x::xs',[]) => ARB + | (x::xs',y::ys') => (x,y)::ZIP xs' ys' +\end{semiverbatim} +\end{exampleblock} + +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Case Expressions II} + +\begin{itemize} +\item the datatype package define case-constants for each datatype +\item the parser contains a pattern compilation algorithm +\item case-expressions are by the parser compiled to decision trees using case-constants +\item pretty printer prints these decision trees as case-expressions again +\end{itemize} + +\begin{exampleblock}{Example} +\begin{semiverbatim}\scriptsize +val ZIP_def = |- !ys xs. ZIP xs ys = + pair_CASE (xs,ys) + (\textbsl{}v v1. + list_CASE v (list_CASE v1 [] (\textbsl{}v4 v5. ARB)) + (\textbsl{}x xs'. list_CASE v1 ARB (\textbsl{}y ys'. (x,y)::ZIP xs' ys'))): +\end{semiverbatim} +\end{exampleblock} + +\end{frame} + +\begin{frame}[fragile] +\frametitle{Case Expression Issues} + +\begin{itemize} +\item using case expressions feels very natural to functional programmers +\item case-expressions allow concise, well-readable definitions +\item however, there are also many drawbacks +\item there is large, complicated code in the parser and pretty printer +\begin{itemize} +\item this is outside the kernel +\item parsing a pretty-printed term can result in a non $\alpha$-equivalent one +\item there are bugs in this code (see \eg Issue \#416 reported 8 May 2017) +\end{itemize} +\item the results are hard to predict +\begin{itemize} +\item heuristics involved in creating decision tree +\item results sometimes hard to predict +\item however, it is beneficial that proofs follow this internal, volatile structure +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expression Issues II} + +\begin{itemize} +\item technical issues +\begin{itemize} +\item it is tricky to reason about decision trees +\item rewrite rules about case-constants needs to be fetched from \hol{TypeBase} +\begin{itemize} +\item alternative \hol{srw\_ss} often does more than wanted +\end{itemize} +\item partially evaluated decision-trees are not pretty printed nicely any more +\end{itemize} +\item underspecified functions +\begin{itemize} +\item decision trees are exhaustive +\item they list underspecified cases explicitly with value \hol{ARB} +\item this can be lengthy +\item \hol{Define} in contrast hides underspecified cases +\end{itemize} +\end{itemize} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expression Example I} + +\begin{block}{Partial Proof Script} +\begin{semiverbatim}\scriptsize +val _ = prove (``!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + ((ZIP l1 l2 = []) <=> ((l1 = []) \holAnd{} (l2 = [])))``, + +ONCE_REWRITE_TAC [ZIP_def] +\end{semiverbatim} +\end{block} + + +\begin{block}{Current Goal} +\begin{semiverbatim}\scriptsize +!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + (((case (l1,l2) of + ([],[]) => [] + | ([],v4::v5) => ARB + | (x::xs',[]) => ARB + | (x::xs',y::ys') => (x,y)::ZIP xs' ys') = + []) <=> (l1 = []) \holAnd{} (l2 = [])) +\end{semiverbatim} +\end{block} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Case Expression Example IIa -- partial evaluation} + +\begin{block}{Partial Proof Script} +\begin{semiverbatim}\scriptsize +val _ = prove (``!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + ((ZIP l1 l2 = []) <=> ((l1 = []) \holAnd{} (l2 = [])))``, + +ONCE_REWRITE_TAC [ZIP_def] >> +REWRITE_TAC[pairTheory.pair_case_def] >> BETA_TAC +\end{semiverbatim} +\end{block} + + +\begin{block}{Current Goal} +\begin{semiverbatim}\scriptsize +!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + (((case l1 of + [] => (case l2 of [] => [] | v4::v5 => ARB) + | x::xs' => case l2 of [] => ARB | y::ys' => (x,y)::ZIP xs' ys') = + []) <=> (l1 = []) \holAnd{} (l2 = [])) +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expression Example IIb --- following tree structure} + +\begin{block}{Partial Proof Script} +\begin{semiverbatim}\scriptsize +val _ = prove (``!l1 l2. + (LENGTH l1 = LENGTH l2) ==> + ((ZIP l1 l2 = []) <=> ((l1 = []) \holAnd{} (l2 = [])))``, + +ONCE_REWRITE_TAC [ZIP_def] >> +Cases_on `l1` >| [ + REWRITE_TAC[listTheory.list_case_def] +\end{semiverbatim} +\end{block} + + +\begin{block}{Current Goal} +\begin{semiverbatim}\scriptsize +!l2. + (LENGTH [] = LENGTH l2) ==> + (((case ([],l2) of + ([],[]) => [] + | ([],v4::v5) => ARB + | (x::xs',[]) => ARB + | (x::xs',y::ys') => (x,y)::ZIP xs' ys') = + []) <=> (l2 = [])) +\end{semiverbatim} +\end{block} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Case Expression Summary} + +\begin{itemize} +\item case expressions are natural to functional programmers +\item they allow concise, readable definitions +\item however, fancy parser and pretty-printer needed +\begin{itemize} +\item trustworthiness issues +\item sanity check lemmata advisable +\end{itemize} +\item reasoning about case expressions can be tricky and lengthy +\item proofs about case expression often hard to maintain +\item therefore, use top-level pattern matching via \hol{Define} if easily possible +\end{itemize} +\end{frame} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/15_maintainable_proofs.tex b/lectures/15_maintainable_proofs.tex new file mode 100644 index 0000000..b28e475 --- /dev/null +++ b/lectures/15_maintainable_proofs.tex @@ -0,0 +1,543 @@ +\part{Maintainable Proofs} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{Motivation} + +\begin{itemize} +\item proofs are hopefully still used in a few weeks, months or even years +\item often the environment changes slightly during the lifetime of a proof +\begin{itemize} +\item your definitions change slightly +\item your own lemmata change (\eg become more general) +\item used libraries change +\item HOL changes +\begin{itemize} +\item automation becomes more powerful +\item rewrite rules in certain simpsets change +\item definition packages produce slightly different theorems +\item autogenerated variable-names change +\item \ldots +\end{itemize} +\end{itemize} +\item even if HOL and used libraries are stable, proofs often go through several iterations +\item often they are adapted by someone else than the original author +\item \alert{therefore it is important that proofs are easily maintainable} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Nice Properties of Proofs} + +\begin{itemize} +\item maintainability is closely linked to other desirable properties of proofs +\item proofs should be +\begin{itemize} +\item easily understandable +\item well-structured +\item robust +\begin{itemize} +\item they should be able to cope with minor changes to environment +\item if they fail they should do so at sensible points +\end{itemize} +\item reusable +\end{itemize} +\item How can one write proofs with such properties? +\item as usual, there are no easy answers but plenty of good advice +\item I recommend following the advice of \emph{ProofStyle} manual +\item parts of this advice as well as a few extra points are discussed in the following +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Formatting} + +\begin{itemize} +\item format your proof such that it easily understandable +\item make the structure of the proof very clear +\item \alert{show clearly where subgoals start and stop} +\item use indentation to mark proofs of subgoals +\item use empty lines to separate large proofs of subgoals +\item use comments where appropriate +\end{itemize} + +\end{frame} + +\begin{frame}[fragile] +\frametitle{Formatting Example I} + +\begin{alertblock}{Bad Example Term Formatting} +\begin{semiverbatim}\scriptsize +prove (``!l1 l2. l1 <> [] ==> LENGTH l2 < +LENGTH (l1 ++ l2)``, +...) +\end{semiverbatim} +\end{alertblock} + +\begin{exampleblock}{Good Example Term Formatting} +\begin{semiverbatim}\scriptsize +prove (``!l1 l2. l1 <> [] ==> + (LENGTH l2 < LENGTH (l1 ++ l2))``, +...) +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Formatting Example II} + +\begin{alertblock}{Bad Example Subgoals} +\begin{semiverbatim}\scriptsize +prove (``!l1 l2. l1 <> [] ==> (LENGTH l2 < LENGTH (l1 ++ l2))``, +Cases >> +REWRITE_TAC[] >> +REWRITE_TAC[listTheory.LENGTH, listTheory.LENGTH_APPEND] >> +REPEAT STRIP_TAC >> +DECIDE_TAC) +\end{semiverbatim} +\end{alertblock} + +\begin{alertblock}{Improved Example Subgoals} +At least show when a subgoal starts and ends +\begin{semiverbatim}\scriptsize +prove (``!l1 l2. l1 <> [] ==> (LENGTH l2 < LENGTH (l1 ++ l2))``, +Cases >> ( + REWRITE_TAC[] +) >> +REWRITE_TAC[listTheory.LENGTH, listTheory.LENGTH_APPEND] >> +REPEAT STRIP_TAC >> +DECIDE_TAC) +\end{semiverbatim} +\end{alertblock} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Formatting Example II 2} + +\begin{exampleblock}{Good Example Subgoals} +Make sure \texttt{REWRITE\_TAC} is only applied to first subgoal and +proof fails, if it does not solve this subgoal. +\begin{semiverbatim}\scriptsize +prove (``!l1 l2. l1 <> [] ==> (LENGTH l2 < LENGTH (l1 ++ l2))``, +Cases >- ( + REWRITE_TAC[] +) >> +REWRITE_TAC[listTheory.LENGTH, listTheory.LENGTH_APPEND] >> +REPEAT STRIP_TAC >> +DECIDE_TAC) +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Formatting Example II 3} + +\begin{exampleblock}{Alternative Good Example Subgoals} +Alternative good formatting using \texttt{THENL} +\begin{semiverbatim}\scriptsize +prove (``!l1 l2. l1 <> [] ==> (LENGTH l2 < LENGTH (l1 ++ l2))``, +Cases >| [ + REWRITE_TAC[], + + REWRITE_TAC[listTheory.LENGTH, listTheory.LENGTH_APPEND] >> + REPEAT STRIP_TAC >> + DECIDE_TAC +]) +\end{semiverbatim} +\end{exampleblock} + +\begin{alertblock}{Another Bad Example Subgoals} +Bad formatting using \texttt{THENL} +\begin{semiverbatim}\scriptsize +prove (``!l1 l2. l1 <> [] ==> (LENGTH l2 < LENGTH (l1 ++ l2))``, +Cases >| [REWRITE_TAC[], +REWRITE_TAC[listTheory.LENGTH, listTheory.LENGTH_APPEND] >> +REPEAT STRIP_TAC >> DECIDE_TAC]) +\end{semiverbatim} +\end{alertblock} +\end{frame} + + +\begin{frame} +\frametitle{Some basic advice} +\begin{itemize} +\item use semicoli after each declaration +\begin{itemize} +\item if exception is raised during interactive processing (\eg by a failing proof), previous successful declarations are kept +\item it sometimes leads to better error messages in case of parsing errors +\end{itemize} +\item use plenty of parentheses to make structure very clear +\item don't ignore parser warnings +\begin{itemize} +\item especially warnings about multiple possible parse trees are likely to lead to unstable proofs +\item understand why such warnings occur and make sure there is no problem +\end{itemize} +\item format your development well +\begin{itemize} +\item use indentation +\item use linebreaks at sensible points +\item don't use overlong lines +\item \ldots +\end{itemize} +\item don't use \ml{open} in middle of files +\item personal opinion: avoid unicode in source files +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{KISS and Premature Optimisation} + +\begin{itemize} +\item follow standard design principles +\begin{itemize} +\item \emph{KISS} principle +\item ``\emph{premature optimization is the root of all evil}'' (Donald Knuth) +\end{itemize} +\item don't try to be overly clever +\item simple proofs are preferable +\item proof-checking-speed mostly unimportant +\item conciseness not a value in itself but desirable if it helps +\begin{itemize} +\item readability +\item maintainability +\end{itemize} +\item abstraction is often desirable, but also has a price +\begin{itemize} +\item don't use too complex, artificial definitions and lemmata +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Too much abstraction} + +\begin{alertblock}{Too much abstraction Example} +\begin{semiverbatim}\scriptsize +val TOO_ABSTRACT_LEMMA = prove (`` +!(size :'a -> num) (P : 'a -> bool) (combine : 'a -> 'a -> 'a). + (!x. P x ==> (0 < size x)) \holAnd{} + (!x1 x2. size x1 + size x2 <= size (combine x1 x2)) ==> + + (!x1 x2. P x1 ==> (size x2 < size (combine x1 x2)))``, +...) + + +prove (``!l1 l2. l1 <> [] ==> (LENGTH l2 < LENGTH (l1 ++ l2))``, + \textrm{some proof using} ABSTRACT_LEMMA +) +\end{semiverbatim} +\end{alertblock} + +\end{frame} + + +\begin{frame} +\frametitle{Too clever tactics} + +\begin{itemize} +\item a common mistake is to use too clever tactics +\begin{itemize} +\item intended to work on many (sub)goals +\item using \hol{TRY} and other fancy trial and error mechanisms +\item intended to replace multiple simple, clear tactics +\end{itemize} +\item typical case: a tactic containing \hol{TRY} applied to many subgoals +\item it is often hard to see why such tactics work +\item if something goes wrong, they are hard to debug +\item general advice: don't factor with tactics, instead use definitions and lemmata +\end{itemize} + +\end{frame} + +\begin{frame}[fragile] +\frametitle{Too Clever Tactics Example I} + +\begin{alertblock}{Bad Example Subgoals} +\begin{semiverbatim}\scriptsize +prove (``!l1 l2. l1 <> [] ==> (LENGTH l2 < LENGTH (l1 ++ l2))``, +Cases >> ( + REWRITE_TAC[listTheory.LENGTH, listTheory.LENGTH_APPEND] >> + REPEAT STRIP_TAC >> + DECIDE_TAC +)) +\end{semiverbatim} +\end{alertblock} + +\begin{exampleblock}{Alternative Good Example Subgoals II} +\begin{semiverbatim}\scriptsize +prove (``!l1 l2. l1 <> [] ==> (LENGTH l2 < LENGTH (l1 ++ l2))``, +Cases >> SIMP_TAC list_ss []) + +prove (``!l1 l2. l1 <> [] ==> (LENGTH l2 < LENGTH (l1 ++ l2))``, +Cases >| [ + REWRITE_TAC[], + + REWRITE_TAC[listTheory.LENGTH, listTheory.LENGTH_APPEND] >> + REPEAT STRIP_TAC >> + DECIDE_TAC +]) +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Too Clever Tactics Example II} + +\begin{alertblock}{Bad Example} +\begin{semiverbatim}\scriptsize +val oadd_def = Define `(oadd (SOME n1) (SOME n2) = (SOME (n1 + n2))) \holAnd{} + (oadd _ _ = NONE)`; +val osub_def = Define `(osub (SOME n1) (SOME n2) = (SOME (n1 - n2))) \holAnd{} + (osub _ _ = NONE)`; +val omul_def = Define `(omul (SOME n1) (SOME n2) = (SOME (n1 * n2))) \holAnd{} + (omul _ _ = NONE)`; + +val obin_NONE_TAC = + Cases_on `o1` >> Cases_on `o2` >> + SIMP_TAC std_ss [oadd_def, osub_def, omul_def]; + +val oadd_NONE = prove ( + ``!o1 o2. (oadd o1 o2 = NONE) <=> (o1 = NONE) \holOr{} (o2 = NONE)``, + obin_NONE_TAC); +val osub_NONE = prove ( + ``!o1 o2. (osub o1 o2 = NONE) <=> (o1 = NONE) \holOr{} (o2 = NONE)``, + obin_NONE_TAC); +val omul_NONE = prove ( + ``!o1 o2. (omul o1 o2 = NONE) <=> (o1 = NONE) \holOr{} (o2 = NONE)``, + obin_NONE_TAC); +\end{semiverbatim} +\end{alertblock} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Too Clever Tactics Example II} + +\begin{exampleblock}{Good Example} +\begin{semiverbatim}\scriptsize +val obin_def = Define `(obin op (SOME n1) (SOME n2) = (SOME (op n1 n2))) \holAnd{} + (obin _ _ _ = NONE)`; +val oadd_def = Define `oadd = obin \$+`; +val osub_def = Define `osub = obin \$-`; +val omul_def = Define `omul = obin \$*`; + +val obin_NONE = prove ( + ``!op o1 o2. (obin op o1 o2 = NONE) <=> (o1 = NONE) \holOr{} (o2 = NONE)``, + Cases_on `o1` >> Cases_on `o2` >> SIMP_TAC std_ss [obin_def]); + +val oadd_NONE = prove ( + ``!o1 o2. (oadd o1 o2 = NONE) <=> (o1 = NONE) \holOr{} (o2 = NONE)``, + REWRITE_TAC[oadd_def, obin_NONE]); +val osub_NONE = prove ( + ``!o1 o2. (osub o1 o2 = NONE) <=> (o1 = NONE) \holOr{} (o2 = NONE)``, + REWRITE_TAC[osub_def, obin_NONE]); +val omul_NONE = prove ( + ``!o1 o2. (omul o1 o2 = NONE) <=> (o1 = NONE) \holOr{} (o2 = NONE)``, + REWRITE_TAC[omul_def, obin_NONE]); +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Use many subgoals and lemmata} + +\begin{itemize} +\item often it is beneficial to use subgoals +\begin{itemize} +\item they structure long proofs well +\item they help keeping the proof state clean +\item they mark clearly what one tries to proof +\item they provide points where proofs can break sensibly +\end{itemize} +\item general enough subgoals should become lemmata +\begin{itemize} +\item this improves reusability +\item proof script for main lemma becomes shorter +\item proofs are disentangled +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Subgoal Example} + +\begin{itemize} +\item the following example is taken from exercise 5 +\item we try to prove \hol{\texttt{!l.\ IS\_WEAK\_SUBLIST\_FILTER l l}} +\item given are following definitions and lemmata +\end{itemize} + +\begin{block}{} +\begin{semiverbatim}\scriptsize +val FILTER_BY_BOOLS_def = Define ` + FILTER_BY_BOOLS bl l = MAP SND (FILTER FST (ZIP (bl, l)))`; + +val IS_WEAK_SUBLIST_FILTER_def = Define `IS_WEAK_SUBLIST_FILTER l1 l2 = + ?(bl : bool list). (LENGTH bl = LENGTH l1) \holAnd{} (l2 = FILTER_BY_BOOLS bl l1)`; + +val FILTER_BY_BOOLS_REWRITES = store_thm ("FILTER_BY_BOOLS_REWRITES", + ``(FILTER_BY_BOOLS [] [] = []) \holAnd{} + (!b bl x xs. (FILTER_BY_BOOLS (b::bl) (x::xs) = + if b then x::(FILTER_BY_BOOLS bl xs) else FILTER_BY_BOOLS bl xs))``, +REWRITE_TAC [FILTER_BY_BOOLS_def, ZIP, MAP, FILTER] >> +Cases_on `b` >> REWRITE_TAC [MAP]); +\end{semiverbatim} +\end{block} + +\end{frame} + + +\begin{frame}[fragile] +\frametitle{Subgoal Example II} + +\begin{alertblock}{First Version} +\begin{semiverbatim}\scriptsize +val IS_WEAK_SUBLIST_FILTER_REFL = store_thm ("IS_WEAK_SUBLIST_FILTER_REFL", + ``!l. IS_WEAK_SUBLIST_FILTER l l``, +REWRITE_TAC[IS_WEAK_SUBLIST_FILTER_def] >> +Induct_on `l` >- ( + Q.EXISTS_TAC `[]` >> + SIMP_TAC list_ss [FILTER_BY_BOOLS_REWRITES] +) >> +FULL_SIMP_TAC std_ss [] >> +GEN_TAC >> +Q.EXISTS_TAC `T::bl` >> +ASM_SIMP_TAC list_ss [FILTER_BY_BOOLS_REWRITES]) +\end{semiverbatim} +\end{alertblock} + +\begin{itemize} +\item the proof mixes properties of \texttt{IS\_WEAK\_SUBLIST\_FILTER} and + properties of \texttt{FILTER\_BY\_BOOLS} +\item it is hard to see what the main idea is +\end{itemize} + +\end{frame} + + + + +\begin{frame}[fragile] +\frametitle{Subgoal Example III} + +\begin{itemize} +\item the following proof separates the property of \texttt{FILTER\_BY\_BOOLS} as a subgoal +\item the main idea becomes clearer +\end{itemize} + +\begin{exampleblock}{Subgoal Version} +\begin{semiverbatim}\scriptsize +val IS_WEAK_SUBLIST_FILTER_REFL = store_thm ("IS_WEAK_SUBLIST_FILTER_REFL", + ``!l. IS_WEAK_SUBLIST_FILTER l l``, +GEN_TAC >> +REWRITE_TAC[IS_WEAK_SUBLIST_FILTER_def] >> +`FILTER_BY_BOOLS (REPLICATE (LENGTH l) T) l = l` suffices_by ( + METIS_TAC[LENGTH_REPLICATE] +) >> +Induct_on `l` >> ( + ASM_SIMP_TAC list_ss [FILTER_BY_BOOLS_REWRITES, REPLICATE] +)) +\end{semiverbatim} +\end{exampleblock} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Subgoal Example IV} + +\begin{itemize} +\item the subgoal is general enough to justify a lemma +\item the structure becomes even cleaner +\item this improves reusability +\end{itemize} + +\begin{exampleblock}{Lemma Version} +\begin{semiverbatim}\scriptsize +val FILTER_BY_BOOLS_REPL_T = store_thm ("FILTER_BY_BOOLS_REPL_T", + ``!l. FILTER_BY_BOOLS (REPLICATE (LENGTH l) T) l = l``, +Induct >> ASM_REWRITE_TAC [REPLICATE, FILTER_BY_BOOLS_REWRITES, LENGTH]); + +val IS_WEAK_SUBLIST_FILTER_REFL = store_thm ("IS_WEAK_SUBLIST_FILTER_REFL", + ``!l. IS_WEAK_SUBLIST_FILTER l l``, +GEN_TAC >> +REWRITE_TAC[IS_WEAK_SUBLIST_FILTER_def] >> +Q.EXISTS_TAC `REPLICATE (LENGTH l) T` >> +SIMP_TAC list_ss [FILTER_BY_BOOLS_REPL_T, LENGTH_REPLICATE]) +\end{semiverbatim} +\end{exampleblock} +\end{frame} + + + +\begin{frame}[fragile] +\frametitle{Avoid Autogenerated Names} + +\begin{itemize} +\item many HOL-tactics introduce new variable names +\begin{itemize} +\item \hol{Induct} +\item \hol{Cases} +\item \ldots +\end{itemize} +\item the new names are often very artificial +\item even worse, generated names might change in future +\item proof scripts using autogenerated names are therefore +\begin{itemize} +\item hard to read +\item potentially fragile +\end{itemize} +\item therefore rename variables after they have been introduced +\item HOL has multiple tactics supporting renaming +\item most useful is \hol{rename1 `pat`}, it searches for pattern and renames vars accordingly +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Autogenerated Names Example} + +\begin{alertblock}{Bad Example} +\begin{semiverbatim}\scriptsize +prove (``!l. 1 < LENGTH l ==> (?x1 x2 l'. l = x1::x2::l')``, +GEN_TAC >> +Cases_on `l` >> SIMP_TAC list_ss [] >> +Cases_on `t` >> SIMP_TAC list_ss []) +\end{semiverbatim} +\end{alertblock} + +\begin{exampleblock}{Good Example} +\begin{semiverbatim}\scriptsize +prove (``!l. 1 < LENGTH l ==> (?x1 x2 l'. l = x1::x2::l')``, +GEN_TAC >> +Cases_on `l` >> SIMP_TAC list_ss [] >> +rename1 `LENGTH l2` >> +Cases_on `l2` >> SIMP_TAC list_ss []) +\end{semiverbatim} +\end{exampleblock} + +\begin{block}{Proof State before \hol{rename1}} +\begin{semiverbatim}\scriptsize +1 < SUC (LENGTH t) ==> ?x2 l'. t = x2::l' +\end{semiverbatim} +\end{block} + +\begin{block}{Proof State after \hol{rename1}} +\begin{semiverbatim}\scriptsize +1 < SUC (LENGTH l2) ==> ?x2 l'. l2 = x2::l' +\end{semiverbatim} +\end{block} + +\end{frame} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/16_hol_overview.tex b/lectures/16_hol_overview.tex new file mode 100644 index 0000000..084cec3 --- /dev/null +++ b/lectures/16_hol_overview.tex @@ -0,0 +1,226 @@ +\part{Overview of HOL~4} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{Overview of HOL 4} + +\begin{itemize} +\item in this course we discussed the basics of HOL 4 +\item you were encouraged to learn more on your own in exercises +\item there is a lot more to learn even after the end of the course +\begin{itemize} +\item many more libraries +\item proof tools +\item existing formalisations +\item ... +\end{itemize} +\item to really use HOL well, you should continue learning +\item to help getting started, a short overview is presented here +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{HOL Bare Source Directories} + +The following source directories are the very basis of HOL. They +are required to build \hol{hol.bare}. + +\begin{itemize} +\item \hol{src/portableML} -- common stuff for PolyML and MoscowML +\item \hol{src/prekernel} +\item \hol{src/0} -- Standard Kernel +\item \hol{src/logging-kernel} -- Logging Kernel +\item \hol{src/experimental-kernel} -- Experimental Kernel +\item \hol{src/postkernel} +\item \hol{src/opentheory} +\item \hol{src/parse} +\item \hol{src/bool} +\item \hol{src/1} +\item \hol{src/proofman} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{HOL Basic Directories I} + +On top of \texttt{hol.bare}, there are many basic theories and tools. These +are all required for building the main \texttt{hol} executable. + +\begin{itemize} +\item \hol{src/compute} -- fast ground term rewriting +\item \hol{src/HolSat} -- SAT solver interfaces +\item \hol{src/taut} -- propositional proofs using \texttt{HolSat} +\item \hol{src/marker} -- marking terms +\item \hol{src/q} -- parsing support +\item \hol{src/combin} -- combinators +\item \hol{src/lite} -- some simple lib with various stuff +\item \hol{src/refute} -- refutation prover, normal forms +\item \hol{src/metis} -- first order resolution prover +\item \hol{src/meson} -- first order model elimination prover +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{HOL Basic Directories II} + +\begin{itemize} +\item \hol{src/simp} -- simplifier +\item \hol{src/holyhammer} -- tool for finding Metis proofs +\item \hol{src/tactictoe} -- machine learning tool for finding proofs +\item \hol{src/IndDef} -- (co)inductive relation definitions +\item \hol{src/basicProof} -- library containing proof tools +\item \hol{src/relation} -- relations and order theory +\item \hol{src/one} -- unit type theory +\item \hol{src/pair} -- tuples +\item \hol{src/sum} -- sum types +\item \hol{src/tfl} -- defining terminating functions +\item \hol{src/option} -- option types +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{HOL Basic Directories III} + +\begin{itemize} +\item \hol{src/num} -- numbers and arithmetic +\item \hol{src/pred\_set} -- predicate sets +\item \hol{src/datatype} -- Datatype package +\item \hol{src/list} -- list theories +\item \hol{src/monad} -- monads +\item \hol{src/quantHeuristics} -- instantiating quantifiers +\item \hol{src/unwind} -- lib for unwinding structural hardware definitions +\item \hol{src/pattern\_matches} -- pattern matches alternative +\item \hol{src/bossLib} -- main HOL lib loaded at start +\end{itemize} +\bigskip + +\hol{bossLib} is one central library. It loads all basic theories and libraries and +provides convenient wrappers for the most common tools. +\end{frame} + + +\begin{frame} +\frametitle{HOL More Theories I} + +Besides the basic libraries and theories that are required and loaded by \ml{hol}, there +are many more developements in HOL's source directory. + +\begin{itemize} +\item \hol{src/sort} -- sorting lists +\item \hol{src/string} -- strings +\item \hol{src/TeX} -- exporting LaTeX code +\item \hol{src/res\_quan} -- restricted quantifiers +\item \hol{src/quotient} -- quotient type package +\item \hol{src/finite\_map} -- finite map theory +\item \hol{src/bag} -- bags \aka multisets +\item \hol{src/n-bit} -- machine words +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{HOL More Theories II} + +\begin{itemize} +\item \hol{src/ring} -- reasoning about rings +\item \hol{src/integer} -- integers +\item \hol{src/llists} -- lazy lists +\item \hol{src/path} -- finite and infinite paths through a transition system +\item \hol{src/patricia} -- efficient finite map implementations using trees +\item \hol{src/emit} -- emitting SML and OCaml code +\item \hol{src/search} -- traversal of graphs that may contain cycles +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{HOL More Theories III} + +\begin{itemize} +\item \hol{src/rational} -- rational numbers +\item \hol{src/real} -- real numbers +\item \hol{src/complex} -- comples numbers +\item \hol{src/HolQbf} -- quantified boolean formulas +\item \hol{src/HolSmt} -- support for external SMT solvers +\item \hol{src/float} -- IEEE floating point numbers +\item \hol{src/floating-point} -- new version of IEEE floating point numbers +\item \hol{src/probability} -- some propability theory +\item \hol{src/temporal} -- shallow embedding of temporal logic +\item \ldots +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{HOL Selected Examples I} + +The directory examples hosts many theories and libraries as well. There is not +always a clear distinction between an example and a development in \ml{src}. However, +in general examples are more specialised and often larger. They are not required to +follow HOL's coding style as much as developments in \ml{src}. +\bigskip + +\begin{itemize} +\item \hol{examples/balanced\_bst} -- finite maps via balanced trees +\item \hol{examples/unification} -- (nominal) unification +\item \hol{examples/Crypto} -- various block ciphers +\item \hol{examples/elliptic} -- elliptic curve cryptography +\item \hol{examples/formal-languages} -- regular and context free formal languages +\item \hol{examples/computability} -- basic computability theory +\end{itemize} +\end{frame} + + + +\begin{frame} +\frametitle{HOL Selected Examples II} +\begin{itemize} +\item \hol{examples/set-theory} -- axiomatic formalisation of set theory +\item \hol{examples/lambda} -- lambda calculus +\item \hol{examples/acl2} -- connection to ACL2 prover +\item \hol{examples/theorem-prover} -- soundness proof of Milawa prover +\item \hol{examples/PSL} -- formalisation of PSL +\item \hol{examples/HolBdd} -- Binary Decision Diagrams +\item \hol{examples/HolCheck} -- basic model checker +\item \hol{examples/temporal\_deep} -- deep embedding of temporal logics and automata +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{HOL Selected Examples III} +\begin{itemize} +\item \hol{examples/pgcl} formalisation of pGCL (the Probabilistic Guarded Command Language) +\item \hol{examples/dev} -- some hardware compilation +\item \hol{examples/STE} -- symbolic trajectory evalutation +\item \hol{examples/separationLogic} -- formalisation of separation logic +\item \hol{examples/ARM} -- formalisation of ARM architecture +\item \hol{examples/l3-machine-code} -- l3 language +\item \hol{examples/machine-code} -- compilers and decompilers to machine-code +\item \ldots +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Concluding Remarks} +\begin{itemize} +\item some useful tools are a bit hidden in the HOL sources +\item moreover there are developments outside the main HOL 4 sources +\begin{itemize} +\item CakeML \emph{\url{https://cakeml.org}} +\end{itemize} +\item keep in touch with community to continue learning about HOL 4 +\begin{itemize} +\item mailing-list \ml{hol-info} +\item GitHub \emph{\url{https://github.com/HOL-Theorem-Prover/HOL}} +\item \emph{\url{https://hol-theorem-prover.org}} +\end{itemize} +\item if you continue using HOL, please consider sharing your work with the community +\end{itemize} +\end{frame} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/17_other_provers.tex b/lectures/17_other_provers.tex new file mode 100644 index 0000000..2231d80 --- /dev/null +++ b/lectures/17_other_provers.tex @@ -0,0 +1,266 @@ +\part{Other Interactive Theorem Provers} + +\frame[plain]{\partpage} + +\begin{frame} +\frametitle{Other Interactive Theorem Provers} + +\begin{itemize} +\item at the beginning we very briefly discussed other theorem provers +\item now, with more knowledge about HOL 4 we can discuss other provers and their differences to HOL 4 in more detail +\item HOL 4 is a good system +\item it is very well suited for the tasks required by the PROSPER project +\item however, as always \emph{choose the right tool for your task} +\item you might find a different prover more suitable for your needs +\item hopefully this course has enabled you to learn to use other provers on your own without much trouble +\end{itemize} +\end{frame} + + +\section{HOL 4} +\begin{frame} +\frametitle{HOL 4} + +\begin{itemize} +\item based on classical higher order logic +\item logic is sweet spot between expressivity and automation +\pro very trustworthy thanks to LCF approach +\pro simple enough to understand easily +\pro very easy to write custom proof tools, \ie own automation +\pro reasonably fast and efficient +\item decent automation +\con no user-interface +\con no special proof language +\con no IDE, very little editor support +\end{itemize} +\end{frame} + + +\section{HOL Omega} +\begin{frame} +\frametitle{HOL Omega} + +\begin{itemize} +\item mainly developed by Peter Homeier \emph{\url{http://www.trustworthytools.com/}} +\item extension of HOL 4 +\begin{itemize} +\pro logic extended by kinds +\pro allows type operator variables +\pro allows quantification over type variables +\end{itemize} +\pro sometimes handy to \eg model category theory +\con not very actively developed +\con HOL 4 usually sufficient and better supported +\end{itemize} +\end{frame} + + +\section{HOL Light} +\begin{frame} +\frametitle{HOL Light} + +\begin{itemize} +\item mainly developed by John Harrison +\item \emph{\url{https://github.com/jrh13/hol-light}} +\item cleanup and reimplementation of HOL in OCaml +\item little legacy code +\item however, still very similar to HOL 4 +\pro much better automation for real analysis +\pro cleaner +\con OCaml introduces some minor issues with trustworthiness +\con some other libs and tools of HOL 4 are missing +\con HOL 4 has bigger community +\end{itemize} +\end{frame} + + +\section{Isabelle} +\begin{frame} +\frametitle{Isabelle} + +\begin{itemize} +\item Isabelle is also a descendant of LCF +\item originally developed by Larry Paulson in Cambridge\\ +\emph{\url{https://www.cl.cam.ac.uk/research/hvg/Isabelle/}} +\item meanwhile also developed at TU Munich by Tobias Nipkow +\emph{\url{http://www21.in.tum.de}} +\item huge contributions by Markarius Wenzel\\ +\emph{\url{http://sketis.net}} +\item Isabelle is a generic theorem prover +\item most used instantiation is Isabelle/HOL +\item other important one is Isabelle/ZF +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Isabelle / HOL - Logic} + +\begin{itemize} +\item logic of Isabelle / HOL very similar to HOL's logic +\begin{itemize} +\item meta logic leads to meta level quantification and object level quantification +\pro type classes +\pro powerful module system +\pro existential variables +\item \ldots +\end{itemize} +\item Isabelle is implemented using the LCF approach +\item it uses SML (Poly/ML) +\item many original tools (\eg simplifier) similar to HOL +\item focused as HOL on equational reasoning +\item many tools are exchanged between HOL 4 and Isabelle / HOL +\begin{itemize} +\item Metis +\item Sledgehammer +\item \ldots +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Isabelle / HOL - Engineering} + +\begin{itemize} +\pro a lot of engineering went into Isabelle/HOL +\pro it has a very nice GUI +\begin{itemize} +\item IDE based on JEdit +\item special language for proofs (Isar) +\item good error messages +\item \ldots +\end{itemize} +\pro very good automation +\pro efficient implementations +\pro many libraries (Archive of Formal Proof) +\pro excellent code extraction +\pro good documentation +\pro easy for new users +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Isabelle / HOL - Isar} + +\begin{itemize} +\item special proof language Isar used +\item this allows to write \emph{declarative proofs} +\begin{itemize} +\item very high level +\item easy to read by humans +\item very robust +\item very good tool support +\item \ldots +\end{itemize} +\con however, tactical proofs are not easily accessible any more +\begin{itemize} +\item many intermediate goals need to be stated (declared) explicitly +\item this can be very tedious +\item tools like verification condition generators are hard to use +\end{itemize} +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Isabelle / HOL - Drawbacks} + +\begin{itemize} +\pro Isabelle/HOL provides excellent out of the box automation +\pro it provides a very nice user interface +\pro it is very nice for new users +\con however, this comes at a price +\begin{itemize} +\item multiple layers added between kernel and user +\item hard to understand all these layers +\item a lot of knowledge is needed to write your own automation +\end{itemize} +\con hard to write own automation +\con Isabelle/HOL due to focus on declarative proofs not well suited for \eg PROSPER +\end{itemize} +\end{frame} + +\section{Coq} +\begin{frame} +\frametitle{Coq} + +\begin{itemize} +\item Coq is a proof assistant using the Calculus of Inductive Constructions +\item inspired by HOL 88 +\item backward proofs as in HOL 4 used +\item however, very big differences +\begin{itemize} +\item much more powerful logic +\item dependent types +\item constructive logic +\item not exactly following LCF approach +\end{itemize} +\pro good user interface +\pro very good community support +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Coq - Logic} + +\begin{itemize} +\pro Coq's logic is very powerful +\pro it is very natural for mathematicians +\pro very natural for language theory +\pro allows reasoning about proofs +\item allows to add axioms as needed +\item as a result, Coq is used often to +\begin{itemize} +\item formalise mathematics +\item formalise programming language semantics +\item reason about proof theory +\end{itemize} +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Coq - Drawbacks} + +\begin{itemize} +\item Coq's power comes at a price +\con there is not much automation +\con proofs tend to be very long +\begin{itemize} +\item they are very simple though +\pro comparably easy to maintain +\end{itemize} +\con Coq's proof checking can be very slow +\con when verifying programs or hardware you notice that HOL was designed for this purpose +\begin{itemize} +\item need for \emph{obvious} termination is tedious +\item missing automation +\item very slow +\end{itemize} +\end{itemize} +\end{frame} + + +\section{Conclusion} + +\begin{frame} +\frametitle{Summary} + +\begin{itemize} +\item there are many good theorem provers out there +\item \emph{pick the right tool for your purpose} +\item the HOL theorem prover is a good system for many purposes +\item for PROSPER it is a good choice +\item I encourage you to continue learning about HOL and interactive theorem proving in general +\item if you have any questions feel free to contact me (Thomas Tuerk, email \emph{thomas@tuerk-brechen.de}) +\end{itemize} + +\end{frame} + + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "current" +%%% End: diff --git a/lectures/Makefile b/lectures/Makefile new file mode 100644 index 0000000..0495669 --- /dev/null +++ b/lectures/Makefile @@ -0,0 +1,65 @@ +.PHONY: full full-print current current-print all_parts all_parts_print all clean cleanAll all-slides all-print all_parts-all full-all default + +default : all + +PARTS = $(wildcard itp_parts_*.tex) + +current: version.inc + @./mk_slides.sh current current + +full: version.inc + @./mk_slides.sh full itp-course + +full-print: version.inc + @./mk_handout.sh full itp-course-print + +full-all: version.inc + @./mk_slides.sh full itp-course + @./mk_handout.sh full itp-course-print + +hol: version.inc + @./mk_slides.sh hol hol-course + +hol-print: version.inc + @./mk_handout.sh hol hol-course-print + +hol-all: version.inc + @./mk_slides.sh hol hol-course + @./mk_handout.sh hol hol-course-print + + +current-print: version.inc + @./mk_handout.sh current current-print + +itp_parts_%: version.inc + @./mk_slides.sh $@ $@ + +itp_parts_%-print: version.inc + @./mk_handout.sh $(patsubst %-print,%,$@) $@ + +itp_parts_%-all: version.inc + @./mk_slides.sh $(patsubst %-all,%,$@) $(patsubst %-all,%,$@) + @./mk_handout.sh $(patsubst %-all,%,$@) $(patsubst %-all,%-print,$@) + +all_parts : $(PARTS:.tex=) +all_parts-print : $(PARTS:.tex=-print) +all_parts-all : $(PARTS:.tex=-all) + +all-slides: version.inc full hol all_parts +all-print: version.inc hol-print full-print all_parts-print + +all: full-all hol-all all_parts-all + +clean: + rm -rf *.ps *.pdf *~ *.dvi *.aux *.log *.idx *.toc *.nav *.out *.snm *.flc *.vrb version.inc tmp + +cleanAll: clean + rm -rf pdfs + +version.inc: ../.git/logs/HEAD + @echo "%%% This file is generated by Makefile." > version.inc + @echo "%%% Do not edit this file!\n%%%" >> version.inc + @git log -1 --date=local --format="format:\ + \\gdef\\GITAbrHash{%h}\ + \\gdef\\GITAuthorDate{%ad}\ + \\gdef\\GITAuthorName{%an}" >> version.inc diff --git a/lectures/common.inc b/lectures/common.inc new file mode 100644 index 0000000..9456135 --- /dev/null +++ b/lectures/common.inc @@ -0,0 +1,109 @@ +\documentclass{beamer} + +\usepackage{pgf,pgfnodes,pgfarrows} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage[utf8]{inputenc} +\usepackage{hyperref} +\usepackage{booktabs} +\usepackage{mathpartir} +\usepackage{latexsym} +\usepackage{textcomp} + +\newcommand{\ie}{i.\,e.\ } +\newcommand{\eg}{e.\,g.\ } +\newcommand{\wrt}{w.\,r.\,t.\ } +\newcommand{\aka}{a.\,k.\,a.\ } +\newcommand{\cf}{cf.\ } +\newcommand{\etc}{etc.\ } +\newcommand{\cearrow}{\url{~}>} +\renewcommand{\emph}[1]{\structure{\textbf{#1}}} +\newcommand{\entails}{\vdash} +\newcommand{\hol}[1]{\emph{\texttt{#1}}} +\newcommand{\ml}[1]{\emph{\texttt{#1}}} +\newcommand{\textbsl}{\char`\\{}} +\newcommand{\holAnd}{/\textbsl{}} +\newcommand{\holOr}{\textbsl{}/} +\newcommand{\holLambda}{\textbsl{}} +\newcommand{\holImp}{==>} +\newcommand{\holEquiv}{<=>} +\newcommand{\holNeg}{\raisebox{0.5ex}{\texttildelow}} +\newcommand{\mlcomment}[1]{\structure{(* #1 *)}} +\newcommand{\aequiv}{\ensuremath{\stackrel{\alpha}{\equiv}}\ } +\newcommand\pro{\item[$+$]} +\newcommand\con{\item[$-$]} + +\newcommand{\bottomstatement}[1]{ +\begin{center} +\textbf{#1} +\end{center} +} + +\input{version.inc} + +\title{Interactive Theorem Proving (ITP) Course} +\institute{ +\includegraphics[width=1.25cm]{images/cc/cc.eps} +\includegraphics[width=1.25cm]{images/cc/by.eps} +\includegraphics[width=1.25cm]{images/cc/sa.eps}\\ +\scriptsize{Except where otherwise noted, this work is licened under\\ + \href{http://creativecommons.org/licenses/by-sa/4.0/}{Creative Commons Attribution-ShareAlike 4.0 International License}}} +\author{Thomas Tuerk (thomas@tuerk-brechen.de)} +\date{Academic Year 2016/17, Period 4} +\newcommand{\partstitle}[1]{\title{Interactive Theorem Proving (ITP) Course\\#1}} +\newcommand{\titleframe}{\frame[plain]{\titlepage\hfill\tiny version \GITAbrHash{} of \GITAuthorDate{}}} +\newcommand{\partstitleframe}[1]{\partstitle{#1}\titleframe} + + +\usetheme{Boadilla} +\setbeamertemplate{footline}[frame number]{} + + +\logo{\pgfputat{\pgfxy(-.5,8.7)}{\pgfbox[center,top]{\includegraphics[width=8mm]{images/cc/by-sa.eps}}}} + +\setbeamertemplate{part page} +{ + \begin{centering} + {\usebeamerfont{part name}\usebeamercolor[fg]{part name}\partname~\insertromanpartnumber} + \vskip1em\par + \begin{beamercolorbox}[sep=16pt,center]{part title} + \usebeamerfont{part title}\insertpart\par + \end{beamercolorbox} + \vfill + \begin{center} + \includegraphics[width=0.75cm]{images/cc/cc.eps} + \includegraphics[width=0.75cm]{images/cc/by.eps} + \includegraphics[width=0.75cm]{images/cc/sa.eps}\\ + \tiny{Except where otherwise noted, this work is licened under\\ + \href{http://creativecommons.org/licenses/by-sa/4.0/}{Creative Commons Attribution-ShareAlike 4.0 International License}}. + \end{center} + \end{centering} +} + +\makeatletter +\AtBeginPart{% + \addtocontents{toc}{\protect\beamer@partintoc{\the\c@part}{\beamer@partnameshort}{\the\c@page}{\the\numexpr\value{framenumber}+1\relax}}% +} +%% number, shortname, page. +\providecommand\beamer@partintoc[4]{% + \ifnum\c@tocdepth=-1\relax + % requesting onlyparts. + \qquad\makebox[5em][l]{\hyperlink{page.#3}{\emph{Part {\uppercase\expandafter{\romannumeral #1\relax}}}}} \makebox[18em][l]{\hyperlink{page.#3}{#2}} + \makebox[3em][r]{\hyperlink{page.#3}{#4}} + + \par + \fi +} +\define@key{beamertoc}{onlyparts}[]{% + \c@tocdepth=-1\relax +} +\makeatother + +%\usefonttheme[onlylarge]{structurebold} +%\usepackage{times} + +\ifdefined\ttbwflag + \usecolortheme{seagull} + \beamertemplatenavigationsymbolsempty +\fi diff --git a/lectures/current.tex b/lectures/current.tex new file mode 100644 index 0000000..22a92d5 --- /dev/null +++ b/lectures/current.tex @@ -0,0 +1,32 @@ +\input{common.inc} + +%\setbeamertemplate{footline}{} + +\setcounter{part}{2} +\setcounter{framenumber}{291} + +\begin{document} +\partstitleframe{Parts III} + +%\input{00_webpage_intro.tex} +%\input{01_introduction.tex} +%\input{02_organisational_matters.tex} +\input{03_hol_overview.tex} +%\input{04_hol_logic.tex} +%\input{05_usage.tex} +%\input{06_forward_proofs.tex} +%\input{07_backward_proofs.tex} +%\input{08_basic_tactics.tex} +%\input{09_induction.tex} +%\input{10_definitions.tex} +%\input{11_good_definitions.tex} +%\input{12_deep_shallow.tex} +%\input{13_rewriting.tex} +%\input{14_advanced_definitions.tex} +%\input{15_maintainable_proofs.tex} +%\input{16_hol_overview.tex} +%\input{17_other_provers.tex} + + +\end{document} + diff --git a/lectures/full.tex b/lectures/full.tex new file mode 100644 index 0000000..2c22061 --- /dev/null +++ b/lectures/full.tex @@ -0,0 +1,37 @@ +\input{common.inc} + +\begin{document} + +\titleframe +\begin{frame}{Contents} +\footnotesize +\tableofcontents[onlyparts] +\end{frame} + +\input{01_introduction.tex} +\input{02_organisational_matters.tex} +\input{03_hol_overview.tex} +\input{04_hol_logic.tex} +\input{05_usage.tex} +\input{06_forward_proofs.tex} +\input{07_backward_proofs.tex} +\input{08_basic_tactics.tex} +\input{09_induction.tex} +\input{10_definitions.tex} +\input{11_good_definitions.tex} +\input{12_deep_shallow.tex} +\input{13_rewriting.tex} +\input{14_advanced_definitions.tex} +\input{15_maintainable_proofs.tex} +\input{16_hol_overview.tex} +\input{17_other_provers.tex} + +% code extraction / cake ML +% conformance testing +% maintainable proofs +% overview over main tools / libs +% wordLib +% decision procedures + +\end{document} + diff --git a/lectures/hol.tex b/lectures/hol.tex new file mode 100644 index 0000000..397d977 --- /dev/null +++ b/lectures/hol.tex @@ -0,0 +1,34 @@ +\input{common.inc} + +\date{} + +\begin{document} + +\author{Thomas Tuerk (tuerk@thomas-tuerk.de)} +\partstitleframe{Web Version} + +\begin{frame}{Contents} +\footnotesize +\tableofcontents[onlyparts] +\end{frame} + +\input{00_webpage_intro.tex} +\input{01_introduction.tex} +\input{03_hol_overview.tex} +\input{04_hol_logic.tex} +\input{05_usage.tex} +\input{06_forward_proofs.tex} +\input{07_backward_proofs.tex} +\input{08_basic_tactics.tex} +\input{09_induction.tex} +\input{10_definitions.tex} +\input{11_good_definitions.tex} +\input{12_deep_shallow.tex} +\input{13_rewriting.tex} +\input{14_advanced_definitions.tex} +\input{15_maintainable_proofs.tex} +\input{16_hol_overview.tex} +\input{17_other_provers.tex} + +\end{document} + diff --git a/lectures/images/Makefile b/lectures/images/Makefile new file mode 100755 index 0000000..9bee8c1 --- /dev/null +++ b/lectures/images/Makefile @@ -0,0 +1,8 @@ +all: + latex hol-family.tex + dvips hol-family.dvi + ps2eps hol-family.ps + +clean: + rm -f *.dvi *.toc *.aux *.ps *.log *.lof *.bbl *.blg *.hix *.tid *.tde *.out *~ + diff --git a/lectures/images/cc/LICENSE b/lectures/images/cc/LICENSE new file mode 100644 index 0000000..5682b94 --- /dev/null +++ b/lectures/images/cc/LICENSE @@ -0,0 +1,3 @@ +The images in this directory are trademarks of creative-commons, +which are covered by the Creative Commons Trademark Policy +(https://creativecommons.org/policies). diff --git a/lectures/images/cc/by-sa.eps b/lectures/images/cc/by-sa.eps new file mode 100644 index 0000000..084c730 --- /dev/null +++ b/lectures/images/cc/by-sa.eps @@ -0,0 +1,2727 @@ +%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 8.0 %%AI8_CreatorVersion: 13.0.1 %%For: (Alex Roberts) () %%Title: (by-sa.eps) %%CreationDate: 3/27/08 4:27 PM %%BoundingBox: 340 278 461 321 %%HiResBoundingBox: 340.5 278.5 460.5 320.5 %%DocumentProcessColors: Cyan Magenta Yellow Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 4.0 %AI3_ColorUsage: Color %AI3_IncludePlacedImages %AI7_ImageSettings: 1 %%CMYKProcessColor: 0.74902 0.678431 0.670588 0.901961 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 1 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 -1 -1 () %AI3_Cropmarks: 340.5 278.5 460.5 320.5 %AI3_TemplateBox: 400.5 299.5 400.5 299.5 %AI3_TileBox: 112 -56 688 678 %AI3_DocumentPreview: Macintosh_ColorPic %AI5_ArtSize: 800 600 %AI5_RulerUnits: 6 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI8_OpenToView: -381 756 1 1566 923 26 0 0 73 75 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 48 8 48 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %AI7_Thumbnail: 128 48 8 %%BeginData: 8722 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45A8FD7DF827A8F8275258527D5258527D5258527D5258527D525852 %7D5258527D5258527D5258527D5258527D5258527D5258527D5258527D52 %58527D5258527D5258527D5258527D5258527D5258527D5258527D525852 %7D5258527D5258527D5258527D5258527D5258527D5258527D5258527D52 %58527D5258527D5258527D5258527DF8F8F852A87D837DA87D837DA87D83 %7DA87D837DA87D847DA87D837DA87D837DA87D837DA87D837DA87D837DA8 %7D837DA87D837DA87D837DA87D837DA87D837DA87DA87DA883A87DA87D83 %7DA87D837DA87D837DA87D837DA87D837DA87D837DA87DA87DA883A87DA8 %7D837DA87D837DA87D837DA87D837DA87D837DA87D837D7DF8F8FD127D83 %FD2C7D58FD0652FD177D587D52522E5252FD197D52F8F852A87D837D837D %837D837D837DA87D83587D2DFD042752527D7DA87D847D837D837D837D83 %7D837D837D837D837D837D837D837D837D837D837DA87D7D2727FD05F827 %27527DA87D837D837D837D837D837D837D837DA87D7D2727FD05F8040452 %7DA87D837D837D837D837D837D837D837D837D837D837D7DF8F8FD0E7D52 %27FD0AF827277D7D83FD1B7D845227FD0BF8275284FD0F7D52FD0CF82DFD %157D52F8F858837D837D7D7D837D7D7DA85227FD0FF82D7DA87D7D7D837D %7D7D837D7D7D837D7D7D837D7D7D837D7D7D837DA852FD04F8527DA8A8A8 %7D52FD04F827A87D7D7D837D7D7D837D7D7DA87D27F8F8F85252A8A8A87D %7D27F8F8F8277D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7DF8F8FD %0B7D27FD06F827275252522727FD06F85283FD177D8352F8F8F827A8FD08 %FF52F8F8F82783FD0A7D5227F8F8F8A8FD08FF7DF8F8F804FD137D52F8F8 %58A87D837D837D837D8327FD04F8277DA8FD07FFA852FD05F852A87D837D %837D837D837D837D837D837D837D837D837DA858F8F8F87DFD04FF7D277D %FD04FFA827F8F852A87D837D837D837D837D27F8F852FD0BFFA852F8F827 %A87D837D837D837D837D837D837D837D837D7DF8F8FD087D8327FD04F87D %A8FD0BFFA852FD04F85283FD157D27F8F87DFD04FFA8F8F8F8A8FD04FFA8 %F8F8F858FD087D27F8F852FD05FFA8A8A8FD05FFA827F8F85284FD0F7D83 %52F8F852A87D7D7D837DA827FD04F8A8FD0FFF7DFD04F852A87D837D7D7D %837D7D7D837D7D7D837D7D7D837D52F8F852FD05FF7DF8F8F87DFD05FF7D %F8F8527D7D7D83FD047DF8F827FD04FFA827FD04F852A8FFFFFFA827F827 %7D837D7D7D837D7D7D837D7D7D83FD047DF8F859FD057D8352FD04F8A8FD %11FF7DF8F8F804FD147DF8F8F8FD07FF522752FD07FF27F8F8FD077D27F8 %F8A8FFFFFFA8FD08F87DFFFFFF7DF8F852FD107D52F8F852A87D837DA87D %27F8F8F8A8FD13FF7DF8F8F8527D847D837D837D837D837D837D837D837D %A852F8F8A8FD06FF527D527D52A8FD05FFA8F8F852A87D837D837D27F852 %FD04FFF8F8F8272752F8F8F827A8FFFFFF27F827A87D837D837D837D837D %837D837D837D7DF8F8FD067D52F8F8F87DFD15FF52F8F8F8FD127D52F8F8 %A8FD05FF27FD06F8FD06FF27F827FD057D52F8F87DFFFFFF7DF8F827A8FF %FFFFF8F8F852FFFFFF7DF8F858FD0F7D52F8F858837D837D7DF8F8F852FD %17FF27F8F827A87D837D7D7D837D7D7D837D7D7D837D8327F827FD06FF27 %FD06F8A8FD05FF52F8F8837D7D7DA852F8F8FFFFFFA827F8F827FD04FF7D %F8F8F8FFFFFF7DF8F87D7D837D7D7D837D7D7D837D7D7D837D7DF8F8FD04 %7D8327F8F8F8A8FD17FF52F8F8F858FD107D27F852FD06FFFD07F8FD06FF %7DF8F858FD047D52F827A8FFFFA8F8F8F827A8FFFFFF7DF8F8F87DFFFFA8 %F8F852FD0F7D52F8F858A87DA87D27F8F827FD05FF7D5227527DFD05FF7D %5227527DFD05FFF8F8F8527D837D837D837D837D837D837D837D7DF8F87D %FD06FF27FD05F827FD06FF7DF8F87D7D837DA82DF827FD04FFA8F827FD06 %FFF8F8F8A8FFFFFF27F8587D837D837D837D837D837D837D837D7DF8F8FD %057DF8F8F87DFD04FF52FD06F8A8FFFFFD06F827FD04FF27F8F82783FD0F %7D27F87DFD06FFFD07F8FD06FF7DF8F858FD047D52F827FD05FFA8A8FD05 %FFA8F8F8F87DFFFFA8F8F852FD0E7D8352F8F852A87D8352F8F8F8A8FFFF %FF7DF8F8F82727F8F8F8FF27F8F8272727F8F852FFFFFF7DF8F8277D7D7D %837D7D7D837D7D7D837D7D7D8327F827FD06FF52FD05F852FD06FF52F8F8 %7D7D837DA827F8F8FD04FFA87D7DA8FD04FFA8F8F8F8FFFFFFA8F8F8FD04 %7D837D7D7D837D7D7D83FD047DF8F8597D7D7D52F8F8F8FD04FF27F8F852 %FFFF52F87D7DF8F8F8A8FFA82727A8FFFFFF7DF8F8F8FD107D27F827A8FD %06FF7DF8F8F87DFD07FF27F827FD057D52F8F8A8FFFFFF27F8F852FD04FF %27F8F827FFFFFF7DF8F852FD0F7D52F8F852A87DA852F8F852FFFFFFA8F8 %F8F8FD06FF7DF8F852FFFFFFA8FD05FFA8F8F8277D837D837D837D837D83 %7D837D837DA852F8F8A8FD06FF7DF8F8F852FD07FFF8F827A87D837D837D %27F87DFFFFFF7DF8F8F87DA8FF52F8F8F87DFFFFFF27F8F8837D837D837D %837D837D837D837D837D7DF8F8FD047D52F8F827FFFFFF7DF8F827FD06FF %27F8F87DFD09FFA8F8F8F8FD117DF8F827FD06FF7DF8F8F87DFD06FF52F8 %F8FD077DF8F8F8FD04FF27FD08F827FFFFFFA8F8F82DFD107D52F8F85883 %7DA852F8F852FFFFFFA8F8F8F8FD06FF52F8F852FD09FFA8F8F8F87D837D %7D7D837D7D7D837D7D7D837D7D7D52F8F87DFD05FF7DF8F8F852FD05FFA8 %27F8277D837D7D7D837D52F8F852FFFFFFA827FD06F827FD04FF52F8F858 %837D837D7D7D837D7D7D837D7D7D837D7DF8F8FD047D52F8F827FFFFFFA8 %F8F8F87DFFFFA852FF52F8F827FFFFFF7D7DFD04FFA8F8F8F8FD117D52F8 %F8F8A8FD04FF7DF8F8F87DFD04FFA827F8F852FD087D27F8F87DFD04FF7D %272727527DFD04FF52F8F82783FD107D52F8F858A87DA852F8F827FD04FF %27F8F8277DA827F827A8F8F8F852A87DF8F852FFFFFF7DF8F8277DA87D83 %7D837D837D837D837D837D837DA852F8F827A8FFFFFF7DF8F8F87DFD04FF %27F8F827A87D837D837D837DA87D27F8F87DFD0CFF7DF8F8F8837D837D83 %7D837D837D837D837D837D837D7DF8F8FD057DF8F8F8A8FFFFFFA8FD07F8 %52FF7DFD07F87DFFFFFF52F8F827FD127D8327F8F8F87DFFFFFFA8FFA8FF %FFFF7D27F8F8F8FD0A7D8352F8F8F852FD09FFA852F8F8F8FD127D8352F8 %F852A87D837D27F8F852FD04FFA827FD04F87DFFFFFF7DFD04F827A8FD04 %FF27F8F8527D7D7D837D7D7D837D7D7D837D7D7D837D7D7DA827F8F8F827 %7DA8FFFFFFA8A827F8F8F8277D7D837D7D7D837D7D7D837DA852FD04F87D %A8FD04FFA85227F8F8F8FD047D837D7D7D837D7D7D837D7D7D83FD047DF8 %F859FD047D27F8F827A8FD05FFA87D7DFFFFFFA8FFFFFF7DA8A8FD05FF7D %F8F8F85283FD137D8352FD06F827FD06F827FD0E7D835227FD05F827F827 %FD04F827FD157D52F8F852A87D837D7DF8F8F87DFD17FF52F8F8F8847D83 %7D837D837D837D837D837D837D837D837D837DA87D52FD09F82D58A87D83 %7D837D837D837D837D837D837DA87D52FD09F82752A87D837D837D837D83 %7D837D837D837D837D837D837D7DF8F8FD067D27F8F8F8FD16FF7DF8F8F8 %52FD1A7D52522727272D52FD177D525227272752527D7D84FD167D52F8F8 %58837D837D8452F8F8F827FD15FFF8F8F8277D837D837D7D7D837D7D7D83 %7D7D7D837D7D7D837D7D7D837D7D7DA87D847DA87D847D837D7D7D837D7D %7D837D7D7D837D7D7D837D7D7D837D837DA87D847DA87D7D7D837D7D7D83 %7D7D7D837D7D7D837D7D7D837D7D7D837D7DF8F8FD047D837D7D27F8F8F8 %52FD13FFFD04F852837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D %7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D %837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D7D7D837D %7D7D837D7D7DA852F8F8527D527D52837D83FD04F852FD11FF27F8F8F827 %A87D7D527D5258527D5258527D5258527D5258527D5258527D5258527D52 %58527D5258527D5258527D5258527D5258527D5258527D5258527D525852 %7D5258527D5258527D5258527D5258527D5258527D5258527D5258527D52 %52FD07F8527D7D7DFD04F827FD0EFFA8FD05F87D7D8327FD5FF8277D837D %7DFD05F87DA8FD09FFA852FD05F87D7DA852FD61F852FD047DFD05F82727 %7D7DA8A8A87D7D27FD05F8277D7D8358FD63F8527D847D7D27FD08F827FD %07F82752A87DA87D27FD17F8277DA87D7D27277D7DF8F827A827FD11F827 %A8A8A827F8F8277D7DFD24F852FD047D5227FD0DF82752A87D7D7D27FD18 %F852FFA8A8FFFFF8A8FF27F8A8FF27FD10F827FFA87DFFFFF8F827FFFF27 %FD24F8527DA87DA87D7D2727FD07F827277D7D837DA87D27FD19F852FF27 %F87DFF27F8FFA852FF7DFD11F87DFF52F8527D27F8A8FFFF7DFD25F82758 %837D7D7D837D7DFD05527D7D83FD047D52FD1BF827FF7D7DA8A8F8F852FF %FFFFFD13F8FFFFA852F8F827FF7D52FFFD26F82752837DA87D837DA87DA8 %7DA87D837DA87D7D27FD1CF852FFA87DFFFF52F8F8A8FF52FD14F87DA8FF %A82752FF2752FF52FD28F85258837D7D7D837D7D7D837D7D522DFD1EF852 %FFF8F8F8FF7DF8F87DFF27FD12F8527DF8F852FF277DFFFFA8FF7DFD29F8 %042752527D527D587D525227FD20F852FFA852A8FF7DF8F87DFF27FD12F8 %7DFFA827A8FF52FFA82727A8FFFD55F827A8A8FFA87DF8F8F852A827FD13 %F87DA8FFA85227FFF8F8F852A852FD74F827F827FDA1F852FD7F27FD7FFF %FF %%EndData %%EndComments %%BeginProlog %%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 0 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 26 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + (AI8_CMYK_CustomColor) + 6 packedarray + } bind def + /findrgbcustomcolor + { + (AI8_RGB_CustomColor) + 5 packedarray + } bind def + /setcustomcolor + { + exch + aload pop dup + (AI8_CMYK_CustomColor) eq + { + pop pop + 4 + { + 4 index mul + 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + { + dup (AI8_RGB_CustomColor) eq + { + pop pop + 3 + { + 1 exch sub + 3 index mul + 1 exch sub + 3 1 roll + } repeat + 4 -1 roll pop + setrgbcolor + } + { + pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } ifelse + } ifelse + } + def + } if + /setAIseparationgray + { + false setoverprint + 0 setgray + /setseparationgray where{ + pop setseparationgray + }{ + /setcolorspace where{ + pop + [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace + 1 exch sub setcolor + }{ + setgray + }ifelse + }ifelse + } def + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 53 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin +/initialize { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 { + dup type /arraytype eq { + dup xcheck { + bind + } if + } if + pop pop + } forall +} def +/terminate { end } def +currentdict /Adobe_ColorImage_AI6_Vars known not { + /Adobe_ColorImage_AI6_Vars 41 dict def +} if +Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /_newproc null def + /_proc1 null def + /_proc2 null def + /sourcearray 4 array def + /_ptispace null def + /_ptiname null def + /_pti0 0 def + /_pti1 0 def + /_ptiproc null def + /_ptiscale 0 def + /_pticomps 0 def + /_ptibuf 0 string def + /_gtigray 0 def + /_cticmyk null def + /_rtirgb null def + /XIEnable true def + /XIType 0 def + /XIEncoding 0 def + /XICompression 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIRowBytes 0 def + /XIFile null def + /XIBuffer1 null def + /XIBuffer2 null def + /XIBuffer3 null def + /XIDataProc null def + /XIColorSpace /DeviceGray def + /XIColorValues 0 def + /XIPlateList false def +end +/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def +/ci6image systemdict /image get def +/ci6curtransfer systemdict /currenttransfer get def +/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def +/ci6foureq { + 4 index ne { + pop pop pop false + }{ + 4 index ne { + pop pop false + }{ + 4 index ne { + pop false + }{ + 4 index eq + } ifelse + } ifelse + } ifelse +} def +/ci6testplate { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /setcmykcolor where { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + 1 0 0 0 ci6foureq { + /plateindex 0 def + }{ + 0 1 0 0 ci6foureq { + /plateindex 1 def + }{ + 0 0 1 0 ci6foureq { + /plateindex 2 def + }{ + 0 0 0 1 ci6foureq { + /plateindex 3 def + }{ + 0 0 0 0 ci6foureq { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end +} def +/ci6concatprocs { + /packedarray where { + pop dup type /packedarraytype eq 2 index type + /packedarraytype eq or + }{ + false + } ifelse + { + /_proc2 exch cvlit def + /_proc1 exch cvlit def + _proc1 aload pop + _proc2 aload pop + _proc1 length + _proc2 length add + packedarray cvx + }{ + /_proc2 exch cvlit def + /_proc1 exch cvlit def + /_newproc _proc1 length _proc2 length add array def + _newproc 0 _proc1 putinterval + _newproc _proc1 length _proc2 putinterval + _newproc cvx + } ifelse +} def +/ci6istint { + type /arraytype eq +} def +/ci6isspot { + dup type /arraytype eq { + dup length 1 sub get /Separation eq + }{ + pop false + } ifelse +} def +/ci6spotname { + dup ci6isspot {dup length 2 sub get}{pop ()} ifelse +} def +/ci6altspace { + aload pop pop pop ci6colormake +} def +/ci6numcomps { + dup /DeviceGray eq { + pop 1 + }{ + dup /DeviceRGB eq { + pop 3 + }{ + /DeviceCMYK eq { + 4 + }{ + 1 + } ifelse + } ifelse + } ifelse +} def +/ci6marksplate { + dup /DeviceGray eq { + pop plateindex 3 eq + }{ + dup /DeviceRGB eq { + pop plateindex 5 ne + }{ + dup /DeviceCMYK eq { + pop plateindex 5 ne + }{ + dup ci6isspot { + /findcmykcustomcolor where { + pop + dup length 2 sub get + 0.1 0.1 0.1 0.1 5 -1 roll + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop plateindex 5 ne + } ifelse + }{ + pop plateindex 5 ne + } ifelse + } ifelse + } ifelse + } ifelse +} def +/ci6colormake { + dup ci6numcomps + exch 1 index 2 add 1 roll + dup 1 eq {pop}{array astore} ifelse + exch +} def +/ci6colorexpand { + dup ci6spotname exch + dup ci6istint { + ci6altspace + exch 4 1 roll + }{ + 1 3 1 roll + } ifelse +} def +/ci6colortint { + dup /DeviceGray eq { + 3 1 roll 1 exch sub mul 1 exch sub exch + }{ + dup /DeviceRGB eq { + 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch + }{ + dup /DeviceCMYK eq { + 3 1 roll {1 index mul exch} forall pop 4 array astore exch + }{ + 3 1 roll mul exch + } ifelse + } ifelse + } ifelse +} def +/ci6colortocmyk { + dup /DeviceGray eq { + pop 1 exch sub 0 0 0 4 -1 roll 4 array astore + }{ + dup /DeviceRGB eq { + pop aload pop _rgbtocmyk 4 array astore + }{ + dup /DeviceCMYK eq { + pop + }{ + ci6altspace ci6colortint ci6colortocmyk + } ifelse + } ifelse + } ifelse +} def +/ci6makeimagedict { + 7 dict begin + /ImageType 1 def + /Decode exch def + /DataSource exch def + /ImageMatrix exch def + /BitsPerComponent exch def + /Height exch def + /Width exch def + currentdict end +} def +/ci6stringinvert { + 0 1 2 index length 1 sub { + dup 2 index exch get 255 exch sub 2 index 3 1 roll put + } for +} def +/ci6stringknockout { + 0 1 2 index length 1 sub { + 255 2 index 3 1 roll put + } for +} def +/ci6stringapply { + 0 1 4 index length 1 sub { + dup + 4 index exch get + 3 index 3 1 roll + 3 index exec + } for + pop exch pop +} def +/ci6walkrgbstring { + 0 3 index + dup length 1 sub 0 3 3 -1 roll { + 3 getinterval {} forall + 5 index exec + 3 index + } for + + 5 {pop} repeat +} def +/ci6walkcmykstring +{ + 0 3 index + dup length 1 sub 0 4 3 -1 roll { + 4 getinterval {} forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + +} def +/ci6putrgbtograystr +{ + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add +} def +/ci6putcmyktograystr +{ + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add +} def +/ci6rgbtograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putrgbtograystr load exch + ci6walkrgbstring + end +} def +/ci6cmyktograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putcmyktograystr load exch + ci6walkcmykstring + end +} def +/ci6separatecmykproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + + XIBuffer3 + + 0 2 index + + plateindex 4 2 index length 1 sub { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + pop pop exch pop + end +} def + +/ci6compositeimage { + dup 1 eq { + pop pop image + }{ + /ci6colorimage load null ne { + ci6colorimage + }{ + 3 1 roll pop + sourcearray 0 3 -1 roll put + 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load + image + } ifelse + } ifelse +} def +/ci6knockoutimage { + gsave + 0 ci6curtransfer exec 1 ci6curtransfer exec + eq { + 0 ci6curtransfer exec 0.5 lt + }{ + 0 ci6curtransfer exec 1 ci6curtransfer exec gt + } ifelse + {{pop 0}}{{pop 1}} ifelse + systemdict /settransfer get exec + ci6compositeimage + grestore +} def +/ci6drawimage { + ci6testplate -1 eq { + pop ci6compositeimage + }{ + dup type /arraytype eq { + dup length plateindex gt {plateindex get}{pop false} ifelse + }{ + { + true + }{ + dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse + } ifelse + } ifelse + { + dup 1 eq { + pop pop ci6image + }{ + dup 3 eq { + ci6compositeimage + }{ + pop pop + sourcearray 0 3 -1 roll put + /ci6separatecmykproc load + ci6image + } ifelse + } ifelse + }{ + ci6curoverprint { + 7 {pop} repeat + }{ + ci6knockoutimage + } ifelse + } ifelse + } ifelse +} def +/ci6proctintimage { + /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store + /_pticomps _ptispace ci6numcomps store + /_ptiscale _pti1 _pti0 sub store + level2? { + _ptiname length 0 gt version cvr 2012 ge and { + [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace + [_pti0 _pti1] ci6makeimagedict ci6image + }{ + [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace + [0 255] ci6makeimagedict ci6image + } ifelse + }{ + _pticomps 1 eq { + { + dup + { + 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put + } ci6stringapply + } ci6concatprocs ci6image + }{ + { + dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse + _ptibuf { + exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc + _pticomps 2 add -2 roll + _pticomps 1 sub -1 0 { + 1 index add 2 index exch + 5 -1 roll + 255 mul cvi put + } for + pop pop + } ci6stringapply + } ci6concatprocs false _pticomps + /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse + } ifelse + } ifelse +} def +/ci6graytintimage { + /_gtigray 5 -1 roll store + {1 _gtigray sub mul 1 exch sub} 4 1 roll + /DeviceGray ci6proctintimage +} def +/ci6cmyktintimage { + /_cticmyk 5 -1 roll store + {_cticmyk {1 index mul exch} forall pop} 4 1 roll + /DeviceCMYK ci6proctintimage +} def +/ci6rgbtintimage { + /_rtirgb 5 -1 roll store + {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll + /DeviceRGB ci6proctintimage +} def +/ci6tintimage { + ci6testplate -1 eq { + ci6colorexpand + 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll + dup /DeviceGray eq { + pop ci6graytintimage + }{ + dup /DeviceRGB eq { + pop ci6rgbtintimage + }{ + pop ci6cmyktintimage + } ifelse + } ifelse + }{ + dup ci6marksplate { + plateindex 5 lt { + ci6colortocmyk plateindex get + dup 0 eq ci6curoverprint and { + 7 {pop} repeat + }{ + 1 exch sub + exch {1 0}{0 1} ifelse () ci6graytintimage + } ifelse + }{ + pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage + } ifelse + }{ + ci6curoverprint { + 8 {pop} repeat + }{ + pop pop pop + {pop 1} 0 1 () /DeviceGray ci6proctintimage + } ifelse + } ifelse + } ifelse +} def +/XINullImage { +} def +/XIImageMask { + XIImageWidth XIImageHeight false + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + imagemask +} def +/XIImageTint { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + XIType 3 eq XIColorValues XIColorSpace ci6tintimage +} def +/XIImage { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + false XIChannelCount XIPlateList ci6drawimage +} def +/XG { + pop pop +} def +/XF { + 13 {pop} repeat +} def +/Xh { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + /XIImageHeight exch def + /XIImageWidth exch def + /XIImageMatrix exch def + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + /_lp /null ddef + _fc + /_lp /imagemask ddef + end +} def +/XH { + Adobe_ColorImage_AI6_Vars begin + grestore + end +} def +/XIEnable { + Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put +} def +/XC { + Adobe_ColorImage_AI6_Vars begin + ci6colormake + /XIColorSpace exch def + /XIColorValues exch def + end +} def +/XIPlates { + Adobe_ColorImage_AI6_Vars begin + /XIPlateList exch def + end +} def +/XI +{ + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + cvi dup + 256 idiv /XICompression exch store + 256 mod /XIEncoding exch store + pop pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + XIBitsPerPixel 1 eq { + XIImageWidth 8 div ceiling cvi + }{ + XIImageWidth XIChannelCount mul + } ifelse + /XIRowBytes exch def + XIEnable { + /XIBuffer3 XIImageWidth string def + XICompression 0 eq { + /XIBuffer1 XIRowBytes string def + XIEncoding 0 eq { + {currentfile XIBuffer1 readhexstring pop} + }{ + {currentfile XIBuffer1 readstring pop} + } ifelse + }{ + /XIBuffer1 256 string def + /XIBuffer2 XIRowBytes string def + {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if} + /ASCII85Decode filter /DCTDecode filter + /XIFile exch def + {XIFile XIBuffer2 readstring pop} + } ifelse + /XIDataProc exch def + + XIType 1 ne { + 0 setgray + } if + XIType 1 eq { + XIImageMask + }{ + XIType 2 eq XIType 3 eq or { + XIImageTint + }{ + XIImage + } ifelse + } ifelse + }{ + XINullImage + } ifelse + /XIPlateList false def + grestore + end +} def +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0 +%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog) +%%Version: 1.3 0 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin +put +/_?cmyk false def +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_lineorientation 0 def +/_charorientation 0 def +/_yokoorientation 0 def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_shift [0 0] def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fontSize 0 def +/_fontAscent 0 def +/_fontDescent 0 def +/_fontHeight 0 def +/_fontRotateAdjust 0 def +/Ss 256 string def +Ss 0 (fonts/) putinterval +/_cnt 0 def +/_scale [1 1] def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_hfname 100 string def +/_hffound false def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_rgbf 3 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_rgbs 3 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/_lobyte 0 def +/_hibyte 0 def +/_cproc null def +/_cscript 0 def +/_hvax 0 def +/_hvay 0 def +/_hvwb 0 def +/_hvcx 0 def +/_hvcy 0 def +/_bitfont null def +/_bitlobyte 0 def +/_bithibyte 0 def +/_bitkey null def +/_bitdata null def +/_bitindex 0 def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 100 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + /_aicmykps where {pop /_?cmyk _aicmykps def}if + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/hswj +{ + dup stringwidth 3 2 roll + { + _hvwb eq { exch _hvcx add exch _hvcy add } if + exch _hvax add exch _hvay add + } cforall +} def +/vswj +{ + 0 0 3 -1 roll + { + dup 255 le + _charorientation 1 eq + and + { + dup cstring stringwidth 5 2 roll + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + 4 -1 roll sub exch + 3 -1 roll sub exch + } + { + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + _fontHeight sub + } ifelse + } cforall +} def +/swj +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hswj } { vswj } ifelse +} def +/sw +{ + 0 0 0 6 3 roll swj +} def +/vjss +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + gsave + 2 index false charpath + 6 index setmatrix stroke + grestore + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjss +{ + 4 1 roll + { + dup cstring + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jss +{ + _lineorientation 0 eq { hjss } { vjss } ifelse +} def +/ss +{ + 0 0 0 7 3 roll jss +} def +/vjsp +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + false charpath + currentpoint + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + 2 index false charpath + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjsp +{ + 4 1 roll + { + dup cstring + false charpath + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jsp +{ + matrix currentmatrix + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/sp +{ + matrix currentmatrix + 0 0 0 7 3 roll + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/_rgbtocmyk +{ + 3 + { + 1 exch sub 3 1 roll + } repeat + 3 copy 1 4 1 roll + 3 + { + 3 index 2 copy gt + { + exch + } if + pop 4 1 roll + } repeat + pop pop pop + 4 1 roll + 3 + { + 3 index sub + 3 1 roll + } repeat + 4 -1 roll +} def +/setrgbfill +{ + _rgbf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _rgbf aload pop setrgbcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/setrgbstroke +{ + _rgbs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _rgbs aload pop setrgbcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xa +{ + _?cmyk { + 3 npop k + }{ + setrgbfill 4 npop + } ifelse +} def +/XA +{ + _?cmyk { + 3 npop K + }{ + setrgbstroke 4 npop + } ifelse +} def +/Xs +{ + /_gf exch ddef + 5 npop + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setAIseparationgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XS +{ + /_gs exch ddef + 5 npop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setAIseparationgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xx +{ + exch + /_gf exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XX +{ + exch + /_gs exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/XK +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + K + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + XA + } ifelse +} def +/Xk +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + k + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + Xa + } ifelse +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/Xt { + pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + endString eq { + cleartomark stop + } if + }ifelse + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + }ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 6 npop + 7 2 roll + 5 npop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 4 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setrgbcolor +{ + 3 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +/XP +{ + 4 npop +} bind def +/XD +{ + pop +} bind def +end +setpacking +%%EndResource +%%BeginResource: procset Adobe_cshow 2.0 8 +%%Title: (Writing System Operators) +%%Version: 2.0 8 +%%CreationDate: (1/23/89) () +%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_cshow 14 dict dup begin put +/initialize +{ + Adobe_cshow begin + Adobe_cshow + { + dup xcheck + { + bind + } if + pop pop + } forall + end + Adobe_cshow begin +} def +/terminate +{ +currentdict Adobe_cshow eq + { + end + } if +} def +/cforall +{ + /_lobyte 0 ddef + /_hibyte 0 ddef + /_cproc exch ddef + /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef + { + /_lobyte exch ddef + _hibyte 0 eq + _cscript 1 eq + _lobyte 129 ge _lobyte 159 le and + _lobyte 224 ge _lobyte 252 le and or and + _cscript 2 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 3 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 25 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript -1 eq + or or or or and + { + /_hibyte _lobyte ddef + } + { + _hibyte 256 mul _lobyte add + _cproc + /_hibyte 0 ddef + } ifelse + } forall +} def +/cstring +{ + dup 256 lt + { + (s) dup 0 4 3 roll put + } + { + dup 256 idiv exch 256 mod + (hl) dup dup 0 6 5 roll put 1 4 3 roll put + } ifelse +} def +/clength +{ + 0 exch + { 256 lt { 1 } { 2 } ifelse add } cforall +} def +/hawidthshow +{ + { + dup cstring + show + _hvax _hvay rmoveto + _hvwb eq { _hvcx _hvcy rmoveto } if + } cforall +} def +/vawidthshow +{ + { + dup 255 le + _charorientation 1 eq + and + { + -90 rotate + 0 _fontRotateAdjust rmoveto + cstring + _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow + 0 _fontRotateAdjust neg rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + exch _hvay sub exch _hvax sub + 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if + 3 2 roll + cstring + dup stringwidth pop 2 div neg _fontAscent neg rmoveto + show + moveto + } ifelse + } cforall +} def +/hvawidthshow +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse +} def +/hvwidthshow +{ + 0 0 3 -1 roll hvawidthshow +} def +/hvashow +{ + 0 0 0 6 -3 roll hvawidthshow +} def +/hvshow +{ + 0 0 0 0 0 6 -1 roll hvawidthshow +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_shading_AI8 1.0 0 +%%Title: (Adobe Illustrator 8 Shading Procset) +%%Version: 1.0 0 +%%CreationDate: (12/17/97) () +%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /Adobe_shading_AI8 10 dict dup begin put +/initialize { + Adobe_shading_AI8 begin + Adobe_shading_AI8 bdprocs + Mesh /initialize get exec +} def +/terminate { + currentdict Adobe_shading_AI8 eq { + end + } if +} def +/bdprocs { + { + dup xcheck 1 index type /arraytype eq and { + bind + } if + pop pop + } forall +} def +/X! {pop} def +/X# {pop pop} def +/Mesh 40 dict def +Mesh begin +/initialize { + Mesh bdprocs + Mesh begin + /emulate? /AI8MeshEmulation where { + pop AI8MeshEmulation + }{ + systemdict /shfill known not + } ifelse def + end +} def +/bd { + shadingdict begin +} def +/paint { + emulate? { + end + }{ + /_lp /none ddef _fc /_lp /none ddef + + /AIColorSpace AIColorSpace tocolorspace store + /ColorSpace AIColorSpace topsspace store + + version_ge_3010.106 not systemdict /setsmoothness known and { + 0.0001 setsmoothness + } if + + composite? { + /DataSource getdatasrc def + Matrix concat + currentdict end + shfill + }{ + AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and { + end + }{ + /ColorSpace /DeviceGray store + /Decode [0 1 0 1 0 1] store + /DataSource getplatesrc def + Matrix concat + currentdict end + shfill + } ifelse + } ifelse + } ifelse +} def +/shadingdict 12 dict def +shadingdict begin + /ShadingType 6 def + /BitsPerCoordinate 16 def + /BitsPerComponent 8 def + /BitsPerFlag 8 def +end +/datafile null def +/databuf 256 string def +/dataptr 0 def +/srcspace null def +/srcchannels 0 def +/dstchannels 0 def +/dstplate 0 def +/srctodstcolor null def +/getplatesrc { + /srcspace AIColorSpace store + /srcchannels AIColorSpace getnchannels store + /dstchannels 1 store + /dstplate getplateindex store + /srctodstcolor srcspace makesmarks { + dstplate 4 eq { + {1 exch sub} + }{ + {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat} + } ifelse + }{ + {srcchannels {pop} repeat 1} + } ifelse store + /datafile getdatasrc store + /rdpatch168 load DataLength () /SubFileDecode filter +} def +/getdatasrc { + /rdcmntline load /ASCII85Decode filter +} def +/rdpatch168 { + /dataptr 0 store + 49 rdcount + 4 { + dup {pop srcchannels getint8} if + dup {pop srctodstcolor dstchannels putint8 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdpatch3216 { + /dataptr 0 store + 97 rdcount + 4 { + dup {pop srcchannels getint16} if + dup {pop srctodstcolor dstchannels putint16 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdcount { + dup 0 gt { + datafile databuf dataptr 4 -1 roll getinterval readstring + exch length dataptr add /dataptr exch store + }{ + true + } ifelse +} def +/getint8 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 255 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint8 { + dup dataptr add /dataptr exch store + dataptr exch + { + 1 sub exch + 255 mul cvi + databuf 2 index + 3 -1 roll put + } repeat + pop +} def +/getint16 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 256 mul datafile read} if + dup {pop add 65535 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint16 { + dup 2 mul dataptr add /dataptr exch store + dataptr exch + { + 2 sub exch + 65535 mul cvi dup + 256 idiv databuf 3 index 3 -1 roll put + 256 mod databuf 2 index 1 add 3 -1 roll put + } repeat + pop +} def +/srcbuf 256 string def +/rdcmntline { + currentfile srcbuf readline pop + (%) anchorsearch {pop} if +} def +/getplateindex { + 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall +} def +/aicsarray 4 array def +/aicsaltvals 4 array def +/aicsaltcolr aicsaltvals def +/tocolorspace { + dup type /arraytype eq { + mark exch aload pop + aicsarray 0 3 -1 roll put + aicsarray 1 3 -1 roll put + dup aicsarray 2 3 -1 roll put + gettintxform aicsarray 3 3 -1 roll put + counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store + aicsaltcolr astore pop pop + aicsarray + } if +} def +/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def +/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def +/gettintxform { + /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load +} def +/getnchannels { + dup type /arraytype eq {0 get} if + colorspacedict exch get begin Channels end +} def +/makesmarks { + composite? { + pop true + }{ + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin MarksPlate end + } ifelse +} def +/markingplate { + composite? { + pop true + }{ + dup type /arraytype eq { + dup length getplateindex gt {getplateindex get}{pop false} ifelse + } if + } ifelse +} def +/tocmyk { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToCMYK end +} def +/topsspace { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToPSSpace end +} def +/colorspacedict 5 dict dup begin + /DeviceGray 4 dict dup begin + /Channels 1 def + /MarksPlate {pop black?} def + /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def + /ToPSSpace {} def + end def + /DeviceRGB 4 dict dup begin + /Channels 3 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop _rgbtocmyk} def + /ToPSSpace {} def + end def + /DeviceCMYK 4 dict dup begin + /Channels 4 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop} def + /ToPSSpace {} def + end def + /Separation 4 dict dup begin + /Channels 1 def + /MarksPlate { + /findcmykcustomcolor where { + pop dup 1 exch ToCMYK 5 -1 roll 1 get + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace {} def + end def + /Process 4 dict dup begin + /Channels 1 def + /MarksPlate { + isCMYKSep? { + 1 exch ToCMYK 4 array astore getplateindex get 0 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace { + 4 array copy dup 0 /Separation put + } def + end def +end def +/isoverprint { + /currentoverprint where {pop currentoverprint}{_of} ifelse +} def +/version_ge_3010.106 { + version {cvr} stopped { + pop + false + }{ + 3010.106 ge + } ifelse +} def +end +end +defaultpacking setpacking +%%EndResource +%%EndProlog %%BeginSetup userdict /_useSmoothShade false put userdict /_aicmykps true put userdict /_forceToCMYK true put Adobe_level2_AI5 /initialize get exec +Adobe_cshow /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_shading_AI8 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +%AI3_BeginRider currentpacking true setpacking setpacking %AI3_EndRider %AI5_Begin_NonPrinting Np %AI8_PluginGroupInfo (Adobe Path Blends) (Adobe Blends Plugin) (LiveBlends.aip) %AI8_PluginGroupInfo (Adobe Tracing Object) (Tracing) (TracingSuite.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe Calligraphic Brush Tool) (Adobe Calligraphic Brush Plugin) (CalligBrushTool.aip) %AI8_PluginGroupInfo (Adobe Flare Plugin) (Flare) (Flare.aip) %AI8_PluginGroupInfo (Adobe Symbolism) (Adobe Symbolism) (ParticleSystem.aip) %AI8_PluginGroupInfo (Adobe Deform Plugin) (Adobe Envelope Plugin) (Envelope and Warp.aip) %AI8_PluginGroupInfo (Pathfinder Suite) (Adobe Compound Shape) (PathFinderS.aip) %AI8_PluginGroupInfo (Adobe Planar Group) (Adobe Live Paint Plugin) (Live Paint.aip) %AI5_End_NonPrinting-- %AI5_BeginPalette 0 0 Pb 0.74902 0.678431 0.670588 0.901961 ([Registration]) 0 Xs ([Registration]) Pc PB %AI5_EndPalette %%EndSetup %AI5_BeginLayer 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (svg2759) Ln 0 A u U u u 0 O 0.34902 0.231373 0.305882 0 0.666667 0.698039 0.670588 Xa 0 J 0 j 1 w 4 M []0 d 0 XR 343.9077 320.0234 m 457.2617 319.8218 L 458.8457 319.8218 460.2617 320.0571 460.2617 316.6616 C 460.123 279.332 L 341.0474 279.332 L 341.0474 316.8003 L 341.0474 318.4741 341.2095 320.0234 343.9077 320.0234 C f u 0 0 0 0 1 1 1 Xa 375.0225 300.9243 m 375.0269 293.3955 368.9258 287.2881 361.3955 287.2832 C 353.8657 287.2783 347.7568 293.3789 347.7524 300.9082 C 347.7524 300.9141 347.7524 300.9189 347.7524 300.9243 C 347.748 308.4546 353.8491 314.5615 361.3789 314.5659 C 368.9102 314.5708 375.0181 308.4702 375.0225 300.9409 C 375.0225 300.936 375.0225 300.9302 375.0225 300.9243 C f u *u 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 372.4712 312.0293 m 375.4946 309.0059 377.0068 305.3037 377.0068 300.9248 c 377.0068 296.5449 375.521 292.8828 372.5493 289.9375 C 369.396 286.834 365.6685 285.2842 361.3677 285.2842 c 357.1191 285.2842 353.4565 286.8213 350.3809 289.8984 C 347.3052 292.9736 345.7671 296.6484 345.7671 300.9248 c 345.7671 305.1997 347.3052 308.9014 350.3809 312.0293 C 353.3784 315.0537 357.041 316.5649 361.3677 316.5649 c 365.7471 316.5649 369.4478 315.0537 372.4712 312.0293 C f 1 D 352.4165 309.9956 m 349.8604 307.4141 348.5825 304.3896 348.5825 300.9209 c 348.5825 297.4531 349.8477 294.4541 352.3774 291.9258 C 354.9072 289.3955 357.9194 288.1309 361.4141 288.1309 c 364.9087 288.1309 367.9463 289.4082 370.5283 291.9639 C 372.98 294.3369 374.2061 297.3213 374.2061 300.9209 c 374.2061 304.4927 372.96 307.5239 370.4692 310.0151 C 367.979 312.5049 364.9609 313.7505 361.4141 313.7505 c 357.8672 313.7505 354.8677 312.4985 352.4165 309.9956 C f 0 D 359.1436 302.4468 m 358.7529 303.2979 358.1685 303.7236 357.3887 303.7236 c 356.0098 303.7236 355.3208 302.7959 355.3208 300.9404 c 355.3208 299.085 356.0098 298.1572 357.3887 298.1572 c 358.2988 298.1572 358.9492 298.6094 359.3389 299.5146 C 361.25 298.4971 L 360.3394 296.8789 358.9727 296.0693 357.1509 296.0693 c 355.7456 296.0693 354.6196 296.5 353.7744 297.3613 C 352.9277 298.2227 352.5054 299.4106 352.5054 300.9248 c 352.5054 302.4126 352.9409 303.5938 353.813 304.4683 C 354.6851 305.3428 355.771 305.7803 357.0732 305.7803 c 358.999 305.7803 360.3779 305.0215 361.2114 303.5054 C 359.1436 302.4468 L f 368.1338 302.4468 m 367.7427 303.2979 367.1694 303.7236 366.4141 303.7236 c 365.0078 303.7236 364.3042 302.7959 364.3042 300.9404 c 364.3042 299.085 365.0078 298.1572 366.4141 298.1572 c 367.3257 298.1572 367.9644 298.6094 368.3286 299.5146 C 370.2822 298.4971 L 369.373 296.8789 368.0083 296.0693 366.1899 296.0693 c 364.7866 296.0693 363.6631 296.5 362.8184 297.3613 C 361.9751 298.2227 361.5522 299.4106 361.5522 300.9248 c 361.5522 302.4126 361.9814 303.5938 362.8389 304.4683 C 363.6958 305.3428 364.7866 305.7803 366.1123 305.7803 c 368.0347 305.7803 369.4116 305.0215 370.2427 303.5054 C 368.1338 302.4468 L f *U U /AdobeObjectMatrix (1.000000 0.000000 0.000000 1.000000 -289.615692 99.065300) XT U /AdobeObjectMatrix (0.872921 0.000000 0.000000 0.872921 50.125359 143.214401) XT *u 1 D 458.2539 320.5 m 342.7466 320.5 L 341.5078 320.5 340.5 319.4917 340.5 318.2529 C 340.5 279.0078 L 340.5 278.7275 340.7271 278.5 341.0068 278.5 C 459.9922 278.5 L 460.2725 278.5 460.5 278.7275 460.5 279.0078 C 460.5 318.2529 L 460.5 319.4917 459.4922 320.5 458.2539 320.5 C f 0 D 342.7466 319.4849 m 458.2539 319.4849 L 458.9326 319.4849 459.4844 318.9321 459.4844 318.2529 C 459.4844 302.4346 459.4844 291.0078 V 376.9277 291.0078 L 373.9019 285.5371 368.0723 281.8232 361.3813 281.8232 c 354.688 281.8232 348.8599 285.5342 345.8354 291.0078 C 341.5142 291.0078 L 341.5142 302.4346 341.5142 318.2529 Y 341.5142 318.9321 342.0674 319.4849 342.7466 319.4849 C f *U u 0 0 0 0 1 1 1 Xa 426.7637 282.7676 m 426.8438 282.6133 426.9502 282.4883 427.083 282.3916 C 427.2168 282.2959 427.3711 282.2246 427.5498 282.1787 C 427.7295 282.1318 427.915 282.1094 428.1055 282.1094 c 428.2354 282.1094 428.374 282.1191 428.5225 282.1416 C 428.6699 282.1621 428.8086 282.2051 428.9385 282.2666 C 429.0684 282.3281 429.1758 282.4141 429.2617 282.5215 C 429.3496 282.6299 429.3926 282.7676 429.3926 282.9346 c 429.3926 283.1133 429.334 283.2588 429.2207 283.3701 C 429.1064 283.4824 428.9561 283.5742 428.7715 283.6484 C 428.5859 283.7227 428.376 283.7871 428.1426 283.8438 C 427.9072 283.8994 427.6699 283.9609 427.4287 284.0293 C 427.1816 284.0908 426.9404 284.166 426.7051 284.2559 C 426.4717 284.3457 426.2617 284.4619 426.0762 284.6035 c 425.8906 284.7461 425.7412 284.9238 425.627 285.1367 C 425.5127 285.3516 425.4551 285.6094 425.4551 285.9121 c 425.4551 286.252 425.5283 286.5469 425.6729 286.7979 C 425.8184 287.0479 426.0088 287.2568 426.2441 287.4238 C 426.4775 287.5908 426.7441 287.7148 427.041 287.7949 C 427.3359 287.875 427.6328 287.916 427.9297 287.916 c 428.2754 287.916 428.6074 287.877 428.9258 287.7988 C 429.2441 287.7227 429.5273 287.5957 429.7734 287.4229 C 430.0215 287.25 430.2168 287.0293 430.3623 286.7598 C 430.5068 286.4902 430.5801 286.1641 430.5801 285.7803 C 429.167 285.7803 L 429.1543 285.9785 429.1123 286.1426 429.043 286.2715 C 428.9717 286.4023 428.877 286.5039 428.7617 286.5781 C 428.6436 286.6523 428.5098 286.7051 428.3594 286.7354 C 428.208 286.7666 428.0439 286.7822 427.8652 286.7822 c 427.749 286.7822 427.6309 286.7695 427.5156 286.7451 C 427.3975 286.7207 427.292 286.6768 427.1973 286.6152 c 427.1006 286.5527 427.0215 286.4766 426.9609 286.3828 C 426.9004 286.29 426.8691 286.1729 426.8691 286.0313 c 426.8691 285.9004 426.8926 285.7949 426.9424 285.7148 C 426.9922 285.6348 427.0898 285.5605 427.2344 285.4922 c 427.3789 285.4248 427.5801 285.3564 427.8359 285.2881 c 428.0918 285.2207 428.4277 285.1328 428.8418 285.0293 C 428.9648 285.0039 429.1357 284.959 429.3555 284.8936 C 429.5742 284.8281 429.792 284.7256 430.0078 284.584 C 430.2246 284.4404 430.4111 284.25 430.5693 284.0127 C 430.7266 283.7744 430.8047 283.4697 430.8047 283.0986 c 430.8047 282.7949 430.7461 282.5137 430.6289 282.2539 C 430.5107 281.9941 430.3359 281.7695 430.1045 281.582 C 429.873 281.3926 429.585 281.2461 429.2422 281.1406 C 428.8984 281.0352 428.501 280.9834 428.0508 280.9834 c 427.6855 280.9834 427.332 281.0283 426.9883 281.1182 C 426.6455 281.208 426.3418 281.3496 426.0781 281.541 C 425.8164 281.7334 425.6074 281.9785 425.4531 282.2754 C 425.2988 282.5723 425.2246 282.9248 425.2305 283.334 C 426.6436 283.334 L 426.6436 283.1113 426.6836 282.9219 426.7637 282.7676 C f *u 434.9688 287.752 m 437.4473 281.1309 L 435.9336 281.1309 L 435.4336 282.6055 L 432.9551 282.6055 L 432.4365 281.1309 L 430.9707 281.1309 L 433.4756 287.752 L 434.9688 287.752 L f 1 D 435.0527 283.6924 m 434.2188 286.1201 L 434.1992 286.1201 L 433.3359 283.6924 L 435.0527 283.6924 L f *U U u *u 0 D 400.4966 287.752 m 400.812 287.752 401.0996 287.7246 401.3604 287.6689 C 401.6211 287.6133 401.8438 287.5215 402.0293 287.3955 C 402.2148 287.2695 402.3594 287.1006 402.4619 286.8906 c 402.5645 286.6797 402.6152 286.4209 402.6152 286.1113 c 402.6152 285.7773 402.5391 285.5 402.3867 285.2773 C 402.2363 285.0547 402.0107 284.873 401.7129 284.7305 C 402.123 284.6133 402.4287 284.4082 402.6309 284.1133 c 402.832 283.8203 402.9336 283.4648 402.9336 283.0508 c 402.9336 282.7168 402.8691 282.4277 402.7383 282.1836 C 402.6084 281.9395 402.4326 281.7402 402.2129 281.5859 C 401.9932 281.4307 401.7422 281.3164 401.4609 281.2422 C 401.1777 281.168 400.8887 281.1309 400.5908 281.1309 C 397.3745 281.1309 L 397.3745 287.752 L 400.4966 287.752 L 400.4966 287.752 L f 1 D 400.3101 285.0742 m 400.5703 285.0742 400.7837 285.1357 400.9517 285.2598 C 401.1191 285.3828 401.2021 285.583 401.2021 285.8604 c 401.2021 286.0146 401.1738 286.1406 401.1191 286.2402 C 401.0625 286.3389 400.9888 286.416 400.8955 286.4707 C 400.8022 286.5264 400.6953 286.5654 400.5752 286.5869 C 400.4541 286.6084 400.3286 286.6191 400.1987 286.6191 C 398.834 286.6191 L 398.834 285.0742 L 400.3101 285.0742 L f 400.3955 282.2637 m 400.5381 282.2637 400.6743 282.2773 400.8042 282.3057 C 400.9341 282.334 401.0498 282.3799 401.1484 282.4443 C 401.248 282.5098 401.3262 282.5977 401.3857 282.709 c 401.4453 282.8203 401.4736 282.9629 401.4736 283.1357 c 401.4736 283.4746 401.3779 283.7178 401.1855 283.8633 c 400.9937 284.0078 400.7393 284.0801 400.4238 284.0801 C 398.834 284.0801 L 398.834 282.2637 L 400.3955 282.2637 L f *U 0 D 403.1904 287.752 m 404.8242 287.752 L 406.375 285.1367 L 407.916 287.752 L 409.5391 287.752 L 407.082 283.6719 L 407.082 281.1309 L 405.6211 281.1309 L 405.6211 283.709 L 403.1904 287.752 L f U u 442.9033 305.519 m 442.9063 299.6743 438.1719 294.9316 432.3262 294.9277 C 426.4805 294.9238 421.7383 299.6582 421.7324 305.5039 C 421.7324 305.5088 421.7324 305.5146 421.7324 305.519 C 421.7285 311.3647 426.4648 316.106 432.3105 316.1108 C 438.1563 316.1152 442.8994 311.3799 442.9033 305.5347 C 442.9033 305.5288 442.9033 305.5244 442.9033 305.519 C f u *u 1 D 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 432.2422 317.1138 m 429.0293 317.1138 426.3115 315.9932 424.0859 313.752 C 421.8027 311.4326 420.6621 308.6885 420.6621 305.519 c 420.6621 302.3501 421.8027 299.6245 424.0859 297.3447 C 426.3691 295.0645 429.0879 293.9238 432.2422 293.9238 c 435.4355 293.9238 438.2021 295.0742 440.5449 297.374 C 442.75 299.5571 443.8535 302.2729 443.8535 305.519 c 443.8535 308.7651 442.7305 311.5103 440.4854 313.752 C 438.2402 315.9932 435.4932 317.1138 432.2422 317.1138 c f 0 D 432.2715 315.0269 m 434.9033 315.0269 437.1387 314.0996 438.9775 312.2446 C 440.834 310.4082 441.7627 308.167 441.7627 305.519 c 441.7627 302.8525 440.8545 300.6396 439.0352 298.8809 C 437.1191 296.9873 434.8652 296.041 432.2715 296.041 c 429.6777 296.041 427.4434 296.9785 425.5664 298.8516 C 423.6895 300.7271 422.751 302.9487 422.751 305.519 c 422.751 308.0894 423.6992 310.3311 425.5957 312.2446 C 427.4141 314.0996 429.6396 315.0269 432.2715 315.0269 c f *U 427.1025 307.1558 m 427.5645 310.0732 429.6191 311.6328 432.1934 311.6328 c 435.8945 311.6328 438.1504 308.9468 438.1504 305.3647 c 438.1504 301.8701 435.75 299.1548 432.1348 299.1548 c 429.6465 299.1548 427.4209 300.6855 427.0156 303.689 C 429.9365 303.689 L 430.0234 302.1299 431.0361 301.5811 432.4824 301.5811 c 434.1299 301.5811 435.2012 303.1118 435.2012 305.4517 c 435.2012 307.9063 434.2754 309.2061 432.5391 309.2061 c 431.2676 309.2061 430.168 308.7437 429.9365 307.1558 C 430.7871 307.1602 L 428.4863 304.8613 L 426.1875 307.1602 L 427.1025 307.1558 L f U /AdobeObjectMatrix (1.000000 0.000000 0.000000 1.000000 -23.952101 -89.729622) XT U /AdobeObjectMatrix (0.624995 0.000000 0.000000 0.624995 391.229401 176.933197) XT u 0 0 0 0 1 1 1 Xa 403.8594 316.021 m 409.791 316.021 414.5986 311.2134 414.5986 305.2832 c 414.5986 299.3525 409.791 294.5449 403.8594 294.5449 c 397.9287 294.5449 393.1206 299.3525 393.1206 305.2832 c 393.1206 311.2134 397.9287 316.021 403.8594 316.021 c f u 1 D 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa 406.9678 308.3901 m 406.9678 308.8037 406.6318 309.1387 406.2188 309.1387 C 401.4756 309.1387 L 401.0625 309.1387 400.7266 308.8042 400.7266 308.3901 C 400.7266 303.6475 L 402.0488 303.6475 L 402.0488 298.0313 L 405.6445 298.0313 L 405.6445 303.6475 L 406.9678 303.6475 L 406.9678 308.3901 L 406.9678 308.3901 L f 0 D 403.8477 313.0078 m 404.7432 313.0078 405.4688 312.2813 405.4688 311.3857 c 405.4688 310.4897 404.7432 309.7637 403.8477 309.7637 c 402.9512 309.7637 402.2246 310.4897 402.2246 311.3857 c 402.2246 312.2813 402.9512 313.0078 403.8477 313.0078 c f U *u 1 D 403.832 317.1138 m 400.6206 317.1138 397.9009 315.9937 395.6758 313.7515 C 393.3921 311.4331 392.251 308.6885 392.251 305.5195 c 392.251 302.3511 393.3921 299.625 395.6758 297.3447 C 397.9595 295.0645 400.6787 293.9248 403.832 293.9248 c 407.0254 293.9248 409.793 295.0742 412.1338 297.375 C 414.3408 299.5571 415.4434 302.2729 415.4434 305.5195 c 415.4434 308.7666 414.3213 311.5103 412.0762 313.7515 C 409.832 315.9937 407.084 317.1138 403.832 317.1138 c f 0 D 403.8613 315.0273 m 406.4932 315.0273 408.7285 314.0996 410.5664 312.2446 C 412.4248 310.4092 413.3535 308.167 413.3535 305.5195 c 413.3535 302.853 412.4443 300.6396 410.625 298.8809 C 408.709 296.9883 406.4551 296.041 403.8613 296.041 c 401.2676 296.041 399.0332 296.9785 397.1567 298.8525 C 395.2788 300.7271 394.3408 302.9492 394.3408 305.5195 c 394.3408 308.0898 395.2891 310.3315 397.1851 312.2446 C 399.0044 314.0996 401.2305 315.0273 403.8613 315.0273 c f *U U U /AdobeObjectMatrix (0.993781 0.000000 0.000000 0.993669 -177.694092 -74.436409) XT U LB %AI5_EndLayer-- %AI3_BeginCrops userdict /AI3_noCropMarks known not { 0 A u u 0 R 0 G 0 J 0 j 0.5 w 4 M []0 d 0 XR 331.5 278.5 m 304.5 278.5 L S 340.5 269.5 m 340.5 242.5 L S U u 331.5 320.5 m 304.5 320.5 L S 340.5 329.5 m 340.5 356.5 L S U u 469.5 320.5 m 496.5 320.5 L S 460.5 329.5 m 460.5 356.5 L S U u 469.5 278.5 m 496.5 278.5 L S 460.5 269.5 m 460.5 242.5 L S U U } if %AI3_EndCrops %%PageTrailer gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec +Adobe_shading_AI8 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_cshow /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF \ No newline at end of file diff --git a/lectures/images/cc/by.eps b/lectures/images/cc/by.eps new file mode 100644 index 0000000..a4e34c1 --- /dev/null +++ b/lectures/images/cc/by.eps @@ -0,0 +1,5902 @@ +%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 8.0 %%AI8_CreatorVersion: 13.0.1 %%For: (Alex Roberts) () %%Title: (by.eps) %%CreationDate: 3/25/08 10:41 AM %%BoundingBox: 289 305 345 361 %%HiResBoundingBox: 289.5283 305.4014 344.48 360.353 %%DocumentProcessColors: Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset AGM_Gradient 1.0 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_pattern_AI5 1.0 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 4.0 %AI3_ColorUsage: Color %AI3_IncludePlacedImages %AI7_ImageSettings: 1 %%CMYKProcessColor: 0.74902 0.678431 0.670588 0.901961 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 1 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 -1 -1 () %AI3_Cropmarks: 284 299.457 350 365.457 %AI3_TemplateBox: 400 300 400 300 %AI3_TileBox: -61 44.457 673 620.457 %AI3_DocumentPreview: Macintosh_ColorPic %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI8_OpenToView: 194.2319 403.7681 5.8562 1268 706 18 1 0 202 236 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:-66.3003 -266.2988 %AI7_GridSettings: 48 8 48 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments %%BeginProlog %%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 0 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 26 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + (AI8_CMYK_CustomColor) + 6 packedarray + } bind def + /findrgbcustomcolor + { + (AI8_RGB_CustomColor) + 5 packedarray + } bind def + /setcustomcolor + { + exch + aload pop dup + (AI8_CMYK_CustomColor) eq + { + pop pop + 4 + { + 4 index mul + 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + { + dup (AI8_RGB_CustomColor) eq + { + pop pop + 3 + { + 1 exch sub + 3 index mul + 1 exch sub + 3 1 roll + } repeat + 4 -1 roll pop + setrgbcolor + } + { + pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } ifelse + } ifelse + } + def + } if + /setAIseparationgray + { + false setoverprint + 0 setgray + /setseparationgray where{ + pop setseparationgray + }{ + /setcolorspace where{ + pop + [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace + 1 exch sub setcolor + }{ + setgray + }ifelse + }ifelse + } def + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset AGM_Gradient_Sep 1.0 0 +%%Title: (AGM Gradient Procset) +%%Version: 1.0 0 +%%CreationDate: (4/26/96) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /AGM_Gradient_Sep 5 dict dup begin put +/AGM_Gradient_Sep_private 100 dict def +/initialize{ + AGM_Gradient_Sep begin + AGM_Gradient_Sep_private begin + _compositeJob{ + initializeSinglePassSeps + }{ + initializeMultiPassSeps + }ifelse + initializeSeps + AGM_Gradient_private begin + /_fillSD newSpotDict def + /_rampSD newSpotDict def + /_nCustomColorSD nd + end + AGM_Gradient_Sep_private + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + AGM_Gradient_Sep + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + end + + currentdict readonly pop + end +}def +/terminate{ + currentdict AGM_Gradient_Sep eq{ + end + }if +}def +AGM_Gradient_Sep_private begin +/initializeSeps{ + /currentoverprint { _of } def + _noImage not _level2PS not and{ + /linealFill{ + currentoverprint{ + 0 0 1 1 rectfill + }{ + mySave + 8 setImageParms + _color{ + _nCustomColorSD begin + cyan magenta yellow black + + _spotColor{ + spot1/tintImage spot1/tintValue get 1 exch sub makeByte8 put + spot2/tintImage spot2/tintValue get 1 exch sub makeByte8 put + }if + end + + 4{ + makeByte8 4 1 roll + }repeat + true 4 _nCustomColorSD ncolorimage + }{ + _nCustomColorSD/black get 1 exch sub makeByte8 + _nCustomColorSD bwImage + }ifelse + myRestore + }ifelse + }def + }if + /_whiteBytes 1 makeByte8 pt + /knockOut{ + _noImage _level2PS or currentoverprint or{ + gsave + false setoverprint + 1 setgray + 0 0 1 1 rectfill + grestore + }{ + 8 setImageParms _whiteBytes /_image load 5 execImage + }ifelse + }def + /newSpotDict{ + 11 dict dup begin + /nSpots 2 def + /spot1 7 dict def + /spot2 7 dict def + end + }def + /initSpotData + { + begin + /name nd + /tintImage nd + /tintValue nd + /spot_C nd + /spot_M nd + /spot_Y nd + /spot_K nd + end + }def + /initSpotDict{ + begin + /cyanInk nd + /magentaInk nd + /yellowInk nd + /blackInk nd + /cyan nd + /magenta nd + /yellow nd + /black nd + spot1 initSpotData + spot2 initSpotData + end + }def + /copySpotDict{ + /_dst xp + begin + cyanInk magentaInk yellowInk blackInk + cyan magenta yellow black + spot1 spot2 + end + _dst begin + /spot1 spot1 maxlength dict def + /spot2 spot2 maxlength dict def + spot2 copy pop + spot1 copy pop + /black xd + /yellow xd + /magenta xd + /cyan xd + /blackInk xd + /yellowInk xd + /magentaInk xd + /cyanInk xd + end + }def + /setCustomColor + { + 1 index /Black eq{ + 6 1 roll 5 npop + 1 exch sub + setgray + }{ + 6 1 roll _ccAry1 astore exch + dup null eq{ + pop 0 + }if + setcustomcolor + }ifelse + }def + /setCStop{ + /_colorStyle exch pt + + _colorStyle 0 eq{ + 0 0 0 + 4 -1 roll + 1 exch sub + _spotColor{ + /_colorStyle 3 pt + /Black + 1 index + 1 exch sub + }if + }if + _colorStyle 2 eq{ + 3 npop + }if + _rampSD _fillSD copySpotDict + + _colorStyle 4 eq{ + pop + 9 2 roll 3 npop 6 -2 roll + } if + + _colorStyle 3 eq _colorStyle 4 eq or{ + + _fillSD begin + /_spot1 spot1 pt + /_spot2 spot2 pt + end + + exch dup _spot1/name get eq{ + _spot1 _spot2 + }{ + _spot2 _spot1 + }ifelse + begin + begin + /name xd + 1 exch sub /tintValue xd + 4{ + tintValue mul 4 1 roll + }repeat + _spotColor not{ + /tintValue null def + }if + end + /tintValue 0 def + end + }if + _fillSD nsetcustomcolor + }def + /renderCMYK{ + spot1/name get null eq + spot2/name get null eq and + dup not{ + pop + spot1 spotConverted + }if + dup not{ + pop + spot2 spotConverted + }if + }def + /currentInk{ + true + _inRipSep{ + currentcolorspace 0 get + dup /DeviceGray eq + 1 index /DeviceCMYK eq or{ + pop + currentcmykcolor add add add 0 eq{ + pop false + }if + }{ + /Separation eq{ + currentcolor 0 eq{ + pop false + }if + }if + }ifelse + }{ + currentgray 1 eq{ + pop false + }if + }ifelse + }def + /currentInkN{ + + _nCustomColorSD begin + /_spot1 spot1 pt + /_spot2 spot2 pt + renderCMYK + end + { + currentInk + }{ + gsave + _spot1 begin + name null ne{ + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + currentInk + }{ + false + }ifelse + end + _spot2 begin + name null ne{ + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + currentInk + }{ + false + }ifelse + end + grestore + + or + } ifelse + }def + /fill_ /fill load def + /fillOvp{ + currentoverprint{ + _inRipSep{ + currentcolorspace 0 get + dup /DeviceGray eq + 1 index /DeviceCMYK eq or{ + pop + currentcmykcolor add add add 0 eq{ + newpath + }if + }{ + /Separation eq{ + currentcolor 0 eq{ + newpath + }if + }if + }ifelse + }{ + currentgray 1 eq{ + newpath + }if + }ifelse + }if + fill_ + }def + /fill{ + _nCustomColorSD begin + /_spot1 spot1 pt + /_spot2 spot2 pt + renderCMYK + end + + { + fillOvp + }{ + _spot1 begin + gsave + name null ne{ + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + }{ + 1 setgray + }ifelse + fillOvp + grestore + end + _spot2 begin + name null ne{ + gsave + true setoverprint + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + fillOvp + grestore + }if + end + newpath + }ifelse + }def + /expandSpot{ + _spotColor{ + /_len xp + _rampSD begin + spot1 begin + tintImage null ne{ + tintImage _len expandOne /tintImage xd + }if + end + spot2 begin + tintImage null ne{ + tintImage _len expandOne /tintImage xd + }if + end + end + }{ + pop + }ifelse + }def + /rampImage{ + currentoverprint{ + rectImage + }{ + _enabledSmoothShade{ + fillRamp + }{ + _color{ + _rampSD begin + /cyanInk _cyanData 0 ne def + /magentaInk _magentaData 0 ne def + /yellowInk _yellowData 0 ne def + /blackInk _blackData 0 ne def + end + + _nSamples setImageParms + _nSamples expandSpot + _cyanData _magentaData _yellowData _blackData _nSamples 4 expandColor + true 4 _rampSD ncolorimage + }{ + _rampSD begin + /cyanInk false def + /magentaInk false def + /yellowInk false def + /blackInk true def + end + _nSamples setImageParms + _blackData _rampSD bwImage + }ifelse + }ifelse + }ifelse + }def + /nsetcustomcolor where{ + pop + }{ + /nsetcustomcolor + { + /_nCustomColorSD xp + _nCustomColorSD begin + 4 copy + /black xd + /yellow xd + /magenta xd + /cyan xd + 4 copy + 0 ne /blackInk xd + 0 ne /yellowInk xd + 0 ne /magentaInk xd + 0 ne /cyanInk xd + end + setcmykcolor + }def + }ifelse + /nsetcustomcolorend where{ + pop + }{ + /nsetcustomcolorend + { + /_nCustomColorSD null pt + }def + }ifelse +}def +/initializeSinglePassSeps{ + /_decodeNorm [0 1] pt + /_decodeInvert [1 0] pt + /spotConverted + { + begin + name null eq{ + false + }{ + tintValue null eq tintImage null eq and{ + true + }{ + _inDistiller{ + false + }{ + false + currentpagedevice/SeparationColorNames get{name eq or}forall + not + }ifelse + }ifelse + }ifelse + end + }def + /dictImage + { + 20 dict dup begin + /Dict xd + /Decode xd + /DataSource xd + /ImageMatrix xd + /BitsPerComponent xd + /Height xd + /Width xd + /ImageType 1 def + Dict + end + /_image load 1 execImage + }def + /bwImage{ + begin + gsave + currentoverprint{ + blackInk{ + [/Separation /Black /DeviceGray{}] setcolorspace + _decodeInvert dictImage + }{ + 5 npop + }ifelse + }{ + /DeviceGray setcolorspace + _decodeNorm dictImage + }ifelse + grestore + end + }def + /ncolorimage where{ + pop + }{ + /ncolorimage{ + begin + renderCMYK{ + cyanInk + magentaInk and + yellowInk and + blackInk and + not + currentoverprint + and{ + pop pop + gsave + cyanInk{ + 8 copy + [/Separation /Cyan /DeviceGray{}] setcolorspace + 3 npop + _decodeNorm dictImage + }if + magentaInk{ + 8 copy + [/Separation /Magenta /DeviceGray{}] setcolorspace + 4 -1 roll + 3 npop + _decodeNorm dictImage + }if + yellowInk{ + 8 copy + [/Separation /Yellow /DeviceGray{}] setcolorspace + 4 -2 roll + 3 npop + _decodeNorm dictImage + }if + blackInk{ + 4 -3 roll + [/Separation /Black /DeviceGray{}] setcolorspace + 3 npop + _decodeNorm dictImage + }{ + 8 npop + }ifelse + grestore + }{ + /_colorimage load 10 execImage + }ifelse + }{ + 6 npop + gsave + spot1 begin + name null ne tintImage null ne and{ + [/Separation name /DeviceGray{}] setcolorspace + 4 copy + tintImage + name /Black eq{ + _decodeNorm + }{ + _decodeInvert + }ifelse + dictImage + }{ + 1 setgray fill + }ifelse + end + spot2 begin + true setoverprint + name null ne tintImage null ne and{ + [/Separation name /DeviceGray{}] setcolorspace + tintImage + name /Black eq{ + _decodeNorm + }{ + _decodeInvert + }ifelse + dictImage + }{ + 4 npop + 1 setgray fill + }ifelse + end + grestore + }ifelse + end + }def + }ifelse + /getRampColorSpace{ + + /_renderCMYK _rampSD begin renderCMYK end pt + + _renderCMYK not{ + _rampSD begin + [/DeviceN + [ + spot1 begin + name null ne tintImage null ne and{ + name + }if + end + spot2 begin + name null ne tintImage null ne and{ + name + }if + end + ] + _inDistiller { + /DeviceCMYK [ + spot1 begin + name null ne tintImage null ne and{ + spot_C spot_M spot_Y spot_K 1 + }{ + 0 0 0 0 0 + }ifelse + end + spot2 begin + name null ne tintImage null ne and{ + spot_C spot_M spot_Y spot_K 2 + }{ + 0 0 0 0 0 + }ifelse + end + 5 1 roll 6 -2 roll add + dup 1 eq { + pop + 8 /index cvx 1 /exch cvx /sub cvx + 9 1 /roll cvx + }{ + 2 eq { + 8 /index cvx 1 /exch cvx /sub cvx + 10 1 /roll cvx + }if + }ifelse + 4 1 /roll cvx 5 -2 /roll cvx + 8 /index cvx /mul cvx /exch cvx 9 /index cvx /mul cvx /add cvx 7 1 /roll cvx + 3 1 /roll cvx 4 -2 /roll cvx + 7 /index cvx /mul cvx /exch cvx 8 /index cvx /mul cvx /add cvx 6 1 /roll cvx + 2 1 /roll cvx 3 -2 /roll cvx + 6 /index cvx /mul cvx /exch cvx 7 /index cvx /mul cvx /add cvx 5 1 /roll cvx + 5 /index cvx /mul cvx /exch cvx 6 /index cvx /mul cvx /add cvx 4 1 /roll cvx + 6 -2 /roll cvx /pop cvx /pop cvx + ] cvx bind + }{ + /DeviceCMYK {} + }ifelse + ] setcolorspace + end + /_nColorSpace currentcolorspace pt + }if + + _nSamples 1 gt{ + /_ndx 0 pt + [blendColor] cvx exec + }if + _renderCMYK{ + /_C0 [currentcolor] pt + /_C0_Space currentcolorspace pt + }{ + /_C0 [ + _nCustomColorSD begin + spot1 begin + name null ne{ + tintValue + }if + end + spot2 begin + name null ne{ + tintValue + }if + end + end + ] pt + /_C0_Space _nColorSpace pt + }ifelse + + _nSamples 1 gt{ + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + }if + _renderCMYK{ + /_C1 [currentcolor] pt + /_C1_Space currentcolorspace pt + }{ + /_C1 [ + _nCustomColorSD begin + spot1 begin + name null ne{ + tintValue + }if + end + spot2 begin + name null ne{ + tintValue + }if + end + end + ] pt + /_C1_Space _nColorSpace pt + }ifelse + + /_rampColorSpace _C0_Space pt + _spotColor{ + nsetcustomcolorend + }if + }def +}def +/initializeMultiPassSeps{ + /invertXfer{ + [ + { + 1 exch sub + }/exec load systemdict /currenttransfer get exec /exec load + ] cvx systemdict /settransfer get exec + }def + /ccThrough{ + gsave + 1 setCustomColor + currentcmykcolor + grestore + add add add 0 ne + }def + /spotConverted + { + begin + _isCMYKSep not{ + false + }{ + name null eq{ + false + }{ + tintValue null eq tintImage null eq and{ + true + }{ + spot_C spot_M spot_Y spot_K name ccThrough + }ifelse + }ifelse + }ifelse + end + }def + /spotChannel + { + _isCMYKSep{ + pop false + }{ + /_spotDict xp + _spotDict/name get null eq{ + false + }{ + _spotDict/spot_C get + _spotDict/spot_M get + _spotDict/spot_Y get + _spotDict/spot_K get + _spotDict/name get + ccThrough + }ifelse + }ifelse + }def + /getChannelData + { + _isCMYKSep dup{ + pop renderCMYK + }if + { + _blackPlate{ + 4 1 roll 3 npop blackInk + }{ + _yellowPlate{ + 4 2 roll 3 npop yellowInk + }{ + _magentaPlate{ + 4 3 roll 3 npop magentaInk + }{ + 3 npop cyanInk + }ifelse + }ifelse + }ifelse + { + true /nonZeroData + }{ + true /zeroData + }ifelse + }{ + 4 npop + spot1/name get null ne + spot1 spotChannel and{ + spot1/tintImage get dup null ne{ + false /nonZeroData + }{ + pop false /noData + }ifelse + }{ + spot2/name get null ne + spot2 spotChannel and{ + spot2/tintImage get dup null ne{ + false /nonZeroData + }{ + pop false /noData + }ifelse + }{ + false /noData + }ifelse + }ifelse + }ifelse + }def + /renderChannelData + { + /_tmp xp + _tmp /nonZeroData ne currentoverprint and{ + pop + _tmp /zeroData eq{pop}if + 4 npop + }{ + _tmp /nonZeroData eq{ + { + invertXfer + }if + systemdict/image + get 5 execImage + }{ + pop + _tmp /zeroData eq{pop}if + 4 npop + knockOut + }ifelse + }ifelse + }def + /bwImage{ + begin + gsave + dup dup dup + getChannelData + exch pop false exch + renderChannelData + grestore + end + }def + /ncolorimage{ + begin + pop pop + gsave + spot2/name get null ne spot2 spotChannel and{ + true setoverprint + }if + getChannelData + renderChannelData + grestore + end + }def + /getRampColorSpace{ + + /_renderCMYK _rampSD begin renderCMYK end pt + + _nSamples 1 gt{ + /_ndx 0 pt + [blendColor] cvx exec + }if + + _renderCMYK{ + /_C0 [currentcolor] pt + /_C0_Space currentcolorspace pt + }{ + /_C0 [ + _nCustomColorSD begin + 0 + spot1 begin + name null ne + tintValue null ne and + spot1 spotChannel and{ + pop tintValue + }if + end + spot2 begin + name null ne + tintValue null ne and + spot2 spotChannel and{ + pop tintValue + }if + end + 1 exch sub + end + ] pt + /_C0_Space /DeviceGray pt + }ifelse + + _nSamples 1 gt{ + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + }if + + _renderCMYK{ + /_C1 [currentcolor] pt + /_C1_Space currentcolorspace pt + }{ + /_C1 [ + _nCustomColorSD begin + 0 + spot1 begin + name null ne + tintValue null ne and + spot1 spotChannel and{ + pop tintValue + }if + end + spot2 begin + name null ne + tintValue null ne and + spot2 spotChannel and{ + pop tintValue + }if + end + 1 exch sub + end + ] pt + /_C1_Space /DeviceGray pt + }ifelse + + /_rampColorSpace _C0_Space pt + _spotColor{ + nsetcustomcolorend + }if + }def +}def +end +end +defaultpacking setpacking +%%EndResource +%%BeginResource: procset AGM_Gradient 1.0 0 +%%Title: (AGM Gradient Procset) +%%Version: 1.0 0 +%%CreationDate: (4/26/96) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /AGM_Gradient 20 dict dup begin put +/AGM_Gradient_private 201 dict def +/initialize +{ + AGM_Gradient begin + AGM_Gradient_private begin + initializeVars + + /bd systemdict/mark get def + /ed + _level2PS + { + (>>) + }{ + (counttomark 2 idiv dup dict begin {def} repeat pop currentdict end) + } ifelse + cvx def + + _level2PS{ + initializeLev2 + }{ + initializeLev1 + }ifelse + + queryDevice + + initializeRectFill + initializeShading + initializeOps + _producingSeps{ + AGM_Gradient_Sep/initialize get exec + }{ + initializeComposite + }ifelse + _illustrator{ + /f{}def + /F{}def + /s{}def + /S{}def + /b{}def + /B{}def + }if + /image where{ + /image get /_image xd + }if + /colorimage where{ + /colorimage get /_colorimage xd + }if + AGM_Gradient_private + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + AGM_Gradient + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + end + + currentdict readonly pop + end +}def +/initializeAI +{ + pop pop + AGM_Gradient/AGM_Gradient_private get /_illustrator true put + AGM_Gradient/initialize get exec + AGM_Gradient begin +}def +/unload{ + systemdict/languagelevel known{ + systemdict/languagelevel get 2 ge{ + userdict/AGM_Gradient_Sep 2 copy known{ + undef + }{ + pop pop + }ifelse + userdict/AGM_Gradient 2 copy known{ + undef + }{ + pop pop + }ifelse + }if + }if +}def +/terminate{ + currentdict AGM_Gradient eq{ + end + }if +}def + +AGM_Gradient_private begin +/initializeVars{ + /_d255 256 array def + 0 1 255{ + _d255 exch dup 255 div put + }bind for + /_d255- 256 array def + 0 1 255{ + _d255- exch 1 _d255 2 index get sub put + }bind for + /_sSave nd + /_dUserSpace matrix defaultmatrix def + /_bUMatrix matrix def + /_imageMatrix matrix def + /_saveMatrix matrix def + /_xm matrix def + /_ccAry1 5 array def + /_bbox 4 array pt + /_level2PS + systemdict/languagelevel known dup{ + pop systemdict/languagelevel get 2 ge + }if + def + /_level3PS + _level2PS systemdict/shfill known and + def + currentdict /_illustrator known not{ + /_illustrator false def + }if + +}def +/initializeOps +{ + AGM_Gradient begin + currentdict/Bc known not{ + /Bc{ + + _renderFlag 2 eq _enabledSmoothShade or{ + 6 npop + }{ + pushBSpace + _rampIndex 0 eq{ + pop pop + setCStop + }if + linealFill + popBSpace + }ifelse + + }def + }if + + currentdict/Bg known not{ + /Bg{ + 10 npop + /_gradName xp + /_renderFlag xp + /_enabledSmoothShade false pt + + _renderFlag 2 ne{ + + _illustrator{ + _of setoverprint + }if + + /_enabledSmoothShade + _level3PS{ + _usingSmoothShade + _producingSeps not + currentoverprint not or and + _noImage not and + }{ + false + }ifelse + pt + + _illustrator _eo and _renderFlag 3 eq or{ + eoclip + }{ + clip + }ifelse + + _gradNames _gradName 2 copy known{ + get + mark exch aload pop + /_gradType xp + 1 sub dup /_rampIndex xp + /_maxRampIndex xp + mark exch aload pop + 0 0 + }if + pop pop + getRampData + }{ + mark mark + }ifelse + }def + }if + + currentdict/Bm known not{ + /Bm{ + _renderFlag 2 ne{ + _gradType 0 eq{ + linealRamp + }{ + radialGrad + }ifelse + }{ + 6 npop + }ifelse + }def + }if + + currentdict/Bh known not{ + /Bh{ + 2 npop + /_yHi xp + /_xHi xp + /_radHilite _xHi 0 ne _yHi 0 ne or pt + }def + }if + + currentdict/Bn known not{ + /Bn{ + AGM_Gradient_private begin + dict /_gradNames xp + end + }def + }if + + currentdict/Bd known not{ + /Bd{ + AGM_Gradient begin + AGM_Gradient_private begin + /_nColorsBd xp + /_gradType xp + /_gradName xp + }def + }if + + currentdict/BD known not{ + /BD{ + currentdict/_gradNames known not{ + /_gradNames 20 dict def + }if + ] _nColorsBd _gradType + ] _gradName exch /_gradNames xput + end + end + }def + }if + + currentdict/Bb known not{ + /Bb{ + + AGM_Gradient/AGM_Gradient_private get /_illustrator get not{ + AGM_Gradient begin + }if + AGM_Gradient_private begin + _producingSeps{ + AGM_Gradient_Sep/AGM_Gradient_Sep_private get begin + }if + mySave + }def + }if + + currentdict/BB known not{ + /BB{ + + /_tmp xp + cleartomark cleartomark + + _tmp dup + _renderFlag + + myRestore + + _producingSeps{ + end + }if + + _illustrator dup + end + not { + end + }if + + { + 2 ne exch 0 gt and{ + 2 eq{ + s + }{ + S + }ifelse + }{ + pop newpath + }ifelse + }{ + pop newpath + }ifelse + + + }def + }if + + currentdict/Xm known not{ + /Xm{ + _xm astore pop + }def + }if + + end +}def +/queryDevice{ + /_inDistiller + systemdict /currentdistillerparams known + def + /_inRipSep + _level2PS{ + currentpagedevice/Separations 2 copy known{ + get + }{ + pop pop false + }ifelse + }{ + false + }ifelse + _inDistiller or + def + /_noImage /lv1Fix where{ + pop lv1Fix + }{ + false + }ifelse + def + /_useShells where{ + /_useShells get /_usingShells xp + }{ + /_usingShells false def + }ifelse + + /_useSmoothShade where{ + pop + }{ + /_useSmoothShade false def + }ifelse + /_forceToCMYK where{ + pop + }{ + /_forceToCMYK false def + }ifelse + /_cyanPlate 1 0 0 0 testCMYKColorThrough def + /_magentaPlate 0 1 0 0 testCMYKColorThrough def + /_yellowPlate 0 0 1 0 testCMYKColorThrough def + /_blackPlate 0 0 0 1 testCMYKColorThrough def + /_compositeJob + _cyanPlate _magentaPlate and _yellowPlate and _blackPlate and + def + /_isCMYKSep + _cyanPlate _magentaPlate or _yellowPlate or _blackPlate or + def + /_compositeSpotDevice where{ + pop + }{ + /_compositeSpotDevice _compositeJob not _inRipSep or{ + 1 + }{ + 0 + }ifelse + def + }ifelse + /_producingSeps _compositeSpotDevice 0 ne def + /_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def + /_dpiThreshold where{ + pop + }{ + /_dpiThreshold 600 def + }ifelse + /_screenFreqThreshold where{ + pop + }{ + /_screenFreqThreshold 150 def + }ifelse + /_contoneDevice where{ + pop + }{ + /_contoneDevice false def + }ifelse + /_subSampleOK + _deviceDPI _dpiThreshold le + currentScreenFreq _screenFreqThreshold le and + _contoneDevice not and + def +}def +/initializeRectFill{ + /rectfill where dup{ + exch pop not _producingSeps or + }{ + not + }ifelse + { + /rectfill{ + gsave + newpath + 4 2 roll moveto + 1 index 0 rlineto + 0 1 index rlineto + 1 index neg 0 rlineto + pop pop + closepath + fill + grestore + }def + }if +}def +/initializeLev1{ + /currentScreenFreq{ + currentscreen pop pop + }def + /_byte 1 string def + /colorimage where{ + pop + }{ + /colorimage{ + pop pop + /_blackTmp xp + /_yellowTmp xp + /_magentaTmp xp + /_cyanTmp xp + /_cnt 0 pt + [ + _byte dup 0 + _cyanTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx .3 /mul cvx + _magentaTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx .59 /mul cvx + _yellowTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx .11 /mul cvx + _blackTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx + /add cvx /add cvx /add cvx 1 /exch cvx /sub cvx + /dup cvx 0 /lt cvx{ + pop 0 + }/if cvx + /dup cvx 1 /gt cvx{ + pop 1 + }/if cvx + 255 /mul cvx /cvi cvx + 256 /mod cvx + /dup cvx 0 /lt cvx{ + pop 0 + }/if cvx + /put cvx + /_cnt dup cvx 1 /add cvx /pt cvx + ] cvx + bind + /_image load 5 execImage + }def + }ifelse +}def +/initializeLev2{ + /level2ScreenFreq{ + begin + 60 + HalftoneType 1 eq{ + pop Frequency + }if + HalftoneType 2 eq{ + pop GrayFrequency + }if + HalftoneType 5 eq{ + pop Default level2ScreenFreq + }if + end + }def + /currentScreenFreq{ + currenthalftone level2ScreenFreq + }def +}def +/initializeShading{ + _useSmoothShade _level3PS and{ + /_usingSmoothShade true pt + initializeLev3_Ops + }{ + /_usingSmoothShade false pt + }ifelse +}def +/initializeLev3_Ops +{ + /initShFill{ + /_index _gradType 0 eq {0}{_maxRampIndex 1 sub} ifelse pt + /_rampFuncsArray _maxRampIndex array pt + /_boundsArray _maxRampIndex 1 sub array pt + /_encodeArray _maxRampIndex 2 mul array pt + /_beginCoord _rampPoint pt + /_colorSpace null pt + /_firstFill _rampIndex _maxRampIndex eq pt + /_lastFill false pt + }def + /linealShFill{ + popBSpace + _xm aload pop pushBSpace + + /_size _index 1 add pt + _size _maxRampIndex lt { + /_rampFuncsArray _rampFuncsArray 0 _size getinterval pt + /_boundsArray _boundsArray 0 _size 1 sub getinterval pt + /_encodeArray _encodeArray 0 _size 2 mul getinterval pt + }if + + bd + /ShadingType 2 + /ColorSpace _colorSpace + _rgbInCMYK{ + /Function [ + _cData sampFunc + _mData sampFunc + _yData sampFunc + _kData sampFunc + ] + }{ + /Function + bd + /FunctionType 3 + /Domain [0 1] + /Functions _rampFuncsArray + /Bounds _boundsArray + /Encode _encodeArray + ed + }ifelse + /Extend [_firstFill _lastFill] + /Domain [0 1] + /Coords [_beginCoord 0 _endCoord 0] + ed + shfill + }def + + /radialShFill{ + /_size _maxRampIndex _index sub pt + _size _maxRampIndex lt { + /_rampFuncsArray _rampFuncsArray _index _size getinterval pt + /_boundsArray _boundsArray _index _size 1 sub getinterval pt + /_encodeArray _encodeArray _index 2 mul _size 2 mul getinterval pt + }if + + /_rampLen _beginCoord _endCoord sub pt + bd + /ShadingType 3 + /ColorSpace _colorSpace + _rgbInCMYK{ + /Function [ + _cData sampFunc + _mData sampFunc + _yData sampFunc + _kData sampFunc + ] + }{ + /Function + bd + /FunctionType 3 + /Domain [0 1] + /Functions _rampFuncsArray + /Bounds _boundsArray + /Encode _encodeArray + ed + }ifelse + /Extend [_lastFill _firstFill] + /Domain [0 1] + /Coords [_xHi _rampLen mul _yHi _rampLen mul _endCoord 0 0 _beginCoord] + ed + shfill + + _radHilite{ + _xHi _rampLen mul _yHi _rampLen mul translate + }if + }def + + % + /sampFunc{ + /_tmp exch pt + bd + _tmp length 1 eq { + _tmp 0 get + /_tmp 2 string pt + dup _tmp 0 3 -1 roll put + _tmp 1 3 -1 roll put + }if + /FunctionType 0 + /Order 1 + /Size [_tmp length] + /Domain [0 1] + /BitsPerSample 8 + /DataSource _tmp + /Range [0 1] + ed + }def + + /fillRamp{ + + + /_invert _midPoint 0.5 lt pt + _rampIndex _maxRampIndex eq { + initShFill + }if + + getRampColorSpace + + _colorSpace null eq{ + /_colorSpace _rampColorSpace pt + }{ + _colorSpace _rampColorSpace ne _rgbInCMYK or{ + /_index _index 1 + _gradType 0 eq{ + sub pt + linealShFill + }{ + add pt + radialShFill + }ifelse + initShFill + /_colorSpace _rampColorSpace pt + } if + }ifelse + /_endCoord _endPoint pt + /_rgbInCMYK false pt + _producingSeps _forceToCMYK or _rgbRamp and { + _spotColor{ + _renderCMYK + }{ + _isCMYKSep + }ifelse + }{ + false + }ifelse + { + _compositeJob{ + /_rgbInCMYK true pt + _cyanData _magentaData _yellowData _blackData _nSamples 4 expandColor + dup length string copy /_kData exch pt + dup length string copy /_yData exch pt + dup length string copy /_mData exch pt + dup length string copy /_cData exch pt + }{ + _rampFuncsArray _index + _cyanPlate{_cyanData}if + _magentaPlate{_magentaData}if + _yellowPlate{_yellowData}if + _blackPlate{_blackData}if + _nSamples expandOne + sampFunc + dup begin /Decode [1 0] def end + put + /_invert false pt + }ifelse + }{ + _rampFuncsArray _index + bd + /FunctionType 2 + /Domain [0 1] + /N 0.5 log _invert{1 _midPoint sub}{_midPoint}ifelse log div + _gradType 0 eq{ + _invert{/C1}{/C0}ifelse _C0 + _invert{/C0}{/C1}ifelse _C1 + }{ + _invert{/C0}{/C1}ifelse _C1 + _invert{/C1}{/C0}ifelse _C0 + }ifelse + ed + put + }ifelse + + _rampIndex 1 ne{ + _boundsArray _index _gradType 1 eq{1 sub}if _endCoord put + } if + + 0 1 _invert {exch}if + _encodeArray _index 2 mul 1 add 3 -1 roll put + _encodeArray _index 2 mul 3 -1 roll put + _rampIndex 1 eq { + /_lastFill true pt + _gradType 0 eq{ + linealShFill + }{ + radialShFill + }ifelse + }if + /_index _index 1 + _gradType 0 eq{ + add pt + }{ + sub pt + }ifelse + }def +}def +/initializeComposite{ + /bwImage{ + pop /_image load 5 execImage + }def + /rampImage{ + _enabledSmoothShade{ + fillRamp + }{ + _color{ + _nSamples setImageParms + + + _rgbRamp _forceToCMYK not and{ + _redData _greenData _blueData _nSamples 3 expandColor + true 3 null ncolorimage + }{ + _cyanData _magentaData _yellowData _blackData _nSamples 4 expandColor + true 4 null ncolorimage + }ifelse + }{ + _nSamples setImageParms _blackData null bwImage + }ifelse + }ifelse + }def + /setCStop{ + /_colorStyle exch pt + _colorStyle 0 eq{ + 1 exch sub + 0 0 0 + 4 -1 roll + }if + + _colorStyle 2 eq{ + _forceToCMYK{ + 3 npop setcmykcolor + }{ + setrgbcolor 4 npop + }ifelse + }if + + _colorStyle 3 eq{ + 1 exch sub /_tmp xp + pop + 4{ + _tmp mul 4 1 roll + }repeat + }if + + _colorStyle 4 eq{ + _forceToCMYK{ + 6 npop setcmykcolor + }{ + 3 -1 roll pop pop + 1 exch sub /_tmp xp + 3{ + 1 exch sub _tmp mul 1 exch sub 3 1 roll + }repeat + setrgbcolor + 4 npop + }ifelse + }if + _colorStyle 2 ne _colorStyle 4 ne and{ + null nsetcustomcolor + }if + }def + /nsetcustomcolor + { + pop setcmykcolor + }def + /nsetcustomcolorend + { + }def + /ncolorimage{ + pop + /_colorimage load 10 execImage + }def + _noImage not _level2PS not and{ + /linealFill{ + 8 setImageParms + _color{ + currentcmykcolor + 4{ + makeByte8 4 1 roll + }repeat + true 4 null ncolorimage + }{ + currentgray makeByte8 null bwImage + }ifelse + }def + }if + /getRampColorSpace{ + _nSamples 1 gt{ + /_ndx 0 pt + [blendColor] cvx exec + }if + /_C0 [currentcolor] pt + /_C0_Space currentcolorspace pt + + _nSamples 1 gt{ + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + }if + /_C1 [currentcolor] pt + /_C1_Space currentcolorspace pt + + /_rampColorSpace _C0_Space pt + + _spotColor{ + nsetcustomcolorend + }if + }def +}def +/npop{ + {pop}repeat +}def +/xd{ + exch def +}def +/nd{ + null def +}def +/pt{ + AGM_Gradient_private 3 1 roll put +}def +/xp{ + exch pt +}def +/xput{ + dup load dup length exch maxlength eq{ + dup dup load dup + length 2 mul dict copy def + }if + load begin + def + end +}def +/mySave{ + save /_sSave xp +}def +/myRestore{ + _sSave type /savetype eq{ + _sSave restore + }if +}def +/gMark{ + counttomark 2 add -1 roll +}def +/execImage{ + /_tmp xp + { + exec + }stopped{ + $error /errorname get /undefinedresult ne{ + stop + }{ + _tmp npop + }ifelse + }if +}def +/pushBSpace{ + newpath gsave + _bUMatrix astore concat +}def +/popBSpace{ + grestore +}def +/makeByte8{ + /_tmp 0 pt + 255 mul cvi + 8 string 8{ + dup _tmp 3 index put + /_tmp _tmp 1 add pt + }repeat + exch pop +}def +/setImageParms{ + 1 8 2 index 0 0 1 0 0 _imageMatrix astore +}def +/linealFill{ + 0 0 1 1 rectfill +}def +/testCMYKColorThrough{ + gsave + setcmykcolor currentcmykcolor + grestore + add add add 0 ne +}def +/expandOne { + /_tmp xp + dup type /stringtype ne{ + _tmp string + exch + dup 0 ne{ + 255 mul cvi + 0 1 _tmp 1 sub{ + 3 copy + exch put pop + }for + }if + pop + }if +}def +/expandColor{ + /_channels xp + /_len xp + _channels{ + _len expandOne _channels 1 roll + }repeat +}def +/blendColor{ + + _color{ + _rgbRamp _producingSeps not and _forceToCMYK not and{ + _redData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _greenData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _blueData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + /setrgbcolor cvx + }{ + _cyanData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _magentaData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _yellowData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _blackData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + + _spotColor{ + _rampSD begin + /_rampSD cvx /begin cvx + + spot1 begin + tintImage dup type /stringtype eq{ + /_ndx cvx /get cvx _d255- /exch cvx /get cvx + }{ + dup null ne{ + name type /nametype ne{ + 1 exch sub + }if + }if + }ifelse + end + /spot1 cvx /tintValue 3 -1 /roll cvx /put cvx + + spot2 begin + tintImage dup type /stringtype eq{ + /_ndx cvx /get cvx _d255- /exch cvx /get cvx + }{ + dup null ne{ + name type /nametype ne{ + 1 exch sub + }if + }if + }ifelse + end + /spot2 cvx /tintValue 3 -1 /roll cvx /put cvx + /end cvx + end + /_rampSD cvx + /nsetcustomcolor cvx + }{ + /setcmykcolor cvx + }ifelse + }ifelse + }{ + _blackData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + + _enabledSmoothShade{ + 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx /setcmykcolor cvx + }{ + /setgray cvx + }ifelse + }ifelse +}def +/useRectImage{ + _subSampleOK _enabledSmoothShade not and{ + { + mark + 0 1 dtransform atan cvi 90 mod 0 eq + 1 0 dtransform atan cvi 90 mod 0 eq + } stopped + { + cleartomark + false + } + { + and exch pop + } ifelse + }{ + false + }ifelse +}def +/linealImage{ + _noImage{ + rectImage + }{ + _producingSeps{ + AGM_Gradient_Sep/AGM_Gradient_Sep_private get + /rampImage get exec + }{ + useRectImage{ + rectImage + }{ + rampImage + }ifelse + }ifelse + }ifelse +}def +/linealRamp{ + pushBSpace + _ramp{ + linealImage + }{ + linealFill + }ifelse + popBSpace + /_rampIndex _rampIndex 1 sub pt + _rampIndex 0 gt{ + getRampData + }if +}def +/radialGrad{ + /_usingShells currentoverprint _producingSeps and _usingShells or pt + /_firstShell true pt + _enabledSmoothShade not{ + currentoverprint _producingSeps and{ + + newpath + clippath pathbbox + 1 add 4 1 roll + 1 add 4 1 roll + 1 sub 4 1 roll + 1 sub 4 1 roll + _bbox astore pop + + newpath + _bbox 0 get _bbox 1 get moveto + _bbox 2 get _bbox 1 get lineto + _bbox 2 get _bbox 3 get lineto + _bbox 0 get _bbox 3 get lineto + closepath + 6 copy + gsave _bUMatrix astore concat + 1 0 moveto 0 0 1 0 360 arc closepath + eoclip fill + popBSpace + }{ + fill + }ifelse + }if + pushBSpace + + _radHilite{ + _xHi _yHi _bUMatrix idtransform /_yHi xp /_xHi xp + _rampPoint 1 lt{ + 1 _rampPoint sub dup _xHi mul exch _yHi mul translate + }if + }if + _rampIndex{ + radialRamp + /_rampIndex _rampIndex 1 sub pt + _rampIndex 0 gt{ + getRampData + }if + }repeat + + popBSpace + +}def +/getNSamples{ + 0 exch + { + dup type /stringtype eq{ + length exch pop exit + }if + pop + }forall + dup 0 eq{ + pop 1 + }if +}def +/getRampData{ + /_rampType gMark pt + /_color _rampType 0 gt pt + /_ccRGB _rampType 5 eq _rampType 6 eq or pt + /_rgbRamp _rampType 4 eq _ccRGB or pt + /_ccProcess _rampType 2 eq _rampType 3 eq or pt + _producingSeps{ + _rampSD initSpotDict + /_spotColor _ccProcess _ccRGB or pt + }{ + /_spotColor false pt + }ifelse + /_ramp true pt + 100 div /_rampPoint xp + 100 div /_midPoint xp + + dup /_colorStyle xp + _colorStyle 0 eq{ + 2 + }{ + _colorStyle 1 eq{ + 5 + }{ + _colorStyle 2 eq{ + 8 + }{ + _colorStyle 3 eq{ + _producingSeps{ + _rampSD /spot1 get begin + /name 3 index def + /spot_K 4 index def + /spot_Y 5 index def + /spot_M 6 index def + /spot_C 7 index def + end + }if + 7 + }{ + _producingSeps{ + _rampSD/spot1 get begin + /name 4 index def + /spot_K 8 index def + /spot_Y 9 index def + /spot_M 10 index def + /spot_C 11 index def + end + }if + 11 + } ifelse + }ifelse + }ifelse + }ifelse + /_tmp xp + _tmp index 100 div /_endPoint xp + + _gradType 1 eq{ + _tmp 1 add index 100 div /_midPoint xp + }if + + _producingSeps{ + _tmp 2 add index /_nextColorStyle xp + _nextColorStyle 3 eq{ + /_tmp _tmp 4 add pt + _tmp index dup + _rampSD/spot1 get /name get ne{ + _rampSD /spot2 get begin + /name xd + /spot_K _tmp 2 add index def + /spot_Y _tmp 3 add index def + /spot_M _tmp 4 add index def + /spot_C _tmp 5 add index def + end + }{ + pop + }ifelse + }if + _nextColorStyle 4 eq{ + /_tmp _tmp 5 add pt + _tmp index dup + _rampSD/spot1 get /name get ne{ + _rampSD /spot2 get begin + /name xd + /spot_K _tmp 5 add index def + /spot_Y _tmp 6 add index def + /spot_M _tmp 7 add index def + /spot_C _tmp 8 add index def + end + }{ + pop + }ifelse + }if + }if + _rampType 3 eq _rampType 6 eq or{ + /_tint2Data gMark pt + }if + _ccProcess _ccRGB or{ + /_tint1Data gMark pt + }if + _rgbRamp{ + /_blueData gMark pt + /_greenData gMark pt + /_redData gMark pt + }if + + _producingSeps{ + _ccProcess _ccRGB or{ + _rampType 3 eq _rampType 6 eq or{ + _rampSD /spot2 get begin + /tintImage _gradType 0 eq{ + _tint2Data + }{ + _tint1Data + }ifelse + def + name null eq{ + /name /Black def + }if + end + }if + _rampSD /spot1 get begin + /tintImage _gradType 0 eq _rampType 2 eq or _rampType 5 eq or{ + _tint1Data + }{ + _tint2Data + }ifelse + def + _rampType 2 eq _rampType 5 eq or{ + name null eq{ + /name _rampSD/spot2 get /name get def + /spot_C _rampSD/spot2 get /spot_C get def + /spot_M _rampSD/spot2 get /spot_M get def + /spot_Y _rampSD/spot2 get /spot_Y get def + /spot_K _rampSD/spot2 get /spot_K get def + _rampSD/spot2 get /name null put + }if + }{ + name null eq{ + /name /Black def + }if + }ifelse + end + }if + }if + /_blackData gMark pt + _rampType 0 gt{ + counttomark 4 add -3 roll + /_yellowData xp + /_magentaData xp + /_cyanData xp + }if + _ramp{ + /_nSamples + [ + _rampType 0 eq {_blackData}if + _rampType 1 eq {_cyanData _magentaData _yellowData _blackData}if + _rampType 2 eq {_cyanData _magentaData _yellowData _blackData _tint1Data}if + _rampType 3 eq {_cyanData _magentaData _yellowData _blackData _tint1Data _tint2Data}if + _rampType 4 eq {_cyanData _magentaData _yellowData _blackData _redData _greenData _blueData}if + _rampType 5 eq {_cyanData _magentaData _yellowData _blackData _redData _greenData _blueData _tint1Data}if + _rampType 6 eq {_cyanData _magentaData _yellowData _blackData _redData _greenData _blueData _tint1Data _tint2Data}if + ] getNSamples pt + _enabledSmoothShade not {/_ramp _nSamples 1 gt pt} if + } if + + setCStop +}def +/rectImage{ + gsave + /_sInc 1 pt + /_bInc 1 _nSamples div pt + /_nSubSamples _nSamples pt + /_optimize false pt + + _subSampleOK{ + /_uRampLen 1 0 dtransform _dUserSpace idtransform dup mul exch dup mul add sqrt pt + /_pChange _uRampLen 0 eq{0}{_nSamples _uRampLen div}ifelse pt + + _pChange .5 gt dup /_optimize xp{ + /_nSubSamples _uRampLen 2 div round cvi dup 1 le{pop 2}if pt + /_bInc 1 _nSubSamples div pt + /_sInc _nSamples 1 sub _nSubSamples 1 sub div pt + }if + }if + 0 + _nSubSamples + [ + /dup cvx + _optimize { + /round cvx /cvi cvx + } if + /_ndx /exch cvx /pt cvx + blendColor + 0 0 _bInc 1 /rectfill cvx + _bInc 0 /translate cvx + _sInc /add cvx + ] cvx + bind + repeat + pop + _spotColor{ + nsetcustomcolorend + }if + grestore +}def +/radialInit{ + /_nRadSamples _nSamples dup 0 eq{pop 1}if pt + /_sInc -1 pt + /_rampLen _rampPoint _endPoint sub pt + /_bInc _rampLen _nSamples div neg pt + /_optimize false pt + _subSampleOK{ + /_uRampLen + _rampLen 0 dtransform _dUserSpace idtransform dup mul exch dup mul add sqrt + 0 _rampLen dtransform _dUserSpace idtransform dup mul exch dup mul add sqrt + 2 copy lt{ + exch + }if pop + pt + /_pChange + _uRampLen 0 eq{ + 0 + }{ + _nSamples _uRampLen div + }ifelse + pt + _pChange .5 gt dup /_optimize xp{ + /_nRadSamples _uRampLen 2 div round cvi dup 1 le{pop 2}if pt + /_bInc _rampLen _nRadSamples div neg pt + /_sInc _nSamples 1 sub _nRadSamples 1 sub div neg pt + }if + }if + _radHilite{ + /_xBCInc _xHi _rampLen mul _nRadSamples div pt + /_yBCInc _yHi _rampLen mul _nRadSamples div pt + }if +}def +/radialRamp{ + _enabledSmoothShade{ + fillRamp + }{ + /_saveMatrix _saveMatrix currentmatrix def + + radialInit + + % + % + true + _producingSeps _rgbRamp not and{ + _nSamples 1 gt{ + pop + /_ndx 0 pt + [blendColor] cvx exec + currentInkN + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + currentInkN + or + }if + }if + { + _rampPoint + + _nSamples 1 sub + + _nRadSamples + [ + /dup cvx + + _optimize{ + /round cvx /cvi cvx + }if + + /_ndx /exch cvx /pt cvx + + _usingShells{ + /_firstShell cvx{ + /_firstShell false pt + }{ + 0 0 3 index 360 0 arcn fill + }/ifelse cvx + }if + + blendColor + + _usingShells{ + 0 0 3 /index cvx 0 360 /arc cvx + }{ + 0 0 3 /index cvx 0 360 /arc cvx /fill cvx + }ifelse + + /exch cvx _bInc /add cvx /exch cvx + + _sInc /add cvx + + _radHilite{ + _xBCInc _yBCInc /translate cvx + }if + ] cvx bind + repeat + + pop pop + }{ + _usingShells{ + 0 0 _rampPoint 360 0 arcn fill + }if + }ifelse + + _saveMatrix setmatrix + + _radHilite{ + _xHi _rampLen mul _yHi _rampLen mul translate + }if + + _usingShells _rampIndex 1 eq and{ + fill + }if + + _spotColor{ + nsetcustomcolorend + }if + }ifelse +}def +end +end +defaultpacking setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 53 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin +/initialize { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 { + dup type /arraytype eq { + dup xcheck { + bind + } if + } if + pop pop + } forall +} def +/terminate { end } def +currentdict /Adobe_ColorImage_AI6_Vars known not { + /Adobe_ColorImage_AI6_Vars 41 dict def +} if +Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /_newproc null def + /_proc1 null def + /_proc2 null def + /sourcearray 4 array def + /_ptispace null def + /_ptiname null def + /_pti0 0 def + /_pti1 0 def + /_ptiproc null def + /_ptiscale 0 def + /_pticomps 0 def + /_ptibuf 0 string def + /_gtigray 0 def + /_cticmyk null def + /_rtirgb null def + /XIEnable true def + /XIType 0 def + /XIEncoding 0 def + /XICompression 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIRowBytes 0 def + /XIFile null def + /XIBuffer1 null def + /XIBuffer2 null def + /XIBuffer3 null def + /XIDataProc null def + /XIColorSpace /DeviceGray def + /XIColorValues 0 def + /XIPlateList false def +end +/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def +/ci6image systemdict /image get def +/ci6curtransfer systemdict /currenttransfer get def +/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def +/ci6foureq { + 4 index ne { + pop pop pop false + }{ + 4 index ne { + pop pop false + }{ + 4 index ne { + pop false + }{ + 4 index eq + } ifelse + } ifelse + } ifelse +} def +/ci6testplate { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /setcmykcolor where { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + 1 0 0 0 ci6foureq { + /plateindex 0 def + }{ + 0 1 0 0 ci6foureq { + /plateindex 1 def + }{ + 0 0 1 0 ci6foureq { + /plateindex 2 def + }{ + 0 0 0 1 ci6foureq { + /plateindex 3 def + }{ + 0 0 0 0 ci6foureq { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end +} def +/ci6concatprocs { + /packedarray where { + pop dup type /packedarraytype eq 2 index type + /packedarraytype eq or + }{ + false + } ifelse + { + /_proc2 exch cvlit def + /_proc1 exch cvlit def + _proc1 aload pop + _proc2 aload pop + _proc1 length + _proc2 length add + packedarray cvx + }{ + /_proc2 exch cvlit def + /_proc1 exch cvlit def + /_newproc _proc1 length _proc2 length add array def + _newproc 0 _proc1 putinterval + _newproc _proc1 length _proc2 putinterval + _newproc cvx + } ifelse +} def +/ci6istint { + type /arraytype eq +} def +/ci6isspot { + dup type /arraytype eq { + dup length 1 sub get /Separation eq + }{ + pop false + } ifelse +} def +/ci6spotname { + dup ci6isspot {dup length 2 sub get}{pop ()} ifelse +} def +/ci6altspace { + aload pop pop pop ci6colormake +} def +/ci6numcomps { + dup /DeviceGray eq { + pop 1 + }{ + dup /DeviceRGB eq { + pop 3 + }{ + /DeviceCMYK eq { + 4 + }{ + 1 + } ifelse + } ifelse + } ifelse +} def +/ci6marksplate { + dup /DeviceGray eq { + pop plateindex 3 eq + }{ + dup /DeviceRGB eq { + pop plateindex 5 ne + }{ + dup /DeviceCMYK eq { + pop plateindex 5 ne + }{ + dup ci6isspot { + /findcmykcustomcolor where { + pop + dup length 2 sub get + 0.1 0.1 0.1 0.1 5 -1 roll + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop plateindex 5 ne + } ifelse + }{ + pop plateindex 5 ne + } ifelse + } ifelse + } ifelse + } ifelse +} def +/ci6colormake { + dup ci6numcomps + exch 1 index 2 add 1 roll + dup 1 eq {pop}{array astore} ifelse + exch +} def +/ci6colorexpand { + dup ci6spotname exch + dup ci6istint { + ci6altspace + exch 4 1 roll + }{ + 1 3 1 roll + } ifelse +} def +/ci6colortint { + dup /DeviceGray eq { + 3 1 roll 1 exch sub mul 1 exch sub exch + }{ + dup /DeviceRGB eq { + 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch + }{ + dup /DeviceCMYK eq { + 3 1 roll {1 index mul exch} forall pop 4 array astore exch + }{ + 3 1 roll mul exch + } ifelse + } ifelse + } ifelse +} def +/ci6colortocmyk { + dup /DeviceGray eq { + pop 1 exch sub 0 0 0 4 -1 roll 4 array astore + }{ + dup /DeviceRGB eq { + pop aload pop _rgbtocmyk 4 array astore + }{ + dup /DeviceCMYK eq { + pop + }{ + ci6altspace ci6colortint ci6colortocmyk + } ifelse + } ifelse + } ifelse +} def +/ci6makeimagedict { + 7 dict begin + /ImageType 1 def + /Decode exch def + /DataSource exch def + /ImageMatrix exch def + /BitsPerComponent exch def + /Height exch def + /Width exch def + currentdict end +} def +/ci6stringinvert { + 0 1 2 index length 1 sub { + dup 2 index exch get 255 exch sub 2 index 3 1 roll put + } for +} def +/ci6stringknockout { + 0 1 2 index length 1 sub { + 255 2 index 3 1 roll put + } for +} def +/ci6stringapply { + 0 1 4 index length 1 sub { + dup + 4 index exch get + 3 index 3 1 roll + 3 index exec + } for + pop exch pop +} def +/ci6walkrgbstring { + 0 3 index + dup length 1 sub 0 3 3 -1 roll { + 3 getinterval {} forall + 5 index exec + 3 index + } for + + 5 {pop} repeat +} def +/ci6walkcmykstring +{ + 0 3 index + dup length 1 sub 0 4 3 -1 roll { + 4 getinterval {} forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + +} def +/ci6putrgbtograystr +{ + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add +} def +/ci6putcmyktograystr +{ + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add +} def +/ci6rgbtograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putrgbtograystr load exch + ci6walkrgbstring + end +} def +/ci6cmyktograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putcmyktograystr load exch + ci6walkcmykstring + end +} def +/ci6separatecmykproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + + XIBuffer3 + + 0 2 index + + plateindex 4 2 index length 1 sub { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + pop pop exch pop + end +} def + +/ci6compositeimage { + dup 1 eq { + pop pop image + }{ + /ci6colorimage load null ne { + ci6colorimage + }{ + 3 1 roll pop + sourcearray 0 3 -1 roll put + 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load + image + } ifelse + } ifelse +} def +/ci6knockoutimage { + gsave + 0 ci6curtransfer exec 1 ci6curtransfer exec + eq { + 0 ci6curtransfer exec 0.5 lt + }{ + 0 ci6curtransfer exec 1 ci6curtransfer exec gt + } ifelse + {{pop 0}}{{pop 1}} ifelse + systemdict /settransfer get exec + ci6compositeimage + grestore +} def +/ci6drawimage { + ci6testplate -1 eq { + pop ci6compositeimage + }{ + dup type /arraytype eq { + dup length plateindex gt {plateindex get}{pop false} ifelse + }{ + { + true + }{ + dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse + } ifelse + } ifelse + { + dup 1 eq { + pop pop ci6image + }{ + dup 3 eq { + ci6compositeimage + }{ + pop pop + sourcearray 0 3 -1 roll put + /ci6separatecmykproc load + ci6image + } ifelse + } ifelse + }{ + ci6curoverprint { + 7 {pop} repeat + }{ + ci6knockoutimage + } ifelse + } ifelse + } ifelse +} def +/ci6proctintimage { + /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store + /_pticomps _ptispace ci6numcomps store + /_ptiscale _pti1 _pti0 sub store + level2? { + _ptiname length 0 gt version cvr 2012 ge and { + [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace + [_pti0 _pti1] ci6makeimagedict ci6image + }{ + [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace + [0 255] ci6makeimagedict ci6image + } ifelse + }{ + _pticomps 1 eq { + { + dup + { + 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put + } ci6stringapply + } ci6concatprocs ci6image + }{ + { + dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse + _ptibuf { + exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc + _pticomps 2 add -2 roll + _pticomps 1 sub -1 0 { + 1 index add 2 index exch + 5 -1 roll + 255 mul cvi put + } for + pop pop + } ci6stringapply + } ci6concatprocs false _pticomps + /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse + } ifelse + } ifelse +} def +/ci6graytintimage { + /_gtigray 5 -1 roll store + {1 _gtigray sub mul 1 exch sub} 4 1 roll + /DeviceGray ci6proctintimage +} def +/ci6cmyktintimage { + /_cticmyk 5 -1 roll store + {_cticmyk {1 index mul exch} forall pop} 4 1 roll + /DeviceCMYK ci6proctintimage +} def +/ci6rgbtintimage { + /_rtirgb 5 -1 roll store + {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll + /DeviceRGB ci6proctintimage +} def +/ci6tintimage { + ci6testplate -1 eq { + ci6colorexpand + 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll + dup /DeviceGray eq { + pop ci6graytintimage + }{ + dup /DeviceRGB eq { + pop ci6rgbtintimage + }{ + pop ci6cmyktintimage + } ifelse + } ifelse + }{ + dup ci6marksplate { + plateindex 5 lt { + ci6colortocmyk plateindex get + dup 0 eq ci6curoverprint and { + 7 {pop} repeat + }{ + 1 exch sub + exch {1 0}{0 1} ifelse () ci6graytintimage + } ifelse + }{ + pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage + } ifelse + }{ + ci6curoverprint { + 8 {pop} repeat + }{ + pop pop pop + {pop 1} 0 1 () /DeviceGray ci6proctintimage + } ifelse + } ifelse + } ifelse +} def +/XINullImage { +} def +/XIImageMask { + XIImageWidth XIImageHeight false + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + imagemask +} def +/XIImageTint { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + XIType 3 eq XIColorValues XIColorSpace ci6tintimage +} def +/XIImage { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + false XIChannelCount XIPlateList ci6drawimage +} def +/XG { + pop pop +} def +/XF { + 13 {pop} repeat +} def +/Xh { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + /XIImageHeight exch def + /XIImageWidth exch def + /XIImageMatrix exch def + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + /_lp /null ddef + _fc + /_lp /imagemask ddef + end +} def +/XH { + Adobe_ColorImage_AI6_Vars begin + grestore + end +} def +/XIEnable { + Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put +} def +/XC { + Adobe_ColorImage_AI6_Vars begin + ci6colormake + /XIColorSpace exch def + /XIColorValues exch def + end +} def +/XIPlates { + Adobe_ColorImage_AI6_Vars begin + /XIPlateList exch def + end +} def +/XI +{ + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + cvi dup + 256 idiv /XICompression exch store + 256 mod /XIEncoding exch store + pop pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + XIBitsPerPixel 1 eq { + XIImageWidth 8 div ceiling cvi + }{ + XIImageWidth XIChannelCount mul + } ifelse + /XIRowBytes exch def + XIEnable { + /XIBuffer3 XIImageWidth string def + XICompression 0 eq { + /XIBuffer1 XIRowBytes string def + XIEncoding 0 eq { + {currentfile XIBuffer1 readhexstring pop} + }{ + {currentfile XIBuffer1 readstring pop} + } ifelse + }{ + /XIBuffer1 256 string def + /XIBuffer2 XIRowBytes string def + {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if} + /ASCII85Decode filter /DCTDecode filter + /XIFile exch def + {XIFile XIBuffer2 readstring pop} + } ifelse + /XIDataProc exch def + + XIType 1 ne { + 0 setgray + } if + XIType 1 eq { + XIImageMask + }{ + XIType 2 eq XIType 3 eq or { + XIImageTint + }{ + XIImage + } ifelse + } ifelse + }{ + XINullImage + } ifelse + /XIPlateList false def + grestore + end +} def +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0 +%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog) +%%Version: 1.3 0 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin +put +/_?cmyk false def +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_lineorientation 0 def +/_charorientation 0 def +/_yokoorientation 0 def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_shift [0 0] def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fontSize 0 def +/_fontAscent 0 def +/_fontDescent 0 def +/_fontHeight 0 def +/_fontRotateAdjust 0 def +/Ss 256 string def +Ss 0 (fonts/) putinterval +/_cnt 0 def +/_scale [1 1] def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_hfname 100 string def +/_hffound false def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_rgbf 3 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_rgbs 3 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/_lobyte 0 def +/_hibyte 0 def +/_cproc null def +/_cscript 0 def +/_hvax 0 def +/_hvay 0 def +/_hvwb 0 def +/_hvcx 0 def +/_hvcy 0 def +/_bitfont null def +/_bitlobyte 0 def +/_bithibyte 0 def +/_bitkey null def +/_bitdata null def +/_bitindex 0 def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 100 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + /_aicmykps where {pop /_?cmyk _aicmykps def}if + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/hswj +{ + dup stringwidth 3 2 roll + { + _hvwb eq { exch _hvcx add exch _hvcy add } if + exch _hvax add exch _hvay add + } cforall +} def +/vswj +{ + 0 0 3 -1 roll + { + dup 255 le + _charorientation 1 eq + and + { + dup cstring stringwidth 5 2 roll + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + 4 -1 roll sub exch + 3 -1 roll sub exch + } + { + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + _fontHeight sub + } ifelse + } cforall +} def +/swj +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hswj } { vswj } ifelse +} def +/sw +{ + 0 0 0 6 3 roll swj +} def +/vjss +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + gsave + 2 index false charpath + 6 index setmatrix stroke + grestore + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjss +{ + 4 1 roll + { + dup cstring + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jss +{ + _lineorientation 0 eq { hjss } { vjss } ifelse +} def +/ss +{ + 0 0 0 7 3 roll jss +} def +/vjsp +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + false charpath + currentpoint + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + 2 index false charpath + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjsp +{ + 4 1 roll + { + dup cstring + false charpath + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jsp +{ + matrix currentmatrix + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/sp +{ + matrix currentmatrix + 0 0 0 7 3 roll + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/_rgbtocmyk +{ + 3 + { + 1 exch sub 3 1 roll + } repeat + 3 copy 1 4 1 roll + 3 + { + 3 index 2 copy gt + { + exch + } if + pop 4 1 roll + } repeat + pop pop pop + 4 1 roll + 3 + { + 3 index sub + 3 1 roll + } repeat + 4 -1 roll +} def +/setrgbfill +{ + _rgbf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _rgbf aload pop setrgbcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/setrgbstroke +{ + _rgbs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _rgbs aload pop setrgbcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xa +{ + _?cmyk { + 3 npop k + }{ + setrgbfill 4 npop + } ifelse +} def +/XA +{ + _?cmyk { + 3 npop K + }{ + setrgbstroke 4 npop + } ifelse +} def +/Xs +{ + /_gf exch ddef + 5 npop + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setAIseparationgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XS +{ + /_gs exch ddef + 5 npop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setAIseparationgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xx +{ + exch + /_gf exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XX +{ + exch + /_gs exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/XK +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + K + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + XA + } ifelse +} def +/Xk +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + k + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + Xa + } ifelse +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/Xt { + pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + endString eq { + cleartomark stop + } if + }ifelse + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + }ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 6 npop + 7 2 roll + 5 npop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 4 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setrgbcolor +{ + 3 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +/XP +{ + 4 npop +} bind def +/XD +{ + pop +} bind def +end +setpacking +%%EndResource +%%BeginResource: procset Adobe_pattern_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Pattern Operators) +%%Version: 1.1 0 +%%CreationDate: (03/26/93) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 95 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/@ +{ +} def +/& +{ +} def +/dp +{ + dup null eq + { + pop + _dp 0 ne + { + 0 1 _dp 1 sub _dl mod + { + _da exch get 3 get + } for + _dp 1 sub _dl mod 1 add packedarray + _da 0 get aload pop 8 -1 roll 5 -1 roll pop 4 1 roll + definepattern pop + } if + } + { + _dp 0 ne _dp _dl mod 0 eq and + { + null dp + } if + 7 packedarray _da exch _dp _dl mod exch put + _dp _dl mod _da 0 get 4 get 2 packedarray + /_dp _dp 1 add def + } ifelse +} def +/E +{ + _ed begin + dup 0 get type /arraytype ne + { + 0 + { + dup 1 add index type /arraytype eq + { + 1 add + } + { + exit + } ifelse + } loop + array astore + } if + /_dd exch def + /_ury exch def + /_urx exch def + /_lly exch def + /_llx exch def + /_n exch def + /_y 0 def + /_dl 4 def + /_dp 0 def + /_da _dl array def + 0 1 _dd length 1 sub + { + /_d exch _dd exch get def + 0 2 _d length 2 sub + { + /_x exch def + /_c false def + /_r _d _x 1 add get cvlit def + _r _ ne + { + _urx _llx sub _ury _lly sub + [ + 1 0 0 1 0 0 + ] + [ + /save cvx + _llx neg _lly neg /translate cvx + _c + { + nc /begin cvx + } if + _r dup type /stringtype eq + { + cvx + } + { + { + exec + } /forall cvx + } ifelse + _c + { + /end cvx + } if + /restore cvx + ] cvx + /_fn 12 _n length add string def + _y _fn cvs pop + /_y _y 1 add def + _fn 12 _n putinterval + _fn _c false dp + _d exch _x 1 add exch put + } if + } for + } for + null dp + _n _dd /_pd + end + xput +} def +/fc +{ + _fm dup concatmatrix pop +} def +/p +{ + /_fm exch ddef + 9 -2 roll _pm translate fc + 7 -2 roll _pm scale fc + 5 -1 roll _pm rotate fc + 4 -2 roll exch 0 ne + { + dup _pm rotate fc + 1 -1 _pm scale fc + neg _pm rotate fc + } + { + pop + } ifelse + dup _pm rotate fc + exch dup sin exch cos div 1 0 0 1 0 6 2 roll + _pm astore fc + neg _pm rotate fc + _pd exch get /_fdd exch ddef + /_pf + { + save + /_doClip 0 ddef + 0 1 _fdd length 1 sub + { + /_fd exch _fdd exch get ddef + _fd + 0 2 _fd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _fc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _fm + patternfill + } + { + pop + fill + } ifelse + grestore + pop + } for + pop + } for + restore + newpath + } ddef + /_psf + { + save + /_doClip 0 ddef + 0 1 _fdd length 1 sub + { + /_fd exch _fdd exch get ddef + _fd + 0 2 _fd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _fc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _fm + 9 copy 6 npop patternashow + } + { + pop + 6 copy 3 npop hvashow + } ifelse + grestore + pop + } for + pop + } for + restore + sw rmoveto + } ddef + /_pjsf + { + save + /_doClip 0 ddef + 0 1 _fdd length 1 sub + { + /_fd exch _fdd exch get ddef + _fd + 0 2 _fd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _fc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _fm + 12 copy 6 npop patternawidthshow + } + { + pop 9 copy 3 npop hvawidthshow + } ifelse + grestore + pop + } for + pop + } for + restore + swj rmoveto + } ddef + /_lp /none ddef +} def +/sc +{ + _sm dup concatmatrix pop +} def +/P +{ + /_sm exch ddef + 9 -2 roll _pm translate sc + 7 -2 roll _pm scale sc + 5 -1 roll _pm rotate sc + 4 -2 roll exch 0 ne + { + dup _pm rotate sc + 1 -1 _pm scale sc + neg _pm rotate sc + } + { + pop + } ifelse + dup _pm rotate sc + exch dup sin exch cos div 1 0 0 1 0 6 2 roll + _pm astore sc + neg _pm rotate sc + _pd exch get /_sdd exch ddef + /_ps + { + save + /_doClip 0 ddef + 0 1 _sdd length 1 sub + { + /_sd exch _sdd exch get ddef + _sd + 0 2 _sd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _sc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _sm + patternstroke + } + { + pop stroke + } ifelse + grestore + pop + } for + pop + } for + restore + newpath + } ddef + /_pss + { + save + /_doClip 0 ddef + 0 1 _sdd length 1 sub + { + /_sd exch _sdd exch get ddef + _sd + 0 2 _sd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _sc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _sm + 10 copy 6 npop patternashowstroke + } + { + pop 7 copy 3 npop ss + } ifelse + grestore + pop + } for + pop + } for + restore + pop sw rmoveto + } ddef + /_pjss + { + save + /_doClip 0 ddef + 0 1 _sdd length 1 sub + { + /_sd exch _sdd exch get ddef + _sd + 0 2 _sd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _sc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _sm + 13 copy 6 npop patternawidthshowstroke + } + { + pop 10 copy 3 npop jss + } ifelse + grestore + pop + } for + pop + } for + restore + pop swj rmoveto + } ddef + /_lp /none ddef +} def +end +userdict /Adobe_pattern_AI5 18 dict dup begin +put +/initialize +{ + /definepattern where + { + pop + pop pop + } + { + begin + begin + Adobe_pattern_AI5 begin + Adobe_pattern_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + mark + cachestatus 7 1 roll pop pop pop pop exch pop exch + { + { + 10000 add + dup 2 index gt + { + exit + } if + dup setcachelimit + } loop + } stopped + cleartomark + end + + end + end + + Adobe_pattern_AI5 begin + } ifelse +} def +/terminate +{ + currentdict Adobe_pattern_AI5 eq + { + end + } if +} def +errordict +/nocurrentpoint +{ + pop + stop +} put +errordict +/invalidaccess +{ + pop + stop +} put +/patternencoding +256 array def +0 1 255 +{ + patternencoding exch ( ) 2 copy exch 0 exch put cvn put +} for +/definepattern +{ + 17 dict begin + /uniform exch def + /cache exch def + /key exch def + /procarray exch def + /mtx exch matrix invertmatrix def + /height exch def + /width exch def + /ctm matrix currentmatrix def + /ptm matrix def + /str 32 string def + /slice 9 dict def + slice /s 1 put + slice /q 256 procarray length div sqrt floor cvi put + slice /b 0 put + /FontBBox + [ + 0 0 0 0 + ] def + /FontMatrix mtx matrix copy def + /Encoding patternencoding def + /FontType 3 def + /BuildChar + { + exch + begin + /setstrokeadjust where {pop true setstrokeadjust} if + slice begin + dup q dup mul mod s idiv /i exch def + dup q dup mul mod s mod /j exch def + q dup mul idiv procarray exch get + /xl j width s div mul def + /xg j 1 add width s div mul def + /yl i height s div mul def + /yg i 1 add height s div mul def + uniform + { + 1 1 + } + { + width 0 dtransform + dup mul exch dup mul add sqrt dup 1 add exch div + 0 height dtransform + dup mul exch dup mul add sqrt dup 1 add exch div + } ifelse + width 0 cache + { + xl 4 index mul yl 4 index mul xg 6 index mul yg 6 index mul + setcachedevice + } + { + setcharwidth + } ifelse + gsave + scale + newpath + xl yl moveto + xg yl lineto + xg yg lineto + xl yg lineto + closepath + clip + newpath + end + end + exec + grestore + } def + key currentdict definefont + end +} def +/patterncachesize +{ + gsave + newpath + 0 0 moveto + width 0 lineto + width height lineto + 0 height lineto + closepath + patternmatrix setmatrix + pathbbox + exch ceiling 4 -1 roll floor sub 3 1 roll + ceiling exch floor sub + mul 1 add + grestore +} def +/patterncachelimit +{ + cachestatus 7 1 roll 6 npop 8 mul +} def +/patternpath +{ + exch dup begin + setfont + ctm setmatrix + concat + slice exch /b exch slice /q get dup mul mul put + FontMatrix concat + uniform + { + width 0 dtransform round width div exch round width div exch + 0 height dtransform round height div exch height div exch + 0 0 transform round exch round exch + ptm astore setmatrix + } + { + ptm currentmatrix pop + } ifelse + { + currentpoint + } stopped not + { + 2 npop + pathbbox + true + 4 index 3 index eq + 4 index 3 index eq + and + { + pop false + { + { + 2 npop + } + { + 3 npop true + } + { + 7 npop true + } + { + pop true + } pathforall + } stopped + { + 5 npop true + } if + } if + { + height div ceiling height mul 4 1 roll + width div ceiling width mul 4 1 roll + height div floor height mul 4 1 roll + width div floor width mul 4 1 roll + 2 index sub height div ceiling cvi exch + 3 index sub width div ceiling cvi exch + 4 2 roll moveto + FontMatrix mtx invertmatrix + dup dup 4 get exch 5 get rmoveto + ptm ptm concatmatrix pop + slice /s + patterncachesize patterncachelimit div ceiling sqrt ceiling cvi + dup slice /q get gt + { + pop slice /q get + } if + put + 0 1 slice /s get dup mul 1 sub + { + slice /b get add + gsave + 0 1 str length 1 sub + { + str exch 2 index put + } for + pop + dup + { + gsave + ptm setmatrix + 1 index str length idiv + { + str show + } repeat + 1 index str length mod str exch 0 exch getinterval show + grestore + 0 height rmoveto + } repeat + grestore + } for + 2 npop + } + { + 4 npop + } ifelse + } if + end +} def +/patternclip +{ + _eo {eoclip} {clip} ifelse +} def +/patternstrokepath +{ + strokepath +} def +/patternmatrix +matrix def +/patternfill +{ + dup type /dicttype eq + { + Adobe_pattern_AI5 /patternmatrix get + } if + gsave + patternclip + Adobe_pattern_AI5 /patternpath get exec + grestore + newpath +} def +/patternstroke +{ + dup type /dicttype eq + { + Adobe_pattern_AI5 /patternmatrix get + } if + gsave + patternstrokepath + true + { + { + { + newpath + moveto + } + { + lineto + } + { + curveto + } + { + closepath + 3 copy + Adobe_pattern_AI5 /patternfill get exec + } pathforall + 3 npop + } stopped + { + 5 npop + patternclip + Adobe_pattern_AI5 /patternfill get exec + } if + } + { + patternclip + Adobe_pattern_AI5 /patternfill get exec + } ifelse + grestore + newpath +} def +/vpatternawidthshow +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 5 index 5 index 5 index Adobe_pattern_AI5 /patternfill get exec + grestore + _fontRotateAdjust sub + moveto + _hvwb eq { _hvcx _hvcy rmoveto } if + _hvax _hvay rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + _hvax sub + 3 index _hvwb eq { _hvcx sub } if + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + gsave + 2 index false charpath + 6 index 6 index 6 index Adobe_pattern_AI5 /patternfill get exec + grestore + newpath moveto pop pop + } ifelse + } cforall + 3 npop +} def +/hpatternawidthshow +{ + { + dup cstring exch + gsave + 3 index eq { 5 index 5 index rmoveto } if + false charpath currentpoint + 9 index 9 index 9 index + Adobe_pattern_AI5 /patternfill get exec + grestore + newpath moveto + 2 copy rmoveto + } cforall + 8 npop +} def +/patternashow +{ +0 0 0 6 3 roll +patternawidthshow +} def +/patternawidthshow +{ + 6 index type /dicttype eq + { + Adobe_pattern_AI5 /patternmatrix get 7 1 roll + } if + _lineorientation 0 eq { hpatternawidthshow } { vpatternawidthshow } ifelse +} def +/vpatternawidthshowstroke +{ + 7 1 roll + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 3 index setmatrix + 6 index 6 index 6 index Adobe_pattern_AI5 /patternstroke get exec + grestore + _fontRotateAdjust sub + moveto + _hvwb eq { _hvcx _hvcy rmoveto } if + _hvax _hvay rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + _hvax sub + 3 index _hvwb eq { _hvcx sub } if + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + gsave + 2 index false charpath + 4 index setmatrix + 7 index 7 index 7 index Adobe_pattern_AI5 /patternstroke get exec + grestore + newpath moveto pop pop + } ifelse + } cforall + 4 npop +} def +/hpatternawidthshowstroke +{ + 7 1 roll + { + dup cstring exch + gsave + 3 index eq { 5 index 5 index rmoveto } if + false charpath currentpoint + 7 index setmatrix + 10 index 10 index 10 index + Adobe_pattern_AI5 /patternstroke get exec + grestore + newpath moveto + 2 copy rmoveto + } cforall + 9 npop +} def +/patternashowstroke +{ + 0 0 0 7 3 roll + patternawidthshowstroke +} def +/patternawidthshowstroke +{ + 7 index type /dicttype eq + { + patternmatrix /patternmatrix get 8 1 roll + } if + _lineorientation 0 eq { hpatternawidthshowstroke } { vpatternawidthshowstroke } ifelse +} def +end +setpacking +%%EndResource +%%BeginResource: procset Adobe_cshow 2.0 8 +%%Title: (Writing System Operators) +%%Version: 2.0 8 +%%CreationDate: (1/23/89) () +%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_cshow 14 dict dup begin put +/initialize +{ + Adobe_cshow begin + Adobe_cshow + { + dup xcheck + { + bind + } if + pop pop + } forall + end + Adobe_cshow begin +} def +/terminate +{ +currentdict Adobe_cshow eq + { + end + } if +} def +/cforall +{ + /_lobyte 0 ddef + /_hibyte 0 ddef + /_cproc exch ddef + /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef + { + /_lobyte exch ddef + _hibyte 0 eq + _cscript 1 eq + _lobyte 129 ge _lobyte 159 le and + _lobyte 224 ge _lobyte 252 le and or and + _cscript 2 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 3 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 25 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript -1 eq + or or or or and + { + /_hibyte _lobyte ddef + } + { + _hibyte 256 mul _lobyte add + _cproc + /_hibyte 0 ddef + } ifelse + } forall +} def +/cstring +{ + dup 256 lt + { + (s) dup 0 4 3 roll put + } + { + dup 256 idiv exch 256 mod + (hl) dup dup 0 6 5 roll put 1 4 3 roll put + } ifelse +} def +/clength +{ + 0 exch + { 256 lt { 1 } { 2 } ifelse add } cforall +} def +/hawidthshow +{ + { + dup cstring + show + _hvax _hvay rmoveto + _hvwb eq { _hvcx _hvcy rmoveto } if + } cforall +} def +/vawidthshow +{ + { + dup 255 le + _charorientation 1 eq + and + { + -90 rotate + 0 _fontRotateAdjust rmoveto + cstring + _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow + 0 _fontRotateAdjust neg rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + exch _hvay sub exch _hvax sub + 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if + 3 2 roll + cstring + dup stringwidth pop 2 div neg _fontAscent neg rmoveto + show + moveto + } ifelse + } cforall +} def +/hvawidthshow +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse +} def +/hvwidthshow +{ + 0 0 3 -1 roll hvawidthshow +} def +/hvashow +{ + 0 0 0 6 -3 roll hvawidthshow +} def +/hvshow +{ + 0 0 0 0 0 6 -1 roll hvawidthshow +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_shading_AI8 1.0 0 +%%Title: (Adobe Illustrator 8 Shading Procset) +%%Version: 1.0 0 +%%CreationDate: (12/17/97) () +%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /Adobe_shading_AI8 10 dict dup begin put +/initialize { + Adobe_shading_AI8 begin + Adobe_shading_AI8 bdprocs + Mesh /initialize get exec +} def +/terminate { + currentdict Adobe_shading_AI8 eq { + end + } if +} def +/bdprocs { + { + dup xcheck 1 index type /arraytype eq and { + bind + } if + pop pop + } forall +} def +/X! {pop} def +/X# {pop pop} def +/Mesh 40 dict def +Mesh begin +/initialize { + Mesh bdprocs + Mesh begin + /emulate? /AI8MeshEmulation where { + pop AI8MeshEmulation + }{ + systemdict /shfill known not + } ifelse def + end +} def +/bd { + shadingdict begin +} def +/paint { + emulate? { + end + }{ + /_lp /none ddef _fc /_lp /none ddef + + /AIColorSpace AIColorSpace tocolorspace store + /ColorSpace AIColorSpace topsspace store + + version_ge_3010.106 not systemdict /setsmoothness known and { + 0.0001 setsmoothness + } if + + composite? { + /DataSource getdatasrc def + Matrix concat + currentdict end + shfill + }{ + AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and { + end + }{ + /ColorSpace /DeviceGray store + /Decode [0 1 0 1 0 1] store + /DataSource getplatesrc def + Matrix concat + currentdict end + shfill + } ifelse + } ifelse + } ifelse +} def +/shadingdict 12 dict def +shadingdict begin + /ShadingType 6 def + /BitsPerCoordinate 16 def + /BitsPerComponent 8 def + /BitsPerFlag 8 def +end +/datafile null def +/databuf 256 string def +/dataptr 0 def +/srcspace null def +/srcchannels 0 def +/dstchannels 0 def +/dstplate 0 def +/srctodstcolor null def +/getplatesrc { + /srcspace AIColorSpace store + /srcchannels AIColorSpace getnchannels store + /dstchannels 1 store + /dstplate getplateindex store + /srctodstcolor srcspace makesmarks { + dstplate 4 eq { + {1 exch sub} + }{ + {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat} + } ifelse + }{ + {srcchannels {pop} repeat 1} + } ifelse store + /datafile getdatasrc store + /rdpatch168 load DataLength () /SubFileDecode filter +} def +/getdatasrc { + /rdcmntline load /ASCII85Decode filter +} def +/rdpatch168 { + /dataptr 0 store + 49 rdcount + 4 { + dup {pop srcchannels getint8} if + dup {pop srctodstcolor dstchannels putint8 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdpatch3216 { + /dataptr 0 store + 97 rdcount + 4 { + dup {pop srcchannels getint16} if + dup {pop srctodstcolor dstchannels putint16 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdcount { + dup 0 gt { + datafile databuf dataptr 4 -1 roll getinterval readstring + exch length dataptr add /dataptr exch store + }{ + true + } ifelse +} def +/getint8 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 255 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint8 { + dup dataptr add /dataptr exch store + dataptr exch + { + 1 sub exch + 255 mul cvi + databuf 2 index + 3 -1 roll put + } repeat + pop +} def +/getint16 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 256 mul datafile read} if + dup {pop add 65535 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint16 { + dup 2 mul dataptr add /dataptr exch store + dataptr exch + { + 2 sub exch + 65535 mul cvi dup + 256 idiv databuf 3 index 3 -1 roll put + 256 mod databuf 2 index 1 add 3 -1 roll put + } repeat + pop +} def +/srcbuf 256 string def +/rdcmntline { + currentfile srcbuf readline pop + (%) anchorsearch {pop} if +} def +/getplateindex { + 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall +} def +/aicsarray 4 array def +/aicsaltvals 4 array def +/aicsaltcolr aicsaltvals def +/tocolorspace { + dup type /arraytype eq { + mark exch aload pop + aicsarray 0 3 -1 roll put + aicsarray 1 3 -1 roll put + dup aicsarray 2 3 -1 roll put + gettintxform aicsarray 3 3 -1 roll put + counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store + aicsaltcolr astore pop pop + aicsarray + } if +} def +/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def +/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def +/gettintxform { + /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load +} def +/getnchannels { + dup type /arraytype eq {0 get} if + colorspacedict exch get begin Channels end +} def +/makesmarks { + composite? { + pop true + }{ + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin MarksPlate end + } ifelse +} def +/markingplate { + composite? { + pop true + }{ + dup type /arraytype eq { + dup length getplateindex gt {getplateindex get}{pop false} ifelse + } if + } ifelse +} def +/tocmyk { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToCMYK end +} def +/topsspace { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToPSSpace end +} def +/colorspacedict 5 dict dup begin + /DeviceGray 4 dict dup begin + /Channels 1 def + /MarksPlate {pop black?} def + /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def + /ToPSSpace {} def + end def + /DeviceRGB 4 dict dup begin + /Channels 3 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop _rgbtocmyk} def + /ToPSSpace {} def + end def + /DeviceCMYK 4 dict dup begin + /Channels 4 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop} def + /ToPSSpace {} def + end def + /Separation 4 dict dup begin + /Channels 1 def + /MarksPlate { + /findcmykcustomcolor where { + pop dup 1 exch ToCMYK 5 -1 roll 1 get + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace {} def + end def + /Process 4 dict dup begin + /Channels 1 def + /MarksPlate { + isCMYKSep? { + 1 exch ToCMYK 4 array astore getplateindex get 0 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace { + 4 array copy dup 0 /Separation put + } def + end def +end def +/isoverprint { + /currentoverprint where {pop currentoverprint}{_of} ifelse +} def +/version_ge_3010.106 { + version {cvr} stopped { + pop + false + }{ + 3010.106 ge + } ifelse +} def +end +end +defaultpacking setpacking +%%EndResource +%%EndProlog %%BeginSetup userdict /_useSmoothShade true put userdict /_aicmykps true put userdict /_forceToCMYK true put Adobe_level2_AI5 /initialize get exec +Adobe_cshow /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 AGM_Gradient /initializeAI get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_pattern_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_shading_AI8 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +%AI3_BeginRider currentpacking true setpacking setpacking %AI3_EndRider %AI5_Begin_NonPrinting Np %AI8_PluginGroupInfo (Adobe Path Blends) (Adobe Blends Plugin) (LiveBlends.aip) %AI8_PluginGroupInfo (Adobe Tracing Object) (Tracing) (TracingSuite.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe Calligraphic Brush Tool) (Adobe Calligraphic Brush Plugin) (CalligBrushTool.aip) %AI8_PluginGroupInfo (Adobe Flare Plugin) (Flare) (Flare.aip) %AI8_PluginGroupInfo (Adobe Symbolism) (Adobe Symbolism) (ParticleSystem.aip) %AI8_PluginGroupInfo (Adobe Deform Plugin) (Adobe Envelope Plugin) (Envelope and Warp.aip) %AI8_PluginGroupInfo (Pathfinder Suite) (Adobe Compound Shape) (PathFinderS.aip) %AI8_PluginGroupInfo (Adobe Planar Group) (Adobe Live Paint Plugin) (Live Paint.aip) %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np 12 Bn %AI5_BeginGradient: (Gray Linear Gradient) (Gray Linear Gradient) 0 7 Bd [ < 0A0B0C0D0D0E10111213131415161717191A1B1B1C1D1F202122232425262728292A2B2C2D2E2E2F 31323435363738393A3B3C3D3E3F41424344454648494A4B4C4D4E5051525354555758595A5C5D5E 60616364656668696A6B6C > < 070809090A0B0B0C0D0C0D0E0F1010121112131314151617161718191A1B1C1D1D1E1E1E1F202223 24252627262728292A2B2C2D2E2F3031303132333435363738393A3B3C3C3C3D3E3F414243444546 47484A494A4B4D4E4F5051 > < 0607070809090A0A0B0C0D0E0D0E0F0F111211121314141516161718191A1B1A1B1C1D1E1F201F20 212223242625262728292A2B2C2B2C2D2F303031323233343536373839393A3B3C3D3E3F403F4041 42444547484948494A4B4C > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010101 > < F1F0EFEEEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECECD CCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5 A4A3A2A1A09F9E9D9C9B9A > < F1F0EFEFEEEDECEBEAEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDDDCDBDAD9D8D7D6D5D4D4D3D2D1D0CF CECDCCCBCBCAC9C8C7C6C5C4C3C2C1C0C0BFBEBDBCBBBAB9B8B7B6B5B4B4B3B2B1B0AFAEADACABAA A9A8A7A7A6A5A4A3A2A1A0 > < F2F1F1F0EFEEEDEDECEBEAE9E9E8E7E6E5E4E4E3E2E1E0DFDFDEDDDCDBDAD9D9D8D7D6D5D4D3D3D2 D1D0CFCECDCDCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBFBEBDBCBBBAB9B8B8B7B6B5B4B3B2B1B1B0AF AEADACABAAA9A9A8A7A6A5 > 4 %_Br < 1A1918171615141211100E0D0C0B0A > < 11100F0E0D0D0C0C0C0B0B0A090807 > < 1111100F0E0D0C0B0B0A0909080706 > 0 < E2E3E4E5E6E7E8EAEBECEDEEEFF0F1 > < E4E5E6E7E8E9EAEBEBECEDEEEFF0F1 > < E5E6E7E8E9EAEBECECEDEEEFF0F1F2 > 4 %_Br < 54535251504F4E4C4B4A4948474644434241403F3E3D3C3B393836353432312F2E2D2C2B2A292827 262524232221201F1E1D1C1B1A > < 3C3B3A3938373635343433323130302F2E2D2C2B2A2928272625252524232221201F1E1D1C1C1B1A 19181717171615141413121111 > < 3D3C3C3B3A39383837363534333230302F2E2D2C2D2C2B2A29282725242322212021201F1E1D1C1B 1B1A1918161616151514131211 > 0 < ADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C8C9CACBCCCDCECFD0D1D2D3D4D5 D6D7D8D9DADBDCDDDEDFE0E1E2 > < B3B4B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCCCDCECFD0D1D2D3D4D5D6D7D8 D9DADBDCDCDDDEDFE0E1E2E3E4 > < B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C7C8C9CACBCCCDCECFD0D1D2D3D3D4D5D6D7D8D9 DADBDCDDDEDFDFE0E1E2E3E4E5 > 4 %_Br < 00000000000000000000000000000001010102020203030304040505050505060606070708080909 0A0A0A0A0B0C0C0D0D0E0E101011121213141415141617171819191A1B1B1C1D1E1E1F2021212223 24242526272728292A2B2B2C2D2E2F303132333536373838393A3C3D3E3F40414243434546474849 4A4B4C4E4F5051525354 > < 00000000000000000000000000000001000000010101020201020202030203030304040504050505 05050606070608070908090A0A0B0A0C0B0C0C0D0E0D0E0E0F101011111112131214141415161617 171718191A1A1B1C1D1C1D1E1F1F1F20222122232526252628292A2A2A2B2C2D2E2F302F30313233 343536363738393A3B3C > < 00000000000000000000000000000000000001010101020202020202030302030304040405040505 060607070708070908090A0A0B0B0C0B0D0C0E0D0E100F1010111211121413141415151616171718 19191A1B1B1B1C1D1C1E1F201F21222222242526252628292A292A2B2D2E2F2E2F30303233333435 363737393A3A3B3C3C3D > 0 < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F8F8F8F7F7F6F6F6F5F5F4F4F3F3 F2F2F1F1F0EFEFEEEEEDEDECECEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDEDEDDDCDBDBDAD9 D8D8D7D6D5D5D4D3D2D1D1D0CFCECDCCCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7 B6B5B4B3B2B1B0AFAEAD > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFCFBFBFBFAFAFAF9F9F9F8F8F7F7F7F6F6F5F5F4F4F4 F3F3F2F2F1F1F0F0EFEFEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDFDEDDDDDC DBDBDAD9D8D8D7D6D5D5D4D3D2D2D1D0CFCFCECDCCCBCBCAC9C8C7C6C6C5C4C3C2C1C0C0BFBEBDBC BBBAB9B9B8B7B6B5B4B3 > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F9F8F8F8F7F7F6F6F6F5F5F4F4 F3F3F2F2F1F1F1F0F0EFEEEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E2E1E0E0DFDEDEDD DCDCDBDAD9D9D8D7D7D6D5D4D4D3D2D1D1D0CFCECECDCCCBCACAC9C8C7C6C5C5C4C3C2C1C0C0BFBE BDBCBBBAB9B9B8B7B6B5 > 4 %_Br < 0A0A090908080706050504030201000000 > < 0707070605050504030302020100000000 > < 0606050505040403020202020100000000 > 0 < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F2F2F3F4F4F5F6F7F8F9F9FAFBFCFDFEFF > 4 %_Br < 1717161615151414131312121111100F0F0E0D0C0B0B0A > < 16161515141313121111110F0E0D0E0D0C0B0A0A090807 > < 1717161415141312111111100F0E0D0C0B0A0A08070706 > 0 < E5E5E6E6E7E7E8E8E9E9EAEAEBEBECEDEDEEEEEFF0F0F1 > < E1E1E2E2E3E4E4E5E6E6E7E8E9EAEAEBECEDEEEEEFF0F1 > < DFDFE0E1E1E2E3E4E5E5E6E7E8E9EAEBECEDEEEFF0F1F2 > 4 %_Br [ 0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 %_BS %_0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 Bs 0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 %_BS %_0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 Bs 0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 %_BS %_0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 Bs 0 0 0 0 1 1 1 2 64.5161 0.005 %_BS %_0 0 0 0 1 1 1 2 64.5161 0 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0.0025 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0 Bs 0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 %_BS %_0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Linear Gradient 1) (Linear Gradient 1) 0 2 Bd [ < 00000001020304050506070809090A0B0C0D0F10111213141516171818191A1B1C1C1D1F20212223 24252627292A2A2B2D2E2F30323334353637383A3B3C3D3E3F40424344454647484A4B4C4D4E4F51 52535455565658595B5C5D5F6061626364666768696A6B6C6D6E6F6F707172737475767778797A7B 7C7D7E7F7F8081828383848586878788898A8B8C8B8C8D8E8E8F9090919293949495969697989899 9A9A9B9C9C9D9D9E9E9F9FA0A0A1A1A2A2A3A3A4A4A4A5A5A6A6A7A7A8A8A9A9AAAAAAABABAAAAAB ABABABACACACACADADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2 > < 00000000010202030304040506060708090A0A0B0C0D0D0E0F1010111213141516171818191A1B1C 1D1D1E1F202122222324262728292A2B2C2D2E2E2F30313233343536373838393A3B3C3D3E3F4041 434445464648494A4C4D4E4F505152535455565758595A5A5B5C5D5E5F6061626364646566676869 6A6B6C6C6D6E6F6F70717272737475767778797A7B7C7C7D7E7F808081828383848586878788898A 8A8B8C8D8E8E8F8F9090919292939494959696979899999A9A9B9B9C9C9D9D9E9E9F9FA0A0A2A2A3 A3A3A4A4A5A5A6A6A7A7A7A8A8A9A9A9AAAAAAABABABACACAC > < 00000000010202030304040506060708090A0B0B0C0D0E0F1011121213141515161718191A1B1B1C 1D1E1F20202122232425262728292A2B2C2D2E2F30313233343536373738393A3B3C3D3E3F404142 434445464748494A4C4D4E4F505152535455565758595A5B5C5C5D5E5F6061616161626364656566 676869696A6B6B6C6D6E6E6F70717172737474757677777879797A7B7C7C7D7E7F7F808181828383 8485858686878888898A8B8B8C8D8D8E8E8F8F90909191929293939494959596969797989899999A 9A9B9B9C9C9C9D9D9E9E9E9F9F9FA0A0A1A1A1A1A2A2A2A3A3 > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000010101010101020202020203030304040505060606070708090A0A0B 0C0D0E0F0F101112131415161718191A1B1D1E1F20212324252728292B2C2E2F303233353637393B 3C3E4041434546484A4B4D4F51525456585A5C5E5F61636567696B6D6F717375777A7C7E80828587 898B8E90929497999B9DA0A2A4A6A8ABADAFB1B3B5B7B9BBBD > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9 D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1 B0AFAEADACACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A 898887868584838281807F7E7D7C7B7A79787776767574737271706F6E6D6C6B6A69686766656463 6261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3E3D3C 3B3A393837363534333231302F2E2D2C2B2A29282726252423 > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 37363534333231302F2E2D2C2B2A292827262524232221201F > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796959493929190908F8E8D8C8B8A89 8887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261 605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A39 3837363534333231302F2E2D2C2B2A29282726252423222120 > 4 %_Br [ 0 0 50 100 %_BS %_0 0 50 100 Bs 1 0 50 0 %_BS %_1 0 50 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Purple Radial Gradient) (Purple Radial Gradient) 1 3 Bd [ < 000000010202030304050505060707070809090A0A0C0D0D0E0F0F0F101112131313151616161718 1A1A1B1C1C1C1D1F202020212223252526272828292A2B2D2D2E2F3031313233343535373839393A 3B3C3D3D3E3F404141434445464647484A4B4B4D4E4F505152535455555758 > < 0000000102020303040405060708090A0A0B0D0E0F101112131415161718191A1B1C1B1C1D1E1F20 2022232325262728292A2B2C2D2E2F3032333435363738393A3B3C3D3E3F4041424345464748494A 4B4C4D4E4F5051525354555657595A5B5C5E6061626364666768696A6B6D6E > < 00000000000000000001000100010101010101010201020202020202010201020202030303020302 03030304030303030404040304030404040404040404040505050505050405060506050504050505 05050605050605060506050506050605050606070607060708070807070607 > 0 < FFFEFEFDFCFBFBFAF9F8F8F7F6F5F5F4F3F2F2F1F0EFEEEEEDECEBEBEAE9E8E7E7E6E5E4E4E3E2E1 E0E0DFDEDDDDDCDBDAD9D9D8D7D6D5D5D4D3D2D2D1D0CFCECECDCCCBCACAC9C8C7C6C6C5C4C3C3C2 C1C0BFBFBEBDBCBBBBBAB9B8B7B7B6B5B4B3B3B2B1B0AFAFAEADACABABAAA9 > < FFFEFDFCFBFAF9F9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDFDEDDDCDBDA D9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2 B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796959493 > < FFFEFEFDFDFCFCFBFBFAFAF9F9F8F7F7F6F6F5F5F4F4F3F2F2F1F1F0F0EFEFEEEDEDECECEBEBEAEA E9E8E8E7E7E6E6E5E4E4E3E3E2E2E1E0E0DFDFDEDEDDDDDCDBDBDADAD9D9D8D7D7D6D6D5D5D4D3D3 D2D2D1D1D0CFCFCECECDCDCCCBCBCACAC9C8C8C7C7C6C6C5C4C4C3C3C2C2C1 > 4 %_Br < 5858585959595A5B5B5C5C5D5D5D5E5E606061616262636365656666676769696A6A6B6C6D6D6F70 70717173737476767777797A7A7C7C7D7E7F80808183838485868788898A8A8C8D8E8F9091929494 959797999A9B9C9E9F9FA1A2A2A4A5A5A7A9A9AAACADADAEB0B0B2B3B4B4B6B7B9B9BABCBCBEBFC1 C1C2C4C5C5C7C8C9CACBCDCECECFD0 > < 6E6E6F6F6F7070717173737474767577787879797B7D7C7E7F7F80828283848486878788898B8B8C 8E8F8F909294939596989A999B9D9EA09FA1A2A4A5A5A7A8AAABADACAEAFB1B3B4B5B5B6B8B9BBBC BEBFC1C1C2C4C5C7C8CACBCCCECECFD1D2D3D5D6D7D9DADCDDDFE0E1E3E3E4E6E7E8EAEBECEEEFF1 F2F4F5F6F8F9FBFCFEFFFFFFFFFFFF > < 07070608080707070706080707080807080808080708080908080807090809090A09090A090A0A0B 0A0B0B0C0A0B0B0C0B0C0A0D0B0C0B0C0C0D0C0C0B0D0C0D0C0D0E0E0F0E0F0E0F0D100F0F111011 1011101213121312131213141315141516151615161516171617171819191A1B1A1B1B1C1D1C1D1C 1E1F1E202120212322242325262628 > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000001010101010101010101010101010101010102020202020202020203030304040405040504 05060506060607070707070809090B > < A9A9A9A8A8A8A7A7A7A6A6A5A5A5A4A4A3A3A2A2A1A1A0A09F9F9E9E9D9D9C9C9B9B9A9A99999897 979696959594939392929190908F8F8E8D8D8C8C8B8A8A8988888786868585848383828181807F7F 7E7D7D7C7B7B7A79787877767675747473727271706F6F6E6D6D6C6B6A6A69686767666565646362 6261605F5F5E5D5C5C5B5A59595857 > < 9393929292919190908F8F8E8E8D8D8C8B8B8A8A8988888786868584848382828180807F7E7D7D7C 7B7A7A7978777776757473737271706F6F6E6D6C6B6B6A6968676666656463626160605F5E5D5C5B 5A59585857565554535251504F4F4E4D4C4B4A49484746454443424140403F3E3D3C3B3A39383736 3534333231302F2E2D2C2B2A292827 > < C1C1C1C0C0C0C0BFBFBFBEBEBEBDBDBDBCBCBBBBBBBABAB9B9B9B8B8B7B7B6B6B5B5B5B4B4B3B3B2 B2B1B1B0B0AFAFAEAEADADACACABABAAAAA9A9A8A8A7A7A6A6A5A4A4A3A3A2A2A1A1A0A09F9E9E9D 9D9C9C9B9A9A99999898979696959594939392929191908F8F8E8E8D8C8C8B8A8A89898887878686 8584848382828180807F7F7E7D7D7C > 4 %_Br [ 0 0 0 0 1 1 1 2 50.7937 0 %_BS %_0 0 0 0 1 1 1 2 50.7937 0 Bs 0.345098 0.431373 0.027451 0 0.662745 0.576471 0.756863 2 57.3913 35.955 %_BS %_0.345098 0.431373 0.027451 0 0.662745 0.576471 0.756863 2 57.3913 35.955 Bs 0.815686 1 0.156863 0.043137 0.341176 0.152941 0.486275 2 51.0204 100 %_BS %_0.815686 1 0.156863 0.043137 0.341176 0.152941 0.486275 2 51.0204 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Radial Gradient 1) (Radial Gradient 1) 1 2 Bd [ < 00000001020304050506070809090A0B0C0D0F10111213141516171818191A1B1C1C1D1F20212223 24252627292A2A2B2D2E2F30323334353637383A3B3C3D3E3F40424344454647484A4B4C4D4E4F51 52535455565658595B5C5D5F6061626364666768696A6B6C6D6E6F6F707172737475767778797A7B 7C7D7E7F7F8081828383848586878788898A8B8C8B8C8D8E8E8F9090919293949495969697989899 9A9A9B9C9C9D9D9E9E9F9FA0A0A1A1A2A2A3A3A4A4A4A5A5A6A6A7A7A8A8A9A9AAAAAAABABAAAAAB ABABABACACACACADADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2 > < 00000000010202030304040506060708090A0A0B0C0D0D0E0F1010111213141516171818191A1B1C 1D1D1E1F202122222324262728292A2B2C2D2E2E2F30313233343536373838393A3B3C3D3E3F4041 434445464648494A4C4D4E4F505152535455565758595A5A5B5C5D5E5F6061626364646566676869 6A6B6C6C6D6E6F6F70717272737475767778797A7B7C7C7D7E7F808081828383848586878788898A 8A8B8C8D8E8E8F8F9090919292939494959696979899999A9A9B9B9C9C9D9D9E9E9F9FA0A0A2A2A3 A3A3A4A4A5A5A6A6A7A7A7A8A8A9A9A9AAAAAAABABABACACAC > < 00000000010202030304040506060708090A0B0B0C0D0E0F1011121213141515161718191A1B1B1C 1D1E1F20202122232425262728292A2B2C2D2E2F30313233343536373738393A3B3C3D3E3F404142 434445464748494A4C4D4E4F505152535455565758595A5B5C5C5D5E5F6061616161626364656566 676869696A6B6B6C6D6E6E6F70717172737474757677777879797A7B7C7C7D7E7F7F808181828383 8485858686878888898A8B8B8C8D8D8E8E8F8F90909191929293939494959596969797989899999A 9A9B9B9C9C9C9D9D9E9E9E9F9F9FA0A0A1A1A1A1A2A2A2A3A3 > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000010101010101020202020203030304040505060606070708090A0A0B 0C0D0E0F0F101112131415161718191A1B1D1E1F20212324252728292B2C2E2F303233353637393B 3C3E4041434546484A4B4D4F51525456585A5C5E5F61636567696B6D6F717375777A7C7E80828587 898B8E90929497999B9DA0A2A4A6A8ABADAFB1B3B5B7B9BBBD > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9 D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1 B0AFAEADACACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A 898887868584838281807F7E7D7C7B7A79787776767574737271706F6E6D6C6B6A69686766656463 6261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3E3D3C 3B3A393837363534333231302F2E2D2C2B2A29282726252423 > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 37363534333231302F2E2D2C2B2A292827262524232221201F > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796959493929190908F8E8D8C8B8A89 8887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261 605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A39 3837363534333231302F2E2D2C2B2A29282726252423222120 > 4 %_Br [ 1 0 50 0 %_BS %_1 0 50 0 Bs 0 0 50 100 %_BS %_0 0 50 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Red Linear Gradient) (Red Linear Gradient) 0 6 Bd [ < 3A39393838373736353534333332313130302F2E2E2D2C2B2B2A2928272726252423222120201F1E 1D1C1B1A191817161514131211100F0E0D0C0B0A09080605040302 > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFD > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFDFCFCF9F9F9F8 > < 2A2928272624232221201F1E1D1C1C1B1A19181716151413121110100F0E0D0C0C0A0A0908070606 050505040404040303030202020201010101010101010100000000 > < A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CBCCCDCECFD0D1 D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC > < 14141414141515151515151515161616161616161617171717171717171818181818181818181919 1919191919191A1A1A1A1A1A1A1A1B1B1B1B1B1B1B1B1C1C1C1C1C > < 1A1A1A1A1B1B1B1B1B1B1C1C1C1C1C1C1C1D1D1D1D1D1D1D1E1E1E1E1E1E1F1F1F1F1F1F1F202020 202020212121212121212222222222222223232323232324242424 > 4 %_Br < 23242526272728292A2B2B2C2D2E2E2F303131323333343535363737383839393A > 1 1 < 0B0C0C0D0E0F10101112131415161718191B1C1C1D1E1F2021222324262728292A > < CAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB8B7B6B5B4B3B2B1B0AFAEADACABAAA9 > < 181818181817171717171717171616161616161616151515151515151514141414 > < 1F1F1F1F1E1E1E1E1E1E1D1D1D1D1D1D1D1C1C1C1C1C1C1B1B1B1B1B1B1A1A1A1A > 4 %_Br < 0909090A0A0A0A0B0B0B0B0B0C0C0C0B0B0C0C0C0C0C0D0D0C0C0E0E0E0D0D0E0E0E0E0E0F0F0F0F 0F101010101011111111111211111111121212131314141414141515151514161615151515171717 161618181818181719191918181A1A1A1A1A1A1B1B1B1A1A1B1B1B1A1A1A1B1B1B1A1A1A1B1B1B1B 1B1B1C1C1C1B1B1C1C1C1D1D1C1C1E1D1D1D1D1D1E1E1E1E1E1D1D1E1E1E1D1D1D1D1E1E1E1D1D1D 1E1E1E1E1E1E1E1E1F1F1F1F1F1F1F2020201F1F1F1F1F2020202020202020212121212020202021 21212121212121212122222222222222222222232323232323232323232323232323232323232323 232323 > < 3E3F414243454647484A4B4C4D4E5051525354565758595B5C5D5D5E5F616263656668696A6B6D6E 6F7071737374757678797B7C7D7F80828183848687898A8C8D8D8F90929395969799999A9C9D9E9F A1A0A1A3A4A5A7A8A8A9ABACADAEAEB0B1B2B4B5B5B6B7B9BABABBBCBDBFBEC0C1C2C3C3C4C6C7C7 C8C9CACACBCCCDCECECFD0D1D1D2D3D3D4D5D6D6D7D8D9D9DBDCDCDDDEDEDFE0E0E1E2E3E3E4E5E5 E5E6E6E7E7E8E9E9EAEBEBECECEDEDEDEEEFEFF0F0F1F2F2F3F3F4F4F5F6F6F7F7F8F8F9F9FAFAFA FBFBFCFCFDFDFDFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 1F1F20212223242526272829292A292A2B2C2C2D2E2F2F303132343536373537373839393B3B3C3D 3E3F3E3F41424344454647464748494A4C4D4E4F4F505152535556555657585A5B5C5C5D5E606162 61636566676868696B6C6D6F6E6F717374737576787A797A7C7E7D7F80828483858788888A8B8D8D 8F90929294959796989A9A9C9EA09FA1A3A3A4A7A8A8AAACABADAFAFB0B3B2B4B6B5B7B9B9BABCBC BEBFBFC1C4C3C5C5C7C9C9CBCBCDCFCFD1D1D3D5D5D7D7D9D8DBDDDDDEDEE0E0E2E2E5E4E7E7E9E8 EBEBEDEDEFEFF2F1F4F4F6F6F9F8F8FBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000001010101010101010101010101 01010101010202020202020202020202020202020302030303030303040404040404040505050505 05050505050505050606060606060607070707070707070707070707070707080808080808080808 080808080808080808090909090909090909090A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B 0B0B0B > < F0F0F0EFEFEFEFEEEEEEEEEEEDEDEDEDEDECECECECECEBEBEBEBEAEAEAEAEAE9E9E9E9E9E8E8E8E8 E8E7E7E7E7E7E6E6E6E6E6E5E5E5E5E5E4E4E4E4E4E3E3E3E3E3E2E2E2E2E2E1E1E1E1E1E1E0E0E0 E0E0DFDFDFDFDFDFDEDEDEDEDEDDDDDDDDDDDDDCDCDCDCDCDBDBDBDBDBDBDADADADADADAD9D9D9D9 D9D9D8D8D8D8D8D8D7D7D7D7D7D7D6D6D6D6D6D6D5D5D5D5D5D5D5D4D4D4D4D4D4D4D3D3D3D3D3D3 D2D2D2D2D2D2D2D2D1D1D1D1D1D1D1D0D0D0D0D0D0D0D0CFCFCFCFCFCFCFCFCECECECECECECECECD CDCDCDCDCDCDCDCDCDCCCCCCCCCCCCCCCCCCCCCBCBCBCBCBCBCBCBCBCBCBCBCBCACACACACACACACA CACACA > < C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A4A3A2A1 A09F9E9D9D9C9B9A99989796959493929291908F8E8D8C8B8A8A89888786858483828281807F7E7D 7C7C7B7A7978777676757473727171706F6E6D6C6C6B6A696868676665646463626160605F5E5D5D 5C5B5A5A595857565655545353525151504F4E4E4D4C4B4B4A494948474746454544434242414040 3F3E3E3D3D3C3B3B3A39393837373636353434333332313130302F2F2E2D2D2C2C2B2B2A2A292928 2727262625252524242323222221212020201F1F1E1E1E1D1D1C1C1C1B1B1B1A1A1A1A1919191918 181818 > < C9C8C7C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADADACABAAA9A8A7A6A5A4 A3A2A2A1A09F9E9D9C9B9A9A99989796959493929291908F8E8D8C8C8B8A89888786868584838281 81807F7E7D7C7C7B7A7978777776757473737271706F6F6E6D6C6C6B6A6968686766656564636262 61605F5F5E5D5C5C5B5A5A59585757565555545352525150504F4E4E4D4C4C4B4A4A494848474646 4544444342424141403F3F3E3E3D3C3C3B3B3A393938383737363535343433333232313130302F2F 2E2E2D2D2C2C2B2B2A2A29292828282727262626252524242423232322222221212121202020201F 1F1F1F > 4 %_Br < 02020202020202020202020202020202020202020202010101010101010101020202020202020202 02020202020202020202020202020303030303030303030303030202020303030303030404040404 04040404040404040404040405050505050505050505060606060606060606060505050504040404 04050505050506060606060607070707070707070707070707070707070708080808080808080808 080707080808080808080909090909090909090909090909090909090909 > < FDFDFCFCFBFBFAFAF9F9F8F8F7F7F6F5F5F4F4F3F2F1F0F0EFEEEDEDECEBEBEAE9E8E8E7E6E5E4E3 E2E1E0DFDEDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C4C3C2C0BFBEBDBC BAB9B9B7B6B5B4B3B1B0B0AEADACABA9A8A7A5A4A3A1A09F9F9D9C9B99989695949290908F8E8C8B 8988878584848281807E7D7B7A79797876757372716F6F6E6D6B6A6967676665636260605F5D5C5B 595A595756555554525150504E4D4C4C4A494848464544444241413F3F3E > < F8F6F5F3F0EEECEAE8E7E5E3E1DFDFDEDCDAD8D7D5D3D1D0CECCCAC8C7C5C3C2C0BEBCBCBBB9B7B6 B4B2B0AFADABAAA8A6A4A2A0A19F9D9B9A9896959392908E8D8B8B8A88868583817F7E7C7B797A78 7776747271706E6D6C6C6A696866656462616061605F5E5D5B5A5857585756545352504E4F4E4D4C 4A494847484746454443424342413F3E3D3E3D3C3B3A393839383736363635343333323231302F2F 302E2D2C2D2C2A2A292A29282728272627262523242322222120201F1E1F > 0 < ECECECECECECECECECECECECECECECECECECECECECECEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 > < 1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 444546474848494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626263646566676869 6A6B6C6D6E6F70717273737475767778797A7B7C7D7E7F80808182838485868788898A8A8B8C8D8E 8F90919293939495969798999A9B9B9C9D9E9FA0A1A2A2A3A4A5A6A7A8A8A9AAABACADADAEAFB0B1 B2B2B3B4B5B6B6B7B8B9BABABBBCBDBDBEBFC0C0C1C2C3C3C4C5C5C6C6C7 > < 2425262728292A2B2C2D2E2F30313132333435363738393A3B3C3D3E3F4041424344454546474849 4A4B4C4D4E4F50515253545555565758595A5B5C5D5E5F60616262636465666768696A6B6C6D6D6E 6F70717273747576777778797A7B7C7D7E7F8080818283848586878888898A8B8C8D8E8F8F909192 93949596969798999A9B9C9C9D9E9FA0A1A1A2A3A4A5A6A7A7A8A9AAABABACADAEAFB0B0B1B2B3B4 B4B5B6B7B7B8B9BABBBBBCBDBEBEBFC0C0C1C2C3C3C4C5C5C6C7C7C8C9C9 > 4 %_Br < 04040404040404040404040504040404040404040404040404030403040404040404040404040404 04040303030303040404030303030303030303030303030202020202030303030303030303030302 02020201010101010202010101010101010101010102020202020202020102020202020202020101 01010101010101010101010101010202020202020202010101010100010000000000000000000001 01010101010101010101000000000000000000000000000000000101010101010101010101010101 01010101010101000000000000000000000001010101010101010101010101010101010101010101 01010101010101010101010101010101010202020202020202020202020202020202020202020202 0202020202020202020202020202 > < 1D1E20212224252628292A2B2C2D2F30313234353638393A3C3D3D3E3F414243454647484A4B4D4E 4F5052535354555657595A5C5D5E6061616264656668696A6C6D6D6F7071727475767677797A7B7D 7E808081828485868687898A8B8D8E8E8F919294949597999A9C9C9D9EA0A1A1A2A3A5A6A6A7A9AA ABABADAEAFAFB1B2B3B3B4B5B6B6B7B9BABABBBCBDBDBEC0C1C1C2C3C3C4C5C6C6C7C8C8C9CACBCB CCCDCDCECFCFD0D1D1D2D3D3D4D5D5D6D7D7D8D9D9DADADBDCDCDDDEDEDFDFE0E1E1E2E2E3E4E4E5 E5E6E7E7E7E7E8E8E9E9EAEAEAEBEBECECEDEDEDEDEEEEEFEFF0F0F0F0F1F1F2F2F3F3F3F3F4F4F5 F5F5F5F5F6F6F6F6F6F7F7F7F7F7F8F8F9F9F9F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFBFCFCFCFCFC FCFCFCFDFDFDFDFDFDFDFDFDFDFD > < 0D0D0E0F0F1011111212131413131415151616171818191A1B1B1D1D1D1D1E1F2020212223242524 2525262729292A2B2C2B2C2D2E2E2F3031303132333434353635373839393A393A3B3D3E3F403F40 41424445444546474948494A4B4C4B4E4F505150525455565657595A5B5A5C5D5E5D5E6062616263 6565666769696A6B6D6D6E6F717172747375777877797B7A7C7E807F8183828486858789898B8C8C 8E90909193939496969899999B9D9D9F9EA1A2A2A4A6A6A7A7A9ABABADACAEAEB0B2B2B4B3B5B7B6 B9B8BABABCBCBEC0C0C2C1C3C3C5C5C7C7C8C8CACACCCCCECED0D0D1D1D3D3D5D5D4D6D6D8D8DADA DCDCDBDDDDDFDFDFE1E1E2E2E2E4E4E6E6E7E8E8E8EAEAEAECECECEEEEEEEEF0F0F0F3F3F3F3F5F5 F5F5F5F6F6F6F6F6F8F8F8F8F8F8 > 0 < F7F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5 F5F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F3F3F3F3F3F3F3F3F3F3F3F3 F3F3F3F3F3F3F3F3F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F1F1F1F1F1F1F1F1F1F1 F1F1F1F1F1F1F1F1F1F1F1F1F1F1F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDECECECECECECECECECECECECECECECECECECECECECECEC ECECECECECECECECECECECECECEC > < E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0BFBEBD BCBBBAB9B9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A5A4A3A2A1A09F9E9E9D9C9B9A99 98979796959493929291908F8E8D8C8C8B8A8988888786858483838281807F7F7E7D7C7B7B7A7978 77777675747473727171706F6E6E6D6C6B6B6A69686867666565646363626160605F5E5E5D5C5B5B 5A5959585757565555545353525151504F4F4E4D4D4C4C4B4A4A4948484747464545444443424241 41403F3F3E3E3D3D3C3C3B3A3A39393838373736363535343433333232313130302F2F2E2E2D2D2C 2C2C2B2B2A2A29292928282727272626252525242424232323222222212121202020201F1F1F1E1E 1E1E1E1D1D1D1D1D1C1C1C1C1C1C > < E4E3E2E1E0DFDEDDDCDBDAD9D9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0C0 BFBEBDBCBBBAB9B8B7B7B6B5B4B3B2B1B0B0AFAEADACABAAA9A9A8A7A6A5A4A4A3A2A1A09F9E9E9D 9C9B9A999998979695959493929191908F8E8D8D8C8B8A898988878685858483828281807F7F7E7D 7C7C7B7A79797877767675747373727171706F6E6E6D6C6C6B6A6969686767666565646363626161 605F5F5E5D5D5C5B5B5A595958575756565554545352525151504F4F4E4E4D4D4C4B4B4A4A494848 4747464645454443434242414140403F3F3E3E3D3D3C3C3B3B3A3A39393838373737363635353434 333333323231313130302F2F2F2E2E2D2D2D2C2C2C2B2B2B2A2A2A29292929282828272727272626 2626262525252525242424242424 > 4 %_Br [ 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 Bs 0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 %_BS %_0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 Bs 0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 %_BS %_0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 Bs 0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 %_BS %_0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 Bs 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 Bs 0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 %_BS %_0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 1) (Unnamed gradient 1) 0 6 Bd [ < 3A39393838373736353534333332313130302F2E2E2D2C2B2B2A2928272726252423222120201F1E 1D1C1B1A191817161514131211100F0E0D0C0B0A09080605040302 > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFD > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFDFCFCF9F9F9F8 > < 2A2928272624232221201F1E1D1C1C1B1A19181716151413121110100F0E0D0C0C0A0A0908070606 050505040404040303030202020201010101010101010100000000 > < A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CBCCCDCECFD0D1 D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC > < 14141414141515151515151515161616161616161617171717171717171818181818181818181919 1919191919191A1A1A1A1A1A1A1A1B1B1B1B1B1B1B1B1C1C1C1C1C > < 1A1A1A1A1B1B1B1B1B1B1C1C1C1C1C1C1C1D1D1D1D1D1D1D1E1E1E1E1E1E1F1F1F1F1F1F1F202020 202020212121212121212222222222222223232323232324242424 > 4 %_Br < 23242526272728292A2B2B2C2D2E2E2F303131323333343535363737383839393A > 1 1 < 0B0C0C0D0E0F10101112131415161718191B1C1C1D1E1F2021222324262728292A > < CAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB8B7B6B5B4B3B2B1B0AFAEADACABAAA9 > < 181818181817171717171717171616161616161616151515151515151514141414 > < 1F1F1F1F1E1E1E1E1E1E1D1D1D1D1D1D1D1C1C1C1C1C1C1B1B1B1B1B1B1A1A1A1A > 4 %_Br < 0909090A0A0A0A0B0B0B0B0B0C0C0C0B0B0C0C0C0C0C0D0D0C0C0E0E0E0D0D0E0E0E0E0E0F0F0F0F 0F101010101011111111111211111111121212131314141414141515151514161615151515171717 161618181818181719191918181A1A1A1A1A1A1B1B1B1A1A1B1B1B1A1A1A1B1B1B1A1A1A1B1B1B1B 1B1B1C1C1C1B1B1C1C1C1D1D1C1C1E1D1D1D1D1D1E1E1E1E1E1D1D1E1E1E1D1D1D1D1E1E1E1D1D1D 1E1E1E1E1E1E1E1E1F1F1F1F1F1F1F2020201F1F1F1F1F2020202020202020212121212020202021 21212121212121212122222222222222222222232323232323232323232323232323232323232323 232323 > < 3E3F414243454647484A4B4C4D4E5051525354565758595B5C5D5D5E5F616263656668696A6B6D6E 6F7071737374757678797B7C7D7F80828183848687898A8C8D8D8F90929395969799999A9C9D9E9F A1A0A1A3A4A5A7A8A8A9ABACADAEAEB0B1B2B4B5B5B6B7B9BABABBBCBDBFBEC0C1C2C3C3C4C6C7C7 C8C9CACACBCCCDCECECFD0D1D1D2D3D3D4D5D6D6D7D8D9D9DBDCDCDDDEDEDFE0E0E1E2E3E3E4E5E5 E5E6E6E7E7E8E9E9EAEBEBECECEDEDEDEEEFEFF0F0F1F2F2F3F3F4F4F5F6F6F7F7F8F8F9F9FAFAFA FBFBFCFCFDFDFDFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 1F1F20212223242526272829292A292A2B2C2C2D2E2F2F303132343536373537373839393B3B3C3D 3E3F3E3F41424344454647464748494A4C4D4E4F4F505152535556555657585A5B5C5C5D5E606162 61636566676868696B6C6D6F6E6F717374737576787A797A7C7E7D7F80828483858788888A8B8D8D 8F90929294959796989A9A9C9EA09FA1A3A3A4A7A8A8AAACABADAFAFB0B3B2B4B6B5B7B9B9BABCBC BEBFBFC1C4C3C5C5C7C9C9CBCBCDCFCFD1D1D3D5D5D7D7D9D8DBDDDDDEDEE0E0E2E2E5E4E7E7E9E8 EBEBEDEDEFEFF2F1F4F4F6F6F9F8F8FBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000001010101010101010101010101 01010101010202020202020202020202020202020302030303030303040404040404040505050505 05050505050505050606060606060607070707070707070707070707070707080808080808080808 080808080808080808090909090909090909090A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B 0B0B0B > < F0F0F0EFEFEFEFEEEEEEEEEEEDEDEDEDEDECECECECECEBEBEBEBEAEAEAEAEAE9E9E9E9E9E8E8E8E8 E8E7E7E7E7E7E6E6E6E6E6E5E5E5E5E5E4E4E4E4E4E3E3E3E3E3E2E2E2E2E2E1E1E1E1E1E1E0E0E0 E0E0DFDFDFDFDFDFDEDEDEDEDEDDDDDDDDDDDDDCDCDCDCDCDBDBDBDBDBDBDADADADADADAD9D9D9D9 D9D9D8D8D8D8D8D8D7D7D7D7D7D7D6D6D6D6D6D6D5D5D5D5D5D5D5D4D4D4D4D4D4D4D3D3D3D3D3D3 D2D2D2D2D2D2D2D2D1D1D1D1D1D1D1D0D0D0D0D0D0D0D0CFCFCFCFCFCFCFCFCECECECECECECECECD CDCDCDCDCDCDCDCDCDCCCCCCCCCCCCCCCCCCCCCBCBCBCBCBCBCBCBCBCBCBCBCBCACACACACACACACA CACACA > < C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A4A3A2A1 A09F9E9D9D9C9B9A99989796959493929291908F8E8D8C8B8A8A89888786858483828281807F7E7D 7C7C7B7A7978777676757473727171706F6E6D6C6C6B6A696868676665646463626160605F5E5D5D 5C5B5A5A595857565655545353525151504F4E4E4D4C4B4B4A494948474746454544434242414040 3F3E3E3D3D3C3B3B3A39393837373636353434333332313130302F2F2E2D2D2C2C2B2B2A2A292928 2727262625252524242323222221212020201F1F1E1E1E1D1D1C1C1C1B1B1B1A1A1A1A1919191918 181818 > < C9C8C7C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADADACABAAA9A8A7A6A5A4 A3A2A2A1A09F9E9D9C9B9A9A99989796959493929291908F8E8D8C8C8B8A89888786868584838281 81807F7E7D7C7C7B7A7978777776757473737271706F6F6E6D6C6C6B6A6968686766656564636262 61605F5F5E5D5C5C5B5A5A59585757565555545352525150504F4E4E4D4C4C4B4A4A494848474646 4544444342424141403F3F3E3E3D3C3C3B3B3A393938383737363535343433333232313130302F2F 2E2E2D2D2C2C2B2B2A2A29292828282727262626252524242423232322222221212121202020201F 1F1F1F > 4 %_Br < 02020202020202020202020202020202020202020202010101010101010101020202020202020202 02020202020202020202020202020303030303030303030303030202020303030303030404040404 04040404040404040404040405050505050505050505060606060606060606060505050504040404 04050505050506060606060607070707070707070707070707070707070708080808080808080808 080707080808080808080909090909090909090909090909090909090909 > < FDFDFCFCFBFBFAFAF9F9F8F8F7F7F6F5F5F4F4F3F2F1F0F0EFEEEDEDECEBEBEAE9E8E8E7E6E5E4E3 E2E1E0DFDEDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C4C3C2C0BFBEBDBC BAB9B9B7B6B5B4B3B1B0B0AEADACABA9A8A7A5A4A3A1A09F9F9D9C9B99989695949290908F8E8C8B 8988878584848281807E7D7B7A79797876757372716F6F6E6D6B6A6967676665636260605F5D5C5B 595A595756555554525150504E4D4C4C4A494848464544444241413F3F3E > < F8F6F5F3F0EEECEAE8E7E5E3E1DFDFDEDCDAD8D7D5D3D1D0CECCCAC8C7C5C3C2C0BEBCBCBBB9B7B6 B4B2B0AFADABAAA8A6A4A2A0A19F9D9B9A9896959392908E8D8B8B8A88868583817F7E7C7B797A78 7776747271706E6D6C6C6A696866656462616061605F5E5D5B5A5857585756545352504E4F4E4D4C 4A494847484746454443424342413F3E3D3E3D3C3B3A393839383736363635343333323231302F2F 302E2D2C2D2C2A2A292A29282728272627262523242322222120201F1E1F > 0 < ECECECECECECECECECECECECECECECECECECECECECECEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 > < 1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 444546474848494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626263646566676869 6A6B6C6D6E6F70717273737475767778797A7B7C7D7E7F80808182838485868788898A8A8B8C8D8E 8F90919293939495969798999A9B9B9C9D9E9FA0A1A2A2A3A4A5A6A7A8A8A9AAABACADADAEAFB0B1 B2B2B3B4B5B6B6B7B8B9BABABBBCBDBDBEBFC0C0C1C2C3C3C4C5C5C6C6C7 > < 2425262728292A2B2C2D2E2F30313132333435363738393A3B3C3D3E3F4041424344454546474849 4A4B4C4D4E4F50515253545555565758595A5B5C5D5E5F60616262636465666768696A6B6C6D6D6E 6F70717273747576777778797A7B7C7D7E7F8080818283848586878888898A8B8C8D8E8F8F909192 93949596969798999A9B9C9C9D9E9FA0A1A1A2A3A4A5A6A7A7A8A9AAABABACADAEAFB0B0B1B2B3B4 B4B5B6B7B7B8B9BABBBBBCBDBEBEBFC0C0C1C2C3C3C4C5C5C6C7C7C8C9C9 > 4 %_Br < 04040404040404040404040504040404040404040404040404030403040404040404040404040404 04040303030303040404030303030303030303030303030202020202030303030303030303030302 02020201010101010202010101010101010101010102020202020202020102020202020202020101 01010101010101010101010101010202020202020202010101010100010000000000000000000001 01010101010101010101000000000000000000000000000000000101010101010101010101010101 01010101010101000000000000000000000001010101010101010101010101010101010101010101 01010101010101010101010101010101010202020202020202020202020202020202020202020202 0202020202020202020202020202 > < 1D1E20212224252628292A2B2C2D2F30313234353638393A3C3D3D3E3F414243454647484A4B4D4E 4F5052535354555657595A5C5D5E6061616264656668696A6C6D6D6F7071727475767677797A7B7D 7E808081828485868687898A8B8D8E8E8F919294949597999A9C9C9D9EA0A1A1A2A3A5A6A6A7A9AA ABABADAEAFAFB1B2B3B3B4B5B6B6B7B9BABABBBCBDBDBEC0C1C1C2C3C3C4C5C6C6C7C8C8C9CACBCB CCCDCDCECFCFD0D1D1D2D3D3D4D5D5D6D7D7D8D9D9DADADBDCDCDDDEDEDFDFE0E1E1E2E2E3E4E4E5 E5E6E7E7E7E7E8E8E9E9EAEAEAEBEBECECEDEDEDEDEEEEEFEFF0F0F0F0F1F1F2F2F3F3F3F3F4F4F5 F5F5F5F5F6F6F6F6F6F7F7F7F7F7F8F8F9F9F9F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFBFCFCFCFCFC FCFCFCFDFDFDFDFDFDFDFDFDFDFD > < 0D0D0E0F0F1011111212131413131415151616171818191A1B1B1D1D1D1D1E1F2020212223242524 2525262729292A2B2C2B2C2D2E2E2F3031303132333434353635373839393A393A3B3D3E3F403F40 41424445444546474948494A4B4C4B4E4F505150525455565657595A5B5A5C5D5E5D5E6062616263 6565666769696A6B6D6D6E6F717172747375777877797B7A7C7E807F8183828486858789898B8C8C 8E90909193939496969899999B9D9D9F9EA1A2A2A4A6A6A7A7A9ABABADACAEAEB0B2B2B4B3B5B7B6 B9B8BABABCBCBEC0C0C2C1C3C3C5C5C7C7C8C8CACACCCCCECED0D0D1D1D3D3D5D5D4D6D6D8D8DADA DCDCDBDDDDDFDFDFE1E1E2E2E2E4E4E6E6E7E8E8E8EAEAEAECECECEEEEEEEEF0F0F0F3F3F3F3F5F5 F5F5F5F6F6F6F6F6F8F8F8F8F8F8 > 0 < F7F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5 F5F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F3F3F3F3F3F3F3F3F3F3F3F3 F3F3F3F3F3F3F3F3F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F1F1F1F1F1F1F1F1F1F1 F1F1F1F1F1F1F1F1F1F1F1F1F1F1F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDECECECECECECECECECECECECECECECECECECECECECECEC ECECECECECECECECECECECECECEC > < E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0BFBEBD BCBBBAB9B9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A5A4A3A2A1A09F9E9E9D9C9B9A99 98979796959493929291908F8E8D8C8C8B8A8988888786858483838281807F7F7E7D7C7B7B7A7978 77777675747473727171706F6E6E6D6C6B6B6A69686867666565646363626160605F5E5E5D5C5B5B 5A5959585757565555545353525151504F4F4E4D4D4C4C4B4A4A4948484747464545444443424241 41403F3F3E3E3D3D3C3C3B3A3A39393838373736363535343433333232313130302F2F2E2E2D2D2C 2C2C2B2B2A2A29292928282727272626252525242424232323222222212121202020201F1F1F1E1E 1E1E1E1D1D1D1D1D1C1C1C1C1C1C > < E4E3E2E1E0DFDEDDDCDBDAD9D9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0C0 BFBEBDBCBBBAB9B8B7B7B6B5B4B3B2B1B0B0AFAEADACABAAA9A9A8A7A6A5A4A4A3A2A1A09F9E9E9D 9C9B9A999998979695959493929191908F8E8D8D8C8B8A898988878685858483828281807F7F7E7D 7C7C7B7A79797877767675747373727171706F6E6E6D6C6C6B6A6969686767666565646363626161 605F5F5E5D5D5C5B5B5A595958575756565554545352525151504F4F4E4E4D4D4C4B4B4A4A494848 4747464645454443434242414140403F3F3E3E3D3D3C3C3B3B3A3A39393838373737363635353434 333333323231313130302F2F2F2E2E2D2D2D2C2C2C2B2B2B2A2A2A29292929282828272727272626 2626262525252525242424242424 > 4 %_Br [ 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 Bs 0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 %_BS %_0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 Bs 0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 %_BS %_0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 Bs 0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 %_BS %_0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 Bs 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 Bs 0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 %_BS %_0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 134) (Unnamed gradient 134) 1 2 Bd [ < 00000101020304050506070808090A0B0B0C0D0F101112131415161718191A1B1C1E1F2021222324 25262728292A2B2C2D2E2F3031323334353738393A3B3C3D3E > < 0000000100010202030304040405060607080808090A0B0C0D0C0D0E0E0F10111111121213141516 15161718191A1A1A1B1C1D1E1F1F1F20212223252625262728 > < 00000000000100010101010102030203020303040504050405050606050605060607080708070809 0909090A090A0B0B0C0B0C0B0C0D0D0E0D0E0F0E0F10101011 > 0 < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDDDCDBDAD9D8D7 D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE > < FFFEFDFCFCFBFAF9F8F7F6F6F5F4F3F2F1F0F0EFEEEDECEBEAEAE9E8E7E6E5E4E4E3E2E1E0DFDEDD DDDCDBDAD9D8D7D7D6D5D4D3D2D1D1D0CFCECDCCCBCBCAC9C8 > < FFFEFEFDFDFCFCFBFAFAF9F9F8F7F7F6F6F5F5F4F3F3F2F2F1F1F0EFEFEEEEEDEDECEBEBEAEAE9E8 E8E7E7E6E6E5E4E4E3E3E2E2E1E0E0DFDFDEDDDDDCDCDBDBDA > 4 %_Br [ 0 0 0 0 1 1 1 2 50 0 %_BS %_0 0 0 0 1 1 1 2 50 0 Bs 0.243137 0.156863 0.066667 0 0.745098 0.784314 0.854902 2 50 100 %_BS %_0.243137 0.156863 0.066667 0 0.745098 0.784314 0.854902 2 50 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 3) (Unnamed gradient 3) 0 7 Bd [ < 0A0B0C0D0D0E10111213131415161717191A1B1B1C1D1F202122232425262728292A2B2C2D2E2E2F 31323435363738393A3B3C3D3E3F41424344454648494A4B4C4D4E5051525354555758595A5C5D5E 60616364656668696A6B6C > < 070809090A0B0B0C0D0C0D0E0F1010121112131314151617161718191A1B1C1D1D1E1E1E1F202223 24252627262728292A2B2C2D2E2F3031303132333435363738393A3B3C3C3C3D3E3F414243444546 47484A494A4B4D4E4F5051 > < 0607070809090A0A0B0C0D0E0D0E0F0F111211121314141516161718191A1B1A1B1C1D1E1F201F20 212223242625262728292A2B2C2B2C2D2F303031323233343536373839393A3B3C3D3E3F403F4041 42444547484948494A4B4C > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010101 > < F1F0EFEEEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECECD CCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5 A4A3A2A1A09F9E9D9C9B9A > < F1F0EFEFEEEDECEBEAEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDDDCDBDAD9D8D7D6D5D4D4D3D2D1D0CF CECDCCCBCBCAC9C8C7C6C5C4C3C2C1C0C0BFBEBDBCBBBAB9B8B7B6B5B4B4B3B2B1B0AFAEADACABAA A9A8A7A7A6A5A4A3A2A1A0 > < F2F1F1F0EFEEEDEDECEBEAE9E9E8E7E6E5E4E4E3E2E1E0DFDFDEDDDCDBDAD9D9D8D7D6D5D4D3D3D2 D1D0CFCECDCDCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBFBEBDBCBBBAB9B8B8B7B6B5B4B3B2B1B1B0AF AEADACABAAA9A9A8A7A6A5 > 4 %_Br < 1A1918171615141211100E0D0C0B0A > < 11100F0E0D0D0C0C0C0B0B0A090807 > < 1111100F0E0D0C0B0B0A0909080706 > 0 < E2E3E4E5E6E7E8EAEBECEDEEEFF0F1 > < E4E5E6E7E8E9EAEBEBECEDEEEFF0F1 > < E5E6E7E8E9EAEBECECEDEEEFF0F1F2 > 4 %_Br < 54535251504F4E4C4B4A4948474644434241403F3E3D3C3B393836353432312F2E2D2C2B2A292827 262524232221201F1E1D1C1B1A > < 3C3B3A3938373635343433323130302F2E2D2C2B2A2928272625252524232221201F1E1D1C1C1B1A 19181717171615141413121111 > < 3D3C3C3B3A39383837363534333230302F2E2D2C2D2C2B2A29282725242322212021201F1E1D1C1B 1B1A1918161616151514131211 > 0 < ADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C8C9CACBCCCDCECFD0D1D2D3D4D5 D6D7D8D9DADBDCDDDEDFE0E1E2 > < B3B4B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCCCDCECFD0D1D2D3D4D5D6D7D8 D9DADBDCDCDDDEDFE0E1E2E3E4 > < B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C7C8C9CACBCCCDCECFD0D1D2D3D3D4D5D6D7D8D9 DADBDCDDDEDFDFE0E1E2E3E4E5 > 4 %_Br < 00000000000000000000000000000001010102020203030304040505050505060606070708080909 0A0A0A0A0B0C0C0D0D0E0E101011121213141415141617171819191A1B1B1C1D1E1E1F2021212223 24242526272728292A2B2B2C2D2E2F303132333536373838393A3C3D3E3F40414243434546474849 4A4B4C4E4F5051525354 > < 00000000000000000000000000000001000000010101020201020202030203030304040504050505 05050606070608070908090A0A0B0A0C0B0C0C0D0E0D0E0E0F101011111112131214141415161617 171718191A1A1B1C1D1C1D1E1F1F1F20222122232526252628292A2A2A2B2C2D2E2F302F30313233 343536363738393A3B3C > < 00000000000000000000000000000000000001010101020202020202030302030304040405040505 060607070708070908090A0A0B0B0C0B0D0C0E0D0E100F1010111211121413141415151616171718 19191A1B1B1B1C1D1C1E1F201F21222222242526252628292A292A2B2D2E2F2E2F30303233333435 363737393A3A3B3C3C3D > 0 < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F8F8F8F7F7F6F6F6F5F5F4F4F3F3 F2F2F1F1F0EFEFEEEEEDEDECECEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDEDEDDDCDBDBDAD9 D8D8D7D6D5D5D4D3D2D1D1D0CFCECDCCCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7 B6B5B4B3B2B1B0AFAEAD > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFCFBFBFBFAFAFAF9F9F9F8F8F7F7F7F6F6F5F5F4F4F4 F3F3F2F2F1F1F0F0EFEFEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDFDEDDDDDC DBDBDAD9D8D8D7D6D5D5D4D3D2D2D1D0CFCFCECDCCCBCBCAC9C8C7C6C6C5C4C3C2C1C0C0BFBEBDBC BBBAB9B9B8B7B6B5B4B3 > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F9F8F8F8F7F7F6F6F6F5F5F4F4 F3F3F2F2F1F1F1F0F0EFEEEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E2E1E0E0DFDEDEDD DCDCDBDAD9D9D8D7D7D6D5D4D4D3D2D1D1D0CFCECECDCCCBCACAC9C8C7C6C5C5C4C3C2C1C0C0BFBE BDBCBBBAB9B9B8B7B6B5 > 4 %_Br < 0A0A090908080706050504030201000000 > < 0707070605050504030302020100000000 > < 0606050505040403020202020100000000 > 0 < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F2F2F3F4F4F5F6F7F8F9F9FAFBFCFDFEFF > 4 %_Br < 1717161615151414131312121111100F0F0E0D0C0B0B0A > < 16161515141313121111110F0E0D0E0D0C0B0A0A090807 > < 1717161415141312111111100F0E0D0C0B0A0A08070706 > 0 < E5E5E6E6E7E7E8E8E9E9EAEAEBEBECEDEDEEEEEFF0F0F1 > < E1E1E2E2E3E4E4E5E6E6E7E8E9EAEAEBECEDEEEEEFF0F1 > < DFDFE0E1E1E2E3E4E5E5E6E7E8E9EAEBECEDEEEFF0F1F2 > 4 %_Br [ 0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 %_BS %_0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 Bs 0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 %_BS %_0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 Bs 0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 %_BS %_0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 Bs 0 0 0 0 1 1 1 2 64.5161 0.005 %_BS %_0 0 0 0 1 1 1 2 64.5161 0 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0.0025 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0 Bs 0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 %_BS %_0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 51) (Unnamed gradient 51) 0 2 Bd [ < 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1E1E1E1E202020202020 20202121212121212122222222222223232323232424242424252525252626262627272727282828 282929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F30313132323334343535353636373738383939 393A3A3B3B3C3C3D3D3E3E3F4041424243434444454546484749494A4A4B4C4C4E4F4F5050515252 53545456575758595B5B5C5D5D5F61626263646565676869696A6B6C6D6D6E6F7071727273747576 777878797A7B7C7D7E7F8081818283848586878788898A8B8C8D8E > < 16161616161616161616161616161616161616161617171717171717171717171717171717171717 171717181818181818181919191919191A1A1A1A1A1B1B1B1B1A1C1C1C1B1B1C1C1C1C1D1D1D1D1E 1E1D1F1F1F1E201F1F2120202121212222222323232424242525272626272729282829292A2A2B2B 2C2C2B2D2C2D2D2E2E2F2F30303131323233323433353635373638373938393B3A3B3B3C3E3D3E40 3F404241424243444445464848494A4A4C4D4C4D4F504F50525352535455565557575858595A5B5C 5D5C5D5E5F60616261626364666768696A6B6A6A6B6C6D6E6E6F70 > < 11111111111111111111111111111111111111111111111111111111111111111111121212121212 12121213131313131313141414141414151515151516161616161616161718171717191818181A19 191B1A1A1A1C1B1B1C1C1C1D1C1C1E1D1D1F1E1E201F1F2120222121232224232325242625272628 272729282A292B2A2B2B2C2B2D2D2E2D2F2E30313132313332343535363637363839393A3B3B3C3D 3D3E3D3F404041424443444545474848494A4C4B4C4D4F4E4F5052535253535554555658595A595A 5B5D5D5E5F5E5F606162636464656665666769696A6B6B6C6D6E6F > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000010101010101010101020202020202020203030304 04050505060607070809090A0B0B0C0C0D0E0F1011121313141617 > < DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDDDDDDDDDDDDDDDDDCDCDCDCDCDC DCDCDBDBDBDBDBDBDBDADADADADADAD9D9D9D9D9D8D8D8D8D8D7D7D7D7D6D6D6D6D5D5D5D5D4D4D4 D4D3D3D3D2D2D2D1D1D1D0D0D0CFCFCFCECECECDCDCDCCCCCBCBCBCACAC9C9C9C8C8C7C7C6C6C5C5 C5C4C4C3C3C2C2C1C1C0C0BFBFBEBDBDBCBCBBBBBABAB9B8B8B7B7B6B6B5B4B4B3B2B2B1B1B0AFAF AEADADACABABAAA9A8A8A7A6A6A5A4A3A3A2A1A0A09F9E9D9D9C9B9A999998979695949493929190 8F8E8E8D8C8B8A89888786858584838281807F7E7D7C7B7A797877 > < DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDEDEDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDD DDDDDDDCDCDCDCDCDCDCDBDBDBDBDBDBDADADADADAD9D9D9D9D9D8D8D8D8D8D7D7D7D7D6D6D6D6D5 D5D5D4D4D4D4D3D3D3D2D2D2D1D1D1D0D0D0CFCFCFCECECECDCDCCCCCCCBCBCACACAC9C9C8C8C7C7 C6C6C6C5C5C4C4C3C3C2C2C1C1C0C0BFBFBEBEBDBDBCBBBBBABAB9B9B8B8B7B6B6B5B5B4B3B3B2B1 B1B0AFAFAEAEADACACABAAA9A9A8A7A7A6A5A5A4A3A2A2A1A09F9F9E9D9C9B9B9A99989897969594 93939291908F8E8D8D8C8B8A89888786858484838281807F7E7D7C > < E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E2E2E2E2E2E2E2E2E2E2E2E2E2E1E1E1E1E1E1 E1E1E1E0E0E0E0E0E0E0DFDFDFDFDFDFDEDEDEDEDEDDDDDDDDDDDCDCDCDCDBDBDBDBDADADADAD9D9 D9D8D8D8D8D7D7D7D6D6D6D5D5D5D4D4D4D3D3D3D2D2D2D1D1D0D0D0CFCFCECECECDCDCCCCCBCBCA CACAC9C9C8C8C7C7C6C6C5C5C4C4C3C3C2C2C1C0C0BFBFBEBEBDBCBCBBBBBABAB9B8B8B7B6B6B5B4 B4B3B3B2B1B1B0AFAEAEADACACABAAAAA9A8A7A7A6A5A4A4A3A2A1A0A09F9E9D9D9C9B9A99989897 96959493929291908F8E8D8C8B8A89898887868584838281807F7E > 4 %_Br [ 0.556863 0.439216 0.435294 0.090196 0.466667 0.486275 0.494118 2 50 100 %_BS %_0.556863 0.439216 0.435294 0.090196 0.466667 0.486275 0.494118 2 50 100 Bs 0.113725 0.086275 0.066667 0 0.870588 0.87451 0.890196 2 73.0337 0 %_BS %_0.113725 0.086275 0.066667 0 0.870588 0.87451 0.890196 2 73.0337 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 54) (Unnamed gradient 54) 0 2 Bd [ < 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1E1E2020202020202021212121212122 22222222222323232324242424242525252526262626272727282828282929292A2A2A2B2B2B2C2C 2C2D2D2D2E2E2F2F30313132323334343535353636373738383939393A3A3B3B3C3C3D3D3E3E3F40 41414242434444454546464848494A4A4B4B4C4C4E4F4F50515152525354545657575859595B5C5C 5D5F5F61626263646565666869696A6B6C6C6D6E6F6F7071727273747576767778797A7B7B7C7D7E 7F808081828384858687868788898A8B8C8D8E8F8F909091929394949596979899999A9B9C9D > < 16161616161616161616161616161617171717171717171717171717171717171717181818181818 1919191919181A1A1A1A191B1B1B1A1C1C1C1B1C1C1C1C1D1D1D1D1E1E1D1F1F1E20201F1F212020 21212122222323232424242525272626272729282829292A2A2B2B2B2C2B2D2C2D2D2E2E2F2F3030 31313232333234333534363537363737383A393B3A3B3B3C3D3D3E3E3F4040414242434344454546 4847494A4A4C4D4C4D4F4E4F5052515253535454565556575858595A5B5A5C5D5D5E5E5F60616261 6263656665666768696A6B6A6B6C6D6E6E6F6E6F707172737475767778777778797A7A7B7C7D > < 11111111111111111111111111111111111111111111111111111212121212121212131313131313 14141414141615151515171616161716161618171717191818181A19191B1A1A1C1B1B1B1C1C1C1D 1C1C1E1D1F1E1E201F1F2120222121232224232325242625272628282729282A292B2A2B2B2C2B2D 2D2E2D2F2E302F3132323333343435353637373838393B3A3B3B3C3E3D3E403F4040414342434544 454747484A494A4C4D4C4E4F4E4F515251535354545556575658595A5B5B5C5C5D5E5E5F60616161 62636464666766676869696B6C6D6B6C6D6E7070717272737473747475777879797A7B7B7C7D > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000101010101010101010102020202020202020303040404040505050606070808 09090A0B0B0C0C0D0E0F1010111213131416161718191A1C1D1D1E20212223242627282A2B2C > < DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDDDDDDDDDDDDDCDCDCDCDCDCDCDBDBDBDBDBDBDA DADADADADAD9D9D9D9D8D8D8D8D8D7D7D7D7D6D6D6D6D5D5D5D4D4D4D4D3D3D3D2D2D2D1D1D1D0D0 D0CFCFCFCECECDCDCDCCCCCBCBCBCACAC9C9C9C8C8C7C7C6C6C5C5C5C4C4C3C3C2C2C1C1C0C0BFBF BEBEBDBDBCBBBBBABAB9B9B8B8B7B6B6B5B5B4B4B3B2B2B1B0B0AFAFAEADADACABABAAA9A9A8A7A7 A6A5A5A4A3A3A2A1A0A09F9E9D9D9C9B9A9A999897979695949493929190908F8E8D8C8B8B8A8988 8786868584838281807F7F7E7D7C7B7A79787776757474737271706F6E6D6C6B6A6968676665 > < DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDDDDDDDCDCDCDCDCDC DBDBDBDBDBDBDADADADADAD9D9D9D9D8D8D8D8D7D7D7D7D6D6D6D6D5D5D5D4D4D4D3D3D3D3D2D2D2 D1D1D1D0D0CFCFCFCECECECDCDCCCCCCCBCBCACACAC9C9C8C8C7C7C7C6C6C5C5C4C4C3C3C2C2C1C1 C0C0BFBFBEBEBDBDBCBCBBBBBABAB9B9B8B7B7B6B6B5B5B4B3B3B2B2B1B0B0AFAEAEADADACABABAA A9A9A8A7A7A6A5A5A4A3A3A2A1A0A09F9E9E9D9C9B9B9A999898979695959493929191908F8E8D8D 8C8B8A8989888786858483838281807F7E7D7D7C7B7A79787776757473737271706F6E6D6C6B > < E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E2E2E2E2E2E2E2E2E2E2E2E1E1E1E1E1E1E1E1E0E0E0E0E0E0 DFDFDFDFDFDEDEDEDEDEDDDDDDDDDCDCDCDCDBDBDBDBDADADADAD9D9D9D8D8D8D7D7D7D7D6D6D6D5 D5D5D4D4D3D3D3D2D2D2D1D1D0D0D0CFCFCECECECDCDCCCCCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4 C4C3C3C2C2C1C1C0BFBFBEBEBDBDBCBCBBBABAB9B9B8B7B7B6B6B5B4B4B3B2B2B1B1B0AFAFAEADAD ACABABAAA9A9A8A7A6A6A5A4A4A3A2A1A1A09F9E9E9D9C9B9B9A9998979796959493939291908F8F 8E8D8C8B8A8989888786858483828281807F7E7D7C7B7A79787877767574737271706F6E6D6C > 4 %_Br [ 0.615686 0.490196 0.490196 0.172549 0.396078 0.419608 0.423529 2 50 100 %_BS %_0.615686 0.490196 0.490196 0.172549 0.396078 0.419608 0.423529 2 50 100 Bs 0.113725 0.086275 0.066667 0 0.870588 0.87451 0.890196 2 70.2247 0 %_BS %_0.113725 0.086275 0.066667 0 0.870588 0.87451 0.890196 2 70.2247 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 59) (Unnamed gradient 59) 1 2 Bd [ < 00000101020203040505050607070708090A0A0A0C0D0E0F100F1011121313141416161617181A1B 1C1C1C1D1F202020212223232526272829292A2B2D2E2E2F30313232333435373838393A > < 00000001020203040405060708080A0A0B0C0D0F101112121315151617181A1A1B1C1D1E1F202223 2425262728292A2B2C2D2E2F3032333435363738393A3B3C3D3E3F404142434445474849 > < 00000000000000000100010001000101010101020102020202020201020302020203020203020202 020302030203020303030302030303040304030404040504050405040405040504040404 > 0 < FFFEFDFDFCFBFAF9F8F8F7F6F5F4F4F3F2F1F0F0EFEEEDECEBEBEAE9E8E7E7E6E5E4E3E3E2E1E0DF DEDEDDDCDBDADAD9D8D7D6D6D5D4D3D2D1D1D0CFCECDCDCCCBCAC9C9C8C7C6C5C4C4C3C2 > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD8D7 D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3 > < FFFEFEFDFDFCFCFBFAFAF9F9F8F8F7F6F6F5F5F4F4F3F2F2F1F1F0F0EFEEEEEDEDECECEBEAEAE9E9 E8E7E7E6E6E5E5E4E3E3E2E2E1E1E0DFDFDEDEDDDDDCDBDBDADAD9D9D8D7D7D6D6D5D5D4 > 4 %_Br [ 0 0 0 0 1 1 1 2 50 0 %_BS %_0 0 0 0 1 1 1 2 50 0 Bs 0.227451 0.286274 0.015686 0 0.760784 0.701961 0.831373 2 50 100 %_BS %_0.227451 0.286274 0.015686 0 0.760784 0.701961 0.831373 2 50 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 60) (Unnamed gradient 60) 1 4 Bd [ < 000000010203030405050607080808090A0B0C0D0E0F0F1011121314141516171819191A1B1C1D1D 1E1F2021212223242525272829292A2B2C2C2E2F30303132333334353636373838393B3C3C3D3E3E 3F40404142434445454647474849494A4C4C4D4E4E4F4F50525253535456565858595A5A5C5C5D5D 5E5F5F6161626263636464656667686869696A6A6B6B6D6D6D6E6E6F6F7070717172727373737575 767677777778787979797A7A7B7B7B7C7D7C7D7E7D7F7F7E80808081818182828283838383848484 85858585868686868687878787888889898889898A8A8A89898A8B8B8B8B8B8B8A8C8C8C8C8C8C8C 8C8C8C > < 000000010102030304050506070809090A0B0C0D0C0D0F0F1011121214141616171718191A1B1C1D 1E1F1E1F20212222232524252628292A292B2C2D2E302F3031323333343536373738393A3A3B3C3D 3C3E3F403F4142434344454646474848494A4C4B4D4E4E4F50505152525355555657575858595B5A 5C5D5D5E5E5F606061616263636464656567666869696A6A6C6B6D6C6E6E6F6F7070727173727474 7575767678777778787A797B7A7A7C7B7D7D7D7E7E7F7F7F81818182828283838384848485858587 868686878787898989888A8A8A89898B8B8B8A8A8C8C8C8C8C8C8E8E8E8E8E8E8D8D8F8F8F8F8F8F 8F8F8F > < 000000000001010201020203040304040506060608090809090A090A0A0B0A0B0C0D0C0D0E0F0E0E 0F101111121112131413141514151615171818191A191B1B1B1B1C1C1D1E1D1E201F201F21212121 2322232224252425252627262827282A292A292B2A2B2B2C2D2D2E2E302F30303130323133343335 34353536363736373737383739383A393B3A3C3B3C3C3B3D3C3E3D3F3D3E3E3E3F3F3E403F414040 41414242414343424443434444444545444546454645454746464647474748484847494948484A48 49494A4949494A4A4A4A494B4B4B4B4A4A4B4C4C4A4A4A4C4C4C4B4B4B4B4B4B4D4D4C4C4C4C4C4C 4C4C4C > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000001010101010101010101010202020202020202020202 03030303030303030303030404040404040505050505050606060606060607070707070707070808 0808080909090909090A0A0A0A0A0A0A0A0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C0D0D0D0D0D0D0D0D 0D0D0D > < FFFEFDFCFBFAFAF9F8F7F6F5F4F3F3F2F1F0EFEEEDECECEBEAE9E8E7E7E6E5E4E3E2E2E1E0DFDEDE DDDCDBDADAD9D8D7D6D6D5D4D3D3D2D1D0D0CFCECDCDCCCBCACAC9C8C7C7C6C5C5C4C3C2C2C1C0C0 BFBEBEBDBCBCBBBABAB9B8B8B7B6B6B5B4B4B3B2B2B1B1B0AFAFAEAEADACACABABAAA9A9A8A8A7A7 A6A5A5A4A4A3A3A2A2A1A1A0A09F9E9E9D9D9C9C9B9B9A9A9A999998989797969695959494949393 929291919190908F8F8F8E8E8D8D8D8C8C8C8B8B8B8A8A8A89898988888887878786868686858585 848484848383838383828282828181818181808080808080807F7F7F7F7F7F7F7F7E7E7E7E7E7E7E 7E7E7E > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECECEBEAE9E8E7E6E5E4E3E2E1E0E0DFDEDDDCDBDA D9D8D8D7D6D5D4D3D2D1D1D0CFCECDCCCCCBCAC9C8C7C7C6C5C4C3C3C2C1C0BFBFBEBDBCBCBBBAB9 B9B8B7B6B6B5B4B3B3B2B1B0B0AFAEAEADACABABAAA9A9A8A7A7A6A5A5A4A3A3A2A1A1A0A09F9E9E 9D9C9C9B9B9A9999989897969695959494939392919190908F8F8E8E8D8D8C8C8B8B8A8A89898888 878786868585858484838382828281818080807F7F7E7E7E7D7D7D7C7C7C7B7B7B7A7A7A79797978 78787877777776767676757575757574747474747373737373737272727272727272717171717171 717171 > < FFFEFDFDFCFBFAF9F9F8F7F6F5F5F4F3F2F1F1F0EFEEEEEDECEBEBEAE9E8E8E7E6E5E5E4E3E2E2E1 E0DFDFDEDDDDDCDBDADAD9D8D8D7D6D6D5D4D4D3D2D2D1D0D0CFCECECDCCCCCBCACAC9C9C8C7C7C6 C5C5C4C4C3C2C2C1C1C0BFBFBEBEBDBCBCBBBBBABAB9B9B8B7B7B6B6B5B5B4B4B3B3B2B2B1B0B0AF AFAEAEADADACACACABABAAAAA9A9A8A8A7A7A6A6A5A5A5A4A4A3A3A2A2A2A1A1A0A0A09F9F9E9E9E 9D9D9C9C9C9B9B9B9A9A9A9999999898989797979696969595959594949493939393929292929191 9191909090908F8F8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B 8B8B8B > 4 %_Br < 8C8C8D8E8E8F909192929494959696969899999B9B9D9D9E9FA0A0A1A2A2A4A4A4A6A7A9A9AAABAB ABADADADAFAFAFB1B1B3B3B3B5B5B5B7B7B7B9B9B9BBBBBCBDBDBEBE > < 8F90929496989A9C9E9FA1A3A5A6A8AAACAEB0B2B4B5B7B9BABCBEC0C2C4C5C7C9CACECFD1D2D4D5 D7D9DADCDDDFE0E2E3E5E6E8E9EBECEDEEF0F1F2F3F4F5F6F8F9FAFB > < 4C4B4A494847444342403F3E3D3C3B3A3937363433333231302F2E2D2A2827262524222221201F1D 1A191817161514141312110D0C0B0A0A090908070706040403030302 > < 0D0C0C0C0C0C0B0B0B0B0A0A0A0A0A09090808080707070706060606050505050404030302020202 02020202020202020101010000000001010101010101010101000101 > < 7E7E7D7D7D7C7C7B7B7B7A7A7A797979787878777776767675757574747473737372727171717070 706F6F6F6E6E6E6D6D6C6C6C6B6B6B6A6A6A69696968686767676666 > < 71706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504E4D4C4B4A49 4847464544434241403F3E3D3C3B3A393837363534333231302F2E2D > < 8B8B8B8B8B8B8C8C8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E 8F8F8F8F8F8F8F8F8F8F8F9090909090909090909090919191919191 > 4 %_Br < BEBEBEBEBEBEBEBEBDBDBDBCBBBCBCBCBBBBBBBABAB9B8B7B7B6B5B4B4B3B1B1AFAEADADACACABAA A9A7A6A6A4A3A3A2A1 > < FBFAF9F9F8F7F6F5F4F3F1F0EEEDEDEBE9E8E6E4E2E0DEDCDBD8D6D4D2D0CDCCC9C7C4C2C0BDBAB8 B5B3B0AEABA8A5A3A0 > < 0204040606090B0B0E111215181B1B1E20212427282B2E30313336393A3C3F40424547484B4D5050 535558595C5E616265 > < 010101010101010101010102030404050506060707080A0C0C0E0F111214151617191B1B1D1F2121 2325262628292A2B2C > < 66666666666666666666666666656565656565656565656565656565656565656565656565646464 646464646464646464 > < 2D2E2F2F30313233343536373839393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152 535455565758595A5B > < 9190908F8F8E8D8D8C8B8B8A89888887868685848483828181807F7E7E7D7C7C7B7A797978777676 75747373727170706F > 4 %_Br [ 0 0 0 0 1 1 1 2 33.3333 0 %_BS %_0 0 0 0 1 1 1 2 33.3333 0 Bs 0.54902 0.560784 0.298039 0.05098 0.494118 0.443137 0.545098 2 50 56.7416 %_BS %_0.54902 0.560784 0.298039 0.05098 0.494118 0.443137 0.545098 2 50 56.7416 Bs 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 2 51.9231 85.3932 %_BS %_0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 2 51.9231 85.3932 Bs 0.631373 0.627451 0.396078 0.172549 0.392157 0.356863 0.435294 2 51.9231 100 %_BS %_0.631373 0.627451 0.396078 0.172549 0.392157 0.356863 0.435294 2 51.9231 100 Bs BD %AI5_EndGradient %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI3_BeginPattern: (Checked Pattern) (Checked Pattern) 46.0313 5.4375 113.3027 72.7207 [ %AI3_Tile (0 O 0 R 1 g 1 G ) @ ( %AI6_BeginPatternLayer 0 J 0 j 3 w 4 M []0 d 0 XR 25.0313 11.4375 m 31.0313 5.4375 L F 25.0313 5.4375 m 31.0313 11.4375 L F %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6699 5.44141 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6699 5.44141 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 67.7813 0.511719 m 67.7813 10.3691 L 74.7383 17.332 L 84.5996 17.332 L 91.5605 10.373 L 91.5605 0.515625 L 67.7813 0.511719 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 67.7813 0.511719 m 67.7813 10.3691 L 74.7383 17.332 L 84.5996 17.332 L 91.5605 10.373 L 91.5605 0.515625 L 67.7813 0.511719 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0313 5.4375 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0313 5.4375 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.1035 0.5 m 41.1016 17.3281 L 50.959 17.3281 L 57.9199 10.3691 L 57.9219 0.511719 L 41.1035 0.5 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.1035 0.5 m 41.1016 17.3281 L 50.959 17.3281 L 57.9199 10.3691 L 57.9219 0.511719 L 41.1035 0.5 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3086 5.44141 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3086 5.44141 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2188 0.515625 m 101.418 0.511719 L 101.418 10.3691 L 108.377 17.332 L 118.2363 17.332 L 118.2188 0.515625 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2188 0.515625 m 101.418 0.511719 L 101.418 10.3691 L 108.377 17.332 L 118.2363 17.332 L 118.2188 0.515625 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0273 39.0781 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0273 39.0781 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.0977 50.9668 m 50.9551 50.9688 L 57.916 44.0078 L 57.918 34.1484 L 50.957 27.1875 L 41.0996 27.1875 L 41.0977 50.9668 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.0977 50.9668 m 50.9551 50.9688 L 57.916 44.0078 L 57.918 34.1484 L 50.957 27.1875 L 41.0996 27.1875 L 41.0977 50.9668 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8477 22.2598 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8477 22.2598 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9199 10.3691 m 50.959 17.3281 L 50.957 27.1875 L 57.918 34.1484 L 67.7773 34.1484 L 74.7383 27.1914 L 74.7383 17.332 L 67.7813 10.3691 L 57.9199 10.3691 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9199 10.3691 m 50.959 17.3281 L 50.957 27.1875 L 57.918 34.1484 L 67.7773 34.1484 L 74.7383 27.1914 L 74.7383 17.332 L 67.7813 10.3691 L 57.9199 10.3691 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4883 22.2637 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4883 22.2637 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5605 10.373 m 84.5996 17.332 L 84.5977 27.1914 L 91.5566 34.1523 L 101.416 34.1523 L 108.377 27.1953 L 108.377 17.334 L 101.418 10.373 L 91.5605 10.373 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5605 10.373 m 84.5996 17.332 L 84.5977 27.1914 L 91.5566 34.1523 L 101.416 34.1523 L 108.377 27.1953 L 108.377 17.334 L 101.418 10.373 L 91.5605 10.373 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3066 39.082 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3066 39.082 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2363 27.1914 m 108.377 27.1914 L 101.4141 34.1484 L 101.4141 44.0098 L 108.373 50.9707 L 118.2344 50.9707 L 118.2363 27.1914 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2363 27.1914 m 108.377 27.1914 L 101.4141 34.1484 L 101.4141 44.0098 L 108.373 50.9707 L 118.2344 50.9707 L 118.2363 27.1914 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4844 55.9023 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4844 55.9023 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5566 44.0117 m 84.5957 50.9707 L 84.5938 60.8311 L 91.5527 67.792 L 101.4141 67.792 L 108.373 60.834 L 108.373 50.9746 L 101.4141 44.0137 L 91.5566 44.0117 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5566 44.0117 m 84.5957 50.9707 L 84.5938 60.8311 L 91.5527 67.792 L 101.4141 67.792 L 108.373 60.834 L 108.373 50.9746 L 101.4141 44.0137 L 91.5566 44.0117 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8457 55.8994 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8457 55.8994 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.916 44.0078 m 50.9551 50.9688 L 50.9531 60.8271 L 57.9141 67.7881 L 67.7734 67.7891 L 74.7344 60.8301 L 74.7363 50.9707 L 67.7773 44.0098 L 57.916 44.0078 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.916 44.0078 m 50.9551 50.9688 L 50.9531 60.8271 L 57.9141 67.7881 L 67.7734 67.7891 L 74.7344 60.8301 L 74.7363 50.9707 L 67.7773 44.0098 L 57.916 44.0078 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0254 72.7168 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0254 72.7168 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9141 77.6484 m 57.9141 67.7881 L 50.9551 60.8271 L 41.0977 60.8262 L 41.0938 77.625 L 57.9141 77.6484 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9141 77.6484 m 57.9141 67.7881 L 50.9551 60.8271 L 41.0977 60.8262 L 41.0938 77.625 L 57.9141 77.6484 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6641 72.7207 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6641 72.7207 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5527 77.6523 m 91.5527 67.792 L 84.5957 60.8311 L 74.7363 60.8301 L 67.7734 67.7891 L 67.7734 77.6494 L 91.5527 77.6523 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5527 77.6523 m 91.5527 67.792 L 84.5957 60.8311 L 74.7363 60.8301 L 67.7734 67.7891 L 67.7734 77.6494 L 91.5527 77.6523 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3027 72.7207 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3027 72.7207 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2344 60.8311 m 108.373 60.8301 L 101.4141 67.7891 L 101.4121 77.6494 L 118.2188 77.6523 L 118.2344 60.8311 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2344 60.8311 m 108.373 60.8301 L 101.4141 67.7891 L 101.4121 77.6494 L 118.2188 77.6523 L 118.2344 60.8311 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.666 39.082 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.666 39.082 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 74.7383 27.1914 m 67.7773 34.1484 L 67.7773 44.0098 L 74.7363 50.9707 L 84.5957 50.9707 L 91.5566 44.0117 L 91.5566 34.1523 L 84.5977 27.1914 L 74.7383 27.1914 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 74.7383 27.1914 m 67.7773 34.1484 L 67.7773 44.0098 L 74.7363 50.9707 L 84.5957 50.9707 L 91.5566 44.0117 L 91.5566 34.1523 L 84.5977 27.1914 L 74.7383 27.1914 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 7.46094 27.1816 m 0.501953 34.1406 L 0.5 44 L 7.45898 50.9609 L 17.3184 50.9609 L 24.2793 44.0039 L 24.2813 34.1445 L 17.3223 27.1836 L 7.46094 27.1816 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 7.46094 27.1816 m 0.501953 34.1406 L 0.5 44 L 7.45898 50.9609 L 17.3184 50.9609 L 24.2793 44.0039 L 24.2813 34.1445 L 17.3223 27.1836 L 7.46094 27.1816 L s 101.4141 67.7891 m 101.4141 77.6494 L 91.5527 77.6494 L 91.5527 67.7891 L 101.4141 67.7891 L f 67.7813 0.511719 m 67.7813 10.3691 L 57.9199 10.3691 L 57.9199 0.511719 L 67.7813 0.511719 L f 101.418 0.511719 m 101.418 10.3691 L 91.5586 10.3691 L 91.5586 0.511719 L 101.418 0.511719 L f 84.5996 17.332 m 84.5996 27.1914 L 74.7383 27.1914 L 74.7383 17.332 L 84.5996 17.332 L f 67.7773 34.1484 m 67.7773 44.0098 L 57.918 44.0098 L 57.918 34.1484 L 67.7773 34.1484 L f 50.957 17.3281 m 50.957 27.1875 L 41.1016 27.1875 L 41.1016 17.3281 L 50.957 17.3281 L f 118.2363 17.332 m 118.2363 27.1914 L 108.377 27.1914 L 108.377 17.332 L 118.2363 17.332 L f 101.4141 34.1484 m 101.4141 44.0098 L 91.5566 44.0098 L 91.5566 34.1484 L 101.4141 34.1484 L f 84.5977 50.9707 m 84.5977 60.8301 L 74.7363 60.8301 L 74.7363 50.9707 L 84.5977 50.9707 L f 67.7734 67.7891 m 67.7734 77.6494 L 57.9141 77.6494 L 57.9141 67.7891 L 67.7734 67.7891 L f 50.9551 50.9688 m 50.9551 60.8271 L 41.0977 60.8271 L 41.0977 50.9688 L 50.9551 50.9688 L f 118.2344 50.9707 m 118.2344 60.8301 L 108.373 60.8301 L 108.373 50.9707 L 118.2344 50.9707 L f 17.3203 52.9609 m 17.3203 62.8213 L 7.46094 62.8213 L 7.46094 52.9609 L 17.3203 52.9609 L f %AI6_EndPatternLayer ) & ] E %AI3_EndPattern %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginBrushPattern (Unnamed 18) 0 A u u 0 J 0 j 1 w 4 M []0 d 0 XR -3918.7319 4618.8438 m -3810.1599 4618.8438 L -3810.1599 4617.4312 L -3918.7319 4617.4312 L -3918.7319 4618.8438 L n u 0 O 0.698039 0.67451 0.639216 0.741176 0.137255 0.121569 0.12549 Xa -3810.1599 4617.4688 m -3810.2112 4617.4312 L -3810.3442 4617.5352 L -3810.1599 4617.4688 L f -3811.0344 4617.6997 m -3811.0088 4617.7188 -3811.0212 4617.75 -3810.9951 4617.769 C -3810.4817 4617.4727 L -3810.7112 4617.3047 -3810.8833 4617.8125 -3811.0344 4617.6997 c f -3811.1855 4617.6699 m -3811.3848 4617.6006 -3811.4673 4617.7393 -3811.5137 4617.7871 C -3811.4441 4617.6792 -3811.1423 4617.8203 -3811.1855 4617.6699 C f -3828.7217 4617.7393 m -3828.7031 4617.7383 -3828.6785 4617.7344 -3828.6599 4617.73 C -3828.6912 4617.7256 -3828.7112 4617.73 -3828.7217 4617.7393 C f -3833.2969 4618.2119 m -3833.3447 4618.3232 L -3832.4912 4618.125 -3831.5281 4618.3262 -3830.6252 4618.2393 C -3830.6863 4618.2793 L -3828.3953 4618.3223 -3826.2825 4618.1367 -3824.0095 4618.0518 C -3824.0449 4618.0645 -3824.0569 4618.0967 -3824.0935 4618.1094 c -3823.9839 4618.0713 -3823.8623 4618 -3823.7393 4618.0093 C -3823.7073 4618.0342 -3823.7737 4618.061 -3823.8132 4618.0723 C -3823.3333 4618.2559 -3822.4033 4617.9561 -3822.1033 4618.0977 C -3821.9683 4618.0781 -3821.9087 4618.0015 -3821.9839 4617.9429 C -3820.2048 4617.896 -3818.3015 4617.8608 -3816.4895 4617.7168 C -3816.4023 4617.7422 -3816.3865 4617.792 -3816.4104 4617.8555 C -3814.8616 4617.5576 -3813.2383 4617.6763 -3811.6536 4617.7246 C -3811.5928 4617.6465 -3811.8152 4617.6416 -3811.6592 4617.5601 C -3812.1687 4617.4624 -3812.5923 4617.7524 -3813.0544 4617.6094 C -3812.9951 4617.5342 L -3813.3313 4617.4854 -3813.0632 4617.7246 -3813.4121 4617.627 C -3813.5496 4617.5645 -3813.3777 4617.5313 -3813.4417 4617.5254 C -3814.1563 4617.5566 -3814.9016 4617.4883 -3815.5745 4617.6719 C -3815.7407 4617.5078 -3816.3423 4617.666 -3816.6064 4617.5093 C -3816.7913 4617.5742 -3816.9768 4617.5576 -3817.0471 4617.666 C -3819.5481 4617.5796 -3822.1033 4617.7383 -3824.6653 4617.7261 C -3825.8643 4618.0435 -3827.3 4617.665 -3828.7231 4617.7715 C -3828.7329 4617.7603 -3828.7312 4617.748 -3828.7217 4617.7393 C -3829.1855 4617.8174 -3829.8616 4617.8545 -3830.4153 4617.8145 C -3830.8843 4617.9492 L -3834.2161 4617.6729 -3837.6208 4617.8672 -3841.0049 4617.7524 c -3844.8503 4617.6729 -3848.2192 4617.4453 -3851.9641 4617.8633 C -3851.9592 4617.832 -3851.9895 4617.8145 -3851.8928 4617.8022 C -3852.9736 4617.8662 -3853.9583 4617.7524 -3854.9761 4617.8184 C -3854.9729 4617.7871 L -3857.4983 4618.0488 -3860.2295 4617.7524 -3862.6641 4618.0342 C -3865.6279 4618.0059 -3868.9792 4618.0342 -3872.1162 4618.1152 C -3872.1089 4618.0518 L -3874.6191 4618.1846 -3877.0449 4617.8516 -3879.5496 4617.9517 C -3882.1252 4617.8086 -3884.8464 4618.3125 -3887.4441 4618.1211 C -3889.0513 4617.8125 -3891.1624 4618.4741 -3892.6721 4618.1543 C -3895.7737 4617.6719 -3898.7825 4617.9824 -3901.8833 4618.2715 C -3904.7439 4618.0996 -3907.6001 4618.541 -3910.3704 4618.1904 C -3911.6831 4618.415 -3913.1328 4617.9121 -3914.5935 4617.9766 C -3914.5413 4618.0547 L -3915.0657 4617.8184 -3915.7097 4618.3853 -3916.0369 4618.0342 C -3915.9817 4618.0181 L -3916.2593 4617.8398 -3916.6265 4618.4385 -3916.7952 4618.2261 C -3916.8401 4618.3145 L -3917.1763 4618.3398 -3916.8799 4618.2144 -3917.1392 4618.1792 C -3917.2368 4618.1904 -3917.1763 4618.3398 -3917.3799 4618.2891 C -3917.4241 4617.9287 -3918.2031 4618.3672 -3918.2263 4617.9624 C -3918.0425 4617.9624 -3918.5144 4617.8057 -3918.1016 4617.7207 C -3918.2192 4617.6792 -3918.7825 4617.6992 -3918.7319 4617.8711 C -3918.78 4618.0537 -3919 4618.2124 -3918.6577 4618.3535 C -3918.5889 4618.2207 L -3918.4736 4618.3535 -3918.5012 4618.2871 -3918.46 4618.3867 C -3918.0127 4618.4043 -3917.9529 4618.5977 -3917.6321 4618.6772 C -3917.6353 4618.6729 -3917.6384 4618.6699 -3917.6335 4618.6631 C -3917.4143 4618.5039 -3917.1111 4618.5977 -3916.9375 4618.6211 C -3916.8679 4618.6953 L -3916.7625 4618.8496 -3916.3591 4618.3926 -3916.4951 4618.6582 C -3915.5857 4618.5923 -3914.5432 4618.5957 -3913.5271 4618.5923 C -3913.3848 4618.4912 -3912.7493 4618.6016 -3912.9712 4618.4072 c -3912.7168 4618.6289 -3911.9607 4618.6846 -3911.6799 4618.6763 C -3911.6904 4618.6973 -3911.7024 4618.7207 -3911.7463 4618.7124 C -3911.2017 4619 -3911.1008 4618.4463 -3910.5903 4618.7979 C -3910.5105 4618.5493 -3909.6631 4618.8774 -3909.3743 4618.5854 C -3909.3113 4618.6406 -3909.2903 4618.6904 -3909.3132 4618.7344 C -3908.3943 4618.7393 -3907.3792 4618.8296 -3906.6016 4618.8408 C -3905.9373 4618.623 -3904.9929 4618.9395 -3904.4216 4618.6387 C -3903.9482 4618.7017 -3903.1824 4618.8281 -3902.5215 4618.707 C -3902.5857 4618.7437 L -3901.8401 4618.7261 -3900.9087 4618.7104 -3900.3972 4618.5215 C -3900.1768 4618.8096 -3899.8545 4618.7524 -3899.5322 4618.8438 C -3899.0344 4618.7104 -3898.0295 4618.75 -3897.27 4618.6289 C -3897.1536 4618.7617 -3896.6433 4618.5723 -3896.6042 4618.7656 C -3894.4761 4618.3926 -3891.8447 4618.5225 -3889.5723 4618.8047 C -3889.6052 4618.8184 L -3889.3103 4618.7124 -3888.9705 4618.4785 -3888.6704 4618.3413 C -3888.6409 4618.3584 -3888.6443 4618.3896 -3888.7073 4618.3896 C -3888.2922 4618.3535 -3887.9041 4618.5435 -3887.4895 4618.5078 C -3887.4929 4618.54 -3887.4929 4618.54 -3887.5601 4618.5703 C -3887.1711 4618.4844 -3886.7561 4618.7246 -3886.2969 4618.5752 C -3886.2712 4618.6265 L -3885.9792 4618.5547 L -3885.9863 4618.6182 -3885.9976 4618.7144 -3886.1536 4618.6934 C -3882.5903 4618.7559 -3878.9121 4618.4248 -3875.2537 4618.4727 C -3875.3879 4618.5332 L -3874.6785 4618.4248 L -3874.6824 4618.457 -3874.7161 4618.4727 -3874.75 4618.4873 C -3873.8464 4618.5957 -3872.9087 4618.415 -3872.0281 4618.4424 C -3872.0322 4618.4736 -3872.1655 4618.5352 -3872.0422 4618.5703 C -3871.3904 4618.396 -3870.9951 4618.7964 -3870.6687 4618.4351 C -3870.6384 4618.4517 -3870.6177 4618.5332 -3870.6841 4618.5625 C -3868.8704 4618.4424 -3867.0081 4618.4492 -3865.1809 4618.5078 C -3863.6592 4618.1807 -3861.9583 4618.4766 -3860.3777 4618.2168 C -3860.3855 4618.2822 L -3858.3391 4618.0537 -3856.1682 4618.2979 -3854.0471 4618.2524 C -3853.1663 4618.2783 -3852.5713 4618.2012 -3851.6863 4618.1973 C -3851.6641 4618.2783 L -3850.1743 4617.9688 -3848.5327 4618.5566 -3846.9785 4618.2158 C -3847.0857 4618.3262 L -3846.8447 4618.1553 -3846.1455 4618.3867 -3846.2375 4618.0933 C -3845.9631 4618.1816 L -3844.9072 4617.7949 -3844.0413 4618.3608 -3842.7473 4618.1094 C -3842.8323 4618.1792 L -3842.4883 4618.125 -3842.0872 4618.082 -3841.8323 4618.1465 C -3841.8721 4618.1563 -3841.8535 4618.1768 -3841.9353 4618.1953 C -3840.8577 4618.4707 -3839.6584 4618.166 -3838.5215 4618.1768 C -3838.6504 4618.3062 L -3838.1008 4618.1543 -3837.0928 4618.2959 -3836.3704 4618.2261 C -3836.4143 4618.2871 L -3836.0488 4618.2012 L -3836.0393 4618.3232 L -3835.0991 4618.332 -3834.2144 4618.2261 -3833.2969 4618.2119 C f -3823.8132 4618.0723 m -3823.8159 4618.0713 -3823.8201 4618.0713 -3823.8232 4618.0684 C -3823.8513 4618.0791 -3823.8376 4618.0781 -3823.8132 4618.0723 C f -3917.5168 4618.7017 m -3917.5601 4618.6953 -3917.5959 4618.6875 -3917.6321 4618.6772 C -3917.6233 4618.7017 -3917.5537 4618.6973 -3917.5168 4618.7017 c f U U U %AI8_EndBrushPattern %AI8_BeginBrushPattern (Unnamed Brush Pat 2) 0 A u 0 J 0 j 1 w 4 M []0 d 0 XR -7791.3833 8491.4551 m -7699.5479 8491.4551 L -7699.5479 8487.1758 L -7791.3833 8487.1758 L -7791.3833 8491.4551 L n 0 O 0.698039 0.67451 0.639216 0.741176 0.137255 0.121569 0.12549 Xa -7791.1631 8488.7754 m -7791.5 8488.8418 -7790.9814 8489.0313 -7791.3833 8488.8887 C -7791.3379 8488.7705 -7791.2725 8488.6816 -7791.1631 8488.7754 C f -7700.6675 8488.9414 m -7701.7524 8489.7041 -7703.1816 8488.9336 -7704.3701 8489.4199 C -7704.5098 8489.4521 -7704.3345 8489.002 -7704.6484 8489.1025 C -7705.8008 8489.6953 -7707.6162 8489.3418 -7709.0195 8488.8848 C -7708.9346 8488.7666 L -7709.2017 8488.6816 -7709.5283 8489.0723 -7709.8115 8489.0176 C -7709.8135 8488.9395 -7709.7207 8488.9063 -7709.7861 8488.7979 C -7709.8574 8489.0352 -7710.2983 8488.9082 -7710.4185 8489.084 C -7710.5303 8488.9922 -7710.5195 8488.8047 -7710.6641 8488.7002 C -7710.8262 8488.9697 L -7711.2769 8489.6094 -7711.9209 8488.9258 -7712.5361 8489.2559 C -7712.5063 8489.1934 -7712.4453 8489.1445 -7712.4941 8489.084 C -7713.4814 8489.4727 -7714.7168 8489.3994 -7715.8208 8489.543 C -7715.7769 8489.4482 -7715.7363 8489.2754 -7715.8008 8489.168 C -7715.8555 8489.4512 -7716.1963 8489.5225 -7716.4922 8489.5781 C -7716.6255 8489.2871 -7716.9995 8489.8438 -7717.3467 8489.6826 C -7717.3169 8489.6191 L -7717.5732 8489.9238 -7717.6973 8489.4434 -7717.9053 8489.8086 C -7718.0684 8489.5801 L -7718.1807 8489.9902 -7718.4395 8489.3672 -7718.6514 8489.5762 C -7718.6445 8489.6602 L -7718.8442 8489.7598 -7718.9482 8489.5537 -7719.1338 8489.623 C -7719.1514 8489.5762 L -7719.5854 8489.6826 -7719.8379 8489.4551 -7719.8271 8489.7754 C -7719.9795 8489.5186 -7719.4063 8489.6582 -7719.6455 8489.2842 C -7721.0732 8489.6152 -7722.5459 8489.5498 -7723.9834 8489.5566 C -7724.1465 8489.4277 -7724.2505 8489.3887 -7724.2871 8489.2666 C -7724.4307 8489.332 -7724.8281 8489.3262 -7724.9585 8489.4902 C -7724.9102 8489.4834 -7725.0513 8489.3262 -7725.1274 8489.3105 C -7725.3887 8489.1895 -7725.4131 8489.6621 -7725.7002 8489.5186 C -7725.5859 8489.4336 -7725.5469 8489.3301 -7725.5854 8489.2109 C -7725.8301 8489.4609 -7726.1577 8489.4209 -7726.4473 8489.502 C -7726.4023 8489.4482 -7726.3325 8489.416 -7726.3433 8489.3154 C -7726.6602 8489.5986 -7726.9209 8489.2559 -7727.1982 8489.4346 C -7727.0947 8489.25 L -7727.5415 8489.0254 -7727.2266 8489.6367 -7727.6128 8489.5039 C -7727.52 8489.4453 -7727.5527 8489.373 -7727.5361 8489.2979 C -7727.8965 8489.6338 -7728.4795 8489.5225 -7728.8389 8489.6367 C -7728.8174 8489.6113 -7728.8232 8489.5605 Y -7729.2148 8489.6025 -7729.6245 8489.498 -7730.0552 8489.6445 C -7730.2119 8489.5625 -7730.0039 8489.1934 -7730.4185 8489.2617 C -7730.4033 8489.6328 -7731.1221 8489.4141 -7730.8779 8489.834 C -7731.2319 8489.7734 -7731.7925 8489.6338 -7732.0283 8489.7598 C -7731.8691 8489.6191 -7732.2007 8489.3066 -7731.9063 8489.2754 C -7732.1289 8489.0498 L -7732.0957 8488.8984 -7731.8999 8489.1016 -7731.9707 8488.9102 C -7732.1182 8488.9258 -7732.5479 8489.0723 -7732.6797 8489.0117 C -7732.9531 8489.2393 -7733.2041 8489.6641 -7733.6465 8489.7109 C -7733.4385 8489.5664 -7733.7646 8489.3018 -7733.6235 8489.2383 C -7734.2407 8489.9482 L -7734.3877 8489.9658 -7734.2725 8489.6563 -7734.4854 8489.7529 C -7734.4746 8489.8506 -7734.5674 8489.9121 -7734.6318 8489.9922 C -7734.6875 8489.9482 -7735.2441 8490.084 -7735.3081 8489.7178 C -7735.3735 8489.5762 -7735.0684 8489.6426 -7735.2314 8489.5117 C -7735.5029 8489.5146 -7735.5151 8489.6406 -7735.7871 8489.6465 C -7735.7925 8489.5977 L -7735.9717 8489.543 -7736.3213 8489.7529 -7736.1265 8489.9551 C -7736.0015 8489.9658 -7736.1738 8489.7354 -7735.9888 8489.8418 C -7736.1152 8490.0537 -7736.4312 8490.1133 -7736.7031 8490.1162 C -7736.6104 8490.0586 -7736.6216 8489.9609 -7736.5845 8489.8574 C -7736.9497 8490.1445 -7737.3369 8490.2354 -7737.7451 8490.3555 C -7737.7515 8490.5293 -7737.5928 8490.0391 -7737.5327 8490.1309 C -7738.0557 8489.8896 -7738.6128 8490.4727 -7739.0479 8490.1201 C -7738.9766 8490.0898 -7739.0098 8490.3672 -7739.0146 8490.3184 C -7739.2666 8490.2969 -7739.2549 8490.0449 -7739.4189 8490.1377 C -7739.4355 8489.9902 -7739.6255 8490.1855 -7739.7944 8490.2305 C -7739.8818 8490.3369 -7739.8384 8490.1582 -7739.6914 8490.1426 C -7739.9268 8490.2666 -7740.8691 8490.4941 -7741.4131 8490.2793 C -7741.4023 8490.377 -7741.7471 8490.6377 -7741.8721 8490.627 C -7741.8232 8490.3984 L -7741.9375 8490.2617 -7742.2422 8490.418 -7742.2632 8490.2227 C -7742.5303 8490.5 -7741.2344 8489.9863 -7741.5957 8490.2002 C -7741.6895 8490.0098 -7742.0991 8490.5645 -7742.0215 8490.2529 C -7742.2725 8490.2617 -7742.5161 8490.5186 -7742.7559 8490.3047 C -7742.6865 8490.3418 -7742.5522 8489.9873 -7742.7549 8490.0039 C -7743.1123 8490.0449 -7742.8564 8490.1133 -7743.1465 8490.1895 C -7743.3281 8490.2832 L -7743.3398 8490.5059 -7743.6475 8490.2529 -7743.5146 8490.502 C -7743.5586 8490.3184 -7744.0337 8490.6152 -7743.9971 8490.2461 C -7743.9473 8489.9551 L -7744.1016 8489.9766 -7744.2002 8490.2617 -7744.3213 8490.3896 C -7744.3418 8490.3633 -7744.3823 8490.3047 -7744.3745 8490.2578 C -7744.3994 8490.7031 -7744.7432 8490.2207 -7744.9268 8490.5645 C -7745.2505 8490.4102 -7745.7495 8490.5498 -7745.9023 8490.2734 C -7746.1514 8490.4082 -7746.3784 8490.5674 -7746.6621 8490.4727 C -7746.6055 8490.4307 -7746.5283 8490.418 -7746.5122 8490.3223 C -7746.6904 8490.1914 -7746.7344 8490.3086 -7746.8975 8490.3809 C -7746.8608 8490.3145 -7747.2539 8490.1201 -7747.4521 8489.9629 C -7747.6992 8490.0957 -7747.6143 8490.3359 -7747.6392 8490.4824 C -7747.8652 8490.043 -7748.3379 8490.7656 -7748.6211 8490.3672 C -7748.5352 8490.3066 -7748.2598 8490.1514 -7748.4658 8490.041 C -7748.6919 8489.6025 -7748.9219 8490.3643 -7749.2861 8490.1543 C -7749.1968 8490.5186 L -7749.3594 8490.293 -7749.7334 8490.7305 -7749.6963 8490.3594 C -7749.8184 8490.4902 -7750.1265 8490.2383 -7750.0859 8490.5938 C -7750.6846 8490.293 -7751.5425 8490.7754 -7751.9102 8490.1377 C -7751.9961 8490.1973 -7752.2104 8490.1367 -7752.1665 8490.3193 C -7752.0239 8490.5176 -7751.9673 8490.1777 -7751.9141 8490.3125 C -7751.9912 8490.3232 -7752.0078 8490.4209 -7752.0161 8490.4697 C -7752.2021 8490.3887 -7752.3486 8490.3633 -7752.1729 8490.0674 C -7752.5869 8489.8477 -7752.6001 8490.6719 -7753.1274 8490.5322 C -7753.1035 8490.3857 -7753.1436 8490.3301 -7753.2979 8490.3535 C -7753.5903 8490.6055 L -7753.9312 8490.5469 -7753.7842 8490.2705 -7753.7925 8490.0215 C -7753.9746 8490.0645 -7754.1973 8490.0527 -7754.2803 8490.2383 C -7754.5015 8489.9258 L -7754.3398 8490.1514 -7754.6514 8490.0762 -7754.7368 8490.1367 C -7754.6514 8490.0762 L -7754.6846 8489.9697 -7754.8955 8490.0352 -7755.0024 8490.0664 C -7754.9766 8490.2207 -7754.7617 8490.2832 -7754.6445 8490.3281 C -7754.7373 8490.4375 -7754.8823 8490.4121 -7755.0059 8490.541 C -7754.9648 8490.2969 -7755.3027 8490.3672 -7755.4473 8490.3418 C -7755.6133 8490.2891 -7755.6348 8490.5605 -7755.6831 8490.5527 C -7755.6875 8490.4258 -7755.9541 8490.5313 -7755.8247 8490.3535 C -7755.7681 8490.3125 -7755.6953 8490.4766 -7755.6016 8490.3643 C -7755.7109 8490.2705 -7755.6982 8490.0498 -7755.9258 8490.2109 C -7756.0967 8490.332 -7755.8818 8490.6934 -7756.2061 8490.5391 C -7756.1211 8490.4785 -7756.1055 8490.3809 -7756.0391 8490.293 C -7756.3433 8490.166 L -7756.3564 8490.3887 L -7756.3975 8490.332 -7756.3691 8490.3125 -7756.3877 8490.2832 C -7756.4785 8490.5176 -7756.8521 8490.3555 -7756.9209 8490.6191 C -7757.0742 8490.6426 -7757.2441 8490.4648 -7757.3906 8490.4395 C -7757.3623 8490.4199 L -7757.5415 8490.2891 -7757.7793 8490.375 -7757.9297 8490.5254 C -7757.9219 8490.4766 L -7758.0195 8490.459 -7758.2505 8490.4941 -7758.3735 8490.625 C -7758.6201 8490.457 -7758.4561 8489.7842 -7758.7295 8490.0645 C -7758.98 8490.0723 -7759.1221 8490.4727 -7759.0215 8490.6152 C -7759.4717 8490.4648 -7759.9834 8490.8281 -7760.4009 8490.4824 C -7760.4658 8490.5723 -7760.4248 8490.6289 -7760.5586 8490.6816 C -7761.2197 8490.5938 -7761.9551 8490.9453 -7762.4814 8490.5078 C -7762.29 8490.4141 -7762.4688 8490.2842 -7762.4727 8490.1582 C -7762.6309 8490.3574 -7762.6631 8489.9512 -7762.7197 8490.293 C -7762.7041 8490.4941 -7762.7197 8490.5918 -7762.5337 8490.6729 C -7762.9282 8490.7813 -7763.5283 8490.7813 -7763.7471 8490.5938 C -7763.6377 8490.6865 -7763.7227 8490.748 -7763.8086 8490.8086 C -7763.7803 8490.4873 -7764.0713 8490.4395 -7764.2915 8490.5527 C -7764.3223 8490.748 L -7764.4658 8490.5469 L -7764.5503 8490.6094 -7764.5591 8490.957 -7764.7773 8490.7695 C -7764.7891 8490.6934 -7764.8018 8490.6162 -7764.8418 8490.5605 C -7765.0693 8490.7207 -7765.3906 8490.9922 -7765.6377 8490.8262 C -7765.8398 8490.541 L -7765.9453 8490.5723 -7766.1235 8490.7441 -7765.9375 8490.8262 C -7766.3594 8490.6543 -7766.6309 8490.6328 -7766.7646 8490.3857 C -7767.4912 8490.9873 -7768.5459 8491.0117 -7769.3906 8490.9688 C -7769.3652 8490.8223 L -7769.5923 8490.6855 -7769.4834 8491.0781 -7769.6416 8490.9766 C -7769.5684 8490.8369 -7769.8145 8490.6729 -7769.6362 8490.502 C -7769.9609 8490.3477 -7770.0547 8490.7559 -7770.2656 8490.8223 C -7770.2979 8491.0146 -7770.0957 8490.6992 -7770.1367 8490.9434 C -7770.1729 8491.0117 -7770.5859 8490.793 -7770.6362 8491.084 C -7770.7178 8490.9697 -7770.6543 8490.7559 -7770.6104 8490.6377 C -7770.8086 8490.7793 L -7771.0513 8490.4395 -7770.2559 8490.1719 -7770.5107 8489.7529 C -7770.6934 8489.7979 L -7770.8682 8489.4941 -7770.21 8489.4551 -7770.6689 8489.3506 C -7770.8682 8489.4941 -7771.0381 8489.916 -7770.8608 8490.0449 C -7771.2754 8490.125 -7771.0527 8490.7383 -7771.4985 8490.7139 C -7771.6201 8490.543 -7771.1416 8490.6729 -7771.2275 8490.4336 C -7771.4375 8490.1992 -7771.6484 8490.5645 -7771.8354 8490.4824 C -7771.6279 8490.5918 -7771.8032 8490.8857 -7771.9375 8490.9395 C -7772.1641 8490.8018 -7771.79 8490.6641 -7772.1113 8490.6338 C -7772.1641 8490.8018 -7772.4595 8490.9277 -7772.2041 8491.0449 C -7772.3203 8491.4258 -7772.5381 8490.9395 -7772.7129 8491.2344 C -7772.8174 8490.9658 -7772.3823 8490.6152 -7772.7354 8490.4814 C -7772.6792 8490.7393 -7773.1704 8490.832 -7772.9839 8491.2139 C -7773.1221 8491.1406 -7773.1367 8490.9375 -7773.0361 8490.7793 C -7773.2334 8490.6201 -7773.5151 8491.25 -7773.5801 8490.7383 C -7773.6479 8491.002 L -7773.71 8490.916 -7773.7983 8490.8506 -7773.8994 8490.709 C -7774.0732 8490.7041 -7774.46 8491.0664 -7774.4443 8490.668 C -7774.5 8490.709 -7774.8975 8490.6914 -7774.7441 8490.9658 C -7774.4971 8491.1338 -7774.46 8490.7656 -7774.3223 8491.1377 C -7774.4971 8490.834 -7774.6787 8491.1777 -7774.8213 8491.2793 C -7774.8447 8491.125 L -7774.9297 8491.1855 -7775.1255 8491.1514 -7775.1787 8491.3184 C -7775.1133 8491.2305 -7775.1475 8491.125 -7775.2148 8491.0879 C -7775.3042 8491.3223 L -7775.6494 8491.4395 -7775.3857 8490.9102 -7775.7217 8490.9785 C -7775.4663 8490.7969 L -7775.5225 8490.8359 -7775.6367 8490.6162 -7775.7979 8490.6895 C -7775.8604 8490.9033 -7775.9775 8491.1602 -7776.0313 8491.3262 C -7776.2207 8491.4199 -7776.1162 8491.085 -7776.3027 8491.3047 C -7776.0586 8491.0469 L -7776.0215 8490.9766 -7776.2231 8490.6934 -7776.4761 8490.6992 C -7776.6377 8490.7734 -7776.8887 8491.082 -7776.6338 8491.1992 C -7776.7607 8491.2031 -7776.9385 8491.0723 -7776.8379 8490.916 C -7777.1255 8490.9902 -7776.7998 8491.1465 -7777.0479 8491.2793 C -7777.1494 8491.1367 -7777.4658 8490.9336 -7777.6563 8490.7266 C -7777.3975 8490.3682 L -7777.5693 8490.3643 L -7777.3467 8490.0781 -7777.6826 8490.1465 -7777.5566 8489.8438 C -7777.6743 8489.7969 -7777.8169 8489.8994 -7777.9307 8489.9785 C -7777.5864 8490.4629 -7778.3159 8490.6406 -7778.2158 8491.082 C -7778.6875 8491.2031 -7778.5107 8490.0078 -7779.0024 8490.6992 C -7778.9219 8490.8145 -7779.1533 8491.1504 -7778.8564 8491.0225 C -7779.1494 8490.9746 -7779.0557 8491.4658 -7779.4014 8491.2832 C -7779.1455 8491.1016 -7779.6763 8490.8359 -7779.3066 8490.5723 C -7779.3311 8490.7178 -7779.1001 8490.6826 -7779.0435 8490.6426 C -7779.1641 8490.4727 -7779.0186 8490.1973 -7779.3184 8490.1973 C -7779.5015 8490.2393 -7779.7524 8490.248 -7779.7158 8490.4785 C -7779.7085 8490.7314 -7779.4365 8490.4512 -7779.5537 8490.707 C -7779.9185 8490.7949 -7779.9795 8490.4102 -7780.1304 8490.8594 C -7779.8999 8490.8232 -7779.8423 8491.084 -7779.8467 8491.2578 C -7780.1143 8491.3633 L -7780.0625 8491.1953 L -7780.4922 8491.0742 -7780.1895 8491.5 -7780.6055 8491.4551 C -7780.8008 8491.123 L -7780.7017 8490.8369 -7780.1953 8491.25 -7780.2695 8490.7842 C -7780.54 8490.7656 -7780.6299 8491.002 -7780.8848 8490.8818 C -7780.8281 8490.8418 -7780.7505 8490.8301 -7780.6943 8490.7891 C -7780.7915 8490.7734 -7780.8877 8490.1563 -7781.2734 8490.5176 C -7781.4727 8490.6582 -7781.3262 8490.6826 -7781.3311 8490.8574 C -7781.7656 8490.9102 -7781.8955 8491.0879 -7782.1753 8491.1152 C -7782.1177 8490.7754 -7782.6699 8491.082 -7782.3608 8490.7344 C -7782.2188 8490.9336 -7781.5903 8490.9141 -7781.4365 8490.5898 C -7781.5947 8490.1865 -7781.0952 8490.6465 -7781.0024 8490.2383 C -7781.3506 8490.2285 -7781.3335 8489.832 -7781.3896 8489.5723 C -7781.4863 8489.5537 -7781.5801 8489.6641 -7781.6377 8489.7041 C -7781.6787 8489.9482 -7781.5522 8489.9453 -7781.5449 8490.1973 C -7781.9336 8490.1309 -7782.3081 8490.2666 -7782.5225 8490.5059 C -7782.6523 8490.3848 -7782.6113 8490.1406 -7782.4575 8490.1162 C -7782.9199 8490.1895 -7783.4141 8490.1563 -7783.8535 8490.082 C -7783.5693 8490.4814 -7784.3433 8490.1758 -7784.1494 8490.5078 C -7783.9141 8490.5977 -7783.7119 8490.8818 -7783.8418 8491.0605 C -7783.9888 8491.0352 -7783.8369 8490.8857 -7783.8984 8490.8008 C -7784.0859 8491.0186 -7784.1895 8490.4512 -7784.3735 8490.7949 C -7783.9512 8490.666 -7784.2915 8490.3086 -7784.2139 8489.9961 C -7784.5186 8490.1719 -7784.2007 8489.7734 -7784.5024 8489.7734 C -7784.8057 8489.9473 -7785.1787 8490.084 -7785.5161 8490.1514 C -7785.9399 8489.8555 -7786.5898 8490.1465 -7786.9683 8490.1582 C -7787.1665 8490 -7787.0322 8489.6465 -7787.2471 8489.585 C -7787.4995 8489.5918 -7787.0601 8489.9658 -7787.4336 8489.8047 C -7787.3975 8489.7344 L -7787.5107 8489.8154 -7788.0825 8489.4941 -7788.1929 8490.002 C -7788.0776 8489.6191 L -7788.1475 8489.584 -7788.2119 8489.6719 -7788.2695 8489.7129 C -7788.2725 8489.5879 -7788.3535 8489.4746 -7788.2402 8489.3926 C -7788.4707 8489.1289 -7788.7241 8489.4346 -7788.9746 8489.4453 C -7788.8135 8489.6719 L -7789.2422 8489.8496 -7789.5293 8489.625 -7789.9443 8489.7041 C -7789.9316 8489.4824 L -7790.1787 8489.6152 L -7790.1182 8489.3994 -7790.3447 8489.2617 -7790.4751 8489.4414 C -7789.8335 8488.8984 L -7789.6553 8489.0293 -7790.0283 8489.166 -7789.9165 8489.3848 C -7789.8213 8489.5762 -7789.4375 8489.5146 -7789.3755 8489.3018 C -7789.5225 8489.2773 -7789.5293 8489.3262 -7789.6436 8489.4063 C -7789.6919 8489.0977 -7789.4688 8489.1094 -7789.3584 8488.9033 C -7789.4355 8488.916 -7789.5449 8488.8223 -7789.5615 8488.9199 C -7789.4102 8488.7695 -7789.2578 8488.7461 -7789.0059 8488.7383 C -7789.1763 8488.8594 -7788.9131 8488.9297 -7788.9775 8489.0176 C -7788.9575 8488.7461 -7788.7168 8488.6621 -7788.4053 8488.7383 C -7788.1831 8489.0527 -7787.8208 8488.5361 -7787.46 8488.623 C -7787.6064 8488.8984 -7787.7935 8489.1191 -7788.0127 8489.2305 C -7787.7861 8489.3682 -7787.7607 8489.2227 -7787.5337 8489.3613 C -7787.4238 8489.1563 -7787.3457 8488.8418 -7787.0503 8488.7168 C -7787.0342 8488.9199 L -7786.7666 8488.8154 -7786.7666 8488.5146 -7786.4258 8488.5723 C -7785.8418 8488.6719 -7785.2407 8488.6719 -7784.7949 8488.6973 C -7784.7783 8488.8994 L -7784.5303 8488.4658 -7783.9521 8488.7393 -7783.6182 8488.5469 C -7783.0503 8488.7422 -7782.3848 8488.3535 -7782.0938 8488.7031 C -7781.0913 8488.5469 -7780.2148 8488.3945 -7779.1768 8488.4688 C -7779.3516 8488.7637 L -7779.1655 8488.5469 -7779.2305 8488.9336 -7779.0479 8488.8896 C -7779.2578 8488.6543 -7778.7949 8488.584 -7778.6665 8488.4033 C -7778.2041 8488.6328 -7777.6104 8488.3818 -7777.2007 8488.1758 C -7777.1846 8488.3789 L -7776.7705 8487.998 -7776.2759 8488.332 -7775.7598 8488.3945 C -7775.7007 8488.4785 -7775.6074 8488.6689 -7775.4536 8488.6465 C -7775.1738 8488.3184 -7775.0273 8488.3418 -7774.6167 8488.1367 C -7774.3169 8488.1367 -7773.8301 8488.2178 -7773.5254 8488.3457 C -7772.3975 8487.8848 -7771.2456 8488.1797 -7770.0732 8487.9023 C -7769.9888 8488.1406 L -7768.8521 8487.6309 -7767.4541 8488.0938 -7766.4839 8487.832 C -7766.5776 8488.2393 L -7766.2734 8488.3643 -7765.8843 8488.1328 -7765.9619 8487.8438 C -7765.6567 8487.9688 -7765.2007 8487.6465 -7765.0068 8487.9814 C -7764.6953 8488.0566 -7764.6255 8487.793 -7764.3662 8487.7383 C -7763.7422 8487.8926 -7763.5107 8487.8574 -7762.9224 8487.7813 C -7763.0684 8487.7559 L -7763.1328 8487.8457 -7763.1387 8488.0186 -7762.9922 8488.0449 C -7762.7725 8487.9307 -7762.1846 8488.1543 -7762.4033 8487.668 C -7761.7754 8487.9482 -7760.9385 8487.4395 -7760.3271 8487.8184 C -7760.3789 8487.6855 -7760.2246 8487.6602 -7760.1602 8487.5703 C -7759.6089 8487.5645 -7759.0293 8487.8359 -7758.5898 8487.6094 C -7758.5024 8487.6758 -7758.7295 8487.8359 -7758.5049 8487.8496 C -7758.3721 8487.7979 -7758.5024 8487.6758 -7758.3384 8487.6016 C -7757.4453 8487.3535 -7756.5303 8487.8574 -7755.7188 8487.793 C -7754.2754 8487.5361 -7752.7695 8487.666 -7751.3867 8487.623 C -7751.4023 8487.7207 L -7750.9395 8487.3477 -7750.3159 8488.1025 -7749.9463 8487.541 C -7749.8369 8487.6338 -7749.5283 8487.585 -7749.6094 8487.7734 C -7749.2407 8487.5098 -7748.5771 8488.0215 -7748.0439 8487.6865 C -7748.0928 8487.6777 -7748.1211 8487.6973 -7748.1777 8487.7393 C -7747.6392 8487.9551 -7747.1641 8487.6602 -7746.5957 8487.8555 C -7746.6533 8487.8975 -7746.7583 8487.9277 -7746.7754 8488.0254 C -7746.5557 8488.2129 -7746.2549 8487.6133 -7746.1348 8488.084 C -7746.0088 8488.0801 -7746.0449 8487.8477 -7746.1221 8487.8613 C -7744.8779 8488.0449 -7743.5498 8487.7441 -7742.2549 8487.6367 C -7741.3271 8487.918 -7742.1982 8488.4297 -7741.4663 8488.0781 C -7741.4063 8488.1689 -7741.4229 8487.8984 -7741.4131 8487.9961 C -7741.1299 8487.8643 -7740.9717 8488.5215 -7740.7754 8488.2754 C -7740.8564 8487.9863 -7740.6445 8488.1133 -7740.6387 8487.9375 C -7740.0713 8488.125 -7739.9575 8488.3857 -7739.5098 8488.166 C -7739.5435 8488.3184 L -7739.0186 8487.8887 -7738.4102 8488.1191 -7737.9673 8487.623 C -7735.0728 8487.5322 -7732.2983 8487.2578 -7729.4761 8487.2002 C -7726.6865 8487.2949 -7723.9551 8487.0723 -7721.1221 8487.3359 C -7720.4585 8487.7354 -7720.4087 8487.7246 -7719.6797 8487.5625 C -7719.7095 8487.627 -7719.7549 8487.6426 -7719.7061 8487.7031 C -7719.6699 8487.375 -7719.1929 8487.6719 -7719.1235 8487.3594 C -7718.0762 8487.4199 -7717.1113 8487.3301 -7716.0337 8487.3281 C -7716.2041 8487.3633 -7716.2896 8487.6309 -7716.0869 8487.6094 C -7715.8755 8487.3994 L -7715.8408 8487.4922 L -7715.7021 8487.4434 -7715.5513 8487.2813 -7715.6943 8487.1758 C -7712.9873 8486.8926 -7710.3242 8487.5498 -7707.6729 8487.4697 C -7707.0435 8487.6064 -7706.1475 8487.4814 -7705.4629 8487.4141 C -7703.4355 8487.8506 -7701.6079 8488.2041 -7699.5479 8487.8984 C -7699.8169 8488.7461 -7700.6675 8488.9414 V f -7790.7578 8488.7422 m -7790.6855 8488.9063 -7790.4497 8488.9961 -7790.6377 8489.2139 C -7790.6611 8489.0605 -7790.7822 8488.8887 -7790.7578 8488.7422 C f -7784.4619 8490.4297 m -7784.4536 8490.3809 -7784.3721 8490.4961 -7784.3521 8490.5225 C -7784.4297 8490.5352 -7784.5024 8490.6729 -7784.5645 8490.5879 C -7784.4854 8490.5762 -7784.4976 8490.498 -7784.4619 8490.4297 C f -7782.8521 8490.5273 m -7782.8765 8490.6729 -7783.2207 8490.7891 -7783.4238 8490.8066 C -7782.8521 8490.5273 L f -7781.3521 8491.1289 m -7781.2227 8491.252 -7781.2583 8491.3193 -7781.4326 8491.3154 C -7781.4453 8491.2383 -7781.3877 8491.1992 -7781.3521 8491.1289 C f -7781.2456 8490.7969 m -7781.1211 8490.793 -7781.0591 8490.8789 -7780.9985 8490.9629 C -7781.0029 8490.8369 -7781.2871 8491.041 -7781.2456 8490.7969 C f -7777.9893 8491.2207 m -7777.9111 8491.209 -7777.7417 8491.0879 -7777.6689 8491.25 C -7777.7505 8491.1367 -7778.0498 8491.4346 -7777.9893 8491.2207 C f -7776.4761 8491 m -7776.4272 8491.0098 -7776.4072 8491.0361 -7776.3506 8490.9961 C -7776.2607 8491.0625 -7776.3555 8491.1689 -7776.4312 8491.1826 C -7776.4761 8491 L f -7748.9287 8490.4141 m -7749.0923 8490.4863 L -7749.0684 8490.3418 L -7748.9287 8490.4141 L f -7736.8574 8490.4063 m -7736.6943 8490.3145 -7736.7441 8490.543 -7736.7168 8490.5645 C -7736.8643 8490.5801 -7736.6621 8490.3848 -7736.8574 8490.4063 C f -7730.3486 8489.6777 m -7730.3984 8489.6816 L -7730.3818 8489.3818 L -7730.3486 8489.6777 L f U %AI8_EndBrushPattern %AI8_BeginBrushPattern (Unnamed Brush Pat 3) 0 A u 0 J 0 j 1 w 4 M []0 d 0 XR -7791.5 8489.5273 m -7577.5361 8489.5273 L -7577.5361 8438.7266 L -7791.5 8438.7266 L -7791.5 8489.5273 L n u 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA 1 J 3 w -7775.3838 8473.0879 m -7775.3838 8480.4658 l -7758.9268 8487.2832 l -7758.9268 8478.8281 l S 1 Ap 0 O 0.019608 0.996078 0.976471 0 0.913725 0.109804 0.141176 Xa 0 J -7783.1016 8462.9727 m -7783.1016 8467.2871 -7784.6455 8470.7842 -7786.5508 8470.7842 c -7788.4561 8470.7842 -7790 8467.2871 -7790 8462.9727 c -7790 8458.6582 -7788.4561 8455.1602 -7786.5508 8455.1602 c -7784.6455 8455.1602 -7783.1016 8458.6582 -7783.1016 8462.9727 c b u 0 Ap 0.145098 1 1 0.047059 0.784314 0.094118 0.121569 Xa 1 w -7782.1484 8461.7461 m -7785.5508 8461.752 L -7788.9541 8461.7617 L -7788.9814 8462.1582 -7789 8462.5605 -7789 8462.9727 c -7789 8462.9766 -7789 8462.9785 -7789 8462.9824 C -7785.5508 8463.709 L -7782.1631 8464.4209 L -7739.1699 8473.4727 L -7739.1699 8461.6445 L -7782.1484 8461.7461 L f 0.019608 0.996078 0.976471 0 0.913725 0.109804 0.141176 Xa -7782.5439 8459.1504 m -7785.5508 8459.7969 L -7788.8213 8460.502 L -7788.8809 8460.9082 -7788.9248 8461.3301 -7788.9541 8461.7617 C -7785.5508 8461.752 L -7782.1484 8461.7461 L -7739.1699 8461.6445 L -7739.1699 8449.8047 L -7782.5439 8459.1504 L f 0.235294 1 1 0.180392 0.65098 0.078431 0.101961 Xa -7782.1631 8464.4209 m -7785.5508 8463.709 L -7789 8462.9824 L -7788.9971 8467.293 -7787.4551 8470.7842 -7785.5508 8470.7842 c -7785.0303 8470.7842 -7784.5391 8470.5176 -7784.0967 8470.0488 C -7739.1699 8485.7168 L -7739.1699 8473.4727 L -7782.1631 8464.4209 L f 0.003922 0.819608 0.588235 0 0.937255 0.333333 0.356863 Xa -7784.0547 8455.9414 m -7784.5078 8455.4453 -7785.0137 8455.1602 -7785.5508 8455.1602 c -7787.0742 8455.1602 -7788.3643 8457.3984 -7788.8213 8460.502 C -7785.5508 8459.7969 L -7782.5439 8459.1504 L -7739.1699 8449.8047 L -7739.1699 8440.2266 L -7784.0547 8455.9414 L f U 1 Ap 0.698039 0.67451 0.639216 0.741176 0.137255 0.121569 0.12549 Xa 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA 3 w -7739.1699 8440.2266 m -7733.6235 8440.2266 -7729.1279 8450.4102 -7729.1279 8462.9727 c -7729.1279 8475.5352 -7733.6235 8485.7168 -7739.1699 8485.7168 c -7744.7158 8485.7168 -7749.2109 8475.5352 -7749.2109 8462.9727 c -7749.2109 8450.4102 -7744.7158 8440.2266 -7739.1699 8440.2266 c B u 0 Ap 0.666667 0 0.34902 0 0.25098 0.74902 0.713726 Xa 1 w -7577.6758 8443.9697 m -7614.0205 8453.5303 -7685.8193 8439.2686 -7722.4155 8439.8994 C -7724.4775 8440.0723 -7725.5117 8440.1914 -7727.5742 8440.501 c -7729.6367 8440.8096 -7730.6675 8440.998 -7732.7295 8441.458 c -7734.7925 8441.917 -7735.8223 8442.1846 -7737.8848 8442.8105 c -7738.2021 8442.9063 -7738.7109 8443.0723 -7739.3154 8443.2754 c -7740.5088 8443.6738 -7742.0908 8444.2207 -7743.4268 8444.6865 C -7745.9072 8448.2354 -7747.8555 8454.8018 -7747.8555 8463.0322 c -7747.8555 8471.7031 -7745.6973 8478.5488 -7743.0283 8481.9434 C -7741.9346 8481.6641 -7740.4951 8481.3887 -7739.3154 8481.1309 c -7738.7529 8481.0098 -7738.2515 8480.8906 -7737.8848 8480.7793 c -7735.8223 8480.1553 -7734.7925 8479.8857 -7732.7295 8479.4258 c -7730.6675 8478.9658 -7729.6367 8478.7793 -7727.5742 8478.4697 c -7725.5117 8478.1602 -7724.4775 8478.042 -7722.4155 8477.8682 C -7685.8193 8477.2354 -7614.0205 8491.5 -7577.6758 8481.9395 C -7586.0762 8477.3857 -7590.2754 8474.2617 -7598.6758 8467.1738 C -7591.1045 8459.8818 -7584.3809 8452.0498 -7577.6758 8443.9697 C f U U U %AI8_EndBrushPattern %AI8_BeginBrushPattern (Unnamed Brush Pat 5) 0 A u 0 J 0 j 1 w 4 M []0 d 0 XR -7791.5 8491.5 m -7567.7979 8491.5 L -7567.7979 8448.123 L -7791.5 8448.123 L -7791.5 8491.5 L n u 0 O 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa -7791.5 8491.5 m -7742.5986 8491.5 L -7749.1279 8488.708 L -7769.4326 8480.0273 L -7769.4326 8463.9482 L -7769.4326 8461.3193 L -7791.5 8461.3193 L -7788.9033 8463.9482 L -7775.9404 8477.0674 L -7788.7705 8488.708 L -7791.5 8491.5 L f 0.623529 0.85098 0 0 0.47451 0.278431 0.623529 Xa -7769.4316 8448.123 m -7769.4316 8451.3506 L -7769.4316 8476.5449 L -7769.4316 8480.0273 L -7589.8662 8480.0273 L -7589.8662 8476.5449 L -7589.8662 8451.3506 L -7589.8662 8448.123 L -7769.4316 8448.123 L f 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa -7583.3584 8477.0674 m -7570.3965 8463.9482 L -7567.7979 8461.3193 L -7589.8662 8461.3193 L -7589.8662 8463.9482 L -7589.8662 8480.0273 L -7610.1709 8488.708 L -7616.7002 8491.5 L -7567.7979 8491.5 L -7570.5283 8488.708 L -7583.3584 8477.0674 L f -7742.5986 8491.5 m -7769.4326 8480.0273 L N u 0 O 0.85098 1 0.262745 0.160784 0.286275 0.12549 0.407843 Xa -7597.0215 8480.0273 m -7616.7002 8480.0273 L -7616.7002 8488.4395 L -7616.7002 8491.5 L -7589.8662 8480.0273 L -7597.0215 8480.0273 L f -7769.4326 8480.0273 m -7742.5986 8491.5 L -7742.5986 8488.4395 L -7742.5986 8480.0273 L -7762.2764 8480.0273 L -7769.4326 8480.0273 L f U U U %AI8_EndBrushPattern %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginPluginObject (Adobe Brush Manager Order) (Adobe Brush Manager Order) ( Adobe Calligraphic Brush Tool/ 2 pt. Oval/ Adobe Calligraphic) - ( Brush Tool/ 5 pt. Oval/ Adobe Calligraphic Brush Tool/ 3 pt. ) - (Flat/ Adobe Calligraphic Brush Tool/ 5 pt. Flat/ Adobe Calligr) - (aphic Brush Tool/ 3 pt. Round/ Adobe Calligraphic Brush Tool/ ) - (7 pt. Round/ Adobe ArtOnPath Brush Tool/ Charcoal/ Adobe ArtOn) - (Path Brush Tool/ Pencil - Thin/ Adobe ArtOnPath Brush Tool/ Ba) - (nner 1/ Adobe ArtOnPath Brush Tool/ Banner 2/) . %AI8_EndPluginObject %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (2 pt. Oval) (1 2 2 26 74 15 15 0 1 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (3 pt. Flat) (1 3 3 9 9 15 15 0 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (3 pt. Round) (1 3 3 100 100 0 0 0 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (5 pt. Flat) (1 5 5 0 0 90 90 0 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (5 pt. Oval) (1 5 5 10 90 -65 35 0 1 1 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (7 pt. Round) (1 7 7 100 100 0 0 0 0 0 0) . %AI8_EndPluginObject %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Banner 1) (1 / Unnamed Brush Pat 5/ / / / / 5 0.47451 0.278431 0.623529 /) - ( 1 0 1 0 1 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Banner 2) (1 / Unnamed Brush Pat 3/ / / / / 5 0.25098 0.74902 0.713726 / ) - ( 1 0 1 0 1 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Charcoal) (1 / Unnamed Brush Pat 2/ / / / / 0 1 / 1 1 1.2 0 1 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Pencil - Thin) (1 / Unnamed 18/ / / / / 0 1 / 1 1 1 0 1 0 0 0) . %AI8_EndPluginObject %AI5_End_NonPrinting-- %AI5_BeginPalette 0 0 Pb 0.74902 0.678431 0.670588 0.901961 ([Registration]) 0 Xs ([Registration]) Pc 0 0 0 0 1 1 1 Xa (White) Pc 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa (Black) Pc 0 0.992157 1 0 1 0 0 Xa (RGB Red) Pc 0.062745 0 0.964706 0 1 1 0 Xa (RGB Yellow) Pc 0.627451 0 1 0 0 1 0 Xa (RGB Green) Pc 0.517647 0 0.12549 0 0 1 1 Xa (RGB Cyan) Pc 0.882353 0.768627 0 0 0 0 1 Xa (RGB Blue) Pc 0.270588 0.815686 0 0 1 0 1 Xa (RGB Magenta) Pc 0.168627 0.980392 0.92549 0.066667 0.756863 0.152941 0.176471 Xa (R=193 G=39 B=45) Pc 0.003922 0.992157 0.972549 0 0.929412 0.109804 0.141176 Xa (R=237 G=28 B=36) Pc 0 0.796078 0.968627 0 0.945098 0.352941 0.141176 Xa (R=241 G=90 B=36) Pc 0 0.501961 0.984314 0 0.968627 0.576471 0.117647 Xa (R=247 G=147 B=30) Pc 0 0.34902 0.870588 0 0.984314 0.690196 0.231373 Xa (R=251 G=176 B=59) Pc 0.047059 0 0.933333 0 0.988235 0.933333 0.129412 Xa (R=252 G=238 B=33) Pc 0.188235 0 0.980392 0 0.85098 0.878431 0.129412 Xa (R=217 G=224 B=33) Pc 0.501961 0 0.992157 0 0.54902 0.776471 0.247059 Xa (R=140 G=198 B=63) Pc 0.745098 0 0.996078 0 0.223529 0.709804 0.290196 Xa (R=57 G=181 B=74) Pc 0.862745 0.176471 1 0.039216 0 0.572549 0.270588 Xa (R=0 G=146 B=69) Pc 0.901961 0.333333 0.988235 0.258824 0 0.407843 0.215686 Xa (R=0 G=104 B=55) Pc 0.760784 0 0.74902 0 0.133333 0.709804 0.45098 Xa (R=34 G=181 B=115) Pc 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa (R=0 G=169 B=157) Pc 0.698039 0.14902 0 0 0.160784 0.670588 0.886275 Xa (R=41 G=171 B=226) Pc 0.87451 0.52549 0 0 0 0.443137 0.737255 Xa (R=0 G=113 B=188) Pc 0.992157 0.964706 0.035294 0.003922 0.180392 0.192157 0.572549 Xa (R=46 G=49 B=146) Pc 1 1 0.262745 0.247059 0.105882 0.078431 0.392157 Xa (R=27 G=20 B=100) Pc 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa (R=102 G=45 B=145) Pc 0.494118 0.992157 0.011765 0 0.576471 0.152941 0.560784 Xa (R=147 G=39 B=143) Pc 0.34902 1 0.372549 0.109804 0.619608 0 0.364706 Xa (R=158 G=0 B=93) Pc 0.117647 1 0.494118 0.007843 0.831373 0.078431 0.352941 Xa (R=212 G=20 B=90) Pc 0 0.968627 0.203922 0 0.929412 0.117647 0.47451 Xa (R=237 G=30 B=121) Pc 0.227451 0.27451 0.4 0 0.780392 0.698039 0.6 Xa (R=199 G=178 B=153) Pc 0.4 0.427451 0.52549 0.066667 0.6 0.52549 0.458824 Xa (R=153 G=134 B=117) Pc 0.505882 0.529412 0.607843 0.235294 0.45098 0.388235 0.341176 Xa (R=115 G=99 B=87) Pc 0.576471 0.603922 0.639216 0.419608 0.32549 0.278431 0.254902 Xa (R=83 G=71 B=65) Pc 0.227451 0.384314 0.635294 0.011765 0.776471 0.611765 0.427451 Xa (R=198 G=156 B=109) Pc 0.317647 0.490196 0.741176 0.098039 0.65098 0.486275 0.321569 Xa (R=166 G=124 B=82) Pc 0.360784 0.572549 0.839216 0.227451 0.54902 0.384314 0.223529 Xa (R=140 G=98 B=57) Pc 0.392157 0.639216 0.933333 0.356863 0.458824 0.298039 0.141176 Xa (R=117 G=76 B=36) Pc 0.415686 0.698039 0.968627 0.490196 0.376471 0.219608 0.07451 Xa (R=96 G=56 B=19) Pc 0.478431 0.733333 0.835294 0.682353 0.258824 0.129412 0.043137 Xa (R=66 G=33 B=11) Pc Bb 2 (Linear Gradient 1) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Linear Gradient 1) Pc Bb 0 0 0 0 Bh 2 (Radial Gradient 1) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Radial Gradient 1) Pc Bb 2 (Red Linear Gradient) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Red Linear Gradient) Pc Bb 2 (Gray Linear Gradient) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Gray Linear Gradient) Pc Bb 0 0 0 0 Bh 2 (Purple Radial Gradient) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Purple Radial Gradient) Pc (Checked Pattern) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p (Checked Pattern) Pc 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 Xa (R=236 G=28 B=36) Pc 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa (R=0 G=169 B=157) Pc 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa (R=102 G=45 B=145) Pc 0.486274 0.364706 0.337255 0.015686 0.545098 0.572549 0.596078 Xa (R=139 G=146 B=152 1) Pc 0 g (K=100) Pc 0.1 g (K=90) Pc 0.2 g (K=80) Pc 0.3 g (K=70) Pc 0.4 g (K=60) Pc 0.5 g (K=50) Pc 0.6 g (K=40) Pc 0.7 g (K=30) Pc 0.8 g (K=20) Pc 0.9 g (K=10) Pc 0.95 g (K=5) Pc PB %AI5_EndPalette %%EndSetup %AI5_BeginLayer 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (Layer 1) Ln 0 A u *u 0 O 0 g 0 J 0 j 1 w 4 M []0 d 0 XR 316.9551 360.353 m 324.6743 360.353 331.1836 357.7036 336.4824 352.4043 c 341.8135 347.0728 344.48 340.5635 344.48 332.877 c 344.48 325.1572 341.8628 318.73 336.6294 313.5952 c 331.0684 308.1318 324.5107 305.4014 316.9551 305.4014 c 309.5293 305.4014 303.0859 308.1001 297.624 313.4971 c 292.2271 318.894 289.5283 325.3535 289.5283 332.877 c 289.5283 340.3999 292.2271 346.9092 297.624 352.4043 c 302.9229 357.7036 309.3662 360.353 316.9551 360.353 c f 1 D 317.0532 355.3975 m 310.8052 355.3975 305.5229 353.2056 301.2056 348.8228 c 296.7236 344.2432 294.4839 338.9282 294.4839 332.877 c 294.4839 326.793 296.7075 321.5264 301.1563 317.0786 c 305.6045 312.6299 310.9033 310.4058 317.0532 310.4058 c 323.1694 310.4058 328.501 312.646 333.0479 317.1274 c 337.3657 321.2813 339.5244 326.5313 339.5244 332.877 c 339.5244 339.1245 337.3325 344.4395 332.9497 348.8228 c 328.5664 353.2056 323.2676 355.3975 317.0532 355.3975 c f 0 D 324.4126 339.6968 m 324.4126 328.4614 L 321.2725 328.4614 L 321.2725 315.1162 L 312.7354 315.1162 L 312.7354 328.4614 L 309.5952 328.4614 L 309.5952 339.6968 L 309.5952 340.1875 309.7671 340.6045 310.1104 340.9482 c 310.4541 341.2915 310.8711 341.4634 311.3618 341.4634 c 322.6465 341.4634 L 323.104 341.4634 323.5127 341.2915 323.873 340.9482 c 324.2324 340.6045 324.4126 340.1875 324.4126 339.6968 c f 313.1772 346.7622 m 313.1772 349.3457 314.4526 350.6382 317.0039 350.6382 c 319.5552 350.6382 320.8311 349.3457 320.8311 346.7622 c 320.8311 344.2109 319.5552 342.9351 317.0039 342.9351 c 314.4526 342.9351 313.1772 344.2109 313.1772 346.7622 c f *U U LB %AI5_EndLayer-- %AI3_BeginCrops userdict /AI3_noCropMarks known not { 0 A u u 0 R 0.74902 0.678431 0.670588 0.901961 ([Registration]) 0 XS 0 J 0 j 0.5 w 4 M []0 d 0 XR 275 299.457 m 248 299.457 L S 284 290.457 m 284 263.457 L S U u 275 365.457 m 248 365.457 L S 284 374.457 m 284 401.457 L S U u 359 365.457 m 386 365.457 L S 350 374.457 m 350 401.457 L S U u 359 299.457 m 386 299.457 L S 350 290.457 m 350 263.457 L S U U } if %AI3_EndCrops %%PageTrailer gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec +Adobe_shading_AI8 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_pattern_AI5 /terminate get exec +AGM_Gradient /terminate get exec +Adobe_cshow /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF \ No newline at end of file diff --git a/lectures/images/cc/cc.eps b/lectures/images/cc/cc.eps new file mode 100644 index 0000000..7bf4ba0 --- /dev/null +++ b/lectures/images/cc/cc.eps @@ -0,0 +1,5902 @@ +%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 8.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Alex Roberts) () %%Title: (cc.eps) %%CreationDate: 5/2/08 10:36 AM %%BoundingBox: 289 305 345 361 %%HiResBoundingBox: 289.5283 305.4014 344.48 360.353 %%DocumentProcessColors: Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset AGM_Gradient 1.0 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_pattern_AI5 1.0 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 4.0 %AI3_ColorUsage: Color %AI3_IncludePlacedImages %AI7_ImageSettings: 1 %%CMYKProcessColor: 1 1 1 1 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 1 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 -1 -1 () %AI3_Cropmarks: 284 299.457 350 365.457 %AI3_TemplateBox: 400 300 400 300 %AI3_TileBox: 111.5 -55.5 687.5 678.5 %AI3_DocumentPreview: Macintosh_ColorPic %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI8_OpenToView: 196.2319 401.7681 5.8562 1166 673 18 1 0 73 75 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:-66.3003 -266.2988 %AI7_GridSettings: 48 8 48 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments %%BeginProlog %%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 0 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 26 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + (AI8_CMYK_CustomColor) + 6 packedarray + } bind def + /findrgbcustomcolor + { + (AI8_RGB_CustomColor) + 5 packedarray + } bind def + /setcustomcolor + { + exch + aload pop dup + (AI8_CMYK_CustomColor) eq + { + pop pop + 4 + { + 4 index mul + 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + { + dup (AI8_RGB_CustomColor) eq + { + pop pop + 3 + { + 1 exch sub + 3 index mul + 1 exch sub + 3 1 roll + } repeat + 4 -1 roll pop + setrgbcolor + } + { + pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } ifelse + } ifelse + } + def + } if + /setAIseparationgray + { + false setoverprint + 0 setgray + /setseparationgray where{ + pop setseparationgray + }{ + /setcolorspace where{ + pop + [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace + 1 exch sub setcolor + }{ + setgray + }ifelse + }ifelse + } def + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset AGM_Gradient_Sep 1.0 0 +%%Title: (AGM Gradient Procset) +%%Version: 1.0 0 +%%CreationDate: (4/26/96) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /AGM_Gradient_Sep 5 dict dup begin put +/AGM_Gradient_Sep_private 100 dict def +/initialize{ + AGM_Gradient_Sep begin + AGM_Gradient_Sep_private begin + _compositeJob{ + initializeSinglePassSeps + }{ + initializeMultiPassSeps + }ifelse + initializeSeps + AGM_Gradient_private begin + /_fillSD newSpotDict def + /_rampSD newSpotDict def + /_nCustomColorSD nd + end + AGM_Gradient_Sep_private + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + AGM_Gradient_Sep + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + end + + currentdict readonly pop + end +}def +/terminate{ + currentdict AGM_Gradient_Sep eq{ + end + }if +}def +AGM_Gradient_Sep_private begin +/initializeSeps{ + /currentoverprint { _of } def + _noImage not _level2PS not and{ + /linealFill{ + currentoverprint{ + 0 0 1 1 rectfill + }{ + mySave + 8 setImageParms + _color{ + _nCustomColorSD begin + cyan magenta yellow black + + _spotColor{ + spot1/tintImage spot1/tintValue get 1 exch sub makeByte8 put + spot2/tintImage spot2/tintValue get 1 exch sub makeByte8 put + }if + end + + 4{ + makeByte8 4 1 roll + }repeat + true 4 _nCustomColorSD ncolorimage + }{ + _nCustomColorSD/black get 1 exch sub makeByte8 + _nCustomColorSD bwImage + }ifelse + myRestore + }ifelse + }def + }if + /_whiteBytes 1 makeByte8 pt + /knockOut{ + _noImage _level2PS or currentoverprint or{ + gsave + false setoverprint + 1 setgray + 0 0 1 1 rectfill + grestore + }{ + 8 setImageParms _whiteBytes /_image load 5 execImage + }ifelse + }def + /newSpotDict{ + 11 dict dup begin + /nSpots 2 def + /spot1 7 dict def + /spot2 7 dict def + end + }def + /initSpotData + { + begin + /name nd + /tintImage nd + /tintValue nd + /spot_C nd + /spot_M nd + /spot_Y nd + /spot_K nd + end + }def + /initSpotDict{ + begin + /cyanInk nd + /magentaInk nd + /yellowInk nd + /blackInk nd + /cyan nd + /magenta nd + /yellow nd + /black nd + spot1 initSpotData + spot2 initSpotData + end + }def + /copySpotDict{ + /_dst xp + begin + cyanInk magentaInk yellowInk blackInk + cyan magenta yellow black + spot1 spot2 + end + _dst begin + /spot1 spot1 maxlength dict def + /spot2 spot2 maxlength dict def + spot2 copy pop + spot1 copy pop + /black xd + /yellow xd + /magenta xd + /cyan xd + /blackInk xd + /yellowInk xd + /magentaInk xd + /cyanInk xd + end + }def + /setCustomColor + { + 1 index /Black eq{ + 6 1 roll 5 npop + 1 exch sub + setgray + }{ + 6 1 roll _ccAry1 astore exch + dup null eq{ + pop 0 + }if + setcustomcolor + }ifelse + }def + /setCStop{ + /_colorStyle exch pt + + _colorStyle 0 eq{ + 0 0 0 + 4 -1 roll + 1 exch sub + _spotColor{ + /_colorStyle 3 pt + /Black + 1 index + 1 exch sub + }if + }if + _colorStyle 2 eq{ + 3 npop + }if + _rampSD _fillSD copySpotDict + + _colorStyle 4 eq{ + pop + 9 2 roll 3 npop 6 -2 roll + } if + + _colorStyle 3 eq _colorStyle 4 eq or{ + + _fillSD begin + /_spot1 spot1 pt + /_spot2 spot2 pt + end + + exch dup _spot1/name get eq{ + _spot1 _spot2 + }{ + _spot2 _spot1 + }ifelse + begin + begin + /name xd + 1 exch sub /tintValue xd + 4{ + tintValue mul 4 1 roll + }repeat + _spotColor not{ + /tintValue null def + }if + end + /tintValue 0 def + end + }if + _fillSD nsetcustomcolor + }def + /renderCMYK{ + spot1/name get null eq + spot2/name get null eq and + dup not{ + pop + spot1 spotConverted + }if + dup not{ + pop + spot2 spotConverted + }if + }def + /currentInk{ + true + _inRipSep{ + currentcolorspace 0 get + dup /DeviceGray eq + 1 index /DeviceCMYK eq or{ + pop + currentcmykcolor add add add 0 eq{ + pop false + }if + }{ + /Separation eq{ + currentcolor 0 eq{ + pop false + }if + }if + }ifelse + }{ + currentgray 1 eq{ + pop false + }if + }ifelse + }def + /currentInkN{ + + _nCustomColorSD begin + /_spot1 spot1 pt + /_spot2 spot2 pt + renderCMYK + end + { + currentInk + }{ + gsave + _spot1 begin + name null ne{ + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + currentInk + }{ + false + }ifelse + end + _spot2 begin + name null ne{ + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + currentInk + }{ + false + }ifelse + end + grestore + + or + } ifelse + }def + /fill_ /fill load def + /fillOvp{ + currentoverprint{ + _inRipSep{ + currentcolorspace 0 get + dup /DeviceGray eq + 1 index /DeviceCMYK eq or{ + pop + currentcmykcolor add add add 0 eq{ + newpath + }if + }{ + /Separation eq{ + currentcolor 0 eq{ + newpath + }if + }if + }ifelse + }{ + currentgray 1 eq{ + newpath + }if + }ifelse + }if + fill_ + }def + /fill{ + _nCustomColorSD begin + /_spot1 spot1 pt + /_spot2 spot2 pt + renderCMYK + end + + { + fillOvp + }{ + _spot1 begin + gsave + name null ne{ + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + }{ + 1 setgray + }ifelse + fillOvp + grestore + end + _spot2 begin + name null ne{ + gsave + true setoverprint + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + fillOvp + grestore + }if + end + newpath + }ifelse + }def + /expandSpot{ + _spotColor{ + /_len xp + _rampSD begin + spot1 begin + tintImage null ne{ + tintImage _len expandOne /tintImage xd + }if + end + spot2 begin + tintImage null ne{ + tintImage _len expandOne /tintImage xd + }if + end + end + }{ + pop + }ifelse + }def + /rampImage{ + currentoverprint{ + rectImage + }{ + _enabledSmoothShade{ + fillRamp + }{ + _color{ + _rampSD begin + /cyanInk _cyanData 0 ne def + /magentaInk _magentaData 0 ne def + /yellowInk _yellowData 0 ne def + /blackInk _blackData 0 ne def + end + + _nSamples setImageParms + _nSamples expandSpot + _cyanData _magentaData _yellowData _blackData _nSamples 4 expandColor + true 4 _rampSD ncolorimage + }{ + _rampSD begin + /cyanInk false def + /magentaInk false def + /yellowInk false def + /blackInk true def + end + _nSamples setImageParms + _blackData _rampSD bwImage + }ifelse + }ifelse + }ifelse + }def + /nsetcustomcolor where{ + pop + }{ + /nsetcustomcolor + { + /_nCustomColorSD xp + _nCustomColorSD begin + 4 copy + /black xd + /yellow xd + /magenta xd + /cyan xd + 4 copy + 0 ne /blackInk xd + 0 ne /yellowInk xd + 0 ne /magentaInk xd + 0 ne /cyanInk xd + end + setcmykcolor + }def + }ifelse + /nsetcustomcolorend where{ + pop + }{ + /nsetcustomcolorend + { + /_nCustomColorSD null pt + }def + }ifelse +}def +/initializeSinglePassSeps{ + /_decodeNorm [0 1] pt + /_decodeInvert [1 0] pt + /spotConverted + { + begin + name null eq{ + false + }{ + tintValue null eq tintImage null eq and{ + true + }{ + _inDistiller{ + false + }{ + false + currentpagedevice/SeparationColorNames get{name eq or}forall + not + }ifelse + }ifelse + }ifelse + end + }def + /dictImage + { + 20 dict dup begin + /Dict xd + /Decode xd + /DataSource xd + /ImageMatrix xd + /BitsPerComponent xd + /Height xd + /Width xd + /ImageType 1 def + Dict + end + /_image load 1 execImage + }def + /bwImage{ + begin + gsave + currentoverprint{ + blackInk{ + [/Separation /Black /DeviceGray{}] setcolorspace + _decodeInvert dictImage + }{ + 5 npop + }ifelse + }{ + /DeviceGray setcolorspace + _decodeNorm dictImage + }ifelse + grestore + end + }def + /ncolorimage where{ + pop + }{ + /ncolorimage{ + begin + renderCMYK{ + cyanInk + magentaInk and + yellowInk and + blackInk and + not + currentoverprint + and{ + pop pop + gsave + cyanInk{ + 8 copy + [/Separation /Cyan /DeviceGray{}] setcolorspace + 3 npop + _decodeNorm dictImage + }if + magentaInk{ + 8 copy + [/Separation /Magenta /DeviceGray{}] setcolorspace + 4 -1 roll + 3 npop + _decodeNorm dictImage + }if + yellowInk{ + 8 copy + [/Separation /Yellow /DeviceGray{}] setcolorspace + 4 -2 roll + 3 npop + _decodeNorm dictImage + }if + blackInk{ + 4 -3 roll + [/Separation /Black /DeviceGray{}] setcolorspace + 3 npop + _decodeNorm dictImage + }{ + 8 npop + }ifelse + grestore + }{ + /_colorimage load 10 execImage + }ifelse + }{ + 6 npop + gsave + spot1 begin + name null ne tintImage null ne and{ + [/Separation name /DeviceGray{}] setcolorspace + 4 copy + tintImage + name /Black eq{ + _decodeNorm + }{ + _decodeInvert + }ifelse + dictImage + }{ + 1 setgray fill + }ifelse + end + spot2 begin + true setoverprint + name null ne tintImage null ne and{ + [/Separation name /DeviceGray{}] setcolorspace + tintImage + name /Black eq{ + _decodeNorm + }{ + _decodeInvert + }ifelse + dictImage + }{ + 4 npop + 1 setgray fill + }ifelse + end + grestore + }ifelse + end + }def + }ifelse + /getRampColorSpace{ + + /_renderCMYK _rampSD begin renderCMYK end pt + + _renderCMYK not{ + _rampSD begin + [/DeviceN + [ + spot1 begin + name null ne tintImage null ne and{ + name + }if + end + spot2 begin + name null ne tintImage null ne and{ + name + }if + end + ] + _inDistiller { + /DeviceCMYK [ + spot1 begin + name null ne tintImage null ne and{ + spot_C spot_M spot_Y spot_K 1 + }{ + 0 0 0 0 0 + }ifelse + end + spot2 begin + name null ne tintImage null ne and{ + spot_C spot_M spot_Y spot_K 2 + }{ + 0 0 0 0 0 + }ifelse + end + 5 1 roll 6 -2 roll add + dup 1 eq { + pop + 8 /index cvx 1 /exch cvx /sub cvx + 9 1 /roll cvx + }{ + 2 eq { + 8 /index cvx 1 /exch cvx /sub cvx + 10 1 /roll cvx + }if + }ifelse + 4 1 /roll cvx 5 -2 /roll cvx + 8 /index cvx /mul cvx /exch cvx 9 /index cvx /mul cvx /add cvx 7 1 /roll cvx + 3 1 /roll cvx 4 -2 /roll cvx + 7 /index cvx /mul cvx /exch cvx 8 /index cvx /mul cvx /add cvx 6 1 /roll cvx + 2 1 /roll cvx 3 -2 /roll cvx + 6 /index cvx /mul cvx /exch cvx 7 /index cvx /mul cvx /add cvx 5 1 /roll cvx + 5 /index cvx /mul cvx /exch cvx 6 /index cvx /mul cvx /add cvx 4 1 /roll cvx + 6 -2 /roll cvx /pop cvx /pop cvx + ] cvx bind + }{ + /DeviceCMYK {} + }ifelse + ] setcolorspace + end + /_nColorSpace currentcolorspace pt + }if + + _nSamples 1 gt{ + /_ndx 0 pt + [blendColor] cvx exec + }if + _renderCMYK{ + /_C0 [currentcolor] pt + /_C0_Space currentcolorspace pt + }{ + /_C0 [ + _nCustomColorSD begin + spot1 begin + name null ne{ + tintValue + }if + end + spot2 begin + name null ne{ + tintValue + }if + end + end + ] pt + /_C0_Space _nColorSpace pt + }ifelse + + _nSamples 1 gt{ + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + }if + _renderCMYK{ + /_C1 [currentcolor] pt + /_C1_Space currentcolorspace pt + }{ + /_C1 [ + _nCustomColorSD begin + spot1 begin + name null ne{ + tintValue + }if + end + spot2 begin + name null ne{ + tintValue + }if + end + end + ] pt + /_C1_Space _nColorSpace pt + }ifelse + + /_rampColorSpace _C0_Space pt + _spotColor{ + nsetcustomcolorend + }if + }def +}def +/initializeMultiPassSeps{ + /invertXfer{ + [ + { + 1 exch sub + }/exec load systemdict /currenttransfer get exec /exec load + ] cvx systemdict /settransfer get exec + }def + /ccThrough{ + gsave + 1 setCustomColor + currentcmykcolor + grestore + add add add 0 ne + }def + /spotConverted + { + begin + _isCMYKSep not{ + false + }{ + name null eq{ + false + }{ + tintValue null eq tintImage null eq and{ + true + }{ + spot_C spot_M spot_Y spot_K name ccThrough + }ifelse + }ifelse + }ifelse + end + }def + /spotChannel + { + _isCMYKSep{ + pop false + }{ + /_spotDict xp + _spotDict/name get null eq{ + false + }{ + _spotDict/spot_C get + _spotDict/spot_M get + _spotDict/spot_Y get + _spotDict/spot_K get + _spotDict/name get + ccThrough + }ifelse + }ifelse + }def + /getChannelData + { + _isCMYKSep dup{ + pop renderCMYK + }if + { + _blackPlate{ + 4 1 roll 3 npop blackInk + }{ + _yellowPlate{ + 4 2 roll 3 npop yellowInk + }{ + _magentaPlate{ + 4 3 roll 3 npop magentaInk + }{ + 3 npop cyanInk + }ifelse + }ifelse + }ifelse + { + true /nonZeroData + }{ + true /zeroData + }ifelse + }{ + 4 npop + spot1/name get null ne + spot1 spotChannel and{ + spot1/tintImage get dup null ne{ + false /nonZeroData + }{ + pop false /noData + }ifelse + }{ + spot2/name get null ne + spot2 spotChannel and{ + spot2/tintImage get dup null ne{ + false /nonZeroData + }{ + pop false /noData + }ifelse + }{ + false /noData + }ifelse + }ifelse + }ifelse + }def + /renderChannelData + { + /_tmp xp + _tmp /nonZeroData ne currentoverprint and{ + pop + _tmp /zeroData eq{pop}if + 4 npop + }{ + _tmp /nonZeroData eq{ + { + invertXfer + }if + systemdict/image + get 5 execImage + }{ + pop + _tmp /zeroData eq{pop}if + 4 npop + knockOut + }ifelse + }ifelse + }def + /bwImage{ + begin + gsave + dup dup dup + getChannelData + exch pop false exch + renderChannelData + grestore + end + }def + /ncolorimage{ + begin + pop pop + gsave + spot2/name get null ne spot2 spotChannel and{ + true setoverprint + }if + getChannelData + renderChannelData + grestore + end + }def + /getRampColorSpace{ + + /_renderCMYK _rampSD begin renderCMYK end pt + + _nSamples 1 gt{ + /_ndx 0 pt + [blendColor] cvx exec + }if + + _renderCMYK{ + /_C0 [currentcolor] pt + /_C0_Space currentcolorspace pt + }{ + /_C0 [ + _nCustomColorSD begin + 0 + spot1 begin + name null ne + tintValue null ne and + spot1 spotChannel and{ + pop tintValue + }if + end + spot2 begin + name null ne + tintValue null ne and + spot2 spotChannel and{ + pop tintValue + }if + end + 1 exch sub + end + ] pt + /_C0_Space /DeviceGray pt + }ifelse + + _nSamples 1 gt{ + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + }if + + _renderCMYK{ + /_C1 [currentcolor] pt + /_C1_Space currentcolorspace pt + }{ + /_C1 [ + _nCustomColorSD begin + 0 + spot1 begin + name null ne + tintValue null ne and + spot1 spotChannel and{ + pop tintValue + }if + end + spot2 begin + name null ne + tintValue null ne and + spot2 spotChannel and{ + pop tintValue + }if + end + 1 exch sub + end + ] pt + /_C1_Space /DeviceGray pt + }ifelse + + /_rampColorSpace _C0_Space pt + _spotColor{ + nsetcustomcolorend + }if + }def +}def +end +end +defaultpacking setpacking +%%EndResource +%%BeginResource: procset AGM_Gradient 1.0 0 +%%Title: (AGM Gradient Procset) +%%Version: 1.0 0 +%%CreationDate: (4/26/96) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /AGM_Gradient 20 dict dup begin put +/AGM_Gradient_private 201 dict def +/initialize +{ + AGM_Gradient begin + AGM_Gradient_private begin + initializeVars + + /bd systemdict/mark get def + /ed + _level2PS + { + (>>) + }{ + (counttomark 2 idiv dup dict begin {def} repeat pop currentdict end) + } ifelse + cvx def + + _level2PS{ + initializeLev2 + }{ + initializeLev1 + }ifelse + + queryDevice + + initializeRectFill + initializeShading + initializeOps + _producingSeps{ + AGM_Gradient_Sep/initialize get exec + }{ + initializeComposite + }ifelse + _illustrator{ + /f{}def + /F{}def + /s{}def + /S{}def + /b{}def + /B{}def + }if + /image where{ + /image get /_image xd + }if + /colorimage where{ + /colorimage get /_colorimage xd + }if + AGM_Gradient_private + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + AGM_Gradient + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + end + + currentdict readonly pop + end +}def +/initializeAI +{ + pop pop + AGM_Gradient/AGM_Gradient_private get /_illustrator true put + AGM_Gradient/initialize get exec + AGM_Gradient begin +}def +/unload{ + systemdict/languagelevel known{ + systemdict/languagelevel get 2 ge{ + userdict/AGM_Gradient_Sep 2 copy known{ + undef + }{ + pop pop + }ifelse + userdict/AGM_Gradient 2 copy known{ + undef + }{ + pop pop + }ifelse + }if + }if +}def +/terminate{ + currentdict AGM_Gradient eq{ + end + }if +}def + +AGM_Gradient_private begin +/initializeVars{ + /_d255 256 array def + 0 1 255{ + _d255 exch dup 255 div put + }bind for + /_d255- 256 array def + 0 1 255{ + _d255- exch 1 _d255 2 index get sub put + }bind for + /_sSave nd + /_dUserSpace matrix defaultmatrix def + /_bUMatrix matrix def + /_imageMatrix matrix def + /_saveMatrix matrix def + /_xm matrix def + /_ccAry1 5 array def + /_bbox 4 array pt + /_level2PS + systemdict/languagelevel known dup{ + pop systemdict/languagelevel get 2 ge + }if + def + /_level3PS + _level2PS systemdict/shfill known and + def + currentdict /_illustrator known not{ + /_illustrator false def + }if + +}def +/initializeOps +{ + AGM_Gradient begin + currentdict/Bc known not{ + /Bc{ + + _renderFlag 2 eq _enabledSmoothShade or{ + 6 npop + }{ + pushBSpace + _rampIndex 0 eq{ + pop pop + setCStop + }if + linealFill + popBSpace + }ifelse + + }def + }if + + currentdict/Bg known not{ + /Bg{ + 10 npop + /_gradName xp + /_renderFlag xp + /_enabledSmoothShade false pt + + _renderFlag 2 ne{ + + _illustrator{ + _of setoverprint + }if + + /_enabledSmoothShade + _level3PS{ + _usingSmoothShade + _producingSeps not + currentoverprint not or and + _noImage not and + }{ + false + }ifelse + pt + + _illustrator _eo and _renderFlag 3 eq or{ + eoclip + }{ + clip + }ifelse + + _gradNames _gradName 2 copy known{ + get + mark exch aload pop + /_gradType xp + 1 sub dup /_rampIndex xp + /_maxRampIndex xp + mark exch aload pop + 0 0 + }if + pop pop + getRampData + }{ + mark mark + }ifelse + }def + }if + + currentdict/Bm known not{ + /Bm{ + _renderFlag 2 ne{ + _gradType 0 eq{ + linealRamp + }{ + radialGrad + }ifelse + }{ + 6 npop + }ifelse + }def + }if + + currentdict/Bh known not{ + /Bh{ + 2 npop + /_yHi xp + /_xHi xp + /_radHilite _xHi 0 ne _yHi 0 ne or pt + }def + }if + + currentdict/Bn known not{ + /Bn{ + AGM_Gradient_private begin + dict /_gradNames xp + end + }def + }if + + currentdict/Bd known not{ + /Bd{ + AGM_Gradient begin + AGM_Gradient_private begin + /_nColorsBd xp + /_gradType xp + /_gradName xp + }def + }if + + currentdict/BD known not{ + /BD{ + currentdict/_gradNames known not{ + /_gradNames 20 dict def + }if + ] _nColorsBd _gradType + ] _gradName exch /_gradNames xput + end + end + }def + }if + + currentdict/Bb known not{ + /Bb{ + + AGM_Gradient/AGM_Gradient_private get /_illustrator get not{ + AGM_Gradient begin + }if + AGM_Gradient_private begin + _producingSeps{ + AGM_Gradient_Sep/AGM_Gradient_Sep_private get begin + }if + mySave + }def + }if + + currentdict/BB known not{ + /BB{ + + /_tmp xp + cleartomark cleartomark + + _tmp dup + _renderFlag + + myRestore + + _producingSeps{ + end + }if + + _illustrator dup + end + not { + end + }if + + { + 2 ne exch 0 gt and{ + 2 eq{ + s + }{ + S + }ifelse + }{ + pop newpath + }ifelse + }{ + pop newpath + }ifelse + + + }def + }if + + currentdict/Xm known not{ + /Xm{ + _xm astore pop + }def + }if + + end +}def +/queryDevice{ + /_inDistiller + systemdict /currentdistillerparams known + def + /_inRipSep + _level2PS{ + currentpagedevice/Separations 2 copy known{ + get + }{ + pop pop false + }ifelse + }{ + false + }ifelse + _inDistiller or + def + /_noImage /lv1Fix where{ + pop lv1Fix + }{ + false + }ifelse + def + /_useShells where{ + /_useShells get /_usingShells xp + }{ + /_usingShells false def + }ifelse + + /_useSmoothShade where{ + pop + }{ + /_useSmoothShade false def + }ifelse + /_forceToCMYK where{ + pop + }{ + /_forceToCMYK false def + }ifelse + /_cyanPlate 1 0 0 0 testCMYKColorThrough def + /_magentaPlate 0 1 0 0 testCMYKColorThrough def + /_yellowPlate 0 0 1 0 testCMYKColorThrough def + /_blackPlate 0 0 0 1 testCMYKColorThrough def + /_compositeJob + _cyanPlate _magentaPlate and _yellowPlate and _blackPlate and + def + /_isCMYKSep + _cyanPlate _magentaPlate or _yellowPlate or _blackPlate or + def + /_compositeSpotDevice where{ + pop + }{ + /_compositeSpotDevice _compositeJob not _inRipSep or{ + 1 + }{ + 0 + }ifelse + def + }ifelse + /_producingSeps _compositeSpotDevice 0 ne def + /_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def + /_dpiThreshold where{ + pop + }{ + /_dpiThreshold 600 def + }ifelse + /_screenFreqThreshold where{ + pop + }{ + /_screenFreqThreshold 150 def + }ifelse + /_contoneDevice where{ + pop + }{ + /_contoneDevice false def + }ifelse + /_subSampleOK + _deviceDPI _dpiThreshold le + currentScreenFreq _screenFreqThreshold le and + _contoneDevice not and + def +}def +/initializeRectFill{ + /rectfill where dup{ + exch pop not _producingSeps or + }{ + not + }ifelse + { + /rectfill{ + gsave + newpath + 4 2 roll moveto + 1 index 0 rlineto + 0 1 index rlineto + 1 index neg 0 rlineto + pop pop + closepath + fill + grestore + }def + }if +}def +/initializeLev1{ + /currentScreenFreq{ + currentscreen pop pop + }def + /_byte 1 string def + /colorimage where{ + pop + }{ + /colorimage{ + pop pop + /_blackTmp xp + /_yellowTmp xp + /_magentaTmp xp + /_cyanTmp xp + /_cnt 0 pt + [ + _byte dup 0 + _cyanTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx .3 /mul cvx + _magentaTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx .59 /mul cvx + _yellowTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx .11 /mul cvx + _blackTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx + /add cvx /add cvx /add cvx 1 /exch cvx /sub cvx + /dup cvx 0 /lt cvx{ + pop 0 + }/if cvx + /dup cvx 1 /gt cvx{ + pop 1 + }/if cvx + 255 /mul cvx /cvi cvx + 256 /mod cvx + /dup cvx 0 /lt cvx{ + pop 0 + }/if cvx + /put cvx + /_cnt dup cvx 1 /add cvx /pt cvx + ] cvx + bind + /_image load 5 execImage + }def + }ifelse +}def +/initializeLev2{ + /level2ScreenFreq{ + begin + 60 + HalftoneType 1 eq{ + pop Frequency + }if + HalftoneType 2 eq{ + pop GrayFrequency + }if + HalftoneType 5 eq{ + pop Default level2ScreenFreq + }if + end + }def + /currentScreenFreq{ + currenthalftone level2ScreenFreq + }def +}def +/initializeShading{ + _useSmoothShade _level3PS and{ + /_usingSmoothShade true pt + initializeLev3_Ops + }{ + /_usingSmoothShade false pt + }ifelse +}def +/initializeLev3_Ops +{ + /initShFill{ + /_index _gradType 0 eq {0}{_maxRampIndex 1 sub} ifelse pt + /_rampFuncsArray _maxRampIndex array pt + /_boundsArray _maxRampIndex 1 sub array pt + /_encodeArray _maxRampIndex 2 mul array pt + /_beginCoord _rampPoint pt + /_colorSpace null pt + /_firstFill _rampIndex _maxRampIndex eq pt + /_lastFill false pt + }def + /linealShFill{ + popBSpace + _xm aload pop pushBSpace + + /_size _index 1 add pt + _size _maxRampIndex lt { + /_rampFuncsArray _rampFuncsArray 0 _size getinterval pt + /_boundsArray _boundsArray 0 _size 1 sub getinterval pt + /_encodeArray _encodeArray 0 _size 2 mul getinterval pt + }if + + bd + /ShadingType 2 + /ColorSpace _colorSpace + _rgbInCMYK{ + /Function [ + _cData sampFunc + _mData sampFunc + _yData sampFunc + _kData sampFunc + ] + }{ + /Function + bd + /FunctionType 3 + /Domain [0 1] + /Functions _rampFuncsArray + /Bounds _boundsArray + /Encode _encodeArray + ed + }ifelse + /Extend [_firstFill _lastFill] + /Domain [0 1] + /Coords [_beginCoord 0 _endCoord 0] + ed + shfill + }def + + /radialShFill{ + /_size _maxRampIndex _index sub pt + _size _maxRampIndex lt { + /_rampFuncsArray _rampFuncsArray _index _size getinterval pt + /_boundsArray _boundsArray _index _size 1 sub getinterval pt + /_encodeArray _encodeArray _index 2 mul _size 2 mul getinterval pt + }if + + /_rampLen _beginCoord _endCoord sub pt + bd + /ShadingType 3 + /ColorSpace _colorSpace + _rgbInCMYK{ + /Function [ + _cData sampFunc + _mData sampFunc + _yData sampFunc + _kData sampFunc + ] + }{ + /Function + bd + /FunctionType 3 + /Domain [0 1] + /Functions _rampFuncsArray + /Bounds _boundsArray + /Encode _encodeArray + ed + }ifelse + /Extend [_lastFill _firstFill] + /Domain [0 1] + /Coords [_xHi _rampLen mul _yHi _rampLen mul _endCoord 0 0 _beginCoord] + ed + shfill + + _radHilite{ + _xHi _rampLen mul _yHi _rampLen mul translate + }if + }def + + % + /sampFunc{ + /_tmp exch pt + bd + _tmp length 1 eq { + _tmp 0 get + /_tmp 2 string pt + dup _tmp 0 3 -1 roll put + _tmp 1 3 -1 roll put + }if + /FunctionType 0 + /Order 1 + /Size [_tmp length] + /Domain [0 1] + /BitsPerSample 8 + /DataSource _tmp + /Range [0 1] + ed + }def + + /fillRamp{ + + + /_invert _midPoint 0.5 lt pt + _rampIndex _maxRampIndex eq { + initShFill + }if + + getRampColorSpace + + _colorSpace null eq{ + /_colorSpace _rampColorSpace pt + }{ + _colorSpace _rampColorSpace ne _rgbInCMYK or{ + /_index _index 1 + _gradType 0 eq{ + sub pt + linealShFill + }{ + add pt + radialShFill + }ifelse + initShFill + /_colorSpace _rampColorSpace pt + } if + }ifelse + /_endCoord _endPoint pt + /_rgbInCMYK false pt + _producingSeps _forceToCMYK or _rgbRamp and { + _spotColor{ + _renderCMYK + }{ + _isCMYKSep + }ifelse + }{ + false + }ifelse + { + _compositeJob{ + /_rgbInCMYK true pt + _cyanData _magentaData _yellowData _blackData _nSamples 4 expandColor + dup length string copy /_kData exch pt + dup length string copy /_yData exch pt + dup length string copy /_mData exch pt + dup length string copy /_cData exch pt + }{ + _rampFuncsArray _index + _cyanPlate{_cyanData}if + _magentaPlate{_magentaData}if + _yellowPlate{_yellowData}if + _blackPlate{_blackData}if + _nSamples expandOne + sampFunc + dup begin /Decode [1 0] def end + put + /_invert false pt + }ifelse + }{ + _rampFuncsArray _index + bd + /FunctionType 2 + /Domain [0 1] + /N 0.5 log _invert{1 _midPoint sub}{_midPoint}ifelse log div + _gradType 0 eq{ + _invert{/C1}{/C0}ifelse _C0 + _invert{/C0}{/C1}ifelse _C1 + }{ + _invert{/C0}{/C1}ifelse _C1 + _invert{/C1}{/C0}ifelse _C0 + }ifelse + ed + put + }ifelse + + _rampIndex 1 ne{ + _boundsArray _index _gradType 1 eq{1 sub}if _endCoord put + } if + + 0 1 _invert {exch}if + _encodeArray _index 2 mul 1 add 3 -1 roll put + _encodeArray _index 2 mul 3 -1 roll put + _rampIndex 1 eq { + /_lastFill true pt + _gradType 0 eq{ + linealShFill + }{ + radialShFill + }ifelse + }if + /_index _index 1 + _gradType 0 eq{ + add pt + }{ + sub pt + }ifelse + }def +}def +/initializeComposite{ + /bwImage{ + pop /_image load 5 execImage + }def + /rampImage{ + _enabledSmoothShade{ + fillRamp + }{ + _color{ + _nSamples setImageParms + + + _rgbRamp _forceToCMYK not and{ + _redData _greenData _blueData _nSamples 3 expandColor + true 3 null ncolorimage + }{ + _cyanData _magentaData _yellowData _blackData _nSamples 4 expandColor + true 4 null ncolorimage + }ifelse + }{ + _nSamples setImageParms _blackData null bwImage + }ifelse + }ifelse + }def + /setCStop{ + /_colorStyle exch pt + _colorStyle 0 eq{ + 1 exch sub + 0 0 0 + 4 -1 roll + }if + + _colorStyle 2 eq{ + _forceToCMYK{ + 3 npop setcmykcolor + }{ + setrgbcolor 4 npop + }ifelse + }if + + _colorStyle 3 eq{ + 1 exch sub /_tmp xp + pop + 4{ + _tmp mul 4 1 roll + }repeat + }if + + _colorStyle 4 eq{ + _forceToCMYK{ + 6 npop setcmykcolor + }{ + 3 -1 roll pop pop + 1 exch sub /_tmp xp + 3{ + 1 exch sub _tmp mul 1 exch sub 3 1 roll + }repeat + setrgbcolor + 4 npop + }ifelse + }if + _colorStyle 2 ne _colorStyle 4 ne and{ + null nsetcustomcolor + }if + }def + /nsetcustomcolor + { + pop setcmykcolor + }def + /nsetcustomcolorend + { + }def + /ncolorimage{ + pop + /_colorimage load 10 execImage + }def + _noImage not _level2PS not and{ + /linealFill{ + 8 setImageParms + _color{ + currentcmykcolor + 4{ + makeByte8 4 1 roll + }repeat + true 4 null ncolorimage + }{ + currentgray makeByte8 null bwImage + }ifelse + }def + }if + /getRampColorSpace{ + _nSamples 1 gt{ + /_ndx 0 pt + [blendColor] cvx exec + }if + /_C0 [currentcolor] pt + /_C0_Space currentcolorspace pt + + _nSamples 1 gt{ + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + }if + /_C1 [currentcolor] pt + /_C1_Space currentcolorspace pt + + /_rampColorSpace _C0_Space pt + + _spotColor{ + nsetcustomcolorend + }if + }def +}def +/npop{ + {pop}repeat +}def +/xd{ + exch def +}def +/nd{ + null def +}def +/pt{ + AGM_Gradient_private 3 1 roll put +}def +/xp{ + exch pt +}def +/xput{ + dup load dup length exch maxlength eq{ + dup dup load dup + length 2 mul dict copy def + }if + load begin + def + end +}def +/mySave{ + save /_sSave xp +}def +/myRestore{ + _sSave type /savetype eq{ + _sSave restore + }if +}def +/gMark{ + counttomark 2 add -1 roll +}def +/execImage{ + /_tmp xp + { + exec + }stopped{ + $error /errorname get /undefinedresult ne{ + stop + }{ + _tmp npop + }ifelse + }if +}def +/pushBSpace{ + newpath gsave + _bUMatrix astore concat +}def +/popBSpace{ + grestore +}def +/makeByte8{ + /_tmp 0 pt + 255 mul cvi + 8 string 8{ + dup _tmp 3 index put + /_tmp _tmp 1 add pt + }repeat + exch pop +}def +/setImageParms{ + 1 8 2 index 0 0 1 0 0 _imageMatrix astore +}def +/linealFill{ + 0 0 1 1 rectfill +}def +/testCMYKColorThrough{ + gsave + setcmykcolor currentcmykcolor + grestore + add add add 0 ne +}def +/expandOne { + /_tmp xp + dup type /stringtype ne{ + _tmp string + exch + dup 0 ne{ + 255 mul cvi + 0 1 _tmp 1 sub{ + 3 copy + exch put pop + }for + }if + pop + }if +}def +/expandColor{ + /_channels xp + /_len xp + _channels{ + _len expandOne _channels 1 roll + }repeat +}def +/blendColor{ + + _color{ + _rgbRamp _producingSeps not and _forceToCMYK not and{ + _redData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _greenData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _blueData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + /setrgbcolor cvx + }{ + _cyanData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _magentaData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _yellowData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _blackData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + + _spotColor{ + _rampSD begin + /_rampSD cvx /begin cvx + + spot1 begin + tintImage dup type /stringtype eq{ + /_ndx cvx /get cvx _d255- /exch cvx /get cvx + }{ + dup null ne{ + name type /nametype ne{ + 1 exch sub + }if + }if + }ifelse + end + /spot1 cvx /tintValue 3 -1 /roll cvx /put cvx + + spot2 begin + tintImage dup type /stringtype eq{ + /_ndx cvx /get cvx _d255- /exch cvx /get cvx + }{ + dup null ne{ + name type /nametype ne{ + 1 exch sub + }if + }if + }ifelse + end + /spot2 cvx /tintValue 3 -1 /roll cvx /put cvx + /end cvx + end + /_rampSD cvx + /nsetcustomcolor cvx + }{ + /setcmykcolor cvx + }ifelse + }ifelse + }{ + _blackData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + + _enabledSmoothShade{ + 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx /setcmykcolor cvx + }{ + /setgray cvx + }ifelse + }ifelse +}def +/useRectImage{ + _subSampleOK _enabledSmoothShade not and{ + { + mark + 0 1 dtransform atan cvi 90 mod 0 eq + 1 0 dtransform atan cvi 90 mod 0 eq + } stopped + { + cleartomark + false + } + { + and exch pop + } ifelse + }{ + false + }ifelse +}def +/linealImage{ + _noImage{ + rectImage + }{ + _producingSeps{ + AGM_Gradient_Sep/AGM_Gradient_Sep_private get + /rampImage get exec + }{ + useRectImage{ + rectImage + }{ + rampImage + }ifelse + }ifelse + }ifelse +}def +/linealRamp{ + pushBSpace + _ramp{ + linealImage + }{ + linealFill + }ifelse + popBSpace + /_rampIndex _rampIndex 1 sub pt + _rampIndex 0 gt{ + getRampData + }if +}def +/radialGrad{ + /_usingShells currentoverprint _producingSeps and _usingShells or pt + /_firstShell true pt + _enabledSmoothShade not{ + currentoverprint _producingSeps and{ + + newpath + clippath pathbbox + 1 add 4 1 roll + 1 add 4 1 roll + 1 sub 4 1 roll + 1 sub 4 1 roll + _bbox astore pop + + newpath + _bbox 0 get _bbox 1 get moveto + _bbox 2 get _bbox 1 get lineto + _bbox 2 get _bbox 3 get lineto + _bbox 0 get _bbox 3 get lineto + closepath + 6 copy + gsave _bUMatrix astore concat + 1 0 moveto 0 0 1 0 360 arc closepath + eoclip fill + popBSpace + }{ + fill + }ifelse + }if + pushBSpace + + _radHilite{ + _xHi _yHi _bUMatrix idtransform /_yHi xp /_xHi xp + _rampPoint 1 lt{ + 1 _rampPoint sub dup _xHi mul exch _yHi mul translate + }if + }if + _rampIndex{ + radialRamp + /_rampIndex _rampIndex 1 sub pt + _rampIndex 0 gt{ + getRampData + }if + }repeat + + popBSpace + +}def +/getNSamples{ + 0 exch + { + dup type /stringtype eq{ + length exch pop exit + }if + pop + }forall + dup 0 eq{ + pop 1 + }if +}def +/getRampData{ + /_rampType gMark pt + /_color _rampType 0 gt pt + /_ccRGB _rampType 5 eq _rampType 6 eq or pt + /_rgbRamp _rampType 4 eq _ccRGB or pt + /_ccProcess _rampType 2 eq _rampType 3 eq or pt + _producingSeps{ + _rampSD initSpotDict + /_spotColor _ccProcess _ccRGB or pt + }{ + /_spotColor false pt + }ifelse + /_ramp true pt + 100 div /_rampPoint xp + 100 div /_midPoint xp + + dup /_colorStyle xp + _colorStyle 0 eq{ + 2 + }{ + _colorStyle 1 eq{ + 5 + }{ + _colorStyle 2 eq{ + 8 + }{ + _colorStyle 3 eq{ + _producingSeps{ + _rampSD /spot1 get begin + /name 3 index def + /spot_K 4 index def + /spot_Y 5 index def + /spot_M 6 index def + /spot_C 7 index def + end + }if + 7 + }{ + _producingSeps{ + _rampSD/spot1 get begin + /name 4 index def + /spot_K 8 index def + /spot_Y 9 index def + /spot_M 10 index def + /spot_C 11 index def + end + }if + 11 + } ifelse + }ifelse + }ifelse + }ifelse + /_tmp xp + _tmp index 100 div /_endPoint xp + + _gradType 1 eq{ + _tmp 1 add index 100 div /_midPoint xp + }if + + _producingSeps{ + _tmp 2 add index /_nextColorStyle xp + _nextColorStyle 3 eq{ + /_tmp _tmp 4 add pt + _tmp index dup + _rampSD/spot1 get /name get ne{ + _rampSD /spot2 get begin + /name xd + /spot_K _tmp 2 add index def + /spot_Y _tmp 3 add index def + /spot_M _tmp 4 add index def + /spot_C _tmp 5 add index def + end + }{ + pop + }ifelse + }if + _nextColorStyle 4 eq{ + /_tmp _tmp 5 add pt + _tmp index dup + _rampSD/spot1 get /name get ne{ + _rampSD /spot2 get begin + /name xd + /spot_K _tmp 5 add index def + /spot_Y _tmp 6 add index def + /spot_M _tmp 7 add index def + /spot_C _tmp 8 add index def + end + }{ + pop + }ifelse + }if + }if + _rampType 3 eq _rampType 6 eq or{ + /_tint2Data gMark pt + }if + _ccProcess _ccRGB or{ + /_tint1Data gMark pt + }if + _rgbRamp{ + /_blueData gMark pt + /_greenData gMark pt + /_redData gMark pt + }if + + _producingSeps{ + _ccProcess _ccRGB or{ + _rampType 3 eq _rampType 6 eq or{ + _rampSD /spot2 get begin + /tintImage _gradType 0 eq{ + _tint2Data + }{ + _tint1Data + }ifelse + def + name null eq{ + /name /Black def + }if + end + }if + _rampSD /spot1 get begin + /tintImage _gradType 0 eq _rampType 2 eq or _rampType 5 eq or{ + _tint1Data + }{ + _tint2Data + }ifelse + def + _rampType 2 eq _rampType 5 eq or{ + name null eq{ + /name _rampSD/spot2 get /name get def + /spot_C _rampSD/spot2 get /spot_C get def + /spot_M _rampSD/spot2 get /spot_M get def + /spot_Y _rampSD/spot2 get /spot_Y get def + /spot_K _rampSD/spot2 get /spot_K get def + _rampSD/spot2 get /name null put + }if + }{ + name null eq{ + /name /Black def + }if + }ifelse + end + }if + }if + /_blackData gMark pt + _rampType 0 gt{ + counttomark 4 add -3 roll + /_yellowData xp + /_magentaData xp + /_cyanData xp + }if + _ramp{ + /_nSamples + [ + _rampType 0 eq {_blackData}if + _rampType 1 eq {_cyanData _magentaData _yellowData _blackData}if + _rampType 2 eq {_cyanData _magentaData _yellowData _blackData _tint1Data}if + _rampType 3 eq {_cyanData _magentaData _yellowData _blackData _tint1Data _tint2Data}if + _rampType 4 eq {_cyanData _magentaData _yellowData _blackData _redData _greenData _blueData}if + _rampType 5 eq {_cyanData _magentaData _yellowData _blackData _redData _greenData _blueData _tint1Data}if + _rampType 6 eq {_cyanData _magentaData _yellowData _blackData _redData _greenData _blueData _tint1Data _tint2Data}if + ] getNSamples pt + _enabledSmoothShade not {/_ramp _nSamples 1 gt pt} if + } if + + setCStop +}def +/rectImage{ + gsave + /_sInc 1 pt + /_bInc 1 _nSamples div pt + /_nSubSamples _nSamples pt + /_optimize false pt + + _subSampleOK{ + /_uRampLen 1 0 dtransform _dUserSpace idtransform dup mul exch dup mul add sqrt pt + /_pChange _uRampLen 0 eq{0}{_nSamples _uRampLen div}ifelse pt + + _pChange .5 gt dup /_optimize xp{ + /_nSubSamples _uRampLen 2 div round cvi dup 1 le{pop 2}if pt + /_bInc 1 _nSubSamples div pt + /_sInc _nSamples 1 sub _nSubSamples 1 sub div pt + }if + }if + 0 + _nSubSamples + [ + /dup cvx + _optimize { + /round cvx /cvi cvx + } if + /_ndx /exch cvx /pt cvx + blendColor + 0 0 _bInc 1 /rectfill cvx + _bInc 0 /translate cvx + _sInc /add cvx + ] cvx + bind + repeat + pop + _spotColor{ + nsetcustomcolorend + }if + grestore +}def +/radialInit{ + /_nRadSamples _nSamples dup 0 eq{pop 1}if pt + /_sInc -1 pt + /_rampLen _rampPoint _endPoint sub pt + /_bInc _rampLen _nSamples div neg pt + /_optimize false pt + _subSampleOK{ + /_uRampLen + _rampLen 0 dtransform _dUserSpace idtransform dup mul exch dup mul add sqrt + 0 _rampLen dtransform _dUserSpace idtransform dup mul exch dup mul add sqrt + 2 copy lt{ + exch + }if pop + pt + /_pChange + _uRampLen 0 eq{ + 0 + }{ + _nSamples _uRampLen div + }ifelse + pt + _pChange .5 gt dup /_optimize xp{ + /_nRadSamples _uRampLen 2 div round cvi dup 1 le{pop 2}if pt + /_bInc _rampLen _nRadSamples div neg pt + /_sInc _nSamples 1 sub _nRadSamples 1 sub div neg pt + }if + }if + _radHilite{ + /_xBCInc _xHi _rampLen mul _nRadSamples div pt + /_yBCInc _yHi _rampLen mul _nRadSamples div pt + }if +}def +/radialRamp{ + _enabledSmoothShade{ + fillRamp + }{ + /_saveMatrix _saveMatrix currentmatrix def + + radialInit + + % + % + true + _producingSeps _rgbRamp not and{ + _nSamples 1 gt{ + pop + /_ndx 0 pt + [blendColor] cvx exec + currentInkN + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + currentInkN + or + }if + }if + { + _rampPoint + + _nSamples 1 sub + + _nRadSamples + [ + /dup cvx + + _optimize{ + /round cvx /cvi cvx + }if + + /_ndx /exch cvx /pt cvx + + _usingShells{ + /_firstShell cvx{ + /_firstShell false pt + }{ + 0 0 3 index 360 0 arcn fill + }/ifelse cvx + }if + + blendColor + + _usingShells{ + 0 0 3 /index cvx 0 360 /arc cvx + }{ + 0 0 3 /index cvx 0 360 /arc cvx /fill cvx + }ifelse + + /exch cvx _bInc /add cvx /exch cvx + + _sInc /add cvx + + _radHilite{ + _xBCInc _yBCInc /translate cvx + }if + ] cvx bind + repeat + + pop pop + }{ + _usingShells{ + 0 0 _rampPoint 360 0 arcn fill + }if + }ifelse + + _saveMatrix setmatrix + + _radHilite{ + _xHi _rampLen mul _yHi _rampLen mul translate + }if + + _usingShells _rampIndex 1 eq and{ + fill + }if + + _spotColor{ + nsetcustomcolorend + }if + }ifelse +}def +end +end +defaultpacking setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 53 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin +/initialize { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 { + dup type /arraytype eq { + dup xcheck { + bind + } if + } if + pop pop + } forall +} def +/terminate { end } def +currentdict /Adobe_ColorImage_AI6_Vars known not { + /Adobe_ColorImage_AI6_Vars 41 dict def +} if +Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /_newproc null def + /_proc1 null def + /_proc2 null def + /sourcearray 4 array def + /_ptispace null def + /_ptiname null def + /_pti0 0 def + /_pti1 0 def + /_ptiproc null def + /_ptiscale 0 def + /_pticomps 0 def + /_ptibuf 0 string def + /_gtigray 0 def + /_cticmyk null def + /_rtirgb null def + /XIEnable true def + /XIType 0 def + /XIEncoding 0 def + /XICompression 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIRowBytes 0 def + /XIFile null def + /XIBuffer1 null def + /XIBuffer2 null def + /XIBuffer3 null def + /XIDataProc null def + /XIColorSpace /DeviceGray def + /XIColorValues 0 def + /XIPlateList false def +end +/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def +/ci6image systemdict /image get def +/ci6curtransfer systemdict /currenttransfer get def +/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def +/ci6foureq { + 4 index ne { + pop pop pop false + }{ + 4 index ne { + pop pop false + }{ + 4 index ne { + pop false + }{ + 4 index eq + } ifelse + } ifelse + } ifelse +} def +/ci6testplate { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /setcmykcolor where { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + 1 0 0 0 ci6foureq { + /plateindex 0 def + }{ + 0 1 0 0 ci6foureq { + /plateindex 1 def + }{ + 0 0 1 0 ci6foureq { + /plateindex 2 def + }{ + 0 0 0 1 ci6foureq { + /plateindex 3 def + }{ + 0 0 0 0 ci6foureq { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end +} def +/ci6concatprocs { + /packedarray where { + pop dup type /packedarraytype eq 2 index type + /packedarraytype eq or + }{ + false + } ifelse + { + /_proc2 exch cvlit def + /_proc1 exch cvlit def + _proc1 aload pop + _proc2 aload pop + _proc1 length + _proc2 length add + packedarray cvx + }{ + /_proc2 exch cvlit def + /_proc1 exch cvlit def + /_newproc _proc1 length _proc2 length add array def + _newproc 0 _proc1 putinterval + _newproc _proc1 length _proc2 putinterval + _newproc cvx + } ifelse +} def +/ci6istint { + type /arraytype eq +} def +/ci6isspot { + dup type /arraytype eq { + dup length 1 sub get /Separation eq + }{ + pop false + } ifelse +} def +/ci6spotname { + dup ci6isspot {dup length 2 sub get}{pop ()} ifelse +} def +/ci6altspace { + aload pop pop pop ci6colormake +} def +/ci6numcomps { + dup /DeviceGray eq { + pop 1 + }{ + dup /DeviceRGB eq { + pop 3 + }{ + /DeviceCMYK eq { + 4 + }{ + 1 + } ifelse + } ifelse + } ifelse +} def +/ci6marksplate { + dup /DeviceGray eq { + pop plateindex 3 eq + }{ + dup /DeviceRGB eq { + pop plateindex 5 ne + }{ + dup /DeviceCMYK eq { + pop plateindex 5 ne + }{ + dup ci6isspot { + /findcmykcustomcolor where { + pop + dup length 2 sub get + 0.1 0.1 0.1 0.1 5 -1 roll + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop plateindex 5 ne + } ifelse + }{ + pop plateindex 5 ne + } ifelse + } ifelse + } ifelse + } ifelse +} def +/ci6colormake { + dup ci6numcomps + exch 1 index 2 add 1 roll + dup 1 eq {pop}{array astore} ifelse + exch +} def +/ci6colorexpand { + dup ci6spotname exch + dup ci6istint { + ci6altspace + exch 4 1 roll + }{ + 1 3 1 roll + } ifelse +} def +/ci6colortint { + dup /DeviceGray eq { + 3 1 roll 1 exch sub mul 1 exch sub exch + }{ + dup /DeviceRGB eq { + 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch + }{ + dup /DeviceCMYK eq { + 3 1 roll {1 index mul exch} forall pop 4 array astore exch + }{ + 3 1 roll mul exch + } ifelse + } ifelse + } ifelse +} def +/ci6colortocmyk { + dup /DeviceGray eq { + pop 1 exch sub 0 0 0 4 -1 roll 4 array astore + }{ + dup /DeviceRGB eq { + pop aload pop _rgbtocmyk 4 array astore + }{ + dup /DeviceCMYK eq { + pop + }{ + ci6altspace ci6colortint ci6colortocmyk + } ifelse + } ifelse + } ifelse +} def +/ci6makeimagedict { + 7 dict begin + /ImageType 1 def + /Decode exch def + /DataSource exch def + /ImageMatrix exch def + /BitsPerComponent exch def + /Height exch def + /Width exch def + currentdict end +} def +/ci6stringinvert { + 0 1 2 index length 1 sub { + dup 2 index exch get 255 exch sub 2 index 3 1 roll put + } for +} def +/ci6stringknockout { + 0 1 2 index length 1 sub { + 255 2 index 3 1 roll put + } for +} def +/ci6stringapply { + 0 1 4 index length 1 sub { + dup + 4 index exch get + 3 index 3 1 roll + 3 index exec + } for + pop exch pop +} def +/ci6walkrgbstring { + 0 3 index + dup length 1 sub 0 3 3 -1 roll { + 3 getinterval {} forall + 5 index exec + 3 index + } for + + 5 {pop} repeat +} def +/ci6walkcmykstring +{ + 0 3 index + dup length 1 sub 0 4 3 -1 roll { + 4 getinterval {} forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + +} def +/ci6putrgbtograystr +{ + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add +} def +/ci6putcmyktograystr +{ + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add +} def +/ci6rgbtograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putrgbtograystr load exch + ci6walkrgbstring + end +} def +/ci6cmyktograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putcmyktograystr load exch + ci6walkcmykstring + end +} def +/ci6separatecmykproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + + XIBuffer3 + + 0 2 index + + plateindex 4 2 index length 1 sub { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + pop pop exch pop + end +} def + +/ci6compositeimage { + dup 1 eq { + pop pop image + }{ + /ci6colorimage load null ne { + ci6colorimage + }{ + 3 1 roll pop + sourcearray 0 3 -1 roll put + 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load + image + } ifelse + } ifelse +} def +/ci6knockoutimage { + gsave + 0 ci6curtransfer exec 1 ci6curtransfer exec + eq { + 0 ci6curtransfer exec 0.5 lt + }{ + 0 ci6curtransfer exec 1 ci6curtransfer exec gt + } ifelse + {{pop 0}}{{pop 1}} ifelse + systemdict /settransfer get exec + ci6compositeimage + grestore +} def +/ci6drawimage { + ci6testplate -1 eq { + pop ci6compositeimage + }{ + dup type /arraytype eq { + dup length plateindex gt {plateindex get}{pop false} ifelse + }{ + { + true + }{ + dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse + } ifelse + } ifelse + { + dup 1 eq { + pop pop ci6image + }{ + dup 3 eq { + ci6compositeimage + }{ + pop pop + sourcearray 0 3 -1 roll put + /ci6separatecmykproc load + ci6image + } ifelse + } ifelse + }{ + ci6curoverprint { + 7 {pop} repeat + }{ + ci6knockoutimage + } ifelse + } ifelse + } ifelse +} def +/ci6proctintimage { + /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store + /_pticomps _ptispace ci6numcomps store + /_ptiscale _pti1 _pti0 sub store + level2? { + _ptiname length 0 gt version cvr 2012 ge and { + [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace + [_pti0 _pti1] ci6makeimagedict ci6image + }{ + [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace + [0 255] ci6makeimagedict ci6image + } ifelse + }{ + _pticomps 1 eq { + { + dup + { + 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put + } ci6stringapply + } ci6concatprocs ci6image + }{ + { + dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse + _ptibuf { + exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc + _pticomps 2 add -2 roll + _pticomps 1 sub -1 0 { + 1 index add 2 index exch + 5 -1 roll + 255 mul cvi put + } for + pop pop + } ci6stringapply + } ci6concatprocs false _pticomps + /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse + } ifelse + } ifelse +} def +/ci6graytintimage { + /_gtigray 5 -1 roll store + {1 _gtigray sub mul 1 exch sub} 4 1 roll + /DeviceGray ci6proctintimage +} def +/ci6cmyktintimage { + /_cticmyk 5 -1 roll store + {_cticmyk {1 index mul exch} forall pop} 4 1 roll + /DeviceCMYK ci6proctintimage +} def +/ci6rgbtintimage { + /_rtirgb 5 -1 roll store + {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll + /DeviceRGB ci6proctintimage +} def +/ci6tintimage { + ci6testplate -1 eq { + ci6colorexpand + 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll + dup /DeviceGray eq { + pop ci6graytintimage + }{ + dup /DeviceRGB eq { + pop ci6rgbtintimage + }{ + pop ci6cmyktintimage + } ifelse + } ifelse + }{ + dup ci6marksplate { + plateindex 5 lt { + ci6colortocmyk plateindex get + dup 0 eq ci6curoverprint and { + 7 {pop} repeat + }{ + 1 exch sub + exch {1 0}{0 1} ifelse () ci6graytintimage + } ifelse + }{ + pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage + } ifelse + }{ + ci6curoverprint { + 8 {pop} repeat + }{ + pop pop pop + {pop 1} 0 1 () /DeviceGray ci6proctintimage + } ifelse + } ifelse + } ifelse +} def +/XINullImage { +} def +/XIImageMask { + XIImageWidth XIImageHeight false + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + imagemask +} def +/XIImageTint { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + XIType 3 eq XIColorValues XIColorSpace ci6tintimage +} def +/XIImage { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + false XIChannelCount XIPlateList ci6drawimage +} def +/XG { + pop pop +} def +/XF { + 13 {pop} repeat +} def +/Xh { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + /XIImageHeight exch def + /XIImageWidth exch def + /XIImageMatrix exch def + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + /_lp /null ddef + _fc + /_lp /imagemask ddef + end +} def +/XH { + Adobe_ColorImage_AI6_Vars begin + grestore + end +} def +/XIEnable { + Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put +} def +/XC { + Adobe_ColorImage_AI6_Vars begin + ci6colormake + /XIColorSpace exch def + /XIColorValues exch def + end +} def +/XIPlates { + Adobe_ColorImage_AI6_Vars begin + /XIPlateList exch def + end +} def +/XI +{ + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + cvi dup + 256 idiv /XICompression exch store + 256 mod /XIEncoding exch store + pop pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + XIBitsPerPixel 1 eq { + XIImageWidth 8 div ceiling cvi + }{ + XIImageWidth XIChannelCount mul + } ifelse + /XIRowBytes exch def + XIEnable { + /XIBuffer3 XIImageWidth string def + XICompression 0 eq { + /XIBuffer1 XIRowBytes string def + XIEncoding 0 eq { + {currentfile XIBuffer1 readhexstring pop} + }{ + {currentfile XIBuffer1 readstring pop} + } ifelse + }{ + /XIBuffer1 256 string def + /XIBuffer2 XIRowBytes string def + {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if} + /ASCII85Decode filter /DCTDecode filter + /XIFile exch def + {XIFile XIBuffer2 readstring pop} + } ifelse + /XIDataProc exch def + + XIType 1 ne { + 0 setgray + } if + XIType 1 eq { + XIImageMask + }{ + XIType 2 eq XIType 3 eq or { + XIImageTint + }{ + XIImage + } ifelse + } ifelse + }{ + XINullImage + } ifelse + /XIPlateList false def + grestore + end +} def +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0 +%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog) +%%Version: 1.3 0 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin +put +/_?cmyk false def +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_lineorientation 0 def +/_charorientation 0 def +/_yokoorientation 0 def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_shift [0 0] def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fontSize 0 def +/_fontAscent 0 def +/_fontDescent 0 def +/_fontHeight 0 def +/_fontRotateAdjust 0 def +/Ss 256 string def +Ss 0 (fonts/) putinterval +/_cnt 0 def +/_scale [1 1] def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_hfname 100 string def +/_hffound false def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_rgbf 3 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_rgbs 3 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/_lobyte 0 def +/_hibyte 0 def +/_cproc null def +/_cscript 0 def +/_hvax 0 def +/_hvay 0 def +/_hvwb 0 def +/_hvcx 0 def +/_hvcy 0 def +/_bitfont null def +/_bitlobyte 0 def +/_bithibyte 0 def +/_bitkey null def +/_bitdata null def +/_bitindex 0 def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 100 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + /_aicmykps where {pop /_?cmyk _aicmykps def}if + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/hswj +{ + dup stringwidth 3 2 roll + { + _hvwb eq { exch _hvcx add exch _hvcy add } if + exch _hvax add exch _hvay add + } cforall +} def +/vswj +{ + 0 0 3 -1 roll + { + dup 255 le + _charorientation 1 eq + and + { + dup cstring stringwidth 5 2 roll + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + 4 -1 roll sub exch + 3 -1 roll sub exch + } + { + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + _fontHeight sub + } ifelse + } cforall +} def +/swj +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hswj } { vswj } ifelse +} def +/sw +{ + 0 0 0 6 3 roll swj +} def +/vjss +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + gsave + 2 index false charpath + 6 index setmatrix stroke + grestore + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjss +{ + 4 1 roll + { + dup cstring + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jss +{ + _lineorientation 0 eq { hjss } { vjss } ifelse +} def +/ss +{ + 0 0 0 7 3 roll jss +} def +/vjsp +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + false charpath + currentpoint + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + 2 index false charpath + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjsp +{ + 4 1 roll + { + dup cstring + false charpath + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jsp +{ + matrix currentmatrix + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/sp +{ + matrix currentmatrix + 0 0 0 7 3 roll + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/_rgbtocmyk +{ + 3 + { + 1 exch sub 3 1 roll + } repeat + 3 copy 1 4 1 roll + 3 + { + 3 index 2 copy gt + { + exch + } if + pop 4 1 roll + } repeat + pop pop pop + 4 1 roll + 3 + { + 3 index sub + 3 1 roll + } repeat + 4 -1 roll +} def +/setrgbfill +{ + _rgbf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _rgbf aload pop setrgbcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/setrgbstroke +{ + _rgbs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _rgbs aload pop setrgbcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xa +{ + _?cmyk { + 3 npop k + }{ + setrgbfill 4 npop + } ifelse +} def +/XA +{ + _?cmyk { + 3 npop K + }{ + setrgbstroke 4 npop + } ifelse +} def +/Xs +{ + /_gf exch ddef + 5 npop + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setAIseparationgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XS +{ + /_gs exch ddef + 5 npop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setAIseparationgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xx +{ + exch + /_gf exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XX +{ + exch + /_gs exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/XK +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + K + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + XA + } ifelse +} def +/Xk +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + k + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + Xa + } ifelse +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/Xt { + pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + endString eq { + cleartomark stop + } if + }ifelse + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + }ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 6 npop + 7 2 roll + 5 npop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 4 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setrgbcolor +{ + 3 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +/XP +{ + 4 npop +} bind def +/XD +{ + pop +} bind def +end +setpacking +%%EndResource +%%BeginResource: procset Adobe_pattern_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Pattern Operators) +%%Version: 1.1 0 +%%CreationDate: (03/26/93) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 95 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/@ +{ +} def +/& +{ +} def +/dp +{ + dup null eq + { + pop + _dp 0 ne + { + 0 1 _dp 1 sub _dl mod + { + _da exch get 3 get + } for + _dp 1 sub _dl mod 1 add packedarray + _da 0 get aload pop 8 -1 roll 5 -1 roll pop 4 1 roll + definepattern pop + } if + } + { + _dp 0 ne _dp _dl mod 0 eq and + { + null dp + } if + 7 packedarray _da exch _dp _dl mod exch put + _dp _dl mod _da 0 get 4 get 2 packedarray + /_dp _dp 1 add def + } ifelse +} def +/E +{ + _ed begin + dup 0 get type /arraytype ne + { + 0 + { + dup 1 add index type /arraytype eq + { + 1 add + } + { + exit + } ifelse + } loop + array astore + } if + /_dd exch def + /_ury exch def + /_urx exch def + /_lly exch def + /_llx exch def + /_n exch def + /_y 0 def + /_dl 4 def + /_dp 0 def + /_da _dl array def + 0 1 _dd length 1 sub + { + /_d exch _dd exch get def + 0 2 _d length 2 sub + { + /_x exch def + /_c false def + /_r _d _x 1 add get cvlit def + _r _ ne + { + _urx _llx sub _ury _lly sub + [ + 1 0 0 1 0 0 + ] + [ + /save cvx + _llx neg _lly neg /translate cvx + _c + { + nc /begin cvx + } if + _r dup type /stringtype eq + { + cvx + } + { + { + exec + } /forall cvx + } ifelse + _c + { + /end cvx + } if + /restore cvx + ] cvx + /_fn 12 _n length add string def + _y _fn cvs pop + /_y _y 1 add def + _fn 12 _n putinterval + _fn _c false dp + _d exch _x 1 add exch put + } if + } for + } for + null dp + _n _dd /_pd + end + xput +} def +/fc +{ + _fm dup concatmatrix pop +} def +/p +{ + /_fm exch ddef + 9 -2 roll _pm translate fc + 7 -2 roll _pm scale fc + 5 -1 roll _pm rotate fc + 4 -2 roll exch 0 ne + { + dup _pm rotate fc + 1 -1 _pm scale fc + neg _pm rotate fc + } + { + pop + } ifelse + dup _pm rotate fc + exch dup sin exch cos div 1 0 0 1 0 6 2 roll + _pm astore fc + neg _pm rotate fc + _pd exch get /_fdd exch ddef + /_pf + { + save + /_doClip 0 ddef + 0 1 _fdd length 1 sub + { + /_fd exch _fdd exch get ddef + _fd + 0 2 _fd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _fc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _fm + patternfill + } + { + pop + fill + } ifelse + grestore + pop + } for + pop + } for + restore + newpath + } ddef + /_psf + { + save + /_doClip 0 ddef + 0 1 _fdd length 1 sub + { + /_fd exch _fdd exch get ddef + _fd + 0 2 _fd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _fc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _fm + 9 copy 6 npop patternashow + } + { + pop + 6 copy 3 npop hvashow + } ifelse + grestore + pop + } for + pop + } for + restore + sw rmoveto + } ddef + /_pjsf + { + save + /_doClip 0 ddef + 0 1 _fdd length 1 sub + { + /_fd exch _fdd exch get ddef + _fd + 0 2 _fd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _fc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _fm + 12 copy 6 npop patternawidthshow + } + { + pop 9 copy 3 npop hvawidthshow + } ifelse + grestore + pop + } for + pop + } for + restore + swj rmoveto + } ddef + /_lp /none ddef +} def +/sc +{ + _sm dup concatmatrix pop +} def +/P +{ + /_sm exch ddef + 9 -2 roll _pm translate sc + 7 -2 roll _pm scale sc + 5 -1 roll _pm rotate sc + 4 -2 roll exch 0 ne + { + dup _pm rotate sc + 1 -1 _pm scale sc + neg _pm rotate sc + } + { + pop + } ifelse + dup _pm rotate sc + exch dup sin exch cos div 1 0 0 1 0 6 2 roll + _pm astore sc + neg _pm rotate sc + _pd exch get /_sdd exch ddef + /_ps + { + save + /_doClip 0 ddef + 0 1 _sdd length 1 sub + { + /_sd exch _sdd exch get ddef + _sd + 0 2 _sd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _sc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _sm + patternstroke + } + { + pop stroke + } ifelse + grestore + pop + } for + pop + } for + restore + newpath + } ddef + /_pss + { + save + /_doClip 0 ddef + 0 1 _sdd length 1 sub + { + /_sd exch _sdd exch get ddef + _sd + 0 2 _sd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _sc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _sm + 10 copy 6 npop patternashowstroke + } + { + pop 7 copy 3 npop ss + } ifelse + grestore + pop + } for + pop + } for + restore + pop sw rmoveto + } ddef + /_pjss + { + save + /_doClip 0 ddef + 0 1 _sdd length 1 sub + { + /_sd exch _sdd exch get ddef + _sd + 0 2 _sd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _sc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _sm + 13 copy 6 npop patternawidthshowstroke + } + { + pop 10 copy 3 npop jss + } ifelse + grestore + pop + } for + pop + } for + restore + pop swj rmoveto + } ddef + /_lp /none ddef +} def +end +userdict /Adobe_pattern_AI5 18 dict dup begin +put +/initialize +{ + /definepattern where + { + pop + pop pop + } + { + begin + begin + Adobe_pattern_AI5 begin + Adobe_pattern_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + mark + cachestatus 7 1 roll pop pop pop pop exch pop exch + { + { + 10000 add + dup 2 index gt + { + exit + } if + dup setcachelimit + } loop + } stopped + cleartomark + end + + end + end + + Adobe_pattern_AI5 begin + } ifelse +} def +/terminate +{ + currentdict Adobe_pattern_AI5 eq + { + end + } if +} def +errordict +/nocurrentpoint +{ + pop + stop +} put +errordict +/invalidaccess +{ + pop + stop +} put +/patternencoding +256 array def +0 1 255 +{ + patternencoding exch ( ) 2 copy exch 0 exch put cvn put +} for +/definepattern +{ + 17 dict begin + /uniform exch def + /cache exch def + /key exch def + /procarray exch def + /mtx exch matrix invertmatrix def + /height exch def + /width exch def + /ctm matrix currentmatrix def + /ptm matrix def + /str 32 string def + /slice 9 dict def + slice /s 1 put + slice /q 256 procarray length div sqrt floor cvi put + slice /b 0 put + /FontBBox + [ + 0 0 0 0 + ] def + /FontMatrix mtx matrix copy def + /Encoding patternencoding def + /FontType 3 def + /BuildChar + { + exch + begin + /setstrokeadjust where {pop true setstrokeadjust} if + slice begin + dup q dup mul mod s idiv /i exch def + dup q dup mul mod s mod /j exch def + q dup mul idiv procarray exch get + /xl j width s div mul def + /xg j 1 add width s div mul def + /yl i height s div mul def + /yg i 1 add height s div mul def + uniform + { + 1 1 + } + { + width 0 dtransform + dup mul exch dup mul add sqrt dup 1 add exch div + 0 height dtransform + dup mul exch dup mul add sqrt dup 1 add exch div + } ifelse + width 0 cache + { + xl 4 index mul yl 4 index mul xg 6 index mul yg 6 index mul + setcachedevice + } + { + setcharwidth + } ifelse + gsave + scale + newpath + xl yl moveto + xg yl lineto + xg yg lineto + xl yg lineto + closepath + clip + newpath + end + end + exec + grestore + } def + key currentdict definefont + end +} def +/patterncachesize +{ + gsave + newpath + 0 0 moveto + width 0 lineto + width height lineto + 0 height lineto + closepath + patternmatrix setmatrix + pathbbox + exch ceiling 4 -1 roll floor sub 3 1 roll + ceiling exch floor sub + mul 1 add + grestore +} def +/patterncachelimit +{ + cachestatus 7 1 roll 6 npop 8 mul +} def +/patternpath +{ + exch dup begin + setfont + ctm setmatrix + concat + slice exch /b exch slice /q get dup mul mul put + FontMatrix concat + uniform + { + width 0 dtransform round width div exch round width div exch + 0 height dtransform round height div exch height div exch + 0 0 transform round exch round exch + ptm astore setmatrix + } + { + ptm currentmatrix pop + } ifelse + { + currentpoint + } stopped not + { + 2 npop + pathbbox + true + 4 index 3 index eq + 4 index 3 index eq + and + { + pop false + { + { + 2 npop + } + { + 3 npop true + } + { + 7 npop true + } + { + pop true + } pathforall + } stopped + { + 5 npop true + } if + } if + { + height div ceiling height mul 4 1 roll + width div ceiling width mul 4 1 roll + height div floor height mul 4 1 roll + width div floor width mul 4 1 roll + 2 index sub height div ceiling cvi exch + 3 index sub width div ceiling cvi exch + 4 2 roll moveto + FontMatrix mtx invertmatrix + dup dup 4 get exch 5 get rmoveto + ptm ptm concatmatrix pop + slice /s + patterncachesize patterncachelimit div ceiling sqrt ceiling cvi + dup slice /q get gt + { + pop slice /q get + } if + put + 0 1 slice /s get dup mul 1 sub + { + slice /b get add + gsave + 0 1 str length 1 sub + { + str exch 2 index put + } for + pop + dup + { + gsave + ptm setmatrix + 1 index str length idiv + { + str show + } repeat + 1 index str length mod str exch 0 exch getinterval show + grestore + 0 height rmoveto + } repeat + grestore + } for + 2 npop + } + { + 4 npop + } ifelse + } if + end +} def +/patternclip +{ + _eo {eoclip} {clip} ifelse +} def +/patternstrokepath +{ + strokepath +} def +/patternmatrix +matrix def +/patternfill +{ + dup type /dicttype eq + { + Adobe_pattern_AI5 /patternmatrix get + } if + gsave + patternclip + Adobe_pattern_AI5 /patternpath get exec + grestore + newpath +} def +/patternstroke +{ + dup type /dicttype eq + { + Adobe_pattern_AI5 /patternmatrix get + } if + gsave + patternstrokepath + true + { + { + { + newpath + moveto + } + { + lineto + } + { + curveto + } + { + closepath + 3 copy + Adobe_pattern_AI5 /patternfill get exec + } pathforall + 3 npop + } stopped + { + 5 npop + patternclip + Adobe_pattern_AI5 /patternfill get exec + } if + } + { + patternclip + Adobe_pattern_AI5 /patternfill get exec + } ifelse + grestore + newpath +} def +/vpatternawidthshow +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 5 index 5 index 5 index Adobe_pattern_AI5 /patternfill get exec + grestore + _fontRotateAdjust sub + moveto + _hvwb eq { _hvcx _hvcy rmoveto } if + _hvax _hvay rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + _hvax sub + 3 index _hvwb eq { _hvcx sub } if + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + gsave + 2 index false charpath + 6 index 6 index 6 index Adobe_pattern_AI5 /patternfill get exec + grestore + newpath moveto pop pop + } ifelse + } cforall + 3 npop +} def +/hpatternawidthshow +{ + { + dup cstring exch + gsave + 3 index eq { 5 index 5 index rmoveto } if + false charpath currentpoint + 9 index 9 index 9 index + Adobe_pattern_AI5 /patternfill get exec + grestore + newpath moveto + 2 copy rmoveto + } cforall + 8 npop +} def +/patternashow +{ +0 0 0 6 3 roll +patternawidthshow +} def +/patternawidthshow +{ + 6 index type /dicttype eq + { + Adobe_pattern_AI5 /patternmatrix get 7 1 roll + } if + _lineorientation 0 eq { hpatternawidthshow } { vpatternawidthshow } ifelse +} def +/vpatternawidthshowstroke +{ + 7 1 roll + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 3 index setmatrix + 6 index 6 index 6 index Adobe_pattern_AI5 /patternstroke get exec + grestore + _fontRotateAdjust sub + moveto + _hvwb eq { _hvcx _hvcy rmoveto } if + _hvax _hvay rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + _hvax sub + 3 index _hvwb eq { _hvcx sub } if + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + gsave + 2 index false charpath + 4 index setmatrix + 7 index 7 index 7 index Adobe_pattern_AI5 /patternstroke get exec + grestore + newpath moveto pop pop + } ifelse + } cforall + 4 npop +} def +/hpatternawidthshowstroke +{ + 7 1 roll + { + dup cstring exch + gsave + 3 index eq { 5 index 5 index rmoveto } if + false charpath currentpoint + 7 index setmatrix + 10 index 10 index 10 index + Adobe_pattern_AI5 /patternstroke get exec + grestore + newpath moveto + 2 copy rmoveto + } cforall + 9 npop +} def +/patternashowstroke +{ + 0 0 0 7 3 roll + patternawidthshowstroke +} def +/patternawidthshowstroke +{ + 7 index type /dicttype eq + { + patternmatrix /patternmatrix get 8 1 roll + } if + _lineorientation 0 eq { hpatternawidthshowstroke } { vpatternawidthshowstroke } ifelse +} def +end +setpacking +%%EndResource +%%BeginResource: procset Adobe_cshow 2.0 8 +%%Title: (Writing System Operators) +%%Version: 2.0 8 +%%CreationDate: (1/23/89) () +%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_cshow 14 dict dup begin put +/initialize +{ + Adobe_cshow begin + Adobe_cshow + { + dup xcheck + { + bind + } if + pop pop + } forall + end + Adobe_cshow begin +} def +/terminate +{ +currentdict Adobe_cshow eq + { + end + } if +} def +/cforall +{ + /_lobyte 0 ddef + /_hibyte 0 ddef + /_cproc exch ddef + /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef + { + /_lobyte exch ddef + _hibyte 0 eq + _cscript 1 eq + _lobyte 129 ge _lobyte 159 le and + _lobyte 224 ge _lobyte 252 le and or and + _cscript 2 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 3 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 25 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript -1 eq + or or or or and + { + /_hibyte _lobyte ddef + } + { + _hibyte 256 mul _lobyte add + _cproc + /_hibyte 0 ddef + } ifelse + } forall +} def +/cstring +{ + dup 256 lt + { + (s) dup 0 4 3 roll put + } + { + dup 256 idiv exch 256 mod + (hl) dup dup 0 6 5 roll put 1 4 3 roll put + } ifelse +} def +/clength +{ + 0 exch + { 256 lt { 1 } { 2 } ifelse add } cforall +} def +/hawidthshow +{ + { + dup cstring + show + _hvax _hvay rmoveto + _hvwb eq { _hvcx _hvcy rmoveto } if + } cforall +} def +/vawidthshow +{ + { + dup 255 le + _charorientation 1 eq + and + { + -90 rotate + 0 _fontRotateAdjust rmoveto + cstring + _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow + 0 _fontRotateAdjust neg rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + exch _hvay sub exch _hvax sub + 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if + 3 2 roll + cstring + dup stringwidth pop 2 div neg _fontAscent neg rmoveto + show + moveto + } ifelse + } cforall +} def +/hvawidthshow +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse +} def +/hvwidthshow +{ + 0 0 3 -1 roll hvawidthshow +} def +/hvashow +{ + 0 0 0 6 -3 roll hvawidthshow +} def +/hvshow +{ + 0 0 0 0 0 6 -1 roll hvawidthshow +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_shading_AI8 1.0 0 +%%Title: (Adobe Illustrator 8 Shading Procset) +%%Version: 1.0 0 +%%CreationDate: (12/17/97) () +%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /Adobe_shading_AI8 10 dict dup begin put +/initialize { + Adobe_shading_AI8 begin + Adobe_shading_AI8 bdprocs + Mesh /initialize get exec +} def +/terminate { + currentdict Adobe_shading_AI8 eq { + end + } if +} def +/bdprocs { + { + dup xcheck 1 index type /arraytype eq and { + bind + } if + pop pop + } forall +} def +/X! {pop} def +/X# {pop pop} def +/Mesh 40 dict def +Mesh begin +/initialize { + Mesh bdprocs + Mesh begin + /emulate? /AI8MeshEmulation where { + pop AI8MeshEmulation + }{ + systemdict /shfill known not + } ifelse def + end +} def +/bd { + shadingdict begin +} def +/paint { + emulate? { + end + }{ + /_lp /none ddef _fc /_lp /none ddef + + /AIColorSpace AIColorSpace tocolorspace store + /ColorSpace AIColorSpace topsspace store + + version_ge_3010.106 not systemdict /setsmoothness known and { + 0.0001 setsmoothness + } if + + composite? { + /DataSource getdatasrc def + Matrix concat + currentdict end + shfill + }{ + AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and { + end + }{ + /ColorSpace /DeviceGray store + /Decode [0 1 0 1 0 1] store + /DataSource getplatesrc def + Matrix concat + currentdict end + shfill + } ifelse + } ifelse + } ifelse +} def +/shadingdict 12 dict def +shadingdict begin + /ShadingType 6 def + /BitsPerCoordinate 16 def + /BitsPerComponent 8 def + /BitsPerFlag 8 def +end +/datafile null def +/databuf 256 string def +/dataptr 0 def +/srcspace null def +/srcchannels 0 def +/dstchannels 0 def +/dstplate 0 def +/srctodstcolor null def +/getplatesrc { + /srcspace AIColorSpace store + /srcchannels AIColorSpace getnchannels store + /dstchannels 1 store + /dstplate getplateindex store + /srctodstcolor srcspace makesmarks { + dstplate 4 eq { + {1 exch sub} + }{ + {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat} + } ifelse + }{ + {srcchannels {pop} repeat 1} + } ifelse store + /datafile getdatasrc store + /rdpatch168 load DataLength () /SubFileDecode filter +} def +/getdatasrc { + /rdcmntline load /ASCII85Decode filter +} def +/rdpatch168 { + /dataptr 0 store + 49 rdcount + 4 { + dup {pop srcchannels getint8} if + dup {pop srctodstcolor dstchannels putint8 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdpatch3216 { + /dataptr 0 store + 97 rdcount + 4 { + dup {pop srcchannels getint16} if + dup {pop srctodstcolor dstchannels putint16 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdcount { + dup 0 gt { + datafile databuf dataptr 4 -1 roll getinterval readstring + exch length dataptr add /dataptr exch store + }{ + true + } ifelse +} def +/getint8 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 255 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint8 { + dup dataptr add /dataptr exch store + dataptr exch + { + 1 sub exch + 255 mul cvi + databuf 2 index + 3 -1 roll put + } repeat + pop +} def +/getint16 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 256 mul datafile read} if + dup {pop add 65535 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint16 { + dup 2 mul dataptr add /dataptr exch store + dataptr exch + { + 2 sub exch + 65535 mul cvi dup + 256 idiv databuf 3 index 3 -1 roll put + 256 mod databuf 2 index 1 add 3 -1 roll put + } repeat + pop +} def +/srcbuf 256 string def +/rdcmntline { + currentfile srcbuf readline pop + (%) anchorsearch {pop} if +} def +/getplateindex { + 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall +} def +/aicsarray 4 array def +/aicsaltvals 4 array def +/aicsaltcolr aicsaltvals def +/tocolorspace { + dup type /arraytype eq { + mark exch aload pop + aicsarray 0 3 -1 roll put + aicsarray 1 3 -1 roll put + dup aicsarray 2 3 -1 roll put + gettintxform aicsarray 3 3 -1 roll put + counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store + aicsaltcolr astore pop pop + aicsarray + } if +} def +/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def +/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def +/gettintxform { + /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load +} def +/getnchannels { + dup type /arraytype eq {0 get} if + colorspacedict exch get begin Channels end +} def +/makesmarks { + composite? { + pop true + }{ + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin MarksPlate end + } ifelse +} def +/markingplate { + composite? { + pop true + }{ + dup type /arraytype eq { + dup length getplateindex gt {getplateindex get}{pop false} ifelse + } if + } ifelse +} def +/tocmyk { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToCMYK end +} def +/topsspace { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToPSSpace end +} def +/colorspacedict 5 dict dup begin + /DeviceGray 4 dict dup begin + /Channels 1 def + /MarksPlate {pop black?} def + /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def + /ToPSSpace {} def + end def + /DeviceRGB 4 dict dup begin + /Channels 3 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop _rgbtocmyk} def + /ToPSSpace {} def + end def + /DeviceCMYK 4 dict dup begin + /Channels 4 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop} def + /ToPSSpace {} def + end def + /Separation 4 dict dup begin + /Channels 1 def + /MarksPlate { + /findcmykcustomcolor where { + pop dup 1 exch ToCMYK 5 -1 roll 1 get + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace {} def + end def + /Process 4 dict dup begin + /Channels 1 def + /MarksPlate { + isCMYKSep? { + 1 exch ToCMYK 4 array astore getplateindex get 0 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace { + 4 array copy dup 0 /Separation put + } def + end def +end def +/isoverprint { + /currentoverprint where {pop currentoverprint}{_of} ifelse +} def +/version_ge_3010.106 { + version {cvr} stopped { + pop + false + }{ + 3010.106 ge + } ifelse +} def +end +end +defaultpacking setpacking +%%EndResource +%%EndProlog %%BeginSetup userdict /_useSmoothShade true put userdict /_aicmykps true put userdict /_forceToCMYK true put Adobe_level2_AI5 /initialize get exec +Adobe_cshow /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 AGM_Gradient /initializeAI get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_pattern_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_shading_AI8 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +%AI3_BeginRider currentpacking true setpacking setpacking %AI3_EndRider %AI5_Begin_NonPrinting Np %AI8_PluginGroupInfo (Adobe Path Blends) (Adobe Blends Plugin) (LiveBlends.aip) %AI8_PluginGroupInfo (Adobe Tracing Object) (Tracing) (TracingSuite.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe Calligraphic Brush Tool) (Adobe Calligraphic Brush Plugin) (CalligBrushTool.aip) %AI8_PluginGroupInfo (Adobe Flare Plugin) (Flare) (Flare.aip) %AI8_PluginGroupInfo (Adobe Symbolism) (Adobe Symbolism) (ParticleSystem.aip) %AI8_PluginGroupInfo (Adobe Deform Plugin) (Adobe Envelope Plugin) (Envelope and Warp.aip) %AI8_PluginGroupInfo (Pathfinder Suite) (Adobe Compound Shape) (PathFinderS.aip) %AI8_PluginGroupInfo (Adobe Planar Group) (Adobe Live Paint Plugin) (Live Paint.aip) %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np 5 Bn %AI5_BeginGradient: (Gray Linear Gradient) (Gray Linear Gradient) 0 7 Bd [ < 0A0B0C0D0D0E10111213131415161717191A1B1B1C1D1F202122232425262728292A2B2C2D2E2E2F 31323435363738393A3B3C3D3E3F41424344454648494A4B4C4D4E5051525354555758595A5C5D5E 60616364656668696A6B6C > < 070809090A0B0B0C0D0C0D0E0F1010121112131314151617161718191A1B1C1D1D1E1E1E1F202223 24252627262728292A2B2C2D2E2F3031303132333435363738393A3B3C3C3C3D3E3F414243444546 47484A494A4B4D4E4F5051 > < 0607070809090A0A0B0C0D0E0D0E0F0F111211121314141516161718191A1B1A1B1C1D1E1F201F20 212223242625262728292A2B2C2B2C2D2F303031323233343536373839393A3B3C3D3E3F403F4041 42444547484948494A4B4C > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010101 > < F1F0EFEEEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECECD CCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5 A4A3A2A1A09F9E9D9C9B9A > < F1F0EFEFEEEDECEBEAEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDDDCDBDAD9D8D7D6D5D4D4D3D2D1D0CF CECDCCCBCBCAC9C8C7C6C5C4C3C2C1C0C0BFBEBDBCBBBAB9B8B7B6B5B4B4B3B2B1B0AFAEADACABAA A9A8A7A7A6A5A4A3A2A1A0 > < F2F1F1F0EFEEEDEDECEBEAE9E9E8E7E6E5E4E4E3E2E1E0DFDFDEDDDCDBDAD9D9D8D7D6D5D4D3D3D2 D1D0CFCECDCDCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBFBEBDBCBBBAB9B8B8B7B6B5B4B3B2B1B1B0AF AEADACABAAA9A9A8A7A6A5 > 4 %_Br < 1A1918171615141211100E0D0C0B0A > < 11100F0E0D0D0C0C0C0B0B0A090807 > < 1111100F0E0D0C0B0B0A0909080706 > 0 < E2E3E4E5E6E7E8EAEBECEDEEEFF0F1 > < E4E5E6E7E8E9EAEBEBECEDEEEFF0F1 > < E5E6E7E8E9EAEBECECEDEEEFF0F1F2 > 4 %_Br < 54535251504F4E4C4B4A4948474644434241403F3E3D3C3B393836353432312F2E2D2C2B2A292827 262524232221201F1E1D1C1B1A > < 3C3B3A3938373635343433323130302F2E2D2C2B2A2928272625252524232221201F1E1D1C1C1B1A 19181717171615141413121111 > < 3D3C3C3B3A39383837363534333230302F2E2D2C2D2C2B2A29282725242322212021201F1E1D1C1B 1B1A1918161616151514131211 > 0 < ADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C8C9CACBCCCDCECFD0D1D2D3D4D5 D6D7D8D9DADBDCDDDEDFE0E1E2 > < B3B4B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCCCDCECFD0D1D2D3D4D5D6D7D8 D9DADBDCDCDDDEDFE0E1E2E3E4 > < B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C7C8C9CACBCCCDCECFD0D1D2D3D3D4D5D6D7D8D9 DADBDCDDDEDFDFE0E1E2E3E4E5 > 4 %_Br < 00000000000000000000000000000001010102020203030304040505050505060606070708080909 0A0A0A0A0B0C0C0D0D0E0E101011121213141415141617171819191A1B1B1C1D1E1E1F2021212223 24242526272728292A2B2B2C2D2E2F303132333536373838393A3C3D3E3F40414243434546474849 4A4B4C4E4F5051525354 > < 00000000000000000000000000000001000000010101020201020202030203030304040504050505 05050606070608070908090A0A0B0A0C0B0C0C0D0E0D0E0E0F101011111112131214141415161617 171718191A1A1B1C1D1C1D1E1F1F1F20222122232526252628292A2A2A2B2C2D2E2F302F30313233 343536363738393A3B3C > < 00000000000000000000000000000000000001010101020202020202030302030304040405040505 060607070708070908090A0A0B0B0C0B0D0C0E0D0E100F1010111211121413141415151616171718 19191A1B1B1B1C1D1C1E1F201F21222222242526252628292A292A2B2D2E2F2E2F30303233333435 363737393A3A3B3C3C3D > 0 < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F8F8F8F7F7F6F6F6F5F5F4F4F3F3 F2F2F1F1F0EFEFEEEEEDEDECECEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDEDEDDDCDBDBDAD9 D8D8D7D6D5D5D4D3D2D1D1D0CFCECDCCCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7 B6B5B4B3B2B1B0AFAEAD > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFCFBFBFBFAFAFAF9F9F9F8F8F7F7F7F6F6F5F5F4F4F4 F3F3F2F2F1F1F0F0EFEFEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDFDEDDDDDC DBDBDAD9D8D8D7D6D5D5D4D3D2D2D1D0CFCFCECDCCCBCBCAC9C8C7C6C6C5C4C3C2C1C0C0BFBEBDBC BBBAB9B9B8B7B6B5B4B3 > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F9F8F8F8F7F7F6F6F6F5F5F4F4 F3F3F2F2F1F1F1F0F0EFEEEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E2E1E0E0DFDEDEDD DCDCDBDAD9D9D8D7D7D6D5D4D4D3D2D1D1D0CFCECECDCCCBCACAC9C8C7C6C5C5C4C3C2C1C0C0BFBE BDBCBBBAB9B9B8B7B6B5 > 4 %_Br < 0A0A090908080706050504030201000000 > < 0707070605050504030302020100000000 > < 0606050505040403020202020100000000 > 0 < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F2F2F3F4F4F5F6F7F8F9F9FAFBFCFDFEFF > 4 %_Br < 1717161615151414131312121111100F0F0E0D0C0B0B0A > < 16161515141313121111110F0E0D0E0D0C0B0A0A090807 > < 1717161415141312111111100F0E0D0C0B0A0A08070706 > 0 < E5E5E6E6E7E7E8E8E9E9EAEAEBEBECEDEDEEEEEFF0F0F1 > < E1E1E2E2E3E4E4E5E6E6E7E8E9EAEAEBECEDEEEEEFF0F1 > < DFDFE0E1E1E2E3E4E5E5E6E7E8E9EAEBECEDEEEFF0F1F2 > 4 %_Br [ 0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 %_BS %_0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 Bs 0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 %_BS %_0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 Bs 0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 %_BS %_0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 Bs 0 0 0 0 1 1 1 2 64.5161 0.005 %_BS %_0 0 0 0 1 1 1 2 64.5161 0 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0.0025 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0 Bs 0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 %_BS %_0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Linear Gradient 1) (Linear Gradient 1) 0 2 Bd [ < 00000001020304050506070809090A0B0C0D0F10111213141516171818191A1B1C1C1D1F20212223 24252627292A2A2B2D2E2F30323334353637383A3B3C3D3E3F40424344454647484A4B4C4D4E4F51 52535455565658595B5C5D5F6061626364666768696A6B6C6D6E6F6F707172737475767778797A7B 7C7D7E7F7F8081828383848586878788898A8B8C8B8C8D8E8E8F9090919293949495969697989899 9A9A9B9C9C9D9D9E9E9F9FA0A0A1A1A2A2A3A3A4A4A4A5A5A6A6A7A7A8A8A9A9AAAAAAABABAAAAAB ABABABACACACACADADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2 > < 00000000010202030304040506060708090A0A0B0C0D0D0E0F1010111213141516171818191A1B1C 1D1D1E1F202122222324262728292A2B2C2D2E2E2F30313233343536373838393A3B3C3D3E3F4041 434445464648494A4C4D4E4F505152535455565758595A5A5B5C5D5E5F6061626364646566676869 6A6B6C6C6D6E6F6F70717272737475767778797A7B7C7C7D7E7F808081828383848586878788898A 8A8B8C8D8E8E8F8F9090919292939494959696979899999A9A9B9B9C9C9D9D9E9E9F9FA0A0A2A2A3 A3A3A4A4A5A5A6A6A7A7A7A8A8A9A9A9AAAAAAABABABACACAC > < 00000000010202030304040506060708090A0B0B0C0D0E0F1011121213141515161718191A1B1B1C 1D1E1F20202122232425262728292A2B2C2D2E2F30313233343536373738393A3B3C3D3E3F404142 434445464748494A4C4D4E4F505152535455565758595A5B5C5C5D5E5F6061616161626364656566 676869696A6B6B6C6D6E6E6F70717172737474757677777879797A7B7C7C7D7E7F7F808181828383 8485858686878888898A8B8B8C8D8D8E8E8F8F90909191929293939494959596969797989899999A 9A9B9B9C9C9C9D9D9E9E9E9F9F9FA0A0A1A1A1A1A2A2A2A3A3 > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000010101010101020202020203030304040505060606070708090A0A0B 0C0D0E0F0F101112131415161718191A1B1D1E1F20212324252728292B2C2E2F303233353637393B 3C3E4041434546484A4B4D4F51525456585A5C5E5F61636567696B6D6F717375777A7C7E80828587 898B8E90929497999B9DA0A2A4A6A8ABADAFB1B3B5B7B9BBBD > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9 D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1 B0AFAEADACACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A 898887868584838281807F7E7D7C7B7A79787776767574737271706F6E6D6C6B6A69686766656463 6261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3E3D3C 3B3A393837363534333231302F2E2D2C2B2A29282726252423 > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 37363534333231302F2E2D2C2B2A292827262524232221201F > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796959493929190908F8E8D8C8B8A89 8887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261 605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A39 3837363534333231302F2E2D2C2B2A29282726252423222120 > 4 %_Br [ 0 0 50 100 %_BS %_0 0 50 100 Bs 1 0 50 0 %_BS %_1 0 50 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Purple Radial Gradient) (Purple Radial Gradient) 1 3 Bd [ < 000000010202030304050505060707070809090A0A0C0D0D0E0F0F0F101112131313151616161718 1A1A1B1C1C1C1D1F202020212223252526272828292A2B2D2D2E2F3031313233343535373839393A 3B3C3D3D3E3F404141434445464647484A4B4B4D4E4F505152535455555758 > < 0000000102020303040405060708090A0A0B0D0E0F101112131415161718191A1B1C1B1C1D1E1F20 2022232325262728292A2B2C2D2E2F3032333435363738393A3B3C3D3E3F4041424345464748494A 4B4C4D4E4F5051525354555657595A5B5C5E6061626364666768696A6B6D6E > < 00000000000000000001000100010101010101010201020202020202010201020202030303020302 03030304030303030404040304030404040404040404040505050505050405060506050504050505 05050605050605060506050506050605050606070607060708070807070607 > 0 < FFFEFEFDFCFBFBFAF9F8F8F7F6F5F5F4F3F2F2F1F0EFEEEEEDECEBEBEAE9E8E7E7E6E5E4E4E3E2E1 E0E0DFDEDDDDDCDBDAD9D9D8D7D6D5D5D4D3D2D2D1D0CFCECECDCCCBCACAC9C8C7C6C6C5C4C3C3C2 C1C0BFBFBEBDBCBBBBBAB9B8B7B7B6B5B4B3B3B2B1B0AFAFAEADACABABAAA9 > < FFFEFDFCFBFAF9F9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDFDEDDDCDBDA D9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2 B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796959493 > < FFFEFEFDFDFCFCFBFBFAFAF9F9F8F7F7F6F6F5F5F4F4F3F2F2F1F1F0F0EFEFEEEDEDECECEBEBEAEA E9E8E8E7E7E6E6E5E4E4E3E3E2E2E1E0E0DFDFDEDEDDDDDCDBDBDADAD9D9D8D7D7D6D6D5D5D4D3D3 D2D2D1D1D0CFCFCECECDCDCCCBCBCACAC9C8C8C7C7C6C6C5C4C4C3C3C2C2C1 > 4 %_Br < 5858585959595A5B5B5C5C5D5D5D5E5E606061616262636365656666676769696A6A6B6C6D6D6F70 70717173737476767777797A7A7C7C7D7E7F80808183838485868788898A8A8C8D8E8F9091929494 959797999A9B9C9E9F9FA1A2A2A4A5A5A7A9A9AAACADADAEB0B0B2B3B4B4B6B7B9B9BABCBCBEBFC1 C1C2C4C5C5C7C8C9CACBCDCECECFD0 > < 6E6E6F6F6F7070717173737474767577787879797B7D7C7E7F7F80828283848486878788898B8B8C 8E8F8F909294939596989A999B9D9EA09FA1A2A4A5A5A7A8AAABADACAEAFB1B3B4B5B5B6B8B9BBBC BEBFC1C1C2C4C5C7C8CACBCCCECECFD1D2D3D5D6D7D9DADCDDDFE0E1E3E3E4E6E7E8EAEBECEEEFF1 F2F4F5F6F8F9FBFCFEFFFFFFFFFFFF > < 07070608080707070706080707080807080808080708080908080807090809090A09090A090A0A0B 0A0B0B0C0A0B0B0C0B0C0A0D0B0C0B0C0C0D0C0C0B0D0C0D0C0D0E0E0F0E0F0E0F0D100F0F111011 1011101213121312131213141315141516151615161516171617171819191A1B1A1B1B1C1D1C1D1C 1E1F1E202120212322242325262628 > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000001010101010101010101010101010101010102020202020202020203030304040405040504 05060506060607070707070809090B > < A9A9A9A8A8A8A7A7A7A6A6A5A5A5A4A4A3A3A2A2A1A1A0A09F9F9E9E9D9D9C9C9B9B9A9A99999897 979696959594939392929190908F8F8E8D8D8C8C8B8A8A8988888786868585848383828181807F7F 7E7D7D7C7B7B7A79787877767675747473727271706F6F6E6D6D6C6B6A6A69686767666565646362 6261605F5F5E5D5C5C5B5A59595857 > < 9393929292919190908F8F8E8E8D8D8C8B8B8A8A8988888786868584848382828180807F7E7D7D7C 7B7A7A7978777776757473737271706F6F6E6D6C6B6B6A6968676666656463626160605F5E5D5C5B 5A59585857565554535251504F4F4E4D4C4B4A49484746454443424140403F3E3D3C3B3A39383736 3534333231302F2E2D2C2B2A292827 > < C1C1C1C0C0C0C0BFBFBFBEBEBEBDBDBDBCBCBBBBBBBABAB9B9B9B8B8B7B7B6B6B5B5B5B4B4B3B3B2 B2B1B1B0B0AFAFAEAEADADACACABABAAAAA9A9A8A8A7A7A6A6A5A4A4A3A3A2A2A1A1A0A09F9E9E9D 9D9C9C9B9A9A99999898979696959594939392929191908F8F8E8E8D8C8C8B8A8A89898887878686 8584848382828180807F7F7E7D7D7C > 4 %_Br [ 0 0 0 0 1 1 1 2 50.7937 0 %_BS %_0 0 0 0 1 1 1 2 50.7937 0 Bs 0.345098 0.431373 0.027451 0 0.662745 0.576471 0.756863 2 57.3913 35.955 %_BS %_0.345098 0.431373 0.027451 0 0.662745 0.576471 0.756863 2 57.3913 35.955 Bs 0.815686 1 0.156863 0.043137 0.341176 0.152941 0.486275 2 51.0204 100 %_BS %_0.815686 1 0.156863 0.043137 0.341176 0.152941 0.486275 2 51.0204 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Radial Gradient 1) (Radial Gradient 1) 1 2 Bd [ < 00000001020304050506070809090A0B0C0D0F10111213141516171818191A1B1C1C1D1F20212223 24252627292A2A2B2D2E2F30323334353637383A3B3C3D3E3F40424344454647484A4B4C4D4E4F51 52535455565658595B5C5D5F6061626364666768696A6B6C6D6E6F6F707172737475767778797A7B 7C7D7E7F7F8081828383848586878788898A8B8C8B8C8D8E8E8F9090919293949495969697989899 9A9A9B9C9C9D9D9E9E9F9FA0A0A1A1A2A2A3A3A4A4A4A5A5A6A6A7A7A8A8A9A9AAAAAAABABAAAAAB ABABABACACACACADADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2 > < 00000000010202030304040506060708090A0A0B0C0D0D0E0F1010111213141516171818191A1B1C 1D1D1E1F202122222324262728292A2B2C2D2E2E2F30313233343536373838393A3B3C3D3E3F4041 434445464648494A4C4D4E4F505152535455565758595A5A5B5C5D5E5F6061626364646566676869 6A6B6C6C6D6E6F6F70717272737475767778797A7B7C7C7D7E7F808081828383848586878788898A 8A8B8C8D8E8E8F8F9090919292939494959696979899999A9A9B9B9C9C9D9D9E9E9F9FA0A0A2A2A3 A3A3A4A4A5A5A6A6A7A7A7A8A8A9A9A9AAAAAAABABABACACAC > < 00000000010202030304040506060708090A0B0B0C0D0E0F1011121213141515161718191A1B1B1C 1D1E1F20202122232425262728292A2B2C2D2E2F30313233343536373738393A3B3C3D3E3F404142 434445464748494A4C4D4E4F505152535455565758595A5B5C5C5D5E5F6061616161626364656566 676869696A6B6B6C6D6E6E6F70717172737474757677777879797A7B7C7C7D7E7F7F808181828383 8485858686878888898A8B8B8C8D8D8E8E8F8F90909191929293939494959596969797989899999A 9A9B9B9C9C9C9D9D9E9E9E9F9F9FA0A0A1A1A1A1A2A2A2A3A3 > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000010101010101020202020203030304040505060606070708090A0A0B 0C0D0E0F0F101112131415161718191A1B1D1E1F20212324252728292B2C2E2F303233353637393B 3C3E4041434546484A4B4D4F51525456585A5C5E5F61636567696B6D6F717375777A7C7E80828587 898B8E90929497999B9DA0A2A4A6A8ABADAFB1B3B5B7B9BBBD > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9 D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1 B0AFAEADACACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A 898887868584838281807F7E7D7C7B7A79787776767574737271706F6E6D6C6B6A69686766656463 6261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3E3D3C 3B3A393837363534333231302F2E2D2C2B2A29282726252423 > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 37363534333231302F2E2D2C2B2A292827262524232221201F > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796959493929190908F8E8D8C8B8A89 8887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261 605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A39 3837363534333231302F2E2D2C2B2A29282726252423222120 > 4 %_Br [ 1 0 50 0 %_BS %_1 0 50 0 Bs 0 0 50 100 %_BS %_0 0 50 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Red Linear Gradient) (Red Linear Gradient) 0 6 Bd [ < 3A39393838373736353534333332313130302F2E2E2D2C2B2B2A2928272726252423222120201F1E 1D1C1B1A191817161514131211100F0E0D0C0B0A09080605040302 > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFD > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFDFCFCF9F9F9F8 > < 2A2928272624232221201F1E1D1C1C1B1A19181716151413121110100F0E0D0C0C0A0A0908070606 050505040404040303030202020201010101010101010100000000 > < A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CBCCCDCECFD0D1 D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC > < 14141414141515151515151515161616161616161617171717171717171818181818181818181919 1919191919191A1A1A1A1A1A1A1A1B1B1B1B1B1B1B1B1C1C1C1C1C > < 1A1A1A1A1B1B1B1B1B1B1C1C1C1C1C1C1C1D1D1D1D1D1D1D1E1E1E1E1E1E1F1F1F1F1F1F1F202020 202020212121212121212222222222222223232323232324242424 > 4 %_Br < 23242526272728292A2B2B2C2D2E2E2F303131323333343535363737383839393A > 1 1 < 0B0C0C0D0E0F10101112131415161718191B1C1C1D1E1F2021222324262728292A > < CAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB8B7B6B5B4B3B2B1B0AFAEADACABAAA9 > < 181818181817171717171717171616161616161616151515151515151514141414 > < 1F1F1F1F1E1E1E1E1E1E1D1D1D1D1D1D1D1C1C1C1C1C1C1B1B1B1B1B1B1A1A1A1A > 4 %_Br < 0909090A0A0A0A0B0B0B0B0B0C0C0C0B0B0C0C0C0C0C0D0D0C0C0E0E0E0D0D0E0E0E0E0E0F0F0F0F 0F101010101011111111111211111111121212131314141414141515151514161615151515171717 161618181818181719191918181A1A1A1A1A1A1B1B1B1A1A1B1B1B1A1A1A1B1B1B1A1A1A1B1B1B1B 1B1B1C1C1C1B1B1C1C1C1D1D1C1C1E1D1D1D1D1D1E1E1E1E1E1D1D1E1E1E1D1D1D1D1E1E1E1D1D1D 1E1E1E1E1E1E1E1E1F1F1F1F1F1F1F2020201F1F1F1F1F2020202020202020212121212020202021 21212121212121212122222222222222222222232323232323232323232323232323232323232323 232323 > < 3E3F414243454647484A4B4C4D4E5051525354565758595B5C5D5D5E5F616263656668696A6B6D6E 6F7071737374757678797B7C7D7F80828183848687898A8C8D8D8F90929395969799999A9C9D9E9F A1A0A1A3A4A5A7A8A8A9ABACADAEAEB0B1B2B4B5B5B6B7B9BABABBBCBDBFBEC0C1C2C3C3C4C6C7C7 C8C9CACACBCCCDCECECFD0D1D1D2D3D3D4D5D6D6D7D8D9D9DBDCDCDDDEDEDFE0E0E1E2E3E3E4E5E5 E5E6E6E7E7E8E9E9EAEBEBECECEDEDEDEEEFEFF0F0F1F2F2F3F3F4F4F5F6F6F7F7F8F8F9F9FAFAFA FBFBFCFCFDFDFDFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 1F1F20212223242526272829292A292A2B2C2C2D2E2F2F303132343536373537373839393B3B3C3D 3E3F3E3F41424344454647464748494A4C4D4E4F4F505152535556555657585A5B5C5C5D5E606162 61636566676868696B6C6D6F6E6F717374737576787A797A7C7E7D7F80828483858788888A8B8D8D 8F90929294959796989A9A9C9EA09FA1A3A3A4A7A8A8AAACABADAFAFB0B3B2B4B6B5B7B9B9BABCBC BEBFBFC1C4C3C5C5C7C9C9CBCBCDCFCFD1D1D3D5D5D7D7D9D8DBDDDDDEDEE0E0E2E2E5E4E7E7E9E8 EBEBEDEDEFEFF2F1F4F4F6F6F9F8F8FBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000001010101010101010101010101 01010101010202020202020202020202020202020302030303030303040404040404040505050505 05050505050505050606060606060607070707070707070707070707070707080808080808080808 080808080808080808090909090909090909090A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B 0B0B0B > < F0F0F0EFEFEFEFEEEEEEEEEEEDEDEDEDEDECECECECECEBEBEBEBEAEAEAEAEAE9E9E9E9E9E8E8E8E8 E8E7E7E7E7E7E6E6E6E6E6E5E5E5E5E5E4E4E4E4E4E3E3E3E3E3E2E2E2E2E2E1E1E1E1E1E1E0E0E0 E0E0DFDFDFDFDFDFDEDEDEDEDEDDDDDDDDDDDDDCDCDCDCDCDBDBDBDBDBDBDADADADADADAD9D9D9D9 D9D9D8D8D8D8D8D8D7D7D7D7D7D7D6D6D6D6D6D6D5D5D5D5D5D5D5D4D4D4D4D4D4D4D3D3D3D3D3D3 D2D2D2D2D2D2D2D2D1D1D1D1D1D1D1D0D0D0D0D0D0D0D0CFCFCFCFCFCFCFCFCECECECECECECECECD CDCDCDCDCDCDCDCDCDCCCCCCCCCCCCCCCCCCCCCBCBCBCBCBCBCBCBCBCBCBCBCBCACACACACACACACA CACACA > < C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A4A3A2A1 A09F9E9D9D9C9B9A99989796959493929291908F8E8D8C8B8A8A89888786858483828281807F7E7D 7C7C7B7A7978777676757473727171706F6E6D6C6C6B6A696868676665646463626160605F5E5D5D 5C5B5A5A595857565655545353525151504F4E4E4D4C4B4B4A494948474746454544434242414040 3F3E3E3D3D3C3B3B3A39393837373636353434333332313130302F2F2E2D2D2C2C2B2B2A2A292928 2727262625252524242323222221212020201F1F1E1E1E1D1D1C1C1C1B1B1B1A1A1A1A1919191918 181818 > < C9C8C7C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADADACABAAA9A8A7A6A5A4 A3A2A2A1A09F9E9D9C9B9A9A99989796959493929291908F8E8D8C8C8B8A89888786868584838281 81807F7E7D7C7C7B7A7978777776757473737271706F6F6E6D6C6C6B6A6968686766656564636262 61605F5F5E5D5C5C5B5A5A59585757565555545352525150504F4E4E4D4C4C4B4A4A494848474646 4544444342424141403F3F3E3E3D3C3C3B3B3A393938383737363535343433333232313130302F2F 2E2E2D2D2C2C2B2B2A2A29292828282727262626252524242423232322222221212121202020201F 1F1F1F > 4 %_Br < 02020202020202020202020202020202020202020202010101010101010101020202020202020202 02020202020202020202020202020303030303030303030303030202020303030303030404040404 04040404040404040404040405050505050505050505060606060606060606060505050504040404 04050505050506060606060607070707070707070707070707070707070708080808080808080808 080707080808080808080909090909090909090909090909090909090909 > < FDFDFCFCFBFBFAFAF9F9F8F8F7F7F6F5F5F4F4F3F2F1F0F0EFEEEDEDECEBEBEAE9E8E8E7E6E5E4E3 E2E1E0DFDEDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C4C3C2C0BFBEBDBC BAB9B9B7B6B5B4B3B1B0B0AEADACABA9A8A7A5A4A3A1A09F9F9D9C9B99989695949290908F8E8C8B 8988878584848281807E7D7B7A79797876757372716F6F6E6D6B6A6967676665636260605F5D5C5B 595A595756555554525150504E4D4C4C4A494848464544444241413F3F3E > < F8F6F5F3F0EEECEAE8E7E5E3E1DFDFDEDCDAD8D7D5D3D1D0CECCCAC8C7C5C3C2C0BEBCBCBBB9B7B6 B4B2B0AFADABAAA8A6A4A2A0A19F9D9B9A9896959392908E8D8B8B8A88868583817F7E7C7B797A78 7776747271706E6D6C6C6A696866656462616061605F5E5D5B5A5857585756545352504E4F4E4D4C 4A494847484746454443424342413F3E3D3E3D3C3B3A393839383736363635343333323231302F2F 302E2D2C2D2C2A2A292A29282728272627262523242322222120201F1E1F > 0 < ECECECECECECECECECECECECECECECECECECECECECECEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 > < 1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 444546474848494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626263646566676869 6A6B6C6D6E6F70717273737475767778797A7B7C7D7E7F80808182838485868788898A8A8B8C8D8E 8F90919293939495969798999A9B9B9C9D9E9FA0A1A2A2A3A4A5A6A7A8A8A9AAABACADADAEAFB0B1 B2B2B3B4B5B6B6B7B8B9BABABBBCBDBDBEBFC0C0C1C2C3C3C4C5C5C6C6C7 > < 2425262728292A2B2C2D2E2F30313132333435363738393A3B3C3D3E3F4041424344454546474849 4A4B4C4D4E4F50515253545555565758595A5B5C5D5E5F60616262636465666768696A6B6C6D6D6E 6F70717273747576777778797A7B7C7D7E7F8080818283848586878888898A8B8C8D8E8F8F909192 93949596969798999A9B9C9C9D9E9FA0A1A1A2A3A4A5A6A7A7A8A9AAABABACADAEAFB0B0B1B2B3B4 B4B5B6B7B7B8B9BABBBBBCBDBEBEBFC0C0C1C2C3C3C4C5C5C6C7C7C8C9C9 > 4 %_Br < 04040404040404040404040504040404040404040404040404030403040404040404040404040404 04040303030303040404030303030303030303030303030202020202030303030303030303030302 02020201010101010202010101010101010101010102020202020202020102020202020202020101 01010101010101010101010101010202020202020202010101010100010000000000000000000001 01010101010101010101000000000000000000000000000000000101010101010101010101010101 01010101010101000000000000000000000001010101010101010101010101010101010101010101 01010101010101010101010101010101010202020202020202020202020202020202020202020202 0202020202020202020202020202 > < 1D1E20212224252628292A2B2C2D2F30313234353638393A3C3D3D3E3F414243454647484A4B4D4E 4F5052535354555657595A5C5D5E6061616264656668696A6C6D6D6F7071727475767677797A7B7D 7E808081828485868687898A8B8D8E8E8F919294949597999A9C9C9D9EA0A1A1A2A3A5A6A6A7A9AA ABABADAEAFAFB1B2B3B3B4B5B6B6B7B9BABABBBCBDBDBEC0C1C1C2C3C3C4C5C6C6C7C8C8C9CACBCB CCCDCDCECFCFD0D1D1D2D3D3D4D5D5D6D7D7D8D9D9DADADBDCDCDDDEDEDFDFE0E1E1E2E2E3E4E4E5 E5E6E7E7E7E7E8E8E9E9EAEAEAEBEBECECEDEDEDEDEEEEEFEFF0F0F0F0F1F1F2F2F3F3F3F3F4F4F5 F5F5F5F5F6F6F6F6F6F7F7F7F7F7F8F8F9F9F9F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFBFCFCFCFCFC FCFCFCFDFDFDFDFDFDFDFDFDFDFD > < 0D0D0E0F0F1011111212131413131415151616171818191A1B1B1D1D1D1D1E1F2020212223242524 2525262729292A2B2C2B2C2D2E2E2F3031303132333434353635373839393A393A3B3D3E3F403F40 41424445444546474948494A4B4C4B4E4F505150525455565657595A5B5A5C5D5E5D5E6062616263 6565666769696A6B6D6D6E6F717172747375777877797B7A7C7E807F8183828486858789898B8C8C 8E90909193939496969899999B9D9D9F9EA1A2A2A4A6A6A7A7A9ABABADACAEAEB0B2B2B4B3B5B7B6 B9B8BABABCBCBEC0C0C2C1C3C3C5C5C7C7C8C8CACACCCCCECED0D0D1D1D3D3D5D5D4D6D6D8D8DADA DCDCDBDDDDDFDFDFE1E1E2E2E2E4E4E6E6E7E8E8E8EAEAEAECECECEEEEEEEEF0F0F0F3F3F3F3F5F5 F5F5F5F6F6F6F6F6F8F8F8F8F8F8 > 0 < F7F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5 F5F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F3F3F3F3F3F3F3F3F3F3F3F3 F3F3F3F3F3F3F3F3F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F1F1F1F1F1F1F1F1F1F1 F1F1F1F1F1F1F1F1F1F1F1F1F1F1F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDECECECECECECECECECECECECECECECECECECECECECECEC ECECECECECECECECECECECECECEC > < E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0BFBEBD BCBBBAB9B9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A5A4A3A2A1A09F9E9E9D9C9B9A99 98979796959493929291908F8E8D8C8C8B8A8988888786858483838281807F7F7E7D7C7B7B7A7978 77777675747473727171706F6E6E6D6C6B6B6A69686867666565646363626160605F5E5E5D5C5B5B 5A5959585757565555545353525151504F4F4E4D4D4C4C4B4A4A4948484747464545444443424241 41403F3F3E3E3D3D3C3C3B3A3A39393838373736363535343433333232313130302F2F2E2E2D2D2C 2C2C2B2B2A2A29292928282727272626252525242424232323222222212121202020201F1F1F1E1E 1E1E1E1D1D1D1D1D1C1C1C1C1C1C > < E4E3E2E1E0DFDEDDDCDBDAD9D9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0C0 BFBEBDBCBBBAB9B8B7B7B6B5B4B3B2B1B0B0AFAEADACABAAA9A9A8A7A6A5A4A4A3A2A1A09F9E9E9D 9C9B9A999998979695959493929191908F8E8D8D8C8B8A898988878685858483828281807F7F7E7D 7C7C7B7A79797877767675747373727171706F6E6E6D6C6C6B6A6969686767666565646363626161 605F5F5E5D5D5C5B5B5A595958575756565554545352525151504F4F4E4E4D4D4C4B4B4A4A494848 4747464645454443434242414140403F3F3E3E3D3D3C3C3B3B3A3A39393838373737363635353434 333333323231313130302F2F2F2E2E2D2D2D2C2C2C2B2B2B2A2A2A29292929282828272727272626 2626262525252525242424242424 > 4 %_Br [ 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 Bs 0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 %_BS %_0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 Bs 0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 %_BS %_0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 Bs 0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 %_BS %_0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 Bs 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 Bs 0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 %_BS %_0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 Bs BD %AI5_EndGradient %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI3_BeginPattern: (Checked Pattern) (Checked Pattern) 46.0313 5.4375 113.3027 72.7207 [ %AI3_Tile (0 O 0 R 1 g 1 G ) @ ( %AI6_BeginPatternLayer 0 J 0 j 3 w 4 M []0 d 0 XR 25.0313 11.4375 m 31.0313 5.4375 L F 25.0313 5.4375 m 31.0313 11.4375 L F %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6699 5.44141 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6699 5.44141 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 67.7813 0.511719 m 67.7813 10.3691 L 74.7383 17.332 L 84.5996 17.332 L 91.5605 10.373 L 91.5605 0.515625 L 67.7813 0.511719 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 67.7813 0.511719 m 67.7813 10.3691 L 74.7383 17.332 L 84.5996 17.332 L 91.5605 10.373 L 91.5605 0.515625 L 67.7813 0.511719 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0313 5.4375 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0313 5.4375 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.1035 0.5 m 41.1016 17.3281 L 50.959 17.3281 L 57.9199 10.3691 L 57.9219 0.511719 L 41.1035 0.5 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.1035 0.5 m 41.1016 17.3281 L 50.959 17.3281 L 57.9199 10.3691 L 57.9219 0.511719 L 41.1035 0.5 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3086 5.44141 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3086 5.44141 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2188 0.515625 m 101.418 0.511719 L 101.418 10.3691 L 108.377 17.332 L 118.2363 17.332 L 118.2188 0.515625 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2188 0.515625 m 101.418 0.511719 L 101.418 10.3691 L 108.377 17.332 L 118.2363 17.332 L 118.2188 0.515625 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0273 39.0781 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0273 39.0781 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.0977 50.9668 m 50.9551 50.9688 L 57.916 44.0078 L 57.918 34.1484 L 50.957 27.1875 L 41.0996 27.1875 L 41.0977 50.9668 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.0977 50.9668 m 50.9551 50.9688 L 57.916 44.0078 L 57.918 34.1484 L 50.957 27.1875 L 41.0996 27.1875 L 41.0977 50.9668 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8477 22.2598 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8477 22.2598 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9199 10.3691 m 50.959 17.3281 L 50.957 27.1875 L 57.918 34.1484 L 67.7773 34.1484 L 74.7383 27.1914 L 74.7383 17.332 L 67.7813 10.3691 L 57.9199 10.3691 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9199 10.3691 m 50.959 17.3281 L 50.957 27.1875 L 57.918 34.1484 L 67.7773 34.1484 L 74.7383 27.1914 L 74.7383 17.332 L 67.7813 10.3691 L 57.9199 10.3691 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4883 22.2637 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4883 22.2637 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5605 10.373 m 84.5996 17.332 L 84.5977 27.1914 L 91.5566 34.1523 L 101.416 34.1523 L 108.377 27.1953 L 108.377 17.334 L 101.418 10.373 L 91.5605 10.373 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5605 10.373 m 84.5996 17.332 L 84.5977 27.1914 L 91.5566 34.1523 L 101.416 34.1523 L 108.377 27.1953 L 108.377 17.334 L 101.418 10.373 L 91.5605 10.373 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3066 39.082 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3066 39.082 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2363 27.1914 m 108.377 27.1914 L 101.4141 34.1484 L 101.4141 44.0098 L 108.373 50.9707 L 118.2344 50.9707 L 118.2363 27.1914 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2363 27.1914 m 108.377 27.1914 L 101.4141 34.1484 L 101.4141 44.0098 L 108.373 50.9707 L 118.2344 50.9707 L 118.2363 27.1914 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4844 55.9023 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4844 55.9023 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5566 44.0117 m 84.5957 50.9707 L 84.5938 60.8311 L 91.5527 67.792 L 101.4141 67.792 L 108.373 60.834 L 108.373 50.9746 L 101.4141 44.0137 L 91.5566 44.0117 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5566 44.0117 m 84.5957 50.9707 L 84.5938 60.8311 L 91.5527 67.792 L 101.4141 67.792 L 108.373 60.834 L 108.373 50.9746 L 101.4141 44.0137 L 91.5566 44.0117 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8457 55.8994 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8457 55.8994 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.916 44.0078 m 50.9551 50.9688 L 50.9531 60.8271 L 57.9141 67.7881 L 67.7734 67.7891 L 74.7344 60.8301 L 74.7363 50.9707 L 67.7773 44.0098 L 57.916 44.0078 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.916 44.0078 m 50.9551 50.9688 L 50.9531 60.8271 L 57.9141 67.7881 L 67.7734 67.7891 L 74.7344 60.8301 L 74.7363 50.9707 L 67.7773 44.0098 L 57.916 44.0078 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0254 72.7168 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0254 72.7168 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9141 77.6484 m 57.9141 67.7881 L 50.9551 60.8271 L 41.0977 60.8262 L 41.0938 77.625 L 57.9141 77.6484 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9141 77.6484 m 57.9141 67.7881 L 50.9551 60.8271 L 41.0977 60.8262 L 41.0938 77.625 L 57.9141 77.6484 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6641 72.7207 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6641 72.7207 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5527 77.6523 m 91.5527 67.792 L 84.5957 60.8311 L 74.7363 60.8301 L 67.7734 67.7891 L 67.7734 77.6494 L 91.5527 77.6523 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5527 77.6523 m 91.5527 67.792 L 84.5957 60.8311 L 74.7363 60.8301 L 67.7734 67.7891 L 67.7734 77.6494 L 91.5527 77.6523 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3027 72.7207 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3027 72.7207 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2344 60.8311 m 108.373 60.8301 L 101.4141 67.7891 L 101.4121 77.6494 L 118.2188 77.6523 L 118.2344 60.8311 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2344 60.8311 m 108.373 60.8301 L 101.4141 67.7891 L 101.4121 77.6494 L 118.2188 77.6523 L 118.2344 60.8311 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.666 39.082 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.666 39.082 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 74.7383 27.1914 m 67.7773 34.1484 L 67.7773 44.0098 L 74.7363 50.9707 L 84.5957 50.9707 L 91.5566 44.0117 L 91.5566 34.1523 L 84.5977 27.1914 L 74.7383 27.1914 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 74.7383 27.1914 m 67.7773 34.1484 L 67.7773 44.0098 L 74.7363 50.9707 L 84.5957 50.9707 L 91.5566 44.0117 L 91.5566 34.1523 L 84.5977 27.1914 L 74.7383 27.1914 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 7.46094 27.1816 m 0.501953 34.1406 L 0.5 44 L 7.45898 50.9609 L 17.3184 50.9609 L 24.2793 44.0039 L 24.2813 34.1445 L 17.3223 27.1836 L 7.46094 27.1816 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 7.46094 27.1816 m 0.501953 34.1406 L 0.5 44 L 7.45898 50.9609 L 17.3184 50.9609 L 24.2793 44.0039 L 24.2813 34.1445 L 17.3223 27.1836 L 7.46094 27.1816 L s 101.4141 67.7891 m 101.4141 77.6494 L 91.5527 77.6494 L 91.5527 67.7891 L 101.4141 67.7891 L f 67.7813 0.511719 m 67.7813 10.3691 L 57.9199 10.3691 L 57.9199 0.511719 L 67.7813 0.511719 L f 101.418 0.511719 m 101.418 10.3691 L 91.5586 10.3691 L 91.5586 0.511719 L 101.418 0.511719 L f 84.5996 17.332 m 84.5996 27.1914 L 74.7383 27.1914 L 74.7383 17.332 L 84.5996 17.332 L f 67.7773 34.1484 m 67.7773 44.0098 L 57.918 44.0098 L 57.918 34.1484 L 67.7773 34.1484 L f 50.957 17.3281 m 50.957 27.1875 L 41.1016 27.1875 L 41.1016 17.3281 L 50.957 17.3281 L f 118.2363 17.332 m 118.2363 27.1914 L 108.377 27.1914 L 108.377 17.332 L 118.2363 17.332 L f 101.4141 34.1484 m 101.4141 44.0098 L 91.5566 44.0098 L 91.5566 34.1484 L 101.4141 34.1484 L f 84.5977 50.9707 m 84.5977 60.8301 L 74.7363 60.8301 L 74.7363 50.9707 L 84.5977 50.9707 L f 67.7734 67.7891 m 67.7734 77.6494 L 57.9141 77.6494 L 57.9141 67.7891 L 67.7734 67.7891 L f 50.9551 50.9688 m 50.9551 60.8271 L 41.0977 60.8271 L 41.0977 50.9688 L 50.9551 50.9688 L f 118.2344 50.9707 m 118.2344 60.8301 L 108.373 60.8301 L 108.373 50.9707 L 118.2344 50.9707 L f 17.3203 52.9609 m 17.3203 62.8213 L 7.46094 62.8213 L 7.46094 52.9609 L 17.3203 52.9609 L f %AI6_EndPatternLayer ) & ] E %AI3_EndPattern %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginBrushPattern (Unnamed 18) 0 A u u 0 J 0 j 1 w 4 M []0 d 0 XR -3918.7319 4618.8438 m -3810.1599 4618.8438 L -3810.1599 4617.4312 L -3918.7319 4617.4312 L -3918.7319 4618.8438 L n u 0 O 0.698039 0.67451 0.639216 0.741176 0.137255 0.121569 0.12549 Xa -3810.1599 4617.4688 m -3810.2112 4617.4312 L -3810.3442 4617.5352 L -3810.1599 4617.4688 L f -3811.0344 4617.6997 m -3811.0088 4617.7188 -3811.0212 4617.75 -3810.9951 4617.769 C -3810.4817 4617.4727 L -3810.7112 4617.3047 -3810.8833 4617.8125 -3811.0344 4617.6997 c f -3811.1855 4617.6699 m -3811.3848 4617.6006 -3811.4673 4617.7393 -3811.5137 4617.7871 C -3811.4441 4617.6792 -3811.1423 4617.8203 -3811.1855 4617.6699 C f -3828.7217 4617.7393 m -3828.7031 4617.7383 -3828.6785 4617.7344 -3828.6599 4617.73 C -3828.6912 4617.7256 -3828.7112 4617.73 -3828.7217 4617.7393 C f -3833.2969 4618.2119 m -3833.3447 4618.3232 L -3832.4912 4618.125 -3831.5281 4618.3262 -3830.6252 4618.2393 C -3830.6863 4618.2793 L -3828.3953 4618.3223 -3826.2825 4618.1367 -3824.0095 4618.0518 C -3824.0449 4618.0645 -3824.0569 4618.0967 -3824.0935 4618.1094 c -3823.9839 4618.0713 -3823.8623 4618 -3823.7393 4618.0093 C -3823.7073 4618.0342 -3823.7737 4618.061 -3823.8132 4618.0723 C -3823.3333 4618.2559 -3822.4033 4617.9561 -3822.1033 4618.0977 C -3821.9683 4618.0781 -3821.9087 4618.0015 -3821.9839 4617.9429 C -3820.2048 4617.896 -3818.3015 4617.8608 -3816.4895 4617.7168 C -3816.4023 4617.7422 -3816.3865 4617.792 -3816.4104 4617.8555 C -3814.8616 4617.5576 -3813.2383 4617.6763 -3811.6536 4617.7246 C -3811.5928 4617.6465 -3811.8152 4617.6416 -3811.6592 4617.5601 C -3812.1687 4617.4624 -3812.5923 4617.7524 -3813.0544 4617.6094 C -3812.9951 4617.5342 L -3813.3313 4617.4854 -3813.0632 4617.7246 -3813.4121 4617.6274 C -3813.5496 4617.5645 -3813.3777 4617.5313 -3813.4417 4617.5254 C -3814.1563 4617.5566 -3814.9016 4617.4883 -3815.5745 4617.6719 C -3815.7407 4617.5078 -3816.3423 4617.666 -3816.6064 4617.5093 C -3816.7913 4617.5742 -3816.9768 4617.5576 -3817.0471 4617.666 C -3819.5481 4617.5796 -3822.1033 4617.7383 -3824.6653 4617.7261 C -3825.8643 4618.0435 -3827.3 4617.665 -3828.7231 4617.7715 C -3828.7329 4617.7603 -3828.7312 4617.748 -3828.7217 4617.7393 C -3829.1855 4617.8174 -3829.8616 4617.8545 -3830.4153 4617.8145 C -3830.8843 4617.9492 L -3834.2161 4617.6729 -3837.6208 4617.8672 -3841.0049 4617.7524 c -3844.8503 4617.6729 -3848.2192 4617.4453 -3851.9641 4617.8633 C -3851.9592 4617.832 -3851.9895 4617.8145 -3851.8928 4617.8022 C -3852.9736 4617.8662 -3853.9583 4617.7524 -3854.9761 4617.8184 C -3854.9729 4617.7871 L -3857.4983 4618.0488 -3860.2295 4617.7524 -3862.6641 4618.0342 C -3865.6279 4618.0059 -3868.9792 4618.0342 -3872.1162 4618.1152 C -3872.1089 4618.0518 L -3874.6191 4618.1846 -3877.0449 4617.8516 -3879.5496 4617.9517 C -3882.1252 4617.8086 -3884.8464 4618.3125 -3887.4441 4618.1211 C -3889.0513 4617.8125 -3891.1624 4618.4741 -3892.6721 4618.1543 C -3895.7737 4617.6719 -3898.7825 4617.9824 -3901.8833 4618.2715 C -3904.7439 4618.0996 -3907.6001 4618.541 -3910.3704 4618.1904 C -3911.6831 4618.415 -3913.1328 4617.9121 -3914.5935 4617.9766 C -3914.5413 4618.0547 L -3915.0657 4617.8184 -3915.7097 4618.3853 -3916.0369 4618.0342 C -3915.9817 4618.0181 L -3916.2593 4617.8398 -3916.6265 4618.4385 -3916.7952 4618.2261 C -3916.8401 4618.3145 L -3917.1763 4618.3398 -3916.8799 4618.2144 -3917.1392 4618.1792 C -3917.2368 4618.1904 -3917.1763 4618.3398 -3917.3799 4618.2891 C -3917.4241 4617.9287 -3918.2031 4618.3672 -3918.2263 4617.9624 C -3918.0425 4617.9624 -3918.5144 4617.8057 -3918.1016 4617.7207 C -3918.2192 4617.6792 -3918.7825 4617.6992 -3918.7319 4617.8711 C -3918.78 4618.0537 -3919 4618.2124 -3918.6577 4618.3535 C -3918.5889 4618.2207 L -3918.4736 4618.3535 -3918.5012 4618.2871 -3918.46 4618.3867 C -3918.0127 4618.4043 -3917.9529 4618.5977 -3917.6321 4618.6772 C -3917.6353 4618.6729 -3917.6384 4618.6699 -3917.6335 4618.6631 C -3917.4143 4618.5039 -3917.1111 4618.5977 -3916.9375 4618.6211 C -3916.8679 4618.6953 L -3916.7625 4618.8496 -3916.3591 4618.3926 -3916.4951 4618.6582 C -3915.5857 4618.5923 -3914.5432 4618.5957 -3913.5271 4618.5923 C -3913.3848 4618.4912 -3912.7493 4618.6016 -3912.9712 4618.4072 c -3912.7168 4618.6289 -3911.9607 4618.6846 -3911.6799 4618.6763 C -3911.6904 4618.6973 -3911.7024 4618.7207 -3911.7463 4618.7124 C -3911.2017 4619 -3911.1008 4618.4463 -3910.5903 4618.7979 C -3910.5105 4618.5493 -3909.6631 4618.8774 -3909.3743 4618.5854 C -3909.3113 4618.6406 -3909.2903 4618.6904 -3909.3132 4618.7344 C -3908.3943 4618.7393 -3907.3792 4618.8296 -3906.6016 4618.8408 C -3905.9373 4618.623 -3904.9929 4618.9395 -3904.4216 4618.6387 C -3903.9482 4618.7017 -3903.1824 4618.8281 -3902.5215 4618.707 C -3902.5857 4618.7437 L -3901.8401 4618.7261 -3900.9087 4618.7104 -3900.3972 4618.5215 C -3900.1768 4618.8096 -3899.8545 4618.7524 -3899.5322 4618.8438 C -3899.0344 4618.7104 -3898.0295 4618.75 -3897.27 4618.6289 C -3897.1536 4618.7617 -3896.6433 4618.5723 -3896.6042 4618.7656 C -3894.4761 4618.3926 -3891.8447 4618.5225 -3889.5723 4618.8047 C -3889.6052 4618.8184 L -3889.3103 4618.7124 -3888.9705 4618.4785 -3888.6704 4618.3413 C -3888.6409 4618.3584 -3888.6443 4618.3896 -3888.7073 4618.3896 C -3888.2922 4618.3535 -3887.9041 4618.5435 -3887.4895 4618.5078 C -3887.4929 4618.54 -3887.4929 4618.54 -3887.5601 4618.5703 C -3887.1711 4618.4844 -3886.7561 4618.7246 -3886.2969 4618.5752 C -3886.2712 4618.6265 L -3885.9792 4618.5547 L -3885.9863 4618.6182 -3885.9976 4618.7144 -3886.1536 4618.6934 C -3882.5903 4618.7559 -3878.9121 4618.4248 -3875.2537 4618.4727 C -3875.3879 4618.5332 L -3874.6785 4618.4248 L -3874.6824 4618.457 -3874.7161 4618.4727 -3874.75 4618.4873 C -3873.8464 4618.5957 -3872.9087 4618.415 -3872.0281 4618.4424 C -3872.0322 4618.4736 -3872.1655 4618.5352 -3872.0422 4618.5703 C -3871.3904 4618.396 -3870.9951 4618.7964 -3870.6687 4618.4351 C -3870.6384 4618.4517 -3870.6177 4618.5332 -3870.6841 4618.5625 C -3868.8704 4618.4424 -3867.0081 4618.4492 -3865.1809 4618.5078 C -3863.6592 4618.1807 -3861.9583 4618.4766 -3860.3777 4618.2168 C -3860.3855 4618.2822 L -3858.3391 4618.0537 -3856.1682 4618.2979 -3854.0471 4618.2524 C -3853.1663 4618.2783 -3852.5713 4618.2012 -3851.6863 4618.1973 C -3851.6641 4618.2783 L -3850.1743 4617.9688 -3848.5327 4618.5566 -3846.9785 4618.2158 C -3847.0857 4618.3262 L -3846.8447 4618.1553 -3846.1455 4618.3867 -3846.2375 4618.0933 C -3845.9631 4618.1816 L -3844.9072 4617.7949 -3844.0413 4618.3608 -3842.7473 4618.1094 C -3842.8323 4618.1792 L -3842.4883 4618.125 -3842.0872 4618.082 -3841.8323 4618.1465 C -3841.8721 4618.1563 -3841.8535 4618.1768 -3841.9353 4618.1953 C -3840.8577 4618.4707 -3839.6584 4618.166 -3838.5215 4618.1768 C -3838.6504 4618.3062 L -3838.1008 4618.1543 -3837.0928 4618.2959 -3836.3704 4618.2261 C -3836.4143 4618.2871 L -3836.0488 4618.2012 L -3836.0393 4618.3232 L -3835.0991 4618.332 -3834.2144 4618.2261 -3833.2969 4618.2119 C f -3823.8132 4618.0723 m -3823.8159 4618.0713 -3823.8201 4618.0713 -3823.8232 4618.0684 C -3823.8513 4618.0791 -3823.8376 4618.0781 -3823.8132 4618.0723 C f -3917.5168 4618.7017 m -3917.5601 4618.6953 -3917.5959 4618.6875 -3917.6321 4618.6772 C -3917.6233 4618.7017 -3917.5537 4618.6973 -3917.5168 4618.7017 c f U U U %AI8_EndBrushPattern %AI8_BeginBrushPattern (Unnamed Brush Pat 2) 0 A u 0 J 0 j 1 w 4 M []0 d 0 XR -7791.3833 8491.4551 m -7699.5479 8491.4551 L -7699.5479 8487.1758 L -7791.3833 8487.1758 L -7791.3833 8491.4551 L n 0 O 0.698039 0.67451 0.639216 0.741176 0.137255 0.121569 0.12549 Xa -7791.1631 8488.7754 m -7791.5 8488.8418 -7790.9814 8489.0313 -7791.3833 8488.8887 C -7791.3379 8488.7705 -7791.2725 8488.6816 -7791.1631 8488.7754 C f -7700.6675 8488.9414 m -7701.7524 8489.7041 -7703.1816 8488.9336 -7704.3701 8489.4199 C -7704.5098 8489.4521 -7704.3345 8489.002 -7704.6484 8489.1025 C -7705.8008 8489.6953 -7707.6162 8489.3418 -7709.0195 8488.8848 C -7708.9346 8488.7666 L -7709.2017 8488.6816 -7709.5283 8489.0723 -7709.8115 8489.0176 C -7709.8135 8488.9395 -7709.7207 8488.9063 -7709.7861 8488.7979 C -7709.8574 8489.0352 -7710.2983 8488.9082 -7710.4185 8489.084 C -7710.5303 8488.9922 -7710.5195 8488.8047 -7710.6641 8488.7002 C -7710.8262 8488.9697 L -7711.2769 8489.6094 -7711.9209 8488.9258 -7712.5361 8489.2559 C -7712.5063 8489.1934 -7712.4453 8489.1445 -7712.4941 8489.084 C -7713.4814 8489.4727 -7714.7168 8489.3994 -7715.8208 8489.543 C -7715.7769 8489.4482 -7715.7363 8489.2754 -7715.8008 8489.168 C -7715.8555 8489.4512 -7716.1963 8489.5225 -7716.4922 8489.5781 C -7716.6255 8489.2871 -7716.9995 8489.8438 -7717.3467 8489.6826 C -7717.3169 8489.6191 L -7717.5732 8489.9238 -7717.6973 8489.4434 -7717.9053 8489.8086 C -7718.0684 8489.5801 L -7718.1807 8489.9902 -7718.4395 8489.3672 -7718.6514 8489.5762 C -7718.6445 8489.6602 L -7718.8442 8489.7598 -7718.9482 8489.5537 -7719.1338 8489.623 C -7719.1514 8489.5762 L -7719.5854 8489.6826 -7719.8379 8489.4551 -7719.8271 8489.7754 C -7719.9795 8489.5186 -7719.4063 8489.6582 -7719.6455 8489.2842 C -7721.0732 8489.6152 -7722.5459 8489.5498 -7723.9834 8489.5566 C -7724.1465 8489.4277 -7724.2505 8489.3887 -7724.2871 8489.2666 C -7724.4307 8489.332 -7724.8281 8489.3262 -7724.9585 8489.4902 C -7724.9102 8489.4834 -7725.0513 8489.3262 -7725.1274 8489.3105 C -7725.3887 8489.1895 -7725.4131 8489.6621 -7725.7002 8489.5186 C -7725.5859 8489.4336 -7725.5469 8489.3301 -7725.5854 8489.2109 C -7725.8301 8489.4609 -7726.1577 8489.4209 -7726.4473 8489.502 C -7726.4023 8489.4482 -7726.3325 8489.416 -7726.3433 8489.3154 C -7726.6602 8489.5986 -7726.9209 8489.2559 -7727.1982 8489.4346 C -7727.0947 8489.25 L -7727.5415 8489.0254 -7727.2266 8489.6367 -7727.6128 8489.5039 C -7727.52 8489.4453 -7727.5527 8489.373 -7727.5361 8489.2979 C -7727.8965 8489.6338 -7728.4795 8489.5225 -7728.8389 8489.6367 C -7728.8174 8489.6113 -7728.8232 8489.5605 Y -7729.2148 8489.6025 -7729.6245 8489.498 -7730.0552 8489.6445 C -7730.2119 8489.5625 -7730.0039 8489.1934 -7730.4185 8489.2617 C -7730.4033 8489.6328 -7731.1221 8489.4141 -7730.8779 8489.834 C -7731.2319 8489.7734 -7731.7925 8489.6338 -7732.0283 8489.7598 C -7731.8691 8489.6191 -7732.2007 8489.3066 -7731.9063 8489.2754 C -7732.1289 8489.0498 L -7732.0957 8488.8984 -7731.8999 8489.1016 -7731.9707 8488.9102 C -7732.1182 8488.9258 -7732.5479 8489.0723 -7732.6797 8489.0117 C -7732.9531 8489.2393 -7733.2041 8489.6641 -7733.6465 8489.7109 C -7733.4385 8489.5664 -7733.7646 8489.3018 -7733.6235 8489.2383 C -7734.2407 8489.9482 L -7734.3877 8489.9658 -7734.2725 8489.6563 -7734.4854 8489.7529 C -7734.4746 8489.8506 -7734.5674 8489.9121 -7734.6318 8489.9922 C -7734.6875 8489.9482 -7735.2441 8490.084 -7735.3081 8489.7178 C -7735.3735 8489.5762 -7735.0684 8489.6426 -7735.2314 8489.5117 C -7735.5029 8489.5146 -7735.5151 8489.6406 -7735.7871 8489.6465 C -7735.7925 8489.5977 L -7735.9717 8489.543 -7736.3213 8489.7529 -7736.1265 8489.9551 C -7736.0015 8489.9658 -7736.1738 8489.7354 -7735.9888 8489.8418 C -7736.1152 8490.0537 -7736.4312 8490.1133 -7736.7031 8490.1162 C -7736.6104 8490.0586 -7736.6216 8489.9609 -7736.5845 8489.8574 C -7736.9497 8490.1445 -7737.3369 8490.2354 -7737.7451 8490.3555 C -7737.7515 8490.5293 -7737.5928 8490.0391 -7737.5327 8490.1309 C -7738.0557 8489.8896 -7738.6128 8490.4727 -7739.0479 8490.1201 C -7738.9766 8490.0898 -7739.0098 8490.3672 -7739.0146 8490.3184 C -7739.2666 8490.2969 -7739.2549 8490.0449 -7739.4189 8490.1377 C -7739.4355 8489.9902 -7739.6255 8490.1855 -7739.7944 8490.2305 C -7739.8818 8490.3369 -7739.8384 8490.1582 -7739.6914 8490.1426 C -7739.9268 8490.2666 -7740.8691 8490.4941 -7741.4131 8490.2793 C -7741.4023 8490.377 -7741.7471 8490.6377 -7741.8721 8490.627 C -7741.8232 8490.3984 L -7741.9375 8490.2617 -7742.2422 8490.418 -7742.2632 8490.2227 C -7742.5303 8490.5 -7741.2344 8489.9863 -7741.5957 8490.2002 C -7741.6895 8490.0098 -7742.0991 8490.5645 -7742.0215 8490.2529 C -7742.2725 8490.2617 -7742.5161 8490.5186 -7742.7559 8490.3047 C -7742.6865 8490.3418 -7742.5522 8489.9873 -7742.7549 8490.0039 C -7743.1123 8490.0449 -7742.8564 8490.1133 -7743.1465 8490.1895 C -7743.3281 8490.2832 L -7743.3398 8490.5059 -7743.6475 8490.2529 -7743.5146 8490.502 C -7743.5586 8490.3184 -7744.0337 8490.6152 -7743.9971 8490.2461 C -7743.9473 8489.9551 L -7744.1016 8489.9766 -7744.2002 8490.2617 -7744.3213 8490.3896 C -7744.3418 8490.3633 -7744.3823 8490.3047 -7744.3745 8490.2578 C -7744.3994 8490.7031 -7744.7432 8490.2207 -7744.9268 8490.5645 C -7745.2505 8490.4102 -7745.7495 8490.5498 -7745.9023 8490.2734 C -7746.1514 8490.4082 -7746.3784 8490.5674 -7746.6621 8490.4727 C -7746.6055 8490.4307 -7746.5283 8490.418 -7746.5122 8490.3223 C -7746.6904 8490.1914 -7746.7344 8490.3086 -7746.8975 8490.3809 C -7746.8608 8490.3145 -7747.2539 8490.1201 -7747.4521 8489.9629 C -7747.6992 8490.0957 -7747.6143 8490.3359 -7747.6392 8490.4824 C -7747.8652 8490.043 -7748.3379 8490.7656 -7748.6211 8490.3672 C -7748.5352 8490.3066 -7748.2598 8490.1514 -7748.4658 8490.041 C -7748.6919 8489.6025 -7748.9219 8490.3643 -7749.2861 8490.1543 C -7749.1968 8490.5186 L -7749.3594 8490.293 -7749.7334 8490.7305 -7749.6963 8490.3594 C -7749.8184 8490.4902 -7750.1265 8490.2383 -7750.0859 8490.5938 C -7750.6846 8490.293 -7751.5425 8490.7754 -7751.9102 8490.1377 C -7751.9961 8490.1973 -7752.2104 8490.1367 -7752.1665 8490.3193 C -7752.0239 8490.5176 -7751.9673 8490.1777 -7751.9141 8490.3125 C -7751.9912 8490.3232 -7752.0078 8490.4209 -7752.0161 8490.4697 C -7752.2021 8490.3887 -7752.3486 8490.3633 -7752.1729 8490.0674 C -7752.5869 8489.8477 -7752.6001 8490.6719 -7753.1274 8490.5322 C -7753.1035 8490.3857 -7753.1436 8490.3301 -7753.2979 8490.3535 C -7753.5903 8490.6055 L -7753.9312 8490.5469 -7753.7842 8490.2705 -7753.7925 8490.0215 C -7753.9746 8490.0645 -7754.1973 8490.0527 -7754.2803 8490.2383 C -7754.5015 8489.9258 L -7754.3398 8490.1514 -7754.6514 8490.0762 -7754.7368 8490.1367 C -7754.6514 8490.0762 L -7754.6846 8489.9697 -7754.8955 8490.0352 -7755.0024 8490.0664 C -7754.9766 8490.2207 -7754.7617 8490.2832 -7754.6445 8490.3281 C -7754.7373 8490.4375 -7754.8823 8490.4121 -7755.0059 8490.541 C -7754.9648 8490.2969 -7755.3027 8490.3672 -7755.4473 8490.3418 C -7755.6133 8490.2891 -7755.6348 8490.5605 -7755.6831 8490.5527 C -7755.6875 8490.4258 -7755.9541 8490.5313 -7755.8247 8490.3535 C -7755.7681 8490.3125 -7755.6953 8490.4766 -7755.6016 8490.3643 C -7755.7109 8490.2705 -7755.6982 8490.0498 -7755.9258 8490.2109 C -7756.0967 8490.332 -7755.8818 8490.6934 -7756.2061 8490.5391 C -7756.1211 8490.4785 -7756.1055 8490.3809 -7756.0391 8490.293 C -7756.3433 8490.166 L -7756.3564 8490.3887 L -7756.3975 8490.332 -7756.3691 8490.3125 -7756.3877 8490.2832 C -7756.4785 8490.5176 -7756.8521 8490.3555 -7756.9209 8490.6191 C -7757.0742 8490.6426 -7757.2441 8490.4648 -7757.3906 8490.4395 C -7757.3623 8490.4199 L -7757.5415 8490.2891 -7757.7793 8490.375 -7757.9297 8490.5254 C -7757.9219 8490.4766 L -7758.0195 8490.459 -7758.2505 8490.4941 -7758.3735 8490.625 C -7758.6201 8490.457 -7758.4561 8489.7842 -7758.7295 8490.0645 C -7758.98 8490.0723 -7759.1221 8490.4727 -7759.0215 8490.6152 C -7759.4717 8490.4648 -7759.9834 8490.8281 -7760.4009 8490.4824 C -7760.4658 8490.5723 -7760.4248 8490.6289 -7760.5586 8490.6816 C -7761.2197 8490.5938 -7761.9551 8490.9453 -7762.4814 8490.5078 C -7762.29 8490.4141 -7762.4688 8490.2842 -7762.4727 8490.1582 C -7762.6309 8490.3574 -7762.6631 8489.9512 -7762.7197 8490.293 C -7762.7041 8490.4941 -7762.7197 8490.5918 -7762.5337 8490.6729 C -7762.9282 8490.7813 -7763.5283 8490.7813 -7763.7471 8490.5938 C -7763.6377 8490.6865 -7763.7227 8490.748 -7763.8086 8490.8086 C -7763.7803 8490.4873 -7764.0713 8490.4395 -7764.2915 8490.5527 C -7764.3223 8490.748 L -7764.4658 8490.5469 L -7764.5503 8490.6094 -7764.5591 8490.957 -7764.7773 8490.7695 C -7764.7891 8490.6934 -7764.8018 8490.6162 -7764.8418 8490.5605 C -7765.0693 8490.7207 -7765.3906 8490.9922 -7765.6377 8490.8262 C -7765.8398 8490.541 L -7765.9453 8490.5723 -7766.1235 8490.7441 -7765.9375 8490.8262 C -7766.3594 8490.6543 -7766.6309 8490.6328 -7766.7646 8490.3857 C -7767.4912 8490.9873 -7768.5459 8491.0117 -7769.3906 8490.9688 C -7769.3652 8490.8223 L -7769.5923 8490.6855 -7769.4834 8491.0781 -7769.6416 8490.9766 C -7769.5684 8490.8369 -7769.8145 8490.6729 -7769.6362 8490.502 C -7769.9609 8490.3477 -7770.0547 8490.7559 -7770.2656 8490.8223 C -7770.2979 8491.0146 -7770.0957 8490.6992 -7770.1367 8490.9434 C -7770.1729 8491.0117 -7770.5859 8490.793 -7770.6362 8491.084 C -7770.7178 8490.9697 -7770.6543 8490.7559 -7770.6104 8490.6377 C -7770.8086 8490.7793 L -7771.0513 8490.4395 -7770.2559 8490.1719 -7770.5107 8489.7529 C -7770.6934 8489.7979 L -7770.8682 8489.4941 -7770.21 8489.4551 -7770.6689 8489.3506 C -7770.8682 8489.4941 -7771.0381 8489.916 -7770.8608 8490.0449 C -7771.2754 8490.125 -7771.0527 8490.7383 -7771.4985 8490.7139 C -7771.6201 8490.543 -7771.1416 8490.6729 -7771.2275 8490.4336 C -7771.4375 8490.1992 -7771.6484 8490.5645 -7771.8354 8490.4824 C -7771.6279 8490.5918 -7771.8032 8490.8857 -7771.9375 8490.9395 C -7772.1641 8490.8018 -7771.79 8490.6641 -7772.1113 8490.6338 C -7772.1641 8490.8018 -7772.4595 8490.9277 -7772.2041 8491.0449 C -7772.3203 8491.4258 -7772.5381 8490.9395 -7772.7129 8491.2344 C -7772.8174 8490.9658 -7772.3823 8490.6152 -7772.7354 8490.4814 C -7772.6792 8490.7393 -7773.1704 8490.832 -7772.9839 8491.2139 C -7773.1221 8491.1406 -7773.1367 8490.9375 -7773.0361 8490.7793 C -7773.2334 8490.6201 -7773.5151 8491.25 -7773.5801 8490.7383 C -7773.6479 8491.002 L -7773.71 8490.916 -7773.7983 8490.8506 -7773.8994 8490.709 C -7774.0732 8490.7041 -7774.46 8491.0664 -7774.4443 8490.668 C -7774.5 8490.709 -7774.8975 8490.6914 -7774.7441 8490.9658 C -7774.4971 8491.1338 -7774.46 8490.7656 -7774.3223 8491.1377 C -7774.4971 8490.834 -7774.6787 8491.1777 -7774.8213 8491.2793 C -7774.8447 8491.125 L -7774.9297 8491.1855 -7775.1255 8491.1514 -7775.1787 8491.3184 C -7775.1133 8491.2305 -7775.1475 8491.125 -7775.2148 8491.0879 C -7775.3042 8491.3223 L -7775.6494 8491.4395 -7775.3857 8490.9102 -7775.7217 8490.9785 C -7775.4663 8490.7969 L -7775.5225 8490.8359 -7775.6367 8490.6162 -7775.7979 8490.6895 C -7775.8604 8490.9033 -7775.9775 8491.1602 -7776.0313 8491.3262 C -7776.2207 8491.4199 -7776.1162 8491.085 -7776.3027 8491.3047 C -7776.0586 8491.0469 L -7776.0215 8490.9766 -7776.2231 8490.6934 -7776.4761 8490.6992 C -7776.6377 8490.7734 -7776.8887 8491.082 -7776.6338 8491.1992 C -7776.7607 8491.2031 -7776.9385 8491.0723 -7776.8379 8490.916 C -7777.1255 8490.9902 -7776.7998 8491.1465 -7777.0479 8491.2793 C -7777.1494 8491.1367 -7777.4658 8490.9336 -7777.6563 8490.7266 C -7777.3975 8490.3682 L -7777.5693 8490.3643 L -7777.3467 8490.0781 -7777.6826 8490.1465 -7777.5566 8489.8438 C -7777.6743 8489.7969 -7777.8169 8489.8994 -7777.9307 8489.9785 C -7777.5864 8490.4629 -7778.3159 8490.6406 -7778.2158 8491.082 C -7778.6875 8491.2031 -7778.5107 8490.0078 -7779.0024 8490.6992 C -7778.9219 8490.8145 -7779.1533 8491.1504 -7778.8564 8491.0225 C -7779.1494 8490.9746 -7779.0557 8491.4658 -7779.4014 8491.2832 C -7779.1455 8491.1016 -7779.6763 8490.8359 -7779.3066 8490.5723 C -7779.3311 8490.7178 -7779.1001 8490.6826 -7779.0435 8490.6426 C -7779.1641 8490.4727 -7779.0186 8490.1973 -7779.3184 8490.1973 C -7779.5015 8490.2393 -7779.7524 8490.248 -7779.7158 8490.4785 C -7779.7085 8490.7314 -7779.4365 8490.4512 -7779.5537 8490.707 C -7779.9185 8490.7949 -7779.9795 8490.4102 -7780.1304 8490.8594 C -7779.8999 8490.8232 -7779.8423 8491.084 -7779.8467 8491.2578 C -7780.1143 8491.3633 L -7780.0625 8491.1953 L -7780.4922 8491.0742 -7780.1895 8491.5 -7780.6055 8491.4551 C -7780.8008 8491.123 L -7780.7017 8490.8369 -7780.1953 8491.25 -7780.2695 8490.7842 C -7780.54 8490.7656 -7780.6299 8491.002 -7780.8848 8490.8818 C -7780.8281 8490.8418 -7780.7505 8490.8301 -7780.6943 8490.7891 C -7780.7915 8490.7734 -7780.8877 8490.1563 -7781.2734 8490.5176 C -7781.4727 8490.6582 -7781.3262 8490.6826 -7781.3311 8490.8574 C -7781.7656 8490.9102 -7781.8955 8491.0879 -7782.1753 8491.1152 C -7782.1177 8490.7754 -7782.6699 8491.082 -7782.3608 8490.7344 C -7782.2188 8490.9336 -7781.5903 8490.9141 -7781.4365 8490.5898 C -7781.5947 8490.1865 -7781.0952 8490.6465 -7781.0024 8490.2383 C -7781.3506 8490.2285 -7781.3335 8489.832 -7781.3896 8489.5723 C -7781.4863 8489.5537 -7781.5801 8489.6641 -7781.6377 8489.7041 C -7781.6787 8489.9482 -7781.5522 8489.9453 -7781.5449 8490.1973 C -7781.9336 8490.1309 -7782.3081 8490.2666 -7782.5225 8490.5059 C -7782.6523 8490.3848 -7782.6113 8490.1406 -7782.4575 8490.1162 C -7782.9199 8490.1895 -7783.4141 8490.1563 -7783.8535 8490.082 C -7783.5693 8490.4814 -7784.3433 8490.1758 -7784.1494 8490.5078 C -7783.9141 8490.5977 -7783.7119 8490.8818 -7783.8418 8491.0605 C -7783.9888 8491.0352 -7783.8369 8490.8857 -7783.8984 8490.8008 C -7784.0859 8491.0186 -7784.1895 8490.4512 -7784.3735 8490.7949 C -7783.9512 8490.666 -7784.2915 8490.3086 -7784.2139 8489.9961 C -7784.5186 8490.1719 -7784.2007 8489.7734 -7784.5024 8489.7734 C -7784.8057 8489.9473 -7785.1787 8490.084 -7785.5161 8490.1514 C -7785.9399 8489.8555 -7786.5898 8490.1465 -7786.9683 8490.1582 C -7787.1665 8490 -7787.0322 8489.6465 -7787.2471 8489.585 C -7787.4995 8489.5918 -7787.0601 8489.9658 -7787.4336 8489.8047 C -7787.3975 8489.7344 L -7787.5107 8489.8154 -7788.0825 8489.4941 -7788.1929 8490.002 C -7788.0776 8489.6191 L -7788.1475 8489.584 -7788.2119 8489.6719 -7788.2695 8489.7129 C -7788.2725 8489.5879 -7788.3535 8489.4746 -7788.2402 8489.3926 C -7788.4707 8489.1289 -7788.7241 8489.4346 -7788.9746 8489.4453 C -7788.8135 8489.6719 L -7789.2422 8489.8496 -7789.5293 8489.625 -7789.9443 8489.7041 C -7789.9316 8489.4824 L -7790.1787 8489.6152 L -7790.1182 8489.3994 -7790.3447 8489.2617 -7790.4751 8489.4414 C -7789.8335 8488.8984 L -7789.6553 8489.0293 -7790.0283 8489.166 -7789.9165 8489.3848 C -7789.8213 8489.5762 -7789.4375 8489.5146 -7789.3755 8489.3018 C -7789.5225 8489.2773 -7789.5293 8489.3262 -7789.6436 8489.4063 C -7789.6919 8489.0977 -7789.4688 8489.1094 -7789.3584 8488.9033 C -7789.4355 8488.916 -7789.5449 8488.8223 -7789.5615 8488.9199 C -7789.4102 8488.7695 -7789.2578 8488.7461 -7789.0059 8488.7383 C -7789.1763 8488.8594 -7788.9131 8488.9297 -7788.9775 8489.0176 C -7788.9575 8488.7461 -7788.7168 8488.6621 -7788.4053 8488.7383 C -7788.1831 8489.0527 -7787.8208 8488.5361 -7787.46 8488.623 C -7787.6064 8488.8984 -7787.7935 8489.1191 -7788.0127 8489.2305 C -7787.7861 8489.3682 -7787.7607 8489.2227 -7787.5337 8489.3613 C -7787.4238 8489.1563 -7787.3457 8488.8418 -7787.0503 8488.7168 C -7787.0342 8488.9199 L -7786.7666 8488.8154 -7786.7666 8488.5146 -7786.4258 8488.5723 C -7785.8418 8488.6719 -7785.2407 8488.6719 -7784.7949 8488.6973 C -7784.7783 8488.8994 L -7784.5303 8488.4658 -7783.9521 8488.7393 -7783.6182 8488.5469 C -7783.0503 8488.7422 -7782.3848 8488.3535 -7782.0938 8488.7031 C -7781.0913 8488.5469 -7780.2148 8488.3945 -7779.1768 8488.4688 C -7779.3516 8488.7637 L -7779.1655 8488.5469 -7779.2305 8488.9336 -7779.0479 8488.8896 C -7779.2578 8488.6543 -7778.7949 8488.584 -7778.6665 8488.4033 C -7778.2041 8488.6328 -7777.6104 8488.3818 -7777.2007 8488.1758 C -7777.1846 8488.3789 L -7776.7705 8487.998 -7776.2759 8488.332 -7775.7598 8488.3945 C -7775.7007 8488.4785 -7775.6074 8488.6689 -7775.4536 8488.6465 C -7775.1738 8488.3184 -7775.0273 8488.3418 -7774.6167 8488.1367 C -7774.3169 8488.1367 -7773.8301 8488.2178 -7773.5254 8488.3457 C -7772.3975 8487.8848 -7771.2456 8488.1797 -7770.0732 8487.9023 C -7769.9888 8488.1406 L -7768.8521 8487.6309 -7767.4541 8488.0938 -7766.4839 8487.832 C -7766.5776 8488.2393 L -7766.2734 8488.3643 -7765.8843 8488.1328 -7765.9619 8487.8438 C -7765.6567 8487.9688 -7765.2007 8487.6465 -7765.0068 8487.9814 C -7764.6953 8488.0566 -7764.6255 8487.793 -7764.3662 8487.7383 C -7763.7422 8487.8926 -7763.5107 8487.8574 -7762.9224 8487.7813 C -7763.0684 8487.7559 L -7763.1328 8487.8457 -7763.1387 8488.0186 -7762.9922 8488.0449 C -7762.7725 8487.9307 -7762.1846 8488.1543 -7762.4033 8487.668 C -7761.7754 8487.9482 -7760.9385 8487.4395 -7760.3271 8487.8184 C -7760.3789 8487.6855 -7760.2246 8487.6602 -7760.1602 8487.5703 C -7759.6089 8487.5645 -7759.0293 8487.8359 -7758.5898 8487.6094 C -7758.5024 8487.6758 -7758.7295 8487.8359 -7758.5049 8487.8496 C -7758.3721 8487.7979 -7758.5024 8487.6758 -7758.3384 8487.6016 C -7757.4453 8487.3535 -7756.5303 8487.8574 -7755.7188 8487.793 C -7754.2754 8487.5361 -7752.7695 8487.666 -7751.3867 8487.623 C -7751.4023 8487.7207 L -7750.9395 8487.3477 -7750.3159 8488.1025 -7749.9463 8487.541 C -7749.8369 8487.6338 -7749.5283 8487.585 -7749.6094 8487.7734 C -7749.2407 8487.5098 -7748.5771 8488.0215 -7748.0439 8487.6865 C -7748.0928 8487.6777 -7748.1211 8487.6973 -7748.1777 8487.7393 C -7747.6392 8487.9551 -7747.1641 8487.6602 -7746.5957 8487.8555 C -7746.6533 8487.8975 -7746.7583 8487.9277 -7746.7754 8488.0254 C -7746.5557 8488.2129 -7746.2549 8487.6133 -7746.1348 8488.084 C -7746.0088 8488.0801 -7746.0449 8487.8477 -7746.1221 8487.8613 C -7744.8779 8488.0449 -7743.5498 8487.7441 -7742.2549 8487.6367 C -7741.3271 8487.918 -7742.1982 8488.4297 -7741.4663 8488.0781 C -7741.4063 8488.1689 -7741.4229 8487.8984 -7741.4131 8487.9961 C -7741.1299 8487.8643 -7740.9717 8488.5215 -7740.7754 8488.2754 C -7740.8564 8487.9863 -7740.6445 8488.1133 -7740.6387 8487.9375 C -7740.0713 8488.125 -7739.9575 8488.3857 -7739.5098 8488.166 C -7739.5435 8488.3184 L -7739.0186 8487.8887 -7738.4102 8488.1191 -7737.9673 8487.623 C -7735.0728 8487.5322 -7732.2983 8487.2578 -7729.4761 8487.2002 C -7726.6865 8487.2949 -7723.9551 8487.0723 -7721.1221 8487.3359 C -7720.4585 8487.7354 -7720.4087 8487.7246 -7719.6797 8487.5625 C -7719.7095 8487.627 -7719.7549 8487.6426 -7719.7061 8487.7031 C -7719.6699 8487.375 -7719.1929 8487.6719 -7719.1235 8487.3594 C -7718.0762 8487.4199 -7717.1113 8487.3301 -7716.0337 8487.3281 C -7716.2041 8487.3633 -7716.2896 8487.6309 -7716.0869 8487.6094 C -7715.8755 8487.3994 L -7715.8408 8487.4922 L -7715.7021 8487.4434 -7715.5513 8487.2813 -7715.6943 8487.1758 C -7712.9873 8486.8926 -7710.3242 8487.5498 -7707.6729 8487.4697 C -7707.0435 8487.6064 -7706.1475 8487.4814 -7705.4629 8487.4141 C -7703.4355 8487.8506 -7701.6079 8488.2041 -7699.5479 8487.8984 C -7699.8169 8488.7461 -7700.6675 8488.9414 V f -7790.7578 8488.7422 m -7790.6855 8488.9063 -7790.4497 8488.9961 -7790.6377 8489.2139 C -7790.6611 8489.0605 -7790.7822 8488.8887 -7790.7578 8488.7422 C f -7784.4619 8490.4297 m -7784.4536 8490.3809 -7784.3721 8490.4961 -7784.3521 8490.5225 C -7784.4297 8490.5352 -7784.5024 8490.6729 -7784.5645 8490.5879 C -7784.4854 8490.5762 -7784.4976 8490.498 -7784.4619 8490.4297 C f -7782.8521 8490.5273 m -7782.8765 8490.6729 -7783.2207 8490.7891 -7783.4238 8490.8066 C -7782.8521 8490.5273 L f -7781.3521 8491.1289 m -7781.2227 8491.252 -7781.2583 8491.3193 -7781.4326 8491.3154 C -7781.4453 8491.2383 -7781.3877 8491.1992 -7781.3521 8491.1289 C f -7781.2456 8490.7969 m -7781.1211 8490.793 -7781.0591 8490.8789 -7780.9985 8490.9629 C -7781.0029 8490.8369 -7781.2871 8491.041 -7781.2456 8490.7969 C f -7777.9893 8491.2207 m -7777.9111 8491.209 -7777.7417 8491.0879 -7777.6689 8491.25 C -7777.7505 8491.1367 -7778.0498 8491.4346 -7777.9893 8491.2207 C f -7776.4761 8491 m -7776.4272 8491.0098 -7776.4072 8491.0361 -7776.3506 8490.9961 C -7776.2607 8491.0625 -7776.3555 8491.1689 -7776.4312 8491.1826 C -7776.4761 8491 L f -7748.9287 8490.4141 m -7749.0923 8490.4863 L -7749.0684 8490.3418 L -7748.9287 8490.4141 L f -7736.8574 8490.4063 m -7736.6943 8490.3145 -7736.7441 8490.543 -7736.7168 8490.5645 C -7736.8643 8490.5801 -7736.6621 8490.3848 -7736.8574 8490.4063 C f -7730.3486 8489.6777 m -7730.3984 8489.6816 L -7730.3818 8489.3818 L -7730.3486 8489.6777 L f U %AI8_EndBrushPattern %AI8_BeginBrushPattern (Unnamed Brush Pat 3) 0 A u 0 J 0 j 1 w 4 M []0 d 0 XR -7791.5 8489.5273 m -7577.5361 8489.5273 L -7577.5361 8438.7266 L -7791.5 8438.7266 L -7791.5 8489.5273 L n u 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA 1 J 3 w -7775.3838 8473.0879 m -7775.3838 8480.4658 l -7758.9268 8487.2832 l -7758.9268 8478.8281 l S 1 Ap 0 O 0.019608 0.996078 0.976471 0 0.913725 0.109804 0.141176 Xa 0 J -7783.1016 8462.9727 m -7783.1016 8467.2871 -7784.6455 8470.7842 -7786.5508 8470.7842 c -7788.4561 8470.7842 -7790 8467.2871 -7790 8462.9727 c -7790 8458.6582 -7788.4561 8455.1602 -7786.5508 8455.1602 c -7784.6455 8455.1602 -7783.1016 8458.6582 -7783.1016 8462.9727 c b u 0 Ap 0.145098 1 1 0.047059 0.784314 0.094118 0.121569 Xa 1 w -7782.1484 8461.7461 m -7785.5508 8461.752 L -7788.9541 8461.7617 L -7788.9814 8462.1582 -7789 8462.5605 -7789 8462.9727 c -7789 8462.9766 -7789 8462.9785 -7789 8462.9824 C -7785.5508 8463.709 L -7782.1631 8464.4209 L -7739.1699 8473.4727 L -7739.1699 8461.6445 L -7782.1484 8461.7461 L f 0.019608 0.996078 0.976471 0 0.913725 0.109804 0.141176 Xa -7782.5439 8459.1504 m -7785.5508 8459.7969 L -7788.8213 8460.502 L -7788.8809 8460.9082 -7788.9248 8461.3301 -7788.9541 8461.7617 C -7785.5508 8461.752 L -7782.1484 8461.7461 L -7739.1699 8461.6445 L -7739.1699 8449.8047 L -7782.5439 8459.1504 L f 0.235294 1 1 0.180392 0.65098 0.078431 0.101961 Xa -7782.1631 8464.4209 m -7785.5508 8463.709 L -7789 8462.9824 L -7788.9971 8467.293 -7787.4551 8470.7842 -7785.5508 8470.7842 c -7785.0303 8470.7842 -7784.5391 8470.5176 -7784.0967 8470.0488 C -7739.1699 8485.7168 L -7739.1699 8473.4727 L -7782.1631 8464.4209 L f 0.003922 0.819608 0.588235 0 0.937255 0.333333 0.356863 Xa -7784.0547 8455.9414 m -7784.5078 8455.4453 -7785.0137 8455.1602 -7785.5508 8455.1602 c -7787.0742 8455.1602 -7788.3643 8457.3984 -7788.8213 8460.502 C -7785.5508 8459.7969 L -7782.5439 8459.1504 L -7739.1699 8449.8047 L -7739.1699 8440.2266 L -7784.0547 8455.9414 L f U 1 Ap 0.698039 0.67451 0.639216 0.741176 0.137255 0.121569 0.12549 Xa 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA 3 w -7739.1699 8440.2266 m -7733.6235 8440.2266 -7729.1279 8450.4102 -7729.1279 8462.9727 c -7729.1279 8475.5352 -7733.6235 8485.7168 -7739.1699 8485.7168 c -7744.7158 8485.7168 -7749.2109 8475.5352 -7749.2109 8462.9727 c -7749.2109 8450.4102 -7744.7158 8440.2266 -7739.1699 8440.2266 c B u 0 Ap 0.666667 0 0.34902 0 0.25098 0.74902 0.713726 Xa 1 w -7577.6758 8443.9697 m -7614.0205 8453.5303 -7685.8193 8439.2686 -7722.4155 8439.8994 C -7724.4775 8440.0723 -7725.5117 8440.1914 -7727.5742 8440.501 c -7729.6367 8440.8096 -7730.6675 8440.998 -7732.7295 8441.458 c -7734.7925 8441.917 -7735.8223 8442.1846 -7737.8848 8442.8105 c -7738.2021 8442.9063 -7738.7109 8443.0723 -7739.3154 8443.2754 c -7740.5088 8443.6738 -7742.0908 8444.2207 -7743.4268 8444.6865 C -7745.9072 8448.2354 -7747.8555 8454.8018 -7747.8555 8463.0322 c -7747.8555 8471.7031 -7745.6973 8478.5488 -7743.0283 8481.9434 C -7741.9346 8481.6641 -7740.4951 8481.3887 -7739.3154 8481.1309 c -7738.7529 8481.0098 -7738.2515 8480.8906 -7737.8848 8480.7793 c -7735.8223 8480.1553 -7734.7925 8479.8857 -7732.7295 8479.4258 c -7730.6675 8478.9658 -7729.6367 8478.7793 -7727.5742 8478.4697 c -7725.5117 8478.1602 -7724.4775 8478.042 -7722.4155 8477.8682 C -7685.8193 8477.2354 -7614.0205 8491.5 -7577.6758 8481.9395 C -7586.0762 8477.3857 -7590.2754 8474.2617 -7598.6758 8467.1738 C -7591.1045 8459.8818 -7584.3809 8452.0498 -7577.6758 8443.9697 C f U U U %AI8_EndBrushPattern %AI8_BeginBrushPattern (Unnamed Brush Pat 5) 0 A u 0 J 0 j 1 w 4 M []0 d 0 XR -7791.5 8491.5 m -7567.7979 8491.5 L -7567.7979 8448.123 L -7791.5 8448.123 L -7791.5 8491.5 L n u 0 O 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa -7791.5 8491.5 m -7742.5986 8491.5 L -7749.1279 8488.708 L -7769.4326 8480.0273 L -7769.4326 8463.9482 L -7769.4326 8461.3193 L -7791.5 8461.3193 L -7788.9033 8463.9482 L -7775.9404 8477.0674 L -7788.7705 8488.708 L -7791.5 8491.5 L f 0.623529 0.85098 0 0 0.47451 0.278431 0.623529 Xa -7769.4316 8448.123 m -7769.4316 8451.3506 L -7769.4316 8476.5449 L -7769.4316 8480.0273 L -7589.8662 8480.0273 L -7589.8662 8476.5449 L -7589.8662 8451.3506 L -7589.8662 8448.123 L -7769.4316 8448.123 L f 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa -7583.3584 8477.0674 m -7570.3965 8463.9482 L -7567.7979 8461.3193 L -7589.8662 8461.3193 L -7589.8662 8463.9482 L -7589.8662 8480.0273 L -7610.1709 8488.708 L -7616.7002 8491.5 L -7567.7979 8491.5 L -7570.5283 8488.708 L -7583.3584 8477.0674 L f -7742.5986 8491.5 m -7769.4326 8480.0273 L N u 0 O 0.85098 1 0.262745 0.160784 0.286275 0.12549 0.407843 Xa -7597.0215 8480.0273 m -7616.7002 8480.0273 L -7616.7002 8488.4395 L -7616.7002 8491.5 L -7589.8662 8480.0273 L -7597.0215 8480.0273 L f -7769.4326 8480.0273 m -7742.5986 8491.5 L -7742.5986 8488.4395 L -7742.5986 8480.0273 L -7762.2764 8480.0273 L -7769.4326 8480.0273 L f U U U %AI8_EndBrushPattern %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginPluginObject (Adobe Brush Manager Order) (Adobe Brush Manager Order) ( Adobe Calligraphic Brush Tool/ 2 pt. Oval/ Adobe Calligraphic) - ( Brush Tool/ 5 pt. Oval/ Adobe Calligraphic Brush Tool/ 3 pt. ) - (Flat/ Adobe Calligraphic Brush Tool/ 5 pt. Flat/ Adobe Calligr) - (aphic Brush Tool/ 3 pt. Round/ Adobe Calligraphic Brush Tool/ ) - (7 pt. Round/ Adobe ArtOnPath Brush Tool/ Charcoal/ Adobe ArtOn) - (Path Brush Tool/ Pencil - Thin/ Adobe ArtOnPath Brush Tool/ Ba) - (nner 1/ Adobe ArtOnPath Brush Tool/ Banner 2/) . %AI8_EndPluginObject %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (2 pt. Oval) (1 2 2 26 74 15 15 0 1 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (3 pt. Flat) (1 3 3 9 9 15 15 0 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (3 pt. Round) (1 3 3 100 100 0 0 0 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (5 pt. Flat) (1 5 5 0 0 90 90 0 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (5 pt. Oval) (1 5 5 10 90 -65 35 0 1 1 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (7 pt. Round) (1 7 7 100 100 0 0 0 0 0 0) . %AI8_EndPluginObject %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Banner 1) (1 / Unnamed Brush Pat 5/ / / / / 5 0.47451 0.278431 0.623529 /) - ( 1 0 1 0 1 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Banner 2) (1 / Unnamed Brush Pat 3/ / / / / 5 0.25098 0.74902 0.713726 / ) - ( 1 0 1 0 1 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Charcoal) (1 / Unnamed Brush Pat 2/ / / / / 0 1 / 1 1 1.2 0 1 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Pencil - Thin) (1 / Unnamed 18/ / / / / 0 1 / 1 1 1 0 1 0 0 0) . %AI8_EndPluginObject %AI5_End_NonPrinting-- %AI5_BeginPalette 0 0 Pb 1 1 1 1 ([Registration]) 0 Xs ([Registration]) Pc 0 0 0 0 1 1 1 Xa (White) Pc 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa (Black) Pc 0 0.992157 1 0 1 0 0 Xa (RGB Red) Pc 0.062745 0 0.964706 0 1 1 0 Xa (RGB Yellow) Pc 0.627451 0 1 0 0 1 0 Xa (RGB Green) Pc 0.517647 0 0.12549 0 0 1 1 Xa (RGB Cyan) Pc 0.882353 0.768627 0 0 0 0 1 Xa (RGB Blue) Pc 0.270588 0.815686 0 0 1 0 1 Xa (RGB Magenta) Pc 0.168627 0.980392 0.92549 0.066667 0.756863 0.152941 0.176471 Xa (R=193 G=39 B=45) Pc 0.003922 0.992157 0.972549 0 0.929412 0.109804 0.141176 Xa (R=237 G=28 B=36) Pc 0 0.796078 0.968627 0 0.945098 0.352941 0.141176 Xa (R=241 G=90 B=36) Pc 0 0.501961 0.984314 0 0.968627 0.576471 0.117647 Xa (R=247 G=147 B=30) Pc 0 0.34902 0.870588 0 0.984314 0.690196 0.231373 Xa (R=251 G=176 B=59) Pc 0.047059 0 0.933333 0 0.988235 0.933333 0.129412 Xa (R=252 G=238 B=33) Pc 0.188235 0 0.980392 0 0.85098 0.878431 0.129412 Xa (R=217 G=224 B=33) Pc 0.501961 0 0.992157 0 0.54902 0.776471 0.247059 Xa (R=140 G=198 B=63) Pc 0.745098 0 0.996078 0 0.223529 0.709804 0.290196 Xa (R=57 G=181 B=74) Pc 0.862745 0.176471 1 0.039216 0 0.572549 0.270588 Xa (R=0 G=146 B=69) Pc 0.901961 0.333333 0.988235 0.258824 0 0.407843 0.215686 Xa (R=0 G=104 B=55) Pc 0.760784 0 0.74902 0 0.133333 0.709804 0.45098 Xa (R=34 G=181 B=115) Pc 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa (R=0 G=169 B=157) Pc 0.698039 0.14902 0 0 0.160784 0.670588 0.886275 Xa (R=41 G=171 B=226) Pc 0.87451 0.52549 0 0 0 0.443137 0.737255 Xa (R=0 G=113 B=188) Pc 0.992157 0.964706 0.035294 0.003922 0.180392 0.192157 0.572549 Xa (R=46 G=49 B=146) Pc 1 1 0.262745 0.247059 0.105882 0.078431 0.392157 Xa (R=27 G=20 B=100) Pc 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa (R=102 G=45 B=145) Pc 0.494118 0.992157 0.011765 0 0.576471 0.152941 0.560784 Xa (R=147 G=39 B=143) Pc 0.34902 1 0.372549 0.109804 0.619608 0 0.364706 Xa (R=158 G=0 B=93) Pc 0.117647 1 0.494118 0.007843 0.831373 0.078431 0.352941 Xa (R=212 G=20 B=90) Pc 0 0.968627 0.203922 0 0.929412 0.117647 0.47451 Xa (R=237 G=30 B=121) Pc 0.227451 0.27451 0.4 0 0.780392 0.698039 0.6 Xa (R=199 G=178 B=153) Pc 0.4 0.427451 0.52549 0.066667 0.6 0.52549 0.458824 Xa (R=153 G=134 B=117) Pc 0.505882 0.529412 0.607843 0.235294 0.45098 0.388235 0.341176 Xa (R=115 G=99 B=87) Pc 0.576471 0.603922 0.639216 0.419608 0.32549 0.278431 0.254902 Xa (R=83 G=71 B=65) Pc 0.227451 0.384314 0.635294 0.011765 0.776471 0.611765 0.427451 Xa (R=198 G=156 B=109) Pc 0.317647 0.490196 0.741176 0.098039 0.65098 0.486275 0.321569 Xa (R=166 G=124 B=82) Pc 0.360784 0.572549 0.839216 0.227451 0.54902 0.384314 0.223529 Xa (R=140 G=98 B=57) Pc 0.392157 0.639216 0.933333 0.356863 0.458824 0.298039 0.141176 Xa (R=117 G=76 B=36) Pc 0.415686 0.698039 0.968627 0.490196 0.376471 0.219608 0.07451 Xa (R=96 G=56 B=19) Pc 0.478431 0.733333 0.835294 0.682353 0.258824 0.129412 0.043137 Xa (R=66 G=33 B=11) Pc Bb 2 (Linear Gradient 1) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Linear Gradient 1) Pc Bb 0 0 0 0 Bh 2 (Radial Gradient 1) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Radial Gradient 1) Pc Bb 2 (Red Linear Gradient) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Red Linear Gradient) Pc Bb 2 (Gray Linear Gradient) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Gray Linear Gradient) Pc Bb 0 0 0 0 Bh 2 (Purple Radial Gradient) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Purple Radial Gradient) Pc (Checked Pattern) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p (Checked Pattern) Pc 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 Xa (R=236 G=28 B=36) Pc 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa (R=0 G=169 B=157) Pc 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa (R=102 G=45 B=145) Pc 0.486274 0.364706 0.337255 0.015686 0.545098 0.572549 0.596078 Xa (R=139 G=146 B=152 1) Pc 0 g (K=100) Pc 0.1 g (K=90) Pc 0.2 g (K=80) Pc 0.3 g (K=70) Pc 0.4 g (K=60) Pc 0.5 g (K=50) Pc 0.6 g (K=40) Pc 0.7 g (K=30) Pc 0.8 g (K=20) Pc 0.9 g (K=10) Pc 0.95 g (K=5) Pc PB %AI5_EndPalette %%EndSetup %AI5_BeginLayer 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (Layer 1) Ln 0 A u *u 0 O 0 g 0 J 0 j 1 w 4 M []0 d 0 XR 316.9551 360.353 m 324.6411 360.353 331.1836 357.6704 336.5806 352.3062 c 339.1641 349.7222 341.1265 346.77 342.4683 343.4502 c 343.8091 340.1299 344.48 336.606 344.48 332.877 c 344.48 329.1152 343.8174 325.5913 342.4927 322.3037 c 341.168 319.0166 339.2129 316.1133 336.6294 313.5952 c 333.9473 310.9458 330.9053 308.917 327.5039 307.5112 c 324.1016 306.1045 320.5859 305.4014 316.9551 305.4014 c 313.3242 305.4014 309.8486 306.0957 306.5288 307.4868 c 303.2085 308.8765 300.2319 310.8882 297.5991 313.5215 c 294.9658 316.1538 292.9629 319.1226 291.5889 322.4263 c 290.2153 325.73 289.5283 329.2134 289.5283 332.877 c 289.5283 336.5078 290.2227 339.999 291.6138 343.3521 c 293.0034 346.7046 295.0234 349.7061 297.6729 352.3555 c 302.9058 357.6865 309.333 360.353 316.9551 360.353 c f 1 D 317.0532 355.3975 m 310.7729 355.3975 305.4902 353.2056 301.2056 348.8228 c 299.0469 346.6309 297.3862 344.1694 296.2256 341.4385 c 295.064 338.707 294.4839 335.853 294.4839 332.877 c 294.4839 329.9331 295.064 327.0952 296.2256 324.3647 c 297.3862 321.6328 299.0469 319.1958 301.2056 317.0542 c 303.3643 314.9111 305.8008 313.2759 308.5161 312.1475 c 311.2305 311.019 314.0762 310.4551 317.0532 310.4551 c 319.9971 310.4551 322.8501 311.0269 325.6147 312.1724 c 328.3784 313.3169 330.8721 314.9688 333.0972 317.1274 c 337.3818 321.314 339.5244 326.564 339.5244 332.877 c 339.5244 335.9189 338.9678 338.7969 337.856 341.5122 c 336.7437 344.2271 335.1245 346.647 332.999 348.7739 c 328.583 353.1895 323.2676 355.3975 317.0532 355.3975 c f 0 D 316.7095 337.4399 m 313.0298 335.5264 L 312.6372 336.3438 312.1543 336.9165 311.5825 337.2437 c 311.0098 337.5703 310.4785 337.7344 309.9878 337.7344 c 307.5347 337.7344 306.3081 336.1152 306.3081 332.877 c 306.3081 331.4053 306.6187 330.2275 307.2402 329.3447 c 307.8613 328.4614 308.7773 328.0195 309.9878 328.0195 c 311.5903 328.0195 312.7188 328.8047 313.3735 330.375 c 316.7588 328.6577 L 316.0391 327.3159 315.0415 326.2612 313.7656 325.4932 c 312.4902 324.7241 311.0835 324.3398 309.5464 324.3398 c 307.0933 324.3398 305.1138 325.0923 303.6099 326.5967 c 302.105 328.1011 301.3525 330.1948 301.3525 332.877 c 301.3525 335.4937 302.1133 337.5703 303.6343 339.1084 c 305.1553 340.6455 307.0762 341.4141 309.3989 341.4141 c 312.8008 341.4141 315.2378 340.0894 316.7095 337.4399 c f 332.5571 337.4399 m 328.9268 335.5264 L 328.5342 336.3438 328.0513 336.9165 327.479 337.2437 c 326.9063 337.5703 326.3584 337.7344 325.8354 337.7344 c 323.3823 337.7344 322.1558 336.1152 322.1558 332.877 c 322.1558 331.4053 322.4663 330.2275 323.0879 329.3447 c 323.709 328.4614 324.625 328.0195 325.8354 328.0195 c 327.438 328.0195 328.5664 328.8047 329.2207 330.375 c 332.6553 328.6577 L 331.9023 327.3159 330.8892 326.2612 329.6133 325.4932 c 328.3379 324.7241 326.9473 324.3398 325.4429 324.3398 c 322.957 324.3398 320.9697 325.0923 319.4819 326.5967 c 317.9932 328.1011 317.2495 330.1948 317.2495 332.877 c 317.2495 335.4937 318.0098 337.5703 319.5308 339.1084 c 321.0518 340.6455 322.9731 341.4141 325.2959 341.4141 c 328.6973 341.4141 331.1177 340.0894 332.5571 337.4399 c f *U U LB %AI5_EndLayer-- %AI3_BeginCrops userdict /AI3_noCropMarks known not { 0 A u u 0 R 1 1 1 1 ([Registration]) 0 XS 0 J 0 j 0.5 w 4 M []0 d 0 XR 275 299.457 m 248 299.457 L S 284 290.457 m 284 263.457 L S U u 275 365.457 m 248 365.457 L S 284 374.457 m 284 401.457 L S U u 359 365.457 m 386 365.457 L S 350 374.457 m 350 401.457 L S U u 359 299.457 m 386 299.457 L S 350 290.457 m 350 263.457 L S U U } if %AI3_EndCrops %%PageTrailer gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec +Adobe_shading_AI8 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_pattern_AI5 /terminate get exec +AGM_Gradient /terminate get exec +Adobe_cshow /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF \ No newline at end of file diff --git a/lectures/images/cc/sa.eps b/lectures/images/cc/sa.eps new file mode 100644 index 0000000..12dedf9 --- /dev/null +++ b/lectures/images/cc/sa.eps @@ -0,0 +1,5902 @@ +%!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 8.0 %%AI8_CreatorVersion: 13.0.1 %%For: (Alex Roberts) () %%Title: (sa.eps) %%CreationDate: 3/25/08 10:41 AM %%BoundingBox: 289 305 345 361 %%HiResBoundingBox: 289.5283 305.3525 344.48 360.3037 %%DocumentProcessColors: Black %%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0 %%+ procset AGM_Gradient 1.0 0 %%+ procset Adobe_ColorImage_AI6 1.3 0 %%+ procset Adobe_Illustrator_AI5 1.3 0 %%+ procset Adobe_pattern_AI5 1.0 0 %%+ procset Adobe_cshow 2.0 8 %%+ procset Adobe_shading_AI8 1.0 0 %AI5_FileFormat 4.0 %AI3_ColorUsage: Color %AI3_IncludePlacedImages %AI7_ImageSettings: 1 %%CMYKProcessColor: 0.74902 0.678431 0.670588 0.901961 ([Registration]) %%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set) %%+ Options: 1 16 0 1 1 1 0 0 0 0 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 2 3 4 %%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 -1 -1 () %AI3_Cropmarks: 284 299.457 350 365.457 %AI3_TemplateBox: 400 300 400 300 %AI3_TileBox: -61 44.457 673 620.457 %AI3_DocumentPreview: Macintosh_ColorPic %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI8_OpenToView: 194.2319 403.7681 5.8562 1268 706 18 1 0 202 236 0 0 %AI5_OpenViewLayers: 7 %%PageOrigin:-66.3003 -266.2988 %AI7_GridSettings: 48 8 48 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments %%BeginProlog %%BeginResource: procset Adobe_level2_AI5 1.2 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation) +%%Version: 1.2 0 +%%CreationDate: (04/10/93) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /Adobe_level2_AI5 26 dict dup begin + put + /packedarray where not + { + userdict begin + /packedarray + { + array astore readonly + } bind def + /setpacking /pop load def + /currentpacking false def + end + 0 + } if + pop + userdict /defaultpacking currentpacking put true setpacking + /initialize + { + Adobe_level2_AI5 begin + } bind def + /terminate + { + currentdict Adobe_level2_AI5 eq + { + end + } if + } bind def + mark + /setcustomcolor where not + { + /findcmykcustomcolor + { + (AI8_CMYK_CustomColor) + 6 packedarray + } bind def + /findrgbcustomcolor + { + (AI8_RGB_CustomColor) + 5 packedarray + } bind def + /setcustomcolor + { + exch + aload pop dup + (AI8_CMYK_CustomColor) eq + { + pop pop + 4 + { + 4 index mul + 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } + { + dup (AI8_RGB_CustomColor) eq + { + pop pop + 3 + { + 1 exch sub + 3 index mul + 1 exch sub + 3 1 roll + } repeat + 4 -1 roll pop + setrgbcolor + } + { + pop + 4 + { + 4 index mul 4 1 roll + } repeat + 5 -1 roll pop + setcmykcolor + } ifelse + } ifelse + } + def + } if + /setAIseparationgray + { + false setoverprint + 0 setgray + /setseparationgray where{ + pop setseparationgray + }{ + /setcolorspace where{ + pop + [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace + 1 exch sub setcolor + }{ + setgray + }ifelse + }ifelse + } def + + /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def + userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put + userdict /level2? + systemdict /languagelevel known dup + { + pop systemdict /languagelevel get 2 ge + } if + put +/level2ScreenFreq +{ + begin + 60 + HalftoneType 1 eq + { + pop Frequency + } if + HalftoneType 2 eq + { + pop GrayFrequency + } if + HalftoneType 5 eq + { + pop Default level2ScreenFreq + } if + end +} bind def +userdict /currentScreenFreq + level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put +level2? not + { + /setcmykcolor where not + { + /setcmykcolor + { + exch .11 mul add exch .59 mul add exch .3 mul add + 1 exch sub setgray + } def + } if + /currentcmykcolor where not + { + /currentcmykcolor + { + 0 0 0 1 currentgray sub + } def + } if + /setoverprint where not + { + /setoverprint /pop load def + } if + /selectfont where not + { + /selectfont + { + exch findfont exch + dup type /arraytype eq + { + makefont + } + { + scalefont + } ifelse + setfont + } bind def + } if + /cshow where not + { + /cshow + { + [ + 0 0 5 -1 roll aload pop + ] cvx bind forall + } bind def + } if + } if + cleartomark + /anyColor? + { + add add add 0 ne + } bind def + /testColor + { + gsave + setcmykcolor currentcmykcolor + grestore + } bind def + /testCMYKColorThrough + { + testColor anyColor? + } bind def + userdict /composite? + 1 0 0 0 testCMYKColorThrough + 0 1 0 0 testCMYKColorThrough + 0 0 1 0 testCMYKColorThrough + 0 0 0 1 testCMYKColorThrough + and and and + put + composite? not + { + userdict begin + gsave + /cyan? 1 0 0 0 testCMYKColorThrough def + /magenta? 0 1 0 0 testCMYKColorThrough def + /yellow? 0 0 1 0 testCMYKColorThrough def + /black? 0 0 0 1 testCMYKColorThrough def + grestore + /isCMYKSep? cyan? magenta? yellow? black? or or or def + /customColor? isCMYKSep? not def + end + } if + end defaultpacking setpacking +%%EndResource +%%BeginResource: procset AGM_Gradient_Sep 1.0 0 +%%Title: (AGM Gradient Procset) +%%Version: 1.0 0 +%%CreationDate: (4/26/96) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /AGM_Gradient_Sep 5 dict dup begin put +/AGM_Gradient_Sep_private 100 dict def +/initialize{ + AGM_Gradient_Sep begin + AGM_Gradient_Sep_private begin + _compositeJob{ + initializeSinglePassSeps + }{ + initializeMultiPassSeps + }ifelse + initializeSeps + AGM_Gradient_private begin + /_fillSD newSpotDict def + /_rampSD newSpotDict def + /_nCustomColorSD nd + end + AGM_Gradient_Sep_private + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + AGM_Gradient_Sep + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + end + + currentdict readonly pop + end +}def +/terminate{ + currentdict AGM_Gradient_Sep eq{ + end + }if +}def +AGM_Gradient_Sep_private begin +/initializeSeps{ + /currentoverprint { _of } def + _noImage not _level2PS not and{ + /linealFill{ + currentoverprint{ + 0 0 1 1 rectfill + }{ + mySave + 8 setImageParms + _color{ + _nCustomColorSD begin + cyan magenta yellow black + + _spotColor{ + spot1/tintImage spot1/tintValue get 1 exch sub makeByte8 put + spot2/tintImage spot2/tintValue get 1 exch sub makeByte8 put + }if + end + + 4{ + makeByte8 4 1 roll + }repeat + true 4 _nCustomColorSD ncolorimage + }{ + _nCustomColorSD/black get 1 exch sub makeByte8 + _nCustomColorSD bwImage + }ifelse + myRestore + }ifelse + }def + }if + /_whiteBytes 1 makeByte8 pt + /knockOut{ + _noImage _level2PS or currentoverprint or{ + gsave + false setoverprint + 1 setgray + 0 0 1 1 rectfill + grestore + }{ + 8 setImageParms _whiteBytes /_image load 5 execImage + }ifelse + }def + /newSpotDict{ + 11 dict dup begin + /nSpots 2 def + /spot1 7 dict def + /spot2 7 dict def + end + }def + /initSpotData + { + begin + /name nd + /tintImage nd + /tintValue nd + /spot_C nd + /spot_M nd + /spot_Y nd + /spot_K nd + end + }def + /initSpotDict{ + begin + /cyanInk nd + /magentaInk nd + /yellowInk nd + /blackInk nd + /cyan nd + /magenta nd + /yellow nd + /black nd + spot1 initSpotData + spot2 initSpotData + end + }def + /copySpotDict{ + /_dst xp + begin + cyanInk magentaInk yellowInk blackInk + cyan magenta yellow black + spot1 spot2 + end + _dst begin + /spot1 spot1 maxlength dict def + /spot2 spot2 maxlength dict def + spot2 copy pop + spot1 copy pop + /black xd + /yellow xd + /magenta xd + /cyan xd + /blackInk xd + /yellowInk xd + /magentaInk xd + /cyanInk xd + end + }def + /setCustomColor + { + 1 index /Black eq{ + 6 1 roll 5 npop + 1 exch sub + setgray + }{ + 6 1 roll _ccAry1 astore exch + dup null eq{ + pop 0 + }if + setcustomcolor + }ifelse + }def + /setCStop{ + /_colorStyle exch pt + + _colorStyle 0 eq{ + 0 0 0 + 4 -1 roll + 1 exch sub + _spotColor{ + /_colorStyle 3 pt + /Black + 1 index + 1 exch sub + }if + }if + _colorStyle 2 eq{ + 3 npop + }if + _rampSD _fillSD copySpotDict + + _colorStyle 4 eq{ + pop + 9 2 roll 3 npop 6 -2 roll + } if + + _colorStyle 3 eq _colorStyle 4 eq or{ + + _fillSD begin + /_spot1 spot1 pt + /_spot2 spot2 pt + end + + exch dup _spot1/name get eq{ + _spot1 _spot2 + }{ + _spot2 _spot1 + }ifelse + begin + begin + /name xd + 1 exch sub /tintValue xd + 4{ + tintValue mul 4 1 roll + }repeat + _spotColor not{ + /tintValue null def + }if + end + /tintValue 0 def + end + }if + _fillSD nsetcustomcolor + }def + /renderCMYK{ + spot1/name get null eq + spot2/name get null eq and + dup not{ + pop + spot1 spotConverted + }if + dup not{ + pop + spot2 spotConverted + }if + }def + /currentInk{ + true + _inRipSep{ + currentcolorspace 0 get + dup /DeviceGray eq + 1 index /DeviceCMYK eq or{ + pop + currentcmykcolor add add add 0 eq{ + pop false + }if + }{ + /Separation eq{ + currentcolor 0 eq{ + pop false + }if + }if + }ifelse + }{ + currentgray 1 eq{ + pop false + }if + }ifelse + }def + /currentInkN{ + + _nCustomColorSD begin + /_spot1 spot1 pt + /_spot2 spot2 pt + renderCMYK + end + { + currentInk + }{ + gsave + _spot1 begin + name null ne{ + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + currentInk + }{ + false + }ifelse + end + _spot2 begin + name null ne{ + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + currentInk + }{ + false + }ifelse + end + grestore + + or + } ifelse + }def + /fill_ /fill load def + /fillOvp{ + currentoverprint{ + _inRipSep{ + currentcolorspace 0 get + dup /DeviceGray eq + 1 index /DeviceCMYK eq or{ + pop + currentcmykcolor add add add 0 eq{ + newpath + }if + }{ + /Separation eq{ + currentcolor 0 eq{ + newpath + }if + }if + }ifelse + }{ + currentgray 1 eq{ + newpath + }if + }ifelse + }if + fill_ + }def + /fill{ + _nCustomColorSD begin + /_spot1 spot1 pt + /_spot2 spot2 pt + renderCMYK + end + + { + fillOvp + }{ + _spot1 begin + gsave + name null ne{ + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + }{ + 1 setgray + }ifelse + fillOvp + grestore + end + _spot2 begin + name null ne{ + gsave + true setoverprint + spot_C spot_M spot_Y spot_K name tintValue setCustomColor + fillOvp + grestore + }if + end + newpath + }ifelse + }def + /expandSpot{ + _spotColor{ + /_len xp + _rampSD begin + spot1 begin + tintImage null ne{ + tintImage _len expandOne /tintImage xd + }if + end + spot2 begin + tintImage null ne{ + tintImage _len expandOne /tintImage xd + }if + end + end + }{ + pop + }ifelse + }def + /rampImage{ + currentoverprint{ + rectImage + }{ + _enabledSmoothShade{ + fillRamp + }{ + _color{ + _rampSD begin + /cyanInk _cyanData 0 ne def + /magentaInk _magentaData 0 ne def + /yellowInk _yellowData 0 ne def + /blackInk _blackData 0 ne def + end + + _nSamples setImageParms + _nSamples expandSpot + _cyanData _magentaData _yellowData _blackData _nSamples 4 expandColor + true 4 _rampSD ncolorimage + }{ + _rampSD begin + /cyanInk false def + /magentaInk false def + /yellowInk false def + /blackInk true def + end + _nSamples setImageParms + _blackData _rampSD bwImage + }ifelse + }ifelse + }ifelse + }def + /nsetcustomcolor where{ + pop + }{ + /nsetcustomcolor + { + /_nCustomColorSD xp + _nCustomColorSD begin + 4 copy + /black xd + /yellow xd + /magenta xd + /cyan xd + 4 copy + 0 ne /blackInk xd + 0 ne /yellowInk xd + 0 ne /magentaInk xd + 0 ne /cyanInk xd + end + setcmykcolor + }def + }ifelse + /nsetcustomcolorend where{ + pop + }{ + /nsetcustomcolorend + { + /_nCustomColorSD null pt + }def + }ifelse +}def +/initializeSinglePassSeps{ + /_decodeNorm [0 1] pt + /_decodeInvert [1 0] pt + /spotConverted + { + begin + name null eq{ + false + }{ + tintValue null eq tintImage null eq and{ + true + }{ + _inDistiller{ + false + }{ + false + currentpagedevice/SeparationColorNames get{name eq or}forall + not + }ifelse + }ifelse + }ifelse + end + }def + /dictImage + { + 20 dict dup begin + /Dict xd + /Decode xd + /DataSource xd + /ImageMatrix xd + /BitsPerComponent xd + /Height xd + /Width xd + /ImageType 1 def + Dict + end + /_image load 1 execImage + }def + /bwImage{ + begin + gsave + currentoverprint{ + blackInk{ + [/Separation /Black /DeviceGray{}] setcolorspace + _decodeInvert dictImage + }{ + 5 npop + }ifelse + }{ + /DeviceGray setcolorspace + _decodeNorm dictImage + }ifelse + grestore + end + }def + /ncolorimage where{ + pop + }{ + /ncolorimage{ + begin + renderCMYK{ + cyanInk + magentaInk and + yellowInk and + blackInk and + not + currentoverprint + and{ + pop pop + gsave + cyanInk{ + 8 copy + [/Separation /Cyan /DeviceGray{}] setcolorspace + 3 npop + _decodeNorm dictImage + }if + magentaInk{ + 8 copy + [/Separation /Magenta /DeviceGray{}] setcolorspace + 4 -1 roll + 3 npop + _decodeNorm dictImage + }if + yellowInk{ + 8 copy + [/Separation /Yellow /DeviceGray{}] setcolorspace + 4 -2 roll + 3 npop + _decodeNorm dictImage + }if + blackInk{ + 4 -3 roll + [/Separation /Black /DeviceGray{}] setcolorspace + 3 npop + _decodeNorm dictImage + }{ + 8 npop + }ifelse + grestore + }{ + /_colorimage load 10 execImage + }ifelse + }{ + 6 npop + gsave + spot1 begin + name null ne tintImage null ne and{ + [/Separation name /DeviceGray{}] setcolorspace + 4 copy + tintImage + name /Black eq{ + _decodeNorm + }{ + _decodeInvert + }ifelse + dictImage + }{ + 1 setgray fill + }ifelse + end + spot2 begin + true setoverprint + name null ne tintImage null ne and{ + [/Separation name /DeviceGray{}] setcolorspace + tintImage + name /Black eq{ + _decodeNorm + }{ + _decodeInvert + }ifelse + dictImage + }{ + 4 npop + 1 setgray fill + }ifelse + end + grestore + }ifelse + end + }def + }ifelse + /getRampColorSpace{ + + /_renderCMYK _rampSD begin renderCMYK end pt + + _renderCMYK not{ + _rampSD begin + [/DeviceN + [ + spot1 begin + name null ne tintImage null ne and{ + name + }if + end + spot2 begin + name null ne tintImage null ne and{ + name + }if + end + ] + _inDistiller { + /DeviceCMYK [ + spot1 begin + name null ne tintImage null ne and{ + spot_C spot_M spot_Y spot_K 1 + }{ + 0 0 0 0 0 + }ifelse + end + spot2 begin + name null ne tintImage null ne and{ + spot_C spot_M spot_Y spot_K 2 + }{ + 0 0 0 0 0 + }ifelse + end + 5 1 roll 6 -2 roll add + dup 1 eq { + pop + 8 /index cvx 1 /exch cvx /sub cvx + 9 1 /roll cvx + }{ + 2 eq { + 8 /index cvx 1 /exch cvx /sub cvx + 10 1 /roll cvx + }if + }ifelse + 4 1 /roll cvx 5 -2 /roll cvx + 8 /index cvx /mul cvx /exch cvx 9 /index cvx /mul cvx /add cvx 7 1 /roll cvx + 3 1 /roll cvx 4 -2 /roll cvx + 7 /index cvx /mul cvx /exch cvx 8 /index cvx /mul cvx /add cvx 6 1 /roll cvx + 2 1 /roll cvx 3 -2 /roll cvx + 6 /index cvx /mul cvx /exch cvx 7 /index cvx /mul cvx /add cvx 5 1 /roll cvx + 5 /index cvx /mul cvx /exch cvx 6 /index cvx /mul cvx /add cvx 4 1 /roll cvx + 6 -2 /roll cvx /pop cvx /pop cvx + ] cvx bind + }{ + /DeviceCMYK {} + }ifelse + ] setcolorspace + end + /_nColorSpace currentcolorspace pt + }if + + _nSamples 1 gt{ + /_ndx 0 pt + [blendColor] cvx exec + }if + _renderCMYK{ + /_C0 [currentcolor] pt + /_C0_Space currentcolorspace pt + }{ + /_C0 [ + _nCustomColorSD begin + spot1 begin + name null ne{ + tintValue + }if + end + spot2 begin + name null ne{ + tintValue + }if + end + end + ] pt + /_C0_Space _nColorSpace pt + }ifelse + + _nSamples 1 gt{ + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + }if + _renderCMYK{ + /_C1 [currentcolor] pt + /_C1_Space currentcolorspace pt + }{ + /_C1 [ + _nCustomColorSD begin + spot1 begin + name null ne{ + tintValue + }if + end + spot2 begin + name null ne{ + tintValue + }if + end + end + ] pt + /_C1_Space _nColorSpace pt + }ifelse + + /_rampColorSpace _C0_Space pt + _spotColor{ + nsetcustomcolorend + }if + }def +}def +/initializeMultiPassSeps{ + /invertXfer{ + [ + { + 1 exch sub + }/exec load systemdict /currenttransfer get exec /exec load + ] cvx systemdict /settransfer get exec + }def + /ccThrough{ + gsave + 1 setCustomColor + currentcmykcolor + grestore + add add add 0 ne + }def + /spotConverted + { + begin + _isCMYKSep not{ + false + }{ + name null eq{ + false + }{ + tintValue null eq tintImage null eq and{ + true + }{ + spot_C spot_M spot_Y spot_K name ccThrough + }ifelse + }ifelse + }ifelse + end + }def + /spotChannel + { + _isCMYKSep{ + pop false + }{ + /_spotDict xp + _spotDict/name get null eq{ + false + }{ + _spotDict/spot_C get + _spotDict/spot_M get + _spotDict/spot_Y get + _spotDict/spot_K get + _spotDict/name get + ccThrough + }ifelse + }ifelse + }def + /getChannelData + { + _isCMYKSep dup{ + pop renderCMYK + }if + { + _blackPlate{ + 4 1 roll 3 npop blackInk + }{ + _yellowPlate{ + 4 2 roll 3 npop yellowInk + }{ + _magentaPlate{ + 4 3 roll 3 npop magentaInk + }{ + 3 npop cyanInk + }ifelse + }ifelse + }ifelse + { + true /nonZeroData + }{ + true /zeroData + }ifelse + }{ + 4 npop + spot1/name get null ne + spot1 spotChannel and{ + spot1/tintImage get dup null ne{ + false /nonZeroData + }{ + pop false /noData + }ifelse + }{ + spot2/name get null ne + spot2 spotChannel and{ + spot2/tintImage get dup null ne{ + false /nonZeroData + }{ + pop false /noData + }ifelse + }{ + false /noData + }ifelse + }ifelse + }ifelse + }def + /renderChannelData + { + /_tmp xp + _tmp /nonZeroData ne currentoverprint and{ + pop + _tmp /zeroData eq{pop}if + 4 npop + }{ + _tmp /nonZeroData eq{ + { + invertXfer + }if + systemdict/image + get 5 execImage + }{ + pop + _tmp /zeroData eq{pop}if + 4 npop + knockOut + }ifelse + }ifelse + }def + /bwImage{ + begin + gsave + dup dup dup + getChannelData + exch pop false exch + renderChannelData + grestore + end + }def + /ncolorimage{ + begin + pop pop + gsave + spot2/name get null ne spot2 spotChannel and{ + true setoverprint + }if + getChannelData + renderChannelData + grestore + end + }def + /getRampColorSpace{ + + /_renderCMYK _rampSD begin renderCMYK end pt + + _nSamples 1 gt{ + /_ndx 0 pt + [blendColor] cvx exec + }if + + _renderCMYK{ + /_C0 [currentcolor] pt + /_C0_Space currentcolorspace pt + }{ + /_C0 [ + _nCustomColorSD begin + 0 + spot1 begin + name null ne + tintValue null ne and + spot1 spotChannel and{ + pop tintValue + }if + end + spot2 begin + name null ne + tintValue null ne and + spot2 spotChannel and{ + pop tintValue + }if + end + 1 exch sub + end + ] pt + /_C0_Space /DeviceGray pt + }ifelse + + _nSamples 1 gt{ + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + }if + + _renderCMYK{ + /_C1 [currentcolor] pt + /_C1_Space currentcolorspace pt + }{ + /_C1 [ + _nCustomColorSD begin + 0 + spot1 begin + name null ne + tintValue null ne and + spot1 spotChannel and{ + pop tintValue + }if + end + spot2 begin + name null ne + tintValue null ne and + spot2 spotChannel and{ + pop tintValue + }if + end + 1 exch sub + end + ] pt + /_C1_Space /DeviceGray pt + }ifelse + + /_rampColorSpace _C0_Space pt + _spotColor{ + nsetcustomcolorend + }if + }def +}def +end +end +defaultpacking setpacking +%%EndResource +%%BeginResource: procset AGM_Gradient 1.0 0 +%%Title: (AGM Gradient Procset) +%%Version: 1.0 0 +%%CreationDate: (4/26/96) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /AGM_Gradient 20 dict dup begin put +/AGM_Gradient_private 201 dict def +/initialize +{ + AGM_Gradient begin + AGM_Gradient_private begin + initializeVars + + /bd systemdict/mark get def + /ed + _level2PS + { + (>>) + }{ + (counttomark 2 idiv dup dict begin {def} repeat pop currentdict end) + } ifelse + cvx def + + _level2PS{ + initializeLev2 + }{ + initializeLev1 + }ifelse + + queryDevice + + initializeRectFill + initializeShading + initializeOps + _producingSeps{ + AGM_Gradient_Sep/initialize get exec + }{ + initializeComposite + }ifelse + _illustrator{ + /f{}def + /F{}def + /s{}def + /S{}def + /b{}def + /B{}def + }if + /image where{ + /image get /_image xd + }if + /colorimage where{ + /colorimage get /_colorimage xd + }if + AGM_Gradient_private + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + AGM_Gradient + { + dup xcheck 1 index type /arraytype eq and + { + bind + }if + pop pop + }forall + end + + currentdict readonly pop + end +}def +/initializeAI +{ + pop pop + AGM_Gradient/AGM_Gradient_private get /_illustrator true put + AGM_Gradient/initialize get exec + AGM_Gradient begin +}def +/unload{ + systemdict/languagelevel known{ + systemdict/languagelevel get 2 ge{ + userdict/AGM_Gradient_Sep 2 copy known{ + undef + }{ + pop pop + }ifelse + userdict/AGM_Gradient 2 copy known{ + undef + }{ + pop pop + }ifelse + }if + }if +}def +/terminate{ + currentdict AGM_Gradient eq{ + end + }if +}def + +AGM_Gradient_private begin +/initializeVars{ + /_d255 256 array def + 0 1 255{ + _d255 exch dup 255 div put + }bind for + /_d255- 256 array def + 0 1 255{ + _d255- exch 1 _d255 2 index get sub put + }bind for + /_sSave nd + /_dUserSpace matrix defaultmatrix def + /_bUMatrix matrix def + /_imageMatrix matrix def + /_saveMatrix matrix def + /_xm matrix def + /_ccAry1 5 array def + /_bbox 4 array pt + /_level2PS + systemdict/languagelevel known dup{ + pop systemdict/languagelevel get 2 ge + }if + def + /_level3PS + _level2PS systemdict/shfill known and + def + currentdict /_illustrator known not{ + /_illustrator false def + }if + +}def +/initializeOps +{ + AGM_Gradient begin + currentdict/Bc known not{ + /Bc{ + + _renderFlag 2 eq _enabledSmoothShade or{ + 6 npop + }{ + pushBSpace + _rampIndex 0 eq{ + pop pop + setCStop + }if + linealFill + popBSpace + }ifelse + + }def + }if + + currentdict/Bg known not{ + /Bg{ + 10 npop + /_gradName xp + /_renderFlag xp + /_enabledSmoothShade false pt + + _renderFlag 2 ne{ + + _illustrator{ + _of setoverprint + }if + + /_enabledSmoothShade + _level3PS{ + _usingSmoothShade + _producingSeps not + currentoverprint not or and + _noImage not and + }{ + false + }ifelse + pt + + _illustrator _eo and _renderFlag 3 eq or{ + eoclip + }{ + clip + }ifelse + + _gradNames _gradName 2 copy known{ + get + mark exch aload pop + /_gradType xp + 1 sub dup /_rampIndex xp + /_maxRampIndex xp + mark exch aload pop + 0 0 + }if + pop pop + getRampData + }{ + mark mark + }ifelse + }def + }if + + currentdict/Bm known not{ + /Bm{ + _renderFlag 2 ne{ + _gradType 0 eq{ + linealRamp + }{ + radialGrad + }ifelse + }{ + 6 npop + }ifelse + }def + }if + + currentdict/Bh known not{ + /Bh{ + 2 npop + /_yHi xp + /_xHi xp + /_radHilite _xHi 0 ne _yHi 0 ne or pt + }def + }if + + currentdict/Bn known not{ + /Bn{ + AGM_Gradient_private begin + dict /_gradNames xp + end + }def + }if + + currentdict/Bd known not{ + /Bd{ + AGM_Gradient begin + AGM_Gradient_private begin + /_nColorsBd xp + /_gradType xp + /_gradName xp + }def + }if + + currentdict/BD known not{ + /BD{ + currentdict/_gradNames known not{ + /_gradNames 20 dict def + }if + ] _nColorsBd _gradType + ] _gradName exch /_gradNames xput + end + end + }def + }if + + currentdict/Bb known not{ + /Bb{ + + AGM_Gradient/AGM_Gradient_private get /_illustrator get not{ + AGM_Gradient begin + }if + AGM_Gradient_private begin + _producingSeps{ + AGM_Gradient_Sep/AGM_Gradient_Sep_private get begin + }if + mySave + }def + }if + + currentdict/BB known not{ + /BB{ + + /_tmp xp + cleartomark cleartomark + + _tmp dup + _renderFlag + + myRestore + + _producingSeps{ + end + }if + + _illustrator dup + end + not { + end + }if + + { + 2 ne exch 0 gt and{ + 2 eq{ + s + }{ + S + }ifelse + }{ + pop newpath + }ifelse + }{ + pop newpath + }ifelse + + + }def + }if + + currentdict/Xm known not{ + /Xm{ + _xm astore pop + }def + }if + + end +}def +/queryDevice{ + /_inDistiller + systemdict /currentdistillerparams known + def + /_inRipSep + _level2PS{ + currentpagedevice/Separations 2 copy known{ + get + }{ + pop pop false + }ifelse + }{ + false + }ifelse + _inDistiller or + def + /_noImage /lv1Fix where{ + pop lv1Fix + }{ + false + }ifelse + def + /_useShells where{ + /_useShells get /_usingShells xp + }{ + /_usingShells false def + }ifelse + + /_useSmoothShade where{ + pop + }{ + /_useSmoothShade false def + }ifelse + /_forceToCMYK where{ + pop + }{ + /_forceToCMYK false def + }ifelse + /_cyanPlate 1 0 0 0 testCMYKColorThrough def + /_magentaPlate 0 1 0 0 testCMYKColorThrough def + /_yellowPlate 0 0 1 0 testCMYKColorThrough def + /_blackPlate 0 0 0 1 testCMYKColorThrough def + /_compositeJob + _cyanPlate _magentaPlate and _yellowPlate and _blackPlate and + def + /_isCMYKSep + _cyanPlate _magentaPlate or _yellowPlate or _blackPlate or + def + /_compositeSpotDevice where{ + pop + }{ + /_compositeSpotDevice _compositeJob not _inRipSep or{ + 1 + }{ + 0 + }ifelse + def + }ifelse + /_producingSeps _compositeSpotDevice 0 ne def + /_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def + /_dpiThreshold where{ + pop + }{ + /_dpiThreshold 600 def + }ifelse + /_screenFreqThreshold where{ + pop + }{ + /_screenFreqThreshold 150 def + }ifelse + /_contoneDevice where{ + pop + }{ + /_contoneDevice false def + }ifelse + /_subSampleOK + _deviceDPI _dpiThreshold le + currentScreenFreq _screenFreqThreshold le and + _contoneDevice not and + def +}def +/initializeRectFill{ + /rectfill where dup{ + exch pop not _producingSeps or + }{ + not + }ifelse + { + /rectfill{ + gsave + newpath + 4 2 roll moveto + 1 index 0 rlineto + 0 1 index rlineto + 1 index neg 0 rlineto + pop pop + closepath + fill + grestore + }def + }if +}def +/initializeLev1{ + /currentScreenFreq{ + currentscreen pop pop + }def + /_byte 1 string def + /colorimage where{ + pop + }{ + /colorimage{ + pop pop + /_blackTmp xp + /_yellowTmp xp + /_magentaTmp xp + /_cyanTmp xp + /_cnt 0 pt + [ + _byte dup 0 + _cyanTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx .3 /mul cvx + _magentaTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx .59 /mul cvx + _yellowTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx .11 /mul cvx + _blackTmp + /_cnt cvx /get cvx _d255 /exch cvx /get cvx + /add cvx /add cvx /add cvx 1 /exch cvx /sub cvx + /dup cvx 0 /lt cvx{ + pop 0 + }/if cvx + /dup cvx 1 /gt cvx{ + pop 1 + }/if cvx + 255 /mul cvx /cvi cvx + 256 /mod cvx + /dup cvx 0 /lt cvx{ + pop 0 + }/if cvx + /put cvx + /_cnt dup cvx 1 /add cvx /pt cvx + ] cvx + bind + /_image load 5 execImage + }def + }ifelse +}def +/initializeLev2{ + /level2ScreenFreq{ + begin + 60 + HalftoneType 1 eq{ + pop Frequency + }if + HalftoneType 2 eq{ + pop GrayFrequency + }if + HalftoneType 5 eq{ + pop Default level2ScreenFreq + }if + end + }def + /currentScreenFreq{ + currenthalftone level2ScreenFreq + }def +}def +/initializeShading{ + _useSmoothShade _level3PS and{ + /_usingSmoothShade true pt + initializeLev3_Ops + }{ + /_usingSmoothShade false pt + }ifelse +}def +/initializeLev3_Ops +{ + /initShFill{ + /_index _gradType 0 eq {0}{_maxRampIndex 1 sub} ifelse pt + /_rampFuncsArray _maxRampIndex array pt + /_boundsArray _maxRampIndex 1 sub array pt + /_encodeArray _maxRampIndex 2 mul array pt + /_beginCoord _rampPoint pt + /_colorSpace null pt + /_firstFill _rampIndex _maxRampIndex eq pt + /_lastFill false pt + }def + /linealShFill{ + popBSpace + _xm aload pop pushBSpace + + /_size _index 1 add pt + _size _maxRampIndex lt { + /_rampFuncsArray _rampFuncsArray 0 _size getinterval pt + /_boundsArray _boundsArray 0 _size 1 sub getinterval pt + /_encodeArray _encodeArray 0 _size 2 mul getinterval pt + }if + + bd + /ShadingType 2 + /ColorSpace _colorSpace + _rgbInCMYK{ + /Function [ + _cData sampFunc + _mData sampFunc + _yData sampFunc + _kData sampFunc + ] + }{ + /Function + bd + /FunctionType 3 + /Domain [0 1] + /Functions _rampFuncsArray + /Bounds _boundsArray + /Encode _encodeArray + ed + }ifelse + /Extend [_firstFill _lastFill] + /Domain [0 1] + /Coords [_beginCoord 0 _endCoord 0] + ed + shfill + }def + + /radialShFill{ + /_size _maxRampIndex _index sub pt + _size _maxRampIndex lt { + /_rampFuncsArray _rampFuncsArray _index _size getinterval pt + /_boundsArray _boundsArray _index _size 1 sub getinterval pt + /_encodeArray _encodeArray _index 2 mul _size 2 mul getinterval pt + }if + + /_rampLen _beginCoord _endCoord sub pt + bd + /ShadingType 3 + /ColorSpace _colorSpace + _rgbInCMYK{ + /Function [ + _cData sampFunc + _mData sampFunc + _yData sampFunc + _kData sampFunc + ] + }{ + /Function + bd + /FunctionType 3 + /Domain [0 1] + /Functions _rampFuncsArray + /Bounds _boundsArray + /Encode _encodeArray + ed + }ifelse + /Extend [_lastFill _firstFill] + /Domain [0 1] + /Coords [_xHi _rampLen mul _yHi _rampLen mul _endCoord 0 0 _beginCoord] + ed + shfill + + _radHilite{ + _xHi _rampLen mul _yHi _rampLen mul translate + }if + }def + + % + /sampFunc{ + /_tmp exch pt + bd + _tmp length 1 eq { + _tmp 0 get + /_tmp 2 string pt + dup _tmp 0 3 -1 roll put + _tmp 1 3 -1 roll put + }if + /FunctionType 0 + /Order 1 + /Size [_tmp length] + /Domain [0 1] + /BitsPerSample 8 + /DataSource _tmp + /Range [0 1] + ed + }def + + /fillRamp{ + + + /_invert _midPoint 0.5 lt pt + _rampIndex _maxRampIndex eq { + initShFill + }if + + getRampColorSpace + + _colorSpace null eq{ + /_colorSpace _rampColorSpace pt + }{ + _colorSpace _rampColorSpace ne _rgbInCMYK or{ + /_index _index 1 + _gradType 0 eq{ + sub pt + linealShFill + }{ + add pt + radialShFill + }ifelse + initShFill + /_colorSpace _rampColorSpace pt + } if + }ifelse + /_endCoord _endPoint pt + /_rgbInCMYK false pt + _producingSeps _forceToCMYK or _rgbRamp and { + _spotColor{ + _renderCMYK + }{ + _isCMYKSep + }ifelse + }{ + false + }ifelse + { + _compositeJob{ + /_rgbInCMYK true pt + _cyanData _magentaData _yellowData _blackData _nSamples 4 expandColor + dup length string copy /_kData exch pt + dup length string copy /_yData exch pt + dup length string copy /_mData exch pt + dup length string copy /_cData exch pt + }{ + _rampFuncsArray _index + _cyanPlate{_cyanData}if + _magentaPlate{_magentaData}if + _yellowPlate{_yellowData}if + _blackPlate{_blackData}if + _nSamples expandOne + sampFunc + dup begin /Decode [1 0] def end + put + /_invert false pt + }ifelse + }{ + _rampFuncsArray _index + bd + /FunctionType 2 + /Domain [0 1] + /N 0.5 log _invert{1 _midPoint sub}{_midPoint}ifelse log div + _gradType 0 eq{ + _invert{/C1}{/C0}ifelse _C0 + _invert{/C0}{/C1}ifelse _C1 + }{ + _invert{/C0}{/C1}ifelse _C1 + _invert{/C1}{/C0}ifelse _C0 + }ifelse + ed + put + }ifelse + + _rampIndex 1 ne{ + _boundsArray _index _gradType 1 eq{1 sub}if _endCoord put + } if + + 0 1 _invert {exch}if + _encodeArray _index 2 mul 1 add 3 -1 roll put + _encodeArray _index 2 mul 3 -1 roll put + _rampIndex 1 eq { + /_lastFill true pt + _gradType 0 eq{ + linealShFill + }{ + radialShFill + }ifelse + }if + /_index _index 1 + _gradType 0 eq{ + add pt + }{ + sub pt + }ifelse + }def +}def +/initializeComposite{ + /bwImage{ + pop /_image load 5 execImage + }def + /rampImage{ + _enabledSmoothShade{ + fillRamp + }{ + _color{ + _nSamples setImageParms + + + _rgbRamp _forceToCMYK not and{ + _redData _greenData _blueData _nSamples 3 expandColor + true 3 null ncolorimage + }{ + _cyanData _magentaData _yellowData _blackData _nSamples 4 expandColor + true 4 null ncolorimage + }ifelse + }{ + _nSamples setImageParms _blackData null bwImage + }ifelse + }ifelse + }def + /setCStop{ + /_colorStyle exch pt + _colorStyle 0 eq{ + 1 exch sub + 0 0 0 + 4 -1 roll + }if + + _colorStyle 2 eq{ + _forceToCMYK{ + 3 npop setcmykcolor + }{ + setrgbcolor 4 npop + }ifelse + }if + + _colorStyle 3 eq{ + 1 exch sub /_tmp xp + pop + 4{ + _tmp mul 4 1 roll + }repeat + }if + + _colorStyle 4 eq{ + _forceToCMYK{ + 6 npop setcmykcolor + }{ + 3 -1 roll pop pop + 1 exch sub /_tmp xp + 3{ + 1 exch sub _tmp mul 1 exch sub 3 1 roll + }repeat + setrgbcolor + 4 npop + }ifelse + }if + _colorStyle 2 ne _colorStyle 4 ne and{ + null nsetcustomcolor + }if + }def + /nsetcustomcolor + { + pop setcmykcolor + }def + /nsetcustomcolorend + { + }def + /ncolorimage{ + pop + /_colorimage load 10 execImage + }def + _noImage not _level2PS not and{ + /linealFill{ + 8 setImageParms + _color{ + currentcmykcolor + 4{ + makeByte8 4 1 roll + }repeat + true 4 null ncolorimage + }{ + currentgray makeByte8 null bwImage + }ifelse + }def + }if + /getRampColorSpace{ + _nSamples 1 gt{ + /_ndx 0 pt + [blendColor] cvx exec + }if + /_C0 [currentcolor] pt + /_C0_Space currentcolorspace pt + + _nSamples 1 gt{ + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + }if + /_C1 [currentcolor] pt + /_C1_Space currentcolorspace pt + + /_rampColorSpace _C0_Space pt + + _spotColor{ + nsetcustomcolorend + }if + }def +}def +/npop{ + {pop}repeat +}def +/xd{ + exch def +}def +/nd{ + null def +}def +/pt{ + AGM_Gradient_private 3 1 roll put +}def +/xp{ + exch pt +}def +/xput{ + dup load dup length exch maxlength eq{ + dup dup load dup + length 2 mul dict copy def + }if + load begin + def + end +}def +/mySave{ + save /_sSave xp +}def +/myRestore{ + _sSave type /savetype eq{ + _sSave restore + }if +}def +/gMark{ + counttomark 2 add -1 roll +}def +/execImage{ + /_tmp xp + { + exec + }stopped{ + $error /errorname get /undefinedresult ne{ + stop + }{ + _tmp npop + }ifelse + }if +}def +/pushBSpace{ + newpath gsave + _bUMatrix astore concat +}def +/popBSpace{ + grestore +}def +/makeByte8{ + /_tmp 0 pt + 255 mul cvi + 8 string 8{ + dup _tmp 3 index put + /_tmp _tmp 1 add pt + }repeat + exch pop +}def +/setImageParms{ + 1 8 2 index 0 0 1 0 0 _imageMatrix astore +}def +/linealFill{ + 0 0 1 1 rectfill +}def +/testCMYKColorThrough{ + gsave + setcmykcolor currentcmykcolor + grestore + add add add 0 ne +}def +/expandOne { + /_tmp xp + dup type /stringtype ne{ + _tmp string + exch + dup 0 ne{ + 255 mul cvi + 0 1 _tmp 1 sub{ + 3 copy + exch put pop + }for + }if + pop + }if +}def +/expandColor{ + /_channels xp + /_len xp + _channels{ + _len expandOne _channels 1 roll + }repeat +}def +/blendColor{ + + _color{ + _rgbRamp _producingSeps not and _forceToCMYK not and{ + _redData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _greenData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _blueData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + /setrgbcolor cvx + }{ + _cyanData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _magentaData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _yellowData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + _blackData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + + _spotColor{ + _rampSD begin + /_rampSD cvx /begin cvx + + spot1 begin + tintImage dup type /stringtype eq{ + /_ndx cvx /get cvx _d255- /exch cvx /get cvx + }{ + dup null ne{ + name type /nametype ne{ + 1 exch sub + }if + }if + }ifelse + end + /spot1 cvx /tintValue 3 -1 /roll cvx /put cvx + + spot2 begin + tintImage dup type /stringtype eq{ + /_ndx cvx /get cvx _d255- /exch cvx /get cvx + }{ + dup null ne{ + name type /nametype ne{ + 1 exch sub + }if + }if + }ifelse + end + /spot2 cvx /tintValue 3 -1 /roll cvx /put cvx + /end cvx + end + /_rampSD cvx + /nsetcustomcolor cvx + }{ + /setcmykcolor cvx + }ifelse + }ifelse + }{ + _blackData dup type /stringtype eq{ + /_ndx cvx /get cvx _d255 /exch cvx /get cvx + }if + + _enabledSmoothShade{ + 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx /setcmykcolor cvx + }{ + /setgray cvx + }ifelse + }ifelse +}def +/useRectImage{ + _subSampleOK _enabledSmoothShade not and{ + { + mark + 0 1 dtransform atan cvi 90 mod 0 eq + 1 0 dtransform atan cvi 90 mod 0 eq + } stopped + { + cleartomark + false + } + { + and exch pop + } ifelse + }{ + false + }ifelse +}def +/linealImage{ + _noImage{ + rectImage + }{ + _producingSeps{ + AGM_Gradient_Sep/AGM_Gradient_Sep_private get + /rampImage get exec + }{ + useRectImage{ + rectImage + }{ + rampImage + }ifelse + }ifelse + }ifelse +}def +/linealRamp{ + pushBSpace + _ramp{ + linealImage + }{ + linealFill + }ifelse + popBSpace + /_rampIndex _rampIndex 1 sub pt + _rampIndex 0 gt{ + getRampData + }if +}def +/radialGrad{ + /_usingShells currentoverprint _producingSeps and _usingShells or pt + /_firstShell true pt + _enabledSmoothShade not{ + currentoverprint _producingSeps and{ + + newpath + clippath pathbbox + 1 add 4 1 roll + 1 add 4 1 roll + 1 sub 4 1 roll + 1 sub 4 1 roll + _bbox astore pop + + newpath + _bbox 0 get _bbox 1 get moveto + _bbox 2 get _bbox 1 get lineto + _bbox 2 get _bbox 3 get lineto + _bbox 0 get _bbox 3 get lineto + closepath + 6 copy + gsave _bUMatrix astore concat + 1 0 moveto 0 0 1 0 360 arc closepath + eoclip fill + popBSpace + }{ + fill + }ifelse + }if + pushBSpace + + _radHilite{ + _xHi _yHi _bUMatrix idtransform /_yHi xp /_xHi xp + _rampPoint 1 lt{ + 1 _rampPoint sub dup _xHi mul exch _yHi mul translate + }if + }if + _rampIndex{ + radialRamp + /_rampIndex _rampIndex 1 sub pt + _rampIndex 0 gt{ + getRampData + }if + }repeat + + popBSpace + +}def +/getNSamples{ + 0 exch + { + dup type /stringtype eq{ + length exch pop exit + }if + pop + }forall + dup 0 eq{ + pop 1 + }if +}def +/getRampData{ + /_rampType gMark pt + /_color _rampType 0 gt pt + /_ccRGB _rampType 5 eq _rampType 6 eq or pt + /_rgbRamp _rampType 4 eq _ccRGB or pt + /_ccProcess _rampType 2 eq _rampType 3 eq or pt + _producingSeps{ + _rampSD initSpotDict + /_spotColor _ccProcess _ccRGB or pt + }{ + /_spotColor false pt + }ifelse + /_ramp true pt + 100 div /_rampPoint xp + 100 div /_midPoint xp + + dup /_colorStyle xp + _colorStyle 0 eq{ + 2 + }{ + _colorStyle 1 eq{ + 5 + }{ + _colorStyle 2 eq{ + 8 + }{ + _colorStyle 3 eq{ + _producingSeps{ + _rampSD /spot1 get begin + /name 3 index def + /spot_K 4 index def + /spot_Y 5 index def + /spot_M 6 index def + /spot_C 7 index def + end + }if + 7 + }{ + _producingSeps{ + _rampSD/spot1 get begin + /name 4 index def + /spot_K 8 index def + /spot_Y 9 index def + /spot_M 10 index def + /spot_C 11 index def + end + }if + 11 + } ifelse + }ifelse + }ifelse + }ifelse + /_tmp xp + _tmp index 100 div /_endPoint xp + + _gradType 1 eq{ + _tmp 1 add index 100 div /_midPoint xp + }if + + _producingSeps{ + _tmp 2 add index /_nextColorStyle xp + _nextColorStyle 3 eq{ + /_tmp _tmp 4 add pt + _tmp index dup + _rampSD/spot1 get /name get ne{ + _rampSD /spot2 get begin + /name xd + /spot_K _tmp 2 add index def + /spot_Y _tmp 3 add index def + /spot_M _tmp 4 add index def + /spot_C _tmp 5 add index def + end + }{ + pop + }ifelse + }if + _nextColorStyle 4 eq{ + /_tmp _tmp 5 add pt + _tmp index dup + _rampSD/spot1 get /name get ne{ + _rampSD /spot2 get begin + /name xd + /spot_K _tmp 5 add index def + /spot_Y _tmp 6 add index def + /spot_M _tmp 7 add index def + /spot_C _tmp 8 add index def + end + }{ + pop + }ifelse + }if + }if + _rampType 3 eq _rampType 6 eq or{ + /_tint2Data gMark pt + }if + _ccProcess _ccRGB or{ + /_tint1Data gMark pt + }if + _rgbRamp{ + /_blueData gMark pt + /_greenData gMark pt + /_redData gMark pt + }if + + _producingSeps{ + _ccProcess _ccRGB or{ + _rampType 3 eq _rampType 6 eq or{ + _rampSD /spot2 get begin + /tintImage _gradType 0 eq{ + _tint2Data + }{ + _tint1Data + }ifelse + def + name null eq{ + /name /Black def + }if + end + }if + _rampSD /spot1 get begin + /tintImage _gradType 0 eq _rampType 2 eq or _rampType 5 eq or{ + _tint1Data + }{ + _tint2Data + }ifelse + def + _rampType 2 eq _rampType 5 eq or{ + name null eq{ + /name _rampSD/spot2 get /name get def + /spot_C _rampSD/spot2 get /spot_C get def + /spot_M _rampSD/spot2 get /spot_M get def + /spot_Y _rampSD/spot2 get /spot_Y get def + /spot_K _rampSD/spot2 get /spot_K get def + _rampSD/spot2 get /name null put + }if + }{ + name null eq{ + /name /Black def + }if + }ifelse + end + }if + }if + /_blackData gMark pt + _rampType 0 gt{ + counttomark 4 add -3 roll + /_yellowData xp + /_magentaData xp + /_cyanData xp + }if + _ramp{ + /_nSamples + [ + _rampType 0 eq {_blackData}if + _rampType 1 eq {_cyanData _magentaData _yellowData _blackData}if + _rampType 2 eq {_cyanData _magentaData _yellowData _blackData _tint1Data}if + _rampType 3 eq {_cyanData _magentaData _yellowData _blackData _tint1Data _tint2Data}if + _rampType 4 eq {_cyanData _magentaData _yellowData _blackData _redData _greenData _blueData}if + _rampType 5 eq {_cyanData _magentaData _yellowData _blackData _redData _greenData _blueData _tint1Data}if + _rampType 6 eq {_cyanData _magentaData _yellowData _blackData _redData _greenData _blueData _tint1Data _tint2Data}if + ] getNSamples pt + _enabledSmoothShade not {/_ramp _nSamples 1 gt pt} if + } if + + setCStop +}def +/rectImage{ + gsave + /_sInc 1 pt + /_bInc 1 _nSamples div pt + /_nSubSamples _nSamples pt + /_optimize false pt + + _subSampleOK{ + /_uRampLen 1 0 dtransform _dUserSpace idtransform dup mul exch dup mul add sqrt pt + /_pChange _uRampLen 0 eq{0}{_nSamples _uRampLen div}ifelse pt + + _pChange .5 gt dup /_optimize xp{ + /_nSubSamples _uRampLen 2 div round cvi dup 1 le{pop 2}if pt + /_bInc 1 _nSubSamples div pt + /_sInc _nSamples 1 sub _nSubSamples 1 sub div pt + }if + }if + 0 + _nSubSamples + [ + /dup cvx + _optimize { + /round cvx /cvi cvx + } if + /_ndx /exch cvx /pt cvx + blendColor + 0 0 _bInc 1 /rectfill cvx + _bInc 0 /translate cvx + _sInc /add cvx + ] cvx + bind + repeat + pop + _spotColor{ + nsetcustomcolorend + }if + grestore +}def +/radialInit{ + /_nRadSamples _nSamples dup 0 eq{pop 1}if pt + /_sInc -1 pt + /_rampLen _rampPoint _endPoint sub pt + /_bInc _rampLen _nSamples div neg pt + /_optimize false pt + _subSampleOK{ + /_uRampLen + _rampLen 0 dtransform _dUserSpace idtransform dup mul exch dup mul add sqrt + 0 _rampLen dtransform _dUserSpace idtransform dup mul exch dup mul add sqrt + 2 copy lt{ + exch + }if pop + pt + /_pChange + _uRampLen 0 eq{ + 0 + }{ + _nSamples _uRampLen div + }ifelse + pt + _pChange .5 gt dup /_optimize xp{ + /_nRadSamples _uRampLen 2 div round cvi dup 1 le{pop 2}if pt + /_bInc _rampLen _nRadSamples div neg pt + /_sInc _nSamples 1 sub _nRadSamples 1 sub div neg pt + }if + }if + _radHilite{ + /_xBCInc _xHi _rampLen mul _nRadSamples div pt + /_yBCInc _yHi _rampLen mul _nRadSamples div pt + }if +}def +/radialRamp{ + _enabledSmoothShade{ + fillRamp + }{ + /_saveMatrix _saveMatrix currentmatrix def + + radialInit + + % + % + true + _producingSeps _rgbRamp not and{ + _nSamples 1 gt{ + pop + /_ndx 0 pt + [blendColor] cvx exec + currentInkN + /_ndx _nSamples 1 sub pt + [blendColor] cvx exec + currentInkN + or + }if + }if + { + _rampPoint + + _nSamples 1 sub + + _nRadSamples + [ + /dup cvx + + _optimize{ + /round cvx /cvi cvx + }if + + /_ndx /exch cvx /pt cvx + + _usingShells{ + /_firstShell cvx{ + /_firstShell false pt + }{ + 0 0 3 index 360 0 arcn fill + }/ifelse cvx + }if + + blendColor + + _usingShells{ + 0 0 3 /index cvx 0 360 /arc cvx + }{ + 0 0 3 /index cvx 0 360 /arc cvx /fill cvx + }ifelse + + /exch cvx _bInc /add cvx /exch cvx + + _sInc /add cvx + + _radHilite{ + _xBCInc _yBCInc /translate cvx + }if + ] cvx bind + repeat + + pop pop + }{ + _usingShells{ + 0 0 _rampPoint 360 0 arcn fill + }if + }ifelse + + _saveMatrix setmatrix + + _radHilite{ + _xHi _rampLen mul _yHi _rampLen mul translate + }if + + _usingShells _rampIndex 1 eq and{ + fill + }if + + _spotColor{ + nsetcustomcolorend + }if + }ifelse +}def +end +end +defaultpacking setpacking +%%EndResource +%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0 +userdict /Adobe_ColorImage_AI6 known not +{ + userdict /Adobe_ColorImage_AI6 53 dict put +} if +userdict /Adobe_ColorImage_AI6 get begin +/initialize { + Adobe_ColorImage_AI6 begin + Adobe_ColorImage_AI6 { + dup type /arraytype eq { + dup xcheck { + bind + } if + } if + pop pop + } forall +} def +/terminate { end } def +currentdict /Adobe_ColorImage_AI6_Vars known not { + /Adobe_ColorImage_AI6_Vars 41 dict def +} if +Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /_newproc null def + /_proc1 null def + /_proc2 null def + /sourcearray 4 array def + /_ptispace null def + /_ptiname null def + /_pti0 0 def + /_pti1 0 def + /_ptiproc null def + /_ptiscale 0 def + /_pticomps 0 def + /_ptibuf 0 string def + /_gtigray 0 def + /_cticmyk null def + /_rtirgb null def + /XIEnable true def + /XIType 0 def + /XIEncoding 0 def + /XICompression 0 def + /XIChannelCount 0 def + /XIBitsPerPixel 0 def + /XIImageHeight 0 def + /XIImageWidth 0 def + /XIImageMatrix null def + /XIRowBytes 0 def + /XIFile null def + /XIBuffer1 null def + /XIBuffer2 null def + /XIBuffer3 null def + /XIDataProc null def + /XIColorSpace /DeviceGray def + /XIColorValues 0 def + /XIPlateList false def +end +/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def +/ci6image systemdict /image get def +/ci6curtransfer systemdict /currenttransfer get def +/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def +/ci6foureq { + 4 index ne { + pop pop pop false + }{ + 4 index ne { + pop pop false + }{ + 4 index ne { + pop false + }{ + 4 index eq + } ifelse + } ifelse + } ifelse +} def +/ci6testplate { + Adobe_ColorImage_AI6_Vars begin + /plateindex -1 def + /setcmykcolor where { + pop + gsave + 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub + 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub + grestore + 1 0 0 0 ci6foureq { + /plateindex 0 def + }{ + 0 1 0 0 ci6foureq { + /plateindex 1 def + }{ + 0 0 1 0 ci6foureq { + /plateindex 2 def + }{ + 0 0 0 1 ci6foureq { + /plateindex 3 def + }{ + 0 0 0 0 ci6foureq { + /plateindex 5 def + } if + } ifelse + } ifelse + } ifelse + } ifelse + pop pop pop pop + } if + plateindex + end +} def +/ci6concatprocs { + /packedarray where { + pop dup type /packedarraytype eq 2 index type + /packedarraytype eq or + }{ + false + } ifelse + { + /_proc2 exch cvlit def + /_proc1 exch cvlit def + _proc1 aload pop + _proc2 aload pop + _proc1 length + _proc2 length add + packedarray cvx + }{ + /_proc2 exch cvlit def + /_proc1 exch cvlit def + /_newproc _proc1 length _proc2 length add array def + _newproc 0 _proc1 putinterval + _newproc _proc1 length _proc2 putinterval + _newproc cvx + } ifelse +} def +/ci6istint { + type /arraytype eq +} def +/ci6isspot { + dup type /arraytype eq { + dup length 1 sub get /Separation eq + }{ + pop false + } ifelse +} def +/ci6spotname { + dup ci6isspot {dup length 2 sub get}{pop ()} ifelse +} def +/ci6altspace { + aload pop pop pop ci6colormake +} def +/ci6numcomps { + dup /DeviceGray eq { + pop 1 + }{ + dup /DeviceRGB eq { + pop 3 + }{ + /DeviceCMYK eq { + 4 + }{ + 1 + } ifelse + } ifelse + } ifelse +} def +/ci6marksplate { + dup /DeviceGray eq { + pop plateindex 3 eq + }{ + dup /DeviceRGB eq { + pop plateindex 5 ne + }{ + dup /DeviceCMYK eq { + pop plateindex 5 ne + }{ + dup ci6isspot { + /findcmykcustomcolor where { + pop + dup length 2 sub get + 0.1 0.1 0.1 0.1 5 -1 roll + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop plateindex 5 ne + } ifelse + }{ + pop plateindex 5 ne + } ifelse + } ifelse + } ifelse + } ifelse +} def +/ci6colormake { + dup ci6numcomps + exch 1 index 2 add 1 roll + dup 1 eq {pop}{array astore} ifelse + exch +} def +/ci6colorexpand { + dup ci6spotname exch + dup ci6istint { + ci6altspace + exch 4 1 roll + }{ + 1 3 1 roll + } ifelse +} def +/ci6colortint { + dup /DeviceGray eq { + 3 1 roll 1 exch sub mul 1 exch sub exch + }{ + dup /DeviceRGB eq { + 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch + }{ + dup /DeviceCMYK eq { + 3 1 roll {1 index mul exch} forall pop 4 array astore exch + }{ + 3 1 roll mul exch + } ifelse + } ifelse + } ifelse +} def +/ci6colortocmyk { + dup /DeviceGray eq { + pop 1 exch sub 0 0 0 4 -1 roll 4 array astore + }{ + dup /DeviceRGB eq { + pop aload pop _rgbtocmyk 4 array astore + }{ + dup /DeviceCMYK eq { + pop + }{ + ci6altspace ci6colortint ci6colortocmyk + } ifelse + } ifelse + } ifelse +} def +/ci6makeimagedict { + 7 dict begin + /ImageType 1 def + /Decode exch def + /DataSource exch def + /ImageMatrix exch def + /BitsPerComponent exch def + /Height exch def + /Width exch def + currentdict end +} def +/ci6stringinvert { + 0 1 2 index length 1 sub { + dup 2 index exch get 255 exch sub 2 index 3 1 roll put + } for +} def +/ci6stringknockout { + 0 1 2 index length 1 sub { + 255 2 index 3 1 roll put + } for +} def +/ci6stringapply { + 0 1 4 index length 1 sub { + dup + 4 index exch get + 3 index 3 1 roll + 3 index exec + } for + pop exch pop +} def +/ci6walkrgbstring { + 0 3 index + dup length 1 sub 0 3 3 -1 roll { + 3 getinterval {} forall + 5 index exec + 3 index + } for + + 5 {pop} repeat +} def +/ci6walkcmykstring +{ + 0 3 index + dup length 1 sub 0 4 3 -1 roll { + 4 getinterval {} forall + + 6 index exec + + 3 index + + } for + + 5 { pop } repeat + +} def +/ci6putrgbtograystr +{ + .11 mul exch + + .59 mul add exch + + .3 mul add + + cvi 3 copy put + + pop 1 add +} def +/ci6putcmyktograystr +{ + exch .11 mul add + + exch .59 mul add + + exch .3 mul add + + dup 255 gt { pop 255 } if + + 255 exch sub cvi 3 copy put + + pop 1 add +} def +/ci6rgbtograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putrgbtograystr load exch + ci6walkrgbstring + end +} def +/ci6cmyktograyproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + XIBuffer3 + dup 3 1 roll + + /ci6putcmyktograystr load exch + ci6walkcmykstring + end +} def +/ci6separatecmykproc { + Adobe_ColorImage_AI6_Vars begin + sourcearray 0 get exec + + XIBuffer3 + + 0 2 index + + plateindex 4 2 index length 1 sub { + get 255 exch sub + + 3 copy put pop 1 add + + 2 index + } for + pop pop exch pop + end +} def + +/ci6compositeimage { + dup 1 eq { + pop pop image + }{ + /ci6colorimage load null ne { + ci6colorimage + }{ + 3 1 roll pop + sourcearray 0 3 -1 roll put + 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load + image + } ifelse + } ifelse +} def +/ci6knockoutimage { + gsave + 0 ci6curtransfer exec 1 ci6curtransfer exec + eq { + 0 ci6curtransfer exec 0.5 lt + }{ + 0 ci6curtransfer exec 1 ci6curtransfer exec gt + } ifelse + {{pop 0}}{{pop 1}} ifelse + systemdict /settransfer get exec + ci6compositeimage + grestore +} def +/ci6drawimage { + ci6testplate -1 eq { + pop ci6compositeimage + }{ + dup type /arraytype eq { + dup length plateindex gt {plateindex get}{pop false} ifelse + }{ + { + true + }{ + dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse + } ifelse + } ifelse + { + dup 1 eq { + pop pop ci6image + }{ + dup 3 eq { + ci6compositeimage + }{ + pop pop + sourcearray 0 3 -1 roll put + /ci6separatecmykproc load + ci6image + } ifelse + } ifelse + }{ + ci6curoverprint { + 7 {pop} repeat + }{ + ci6knockoutimage + } ifelse + } ifelse + } ifelse +} def +/ci6proctintimage { + /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store + /_pticomps _ptispace ci6numcomps store + /_ptiscale _pti1 _pti0 sub store + level2? { + _ptiname length 0 gt version cvr 2012 ge and { + [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace + [_pti0 _pti1] ci6makeimagedict ci6image + }{ + [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace + [0 255] ci6makeimagedict ci6image + } ifelse + }{ + _pticomps 1 eq { + { + dup + { + 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put + } ci6stringapply + } ci6concatprocs ci6image + }{ + { + dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse + _ptibuf { + exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc + _pticomps 2 add -2 roll + _pticomps 1 sub -1 0 { + 1 index add 2 index exch + 5 -1 roll + 255 mul cvi put + } for + pop pop + } ci6stringapply + } ci6concatprocs false _pticomps + /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse + } ifelse + } ifelse +} def +/ci6graytintimage { + /_gtigray 5 -1 roll store + {1 _gtigray sub mul 1 exch sub} 4 1 roll + /DeviceGray ci6proctintimage +} def +/ci6cmyktintimage { + /_cticmyk 5 -1 roll store + {_cticmyk {1 index mul exch} forall pop} 4 1 roll + /DeviceCMYK ci6proctintimage +} def +/ci6rgbtintimage { + /_rtirgb 5 -1 roll store + {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll + /DeviceRGB ci6proctintimage +} def +/ci6tintimage { + ci6testplate -1 eq { + ci6colorexpand + 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll + dup /DeviceGray eq { + pop ci6graytintimage + }{ + dup /DeviceRGB eq { + pop ci6rgbtintimage + }{ + pop ci6cmyktintimage + } ifelse + } ifelse + }{ + dup ci6marksplate { + plateindex 5 lt { + ci6colortocmyk plateindex get + dup 0 eq ci6curoverprint and { + 7 {pop} repeat + }{ + 1 exch sub + exch {1 0}{0 1} ifelse () ci6graytintimage + } ifelse + }{ + pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage + } ifelse + }{ + ci6curoverprint { + 8 {pop} repeat + }{ + pop pop pop + {pop 1} 0 1 () /DeviceGray ci6proctintimage + } ifelse + } ifelse + } ifelse +} def +/XINullImage { +} def +/XIImageMask { + XIImageWidth XIImageHeight false + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + imagemask +} def +/XIImageTint { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + XIType 3 eq XIColorValues XIColorSpace ci6tintimage +} def +/XIImage { + XIImageWidth XIImageHeight XIBitsPerPixel + [XIImageWidth 0 0 XIImageHeight neg 0 0] + /XIDataProc load + false XIChannelCount XIPlateList ci6drawimage +} def +/XG { + pop pop +} def +/XF { + 13 {pop} repeat +} def +/Xh { + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + /XIImageHeight exch def + /XIImageWidth exch def + /XIImageMatrix exch def + 0 0 moveto + XIImageMatrix concat + XIImageWidth XIImageHeight scale + + /_lp /null ddef + _fc + /_lp /imagemask ddef + end +} def +/XH { + Adobe_ColorImage_AI6_Vars begin + grestore + end +} def +/XIEnable { + Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put +} def +/XC { + Adobe_ColorImage_AI6_Vars begin + ci6colormake + /XIColorSpace exch def + /XIColorValues exch def + end +} def +/XIPlates { + Adobe_ColorImage_AI6_Vars begin + /XIPlateList exch def + end +} def +/XI +{ + Adobe_ColorImage_AI6_Vars begin + gsave + /XIType exch def + cvi dup + 256 idiv /XICompression exch store + 256 mod /XIEncoding exch store + pop pop + /XIChannelCount exch def + /XIBitsPerPixel exch def + /XIImageHeight exch def + /XIImageWidth exch def + pop pop pop pop + /XIImageMatrix exch def + XIBitsPerPixel 1 eq { + XIImageWidth 8 div ceiling cvi + }{ + XIImageWidth XIChannelCount mul + } ifelse + /XIRowBytes exch def + XIEnable { + /XIBuffer3 XIImageWidth string def + XICompression 0 eq { + /XIBuffer1 XIRowBytes string def + XIEncoding 0 eq { + {currentfile XIBuffer1 readhexstring pop} + }{ + {currentfile XIBuffer1 readstring pop} + } ifelse + }{ + /XIBuffer1 256 string def + /XIBuffer2 XIRowBytes string def + {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if} + /ASCII85Decode filter /DCTDecode filter + /XIFile exch def + {XIFile XIBuffer2 readstring pop} + } ifelse + /XIDataProc exch def + + XIType 1 ne { + 0 setgray + } if + XIType 1 eq { + XIImageMask + }{ + XIType 2 eq XIType 3 eq or { + XIImageTint + }{ + XIImage + } ifelse + } ifelse + }{ + XINullImage + } ifelse + /XIPlateList false def + grestore + end +} def +end +%%EndProcSet +%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0 +%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog) +%%Version: 1.3 0 +%%CreationDate: (3/7/1994) () +%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin +put +/_?cmyk false def +/_eo false def +/_lp /none def +/_pf +{ +} def +/_ps +{ +} def +/_psf +{ +} def +/_pss +{ +} def +/_pjsf +{ +} def +/_pjss +{ +} def +/_pola 0 def +/_doClip 0 def +/cf currentflat def +/_lineorientation 0 def +/_charorientation 0 def +/_yokoorientation 0 def +/_tm matrix def +/_renderStart +[ +/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0 +] def +/_renderEnd +[ +null null null null /i1 /i1 /i1 /i1 +] def +/_render -1 def +/_shift [0 0] def +/_ax 0 def +/_ay 0 def +/_cx 0 def +/_cy 0 def +/_leading +[ +0 0 +] def +/_ctm matrix def +/_mtx matrix def +/_sp 16#020 def +/_hyphen (-) def +/_fontSize 0 def +/_fontAscent 0 def +/_fontDescent 0 def +/_fontHeight 0 def +/_fontRotateAdjust 0 def +/Ss 256 string def +Ss 0 (fonts/) putinterval +/_cnt 0 def +/_scale [1 1] def +/_nativeEncoding 0 def +/_useNativeEncoding 0 def +/_tempEncode 0 def +/_pntr 0 def +/_tDict 2 dict def +/_hfname 100 string def +/_hffound false def +/Tx +{ +} def +/Tj +{ +} def +/CRender +{ +} def +/_AI3_savepage +{ +} def +/_gf null def +/_cf 4 array def +/_rgbf 3 array def +/_if null def +/_of false def +/_fc +{ +} def +/_gs null def +/_cs 4 array def +/_rgbs 3 array def +/_is null def +/_os false def +/_sc +{ +} def +/_pd 1 dict def +/_ed 15 dict def +/_pm matrix def +/_fm null def +/_fd null def +/_fdd null def +/_sm null def +/_sd null def +/_sdd null def +/_i null def +/_lobyte 0 def +/_hibyte 0 def +/_cproc null def +/_cscript 0 def +/_hvax 0 def +/_hvay 0 def +/_hvwb 0 def +/_hvcx 0 def +/_hvcy 0 def +/_bitfont null def +/_bitlobyte 0 def +/_bithibyte 0 def +/_bitkey null def +/_bitdata null def +/_bitindex 0 def +/discardSave null def +/buffer 256 string def +/beginString null def +/endString null def +/endStringLength null def +/layerCnt 1 def +/layerCount 1 def +/perCent (%) 0 get def +/perCentSeen? false def +/newBuff null def +/newBuffButFirst null def +/newBuffLast null def +/clipForward? false def +end +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 100 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/initialize +{ + Adobe_Illustrator_AI5 dup begin + Adobe_Illustrator_AI5_vars begin + /_aicmykps where {pop /_?cmyk _aicmykps def}if + discardDict + { + bind pop pop + } forall + dup /nc get begin + { + dup xcheck 1 index type /operatortype ne and + { + bind + } if + pop pop + } forall + end + newpath +} def +/terminate +{ + end + end +} def +/_ +null def +/ddef +{ + Adobe_Illustrator_AI5_vars 3 1 roll put +} def +/xput +{ + dup load dup length exch maxlength eq + { + dup dup load dup + length 2 mul dict copy def + } if + load begin + def + end +} def +/npop +{ + { + pop + } repeat +} def +/hswj +{ + dup stringwidth 3 2 roll + { + _hvwb eq { exch _hvcx add exch _hvcy add } if + exch _hvax add exch _hvay add + } cforall +} def +/vswj +{ + 0 0 3 -1 roll + { + dup 255 le + _charorientation 1 eq + and + { + dup cstring stringwidth 5 2 roll + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + 4 -1 roll sub exch + 3 -1 roll sub exch + } + { + _hvwb eq { exch _hvcy sub exch _hvcx sub } if + exch _hvay sub exch _hvax sub + _fontHeight sub + } ifelse + } cforall +} def +/swj +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hswj } { vswj } ifelse +} def +/sw +{ + 0 0 0 6 3 roll swj +} def +/vjss +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + gsave + 2 index false charpath + 6 index setmatrix stroke + grestore + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjss +{ + 4 1 roll + { + dup cstring + gsave + false charpath currentpoint + 5 index setmatrix stroke + grestore + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jss +{ + _lineorientation 0 eq { hjss } { vjss } ifelse +} def +/ss +{ + 0 0 0 7 3 roll jss +} def +/vjsp +{ + 4 1 roll + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + false charpath + currentpoint + _fontRotateAdjust sub + moveto + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + 5 index sub + 3 index _sp eq + { + 9 index sub + } if + + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + + 2 index false charpath + + moveto pop pop + } ifelse + } cforall + 6 npop +} def +/hjsp +{ + 4 1 roll + { + dup cstring + false charpath + _sp eq + { + 5 index 5 index rmoveto + } if + 2 copy rmoveto + } cforall + 6 npop +} def +/jsp +{ + matrix currentmatrix + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/sp +{ + matrix currentmatrix + 0 0 0 7 3 roll + _lineorientation 0 eq {hjsp} {vjsp} ifelse +} def +/pl +{ + transform + 0.25 sub round 0.25 add exch + 0.25 sub round 0.25 add exch + itransform +} def +/setstrokeadjust where +{ + pop true setstrokeadjust + /c + { + curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll curveto + } def + /V + /v load def + /y + { + 2 copy curveto + } def + /Y + /y load def + /l + { + lineto + } def + /L + /l load def + /m + { + moveto + } def +} +{ + /c + { + pl curveto + } def + /C + /c load def + /v + { + currentpoint 6 2 roll pl curveto + } def + /V + /v load def + /y + { + pl 2 copy curveto + } def + /Y + /y load def + /l + { + pl lineto + } def + /L + /l load def + /m + { + pl moveto + } def +} ifelse +/d +{ + setdash +} def +/cf +{ +} def +/i +{ + dup 0 eq + { + pop cf + } if + setflat +} def +/j +{ + setlinejoin +} def +/J +{ + setlinecap +} def +/M +{ + setmiterlimit +} def +/w +{ + setlinewidth +} def +/XR +{ + 0 ne + /_eo exch ddef +} def +/H +{ +} def +/h +{ + closepath +} def +/N +{ + _pola 0 eq + { + _doClip 1 eq + { + _eo {eoclip} {clip} ifelse /_doClip 0 ddef + } if + newpath + } + { + /CRender + { + N + } ddef + } ifelse +} def +/n +{ + N +} def +/F +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc + /_doClip 0 ddef + } + { + _pf + } ifelse + } + { + /CRender + { + F + } ddef + } ifelse +} def +/f +{ + closepath + F +} def +/S +{ + _pola 0 eq + { + _doClip 1 eq + { + gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + _ps + } ifelse + } + { + /CRender + { + S + } ddef + } ifelse +} def +/s +{ + closepath + S +} def +/B +{ + _pola 0 eq + { + _doClip 1 eq + gsave F grestore + { + gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc + /_doClip 0 ddef + } + { + S + } ifelse + } + { + /CRender + { + B + } ddef + } ifelse +} def +/b +{ + closepath + B +} def +/W +{ + /_doClip 1 ddef +} def +/* +{ + count 0 ne + { + dup type /stringtype eq + { + pop + } if + } if + newpath +} def +/u +{ +} def +/U +{ +} def +/q +{ + _pola 0 eq + { + gsave + } if +} def +/Q +{ + _pola 0 eq + { + grestore + } if +} def +/*u +{ + _pola 1 add /_pola exch ddef +} def +/*U +{ + _pola 1 sub /_pola exch ddef + _pola 0 eq + { + CRender + } if +} def +/D +{ + pop +} def +/*w +{ +} def +/*W +{ +} def +/` +{ + /_i save ddef + clipForward? + { + nulldevice + } if + 6 1 roll 4 npop + concat pop + userdict begin + /showpage + { + } def + 0 setgray + 0 setlinecap + 1 setlinewidth + 0 setlinejoin + 10 setmiterlimit + [] 0 setdash + /setstrokeadjust where {pop false setstrokeadjust} if + newpath + 0 setgray + false setoverprint +} def +/~ +{ + end + _i restore +} def +/_rgbtocmyk +{ + 3 + { + 1 exch sub 3 1 roll + } repeat + 3 copy 1 4 1 roll + 3 + { + 3 index 2 copy gt + { + exch + } if + pop 4 1 roll + } repeat + pop pop pop + 4 1 roll + 3 + { + 3 index sub + 3 1 roll + } repeat + 4 -1 roll +} def +/setrgbfill +{ + _rgbf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _rgbf aload pop setrgbcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/setrgbstroke +{ + _rgbs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _rgbs aload pop setrgbcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/O +{ + 0 ne + /_of exch ddef + /_lp /none ddef +} def +/R +{ + 0 ne + /_os exch ddef + /_lp /none ddef +} def +/g +{ + /_gf exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/G +{ + /_gs exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/k +{ + _cf astore pop + /_fc + { + _lp /fill ne + { + _of setoverprint + _cf aload pop setcmykcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/K +{ + _cs astore pop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _cs aload pop setcmykcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xa +{ + _?cmyk { + 3 npop k + }{ + setrgbfill 4 npop + } ifelse +} def +/XA +{ + _?cmyk { + 3 npop K + }{ + setrgbstroke 4 npop + } ifelse +} def +/Xs +{ + /_gf exch ddef + 5 npop + /_fc + { + _lp /fill ne + { + _of setoverprint + _gf setAIseparationgray + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XS +{ + /_gs exch ddef + 5 npop + /_sc + { + _lp /stroke ne + { + _os setoverprint + _gs setAIseparationgray + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/Xx +{ + exch + /_gf exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/XX +{ + exch + /_gs exch ddef + 0 eq { + findcmykcustomcolor + }{ + _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse + { + 4 1 roll 3 npop + findcmykcustomcolor + }{ + 8 -4 roll 4 npop + findrgbcustomcolor + } ifelse + } ifelse + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/x +{ + /_gf exch ddef + findcmykcustomcolor + /_if exch ddef + /_fc + { + _lp /fill ne + { + _of setoverprint + _if _gf 1 exch sub setcustomcolor + /_lp /fill ddef + } if + } ddef + /_pf + { + _fc + _eo {eofill} {fill} ifelse + } ddef + /_psf + { + _fc + hvashow + } ddef + /_pjsf + { + _fc + hvawidthshow + } ddef + /_lp /none ddef +} def +/X +{ + /_gs exch ddef + findcmykcustomcolor + /_is exch ddef + /_sc + { + _lp /stroke ne + { + _os setoverprint + _is _gs 1 exch sub setcustomcolor + /_lp /stroke ddef + } if + } ddef + /_ps + { + _sc + stroke + } ddef + /_pss + { + _sc + ss + } ddef + /_pjss + { + _sc + jss + } ddef + /_lp /none ddef +} def +/XK +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + K + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + XA + } ifelse +} def +/Xk +{ + 3 -1 roll pop + 0 eq + { + 1 exch sub + 3 {dup 3 1 roll mul 5 1 roll} repeat + mul 4 1 roll + k + } + { + 1 exch sub 4 1 roll + 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat + 4 -1 roll pop + Xa + } ifelse +} def +/A +{ + pop +} def +/annotatepage +{ +userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse +} def +/XT { + pop pop +} def +/Xt { + pop +} def +/discard +{ + save /discardSave exch store + discardDict begin + /endString exch store + gt38? + { + 2 add + } if + load + stopped + pop + end + discardSave restore +} bind def +userdict /discardDict 7 dict dup begin +put +/pre38Initialize +{ + /endStringLength endString length store + /newBuff buffer 0 endStringLength getinterval store + /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store + /newBuffLast newBuff endStringLength 1 sub 1 getinterval store +} def +/shiftBuffer +{ + newBuff 0 newBuffButFirst putinterval + newBuffLast 0 + currentfile read not + { + stop + } if + put +} def +0 +{ + pre38Initialize + mark + currentfile newBuff readstring exch pop + { + { + newBuff endString eq + { + cleartomark stop + } if + shiftBuffer + } loop + } + { + stop + } ifelse +} def +1 +{ + pre38Initialize + /beginString exch store + mark + currentfile newBuff readstring exch pop + { + { + newBuff beginString eq + { + /layerCount dup load 1 add store + } + { + newBuff endString eq + { + /layerCount dup load 1 sub store + layerCount 0 eq + { + cleartomark stop + } if + } if + } ifelse + shiftBuffer + } loop + } if +} def +2 +{ + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + endString eq { + cleartomark stop + } if + }ifelse + } loop +} def +3 +{ + /beginString exch store + /layerCnt 1 store + mark + { + currentfile buffer {readline} stopped { + % assume error was due to overfilling the buffer + }{ + not + { + stop + } if + dup beginString eq + { + pop /layerCnt dup load 1 add store + } + { + endString eq + { + layerCnt 1 eq + { + cleartomark stop + } + { + /layerCnt dup load 1 sub store + } ifelse + } if + } ifelse + }ifelse + } loop +} def +end +userdict /clipRenderOff 15 dict dup begin +put +{ + /n /N /s /S /f /F /b /B +} +{ + { + _doClip 1 eq + { + /_doClip 0 ddef _eo {eoclip} {clip} ifelse + } if + newpath + } def +} forall +/Tr /pop load def +/Bb {} def +/BB /pop load def +/Bg {12 npop} def +/Bm {6 npop} def +/Bc /Bm load def +/Bh {4 npop} def +end +/Lb +{ + 6 npop + 7 2 roll + 5 npop + 0 eq + { + 0 eq + { + (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard + } + { + + /clipForward? true def + + /Tx /pop load def + /Tj /pop load def + + currentdict end clipRenderOff begin begin + } ifelse + } + { + 0 eq + { + save /discardSave exch store + } if + } ifelse +} bind def +/LB +{ + discardSave dup null ne + { + restore + } + { + pop + clipForward? + { + currentdict + end + end + begin + + /clipForward? false ddef + } if + } ifelse +} bind def +/Pb +{ + pop pop + 0 (%AI5_EndPalette) discard +} bind def +/Np +{ + 0 (%AI5_End_NonPrinting--) discard +} bind def +/Ln /pop load def +/Ap +/pop load def +/Ar +{ + 72 exch div + 0 dtransform dup mul exch dup mul add sqrt + dup 1 lt + { + pop 1 + } if + setflat +} def +/Mb +{ + q +} def +/Md +{ +} def +/MB +{ + Q +} def +/nc 4 dict def +nc begin +/setgray +{ + pop +} bind def +/setcmykcolor +{ + 4 npop +} bind def +/setrgbcolor +{ + 3 npop +} bind def +/setcustomcolor +{ + 2 npop +} bind def +currentdict readonly pop +end +/XP +{ + 4 npop +} bind def +/XD +{ + pop +} bind def +end +setpacking +%%EndResource +%%BeginResource: procset Adobe_pattern_AI5 1.1 0 +%%Title: (Adobe Illustrator (R) Version 5.0 Pattern Operators) +%%Version: 1.1 0 +%%CreationDate: (03/26/93) () +%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_Illustrator_AI5 known not { + userdict /Adobe_Illustrator_AI5 95 dict put +} if +userdict /Adobe_Illustrator_AI5 get begin +/@ +{ +} def +/& +{ +} def +/dp +{ + dup null eq + { + pop + _dp 0 ne + { + 0 1 _dp 1 sub _dl mod + { + _da exch get 3 get + } for + _dp 1 sub _dl mod 1 add packedarray + _da 0 get aload pop 8 -1 roll 5 -1 roll pop 4 1 roll + definepattern pop + } if + } + { + _dp 0 ne _dp _dl mod 0 eq and + { + null dp + } if + 7 packedarray _da exch _dp _dl mod exch put + _dp _dl mod _da 0 get 4 get 2 packedarray + /_dp _dp 1 add def + } ifelse +} def +/E +{ + _ed begin + dup 0 get type /arraytype ne + { + 0 + { + dup 1 add index type /arraytype eq + { + 1 add + } + { + exit + } ifelse + } loop + array astore + } if + /_dd exch def + /_ury exch def + /_urx exch def + /_lly exch def + /_llx exch def + /_n exch def + /_y 0 def + /_dl 4 def + /_dp 0 def + /_da _dl array def + 0 1 _dd length 1 sub + { + /_d exch _dd exch get def + 0 2 _d length 2 sub + { + /_x exch def + /_c false def + /_r _d _x 1 add get cvlit def + _r _ ne + { + _urx _llx sub _ury _lly sub + [ + 1 0 0 1 0 0 + ] + [ + /save cvx + _llx neg _lly neg /translate cvx + _c + { + nc /begin cvx + } if + _r dup type /stringtype eq + { + cvx + } + { + { + exec + } /forall cvx + } ifelse + _c + { + /end cvx + } if + /restore cvx + ] cvx + /_fn 12 _n length add string def + _y _fn cvs pop + /_y _y 1 add def + _fn 12 _n putinterval + _fn _c false dp + _d exch _x 1 add exch put + } if + } for + } for + null dp + _n _dd /_pd + end + xput +} def +/fc +{ + _fm dup concatmatrix pop +} def +/p +{ + /_fm exch ddef + 9 -2 roll _pm translate fc + 7 -2 roll _pm scale fc + 5 -1 roll _pm rotate fc + 4 -2 roll exch 0 ne + { + dup _pm rotate fc + 1 -1 _pm scale fc + neg _pm rotate fc + } + { + pop + } ifelse + dup _pm rotate fc + exch dup sin exch cos div 1 0 0 1 0 6 2 roll + _pm astore fc + neg _pm rotate fc + _pd exch get /_fdd exch ddef + /_pf + { + save + /_doClip 0 ddef + 0 1 _fdd length 1 sub + { + /_fd exch _fdd exch get ddef + _fd + 0 2 _fd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _fc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _fm + patternfill + } + { + pop + fill + } ifelse + grestore + pop + } for + pop + } for + restore + newpath + } ddef + /_psf + { + save + /_doClip 0 ddef + 0 1 _fdd length 1 sub + { + /_fd exch _fdd exch get ddef + _fd + 0 2 _fd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _fc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _fm + 9 copy 6 npop patternashow + } + { + pop + 6 copy 3 npop hvashow + } ifelse + grestore + pop + } for + pop + } for + restore + sw rmoveto + } ddef + /_pjsf + { + save + /_doClip 0 ddef + 0 1 _fdd length 1 sub + { + /_fd exch _fdd exch get ddef + _fd + 0 2 _fd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _fc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _fm + 12 copy 6 npop patternawidthshow + } + { + pop 9 copy 3 npop hvawidthshow + } ifelse + grestore + pop + } for + pop + } for + restore + swj rmoveto + } ddef + /_lp /none ddef +} def +/sc +{ + _sm dup concatmatrix pop +} def +/P +{ + /_sm exch ddef + 9 -2 roll _pm translate sc + 7 -2 roll _pm scale sc + 5 -1 roll _pm rotate sc + 4 -2 roll exch 0 ne + { + dup _pm rotate sc + 1 -1 _pm scale sc + neg _pm rotate sc + } + { + pop + } ifelse + dup _pm rotate sc + exch dup sin exch cos div 1 0 0 1 0 6 2 roll + _pm astore sc + neg _pm rotate sc + _pd exch get /_sdd exch ddef + /_ps + { + save + /_doClip 0 ddef + 0 1 _sdd length 1 sub + { + /_sd exch _sdd exch get ddef + _sd + 0 2 _sd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _sc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _sm + patternstroke + } + { + pop stroke + } ifelse + grestore + pop + } for + pop + } for + restore + newpath + } ddef + /_pss + { + save + /_doClip 0 ddef + 0 1 _sdd length 1 sub + { + /_sd exch _sdd exch get ddef + _sd + 0 2 _sd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _sc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _sm + 10 copy 6 npop patternashowstroke + } + { + pop 7 copy 3 npop ss + } ifelse + grestore + pop + } for + pop + } for + restore + pop sw rmoveto + } ddef + /_pjss + { + save + /_doClip 0 ddef + 0 1 _sdd length 1 sub + { + /_sd exch _sdd exch get ddef + _sd + 0 2 _sd length 2 sub + { + gsave + 2 copy get dup _ ne + { + cvx exec _sc + } + { + pop + } ifelse + 2 copy 1 add get dup _ ne + { + aload pop findfont _sm + 13 copy 6 npop patternawidthshowstroke + } + { + pop 10 copy 3 npop jss + } ifelse + grestore + pop + } for + pop + } for + restore + pop swj rmoveto + } ddef + /_lp /none ddef +} def +end +userdict /Adobe_pattern_AI5 18 dict dup begin +put +/initialize +{ + /definepattern where + { + pop + pop pop + } + { + begin + begin + Adobe_pattern_AI5 begin + Adobe_pattern_AI5 + { + dup xcheck + { + bind + } if + pop pop + } forall + mark + cachestatus 7 1 roll pop pop pop pop exch pop exch + { + { + 10000 add + dup 2 index gt + { + exit + } if + dup setcachelimit + } loop + } stopped + cleartomark + end + + end + end + + Adobe_pattern_AI5 begin + } ifelse +} def +/terminate +{ + currentdict Adobe_pattern_AI5 eq + { + end + } if +} def +errordict +/nocurrentpoint +{ + pop + stop +} put +errordict +/invalidaccess +{ + pop + stop +} put +/patternencoding +256 array def +0 1 255 +{ + patternencoding exch ( ) 2 copy exch 0 exch put cvn put +} for +/definepattern +{ + 17 dict begin + /uniform exch def + /cache exch def + /key exch def + /procarray exch def + /mtx exch matrix invertmatrix def + /height exch def + /width exch def + /ctm matrix currentmatrix def + /ptm matrix def + /str 32 string def + /slice 9 dict def + slice /s 1 put + slice /q 256 procarray length div sqrt floor cvi put + slice /b 0 put + /FontBBox + [ + 0 0 0 0 + ] def + /FontMatrix mtx matrix copy def + /Encoding patternencoding def + /FontType 3 def + /BuildChar + { + exch + begin + /setstrokeadjust where {pop true setstrokeadjust} if + slice begin + dup q dup mul mod s idiv /i exch def + dup q dup mul mod s mod /j exch def + q dup mul idiv procarray exch get + /xl j width s div mul def + /xg j 1 add width s div mul def + /yl i height s div mul def + /yg i 1 add height s div mul def + uniform + { + 1 1 + } + { + width 0 dtransform + dup mul exch dup mul add sqrt dup 1 add exch div + 0 height dtransform + dup mul exch dup mul add sqrt dup 1 add exch div + } ifelse + width 0 cache + { + xl 4 index mul yl 4 index mul xg 6 index mul yg 6 index mul + setcachedevice + } + { + setcharwidth + } ifelse + gsave + scale + newpath + xl yl moveto + xg yl lineto + xg yg lineto + xl yg lineto + closepath + clip + newpath + end + end + exec + grestore + } def + key currentdict definefont + end +} def +/patterncachesize +{ + gsave + newpath + 0 0 moveto + width 0 lineto + width height lineto + 0 height lineto + closepath + patternmatrix setmatrix + pathbbox + exch ceiling 4 -1 roll floor sub 3 1 roll + ceiling exch floor sub + mul 1 add + grestore +} def +/patterncachelimit +{ + cachestatus 7 1 roll 6 npop 8 mul +} def +/patternpath +{ + exch dup begin + setfont + ctm setmatrix + concat + slice exch /b exch slice /q get dup mul mul put + FontMatrix concat + uniform + { + width 0 dtransform round width div exch round width div exch + 0 height dtransform round height div exch height div exch + 0 0 transform round exch round exch + ptm astore setmatrix + } + { + ptm currentmatrix pop + } ifelse + { + currentpoint + } stopped not + { + 2 npop + pathbbox + true + 4 index 3 index eq + 4 index 3 index eq + and + { + pop false + { + { + 2 npop + } + { + 3 npop true + } + { + 7 npop true + } + { + pop true + } pathforall + } stopped + { + 5 npop true + } if + } if + { + height div ceiling height mul 4 1 roll + width div ceiling width mul 4 1 roll + height div floor height mul 4 1 roll + width div floor width mul 4 1 roll + 2 index sub height div ceiling cvi exch + 3 index sub width div ceiling cvi exch + 4 2 roll moveto + FontMatrix mtx invertmatrix + dup dup 4 get exch 5 get rmoveto + ptm ptm concatmatrix pop + slice /s + patterncachesize patterncachelimit div ceiling sqrt ceiling cvi + dup slice /q get gt + { + pop slice /q get + } if + put + 0 1 slice /s get dup mul 1 sub + { + slice /b get add + gsave + 0 1 str length 1 sub + { + str exch 2 index put + } for + pop + dup + { + gsave + ptm setmatrix + 1 index str length idiv + { + str show + } repeat + 1 index str length mod str exch 0 exch getinterval show + grestore + 0 height rmoveto + } repeat + grestore + } for + 2 npop + } + { + 4 npop + } ifelse + } if + end +} def +/patternclip +{ + _eo {eoclip} {clip} ifelse +} def +/patternstrokepath +{ + strokepath +} def +/patternmatrix +matrix def +/patternfill +{ + dup type /dicttype eq + { + Adobe_pattern_AI5 /patternmatrix get + } if + gsave + patternclip + Adobe_pattern_AI5 /patternpath get exec + grestore + newpath +} def +/patternstroke +{ + dup type /dicttype eq + { + Adobe_pattern_AI5 /patternmatrix get + } if + gsave + patternstrokepath + true + { + { + { + newpath + moveto + } + { + lineto + } + { + curveto + } + { + closepath + 3 copy + Adobe_pattern_AI5 /patternfill get exec + } pathforall + 3 npop + } stopped + { + 5 npop + patternclip + Adobe_pattern_AI5 /patternfill get exec + } if + } + { + patternclip + Adobe_pattern_AI5 /patternfill get exec + } ifelse + grestore + newpath +} def +/vpatternawidthshow +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 5 index 5 index 5 index Adobe_pattern_AI5 /patternfill get exec + grestore + _fontRotateAdjust sub + moveto + _hvwb eq { _hvcx _hvcy rmoveto } if + _hvax _hvay rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + _hvax sub + 3 index _hvwb eq { _hvcx sub } if + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + gsave + 2 index false charpath + 6 index 6 index 6 index Adobe_pattern_AI5 /patternfill get exec + grestore + newpath moveto pop pop + } ifelse + } cforall + 3 npop +} def +/hpatternawidthshow +{ + { + dup cstring exch + gsave + 3 index eq { 5 index 5 index rmoveto } if + false charpath currentpoint + 9 index 9 index 9 index + Adobe_pattern_AI5 /patternfill get exec + grestore + newpath moveto + 2 copy rmoveto + } cforall + 8 npop +} def +/patternashow +{ +0 0 0 6 3 roll +patternawidthshow +} def +/patternawidthshow +{ + 6 index type /dicttype eq + { + Adobe_pattern_AI5 /patternmatrix get 7 1 roll + } if + _lineorientation 0 eq { hpatternawidthshow } { vpatternawidthshow } ifelse +} def +/vpatternawidthshowstroke +{ + 7 1 roll + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + { + dup cstring + dup length 1 eq + _charorientation 1 eq + and + { + -90 rotate + currentpoint + _fontRotateAdjust add + moveto + gsave + false charpath currentpoint + 3 index setmatrix + 6 index 6 index 6 index Adobe_pattern_AI5 /patternstroke get exec + grestore + _fontRotateAdjust sub + moveto + _hvwb eq { _hvcx _hvcy rmoveto } if + _hvax _hvay rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + _hvax sub + 3 index _hvwb eq { _hvcx sub } if + currentpoint + exch 4 index stringwidth pop 2 div sub + exch _fontAscent sub + moveto + gsave + 2 index false charpath + 4 index setmatrix + 7 index 7 index 7 index Adobe_pattern_AI5 /patternstroke get exec + grestore + newpath moveto pop pop + } ifelse + } cforall + 4 npop +} def +/hpatternawidthshowstroke +{ + 7 1 roll + { + dup cstring exch + gsave + 3 index eq { 5 index 5 index rmoveto } if + false charpath currentpoint + 7 index setmatrix + 10 index 10 index 10 index + Adobe_pattern_AI5 /patternstroke get exec + grestore + newpath moveto + 2 copy rmoveto + } cforall + 9 npop +} def +/patternashowstroke +{ + 0 0 0 7 3 roll + patternawidthshowstroke +} def +/patternawidthshowstroke +{ + 7 index type /dicttype eq + { + patternmatrix /patternmatrix get 8 1 roll + } if + _lineorientation 0 eq { hpatternawidthshowstroke } { vpatternawidthshowstroke } ifelse +} def +end +setpacking +%%EndResource +%%BeginResource: procset Adobe_cshow 2.0 8 +%%Title: (Writing System Operators) +%%Version: 2.0 8 +%%CreationDate: (1/23/89) () +%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved) +currentpacking true setpacking +userdict /Adobe_cshow 14 dict dup begin put +/initialize +{ + Adobe_cshow begin + Adobe_cshow + { + dup xcheck + { + bind + } if + pop pop + } forall + end + Adobe_cshow begin +} def +/terminate +{ +currentdict Adobe_cshow eq + { + end + } if +} def +/cforall +{ + /_lobyte 0 ddef + /_hibyte 0 ddef + /_cproc exch ddef + /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef + { + /_lobyte exch ddef + _hibyte 0 eq + _cscript 1 eq + _lobyte 129 ge _lobyte 159 le and + _lobyte 224 ge _lobyte 252 le and or and + _cscript 2 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 3 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript 25 eq + _lobyte 161 ge _lobyte 254 le and and + _cscript -1 eq + or or or or and + { + /_hibyte _lobyte ddef + } + { + _hibyte 256 mul _lobyte add + _cproc + /_hibyte 0 ddef + } ifelse + } forall +} def +/cstring +{ + dup 256 lt + { + (s) dup 0 4 3 roll put + } + { + dup 256 idiv exch 256 mod + (hl) dup dup 0 6 5 roll put 1 4 3 roll put + } ifelse +} def +/clength +{ + 0 exch + { 256 lt { 1 } { 2 } ifelse add } cforall +} def +/hawidthshow +{ + { + dup cstring + show + _hvax _hvay rmoveto + _hvwb eq { _hvcx _hvcy rmoveto } if + } cforall +} def +/vawidthshow +{ + { + dup 255 le + _charorientation 1 eq + and + { + -90 rotate + 0 _fontRotateAdjust rmoveto + cstring + _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow + 0 _fontRotateAdjust neg rmoveto + 90 rotate + } + { + currentpoint + _fontHeight sub + exch _hvay sub exch _hvax sub + 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if + 3 2 roll + cstring + dup stringwidth pop 2 div neg _fontAscent neg rmoveto + show + moveto + } ifelse + } cforall +} def +/hvawidthshow +{ + 6 1 roll + /_hvay exch ddef + /_hvax exch ddef + /_hvwb exch ddef + /_hvcy exch ddef + /_hvcx exch ddef + _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse +} def +/hvwidthshow +{ + 0 0 3 -1 roll hvawidthshow +} def +/hvashow +{ + 0 0 0 6 -3 roll hvawidthshow +} def +/hvshow +{ + 0 0 0 0 0 6 -1 roll hvawidthshow +} def +currentdict readonly pop end +setpacking +%%EndResource +%%BeginResource: procset Adobe_shading_AI8 1.0 0 +%%Title: (Adobe Illustrator 8 Shading Procset) +%%Version: 1.0 0 +%%CreationDate: (12/17/97) () +%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved) +userdict /defaultpacking currentpacking put true setpacking +userdict /Adobe_shading_AI8 10 dict dup begin put +/initialize { + Adobe_shading_AI8 begin + Adobe_shading_AI8 bdprocs + Mesh /initialize get exec +} def +/terminate { + currentdict Adobe_shading_AI8 eq { + end + } if +} def +/bdprocs { + { + dup xcheck 1 index type /arraytype eq and { + bind + } if + pop pop + } forall +} def +/X! {pop} def +/X# {pop pop} def +/Mesh 40 dict def +Mesh begin +/initialize { + Mesh bdprocs + Mesh begin + /emulate? /AI8MeshEmulation where { + pop AI8MeshEmulation + }{ + systemdict /shfill known not + } ifelse def + end +} def +/bd { + shadingdict begin +} def +/paint { + emulate? { + end + }{ + /_lp /none ddef _fc /_lp /none ddef + + /AIColorSpace AIColorSpace tocolorspace store + /ColorSpace AIColorSpace topsspace store + + version_ge_3010.106 not systemdict /setsmoothness known and { + 0.0001 setsmoothness + } if + + composite? { + /DataSource getdatasrc def + Matrix concat + currentdict end + shfill + }{ + AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and { + end + }{ + /ColorSpace /DeviceGray store + /Decode [0 1 0 1 0 1] store + /DataSource getplatesrc def + Matrix concat + currentdict end + shfill + } ifelse + } ifelse + } ifelse +} def +/shadingdict 12 dict def +shadingdict begin + /ShadingType 6 def + /BitsPerCoordinate 16 def + /BitsPerComponent 8 def + /BitsPerFlag 8 def +end +/datafile null def +/databuf 256 string def +/dataptr 0 def +/srcspace null def +/srcchannels 0 def +/dstchannels 0 def +/dstplate 0 def +/srctodstcolor null def +/getplatesrc { + /srcspace AIColorSpace store + /srcchannels AIColorSpace getnchannels store + /dstchannels 1 store + /dstplate getplateindex store + /srctodstcolor srcspace makesmarks { + dstplate 4 eq { + {1 exch sub} + }{ + {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat} + } ifelse + }{ + {srcchannels {pop} repeat 1} + } ifelse store + /datafile getdatasrc store + /rdpatch168 load DataLength () /SubFileDecode filter +} def +/getdatasrc { + /rdcmntline load /ASCII85Decode filter +} def +/rdpatch168 { + /dataptr 0 store + 49 rdcount + 4 { + dup {pop srcchannels getint8} if + dup {pop srctodstcolor dstchannels putint8 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdpatch3216 { + /dataptr 0 store + 97 rdcount + 4 { + dup {pop srcchannels getint16} if + dup {pop srctodstcolor dstchannels putint16 true} if + } repeat + {databuf 0 dataptr getinterval}{()} ifelse +} def +/rdcount { + dup 0 gt { + datafile databuf dataptr 4 -1 roll getinterval readstring + exch length dataptr add /dataptr exch store + }{ + true + } ifelse +} def +/getint8 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 255 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint8 { + dup dataptr add /dataptr exch store + dataptr exch + { + 1 sub exch + 255 mul cvi + databuf 2 index + 3 -1 roll put + } repeat + pop +} def +/getint16 { + mark true 3 -1 roll + { + dup {pop datafile read} if + dup {pop 256 mul datafile read} if + dup {pop add 65535 div true} if + } repeat + { + counttomark 1 add -1 roll pop true + }{ + cleartomark false + } ifelse +} def +/putint16 { + dup 2 mul dataptr add /dataptr exch store + dataptr exch + { + 2 sub exch + 65535 mul cvi dup + 256 idiv databuf 3 index 3 -1 roll put + 256 mod databuf 2 index 1 add 3 -1 roll put + } repeat + pop +} def +/srcbuf 256 string def +/rdcmntline { + currentfile srcbuf readline pop + (%) anchorsearch {pop} if +} def +/getplateindex { + 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall +} def +/aicsarray 4 array def +/aicsaltvals 4 array def +/aicsaltcolr aicsaltvals def +/tocolorspace { + dup type /arraytype eq { + mark exch aload pop + aicsarray 0 3 -1 roll put + aicsarray 1 3 -1 roll put + dup aicsarray 2 3 -1 roll put + gettintxform aicsarray 3 3 -1 roll put + counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store + aicsaltcolr astore pop pop + aicsarray + } if +} def +/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def +/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def +/gettintxform { + /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load +} def +/getnchannels { + dup type /arraytype eq {0 get} if + colorspacedict exch get begin Channels end +} def +/makesmarks { + composite? { + pop true + }{ + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin MarksPlate end + } ifelse +} def +/markingplate { + composite? { + pop true + }{ + dup type /arraytype eq { + dup length getplateindex gt {getplateindex get}{pop false} ifelse + } if + } ifelse +} def +/tocmyk { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToCMYK end +} def +/topsspace { + dup dup type /arraytype eq {0 get} if + colorspacedict exch get begin ToPSSpace end +} def +/colorspacedict 5 dict dup begin + /DeviceGray 4 dict dup begin + /Channels 1 def + /MarksPlate {pop black?} def + /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def + /ToPSSpace {} def + end def + /DeviceRGB 4 dict dup begin + /Channels 3 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop _rgbtocmyk} def + /ToPSSpace {} def + end def + /DeviceCMYK 4 dict dup begin + /Channels 4 def + /MarksPlate {pop isCMYKSep?} def + /ToCMYK {pop} def + /ToPSSpace {} def + end def + /Separation 4 dict dup begin + /Channels 1 def + /MarksPlate { + /findcmykcustomcolor where { + pop dup 1 exch ToCMYK 5 -1 roll 1 get + findcmykcustomcolor 1 setcustomcolor + systemdict /currentgray get exec + 1 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace {} def + end def + /Process 4 dict dup begin + /Channels 1 def + /MarksPlate { + isCMYKSep? { + 1 exch ToCMYK 4 array astore getplateindex get 0 ne + }{ + pop false + } ifelse + } def + /ToCMYK { + dup 2 get mark exch 4 2 roll + 3 get exec + counttomark -1 roll tocmyk + 5 -1 roll pop + } def + /ToPSSpace { + 4 array copy dup 0 /Separation put + } def + end def +end def +/isoverprint { + /currentoverprint where {pop currentoverprint}{_of} ifelse +} def +/version_ge_3010.106 { + version {cvr} stopped { + pop + false + }{ + 3010.106 ge + } ifelse +} def +end +end +defaultpacking setpacking +%%EndResource +%%EndProlog %%BeginSetup userdict /_useSmoothShade true put userdict /_aicmykps true put userdict /_forceToCMYK true put Adobe_level2_AI5 /initialize get exec +Adobe_cshow /initialize get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 AGM_Gradient /initializeAI get exec +Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_pattern_AI5 /initialize get exec +Adobe_ColorImage_AI6 /initialize get exec +Adobe_shading_AI8 /initialize get exec +Adobe_Illustrator_AI5 /initialize get exec +%AI3_BeginRider currentpacking true setpacking setpacking %AI3_EndRider %AI5_Begin_NonPrinting Np %AI8_PluginGroupInfo (Adobe Path Blends) (Adobe Blends Plugin) (LiveBlends.aip) %AI8_PluginGroupInfo (Adobe Tracing Object) (Tracing) (TracingSuite.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (ScatterBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (ArtBrushTool.aip) %AI8_PluginGroupInfo (Adobe Calligraphic Brush Tool) (Adobe Calligraphic Brush Plugin) (CalligBrushTool.aip) %AI8_PluginGroupInfo (Adobe Flare Plugin) (Flare) (Flare.aip) %AI8_PluginGroupInfo (Adobe Symbolism) (Adobe Symbolism) (ParticleSystem.aip) %AI8_PluginGroupInfo (Adobe Deform Plugin) (Adobe Envelope Plugin) (Envelope and Warp.aip) %AI8_PluginGroupInfo (Pathfinder Suite) (Adobe Compound Shape) (PathFinderS.aip) %AI8_PluginGroupInfo (Adobe Planar Group) (Adobe Live Paint Plugin) (Live Paint.aip) %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np 12 Bn %AI5_BeginGradient: (Gray Linear Gradient) (Gray Linear Gradient) 0 7 Bd [ < 0A0B0C0D0D0E10111213131415161717191A1B1B1C1D1F202122232425262728292A2B2C2D2E2E2F 31323435363738393A3B3C3D3E3F41424344454648494A4B4C4D4E5051525354555758595A5C5D5E 60616364656668696A6B6C > < 070809090A0B0B0C0D0C0D0E0F1010121112131314151617161718191A1B1C1D1D1E1E1E1F202223 24252627262728292A2B2C2D2E2F3031303132333435363738393A3B3C3C3C3D3E3F414243444546 47484A494A4B4D4E4F5051 > < 0607070809090A0A0B0C0D0E0D0E0F0F111211121314141516161718191A1B1A1B1C1D1E1F201F20 212223242625262728292A2B2C2B2C2D2F303031323233343536373839393A3B3C3D3E3F403F4041 42444547484948494A4B4C > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010101 > < F1F0EFEEEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECECD CCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5 A4A3A2A1A09F9E9D9C9B9A > < F1F0EFEFEEEDECEBEAEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDDDCDBDAD9D8D7D6D5D4D4D3D2D1D0CF CECDCCCBCBCAC9C8C7C6C5C4C3C2C1C0C0BFBEBDBCBBBAB9B8B7B6B5B4B4B3B2B1B0AFAEADACABAA A9A8A7A7A6A5A4A3A2A1A0 > < F2F1F1F0EFEEEDEDECEBEAE9E9E8E7E6E5E4E4E3E2E1E0DFDFDEDDDCDBDAD9D9D8D7D6D5D4D3D3D2 D1D0CFCECDCDCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBFBEBDBCBBBAB9B8B8B7B6B5B4B3B2B1B1B0AF AEADACABAAA9A9A8A7A6A5 > 4 %_Br < 1A1918171615141211100E0D0C0B0A > < 11100F0E0D0D0C0C0C0B0B0A090807 > < 1111100F0E0D0C0B0B0A0909080706 > 0 < E2E3E4E5E6E7E8EAEBECEDEEEFF0F1 > < E4E5E6E7E8E9EAEBEBECEDEEEFF0F1 > < E5E6E7E8E9EAEBECECEDEEEFF0F1F2 > 4 %_Br < 54535251504F4E4C4B4A4948474644434241403F3E3D3C3B393836353432312F2E2D2C2B2A292827 262524232221201F1E1D1C1B1A > < 3C3B3A3938373635343433323130302F2E2D2C2B2A2928272625252524232221201F1E1D1C1C1B1A 19181717171615141413121111 > < 3D3C3C3B3A39383837363534333230302F2E2D2C2D2C2B2A29282725242322212021201F1E1D1C1B 1B1A1918161616151514131211 > 0 < ADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C8C9CACBCCCDCECFD0D1D2D3D4D5 D6D7D8D9DADBDCDDDEDFE0E1E2 > < B3B4B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCCCDCECFD0D1D2D3D4D5D6D7D8 D9DADBDCDCDDDEDFE0E1E2E3E4 > < B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C7C8C9CACBCCCDCECFD0D1D2D3D3D4D5D6D7D8D9 DADBDCDDDEDFDFE0E1E2E3E4E5 > 4 %_Br < 00000000000000000000000000000001010102020203030304040505050505060606070708080909 0A0A0A0A0B0C0C0D0D0E0E101011121213141415141617171819191A1B1B1C1D1E1E1F2021212223 24242526272728292A2B2B2C2D2E2F303132333536373838393A3C3D3E3F40414243434546474849 4A4B4C4E4F5051525354 > < 00000000000000000000000000000001000000010101020201020202030203030304040504050505 05050606070608070908090A0A0B0A0C0B0C0C0D0E0D0E0E0F101011111112131214141415161617 171718191A1A1B1C1D1C1D1E1F1F1F20222122232526252628292A2A2A2B2C2D2E2F302F30313233 343536363738393A3B3C > < 00000000000000000000000000000000000001010101020202020202030302030304040405040505 060607070708070908090A0A0B0B0C0B0D0C0E0D0E100F1010111211121413141415151616171718 19191A1B1B1B1C1D1C1E1F201F21222222242526252628292A292A2B2D2E2F2E2F30303233333435 363737393A3A3B3C3C3D > 0 < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F8F8F8F7F7F6F6F6F5F5F4F4F3F3 F2F2F1F1F0EFEFEEEEEDEDECECEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDEDEDDDCDBDBDAD9 D8D8D7D6D5D5D4D3D2D1D1D0CFCECDCCCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7 B6B5B4B3B2B1B0AFAEAD > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFCFBFBFBFAFAFAF9F9F9F8F8F7F7F7F6F6F5F5F4F4F4 F3F3F2F2F1F1F0F0EFEFEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDFDEDDDDDC DBDBDAD9D8D8D7D6D5D5D4D3D2D2D1D0CFCFCECDCCCBCBCAC9C8C7C6C6C5C4C3C2C1C0C0BFBEBDBC BBBAB9B9B8B7B6B5B4B3 > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F9F8F8F8F7F7F6F6F6F5F5F4F4 F3F3F2F2F1F1F1F0F0EFEEEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E2E1E0E0DFDEDEDD DCDCDBDAD9D9D8D7D7D6D5D4D4D3D2D1D1D0CFCECECDCCCBCACAC9C8C7C6C5C5C4C3C2C1C0C0BFBE BDBCBBBAB9B9B8B7B6B5 > 4 %_Br < 0A0A090908080706050504030201000000 > < 0707070605050504030302020100000000 > < 0606050505040403020202020100000000 > 0 < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F2F2F3F4F4F5F6F7F8F9F9FAFBFCFDFEFF > 4 %_Br < 1717161615151414131312121111100F0F0E0D0C0B0B0A > < 16161515141313121111110F0E0D0E0D0C0B0A0A090807 > < 1717161415141312111111100F0E0D0C0B0A0A08070706 > 0 < E5E5E6E6E7E7E8E8E9E9EAEAEBEBECEDEDEEEEEFF0F0F1 > < E1E1E2E2E3E4E4E5E6E6E7E8E9EAEAEBECEDEEEEEFF0F1 > < DFDFE0E1E1E2E3E4E5E5E6E7E8E9EAEBECEDEEEFF0F1F2 > 4 %_Br [ 0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 %_BS %_0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 Bs 0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 %_BS %_0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 Bs 0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 %_BS %_0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 Bs 0 0 0 0 1 1 1 2 64.5161 0.005 %_BS %_0 0 0 0 1 1 1 2 64.5161 0 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0.0025 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0 Bs 0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 %_BS %_0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Linear Gradient 1) (Linear Gradient 1) 0 2 Bd [ < 00000001020304050506070809090A0B0C0D0F10111213141516171818191A1B1C1C1D1F20212223 24252627292A2A2B2D2E2F30323334353637383A3B3C3D3E3F40424344454647484A4B4C4D4E4F51 52535455565658595B5C5D5F6061626364666768696A6B6C6D6E6F6F707172737475767778797A7B 7C7D7E7F7F8081828383848586878788898A8B8C8B8C8D8E8E8F9090919293949495969697989899 9A9A9B9C9C9D9D9E9E9F9FA0A0A1A1A2A2A3A3A4A4A4A5A5A6A6A7A7A8A8A9A9AAAAAAABABAAAAAB ABABABACACACACADADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2 > < 00000000010202030304040506060708090A0A0B0C0D0D0E0F1010111213141516171818191A1B1C 1D1D1E1F202122222324262728292A2B2C2D2E2E2F30313233343536373838393A3B3C3D3E3F4041 434445464648494A4C4D4E4F505152535455565758595A5A5B5C5D5E5F6061626364646566676869 6A6B6C6C6D6E6F6F70717272737475767778797A7B7C7C7D7E7F808081828383848586878788898A 8A8B8C8D8E8E8F8F9090919292939494959696979899999A9A9B9B9C9C9D9D9E9E9F9FA0A0A2A2A3 A3A3A4A4A5A5A6A6A7A7A7A8A8A9A9A9AAAAAAABABABACACAC > < 00000000010202030304040506060708090A0B0B0C0D0E0F1011121213141515161718191A1B1B1C 1D1E1F20202122232425262728292A2B2C2D2E2F30313233343536373738393A3B3C3D3E3F404142 434445464748494A4C4D4E4F505152535455565758595A5B5C5C5D5E5F6061616161626364656566 676869696A6B6B6C6D6E6E6F70717172737474757677777879797A7B7C7C7D7E7F7F808181828383 8485858686878888898A8B8B8C8D8D8E8E8F8F90909191929293939494959596969797989899999A 9A9B9B9C9C9C9D9D9E9E9E9F9F9FA0A0A1A1A1A1A2A2A2A3A3 > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000010101010101020202020203030304040505060606070708090A0A0B 0C0D0E0F0F101112131415161718191A1B1D1E1F20212324252728292B2C2E2F303233353637393B 3C3E4041434546484A4B4D4F51525456585A5C5E5F61636567696B6D6F717375777A7C7E80828587 898B8E90929497999B9DA0A2A4A6A8ABADAFB1B3B5B7B9BBBD > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9 D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1 B0AFAEADACACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A 898887868584838281807F7E7D7C7B7A79787776767574737271706F6E6D6C6B6A69686766656463 6261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3E3D3C 3B3A393837363534333231302F2E2D2C2B2A29282726252423 > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 37363534333231302F2E2D2C2B2A292827262524232221201F > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796959493929190908F8E8D8C8B8A89 8887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261 605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A39 3837363534333231302F2E2D2C2B2A29282726252423222120 > 4 %_Br [ 0 0 50 100 %_BS %_0 0 50 100 Bs 1 0 50 0 %_BS %_1 0 50 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Purple Radial Gradient) (Purple Radial Gradient) 1 3 Bd [ < 000000010202030304050505060707070809090A0A0C0D0D0E0F0F0F101112131313151616161718 1A1A1B1C1C1C1D1F202020212223252526272828292A2B2D2D2E2F3031313233343535373839393A 3B3C3D3D3E3F404141434445464647484A4B4B4D4E4F505152535455555758 > < 0000000102020303040405060708090A0A0B0D0E0F101112131415161718191A1B1C1B1C1D1E1F20 2022232325262728292A2B2C2D2E2F3032333435363738393A3B3C3D3E3F4041424345464748494A 4B4C4D4E4F5051525354555657595A5B5C5E6061626364666768696A6B6D6E > < 00000000000000000001000100010101010101010201020202020202010201020202030303020302 03030304030303030404040304030404040404040404040505050505050405060506050504050505 05050605050605060506050506050605050606070607060708070807070607 > 0 < FFFEFEFDFCFBFBFAF9F8F8F7F6F5F5F4F3F2F2F1F0EFEEEEEDECEBEBEAE9E8E7E7E6E5E4E4E3E2E1 E0E0DFDEDDDDDCDBDAD9D9D8D7D6D5D5D4D3D2D2D1D0CFCECECDCCCBCACAC9C8C7C6C6C5C4C3C3C2 C1C0BFBFBEBDBCBBBBBAB9B8B7B7B6B5B4B3B3B2B1B0AFAFAEADACABABAAA9 > < FFFEFDFCFBFAF9F9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDFDEDDDCDBDA D9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2 B1B0AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796959493 > < FFFEFEFDFDFCFCFBFBFAFAF9F9F8F7F7F6F6F5F5F4F4F3F2F2F1F1F0F0EFEFEEEDEDECECEBEBEAEA E9E8E8E7E7E6E6E5E4E4E3E3E2E2E1E0E0DFDFDEDEDDDDDCDBDBDADAD9D9D8D7D7D6D6D5D5D4D3D3 D2D2D1D1D0CFCFCECECDCDCCCBCBCACAC9C8C8C7C7C6C6C5C4C4C3C3C2C2C1 > 4 %_Br < 5858585959595A5B5B5C5C5D5D5D5E5E606061616262636365656666676769696A6A6B6C6D6D6F70 70717173737476767777797A7A7C7C7D7E7F80808183838485868788898A8A8C8D8E8F9091929494 959797999A9B9C9E9F9FA1A2A2A4A5A5A7A9A9AAACADADAEB0B0B2B3B4B4B6B7B9B9BABCBCBEBFC1 C1C2C4C5C5C7C8C9CACBCDCECECFD0 > < 6E6E6F6F6F7070717173737474767577787879797B7D7C7E7F7F80828283848486878788898B8B8C 8E8F8F909294939596989A999B9D9EA09FA1A2A4A5A5A7A8AAABADACAEAFB1B3B4B5B5B6B8B9BBBC BEBFC1C1C2C4C5C7C8CACBCCCECECFD1D2D3D5D6D7D9DADCDDDFE0E1E3E3E4E6E7E8EAEBECEEEFF1 F2F4F5F6F8F9FBFCFEFFFFFFFFFFFF > < 07070608080707070706080707080807080808080708080908080807090809090A09090A090A0A0B 0A0B0B0C0A0B0B0C0B0C0A0D0B0C0B0C0C0D0C0C0B0D0C0D0C0D0E0E0F0E0F0E0F0D100F0F111011 1011101213121312131213141315141516151615161516171617171819191A1B1A1B1B1C1D1C1D1C 1E1F1E202120212322242325262628 > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000001010101010101010101010101010101010102020202020202020203030304040405040504 05060506060607070707070809090B > < A9A9A9A8A8A8A7A7A7A6A6A5A5A5A4A4A3A3A2A2A1A1A0A09F9F9E9E9D9D9C9C9B9B9A9A99999897 979696959594939392929190908F8F8E8D8D8C8C8B8A8A8988888786868585848383828181807F7F 7E7D7D7C7B7B7A79787877767675747473727271706F6F6E6D6D6C6B6A6A69686767666565646362 6261605F5F5E5D5C5C5B5A59595857 > < 9393929292919190908F8F8E8E8D8D8C8B8B8A8A8988888786868584848382828180807F7E7D7D7C 7B7A7A7978777776757473737271706F6F6E6D6C6B6B6A6968676666656463626160605F5E5D5C5B 5A59585857565554535251504F4F4E4D4C4B4A49484746454443424140403F3E3D3C3B3A39383736 3534333231302F2E2D2C2B2A292827 > < C1C1C1C0C0C0C0BFBFBFBEBEBEBDBDBDBCBCBBBBBBBABAB9B9B9B8B8B7B7B6B6B5B5B5B4B4B3B3B2 B2B1B1B0B0AFAFAEAEADADACACABABAAAAA9A9A8A8A7A7A6A6A5A4A4A3A3A2A2A1A1A0A09F9E9E9D 9D9C9C9B9A9A99999898979696959594939392929191908F8F8E8E8D8C8C8B8A8A89898887878686 8584848382828180807F7F7E7D7D7C > 4 %_Br [ 0 0 0 0 1 1 1 2 50.7937 0 %_BS %_0 0 0 0 1 1 1 2 50.7937 0 Bs 0.345098 0.431373 0.027451 0 0.662745 0.576471 0.756863 2 57.3913 35.955 %_BS %_0.345098 0.431373 0.027451 0 0.662745 0.576471 0.756863 2 57.3913 35.955 Bs 0.815686 1 0.156863 0.043137 0.341176 0.152941 0.486275 2 51.0204 100 %_BS %_0.815686 1 0.156863 0.043137 0.341176 0.152941 0.486275 2 51.0204 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Radial Gradient 1) (Radial Gradient 1) 1 2 Bd [ < 00000001020304050506070809090A0B0C0D0F10111213141516171818191A1B1C1C1D1F20212223 24252627292A2A2B2D2E2F30323334353637383A3B3C3D3E3F40424344454647484A4B4C4D4E4F51 52535455565658595B5C5D5F6061626364666768696A6B6C6D6E6F6F707172737475767778797A7B 7C7D7E7F7F8081828383848586878788898A8B8C8B8C8D8E8E8F9090919293949495969697989899 9A9A9B9C9C9D9D9E9E9F9FA0A0A1A1A2A2A3A3A4A4A4A5A5A6A6A7A7A8A8A9A9AAAAAAABABAAAAAB ABABABACACACACADADADADAEAEAEAFAFAFB0B0B0B1B1B1B2B2 > < 00000000010202030304040506060708090A0A0B0C0D0D0E0F1010111213141516171818191A1B1C 1D1D1E1F202122222324262728292A2B2C2D2E2E2F30313233343536373838393A3B3C3D3E3F4041 434445464648494A4C4D4E4F505152535455565758595A5A5B5C5D5E5F6061626364646566676869 6A6B6C6C6D6E6F6F70717272737475767778797A7B7C7C7D7E7F808081828383848586878788898A 8A8B8C8D8E8E8F8F9090919292939494959696979899999A9A9B9B9C9C9D9D9E9E9F9FA0A0A2A2A3 A3A3A4A4A5A5A6A6A7A7A7A8A8A9A9A9AAAAAAABABABACACAC > < 00000000010202030304040506060708090A0B0B0C0D0E0F1011121213141515161718191A1B1B1C 1D1E1F20202122232425262728292A2B2C2D2E2F30313233343536373738393A3B3C3D3E3F404142 434445464748494A4C4D4E4F505152535455565758595A5B5C5C5D5E5F6061616161626364656566 676869696A6B6B6C6D6E6E6F70717172737474757677777879797A7B7C7C7D7E7F7F808181828383 8485858686878888898A8B8B8C8D8D8E8E8F8F90909191929293939494959596969797989899999A 9A9B9B9C9C9C9D9D9E9E9E9F9F9FA0A0A1A1A1A1A2A2A2A3A3 > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000010101010101020202020203030304040505060606070708090A0A0B 0C0D0E0F0F101112131415161718191A1B1D1E1F20212324252728292B2C2E2F303233353637393B 3C3E4041434546484A4B4D4F51525456585A5C5E5F61636567696B6D6F717375777A7C7E80828587 898B8E90929497999B9DA0A2A4A6A8ABADAFB1B3B5B7B9BBBD > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9 D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1 B0AFAEADACACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A 898887868584838281807F7E7D7C7B7A79787776767574737271706F6E6D6C6B6A69686766656463 6261605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3E3D3C 3B3A393837363534333231302F2E2D2C2B2A29282726252423 > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A999897969594939291908F8E8D8C8B8A8988 87868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A69686766656463626160 5F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A3938 37363534333231302F2E2D2C2B2A292827262524232221201F > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD9D8 D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0 AFAEADACABAAA9A8A7A6A5A4A3A2A1A09F9E9D9C9B9A99989796959493929190908F8E8D8C8B8A89 8887868584838281807F7E7D7C7B7A797877767574737271706F6E6D6C6B6A696867666564636261 605F5E5D5C5B5A595857565554535251504F4E4D4C4B4A494847464544434241403F3E3D3C3B3A39 3837363534333231302F2E2D2C2B2A29282726252423222120 > 4 %_Br [ 1 0 50 0 %_BS %_1 0 50 0 Bs 0 0 50 100 %_BS %_0 0 50 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Red Linear Gradient) (Red Linear Gradient) 0 6 Bd [ < 3A39393838373736353534333332313130302F2E2E2D2C2B2B2A2928272726252423222120201F1E 1D1C1B1A191817161514131211100F0E0D0C0B0A09080605040302 > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFD > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFDFCFCF9F9F9F8 > < 2A2928272624232221201F1E1D1C1C1B1A19181716151413121110100F0E0D0C0C0A0A0908070606 050505040404040303030202020201010101010101010100000000 > < A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CBCCCDCECFD0D1 D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC > < 14141414141515151515151515161616161616161617171717171717171818181818181818181919 1919191919191A1A1A1A1A1A1A1A1B1B1B1B1B1B1B1B1C1C1C1C1C > < 1A1A1A1A1B1B1B1B1B1B1C1C1C1C1C1C1C1D1D1D1D1D1D1D1E1E1E1E1E1E1F1F1F1F1F1F1F202020 202020212121212121212222222222222223232323232324242424 > 4 %_Br < 23242526272728292A2B2B2C2D2E2E2F303131323333343535363737383839393A > 1 1 < 0B0C0C0D0E0F10101112131415161718191B1C1C1D1E1F2021222324262728292A > < CAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB8B7B6B5B4B3B2B1B0AFAEADACABAAA9 > < 181818181817171717171717171616161616161616151515151515151514141414 > < 1F1F1F1F1E1E1E1E1E1E1D1D1D1D1D1D1D1C1C1C1C1C1C1B1B1B1B1B1B1A1A1A1A > 4 %_Br < 0909090A0A0A0A0B0B0B0B0B0C0C0C0B0B0C0C0C0C0C0D0D0C0C0E0E0E0D0D0E0E0E0E0E0F0F0F0F 0F101010101011111111111211111111121212131314141414141515151514161615151515171717 161618181818181719191918181A1A1A1A1A1A1B1B1B1A1A1B1B1B1A1A1A1B1B1B1A1A1A1B1B1B1B 1B1B1C1C1C1B1B1C1C1C1D1D1C1C1E1D1D1D1D1D1E1E1E1E1E1D1D1E1E1E1D1D1D1D1E1E1E1D1D1D 1E1E1E1E1E1E1E1E1F1F1F1F1F1F1F2020201F1F1F1F1F2020202020202020212121212020202021 21212121212121212122222222222222222222232323232323232323232323232323232323232323 232323 > < 3E3F414243454647484A4B4C4D4E5051525354565758595B5C5D5D5E5F616263656668696A6B6D6E 6F7071737374757678797B7C7D7F80828183848687898A8C8D8D8F90929395969799999A9C9D9E9F A1A0A1A3A4A5A7A8A8A9ABACADAEAEB0B1B2B4B5B5B6B7B9BABABBBCBDBFBEC0C1C2C3C3C4C6C7C7 C8C9CACACBCCCDCECECFD0D1D1D2D3D3D4D5D6D6D7D8D9D9DBDCDCDDDEDEDFE0E0E1E2E3E3E4E5E5 E5E6E6E7E7E8E9E9EAEBEBECECEDEDEDEEEFEFF0F0F1F2F2F3F3F4F4F5F6F6F7F7F8F8F9F9FAFAFA FBFBFCFCFDFDFDFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 1F1F20212223242526272829292A292A2B2C2C2D2E2F2F303132343536373537373839393B3B3C3D 3E3F3E3F41424344454647464748494A4C4D4E4F4F505152535556555657585A5B5C5C5D5E606162 61636566676868696B6C6D6F6E6F717374737576787A797A7C7E7D7F80828483858788888A8B8D8D 8F90929294959796989A9A9C9EA09FA1A3A3A4A7A8A8AAACABADAFAFB0B3B2B4B6B5B7B9B9BABCBC BEBFBFC1C4C3C5C5C7C9C9CBCBCDCFCFD1D1D3D5D5D7D7D9D8DBDDDDDEDEE0E0E2E2E5E4E7E7E9E8 EBEBEDEDEFEFF2F1F4F4F6F6F9F8F8FBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000001010101010101010101010101 01010101010202020202020202020202020202020302030303030303040404040404040505050505 05050505050505050606060606060607070707070707070707070707070707080808080808080808 080808080808080808090909090909090909090A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B 0B0B0B > < F0F0F0EFEFEFEFEEEEEEEEEEEDEDEDEDEDECECECECECEBEBEBEBEAEAEAEAEAE9E9E9E9E9E8E8E8E8 E8E7E7E7E7E7E6E6E6E6E6E5E5E5E5E5E4E4E4E4E4E3E3E3E3E3E2E2E2E2E2E1E1E1E1E1E1E0E0E0 E0E0DFDFDFDFDFDFDEDEDEDEDEDDDDDDDDDDDDDCDCDCDCDCDBDBDBDBDBDBDADADADADADAD9D9D9D9 D9D9D8D8D8D8D8D8D7D7D7D7D7D7D6D6D6D6D6D6D5D5D5D5D5D5D5D4D4D4D4D4D4D4D3D3D3D3D3D3 D2D2D2D2D2D2D2D2D1D1D1D1D1D1D1D0D0D0D0D0D0D0D0CFCFCFCFCFCFCFCFCECECECECECECECECD CDCDCDCDCDCDCDCDCDCCCCCCCCCCCCCCCCCCCCCBCBCBCBCBCBCBCBCBCBCBCBCBCACACACACACACACA CACACA > < C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A4A3A2A1 A09F9E9D9D9C9B9A99989796959493929291908F8E8D8C8B8A8A89888786858483828281807F7E7D 7C7C7B7A7978777676757473727171706F6E6D6C6C6B6A696868676665646463626160605F5E5D5D 5C5B5A5A595857565655545353525151504F4E4E4D4C4B4B4A494948474746454544434242414040 3F3E3E3D3D3C3B3B3A39393837373636353434333332313130302F2F2E2D2D2C2C2B2B2A2A292928 2727262625252524242323222221212020201F1F1E1E1E1D1D1C1C1C1B1B1B1A1A1A1A1919191918 181818 > < C9C8C7C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADADACABAAA9A8A7A6A5A4 A3A2A2A1A09F9E9D9C9B9A9A99989796959493929291908F8E8D8C8C8B8A89888786868584838281 81807F7E7D7C7C7B7A7978777776757473737271706F6F6E6D6C6C6B6A6968686766656564636262 61605F5F5E5D5C5C5B5A5A59585757565555545352525150504F4E4E4D4C4C4B4A4A494848474646 4544444342424141403F3F3E3E3D3C3C3B3B3A393938383737363535343433333232313130302F2F 2E2E2D2D2C2C2B2B2A2A29292828282727262626252524242423232322222221212121202020201F 1F1F1F > 4 %_Br < 02020202020202020202020202020202020202020202010101010101010101020202020202020202 02020202020202020202020202020303030303030303030303030202020303030303030404040404 04040404040404040404040405050505050505050505060606060606060606060505050504040404 04050505050506060606060607070707070707070707070707070707070708080808080808080808 080707080808080808080909090909090909090909090909090909090909 > < FDFDFCFCFBFBFAFAF9F9F8F8F7F7F6F5F5F4F4F3F2F1F0F0EFEEEDEDECEBEBEAE9E8E8E7E6E5E4E3 E2E1E0DFDEDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C4C3C2C0BFBEBDBC BAB9B9B7B6B5B4B3B1B0B0AEADACABA9A8A7A5A4A3A1A09F9F9D9C9B99989695949290908F8E8C8B 8988878584848281807E7D7B7A79797876757372716F6F6E6D6B6A6967676665636260605F5D5C5B 595A595756555554525150504E4D4C4C4A494848464544444241413F3F3E > < F8F6F5F3F0EEECEAE8E7E5E3E1DFDFDEDCDAD8D7D5D3D1D0CECCCAC8C7C5C3C2C0BEBCBCBBB9B7B6 B4B2B0AFADABAAA8A6A4A2A0A19F9D9B9A9896959392908E8D8B8B8A88868583817F7E7C7B797A78 7776747271706E6D6C6C6A696866656462616061605F5E5D5B5A5857585756545352504E4F4E4D4C 4A494847484746454443424342413F3E3D3E3D3C3B3A393839383736363635343333323231302F2F 302E2D2C2D2C2A2A292A29282728272627262523242322222120201F1E1F > 0 < ECECECECECECECECECECECECECECECECECECECECECECEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 > < 1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 444546474848494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626263646566676869 6A6B6C6D6E6F70717273737475767778797A7B7C7D7E7F80808182838485868788898A8A8B8C8D8E 8F90919293939495969798999A9B9B9C9D9E9FA0A1A2A2A3A4A5A6A7A8A8A9AAABACADADAEAFB0B1 B2B2B3B4B5B6B6B7B8B9BABABBBCBDBDBEBFC0C0C1C2C3C3C4C5C5C6C6C7 > < 2425262728292A2B2C2D2E2F30313132333435363738393A3B3C3D3E3F4041424344454546474849 4A4B4C4D4E4F50515253545555565758595A5B5C5D5E5F60616262636465666768696A6B6C6D6D6E 6F70717273747576777778797A7B7C7D7E7F8080818283848586878888898A8B8C8D8E8F8F909192 93949596969798999A9B9C9C9D9E9FA0A1A1A2A3A4A5A6A7A7A8A9AAABABACADAEAFB0B0B1B2B3B4 B4B5B6B7B7B8B9BABBBBBCBDBEBEBFC0C0C1C2C3C3C4C5C5C6C7C7C8C9C9 > 4 %_Br < 04040404040404040404040504040404040404040404040404030403040404040404040404040404 04040303030303040404030303030303030303030303030202020202030303030303030303030302 02020201010101010202010101010101010101010102020202020202020102020202020202020101 01010101010101010101010101010202020202020202010101010100010000000000000000000001 01010101010101010101000000000000000000000000000000000101010101010101010101010101 01010101010101000000000000000000000001010101010101010101010101010101010101010101 01010101010101010101010101010101010202020202020202020202020202020202020202020202 0202020202020202020202020202 > < 1D1E20212224252628292A2B2C2D2F30313234353638393A3C3D3D3E3F414243454647484A4B4D4E 4F5052535354555657595A5C5D5E6061616264656668696A6C6D6D6F7071727475767677797A7B7D 7E808081828485868687898A8B8D8E8E8F919294949597999A9C9C9D9EA0A1A1A2A3A5A6A6A7A9AA ABABADAEAFAFB1B2B3B3B4B5B6B6B7B9BABABBBCBDBDBEC0C1C1C2C3C3C4C5C6C6C7C8C8C9CACBCB CCCDCDCECFCFD0D1D1D2D3D3D4D5D5D6D7D7D8D9D9DADADBDCDCDDDEDEDFDFE0E1E1E2E2E3E4E4E5 E5E6E7E7E7E7E8E8E9E9EAEAEAEBEBECECEDEDEDEDEEEEEFEFF0F0F0F0F1F1F2F2F3F3F3F3F4F4F5 F5F5F5F5F6F6F6F6F6F7F7F7F7F7F8F8F9F9F9F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFBFCFCFCFCFC FCFCFCFDFDFDFDFDFDFDFDFDFDFD > < 0D0D0E0F0F1011111212131413131415151616171818191A1B1B1D1D1D1D1E1F2020212223242524 2525262729292A2B2C2B2C2D2E2E2F3031303132333434353635373839393A393A3B3D3E3F403F40 41424445444546474948494A4B4C4B4E4F505150525455565657595A5B5A5C5D5E5D5E6062616263 6565666769696A6B6D6D6E6F717172747375777877797B7A7C7E807F8183828486858789898B8C8C 8E90909193939496969899999B9D9D9F9EA1A2A2A4A6A6A7A7A9ABABADACAEAEB0B2B2B4B3B5B7B6 B9B8BABABCBCBEC0C0C2C1C3C3C5C5C7C7C8C8CACACCCCCECED0D0D1D1D3D3D5D5D4D6D6D8D8DADA DCDCDBDDDDDFDFDFE1E1E2E2E2E4E4E6E6E7E8E8E8EAEAEAECECECEEEEEEEEF0F0F0F3F3F3F3F5F5 F5F5F5F6F6F6F6F6F8F8F8F8F8F8 > 0 < F7F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5 F5F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F3F3F3F3F3F3F3F3F3F3F3F3 F3F3F3F3F3F3F3F3F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F1F1F1F1F1F1F1F1F1F1 F1F1F1F1F1F1F1F1F1F1F1F1F1F1F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDECECECECECECECECECECECECECECECECECECECECECECEC ECECECECECECECECECECECECECEC > < E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0BFBEBD BCBBBAB9B9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A5A4A3A2A1A09F9E9E9D9C9B9A99 98979796959493929291908F8E8D8C8C8B8A8988888786858483838281807F7F7E7D7C7B7B7A7978 77777675747473727171706F6E6E6D6C6B6B6A69686867666565646363626160605F5E5E5D5C5B5B 5A5959585757565555545353525151504F4F4E4D4D4C4C4B4A4A4948484747464545444443424241 41403F3F3E3E3D3D3C3C3B3A3A39393838373736363535343433333232313130302F2F2E2E2D2D2C 2C2C2B2B2A2A29292928282727272626252525242424232323222222212121202020201F1F1F1E1E 1E1E1E1D1D1D1D1D1C1C1C1C1C1C > < E4E3E2E1E0DFDEDDDCDBDAD9D9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0C0 BFBEBDBCBBBAB9B8B7B7B6B5B4B3B2B1B0B0AFAEADACABAAA9A9A8A7A6A5A4A4A3A2A1A09F9E9E9D 9C9B9A999998979695959493929191908F8E8D8D8C8B8A898988878685858483828281807F7F7E7D 7C7C7B7A79797877767675747373727171706F6E6E6D6C6C6B6A6969686767666565646363626161 605F5F5E5D5D5C5B5B5A595958575756565554545352525151504F4F4E4E4D4D4C4B4B4A4A494848 4747464645454443434242414140403F3F3E3E3D3D3C3C3B3B3A3A39393838373737363635353434 333333323231313130302F2F2F2E2E2D2D2D2C2C2C2B2B2B2A2A2A29292929282828272727272626 2626262525252525242424242424 > 4 %_Br [ 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 Bs 0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 %_BS %_0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 Bs 0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 %_BS %_0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 Bs 0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 %_BS %_0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 Bs 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 Bs 0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 %_BS %_0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 1) (Unnamed gradient 1) 0 6 Bd [ < 3A39393838373736353534333332313130302F2E2E2D2C2B2B2A2928272726252423222120201F1E 1D1C1B1A191817161514131211100F0E0D0C0B0A09080605040302 > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFEFDFDFD > < FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFDFDFCFCF9F9F9F8 > < 2A2928272624232221201F1E1D1C1C1B1A19181716151413121110100F0E0D0C0C0A0A0908070606 050505040404040303030202020201010101010101010100000000 > < A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CBCCCDCECFD0D1 D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBEC > < 14141414141515151515151515161616161616161617171717171717171818181818181818181919 1919191919191A1A1A1A1A1A1A1A1B1B1B1B1B1B1B1B1C1C1C1C1C > < 1A1A1A1A1B1B1B1B1B1B1C1C1C1C1C1C1C1D1D1D1D1D1D1D1E1E1E1E1E1E1F1F1F1F1F1F1F202020 202020212121212121212222222222222223232323232324242424 > 4 %_Br < 23242526272728292A2B2B2C2D2E2E2F303131323333343535363737383839393A > 1 1 < 0B0C0C0D0E0F10101112131415161718191B1C1C1D1E1F2021222324262728292A > < CAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB8B7B6B5B4B3B2B1B0AFAEADACABAAA9 > < 181818181817171717171717171616161616161616151515151515151514141414 > < 1F1F1F1F1E1E1E1E1E1E1D1D1D1D1D1D1D1C1C1C1C1C1C1B1B1B1B1B1B1A1A1A1A > 4 %_Br < 0909090A0A0A0A0B0B0B0B0B0C0C0C0B0B0C0C0C0C0C0D0D0C0C0E0E0E0D0D0E0E0E0E0E0F0F0F0F 0F101010101011111111111211111111121212131314141414141515151514161615151515171717 161618181818181719191918181A1A1A1A1A1A1B1B1B1A1A1B1B1B1A1A1A1B1B1B1A1A1A1B1B1B1B 1B1B1C1C1C1B1B1C1C1C1D1D1C1C1E1D1D1D1D1D1E1E1E1E1E1D1D1E1E1E1D1D1D1D1E1E1E1D1D1D 1E1E1E1E1E1E1E1E1F1F1F1F1F1F1F2020201F1F1F1F1F2020202020202020212121212020202021 21212121212121212122222222222222222222232323232323232323232323232323232323232323 232323 > < 3E3F414243454647484A4B4C4D4E5051525354565758595B5C5D5D5E5F616263656668696A6B6D6E 6F7071737374757678797B7C7D7F80828183848687898A8C8D8D8F90929395969799999A9C9D9E9F A1A0A1A3A4A5A7A8A8A9ABACADAEAEB0B1B2B4B5B5B6B7B9BABABBBCBDBFBEC0C1C2C3C3C4C6C7C7 C8C9CACACBCCCDCECECFD0D1D1D2D3D3D4D5D6D6D7D8D9D9DBDCDCDDDEDEDFE0E0E1E2E3E3E4E5E5 E5E6E6E7E7E8E9E9EAEBEBECECEDEDEDEEEFEFF0F0F1F2F2F3F3F4F4F5F6F6F7F7F8F8F9F9FAFAFA FBFBFCFCFDFDFDFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 1F1F20212223242526272829292A292A2B2C2C2D2E2F2F303132343536373537373839393B3B3C3D 3E3F3E3F41424344454647464748494A4C4D4E4F4F505152535556555657585A5B5C5C5D5E606162 61636566676868696B6C6D6F6E6F717374737576787A797A7C7E7D7F80828483858788888A8B8D8D 8F90929294959796989A9A9C9EA09FA1A3A3A4A7A8A8AAACABADAFAFB0B3B2B4B6B5B7B9B9BABCBC BEBFBFC1C4C3C5C5C7C9C9CBCBCDCFCFD1D1D3D5D5D7D7D9D8DBDDDDDEDEE0E0E2E2E5E4E7E7E9E8 EBEBEDEDEFEFF2F1F4F4F6F6F9F8F8FBFBFDFDFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FFFFFF > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000001010101010101010101010101 01010101010202020202020202020202020202020302030303030303040404040404040505050505 05050505050505050606060606060607070707070707070707070707070707080808080808080808 080808080808080808090909090909090909090A0A0A0A0A0A0A0A0A0A0A0A0A0B0B0B0B0B0B0B0B 0B0B0B > < F0F0F0EFEFEFEFEEEEEEEEEEEDEDEDEDEDECECECECECEBEBEBEBEAEAEAEAEAE9E9E9E9E9E8E8E8E8 E8E7E7E7E7E7E6E6E6E6E6E5E5E5E5E5E4E4E4E4E4E3E3E3E3E3E2E2E2E2E2E1E1E1E1E1E1E0E0E0 E0E0DFDFDFDFDFDFDEDEDEDEDEDDDDDDDDDDDDDCDCDCDCDCDBDBDBDBDBDBDADADADADADAD9D9D9D9 D9D9D8D8D8D8D8D8D7D7D7D7D7D7D6D6D6D6D6D6D5D5D5D5D5D5D5D4D4D4D4D4D4D4D3D3D3D3D3D3 D2D2D2D2D2D2D2D2D1D1D1D1D1D1D1D0D0D0D0D0D0D0D0CFCFCFCFCFCFCFCFCECECECECECECECECD CDCDCDCDCDCDCDCDCDCCCCCCCCCCCCCCCCCCCCCBCBCBCBCBCBCBCBCBCBCBCBCBCACACACACACACACA CACACA > < C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A4A3A2A1 A09F9E9D9D9C9B9A99989796959493929291908F8E8D8C8B8A8A89888786858483828281807F7E7D 7C7C7B7A7978777676757473727171706F6E6D6C6C6B6A696868676665646463626160605F5E5D5D 5C5B5A5A595857565655545353525151504F4E4E4D4C4B4B4A494948474746454544434242414040 3F3E3E3D3D3C3B3B3A39393837373636353434333332313130302F2F2E2D2D2C2C2B2B2A2A292928 2727262625252524242323222221212020201F1F1E1E1E1D1D1C1C1C1B1B1B1A1A1A1A1919191918 181818 > < C9C8C7C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADADACABAAA9A8A7A6A5A4 A3A2A2A1A09F9E9D9C9B9A9A99989796959493929291908F8E8D8C8C8B8A89888786868584838281 81807F7E7D7C7C7B7A7978777776757473737271706F6F6E6D6C6C6B6A6968686766656564636262 61605F5F5E5D5C5C5B5A5A59585757565555545352525150504F4E4E4D4C4C4B4A4A494848474646 4544444342424141403F3F3E3E3D3C3C3B3B3A393938383737363535343433333232313130302F2F 2E2E2D2D2C2C2B2B2A2A29292828282727262626252524242423232322222221212121202020201F 1F1F1F > 4 %_Br < 02020202020202020202020202020202020202020202010101010101010101020202020202020202 02020202020202020202020202020303030303030303030303030202020303030303030404040404 04040404040404040404040405050505050505050505060606060606060606060505050504040404 04050505050506060606060607070707070707070707070707070707070708080808080808080808 080707080808080808080909090909090909090909090909090909090909 > < FDFDFCFCFBFBFAFAF9F9F8F8F7F7F6F5F5F4F4F3F2F1F0F0EFEEEDEDECEBEBEAE9E8E8E7E6E5E4E3 E2E1E0DFDEDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C4C3C2C0BFBEBDBC BAB9B9B7B6B5B4B3B1B0B0AEADACABA9A8A7A5A4A3A1A09F9F9D9C9B99989695949290908F8E8C8B 8988878584848281807E7D7B7A79797876757372716F6F6E6D6B6A6967676665636260605F5D5C5B 595A595756555554525150504E4D4C4C4A494848464544444241413F3F3E > < F8F6F5F3F0EEECEAE8E7E5E3E1DFDFDEDCDAD8D7D5D3D1D0CECCCAC8C7C5C3C2C0BEBCBCBBB9B7B6 B4B2B0AFADABAAA8A6A4A2A0A19F9D9B9A9896959392908E8D8B8B8A88868583817F7E7C7B797A78 7776747271706E6D6C6C6A696866656462616061605F5E5D5B5A5857585756545352504E4F4E4D4C 4A494847484746454443424342413F3E3D3E3D3C3B3A393839383736363635343333323231302F2F 302E2D2C2D2C2A2A292A29282728272627262523242322222120201F1E1F > 0 < ECECECECECECECECECECECECECECECECECECECECECECEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFEFEFEFEFEFEFEF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF EFF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 > < 1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F40414243 444546474848494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F6061626263646566676869 6A6B6C6D6E6F70717273737475767778797A7B7C7D7E7F80808182838485868788898A8A8B8C8D8E 8F90919293939495969798999A9B9B9C9D9E9FA0A1A2A2A3A4A5A6A7A8A8A9AAABACADADAEAFB0B1 B2B2B3B4B5B6B6B7B8B9BABABBBCBDBDBEBFC0C0C1C2C3C3C4C5C5C6C6C7 > < 2425262728292A2B2C2D2E2F30313132333435363738393A3B3C3D3E3F4041424344454546474849 4A4B4C4D4E4F50515253545555565758595A5B5C5D5E5F60616262636465666768696A6B6C6D6D6E 6F70717273747576777778797A7B7C7D7E7F8080818283848586878888898A8B8C8D8E8F8F909192 93949596969798999A9B9C9C9D9E9FA0A1A1A2A3A4A5A6A7A7A8A9AAABABACADAEAFB0B0B1B2B3B4 B4B5B6B7B7B8B9BABBBBBCBDBEBEBFC0C0C1C2C3C3C4C5C5C6C7C7C8C9C9 > 4 %_Br < 04040404040404040404040504040404040404040404040404030403040404040404040404040404 04040303030303040404030303030303030303030303030202020202030303030303030303030302 02020201010101010202010101010101010101010102020202020202020102020202020202020101 01010101010101010101010101010202020202020202010101010100010000000000000000000001 01010101010101010101000000000000000000000000000000000101010101010101010101010101 01010101010101000000000000000000000001010101010101010101010101010101010101010101 01010101010101010101010101010101010202020202020202020202020202020202020202020202 0202020202020202020202020202 > < 1D1E20212224252628292A2B2C2D2F30313234353638393A3C3D3D3E3F414243454647484A4B4D4E 4F5052535354555657595A5C5D5E6061616264656668696A6C6D6D6F7071727475767677797A7B7D 7E808081828485868687898A8B8D8E8E8F919294949597999A9C9C9D9EA0A1A1A2A3A5A6A6A7A9AA ABABADAEAFAFB1B2B3B3B4B5B6B6B7B9BABABBBCBDBDBEC0C1C1C2C3C3C4C5C6C6C7C8C8C9CACBCB CCCDCDCECFCFD0D1D1D2D3D3D4D5D5D6D7D7D8D9D9DADADBDCDCDDDEDEDFDFE0E1E1E2E2E3E4E4E5 E5E6E7E7E7E7E8E8E9E9EAEAEAEBEBECECEDEDEDEDEEEEEFEFF0F0F0F0F1F1F2F2F3F3F3F3F4F4F5 F5F5F5F5F6F6F6F6F6F7F7F7F7F7F8F8F9F9F9F9F9F9FAFAFAFAFAFAFBFBFBFBFBFBFBFCFCFCFCFC FCFCFCFDFDFDFDFDFDFDFDFDFDFD > < 0D0D0E0F0F1011111212131413131415151616171818191A1B1B1D1D1D1D1E1F2020212223242524 2525262729292A2B2C2B2C2D2E2E2F3031303132333434353635373839393A393A3B3D3E3F403F40 41424445444546474948494A4B4C4B4E4F505150525455565657595A5B5A5C5D5E5D5E6062616263 6565666769696A6B6D6D6E6F717172747375777877797B7A7C7E807F8183828486858789898B8C8C 8E90909193939496969899999B9D9D9F9EA1A2A2A4A6A6A7A7A9ABABADACAEAEB0B2B2B4B3B5B7B6 B9B8BABABCBCBEC0C0C2C1C3C3C5C5C7C7C8C8CACACCCCCECED0D0D1D1D3D3D5D5D4D6D6D8D8DADA DCDCDBDDDDDFDFDFE1E1E2E2E2E4E4E6E6E7E8E8E8EAEAEAECECECEEEEEEEEF0F0F0F3F3F3F3F5F5 F5F5F5F6F6F6F6F6F8F8F8F8F8F8 > 0 < F7F7F7F7F7F7F7F7F7F7F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F5F5F5F5F5F5F5F5F5F5F5F5 F5F5F5F5F5F5F5F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F4F3F3F3F3F3F3F3F3F3F3F3F3 F3F3F3F3F3F3F3F3F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F2F1F1F1F1F1F1F1F1F1F1 F1F1F1F1F1F1F1F1F1F1F1F1F1F1F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0EF EFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEEEEEEEEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDECECECECECECECECECECECECECECECECECECECECECECEC ECECECECECECECECECECECECECEC > < E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0BFBEBD BCBBBAB9B9B8B7B6B5B4B3B2B1B0AFAEAEADACABAAA9A8A7A6A5A5A4A3A2A1A09F9E9E9D9C9B9A99 98979796959493929291908F8E8D8C8C8B8A8988888786858483838281807F7F7E7D7C7B7B7A7978 77777675747473727171706F6E6E6D6C6B6B6A69686867666565646363626160605F5E5E5D5C5B5B 5A5959585757565555545353525151504F4F4E4D4D4C4C4B4A4A4948484747464545444443424241 41403F3F3E3E3D3D3C3C3B3A3A39393838373736363535343433333232313130302F2F2E2E2D2D2C 2C2C2B2B2A2A29292928282727272626252525242424232323222222212121202020201F1F1F1E1E 1E1E1E1D1D1D1D1D1C1C1C1C1C1C > < E4E3E2E1E0DFDEDDDCDBDAD9D9D8D7D6D5D4D3D2D1D0CFCECDCCCBCACAC9C8C7C6C5C4C3C2C1C0C0 BFBEBDBCBBBAB9B8B7B7B6B5B4B3B2B1B0B0AFAEADACABAAA9A9A8A7A6A5A4A4A3A2A1A09F9E9E9D 9C9B9A999998979695959493929191908F8E8D8D8C8B8A898988878685858483828281807F7F7E7D 7C7C7B7A79797877767675747373727171706F6E6E6D6C6C6B6A6969686767666565646363626161 605F5F5E5D5D5C5B5B5A595958575756565554545352525151504F4F4E4E4D4D4C4B4B4A4A494848 4747464645454443434242414140403F3F3E3E3D3D3C3C3B3B3A3A39393838373737363635353434 333333323231313130302F2F2F2E2E2D2D2D2C2C2C2B2B2B2A2A2A29292929282828272727272626 2626262525252525242424242424 > 4 %_Br [ 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 22.7273 100 Bs 0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 %_BS %_0.227451 1 1 0.164706 0.662745 0.078431 0.101961 2 50 93.2584 Bs 0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 %_BS %_0.137255 1 1 0.043137 0.792157 0.094118 0.121569 2 50 62.3595 Bs 0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 %_BS %_0.035294 0.243137 0.121569 0 0.941176 0.780392 0.788235 2 39.3939 34.8315 Bs 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 %_BS %_0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 2 46.5116 10.6742 Bs 0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 %_BS %_0.015686 0.113725 0.05098 0 0.968627 0.890196 0.894118 2 37.5 2.24719 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 134) (Unnamed gradient 134) 1 2 Bd [ < 00000101020304050506070808090A0B0B0C0D0F101112131415161718191A1B1C1E1F2021222324 25262728292A2B2C2D2E2F3031323334353738393A3B3C3D3E > < 0000000100010202030304040405060607080808090A0B0C0D0C0D0E0E0F10111111121213141516 15161718191A1A1A1B1C1D1E1F1F1F20212223252625262728 > < 00000000000100010101010102030203020303040504050405050606050605060607080708070809 0909090A090A0B0B0C0B0C0B0C0D0D0E0D0E0F0E0F10101011 > 0 < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDDDCDBDAD9D8D7 D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBE > < FFFEFDFCFCFBFAF9F8F7F6F6F5F4F3F2F1F0F0EFEEEDECEBEAEAE9E8E7E6E5E4E4E3E2E1E0DFDEDD DDDCDBDAD9D8D7D7D6D5D4D3D2D1D1D0CFCECDCCCBCBCAC9C8 > < FFFEFEFDFDFCFCFBFAFAF9F9F8F7F7F6F6F5F5F4F3F3F2F2F1F1F0EFEFEEEEEDEDECEBEBEAEAE9E8 E8E7E7E6E6E5E4E4E3E3E2E2E1E0E0DFDFDEDDDDDCDCDBDBDA > 4 %_Br [ 0 0 0 0 1 1 1 2 50 0 %_BS %_0 0 0 0 1 1 1 2 50 0 Bs 0.243137 0.156863 0.066667 0 0.745098 0.784314 0.854902 2 50 100 %_BS %_0.243137 0.156863 0.066667 0 0.745098 0.784314 0.854902 2 50 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 3) (Unnamed gradient 3) 0 7 Bd [ < 0A0B0C0D0D0E10111213131415161717191A1B1B1C1D1F202122232425262728292A2B2C2D2E2E2F 31323435363738393A3B3C3D3E3F41424344454648494A4B4C4D4E5051525354555758595A5C5D5E 60616364656668696A6B6C > < 070809090A0B0B0C0D0C0D0E0F1010121112131314151617161718191A1B1C1D1D1E1E1E1F202223 24252627262728292A2B2C2D2E2F3031303132333435363738393A3B3C3C3C3D3E3F414243444546 47484A494A4B4D4E4F5051 > < 0607070809090A0A0B0C0D0E0D0E0F0F111211121314141516161718191A1B1A1B1C1D1E1F201F20 212223242625262728292A2B2C2B2C2D2F303031323233343536373839393A3B3C3D3E3F403F4041 42444547484948494A4B4C > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000101010101 > < F1F0EFEEEEEDECEBEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDCDBDAD9D8D7D6D5D4D3D2D1D0CFCECECD CCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3B2B1B0AFAEADACABAAA9A8A7A6A5 A4A3A2A1A09F9E9D9C9B9A > < F1F0EFEFEEEDECEBEAEAE9E8E7E6E5E4E4E3E2E1E0DFDEDDDDDCDBDAD9D8D7D6D5D4D4D3D2D1D0CF CECDCCCBCBCAC9C8C7C6C5C4C3C2C1C0C0BFBEBDBCBBBAB9B8B7B6B5B4B4B3B2B1B0AFAEADACABAA A9A8A7A7A6A5A4A3A2A1A0 > < F2F1F1F0EFEEEDEDECEBEAE9E9E8E7E6E5E4E4E3E2E1E0DFDFDEDDDCDBDAD9D9D8D7D6D5D4D3D3D2 D1D0CFCECDCDCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBFBEBDBCBBBAB9B8B8B7B6B5B4B3B2B1B1B0AF AEADACABAAA9A9A8A7A6A5 > 4 %_Br < 1A1918171615141211100E0D0C0B0A > < 11100F0E0D0D0C0C0C0B0B0A090807 > < 1111100F0E0D0C0B0B0A0909080706 > 0 < E2E3E4E5E6E7E8EAEBECEDEEEFF0F1 > < E4E5E6E7E8E9EAEBEBECEDEEEFF0F1 > < E5E6E7E8E9EAEBECECEDEEEFF0F1F2 > 4 %_Br < 54535251504F4E4C4B4A4948474644434241403F3E3D3C3B393836353432312F2E2D2C2B2A292827 262524232221201F1E1D1C1B1A > < 3C3B3A3938373635343433323130302F2E2D2C2B2A2928272625252524232221201F1E1D1C1C1B1A 19181717171615141413121111 > < 3D3C3C3B3A39383837363534333230302F2E2D2C2D2C2B2A29282725242322212021201F1E1D1C1B 1B1A1918161616151514131211 > 0 < ADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C8C9CACBCCCDCECFD0D1D2D3D4D5 D6D7D8D9DADBDCDDDEDFE0E1E2 > < B3B4B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCCCDCECFD0D1D2D3D4D5D6D7D8 D9DADBDCDCDDDEDFE0E1E2E3E4 > < B5B6B7B8B9BABBBBBCBDBEBFC0C1C2C3C4C5C6C7C7C8C9CACBCCCDCECFD0D1D2D3D3D4D5D6D7D8D9 DADBDCDDDEDFDFE0E1E2E3E4E5 > 4 %_Br < 00000000000000000000000000000001010102020203030304040505050505060606070708080909 0A0A0A0A0B0C0C0D0D0E0E101011121213141415141617171819191A1B1B1C1D1E1E1F2021212223 24242526272728292A2B2B2C2D2E2F303132333536373838393A3C3D3E3F40414243434546474849 4A4B4C4E4F5051525354 > < 00000000000000000000000000000001000000010101020201020202030203030304040504050505 05050606070608070908090A0A0B0A0C0B0C0C0D0E0D0E0E0F101011111112131214141415161617 171718191A1A1B1C1D1C1D1E1F1F1F20222122232526252628292A2A2A2B2C2D2E2F302F30313233 343536363738393A3B3C > < 00000000000000000000000000000000000001010101020202020202030302030304040405040505 060607070708070908090A0A0B0B0C0B0D0C0E0D0E100F1010111211121413141415151616171718 19191A1B1B1B1C1D1C1E1F201F21222222242526252628292A292A2B2D2E2F2E2F30303233333435 363737393A3A3B3C3C3D > 0 < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F8F8F8F7F7F6F6F6F5F5F4F4F3F3 F2F2F1F1F0EFEFEEEEEDEDECECEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDEDEDDDCDBDBDAD9 D8D8D7D6D5D5D4D3D2D1D1D0CFCECDCCCCCBCAC9C8C7C6C6C5C4C3C2C1C0BFBEBDBCBCBBBAB9B8B7 B6B5B4B3B2B1B0AFAEAD > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFCFCFCFCFBFBFBFAFAFAF9F9F9F8F8F7F7F7F6F6F5F5F4F4F4 F3F3F2F2F1F1F0F0EFEFEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E1E1E0DFDFDEDDDDDC DBDBDAD9D8D8D7D6D5D5D4D3D2D2D1D0CFCFCECDCCCBCBCAC9C8C7C6C6C5C4C3C2C1C0C0BFBEBDBC BBBAB9B9B8B7B6B5B4B3 > < FFFFFFFFFFFFFEFEFEFEFEFDFDFDFDFDFCFCFCFBFBFBFAFAFAF9F9F9F8F8F8F7F7F6F6F6F5F5F4F4 F3F3F2F2F1F1F1F0F0EFEEEEEDEDECECEBEBEAEAE9E8E8E7E7E6E5E5E4E3E3E2E2E1E0E0DFDEDEDD DCDCDBDAD9D9D8D7D7D6D5D4D4D3D2D1D1D0CFCECECDCCCBCACAC9C8C7C6C5C5C4C3C2C1C0C0BFBE BDBCBBBAB9B9B8B7B6B5 > 4 %_Br < 0A0A090908080706050504030201000000 > < 0707070605050504030302020100000000 > < 0606050505040403020202020100000000 > 0 < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F1F1F2F3F4F4F5F6F7F8F9FAFBFCFDFEFF > < F2F2F3F4F4F5F6F7F8F9F9FAFBFCFDFEFF > 4 %_Br < 1717161615151414131312121111100F0F0E0D0C0B0B0A > < 16161515141313121111110F0E0D0E0D0C0B0A0A090807 > < 1717161415141312111111100F0E0D0C0B0A0A08070706 > 0 < E5E5E6E6E7E7E8E8E9E9EAEAEBEBECEDEDEEEEEFF0F0F1 > < E1E1E2E2E3E4E4E5E6E6E7E8E9EAEAEBECEDEEEEEFF0F1 > < DFDFE0E1E1E2E3E4E5E5E6E7E8E9EAEBECEDEEEFF0F1F2 > 4 %_Br [ 0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 %_BS %_0.423529 0.317647 0.298039 0.003922 0.603922 0.627451 0.647059 2 87 91.573 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 51.3513 49.4382 Bs 0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 %_BS %_0.101961 0.066667 0.066667 0 0.886275 0.894118 0.898039 2 50 33.1461 Bs 0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 %_BS %_0.329412 0.235294 0.239216 0 0.678431 0.701961 0.709804 2 50 17.4157 Bs 0 0 0 0 1 1 1 2 64.5161 0.005 %_BS %_0 0 0 0 1 1 1 2 64.5161 0 Bs 0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0.0025 %_BS %_0.039216 0.027451 0.023529 0 0.945098 0.945098 0.94902 2 56.1798 0 Bs 0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 %_BS %_0.090196 0.086275 0.090196 0 0.898039 0.882353 0.87451 2 56.1798 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 51) (Unnamed gradient 51) 0 2 Bd [ < 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1E1E1E1E202020202020 20202121212121212122222222222223232323232424242424252525252626262627272727282828 282929292A2A2A2B2B2B2C2C2C2D2D2D2E2E2E2F2F30313132323334343535353636373738383939 393A3A3B3B3C3C3D3D3E3E3F4041424243434444454546484749494A4A4B4C4C4E4F4F5050515252 53545456575758595B5B5C5D5D5F61626263646565676869696A6B6C6D6D6E6F7071727273747576 777878797A7B7C7D7E7F8081818283848586878788898A8B8C8D8E > < 16161616161616161616161616161616161616161617171717171717171717171717171717171717 171717181818181818181919191919191A1A1A1A1A1B1B1B1B1A1C1C1C1B1B1C1C1C1C1D1D1D1D1E 1E1D1F1F1F1E201F1F2120202121212222222323232424242525272626272729282829292A2A2B2B 2C2C2B2D2C2D2D2E2E2F2F30303131323233323433353635373638373938393B3A3B3B3C3E3D3E40 3F404241424243444445464848494A4A4C4D4C4D4F504F50525352535455565557575858595A5B5C 5D5C5D5E5F60616261626364666768696A6B6A6A6B6C6D6E6E6F70 > < 11111111111111111111111111111111111111111111111111111111111111111111121212121212 12121213131313131313141414141414151515151516161616161616161718171717191818181A19 191B1A1A1A1C1B1B1C1C1C1D1C1C1E1D1D1F1E1E201F1F2120222121232224232325242625272628 272729282A292B2A2B2B2C2B2D2D2E2D2F2E30313132313332343535363637363839393A3B3B3C3D 3D3E3D3F404041424443444545474848494A4C4B4C4D4F4E4F5052535253535554555658595A595A 5B5D5D5E5F5E5F606162636464656665666769696A6B6B6C6D6E6F > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000010101010101010101020202020202020203030304 04050505060607070809090A0B0B0C0C0D0E0F1011121313141617 > < DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDDDDDDDDDDDDDDDDDCDCDCDCDCDC DCDCDBDBDBDBDBDBDBDADADADADADAD9D9D9D9D9D8D8D8D8D8D7D7D7D7D6D6D6D6D5D5D5D5D4D4D4 D4D3D3D3D2D2D2D1D1D1D0D0D0CFCFCFCECECECDCDCDCCCCCBCBCBCACAC9C9C9C8C8C7C7C6C6C5C5 C5C4C4C3C3C2C2C1C1C0C0BFBFBEBDBDBCBCBBBBBABAB9B8B8B7B7B6B6B5B4B4B3B2B2B1B1B0AFAF AEADADACABABAAA9A8A8A7A6A6A5A4A3A3A2A1A0A09F9E9D9D9C9B9A999998979695949493929190 8F8E8E8D8C8B8A89888786858584838281807F7E7D7C7B7A797877 > < DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDEDEDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDD DDDDDDDCDCDCDCDCDCDCDBDBDBDBDBDBDADADADADAD9D9D9D9D9D8D8D8D8D8D7D7D7D7D6D6D6D6D5 D5D5D4D4D4D4D3D3D3D2D2D2D1D1D1D0D0D0CFCFCFCECECECDCDCCCCCCCBCBCACACAC9C9C8C8C7C7 C6C6C6C5C5C4C4C3C3C2C2C1C1C0C0BFBFBEBEBDBDBCBBBBBABAB9B9B8B8B7B6B6B5B5B4B3B3B2B1 B1B0AFAFAEAEADACACABAAA9A9A8A7A7A6A5A5A4A3A2A2A1A09F9F9E9D9C9B9B9A99989897969594 93939291908F8E8D8D8C8B8A89888786858484838281807F7E7D7C > < E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E2E2E2E2E2E2E2E2E2E2E2E2E2E1E1E1E1E1E1 E1E1E1E0E0E0E0E0E0E0DFDFDFDFDFDFDEDEDEDEDEDDDDDDDDDDDCDCDCDCDBDBDBDBDADADADAD9D9 D9D8D8D8D8D7D7D7D6D6D6D5D5D5D4D4D4D3D3D3D2D2D2D1D1D0D0D0CFCFCECECECDCDCCCCCBCBCA CACAC9C9C8C8C7C7C6C6C5C5C4C4C3C3C2C2C1C0C0BFBFBEBEBDBCBCBBBBBABAB9B8B8B7B6B6B5B4 B4B3B3B2B1B1B0AFAEAEADACACABAAAAA9A8A7A7A6A5A4A4A3A2A1A0A09F9E9D9D9C9B9A99989897 96959493929291908F8E8D8C8B8A89898887868584838281807F7E > 4 %_Br [ 0.556863 0.439216 0.435294 0.090196 0.466667 0.486275 0.494118 2 50 100 %_BS %_0.556863 0.439216 0.435294 0.090196 0.466667 0.486275 0.494118 2 50 100 Bs 0.113725 0.086275 0.066667 0 0.870588 0.87451 0.890196 2 73.0337 0 %_BS %_0.113725 0.086275 0.066667 0 0.870588 0.87451 0.890196 2 73.0337 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 54) (Unnamed gradient 54) 0 2 Bd [ < 1D1D1D1D1D1D1D1D1D1D1D1D1D1D1D1E1E1E1E1E1E1E1E1E1E1E2020202020202021212121212122 22222222222323232324242424242525252526262626272727282828282929292A2A2A2B2B2B2C2C 2C2D2D2D2E2E2F2F30313132323334343535353636373738383939393A3A3B3B3C3C3D3D3E3E3F40 41414242434444454546464848494A4A4B4B4C4C4E4F4F50515152525354545657575859595B5C5C 5D5F5F61626263646565666869696A6B6C6C6D6E6F6F7071727273747576767778797A7B7B7C7D7E 7F808081828384858687868788898A8B8C8D8E8F8F909091929394949596979899999A9B9C9D > < 16161616161616161616161616161617171717171717171717171717171717171717181818181818 1919191919181A1A1A1A191B1B1B1A1C1C1C1B1C1C1C1C1D1D1D1D1E1E1D1F1F1E20201F1F212020 21212122222323232424242525272626272729282829292A2A2B2B2B2C2B2D2C2D2D2E2E2F2F3030 31313232333234333534363537363737383A393B3A3B3B3C3D3D3E3E3F4040414242434344454546 4847494A4A4C4D4C4D4F4E4F5052515253535454565556575858595A5B5A5C5D5D5E5E5F60616261 6263656665666768696A6B6A6B6C6D6E6E6F6E6F707172737475767778777778797A7A7B7C7D > < 11111111111111111111111111111111111111111111111111111212121212121212131313131313 14141414141615151515171616161716161618171717191818181A19191B1A1A1C1B1B1B1C1C1C1D 1C1C1E1D1F1E1E201F1F2120222121232224232325242625272628282729282A292B2A2B2B2C2B2D 2D2E2D2F2E302F3132323333343435353637373838393B3A3B3B3C3E3D3E403F4040414342434544 454747484A494A4C4D4C4E4F4E4F515251535354545556575658595A5B5B5C5C5D5E5E5F60616161 62636464666766676869696B6C6D6B6C6D6E7070717272737473747475777879797A7B7B7C7D > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000101010101010101010102020202020202020303040404040505050606070808 09090A0B0B0C0C0D0E0F1010111213131416161718191A1C1D1D1E20212223242627282A2B2C > < DEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDDDDDDDDDDDDDCDCDCDCDCDCDCDBDBDBDBDBDBDA DADADADADAD9D9D9D9D8D8D8D8D8D7D7D7D7D6D6D6D6D5D5D5D4D4D4D4D3D3D3D2D2D2D1D1D1D0D0 D0CFCFCFCECECDCDCDCCCCCBCBCBCACAC9C9C9C8C8C7C7C6C6C5C5C5C4C4C3C3C2C2C1C1C0C0BFBF BEBEBDBDBCBBBBBABAB9B9B8B8B7B6B6B5B5B4B4B3B2B2B1B0B0AFAFAEADADACABABAAA9A9A8A7A7 A6A5A5A4A3A3A2A1A0A09F9E9D9D9C9B9A9A999897979695949493929190908F8E8D8C8B8B8A8988 8786868584838281807F7F7E7D7C7B7A79787776757474737271706F6E6D6C6B6A6968676665 > < DFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDEDEDEDEDEDEDEDEDEDEDEDDDDDDDDDDDDDDDDDCDCDCDCDCDC DBDBDBDBDBDBDADADADADAD9D9D9D9D8D8D8D8D7D7D7D7D6D6D6D6D5D5D5D4D4D4D3D3D3D3D2D2D2 D1D1D1D0D0CFCFCFCECECECDCDCCCCCCCBCBCACACAC9C9C8C8C7C7C7C6C6C5C5C4C4C3C3C2C2C1C1 C0C0BFBFBEBEBDBDBCBCBBBBBABAB9B9B8B7B7B6B6B5B5B4B3B3B2B2B1B0B0AFAEAEADADACABABAA A9A9A8A7A7A6A5A5A4A3A3A2A1A0A09F9E9E9D9C9B9B9A999898979695959493929191908F8E8D8D 8C8B8A8989888786858483838281807F7E7D7D7C7B7A79787776757473737271706F6E6D6C6B > < E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E2E2E2E2E2E2E2E2E2E2E2E1E1E1E1E1E1E1E1E0E0E0E0E0E0 DFDFDFDFDFDEDEDEDEDEDDDDDDDDDCDCDCDCDBDBDBDBDADADADAD9D9D9D8D8D8D7D7D7D7D6D6D6D5 D5D5D4D4D3D3D3D2D2D2D1D1D0D0D0CFCFCECECECDCDCCCCCBCBCACACAC9C9C8C8C7C7C6C6C5C5C4 C4C3C3C2C2C1C1C0BFBFBEBEBDBDBCBCBBBABAB9B9B8B7B7B6B6B5B4B4B3B2B2B1B1B0AFAFAEADAD ACABABAAA9A9A8A7A6A6A5A4A4A3A2A1A1A09F9E9E9D9C9B9B9A9998979796959493939291908F8F 8E8D8C8B8A8989888786858483828281807F7E7D7C7B7A79787877767574737271706F6E6D6C > 4 %_Br [ 0.615686 0.490196 0.490196 0.172549 0.396078 0.419608 0.423529 2 50 100 %_BS %_0.615686 0.490196 0.490196 0.172549 0.396078 0.419608 0.423529 2 50 100 Bs 0.113725 0.086275 0.066667 0 0.870588 0.87451 0.890196 2 70.2247 0 %_BS %_0.113725 0.086275 0.066667 0 0.870588 0.87451 0.890196 2 70.2247 0 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 59) (Unnamed gradient 59) 1 2 Bd [ < 00000101020203040505050607070708090A0A0A0C0D0E0F100F1011121313141416161617181A1B 1C1C1C1D1F202020212223232526272829292A2B2D2E2E2F30313232333435373838393A > < 00000001020203040405060708080A0A0B0C0D0F101112121315151617181A1A1B1C1D1E1F202223 2425262728292A2B2C2D2E2F3032333435363738393A3B3C3D3E3F404142434445474849 > < 00000000000000000100010001000101010101020102020202020201020302020203020203020202 020302030203020303030302030303040304030404040504050405040405040504040404 > 0 < FFFEFDFDFCFBFAF9F8F8F7F6F5F4F4F3F2F1F0F0EFEEEDECEBEBEAE9E8E7E7E6E5E4E3E3E2E1E0DF DEDEDDDCDBDADAD9D8D7D6D6D5D4D3D2D1D1D0CFCECDCDCCCBCAC9C9C8C7C6C5C4C4C3C2 > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECEBEAE9E8E7E6E5E4E3E2E1E0DFDEDDDCDBDAD8D7 D6D5D4D3D2D1D0CFCECDCCCBCAC9C8C7C6C5C4C3C2C1C0BFBEBDBCBBBAB9B8B7B6B5B4B3 > < FFFEFEFDFDFCFCFBFAFAF9F9F8F8F7F6F6F5F5F4F4F3F2F2F1F1F0F0EFEEEEEDEDECECEBEAEAE9E9 E8E7E7E6E6E5E5E4E3E3E2E2E1E1E0DFDFDEDEDDDDDCDBDBDADAD9D9D8D7D7D6D6D5D5D4 > 4 %_Br [ 0 0 0 0 1 1 1 2 50 0 %_BS %_0 0 0 0 1 1 1 2 50 0 Bs 0.227451 0.286274 0.015686 0 0.760784 0.701961 0.831373 2 50 100 %_BS %_0.227451 0.286274 0.015686 0 0.760784 0.701961 0.831373 2 50 100 Bs BD %AI5_EndGradient %AI5_BeginGradient: (Unnamed gradient 60) (Unnamed gradient 60) 1 4 Bd [ < 000000010203030405050607080808090A0B0C0D0E0F0F1011121314141516171819191A1B1C1D1D 1E1F2021212223242525272829292A2B2C2C2E2F30303132333334353636373838393B3C3C3D3E3E 3F40404142434445454647474849494A4C4C4D4E4E4F4F50525253535456565858595A5A5C5C5D5D 5E5F5F6161626263636464656667686869696A6A6B6B6D6D6D6E6E6F6F7070717172727373737575 767677777778787979797A7A7B7B7B7C7D7C7D7E7D7F7F7E80808081818182828283838383848484 85858585868686868687878787888889898889898A8A8A89898A8B8B8B8B8B8B8A8C8C8C8C8C8C8C 8C8C8C > < 000000010102030304050506070809090A0B0C0D0C0D0F0F1011121214141616171718191A1B1C1D 1E1F1E1F20212222232524252628292A292B2C2D2E302F3031323333343536373738393A3A3B3C3D 3C3E3F403F4142434344454646474848494A4C4B4D4E4E4F50505152525355555657575858595B5A 5C5D5D5E5E5F606061616263636464656567666869696A6A6C6B6D6C6E6E6F6F7070727173727474 7575767678777778787A797B7A7A7C7B7D7D7D7E7E7F7F7F81818182828283838384848485858587 868686878787898989888A8A8A89898B8B8B8A8A8C8C8C8C8C8C8E8E8E8E8E8E8D8D8F8F8F8F8F8F 8F8F8F > < 000000000001010201020203040304040506060608090809090A090A0A0B0A0B0C0D0C0D0E0F0E0E 0F101111121112131413141514151615171818191A191B1B1B1B1C1C1D1E1D1E201F201F21212121 2322232224252425252627262827282A292A292B2A2B2B2C2D2D2E2E302F30303130323133343335 34353536363736373737383739383A393B3A3C3B3C3C3B3D3C3E3D3F3D3E3E3E3F3F3E403F414040 41414242414343424443434444444545444546454645454746464647474748484847494948484A48 49494A4949494A4A4A4A494B4B4B4B4A4A4B4C4C4A4A4A4C4C4C4B4B4B4B4B4B4D4D4C4C4C4C4C4C 4C4C4C > < 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000001010101010101010101010202020202020202020202 03030303030303030303030404040404040505050505050606060606060607070707070707070808 0808080909090909090A0A0A0A0A0A0A0A0B0B0B0B0B0B0C0C0C0C0C0C0C0C0C0D0D0D0D0D0D0D0D 0D0D0D > < FFFEFDFCFBFAFAF9F8F7F6F5F4F3F3F2F1F0EFEEEDECECEBEAE9E8E7E7E6E5E4E3E2E2E1E0DFDEDE DDDCDBDADAD9D8D7D6D6D5D4D3D3D2D1D0D0CFCECDCDCCCBCACAC9C8C7C7C6C5C5C4C3C2C2C1C0C0 BFBEBEBDBCBCBBBABAB9B8B8B7B6B6B5B4B4B3B2B2B1B1B0AFAFAEAEADACACABABAAA9A9A8A8A7A7 A6A5A5A4A4A3A3A2A2A1A1A0A09F9E9E9D9D9C9C9B9B9A9A9A999998989797969695959494949393 929291919190908F8F8F8E8E8D8D8D8C8C8C8B8B8B8A8A8A89898988888887878786868686858585 848484848383838383828282828181818181808080808080807F7F7F7F7F7F7F7F7E7E7E7E7E7E7E 7E7E7E > < FFFEFDFCFBFAF9F8F7F6F5F4F3F2F1F0EFEEEDECECEBEAE9E8E7E6E5E4E3E2E1E0E0DFDEDDDCDBDA D9D8D8D7D6D5D4D3D2D1D1D0CFCECDCCCCCBCAC9C8C7C7C6C5C4C3C3C2C1C0BFBFBEBDBCBCBBBAB9 B9B8B7B6B6B5B4B3B3B2B1B0B0AFAEAEADACABABAAA9A9A8A7A7A6A5A5A4A3A3A2A1A1A0A09F9E9E 9D9C9C9B9B9A9999989897969695959494939392919190908F8F8E8E8D8D8C8C8B8B8A8A89898888 878786868585858484838382828281818080807F7F7E7E7E7D7D7D7C7C7C7B7B7B7A7A7A79797978 78787877777776767676757575757574747474747373737373737272727272727272717171717171 717171 > < FFFEFDFDFCFBFAF9F9F8F7F6F5F5F4F3F2F1F1F0EFEEEEEDECEBEBEAE9E8E8E7E6E5E5E4E3E2E2E1 E0DFDFDEDDDDDCDBDADAD9D8D8D7D6D6D5D4D4D3D2D2D1D0D0CFCECECDCCCCCBCACAC9C9C8C7C7C6 C5C5C4C4C3C2C2C1C1C0BFBFBEBEBDBCBCBBBBBABAB9B9B8B7B7B6B6B5B5B4B4B3B3B2B2B1B0B0AF AFAEAEADADACACACABABAAAAA9A9A8A8A7A7A6A6A5A5A5A4A4A3A3A2A2A2A1A1A0A0A09F9F9E9E9E 9D9D9C9C9C9B9B9B9A9A9A9999999898989797979696969595959594949493939393929292929191 9191909090908F8F8F8F8F8E8E8E8E8E8E8D8D8D8D8D8D8C8C8C8C8C8C8C8C8C8B8B8B8B8B8B8B8B 8B8B8B > 4 %_Br < 8C8C8D8E8E8F909192929494959696969899999B9B9D9D9E9FA0A0A1A2A2A4A4A4A6A7A9A9AAABAB ABADADADAFAFAFB1B1B3B3B3B5B5B5B7B7B7B9B9B9BBBBBCBDBDBEBE > < 8F90929496989A9C9E9FA1A3A5A6A8AAACAEB0B2B4B5B7B9BABCBEC0C2C4C5C7C9CACECFD1D2D4D5 D7D9DADCDDDFE0E2E3E5E6E8E9EBECEDEEF0F1F2F3F4F5F6F8F9FAFB > < 4C4B4A494847444342403F3E3D3C3B3A3937363433333231302F2E2D2A2827262524222221201F1D 1A191817161514141312110D0C0B0A0A090908070706040403030302 > < 0D0C0C0C0C0C0B0B0B0B0A0A0A0A0A09090808080707070706060606050505050404030302020202 02020202020202020101010000000001010101010101010101000101 > < 7E7E7D7D7D7C7C7B7B7B7A7A7A797979787878777776767675757574747473737372727171717070 706F6F6F6E6E6E6D6D6C6C6C6B6B6B6A6A6A69696968686767676666 > < 71706F6E6D6C6B6A696867666564636261605F5E5D5C5B5A595857565554535251504E4D4C4B4A49 4847464544434241403F3E3D3C3B3A393837363534333231302F2E2D > < 8B8B8B8B8B8B8C8C8C8C8C8C8C8C8C8C8C8D8D8D8D8D8D8D8D8D8D8D8E8E8E8E8E8E8E8E8E8E8E8E 8F8F8F8F8F8F8F8F8F8F8F9090909090909090909090919191919191 > 4 %_Br < BEBEBEBEBEBEBEBEBDBDBDBCBBBCBCBCBBBBBBBABAB9B8B7B7B6B5B4B4B3B1B1AFAEADADACACABAA A9A7A6A6A4A3A3A2A1 > < FBFAF9F9F8F7F6F5F4F3F1F0EEEDEDEBE9E8E6E4E2E0DEDCDBD8D6D4D2D0CDCCC9C7C4C2C0BDBAB8 B5B3B0AEABA8A5A3A0 > < 0204040606090B0B0E111215181B1B1E20212427282B2E30313336393A3C3F40424547484B4D5050 535558595C5E616265 > < 010101010101010101010102030404050506060707080A0C0C0E0F111214151617191B1B1D1F2121 2325262628292A2B2C > < 66666666666666666666666666656565656565656565656565656565656565656565656565646464 646464646464646464 > < 2D2E2F2F30313233343536373839393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152 535455565758595A5B > < 9190908F8F8E8D8D8C8B8B8A89888887868685848483828181807F7E7E7D7C7C7B7A797978777676 75747373727170706F > 4 %_Br [ 0 0 0 0 1 1 1 2 33.3333 0 %_BS %_0 0 0 0 1 1 1 2 33.3333 0 Bs 0.54902 0.560784 0.298039 0.05098 0.494118 0.443137 0.545098 2 50 56.7416 %_BS %_0.54902 0.560784 0.298039 0.05098 0.494118 0.443137 0.545098 2 50 56.7416 Bs 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 2 51.9231 85.3932 %_BS %_0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 2 51.9231 85.3932 Bs 0.631373 0.627451 0.396078 0.172549 0.392157 0.356863 0.435294 2 51.9231 100 %_BS %_0.631373 0.627451 0.396078 0.172549 0.392157 0.356863 0.435294 2 51.9231 100 Bs BD %AI5_EndGradient %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI3_BeginPattern: (Checked Pattern) (Checked Pattern) 46.0313 5.4375 113.3027 72.7207 [ %AI3_Tile (0 O 0 R 1 g 1 G ) @ ( %AI6_BeginPatternLayer 0 J 0 j 3 w 4 M []0 d 0 XR 25.0313 11.4375 m 31.0313 5.4375 L F 25.0313 5.4375 m 31.0313 11.4375 L F %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6699 5.44141 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6699 5.44141 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 67.7813 0.511719 m 67.7813 10.3691 L 74.7383 17.332 L 84.5996 17.332 L 91.5605 10.373 L 91.5605 0.515625 L 67.7813 0.511719 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 67.7813 0.511719 m 67.7813 10.3691 L 74.7383 17.332 L 84.5996 17.332 L 91.5605 10.373 L 91.5605 0.515625 L 67.7813 0.511719 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0313 5.4375 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0313 5.4375 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.1035 0.5 m 41.1016 17.3281 L 50.959 17.3281 L 57.9199 10.3691 L 57.9219 0.511719 L 41.1035 0.5 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.1035 0.5 m 41.1016 17.3281 L 50.959 17.3281 L 57.9199 10.3691 L 57.9219 0.511719 L 41.1035 0.5 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3086 5.44141 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3086 5.44141 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2188 0.515625 m 101.418 0.511719 L 101.418 10.3691 L 108.377 17.332 L 118.2363 17.332 L 118.2188 0.515625 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2188 0.515625 m 101.418 0.511719 L 101.418 10.3691 L 108.377 17.332 L 118.2363 17.332 L 118.2188 0.515625 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0273 39.0781 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0273 39.0781 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.0977 50.9668 m 50.9551 50.9688 L 57.916 44.0078 L 57.918 34.1484 L 50.957 27.1875 L 41.0996 27.1875 L 41.0977 50.9668 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 41.0977 50.9668 m 50.9551 50.9688 L 57.916 44.0078 L 57.918 34.1484 L 50.957 27.1875 L 41.0996 27.1875 L 41.0977 50.9668 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8477 22.2598 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8477 22.2598 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9199 10.3691 m 50.959 17.3281 L 50.957 27.1875 L 57.918 34.1484 L 67.7773 34.1484 L 74.7383 27.1914 L 74.7383 17.332 L 67.7813 10.3691 L 57.9199 10.3691 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9199 10.3691 m 50.959 17.3281 L 50.957 27.1875 L 57.918 34.1484 L 67.7773 34.1484 L 74.7383 27.1914 L 74.7383 17.332 L 67.7813 10.3691 L 57.9199 10.3691 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4883 22.2637 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4883 22.2637 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5605 10.373 m 84.5996 17.332 L 84.5977 27.1914 L 91.5566 34.1523 L 101.416 34.1523 L 108.377 27.1953 L 108.377 17.334 L 101.418 10.373 L 91.5605 10.373 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5605 10.373 m 84.5996 17.332 L 84.5977 27.1914 L 91.5566 34.1523 L 101.416 34.1523 L 108.377 27.1953 L 108.377 17.334 L 101.418 10.373 L 91.5605 10.373 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3066 39.082 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3066 39.082 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2363 27.1914 m 108.377 27.1914 L 101.4141 34.1484 L 101.4141 44.0098 L 108.373 50.9707 L 118.2344 50.9707 L 118.2363 27.1914 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2363 27.1914 m 108.377 27.1914 L 101.4141 34.1484 L 101.4141 44.0098 L 108.373 50.9707 L 118.2344 50.9707 L 118.2363 27.1914 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4844 55.9023 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 96.4844 55.9023 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5566 44.0117 m 84.5957 50.9707 L 84.5938 60.8311 L 91.5527 67.792 L 101.4141 67.792 L 108.373 60.834 L 108.373 50.9746 L 101.4141 44.0137 L 91.5566 44.0117 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5566 44.0117 m 84.5957 50.9707 L 84.5938 60.8311 L 91.5527 67.792 L 101.4141 67.792 L 108.373 60.834 L 108.373 50.9746 L 101.4141 44.0137 L 91.5566 44.0117 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8457 55.8994 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 62.8457 55.8994 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.916 44.0078 m 50.9551 50.9688 L 50.9531 60.8271 L 57.9141 67.7881 L 67.7734 67.7891 L 74.7344 60.8301 L 74.7363 50.9707 L 67.7773 44.0098 L 57.916 44.0078 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.916 44.0078 m 50.9551 50.9688 L 50.9531 60.8271 L 57.9141 67.7881 L 67.7734 67.7891 L 74.7344 60.8301 L 74.7363 50.9707 L 67.7773 44.0098 L 57.916 44.0078 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0254 72.7168 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 46.0254 72.7168 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9141 77.6484 m 57.9141 67.7881 L 50.9551 60.8271 L 41.0977 60.8262 L 41.0938 77.625 L 57.9141 77.6484 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 57.9141 77.6484 m 57.9141 67.7881 L 50.9551 60.8271 L 41.0977 60.8262 L 41.0938 77.625 L 57.9141 77.6484 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6641 72.7207 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.6641 72.7207 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5527 77.6523 m 91.5527 67.792 L 84.5957 60.8311 L 74.7363 60.8301 L 67.7734 67.7891 L 67.7734 77.6494 L 91.5527 77.6523 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 91.5527 77.6523 m 91.5527 67.792 L 84.5957 60.8311 L 74.7363 60.8301 L 67.7734 67.7891 L 67.7734 77.6494 L 91.5527 77.6523 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3027 72.7207 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 113.3027 72.7207 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2344 60.8311 m 108.373 60.8301 L 101.4141 67.7891 L 101.4121 77.6494 L 118.2188 77.6523 L 118.2344 60.8311 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 118.2344 60.8311 m 108.373 60.8301 L 101.4141 67.7891 L 101.4121 77.6494 L 118.2188 77.6523 L 118.2344 60.8311 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.666 39.082 m F %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 79.666 39.082 m S %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 74.7383 27.1914 m 67.7773 34.1484 L 67.7773 44.0098 L 74.7363 50.9707 L 84.5957 50.9707 L 91.5566 44.0117 L 91.5566 34.1523 L 84.5977 27.1914 L 74.7383 27.1914 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 74.7383 27.1914 m 67.7773 34.1484 L 67.7773 44.0098 L 74.7363 50.9707 L 84.5957 50.9707 L 91.5566 44.0117 L 91.5566 34.1523 L 84.5977 27.1914 L 74.7383 27.1914 L s %AI6_EndPatternLayer ) & (0 O 0 R 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 7.46094 27.1816 m 0.501953 34.1406 L 0.5 44 L 7.45898 50.9609 L 17.3184 50.9609 L 24.2793 44.0039 L 24.2813 34.1445 L 17.3223 27.1836 L 7.46094 27.1816 L f %AI6_EndPatternLayer ) & (0 O 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA ) @ ( %AI6_BeginPatternLayer 0 J 0 j 1 w 4 M []0 d 0 XR 7.46094 27.1816 m 0.501953 34.1406 L 0.5 44 L 7.45898 50.9609 L 17.3184 50.9609 L 24.2793 44.0039 L 24.2813 34.1445 L 17.3223 27.1836 L 7.46094 27.1816 L s 101.4141 67.7891 m 101.4141 77.6494 L 91.5527 77.6494 L 91.5527 67.7891 L 101.4141 67.7891 L f 67.7813 0.511719 m 67.7813 10.3691 L 57.9199 10.3691 L 57.9199 0.511719 L 67.7813 0.511719 L f 101.418 0.511719 m 101.418 10.3691 L 91.5586 10.3691 L 91.5586 0.511719 L 101.418 0.511719 L f 84.5996 17.332 m 84.5996 27.1914 L 74.7383 27.1914 L 74.7383 17.332 L 84.5996 17.332 L f 67.7773 34.1484 m 67.7773 44.0098 L 57.918 44.0098 L 57.918 34.1484 L 67.7773 34.1484 L f 50.957 17.3281 m 50.957 27.1875 L 41.1016 27.1875 L 41.1016 17.3281 L 50.957 17.3281 L f 118.2363 17.332 m 118.2363 27.1914 L 108.377 27.1914 L 108.377 17.332 L 118.2363 17.332 L f 101.4141 34.1484 m 101.4141 44.0098 L 91.5566 44.0098 L 91.5566 34.1484 L 101.4141 34.1484 L f 84.5977 50.9707 m 84.5977 60.8301 L 74.7363 60.8301 L 74.7363 50.9707 L 84.5977 50.9707 L f 67.7734 67.7891 m 67.7734 77.6494 L 57.9141 77.6494 L 57.9141 67.7891 L 67.7734 67.7891 L f 50.9551 50.9688 m 50.9551 60.8271 L 41.0977 60.8271 L 41.0977 50.9688 L 50.9551 50.9688 L f 118.2344 50.9707 m 118.2344 60.8301 L 108.373 60.8301 L 108.373 50.9707 L 118.2344 50.9707 L f 17.3203 52.9609 m 17.3203 62.8213 L 7.46094 62.8213 L 7.46094 52.9609 L 17.3203 52.9609 L f %AI6_EndPatternLayer ) & ] E %AI3_EndPattern %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginBrushPattern (Unnamed 18) 0 A u u 0 J 0 j 1 w 4 M []0 d 0 XR -3918.7319 4618.8438 m -3810.1599 4618.8438 L -3810.1599 4617.4312 L -3918.7319 4617.4312 L -3918.7319 4618.8438 L n u 0 O 0.698039 0.67451 0.639216 0.741176 0.137255 0.121569 0.12549 Xa -3810.1599 4617.4688 m -3810.2112 4617.4312 L -3810.3442 4617.5352 L -3810.1599 4617.4688 L f -3811.0344 4617.6997 m -3811.0088 4617.7188 -3811.0212 4617.75 -3810.9951 4617.769 C -3810.4817 4617.4727 L -3810.7112 4617.3047 -3810.8833 4617.8125 -3811.0344 4617.6997 c f -3811.1855 4617.6699 m -3811.3848 4617.6006 -3811.4673 4617.7393 -3811.5137 4617.7871 C -3811.4441 4617.6792 -3811.1423 4617.8203 -3811.1855 4617.6699 C f -3828.7217 4617.7393 m -3828.7031 4617.7383 -3828.6785 4617.7344 -3828.6599 4617.73 C -3828.6912 4617.7256 -3828.7112 4617.73 -3828.7217 4617.7393 C f -3833.2969 4618.2119 m -3833.3447 4618.3232 L -3832.4912 4618.125 -3831.5281 4618.3262 -3830.6252 4618.2393 C -3830.6863 4618.2793 L -3828.3953 4618.3223 -3826.2825 4618.1367 -3824.0095 4618.0518 C -3824.0449 4618.0645 -3824.0569 4618.0967 -3824.0935 4618.1094 c -3823.9839 4618.0713 -3823.8623 4618 -3823.7393 4618.0093 C -3823.7073 4618.0342 -3823.7737 4618.061 -3823.8132 4618.0723 C -3823.3333 4618.2559 -3822.4033 4617.9561 -3822.1033 4618.0977 C -3821.9683 4618.0781 -3821.9087 4618.0015 -3821.9839 4617.9429 C -3820.2048 4617.896 -3818.3015 4617.8608 -3816.4895 4617.7168 C -3816.4023 4617.7422 -3816.3865 4617.792 -3816.4104 4617.8555 C -3814.8616 4617.5576 -3813.2383 4617.6763 -3811.6536 4617.7246 C -3811.5928 4617.6465 -3811.8152 4617.6416 -3811.6592 4617.5601 C -3812.1687 4617.4624 -3812.5923 4617.7524 -3813.0544 4617.6094 C -3812.9951 4617.5342 L -3813.3313 4617.4854 -3813.0632 4617.7246 -3813.4121 4617.627 C -3813.5496 4617.5645 -3813.3777 4617.5313 -3813.4417 4617.5254 C -3814.1563 4617.5566 -3814.9016 4617.4883 -3815.5745 4617.6719 C -3815.7407 4617.5078 -3816.3423 4617.666 -3816.6064 4617.5093 C -3816.7913 4617.5742 -3816.9768 4617.5576 -3817.0471 4617.666 C -3819.5481 4617.5796 -3822.1033 4617.7383 -3824.6653 4617.7261 C -3825.8643 4618.0435 -3827.3 4617.665 -3828.7231 4617.7715 C -3828.7329 4617.7603 -3828.7312 4617.748 -3828.7217 4617.7393 C -3829.1855 4617.8174 -3829.8616 4617.8545 -3830.4153 4617.8145 C -3830.8843 4617.9492 L -3834.2161 4617.6729 -3837.6208 4617.8672 -3841.0049 4617.7524 c -3844.8503 4617.6729 -3848.2192 4617.4453 -3851.9641 4617.8633 C -3851.9592 4617.832 -3851.9895 4617.8145 -3851.8928 4617.8022 C -3852.9736 4617.8662 -3853.9583 4617.7524 -3854.9761 4617.8184 C -3854.9729 4617.7871 L -3857.4983 4618.0488 -3860.2295 4617.7524 -3862.6641 4618.0342 C -3865.6279 4618.0059 -3868.9792 4618.0342 -3872.1162 4618.1152 C -3872.1089 4618.0518 L -3874.6191 4618.1846 -3877.0449 4617.8516 -3879.5496 4617.9517 C -3882.1252 4617.8086 -3884.8464 4618.3125 -3887.4441 4618.1211 C -3889.0513 4617.8125 -3891.1624 4618.4741 -3892.6721 4618.1543 C -3895.7737 4617.6719 -3898.7825 4617.9824 -3901.8833 4618.2715 C -3904.7439 4618.0996 -3907.6001 4618.541 -3910.3704 4618.1904 C -3911.6831 4618.415 -3913.1328 4617.9121 -3914.5935 4617.9766 C -3914.5413 4618.0547 L -3915.0657 4617.8184 -3915.7097 4618.3853 -3916.0369 4618.0342 C -3915.9817 4618.0181 L -3916.2593 4617.8398 -3916.6265 4618.4385 -3916.7952 4618.2261 C -3916.8401 4618.3145 L -3917.1763 4618.3398 -3916.8799 4618.2144 -3917.1392 4618.1792 C -3917.2368 4618.1904 -3917.1763 4618.3398 -3917.3799 4618.2891 C -3917.4241 4617.9287 -3918.2031 4618.3672 -3918.2263 4617.9624 C -3918.0425 4617.9624 -3918.5144 4617.8057 -3918.1016 4617.7207 C -3918.2192 4617.6792 -3918.7825 4617.6992 -3918.7319 4617.8711 C -3918.78 4618.0537 -3919 4618.2124 -3918.6577 4618.3535 C -3918.5889 4618.2207 L -3918.4736 4618.3535 -3918.5012 4618.2871 -3918.46 4618.3867 C -3918.0127 4618.4043 -3917.9529 4618.5977 -3917.6321 4618.6772 C -3917.6353 4618.6729 -3917.6384 4618.6699 -3917.6335 4618.6631 C -3917.4143 4618.5039 -3917.1111 4618.5977 -3916.9375 4618.6211 C -3916.8679 4618.6953 L -3916.7625 4618.8496 -3916.3591 4618.3926 -3916.4951 4618.6582 C -3915.5857 4618.5923 -3914.5432 4618.5957 -3913.5271 4618.5923 C -3913.3848 4618.4912 -3912.7493 4618.6016 -3912.9712 4618.4072 c -3912.7168 4618.6289 -3911.9607 4618.6846 -3911.6799 4618.6763 C -3911.6904 4618.6973 -3911.7024 4618.7207 -3911.7463 4618.7124 C -3911.2017 4619 -3911.1008 4618.4463 -3910.5903 4618.7979 C -3910.5105 4618.5493 -3909.6631 4618.8774 -3909.3743 4618.5854 C -3909.3113 4618.6406 -3909.2903 4618.6904 -3909.3132 4618.7344 C -3908.3943 4618.7393 -3907.3792 4618.8296 -3906.6016 4618.8408 C -3905.9373 4618.623 -3904.9929 4618.9395 -3904.4216 4618.6387 C -3903.9482 4618.7017 -3903.1824 4618.8281 -3902.5215 4618.707 C -3902.5857 4618.7437 L -3901.8401 4618.7261 -3900.9087 4618.7104 -3900.3972 4618.5215 C -3900.1768 4618.8096 -3899.8545 4618.7524 -3899.5322 4618.8438 C -3899.0344 4618.7104 -3898.0295 4618.75 -3897.27 4618.6289 C -3897.1536 4618.7617 -3896.6433 4618.5723 -3896.6042 4618.7656 C -3894.4761 4618.3926 -3891.8447 4618.5225 -3889.5723 4618.8047 C -3889.6052 4618.8184 L -3889.3103 4618.7124 -3888.9705 4618.4785 -3888.6704 4618.3413 C -3888.6409 4618.3584 -3888.6443 4618.3896 -3888.7073 4618.3896 C -3888.2922 4618.3535 -3887.9041 4618.5435 -3887.4895 4618.5078 C -3887.4929 4618.54 -3887.4929 4618.54 -3887.5601 4618.5703 C -3887.1711 4618.4844 -3886.7561 4618.7246 -3886.2969 4618.5752 C -3886.2712 4618.6265 L -3885.9792 4618.5547 L -3885.9863 4618.6182 -3885.9976 4618.7144 -3886.1536 4618.6934 C -3882.5903 4618.7559 -3878.9121 4618.4248 -3875.2537 4618.4727 C -3875.3879 4618.5332 L -3874.6785 4618.4248 L -3874.6824 4618.457 -3874.7161 4618.4727 -3874.75 4618.4873 C -3873.8464 4618.5957 -3872.9087 4618.415 -3872.0281 4618.4424 C -3872.0322 4618.4736 -3872.1655 4618.5352 -3872.0422 4618.5703 C -3871.3904 4618.396 -3870.9951 4618.7964 -3870.6687 4618.4351 C -3870.6384 4618.4517 -3870.6177 4618.5332 -3870.6841 4618.5625 C -3868.8704 4618.4424 -3867.0081 4618.4492 -3865.1809 4618.5078 C -3863.6592 4618.1807 -3861.9583 4618.4766 -3860.3777 4618.2168 C -3860.3855 4618.2822 L -3858.3391 4618.0537 -3856.1682 4618.2979 -3854.0471 4618.2524 C -3853.1663 4618.2783 -3852.5713 4618.2012 -3851.6863 4618.1973 C -3851.6641 4618.2783 L -3850.1743 4617.9688 -3848.5327 4618.5566 -3846.9785 4618.2158 C -3847.0857 4618.3262 L -3846.8447 4618.1553 -3846.1455 4618.3867 -3846.2375 4618.0933 C -3845.9631 4618.1816 L -3844.9072 4617.7949 -3844.0413 4618.3608 -3842.7473 4618.1094 C -3842.8323 4618.1792 L -3842.4883 4618.125 -3842.0872 4618.082 -3841.8323 4618.1465 C -3841.8721 4618.1563 -3841.8535 4618.1768 -3841.9353 4618.1953 C -3840.8577 4618.4707 -3839.6584 4618.166 -3838.5215 4618.1768 C -3838.6504 4618.3062 L -3838.1008 4618.1543 -3837.0928 4618.2959 -3836.3704 4618.2261 C -3836.4143 4618.2871 L -3836.0488 4618.2012 L -3836.0393 4618.3232 L -3835.0991 4618.332 -3834.2144 4618.2261 -3833.2969 4618.2119 C f -3823.8132 4618.0723 m -3823.8159 4618.0713 -3823.8201 4618.0713 -3823.8232 4618.0684 C -3823.8513 4618.0791 -3823.8376 4618.0781 -3823.8132 4618.0723 C f -3917.5168 4618.7017 m -3917.5601 4618.6953 -3917.5959 4618.6875 -3917.6321 4618.6772 C -3917.6233 4618.7017 -3917.5537 4618.6973 -3917.5168 4618.7017 c f U U U %AI8_EndBrushPattern %AI8_BeginBrushPattern (Unnamed Brush Pat 2) 0 A u 0 J 0 j 1 w 4 M []0 d 0 XR -7791.3833 8491.4551 m -7699.5479 8491.4551 L -7699.5479 8487.1758 L -7791.3833 8487.1758 L -7791.3833 8491.4551 L n 0 O 0.698039 0.67451 0.639216 0.741176 0.137255 0.121569 0.12549 Xa -7791.1631 8488.7754 m -7791.5 8488.8418 -7790.9814 8489.0313 -7791.3833 8488.8887 C -7791.3379 8488.7705 -7791.2725 8488.6816 -7791.1631 8488.7754 C f -7700.6675 8488.9414 m -7701.7524 8489.7041 -7703.1816 8488.9336 -7704.3701 8489.4199 C -7704.5098 8489.4521 -7704.3345 8489.002 -7704.6484 8489.1025 C -7705.8008 8489.6953 -7707.6162 8489.3418 -7709.0195 8488.8848 C -7708.9346 8488.7666 L -7709.2017 8488.6816 -7709.5283 8489.0723 -7709.8115 8489.0176 C -7709.8135 8488.9395 -7709.7207 8488.9063 -7709.7861 8488.7979 C -7709.8574 8489.0352 -7710.2983 8488.9082 -7710.4185 8489.084 C -7710.5303 8488.9922 -7710.5195 8488.8047 -7710.6641 8488.7002 C -7710.8262 8488.9697 L -7711.2769 8489.6094 -7711.9209 8488.9258 -7712.5361 8489.2559 C -7712.5063 8489.1934 -7712.4453 8489.1445 -7712.4941 8489.084 C -7713.4814 8489.4727 -7714.7168 8489.3994 -7715.8208 8489.543 C -7715.7769 8489.4482 -7715.7363 8489.2754 -7715.8008 8489.168 C -7715.8555 8489.4512 -7716.1963 8489.5225 -7716.4922 8489.5781 C -7716.6255 8489.2871 -7716.9995 8489.8438 -7717.3467 8489.6826 C -7717.3169 8489.6191 L -7717.5732 8489.9238 -7717.6973 8489.4434 -7717.9053 8489.8086 C -7718.0684 8489.5801 L -7718.1807 8489.9902 -7718.4395 8489.3672 -7718.6514 8489.5762 C -7718.6445 8489.6602 L -7718.8442 8489.7598 -7718.9482 8489.5537 -7719.1338 8489.623 C -7719.1514 8489.5762 L -7719.5854 8489.6826 -7719.8379 8489.4551 -7719.8271 8489.7754 C -7719.9795 8489.5186 -7719.4063 8489.6582 -7719.6455 8489.2842 C -7721.0732 8489.6152 -7722.5459 8489.5498 -7723.9834 8489.5566 C -7724.1465 8489.4277 -7724.2505 8489.3887 -7724.2871 8489.2666 C -7724.4307 8489.332 -7724.8281 8489.3262 -7724.9585 8489.4902 C -7724.9102 8489.4834 -7725.0513 8489.3262 -7725.1274 8489.3105 C -7725.3887 8489.1895 -7725.4131 8489.6621 -7725.7002 8489.5186 C -7725.5859 8489.4336 -7725.5469 8489.3301 -7725.5854 8489.2109 C -7725.8301 8489.4609 -7726.1577 8489.4209 -7726.4473 8489.502 C -7726.4023 8489.4482 -7726.3325 8489.416 -7726.3433 8489.3154 C -7726.6602 8489.5986 -7726.9209 8489.2559 -7727.1982 8489.4346 C -7727.0947 8489.25 L -7727.5415 8489.0254 -7727.2266 8489.6367 -7727.6128 8489.5039 C -7727.52 8489.4453 -7727.5527 8489.373 -7727.5361 8489.2979 C -7727.8965 8489.6338 -7728.4795 8489.5225 -7728.8389 8489.6367 C -7728.8174 8489.6113 -7728.8232 8489.5605 Y -7729.2148 8489.6025 -7729.6245 8489.498 -7730.0552 8489.6445 C -7730.2119 8489.5625 -7730.0039 8489.1934 -7730.4185 8489.2617 C -7730.4033 8489.6328 -7731.1221 8489.4141 -7730.8779 8489.834 C -7731.2319 8489.7734 -7731.7925 8489.6338 -7732.0283 8489.7598 C -7731.8691 8489.6191 -7732.2007 8489.3066 -7731.9063 8489.2754 C -7732.1289 8489.0498 L -7732.0957 8488.8984 -7731.8999 8489.1016 -7731.9707 8488.9102 C -7732.1182 8488.9258 -7732.5479 8489.0723 -7732.6797 8489.0117 C -7732.9531 8489.2393 -7733.2041 8489.6641 -7733.6465 8489.7109 C -7733.4385 8489.5664 -7733.7646 8489.3018 -7733.6235 8489.2383 C -7734.2407 8489.9482 L -7734.3877 8489.9658 -7734.2725 8489.6563 -7734.4854 8489.7529 C -7734.4746 8489.8506 -7734.5674 8489.9121 -7734.6318 8489.9922 C -7734.6875 8489.9482 -7735.2441 8490.084 -7735.3081 8489.7178 C -7735.3735 8489.5762 -7735.0684 8489.6426 -7735.2314 8489.5117 C -7735.5029 8489.5146 -7735.5151 8489.6406 -7735.7871 8489.6465 C -7735.7925 8489.5977 L -7735.9717 8489.543 -7736.3213 8489.7529 -7736.1265 8489.9551 C -7736.0015 8489.9658 -7736.1738 8489.7354 -7735.9888 8489.8418 C -7736.1152 8490.0537 -7736.4312 8490.1133 -7736.7031 8490.1162 C -7736.6104 8490.0586 -7736.6216 8489.9609 -7736.5845 8489.8574 C -7736.9497 8490.1445 -7737.3369 8490.2354 -7737.7451 8490.3555 C -7737.7515 8490.5293 -7737.5928 8490.0391 -7737.5327 8490.1309 C -7738.0557 8489.8896 -7738.6128 8490.4727 -7739.0479 8490.1201 C -7738.9766 8490.0898 -7739.0098 8490.3672 -7739.0146 8490.3184 C -7739.2666 8490.2969 -7739.2549 8490.0449 -7739.4189 8490.1377 C -7739.4355 8489.9902 -7739.6255 8490.1855 -7739.7944 8490.2305 C -7739.8818 8490.3369 -7739.8384 8490.1582 -7739.6914 8490.1426 C -7739.9268 8490.2666 -7740.8691 8490.4941 -7741.4131 8490.2793 C -7741.4023 8490.377 -7741.7471 8490.6377 -7741.8721 8490.627 C -7741.8232 8490.3984 L -7741.9375 8490.2617 -7742.2422 8490.418 -7742.2632 8490.2227 C -7742.5303 8490.5 -7741.2344 8489.9863 -7741.5957 8490.2002 C -7741.6895 8490.0098 -7742.0991 8490.5645 -7742.0215 8490.2529 C -7742.2725 8490.2617 -7742.5161 8490.5186 -7742.7559 8490.3047 C -7742.6865 8490.3418 -7742.5522 8489.9873 -7742.7549 8490.0039 C -7743.1123 8490.0449 -7742.8564 8490.1133 -7743.1465 8490.1895 C -7743.3281 8490.2832 L -7743.3398 8490.5059 -7743.6475 8490.2529 -7743.5146 8490.502 C -7743.5586 8490.3184 -7744.0337 8490.6152 -7743.9971 8490.2461 C -7743.9473 8489.9551 L -7744.1016 8489.9766 -7744.2002 8490.2617 -7744.3213 8490.3896 C -7744.3418 8490.3633 -7744.3823 8490.3047 -7744.3745 8490.2578 C -7744.3994 8490.7031 -7744.7432 8490.2207 -7744.9268 8490.5645 C -7745.2505 8490.4102 -7745.7495 8490.5498 -7745.9023 8490.2734 C -7746.1514 8490.4082 -7746.3784 8490.5674 -7746.6621 8490.4727 C -7746.6055 8490.4307 -7746.5283 8490.418 -7746.5122 8490.3223 C -7746.6904 8490.1914 -7746.7344 8490.3086 -7746.8975 8490.3809 C -7746.8608 8490.3145 -7747.2539 8490.1201 -7747.4521 8489.9629 C -7747.6992 8490.0957 -7747.6143 8490.3359 -7747.6392 8490.4824 C -7747.8652 8490.043 -7748.3379 8490.7656 -7748.6211 8490.3672 C -7748.5352 8490.3066 -7748.2598 8490.1514 -7748.4658 8490.041 C -7748.6919 8489.6025 -7748.9219 8490.3643 -7749.2861 8490.1543 C -7749.1968 8490.5186 L -7749.3594 8490.293 -7749.7334 8490.7305 -7749.6963 8490.3594 C -7749.8184 8490.4902 -7750.1265 8490.2383 -7750.0859 8490.5938 C -7750.6846 8490.293 -7751.5425 8490.7754 -7751.9102 8490.1377 C -7751.9961 8490.1973 -7752.2104 8490.1367 -7752.1665 8490.3193 C -7752.0239 8490.5176 -7751.9673 8490.1777 -7751.9141 8490.3125 C -7751.9912 8490.3232 -7752.0078 8490.4209 -7752.0161 8490.4697 C -7752.2021 8490.3887 -7752.3486 8490.3633 -7752.1729 8490.0674 C -7752.5869 8489.8477 -7752.6001 8490.6719 -7753.1274 8490.5322 C -7753.1035 8490.3857 -7753.1436 8490.3301 -7753.2979 8490.3535 C -7753.5903 8490.6055 L -7753.9312 8490.5469 -7753.7842 8490.2705 -7753.7925 8490.0215 C -7753.9746 8490.0645 -7754.1973 8490.0527 -7754.2803 8490.2383 C -7754.5015 8489.9258 L -7754.3398 8490.1514 -7754.6514 8490.0762 -7754.7368 8490.1367 C -7754.6514 8490.0762 L -7754.6846 8489.9697 -7754.8955 8490.0352 -7755.0024 8490.0664 C -7754.9766 8490.2207 -7754.7617 8490.2832 -7754.6445 8490.3281 C -7754.7373 8490.4375 -7754.8823 8490.4121 -7755.0059 8490.541 C -7754.9648 8490.2969 -7755.3027 8490.3672 -7755.4473 8490.3418 C -7755.6133 8490.2891 -7755.6348 8490.5605 -7755.6831 8490.5527 C -7755.6875 8490.4258 -7755.9541 8490.5313 -7755.8247 8490.3535 C -7755.7681 8490.3125 -7755.6953 8490.4766 -7755.6016 8490.3643 C -7755.7109 8490.2705 -7755.6982 8490.0498 -7755.9258 8490.2109 C -7756.0967 8490.332 -7755.8818 8490.6934 -7756.2061 8490.5391 C -7756.1211 8490.4785 -7756.1055 8490.3809 -7756.0391 8490.293 C -7756.3433 8490.166 L -7756.3564 8490.3887 L -7756.3975 8490.332 -7756.3691 8490.3125 -7756.3877 8490.2832 C -7756.4785 8490.5176 -7756.8521 8490.3555 -7756.9209 8490.6191 C -7757.0742 8490.6426 -7757.2441 8490.4648 -7757.3906 8490.4395 C -7757.3623 8490.4199 L -7757.5415 8490.2891 -7757.7793 8490.375 -7757.9297 8490.5254 C -7757.9219 8490.4766 L -7758.0195 8490.459 -7758.2505 8490.4941 -7758.3735 8490.625 C -7758.6201 8490.457 -7758.4561 8489.7842 -7758.7295 8490.0645 C -7758.98 8490.0723 -7759.1221 8490.4727 -7759.0215 8490.6152 C -7759.4717 8490.4648 -7759.9834 8490.8281 -7760.4009 8490.4824 C -7760.4658 8490.5723 -7760.4248 8490.6289 -7760.5586 8490.6816 C -7761.2197 8490.5938 -7761.9551 8490.9453 -7762.4814 8490.5078 C -7762.29 8490.4141 -7762.4688 8490.2842 -7762.4727 8490.1582 C -7762.6309 8490.3574 -7762.6631 8489.9512 -7762.7197 8490.293 C -7762.7041 8490.4941 -7762.7197 8490.5918 -7762.5337 8490.6729 C -7762.9282 8490.7813 -7763.5283 8490.7813 -7763.7471 8490.5938 C -7763.6377 8490.6865 -7763.7227 8490.748 -7763.8086 8490.8086 C -7763.7803 8490.4873 -7764.0713 8490.4395 -7764.2915 8490.5527 C -7764.3223 8490.748 L -7764.4658 8490.5469 L -7764.5503 8490.6094 -7764.5591 8490.957 -7764.7773 8490.7695 C -7764.7891 8490.6934 -7764.8018 8490.6162 -7764.8418 8490.5605 C -7765.0693 8490.7207 -7765.3906 8490.9922 -7765.6377 8490.8262 C -7765.8398 8490.541 L -7765.9453 8490.5723 -7766.1235 8490.7441 -7765.9375 8490.8262 C -7766.3594 8490.6543 -7766.6309 8490.6328 -7766.7646 8490.3857 C -7767.4912 8490.9873 -7768.5459 8491.0117 -7769.3906 8490.9688 C -7769.3652 8490.8223 L -7769.5923 8490.6855 -7769.4834 8491.0781 -7769.6416 8490.9766 C -7769.5684 8490.8369 -7769.8145 8490.6729 -7769.6362 8490.502 C -7769.9609 8490.3477 -7770.0547 8490.7559 -7770.2656 8490.8223 C -7770.2979 8491.0146 -7770.0957 8490.6992 -7770.1367 8490.9434 C -7770.1729 8491.0117 -7770.5859 8490.793 -7770.6362 8491.084 C -7770.7178 8490.9697 -7770.6543 8490.7559 -7770.6104 8490.6377 C -7770.8086 8490.7793 L -7771.0513 8490.4395 -7770.2559 8490.1719 -7770.5107 8489.7529 C -7770.6934 8489.7979 L -7770.8682 8489.4941 -7770.21 8489.4551 -7770.6689 8489.3506 C -7770.8682 8489.4941 -7771.0381 8489.916 -7770.8608 8490.0449 C -7771.2754 8490.125 -7771.0527 8490.7383 -7771.4985 8490.7139 C -7771.6201 8490.543 -7771.1416 8490.6729 -7771.2275 8490.4336 C -7771.4375 8490.1992 -7771.6484 8490.5645 -7771.8354 8490.4824 C -7771.6279 8490.5918 -7771.8032 8490.8857 -7771.9375 8490.9395 C -7772.1641 8490.8018 -7771.79 8490.6641 -7772.1113 8490.6338 C -7772.1641 8490.8018 -7772.4595 8490.9277 -7772.2041 8491.0449 C -7772.3203 8491.4258 -7772.5381 8490.9395 -7772.7129 8491.2344 C -7772.8174 8490.9658 -7772.3823 8490.6152 -7772.7354 8490.4814 C -7772.6792 8490.7393 -7773.1704 8490.832 -7772.9839 8491.2139 C -7773.1221 8491.1406 -7773.1367 8490.9375 -7773.0361 8490.7793 C -7773.2334 8490.6201 -7773.5151 8491.25 -7773.5801 8490.7383 C -7773.6479 8491.002 L -7773.71 8490.916 -7773.7983 8490.8506 -7773.8994 8490.709 C -7774.0732 8490.7041 -7774.46 8491.0664 -7774.4443 8490.668 C -7774.5 8490.709 -7774.8975 8490.6914 -7774.7441 8490.9658 C -7774.4971 8491.1338 -7774.46 8490.7656 -7774.3223 8491.1377 C -7774.4971 8490.834 -7774.6787 8491.1777 -7774.8213 8491.2793 C -7774.8447 8491.125 L -7774.9297 8491.1855 -7775.1255 8491.1514 -7775.1787 8491.3184 C -7775.1133 8491.2305 -7775.1475 8491.125 -7775.2148 8491.0879 C -7775.3042 8491.3223 L -7775.6494 8491.4395 -7775.3857 8490.9102 -7775.7217 8490.9785 C -7775.4663 8490.7969 L -7775.5225 8490.8359 -7775.6367 8490.6162 -7775.7979 8490.6895 C -7775.8604 8490.9033 -7775.9775 8491.1602 -7776.0313 8491.3262 C -7776.2207 8491.4199 -7776.1162 8491.085 -7776.3027 8491.3047 C -7776.0586 8491.0469 L -7776.0215 8490.9766 -7776.2231 8490.6934 -7776.4761 8490.6992 C -7776.6377 8490.7734 -7776.8887 8491.082 -7776.6338 8491.1992 C -7776.7607 8491.2031 -7776.9385 8491.0723 -7776.8379 8490.916 C -7777.1255 8490.9902 -7776.7998 8491.1465 -7777.0479 8491.2793 C -7777.1494 8491.1367 -7777.4658 8490.9336 -7777.6563 8490.7266 C -7777.3975 8490.3682 L -7777.5693 8490.3643 L -7777.3467 8490.0781 -7777.6826 8490.1465 -7777.5566 8489.8438 C -7777.6743 8489.7969 -7777.8169 8489.8994 -7777.9307 8489.9785 C -7777.5864 8490.4629 -7778.3159 8490.6406 -7778.2158 8491.082 C -7778.6875 8491.2031 -7778.5107 8490.0078 -7779.0024 8490.6992 C -7778.9219 8490.8145 -7779.1533 8491.1504 -7778.8564 8491.0225 C -7779.1494 8490.9746 -7779.0557 8491.4658 -7779.4014 8491.2832 C -7779.1455 8491.1016 -7779.6763 8490.8359 -7779.3066 8490.5723 C -7779.3311 8490.7178 -7779.1001 8490.6826 -7779.0435 8490.6426 C -7779.1641 8490.4727 -7779.0186 8490.1973 -7779.3184 8490.1973 C -7779.5015 8490.2393 -7779.7524 8490.248 -7779.7158 8490.4785 C -7779.7085 8490.7314 -7779.4365 8490.4512 -7779.5537 8490.707 C -7779.9185 8490.7949 -7779.9795 8490.4102 -7780.1304 8490.8594 C -7779.8999 8490.8232 -7779.8423 8491.084 -7779.8467 8491.2578 C -7780.1143 8491.3633 L -7780.0625 8491.1953 L -7780.4922 8491.0742 -7780.1895 8491.5 -7780.6055 8491.4551 C -7780.8008 8491.123 L -7780.7017 8490.8369 -7780.1953 8491.25 -7780.2695 8490.7842 C -7780.54 8490.7656 -7780.6299 8491.002 -7780.8848 8490.8818 C -7780.8281 8490.8418 -7780.7505 8490.8301 -7780.6943 8490.7891 C -7780.7915 8490.7734 -7780.8877 8490.1563 -7781.2734 8490.5176 C -7781.4727 8490.6582 -7781.3262 8490.6826 -7781.3311 8490.8574 C -7781.7656 8490.9102 -7781.8955 8491.0879 -7782.1753 8491.1152 C -7782.1177 8490.7754 -7782.6699 8491.082 -7782.3608 8490.7344 C -7782.2188 8490.9336 -7781.5903 8490.9141 -7781.4365 8490.5898 C -7781.5947 8490.1865 -7781.0952 8490.6465 -7781.0024 8490.2383 C -7781.3506 8490.2285 -7781.3335 8489.832 -7781.3896 8489.5723 C -7781.4863 8489.5537 -7781.5801 8489.6641 -7781.6377 8489.7041 C -7781.6787 8489.9482 -7781.5522 8489.9453 -7781.5449 8490.1973 C -7781.9336 8490.1309 -7782.3081 8490.2666 -7782.5225 8490.5059 C -7782.6523 8490.3848 -7782.6113 8490.1406 -7782.4575 8490.1162 C -7782.9199 8490.1895 -7783.4141 8490.1563 -7783.8535 8490.082 C -7783.5693 8490.4814 -7784.3433 8490.1758 -7784.1494 8490.5078 C -7783.9141 8490.5977 -7783.7119 8490.8818 -7783.8418 8491.0605 C -7783.9888 8491.0352 -7783.8369 8490.8857 -7783.8984 8490.8008 C -7784.0859 8491.0186 -7784.1895 8490.4512 -7784.3735 8490.7949 C -7783.9512 8490.666 -7784.2915 8490.3086 -7784.2139 8489.9961 C -7784.5186 8490.1719 -7784.2007 8489.7734 -7784.5024 8489.7734 C -7784.8057 8489.9473 -7785.1787 8490.084 -7785.5161 8490.1514 C -7785.9399 8489.8555 -7786.5898 8490.1465 -7786.9683 8490.1582 C -7787.1665 8490 -7787.0322 8489.6465 -7787.2471 8489.585 C -7787.4995 8489.5918 -7787.0601 8489.9658 -7787.4336 8489.8047 C -7787.3975 8489.7344 L -7787.5107 8489.8154 -7788.0825 8489.4941 -7788.1929 8490.002 C -7788.0776 8489.6191 L -7788.1475 8489.584 -7788.2119 8489.6719 -7788.2695 8489.7129 C -7788.2725 8489.5879 -7788.3535 8489.4746 -7788.2402 8489.3926 C -7788.4707 8489.1289 -7788.7241 8489.4346 -7788.9746 8489.4453 C -7788.8135 8489.6719 L -7789.2422 8489.8496 -7789.5293 8489.625 -7789.9443 8489.7041 C -7789.9316 8489.4824 L -7790.1787 8489.6152 L -7790.1182 8489.3994 -7790.3447 8489.2617 -7790.4751 8489.4414 C -7789.8335 8488.8984 L -7789.6553 8489.0293 -7790.0283 8489.166 -7789.9165 8489.3848 C -7789.8213 8489.5762 -7789.4375 8489.5146 -7789.3755 8489.3018 C -7789.5225 8489.2773 -7789.5293 8489.3262 -7789.6436 8489.4063 C -7789.6919 8489.0977 -7789.4688 8489.1094 -7789.3584 8488.9033 C -7789.4355 8488.916 -7789.5449 8488.8223 -7789.5615 8488.9199 C -7789.4102 8488.7695 -7789.2578 8488.7461 -7789.0059 8488.7383 C -7789.1763 8488.8594 -7788.9131 8488.9297 -7788.9775 8489.0176 C -7788.9575 8488.7461 -7788.7168 8488.6621 -7788.4053 8488.7383 C -7788.1831 8489.0527 -7787.8208 8488.5361 -7787.46 8488.623 C -7787.6064 8488.8984 -7787.7935 8489.1191 -7788.0127 8489.2305 C -7787.7861 8489.3682 -7787.7607 8489.2227 -7787.5337 8489.3613 C -7787.4238 8489.1563 -7787.3457 8488.8418 -7787.0503 8488.7168 C -7787.0342 8488.9199 L -7786.7666 8488.8154 -7786.7666 8488.5146 -7786.4258 8488.5723 C -7785.8418 8488.6719 -7785.2407 8488.6719 -7784.7949 8488.6973 C -7784.7783 8488.8994 L -7784.5303 8488.4658 -7783.9521 8488.7393 -7783.6182 8488.5469 C -7783.0503 8488.7422 -7782.3848 8488.3535 -7782.0938 8488.7031 C -7781.0913 8488.5469 -7780.2148 8488.3945 -7779.1768 8488.4688 C -7779.3516 8488.7637 L -7779.1655 8488.5469 -7779.2305 8488.9336 -7779.0479 8488.8896 C -7779.2578 8488.6543 -7778.7949 8488.584 -7778.6665 8488.4033 C -7778.2041 8488.6328 -7777.6104 8488.3818 -7777.2007 8488.1758 C -7777.1846 8488.3789 L -7776.7705 8487.998 -7776.2759 8488.332 -7775.7598 8488.3945 C -7775.7007 8488.4785 -7775.6074 8488.6689 -7775.4536 8488.6465 C -7775.1738 8488.3184 -7775.0273 8488.3418 -7774.6167 8488.1367 C -7774.3169 8488.1367 -7773.8301 8488.2178 -7773.5254 8488.3457 C -7772.3975 8487.8848 -7771.2456 8488.1797 -7770.0732 8487.9023 C -7769.9888 8488.1406 L -7768.8521 8487.6309 -7767.4541 8488.0938 -7766.4839 8487.832 C -7766.5776 8488.2393 L -7766.2734 8488.3643 -7765.8843 8488.1328 -7765.9619 8487.8438 C -7765.6567 8487.9688 -7765.2007 8487.6465 -7765.0068 8487.9814 C -7764.6953 8488.0566 -7764.6255 8487.793 -7764.3662 8487.7383 C -7763.7422 8487.8926 -7763.5107 8487.8574 -7762.9224 8487.7813 C -7763.0684 8487.7559 L -7763.1328 8487.8457 -7763.1387 8488.0186 -7762.9922 8488.0449 C -7762.7725 8487.9307 -7762.1846 8488.1543 -7762.4033 8487.668 C -7761.7754 8487.9482 -7760.9385 8487.4395 -7760.3271 8487.8184 C -7760.3789 8487.6855 -7760.2246 8487.6602 -7760.1602 8487.5703 C -7759.6089 8487.5645 -7759.0293 8487.8359 -7758.5898 8487.6094 C -7758.5024 8487.6758 -7758.7295 8487.8359 -7758.5049 8487.8496 C -7758.3721 8487.7979 -7758.5024 8487.6758 -7758.3384 8487.6016 C -7757.4453 8487.3535 -7756.5303 8487.8574 -7755.7188 8487.793 C -7754.2754 8487.5361 -7752.7695 8487.666 -7751.3867 8487.623 C -7751.4023 8487.7207 L -7750.9395 8487.3477 -7750.3159 8488.1025 -7749.9463 8487.541 C -7749.8369 8487.6338 -7749.5283 8487.585 -7749.6094 8487.7734 C -7749.2407 8487.5098 -7748.5771 8488.0215 -7748.0439 8487.6865 C -7748.0928 8487.6777 -7748.1211 8487.6973 -7748.1777 8487.7393 C -7747.6392 8487.9551 -7747.1641 8487.6602 -7746.5957 8487.8555 C -7746.6533 8487.8975 -7746.7583 8487.9277 -7746.7754 8488.0254 C -7746.5557 8488.2129 -7746.2549 8487.6133 -7746.1348 8488.084 C -7746.0088 8488.0801 -7746.0449 8487.8477 -7746.1221 8487.8613 C -7744.8779 8488.0449 -7743.5498 8487.7441 -7742.2549 8487.6367 C -7741.3271 8487.918 -7742.1982 8488.4297 -7741.4663 8488.0781 C -7741.4063 8488.1689 -7741.4229 8487.8984 -7741.4131 8487.9961 C -7741.1299 8487.8643 -7740.9717 8488.5215 -7740.7754 8488.2754 C -7740.8564 8487.9863 -7740.6445 8488.1133 -7740.6387 8487.9375 C -7740.0713 8488.125 -7739.9575 8488.3857 -7739.5098 8488.166 C -7739.5435 8488.3184 L -7739.0186 8487.8887 -7738.4102 8488.1191 -7737.9673 8487.623 C -7735.0728 8487.5322 -7732.2983 8487.2578 -7729.4761 8487.2002 C -7726.6865 8487.2949 -7723.9551 8487.0723 -7721.1221 8487.3359 C -7720.4585 8487.7354 -7720.4087 8487.7246 -7719.6797 8487.5625 C -7719.7095 8487.627 -7719.7549 8487.6426 -7719.7061 8487.7031 C -7719.6699 8487.375 -7719.1929 8487.6719 -7719.1235 8487.3594 C -7718.0762 8487.4199 -7717.1113 8487.3301 -7716.0337 8487.3281 C -7716.2041 8487.3633 -7716.2896 8487.6309 -7716.0869 8487.6094 C -7715.8755 8487.3994 L -7715.8408 8487.4922 L -7715.7021 8487.4434 -7715.5513 8487.2813 -7715.6943 8487.1758 C -7712.9873 8486.8926 -7710.3242 8487.5498 -7707.6729 8487.4697 C -7707.0435 8487.6064 -7706.1475 8487.4814 -7705.4629 8487.4141 C -7703.4355 8487.8506 -7701.6079 8488.2041 -7699.5479 8487.8984 C -7699.8169 8488.7461 -7700.6675 8488.9414 V f -7790.7578 8488.7422 m -7790.6855 8488.9063 -7790.4497 8488.9961 -7790.6377 8489.2139 C -7790.6611 8489.0605 -7790.7822 8488.8887 -7790.7578 8488.7422 C f -7784.4619 8490.4297 m -7784.4536 8490.3809 -7784.3721 8490.4961 -7784.3521 8490.5225 C -7784.4297 8490.5352 -7784.5024 8490.6729 -7784.5645 8490.5879 C -7784.4854 8490.5762 -7784.4976 8490.498 -7784.4619 8490.4297 C f -7782.8521 8490.5273 m -7782.8765 8490.6729 -7783.2207 8490.7891 -7783.4238 8490.8066 C -7782.8521 8490.5273 L f -7781.3521 8491.1289 m -7781.2227 8491.252 -7781.2583 8491.3193 -7781.4326 8491.3154 C -7781.4453 8491.2383 -7781.3877 8491.1992 -7781.3521 8491.1289 C f -7781.2456 8490.7969 m -7781.1211 8490.793 -7781.0591 8490.8789 -7780.9985 8490.9629 C -7781.0029 8490.8369 -7781.2871 8491.041 -7781.2456 8490.7969 C f -7777.9893 8491.2207 m -7777.9111 8491.209 -7777.7417 8491.0879 -7777.6689 8491.25 C -7777.7505 8491.1367 -7778.0498 8491.4346 -7777.9893 8491.2207 C f -7776.4761 8491 m -7776.4272 8491.0098 -7776.4072 8491.0361 -7776.3506 8490.9961 C -7776.2607 8491.0625 -7776.3555 8491.1689 -7776.4312 8491.1826 C -7776.4761 8491 L f -7748.9287 8490.4141 m -7749.0923 8490.4863 L -7749.0684 8490.3418 L -7748.9287 8490.4141 L f -7736.8574 8490.4063 m -7736.6943 8490.3145 -7736.7441 8490.543 -7736.7168 8490.5645 C -7736.8643 8490.5801 -7736.6621 8490.3848 -7736.8574 8490.4063 C f -7730.3486 8489.6777 m -7730.3984 8489.6816 L -7730.3818 8489.3818 L -7730.3486 8489.6777 L f U %AI8_EndBrushPattern %AI8_BeginBrushPattern (Unnamed Brush Pat 3) 0 A u 0 J 0 j 1 w 4 M []0 d 0 XR -7791.5 8489.5273 m -7577.5361 8489.5273 L -7577.5361 8438.7266 L -7791.5 8438.7266 L -7791.5 8489.5273 L n u 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA 1 J 3 w -7775.3838 8473.0879 m -7775.3838 8480.4658 l -7758.9268 8487.2832 l -7758.9268 8478.8281 l S 1 Ap 0 O 0.019608 0.996078 0.976471 0 0.913725 0.109804 0.141176 Xa 0 J -7783.1016 8462.9727 m -7783.1016 8467.2871 -7784.6455 8470.7842 -7786.5508 8470.7842 c -7788.4561 8470.7842 -7790 8467.2871 -7790 8462.9727 c -7790 8458.6582 -7788.4561 8455.1602 -7786.5508 8455.1602 c -7784.6455 8455.1602 -7783.1016 8458.6582 -7783.1016 8462.9727 c b u 0 Ap 0.145098 1 1 0.047059 0.784314 0.094118 0.121569 Xa 1 w -7782.1484 8461.7461 m -7785.5508 8461.752 L -7788.9541 8461.7617 L -7788.9814 8462.1582 -7789 8462.5605 -7789 8462.9727 c -7789 8462.9766 -7789 8462.9785 -7789 8462.9824 C -7785.5508 8463.709 L -7782.1631 8464.4209 L -7739.1699 8473.4727 L -7739.1699 8461.6445 L -7782.1484 8461.7461 L f 0.019608 0.996078 0.976471 0 0.913725 0.109804 0.141176 Xa -7782.5439 8459.1504 m -7785.5508 8459.7969 L -7788.8213 8460.502 L -7788.8809 8460.9082 -7788.9248 8461.3301 -7788.9541 8461.7617 C -7785.5508 8461.752 L -7782.1484 8461.7461 L -7739.1699 8461.6445 L -7739.1699 8449.8047 L -7782.5439 8459.1504 L f 0.235294 1 1 0.180392 0.65098 0.078431 0.101961 Xa -7782.1631 8464.4209 m -7785.5508 8463.709 L -7789 8462.9824 L -7788.9971 8467.293 -7787.4551 8470.7842 -7785.5508 8470.7842 c -7785.0303 8470.7842 -7784.5391 8470.5176 -7784.0967 8470.0488 C -7739.1699 8485.7168 L -7739.1699 8473.4727 L -7782.1631 8464.4209 L f 0.003922 0.819608 0.588235 0 0.937255 0.333333 0.356863 Xa -7784.0547 8455.9414 m -7784.5078 8455.4453 -7785.0137 8455.1602 -7785.5508 8455.1602 c -7787.0742 8455.1602 -7788.3643 8457.3984 -7788.8213 8460.502 C -7785.5508 8459.7969 L -7782.5439 8459.1504 L -7739.1699 8449.8047 L -7739.1699 8440.2266 L -7784.0547 8455.9414 L f U 1 Ap 0.698039 0.67451 0.639216 0.741176 0.137255 0.121569 0.12549 Xa 0 R 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 XA 3 w -7739.1699 8440.2266 m -7733.6235 8440.2266 -7729.1279 8450.4102 -7729.1279 8462.9727 c -7729.1279 8475.5352 -7733.6235 8485.7168 -7739.1699 8485.7168 c -7744.7158 8485.7168 -7749.2109 8475.5352 -7749.2109 8462.9727 c -7749.2109 8450.4102 -7744.7158 8440.2266 -7739.1699 8440.2266 c B u 0 Ap 0.666667 0 0.34902 0 0.25098 0.74902 0.713726 Xa 1 w -7577.6758 8443.9697 m -7614.0205 8453.5303 -7685.8193 8439.2686 -7722.4155 8439.8994 C -7724.4775 8440.0723 -7725.5117 8440.1914 -7727.5742 8440.501 c -7729.6367 8440.8096 -7730.6675 8440.998 -7732.7295 8441.458 c -7734.7925 8441.917 -7735.8223 8442.1846 -7737.8848 8442.8105 c -7738.2021 8442.9063 -7738.7109 8443.0723 -7739.3154 8443.2754 c -7740.5088 8443.6738 -7742.0908 8444.2207 -7743.4268 8444.6865 C -7745.9072 8448.2354 -7747.8555 8454.8018 -7747.8555 8463.0322 c -7747.8555 8471.7031 -7745.6973 8478.5488 -7743.0283 8481.9434 C -7741.9346 8481.6641 -7740.4951 8481.3887 -7739.3154 8481.1309 c -7738.7529 8481.0098 -7738.2515 8480.8906 -7737.8848 8480.7793 c -7735.8223 8480.1553 -7734.7925 8479.8857 -7732.7295 8479.4258 c -7730.6675 8478.9658 -7729.6367 8478.7793 -7727.5742 8478.4697 c -7725.5117 8478.1602 -7724.4775 8478.042 -7722.4155 8477.8682 C -7685.8193 8477.2354 -7614.0205 8491.5 -7577.6758 8481.9395 C -7586.0762 8477.3857 -7590.2754 8474.2617 -7598.6758 8467.1738 C -7591.1045 8459.8818 -7584.3809 8452.0498 -7577.6758 8443.9697 C f U U U %AI8_EndBrushPattern %AI8_BeginBrushPattern (Unnamed Brush Pat 5) 0 A u 0 J 0 j 1 w 4 M []0 d 0 XR -7791.5 8491.5 m -7567.7979 8491.5 L -7567.7979 8448.123 L -7791.5 8448.123 L -7791.5 8491.5 L n u 0 O 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa -7791.5 8491.5 m -7742.5986 8491.5 L -7749.1279 8488.708 L -7769.4326 8480.0273 L -7769.4326 8463.9482 L -7769.4326 8461.3193 L -7791.5 8461.3193 L -7788.9033 8463.9482 L -7775.9404 8477.0674 L -7788.7705 8488.708 L -7791.5 8491.5 L f 0.623529 0.85098 0 0 0.47451 0.278431 0.623529 Xa -7769.4316 8448.123 m -7769.4316 8451.3506 L -7769.4316 8476.5449 L -7769.4316 8480.0273 L -7589.8662 8480.0273 L -7589.8662 8476.5449 L -7589.8662 8451.3506 L -7589.8662 8448.123 L -7769.4316 8448.123 L f 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa -7583.3584 8477.0674 m -7570.3965 8463.9482 L -7567.7979 8461.3193 L -7589.8662 8461.3193 L -7589.8662 8463.9482 L -7589.8662 8480.0273 L -7610.1709 8488.708 L -7616.7002 8491.5 L -7567.7979 8491.5 L -7570.5283 8488.708 L -7583.3584 8477.0674 L f -7742.5986 8491.5 m -7769.4326 8480.0273 L N u 0 O 0.85098 1 0.262745 0.160784 0.286275 0.12549 0.407843 Xa -7597.0215 8480.0273 m -7616.7002 8480.0273 L -7616.7002 8488.4395 L -7616.7002 8491.5 L -7589.8662 8480.0273 L -7597.0215 8480.0273 L f -7769.4326 8480.0273 m -7742.5986 8491.5 L -7742.5986 8488.4395 L -7742.5986 8480.0273 L -7762.2764 8480.0273 L -7769.4326 8480.0273 L f U U U %AI8_EndBrushPattern %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginPluginObject (Adobe Brush Manager Order) (Adobe Brush Manager Order) ( Adobe Calligraphic Brush Tool/ 2 pt. Oval/ Adobe Calligraphic) - ( Brush Tool/ 5 pt. Oval/ Adobe Calligraphic Brush Tool/ 3 pt. ) - (Flat/ Adobe Calligraphic Brush Tool/ 5 pt. Flat/ Adobe Calligr) - (aphic Brush Tool/ 3 pt. Round/ Adobe Calligraphic Brush Tool/ ) - (7 pt. Round/ Adobe ArtOnPath Brush Tool/ Charcoal/ Adobe ArtOn) - (Path Brush Tool/ Pencil - Thin/ Adobe ArtOnPath Brush Tool/ Ba) - (nner 1/ Adobe ArtOnPath Brush Tool/ Banner 2/) . %AI8_EndPluginObject %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (2 pt. Oval) (1 2 2 26 74 15 15 0 1 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (3 pt. Flat) (1 3 3 9 9 15 15 0 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (3 pt. Round) (1 3 3 100 100 0 0 0 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (5 pt. Flat) (1 5 5 0 0 90 90 0 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (5 pt. Oval) (1 5 5 10 90 -65 35 0 1 1 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe Calligraphic Brush Tool) (7 pt. Round) (1 7 7 100 100 0 0 0 0 0 0) . %AI8_EndPluginObject %AI5_End_NonPrinting-- %AI5_Begin_NonPrinting Np %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Banner 1) (1 / Unnamed Brush Pat 5/ / / / / 5 0.47451 0.278431 0.623529 /) - ( 1 0 1 0 1 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Banner 2) (1 / Unnamed Brush Pat 3/ / / / / 5 0.25098 0.74902 0.713726 / ) - ( 1 0 1 0 1 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Charcoal) (1 / Unnamed Brush Pat 2/ / / / / 0 1 / 1 1 1.2 0 1 0 0 0) . %AI8_EndPluginObject %AI8_BeginPluginObject (Adobe ArtOnPath Brush Tool) (Pencil - Thin) (1 / Unnamed 18/ / / / / 0 1 / 1 1 1 0 1 0 0 0) . %AI8_EndPluginObject %AI5_End_NonPrinting-- %AI5_BeginPalette 0 0 Pb 0.74902 0.678431 0.670588 0.901961 ([Registration]) 0 Xs ([Registration]) Pc 0 0 0 0 1 1 1 Xa (White) Pc 0.74902 0.678431 0.670588 0.901961 0 0 0 Xa (Black) Pc 0 0.992157 1 0 1 0 0 Xa (RGB Red) Pc 0.062745 0 0.964706 0 1 1 0 Xa (RGB Yellow) Pc 0.627451 0 1 0 0 1 0 Xa (RGB Green) Pc 0.517647 0 0.12549 0 0 1 1 Xa (RGB Cyan) Pc 0.882353 0.768627 0 0 0 0 1 Xa (RGB Blue) Pc 0.270588 0.815686 0 0 1 0 1 Xa (RGB Magenta) Pc 0.168627 0.980392 0.92549 0.066667 0.756863 0.152941 0.176471 Xa (R=193 G=39 B=45) Pc 0.003922 0.992157 0.972549 0 0.929412 0.109804 0.141176 Xa (R=237 G=28 B=36) Pc 0 0.796078 0.968627 0 0.945098 0.352941 0.141176 Xa (R=241 G=90 B=36) Pc 0 0.501961 0.984314 0 0.968627 0.576471 0.117647 Xa (R=247 G=147 B=30) Pc 0 0.34902 0.870588 0 0.984314 0.690196 0.231373 Xa (R=251 G=176 B=59) Pc 0.047059 0 0.933333 0 0.988235 0.933333 0.129412 Xa (R=252 G=238 B=33) Pc 0.188235 0 0.980392 0 0.85098 0.878431 0.129412 Xa (R=217 G=224 B=33) Pc 0.501961 0 0.992157 0 0.54902 0.776471 0.247059 Xa (R=140 G=198 B=63) Pc 0.745098 0 0.996078 0 0.223529 0.709804 0.290196 Xa (R=57 G=181 B=74) Pc 0.862745 0.176471 1 0.039216 0 0.572549 0.270588 Xa (R=0 G=146 B=69) Pc 0.901961 0.333333 0.988235 0.258824 0 0.407843 0.215686 Xa (R=0 G=104 B=55) Pc 0.760784 0 0.74902 0 0.133333 0.709804 0.45098 Xa (R=34 G=181 B=115) Pc 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa (R=0 G=169 B=157) Pc 0.698039 0.14902 0 0 0.160784 0.670588 0.886275 Xa (R=41 G=171 B=226) Pc 0.87451 0.52549 0 0 0 0.443137 0.737255 Xa (R=0 G=113 B=188) Pc 0.992157 0.964706 0.035294 0.003922 0.180392 0.192157 0.572549 Xa (R=46 G=49 B=146) Pc 1 1 0.262745 0.247059 0.105882 0.078431 0.392157 Xa (R=27 G=20 B=100) Pc 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa (R=102 G=45 B=145) Pc 0.494118 0.992157 0.011765 0 0.576471 0.152941 0.560784 Xa (R=147 G=39 B=143) Pc 0.34902 1 0.372549 0.109804 0.619608 0 0.364706 Xa (R=158 G=0 B=93) Pc 0.117647 1 0.494118 0.007843 0.831373 0.078431 0.352941 Xa (R=212 G=20 B=90) Pc 0 0.968627 0.203922 0 0.929412 0.117647 0.47451 Xa (R=237 G=30 B=121) Pc 0.227451 0.27451 0.4 0 0.780392 0.698039 0.6 Xa (R=199 G=178 B=153) Pc 0.4 0.427451 0.52549 0.066667 0.6 0.52549 0.458824 Xa (R=153 G=134 B=117) Pc 0.505882 0.529412 0.607843 0.235294 0.45098 0.388235 0.341176 Xa (R=115 G=99 B=87) Pc 0.576471 0.603922 0.639216 0.419608 0.32549 0.278431 0.254902 Xa (R=83 G=71 B=65) Pc 0.227451 0.384314 0.635294 0.011765 0.776471 0.611765 0.427451 Xa (R=198 G=156 B=109) Pc 0.317647 0.490196 0.741176 0.098039 0.65098 0.486275 0.321569 Xa (R=166 G=124 B=82) Pc 0.360784 0.572549 0.839216 0.227451 0.54902 0.384314 0.223529 Xa (R=140 G=98 B=57) Pc 0.392157 0.639216 0.933333 0.356863 0.458824 0.298039 0.141176 Xa (R=117 G=76 B=36) Pc 0.415686 0.698039 0.968627 0.490196 0.376471 0.219608 0.07451 Xa (R=96 G=56 B=19) Pc 0.478431 0.733333 0.835294 0.682353 0.258824 0.129412 0.043137 Xa (R=66 G=33 B=11) Pc Bb 2 (Linear Gradient 1) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Linear Gradient 1) Pc Bb 0 0 0 0 Bh 2 (Radial Gradient 1) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Radial Gradient 1) Pc Bb 2 (Red Linear Gradient) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Red Linear Gradient) Pc Bb 2 (Gray Linear Gradient) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Gray Linear Gradient) Pc Bb 0 0 0 0 Bh 2 (Purple Radial Gradient) 0 0 0 1 1 0 0 1 0 0 Bg 0 BB (Purple Radial Gradient) Pc (Checked Pattern) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p (Checked Pattern) Pc 0.007843 0.992157 0.972549 0 0.92549 0.109804 0.141176 Xa (R=236 G=28 B=36) Pc 0.784314 0.090196 0.458824 0 0 0.662745 0.615686 Xa (R=0 G=169 B=157) Pc 0.745098 0.984314 0.007843 0.003922 0.4 0.176471 0.568627 Xa (R=102 G=45 B=145) Pc 0.486274 0.364706 0.337255 0.015686 0.545098 0.572549 0.596078 Xa (R=139 G=146 B=152 1) Pc 0 g (K=100) Pc 0.1 g (K=90) Pc 0.2 g (K=80) Pc 0.3 g (K=70) Pc 0.4 g (K=60) Pc 0.5 g (K=50) Pc 0.6 g (K=40) Pc 0.7 g (K=30) Pc 0.8 g (K=20) Pc 0.9 g (K=10) Pc 0.95 g (K=5) Pc PB %AI5_EndPalette %%EndSetup %AI5_BeginLayer 1 1 1 1 0 0 1 0 79 128 255 0 50 Lb (Layer 1) Ln 0 A u *u 0 O 0 g 0 J 0 j 1 w 4 M []0 d 0 XR 316.9551 360.3037 m 324.6411 360.3037 331.1504 357.6377 336.4824 352.3062 c 341.8135 347.0073 344.48 340.5142 344.48 332.8281 c 344.48 325.1411 341.8628 318.6978 336.6294 313.4971 c 331.1016 308.0669 324.543 305.3525 316.9551 305.3525 c 309.5293 305.3525 303.0859 308.0508 297.624 313.4478 c 292.2271 318.8447 289.5283 325.3042 289.5283 332.8281 c 289.5283 340.3179 292.2271 346.811 297.624 352.3062 c 302.9551 357.6377 309.3989 360.3037 316.9551 360.3037 c f 1 D 317.0532 355.3481 m 310.8052 355.3481 305.5229 353.1406 301.2056 348.7246 c 296.7236 344.1777 294.4839 338.8789 294.4839 332.8281 c 294.4839 326.7109 296.7075 321.4453 301.1563 317.0293 c 305.6045 312.5806 310.9033 310.3569 317.0532 310.3569 c 323.1694 310.3569 328.501 312.5967 333.0479 317.0786 c 337.3657 321.2651 339.5244 326.5151 339.5244 332.8281 c 339.5244 339.1084 337.3325 344.4072 332.9497 348.7246 c 328.5991 353.1406 323.3003 355.3481 317.0532 355.3481 c f 0 D 304.7871 336.7041 m 305.3101 340.0728 306.6675 342.6816 308.8594 344.5298 c 311.0503 346.3774 313.7168 347.3018 316.8569 347.3018 c 321.1743 347.3018 324.6089 345.9111 327.1602 343.1313 c 329.7114 340.3511 330.9873 336.7852 330.9873 332.4355 c 330.9873 328.2158 329.6626 324.708 327.0132 321.9111 c 324.3638 319.1147 320.9292 317.7163 316.7095 317.7163 c 313.6016 317.7163 310.9199 318.6484 308.6631 320.5132 c 306.4063 322.3774 305.0488 325.0269 304.5908 328.4614 c 311.5088 328.4614 L 311.6724 325.125 313.6836 323.457 317.5439 323.457 c 319.4731 323.457 321.0273 324.291 322.2046 325.959 c 323.3823 327.6274 323.9712 329.8511 323.9712 332.6318 c 323.9712 335.5425 323.4316 337.7588 322.3521 339.2798 c 321.2725 340.8008 319.7188 341.5615 317.6909 341.5615 c 314.0273 341.5615 311.9668 339.9424 311.5088 336.7041 c 313.5205 336.7041 L 308.0742 331.2578 L 302.6284 336.7041 l 304.7871 336.7041 L f *U U LB %AI5_EndLayer-- %AI3_BeginCrops userdict /AI3_noCropMarks known not { 0 A u u 0 R 0.74902 0.678431 0.670588 0.901961 ([Registration]) 0 XS 0 J 0 j 0.5 w 4 M []0 d 0 XR 275 299.457 m 248 299.457 L S 284 290.457 m 284 263.457 L S U u 275 365.457 m 248 365.457 L S 284 374.457 m 284 401.457 L S U u 359 365.457 m 386 365.457 L S 350 374.457 m 350 401.457 L S U u 359 299.457 m 386 299.457 L S 350 290.457 m 350 263.457 L S U U } if %AI3_EndCrops %%PageTrailer gsave annotatepage grestore showpage %%Trailer Adobe_Illustrator_AI5 /terminate get exec +Adobe_shading_AI8 /terminate get exec +Adobe_ColorImage_AI6 /terminate get exec +Adobe_pattern_AI5 /terminate get exec +AGM_Gradient /terminate get exec +Adobe_cshow /terminate get exec +Adobe_level2_AI5 /terminate get exec +%%EOF \ No newline at end of file diff --git a/lectures/images/hol-family.eps b/lectures/images/hol-family.eps new file mode 100644 index 0000000..f2c892d --- /dev/null +++ b/lectures/images/hol-family.eps @@ -0,0 +1,3452 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%BoundingBox: 106 370 265 718 +%%HiResBoundingBox: 106.500000 370.000000 264.500000 718.000000 +%%Creator: dvips(k) 5.995 Copyright 2015 Radical Eye Software +%%Title: hol-family.dvi +%%CreationDate: Mon Nov 11 12:58:13 2019 +%%PageOrder: Ascend +%%DocumentFonts: URWPalladioL-Roma +%%DocumentPaperSizes: a4 +%%EndComments +% EPSF created by ps2eps 1.68 +%%BeginProlog +save +countdictstack +mark +newpath +/showpage {} def +/setpagedevice {pop} def +%%EndProlog +%%Page 1 1 +%DVIPSWebPage: (www.radicaleye.com) +%DVIPSCommandLine: dvips hol-family.dvi +%DVIPSParameters: dpi=600 +%DVIPSSource: TeX output 2019.11.11:1258 +%%BeginProcSet: tex.pro 0 0 +%! +/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/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]{Ci}imagemask +restore}B/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 +/dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3 +def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90 +rotate}{show}ifelse}ifelse}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: pstricks.pro 0 0 +% $Id: pstricks.pro 919 2014-05-19 18:42:47Z herbert $ +% +%% PostScript prologue for pstricks.tex. +%% Version 1.23, 2014/07/31 +%% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN archives +%% in directory macros/latex/base/lppl.txt. +% +% +% Define the follwing gs-functions if not known, eg when using distiller +% +systemdict /.setopacityalpha known not {/.setopacityalpha { pop } def } if +systemdict /.setblendmode known not {/.setblendmode { pop } def } if +systemdict /.setshapealpha known not {/.setshapealpha { pop } def } if +% +/tx@Dict 200 dict def % the main PSTricks dictionary +tx@Dict begin +/ADict 25 dict def % The arrow dictionary +/CM { matrix currentmatrix } bind def +/SLW /setlinewidth load def +/CLW /currentlinewidth load def +/CP /currentpoint load def +/ED { exch def } bind def +/L /lineto load def +/T /translate load def +/TMatrix { } def +/RAngle { 0 } def +/Sqrt { dup 0 lt { pop 0 } { sqrt } ifelse } def % return 0 for negative arguments +/Atan { /atan load stopped { pop pop 0 } if } def % return 0 if atan not known +/ATAN1 {neg -1 atan 180 sub } def % atan(x) (only one parameter) +/Div { dup 0 eq { pop } { div } ifelse } def % control the division +/Log { dup 1e-20 lt { pop -1e30 }{ log } ifelse } def % control the log +/tan { dup cos abs 1.e-10 lt + { pop 1.e10 } % return 1.e10 as infinit + { dup sin exch cos div } ifelse % default sin/cos +} def +/Tan { dup sin exch cos Div } def % sin(x)/cos(x) x in degrees +/Acos {dup dup mul neg 1 add dup 0 lt { % arc cos, returns 0 when negative root + pop pop 0 }{ sqrt exch atan} ifelse } def +/Acos2 { 2 dict begin + /x ED /y ED + y abs 1.0e-20 lt { 1.0e30 } if + x y div + dup dup mul neg 1 add dup 0 lt { % arc cos needs two values x,y + pop pop 0 }{ sqrt exch atan} ifelse + y 0 lt { 180 add } if +} def +/NET { neg exch neg exch T } def % change coordinate system to the negative one +/Pyth { dup mul exch dup mul add sqrt } def % Pythagoras, expects 2 parameter +/Pyth2 { % Pythagoras, xA yA xB yB + 3 -1 roll % xA xB yB yA + sub % xA xB yB-yA + 3 1 roll % yB-yA xA xB + sub % yB-yA xA-xB + Pyth } def +/PtoC { 2 copy cos mul 3 1 roll sin mul } def % Polar to Cartesian +/PtoCab { dup cos 4 -1 roll mul 3 1 roll sin mul } def % Polar to Cartesian (Ellipse) a b phi-> x y +%/Rand { rand 4294967295 div } def % a real random number +/Rand { rand 2147483447 div } def % a real random number between 0 and 1 +%----------------- hv added 20050516 --------------- +/PiDiv2 1.57079632680 def +/Pi 3.14159265359 def +/TwoPi 6.28318530718 def +/Euler 2.71828182846 def +%/e Euler bind def +% +/RadtoDeg { 180 mul Pi div } bind def % convert from radian to degrees +/DegtoRad { Pi mul 180 div } bind def % viceversa +% +/startGlobal { true setglobal globaldict begin } bind def +/endGlobal { end false setglobal } bind def +/pssetRGBcolor /setrgbcolor load def +/pssetCMYKcolor /setcmykcolor load def +/pssetGraycolor /setgray load def +% +%----------------- hv end--------------------------- +/PathLength@ { /z z y y1 sub x x1 sub Pyth add def /y1 y def /x1 x def } def +% +/PathLength { + flattenpath /z 0 def + { /y1 ED /x1 ED /y2 y1 def /x2 x1 def } + { /y ED /x ED PathLength@ } + {} + { /y y2 def /x x2 def PathLength@ } + /pathforall load stopped { pop pop pop pop } if + z +} def +% +/STP { .996264 dup scale } def % BP/PT scaling +/STV { SDict begin normalscale end STP } def % +% +/DashLine { + dup 0 gt + { /a .5 def PathLength exch div } + { pop /a 1 def PathLength } ifelse + /b ED % pattern should fit evenly in b + dup /X ED % pattern array + 0 get /y ED % length of first black segment + /z 0 X {add} forall def % length of the full pattern + %% Computation of the scaling factor as described by van Zandt: + b a .5 sub 2 mul y mul sub z Div round + z mul a .5 sub 2 mul y mul add b exch Div + %%%% scaling factor on stack. + /z ED %% now, z is the scaling factor + false % for the length test below + X { z mul } forall X astore %% modification TN 04-08-07 + %%% Checking whether at least one dash in X has positive length: + {0 gt or} forall + { X 1 a sub y mul } + { [ 1 0 ] 0 } + ifelse + setdash stroke +} def +% +/DotLine { + /b PathLength def + /a ED /z ED /y CLW def + /z y z add def + a 0 gt { + /b b a div def + }{ + a 0 eq { + /b b y sub def + }{ a -3 eq { + /b b y add def } if + } ifelse + } ifelse + [ 0 b b z Div round Div dup 0 le { pop 1 } if ] + a 0 gt { 0 }{ y 2 div a -2 gt { neg }if } ifelse + setdash 1 setlinecap stroke +} def +% +/SymbolLine { % on stack [ x y x y ... + counttomark % number of elements + 2 div cvi /n ED % n pairs + /YA ED /XA ED % the start point + n 1 sub { + /YB ED /XB ED + /XLength XB XA sub def + /YLength YB YA sub def + /PAngle YLength XLength Atan def + /XYLength XLength YLength Pyth def + %% for negative SymStep we calculate the distance + SymStep 0 lt + { %XYLength SymStep div abs cvi + /nSym SymStep abs cvi def } + { /nSym XYLength SymStep div cvi def } + ifelse + 0.5 setflat + /Shift Symbol stringwidth pop 2 div def + /deltaX XLength nSym div def + /deltaY YLength nSym div def + curveticks + { XA YA moveto } + { XA Shift sub YA Shift sub moveto } + ifelse + nSym { + gsave + curveticks + { PAngle 180 sub CorrAngle sub tickAngle add /rotAngle ED + currentpoint translate rotAngle rotate + 0 SymbolWidth 2 div moveto 0 SymbolWidth 2 div neg lineto + SymbolLinewidth setlinewidth stroke + } + { + rotateSymbol { PAngle 180 sub CorrAngle sub rotate } if + Symbol show + } + ifelse + grestore + deltaX deltaY rmoveto + } repeat + /YA YB def /XA XB def + } repeat + curveticks + { XA YA moveto } + { XA Shift sub YA Shift sub moveto } + ifelse + gsave + curveticks + { PAngle 180 sub CorrAngle sub tickAngle add /rotAngle ED + XA YA translate rotAngle rotate + 0 SymbolWidth 2 div moveto 0 SymbolWidth 2 div neg lineto + SymbolLinewidth setlinewidth stroke + } + { + rotateSymbol { PAngle 180 sub CorrAngle sub rotate } if + Symbol show + } + ifelse + grestore + pop % delete the mark symbol +} def +% +/LineFill { % hv ------------ patch 7 ------------- + gsave + abs /hatchWidthInc ED + abs /hatchSepInc ED + abs CLW add /a ED + a 0 dtransform round exch round exch + 2 copy idtransform + exch Atan rotate + idtransform pop /a ED + .25 .25 itransform pathbbox + /y2 ED + a Div ceiling cvi /x2 ED /y1 ED + a Div cvi /x1 ED /y2 y2 y1 sub def + clipType % must be defined in pstricks.tex: clip -- eoclip + newpath + 2 setlinecap + systemdict + /setstrokeadjust known { true setstrokeadjust } if + x2 x1 sub 1 add { + x1 a mul y1 moveto 0 y2 rlineto stroke + /x1 x1 1 add + hatchWidthInc 0 gt { CLW add } if + def + hatchSepInc 0 gt hatchWidthInc 0 gt or { + /a a hatchSepInc add def + CLW hatchWidthInc add SLW + } if + } repeat + grestore + pop pop } def +% +/DotFill {% on stack: dot radius + /dotRadius ED + abs CLW add /a ED + a 0 dtransform round exch round exch + 2 copy idtransform + exch Atan rotate + idtransform pop /a ED + .25 .25 itransform + pathbbox % llx lly urx ury of smallest bounding box + /y2 ED /x2 ED /y1 ED /x1 ED + y2 y1 sub a div 2 add cvi /Ny ED + x2 x1 sub a div 2 add cvi /Nx ED + clipType % must be defined in pstricks.tex: clip -- eoclip + newpath + /yA y1 dotRadius add CLW add def + /xA0 x1 dotRadius add CLW add def + Ny { + /xA xA0 def + Nx { + newpath + xA yA dotRadius 0 360 arc + SolidDot { gsave fill grestore } if + stroke + xA a add /xA ED + } repeat + yA a add /yA ED + } repeat + grestore +} def +% +/PenroseFill {% on stack: scaling factor + /Scale ED +% 1 exch div round /penroseFactor ED +% a 0 dtransform round exch round exch +% 2 copy idtransform +% exch Atan rotate +% idtransform pop /a ED +% .25 .25 itransform pathbbox +% /y2 ED +% a Div ceiling cvi /x2 ED /y1 ED +% a Div cvi /x1 ED /y2 y2 y1 sub def + clip + newpath +gsave + 220 150 translate + Scale dup scale + systemdict /setstrokeadjust known { true setstrokeadjust } if + /I/S/L/W/G/+/Z/F/E/D[/def/exch/for{E D}/add{s E get mul} + { Z -36.2001 1 33 }{25 E S rlineto}{/q Z dup q G E q 1 + G}{Z 2 2}]{cvx def}forall + [0 72 1008 {dup sin E cos }F ]1 setlinejoin/s W{/a W{/b I 10{/i I 4{/m I moveto + i m +/j I 10{/l Z b m l + G a l G sub s m get div .2 + floor .3 + 25 + mul j l + S rmoveto}F i L j L stroke }F}F}F}F + grestore +% pop pop +} def +% +/PenroseFillA {% on stack: scaling factor, border color, kite color, dart color + /Scale ED + Scale dup scale + /border_colour ED + /kite_colour ED + /dart_colour ED + clip + newpath + gsave + 100 100 translate + 6 + Scale 1 lt { 1 Scale dup add div mul cvi } if %%%% Number of iterations + 10 %%%% Long side length in millimeters + /border_width { L 0.06 mul }def %%%% Choose the scalefactor for the borders + /L exch 25.4 div 72 mul def %%%% Conversion: mm -> inches -> points + /f{-1 5 sqrt add 2 div}bind def %%%% The reciprocal of the golden ratio + /l{L f mul}bind def %%%% Short side length l = L*f + /Ll{L l add}bind def %%%% Ll = L + l + /c{36 cos L mul}bind def %%%% c = L*cos(36) + /s{36 sin L mul}bind def %%%% s = L*sin(36) + /draw_tile { 0 0 moveto c s lineto 0 lineto gsave closepath gsave fill grestore + 0 setlinewidth stroke grestore border_colour stroke } bind def + /half_kite { dup dup 0 gt{ 1 sub gsave f f neg scale -36 rotate half_dart + Ll 0 translate 144 rotate kite grestore } + { kite_colour L draw_tile }ifelse + pop } bind def + /half_dart { dup dup 0 gt{ 1 sub gsave f f scale half_kite + -144 rotate Ll neg 0 translate half_dart grestore } + { dart_colour l draw_tile }ifelse + pop } bind def + /kite{ gsave half_kite 1 -1 scale half_kite grestore }bind def + border_width setlinewidth 1 setlinejoin 1 setlinecap +% 450 0 translate + dup f exch neg exp dup scale + 5 {kite 72 rotate } repeat stroke + grestore +} def +% +% +/TruchetFill { % on stack: scaling factor + 10 dict begin + dup dup scale + 1 exch div round /penroseFactor ED + a 0 dtransform round exch round exch + 2 copy idtransform + exch Atan rotate + idtransform pop /a ED + .25 .25 itransform pathbbox + /y2 ED + a Div ceiling cvi /x2 ED /y1 ED + a Div cvi /x1 ED /y2 y2 y1 sub def + clip + newpath + systemdict + /setstrokeadjust known { true setstrokeadjust } if + /ma a neg def + /ha a 2 div def + /mha ha neg def + /tile { + rand dup 2 idiv 2 mul eq { 90 rotate } if + mha mha moveto ha mha lineto + ha ha lineto mha ha lineto +% closepath .1 setlinewidth stroke + contents + } def + /contents{ + 0 ha moveto ha 0 lineto + 0 mha moveto mha 0 lineto +% 1 setlinewidth stroke + } def + /dotiling { + f ma mul a f a mul { + /i exch def + f ma mul a f a mul { + /j exch def + gsave i j translate + tile stroke grestore + } for + } for + } def +% + /f 3 def + 5 srand dotiling + end % local user dict +} def +% +/BeginArrow { + ADict begin % hold it local, for end see EndArrow + /@mtrx CM def + gsave + 2 copy T + 2 index sub neg exch + 3 index sub exch Atan + rotate newpath +} def +% +/EndArrow { @mtrx setmatrix CP grestore end } def % end the ADict +% +/Arrow { + CLW mul add dup + 2 div /w ED + mul dup /h ED + mul /a ED + { 0 h T 1 -1 scale } if + w neg h moveto + 0 0 L w h L w neg a neg rlineto + gsave fill grestore +} def +% +/ArrowD { % the sides are drawn as curves (hv 20071211) + CLW mul add dup + 2 div /w ED + mul dup /h ED + mul /Inset ED + { 0 h T 1 -1 scale } if % changes the direction +% we use y=w/h^2 * x^2 as equation for the control points +% for the coordinates the arrow is seen from top to bottom +% the bottom (tip) is (0;0) + w neg h moveto % lower left of > + w 9 div 4 mul neg h 3 div 2 mul + w 9 div neg h 3 div + 0 0 curveto % tip of > + w 9 div h 3 div + w 9 div 4 mul h 3 div 2 mul + w h curveto % upper left of > + w neg Inset neg rlineto % move to x=0 and inset + gsave fill grestore +} def +% +/Tbar { + CLW mul add /z ED + z -2 div CLW 2 div moveto + z 0 rlineto stroke + 0 CLW moveto +} def +% +/Bracket { + CLW mul add dup CLW sub 2 div + /x ED mul CLW add /y ED /z CLW 2 div def + x neg y moveto + x neg CLW 2 div L x CLW 2 div L x y L stroke + 0 CLW moveto +} def +% +/RoundBracket { + CLW mul add dup 2 div + /x ED mul /y ED /mtrx CM def + 0 CLW 2 div T x y mul 0 ne { x y scale } if + 1 1 moveto + .85 .5 .35 0 0 0 curveto + -.35 0 -.85 .5 -1 1 curveto + mtrx setmatrix stroke 0 CLW moveto +} def +% +/SD { 0 360 arc fill } def +% +/EndDot { % DS is the dot size + { /z DS def } { /z 0 def } ifelse % outer or inner dimen + /b ED % the color definition + 0 z DS SD + b { 0 z DS CLW sub SD } if + 0 DS z add CLW 4 div sub + moveto +} def +% +/Shadow { [ { /moveto load } { /lineto load } { /curveto load } { + /closepath load } /pathforall load stopped { pop pop pop pop CP /moveto + load } if ] cvx newpath 3 1 roll T exec } def +% +/NArray { % holds the coordinates and on top of stack the showpoints boolean + /showpoints ED + counttomark 2 div dup cvi /n ED % n 2 div on stack + n eq not { exch pop } if % even numbers of points? delete one + ] aload /Points ED + showpoints not { Points aload pop } if +% { ] aload /Points ED } +% { n 2 mul 1 add -1 roll pop } ifelse % delete the mark symbol +} def +% +/Line { + NArray n 0 eq not + { n 1 eq { 0 0 /n 2 def } if ArrowA /n n 2 sub def + n { Lineto } repeat + CP 4 2 roll ArrowB L pop pop + } if +} def +% +/LineToYAxis { + /Ox ED % Save the x origin value + NArray % all x-y pairs on stack + n { 2 copy moveto % go to current point + Ox exch Lineto % line to y-axis + pop % delete old x-value + } repeat +} def +% +/LineToXAxis{ + /Oy ED % Save the y origin value + NArray % all x-y pairs on stack + n 0 eq not + { n 1 eq { 0 0 /n 2 def } if + ArrowA + /n n 2 sub def + CP 2 copy moveto pop Oy Lineto + n { 2 copy moveto pop Oy Lineto } repeat + CP + 4 2 roll + ArrowB + 2 copy moveto pop Oy + L + pop pop } if +} def +% +/Arcto { + /a [ 6 -2 roll ] cvx def + a r + /arcto load stopped { 5 } { 4 } ifelse { pop } repeat + a +} def +% +/CheckClosed { + dup n 2 mul 1 sub index eq 2 index n 2 mul 1 add index eq + and { pop pop /n n 1 sub def } if +} def +% +/Polygon { + NArray n 2 eq { 0 0 /n 3 def } if + n 3 lt + { n { pop pop } repeat } + { n 3 gt { CheckClosed } if + n 2 mul -2 roll + /y0 ED /x0 ED /y1 ED /x1 ED + x1 y1 + /x1 x0 x1 add 2 div def + /y1 y0 y1 add 2 div def + x1 y1 moveto + /n n 2 sub def + n { Lineto } repeat + x1 y1 x0 y0 6 4 roll Lineto + Lineto pop pop closepath } ifelse +} def +% +/SymbolPolygon { % on stack [ x y x y ... + counttomark % number of elements + 2 add /m ED + 2 copy m 2 roll % copy last two + m 2 div cvi /n ED % n pairs + /YA ED /XA ED % the start point + n 1 sub { + /YB ED /XB ED + /XLength XB XA sub def + /YLength YB YA sub def + /PAngle YLength XLength Atan def + /XYLength XLength YLength Pyth def + /nSym XYLength SymStep Div cvi def + /Shift Symbol stringwidth pop 2 Div def + /deltaX XLength nSym Div def + /deltaY YLength nSym Div def + XA Shift sub YA Shift sub moveto + nSym { + gsave rotateSymbol { PAngle 180 sub CorrAngle sub rotate } if + Symbol show + grestore + deltaX deltaY rmoveto + } repeat +% XB Shift sub YB Shift sub moveto Symbol show + /YA YB def /XA XB def + } repeat + pop % delete the mark symbol +} def +% +/Diamond { + /mtrx CM def + T rotate + /h ED + /w ED + dup 0 eq { pop } { CLW mul neg + /d ED + /a w h Atan def + /h d a sin Div h add def + /w d a cos Div w add def } ifelse + mark w 2 div h 2 div w 0 0 h neg w neg 0 0 h w 2 div h 2 div + /ArrowA { moveto } def + /ArrowB { } def + false Line + closepath mtrx setmatrix } def +% +/Triangle { + /mtrx CM def + translate + rotate /h ED 2 div /w ED + dup CLW mul /d ED + /h h d w h Atan sin Div sub def + /w w d h w Atan 2 div dup cos exch sin Div mul sub def + mark + 0 d w neg d 0 h w d 0 d + /ArrowA { moveto } def + /ArrowB { } def + false + Line + closepath + mtrx +% DG/SR modification begin - Jun. 1, 1998 - Patch 3 (from Michael Vulis) +% setmatrix } def + setmatrix pop +} def +% DG/SR modification end +% +/CCA { + /y ED /x ED + 2 copy y sub /dy1 ED + x sub /dx1 ED + /l1 dx1 dy1 Pyth def +} def +% +/CC { + /l0 l1 def + /x1 x dx sub def + /y1 y dy sub def + /dx0 dx1 def + /dy0 dy1 def + CCA + /dx dx0 l1 c exp mul dx1 l0 c exp mul add def + /dy dy0 l1 c exp mul dy1 l0 c exp mul add def + /m dx0 dy0 Atan dx1 dy1 Atan sub 2 div cos abs b exp a mul dx dy Pyth Div 2 div def + /x2 x l0 dx mul m mul sub def + /y2 y l0 dy mul m mul sub def + /dx l1 dx mul m mul neg def + /dy l1 dy mul m mul neg def +} def +% +/IC { + /c c 1 add def + c 0 lt { /c 0 def } { c 3 gt { /c 3 def } if } ifelse + /a a 2 mul 3 div 45 cos b exp div def + CCA + /dx 0 def + /dy 0 def +} def +% +/BOC { IC CC x2 y2 x1 y1 ArrowA CP 4 2 roll x y curveto } def +/NC { CC x1 y1 x2 y2 x y curveto } def +/EOC { x dx sub y dy sub 4 2 roll ArrowB 2 copy curveto } def +/BAC { IC CC x y moveto CC x1 y1 CP ArrowA } def +/NAC { x2 y2 x y curveto CC x1 y1 } def +/EAC { x2 y2 x y ArrowB curveto pop pop } def +% +/OpenCurve { + NArray n 3 lt + { n { pop pop } repeat } + { BOC /n n 3 sub def n { NC } repeat EOC } ifelse +} def +% +/CurvePath { + %% for negative SymStep we calculate the distance + SymStep 0 lt { gsave PathLength SymStep div abs /SymStep ED grestore } if + 0.5 setflat + flattenpath /z 0 def /z0 0 def + { /y1 ED /x1 ED /y2 y1 def /x2 x1 def + x1 Shift sub y1 Shift sub moveto + gsave + curveticks + { x1 y1 translate startAngle rotate + 0 SymbolWidth 2 div moveto 0 SymbolWidth 2 div neg lineto + SymbolLinewidth setlinewidth stroke + } + { startAngle rotate Symbol show } + ifelse + grestore /z0 z def } + { /y ED /x ED PathLength@ z z0 sub SymStep ge { + x Shift sub y Shift sub moveto + gsave + curveticks + { y yOld sub x xOld sub Atan 180 sub CorrAngle sub /rotAngle ED + x y translate rotAngle rotate + 0 SymbolWidth 2 div moveto 0 SymbolWidth 2 div neg lineto + SymbolLinewidth setlinewidth stroke + } + { + rotateSymbol { y yOld sub x xOld sub Atan 180 sub CorrAngle sub rotate } if + Symbol show + } + ifelse + grestore /z0 z def } if + /yOld y def /xOld x def } + {} %% the lineto part + { /y y2 def /x x2 def PathLength@ + x Shift sub y Shift sub moveto + gsave + curveticks + { y yOld sub x xOld sub Atan 180 sub /rotAngle ED + x y translate rotAngle rotate + 0 SymbolWidth 2 div moveto 0 SymbolWidth 2 div neg lineto + SymbolLinewidth setlinewidth stroke + } + { + x Shift sub y Shift sub moveto + rotateSymbol { y yOld sub x xOld sub Atan 180 sub CorrAngle sub rotate } if + Symbol show + } + ifelse + grestore + } + pathforall +% curveticks +% { gsave +% x y translate rotAngle rotate +% 0 SymbolWidth 2 div moveto 0 SymbolWidth 2 div neg lineto +% SymbolLinewidth setlinewidth stroke grestore +% } if + z +} def +% +/OpenSymbolCurve { + OpenCurve + 0.1 setflat + /Shift Symbol stringwidth pop 2 div def + CurvePath +} def +% +/AltCurve { + { false NArray n 2 mul 2 roll + [ n 2 mul 3 sub 1 roll ] aload + /Points ED + n 2 mul -2 roll } + { false NArray } ifelse + n 4 lt { n { pop pop } repeat } { BAC /n n 4 sub def n { NAC } repeat EAC } ifelse +} def +% +/AltOpenSymbolCurve { + AltCurve + 0.1 setflat + /Shift Symbol stringwidth pop 2 div def + CurvePath +} def +% +/ClosedCurve { + NArray n 3 lt + { n { pop pop } repeat } + { n 3 gt { CheckClosed } if + 6 copy n 2 mul 6 add 6 roll + IC CC x y moveto n { NC } repeat + closepath pop pop + } ifelse +} def +% +/ClosedSymbolCurve { + ClosedCurve + 0.1 setflat + /Shift Symbol stringwidth pop 2 div def + CurvePath +} def +% +/CalcBezierSpline {% Christoph Bersch + 10 dict begin + /getX { Points exch 2 mul get } def + /getY { Points exch 2 mul 1 add get } def + /n Points length 1 sub 2 idiv def + /GetFirstControlPoints { + /x n array def + /tmp n array def + /b 2 def + x 0 rhs 0 get b div put + 1 1 n 1 sub { + /i exch def + tmp i 1 b div dup 4 1 roll put + i n 1 sub lt { 4 }{ 3.5 } ifelse exch sub /b exch def + x i rhs i get x i 1 sub get sub b div put + } for + 1 1 n 1 sub { + n exch sub + dup dup x exch 1 sub 2 copy 6 2 roll + get 3 1 roll tmp exch get + exch x exch get mul sub + put + } for + x + } def + % + n 1 eq { + 0 getX 2 mul 1 getX add 3 div + 0 getY 2 mul 1 getY add 3 div + exch dup 3 1 roll 2 mul 0 getX sub + exch dup 3 1 roll 2 mul 0 getY sub + [ 0 getX 0 getY 7 3 roll 1 getX 1 getY ] /outPoints exch def + } { + /outPoints 6 n mul 2 add array def + 0 1 n { + dup dup 6 mul dup 1 add + outPoints exch 5 -1 roll getY put + outPoints exch 3 -1 roll getX put + } for + /rhs n array def + 1 1 n 2 sub { + rhs exch dup dup getX 4 mul exch 1 add getX 2 mul add put + } for + rhs 0 0 getX 1 getX 2 mul add put + rhs n 1 sub dup getX 8 mul n getX add 2 div put + GetFirstControlPoints + 1 1 n 2 sub { + rhs exch dup dup getY 4 mul exch 1 add getY 2 mul add put + } for + rhs 0 0 getY 1 getY 2 mul add put + rhs n 1 sub dup getY 8 mul n getY add 2 div put + GetFirstControlPoints + 0 1 n 1 sub { + /i exch def + 2 copy + i get outPoints 6 i mul 3 add 3 -1 roll put + i get outPoints 6 i mul 2 add 3 -1 roll put + 2 copy + i n 1 sub lt { + i 1 add get i 1 add getY 2 mul exch sub outPoints 6 i mul 5 add 3 -1 roll put + i 1 add get i 1 add getX 2 mul exch sub outPoints 6 i mul 4 add 3 -1 roll put + }{ + n 1 sub get n getY add 2 div outPoints 6 n 1 sub mul 5 add 3 -1 roll put + n 1 sub get n getX add 2 div outPoints 6 n 1 sub mul 4 add 3 -1 roll put + } ifelse + } for + pop pop + } ifelse + outPoints + end +} def +/Spline { + /showpoints ED + counttomark 2 div dup cvi /n ED + n eq not { exch pop } if + ] /Points ED + n 1 gt { + CalcBezierSpline + mark exch aload pop + ArrowA + n 2 sub { + 6 2 roll 4 2 roll curveto + } repeat + 6 2 roll 4 2 roll ArrowB curveto + } if +} def +/OpenSymbolSpline { + Spline + 0.1 setflat + /Shift Symbol stringwidth pop 2 div def + CurvePath +} def +% +/SQ { /r ED r r moveto r r neg L r neg r neg L r neg r L fill } def +/ST { /y ED /x ED x y moveto x neg y L 0 x L fill } def +/SP { /r ED gsave 0 r moveto 4 { 72 rotate 0 r L } repeat fill grestore } def +% +/FontDot { + DS 2 mul dup + matrix scale matrix concatmatrix exch matrix + rotate matrix concatmatrix exch + findfont exch makefont setfont +} def +% +/Rect { + x1 y1 y2 add 2 div moveto + x1 y2 lineto + x2 y2 lineto + x2 y1 lineto + x1 y1 lineto + closepath +} def +% +/OvalFrame { + x1 x2 eq y1 y2 eq or + { pop pop x1 y1 moveto x2 y2 L } + { y1 y2 sub abs x1 x2 sub abs 2 copy gt + { exch pop } { pop } ifelse + 2 div exch { dup 3 1 roll mul exch } if + 2 copy lt { pop } { exch pop } ifelse + /b ED + x1 y1 y2 add 2 div moveto + x1 y2 x2 y2 b arcto + x2 y2 x2 y1 b arcto + x2 y1 x1 y1 b arcto + x1 y1 x1 y2 b arcto + 16 { pop } repeat + closepath + } ifelse +} def +% +/Frame { + CLW mul /a ED + 3 -1 roll + 2 copy gt { exch } if + a sub /y2 ED + a add /y1 ED + 2 copy gt { exch } if + a sub /x2 ED + a add /x1 ED + 1 index 0 eq { pop pop Rect } { OvalFrame } ifelse +} def +% +/BezierNArray { + /f ED + counttomark 2 div dup cvi /n ED + n eq not { exch pop } if + n 1 sub neg 3 mod 3 add 3 mod { 0 0 /n n 1 add def } repeat + f { ] aload /Points ED } { n 2 mul 1 add -1 roll pop } ifelse +} def +% +/OpenBezier { + BezierNArray + n 1 eq + { pop pop } + { ArrowA n 4 sub 3 idiv + { 6 2 roll 4 2 roll curveto } repeat + 6 2 roll 4 2 roll ArrowB curveto } ifelse +} def +% +/OpenSymbolBezier { + OpenBezier + 0.1 setflat + /Shift Symbol stringwidth pop 2 div def + CurvePath +} def +% +/ClosedBezier { + BezierNArray + n 1 eq + { pop pop } + { moveto n 1 sub 3 idiv + { 6 2 roll 4 2 roll curveto } repeat + closepath } ifelse +} def +% +/ClosedSymbolBezier { + /f ED % save showpoints value + 2 copy /yEnd ED /xEnd ED + counttomark -2 roll 2 copy /yStart ED /xStart ED + counttomark 2 roll + f + ClosedBezier + 0.1 setflat + /Shift Symbol stringwidth pop 2 div def + CurvePath + [ xEnd yEnd xStart yStart SymbolLine +} def +% +/BezierShowPoints { + gsave + Points aload length 2 div cvi /n ED + moveto + n 1 sub { lineto } repeat + CLW 2 div SLW [ 4 4 ] 0 setdash stroke + grestore +} def +% +/Parab { + /y0 ED /x0 ED /y1 ED /x1 ED + /dx x0 x1 sub 3 div def + /dy y0 y1 sub 3 div def + x0 dx sub y0 dy add x1 y1 ArrowA + x0 dx add y0 dy add x0 2 mul x1 sub y1 ArrowB + curveto + /Points [ x1 y1 x0 y0 x0 2 mul x1 sub y1 ] def +} def +% +/Parab1 { % 1 end | 0 SP + /ySP ED /xSP ED /y1 ED /x1 ED + /dx xSP x1 sub 3 div def + /dy ySP y1 sub 3 div def + newpath x1 y1 moveto xSP y1 lineto xSP ySP lineto + x1 ySP lineto closepath clip + currentpoint + newpath moveto + xSP dx sub ySP dy add x1 y1 ArrowA + xSP dx add ySP dy add xSP 2 mul x1 sub y1 ArrowB + curveto + /Points [ x1 y1 xSP ySP xSP 2 mul x1 sub y1 ] def +} def +% +/Grid { + newpath + /a 4 string def + /b ED % psk@gridlabels in pt + /c ED % { \pst@usecolor\psgridlabelcolor } + /n ED % psk@griddots + cvi dup 1 lt { pop 1 } if + /s ED % \psk@subgriddiv + s div dup 0 eq { pop 1 } if + /dy ED s div dup 0 eq { pop 1 } if % \pst@number\psyunit abs + /dx ED dy div round dy mul % \pst@number\psxunit abs + /y0 ED dx div round dx mul + /x0 ED dy div round cvi + /y2 ED dx div round cvi + /x2 ED dy div round cvi + /y1 ED dx div round cvi + /x1 ED + /h y2 y1 sub 0 gt { 1 } { -1 } ifelse def + /w x2 x1 sub 0 gt { 1 } { -1 } ifelse def + b 0 gt { + /z1 b 4 div CLW 2 div add def +% /Helvetica findfont b scalefont setfont + /b b .95 mul CLW 2 div add def } if + systemdict /setstrokeadjust known + { true setstrokeadjust /t { } def } + { /t { transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add + exch itransform } bind def } ifelse + gsave n 0 gt { 1 setlinecap [ 0 dy n div ] dy n div 2 div setdash } { 2 setlinecap } ifelse + /i x1 def + /f y1 dy mul n 0 gt { dy n div 2 div h mul sub } if def + /g y2 dy mul n 0 gt { dy n div 2 div h mul add } if def + x2 x1 sub w mul 1 add dup 1000 gt { pop 1000 } if + { i dx mul dup y0 moveto + b 0 gt + { gsave c i a cvs dup stringwidth pop + /z2 ED w 0 gt {z1} {z1 z2 add neg} ifelse + h 0 gt {b neg}{z1} ifelse + rmoveto show grestore } if + dup t f moveto + g t L stroke + /i i w add def + } repeat + grestore + gsave + n 0 gt + % DG/SR modification begin - Nov. 7, 1997 - Patch 1 + %{ 1 setlinecap [ 0 dx n div ] dy n div 2 div setdash } + { 1 setlinecap [ 0 dx n div ] dx n div 2 div setdash } + % DG/SR modification end + { 2 setlinecap } ifelse + /i y1 def + /f x1 dx mul n 0 gt { dx n div 2 div w mul sub } if def + /g x2 dx mul n 0 gt { dx n div 2 div w mul add } if def + y2 y1 sub h mul 1 add dup 1000 gt { pop 1000 } if + { newpath i dy mul dup x0 exch moveto + b 0 gt { gsave c i a cvs dup stringwidth pop + /z2 ED + w 0 gt {z1 z2 add neg} {z1} ifelse + h 0 gt {z1} {b neg} ifelse + rmoveto show grestore } if + dup f exch t moveto + g exch t L stroke + /i i h add def + } repeat + grestore +} def +% +/ArcArrow { + /d ED /b ED /a ED + gsave + newpath 0 -1000 moveto clip + newpath + 0 1 0 0 b + grestore + c mul + /e ED + pop pop pop r a e d PtoC y add exch x add + exch r a PtoC y add exch x add exch b pop pop pop pop a e d CLW 8 div c + mul neg d +} def +% +% +/isbool { type (booleantype) cvn eq } def +% +/Ellipse { + dup isbool { /MoveToStart ED }{ /MoveToStart false def }ifelse % false or true + /rotAngle ED + /mtrx CM def + T + rotAngle rotate + scale + MoveToStart { 0 0 moveto 1 0 rmoveto } if % move to the start position + 0 0 1 5 3 roll arc + mtrx setmatrix +} def +% +/ArcAdjust { %%%% Vincent Guirardel +% given a target length (targetLength) and an initial angle (angle0) [in the stack], +% let M(angle0)=(rx*cos(angle0),ry*sin(angle0))=(x0,y0). +% This computes an angle t such that (x0,y0) is at distance +% targetLength from the point M(t)=(rx*cos(t),ry*sin(t)). +% NOTE: this an absolute angle, it does not have to be added or substracted to angle0 +% contrary to TvZ's code. +% To achieve, this, one iterates the following process: start with some angle t, +% compute the point M' at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)]. +% Now take t' (= new angle) so that (0,0) M(t') and M' are aligned. +% +% Another difference with TvZ's code is that we need d (=add/sub) to be defined. +% the value of d = add/sub is used to know on which side we have to move. +% It is only used in the initialisation of the angle before the iteration. +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Input stack: 1: target length 2: initial angle +% variables used : rx, ry, d (=add/sub) +% + /targetLength ED /angle0 ED + /x0 rx angle0 cos mul def + /y0 ry angle0 sin mul def +% we are looking for an angle t such that (x0,y0) is at distance targetLength +% from the point M(t)=(rx*cos(t),ry*sin(t))) +%initialisation of angle (using 1st order approx = TvZ's code) + targetLength 57.2958 mul + angle0 sin rx mul dup mul + angle0 cos ry mul dup mul + add sqrt div +% if initialisation angle is two large (more than 90 degrees) set it to 90 degrees +% (if the ellipse is very curved at the point where we draw the arrow, % +% the value can be much more than 360 degrees !) +% this should avoid going on the wrong side (more than 180 degrees) or go near + dup 90 ge { pop 90 } if + angle0 exch d % add or sub +% maximum number of times to iterate the iterative procedure: +% iterative procedure: takes an angle t on top of stack, computes a +% better angle (and put it on top of stack) + 30 { dup +% compute distance D between (x0,y0) and M(t) + dup cos rx mul x0 sub dup mul exch sin ry mul y0 sub dup mul add sqrt +% if D almost equals targetLength, we stop + dup targetLength sub abs 1e-5 le { pop exit } if +% stack now contains D t +% compute the point M(t') at distance targetLength of (x0,y0) on the semi-line [(x0,y0) M(t)]: +% M(t')= ( (x(t)-x0)*targetLength/d+x0 , (y(t)-y0)*targetLength/d+y0 ) + exch dup cos rx mul x0 sub exch sin ry mul y0 sub +% stack contains: y(t)-y0, x(t)-x0, d + 2 index Div targetLength mul y0 add ry Div exch + 2 index Div targetLength mul x0 add rx Div +% stack contains x(t')/rx , y(t')/ry , d +% now compute t', and remove D from stack + atan exch pop + } repeat +% we don't look at what happened... in particular, if targetLength is greater +% than the diameter of the ellipse... +% the final angle will be around /angle0 + 180. maybe we should treat this pathological case... +% after iteration, stack contains an angle t such that M(t) is the tail of the arrow +% to give back the result as a an angle relative to angle0 we could add the following line: +% angle0 sub 0 exch d +% +% begin bug fix 2006-01-11 +% we want to adjust the new angle t' by a multiple of 360 so that | t'-angle0 | <= 180 +%(we don't want to make the ellipse turn more or less than it should)... +dup angle0 sub dup abs 180 gt { 180 add 360 div floor 360 mul sub } { pop } ifelse +% end bug fix +} def +% +/EllipticArcArrow { + /d ED % is add or sub + /b ED % arrow procedure + /a1 ED % angle + gsave + newpath + 0 -1000 moveto + clip % Set clippath far from arrow. + newpath + 0 1 0 0 b % Draw arrow to determine length. + grestore +% Length of arrow is on top of stack. Next 3 numbers are junk. +% + a1 exch ArcAdjust % Angular position of base of arrow. + /a2 ED + pop pop pop + a2 cos rx mul xOrig add % hv 2007-08-29 x->xOrig + a2 sin ry mul yOrig add % hv 2007-08-29 y->yOrig + a1 cos rx mul xOrig add % + a1 sin ry mul yOrig add % +% Now arrow tip coor and base coor are on stack. + b pop pop pop pop % Draw arrow, and discard coordinates. + a2 CLW 8 div +% change value of d (test it by looking if `` 1 1 d '' gives 2 or not ) + 1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse + ArcAdjust +% resets original value of d + 1 1 d 2 eq { /d { sub } def } { /d { add } def } ifelse % Adjust angle to give overlap. +} def +%%------------------ tvz/DG/hv (2004-05-10) end -------------------%% +% +/Rot { CP CP translate 3 -1 roll neg rotate NET } def +% +/RotBegin { + tx@Dict /TMatrix known not { /TMatrix { } def /RAngle { 0 } def } if + /TMatrix [ TMatrix CM ] cvx def + /a ED + a Rot /RAngle [ RAngle dup a add ] cvx def +} def +% +/RotEnd { + /TMatrix [ TMatrix setmatrix ] cvx def + /RAngle [ RAngle pop ] cvx def +} def +% +/PutCoor { gsave CP T CM STV exch exec moveto setmatrix CP grestore } def +/PutBegin { /TMatrix [ TMatrix CM ] cvx def CP 4 2 roll T moveto } def +/PutEnd { CP /TMatrix [ TMatrix setmatrix ] cvx def moveto } def +% +/Uput { + /a ED + add 2 div /h ED 2 + div /w ED + /s a sin def + /c a cos def + /b s abs c abs 2 copy gt dup + /q ED + { pop } { exch pop } ifelse def + /w1 c b div w mul def + /h1 s b div h mul def + q { w1 abs w sub dup c mul abs }{ h1 abs h sub dup s mul abs } ifelse +} def +% +/UUput { + 5 dict begin + /z ED + abs /y ED + /x ED + q { x s div c mul abs y gt }{ x c div s mul abs y gt } ifelse + { x x mul y y mul sub z z mul add sqrt z add } + { q { x s div } { x c div } ifelse abs + } ifelse + a PtoC + h1 add exch + w1 add exch + end +} def +% +end +%-----------------------------------------------------------------------------% +% +% END pstricks.pro +%%EndProcSet +%%BeginProcSet: pst-algparser.pro 0 0 +% $Id: pst-algparser.pro 919 2014-05-19 18:42:47Z herbert $ +%% +%% PostScript prologue for PSTricks algorithm parser +%% Version 0.07, 2014/08/01 +%% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN archives +%% in directory macros/latex/base/lppl.txt. +%% +%%-----------------------------------------------------------------------------% +% +%currentdict /Pi known not { /Pi 3.14159265359 def } if +% +/AlgParser { tx@AlgToPs begin AlgToPs end } def % Dominique Rodriguez +/I2P { AlgParser cvx exec } def % Infix to Postfix +% +/tx@CoreAnalyzerDict 100 dict def tx@CoreAnalyzerDict begin +% +% PS ANALYZER FOR ALGEBRAIC EXPRESSION V1.13 +% +% 09/2011 DR factorial with ! added +% +% E->T|E+T +% T->FS|T*FS +% FS -> F | +FS | -FS +% F->P|F^SF|P! +% P->(E)|literal +% literal->number|var|var[E]|func(params) +% params->E|E,param +% number->TOBEFINISHED +% +%% E expression, T term, SF signed factor, F factor, P power +% +%% parser +% +%% str +% +%% C->EE +%% STR index -> STR index+lenExpr +/AnalyzeCond { AnalyzeExpr ReadCondOp AnalyzeExpr EvalCondOp } def +% +%% analyze Expression List (separator , or | ) +%% STR index -> STR index+lenExpr +%% /AnalyzeListOfE { +%% { NextNonBlankChar pop AnalyzeExpr%%dup Strlen eq { exit } if NextNonBlankChar +%% NextNonBlankChar dup 0 eq { pop exit } if +%% dup 44 ne 1 index 124 ne and { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse } if +%% pop NextNonBlankChar dup 0 eq { exit } if 124 ne { PROBLEMCONTACTBILLOU } if 1 add NextNonBlankChar 0 eq {toto} if } loop +%% AnalyzeListOfEPostHook +%% } def +/AnalyzeListOfE { + /NotFirst false def + { NextNonBlankChar pop AnalyzeExpr + NotFirst { EvalListOfExpr } { /NotFirst true def } ifelse + dup Strlen eq { exit } if NextNonBlankChar + dup 44 ne 1 index 124 ne and + { dup 41 ne { PROBLEMCONTACTBILLOU } { pop exit } ifelse } + if pop 1 add } loop + AnalyzeListOfEPostHook +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% E->T|E+T +%% STR index -> STR index+lenExpr +/AnalyzeExpr { + AnalyzePreHook AnalyzeTerm IsEndingExpr + { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse } + { { RollOp 1 add NextNonBlankChar pop AnalyzeTerm PreEvalHook EvalAddSub IsEndingExpr { pop exit } if } loop } + ifelse + AnalyzePostHook +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% T->FS|T*FS +%% STR index +/AnalyzeTerm { + AnalyzePreHook AnalyzeSignedFactor IsEndingTerm + { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse } + { { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor PreEvalHook EvalMulDiv IsEndingTerm { pop exit } if} loop } + ifelse + AnalyzePostHook +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% FS -> F | +FS | -FS +%% STR index +/AnalyzeSignedFactor { + AnalyzePreHook 2 copy get dup IsUnaryOp + { RollOp 1 add NextNonBlankChar pop AnalyzeSignedFactor EvalUnaryOp } + { pop AnalyzeFactor } + ifelse AnalyzePostHook +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% F->P|F^P|P! +%% STR index +/AnalyzeFactor { + AnalyzePreHook AnalyzePower IsEndingFactor + { dup 0 ne { 32 eq { NextNonBlankChar } if } { pop } ifelse } + { { dup 33 eq%% is there a ! DR 09/2011 + { pop 1 add NextNonBlankChar pop EvalFactorial } + { RollOp 1 add NextNonBlankChar pop AnalyzePower PreEvalHook EvalPower } + ifelse + IsEndingFactor { pop exit } if } loop } + ifelse AnalyzePostHook +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% P->(E)|literal +%% STR index +/AnalyzePower { + %% depending of first char either a number, or a literal + 2 copy get dup 40 eq%%an open par + { pop 1 add NextNonBlankChar pop AnalyzeExpr 1 add NextNonBlankChar pop } + { AnalyzeLiteral } + ifelse +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% STR index STR[index] -> STR index +%/AnalyzeLiteral { IsNumber { EvalNumber } { EvalLiteral } ifelse } def +/AnalyzeLiteral { dup IsUnaryOp exch IsNumber or { EvalNumber } { EvalLiteral } ifelse } def%%dr 09102006 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% recognize + or - +%% chr -> T/F +/IsUnaryOp { dup 43 eq exch 45 eq or } bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% a number can contain only : 0123456789. +%% chr -> T/F +/IsNumber { dup 48 ge exch dup 57 le 3 -1 roll and exch 46 eq or } bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% STR index -> STR index number +%% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)? +%% STR index -> STR index' number +/ReadNumber { + exch dup 3 -1 roll dup 3 1 roll + %%read mantissa + { 1 add 2 copy dup Strlen eq { pop pop 0 exit } if get dup IsNumber not { exit } if pop } loop + dup 101 eq exch 69 eq or + %%% there is a "e" or "E" -> read exponant + { 1 add 2 copy get dup IsUnaryOp + { pop 1 add 2 copy get } if + { IsNumber not { exit } if 1 add 2 copy get } loop } + if + dup 4 1 roll + 3 -1 roll exch 1 index sub getinterval +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% a number can contain only : 0123456789. +%% chr -> T/F +/IsCondOp { dup 30 eq exch dup 60 ge exch 62 le and or } bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% STR index -> STR index number +%% a number can be of the form [0-9]*.[0-9]*\([eE][+-]?[0-9]+\)? +%% STR index -> STR index' number +/ReadCondOp { + NextNonBlankChar 1 index 4 1 roll + { IsCondOp not { exit } if 1 add 2 copy get } loop + 2 copy 5 -1 roll + exch 1 index sub getinterval 3 1 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% a literal can contain only : 0123456789. +%% chr -> T/F +/IsLiteral {% + dup 48 ge exch dup 57 le 3 -1 roll and exch + dup 65 ge exch dup 90 le 3 -1 roll and 3 -1 roll or exch + dup 97 ge exch 122 le and or } bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% a literal can be of the form [a-zA-Z][a-zA-Z0-9]*\(\((Expression)\)|\(\[Expression\]\)\)? +%% STR index -> literal STR index' nextchr +/ReadLiteral { + exch dup 3 -1 roll dup 3 1 roll + %%read literal core + { 2 copy dup Strlen eq { pop pop 0 exit } if get dup IsLiteral not { exit } if pop 1 add } loop + 4 1 roll dup 5 1 roll 3 -1 roll exch 1 index sub getinterval 4 1 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% expr is ended by end of str or a clpar +%% STR index -> STR index STR[index] T/F +/IsEndingExpr {% + 2 copy dup Strlen eq + %% if end of str is reached -> end ! + { pop pop 0 true } + %% ending chr -> clpar, comma, |, <, >, =, !, + {get dup dup 41 eq + exch dup 124 eq + exch dup 93 eq + exch dup 44 eq + exch dup 30 eq + exch dup 60 ge exch 62 le and or or or or or} + ifelse } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% expr is ended by end of str or a +- +%% STR index -> STR index STR[index] T/F +/IsEndingTerm { IsEndingExpr { true } { dup dup 43 eq exch 45 eq or } ifelse } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% expr is ended by end of str or */ +%% STR index -> STR index STR[index] T/F +/IsEndingFactor { IsEndingTerm { true } { dup dup 42 eq exch 47 eq or } ifelse } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% expr is ended by end of str or ^ +%% STR index -> STR index STR[index] T/F +/IsEndingPower { IsEndingFactor { true } { dup 94 eq } ifelse } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% STR index -> STR index STR[index] +/NextNonBlankChar { { dup Strlen eq { 0 exit } if 2 copy get dup neBlkChar { exit } if pop 1 add } loop } bind def +/neBlkChar { dup 32 ne exch dup 10 ne exch 9 ne and and } bind def +%%%%%%%%%%%%%%%%%%%%%%%% +%% DEBUG +/BRK {false} def +/BRKtrue {/BRK true def} def +/BRKStop {BRK {BRKtoto} if } def +/BRKEvalStop {BRK exch if } def +/BRKBRK2true {BRK {BRK2true} if } def +/BRK2 {false} def +/BRK2true {/BRK2 true def} def +/BRK2Stop {BRK2 {BRK2toto} if } def/BRK {false} def +end +% +%-------------------------------------------------------------------------------% +% +/tx@AlgToPs 12 dict def tx@AlgToPs begin +% +%% algExpr -> PSVector +/AlgToPs { tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE pop pop EndingSequence end } def +/EndingSequence { ExpressionVector aload length /end cvx exch 1 add array astore } def +/InitParser { /ExpressionVector [ /tx@AddMathFunc cvx /begin cvx ] def dup length /Strlen exch def 0 } def +/Strlen 0 def +/EvalListOfExpr {} def% +/EvalNumber {% + ReadNumber cvr /ExpressionVector ExpressionVector aload length dup 3 add -1 roll cvx + exch 1 add array astore def NextNonBlankChar pop } def +/EvalAddSub {% + /ExpressionVector ExpressionVector aload length dup 5 add -1 roll + 43 eq { /add } { /sub } ifelse cvx exch 1 add array astore def +} def +/EvalMulDiv {% + /ExpressionVector ExpressionVector aload length dup 5 add -1 roll + 42 eq { /mul } { /div } ifelse cvx exch 1 add array astore def +} def +/EvalPower {% + /ExpressionVector ExpressionVector aload length dup 5 add -1 roll + pop /exp cvx exch 1 add array astore def +} def +/EvalFactorial {% DR 09/2011 + /ExpressionVector ExpressionVector aload length + /fact cvx exch 1 add array astore def +} def +/EvalLiteral {% + ReadLiteral + dup 40 eq%%% there is an open par -> function call + { pop 2 index + dup (Sum) eq { EvalSum } + { dup (IfTE) eq { EvalCond } + { dup (Derive) eq { pop EvalDerive } + { pop 1 add NextNonBlankChar pop AnalyzeListOfE 2 index TrigoFunc + /ExpressionVector ExpressionVector aload length dup 5 add -1 roll cvn cvx + exch 1 add array astore def 1 add NextNonBlankChar pop } ifelse } ifelse} ifelse } + { /ExpressionVector ExpressionVector aload length dup 6 add -1 roll cvn cvx exch 1 add array astore def + dup 91 eq%%% there is an open bracket -> vector element + { pop 1 add NextNonBlankChar pop AnalyzeExpr + /ExpressionVector ExpressionVector aload length /cvi cvx exch /get cvx exch 2 add array astore def 1 add } + { pop NextNonBlankChar pop } + ifelse} + ifelse +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% the derive function : Derive(n,f(x)) +%% firstparindex lastparindex -> +/EvalDerive { + %% manage the function descripiton + 1 add ReadNumber 3 1 roll NextNonBlankChar + 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if + 1 add NextNonBlankChar pop + 3 -1 roll cvi + dup 0 eq + { pop AnalyzeExpr 3 -1 roll pop 1 add } + { 1 sub 3 1 roll (x) exch tx@Derive begin DeriveIndexed end 4 -1 roll + { (x) tx@Derive begin Derive end } repeat + ExpressionVector exch /ExpressionVector [] def + AlgToPs aload length + /ExpressionVector 1 index 3 add -1 roll aload length dup 3 add -1 roll /l2 exch def /l1 exch def + l1 l2 add 1 add l2 neg roll l1 l2 add array astore def 3 -1 roll pop 1 add + 1 index length /Strlen exch def } ifelse +} def +/EvalSum {% + pop 1 add NextNonBlankChar pop + %% read the variable name + ReadLiteral pop NextNonBlankChar + 44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if + %% read the initial value + 1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll + 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if + %% read the increment value + 1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll + 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if + %% read the limit value + 1 add NextNonBlankChar pop ReadNumber cvi 3 1 roll + 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if + /ExpressionVector ExpressionVector aload length dup 7 add -3 roll 0 4 1 roll + 5 -1 roll 4 add array astore def + %% keep ExpressionVector for later and create a new one for internal Sum computation + ExpressionVector 3 1 roll /ExpressionVector [ 6 -1 roll cvn /exch cvx /def cvx ] def + 1 add NextNonBlankChar pop AnalyzeExpr + %% add each term + /ExpressionVector ExpressionVector aload length 1 add /add cvx exch array astore def + /ExpressionVector 4 -1 roll aload length ExpressionVector cvx /for cvx 3 -1 roll 2 add + array astore def 3 -1 roll pop 1 add +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Convert to radians if trigo function call +%% (name) -> +/TrigoFunc { + dup (cos) eq 1 index (sin) eq or exch (tan) eq or + { /ExpressionVector ExpressionVector aload length 3.1415926 /div cvx 180 /mul cvx 5 -1 roll 4 add + array astore def + } if +} def +/EvalCond {% + pop 1 add AnalyzeCond NextNonBlankChar + 44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if + ExpressionVector 3 1 roll /ExpressionVector [] def + 1 add AnalyzeExpr ExpressionVector 3 1 roll /ExpressionVector [] def + NextNonBlankChar 44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if + 1 add AnalyzeExpr + NextNonBlankChar 41 ne { ANALYZER_ERROR_missing_ending parenthesis_in_IfTE } if + ExpressionVector + /ExpressionVector 6 -1 roll aload length dup + 6 add -1 roll cvx exch dup 4 add -1 roll cvx /ifelse cvx 3 -1 roll 3 add array astore def + 1 add 3 -1 roll pop +} def +%% CondOp STR index +/EvalCondOp {% + 3 -1 roll + dup (=) eq { /eq } {% + dup (<) eq { /lt } {% + dup (>) eq { /gt } {% + dup (>=) eq { /ge } {% + dup (<=) eq { /ge } {% + dup (!=) eq { /ne } { ERROR_non_valid_conditional_operator } + ifelse } ifelse } ifelse } ifelse } ifelse } ifelse + cvx exch pop + /ExpressionVector ExpressionVector aload length dup 3 add -1 roll exch 1 add array astore def } def +/EvalUnaryOp { + 3 -1 roll 45 eq { /ExpressionVector ExpressionVector aload length /neg cvx exch 1 add array astore def } if +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% H O O K S +/AnalyzePreHook {} bind def +/PreEvalHook {} bind def +/AnalyzeListOfEPostHook {} bind def +/AnalyzePostHook {} def +/RollOp { 3 1 roll } bind def +end %tx@CoreAnalyzerDict +% +%--------------------------------------------------------------------% +% +/tx@Derive 41 dict def tx@Derive begin +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% algExpr variable -> PSVector +/Derive { + 10240 string 3 1 roll 0 3 1 roll + /Variable exch def + tx@CoreAnalyzerDict begin InitParser AnalyzeListOfE end +} def +/Strlen 0 def +/InitParser { dup length /Strlen exch def 0 } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% algExpr variable index -> PSVector +/DeriveIndexed {% + 3 1 roll 10240 string 3 1 roll 0 3 1 roll + /Variable exch def + tx@CoreAnalyzerDict begin InitParser pop 4 -1 roll AnalyzeExpr 4 -2 roll pop pop 4 -2 roll exch pop end +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% (u,v)'=-(u',v') +/EvalListOfExpr {% + 4 2 roll 2 copy 9 -1 roll dup length 4 1 roll putinterval add AddPipe + 2 copy 7 -1 roll dup length 4 1 roll putinterval add + 6 -2 roll pop pop + 2 copy pop 0 6 2 roll GetIntervalNewStr 5 1 roll 2 copy 0 exch getinterval 6 1 roll } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% (-u)'=-(u') +/EvalUnaryOp { + 4 -2 roll 4 index (0) eq + { (0) StrConcat 7 -1 roll pop } + { 7 -1 roll 45 eq + { AddSub AddOpPar true } { false } ifelse + 3 1 roll 5 index StrConcat 3 -1 roll { AddClPar } if } ifelse + 2 copy pop 0 6 2 roll GetIntervalNewStr + 7 -2 roll pop pop 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% (number)'=0 +/EvalNumber { ReadNumber (0) 6 2 roll } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% (u+v)'=u'+v' +/EvalAddSub {% + 7 index dup (0) eq + { pop true }%% du=0 nothing added + { dup length exch 5 index 5 index 3 -1 roll putinterval 4 -1 roll add 3 1 roll false } + ifelse + 5 index dup (0) eq + { pop { (0) } { 4 -2 roll 2 copy pop 0 6 2 roll GetIntervalNewStr } ifelse }%%dv=0 + { exch + { 5 -2 roll 7 index 45 eq { AddSub } if false } %%nothing yet added + { 5 -2 roll 7 index 43 eq%%something yet added + { AddAdd false } { AddSub AddOpPar true } ifelse } + ifelse 11 1 roll + 3 -1 roll StrConcat 10 -1 roll { AddClPar } if + 2 copy pop 0 6 2 roll GetIntervalNewStr } + ifelse + mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% (u*v)' or (u/v)' +/EvalMulDiv { 6 index 42 eq {EvalMul} {EvalDiv} ifelse } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% (u*v)'=u'*v+u*v' +/EvalMul {% + 4 -2 roll 7 index dup (0) eq + { pop false }%%du=0 + { (1) eq%%du=1 + { false } + { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse + 3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if + true }%%du!=0 + ifelse + 5 1 roll 5 index (0) eq + { 5 -1 roll not { (0) StrConcat } if }%%dv=0 + { 5 -1 roll { AddAdd } if + 4 index (1) eq + { 8 index StrConcat } + { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar } + ifelse + }%%dv!=0 + ifelse + 2 copy pop 0 6 2 roll GetIntervalNewStr + mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% (u/v)'=(u'*v-u*v')/v^2 +/EvalDiv {% + 4 -2 roll + 4 index (0) eq%%dv=0 -> u'/v + { 7 index (0) eq { (0) StrConcat } { AddOpPar 7 index StrConcat AddClPar AddDiv 5 index StrConcat } ifelse } + { 7 index dup (0) eq + { pop }%%du=0 + { (1) eq%%du=1 + { false } + { AddOpPar 7 index StrConcat AddClPar AddMul AddOpPar true } ifelse + 3 1 roll 6 index StrConcat 3 -1 roll { AddClPar } if}%%du!=0 + ifelse + AddSub + 4 index (1) eq + { 8 index StrConcat } + { AddOpPar 8 index StrConcat AddClPar AddMul AddOpPar 4 index StrConcat AddClPar } + ifelse + %}%%dv!=0 + 2 copy GetIntervalNewStr 3 1 roll pop 0 AddOpPar 3 -1 roll StrConcat AddClPar + AddDiv AddOpPar 5 index StrConcat AddClPar 2 copy (^2) putinterval 2 add } + ifelse + 2 copy pop 0 6 2 roll GetIntervalNewStr + mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% str1 index str2 -> str1 index +/StrConcat { dup length 4 2 roll 2 copy 6 -1 roll putinterval 3 -1 roll add } bind def +/GetIntervalNewStr { 0 exch getinterval dup length string copy } bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% (u^v)'=(u^v)'=u'vu^(v-1)+v'u^(v)ln(u) +/EvalPower {% + 4 -2 roll 7 index (0) eq + {%%if du=0 then (u^v)'=v'ln(u)u^v + 4 index (0) eq + { (0) StrConcat }%%if dv=0 then (u^v)'=0 + { 4 index (1) ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if + 8 index (e) ne { (ln\() StrConcat 8 index StrConcat (\)*) StrConcat } if + AddOpPar 8 index StrConcat (\)^\() StrConcat 5 index StrConcat AddClPar } ifelse + } + {%%du!=0 + 4 index (0) eq + {%%if dv=0 then (u^v)'=vu'u^(v-1) + 5 index dup IsStrNumber + { dup (0) eq + { StrConcat } + { dup dup (1) eq exch (1.0) eq or + { StrConcat } + { StrConcat + 7 index dup (1) ne exch (1.0) ne and%%%dr 09102006 insert du if <> 1 + { (*\() StrConcat 7 index StrConcat (\)) StrConcat } if%%%dr 09102006 + (*\() StrConcat 8 index StrConcat (\)) StrConcat + 5 index dup dup (2) eq exch (2.0) eq or + { pop } { cvr 1 sub 20 string cvs 3 1 roll (^) StrConcat 3 -1 roll StrConcat } ifelse } ifelse } ifelse } + { pop AddOpPar 5 index StrConcat (\)*\() StrConcat 8 index StrConcat (\)^\() StrConcat + 5 index StrConcat (-1\)) StrConcat } ifelse + } + {%%if dv!=0 and du!=0 then (u^v)'=u'vu^(v-1)+v'u^(v)ln(u) + 7 index (1) ne { AddOpPar 7 index StrConcat (\)*) StrConcat } if + AddOpPar 5 index StrConcat (\)*\() StrConcat + 8 index StrConcat (\)^\() StrConcat + 5 index StrConcat (-1\)+\() StrConcat + 4 index (1) ne { 4 index StrConcat (\)*\() StrConcat } if + 8 index StrConcat (\)^\() StrConcat + 5 index StrConcat (\)*ln\() StrConcat + 8 index StrConcat AddClPar + } ifelse + } ifelse + 2 copy pop 0 6 2 roll GetIntervalNewStr + mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% No derivative for factorial ! only cst => null derivative +/EvalFactorial {% DR 09/2011 + 4 index (0) eq + { (0) mark 8 -2 roll cleartomark 2 index 7 index dup 4 index exch sub getinterval exch 6 2 roll } + { DERIVATIVE_ENGINE_ERROR_no_variable_in_factorial } ifelse +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% str -> true/false +/IsStrNumber {% + true exch + { dup 48 lt exch dup 57 gt 3 -1 roll or + exch dup 46 ne%%. + exch dup 43 ne%%+ + exch 45 ne%%- + and and and { pop false } if } forall +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% literal switch -> func call, vector, variables +/EvalLiteral {% + ReadLiteral dup 40 eq%%% there is an open par -> function call + { pop (EvalFunc_ ) 9 4 index StrConcat 0 exch getinterval cvn cvx exec } + { dup 91 eq%%% there is an open bracket -> vector element + { DERIVATIVE_ENGINE_ERROR_vector_not_yet_implemented } + { pop EvalVariable } + ifelse } + ifelse +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% first last parpos Expr[first:parpos-1] -> +/EvalVariable { 2 index Variable eq { (1) } { (0) } ifelse 4 -1 roll exch 6 2 roll } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% (f(u))'=u'f'(u) +/EvalFunc { + 4 2 roll 4 index (1) ne + { AddOpPar 4 index StrConcat (\)*) StrConcat } if + (Eval ) 4 8 index StrConcat 0 exch getinterval cvn cvx exec + 2 copy pop 0 6 2 roll GetIntervalNewStr + mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Func derivative -> Eval +/EvalFunc_sin {% + PreCommonFunc + { (cos\() StrConcat 5 index StrConcat AddClPar } if + PostCommonFunc } def +/EvalFunc_cos {% + PreCommonFunc + { (\(-sin\() StrConcat 5 index StrConcat (\)\)) StrConcat } if + PostCommonFunc } def +/EvalFunc_tan {% + PreCommonFunc + { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/cos\() StrConcat 5 index StrConcat (\)^2) StrConcat } if + PostCommonFunc } def +/EvalFunc_asin {% + PreCommonFunc + { (1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if + PostCommonFunc } def +/EvalFunc_acos {% + PreCommonFunc + { (-1/sqrt\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if + PostCommonFunc } def +/EvalFunc_atg {% + PreCommonFunc + { (1/\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if + PostCommonFunc } def +/EvalFunc_floor {% + PreCommonFunc + { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\() StrConcat 5 index StrConcat AddClPar } if + PostCommonFunc } def +/EvalFunc_ln {% + PreCommonFunc + { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\() StrConcat 5 index StrConcat AddClPar } if + PostCommonFunc } def +/EvalFunc_exp {% + PreCommonFunc + { (exp\() StrConcat 5 index StrConcat AddClPar } if + PostCommonFunc } def +/EvalFunc_EXP {% + PreCommonFunc + { (EXP\() StrConcat 5 index StrConcat AddClPar } if + PostCommonFunc } def +/EvalFunc_sqrt {% + PreCommonFunc + { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/\(2*sqrt\() StrConcat 5 index StrConcat (\)\)) StrConcat } if + PostCommonFunc } def +/EvalFunc_Fact {% + PreCommonFunc { DERIVATIVE_ENGINE_ERROR_no_variable_expression_in_Fact } if + PostCommonFunc } def +/EvalFunc_sh {% + PreCommonFunc + { (ch\() StrConcat 5 index StrConcat AddClPar } if + PostCommonFunc } def +/EvalFunc_ch {% + PreCommonFunc + { (sh\() StrConcat 5 index StrConcat AddClPar } if + PostCommonFunc } def +/EvalFunc_th {% + PreCommonFunc + { dup 0 eq { (1) StrConcat } { 1 sub } ifelse (/ch\() StrConcat 5 index StrConcat (\)^2) StrConcat } if + PostCommonFunc } def +/EvalFunc_Argsh {% + PreCommonFunc + { (1/sqrt\(1+\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if + PostCommonFunc } def +/EvalFunc_Argch {% + PreCommonFunc + { (1/sqrt\(\() StrConcat 5 index StrConcat (\)^2-1\)\)) StrConcat } if + PostCommonFunc } def +/EvalFunc_Argth {% + PreCommonFunc + { (1/\(1-\() StrConcat 5 index StrConcat (\)^2\)\)) StrConcat } if + PostCommonFunc } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +/PreCommonFunc { + 1 add NextNonBlankChar pop 3 -1 roll 5 1 roll AnalyzeExpr 1 add NextNonBlankChar pop + 4 2 roll 4 index (0) eq + { (0) StrConcat false } + { 4 index (1) ne { AddOpPar 4 index StrConcat (\)*) StrConcat } if true } ifelse +} def +/PostCommonFunc { + 2 copy pop 0 6 2 roll GetIntervalNewStr + mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll +} def +/EvalFunc_Derive {% + 1 add ReadNumber cvi 1 add dup cvr log 1 add cvi string cvs + 4 -1 roll pop 5 1 roll 1 add NextNonBlankChar pop AnalyzeExpr 1 add + 4 -2 roll (Derive\() StrConcat 7 -1 roll StrConcat (,) StrConcat 6 -1 roll StrConcat AddClPar + 2 copy pop 0 6 2 roll GetIntervalNewStr 6 -1 roll pop 2 index 6 index dup 4 index exch sub getinterval + exch 6 2 roll } def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% literal switch -> func call, vector, variables +/EvalFunc_Sum {% + 1 add NextNonBlankChar pop + %% read the variable name + ReadLiteral pop 3 -1 roll pop NextNonBlankChar + 44 ne { ANALYZER_ERROR_missing_first_comma_in_Sum } if + %% read the initial value + 1 add NextNonBlankChar pop ReadNumber pop + 2 copy get 44 ne { ANALYZER_ERROR_missing_second_comma_in_Sum } if + %% read the increment value + 1 add NextNonBlankChar pop ReadNumber pop + 2 copy get 44 ne { ANALYZER_ERROR_missing_third_comma_in_Sum } if + %% read the limit value + 1 add NextNonBlankChar pop ReadNumber pop + 2 copy get 44 ne { ANALYZER_ERROR_missing_fourth_comma_in_Sum } if + 1 add NextNonBlankChar pop dup 6 1 roll 3 -1 roll pop AnalyzeExpr 1 add NextNonBlankChar pop + 4 -2 roll 3 index 8 index dup 9 index exch sub getinterval StrConcat + 4 index StrConcat AddClPar + 2 copy pop 0 6 2 roll GetIntervalNewStr + mark 9 -3 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% literal switch -> func call, vector, variables +/EvalFunc_IfTE {% + 3 -1 roll pop 1 add NextNonBlankChar pop SkipCond + NextNonBlankChar + 44 ne { ANALYZER_ERROR_missing_first_comma_in_IfTE } if + 1 add NextNonBlankChar pop dup 5 1 roll + AnalyzeExpr NextNonBlankChar + 44 ne { ANALYZER_ERROR_missing_second_comma_in_IfTE } if + 1 add NextNonBlankChar pop + AnalyzeExpr 1 add NextNonBlankChar pop + 4 -2 roll 3 index 10 index dup 11 index exch sub getinterval StrConcat + 6 index StrConcat (,) StrConcat 4 index StrConcat AddClPar + 2 copy pop 0 6 2 roll GetIntervalNewStr + mark 11 -5 roll cleartomark 2 index 6 index dup 4 index exch sub getinterval exch 6 2 roll +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% advance in str until a comma is found (no error detection!) +%% str index -> str index' +/SkipCond { { 1 add 2 copy get 44 eq {exit } if } loop } bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Convert to radians if trigo function call +%% (name) -> +/TrigoFunc { + dup (cos) eq 1 index (sin) eq or exch (tan) eq or + { /ExpressionVector ExpressionVector aload length Pi /div cvx 180 /mul cvx 5 -1 roll 4 add + array astore def + } if +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% No derivative for condition.... +/EvalCondOp { 3 -1 roll pop } bind def +/PutIntervalOneAdd {putinterval 1 add} bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add open parenthesis in string at the given index +%% str index -> str index+1 +/AddOpPar {2 copy (\() PutIntervalOneAdd} bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add close parenthesis in string at the given index +%% str index -> str index+1 +/AddClPar {2 copy (\)) PutIntervalOneAdd} bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add 0 in string at the given index +%% str index -> str index+1 +/AddZero {2 copy (0) PutIntervalOneAdd} bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add open parenthesis in string at the given index +%% str index -> str index+1 +/AddMul {2 copy (*) PutIntervalOneAdd} bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add open parenthesis in string at the given index +%% str index -> str index+1 +/AddDiv {2 copy (/) PutIntervalOneAdd} bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add a plus sign in string at the given index +%% str index -> str index+1 +/AddAdd {2 copy (+) PutIntervalOneAdd} bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add a minus sign in string at the given index +%% str index -> str index+1 +/AddSub {2 copy (-) PutIntervalOneAdd} bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add a pipe sign in string at the given index +%% str index -> str index+1 +/AddPipe {2 copy (|) PutIntervalOneAdd} bind def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% H O O K S +/AnalyzePreHook { dup 5 1 roll } bind def +/PreEvalHook {} def +/AnalyzePostHook { 7 -1 roll pop } bind def +/AnalyzeListOfEPostHook { 6 -1 roll mark 6 1 roll cleartomark } bind def +/RollOp { 5 1 roll } bind def +end%%%tx@CoreAnalyzerDict +/tx@AddMathFunc 12 dict def tx@AddMathFunc begin +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% NEW FUNC +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% function arcsine in radians asin(x)=atan(x/sqrt(1-x^2)) +%% x -> theta +/asin {% + dup abs 1 gt { EQDFasinrangeerror } if + dup dup dup mul 1 exch sub sqrt atan exch 0 lt { 360 sub } if DegtoRad +} def +%% function arccosine in radians acos(x)=atan(sqrt(1-x^2)/x) +%% x -> theta +/acos {% + dup abs 1 gt { EQDFacosrangeerror } if + dup dup mul 1 exch sub sqrt exch atan DegtoRad +} def +%% function arctangent in radians +%% x -> theta +/atg { 1 atan dup 90 gt { 360 sub } if DegtoRad } bind def +%% HYPERBOLIC FUNCTIONS +/sh { dup Ex exch neg Ex sub 2 div } def +/ch { dup Ex exch neg Ex add 2 div } def +/th { dup sh exch ch div } def +/Argsh { dup dup mul 1 add sqrt add ln } def +/Argch { dup dup mul 1 sub sqrt add ln } def +/Argth { dup 1 add exch 1 exch sub div ln 2 div } def +%% modified exponential funtion for 0 +%% x n -> x^n +/Exp { dup 0 eq { pop pop 1 } { exp } ifelse } bind def +%% modified exponential funtion for 0 +%% x -> e^x +/Ex { Euler exch exp } bind def +%% +%% factorial function +%% n -> n! +/Fact { 1 exch 2 exch 1 exch { mul } for } bind def +/fact { Fact } bind def +/! { Fact } bind def +end +% +% END pst-algparser.pro +%%EndProcSet +%%BeginProcSet: pst-tools.pro 0 0 +% $Id: pst-tools.pro 842 2013-10-26 10:25:41Z herbert $ +% +%% PostScript tools prologue for pstricks.tex. +%% Version 0.04, 2013/10/26 +%% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN archives +%% in directory macros/latex/base/lppl.txt. +% +% +/Pi2 1.57079632679489661925640 def +/factorial { % n on stack, returns n! + dup 0 eq { 1 }{ + dup 1 gt { dup 1 sub factorial mul } if } + ifelse } def +% +/MoverN { % m n on stack, returns the binomial coefficient m over n + 2 dict begin + /n exch def /m exch def + n 0 eq { 1 }{ + m n eq { 1 }{ + m factorial n factorial m n sub factorial mul div } ifelse } ifelse + end +} def +% +/ps@ReverseOrderOfPoints { % on stack [P1 P2 P3 ...Pn]=>[Pn,Pn-1,...,P2,P1] + 5 dict begin % all local + aload length /n ED % number of coors + n 2 div cvi /m ED % number of Points + /n1 n def + m { n1 2 roll /n1 n1 2 sub def } repeat + n array astore + end +} def +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% subroutines for complex numbers, given as an array [a b] +% which is a+bi = Real+i Imag +% +/cxadd { % [a1 b1] [a2 b2] = [a1+a2 b1+b2] + dup 0 get % [a1 b1] [a2 b2] a2 + 3 -1 roll % [a2 b2] a2 [a1 b1] + dup 0 get % [a2 b2] a2 [a1 b1] a1 + 3 -1 roll % [a2 b2] [a1 b1] a1 a2 + add % [a2 b2] [a1 b1] a1+a2 + 3 1 roll % a1+a2 [a2 b2] [a1 b1] + 1 get % a1+a2 [a2 b2] b1 + exch 1 get % a1+a2 b1 b2 + add 2 array astore +} def +% +/cxneg { % [a b] + dup 1 get % [a b] b + exch 0 get % b a + neg exch neg % -a -b + 2 array astore +} def +% +/cxsub { cxneg cxadd } def % same as negative addition +% +% [a1 b1][a2 b2] = [a1a2-b1b2 a1b2+b1a2] = [a3 b3] +/cxmul { % [a1 b1] [a2 b2] + dup 0 get % [a1 b1] [a2 b2] a2 + exch 1 get % [a1 b1] a2 b2 + 3 -1 roll % a2 b2 [a1 b1] + dup 0 get % a2 b2 [a1 b1] a1 + exch 1 get % a2 b2 a1 b1 + dup % a2 b2 a1 b1 b1 + 5 -1 roll dup % b2 a1 b1 b1 a2 a2 + 3 1 roll mul % b2 a1 b1 a2 b1a2 + 5 -2 roll dup % b1 a2 b1a2 b2 a1 a1 + 3 -1 roll dup % b1 a2 b1a2 a1 a1 b2 b2 + 3 1 roll mul % b1 a2 b1a2 a1 b2 a1b2 + 4 -1 roll add % b1 a2 a1 b2 b3 + 4 2 roll mul % b1 b2 b3 a1a2 + 4 2 roll mul sub % b3 a3 + exch 2 array astore +} def +% +% [a b]^2 = [a^2-b^2 2ab] = [a2 b2] +/cxsqr { % [a b] square root + dup 0 get exch 1 get % a b + dup dup mul % a b b^2 + 3 -1 roll % b b^2 a + dup dup mul % b b^2 a a^2 + 3 -1 roll sub % b a a2 + 3 1 roll mul 2 mul % a2 b2 + 2 array astore +} def +% +/cxsqrt { % [a b] +% dup cxnorm sqrt /r exch def +% cxarg 2 div RadtoDeg dup cos r mul exch sin r mul cxmake2 + cxlog % log[a b] + 2 cxrdiv % log[a b]/2 + aload pop exch % b a + 2.781 exch exp % b exp(a) + exch cxconv exch % [Re +iIm] exp(a) + cxrmul % +} def +% +/cxarg { % [a b] + aload pop % a b + exch atan % arctan b/a + DegtoRad % arg(z)=atan(b/a) +} def +% +% log[a b] = [a^2-b^2 2ab] = [a2 b2] +/cxlog { % [a b] + dup % [a b][a b] + cxnorm % [a b] |z| + log % [a b] log|z| + exch % log|z|[a b] + cxarg % log|z| Theta + cxmake2 % [log|z| Theta] +} def +% +% square of magnitude of complex number +/cxnorm2 { % [a b] + dup 0 get exch 1 get % a b + dup mul % a b^2 + exch dup mul add % a^2+b^2 +} def +% +/cxnorm { % [a b] + cxnorm2 sqrt +} def +% +/cxconj { % conjugent complex + dup 0 get exch 1 get % a b + neg 2 array astore % [a -b] +} def +% +/cxre { 0 get } def % real value +/cxim { 1 get } def % imag value +% +% 1/[a b] = ([a -b]/(a^2+b^2) +/cxrecip { % [a b] + dup cxnorm2 exch % n2 [a b] + dup 0 get exch 1 get % n2 a b + 3 -1 roll % a b n2 + dup % a b n2 n2 + 4 -1 roll exch div % b n2 a/n2 + 3 1 roll div % a/n2 b/n2 + neg 2 array astore +} def +% +/cxmake1 { 0 2 array astore } def % make a complex number, real given +/cxmake2 { 2 array astore } def % dito, both given +% +/cxdiv { cxrecip cxmul } def +% +% multiplikation by a real number +/cxrmul { % [a b] r + exch aload pop % r a b + 3 -1 roll dup % a b r r + 3 1 roll mul % a r b*r + 3 1 roll mul % b*r a*r + exch 2 array astore % [a*r b*r] +} def +% +% division by a real number +/cxrdiv { % [a b] r + 1 exch div % [a b] 1/r + cxrmul +} def +% +% exp(i theta) = cos(theta)+i sin(theta) polar<->cartesian +/cxconv { % theta + RadtoDeg dup sin exch cos cxmake2 +} def +%%%%% ### bubblesort ### +%% syntax : array bubblesort --> array2 trie par ordre croissant +%% code de Bill Casselman +%% http://www.math.ubc.ca/people/faculty/cass/graphics/text/www/ +/bubblesort { % on stack must be an array [ ... ] +4 dict begin + /a exch def + /n a length 1 sub def + n 0 gt { + % at this point only the n+1 items in the bottom of a remain to + % the sorted largest item in that blocks is to be moved up into + % position n + n { + 0 1 n 1 sub { + /i exch def + a i get a i 1 add get gt { + % if a[i] > a[i+1] swap a[i] and a[i+1] + a i 1 add + a i get + a i a i 1 add get + % set new a[i] = old a[i+1] + put + % set new a[i+1] = old a[i] + put + } if + } for + /n n 1 sub def + } repeat + } if + a % return the sorted array +end +} def +% +/concatstringarray{ % [(a) (b) ... (z)] --> (ab...z) 20100422 + 0 1 index { length add } forall + string + 0 3 2 roll + { 3 copy putinterval length add }forall + pop +} bind def +% +/dot2comma {% on stack a string (...) + 2 dict begin + /Output exch def + 0 1 Output length 1 sub { + /Index exch def + Output Index get 46 eq { Output Index 44 put } if + } for + Output + end +} def +% +/rightTrim { % on stack the string and the character number to be stripped + /charNo exch def + dup + length 1 sub -1 0 { + /i exch def dup i get charNo ne { exit } if + } for + 0 i 1 add getinterval + dup length string copy +} bind def % leaves the stripped string on the stack +/psStringwidth /stringwidth load def +/psShow /show load def +%/stringwidth{ 32 rightTrim psStringwidth } bind def +%/show { 32 rightTrim psShow } bind def +%-----------------------------------------------------------------------------% +/pgffunctions { + /pgfsc{}bind def% stroke color is empty by default + /pgffc{}bind def% fill color is empty by default + /pgfstr{stroke}bind def% + /pgffill{fill}bind def% + /pgfeofill{eofill}bind def% + /pgfe{a dup 0 rlineto exch 0 exch rlineto neg 0 rlineto closepath}bind def% rectangle + /pgfw{setlinewidth}bind def% setlinewidth + /pgfs{save pgfpd 72 Resolution div 72 VResolution div neg scale + magscale{1 DVImag div dup scale}if + pgfx neg pgfy neg translate pgffoa .setopacityalpha}bind def% save + /pgfr{pgfsd restore}bind def %restore + userdict begin% + /pgfo{pgfsd /pgfx currentpoint /pgfy exch def def @beginspecial}bind def %open + /pgfc{newpath @endspecial pgfpd}bind def %close + /pgfsd{globaldict /pgfdelta /delta where {pop delta} {0} ifelse put}bind def% save delta + /pgfpd{/delta globaldict /pgfdelta get def}bind def % put delta + /.setopacityalpha where {pop} {/.setopacityalpha{pop}def} ifelse % install .setopacityalpha + /.pgfsetfillopacityalpha{/pgffoa exch def + /pgffill{gsave pgffoa .setopacityalpha fill 1 .setopacityalpha newpath fill grestore newpath}bind def + /pgfeofill{gsave pgffoa .setopacityalpha eofill 1 .setopacityalpha newpath eofill grestore newpath}bind def}bind def + /.pgfsetstrokeopacityalpha{/pgfsoa exch def /pgfstr{gsave pgfsoa .setopacityalpha stroke grestore newpath}bind def}bind def + /pgffoa 1 def + /pgfsoa 1 def + end +} def +%-----------------------------------------------------------------------------% +% END pst-tools.pro +%%EndProcSet +%%BeginProcSet: pst-dots.pro 0 0 +% $Id: pst-dots.pro 801 2013-07-09 18:10:41Z herbert $ +% +%% PostScript prologue for pstricks.tex. +%% Version 2.02, 2009/06/16 +%% +%% For distribution, see pstricks.tex. +%% +%% Timothy Van Zandt +%% +%% This program can be redistributed and/or modified under the terms +%% of the LaTeX Project Public License Distributed from CTAN archives +%% in directory macros/latex/base/lppl.txt. +%% +%% Modified by Etienne Riga - Dec. 16, 1999 +%% Modified by Etienne Riga - 2005/01/01 (er) +%% to add /Diamond, /SolidDiamond and /BoldDiamond +%% Modified by Herbert Voss (hv) - 2008/04/17 +% +10 dict dup begin % hold local + /FontType 3 def + /FontMatrix [.001 0 0 .001 0 0] def +% /FontBBox [-571.5 -742.5 571.5 742.5] def % changed to next line 20060616 hv + /FontBBox [-1000 -1000 1000 1000] def % See end of file in /BuildGlyph + /Encoding 256 array def + 0 1 255 {Encoding exch /.notdef put} for % fill the array with /.notdef + Encoding % replace with given dot names + dup (b) 0 get /Bullet put % get the numerical position of b in ASCII +% % and save /Bullet at this place in Encoding + dup (c) 0 get /Circle put + dup (C) 0 get /BoldCircle put % 67 + dup (u) 0 get /SolidTriangle put + dup (t) 0 get /Triangle put + dup (T) 0 get /BoldTriangle put + dup (r) 0 get /SolidSquare put + dup (s) 0 get /Square put + dup (S) 0 get /BoldSquare put + dup (q) 0 get /SolidPentagon put + dup (p) 0 get /Pentagon put + dup (P) 0 get /BoldPentagon put +%%% + dup (k) 0 get /Asterisk put + dup (K) 0 get /BoldAsterisk put + dup (J) 0 get /SolidAsterisk put + dup (h) 0 get /Hexagon put + dup (H) 0 get /BoldHexagon put + dup (G) 0 get /SolidHexagon put + dup (f) 0 get /Octogon put % 2008-04-18 hv + dup (F) 0 get /BoldOctogon put % 2008-04-18 hv + dup (g) 0 get /SolidOctogon put % 2008-04-18 hv + dup (a) 0 get /Add put + dup (A) 0 get /BoldAdd put % 65 + dup (x) 0 get /Mul put + dup (X) 0 get /BoldMul put + dup (m) 0 get /Oplus put + dup (M) 0 get /BOplus put + dup (e) 0 get /SolidOplus put + dup (n) 0 get /Otimes put + dup (N) 0 get /BOtimes put + dup (E) 0 get /SolidOtimes put + dup (i) 0 get /Bar put + dup (I) 0 get /BoldBar put + dup (l) 0 get /SolidDiamond put + dup (d) 0 get /Diamond put + (D) 0 get /BoldDiamond put +%%% +/CharProcs 47 dict def +CharProcs begin + /CirclePath {0 0 500 0 360 arc closepath} def + /Bullet {CirclePath fill} def + /Circle {CirclePath .9 .9 scale CirclePath eofill} def + /BoldCircle {CirclePath .8 .8 scale CirclePath eofill} def + /TrianglePath {0 660 moveto -571.5 -330 lineto 571.5 -330 lineto closepath} def + /SolidTriangle {TrianglePath fill} def + /Triangle {TrianglePath .85 .85 scale TrianglePath eofill} def + /BoldTriangle {TrianglePath .7 .7 scale TrianglePath eofill} def + /SquarePath {-450 450 moveto 450 450 lineto 450 -450 lineto -450 -450 lineto closepath} def + /SolidSquare {SquarePath fill} def + /Square {SquarePath .89 .89 scale SquarePath eofill} def + /BoldSquare {SquarePath .78 .78 scale SquarePath eofill} def + /PentagonPath { + -337.8 -465 moveto 337.8 -465 lineto 546.6 177.6 lineto + 0 574.7 lineto -546.6 177.6 lineto closepath + } def + /SolidPentagon {PentagonPath fill} def + /Pentagon {PentagonPath .89 .89 scale PentagonPath eofill} def + /BoldPentagon {PentagonPath .78 .78 scale PentagonPath eofill} def +%-------------- hv begin 2004/07/25 from: er 2003/03/24 + /HexagonPath { + 0 550 moveto -476 275 lineto -476 -275 lineto + 0 -550 lineto 476 -275 lineto 476 275 lineto closepath + } def + /SolidHexagon {HexagonPath fill} def + /Hexagon {HexagonPath .89 .89 scale HexagonPath eofill} def + /BoldHexagon {HexagonPath .79 .79 scale HexagonPath eofill} def +% 2008-04-18 hv + /OctogonPath { + 550 dup 22.5 tan mul dup neg dup add /xMove exch def + exch moveto 7 { xMove 0 rlineto 45 rotate } repeat closepath } def + /SolidOctogon { OctogonPath fill } def + /Octogon { OctogonPath .89 .89 scale OctogonPath eofill } def + /BoldOctogon { OctogonPath .79 .79 scale OctogonPath eofill } def +% + /AsteriskPath { + 20 0 moveto 10 250 180 500 0 500 curveto + -180 500 -10 250 -20 0 curveto closepath + } def + /Asterisk { + AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath + 60 rotate AsteriskPath 60 rotate AsteriskPath 60 rotate AsteriskPath fill + } def +% + /Basterp {50 250 220 500 0 500 curveto -220 500 -50 250 -50 30 cos 100 mul curveto} def + /BoldAsteriskPath { + 50 30 cos 100 mul moveto Basterp + 60 rotate Basterp 60 rotate Basterp + 60 rotate Basterp 60 rotate Basterp + 60 rotate Basterp closepath + } def + /BoldAsterisk {BoldAsteriskPath fill} def + /SolidAsterisk {CirclePath .9 .9 scale BoldAsteriskPath eofill} def + /CrossPath { + 40 550 moveto -40 550 lineto -40 40 lineto -550 40 lineto + -550 -40 lineto -40 -40 lineto -40 -550 lineto 40 -550 lineto + 40 -40 lineto 550 -40 lineto 550 40 lineto 40 40 lineto closepath + } def + /BoldCrossPath {80 550 moveto -80 550 lineto -80 80 lineto -550 80 lineto + -550 -80 lineto -80 -80 lineto -80 -550 lineto 80 -550 lineto + 80 -80 lineto 550 -80 lineto 550 80 lineto 80 80 lineto closepath + } def + /Add {CrossPath fill} def + /Mul {45 rotate CrossPath fill} def + /BoldAdd {BoldCrossPath fill} def + /BoldMul {45 rotate BoldCrossPath fill} def + /Oplus {CirclePath .9 .9 scale CirclePath eofill .775 .775 scale CrossPath fill } def + /SolidOplus {CirclePath .775 .775 scale BoldCrossPath eofill} def + /BOplus {CirclePath .8 .8 scale CirclePath eofill .775 .775 scale BoldCrossPath fill} def + /Otimes {CirclePath .9 .9 scale CirclePath eofill 45 rotate .775 .775 scale CrossPath fill} def + /BOtimes {CirclePath .8 .8 scale CirclePath eofill 45 rotate .775 .775 scale BoldCrossPath fill } def + /SolidOtimes {CirclePath 45 rotate .775 .775 scale BoldCrossPath eofill} def + /BarPath {40 660 moveto -40 660 lineto -40 -660 lineto 40 -660 lineto closepath} def + /Bar {BarPath fill} def + /BoldBarPath {80 660 moveto -80 660 lineto -80 -660 lineto 80 -660 lineto closepath} def + /BoldBar {BoldBarPath fill} def + /DiamondPath {0 742.5 moveto -428.5 0 lineto 0 -742.5 lineto 428.5 0 lineto closepath} def + /SolidDiamond {DiamondPath fill} def + /Diamond {DiamondPath .865 .865 scale DiamondPath eofill} def + /BoldDiamond {DiamondPath .73 .73 scale DiamondPath eofill} def +%%% + /.notdef { } def +end +% +/BuildGlyph { + exch + begin +% Metrics 1 index get exec 0 + 0 0 +% BBoxes 3 index get exec + -1000 -1000 1000 1000 +% -571.5 -742.5 571.5 742.5 + setcachedevice + CharProcs begin load exec end + end +} def +% +/BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec +} bind def +% +end +/PSTricksDotFont exch definefont pop +% +%% end +%%EndProcSet +%%BeginProcSet: 8r.enc 0 0 +% File 8r.enc TeX Base 1 Encoding Revision 2.0 2002-10-30 +% +% @@psencodingfile@{ +% author = "S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry, +% W. Schmidt, P. Lehman", +% version = "2.0", +% date = "27nov06", +% filename = "8r.enc", +% email = "tex-fonts@@tug.org", +% docstring = "This is the encoding vector for Type1 and TrueType +% fonts to be used with TeX. This file is part of the +% PSNFSS bundle, version 9" +% @} +% +% The 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, Windows ANSI including the euro symbol, +% MacRoman, and some 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. +% These are /dotlessj /ff /ffi /ffl. +% +% (4) hyphen appears twice for compatibility with both ASCII and Windows. +% +% (5) /Euro was assigned to 128, as in Windows ANSI +% +% (6) Missing characters from MacRoman encoding incorporated as follows: +% +% PostScript MacRoman TeXBase1 +% -------------- -------------- -------------- +% /notequal 173 0x16 +% /infinity 176 0x17 +% /lessequal 178 0x18 +% /greaterequal 179 0x19 +% /partialdiff 182 0x1A +% /summation 183 0x1B +% /product 184 0x1C +% /pi 185 0x1D +% /integral 186 0x81 +% /Omega 189 0x8D +% /radical 195 0x8E +% /approxequal 197 0x8F +% /Delta 198 0x9D +% /lozenge 215 0x9E +% +/TeXBase1Encoding [ +% 0x00 + /.notdef /dotaccent /fi /fl + /fraction /hungarumlaut /Lslash /lslash + /ogonek /ring /.notdef /breve + /minus /.notdef /Zcaron /zcaron +% 0x10 + /caron /dotlessi /dotlessj /ff + /ffi /ffl /notequal /infinity + /lessequal /greaterequal /partialdiff /summation + /product /pi /grave /quotesingle +% 0x20 + /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 +% 0x80 + /Euro /integral /quotesinglbase /florin + /quotedblbase /ellipsis /dagger /daggerdbl + /circumflex /perthousand /Scaron /guilsinglleft + /OE /Omega /radical /approxequal +% 0x90 + /.notdef /.notdef /.notdef /quotedblleft + /quotedblright /bullet /endash /emdash + /tilde /trademark /scaron /guilsinglright + /oe /Delta /lozenge /Ydieresis +% 0xA0 + /.notdef /exclamdown /cent /sterling + /currency /yen /brokenbar /section + /dieresis /copyright /ordfeminine /guillemotleft + /logicalnot /hyphen /registered /macron +% 0xB0 + /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 0 0 +%! +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]FontType 0 +ne{/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}{{1 index type +/nametype eq{exit}if exch pop}loop}ifelse[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 0 0 +%! +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/@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 +%%BeginProcSet: color.pro 0 0 +%! +TeXDict begin/setcmykcolor where{pop}{/setcmykcolor{dup 10 eq{pop +setrgbcolor}{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll +}repeat setrgbcolor pop}ifelse}B}ifelse/TeXcolorcmyk{setcmykcolor}def +/TeXcolorrgb{setrgbcolor}def/TeXcolorgrey{setgray}def/TeXcolorgray{ +setgray}def/TeXcolorhsb{sethsbcolor}def/currentcmykcolor where{pop}{ +/currentcmykcolor{currentrgbcolor 10}B}ifelse/DC{exch dup userdict exch +known{pop pop}{X}ifelse}B/GreenYellow{0.15 0 0.69 0 setcmykcolor}DC +/Yellow{0 0 1 0 setcmykcolor}DC/Goldenrod{0 0.10 0.84 0 setcmykcolor}DC +/Dandelion{0 0.29 0.84 0 setcmykcolor}DC/Apricot{0 0.32 0.52 0 +setcmykcolor}DC/Peach{0 0.50 0.70 0 setcmykcolor}DC/Melon{0 0.46 0.50 0 +setcmykcolor}DC/YellowOrange{0 0.42 1 0 setcmykcolor}DC/Orange{0 0.61 +0.87 0 setcmykcolor}DC/BurntOrange{0 0.51 1 0 setcmykcolor}DC +/Bittersweet{0 0.75 1 0.24 setcmykcolor}DC/RedOrange{0 0.77 0.87 0 +setcmykcolor}DC/Mahogany{0 0.85 0.87 0.35 setcmykcolor}DC/Maroon{0 0.87 +0.68 0.32 setcmykcolor}DC/BrickRed{0 0.89 0.94 0.28 setcmykcolor}DC/Red{ +0 1 1 0 setcmykcolor}DC/OrangeRed{0 1 0.50 0 setcmykcolor}DC/RubineRed{ +0 1 0.13 0 setcmykcolor}DC/WildStrawberry{0 0.96 0.39 0 setcmykcolor}DC +/Salmon{0 0.53 0.38 0 setcmykcolor}DC/CarnationPink{0 0.63 0 0 +setcmykcolor}DC/Magenta{0 1 0 0 setcmykcolor}DC/VioletRed{0 0.81 0 0 +setcmykcolor}DC/Rhodamine{0 0.82 0 0 setcmykcolor}DC/Mulberry{0.34 0.90 +0 0.02 setcmykcolor}DC/RedViolet{0.07 0.90 0 0.34 setcmykcolor}DC +/Fuchsia{0.47 0.91 0 0.08 setcmykcolor}DC/Lavender{0 0.48 0 0 +setcmykcolor}DC/Thistle{0.12 0.59 0 0 setcmykcolor}DC/Orchid{0.32 0.64 0 +0 setcmykcolor}DC/DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}DC/Purple{ +0.45 0.86 0 0 setcmykcolor}DC/Plum{0.50 1 0 0 setcmykcolor}DC/Violet{ +0.79 0.88 0 0 setcmykcolor}DC/RoyalPurple{0.75 0.90 0 0 setcmykcolor}DC +/BlueViolet{0.86 0.91 0 0.04 setcmykcolor}DC/Periwinkle{0.57 0.55 0 0 +setcmykcolor}DC/CadetBlue{0.62 0.57 0.23 0 setcmykcolor}DC +/CornflowerBlue{0.65 0.13 0 0 setcmykcolor}DC/MidnightBlue{0.98 0.13 0 +0.43 setcmykcolor}DC/NavyBlue{0.94 0.54 0 0 setcmykcolor}DC/RoyalBlue{1 +0.50 0 0 setcmykcolor}DC/Blue{1 1 0 0 setcmykcolor}DC/Cerulean{0.94 0.11 +0 0 setcmykcolor}DC/Cyan{1 0 0 0 setcmykcolor}DC/ProcessBlue{0.96 0 0 0 +setcmykcolor}DC/SkyBlue{0.62 0 0.12 0 setcmykcolor}DC/Turquoise{0.85 0 +0.20 0 setcmykcolor}DC/TealBlue{0.86 0 0.34 0.02 setcmykcolor}DC +/Aquamarine{0.82 0 0.30 0 setcmykcolor}DC/BlueGreen{0.85 0 0.33 0 +setcmykcolor}DC/Emerald{1 0 0.50 0 setcmykcolor}DC/JungleGreen{0.99 0 +0.52 0 setcmykcolor}DC/SeaGreen{0.69 0 0.50 0 setcmykcolor}DC/Green{1 0 +1 0 setcmykcolor}DC/ForestGreen{0.91 0 0.88 0.12 setcmykcolor}DC +/PineGreen{0.92 0 0.59 0.25 setcmykcolor}DC/LimeGreen{0.50 0 1 0 +setcmykcolor}DC/YellowGreen{0.44 0 0.74 0 setcmykcolor}DC/SpringGreen{ +0.26 0 0.76 0 setcmykcolor}DC/OliveGreen{0.64 0 0.95 0.40 setcmykcolor} +DC/RawSienna{0 0.72 1 0.45 setcmykcolor}DC/Sepia{0 0.83 1 0.70 +setcmykcolor}DC/Brown{0 0.81 1 0.60 setcmykcolor}DC/Tan{0.14 0.42 0.56 0 +setcmykcolor}DC/Gray{0 0 0 0.50 setcmykcolor}DC/Black{0 0 0 1 +setcmykcolor}DC/White{0 0 0 0 setcmykcolor}DC end +%%EndProcSet +%%BeginFont: URWPalladioL-Roma +%!PS-AdobeFont-1.0: URWPalladioL-Roma 1.05 +%%CreationDate: Wed Dec 22 1999 +% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development +% (URW)++,Copyright 1999 by (URW)++ Design & Development +% See the file COPYING (GNU General Public License) for license conditions. +% As a special exception, permission is granted to include this font +% program in a Postscript or PDF file that consists of a document that +% contains text to be displayed or printed using this font, regardless +% of the conditions or license applying to the document itself. +12 dict begin +/FontInfo 10 dict dup begin +/version (1.05) readonly def +/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file COPYING (GNU General Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def +/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def +/FullName (URW Palladio L Roman) readonly def +/FamilyName (URW Palladio L) readonly def +/Weight (Roman) readonly def +/ItalicAngle 0.0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /URWPalladioL-Roma def +/PaintType 0 def +/WMode 0 def +/FontBBox {-166 -283 1021 943} readonly def +/FontType 1 def +/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def +/Encoding StandardEncoding def +currentdict end +currentfile eexec +D9D66F633B846A989B9974B0179FC6CC445BC2C03103C68570A7B354A4A280AE +6FBF7F9888E039AB60FCAF852EB4CE3AFEB979D5EA70FDE44A2AE5C8C0166C27 +BF9665EEA11C7D2329C1A211DD26BB372BE5822F5EA70D99EB578C7BEFD44CDF +045A363056E5E1CC51525EA6FC061DCEBB337208EFF729802376A2801424F670 +0E7E6397B28F15BC10B40012B0A3EAEB2693E8F7F627C4C9C7C6C5BFF105C1E4 +1B2B9E8F09253B76040D268B80719E1B3F5A55AA45ACB756B8E2BF5B37627E46 +DAFD4A4F741A859BB5F7D7C77FC7AA96EE6AC93C06CA829B81FE31E32D59C6DE +B1BF3B6CCC5C3C9296DC86D01487F08AB668F656CDD88EB816AEDD1EFA47F014 +FF598E78C978DF18F8F66057351BC96B48015AF2E09E3E318053E952E9AD4037 +BFC7EEF9CBFD7BC35746565B7EFBF241639793AE357220843147FADB929FBD24 +01C88A382F00BF79554D125C543455330002B0FE6D229830470C78541E78DAD5 +3E7C1A619B91215AE025F81561441BFC9ADA446035B8EB9C3D69BA746AD0CCAA +049D1FE4D905DF3F48D22900E02A23FB23F6B571DDC8B2CF7008431C1EAD7F6B +D92A2C42CAED94F9714F44E3CE31FBAF23A064AA2A7F13D6E5378E28539F0009 +323A0755E58BA7564A408B142C230672A423DA6A6E54ED162AFBF8FADFA75B0B +FC648D5DA6EC31251B62B9F619AD9460876EEFCB8F9D2369CA3055820306533F +3C1D47D5A2EF97619FC2C780BCD9540A820748369FFDAB9D52492F130C0AC3C8 +E0C87377DA6C21F1DE429C15AA939877876F84605F6785B5ADEA97321BF29DEF +3692AF535EEFE801975F94645272142128A3FEC8B1BCEB6E57B83520B5C4DD69 +36DB8CDEF6E49B8944CA31C59F8790CD3FED58F1182D9AC6DCB2D75B4881B430 +C67DB769B4745EA54233CDFD5600BB2A96209A83FD04C13D4AA4AE27DED97D25 +93F6FDA5F64711EC7A2899AC98BD8D8879A6A348265832994C3BAD80E1D12291 +CB05924302B780443A76A09E1C27E8DCDCD87FFE3BE17DE0421A47733C2BD723 +9C876942155834190F65598810AF8CAD9842F8A1E3BBD2AE3348BD8FC9189FE2 +ED5643EC4D87148775121702EEB7639ACD80EF4F07542BBBC09F98F81FB91A1C +89C691BF38CE4239B11C1C0D9A6B864753E204C0BCCB093E139F9D6104FE0584 +DF022C621F86E5BFE2E047FD560E8A89B3872C87F7811E9EBCA9CF182472841A +88E7C421E5CE69DAD123B88D4E6C0FD85C86C74435BFCAE28C2B5CAD57D91A9B +4473906D044085B5336B066C6D9CE994D2B333F470AD32D3BC28BA2D699B7AE6 +2B689CD50CE2D458501EBCD2381F3430C3059EDCA22D9F15CA03CD18CB160E59 +C0E960F79010DC1E9EC40BA6914F9FB7951CB4D5AAFAA135C17D5D64CD848A32 +C71A5C856CC9C94F24B6C9AF854B83771678C0B0B4C6A4D9C05ADE69E5C04697 +8751F11D2AD4A508CC61D06884D6246FA607802124E77FC07620C1DC238000AD +F6AD8E9D7418065549E5A7DE64405908A078F353F447D44E968A8BA903DBE04F +677479DB92989DFABDF637FF627F4756AFF80F27EA2B9ACD21AA8BE59F75A8EA +AE3BF5ED74076F822C41086CCE1E87A943549454E8F5D1A42D40CCFBC093AFD3 +E57973A0090D82EDF66FBAE371392DD0E59980FA8BE2BE136F12F2AFDD734A55 +8594466D19327F4BB5A9B8E0C47795F2C229917B9785404865783BE784755194 +50637A74320671524A2972BC504F7BD9AD7ECACCDEC8ECA2BE88D881CC039292 +99117F82FE4F8D747109FBEBFD456F77844FC27438F6061CE0C155A07D106129 +F72651DB44BC63C5E50C9DEED687E06F23A0D0EE430F60395AD659378024307F +F959945AC0B31D21C93190B464964479A2AA279225ECC22FBD3944D1627260F7 +E54C15A992BD7256F92B621AE360A3635EDBFF4843DB29155D93CDC05BC0FE45 +B681C73C50BA9A41D61E6CD2CFF2A335D8E21BDEAC7BDE74DBE7654F3271DFD5 +D1048DC87D9F8BBF3A28847AFE8A99CC319EB45E377D4DB74734FAD150363C9D +FF5C37A1339AAD060F70D8D75D001C7B4D02B951D2AC0835AD03EEC63502DEF4 +0DE082B544B4AF7127EA6D5B8FF5A073525E141860C239FD3649D4356058F46C +35C1FDAFA7C56363A238589A03B28B03A324CF6F277BE3AC8FB0BCB48C7BBE92 +42FB65D39E7085771859C7732BD57F03DC8B933D235D1907954B8F5A4C76BD56 +1B3F13A0544283E20BDE45E6C67C0B54BF0E3A8EAF513D47C127C2B64E93B7C3 +C438E62D497813A57F92B3E1673EF83F96B3CA69FDD5FC43624F48D1A45D6724 +9DC047801F5DA8ADA3E811F09DE01C65A03EAA85409828A4539F085811655F6C +F61005779D8C805EF8028076C48B27F5B10F5FCEA940D391E5B34A0BA7578B14 +A1DDD2B86E4865F1E32B00231FB0709337CA0058E648347405573D737AC2C6BE +8BA937C8E3665F8EC9C577866D63ED736D38EE471C943F4539587BE5AE2347C8 +35DC00E5A73E95668DD0484A9DD4D2B1F245E01C1F36626E3819E7DCBA9450A2 +BFCD63E79FA7019874C49B52001F855586B9D8D8E795D2320480F771183B302F +F55667390AF2E314BC8E0FA5A8C86331C25A10BAE939C266FCA09CE6B28143C7 +A04451FE58FC26FAB5D9CEC8FB56F816E6F8A47E0D23D5C5F50134DFB69E6EC4 +631B1B75F624B30A0B667C7848497110581CA745EE952C928646C167002FBE2F +CF0D9554CFFAD98DD1C3AB3DD21999031C63A7BE2719E23968D45BA6BBBA9732 +720E93FEE80FCADB6DE4103945BB67352EC6BF8609A318A116878F50F7F3C3D4 +818D9D37D1EB182F07728368454BE160C954E3EC7B94785F492B45E4C0DEBB0E +A0AEE1C117EA3EC983EF97C89457C9B6838620303FA691D2C7ECC41D7BCB83C3 +A9F7BD163B413AA5486163820638DBCCFCE358C2E4F5792BE92B67E00C712D25 +DB1215B6863521DD77E3C7FD220F4F3D5B57DBF6C6C3B886D45EAC1C9550EADB +5DF55858BC4EC9DD482E295DF2D1B28175CB49AC18003349C39874FDAA34CA04 +E8BA7AFE66DAC5B13E88FA8CCD01A307B3CCA7793536A4E0B305D8E954653FF0 +05BCA28797426AE09BF354CF6FA2C8A68B121354BCC755C697C6AE9C1811DC24 +DBB298CA3D1E173B7AFA42D2F462CD121BE2E73E54C36908F68CAEA8C6C00435 +F6247FD720C915AEDC7EA135639E42513C9EA95B4D96A142EDE81C06EDCF92FF +43FA27C3399F57197D2D4AB8CB42922A435E50C804DFEE29A0F626822AA8AADC +D068449EABAE9C4E28C0DC9F9AFAC453F01520EAD132A69E350E84241DF40C3C +A24AF084E7544D8A76154942ACCED03A7785D88930527F6A177F5C15648503E3 +4EAA16E2E85FB09BD48D92AA2E5B0B2D36B70B46A1469509A5FE8968FE5BC5B1 +78FE624B1AED5AA201D467D1E213B2A0E953A1F6DB7B467C0440CF4F07022E54 +2342964D3E11D27F8937666D1659DDE8EE66FC30D70E339334EAF80836F20E51 +0E45E873E7398025B1FA21531A49F7D3AB5EEAFDBA7DFD613802C1AFCA0F1DCF +853EDF0D22CDBB0F92512D23C07FE717720ADD9E18FD2EA79CA9B39A5BCE21BF +A46CCF55D8B18F6BD4158202FDDC54827C9D5C37BDA01BC9AABE7ECAA5701B8D +D6AB4F79E7E55F560C76625EB13200B42047E5B81D898E3B62AFFB7FF0FB9F11 +3A5C526130957F0BA1D5F62CF554030F5E045FB934687C05037706FD61FD4C8F +1B13144DF601D73B6CDD27CCFE2211F4283F429D37F978BF9F45427C759B5AB6 +0E71D69709DF330EA9B1BC9737DDDB8D941425DE145DA043A710A148BF69BD65 +3E7D055B889245BB6661679F7EF91967AF1B2B563A5E1A22FE803AFB21717EEC +89B81E2CF229914CEAB11A57871330BBF1115E0308C18E3C64077DED2B7A8CCC +0E63102B795550FB9C592FC28C1A087050D22A8FF7418B17C86697A0571B7D00 +75FE95759F01F1CD47E3DDAA137D675ADF45AADE3789E4EB1D36423A9254DC03 +4E6C3B1095231F66D7A7B7F4EA79A47ACD3B4687E61EB9A65D6C35C6F1AEFA1C +1DEB34A22911BCE7A8188317DFB8E3B26DE6A4F20F3A0029C50230CEE633C09A +6997119E6DB226399F8FC8124AD635823264D3F8FD57575C26E1A6A321C3D33B +BE06D0874D91B7B44FE32A250836CA90605258BF9B749CA5B4E2703978E36CB2 +62039D4DA679199196BFC6DEA0C33FD8A381822C13A6EE2DB3BE6BE999ADB506 +6AD76209E854A04EB649B111666DDBB42F3F97CDE0C047662BE6A3E58986C54B +7C3927A1F6F838A8DE13C337900462F952EABBDC2EB1FBE8EA3CC6F0872C2810 +8F7EBBF5BF770C0BA6C7122682B40161092DB8C5BFD39EF98F57FD30FD135794 +959353A489FA703B99ED3B49603BE7AA221291BB4A248EFEC8BC27F761240BE4 +76D80CD1A96A3131E15A72555EDEF14B2F5EAF3C9EFCADE9559027916FE2FDB2 +677FB439414AE931EFBE3725FF71AE30A59C0A6D8546E89E3B5855DB982D88EC +B1EBE8ECB613E45FABA22EF197D46DE3CAA1C0103FC52DF439AC9C5C3A643A89 +883D8D2FF513485EC19C0286D2185E174A6948183BC020B4858B0119AA160FB9 +F07FA8BB698715267C8AEA3A4A9CA4E3B35C0BC7079A2CF2E2A1529550D55D44 +7433986CEF5A3DE144D44BB68F1FBD1166D8ED27FA17138AC7F3F66C8AE30B2A +8BB96416FDFF848179580F6493AEE59662497B7E1272D6209DA616F6D5216858 +64E0B149DD482B26C72BCF3CC553E5E8A17FFA5B86DB7020402FF8E0B391AF82 +7DAB714D59E44C0E28579F1C26B150D542CD076892BE8D05A41BD4C7DE97FDC0 +5E153A306983849D58F61DBD9851718C37C2FAA3D48221883665C31B5361DD83 +2C513510C5F90752F2EB9C3432B5A36FBD12DF2C8F50C00876D0BC4F00466201 +D1CF9D5D199E5F7FE96792D64F46123FDD5E8FD862852F9EF2C32B53258B6BF4 +A4A856647C3240A6D7C2180C19791C85A0DDD1DFA04D362503CB2528C5A368EC +0EEEAC5B338AB82863AA355DE4B122317B6DC7B0D553E25AC6EAC013678CBB9C +EAAA318B966295F3C6B2F1CDBAC5CBB4AF4E5AB320A83EF5F8EA5488B83C5DB2 +C75F20D8EFF9C41FA280CD6F62F72BACC0720291A079E3A0399BD4D5CA41D3EC +C3F6F96B20F09ED17D1AE979279BC1E60D84DECAAF93191A1534B466B39D0DC2 +611FCF84832EC7E798349DA14A17A7F328C979F5CFB9371D3FF527C5B59A59FE +5C3360A0C2270D3FE03EE61C774D39E1F2A3D374AB25B33CD03155676F2944DE +6E6B639C37E8E49BD4A6F0903E0C397B0EB34D1BEF48C8FC4FA189D8A962AE59 +456EC1EF77556D901AE90C61C7BB0B24EA2D2EEA23953AA248937D5163E1C9B1 +1F5E5D7A41A3DDEE42E8E7BB1A3AB81FC61CFA123D86082BB89D28C4DC21C801 +0FD157BF4590E344F7665D54767553E4ADD8AC4B24A8DD84A8BD378765D41B27 +5164E2568377D3CB1335027246F2DD3777FA40E1A1E8290EDF990F78D6935835 +27233CCF5D098F7D805EA1265A070AADA23516331D660F6C1A8DCA3133DBF682 +F6302689D0C56346AACFAD4049D8FAC5D74F41E48E53B6BA78A8C844C5534D8D +3BD20B5A2770AD066BCB37D55115AF89C5B2D4F8C402309070578CC4F140FC2F +313B76ED3CCE2C3D88AAF66A65ABA2A49AEE60207241625824476CEFB5503D37 +A7A65635808C622784BC884CA2BDCBD0E67FC98D7C303D4BD06A839E3B093632 +11C8E4E46C67D31F90FDB0886C90B9C95674CE9EAC3BFEC263E3E2594D8B607C +665E8817321FB9A6CB4985482AFCCF324707CEBEE64565FC8AA8F2010F195C2E +CA7932518CBCF295C49DD58CF10B322634A4B9ACF5325FFED023089B73198CB5 +6F38BACF5044D989BCAEC862F1A94227C5D0E0E138FEF0F6C457EBDDCEC1B3C1 +50DFECA7711B75C6AFECFF846191F4C6B573815A3AA97B57B260630CFC576339 +091662B7F1AE3CB1BCDD4120E32BB4E6EC288621C12EFFE5CE74ABA28C8C5785 +49FF711FE84E1DCA47451CC8919DFF187A589F11E89869BE3164C28164BB4CD6 +A36184D4DF1BE9D5DFB3269E9FE9746F10E57C77C60697ED7FE698988CA73622 +21E3430AF36C976D8299AEE0EE143A1D053206A7C133D547A1796330573F364A +4DD82BA880A7A5CD59F8F6000E1978A9EE62368ECFDAA3BD67CD0E79370BEDFC +209C63DAFFFF8617A2B0F5106ADF3EEBE554A6C69F8DCB88685B932115455922 +2567F02786B0C20CD61012D531A486D8A59BFE3B150023C31C1FD013E4D0E718 +8A918E8AE8B2EF2E39521253518A3F0B1E0C7E47965BD694C60B1DC71DA7FDD1 +CE5FAE7AD9F459C540825EFF96444A20C3BA3E672518AA8D31796749FD662131 +D1232D830CF8893664E7C2CCD75700474DA5CCB84A4D2BABFD759D4095B00EAD +F9410A00F14D79A49597413D95EA04EEB88C3B2E23061782146722858D5202D3 +39605F19B092F590AFE74E7DC2ACA05002C0F3E753BA4A97D0B9C89EC0CE1E99 +B6B2CB9402F0C0399C903612B383E44B61543D426552E859DF0E2B3121A28089 +59892D052406D05DA57C7D3DC7194CF8A154E5123BA72B33316EB20AEDF2C9A6 +C372A44C675C04820FE878F7610969D9A38B5905377D1111314519BE707E5F57 +276240FE493100726329EA34DEA95035262F80D9A3A2A4D87FC5875FCA2059C9 +3DF06A84B1D55E3AFD6C783B4A2CB9347E2251CAF08F5D36DD56EEF77CE8CE64 +654CB5C2B1D6281AD3B91FAC8450BF5CAC4771CB7D613C9E96ACB55A77DF4812 +D900F42AF9770E51EC9802D79C9B7D0B357E17E473AD1FC59C83E6AF1F16A08F +9CEFCDA935354C7F42AD1879C36707754E855326621A60060BE851291CB10E58 +A558D6440E61F72C329969884810B765020265AA13BFC463A010261430AD895A +175591AB1311DE9106E91B8D869C9EBCDFF01DC1A3FE08807F0C01EB5DFC9E47 +0CBFCCFB150AE9088E7695DF12535D53E530994176F942821D2B314893F2B931 +7FCF4A59106E7464A473A7577BA18FFC114EC9B4A6D30EDE8AF8C66FE1D855C0 +CEA79080BB00E1CC70736B448E2B976310D6B0B0F625F831BF96045BA65956D3 +F6C169C9A3E79D8287EDF29D576787EF5896E8747BD177565DB81493BC4E1266 +74010EE3696D11291F2E3F06359FB2DF0ADA7B92ECFA42CAEE34B742B0526C1D +6B872A1AD8F436487AC47D275B6BC6BC5BFF4FA22014B3741BA64842BA7DCA03 +C5D21590A2A0877E06AF39419A18C9B4AB6A7EA02BD6E9ADA22E0B1F5CABE244 +D885553C59DBFF6BABBA9A7380BB0535A71E05E4BA8D7FC58BE43CB3A4254B80 +C17134D2300F63B2C3B0D78CD7AC380D8DBDA4CB77CB2094B07E8129AB8FAA79 +56D34CCBADB59D4F702FEE0AB5F2A7946BFB6BC306585A1665F8582CF718FCF9 +190B3B86C30A8F6512E6A9AE03E171068E87443D6FE069758EDE18F201F5C18C +1AF378D3402FA9FF36EB8DF3147488905EE02E6408E5F29EE4BC9F76DE0B11FD +3F2986DCE859F1F48AC06F28BFE5F549756720A12B14E52D7C6387109196DAC4 +0F9AA71DE3A7EABAF9F2BFA80B608A4FF69353FF3574F563FBD8E53488D59341 +AF81B0452A92C158FB3A7B661D3E79E2BC0582244FEAA50608E0C6E5C1E469CF +45398E84F6A58812431A39B164B888EFB314943A31AAEF9A39CE7090701D62E7 +2F475A360D0D76EEA3447DABF8EDBE26ED30ACDBB0740604E89D0AA7E5A6EBB1 +9C8EC8CB43BC51E234FADC5E8F7A5D9427BC03582D4E3AD8EFDC6EBCC6170377 +F4814CE2A56387C40C82F3A7EBD955D31E456B77CD97DDCF704455215B860BD0 +241DDAC2F375CEB31EE2665CE873BCFE5D0976A217A89E566F8BAC6C5182C6B5 +73815A3AA97B53732AE98E13CD5A7463F1829F1FF191ACFDC03EA61B1076FBE3 +631AD2C27F40F36F324857B68C72E8B67462DAB091AF9B7276878EA49E35A38D +6FC779FF2F1611F1A974B0DFD4A2186CA637F0B76DC743AAEBBD2AE6BE1A3BBA +F8EC293440D0B605930A701CDDB1576470A05C3E2E04A5BB10433C15496C78BF +C6E61E94600D16F7B91CF0CD2673377718D3C9E60388FC2D8756CBC79845B782 +6C464A9D906561441B958F1A6B52D6FF2F1F28DE13E4B525245B82998871AF0C +2A0C0F1770DABFA097300E2EC88057D7F9B3329628A254DCFECAD1D9E397BF37 +F598B857526C8AD56D197508E17C81A5199AA7538AAAB053D86CB09889D322D9 +051E27A811BD8FC951252122F23B732BD6317212EA169014DE4C9B25F1235800 +DC8E895B9AA7780EEF0F24746F0A6D33E20CE49C53FE1FAEE714063C2AA6716B +765BF813EADFF6C4238A71C1F351EFF42BD187435F29CAF9E04F1D90A7CF2125 +6C6A49D427CCD0DA4D4A110D3A2F5521196CC9E9DE49E5135A00DA63E8234CBB +ECE9314926CC6EEBBAA85496ECFD04ACF4DD07183070B18E26940CA6362534EA +F7CC58C1845B66AAEEFA2051F5948DA8D056EBC81DD19D996CE9CEC2D9B586EC +472D70BF14A5F64D7C22BA9DB533DA97EAC60FAA26BE8660FC57178596BCFCB3 +64772E1B2CE47367E9B830A25D1D23CC3C67491543041224B78E7081E5D76BD3 +6217595B29F42B3E28DA1016EAAFE2C19A6EF0A479397D13DB0DB2BA7BD288FD +CC6237DB411A3D58448284B37540791C13BBA69E4D976EC840D8A8020C8AC12C +E7C04212FD98614268EBF14D18317340EE105C8505EE78A6FA47A599EFB80D20 +0384F710A002921B4C4B63F25AE01A4F8BA05BFD2AB7906C01C6C70A9A765A38 +3B95A26FA84E633F794B5978B1419264F16AD68DAB440F5DF9902E8025EFB02C +FE1B08BBC8AF9626B1DF061FFD64D5E9727ED81446B7535C0AB686F9AE782F6A +1AA23FD70CFE0C2768667D461868C0121B70EF238C02844AC7349427034E40FC +353D81AF7E5E21F91A0181155AAE4A63F71D9E321AC37679E6D65FB8D395DBC8 +47CFC3AC4C36967A941825BEAB693610CD80329D8AE47B8A922B0D8AAB4E42DE +1B24F8DD0F2DF7F66E79D3B2B7687683D34954230DC6E93A7777AD473C21AF1A +2D1032BD4E945847613E3ABEA86086CED87E55E5EFF5293BFCBEB85F3C779579 +1EC9AF2BCF4457BBCE07A32DA881E68915FF0D515F38A5B0ED2BA5E4D5BA2058 +0BBEF95A1304634119D0D9B6A6E2599C8BD1717D85D4C4E2E94102A40A312285 +07895A8830ECD91FA54E903ECA3F7F36340F7621CC772B70BB1EDE9FF7E83FBD +EECF66FBE1BA18924459C3ABB5BFB0D04401FCFE1382A0856C3AE2DAA8CF74A9 +8F8953CC763DCA497AB62B8ABFBD0425E1C1A55187847A34104AD5A57EC21CF7 +3327D73F0CEE17C15973A0934097FCAED8EC415CCA17FF097B020379CB994D8C +B0D944B14BC3B406E7F91BC0B544A987BAA117DE988464E585E848AD295B7FDF +C5CEBCBE595C2BDD52AF93416CDE9F5C14B688408CA41A71951C8792EE76FC31 +3D6A10189852497F9E774D67612E8F4E3D01B12CD189C534D9D55546006C5581 +D0D0B8968CA4DF727BBF44FEFB51ACC9DA6AD3D4DB3421C8FEE0E6B023BF4452 +C7D15CA3930A5FE31463157AC32D7C167B6427FC51F27C050BDDB44A1151E2CB +FB6D0A1461E4C2855DC776AE87C77FE3BA3D24A1719998DAD856F5F16C95930F +9D9D3F671D073FAAB0456483EECE5CCD859F12121B3D769370F9D08DDAA514D4 +C242E43747776E1FCD0003E30F8735CB72A38545ABDE59EA60937E93196B718D +611A1539DD50C03D48A945EAA84248576105092F73568D2E4217F19F4C58DA2F +0EEB12894E1870980D1865ABECB2E1951A09862C7F22FFE8F59B581E3B413B38 +5D140F100EA61204FAF5F94CDF61E1197360D4D2EC0DC5C23A608558756B4D89 +611E37EDEA4D61E8036A67B17298237C026EB2A9B175A84C4FE01A476160D82A +A5DB0B2AC7505E6827AAC1D462A387F711CF29C9193A710B08E0100E8B7F6D92 +3AAFB26EB82AD52A72B627F9A78243836AC17A75E08D22CF08AC126E46F8642E +1C798325572A2A503C0E95A44F8808F069D8F0608EF11064986DDA53A77FBE2E +DD38E22689D398B9547A9541D219D2EA74D6613E875DE9EE5E6F95D7E3DF19EA +B1AE084861ADF1C6097768B98966C83917031514DDEA9835C6FD0C20B0E29BFC +3DC8B889F1FD13F6E99935F9CF872C6545DC3ABF2D2C3E82FD5934A377B4E672 +1D57EF238CE44233E4E54C8C02A6C148F496A9259036FDA1C65DE434AFDC5963 +C2C9722465D3D0C4E403F54AA8073A9FF7075F2214404AB86420D9583DAB7DDF +D43BA0101CB9E5D4690CB3A1780CC527AAF78370E2CF75198B20DF4195F7FE7E +251CB16BE0AC9743F47F07109FE6CDAA4ABC481258D36E27A52BE40B9CA7BE87 +6A2BDC138827E12F6135FD63AD4003C2E63B9F8DD854C3A1DA292625EC954132 +F7E04EF76DC9AA3F00ADB173877CF1862E8A855ADC1E35D4D365CDD8FF305059 +BEFD96B013FB2B84F842D0614CBDF02AC0425C7839991EBF57CF969B974AD599 +597E5FA7D09ECEA8BBC41FC74D83435F476ADBAE3D9D97B44C00027A2C7EC6B5 +8B122524701ED28BF856037B47C8BC66A37B5994B5BA1013209625EFC5035988 +BA93F5CFDB502635110F19412D2B3E4655E38A6746CE23D37EBAAEA6EDA73103 +651D4C31A6B4924EB4F3D41A34BEFBBB778051372BA02B6120ECAB3C1BBDFB32 +7465DE7CBBA5D37BEA703D2BDAF32B483FF492090CB5BE8DF84AF22EBEF1EA98 +AFB5A93CD64485D489532E4C8ACBA15A1FAD5B3CC3CD39AD2C7FC964BED52BBF +F9519210C9846095F979B6A76F7D4EA277FAB9F70A882887A124AE931D0EA406 +9115DE07B604931C6BD75EE27089AF8E1A42D68FEA2EAE31DBAA34367961D575 +E02B6676D6627244791BD8F881711BB87023DC446815BED110A8BAF38856298C +7CF9E8CA6BD57BFCD2D8C6A8AC5FF1A428536B26741DC8FF8BCA65853D4A5737 +BFE430CF9F7A4123574FB7C43CAFAB15F0CABB3ADAF1E081E8CC4045ED08AD75 +AB2F80F4146ABF7799616926970E1954B0AFF8BE1F1E13302084B56D6C76C708 +A474A7E5907EB096F856F7394B24C1112097012635B59E40369768290A90A5FC +5E6C3EDE5433B77CF670266A8B7600359A8AF0CFF1DC3F8FB4B5B80A02F03C0C +D7781B446181D361726115B71242AAFD2638DE190F01064553EE6F31B96D5030 +E787961D72507A772F04932EDABCB8C8C05986E9A6CBCE3219EC6C9FFE43E5DC +858AAB70CCAC8EB5E22595C1FEAE2337CD18F6523CF7B6365F0E8E8AE7AB6653 +D30FAA959DAE6F5467A9BACA77AA304BC23AEE1A9EDFF3A54261EE686F3086CA +036F228432A5EF8FB9F55A53FC4EDF8A53C6C00505E46120C67B3B00073577A3 +672AEA51786048EB3B06AE809511D0F73237EA91F8BFFBF97B129C2ACF3A79B4 +CBFC23F4DBC3850041CE8841A451EC22BFD89ED7B126C58C7EE4D2C2FD73C66A +D9CAE53E104BD244A8A6D5F5F448DF5E2011B1A936BAFF1C988D1CE637FF6C84 +8546347BF93DBF15261EBFCBF328217F94A70D335D41F59317F44A60ED73DAB7 +2A2F1AC1DC8B3CB0D89232567FEF3D544A8F9B896303A47E29FB0A6DC6AE6B9A +F13A25D14ECC5FF4C6D1DFBCF8CEE94B2FE8BB0476A8D3D684C0382B6B7D81C8 +88A16012044DC16019E262F020AC43AC01DB8BD67102E1322FD08D6A1CBDAEC3 +E6EDA91ECFEC0ECF0B5340E0DDD17A6381B58DBBAD5C4C757395701D4EF87FAE +C2B30D2A6340553EFC4980E7615C5FCEDFECB3E3080FC6D8B395542D5E464A51 +9199900F4409C61D9E52E34F48CA9FED95D736691EB7C773266D8ACED067119C +4592AC1DCD83087C2DB818EED1C9E824474CB8755FDA5E1CD3C4B6EB90A6AAE7 +840372C02B32BE0179DEBACAC5A6DFD51F6B504785768125E206A6376C080E96 +B4E84895627B7886F57773C205F69006B7571AAAED118CE796246940463E2D04 +4358A97D72BA6DB828E48ECA9018B12EA9801A93F1D2EA5B3E92658208C188FD +73469C4B2FB410F270E32762530F0CDCB3A3F1EEE9665495B5991CD7707FD9FD +4EAFE30F8E4F79F104130515A28DBFE7F9A83A6854EE28FD1B2F56F1D2203C86 +D3D32879A5F548ECF75B9807C8A60296C199248AAFB953188F9C9B88B7B5A19F +8162E5D8454B7951C1C42134253C04FCEE9CB233501A96497FCF85FDADEA954A +8553BE234EBEC0692797103CBDEDCD86C7C852915991592BF5454FE871CF4302 +F1550F56B682134430815F8D35CAE3F78F40E9A45653BBAF2A5DCA560DB5BF93 +34D2133568D54E0077F0F1379F08BA39BBC939845B2790A95A7E5AB85DA35A4A +00452DBD61ECCE286F7D17B54F1986461CDF084B59B5786859662242E4FB8918 +5D303F0D9A79B8AB56EA0BFB2AC47F2E423410C34A1D80C0ED3FE5A7C9320D90 +7438DB23A82D8CB9777BECA40B205DBC0A492177451C915FD543B77DBFBB4559 +C6AC5939C280061C89D8AB26B7ECBFF4681E81EC360C540D9FBE9E50FCC4B0F0 +FE41F1282B3EE3E21977C2F8EB81057477A97F9D5F01465DD2E97AB66BE0F4EF +C0051E672BCFFADB40D2F9C971B548350C8A5C4A315DC2DE545CC95323067EB4 +F4C2EBEAE4393068A2A4C8570AA6FA335B6F063B0040726B1EC0FD14185EEC8E +24406B33720880BF6C4AA798AC2D5617B0D66D5734245721BE6DBC47D9990B23 +8122AF7676586458378BA14DAA5A4745D5CABC9B200824A256B983AD3B5A54FA +8DD24AA5AB2248C8D6DAFE88B2B55075F0EC52147135347F81DEAFCF948606E3 +14A92695B19D56CABDF89FEDCA6F80E6E4D69A0DFF99D86DC88F11FD5FA3A3C1 +64285284FEBC79674BCFA2ADED44359A90D3BC9BD230CC44607478B88A6E8E04 +67C0F7C8BC7CAE6404FF61FE19DD066DDFCA49FD3906B7D32C787DE06908B1DF +6B0B0ACCF1CA0A25AB10E00E4D5A8D0C3299FD37703BC360B2FD5B3DDB06C4D7 +E65580243D3ECFCF0116A9590667DEEE66B240ED7408441F09941FB21951E07C +23ADAFCCEBB1B803ECC8934EE62973EF264458934E1CA2A195218AF915F7C7F0 +879E6FAA363050C6D918C120BD5EA25E0C1CB5B08CDAA8FC4C74DADC2AB701F1 +6FFAC44FAD5A50EC402F70F4C2B400EB82E096398364675257F65B680EECF470 +3EE34ED505E676D67890C8348ED94D1823AAB1214415D55F0490CC2435AE8C3D +B6684096A4CBFE226E7AE728A1B19B8832FB7282B0C3798DA5A68D0EA4AF8728 +90576B1DE985AB57F4980E078225BC8614D6C29F336C5E9F60656D2F7F6AB4C3 +49CFAD8F885A3D4CA30C74613E0205AF23AA216637DB8F8399029F6279A81059 +6487E75ED2E852BC1AEA9C300C455AEEB30CDD6E6108747FD778A0042C6E3F9E +3A35D1B2EC412E383395F9B9E7C66BCCA21889F03207A1A9267B104DE7D912C5 +BFCAE5E84C5F5B24AE8BC4A89FFC58CCE729816CB5CAC247DDC93659FDCEEB82 +CA982383B879671A87722307DD8BE84F65F443B78CC752DB3AB77D59901570F6 +00FAF4342598828BF88EF4FF6AA3918EECDF403BCD3BC892094A5128E251260C +8CEE481AA0CEAAEACBD2D5E9001579738029B0E7F635C6C4962F39E5740DEC77 +5C471D2C56C824C06DF0A81A5D74DC49AE25F30B42D24F3975F6038AAA87704C +4B218F9B7FD3B123DD472A01FE93EA14C8ED5E9949CD49DD86CCBB69B1C31FC9 +AABE7ECAA5701B0D2575AF8A8596254E90D474F2CB892719668573A26C331252 +E12CB6423DF7130A79E658B5B785D2AB6863AA16D6C4C82EE4AF7AAD7E5C8CBE +B88A9459F59BD20669FCDE45812CED19CFAC2A5407CFA3F32D71F34DE70DF3C9 +89CBF353FFD4BAB640708275D41594E6DDDE2D44C7385CC38494DCD832CC9311 +CCAA7BBB3C7D88DAAD64EA4C7D1B861CF372B735FB188A0DAB09C5B4F3268A88 +31F3B9DE0A4843ED779EFF52B99E6C1F4DE7D47D87FA78D778FEC5D6646053CA +99D37997F128EE625EB6956D0C2F54961B377D5D4AAA6E2A79BD5B4D33EED2D3 +0841758218F06BEDA59EAFBB18DF86BE795916AD92E9B7D8D042CB8C40FA372E +309F0A06849644229F2FEE1D970AF403EEBA2C528D346532686293CBC9423D96 +6DEDCFE40DA941925424CB55D60C3828D478B2CDA495D1698B0ABB3A779935CB +4646BC672CB2DA1868276261962E3C44323EEA755FCC82AB3ECA7C6B6E3686D0 +3DCB55AA789622B1360FF857ABDE6BCBBFDF172865931A532762415478975E25 +D1E9ABD08826496E5F2E6E75B044EFBF748591978319C4BC88BF7F96C2EFA24E +1396332393CF6DF32C31F3FCB5D9AEC66188E2691DEBFDEF7BF510D26FFFA12C +FD0E9247BD4F2CE894D6189EA6056452F87482AECDA46B810065262C3F980A52 +307E1AE641F1C9C9506B61458B6C93A1602C3429625F83F4F02D20814AD6BB60 +15751525A90F766784BC6468E720144F081EC2838982303318BA6E6CD8ECA3DB +BBDF75C60D28086BF8F320C806437DCD99F0E8A759A1335A47E3505ABAAD4787 +9F73508D564C1EADCB6808043173ABA35D662FD21E8F808638496D1C9A8BCA25 +04ADEEC7537F481D7DE235F5638F9917A41081384F2F580F7C136130BD80AE75 +4B534ACAD95CAB483C91003ADAAC44DC03CE3C79CC2777D3990B7FEBFA022949 +9F0EB5180DE0F85244FF4BA22E904A0ADB012AB46E43CC9BCE9E7A787A5C6C6F +1ADDD328A106D1AE5D334CA08D9CB12D1A74313C4E0BBB2F2F795CEC42606A82 +964DE25BF84C229C62E68CA7CF456A07E069320688672BCCCD7EA068860F1C52 +75ECDD28D18D1E7A627C3FE5D8F062D7FCBA5245B38B7B7C829411E32638D350 +F86FA328363D1B4FE236DDDD5D327ABDDF56C85E9C77F826A402E79939286D9C +9C9EA6351752CD61A9AD9FE92290D6A0B3D5AE24E25393D501AA2A5B1F08EAD7 +185675405E6E48BB1722D84194DD4AB3AC9E34D3DA2A47FC87C5E3CF18CE4227 +ED29B9A8CF29DA93F1220C9C272DCD31C53CD08ABD163F8DE60A4579419CF0A0 +D133185D44F9D51DCB9AA35CBA2E22779C13DFDC3D83A75451B152FD3D6926FC +9A607428F71FD761E4EE574AC6C52E6C67FF1AF9B6754DB7CA7FCEE64CE04EA9 +2215E20A1DBEF5C74BB515E6203671E2423ADC3210E63A504521FAB3A35463DC +C628BED7B28B217E936D4B4D96218DEE4267826FE2892409609AC243FBFB8DD3 +A1C6B75851F6908687246CB3073FA3CFF94506647E28D0470D6E6DA17D2763E1 +E130164942DA5F704DE35D983C6252283DF5D3ED82456F5FF014DDA97FDB0804 +9708149C93300C455AEEB30CDD6E6108747FD778A0042C6E3EEC68DB4B5C3DDA +2A8BF0D9878CB87C82F9B1263614F9D34A516F4DBAB90FC92048A0A1674F0C08 +108FD2BEB5B8B7A041849901838D0A12D47F8BCF5CC5768C0AB338B70CDB4325 +410E297D9CB2CE808E380D41EBEA85F76CDFD4E8B5EE021FEF16B633D789B5AD +9912A0DA556868811E789E53BD8A5AA2A6206FBC132F4ABF5BB7758DA1791C6F +538914CA986D90864BA13504A76E3B85EB914D31DCEF0F922A1A3365937136D1 +8ABD40E6ECE778CE29AD97997BDAE4EF14F9E60E487517C8ECCA81ED1DCF6532 +9A9FA3E2260E0BF7CA0B74449ECD34DB1F1FEFB74A8F7DDA5F3469BFC41E342F +F7CD42F6B821E75DADFFFE6A15BB39702F57A0E7B290025C06CDD26B204CB34A +56FF7EF68C17B43A9DBCAEE0CDDFA60D1C41E5D2321D9E62703103CE2820714B +43DD9EA62BB2F5000FF23382B079007BCDDDC054CB3867AF0B7E340E3981CC10 +BA076134F052EEE7E7FE9B2134E3EF4DFBE0E746C1915B6A722B85B323F054FE +A3C549E19A12B667165B8292EAC8693E164AE2CB3B276FC7A03B593C2123C513 +B4202A30175C7877D2939F24A13BE4C74F78384E7FD399CC47BB24AB14F8B207 +B57B80116C42EED0BE15D728D7D835AD393E15005FE7B9CE6A7410E32401A3DF +C709FEB708BBE2A37CEAE6E5D1DD91DDE0FD6911D26E5D7122B0337EC764D143 +38305F4E01DC7DF5B3174ECDCC3BA85A857935BD2E498B4B8377F6A19D5F37AF +5096CE711EFEBE6748C6B9CF3D7D8B26B0F41D7874118F68782143F4FE57A1EB +C887F047AB45E4D32D64DB5861E0AE858C398D169818A71C90C19EE0288E61B8 +BC299B163BC67A18CC1881238E64E499E404C7DB577CFE5BFB1BE0C0AC600486 +31D8CDED5524BF40246A18A8D921257BE9AC6BF7CB079B229BCA0E5575961FDD +A498D72C4DDE2FF02340571E2995E314CB8620028544CCDCEF246924AAD62712 +EA4F86EDB1EB6F463B57C71BF73DA92959568DAA606E5F0C7E20E75C2CC65B07 +33771A93C62C37DB28EBBFF37397137C295414BA637EAB20509A1F854A8EEA21 +C5E70B0514089E212DAA98A0A3CAC30C0ABAEBE00AE883C8759D815DA04ADBF2 +CA9A77C1ED88C3BD4085B56819E20597B63023FABF4ED64EE28539A2DB7D1D96 +F5A2FEC37278317A78787F3FDF0C07D30FB6E953C88D145656905CC0205958EB +DEDAFDF5E85F0A98DA2EC4EF7C4377584A285E455DC77FC5FAB087E8DC96EE78 +8CDBC49A0144EC1DDC8C6DE975E748916C19700DCACF79C96921A8E37027F03B +2B5067DE79A45646C06C0CF6854FF340AABD43C4597D9D743B131D9EBBB206B7 +560BBEED98698B437C27D8E8029E3A219D027F81826012B97C1937F25520B97A +F8455D86744C58CC7782AC660B5A711A614DD41BBC091B3067C047BECB40426F +AB5A7E2A19DD99C683B4C2DB11972F290073CFA5975777CE6B1248DD8031AE23 +E2235C8386D1DAE6A6ED3402C449651043B54819DB0CE0C2E24E28E2633EE18A +C485D43E02B584F53F60B90BA510C9DD2C3E946B2626B3DB460CE158403B4CFB +64412D6C83143CECF912D9533D368C40F874B0E501A1B9D3090C821292B20DF3 +517A6756C68E7C0E36DAC409AB42AC251B7A1CAF6D1C9A70594FCDC70EA02740 +7083408AE290BE83D75A567AB70CA686314A5EC24C2FFED7C7B84EEA56E082CC +D1DD7010EE67EB9D1DA3B334782E626A351ABB282AB4B8A3108FDD80FC6B7342 +B0689E44FF094F6385E996D6E72200D7ACC5BBE83743339F41495C647D159B69 +EABFAF8622934F990D5BA559E5A950C40D24510C883C96AF9A12E33F497E4FCC +406A0242E3CDC4D0EA8682D53CA4FF1FA5C5E9AEBC68B85DD11D6B4D9D9BC495 +A1D8149FE74A7C4544B9673317FEB4C01E4E8CA38DD33B79068DE984D6CF6B0E +8F42804A837D27ADC0CD30DCD78D676E71B6C5B04C45323052DF32AD3DFDC4AA +A385FF25F232BCAABA30DA86C9CA204921B77E84384278517E145D32AB61CCE9 +40915851C6CBB8DCAC498506C4D010E97DCF49F80CF556E6EFADAB67888841B6 +73F6697F8E28073A400E7CA0B870444E69AFEED1BA8D20EC3396F9E1858A6C34 +56FFB37280D92C3439AE466E465BC0A94E63E93C35756144E845AD0E6249A25E +DD36B8C9BFC7C22D653555A9D109B31F4B31949FF2314A24715093D1857346C9 +B7CACE5A8625D6BAC4EF528CBBCB4B6B50B2903BA1C260C3815977E91AC37748 +A732CE42C9382BA494EBA21984C2CD68E5CAF96F8DB2367222F5277D1E94BDAD +AA64D3801EC0BDCC402B669F5A540C21A0F014FA3F762B8AB7DA92A2CE6902F3 +D24730DBBAE909650E9CDFFD63D907F62B62B6E29C98C7463BA01675155B34FD +E188D5C7E9F398EED43BC2165F8DD98B36214C37D14DAC9C9950E8A14583A2F7 +F3B1C1AD36832BB25487385C9796372A453B72A234A0E5C84D7DF6240F61E1AE +7646C986F9274BD3037A8512B4C2A8E9FEE3C1F756877006F47F60C4AF9C8410 +666E2219C5D32259D5C43B9DF5B40FFAA78970317A4E1C1A7868B477F41584F4 +82789A5BCAB5EC3273E62C241B46F050B6C68BA1B11FFEFE3B4536FD822835BB +0164F9566D5E39D64F4BB0FA9F85306849283C1D6EB426DDFE23022E75D57D24 +14D85FD4C49F96727F6B66D086D8EE0D5AA6A94B1BA51B61FA20002D182AF804 +5F4D2EB65192F9CD4E6D65FA4911ED0D144480400053B6766511D35870C88509 +B33B4C8F32EFF37B01999B6B27426926646360F1FC19DBC6E21AE59DFB6B80B7 +0DB994E49F632BD6C0B494F0ADF34EA68E7ADCC461BE9D5687863C27E447CC94 +4B141B669141B8DA7B6F916FB339F413C715C54DFB48F90917AD5376B5B5AE61 +D7FA2650E06B691C31AE1B92D8AC4225025F512E3370F154A8E6F18ED777BA48 +DE1AF63A5D19B486645D0FC6C4B3FA5A8786C016A0E841EBB8B8A2FB7C6992B7 +9CD89E5322A61314503365E0E041CD1B1346E65DDFFFDA969D5B6919A849D536 +40C5E50DDC8310EB30A74C6B7EC2CC9DC821CCF8EEEFB666E62FEC68C7AF36BD +A7DCC240A811E1462C0AB7BAF32FC6D44CC70849D1BC36EBA45030BF19219597 +D082D57043E01C805DE21A457E7ABC45F2C0DD41759E99C55EAEAB3284DF9378 +97BD7D603DCBFE0BEAF4302A684DC2D6D6ED96B6AC41648EA11016B1177A91F6 +F3D55EEE12FD99F7ABBDEFF9FCA2F7A3EE54F316C1CC65E014AE71D608026A99 +7F20DA30C91184E98D531A7560A32FD887C2EED0B2CC04D22755726C2DD0E059 +16753BC8C7994925970815B3B2EF63BDEDBF2AF5A711D98D392937D4CEE5DC38 +40FBD6EDCC306463881378D47E86ED282F9C59CDBE52B10CCEE0293F9199A38E +529EC59ACC02BD7509B7627991A7D98597CEE608C97443F03F7E8B9724255A93 +D4359548F4DD0C606778C9D2392A0CAA52B6A43C91B88F0F903819535DDD68E2 +7F7F752F0B5397D3501DC987E63059D97AEB1EAADEDC6565AD6A372571848349 +739DA9B366D0836EC7D6652BE578E3433CC45F1F62952C6AEC9BB506358CC52E +DF2A40FECF8B5317B91478569C6799B105D28D26506E746DA74944529191F098 +C2CE7722B922E028AB375649024C4011D3B59AD39B19392CD45DA9483608347C +E84E6B17BF03DE4232127060DF843329BABD612BA66C5AEF59886AEE8C2B6C55 +B3C213E8A3E7439B2ECD76AC6ADCA1EA4892C1F1656E48F88CAF7061E0FFA2EE +88890B908D354748974B3E8107D38014D8950606D11F1E2A71B7256C2194FBB9 +00F9C5E37A7C2598348DE9CB741A5066C26065B18702A10C883AB55FC7DA2C41 +7D8B0947F4F0925C7D9588C9AC1E8D6F804297D572C0F3E5B35C9C8B1DE51EE3 +EF5898037A0099D12977A2BDD5C5E395AD33AD07EDF272B4E5C1D7273DA2FB4E +8FBE3AA876E7C2EE92E86C2CF0488FCAD74B1C1C40842BFFE1A99FB82D4F2488 +311F088460598148AB2D45330087CBF47FBE16BF31D4E3122F185FC890116846 +56526B04135946B57A3F29EBCD24FB945C02D0C60568E555A60DCAE14ED8EF6F +67E5733DBB6D301CEF6AB97DED8149D6DF4B41BD54F1C831221376C52ADCEBE9 +095FD9D04490CE370CBB4894927F42E85E77340B0A5300815DCAA94DFFA04FAC +35ABC2CB19922044373849C19F979290D4313C327B0ED44D117E1C942FC0D6B5 +E4F60E8400089418E734B340B3515D0B5A842B4DB48F51941B644D69538CA711 +34CF35EADA6D84DB5ED38A0C837E6E932AC4A3DA0BC993D289FB34E276BFCF60 +87074A892374CC2C070528A9470E8A6AED40E33F7678338CC8E302F78A9DBA8A +6547C2AE5DE6F3801169F535E9F896FA963D132B2ED2FAD33FDC400CD2780E93 +537F89E4AAFDA3293205A45ECBFD7721B53D13A0EFDE96C7ED6FC9B7224ED350 +8EBEEBA9DB7187EEC81EEF36EF87788443F0766A6AEC0A848FC5B362F6CA0F02 +92EBD6AD07D982D61C3F1EC9FEC80A54499572BFFE2C7F9AC1E41AC88AA0C09F +0ACEFF82ADDDA3F7697A696EC0CB115432E3F120CA43F476ED4B1B73CBDCABF6 +03BF0F66AD4660B52A2E322E892557AFC0B84FE04333936C3FB8BAAE83637A7C +C7F75F3ADC655EE59E55DB67A07760A365C9E1595A431ABB46CD8DF9152F9BAC +87B2260005A3C1CB50F3AFAD75040CF3FAD4D6F1592E631A2B8F222217A78201 +7A5A1AE88F8F3B7BCEAC98053ABFA7C00CAA313EBE05D5EA40AF9C52AD1948F4 +EB0B700E12A5DA710157D4D3249712471E850216AEBA7B19EA8C5AA5CEE86B23 +94717FEDC37282A2F495E20ED97804EAC0C21624B3835A04017A43DAFFA745E9 +347A21B2FAE608E308570135A7681F228B442476B753E35C570B060A629E113A +BCF2F3C75AAE329DE6AD02D0017E5BDE42ECCD52711C3663A5AF982A0EF8AFEE +6812AAE5B0F966F73647A82DBBDE51C25B284CE2B402FF17EC7B82C2CBBC6140 +114D74C5382027792359609B9B4011F918672006E8CC49BA7257B812CA322EE5 +09ABD2E37732C26E0B1157E28DD3226CC98231DC3E0BB2935E3582566EC6A141 +1FB0293D25E2A21E0B716CF7E7AE50B90CE36F69B7C16D91D1BD43700752114E +358F4ACD6030DC9E0A7C4E3DA9DAFB99BD342CB3D7C408A06515F3A71AF75410 +DC2EC998E981809EDC3ADE028A26F7BA090F3878A7DCAE8D35B1FA5DA2887216 +5844455CBB27271F14C0CFC59018CB46E772CD30D8FDF6C33B5F6934EB53DB90 +6687A758BFF2DE0C61FB39C1702F2BF81CE96E3777576DBD4AFA2AC62BD66C90 +F0DD45DEABD1F8E794ACE22244ED718824CAC69B3175021DEFD1CBD339DABD04 +B48752841B295A953C36191A0C0293E7621E047A1E31F83BB7552ED77213FEC9 +9D1843C7345DF34AAA57C2F6A64CA2BDAC37290BA1C9DBB94AB9BB480136021A +4AA1880A954461DA94ACA1CAC3361E5E45AF341611861C83E30DC1575BBCD593 +498F17664FD287421FEE7815483627F75FDC52C30F401C68513010199F558428 +E7DF6067EBCECD73AC06DBE741197547DE2375096FD6A514FA0D81D44DF28207 +141B153972A503F6F97340AACC691799FE3D6762BD6260F5E0D3A187E37054C9 +9957 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +TeXDict begin 39158280 55380996 1000 600 600 (hol-family.dvi) +@start /Fa 136[69 1[50 27 35 33 2[45 48 73 24 2[24 48 +46 28 40 51 1[46 42 6[55 9[50 65 2[51 2[28 69 1[46 51 +1[59 9[42 42 3[42 3[42 50 47[{ TeXBase1Encoding ReEncodeFont }31 +83.022 /URWPalladioL-Roma rf end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 600dpi +TeXDict begin +%%BeginPaperSize: a4 +/setpagedevice where +{ pop << /PageSize [595 842] >> setpagedevice } +{ /a4 where { pop a4 } if } +ifelse +%%EndPaperSize + end +%%EndSetup +%%Page: 1 1 +TeXDict begin 1 0 bop 0 TeXcolorgray Black 0 TeXcolorgray +0 0 a + /pssetRGBcolor /setrgbcolor load def /pssetCMYKcolor /setcmykcolor +load def /pssetGraycolor /setgray load def + 0 0 a 0 0 a +tx@Dict begin gsave STV CP T /ps@rot 0 def grestore end + 0 0 a 0 0 a +tx@Dict begin gsave STV CP T /ps@refangle 0. def grestore end + 0 0 a 166 5197 a +tx@Dict begin { 85.35823 569.05487 } PutCoor PutBegin end + 166 5197 +a -120 5215 a Fa(Edinbur)o(gh)20 b(LCF)166 5197 y +tx@Dict begin PutEnd end + 166 +5197 a 166 5197 a +tx@Dict begin { 85.35823 512.14938 } PutCoor PutBegin end + 166 5197 a -129 5215 a Fa(Cambridge)g(LCF)166 +5197 y +tx@Dict begin PutEnd end + 166 5197 a 166 5197 a +tx@Dict begin { 85.35823 455.2439 } PutCoor PutBegin end + 166 5197 a 32 5225 a Fa(HOL88)166 +5197 y +tx@Dict begin PutEnd end + 166 5197 a 166 5197 a +tx@Dict begin { 28.45274 398.33841 } PutCoor PutBegin end + 166 5197 a 66 5226 a Fa(hol90)166 +5197 y +tx@Dict begin PutEnd end + 166 5197 a 166 5197 a +tx@Dict begin { 142.26372 384.11203 } PutCoor PutBegin end + 166 5197 a -52 5226 a Fa(Pr)o(oofPower)166 +5197 y +tx@Dict begin PutEnd end + 166 5197 a 166 5197 a +tx@Dict begin { 142.26372 412.56477 } PutCoor PutBegin end + 166 5197 a -91 5222 a Fa(Isabelle/HOL)166 +5197 y +tx@Dict begin PutEnd end + 166 5197 a 166 5197 a +tx@Dict begin { 85.35823 341.43292 } PutCoor PutBegin end + 166 5197 a -35 5215 a Fa(HOL)h(Light)166 +5197 y +tx@Dict begin PutEnd end + 166 5197 a 166 5197 a +tx@Dict begin { 28.45274 284.52744 } PutCoor PutBegin end + 166 5197 a 66 5226 a Fa(hol98)166 +5197 y +tx@Dict begin PutEnd end + 166 5197 a 166 5197 a +tx@Dict begin { 142.26372 284.52744 } PutCoor PutBegin end + 166 5197 a -23 5225 a Fa(HOL)g(Zer)o(o)166 +5197 y +tx@Dict begin PutEnd end + 166 5197 a 166 5197 a +tx@Dict begin { 28.45274 227.62195 } PutCoor PutBegin end + 166 5197 a 53 5225 a Fa(HOL4)166 +5197 y +tx@Dict begin PutEnd end + 166 5197 a @beginspecial @setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 85.35823 520.68529 85.35823 560.51895 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial +@beginspecial @setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 85.35823 463.7798 85.35823 503.61346 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial @beginspecial +@setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 28.45274 293.06334 28.45274 389.80249 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial @beginspecial @setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 28.45274 236.15785 28.45274 275.99152 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial +@beginspecial @setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 28.45274 293.06334 85.35823 332.897 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial @beginspecial +@setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 142.26372 293.06334 85.35823 332.897 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial @beginspecial @setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 142.26372 293.06334 142.26372 375.57613 /Lineto /lineto +load def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial +@beginspecial @setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 85.35823 349.96883 85.35823 446.70798 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial @beginspecial +@setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 28.45274 406.87431 85.35823 446.70798 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial @beginspecial @setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 108.1205 412.56477 85.35823 446.70798 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial +@beginspecial @setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 108.1205 384.11203 85.35823 446.70798 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial @beginspecial +@setspecial + tx@Dict begin STP newpath /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def 0.8 SLW 0 setgray /ArrowA { moveto } def /ArrowB { BeginArrow +1. 1. scale false 0.4 1.4 1.5 2. 1. .setopacityalpha Arrow EndArrow + } def [ 85.35823 349.96883 28.45274 389.80249 /Lineto /lineto load +def 0 setlinejoin false Line gsave 0.8 SLW 0 setgray 1. .setopacityalpha + 0 setlinejoin 0 setlinecap stroke grestore end + +@endspecial 0 TeXcolorgray 0 TeXcolorgray +eop end +%%Trailer +userdict /end-hook known{end-hook}if +%%Trailer +cleartomark +countdictstack +exch sub { end } repeat +restore +%%EOF diff --git a/lectures/images/hol-family.tex b/lectures/images/hol-family.tex new file mode 100644 index 0000000..e65e9c4 --- /dev/null +++ b/lectures/images/hol-family.tex @@ -0,0 +1,38 @@ +\documentclass{minimal} +\usepackage{pstricks} +\pagestyle{empty} + +\begin{document} +\begin{pspicture}(0,6)(8,22) +\usefont{T1}{ppl}{m}{n} +\rput(3,20){Edinburgh LCF} +\rput(3,18){Cambridge LCF} +\rput(3,16){HOL88} +\rput(1,14){hol90} +\rput(5,13.5){ProofPower} +\rput(5,14.5){Isabelle/HOL} +\rput(3,12){HOL Light} +\rput(1,10){hol98} +\rput(5,10){HOL Zero} +\rput(1,8){HOL4} + +\psline{->}(3,19.7)(3,18.3) +\psline{->}(3,17.7)(3,16.3) +\psline{->}(1,13.7)(1,10.3) +\psline{->}(1,9.7)(1,8.3) + + +\psline{->}(3,11.7)(1,10.3) +\psline{->}(3,11.7)(5,10.3) + +\psline{->}(5,13.2)(5,10.3) + +\psline{->}(3,15.7)(3,12.3) +\psline{->}(3,15.7)(1,14.3) +\psline{->}(3,15.7)(3.8,14.5) +\psline{->}(3,15.7)(3.8,13.5) + +\psline{->}(1,13.7)(3,12.3) +\end{pspicture} +\end{document} + diff --git a/lectures/itp_parts_01-04.tex b/lectures/itp_parts_01-04.tex new file mode 100644 index 0000000..2290edf --- /dev/null +++ b/lectures/itp_parts_01-04.tex @@ -0,0 +1,14 @@ +\input{common.inc} + +\setcounter{framenumber}{1} + +\begin{document} + +\partstitleframe{Parts I - IV} + +\input{01_introduction.tex} +\input{02_organisational_matters.tex} +\input{03_hol_overview.tex} +\input{04_hol_logic.tex} +\end{document} + diff --git a/lectures/itp_parts_05-06.tex b/lectures/itp_parts_05-06.tex new file mode 100644 index 0000000..0b7ca0f --- /dev/null +++ b/lectures/itp_parts_05-06.tex @@ -0,0 +1,16 @@ +\input{common.inc} + +%\setbeamertemplate{footline}{} + +\setcounter{part}{4} +\setcounter{framenumber}{42} + +\begin{document} +\partstitleframe{Parts V, VI} + + +\input{05_usage.tex} +\input{06_forward_proofs.tex} + +\end{document} + diff --git a/lectures/itp_parts_07-09.tex b/lectures/itp_parts_07-09.tex new file mode 100644 index 0000000..587f24f --- /dev/null +++ b/lectures/itp_parts_07-09.tex @@ -0,0 +1,16 @@ +\input{common.inc} + +%\setbeamertemplate{footline}{} + +\setcounter{part}{6} +\setcounter{framenumber}{65} + +\begin{document} +\partstitleframe{Parts VII - IX} + +\input{07_backward_proofs.tex} +\input{08_basic_tactics.tex} +\input{09_induction.tex} + +\end{document} + diff --git a/lectures/itp_parts_10-12.tex b/lectures/itp_parts_10-12.tex new file mode 100644 index 0000000..fcf54c5 --- /dev/null +++ b/lectures/itp_parts_10-12.tex @@ -0,0 +1,16 @@ +\input{common.inc} + +%\setbeamertemplate{footline}{} + +\setcounter{part}{9} +\setcounter{framenumber}{123} + +\begin{document} +\partstitleframe{Parts X - XII} + +\input{10_definitions.tex} +\input{11_good_definitions.tex} +\input{12_deep_shallow.tex} + +\end{document} + diff --git a/lectures/itp_parts_13.tex b/lectures/itp_parts_13.tex new file mode 100644 index 0000000..29b192e --- /dev/null +++ b/lectures/itp_parts_13.tex @@ -0,0 +1,18 @@ +\input{common.inc} + +%\setbeamertemplate{footline}{} + +\setcounter{part}{12} +\setcounter{framenumber}{196} + +\begin{document} +\partstitleframe{Part XIII} + +%\input{10_definitions.tex} +%\input{11_good_definitions.tex} +%\input{12_deep_shallow.tex} +\input{13_rewriting.tex} +%\input{14_advanced_definitions.tex} + +\end{document} + diff --git a/lectures/itp_parts_14.tex b/lectures/itp_parts_14.tex new file mode 100644 index 0000000..d7f4133 --- /dev/null +++ b/lectures/itp_parts_14.tex @@ -0,0 +1,14 @@ +\input{common.inc} + +%\setbeamertemplate{footline}{} + +\setcounter{part}{13} +\setcounter{framenumber}{250} + +\begin{document} +\partstitleframe{Part XIV} + +\input{14_advanced_definitions.tex} + +\end{document} + diff --git a/lectures/itp_parts_15.tex b/lectures/itp_parts_15.tex new file mode 100644 index 0000000..0a64983 --- /dev/null +++ b/lectures/itp_parts_15.tex @@ -0,0 +1,14 @@ +\input{common.inc} + +%\setbeamertemplate{footline}{} + +\setcounter{part}{14} +\setcounter{framenumber}{271} + +\begin{document} +\partstitleframe{Part XV} + +\input{15_maintainable_proofs.tex} + +\end{document} + diff --git a/lectures/itp_parts_16-17.tex b/lectures/itp_parts_16-17.tex new file mode 100644 index 0000000..399939f --- /dev/null +++ b/lectures/itp_parts_16-17.tex @@ -0,0 +1,15 @@ +\input{common.inc} + +%\setbeamertemplate{footline}{} + +\setcounter{part}{15} +\setcounter{framenumber}{293} + +\begin{document} +\partstitleframe{Part XVI, XVII} + +\input{16_hol_overview.tex} +\input{17_other_provers.tex} + +\end{document} + diff --git a/lectures/mk_handout.sh b/lectures/mk_handout.sh new file mode 100755 index 0000000..fcd920e --- /dev/null +++ b/lectures/mk_handout.sh @@ -0,0 +1,10 @@ +#!/bin/sh +echo "creating $2.pdf" +mkdir -p tmp +pdflatex -interaction=batchmode -output-directory=tmp "\PassOptionsToClass{handout}{beamer}\def\ttbwflag{}\input{$1.tex}" > /dev/null +pdflatex -interaction=batchmode -output-directory=tmp "\PassOptionsToClass{handout}{beamer}\def\ttbwflag{}\input{$1.tex}" > /dev/null +cd tmp +pdfjam --landscape --a4paper --nup 2x2 --scale 0.9 $1.pdf -o $1-4.pdf -q +cd .. +mkdir -p pdfs +mv tmp/$1-4.pdf pdfs/$2.pdf diff --git a/lectures/mk_slides.sh b/lectures/mk_slides.sh new file mode 100755 index 0000000..5c31a3b --- /dev/null +++ b/lectures/mk_slides.sh @@ -0,0 +1,8 @@ +#!/bin/sh +echo "creating $2.pdf" +mkdir -p tmp +pdflatex -interaction=batchmode -output-directory=tmp $1.tex > /dev/null +pdflatex -interaction=batchmode -output-directory=tmp $1.tex > /dev/null +mkdir -p pdfs +mv tmp/$1.pdf pdfs/$2.pdf + diff --git a/questionnaire/Makefile b/questionnaire/Makefile new file mode 100755 index 0000000..f3e7b38 --- /dev/null +++ b/questionnaire/Makefile @@ -0,0 +1,9 @@ +all: + pdflatex questionnaire.tex + pdflatex questionnaire.tex + pdflatex questionnaire-simple.tex + pdflatex questionnaire-simple.tex + +clean: + rm -f *.toc *.aux *.ps *.log *.lof *.bbl *.blg *.hix *.tid *.tde *.out *~ + diff --git a/questionnaire/questionnaire-simple.tex b/questionnaire/questionnaire-simple.tex new file mode 100644 index 0000000..8d11ac5 --- /dev/null +++ b/questionnaire/questionnaire-simple.tex @@ -0,0 +1,145 @@ +\documentclass[a4paper,10pt,oneside]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[a4paper]{geometry} +\usepackage{hyperref} +\usepackage{url} +\usepackage{color} +\usepackage{amsfonts} + +\title{Background Questionaire} + +\begin{document} + +\begin{center} +\usekomafont{sectioning}\usekomafont{part} Background Questionaire +\end{center} +\bigskip + + +Please try to answer the following questions alone and without using +any external aids. If you have trouble, just skip a question instead +of guessing and thinking very hard. Try not to write lengthy answers, +often bullet-points are enough. This is no exam, please hand in the +results \emph{anonymously}. The results are used only to adapt the +\emph{Interactive Theorem Proving} course to the background and +interests of the audience. + + +\section{Functional Programming} + +\begin{enumerate} +\item Consider the following functional program on lists. +\begin{verbatim} +fun SNOC x [] = [x] + | SNOC x (y::ys) = y::(SNOC x ys) +\end{verbatim} +Please answer the following questions: +\begin{itemize} +\item What is the result of \texttt{SNOC 5 [7,3,2]}? +\item Describe informally (and very briefly) what the function \texttt{SNOC} does. +\end{itemize} + +\item Write a functional program \texttt{APPEND} that appends two lists. +Try to use SML notation. +\texttt{APPEND} should satisfy the following example behaviours +\begin{itemize} +\item \texttt{APPEND [1,2,3] [4,5] = [1,2,3,4,5]} +\item \texttt{APPEND [] [1] = [1]} +\end{itemize} + + +\item What is \emph{tail-recursion} and why is it important for functional programming? + +\item Write a tail-recursive version of \texttt{APPEND}. + +\end{enumerate} + + +\section{Induction Proofs} + +\begin{enumerate} +\item Prove that the following method to calculate the sum of the first $n$ natural numbers is correct (notice $0 \notin \mathbb{N}$, i.\,e.\ $\mathbb{N} = \{1, 2, 3, \ldots\}$): + \[\forall n \in \mathbb{N}.\ \sum_{1 \leq i \leq n} i = \frac{n * (n+1)}{2}\] +\item Prove that \texttt{$\forall$x l.\ LENGTH (SNOC x l) = LENGTH l + 1} holds for the function \texttt{SNOC} given above. You can use arithmetic facts and the + following properties of \texttt{LENGTH}: +\begin{itemize} +\item \texttt{LENGTH [] = 0} +\item \texttt{$\forall$x xs.\ LENGTH (x ::\ xs) = LENGTH xs + 1} +\end{itemize} + +\item Prove that \texttt{APPEND} is associative (hint: via induction). You can use the following + properties of \texttt{APPEND}. Use the notation \texttt{l1 ++ l2} for \texttt{APPEND l1 l2}. + +\begin{itemize} +\item \texttt{$\forall$l.\ [] ++ l = l} +\item \texttt{$\forall$l x xs.\ (x ::\ xs) ++ l = x ::\ (xs ++ l)} +\end{itemize} + +\item Which induction principles do you know? Which ones did you use above? + +\end{enumerate} + + +\section{Logic} + +\begin{enumerate} +\item Explain briefly what's wrong with the following reasoning: +``No cat has two tails. A cat has one more tail than no cat. Therefore, a cat has three tails.'' + +\item It is well known that in ancient times (a) all \emph{Spartans} were \emph{brave} and (b) all \emph{Athenians} were \emph{wise}. +Spartans and Athenians always fought with each other. So there was (c) no dual citizenship. +Once upon a time, 3 Greek philosophers met: Diogenes, Platon and Euklid. In contrast to their +famous namesakes, not much is known about them. We know however, that +(d) they all came from Sparta or Athens. +During their meeting, the 3 philosophers started to argue and finally insulted each other. +Being philosophers they were very careful not to tell a lie, though. +A few fragments of what they said have come to us through the centuries: + +\begin{enumerate} +\item[(e)] Euklid: ``If Platon is from Sparta, then Diogenes is a coward.'' +\item[(f)] Platon: ``Diogenes is a coward, provided Euklid is from Sparta.'' +\item[(g)] Platon: ``If Diogenes is from Athens, then Euklid is a coward.'' +\item[(h)] Diogenes: ``If Platon is from Athens, then Euklid is a moron.'' +\end{enumerate} + +Can you reconstruct from which town each of these philosophers came? +\begin{enumerate} +\item Formalise the relevant parts of the text above in first order logic. Model \emph{is coward} as \emph{is not brave} and \emph{is moron} as \emph{is not wise}. +\item Using the proof method of \emph{resolution} show that Platon is from Sparta. If you + don't know the resolution method, try to show it using some other method. +\item Which town did Euklid come from? +\end{enumerate} + +\item Let the function \textit{myst} for all \textit{R} of type $\alpha \to \alpha \to \textit{bool}$ be given by + +\[ + \textit{myst}(\textit{R}) = \lambda a\, b.\ \forall Q. \left( +\begin{array}{cr} + \forall x.\ Q\, x\, x\ & \wedge \\ + \forall x\,y.\ R\,x\,y\ \Longrightarrow\ Q\, x\, y\ & \wedge \\ + \forall x\,y\,z.\ (Q\,x\,y\ \wedge\ Q\,y\,z)\ \Longrightarrow\ Q\,x\,z +\end{array} +\right) \Longrightarrow Q\,a\,b +\] +\begin{enumerate} +\item Which type does \textit{myst} have? +\item What concept does the type $\alpha \to \alpha \to \textit{bool}$ represent? +\item Translate the formula in English using as high level concepts as possible. +\item What concept does the function \textit{myst} define? +\end{enumerate} +\end{enumerate} + +\section{General} + +Do you have any comments or suggestions? Is there something that you +believe is relevant for selecting and prioritising topics of the +Interactive Theorem Proving course. I'm happy if you don't write +anything here. + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/questionnaire/questionnaire.tex b/questionnaire/questionnaire.tex new file mode 100644 index 0000000..7f40aff --- /dev/null +++ b/questionnaire/questionnaire.tex @@ -0,0 +1,121 @@ +\documentclass[a4paper,11pt,oneside]{scrartcl} + +\usepackage[utf8]{inputenc} +\usepackage[a4paper]{geometry} +\usepackage{hyperref} +\usepackage{url} +\usepackage{color} + +\title{Background Questionaire} + +\begin{document} + +\begin{center} +\usekomafont{sectioning}\usekomafont{part} Background Questionaire +\end{center} +\bigskip + + +Please try to answer the following questions alone and without using any external aids and hand in the results \emph{anonymously}. +This is no exam. +Instead, the results are used to adapt the \emph{Interactive Theorem Proving} course to the background and interests of the audience. + + +\section{Functional Programming} + +\begin{enumerate} +\item Write a functional program \texttt{APPEND} that appends two lists. +Try to use SML notation. +\texttt{APPEND} should satisfy the following example behaviours +\begin{itemize} +\item \texttt{APPEND [1,2,3] [4,5] = [1,2,3,4,5]} +\item \texttt{APPEND [] [1] = [1]} +\end{itemize} + +\item What does \emph{tail-recursion} mean and why is it important for functional programming? + +\item Write a tail-recursive version of \texttt{APPEND}. + +\end{enumerate} + + +\section{Induction Proofs} + +\begin{enumerate} +\item Prove that \texttt{APPEND} is associative (hint: via induction). You can use the following + properties of \texttt{APPEND} and \texttt{CONS}. For convenience use the notation \texttt{l1 ++ l2} for \texttt{APPEND l1 l2} and the notation \texttt{x::xs} for \texttt{CONS x xs}. Be very detailed and formal. + +\begin{itemize} +\item \texttt{$\forall$ l.\ [] ++ xs = l} +\item \texttt{$\forall$ l x xs.\ (x ::\ xs) ++ l = x ::\ (xs ++ l)} +\end{itemize} + +\item Which induction principles do you know? Which one did you use for proving the associativity of \texttt{APPEND}? + +\end{enumerate} + + +\section{Logic} + +\begin{enumerate} +\item Explain briefly what's wrong with the following reasoning: +``No cat has two tails. A cat has one more tail than no cat. Therefore, a cat has three tails.'' + +\item What's wrong with the following classical example of a false chain syllogism? +``Qui bene bibit, bene dormit; qui bene dormit, non peccat; qui non peccat, salvatur; ergo qui bene bibit, salvatur. (Ergo, bibamus!)'' (``Who drinks well, sleeps well. Who sleeps, does not sin. Who does not sin, will go to heaven. Therefore, who drinks well, will go to heaven. (So, let's drink!)'') + + +\item Formalise the following riddle\footnote{found in the German Wikipedia entry for resolution} using first order logic. + +It is well known that in ancient times (a) all \emph{Spartans} were \emph{brave} and (b) all \emph{Athenians} were \emph{wise}. +Spartans and Athenians always fought with each other. So there was (c) no dual citizenship. +Once upon a time, 3 Greek philosophers met: Diogenes, Platon and Euklid. In contrast to their +famous namesakes, not much is known about them. We know however, that +(d) they all came from Sparta or Athens and did not like each other much. +Being philosophers they however never told a lie; even while insulting each other. +A few fragments of their squabbles have come to us through the centuries: + +\begin{enumerate} +\item[(e)] Euklid: ``If Platon is from Sparta, then Diogenes is a coward.'' +\item[(f)] Platon: ``Diogenes is a coward, provided Euklid is from Sparta.'' +\item[(g)] Platon: ``If Diogenes is from Athens, then Euklid is a coward.'' +\item[(h)] Diogenes: ``If Platon is from Athens, then Euklid is a moron.'' +\end{enumerate} + +Can you reconstruct where each of them came from? +Prove that Plato is from Sparta using \emph{resolution}. + +\item Explain very briefly what \emph{Skolemisation} is? +\item Let the function \textit{myst} for all \textit{R} of type $\alpha \to \alpha \to \textit{bool}$ be given by + +\[ + \textit{myst}(\textit{R}) = \lambda a\, b.\ \forall Q. \left( +\begin{array}{cr} + \forall x.\ Q\, x\, x\ & \wedge \\ + \forall x\,y.\ R\,x\,y\ \Longrightarrow\ Q\, x\, y\ & \wedge \\ + \forall x\,y\,z.\ (Q\,x\,y\ \wedge\ Q\,y\,z)\ \Longrightarrow\ Q\,x\,z +\end{array} +\right) \Longrightarrow Q\,a\,b +\] +Which concept does the function \textit{myst} define? If you don't see it, describe as much +as possible. Which type does it have? What is represented by this type? Explain the formula in English using as high level concepts as possible. + +\end{enumerate} + + +\section{General} + +Please write down anything else that you believe is relevant for +selecting and prioritising topics of the Interactive Theorem Proving +course. Do you have any comments or suggestions? Why are you +attending the course? Do you have a concrete application in mind? +Have you used interactive theorem provers before? Which ones? Do you +have experience with other formal method tools like model checkers, +SAT solvers, SMT solvers, first order provers \ldots? Which ones? + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: