jflex-1.4.3/0000755000175000017500000000000011141044634011327 5ustar moonmoonjflex-1.4.3/bin/0000755000175000017500000000000011141044624012076 5ustar moonmoonjflex-1.4.3/bin/jflex0000755000175000017500000000214311014457157013144 0ustar moonmoon#! /bin/bash # # JFlex start script $Revision: 339 $ # # if Java is not in your binary path, you need to supply its # location in this script. The script automatically finds # JFLEX_HOME when called directly, via binary path, or symbolic # link. # # Site wide installation: simply make a symlink from e.g. # /usr/bin/jflex to this script at its original position # #=================================================================== # # configurables: # path to the java interpreter JAVA=java # end configurables # #=================================================================== # # calculate true location PRG=`type $0` PRG="${PRG##* }" # If PRG is a symlink, trace it to the real home directory while [ -L "$PRG" ] do newprg=$(ls -l ${PRG}) newprg="${newprg##*-> }" [ "${newprg}" = "${newprg#/}" ] && newprg="${PRG%/*}/${newprg}" PRG="$newprg" done PRG="${PRG%/*}" JFLEX_HOME="${PRG}/.." # -------------------------------------------------------------------- export CLASSPATH CLASSPATH=$JFLEX_HOME/lib/JFlex.jar $JAVA JFlex.Main $@ #for more memory: #$JAVA -Xmx128m JFlex.Main $@ jflex-1.4.3/bin/jflex.bat0000755000175000017500000000105711014457157013714 0ustar moonmoon@echo off REM Please adjust the paths JFLEX_HOME and JAVA_HOME to suit your needs REM (please do not add a trailing backslash) set JFLEX_HOME=C:\JFLEX REM only needed for JDK 1.1.x: set JAVA_HOME=C:\JAVA REM ------------------------------------------------------------------- set CLPATH=%JAVA_HOME%\lib\classes.zip;%JFLEX_HOME%\lib\JFlex.jar REM for JDK 1.1.x %JAVA_HOME%\bin\java -classpath %CLPATH% JFlex.Main %1 %2 %3 %4 %5 %6 %7 %8 %9 REM for JDK 1.2 rem java -Xmx128m -jar %JFLEX_HOME%\lib\JFlex.jar %1 %2 %3 %4 %5 %6 %7 %8 %9 jflex-1.4.3/COPYRIGHT0000644000175000017500000003065210036465164012637 0ustar moonmoonJFlex - Copying, Warranty & License JFlex is free software, published under the terms of the GNU General Public License. There is absolutely NO WARRANTY for JFlex, its code and its documentation. The code generated by JFlex inherits the copyright of the specification it was produced from. If it was your specification, you may use the generated code without restriction. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS jflex-1.4.3/doc/0000755000175000017500000000000011141044634012074 5ustar moonmoonjflex-1.4.3/doc/COPYRIGHT0000644000175000017500000003065210036465164013404 0ustar moonmoonJFlex - Copying, Warranty & License JFlex is free software, published under the terms of the GNU General Public License. There is absolutely NO WARRANTY for JFlex, its code and its documentation. The code generated by JFlex inherits the copyright of the specification it was produced from. If it was your specification, you may use the generated code without restriction. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS jflex-1.4.3/doc/crossref.png0000644000175000017500000000022207630211541014425 0ustar moonmoonPNG  IHDR  6tRNS-Mc%LIDATxm @ r܁!E BRcdWLTĐB1 <~ۻpjOGCIENDB`jflex-1.4.3/doc/footnote.png0000644000175000017500000000027507630211541014444 0ustar moonmoonPNG  IHDRitRNS-Mc%wIDATx51! W98`9qpK%t$/G:m(]6 ;H$]ZmjƦB{CJM "?H$Z=c;,ZrIENDB`jflex-1.4.3/doc/jflex_anttask.html0000644000175000017500000001266110143314717015630 0ustar moonmoon JFlex Ant Task

JFlex Ant Task

JFlex can be easily integrated with Ant build tool. To use JFlex with Ant, simply copy JFlex.jar to $ANT_HOME/lib/ directory.

Description

The JFlex Ant Task invokes the JFlex lexical analyzer generator on a grammar file.

To use the JFlex task, the following line must be placed in the Ant build file:

<taskdef classname="JFlex.anttask.JFlexTask" name="jflex" />

The JFlex task requires the file attribute to be set to the source grammar file (*.flex). Unless the target directory is specified with the destdir option, the generated class will be saved to the same directory where grammar file resides. Like javac, the JFlex task creates subdirectories in destdir according to the generated class package.

This task only invokes JFlex if the grammar file is newer than the generated files.

Parameters

Attribute Description Required Default
file="file" The grammar file to process. Yes
destdir="dir" The directory to write the generated files to. If not set, the files are written to the directory containing the grammar file. Note that unlike JFlex's "-d" command line option, destdir causes the generated file to be written to {destdir}/{package name}. This behaviour is similar to javac -d dir. No
outdir="dir" The directory to write the generated files to. If not set, the files are written to the directory containing the grammar file. This options works exactly like JFlex's "-d" command line option, it causes the output file to be written to dir regardless of the package name. No
verbose Display generation process messages. No "off"
dump Dump character classes, NFA and DFA tables. No "off"
time or

timeStatistics

Display generation time statistics. No "off"
nomin or

skipMinimization

Skip minimization step. No "off"
skel="file" or

skeleton="file"

Use external skeleton file. No "off"
dot or

generateDot

Write graphviz .dot files for the generated automata (alpha). No "off"
nobak Do not make a backup if the generated file exists. No "off"
switch Use code generation method switch. No "off"
table Use code generation method table. No "off"
pack Use code generation method pack. No "on"

Example

<jflex
    file="src/parser/Parser.flex"
    destdir="build/generated/"
/>

JFlex generates the lexical analyzer for src/parser/Parser.flex and saves the result to build/generated/parser/, providing Parser.flex declares to be in package parser.

<jflex
    file="src/parser/Parser.flex"
    destdir="build/generated/"
/>
<javac
    srcdir="build/generated/"
    destdir="build/classes/"
/>

The same as above plus compile generated classes to build/classes


jflex-1.4.3/doc/logo.gif0000644000175000017500000007601107671141275013544 0ustar moonmoonGIF89aA333333333333880888@80ff@@0@@8H@0@@@H@8P@03f3ff33fH@@HH8P@8PH0HH@PH8HHH33f3f3PH@XH8PHHPP@XH@XP8PPHXP@PPPXPH`P@XPPXXH`PHff`X@XXP`XHXXX`XP3ffhXH`XX``PhXPh`H3333``Xh`P```h`Xp`P3333h``hhXp`XphPhh`phXhhhph`xhXffphhpp`xh`xpXpphxp`3f3fpppxphp`xppxxhphx`xxpxhxxxxpxh333xxpxph33xpxpxxpff̈x3f̈xx̙33333ff3f̨ȸȸȰȸȸи!,A H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ Jљ4%L0P̈́1G!)ʺu'Qluٳh e%HP!)V,cH kR]1#G:r2'H,Q줱c'R[D0b" g2I0t!^˟@]H#MAN\aW D1nLLEs'` ')l z! p2Dq LAߋ0(B|'[6I,[XŐD9ŏEz-2D 1[L9e 7l`z)dB9W'"3)FbvENؐ^EB>yH L0@4S\98% f /Pjdeꪫ$R}D{)Щ뮼4sE6&Ş:5dL,9ĵA,hW(1qy, o1$Qp *P 10/{^v 1q3rI1hF 7Dsx ]'6Vl~ew#han9 ݅-D (' d2AHB Ҋ*K-R'yQQ}p!J//03bAnhk*FAΰX3vLa'-{B] :"q2 4OL *{B J*|z8:촓;N;;Ȏ{=P3L j7qc| 4CHp6a2(Foa4QU`3PdxkO O6PD1c &"N1nP Xvb|?5gDMbnU!Pp4"c*@.!]HVt*h".1rDLXQY:-haVrC HD0+C:@D/(b % F4]R]xQk^sm-%YQHʁu!Hh18]ςJc(#{ӟp-İjf+GIa&N F83 Mږ><݊ x$C5NA:J9C-XpWxO}uF$3aesygG>A8@fKC@"<1:'j*v")`14$qats@]i؊Oh\ {."]<rh #[!:䦗h`8p p 0" !ޅdu@j{z_S1Mk0ZVRj1ďś2f"hMW n~.?zȃ>N m$^I" +@2c{؋!3 bBCLQ"~렉6ց"j&m6 ۑn \fK - qo8.=;T meIn|Fv@oAlz 0\8A/|1M!,T;UeCJ ?[IT}$R) g5l:yz8ϦdzClgz ΨEwk޲u7 4g8:Ϗ>Csn!+ V $']5X6mn.kz[@<AڥCC<D,7}qwx(n2#6&֏'`o^yRigoWI&oTgÑ-oWpjhkik`PR)u -@1p6 Ps6O$6w ΐ J"V-iLa~9z r0  ! F6jHIji%70?€WmjHsy"О2{0 3 7@ǣ♍P p u@?cρMZ+^0718#P-ҚII6 !YdZ"9 ƩUH3RN_f@B3vR)R4wTXe;p蹞hHghگ$ K`D8AY-vJWsAL'ocdhI3(T>I32;?4)LG\1` ʵpq \*b/%G&F֐  Ui3S$=a s2G0q d;c;.ͳs: c-֥Kx(j L0 ;Z!L m$+RWƀc<ƙW5p `C\m84:5)`֮?U}:?_@3[08{kB s'j<QZvk'c _tPUZ Ro˱иr `P?b@?o)R" )>Le3@7zl+H;*p Ub^б#)1s8@2 ` ?" +Z¶`nWz/bfɠ{1pĦ &!2g L"2H0He8-(-(W wawl |\#@wWX!SYgp q:v 2+@S $>ba@)?& @|&H<#0Aĥ b"d dJ\a"Rb/D ǰp L3@ ?,-(cԻWPE 5D;XӘ~WȐ PXC1- esqa VaQ($](A=&&`GPa[6b`z+ _ ³` "I!J]jN= k}Ld.-%՝7!񔁼vG{ 0 C t@JF.8אY ǐJ`-p&WN([B89Np$0$&m8, #R tx$^ ,f`tZ \+eG Nb/]!` S>A9rՎ7#q`:qw tWw #֘ 0 \Ye&O!b/ D!·q$1M+p+`YsZ̥6W˜{\i iZ%\]!#S!VC/  %ܝ1TN!X)#e 0 ~: 882G0~s!mTKAE>`GJͷ1LEP`-=>\>V%b ` (ь}}Nb@ o 0 0  OԮ!,p D[P6:mSb닔%H\nKJHPPBG"$K?|0@3lnsS|E*L1n % ;//Pr `#-*P>SQs@wuwW} 0 r !0*V0`[x`;`V9y ?/ULw8N`.MFn؞%OI?O"o [7o mp*^"c@ weR7>qB_8P73`1 i> `:pA E@y6 䃯LY|a" SpQar֑SA㦍*AbLdK3CL BD!E$YdH;BauK1eΤYM9uf 8D0P@pH⅋/W|se/b09q EhPYCL(2)i)'1TP[.@P}߻rA0E 3PŊ0"O"e'0HI;C1DթQEF͚nd;W{tt;n3AĈ1#fHVD 'f4Ho}G+zAWs7`-q`>^?Lt z+8!l' 8 S0HI hk|`XJa smy m)!Qbp.h[N@­t%` g. FKс E' яO$ʉH-ah rP+2ipa0֙'RR8NFlQ눇K ^A8Crp !)i!XJ $`HDҙ66A HQҀWH V`%SMp!%-jUcr- A(DJWfwjK+t(+y AUDXHQN!BVEV 'dXVOp,>aD2 3$!'$DmÎw%E,'J3|+f``|'P5'XD*8 7B )ESY ,`# ` Ԫ`Vq5( 0Ci ejz7  .ZiPeS;m%Bj$y F!|tAwXyn (:cU..M Q`fcs'.>q9KXb3N$ bRp{t[|Mmq!9LB6tW88 9̧hz8EP x˛l@ywŠ-,ACBGLmV6,Nc]BQb)z< "yhzO u/6&vVo^d=8-6BBXLxh# `BȈ3\Cn`-q ۀA iߚL` >pˬ lG@ǃ[Y):PmȔc>ȃ>p:ȁ HQZ=: "`08Y2KBX3 ^->## ebF5DȜ EU3Y R35C,[,,CaaHcXdI'Q 10UUC2kY{xy^ 1x;;ē T̉ [ P,&L @EB@<<$(l:ӳ8YCPE#B |¥؀*J mi91( 9-pfr@@&4l!!!H>[*е'B_`Ⱥ?:bx>#e0#3@;N?@<^Th點+ (U8Op "8d8!($G\3H̿m!u >9a葺H؄;GW˄@R0MT@L{C̷'0,B_9aHfj`ҋ2*THsITyŐ\0-(QYlVQxI\OV4J ؇Gi}$I  Cr,"@o[L0alA8<myؙQ88 e 8( ѿL¬0@., P9<і*$] .zS! DOMWsD4MBxçsM5\* W(ܜH`H\?d,|_`✈xFQȺi[ #l;t tU O͠=O>O,Og~`OysVT7ْdi}9 Rjpo]8HRP|P;'P5`%*R"% 4^!Ѿ4 8B\Q 1IL +x_jK8Oks- @b@ AR+b%MMRPTP8C*u*hO_HܤMfp?vOH$?7SjNq\p;)#k1򴆢LTE]TF]t |yma>eb:E2o0[̃c$/x5гiZX{/鲂+Ȥ-p=lLQ 0 2' e*Q ݒD f+O!Wu\u-CZȇt'`RDW?M$ӱL]S: @N%':,Yu,T=ԐEԑU % G [cc߅30B <'.m[@xЃ؂BK8mZ'ZiA^3ػH*X C0 A0'Le9_Jjr)z46* "0(uUW aU9MN^HDbc1(`6X@_HgiP؀I Z2q"3ػԙ]-OݐMTYlO ,S(XV@c'M+X GȔWߐ&8fKuFh́]=+)p#__  `)0`rT oqVf") EC8C$e0aW@W(aWkr7Xla-͚M<HkHΥQ̉COh=lxعs h;3Jɜ!V8۽~]D0]c {80$9{8nS  A`qQe CK8e5W>BK=L!u p `jep8 EK* &+Q.9k rq& ؑ>Xx`B afvXp[B,1Wk~aM{"?WcX\s&X5TZCHD-jm l`◰=0(;҉8q.օ|Y0^0F@F]^(0&09@nK N(T(i58 H  ꘈ瘁W C@T!V鼽 /) !-rnj(5+ ԐzmLᓜe8X#;hʹ  V0+hfkX8Q19CPXV Zma`x@$خsNϥQ(rܴޔvpB0=*ۉM8 ؞m^Or@lV;!6'¨80ʒxϗmW!Q6H}BO0>`:nZ 8"@+N).)Z6궽ޞ`, *t @"X nсWAL1f^v5ۂk.lM۬ncy\kk߇ bNhD"8mXkӘX\a(W.nsr0GT}Um0)H+˜O 9 ipJT ::3dC%H&E&!PPH}AMU0:`3xoK/8{xN'o$T҈(<.H/h`Zu``%` g/9;04>`|Þ@(_|m:vN{\r܉u.rXxN 7'b-IӘ؄%؞ 8(7)~.mOc葿Q"zZ!8Ğx}c ;h@XeB+"d^!x!lt@%HD9ЋdZІըUVeUN8J.S r# *RP"3f IdL#Ȑ"G,i%33NqBĉ$N\M[y 0_(PŌI2ZDEFNM"VDWb a\qlZi֪'LjJ*Wbb]| kXcǒclZ:m|1dDg:陕 *FlǜfxF1d1dI+C"R5ղ|뷼_?ΡS]:vH3L 8p1$ǐS`Rev"\aREb3Ix1 ~!D H1 3 Éw )xL>S;3Ǵ$r([9a ɅU D }$K'hQJIR= 4`^$WAVM[ŰMJ)"DC TMEH!I:|W:C'gV[Ă .!W}d*w嵗+6 . vZb, 3`S5D„L f0G|pi& L4Τpa! J-rQFmw^7IJ XBx)LN:̀A@"prI5DL(1H )b' n0~ "B t,14vQ.O0LDxLHSѐQR+") *c֢n1j81'#+zi/V1L7ߤGe6:/'| aik@#I nB,p,z+`=]Rj6C><|! < !3F-~ܺ>µ<e\p'taGpfP|  aKpRILոT[.v C "1#+:֑ fD7ZԀ3 `W k_P a+ cₗ^K5YCADUSF9ovWr .La@"†p$* kxÙ'06~"E$j9XUtY hiurRL8tgu JATs#yx^STJ{5 jfo.:: 5*͓GJ+i~Z P?bݝv,,)J`9fGoׂ5.;׹T6ԈƩY _Ph` (8 x{ EhS/x&PQ$єI., QCtSE0RXTAGL / 8;6/ h3 )jq9ja1Ӳ&29GǎkI^AB1}#+A `$ l_LTx| (D j?8@+D7Cw_ǵHSr744K Za q@ ,ݝg.4 5A EE FN\8^TT`"LT؍\H0nؔW( ZC +֤yNVf@Un bpTQȏ(F+[:Ц[.BW@ d<*=`:_5i\b)bGC3xh8E#Ah U55"/9Y^;tGɟ>p@>Y?A:!ZiurYސvBz( A W` , LLS^ OM\8 @L& $a lGM eWʄfZ.0$C2^@*yq(@%Z @ rf" qD/TjD=@̞PHݔXA aB-l==P)j Ql"Idv Ihig)J 0| BDP x'N,-tLnY8Cr;tq8ԠrvC2j?F4DC, .$u@ (D (V^xx$Y(cL%f )̮yƞgJ͖T '#N6.R &LXR+21ĂHMFVfDD xz︫:lW|b[x :qG[J&7G(Ȥ@_FH"X=Ê-&]`>Cj/'ȁ,h)*^ciĐ (Ael vl?@"E)у"N]<٣r)d4ٙݤV*~ȨaAɋ81_I+ײKhtR͛ZM2H3<4ziRXABbD&DҩSeJ&I#9q}3Υ>~ѫGv;GojZ:'8HࠁC 8pjidɑA8t1ùP^xe[l23fH'NHq"1\ls`pf RTrĉ'b\# Ƀ~HBCĸ~ ;0sf?h9kК3䐃 Nxa b< -i+FEVj\ju,h"TA  RBa7N2.z:眊 H#BvK%OEMZ)^r&*n031($ ! bBϔL*(rѫz`:ނRK/mEKl Fa6M5X4[C33`c43 c\]-p & '`F FN=NZӤ  @O<"1X@ _X&q-y<R.f 6AGEb$hΉE R0:l qhN)HuZd;!3؎8@&'HI1ΔځG'x z9ARn SOv#7iDnk[ f_,Lk$CUx93rK*: q#:8+ rN~7A*Z侪)p1} >FVz|Cf-ŗ}&e{)>"RpST,7.?-h<5p2k\.*PΡɔ g~ t 1GZ[ĩ!gb Z̠FNJR>no.:h#$<!IJp` : AsZ *P " .R 1]X\אa'z.DǞ!xID".(Q( 'hjd/b@cr Q)Xv V'X^'R41tc<=I A`Jក\|yi& 1U-V2,ǃ^2":p ddr2Pk]m "N ~7Bq,6€H"!L0` 6| >A&` ,_cuЖղ#y!A`MLaथF`&ȓ. ja~2:ⶆ+Vϼ-W8por(v HS2$A*7VNrE=qMR n`.^X\((la~=#`PfA`΀7EJM D"VZaTb!6/lga"((L0Flc*,T H&p "QGXW%n枀 ,UA \XFQ]Ñ8u# L3J@DCY,o< 'qPBI؉"Oi0jS40QiM# 7 870 NY2F} .A 8 l⚌gAxcB[ z iz i2J8nRփ! {ؔs.|n]B ൺ}TOq#NjTja Ł.2Si/S,~Vh-Έ.TAa G;X v Hd"Cd`D AS;s zP c.O =yuWM>+ ?}r[v& : ΡDI󹄄.&A*%G_c fR 0 ҭ8ivr[.k0R Z1(΀ ~`z`a @"'^ zMab\o11O;h d#>! MG }IKvbCRKqkOdDTg$ .Q KB r ;:h  H0D6jAHcA̒tsE4h5 4#zՊW2)Ϳ.@ YLM&@ zF=%$/ARfZ(pO̵CԵb " _y7:Ec-ǖFA:.F@H>(0T!.! O#)~@]xQS6wJ0> _ogxr ($a>F'!vrT!H `ن a?,%8fbh=BޡT Ԗ $!c0FCF܀ 7zm>bg 3GacR~QAӠV(r vS0F^A?E@!!*TO(T>!@mt.(5fjac\ Vvr2q]j68X~rs&gnڠ[/bk[`[ e,H]b:2FA@ E>118ME|A@!=.A:A a nKvJNADR=cHDPሥZ` R!2LQz`G"[Y'~ݢ.b0+X R obXrY@u=rGBAnG"C=qɚ7( 7ԥ][a+Ɣ; VY.l2! ;}s)`>Ġj!}8>Afν&CPbMx |̀ Qmz{F?C_ASZnj,ZH !{:g=FD]̈IDDxAc޼EGc7"N_Xy5R T0xBRra+HREE )d^2l c X) H\yd)#m` ܠ{Lh*bѳ> ;6)Da>A8w[J"9#>`>X^J9GF3kj4Q*UĘ1c &:|1ć3RX4jT+fɜ1Y4j$Yfoݾ};w;ʽL.pؾ9s6 z˗R~5?SY4_p.jM2{6^.',I>B-Qy˫Gcz*[~׮r9kN_ڱ[w95ωiSܷI y 3 ~~iT=bFN #7:uA^w`bNd%k#Cm?,>&kݒ6k)İ$yFr`2 "1 }xD ]g| `:&$P 1CU\c?QTx ^r$h¢GQ7 *_v舽A:|mINEPil 8PK W89E#${I(u#6<xB*9 80Fu)&%0Kr lbފQH! Y[;JsriZfFdԴKַ_06bhF P@@gi_"&1 L,N0gn4XtӆAH^x i2HGQN LHf(RDZY"2R`%1;Q*$ͼI8'TQD.R .E L S6҆\bC7Rp#BUV$QИ'CAG\"'s%W'_Hժ|C|._s& &!D,! bֵѬdNh۔.>Y 28uYBlR/LNvF!:Ї )Zq dl<8ꬶ$%_@(H=6Px#5&tZ1;UvsDܠ&1G:@"]H3k11Mڣnik 3T˴WܣTj`CD¼h+B.F[ ʙSrҺc ZT9% cI8@J [=lƪ>;r5mM9Ypu%)AI a H$V=/ '& W(*F !A`O =p@/N .tcRLySa{e $&2@HDz'PK4@9j#=ird6I fh)D"'s8F[Rd 9 f  g(>&N1b<"c$^F *jX04T>xDvp|-o@C +C"&ʫИwJ`F4+=C80[Ld:d" a vPp8"'hZH+$:N&2XB@2c Lx!9AJFҀ[qi@ur"I٣t6GC! :>1rcRz5k:)|aA )ʆJTr 0l s3CO}6H'cdt<7niVb[M]"gA:8$Ípx9 D. _+_",k+ ;”~8)eـ+mU?@\_]0Y3 C`90&%xI( P  13ZZ7i[ׂ:%`@VA)ҳv3 ;' a]bφ6.!' $5Eu#6_! C G n8 lf%\"@jN`sq@T1À cTQe`gS{S>Xs {tr p7̵p#0c[+@+;rp}}0 6TR,@Q$'LCݐ ǐ!G)Z%-NlT gfՅht CGj AgH@HBDLAAI183:sb.uv p@\PW0 Sa)v 0[W"6T{= uPA!⨑CЌ_ 7 r[[}ff4&Sjvm5iD/za~({5u6Q6gvr { W\ `p'Wzp\L}@ SCآX-GWp^i/1Y01m.6Q,lOUV$ h)NlD@Tǁ2Ԁ@#3p)3;S!7px x m`u]P 1bu@/2 V?(=w3̀Ivxz yI$VPlLЂf7L@tm`I@5esKF)`%?z0&`kxEF(g'pǀ zLz T U-|'*d pp1Y+H@be40n=piMp#Sf6O4s'0s5s)`T^6v쨑I;3#ɚ@Y]'P%aCY=jc XCi j5Q%) d'' aN179hN&apTcT6/-gNPNSN 6h r`u* aOItYgUh$X{*N;bG$5x02W0_ʶ/SAf@1}@bb x8yAѬ @#oZ$"࡟rzJu`0 _e=f> >)%`Lݒ6@dr&Ga @43cKr908W0PvAa&ql q t[zR*@9 j*4)[$@[P*Jj3y&Q;DЀP[:'XgZ'0_a;_EUdRtоrm/!@"+3LXq @|aP.W >I' K)  NQ۸ ϊ 4\A}ao(;E\I --{U£YLƔY fN6rxD62-F'p:>8Y33PM 9`K1 { &X`(LwS0;!+C3 fh0 gPw@A M$2jg_pxD∅CFT9VVPNkWV@4 SKp|v(A0@r  P p ^ O,ŇWaQ.Ug}xL `"8J}* I Ǔ >:7 Hs cbքW$S#Gs{gB G@HjS9t ";Ff_Bam'<j[W0 |B\PhMt3(̓ qG/,Lam;#j-QAY8D #E5sWk,^۳}a@ - p W8C`J=!q[ |h@̧Ph-E MttK7 q6ȝ鰹q+u'p0 )`E,A(Ά` D *B,%vPԆ3] =$q3g; ?|X:|$6fuvH6ף`!ozwbI  /}TUnUN@ B֘"uxX @RГVd9@dэCDU[LP q 2Љ:r幣ujd (l@`%,wydu Ԡ RP((eCSW4` kr/ai.`ЈLT`kpӆSt0 &tut6 D93Ɓ uŅؾQ p) 7O+@,|OYTK>`0-sj#Pbu_ia:ʵZR՝ "07 b Q y`Suyle6SݐڰU, <0J0HϘ&y F1`/e` Zm s{Ӯ%%~tP:\`QIiגpݪ xt_Z|-1 07q5X7N07AuJAu_L5w1w*WEff6I+W /uWJܪ0vdEBʘd0B1C %b0I6mvQ5jY6-3j6:c$2f!d(E 'qSL5mYS')`b'[a A 1Ō/[Lb 9txeh+NXbD:a&6*NĸbmPR*X!3 "H1G(+Sh# GyE A yĉbڵmƝ[!=cF@b9>$#hڋvD02?gY1 <9FdCdmBCg#sMc9`fFAE'Z! IBXCv'΂b ؀ R)@BIr )rId /982? lJH*\NC%"DulQEúj.(A ⎊߆;OG- '{uGXu &@"0)$1X:hȤ#I&ɄR1PG'Q%7ƣmg vp͵ GcB$ "[]#s&$fcA0{B%)"˂ Ҫ ÀB:Yde)*8!/9 DF'&5.xA'3@ BX'AIOcee-PL`5"B':D!aj CY°.x |("x0g= x&gm.Zt:x#"X"sYcp`"ĀAx8@-`DnK`ãHT",aϫE`t'oCJ (VI ȓ5IYV`Ƈ*MB~͂3}-D҂)k 9,F}R(X Q%AIrI!! wtHf6ә.$LóE?bI q&r6O$; B$G w"9*A;<)O$)caUkЅg*[0 y @a‘`Yae fqE(b'qZ7q t&q)j2Z O8JAZ- xATGcQvի_T g'`!!0`gb8@'.+wG>r"mbx'v̘UopC0A (JB!1$`^"Xuc%pxh'"%'drJwK]*XfMSOhzito0>xSIuL˨MlqdEozՋ$&#朠]H 1DgdIV$G7kB 5`b#P$$l-Ų ""UYST (W2A“ 0>Y?c8MR^_>?M'АU#I8j!\ AaXcY:쑲( :jmy F21 _|xN-͵)T 4 r )E' RD`i )OJM> NaQ.;lu VVS8tEJgѰ]7wC>ኃz;!-`BAae28 o@?y'lCj;th5}-(_3a hnf* %>"K: .2@ -5\\QS r/n[ncU!yVA" R[o[јK8~ ޜ#< EIJBK^ )<_Є"Xyl[j6t`5g _“0BP0akqRL,1 D{l66}ŽNզ @t@xr NT ڗ-D!v$(LYT@KC|P ? s(Z@`Oh@xM88x0 *bsAD`#*pj @ )%A(> d&TQ-{2>. <>KNmȉ3P@%=B=ς9Vc= T=:_S(/-8'd! 6`SA'-тA`4&X@*>Z=ApTTUW08+D3&p1|8H#P҃ϒ9 C]FhiZU @蘂jB;;{3K<(q D(Fk)>y L@6ZsVTȅdH8'8ęE0 @CRahlC\\W[F\jQEE?3dPAL+hDC?J܎NAI3X)[kȯK<DX/BIy$@J0/ځL`=SI \Ijt]ZLImì́ 0.>S)(D%`;)&*yGG6p<{t/~".Lp@(QJ()H![ ˳=j`hKI¬;iTN¬ 4A`TTh)@q" L0MtʮtO>H젃υ.x } ׈+,LWpPlX`pDd-؂%hEyD/JM/E?/$ ) H2:R$PCPX: 5'*,>9>-86Bhd#3@%7Sc \ S5ف+8`T'pRWX40K[؄Bl354,7SEUٴM1zS 3 FC T Ȅ | dA(!pV XYB8TlM# 23 Ћ;U"@T w%OVUN@-Nm}װJ V݊-% 9Z!>Ȅ>)~؍T!s!0pEp0ӳ<x" GDp5؛ٜ=R $ 2ȯt38H @'c}LڨگJ?a?Y#2ˁEJ}J3ש5۳Ef-h}Z3'6TL۽۾ёr}IuǝeP-(-VōQYEC3;EUݘ]A+(Օ\V8B%5E^'|ŇO`ޗx6 ;jflex-1.4.3/doc/manual.css0000644000175000017500000000170107606571215014075 0ustar moonmoonbody { background-color:#FFFFFF; } table { background-color:#F0F0F0; } h1 { font-size:16pt; font-style:italic; font-weight:bold; font-family:arial,helvetica; border-top-width:medium; border-top-style:solid; padding-top:5mm; margin-top:1cm; } h2 { font-size:14pt; font-style:italic; font-weight:bold; font-family:arial,helvetica; border-top-width:medium; border-top-style:solid; padding-top:5mm; margin-top:1cm; } h3 { font-size:14pt; font-weight:bold; font-family:arial,helvetica; margin-top:1cm; } h4 { font-size:12pt; font-family:arial,helvetica; } SMALL.TINY { font-size:xx-small } SMALL.SCRIPTSIZE { font-size:xx-small } SMALL.FOOTNOTESIZE { font-size:x-small } SMALL.SMALL { font-size:small } BIG.LARGE { font-size:large } BIG.XLARGE { font-size:x-large } BIG.XXLARGE { font-size:xx-large } BIG.HUGE { font-size:xx-large } BIG.XHUGE { font-size:xx-large } jflex-1.4.3/doc/manual.html0000644000175000017500000040153511141044634014247 0ustar moonmoon JFlex User's Manual

The Fast Lexical Analyser Generator

Copyright ©1998-2009 by Gerwin Klein


JFlex User's Manual


Version 1.4.3, January 31, 2009


Contents


Introduction

JFlex is a lexical analyser generator for Java[*]written in Java. It is also a rewrite of the very useful tool JLex [3] which was developed by Elliot Berk at Princeton University. As Vern Paxson states for his C/C++ tool flex [11]: they do not share any code though.

Design goals

The main design goals of JFlex are:
  • Full unicode support
  • Fast generated scanners
  • Fast scanner generation
  • Convenient specification syntax
  • Platform independence
  • JLex compatibility

About this manual

This manual gives a brief but complete description of the tool JFlex. It assumes that you are familiar with the issue of lexical analysis. The references [1], [2], and [13] provide a good introduction to this topic.

The next section of this manual describes installation procedures for JFlex. If you never worked with JLex or just want to compare a JLex and a JFlex scanner specification you should also read Working with JFlex - an example (section 3). All options and the complete specification syntax are presented in Lexical specifications (section 4); Encodings, Platforms, and Unicode (section 5) provides information about scanning text vs. binary files. If you are interested in performance considerations and comparing JLex with JFlex speed, a few words on performance (section 6) might be just right for you. Those who want to use their old JLex specifications may want to check out section 7.1 Porting from JLex to avoid possible problems with not portable or non standard JLex behaviour that has been fixed in JFlex. Section 7.2 talks about porting scanners from the Unix tools lex and flex. Interfacing JFlex scanners with the LALR parser generators CUP and BYacc/J is explained in working together (section 8). Section 9 Bugs gives a list of currently known active bugs. The manual concludes with notes about Copying and License (section 10) and references.


Installing and Running JFlex

Installing JFlex


Windows

To install JFlex on Windows 95/98/NT/XP, follow these three steps:
  1. Unzip the file you downloaded into the directory you want JFlex in (using something like WinZip). If you unzipped it to say C:\, the following directory structure should be generated:
    C:\JFlex\                          
          +--bin\                   (start scripts) 
          +--doc\                   (FAQ and manual)
          +--examples\ 
                   +--binary\       (scanning binary files)
                   +--byaccj\       (calculator example for BYacc/J)
                   +--cup\          (calculator example for cup)
                   +--interpreter\  (interpreter example for cup)
                   +--java\         (Java lexer specification) 
                   +--simple\       (example scanner)
                   +--simple-maven\ (example with maven)
                   +--standalone\   (a simple standalone scanner)
                   +--standalone-maven\  (above with maven)
          +--lib\                   (the precompiled classes) 
          +--src\ 
              +--JFlex\             (source code of JFlex) 
              +--JFlex\gui          (source code of JFlex UI classes)
              +--java_cup\runtime\  (source code of cup runtime classes)
    

  2. Edit the file bin\jflex.bat (in the example it's C:\JFlex\bin\jflex.bat) such that

    • JAVA_HOME contains the directory where your Java JDK is installed (for instance C:\java) and
    • JFLEX_HOME the directory that contains JFlex (in the example: C:\JFlex)

  3. Include the bin\ directory of JFlex in your path. (the one that contains the start script, in the example: C:\JFlex\bin).

Unix with tar archive

To install JFlex on a Unix system, follow these two steps:

  • Decompress the archive into a directory of your choice with GNU tar, for instance to /usr/share:

    tar -C /usr/share -xvzf jflex-1.4.3.tar.gz

    (The example is for site wide installation. You need to be root for that. User installation works exactly the same way--just choose a directory where you have write permission)

  • Make a symbolic link from somewhere in your binary path to bin/jflex, for instance:

    ln -s /usr/share/JFlex/bin/jflex /usr/bin/jflex

    If the Java interpreter is not in your binary path, you need to supply its location in the script bin/jflex.

You can verify the integrity of the downloaded file with the MD5 checksum available on the JFlex download page. If you put the checksum file in the same directory as the archive, you run:

md5sum --check jflex-1.4.3.tar.gz.md5

It should tell you

jflex-1.4.3.tar.gz: OK

Linux with RPM

  • become root
  • issue
    rpm -U jflex-1.4.3-0.rpm

You can verify the integrity of the downloaded rpm file with

rpm --checksig jflex-1.4.3-0.rpm

Running JFlex

You run JFlex with:

jflex <options> <inputfiles>

It is also possible to skip the start script in bin\ and include the file lib\JFlex.jar in your CLASSPATH environment variable instead.

Then you run JFlex with:

java JFlex.Main <options> <inputfiles>

The input files and options are in both cases optional. If you don't provide a file name on the command line, JFlex will pop up a window to ask you for one.

JFlex knows about the following options:

-d <directory>
writes the generated file to the directory <directory>

--skel <file>
uses external skeleton <file>. This is mainly for JFlex maintenance and special low level customisations. Use only when you know what you are doing! JFlex comes with a skeleton file in the src directory that reflects exactly the internal, pre-compiled skeleton and can be used with the -skel option.

--nomin
skip the DFA minimisation step during scanner generation.

--jlex
tries even harder to comply to JLex interpretation of specs.

--dot
generate graphviz dot files for the NFA, DFA and minimised DFA. This feature is still in alpha status, and not fully implemented yet.

--dump
display transition tables of NFA, initial DFA, and minimised DFA

--verbose or -v
display generation progress messages (enabled by default)

--quiet or -q
display error messages only (no chatter about what JFlex is currently doing)

--time
display time statistics about the code generation process (not very accurate)

--version
print version number

--info
print system and JDK information (useful if you'd like to report a problem)

--pack
use the %pack code generation method by default

--table
use the %table code generation method by default

--switch
use the %switch code generation method by default

--help or -h
print a help message explaining options and usage of JFlex.


A simple Example: How to work with JFlex

To demonstrate what a lexical specification with JFlex looks like, this section presents a part of the specification for the Java language. The example does not describe the whole lexical structure of Java programs, but only a small and simplified part of it (some keywords, some operators, comments and only two kinds of literals). It also shows how to interface with the LALR parser generator CUP [8] and therefore uses a class sym (generated by CUP), where integer constants for the terminal tokens of the CUP grammar are declared. JFlex comes with a directory examples, where you can find a small standalone scanner that doesn't need other tools like CUP to give you a running example. The "examples" directory also contains a complete JFlex specification of the lexical structure of Java programs together with the CUP parser specification for Java by C. Scott Ananian, obtained from the CUP [8] web site (it was modified to interface with the JFlex scanner). Both specifications adhere to the Java Language Specification [7].

/* JFlex example: part of Java language lexer specification */
import java_cup.runtime.*;

/**
 * This class is a simple example lexer.
 */
%%
%class Lexer
%unicode
%cup
%line
%column
%{
  StringBuffer string = new StringBuffer();

  private Symbol symbol(int type) {
    return new Symbol(type, yyline, yycolumn);
  }
  private Symbol symbol(int type, Object value) {
    return new Symbol(type, yyline, yycolumn, value);
  }
%}
LineTerminator = \r|\n|\r\n
InputCharacter = [^\r\n]
WhiteSpace     = {LineTerminator} | [ \t\f]

/* comments */
Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment}

TraditionalComment   = "/*" [^*] ~"*/" | "/*" "*"+ "/"
EndOfLineComment     = "//" {InputCharacter}* {LineTerminator}
DocumentationComment = "/**" {CommentContent} "*"+ "/"
CommentContent       = ( [^*] | \*+ [^/*] )*

Identifier = [:jletter:] [:jletterdigit:]*

DecIntegerLiteral = 0 | [1-9][0-9]*
%state STRING

%%
/* keywords */
<YYINITIAL> "abstract"           { return symbol(sym.ABSTRACT); }
<YYINITIAL> "boolean"            { return symbol(sym.BOOLEAN); }
<YYINITIAL> "break"              { return symbol(sym.BREAK); }
<YYINITIAL> {
  /* identifiers */ 
  {Identifier}                   { return symbol(sym.IDENTIFIER); }
 
  /* literals */
  {DecIntegerLiteral}            { return symbol(sym.INTEGER_LITERAL); }
  \"                             { string.setLength(0); yybegin(STRING); }

  /* operators */
  "="                            { return symbol(sym.EQ); }
  "=="                           { return symbol(sym.EQEQ); }
  "+"                            { return symbol(sym.PLUS); }

  /* comments */
  {Comment}                      { /* ignore */ }
 
  /* whitespace */
  {WhiteSpace}                   { /* ignore */ }
}
<STRING> {
  \"                             { yybegin(YYINITIAL); 
                                   return symbol(sym.STRING_LITERAL, 
                                   string.toString()); }
  [^\n\r\"\\]+                   { string.append( yytext() ); }
  \\t                            { string.append('\t'); }
  \\n                            { string.append('\n'); }

  \\r                            { string.append('\r'); }
  \\\"                           { string.append('\"'); }
  \\                             { string.append('\\'); }
}
/* error fallback */
.|\n                             { throw new Error("Illegal character <"+
                                                    yytext()+">"); }

From this specification JFlex generates a .java file with one class that contains code for the scanner. The class will have a constructor taking a java.io.Reader from which the input is read. The class will also have a function yylex() that runs the scanner and that can be used to get the next token from the input (in this example the function actually has the name next_token() because the specification uses the %cup switch).

As with JLex, the specification consists of three parts, divided by %%:


Code to include

Let's take a look at the first section, ``user code'': The text up to the first line starting with %% is copied verbatim to the top of the generated lexer class (before the actual class declaration). Beside package and import statements there is usually not much to do here. If the code ends with a javadoc class comment, the generated class will get this comment, if not, JFlex will generate one automatically.


Options and Macros

The second section ``options and declarations'' is more interesting. It consists of a set of options, code that is included inside the generated scanner class, lexical states and macro declarations. Each JFlex option must begin a line of the specification and starts with a %. In our example the following options are used:

  • %class Lexer tells JFlex to give the generated class the name ``Lexer'' and to write the code to a file ``Lexer.java''.

  • %unicode defines the set of characters the scanner will work on. For scanning text files, %unicode should always be used. See also section 5 for more information on character sets, encodings, and scanning text vs. binary files.

  • %cup switches to CUP compatibility mode to interface with a CUP generated parser.

  • %line switches line counting on (the current line number can be accessed via the variable yyline)

  • %column switches column counting on (current column is accessed via yycolumn)

The code included in %{...%} is copied verbatim into the generated lexer class source. Here you can declare member variables and functions that are used inside scanner actions. In our example we declare a StringBuffer ``string'' in which we will store parts of string literals and two helper functions ``symbol'' that create java_cup.runtime.Symbol objects with position information of the current token (see section 8.1 JFlex and CUP for how to interface with the parser generator CUP). As JFlex options, both %{ and \%} must begin a line.

The specification continues with macro declarations. Macros are abbreviations for regular expressions, used to make lexical specifications easier to read and understand. A macro declaration consists of a macro identifier followed by =, then followed by the regular expression it represents. This regular expression may itself contain macro usages. Although this allows a grammar like specification style, macros are still just abbreviations and not non terminals - they cannot be recursive or mutually recursive. Cycles in macro definitions are detected and reported at generation time by JFlex.

Here some of the example macros in more detail:

  • LineTerminator stands for the regular expression that matches an ASCII CR, an ASCII LF or an CR followed by LF.

  • InputCharacter stands for all characters that are not a CR or LF.

  • TraditionalComment is the expression that matches the string "/*" followed by a character that is not a *, followed by anything that does not contain, but ends in "/*". As this would not match comments like /****/, we add "/*" followed by an arbitrary number (at least one) of "*" followed by the closing "/". This is not the only, but one of the simpler expressions matching non-nesting Java comments. It is tempting to just write something like the expression "/*" .* "*/", but this would match more than we want. It would for instance match the whole of /* */ x = 0; /* */, instead of two comments and four real tokens. See DocumentationComment and CommentContent for an alternative.

  • CommentContent matches zero or more occurrences of any character except a * or any number of * followed by a character that is not a /

  • Identifier matches each string that starts with a character of class jletter followed by zero or more characters of class jletterdigit. jletter and jletterdigit are predefined character classes. jletter includes all characters for which the Java function Character.isJavaIdentifierStart returns true and jletterdigit all characters for that Character.isJavaIdentifierPart returns true.

The last part of the second section in our lexical specification is a lexical state declaration: %state STRING declares a lexical state STRING that can be used in the ``lexical rules'' part of the specification. A state declaration is a line starting with %state followed by a space or comma separated list of state identifiers. There can be more than one line starting with %state.


Rules and Actions

The "lexical rules" section of a JFlex specification contains regular expressions and actions (Java code) that are executed when the scanner matches the associated regular expression. As the scanner reads its input, it keeps track of all regular expressions and activates the action of the expression that has the longest match. Our specification above for instance would with input "breaker" match the regular expression for Identifier and not the keyword "break" followed by the Identifier "er", because rule {Identifier} matches more of this input at once (i.e. it matches all of it) than any other rule in the specification. If two regular expressions both have the longest match for a certain input, the scanner chooses the action of the expression that appears first in the specification. In that way, we get for input "break" the keyword "break" and not an Identifier "break".

Additional to regular expression matches, one can use lexical states to refine a specification. A lexical state acts like a start condition. If the scanner is in lexical state STRING, only expressions that are preceded by the start condition <STRING> can be matched. A start condition of a regular expression can contain more than one lexical state. It is then matched when the lexer is in any of these lexical states. The lexical state YYINITIAL is predefined and is also the state in which the lexer begins scanning. If a regular expression has no start conditions it is matched in all lexical states.

Since you often have a bunch of expressions with the same start conditions, JFlex allows the same abbreviation as the Unix tool flex:

<STRING> {
  expr1   { action1 }
  expr2   { action2 }
}
means that both expr1 and expr2 have start condition <STRING>.

The first three rules in our example demonstrate the syntax of a regular expression preceded by the start condition <YYINITIAL>.

<YYINITIAL> "abstract" { return symbol(sym.ABSTRACT); }

matches the input "abstract" only if the scanner is in its start state "YYINITIAL". When the string "abstract" is matched, the scanner function returns the CUP symbol sym.ABSTRACT. If an action does not return a value, the scanning process is resumed immediately after executing the action.

The rules enclosed in

<YYINITIAL> {
...
}

demonstrate the abbreviated syntax and are also only matched in state YYINITIAL.

Of these rules, one may be of special interest:

\" { string.setLength(0); yybegin(STRING); }

If the scanner matches a double quote in state YYINITIAL we have recognised the start of a string literal. Therefore we clear our StringBuffer that will hold the content of this string literal and tell the scanner with yybegin(STRING) to switch into the lexical state STRING. Because we do not yet return a value to the parser, our scanner proceeds immediately.

In lexical state STRING another rule demonstrates how to refer to the input that has been matched:

[^\n\r\"]+ { string.append( yytext() ); }

The expression [^\n\r\"]+ matches all characters in the input up to the next backslash (indicating an escape sequence such as \n), double quote (indicating the end of the string), or line terminator (which must not occur in a string literal). The matched region of the input is referred to with yytext() and appended to the content of the string literal parsed so far.

The last lexical rule in the example specification is used as an error fallback. It matches any character in any state that has not been matched by another rule. It doesn't conflict with any other rule because it has the least priority (because it's the last rule) and because it matches only one character (so it can't have longest match precedence over any other rule).

How to get it going

  • Install JFlex (see section 2 Installing JFlex)

  • If you have written your specification file (or chosen one from the examples directory), save it (say under the name java-lang.flex).

  • Run JFlex with

    jflex java-lang.flex

  • JFlex should then report some progress messages about generating the scanner and write the generated code to the directory of your specification file.

  • Compile the generated .java file and your own classes. (If you use CUP, generate your parser classes first)

  • That's it.


Lexical Specifications

As shown above, a lexical specification file for JFlex consists of three parts divided by a single line starting with %%:

UserCode
%%
Options and declarations
%%
Lexical rules

In all parts of the specification comments of the form /* comment text */ and the Java style end of line comments starting with // are permitted. JFlex comments do nest - so the number of /* and */ should be balanced.


User code

The first part contains user code that is copied verbatim into the beginning of the source file of the generated lexer before the scanner class is declared. As shown in the example above, this is the place to put package declarations and import statements. It is possible, but not considered as good Java programming style to put own helper class (such as token classes) in this section. They should get their own .java file instead.


Options and declarations

The second part of the lexical specification contains options to customise your generated lexer (JFlex directives and Java code to include in different parts of the lexer), declarations of lexical states and macro definitions for use in the third section ``Lexical rules'' of the lexical specification file.

Each JFlex directive must be situated at the beginning of a line and starts with the % character. Directives that have one or more parameters are described as follows:

%class "classname"

means that you start a line with %class followed by a space followed by the name of the class for the generated scanner (the double quotes are not to be entered, see the example specification in section 3).


Class options and user class code

These options regard name, constructor, API, and related parts of the generated scanner class.
  • %class "classname"

    Tells JFlex to give the generated class the name "classname" and to write the generated code to a file "classname.java". If the -d <directory> command line option is not used, the code will be written to the directory where the specification file resides. If no %class directive is present in the specification, the generated class will get the name "Yylex" and will be written to a file "Yylex.java". There should be only one %class directive in a specification.

  • %implements "interface 1"[, "interface 2", ..]

    Makes the generated class implement the specified interfaces. If more than one %implements directive is present, all the specified interfaces will be implemented.

  • %extends "classname"

    Makes the generated class a subclass of the class ``classname''. There should be only one %extends directive in a specification.

  • %public

    Makes the generated class public (the class is only accessible in its own package by default).

  • %final

    Makes the generated class final.

  • %abstract

    Makes the generated class abstract.

  • %apiprivate

    Makes all generated methods and fields of the class private. Exceptions are the constructor, user code in the specification, and, if %cup is present, the method next_token. All occurrences of " public " (one space character before and after public) in the skeleton file are replaced by " private " (even if a user-specified skeleton is used). Access to the generated class is expected to be mediated by user class code (see next switch).

  • %{
    ...
    %}

    The code enclosed in %{ and %} is copied verbatim into the generated class. Here you can define your own member variables and functions in the generated scanner. Like all options, both %{ and %} must start a line in the specification. If more than one class code directive %{...%} is present, the code is concatenated in order of appearance in the specification.

  • %init{
    ...
    %init}

    The code enclosed in %init{ and %init} is copied verbatim into the constructor of the generated class. Here, member variables declared in the %{...%} directive can be initialised. If more than one initialiser option is present, the code is concatenated in order of appearance in the specification.

  • %initthrow{
    "exception1"[, "exception2", ...]
    %initthrow}

    or (on a single line) just

    %initthrow "exception1" [, "exception2", ...]

    Causes the specified exceptions to be declared in the throws clause of the constructor. If more than one %initthrow{ ... %initthrow} directive is present in the specification, all specified exceptions will be declared.

  • %ctorarg "type" "ident"

    Adds the specified argument to the constructors of the generated scanner. If more than one such directive is present, the arguments are added in order of occurrence in the specification. Note that this option conflicts with the %standalone and %debug directives, because there is no sensible default that can be created automatically for such parameters in the generated main methods. JFlex will warn in this case and generate an additional default constructor without these parameters and without user init code (which might potentially refer to the parameters).

  • %scanerror "exception"

    Causes the generated scanner to throw an instance of the specified exception in case of an internal error (default is java.lang.Error). Note that this exception is only for internal scanner errors. With usual specifications it should never occur (i.e. if there is an error fallback rule in the specification and only the documented scanner API is used).

  • %buffer "size"

    Set the initial size of the scan buffer to the specified value (decimal, in bytes). The default value is 16384.

  • %include "filename"

    Replaces the %include verbatim by the specified file. This feature is still experimental. It works, but error reporting can be strange if a syntax error occurs on the last token in the included file.


Scanning method

This section shows how the scanning method can be customised. You can redefine the name and return type of the method and it is possible to declare exceptions that may be thrown in one of the actions of the specification. If no return type is specified, the scanning method will be declared as returning values of class Yytoken.
  • %function "name"

    Causes the scanning method to get the specified name. If no %function directive is present in the specification, the scanning method gets the name ``yylex''. This directive overrides settings of the %cup switch. Please note that the default name of the scanning method with the %cup switch is next_token. Overriding this name might lead to the generated scanner being implicitly declared as abstract, because it does not provide the method next_token of the interface java_cup.runtime.Scanner. It is of course possible to provide a dummy implementation of that method in the class code section if you still want to override the function name.

  • %integer
    %int

    Both cause the scanning method to be declared as of Java type int. Actions in the specification can then return int values as tokens. The default end of file value under this setting is YYEOF, which is a public static final int member of the generated class.

  • %intwrap

    Causes the scanning method to be declared as of the Java wrapper type Integer. Actions in the specification can then return Integer values as tokens. The default end of file value under this setting is null.

  • %type "typename"

    Causes the scanning method to be declared as returning values of the specified type. Actions in the specification can then return values of typename as tokens. The default end of file value under this setting is null. If typename is not a subclass of java.lang.Object, you should specify another end of file value using the %eofval{ ... %eofval} directive or the <<EOF>> rule. The %type directive overrides settings of the %cup switch.

  • %yylexthrow{
    "exception1"[, "exception2", ... ]
    %yylexthrow}

    or (on a single line) just

    %yylexthrow "exception1" [, "exception2", ...]

    The exceptions listed inside %yylexthrow{ ... %yylexthrow} will be declared in the throws clause of the scanning method. If there is more than one %yylexthrow{ ... %yylexthrow} clause in the specification, all specified exceptions will be declared.


The end of file

There is always a default value that the scanning method will return when the end of file has been reached. You may however define a specific value to return and a specific piece of code that should be executed when the end of file is reached.

The default end of file values depends on the return type of the scanning method:

  • For %integer, the scanning method will return the value YYEOF, which is a public static final int member of the generated class.

  • For %intwrap,
  • no specified type at all, or a
  • user defined type, declared using %type, the value is null.

  • In CUP compatibility mode, using %cup, the value is

    new java_cup.runtime.Symbol(sym.EOF)

User values and code to be executed at the end of file can be defined using these directives:

  • %eofval{
    ...
    %eofval}

    The code included in %eofval{ ... %eofval} will be copied verbatim into the scanning method and will be executed each time when the end of file is reached (this is possible when the scanning method is called again after the end of file has been reached). The code should return the value that indicates the end of file to the parser. There should be only one %eofval{ ... %eofval} clause in the specification. The %eofval{ ... %eofval} directive overrides settings of the %cup switch and %byaccj switch. As of version 1.2 JFlex provides a more readable way to specify the end of file value using the <<EOF>> rule (see also section 4.3.2).

  • %eof{
    ...
    %eof}

    The code included in %{eof ... %eof} will be executed exactly once, when the end of file is reached. The code is included inside a method void yy_do_eof() and should not return any value (use %eofval{...%eofval} or <<EOF>> for this purpose). If more than one end of file code directive is present, the code will be concatenated in order of appearance in the specification.

  • %eofthrow{
    "exception1"[,"exception2", ... ]
    %eofthrow}

    or (on a single line) just

    %eofthrow "exception1" [, "exception2", ...]

    The exceptions listed inside %eofthrow{...%eofthrow} will be declared in the throws clause of the method yy_do_eof() (see %eof for more on that method). If there is more than one %eofthrow{...%eofthrow} clause in the specification, all specified exceptions will be declared.

  • %eofclose

    Causes JFlex to close the input stream at the end of file. The code yyclose() is appended to the method yy_do_eof() (together with the code specified in %eof{...%eof}) and the exception java.io.IOException is declared in the throws clause of this method (together with those of %eofthrow{...%eofthrow})

  • %eofclose false

    Turns the effect of %eofclose off again (e.g. in case closing of input stream is not wanted after %cup).


Standalone scanners

  • %debug

    Creates a main function in the generated class that expects the name of an input file on the command line and then runs the scanner on this input file by printing information about each returned token to the Java console until the end of file is reached. The information includes: line number (if line counting is enabled), column (if column counting is enabled), the matched text, and the executed action (with line number in the specification).

  • %standalone

    Creates a main function in the generated class that expects the name of an input file on the command line and then runs the scanner on this input file. The values returned by the scanner are ignored, but any unmatched text is printed to the Java console instead (as the C/C++ tool flex does, if run as standalone program). To avoid having to use an extra token class, the scanning method will be declared as having default type int, not YYtoken (if there isn't any other type explicitly specified). This is in most cases irrelevant, but could be useful to know when making another scanner standalone for some purpose. You should also consider using the %debug directive, if you just want to be able to run the scanner without a parser attached for testing etc.


CUP compatibility

You may also want to read section 8.1 JFlex and CUP if you are interested in how to interface your generated scanner with CUP.
  • %cup

    The %cup directive enables the CUP compatibility mode and is equivalent to the following set of directives:

    %implements java_cup.runtime.Scanner
    %function next_token
    %type java_cup.runtime.Symbol
    %eofval{
      return new java_cup.runtime.Symbol(<CUPSYM>.EOF);
    %eofval}
    %eofclose
    

    The value of <CUPSYM> defaults to sym and can be changed with the %cupsym directive. In JLex compatibility mode (-jlex switch on the command line), %eofclose will not be turned on.

  • %cupsym "classname"

    Customises the name of the CUP generated class/interface containing the names of terminal tokens. Default is sym. The directive should not be used after %cup, but before.

  • %cupdebug

    Creates a main function in the generated class that expects the name of an input file on the command line and then runs the scanner on this input file. Prints line, column, matched text, and CUP symbol name for each returned token to standard out.


BYacc/J compatibility

You may also want to read section 8.2 JFlex and BYacc/J if you are interested in how to interface your generated scanner with Byacc/J.
  • %byacc

    The %byacc directive enables the BYacc/J compatibility mode and is equivalent to the following set of directives:

    %integer
    %eofval{
      return 0;
    %eofval}
    %eofclose
    


Code generation

The following options define what kind of lexical analyser code JFlex will produce. %pack is the default setting and will be used, when no code generation method is specified.

  • %switch

    With %switch JFlex will generate a scanner that has the DFA hard coded into a nested switch statement. This method gives a good deal of compression in terms of the size of the compiled .class file while still providing very good performance. If your scanner gets to big though (say more than about 200 states) performance may vastly degenerate and you should consider using one of the %table or %pack directives. If your scanner gets even bigger (about 300 states), the Java compiler javac could produce corrupted code, that will crash when executed or will give you an java.lang.VerifyError when checked by the virtual machine. This is due to the size limitation of 64 KB of Java methods as described in the Java Virtual Machine Specification [10]. In this case you will be forced to use the %pack directive, since %switch usually provides more compression of the DFA table than the %table directive.

  • %table

    The %table direction causes JFlex to produce a classical table driven scanner that encodes its DFA table in an array. In this mode, JFlex only does a small amount of table compression (see [6], [12], [1] and [13] for more details on the matter of table compression) and uses the same method that JLex did up to version 1.2.1. See section 6 performance of this manual to compare these methods. The same reason as above (64 KB size limitation of methods) causes the same problem, when the scanner gets too big. This is, because the virtual machine treats static initialisers of arrays as normal methods. You will in this case again be forced to use the %pack directive to avoid the problem.

  • %pack

    %pack causes JFlex to compress the generated DFA table and to store it in one or more string literals. JFlex takes care that the strings are not longer than permitted by the class file format. The strings have to be unpacked when the first scanner object is created and initialised. After unpacking the internal access to the DFA table is exactly the same as with option %table -- the only extra work to be done at runtime is the unpacking process which is quite fast (not noticeable in normal cases). It is in time complexity proportional to the size of the expanded DFA table, and it is static, i.e. it is done only once for a certain scanner class -- no matter how often it is instantiated. Again, see section 6 performance on the performance of these scanners With %pack, there should be practically no limitation to the size of the scanner. %pack is the default setting and will be used when no code generation method is specified.


Character sets

  • %7bit

    Causes the generated scanner to use an 7 bit input character set (character codes 0-127). If an input character with a code greater than 127 is encountered in an input at runtime, the scanner will throw an ArrayIndexOutofBoundsException. Not only because of this, you should consider using the %unicode directive. See also section 5 for information about character encodings. This is the default in JLex compatibility mode.

  • %full
    %8bit

    Both options cause the generated scanner to use an 8 bit input character set (character codes 0-255). If an input character with a code greater than 255 is encountered in an input at runtime, the scanner will throw an ArrayIndexOutofBoundsException. Note that even if your platform uses only one byte per character, the Unicode value of a character may still be greater than 255. If you are scanning text files, you should consider using the %unicode directive. See also section 5 for more information about character encodings.

  • %unicode
    %16bit

    Both options cause the generated scanner to use the full 16 bit Unicode input character set that Java supports natively (character code points 0-65535). There will be no runtime overflow when using this set of input characters. %unicode does not mean that the scanner will read two bytes at a time. What is read and what constitutes a character depends on the runtime platform. See also section 5 for more information about character encodings. This is the default unless the JLex compatibility mode is used (command line option -jlex).

  • %caseless
    %ignorecase

    This option causes JFlex to handle all characters and strings in the specification as if they were specified in both uppercase and lowercase form. This enables an easy way to specify a scanner for a language with case insensitive keywords. The string "break" in a specification is for instance handled like the expression ([bB][rR][eE][aA][kK]). The %caseless option does not change the matched text and does not effect character classes. So [a] still only matches the character a and not A, too. Which letters are uppercase and which lowercase letters, is defined by the Unicode standard and determined by JFlex with the Java methods Character.toUpperCase and Character.toLowerCase. In JLex compatibility mode (-jlex switch on the command line), %caseless and %ignorecase also affect character classes.


Line, character and column counting

  • %char

    Turns character counting on. The int member variable yychar contains the number of characters (starting with 0) from the beginning of input to the beginning of the current token.

  • %line

    Turns line counting on. The int member variable yyline contains the number of lines (starting with 0) from the beginning of input to the beginning of the current token.

  • %column

    Turns column counting on. The int member variable yycolumn contains the number of characters (starting with 0) from the beginning of the current line to the beginning of the current token.


Obsolete JLex options

  • %notunix

    This JLex option is obsolete in JFlex but still recognised as valid directive. It used to switch between Windows and Unix kind of line terminators (\r\n and \n) for the $ operator in regular expressions. JFlex always recognises both styles of platform dependent line terminators.

  • %yyeof

    This JLex option is obsolete in JFlex but still recognised as valid directive. In JLex it declares a public member constant YYEOF. JFlex declares it in any case.


State declarations

State declarations have the following from:

%s[tate] "state identifier" [, "state identifier", ... ] for inclusive or
%x[state] "state identifier" [, "state identifier", ... ] for exclusive states

There may be more than one line of state declarations, each starting with %state or %xstate (the first character is sufficient, %s and %x works, too). State identifiers are letters followed by a sequence of letters, digits or underscores. State identifiers can be separated by white-space or comma.

The sequence

%state STATE1
%xstate STATE3, XYZ, STATE_10
%state ABC STATE5

declares the set of identifiers STATE1, STATE3, XYZ, STATE_10, ABC, STATE5 as lexical states, STATE1, ABC, STATE5 as inclusive, and STATE3, XYZ, STATE_10 as exclusive. See also section 4.3.3 on the way lexical states influence how the input is matched.


Macro definitions

A macro definition has the form

macroidentifier = regular expression

That means, a macro definition is a macro identifier (letter followed by a sequence of letters, digits or underscores), that can later be used to reference the macro, followed by optional white-space, followed by an "=", followed by optional white-space, followed by a regular expression (see section 4.3 lexical rules for more information about regular expressions).

The regular expression on the right hand side must be well formed and must not contain the ^, / or $ operators. Differently to JLex, macros are not just pieces of text that are expanded by copying - they are parsed and must be well formed.

This is a feature. It eliminates some very hard to find bugs in lexical specifications (such like not having parentheses around more complicated macros - which is not necessary with JFlex). See section 7.1 Porting from JLex for more details on the problems of JLex style macros.

Since it is allowed to have macro usages in macro definitions, it is possible to use a grammar like notation to specify the desired lexical structure. Macros however remain just abbreviations of the regular expressions they represent. They are not non terminals of a grammar and cannot be used recursively in any way. JFlex detects cycles in macro definitions and reports them at generation time. JFlex also warns you about macros that have been defined but never used in the ``lexical rules'' section of the specification.


Lexical rules

The ``lexical rules'' section of an JFlex specification contains a set of regular expressions and actions (Java code) that are executed when the scanner matches the associated regular expression.


Syntax

The syntax of the "lexical rules" section is described by the following BNF grammar (terminal symbols are enclosed in 'quotes'):

LexicalRules ::= Rule+ 
Rule         ::= [StateList] ['^'] RegExp [LookAhead] Action 
               | [StateList] '<<EOF>>' Action
               | StateGroup 
StateGroup   ::= StateList '{' Rule+ '}' 
StateList    ::= '<' Identifier (',' Identifier)* '>' 
LookAhead    ::= '$' | '/' RegExp
Action       ::= '{' JavaCode '}' | '|'

RegExp       ::= RegExp '|' RegExp 
               | RegExp RegExp 
               | '(' RegExp ')'
               | ('!'|'~') RegExp
               | RegExp ('*'|'+'|'?')
               | RegExp "{" Number ["," Number] "}" 
               | '[' ['^'] (Character|Character'-'Character)* ']' 
               | PredefinedClass 
               | '{' Identifier '}' 
               | '"' StringCharacter+ '"' 
               | Character 

PredefinedClass ::= '[:jletter:]' 
                  | '[:jletterdigit:]' 
                  | '[:letter:]' 
                  | '[:digit:]' 
                  | '[:uppercase:]' 
                  | '[:lowercase:]' 
                  | '.'

The grammar uses the following terminal symbols:

  • JavaCode
    a sequence of BlockStatements as described in the Java Language Specification [7], section 14.2.

  • Number
    a non negative decimal integer.

  • Identifier
    a letter [a-zA-Z] followed by a sequence of zero or more letters, digits or underscores [a-zA-Z0-9_]

  • Character
    an escape sequence or any unicode character that is not one of these meta characters: | ( ) { } [ ] < > \ . * + ? ^ $ / . " ~ !

  • StringCharacter
    an escape sequence or any unicode character that is not one of these meta characters: \ "

  • An escape sequence

    • \n \r \t \f \b
    • a \x followed by two hexadecimal digits [a-fA-F0-9] (denoting a standard ASCII escape sequence),

    • a \u followed by four hexadecimal digits [a-fA-F0-9] (denoting an unicode escape sequence),

    • a backslash followed by a three digit octal number from 000 to 377 (denoting a standard ASCII escape sequence), or

    • a backslash followed by any other unicode character that stands for this character.

Please note that the \n escape sequence stands for the ASCII LF character - not for the end of line. If you would like to match the line terminator, you should use the expression \r|\n|\r\n if you want the Java conventions, or \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085 if you want to be fully Unicode compliant (see also [5]).

As of version 1.1 of JFlex the white-space characters " " (space) and "\t" (tab) can be used to improve the readability of regular expressions. They will be ignored by JFlex. In character classes and strings however, white-space characters keep standing for themselves (so the string " " still matches exactly one space character and [ \n] still matches an ASCII LF or a space character).

JFlex applies the following standard operator precedences in regular expression (from highest to lowest):

  • unary postfix operators ('*', '+', '?', {n}, {n,m})

  • unary prefix operators ('!', '~')

  • concatenation (RegExp::= RegExp Regexp)

  • union (RegExp::= RegExp '|' RegExp)

So the expression a | abc | !cd* for instance is parsed as (a|(abc)) | ((!c)(d*)).


Semantics

This section gives an informal description of which text is matched by a regular expression (i.e. an expression described by the RegExp production of the grammar presented above).

A regular expression that consists solely of

  • a Character matches this character.

  • a character class '[' (Character|Character'-'Character)* ']' matches any character in that class. A Character is to be considered an element of a class, if it is listed in the class or if its code lies within a listed character range Character'-'Character. So [a0-3\n] for instance matches the characters

    a 0 1 2 3 \n

    If the list of characters is empty (i.e. just []), the expression matches nothing at all (the empty set), not even the empty string. This may be useful in combination with the negation operator '!'.

  • a negated character class '[^' (Character|Character'-'Character)* ']' matches all characters not listed in the class. If the list of characters is empty (i.e. [^]), the expression matches any character of the input character set.

  • a string '"' StringCharacter+ '" ' matches the exact text enclosed in double quotes. All meta characters but \ and " loose their special meaning inside a string. See also the %ignorecase switch.

  • a macro usage '{' Identifier '}' matches the input that is matched by the right hand side of the macro with name "Identifier".

  • a predefined character class matches any of the characters in that class. There are the following predefined character classes:

    . contains all characters but \n.

    All other predefined character classes are defined in the Unicode specification or the Java Language Specification and determined by Java functions of class java.lang.Character.

    [:jletter:]      isJavaIdentifierStart()
    [:jletterdigit:] isJavaIdentifierPart()
    [:letter:]       isLetter()
    [:digit:]        isDigit()
    [:uppercase:]    isUpperCase()
    [:lowercase:]    isLowerCase()
    

    They are especially useful when working with the unicode character set.

If a and b are regular expressions, then

a | b
(union)

is the regular expression, that matches all input that is matched by a or by b.

a b
(concatenation)

is the regular expression, that matches the input matched by a followed by the input matched by b.

a*
(Kleene closure)

matches zero or more repetitions of the input matched by a

a+
(iteration)

is equivalent to aa*

a?
(option)

matches the empty input or the input matched by a

!a
(negation)

matches everything but the strings matched by a. Use with care: the construction of !a involves an additional, possibly exponential NFA to DFA transformation on the NFA for a. Note that with negation and union you also have (by applying DeMorgan) intersection and set difference: the intersection of a and b is !(!a|!b), the expression that matches everything of a not matched by b is !(!a|b)

~a
(upto)

matches everything up to (and including) the first occurrence of a text matched by a. The expression ~a is equivalent to !([^]* a [^]*) a. A traditional C-style comment is matched by "/*" ~"*/"

a{n}
(repeat)

is equivalent to n times the concatenation of a. So a{4} for instance is equivalent to the expression a a a a. The decimal integer n must be positive.

a{n,m}
is equivalent to at least n times and at most m times the concatenation of a. So a{2,4} for instance is equivalent to the expression a a a? a?. Both n and m are non negative decimal integers and m must not be smaller than n.

( a )
matches the same input as a.

In a lexical rule, a regular expression r may be preceded by a '^' (the beginning of line operator). r is then only matched at the beginning of a line in the input. A line begins after each occurrence of \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085 (see also [5]) and at the beginning of input. The preceding line terminator in the input is not consumed and can be matched by another rule.

In a lexical rule, a regular expression r may be followed by a look-ahead expression. A look-ahead expression is either a '$' (the end of line operator) or a '/' followed by an arbitrary regular expression. In both cases the look-ahead is not consumed and not included in the matched text region, but it is considered while determining which rule has the longest match (see also 4.3.3 How the input is matched).

In the '$' case r is only matched at the end of a line in the input. The end of a line is denoted by the regular expression \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085. So a$ is equivalent to a / \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085.This is a bit different to the situation described in [5]: since in JFlex $ is a true trailing context, the end of file does not count as end of line.

For arbitrary look-ahead (also called trailing context) the expression is matched only when followed by input that matches the trailing context.

As of version 1.2, JFlex allows lex/flex style «EOF» rules in lexical specifications. A rule

[StateList]  <<EOF>>    { some action code }
is very similar to the %eofval directive (section 4.2.3). The difference lies in the optional StateList that may precede the «EOF» rule. The action code will only be executed when the end of file is read and the scanner is currently in one of the lexical states listed in StateList. The same StateGroup (see section 4.3.3 How the input is matched) and precedence rules as in the ``normal'' rule case apply (i.e. if there is more than one «EOF» rule for a certain lexical state, the action of the one appearing earlier in the specification will be executed). «EOF» rules override settings of the %cup and %byaccj options and should not be mixed with the %eofval directive.

An Action consists either of a piece of Java code enclosed in curly braces or is the special | action. The | action is an abbreviation for the action of the following expression.

Example:

expression1   |
expression2   |
expression3   { some action }
is equivalent to the expanded form
expression1   { some action }
expression2   { some action }
expression3   { some action }

They are useful when you work with trailing context expressions. The expression a | (c / d) | b is not syntactically legal, but can easily be expressed using the | action:

a       |
c / d   |
b       { some action }


How the input is matched

When consuming its input, the scanner determines the regular expression that matches the longest portion of the input (longest match rule). If there is more than one regular expression that matches the longest portion of input (i.e. they all match the same input), the generated scanner chooses the expression that appears first in the specification. After determining the active regular expression, the associated action is executed. If there is no matching regular expression, the scanner terminates the program with an error message (if the %standalone directive has been used, the scanner prints the unmatched input to java.lang.System.out instead and resumes scanning).

Lexical states can be used to further restrict the set of regular expressions that match the current input.

  • A regular expression can only be matched when its associated set of lexical states includes the currently active lexical state of the scanner or if the set of associated lexical states is empty and the currently active lexical state is inclusive. Exclusive and inclusive states only differ at this point: rules with an empty set of associated states.

  • The currently active lexical state of the scanner can be changed from within an action of a regular expression using the method yybegin().

  • The scanner starts in the inclusive lexical state YYINITIAL, which is always declared by default.

  • The set of lexical states associated with a regular expression is the StateList that precedes the expression. If a rule is contained in one or more StateGroups, then the states of these are also associated with the rule, i.e. they accumulate over StateGroups.

    Example:

    %states A, B
    %xstates C
    %%
    expr1                   { yybegin(A); action }
    <YYINITIAL, A> expr2    { action }
    <A> {
      expr3                 { action }
      <B,C> expr4           { action }
    }
    
    The first line declares two (inclusive) lexical states A and B, the second line an exclusive lexical state C. The default (inclusive) state YYINITIAL is always implicitly there and doesn't need to be declared. The rule with expr1 has no states listed, and is thus matched in all states but the exclusive ones, i.e. A, B, and YYINITIAL. In its action, the scanner is switched to state A. The second rule expr2 can only match when the scanner is in state YYINITIAL or A. The rule expr3 can only be matched in state A and expr4 in states A, B, and C.

  • Lexical states are declared and used as Java int constants in the generated class under the same name as they are used in the specification. There is no guarantee that the values of these integer constants are distinct. They are pointers into the generated DFA table, and if JFlex recognises two states as lexically equivalent (if they are used with the exact same set of regular expressions), then the two constants will get the same value.

The generated class

JFlex generates exactly one file containing one class from the specification (unless you have declared another class in the first specification section).

The generated class contains (among other things) the DFA tables, an input buffer, the lexical states of the specification, a constructor, and the scanning method with the user supplied actions.

The name of the class is by default Yylex, it is customisable with the %class directive (see also section 4.2.1). The input buffer of the lexer is connected with an input stream over the java.io.Reader object which is passed to the lexer in the generated constructor. If you want to provide your own constructor for the lexer, you should always call the generated one in it to initialise the input buffer. The input buffer should not be accessed directly, but only over the advertised API (see also section 4.3.5). Its internal implementation may change between releases or skeleton files without notice.

The main interface to the outside world is the generated scanning method (default name yylex, default return type Yytoken). Most of its aspects are customisable (name, return type, declared exceptions etc., see also section 4.2.2). If it is called, it will consume input until one of the expressions in the specification is matched or an error occurs. If an expression is matched, the corresponding action is executed. It may return a value of the specified return type (in which case the scanning method return with this value), or if it doesn't return a value, the scanner resumes consuming input until the next expression is matched. If the end of file is reached, the scanner executes the EOF action, and (also upon each further call to the scanning method) returns the specified EOF value (see also section 4.2.3).


Scanner methods and fields accessible in actions (API)

Generated methods and member fields in JFlex scanners are prefixed with yy to indicate that they are generated and to avoid name conflicts with user code copied into the class. Since user code is part of the same class, JFlex has no language means like the private modifier to indicate which members and methods are internal and which ones belong to the API. Instead, JFlex follows a naming convention: everything starting with a zz prefix like zzStartRead is to be considered internal and subject to change without notice between JFlex releases. Methods and members of the generated class that do not have a zz prefix like yycharat belong to the API that the scanner class provides to users in action code of the specification. They will be remain stable and supported between JFlex releases as long as possible.

Currently, the API consists of the following methods and member fields:

  • String yytext()
    returns the matched input text region

  • int yylength()
    returns the length of the matched input text region (does not require a String object to be created)

  • char yycharat(int pos)
    returns the character at position pos from the matched text. It is equivalent to yytext().charAt(pos), but faster. pos must be a value from 0 to yylength()-1.

  • void yyclose()
    closes the input stream. All subsequent calls to the scanning method will return the end of file value

  • void yyreset(java.io.Reader reader)
    closes the current input stream, and resets the scanner to read from a new input stream. All internal variables are reset, the old input stream cannot be reused (content of the internal buffer is discarded and lost). The lexical state is set to YY_INITIAL.

  • void yypushStream(java.io.Reader reader)
    Stores the current input stream on a stack, and reads from a new stream. Lexical state, line, char, and column counting remain untouched. The current input stream can be restored with yypopstream (usually in an «EOF» action).

    A typical example for this are include files in style of the C pre-processor. The corresponding JFlex specification could look somewhat like this:

    "#include" {FILE}  { yypushStream(new FileReader(getFile(yytext()))); }
    ..
    <<EOF>>        { if (yymoreStreams()) yypopStream(); else return EOF; }
    

    This method is only available in the skeleton file skeleton.nested. You can find it in the src directory of the JFlex distribution.

  • void yypopStream()
    Closes the current input stream and continues to read from the one on top of the stream stack.

    This method is only available in the skeleton file skeleton.nested. You can find it in the src directory of the JFlex distribution.

  • boolean yymoreStreams()
    Returns true iff there are still streams for yypopStream left to read from on the stream stack.

    This method is only available in the skeleton file skeleton.nested. You can find it in the src directory of the JFlex distribution.

  • int yystate()
    returns the current lexical state of the scanner.

  • void yybegin(int lexicalState)
    enters the lexical state lexicalState

  • void yypushback(int number)
    pushes number characters of the matched text back into the input stream. They will be read again in the next call of the scanning method. The number of characters to be read again must not be greater than the length of the matched text. The pushed back characters will after the call of yypushback not be included in yylength and yytext(). Please note that in Java strings are unchangeable, i.e. an action code like
        String matched = yytext();
        yypushback(1);
        return matched;
    
    will return the whole matched text, while
        yypushback(1);
        return yytext();
    
    will return the matched text minus the last character.

  • int yyline
    contains the current line of input (starting with 0, only active with the %line directive)

  • int yychar
    contains the current character count in the input (starting with 0, only active with the %char directive)

  • int yycolumn
    contains the current column of the current line (starting with 0, only active with the %column directive)


Encodings, Platforms, and Unicode

This section tries to shed some light on the issues of Unicode and encodings, cross platform scanning, and how to deal with binary data. My thanks go to Stephen Ostermiller for his input on this topic.


The Problem

Before we dive straight into details, let's take a look at what the problem is. The problem is Java's platform independence when you want to use it. For scanners the interesting part about platform independence is character encodings and how they are handled.

If a program reads a file from disk, it gets a stream of bytes. In earlier times, when the grass was green, and the world was much simpler, everybody knew that the byte value 65 is, of course, an A. It was no problem to see which bytes meant which characters (actually these times never existed, but anyway). The normal Latin alphabet only has 26 characters, so 7 bits or 128 distinct values should surely be enough to map them, even if you allow yourself the luxury of upper and lower case. Nowadays, things are different. The world suddenly grew much larger, and all kinds of people wanted all kinds of special characters, just because they use them in their language and writing. This is were the mess starts. Since the 128 distinct values were already filled up with other stuff, people began to use all 8 bits of the byte, and extended the byte/character mappings to fit their need, and of course everybody did it differently. Some people for instance may have said ``let's use the value 213 for the German character ä''. Others may have found that 213 should much rather mean é, because they didn't need German and wrote French instead. As long as you use your program and data files only on one platform, this is no problem, as all know what means what, and everything gets used consistently.

Now Java comes into play, and wants to run everywhere (once written, that is) and now there suddenly is a problem: how do I get the same program to say ä to a certain byte when it runs in Germany and maybe é when it runs in France? And also the other way around: when I want to say é on the screen, which byte value should I send to the operating system?

Java's solution to this is to use Unicode internally. Unicode aims to be a superset of all known character sets and is therefore a perfect base for encoding things that might get used all over the world. To make things work correctly, you still have to know where you are and how to map byte values to Unicode characters and vice versa, but the important thing is, that this mapping is at least possible (you can map Kanji characters to Unicode, but you cannot map them to ASCII or iso-latin-1).


Scanning text files

Scanning text files is the standard application for scanners like JFlex. Therefore it should also be the most convenient one. Most times it is.

The following scenario works like a breeze: You work on a platform X, write your lexer specification there, can use any obscure Unicode character in it as you like, and compile the program. Your users work on any platform Y (possibly but not necessarily something different from X), they write their input files on Y and they run your program on Y. No problems.

Java does this as follows: If you want to read anything in Java that is supposed to contain text, you use a FileReader or some InputStream together with an InputStreamReader. InputStreams return the raw bytes, the InputStreamReader converts the bytes into Unicode characters with the platform's default encoding. If a text file is produced on the same platform, the platform's default encoding should do the mapping correctly. Since JFlex also uses readers and Unicode internally, this mechanism also works for the scanner specifications. If you write an A in your text editor and the editor uses the platform's encoding (say A is 65), then Java translates this into the logical Unicode A internally. If a user writes an A on a completely different platform (say A is 237 there), then Java also translates this into the logical Unicode A internally. Scanning is performed after that translation and both match.

Note that because of this mapping from bytes to characters, you should always use the %unicode switch in you lexer specification if you want to scan text files. %8bit may not be enough, even if you know that your platform only uses one byte per character. The encoding Cp1252 used on many Windows machines for instance knows 256 characters, but the character ´ with Cp1252 code \x92 has the Unicode value \u2019, which is larger than 255 and which would make your scanner throw an ArrayIndexOutOfBoundsException if it is encountered.

So for the usual case you don't have to do anything but use the %unicode switch in your lexer specification.

Things may break when you produce a text file on platform X and consume it on a different platform Y. Let's say you have a file written on a Windows PC using the encoding Cp1252. Then you move this file to a Linux PC with encoding ISO 8859-1 and there you want to run your scanner on it. Java now thinks the file is encoded in ISO 8859-1 (the platform's default encoding) while it really is encoded in Cp1252. For most characters Cp1252 and ISO 8859-1 are the same, but for the byte values \x80 to \x9f they disagree: ISO 8859-1 is undefined there. You can fix the problem by telling Java explicitly which encoding to use. When constructing the InputStreamReader, you can give the encoding as argument. The line

Reader r = new InputStreamReader(input, "Cp1252");
will do the trick.

Of course the encoding to use can also come from the data itself: for instance, when you scan a HTML page, it may have embedded information about its character encoding in the headers.

More information about encodings, which ones are supported, how they are called, and how to set them may be found in the official Java documentation in the chapter about internationalisation. The link http://java.sun.com/j2se/1.3/docs/guide/intl/ leads to an online version of this for Sun's JDK 1.3.


Scanning binaries

Scanning binaries is both easier and more difficult than scanning text files. It's easier because you want the raw bytes and not their meaning, i.e. you don't want any translation. It's more difficult because it's not so easy to get ``no translation'' when you use Java readers.

The problem (for binaries) is that JFlex scanners are designed to work on text. Therefore the interface is the Reader class (there is a constructor for InputStream instances, but it's just there for convenience and wraps an InputStreamReader around it to get characters, not bytes). You can still get a binary scanner when you write your own custom InputStreamReader class that does explicitly no translation, but just copies byte values to character codes instead. It sounds quite easy, and actually it is no big deal, but there are a few little pitfalls on the way. In the scanner specification you can only enter positive character codes (for bytes that is \x00 to \xFF). Java's byte type on the other hand is a signed 8 bit integer (-128 to 127), so you have to convert them properly in your custom Reader. Also, you should take care when you write your lexer spec: if you use text in there, it gets interpreted by an encoding first, and what scanner you get as result might depend on which platform you run JFlex on when you generate the scanner (this is what you want for text, but for binaries it gets in the way). If you are not sure, or if the development platform might change, it's probably best to use character code escapes in all places, since they don't change their meaning.

To illustrate these points, the example in examples/binary contains a very small binary scanner that tries to detect if a file is a Java class file. For that purpose it looks if the file begins with the magic number \xCAFEBABE.


A few words on performance

This section gives some empirical results about the speed of JFlex generated scanners in comparison to those generated by JLex, compares a JFlex scanner with a handwritten one, and presents some tips on how to make your specification produce a faster scanner.


Comparison of JLex and JFlex

Scanners generated by the tool JLex are quite fast. It was however possible to further improve the performance of generated scanners using JFlex. The following table shows the results that were produced by the scanner specification of a small toy programming language (the example from the JLex web site). The scanner was generated using JLex 1.2.6 and JFlex version 1.3.5 with all three different JFlex code generation methods. Then it was run on a W98 system using Sun's JDK 1.3 with different sample inputs of that toy programming language. All test runs were made under the same conditions on an otherwise idle machine.

The values presented in the table denote the time from the first call to the scanning method to returning the EOF value and the speedup in percent. The tests were run both in the mixed (HotSpot) JVM mode and the pure interpreted mode. The mixed mode JVM brings about a factor of 10 performance improvement, the difference between JLex and JFlex only decreases slightly.

 KB JVM JLex %switch speedup %table speedup %pack speedup
 496 hotspot 325 ms 261 ms 24.5 % 261 ms 24.5 % 261 ms 24.5 %
 187 hotspot 127 ms 98 ms 29.6 % 94 ms 35.1 % 96 ms 32.3 %
 93 hotspot 66 ms 50 ms 32.0 % 50 ms 32.0 % 48 ms 37.5 %
 496 interpr. 4009 ms 3025 ms 32.5 % 3258 ms 23.1 % 3231 ms 24.1 %
 187 interpr. 1641 ms 1155 ms 42.1 % 1245 ms 31.8 % 1234 ms 33.0 %
 93 interpr. 817 ms 573 ms 42.6 % 617 ms 32.4 % 613 ms 33.3 %


Since the scanning time of the lexical analyser examined in the table above includes lexical actions that often need to create new object instances, another table shows the execution time for the same specification with empty lexical actions to compare the pure scanning engines.

 KB JVM JLex %switch speedup %table speedup %pack speedup
 496 hotspot 204 ms 140 ms 45.7 % 138 ms 47.8 % 140 ms 45.7 %
 187 hotspot 83 ms 55 ms 50.9 % 52 ms 59.6 % 52 ms 59.6 %
 93 hotspot 41 ms 28 ms 46.4 % 26 ms 57.7 % 26 ms 57.7 %
 496 interpr. 2983 ms 2036 ms 46.5 % 2230 ms 33.8 % 2232 ms 33.6 %
 187 interpr. 1260 ms 793 ms 58.9 % 865 ms 45.7 % 867 ms 45.3 %
 93 interpr. 628 ms 395 ms 59.0 % 432 ms 45.4 % 432 ms 45.4 %


Execution time of single instructions depends on the platform and the implementation of the Java Virtual Machine the program is executed on. Therefore the tables above cannot be used as a reference to which code generation method of JFlex is the right one to choose in general. The following table was produced by the same lexical specification and the same input on a Linux system also using Sun's JDK 1.3.

With actions:

 KB JVM JLex %switch speedup %table speedup %pack speedup
 496 hotspot 246 ms 203 ms 21.2 % 193 ms 27.5 % 190 ms 29.5 %
 187 hotspot 99 ms 76 ms 30.3 % 69 ms 43.5 % 70 ms 41.4 %
 93 hotspot 48 ms 36 ms 33.3 % 34 ms 41.2 % 35 ms 37.1 %
 496 interpr. 3251 ms 2247 ms 44.7 % 2430 ms 33.8 % 2444 ms 33.0 %
 187 interpr. 1320 ms 848 ms 55.7 % 958 ms 37.8 % 920 ms 43.5 %
 93 interpr. 658 ms 423 ms 55.6 % 456 ms 44.3 % 452 ms 45.6 %


Without actions:

 KB JVM JLex %switch speedup %table speedup %pack speedup
 496 hotspot 136 ms 78 ms 74.4 % 76 ms 78.9 % 77 ms 76.6 %
 187 hotspot 59 ms 31 ms 90.3 % 48 ms 22.9 % 32 ms 84.4 %
 93 hotspot 28 ms 15 ms 86.7 % 15 ms 86.7 % 15 ms 86.7 %
 496 interpr. 1992 ms 1047 ms 90.3 % 1246 ms 59.9 % 1215 ms 64.0 %
 187 interpr. 859 ms 408 ms 110.5 % 479 ms 79.3 % 487 ms 76.4 %
 93 interpr. 435 ms 200 ms 117.5 % 237 ms 83.5 % 242 ms 79.8 %


Although all JFlex scanners were faster than those generated by JLex, slight differences between JFlex code generation methods show up when compared to the run on the W98 system.

The following table compares a hand-written scanner for the Java language obtained from the web site of CUP with the JFlex generated scanner for Java that comes with JFlex in the examples directory. They were tested on different .java files on a Linux machine with Sun's JDK 1.3.

 lines KB JVM hand-written scanner JFlex generated scanner
 19050 496 hotspot 824 ms 248 ms 235 % faster
 6350 165 hotspot 272 ms 84 ms 232 % faster
 1270 33 hotspot 53 ms 18 ms 194 % faster
 19050 496 interpreted 5.83 s 3.85 s 51 % faster
 6350 165 interpreted 1.95 s 1.29 s 51 % faster
 1270 33 interpreted 0.38 s 0.25 s 52 % faster


Although JDK 1.3 seems to speed up the hand-written scanner if compared to JDK 1.1 or 1.2 more than the generated one, the generated scanner is still up to 3.3 times as fast as the hand-written one. One example of a hand-written scanner that is considerably slower than the equivalent generated one is surely no proof for all generated scanners being faster than hand-written. It is clearly impossible to prove something like that, since you could always write the generated scanner by hand. From a software engineering point of view however, there is no excuse for writing a scanner by hand since this task takes more time, is more difficult and therefore more error prone than writing a compact, readable and easy to change lexical specification. (I'd like to add, that I do not think, that the hand-written scanner from the CUP web site used here in the test is stupid or badly written or anything like that. I actually think, Scott did a great job with it)


How to write a faster specification

Although JFlex generated scanners show good performance without special optimisations, there are some heuristics that can make a lexical specification produce an even faster scanner. Those are (roughly in order of performance gain):

  • Avoid rules that require backtracking

    From the C/C++ flex [11] man page: ``Getting rid of backtracking is messy and often may be an enormous amount of work for a complicated scanner.'' Backtracking is introduced by the longest match rule and occurs for instance on this set of expressions:

    "averylongkeyword"
    .

    With input "averylongjoke" the scanner has to read all characters up to 'j' to decide that rule . should be matched. All characters of "verylong" have to be read again for the next matching process. Backtracking can be avoided in general by adding error rules that match those error conditions

    "av"|"ave"|"avery"|"averyl"|..

    While this is impractical in most scanners, there is still the possibility to add a ``catch all'' rule for a lengthy list of keywords

    "keyword1"  { return symbol(KEYWORD1); } 
    .. 
    "keywordn"  { return symbol(KEYWORDn); }
    [a-z]+      { error("not a keyword"); }
    
    Most programming language scanners already have a rule like this for some kind of variable length identifiers.

  • Avoid line and column counting

    It costs multiple additional comparisons per input character and the matched text has to be re-scanned for counting. In most scanners it is possible to do the line counting in the specification by incrementing yyline each time a line terminator has been matched. Column counting could also be included in actions. This will be faster, but can in some cases become quite messy.

  • Avoid look-ahead expressions and the end of line operator '$'

    In the best case, the trailing context will first have to be read and then (because it is not to be consumed) re-read again. The cases of fixed-length look-ahead and fixed-length base expressions are handled efficiently by matching the concatenation and then pushing back the required amount of characters. This extends to the case of a disjunction of fixed-length look-ahead expressions such as r1 / \r|\n|\r\n. All other cases r1 / r2 are handled by first scanning the concatenation of r1 and r2, and then finding the correct end of r1. The end of r1 is found by scanning forwards in the match again, marking all possible r1 terminations, and then scanning the reverse of r2 backwards from the end until a start of r2 intersects with an end of r1. This algorithm is linear in the size of the input (not quadratic or worse as backtracking is), but about a factor of 2 slower than normal scanning. It also consumes memory proportional to the size of the matched input for r1 r2.

  • Avoid the beginning of line operator '^'

    It costs multiple additional comparisons per match. In some cases one extra look-ahead character is needed (when the last character read is \r the scanner has to read one character ahead to check if the next one is an \n or not).

  • Match as much text as possible in a rule.

    One rule is matched in the innermost loop of the scanner. After each action some overhead for setting up the internal state of the scanner is necessary.

Note that writing more rules in a specification does not make the generated scanner slower (except when you have to switch to another code generation method because of the larger size).

The two main rules of optimisation apply also for lexical specifications:

  1. don't do it
  2. (for experts only) don't do it yet

Some of the performance tips above contradict a readable and compact specification style. When in doubt or when requirements are not or not yet fixed: don't use them -- the specification can always be optimised in a later state of the development process.

Porting Issues


Porting from JLex

JFlex was designed to read old JLex specifications unchanged and to generate a scanner which behaves exactly the same as the one generated by JLex with the only difference of being faster.

This works as expected on all well formed JLex specifications.

Since the statement above is somewhat absolute, let's take a look at what ``well formed'' means here. A JLex specification is well formed, when it

  • generates a working scanner with JLex

  • doesn't contain the unescaped characters ! and ~

    They are operators in JFlex while JLex treats them as normal input characters. You can easily port such a JLex specification to JFlex by replacing every ! with \! and every ~ with \~ in all regular expressions.

  • has only complete regular expressions surrounded by parentheses in macro definitions

    This may sound a bit harsh, but could otherwise be a major problem - it can also help you find some disgusting bugs in your specification that didn't show up in the first place. In JLex, a right hand side of a macro is just a piece of text, that is copied to the point where the macro is used. With this, some weird kind of stuff like

      macro1 = ("hello"
      macro2 = {macro1})*
    
    was possible (with macro2 expanding to ("hello")*). This is not allowed in JFlex and you will have to transform such definitions. There are however some more subtle kinds of errors that can be introduced by JLex macros. Let's consider a definition like macro = a|b and a usage like {macro}*. This expands in JLex to a|b* and not to the probably intended (a|b)*.

    JFlex uses always the second form of expansion, since this is the natural form of thinking about abbreviations for regular expressions.

    Most specifications shouldn't suffer from this problem, because macros often only contain (harmless) character classes like alpha = [a-zA-Z] and more dangerous definitions like

    ident = {alpha}({alpha}|{digit})*

    are only used to write rules like

    {ident} { .. action .. }

    and not more complex expressions like

    {ident}* { .. action .. }

    where the kind of error presented above would show up.


Porting from lex/flex

This section tries to give an overview of activities and possible problems when porting a lexical specification from the C/C++ tools lex and flex [11] available on most Unix systems to JFlex.

Most of the C/C++ specific features are naturally not present in JFlex, but most ``clean'' lex/flex lexical specifications can be ported to JFlex without very much work.

This section is by far not complete and is based mainly on a survey of the flex man page and very little personal experience. If you do engage in any porting activity from lex/flex to JFlex and encounter problems, have better solutions for points presented here or have just some tips you would like to share, please do contact me. I will incorporate your experiences in this manual (with all due credit to you, of course).

Basic structure

A lexical specification for flex has the following basic structure:
definitions
%%
rules
%%
user code

The user code section usually contains some C code that is used in actions of the rules part of the specification. For JFlex most of this code will have to be included in the class code %{..%} directive in the options and declarations section (after translating the C code to Java, of course).

Macros and Regular Expression Syntax

The definitions section of a flex specification is quite similar to the options and declarations part of JFlex specs.

Macro definitions in flex have the form:

<identifier>  <expression>
To port them to JFlex macros, just insert a = between <identifier> and <expression>.

The syntax and semantics of regular expressions in flex are pretty much the same as in JFlex. A little attention is needed for some escape sequences present in flex (such as \a) that are not supported in JFlex. These escape sequences should be transformed into their octal or hexadecimal equivalent.

Another point are predefined character classes. Flex offers the ones directly supported by C, JFlex offers the ones supported by Java. These classes will sometimes have to be listed manually (if there is need for this feature, it may be implemented in a future JFlex version).

Lexical Rules

Since flex is mostly Unix based, the '^' (beginning of line) and '$' (end of line) operators, consider the \n character as only line terminator. This should usually cause not much problems, but you should be prepared for occurrences of \r or \r\n or one of the characters \u2028, \u2029, \u000B, \u000C, or \u0085. They are considered to be line terminators in Unicode and therefore may not be consumed when ^ or $ is present in a rule.


Working together


JFlex and CUP

One of the main design goals of JFlex was to make interfacing with the free Java parser generator CUP [8] as easy as possibly. This has been done by giving the %cup directive a special meaning. An interface however always has two sides. This section concentrates on the CUP side of the story.

CUP version 0.10j and above

Since CUP version 0.10j, this has been simplified greatly by the new CUP scanner interface java_cup.runtime.Scanner. JFlex lexers now implement this interface automatically when then %cup switch is used. There are no special parser code, init code or scan with options any more that you have to provide in your CUP parser specification. You can just concentrate on your grammar.

If your generated lexer has the class name Scanner, the parser is started from the a main program like this:

...
  try {
    parser p = new parser(new Scanner(new FileReader(fileName)));
    Object result = p.parse().value;
  }
  catch (Exception e) {
...

Custom symbol interface

If you have used the -symbol command line switch of CUP to change the name of the generated symbol interface, you have to tell JFlex about this change of interface so that correct end-of-file code is generated. You can do so either by using an %eofval{ directive or by using and «EOF» rule.

If your new symbol interface is called mysym for example, the corresponding code in the jflex specification would be either

%eofval{
  return mysym.EOF;
%eofval}

in the macro/directives section of the spec, or it would be

  <<EOF>>  { return mysym.EOF; }

in the rules section of your spec.

Using existing JFlex/CUP specifications with CUP 0.10j

If you already have an existing specification and you would like to upgrade both JFlex and CUP to their newest version, you will probably have to adjust your specification.

The main difference between the %cup switch in JFlex 1.2.1 and lower, and the current JFlex version is, that JFlex scanners now automatically implement the java_cup.runtime.Scanner interface. This means, that the scanning function now changes its name from yylex() to next_token().

The main difference from older CUP versions to 0.10j is, that CUP now has a default constructor that accepts a java_cup.runtime.Scanner as argument and that uses this scanner as default (so no scan with code is necessary any more).

If you have an existing CUP specification, it will probably look somewhat like this:

parser code {:
  Lexer lexer;

  public parser (java.io.Reader input) {
    lexer = new Lexer(input);
  }
:};

scan with {: return lexer.yylex(); :};

To upgrade to CUP 0.10j, you could change it to look like this:

parser code {:
  public parser (java.io.Reader input) {
    super(new Lexer(input));
  }
:};

If you do not mind to change the method that is calling the parser, you could remove the constructor entirely (and if there is nothing else in it, the whole parser code section as well, of course). The calling main procedure would then construct the parser as shown in the section above.

The JFlex specification does not need to be changed.

Using older versions of CUP

For people, who like or have to use older versions of CUP, the following section explains ``the old way''. Please note, that the standard name of the scanning function with the %cup switch is not yylex(), but next_token().

If you have a scanner specification that begins like this:

package PACKAGE;
import java_cup.runtime.*;   /* this is convenience, but not necessary */
 
%%
 
%class Lexer
%cup
..

then it matches a CUP specification starting like

package PACKAGE;

parser code {:
  Lexer lexer;

  public parser (java.io.Reader input) {
    lexer = new Lexer(input);
  }
:};

scan with {: return lexer.next_token(); :};

..

This assumes that the generated parser will get the name parser. If it doesn't, you have to adjust the constructor name.

The parser can then be started in a main routine like this:

..
  try {
    parser p = new parser(new FileReader(fileName));
    Object result = p.parse().value; 
  }
  catch (Exception e) {
..

If you want the parser specification to be independent of the name of the generated scanner, you can instead write an interface Lexer

public interface Lexer {
  public java_cup.runtime.Symbol next_token() throws java.io.IOException;
}

change the parser code to:

package PACKAGE;

parser code {:
  Lexer lexer;

  public parser (Lexer lexer) {
    this.lexer = lexer;
  }
:};

scan with {: return lexer.next_token(); :};

..

tell JFlex about the lexer interface using the %implements directive:

..
%class Scanner     /* not Lexer now since that is our interface! */
%implements Lexer
%cup
..

and finally change the main routine to look like

...
  try {
    parser p = new parser(new Scanner(new FileReader(fileName)));
    Object result = p.parse().value;
  }
  catch (Exception e) {
...

If you want to improve the error messages that CUP generated parsers produce, you can also override the methods report_error and report_fatal_error in the ``parser code'' section of the CUP specification. The new methods could for instance use yyline and yycolumn (stored in the left and right members of class java_cup.runtime.Symbol) to report error positions more conveniently for the user. The lexer and parser for the Java language in the examples/java directory of the JFlex distribution use this style of error reporting. These specifications also demonstrate the techniques above in action.


JFlex and BYacc/J

JFlex has built-in support for the Java extension BYacc/J [9] by Bob Jamison to the classical Berkeley Yacc parser generator. This section describes how to interface BYacc/J with JFlex. It builds on many helpful suggestions and comments from Larry Bell.

Since Yacc's architecture is a bit different from CUP's, the interface setup also works in a slightly different manner. BYacc/J expects a function int yylex() in the parser class that returns each next token. Semantic values are expected in a field yylval of type parserval where ``parser'' is the name of the generated parser class.

For a small calculator example, one could use a set up like the following on the JFlex side:

%%

%byaccj

%{
  /* store a reference to the parser object */
  private parser yyparser;

  /* constructor taking an additional parser object */
  public Yylex(java.io.Reader r, parser yyparser) {
    this(r);
    this.yyparser = yyparser;
  }
%}

NUM = [0-9]+ ("." [0-9]+)?
NL  = \n | \r | \r\n

%%

/* operators */
"+" | 
..
"(" | 
")"    { return (int) yycharat(0); }

/* newline */
{NL}   { return parser.NL; }

/* float */
{NUM}  { yyparser.yylval = new parserval(Double.parseDouble(yytext()));
         return parser.NUM; }

The lexer expects a reference to the parser in its constructor. Since Yacc allows direct use of terminal characters like '+' in its specifications, we just return the character code for single char matches (e.g. the operators in the example). Symbolic token names are stored as public static int constants in the generated parser class. They are used as in the NL token above. Finally, for some tokens, a semantic value may have to be communicated to the parser. The NUM rule demonstrates that bit.

A matching BYacc/J parser specification could look like this:

%{
  import java.io.*;
%}
      
%token NL          /* newline  */
%token <dval> NUM  /* a number */

%type <dval> exp

%left '-' '+'
..
%right '^'         /* exponentiation */
      
%%

..
      
exp:     NUM          { $$ = $1; }
       | exp '+' exp  { $$ = $1 + $3; }
       ..
       | exp '^' exp  { $$ = Math.pow($1, $3); }
       | '(' exp ')'  { $$ = $2; }
       ;

%%
  /* a reference to the lexer object */
  private Yylex lexer;

  /* interface to the lexer */
  private int yylex () {
    int yyl_return = -1;
    try {
      yyl_return = lexer.yylex();
    }
    catch (IOException e) {
      System.err.println("IO error :"+e);
    }
    return yyl_return;
  }

  /* error reporting */
  public void yyerror (String error) {
    System.err.println ("Error: " + error);
  }

  /* lexer is created in the constructor */
  public parser(Reader r) {
    lexer = new Yylex(r, this);
  }

  /* that's how you use the parser */
  public static void main(String args[]) throws IOException {
    parser yyparser = new parser(new FileReader(args[0]));
    yyparser.yyparse();    
  }

Here, the customised part is mostly in the user code section: We create the lexer in the constructor of the parser and store a reference to it for later use in the parser's int yylex() method. This yylex in the parser only calls int yylex() of the generated lexer and passes the result on. If something goes wrong, it returns -1 to indicate an error.

Runnable versions of the specifications above are located in the examples/byaccj directory of the JFlex distribution.


Bugs and Deficiencies

Deficiencies

Unicode matching is not fully conforming to the relevant current Unicode report. Instead, the Unicode support in JFlex is the one native to Java. That means, only 16 bit code points are supported and most Unicode character classes are not directly supported (although they can be custom-defined in macros). The Java 5 development version of JFlex contains better support for Unicode, as will the next major release.

Bugs

As of January 31, 2009, no bugs have been reported for JFlex version 1.4.3. All bugs reported for earlier versions have been fixed.

If you find new problems, please use the bugs section of the JFlex web site to report them.


Copying and License

JFlex is free software, published under the terms of the GNU General Public License.

There is absolutely NO WARRANTY for JFlex, its code and its documentation.

The code generated by JFlex inherits the copyright of the specification it was produced from. If it was your specification, you may use the generated code without restriction.

See the file COPYRIGHT for more information.


Bibliography

1
A. Aho, R. Sethi, J. Ullman, Compilers: Principles, Techniques, and Tools, 1986

2
A. W. Appel, Modern Compiler Implementation in Java: basic techniques, 1997

3
E. Berk, JLex: A lexical analyser generator for Java,
http://www.cs.princeton.edu/~appel/modern/java/JLex/

4
K. Brouwer, W. Gellerich,E. Ploedereder, Myths and Facts about the Efficient Implementation of Finite Automata and Lexical Analysis, in: Proceedings of the 7th International Conference on Compiler Construction (CC '98), 1998

5
M. Davis, Unicode Regular Expression Guidelines, Unicode Technical Report #18, 2000
http://www.unicode.org/unicode/reports/tr18/tr18-5.1.html

6
P. Dencker, K. Dürre, J. Henft, Optimization of Parser Tables for portable Compilers, in: ACM Transactions on Programming Languages and Systems 6(4), 1984

7
J. Gosling, B. Joy, G. Steele, The Java Language Specifcation, 1996,
http://java.sun.com/docs/books/jls/

8
S. E. Hudson, CUP LALR Parser Generator for Java,
http://www.cs.princeton.edu/~appel/modern/java/CUP/

9
B. Jamison, BYacc/J,
http://byaccj.sourceforge.net/

10
T. Lindholm, F. Yellin, The Java Virtual Machine Specification, 1996,
http://java.sun.com/docs/books/vmspec/

11
V. Paxson, flex - The fast lexical analyzer generator, 1995

12
R. E. Tarjan, A. Yao, Storing a Sparse Table, in: Communications of the ACM 22(11), 1979

13
R. Wilhelm, D. Maurer, Übersetzerbau, Berlin 19972 mathend000#



Footnotes

... Java[*]
Java is a trademark of Sun Microsystems, Inc., and refers to Sun's Java programming language. JFlex is not sponsored by or affiliated with Sun Microsystems, Inc.


Sat 31 Jan 2009 23:43:28 EST, Gerwin Klein
jflex-1.4.3/doc/manual.pdf0000644000175000017500000231031011141044634014044 0ustar moonmoon%PDF-1.4 5 0 obj << /S /GoTo /D (section.1) >> endobj 8 0 obj (Introduction) endobj 9 0 obj << /S /GoTo /D (subsection.1.1) >> endobj 12 0 obj (Design goals) endobj 13 0 obj << /S /GoTo /D (subsection.1.2) >> endobj 16 0 obj (About this manual) endobj 17 0 obj << /S /GoTo /D (section.2) >> endobj 20 0 obj (Installing and Running JFlex) endobj 21 0 obj << /S /GoTo /D (subsection.2.1) >> endobj 24 0 obj (Installing JFlex) endobj 25 0 obj << /S /GoTo /D (subsubsection.2.1.1) >> endobj 28 0 obj (Windows) endobj 29 0 obj << /S /GoTo /D (subsubsection.2.1.2) >> endobj 32 0 obj (Unix with tar archive) endobj 33 0 obj << /S /GoTo /D (subsubsection.2.1.3) >> endobj 36 0 obj (Linux with RPM) endobj 37 0 obj << /S /GoTo /D (subsection.2.2) >> endobj 40 0 obj (Running JFlex) endobj 41 0 obj << /S /GoTo /D (section.3) >> endobj 44 0 obj (A simple Example: How to work with JFlex) endobj 45 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 48 0 obj (Code to include) endobj 49 0 obj << /S /GoTo /D (subsection.3.2) >> endobj 52 0 obj (Options and Macros) endobj 53 0 obj << /S /GoTo /D (subsection.3.3) >> endobj 56 0 obj (Rules and Actions) endobj 57 0 obj << /S /GoTo /D (subsection.3.4) >> endobj 60 0 obj (How to get it going) endobj 61 0 obj << /S /GoTo /D (section.4) >> endobj 64 0 obj (Lexical Specifications) endobj 65 0 obj << /S /GoTo /D (subsection.4.1) >> endobj 68 0 obj (User code) endobj 69 0 obj << /S /GoTo /D (subsection.4.2) >> endobj 72 0 obj (Options and declarations) endobj 73 0 obj << /S /GoTo /D (subsubsection.4.2.1) >> endobj 76 0 obj (Class options and user class code) endobj 77 0 obj << /S /GoTo /D (subsubsection.4.2.2) >> endobj 80 0 obj (Scanning method) endobj 81 0 obj << /S /GoTo /D (subsubsection.4.2.3) >> endobj 84 0 obj (The end of file) endobj 85 0 obj << /S /GoTo /D (subsubsection.4.2.4) >> endobj 88 0 obj (Standalone scanners) endobj 89 0 obj << /S /GoTo /D (subsubsection.4.2.5) >> endobj 92 0 obj (CUP compatibility) endobj 93 0 obj << /S /GoTo /D (subsubsection.4.2.6) >> endobj 96 0 obj (BYacc/J compatibility) endobj 97 0 obj << /S /GoTo /D (subsubsection.4.2.7) >> endobj 100 0 obj (Code generation) endobj 101 0 obj << /S /GoTo /D (subsubsection.4.2.8) >> endobj 104 0 obj (Character sets) endobj 105 0 obj << /S /GoTo /D (subsubsection.4.2.9) >> endobj 108 0 obj (Line, character and column counting) endobj 109 0 obj << /S /GoTo /D (subsubsection.4.2.10) >> endobj 112 0 obj (Obsolete JLex options) endobj 113 0 obj << /S /GoTo /D (subsubsection.4.2.11) >> endobj 116 0 obj (State declarations) endobj 117 0 obj << /S /GoTo /D (subsubsection.4.2.12) >> endobj 120 0 obj (Macro definitions) endobj 121 0 obj << /S /GoTo /D (subsection.4.3) >> endobj 124 0 obj (Lexical rules) endobj 125 0 obj << /S /GoTo /D (subsubsection.4.3.1) >> endobj 128 0 obj (Syntax) endobj 129 0 obj << /S /GoTo /D (subsubsection.4.3.2) >> endobj 132 0 obj (Semantics) endobj 133 0 obj << /S /GoTo /D (subsubsection.4.3.3) >> endobj 136 0 obj (How the input is matched) endobj 137 0 obj << /S /GoTo /D (subsubsection.4.3.4) >> endobj 140 0 obj (The generated class) endobj 141 0 obj << /S /GoTo /D (subsubsection.4.3.5) >> endobj 144 0 obj (Scanner methods and fields accessible in actions \(API\)) endobj 145 0 obj << /S /GoTo /D (section.5) >> endobj 148 0 obj (Encodings, Platforms, and Unicode) endobj 149 0 obj << /S /GoTo /D (subsection.5.1) >> endobj 152 0 obj (The Problem) endobj 153 0 obj << /S /GoTo /D (subsection.5.2) >> endobj 156 0 obj (Scanning text files) endobj 157 0 obj << /S /GoTo /D (subsection.5.3) >> endobj 160 0 obj (Scanning binaries) endobj 161 0 obj << /S /GoTo /D (section.6) >> endobj 164 0 obj (A few words on performance) endobj 165 0 obj << /S /GoTo /D (subsection.6.1) >> endobj 168 0 obj (Comparison of JLex and JFlex) endobj 169 0 obj << /S /GoTo /D (subsection.6.2) >> endobj 172 0 obj (How to write a faster specification) endobj 173 0 obj << /S /GoTo /D (section.7) >> endobj 176 0 obj (Porting Issues) endobj 177 0 obj << /S /GoTo /D (subsection.7.1) >> endobj 180 0 obj (Porting from JLex) endobj 181 0 obj << /S /GoTo /D (subsection.7.2) >> endobj 184 0 obj (Porting from lex/flex) endobj 185 0 obj << /S /GoTo /D (subsubsection.7.2.1) >> endobj 188 0 obj (Basic structure) endobj 189 0 obj << /S /GoTo /D (subsubsection.7.2.2) >> endobj 192 0 obj (Macros and Regular Expression Syntax) endobj 193 0 obj << /S /GoTo /D (subsubsection.7.2.3) >> endobj 196 0 obj (Lexical Rules) endobj 197 0 obj << /S /GoTo /D (section.8) >> endobj 200 0 obj (Working together) endobj 201 0 obj << /S /GoTo /D (subsection.8.1) >> endobj 204 0 obj (JFlex and CUP) endobj 205 0 obj << /S /GoTo /D (subsubsection.8.1.1) >> endobj 208 0 obj (CUP version 0.10j and above) endobj 209 0 obj << /S /GoTo /D (subsubsection.8.1.2) >> endobj 212 0 obj (Custom symbol interface) endobj 213 0 obj << /S /GoTo /D (subsubsection.8.1.3) >> endobj 216 0 obj (Using existing JFlex/CUP specifications with CUP 0.10j) endobj 217 0 obj << /S /GoTo /D (subsubsection.8.1.4) >> endobj 220 0 obj (Using older versions of CUP) endobj 221 0 obj << /S /GoTo /D (subsection.8.2) >> endobj 224 0 obj (JFlex and BYacc/J) endobj 225 0 obj << /S /GoTo /D (section.9) >> endobj 228 0 obj (Bugs and Deficiencies) endobj 229 0 obj << /S /GoTo /D (subsection.9.1) >> endobj 232 0 obj (Deficiencies) endobj 233 0 obj << /S /GoTo /D (subsection.9.2) >> endobj 236 0 obj (Bugs) endobj 237 0 obj << /S /GoTo /D (section.10) >> endobj 240 0 obj (Copying and License) endobj 241 0 obj << /S /GoTo /D [242 0 R /Fit ] >> endobj 245 0 obj << /Length 2661 /Filter /FlateDecode >> stream x\r7}WmU!%o9&#gkk4HHJo6C`m:Udg{ΜitSD/E"- 49# >~yFB/(hJ)Z3`WD>LJ- JI_=憢/7g?zk4eK"Pc6JBR>/.Ξ3#.C j%fp==b2Lwg6n2}ol׳o6 ]/fL8RbŒ)ܺ~.;I 5wW= l0HeTXnmP:|!3O aOir}\¯ Lz̄D!&@-:0cIŰQ<9_{(ݽ٥{K;8ݧwD&so'Gb[nR ,{\Ph8x%5X[cGـ9 =`\nU +Ac$?$B@hc/J}o7.{m 1Q h ՊDR5 WsGA7e )B3Sǖp=S,J\df*n>5&r_#8Z!gύ.d* ~kOn ,l U{TܨX%c)j^<ƺCD+!q[M ZEd nrzs3dHCcbίA"AzT+HCT7ɨRkfJs[k(ԏ::1)!\,Nػ;su)w}ʊ2[SսrUC YsNVzWWcURV0^҉`RCyr VV]euZQC"R Պ4D`u{Tܨ@]jغWn3g`YHٱ +s.RVߗ㻢be^ʧ:0wl!<5ye,ꢬ|_C^Vi-`] ͵Un{TҜ_ ^\Ru*wV_i[jMVu B %C-6qȬSPHf V```):=mi MUO4{H0i# 6EAf/&TgiEMJɶNBRgbɮHj>r3nP#$ov}kW6L Fn{DZc"-FiEJq,'/y_Ѯ=bZM fWpjjMpY(LP`AObj6c&:mP16s9D=DɅ6äw)fPKRp|},}xZd.FRL]<>2hGT+H'Y0G$Y^Wz43c퉩nG?&:칗WMzdMx ߄7mKQɱNYi%ǚȅ[Giv5=.Q8p^ߏ ,_c\fjE75(RSS1f\xC0knO&#PCЦ.#,$Y^϶"勬[!Hymi<ۡb{-MLU. c~%9.ȊH4T$\RͶ+ǬYJ>wg$:=`M3PlCBsZ>?n$ڥg_zi%[!h@M%AB1GE5?(›el(Uendstream endobj 242 0 obj << /Type /Page /Contents 245 0 R /Resources 244 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 291 0 R /Annots [ 257 0 R 262 0 R 263 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R ] >> endobj 243 0 obj << /Type /XObject /Subtype /Image /Width 2308 /Height 642 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 71734 /Filter /FlateDecode >> stream x!wۆ…g=ӌjdcّ4si{X\gS>E@֑}^ۖlEEN.L70f3TpaÅqac…ƅ v:\Mzfs<)Y.-Ur1equѲ\\Wa˖n/"HۯZXgo2~Ĺ]Sbʯl/Up,侍˔H_Eҍ9¸0. Å}0. pa. M*YW-tȀJ8s]ohI/V-ݶO;go}YtS./gjj-j/rq4ݹ׹lco丛vrLcp1%]fjnl-yΔ+9k@ƅͅ ¸0ƅͅ ¸0ƅͅ ¸0\6u$Ժeu}ݲ\.ZCe{֨+5F|PS=w.6&5Mus5ߴR/Ǔ32o"2c_9>wpoֻq5ŲyDtaua{/Erm3OnnG1b9?t.bJ w ¸:60. S¸0.죎M. T0. c ¸0u)n7-ʙhquٲ̄K>E=I /6O^lnm~y]]],.#b>뜰m[r?\\ղnZnX~G.#yGgg:{;gY-w7--9fsz5%WFW_sp \ƅqa ƅqa>\ƅqa ƅqa>\ƅqa ƅqaރtOhޘ('}bq3g;u$V~W9k/=YJUWXej3X.[*ԵI w^r6(YL*o}ۖîfreMnsn9pnIijώSV˖G)}61rmZy=>L=W-9ع.Ӿru1j pa\vd\pa. \ƅ\/ ¸0ƅqaG¸0. |dml6-Q[t.)9墥rLK{74)Kg4%em⯖lꢵ璪>K*U$uRΨVQ6GrgGr9ޞx|y~nI5ºc+X?a>s)x_uطSnZtyx3/ǖ燖ǖCdOӵWwy|^l۴J/^_t1`Kuϧke. ¸0.0. >\ƅqa\?pa\|>0. ¸¸0. }YW-W_\N)QzW5e+ɤm~U3ߒ;HWÜ˹CmW˖:lY_Of%}> ρiq_-s}KX\/,=׈l6:7..jٮW-n*ьLދ_cņk7nyU׎鿺l丫s?a ƅqa\o0. >\ƅqa\ؿ¸0. pa\ƅqa ¸0eݶwlSo_GՔ=?۵G:=QJE!NrIE~ʄJmZnR|/V=OO'wmK/ۖaRۛ)#.bJ50ۋMɿ7mK}K> x>6Gru9o7+¸0. ~ ƅqa ƅqa\c0. ~_0. ¸Åqa\r-eYl6떾ef:)^=EL:LJyE*}g;ޞ%Ôl-bJ羧q^Zҋ3ͱvy1\ƅqa\ؿ¸0. pa\ƅqa ¸0Wlx7}֦u] =Wb_-W_qQnWzl؇J6>:vqTY'Oo2wۖW>z̅e{?>"WKΟ7]$u~{oy|oqaJ5f}<%x|_ׯC{~ݒ+X7zy9%_4-V}&\pa\ƅqa? ¸0WpaÅqa\ƅ. _ƅqa\c0. l-Z֔.,뷙eniiyz΅E{z׃ђb/)n=GN"q>b=Lq5 x97/[e)-YiNɼ+_~{h_ϙ_+WyJ:)gP}^ -?%W}Kͧ1Ufh_ZrLU|pa. ¸0.}΅qa\¸0. \ƅ\ƅqa\ؿ¸0. \ ¸0. 7\ƅ|>m]/-WW-\~eJ#>]U2+'ZOmD{6?ӱ J{k˜N_'_\!ywb#k:͗Mgb'1R+:R[z5׋o3յt^]KLy|obzu)WGWmU}*5濢Kai)ղSKsVNc͊¸0. ¸0.5 ¸0ƅqa\ƅqa߯\ƅ|60. ¸0. ~M¸0. ࣓^_[F2QKoUytO#}7l)C+M徦4%k߹ۛ8-waSx.R8Om+[U#>k/;u+SjTvj#^ląkJ'#S=g&ϙܛ҉ u嗖'鹪w7-#sa἞ZFs5ŞZzc)F\fls+[,.[9<=i 0ƅUpa\ƅqa? ¸0ƅUpa\ƅqa? ¸0ƅUpa\ƅqa? ¸0zҹˋ):'kV޻ɑe{d0=v Rfz}n[Yϟn7pac9齷/GpdsU{~=WFu^#jċ9wąu^ed><ܷT5S {y-^{,.gs.ymkh:îpطd{^;Z3Ija "'x˔ʅ}"]#K6@[9d re{?Vqaqa\ƅ. [0.0. ¸Åqa\ ƅƅqa\c0. 8/鶮-YVC}Ȉzwjd)WW7Ք)]I\ȶێ,rYMw&5Y?7}<5e*+Uyr;ZL9yUؘ;{{GW>t[#c6{4W<<ŋz-ο1U.|^-o[z?[ ֹlpaKzϖ.bOSFX缞ZʯmL)xyynIyi{9XNk0yub% 0.¸0. ~ ƅqaƅ7\ƅqa\؏¸0. ¸ ¸0. 1\ƅn[V떬UyεX֑^+XU_6{yw^Mɛáe߶Gdb}|rO]Mr^jqgYW_,D`d22}W¦;˝ #V~TUu}K¦\zw{hIxRH*y~r*˔ӼXn/9O-:z]O5Vb}3¸ƅqa\>¸0. `. hpa\ƅqaos. ¸ƅqa\>¸0. _사VYgҞ||:tajj9pa]7KYv)'8wt^%jWN_-Y猦yee /v Շ_e>:Gm+W?#_8F<%y^sI'\W-y{ /mZҹ<>ܵ< {zhž[^갖h;z/-i96-x5L忲强kV;hqa\ƅqa\ ¸0Åqa\ƅqa\ ¸0Åqa\ƅqa\ ¸0s}lɺ吟|O|:j_;Jk+kM}z|u/m[>ڹ"%+q/{xS|Yr^s?;乲H{t@z}\Li?McN\s?r|Ӈ&ǢsaϚRioN'\ӗ/j9mK"-#.iCˈ K{iV//-]ye{?ܷ<=ELR=a=Dey yҗEf~&2CK9-ϩڟ0 ¸0. ¸ƅqa ¸0. ¸ƅqa ¸0. ¸ƅqazlZeK~fbY/?_:2#]IEi~5tdf{ysb_#ڑ\י^uMzʋU;/vJڑf忲edw KyʅE雠&:v-ٞsi:taz/VÔ>/OSz5eUV[^Z92KK:.w7-ǟ\/ZY^k^{XE. ¸0. >\ƅ. ¸0. >\ƅ. ¸0. >\ƅ.^.Z~R#~=Pg=巛U&nfl)MolOs^on-c^lj=o-Ų$5ONn~b:#[.2F0. 2`\dd*ۏ)ր:ŋetMIYZTǿ'뽕knW-2?￲=sҵ9vg+ x_lg/+3w<玩NI/_;jg~Pw?uU}۷uKӧǖU1r>ŋoy2y^,A"-#^iCK"q^t[֐%|^l[T\ڻ)9+׬Ŋ^)Zyt,"Ţeݱeƅqa\ƅqa. €Wsqa\ƅqa\¸0. {%. >ƅqa\ƅqa. €WSZ]OVyyޅ"+G_xf۽>RºIbg_zy{tkL9y4F׈wo'gֱnZ:_Rz1sjYngR;ٽ~{:/Vx1)7͡~C.\]M*gYŗklV-:/jS&ދU.,V7d#G;M%WηUC5ɴy=oރm>(׋MEǗ)_|Wiה[Ưe\/-wm3 G ¸0. ¸ ƅqa¸0¸0. ¸0.sÅqa\d0. 0. ¸0. pa\?. grgxa}f\#uFt 뿎g5cԞrU|Vf~6eK:}ߝ +kx.57#)xwt^˲qgyۗlMu6O9W}K2+y\OɑiӅN-tZ*6:X"S^ju<:5bEcKΥî%K7E*}k+r 5ޛuA:kvl?5Vf{Η 8n 1. ¸0. > ¸0pa\R¸0. ¸0.s_0. ƅ)1. ¸0. > ¸0pa\%zJ3⯖tUUi.,Tw^;jDudv^wtKW媎=yYg}s(g=- ۵w{Ws߿lV˖}K /v{oq'r6_cmR_tUr;|U$uo3/W&ػ)6k&计o?=ۖLJqxx)Xd^,\ʋoyʙ.,۬Z9ǟ7Vkk+jmZ[қ y*?罫˖hyM˖\'S{zrjKT}r?tK O8ީ~,0jpa\ƅqa\ƅqa\. pa\ƅqa\ƅqa\ƅ ¸0\ƅqa\ƅqa\ƅqa¸0. G&sx/MIh>zۋۚ )@iFDv=޻"yϕ^飹귥9-Y-]X$Ws2c!jȋE$,>{ϞyDpj>W鿾d{u?c^{KyչoWyrqa]rwpwӒ!T+} cz(_/-Vט}q[5yM11xL%')I I>grs3cScu1I_Xyŗ¸0. ¸0. ¸0. \ƅ¸0. ¸0. ¸0. ƅqa0. ¸0. ¸0. 0. wRV˖Wb{G͗ g3s y/Y-אҋmZ溰>> vmKl?q^S_wö%kץ{yjnV-y22~]gc#IT'kn~.Oy:7އy>OyO/Z._fjpصٷ<<ܵT^)93OYVΫ\#tw[zy2 O˪k4֬Qn[ScYCZNVѧr73\GIgWyUf\wd::ȗ\ƅqa\ƅqa\ƅqa¸0. ƅqa\ƅqa\ƅqaƅqa0. ¸0. ¸0. ƅqa\_I3V-ryvgr^_NQw{IյW{^5kV 7U#jb#}^u)pzӦ ?oݯ}֫EamT+ME{֐#P=+RswIEKS|YN]L>y_lt\ƅqa\ƅqa\ƅYQ ¸0\ƅqa\ƅqa\ƅ ¸0. ƅqa\ƅqa\ƅqa¸0. p y2†ח)S;y,k앇qU#y^D#6S\^lE]>{yMItsVs}2OIKɅe}_8J2F\w):v~vo"RYF7'\7Ars_\A>wW]_.98+K/u幥_S--ckT`S\s:=E#"ע%E)ρT+Fksm-}{3H]i禺M9yۋm|FeΗM@ /ߞf ¸0. ¸0. ¸0pa\ƅ¸0. ¸0. ¸0. \ƅqa0. ¸0. ¸0. ƅqa\"%Yl\]{QKo}eW/:~}߬OCuUFE@N9onے5Lo}3I5Dc}߶=T+ٿr^}M&XE>]u=h?}zՒZz_,ӼxpX$]LJ) 9\s̓AV+ﹿiI_)S K{)/_sߑދ=Oy^^[oSb|=Lߒ5nQxŔ\k$sBz{!Οz+X.2w[s\unےg,huxfmEs9|B8Xf{|ɱP;|#~=e>֥\ƅqa\ƅqa\ƅY\ƅqa\. ¸0. ¸0. qa\ƅqa¸0. ¸0.Ĺ ¸0pa\ƅ )\=﹜ט;]YbYj>_շT֫EK{tܩe ra٧v[UF>⼪#\v_RصdzkY{#ђ\:6-O-²tRwFtjJiW>Hlk~Tc| JNGo9vsE]'?A^On%>;W^.1sfrIUb9S{t|w)ղ%ں_~D<5I>^YtWqk}=W=ky-[N=qcS՚]>|^ly8S [l_o[~ޗRվzE*/u_&YkqLs~6^a+1wMRǦ~]K,gvS6dsϽird@>+uدxUh :p-¸0. ¸0. \ƅqa\ƅqa0. ¸0. ¸0. ¸0. \ƅqa\ƅqa\ƅqa\ƅqa\. ¸0.x]ly/VgMtXY)P{ާkW-U};:2ygmn\ d#]XxGW/ٞXJ/6{6vՒﵯiЫv,][vJ/Vll/sR Ғs]UK^/=9U~|-r,g-.燻CK"#^qJ"ϙp[+Weȋ0nJ7c$:{Fz>`4}LVA^Sg:'>=U9|&۬ἋϪ?О۬ye;8ޡϚꖔyN6{GoŎo떪O]})M?\-#/C9ţeVkċv%ުrXnkO)U{9\12? P%R&? ?LJjרb_\veeŢ%I6))¸0. ¸0. ¸0. ¸0pa\ƅqa ¸0. ¸0. ¸0pa\0. ¸0qa\ƅqa\ƅqa\0 ¸0.  Nٮ*Wkn{Ԩ+U^MzQQR5eKUkvt^UF\}~zuuW-Y{ CUkm y3ߖXv^UfՒue;swOusU1fK{Q<1-7_ȷ}JSOMt'ۗ/Js~iiqa.~JŎg Kؒ^)'nov-{̷#䘪T_Crf}w[S"պz>:=y}>^?サiΑ.ZsrRbׁfR?+IvEi_+Gڪ%Nk#sp^M*+v2ŵ"X,ZVƅqa\ƅqa\ƅqa\pa\ƅqa ¸0. ¸0pa\ƅqaƅqa\ƅqa\ƅqa\ƅqa\ƅ\0. w[r0O++4'ߏmoZ۝֟tYT^lsk?_{JN9oooZ%w{k_[;[p?>m'm&_vvyZ:7+=SK5Mt[̇~ʹ搮{x7}dײm[O*e^iCˈz~~l/>?XN?3 :Wuʅv#+W_=0mN99sߌ#߱7~|(cuZky/. WzQ'+7uKu_s^{qD~z~~w2&YsObr/仉YY׸,ߕ\5gsSjv{ԮoSNߵuȀ6i_<Dޟfy y!4⭎ͮ.1a{GI:M)Zr:[y=s?ezՒ+ҬwpKu+\X^ /6ߛ}Kνy $o\{Tkl笌-Ygcϯjo|SWKw7-?Ƽj^g4 zX[yy1/6owUS%{ʑՔytj]fvڀk׺^bW ƅqa\ƅqa\ƅqa\0. ¸0. . ¸0. ¸0. ¸0. ƅ9_0.  ¸0. ¸0. ¸0. qa¸0. C(|O*^,{5OTzE䚭Z3oV-Y_U_Nsuls oqTU$5C+'u}SzYف96n-|ĔދoCͮw^/=ݮ r8.w-s/sfy;.W#CK:Ǭ_ Y!YZt޵z?Mɱsiۻ`qݯ>Y#}~~j9Obo?GE Zzz8RsD4KUgsv^y>ˑ:rܯUTergh;#_Zҩ$Kת>S]oW\],%:m-f!ƅqa\ƅqa¸0. qa\ƅqa\ ¸0. ¸0. ¸0. qa\ƅqa\ ¸0. ¸0. ¸0. qa¸0. |4֫Ud{oʋurd'xL֢WUy|و5O忪{:\ѾN\#ݻ.Ξ\ßw'HUOHޛT>kE!}֫EI.lyG#sfzΫ:uo;޴d{/O-J.ߪcI߇f},k^oGS{y3:U<|z;%=x>WϫTu\f{֚Xǵ{*9sVQ'}w2n ?bcؗ/G茳٬T {"u^vUK^ w]OyoNm_qSzv֏﫞-q_kcWSzuj<~Eqw ¸0. ¸0. ¸0. ¸0 ƅqa\ ¸0. ¸0. ¸0pa\. ¸0. pa\ƅqa\ƅqa\ƅqa¸0. ¸0. r޵=j/םXT ~y+G߾glbMۭy"U)CJUhu{ԫ3yrz/yy}\5^9lwpUXާ'IyZsFzu4KL#g>#Sļei%0^{wut4vf<ߵ.q}ˈ {zzhy.]Kof+KziG#t&3}M$Se5.BF|ֹp.s9˥fex~>΅u)j.e^}A^[sUTky ym͡%x:/6׺#wgssZ˾DӮOUKӥ;޹‹8J+6k뾫kyo k1[ƅqa\ƅqa\ƅqa\ƿpa\ƅqa\ƅ0. ¸0. ¸0. ¸0pa\ƅqa\ƅ0. ¸0. ¸0. qa\ƅqa\lH:{ye{^K?U9LuS|Yz]jT8g\#dl ]u=Y#nӒjy6FNr^CnϪj C^{LwΫ_ދbHM6}qW㫻goʋWfb%cA^V&Fyuj/\X:y3U:{~bӷt^]Xs9*<9W7z2Ⰶ |6\5 4W7~{үukU>2⿦޴m/V սpzms]繜W|_cqZ}KW=W{?{ܽVsa..Rx_O-<9WHsQKr܅1N_ͺeb9zyu._vJky];=OiLJgnbfU?y)(e#yb4er W"ю]KlC&9u)=ʚ4cM+gE;=W?P9ss9_se>W׋Akra?nmI?R:҅]M^N-swwr{shYޣeΣk+x.lkJ:sUO:+uK×_ļГW_D=r._9/NO;+O*+Oyz>{~ג(g_׿e[G{尪h/|ֈޟ[yh_[["}Y:S qaw-/Ϗ-9d}5FoL;+|^ӛXκA|o-yu{ x)v+jr>:X^˪5Iºe{U_9Ges]X1Tvd~o{>d-fJ{ӕd{ևO2Ϭ-#yühIcjϹ?C{V\/ϕŽ^1[N=LoYcrg*']slOO1;\,Z.mbq2y'6Ҿlv_C:n^NIU:t^#+>1&'xlpa\ƅqa\ƅ ¸0. ¸0. qa\ ¸0. ¸0. ¸0. ¸0pa\ƅqa\ƅ¸0. ¸0. ¸0. \ƅ ƅqa\ƅl7ta<ʋeb繭qU&+:βW;eUsKȈ~Tz[=8Mm[>=mM'Vybĺk/kc_jᰛ?6UW"w-b {zhh%~R=[2⿲r^}﹞ῢs*ir^U^\}zuC9ھwkżTƼ/S💮s>7ֽ#5΅E S'qYK>KV凇{#ίEnn-3̕ .lV᭺y/{=y8~pgKr.g@q_j̯;;ɋI޶?o܋{u\ƅqa\ƅqa\ƅqa\ƅqa\ . ¸0\ƅqa\ƅqa\ƅqa\ƅ . ¸0\ƅqa\ƅqa\ƅqa\ƅ ¸0. ¸0. \[KyL5W]'185´uE16%9H U__ -_vr6ݶߘRs鳷?nr[Вcfٿ1vaʤV8^;!sL=?=wLz%ƾU}2Ks a$-ϏS҅h%ޜgg;W.uH~;+Cc*kLNk +͡￟"swm$iƿ@CCCCCCCCAACAAAACCCCC|}U׳*gs]]jNw1vS5?[sM1RKs簧kt渱m\k u3y|N_[X彀 -s?jڗ'xm-sz-ulU+ՓL*]/=ndL_[:;igK]Nek+cjj=ž~cJ:>'G֏ qhfiaZiaZiaZiaZ衅iaZM ´0-fiaZiaZiaZiaZf´0-L ´0-L lZiaZiaZiaZiaZiaZia6?^ZG2bȖ3ſ˼[ӓa:r,n:N [ X\mT~k3=9Ŭ',a}r*64Ihd;Ĺhg5[̫|ֲѹm{F\ P0E;y+`n2)|2rN&*{}y).~ohO[z86& KNn vs0^Gr=l^-3m^#6ogT6Sǽ4)J {.\.ÿ$[X+8Koo-1f٬[rύ<*vMݵObZXO϶0LZ+zmK6e=> *_\'ZY,ͪ%[!i=u})Ĝ,ǠD_ISfz"_;Q?5ͦiaZiaZiaZiaZiaZiaZf´0-L ´0-L ´0-L ´0-̦iaZiaZfiaZiaZٴ0-L ´0-L ´0-̦iaZl581k ǁK};ӬU͛{Kst|DžUu'׀yk+r)}ZsGbx۶' .Ɠt ^ {q\d; ̫wwx}yjRM 0xY7ཛ{Imsrߒ-iljyϷo=r?}_~~$yO&}@%=kI_#5bRl.vv1:;mK],ρY{d)zZ,,; x jqًs-ƱnHGᢻ9oϽYy?kz+e՜_U:_esR׃ gZy^ͫg_$W-y}8?B=s(KwK5X6-}<3ZWx_ͦiaZiaZiaZiaZiaZiaZfٴ0-L ´0-L ´0-L ´0-L ´0-L ´0-L l6-L ´0-L ´0iaZiaZٴ0-L ´0Gȼ!xjF!+ e̹~kԚہN]:ɿb?R[/iqpvz0~jcaJm5B&[ӯh^#>(aF,G,yZWd ֆ,<+>σvЋl-F2XX8'd;3.OO!3G,,ٸw-^5۸N[یr[x& 4Me2v}<<+՝<Z#:|B驥ΙiZ &5[ۜǐna+ojuzۛ^[6bd M-u0:n~k}SnzeO|ikؓ ?>{qDG9&;+ln=жM#M ´0-L ´0-L ´0-L ´0-L ´0-L ´0-L ٴ0-L ´0-L lZiaZiaZf´0-L l6-L ´0-L ´0-L ´0-L ´0-L lZiaZ{ Y~z5/L_1v1ƨ{>f-ۈe[>j |r.n[Nu-9ju> 'z2a'nV-N2\auײ+<=b:׬/L|֒,'sժ7~o=\]˼ XscK/ßƱ亾C ٴfg-Wa'C+{Wzb_O-է^{raRdɶҚsj؏Ĺ_p|;ᨩ=?ԥ벋5lX& c]o5]K佝}nw۶m ow]&wJ\ ͫWYKwQks;|_pLHwˍ~mH~o.6P4iz'I{`m1ݡ9Vڴ0-L ´0-L ´0-L ´0-L ´0-L ´0-L ´0M ´0-L ´0-̦iaZiaZia6-L ´0-f´0-L ´0-L ´0-L ´0-L ´0-̦iaZl=֑޳y]DGD\%>1u*Mu2-cl[ɼb?B<=psS] /ZFֈ͕uQu}rrXӍ5H|_W5ba/;ba<9S]lg1$oo-wy}}najmIui+UփXfU®u$>Ӿ׷K֩LmĶLj//Fe뼢sSݒU؏}pG+y>'rF+4?[Y<-ߗשmK/w=z5_q`P (ֻvKKpQT/-ߐ|+yF__zz=7f}m1=clץmpUrZ1bgJk6iaZiaZiaZiaZiaZiaZͦiaZiaZf´0-L ´0-L ´0m-L ´0-f´0-L ´0-L ´0-L ´0-L ´0-̦iaZlhN{{ 7b=FնNd^w7-,?cmrxי0{}ْOG`au7n)d) .frsZO-z?ٿzF>zqZ{ x{/$Wrd ٿxز5 O-o=z6-8Mey޼19Cj~kI(zn8'Z։ӿy|~r.dž8:ĺW*)^GqOBPiu4wadGY۬~!U /xm=pEK/VJm:5p]{I~,tokA:[k}g~~=~9//-t1 [>OѸ*M#C pļ߸Zwex{{iжR2ryi1WGz*z'Ww-,E#C͝X]6Rž__ !ׂ{Hl6-L ´0-L ´0-L ´0-L lZM ´0-L l6iaZiaZiaZia6-L ´0-L ´0M ´0-L ´0-قiaZia6-L ´0-L ´0m|=հN_9ɏ1 S:y-ZgL;sْFcs8 NNwx9յZW[x/ 擵yǜe4#v+s^epzʹlhdsY62oQ_ #|$>Ϗ-8ƎXX}1Cʲnl>k?/мgg] |}}nS~ C1x5554C7Rwȧ9rqwۖo^Zl(s >G.tJ}Z#Y[^8u18ܡkeܕO?}kqT5ZdȲu~ۧm5zMxO֓y5b–?Mſzm|oumޓ)\Sp_+=0ƼL.JH]y _z/#YދHLƹDHZŗZy-K}s9k6iaZiaZiaZia6-̦iaZia6M ´0-L ´0-L ´0-L ´0iaZiaZͦiaZiaZSsV:Ƽ1=ѿ0bWoZ{'9/s0||dݴxKxͺy6HF=5bGZXI;|@0~fi~ۿF{^_[ڍ.J7vk_Zj-Orv*݄kηo-#4\1= Fܟ\-\G4VmB?/ϺR:qf´0-L ´0-L ´0-L ´0-̦ٴ0-L ´0-fiaZiaZiaZiaZf´0-L ´0-L ٴ0-L ´0-L ´0-L ´0-L lZiaZia6۟X3?\Vt*=k_i\=z眎\oy Zc.vS]]T:O,sTk?aY;/Sj COYu4tgk|=uM+³y%S^Q6a}Rj& xCȜ9[~hXzrXϟ+ uv'>skk//O-jG?baiX7^/_3zpzH ӬUdԔ nkN ^;`Ia(B[=rdv#yUKw2_o|CӼ~M{~zjIs<σfݵXڋ1~k.6wLZ6{_7/凌$_i@ 0/zV9&8Wzs˴sѶmIkf@sg}'8Wr_^/l6-L ´0-L ´0-L ´0-L ´0-̦iaZia6iaZiaZiaZiaZٴ0-L ´0-f´0-L ´0-L ´0-L ´0-L iaZiaZl'#׽Sp˵v|o-4Y$IkΊǏk׀裣-Yz(ſp<_[dX!=}Ŗ{!-Nun87jXqߺA?1հ1OUw-yJ溥jhxmOy)a_z=c-5 ^gSc{ k&ǘW:?]]];LE#u֣3J߾+|x79d^iOȼ_.Xws}y_j٧1)^ c5idщfmҭf--6Y~:O{cӾO^gYS5-y?[κ hafUBsVCxҭ~Ugd"XscVK/Jd.1da_+܏j?c{9ƙR㼢ҼX-YZ3b+bZ4}ǕNb#~̷lhԙ"Z?~G^ec MK]Gy𚢋2G#5 ~`X${|^9oo/-Qm[纜.[F{{W [.wqlY꺸#8czjrƹ#G\ldü~>ͺr&'ec^\/SFLgȿ& ٹ^Z.X/D*EѼՓ, #| qlZiaZiaZiaZiaZiaZiaZͦiaZiaZiaZiaZia6-L ´0-L ٴ0-L ´0-L ´0-L ´0-L ´0-̦iaZia[ݵ*Ϥs|s~&x<}2Cn[XOl[?b#b&k/c j=3_#1qX\,_-o Fo/ηއksm1Y^级G{6f.msc{E~{s3ya=?w۞cWC1\|V5T8eT'`p>fr{sR=o/j5^ZNgdLpJϩr2S 3vD~1^Tn{lZsp]SssZQkGM33&Z/q={VWZS?˼ 瓋qf(Bv-#!C5V1{{_)]l,8z/=9ռz\qb´0-L ´0-L ´0-L ´0-L ´0-L ´0-L l6-L ´0-L ´0-L ´0-L ´0-L ´0-L ´0-fE ´0-L ´0-L ´0-L ´0-L lZiaZfmIhZ kĪe9Rsc lz.c|NꮅZ2h[q.^'وMsc!8Tvuê|Frg޿_yZxD ω.Źf? jg,S]p/>Cuxe^SVOK\)^G1b=1lY9|L_6w缌sgqõmrnпv۞bK\[:ldoZ=ܽOE>RS菔:t=ݵxu>@~oۜq:T)?~God?_kq}sϻ+|޳un#;f;wTs?xOkue\ԱwP'Dm0,.fn2{Dz<b~9y1 m׷ZI+͆9W <8B=15\k eq0-L ´0-L ´0-̦iaZiaZiaZiaZM ´0-L ´0-L ´0-L ´0-L ´0-L ´0-L lZiaZiaZiaZiaZy´0-L ´0T՝;oonZz[.kOy%GKD+2[O܏5ۖl"? Xf+TU̓?d^і=nno.[w<,Pۧy=g?ϼhZY}6Ũ0_Ȉՙemy.\o/[xs_+H>?Ǽb5T]wIz tRA&Sgz3J-i5Zg̺9\W]U>gRgXˌwUviqk&\7V|ufY?g:שsximKk$1vS{>̯ޞ[^_Zykٿ7\嘣k,={Jt!0/$I65ZiaZiaZf´0-L ´0-L ´0-L ´0-̦iaZiaZiaZiaZiaZiaZia6-L ´0-L ´0-L ´0-L ´0-L ´0-L ´0-L %RmzS=ik9żPNFWJUC\7?yg.c,4y q8gqizBxlV-ɿ=}4먜rsod?U-~y?{6;43 gXKa=y`x:evR .a.ƱO}%_ҼzF{:~+/~kf? 5{׵I_T'YX?vPuEiaZiaZiaZiaZiaZiaZٴ0-L ´0-L ´0-L ´0-L ´0-L ´0-L ´0-̦iaZiaZ9´0-L ´0-L lZiaZlq=9F!r-GH.\C>8P?Ld"{ؿ=:FO̚W7\tkݖ?~#vS~$׈y edn/h̼qϯ"Oײ;y!Oo[g}ғ+aJZiaZiaZٴ0-L ´0-L ´0iaZf´0-L ´0-L ´0iaZiaZiaZia6-L ´0-L ´0-L ´0-L ´0-L ´0-L ´0-L ۿX˝i#Cbzbm8v=-S6c\&j PM~tykϩ,l̉XK ņL*C#S~k#VA$kFFpTi+=cciq[}O%[Ŷ=kΗxK㶅cq1_pkډcy/sy k YY-6,?6=UeV>5bX̻k5?bcn(χrMbU-1[G>Wxc\-~k^yЧKylU1CˈݽSIQo_ia{-Gϲc/m=6-rJqmx:suvu:^=ז~,.t1ǖyE_qM߂:#֎^_ZJM)͈ в&)0|7|5'l̿Ne~Wgy~zlzvoI{|{9w9eJ)*]p-yֹf=t i^70/KoC~wxIvrLqd[^^Z_AR?k2kŹ+׷{](iaZiaZia6-L ´0-L ´0-̦iaZٴ0-L ´0-L ´0M ´0-L ´0-L iaZia6-L ´0-L ´0-f´0-L ´0-L ´0-L ´0-vV54Y-ŕR۔ןtet>w:K 6_[ ߩGb>}H7kٿRdȼQNـm/+fgׁFMרe3Km'=;# w=|,_Xכyym+yV>{?[qǷrʹ7S C3>\ k]ɩ,>f= DvqrkI5ꪅnr~$W2b<1p1\lּw3&ʡgZ]!&D}\}g)6_Ŷ|kewpxLrIT:_my9b39nT?5(X=yl̿kwgSaIxzo$G9׈ma[#s3_];37a|HK=/[{J:s`mʼ}%WϞm\j5畏ԱQx_'5ogy2aONǘk +{e$W;{i)u$cJt|^z!+wkqmeͪ|o9ٞhfkשm0ܻ٬[֫^^װCwn[.~A}0Oz͵6F<ٜk@Js;I<2>|I^[bМgyQb4Iz!ibskYɞ5_90]_!6-L ´0-L ´0M ´0-L ´0-L iaZia6-L ´0-L ´0-f´0-L ´0-L lZiaZM ´0-L ´0-L ٴ0-L ´0-L ´0iaZflkb8gNam:YնUwXNbXɤj}ssR1=|My K1YuJ#uI $/=j̈Vǧu}T:l<8w}WŊUX/Ϡ_/`5QK׫ۖc:.IuCW?3J3YpTy~j=}jy[kJ{-xzjNkO0/~%X+Q{۴.o9m͚54ὣx͐,{a=$q^Ozu 9k^{s<ܷ5+ֱ{m5s˦iaZiaZǦiaZiaZٴ0-L ´0iaZiaZfiaZiaZia6-L ´0-̦iaZiaZlZiaZiaZM ´0-L }Ap?R[8$<"XƘyy\Ūg-;Wr_.R*+kd<{1bwTOΈyڬgЇ;T/fڏuy%8۟̿'~3ǢZ똵:|̬[ <5uuZkC뎵;rmrާ%8nZ"~={x/oT,<}P*FlU^4w?=[WL:ש S=@}qi2z~auKhl´0-L ´0-L lZiaZiaZM ´0-L iaZiaZia6iaZiaZf´0-L lZiaZiaZͦiaZiaZٴ0-L ´0gnK=jĹ?2r~na5]V?!WzgAyٿ6Hp1O.߶gapۇbϝ樇vYZ9sd^u ֫^1w/.V,,ۋ/H?X+5RY4mUiNe^p_}^EL^<:aPwD K~X㮅i s{1̷iaN1g^\/n̵I8龙^k;Tϑ_vȳӵ˖4',Hgo8A=:Ofh[ 4{yٹR gpkdȼXWPu>':bl´0-L ´0-L lZiaZiaZiaZlZiaZiaZM ´0-L ´0-L iaZia6-L ´0-L ´0-f´0-L ´0-L ´0-L ´0-Gиn4_e~ɿm,>|n9\rP?;VTkG{f13+X}~n^skd^P}y1ſRﭮz1\Tc~k) Ʊ;ƿ{=?ZfmkȼlT52?L9t{5ȺsüKkԚs6A.ߧyU Wߴ9_#b&\c<#Pl&;Vo!9#:_z/r1c]hֿj\Z^3: } <l@_ݦIuoCjkSm?=|baM6Vsx[ӽ_1-i~;=qv/J 5xM^|ŢM[Cs-z9qE*%x٬5W;y-8`Yq9kߏt\Uk/,]z,[Ⱦeyh06hW-thɶ1E#cRzK YxoEGzj2d[ѳFb+ژ s+5찋9a3w9\cK L֮ys^8iaZiaZf´0-̦iaZiaZiaZͦiaZiaZٴ0-L ´0-L ´0ZiaZͦiaZiaZ,ȦiaZiaZٴ0-L ´0ۿ=<[x^sqs<'?b[s,\X'[y|#>yJDϚW1<>yI+_l+uuS?cGʜ Fv1ckm0ggxo,N>.M?~kfοx-o8W}Ӧkҳ1ϥevj5k-\)Rb$j,U;+-ޯ>sc6Mf3`a]Ӿ%a= Q9ۙ)_K0Gh^?׸>~ϊSk8#KbHkjc pтc=-/|2Pm~o˸W UϲpM;(νӘ=.wڋ=^6=VBL{y]0KC?o^Uċ͙Wه|ssY궅k!Y3rғ+j s>k`ms>$Ou޿YZxUs/;\܃V-ش0-L ´0-L ´0M ´0-L ´0-L ´0-L l6-L ´0-L ´0-̦iaZM ´0-L ´0-L ´0M ´0-L ´0-L iaZiaZiaZiaZf56ۛGTJir?h[e>9`^iW>u9`^=ݑϛk .z!-#X;Z}'^oO+>Fy:7k^ڬu_wka֔e[lZٓy}N]?Rl G1-u&Xk~Tςa12n,Wqs8EW+י#7v~_g%k9Ѽҽ{loqn´0-L ´0-L l6-L ´0-L ´0-L ´0-L ٴ0-L ´0-L ´0ia6-L ´0-L ´0-L l6-L ´0-L ´0-̦iaZiaZiaZiaZ_]gxX/;噶4\LSOL5?dϛo˜\ '3fq>Wcx>cELy6+Uhjŵgª̹9:+F>m-#ϲϸu׹<;cἑDNN1-3ѡx&#Km^Z>[kä́п=Rcxz^/ǒ޴dfaߗ`?RmⰅ-,F?&X6k*]/gUbzϴb u:O5U^#\:Cu4짯<܁ms dF~TIHOe|ot1g~Q WuOޢ_|rv唺Ais|:a[ɼ8o,4 ,M˶idk~~?m1#kQs}n#4a-}G=3ky1s5jSx-mZiaZiaZͦiaZiaZiaZia6iaZiaZf´0-̦iaZiaZiaZͦiaZiaZٴ0-L iaZiaZiaZf}XXo%(ϯ,ϾLy:rm}RGu]^#,^{%1|̈,89DaZum!$zw-nZ5=E\uÐa i=mnn^+t m=<&?-gF,,~ig$os>/{dͫvw{ےjѿBy.8?f篻kgzŵU VPz}sYa][z?i%7-#_'znӒ^YJ~?uiy dz^wK48ͯ0_gp1j=!Xeļ1k?q>h^+b6 Ij2+=+baKv6hX9ƼgăxLrOǽe m#U累ȯ4<_Θ'./}9)Ōجy}iaZiaZia6iaZiaZiaZlZiaZiaZͦiaZiaZiaZia6iaZiaZf´0-̦iaZiaZiaZ6޸=+/z yͤkާSW0L^aynwkCݘпbu^͹4+xsp_t{ܞk\krM͹}9欅<>7m2/֎̫:_]7^>XXzgfNÚw硳 gn}n"[N~8^ ɗtF)EƺtU9#^Z Nx#Qe{o/)aRlټҳu:gҲG9x[*aZa?Z쩮zhvr 87H-m*}y~]pxozJ3^<7[{^ qoٟ'}<~!\&΅2Ȁ}|<_u?s#ՑFj2[yqXWy~ڵCD?q~٭\*DŽ{hpܣ9Nv4o^yH]bvR,]kɰkf1ce´0-L ´0-L l6-L ´0-L ´0-L ´0-L ٴ0-L ´0-L ´0M ´0-L ´0-L ´0-L l6-L ´0-L ´0-̦iaZM ´0-L ´0-L ´0k>;iqNFKc׿Z?չaُS$|6"u.JJ޼fkg4Ϛd^|>r:浾kI6Zݵp:@/ayHyfG{ȩƜ74~絆j'aG֫g6-L ´0-L ´0-f´0-L ´0-L ´0-L ´0M ´0-L ´0-L ٴ0-L ´0-L ´0-L ´0-f´0-L ´0-L l6-L iaZiaZiaZf8|5c ΅PC_3zi+밋߂sŹ_>ϛ3?>ϙPs.sid̩3TᚢC̫15_P+ӛoݮ%FǷsrY=`a\ϖyW|Fk̶)*ϦG?0XD8ϳ!hZ>[Asja' ~֭yMv62>aBY߱H'-lXEa}͹fnI㮧Yv~Y1e4Hp,~Z"`j\ ldzh1\wXZY> Y-9nɵ?AmdFvߑccKqI1}g%E^_޶}*|d5EKYK k"#ԩ.W~ucFy15k^G9ciqż5k^a{?DB2|g8NN׿zk8ɚٲM ´0-L ´0-L ٴ0-L ´0-L ´0-L ´0-f´0-L ´0-L l6-L ´0-L ´0-L ´0-L ٴ0-L ´0-L ´0M ´0-L ´0-L ´0-L l_dmG)?/Ԅ| V[Sm|Q+Eο3I|#Vv尦mlۥcҳty*gRJmk{2uuf3>nѿp;Vr~RnjEx^1?-1j 0?Y χcumsu98k|,,=ec5b#5>s㹺ZݵoO_#x;dgaf}y|%WuS>ebú3״kԼ\_ybۖjaɹm+M!Fj}տ\CלVoyoz`#:)|3'cM^VR aMSyYJrR/X*%hˡwhob]S]A]^D*{잺*=OmK]&󊵔eAa =q~;<Yrbg^ w-˵6d^9clZiaZia6iaZiaZiaZlZiaZiaZͦiaZiaZiaZia6iaZiaZfiaZiaZiaZiaZyZ]ˬ\gݴzRo[i5 XXϖg3/7K|?9=ٌY0h)Ϥl|&&qѶ3鿟?ssӹqŸޯkÍ~vzWr1qMQkz)> i³bG9{n75QbUJ.V^3Y |s)o{-?yoZrKT>o/!S9?uKBsz+{quKaݞݠ)t=imIB u:x\v3:C6ƨpo0v<=x#uZnF,dՙgּ35EJ\Ιif$y,׆Ӟ~׸nZ8&=Ƽ.ӬGo=_R:!:_G^u?C`|:Ou=KW0=>6JsqkiaZiaZia6-L lZiaZiaZfٴ0-L ´0-L l6-L ´0-L ´0-L ´0-L ٴ0-L ´0-L ´0M ´0-L ´0-L ´0-L l?mx 0ex-ŠS8Yz&怑8%r?4I>!S"C7=OT[y.=??yyr|֔yܟ!3esѷ_Zmߵ\_$1βuҋ=F:u|&r]A޸ ԀUc%6#plܴp,嚑vZ瓻MOQ/rq9/;Βngi5B/۸G}Y<.Od@O-#ub8(G"^<. ΀>м1#͋5bC#5sx{w~m5Nq=)=WO+Xw-f(B>4k^'yԾӁ{w{%'/!'rZLjm2gNBN~yxƹjX7=|/\M ´0-L ´0-L iaZf´0-L ´0-L ´0ͦiaZiaZfiaZiaZiaZiaZͦiaZiaZlZiaZiaZiaZf3#_~i}3g3Xo4Y-|x_溾Nk2Y#+4h}>jjj3~no:gz|lgk@o-u$~ٶ{ȿeL>WX~{9,,;㮥1'd5Vxɞ\.[*{?=k6B1Y뫖]K/o7%C_ek2[nzm339I.~g'9o 1> GexŢ rdw;8qv9r{y{5UU:>f9 g5kasyb8G} ZoZ.[.k1_&mȼ1_S0ϛkz\c^u}<-BQ5`[a/KK5>g<ї{x 0T1/z_=&̍y1\l֫boqfkiaZiaZia6-L lZiaZiaZfٴ0-L ´0-L l6-L ´0-L ´0-L ´0-L ٴ0-L ´0-L ´0M ´0-L ´0-L ´0-L lF۠>_-_܋Ge:W]gam_1O61}<7 ZUg=?&vo}wbƓw Υc\вqx^:s׀\u6{lcNda\;}HCȼFTu|:W[kj1uT_H3gk|3kJ"8R.YR=|~X'nG)}z=V;WHez~r+Ǡ6*k<ϸԓe~|u^Sc8\^nyzg)5^f #S^JFú qX c6f^Ѳy] ~/Ǔs?úg{h)3bRkcl}~-|x2 ~y]2/_?= /W<ղ=cS}q{a-@.řͦiaZiaZfiaZf´0-L ´0-L ´0ͦiaZiaZfiaZiaZiaZiaZͦiaZiaZlZiaZiaZiaZfub_{\찗U[Ikeb=Wx2oa?]ܣ'iNְB֠vM -/-|-6η7uUK:i^c yҿRk!Út>}YvYk]rmJw*z?y:(떡9bF櫥f=xiz"# sTO`9>Ϛߵi D:ݶ+g?9ѼF2bc{ߢ֝+WϳdƏYyϊƱ4+HUk)1gG,WOuضC=l#|3baLoU vg6iaZiaZͦiaZM ´0-L ´0-L l6iaZiaZͦiaZiaZiaZia6iaZiaZfiaZiaZiaZiaZkY痗-/HG_]LίZX{_?Ez_}z91o{s䗳C3{X㾅iç[yEOyFm觃ߧ~9d?uY7 зDG{{kv:?{UΫ> mǓ9x# ^MOeaų`aȆC}ًonZxM=9=y!'ΆO-#\ ]-߽x%Y\\O%#u͚^-_79xg`[cH٣lqk;P>U 1W ^T5`^3bt>q{h {;i^>A>'0޶Lפs?}`wgѿy1_׭s|o ul-qu3_#(*nDlœ|^mZkuu8Wߡ9ٴ0-L ´0-L l6-L lZiaZiaZfٴ0-L ´0-L l6-L ´0-L ´0-L ´0-L ٴ0-L ´0-L ´0M ´0-L ´0-L ´0-L l^n=Xz2YO5d< b%ckHK 6l((ذnxw#6~wYﹷ(kZ牗LNu*+<騍K=̇H_;K5tdMΏ^:ݎ\?&}Srܘ7f=I^^㋑>kbV7Su>Qغؗ/G7#/q}>ߏt~?J?GoK-H7uS~m趶s̙yt㦋,^y\X&gr}#F,x5\ǒuϜT?/ljLgyu,E:7> ϖ-Iou k3Zϵ^(cGZoWٷl7&ׂVϲ}?׳m]o\6Owpw|snk}kcʸz%ه}W\X̏ofdKb4 pa\ƅqa\ƅ\ƅ ¸0. ¸0. pa\ƅqa\ƅ\ƅqa\ƅqa\ƅqa\pa\ƅqa\ƅqaƅqa\ƅqa\ƅqa\ƅo8]Xy%9{:ŋuVŻm!Sksg#g;L;%ў8bY?~O?d{%f/iB޿sWgsn4;5Ţ{GhB.Scug1㿪G[&Ǒr\Q!K=7ssgv-~m-;3q*3[3YZMuU~췷gy5ҋ ;܎d=.Ԭz`w@>ky}Nc|]]]bW.tƔ{ڑ)zTLn$9֑,=bm=0ߥV~og7u;gGj>ja6kfn$29 Y#rX%ŋsm5tn+ۻqBnGfO;tXr[>[}.3}]ㆢ':I¢\֠:9x>/va599ʾ.c{V ¸0. ¸0. ¸0. \ƅqa\ƅqa\ ¸0. ¸0. ¸0. \ƅqa\ƅqa\ ¸0. ¸0. ¸0. ¸0. ¸0. ¸0msߏ\\7^˝#{NoӽsG-]~_fS='*Pt<ݹyA>#9ȱ}򹳿)ScS|_9>~zy΅SKۗ95CקX~=Ou嚌~#_gD7~2Rd;}ӥ}Yϴk*=\g`뚇hdn$hy?8jlQ?mqeSƥ2KRW:$ǽ鼲 :Ou;c ߽G>;:;}adʗm:{zmpfRwNʩnϕohǿv9,~_9o}]__:?n,ۍTں}뿚X7]7r^kiGuάhׄH<-wjGr.,^wE¸0. ¸0. 0. ƅqa\ƅqa\ƅ¸0. ¸0. 0. ƅqa\ƅqa\ƅ\ƅqa\ƅqa\qa¸0. ¸0. ¸0. xsˑ˥ {9;{7ҺX<ݞuݒ.<֗Ŧڻ4>13坰>x)n|{SY,^,]bٞ?VɺJp9tv;YjK\F$z,u{#?|amWصid'Vm#կ-c H̹&*g5s]H3ٯf)'osozMrogAy֜b LryW8Frmd>=kYIھ?ލLzgq;٦ɺzmDuCv;N\ُ#3Ɯ[珝*uѨ<Gds3r~~l)koM>ye62w#q;zm뙎gX2v@n^H^{yeT4q~Z5&$)RNq^?x1]U#Yg1U)rta/Iw6Ų^0]{}x8xlK޺咶ugun?KpIʪZXF6O6Ae^nܿf8ދEbtjőغ;89Yz}GGf|JW-9?rqRtܵwdߘ|WgZo=x~h Ncf<>uk^Wfu3y۵v15uGsG>۳>^OG~ުfͳxȇt}Ɨmud<)N6_y?ܰKs-ٷ5ajI5繞_6/<犹mߏu>5&ڿtz6muު5iNȌۚI3=z9ozz_٭9\SkfҮ *ޛEnM}¸0. ¸0. 0. ƅqa\ƅqa\ƅ¸0. ¸0. 0. ƅqa\ƅqa\ƅ¸0. ¸0. 0. ¸0. ¸0. ¸0dwy9"gߍG1Jٞul?;{7u/ώ|k)TG<^۾͒AnG]?Rc2ԌjۗnWZtObKߵ׏T/bkF.//i\)^|j}d݋Gr]YΡI/cuaS^u>/_uئG^zk)nkqgm{|kiWݎ^9أ&Dm/jkugSqgmZΗoG:5vkfk{$t^mS\yUΓ m\>euu9R~m#Gh=)n(|Sͺio6Kߞ]wOϑ/;y53힉ǻ?Ϋݦq^#>ʬ&tㄮ=qy1O&?\tS\̈¸0. ¸0. 0. ƅqa\ƅqa\ƅ¸0. ¸0. 0. ¸0. ¸0. ¸0\ƅqa\ƅqaƅ\ƅqa\ƅqa\I5|_1{$ɹR#~}_e}W 3Ϋt^i)둩Z~Is+nz7,nhyַ|Y^oDI^*1wm9ލ/+o߾D]~Uf;o5۹RG.~8.&}r}jۦcu9?ϕ}:ڸ-i6ֵ4glN9v46ikYKr#x$e>圛\&gp\ϓ?d3I"Y=p)폇3|yKx7s9֩5TῪ+Y)3+!t^_|y|dFzmguت[O?zug$s6[KsO6o_?⿎ǻ|zw1}H^s3u5>>k&+uUl㇑kcr?O.1wQ(qa\ƅqa\pa\. ¸0. ¸0. qa\ƅqa\pa\qa\ƅqa\ƅqa0. ¸0. . 0. ¸0. ¸0. s?|'ߛ|HzlœuޟyGjŲ}Qwxz{}ę_mbR%ylgtkbl$΋,ϭ ܍{~;/_~noGzݴ7nkʹ|ӶYm}ՒRj>W:Y1]^\Liq^[ڍoD: =c:%WKzic%up.22n)bL\u'qH>gY>sL>̬bO'9c%9v{̶5oƯ?۔꼣i9&]{]Ӹ̉\&1}_"#kXߦZ_V_Ezj>^g}[XV^ǣ?ɵw#sk=;GV\un2г_?/iַoG=G{G)i-Lܩ.ln7g5pnwTw^s^l=[WlZ:LfcyZ27'qa\ƅqa\pa\qa\ƅqa\ƅqa0. ¸0. . 0. ¸0. ¸0. ƅqa\ƅqa\0. 0. ¸0. ¸0. C8Q̚w9{I.9N}gM#}|=}$k,YYLMitHǙwo_=9]^ly6yoeX%yz7Gy\7/>ecǑ}· ~WWagiY;Tor{gئgESo\[̗]یG{yd1%kuZb͸:>1ố|^ʘK:gϫw,(9sI==(.~In߮l۳{\޸>Fce9Ju~xx_|yooE] W/Ƌ,_?/)s^]ۦfQ~yu^nY>:Vsֱzf߯{go#1GH5翖c{?q 3e!MSvyh?llm,3o:ޞק୒33ZK\tmҭϖq6e3w=]vM6;yo;mnGs٭iy<ǑWcse^keYϼ}ӽf=' -sǑ?Ѿl7ۺ9΃LpZLT-ZR|c3Wھd3n~zic{6zn|_㇇~$H>Sgn7uQJ ¸0. ¸0. . ¸0. ¸0. qa\ƅqa\ƅqa\ƅqa\ƅ¸0. ¸0.  ¸0. ¸0. €?sXROnj|;msԍ:/~%u$4NInGw sy궩]~uy1\Ǵ;=W;(wg#۹=ŵ޾n?t?)⒞˩+ھ_?>SWٛYJ/V\،o;>_&8TZ×uۄ9ws,c$G ¸0. ¸0. . ¸0. ¸0. qa\ƅqa\ƅqa\ƅqa\ƅ¸0. ¸0.  ¸0. ¸0. €?tv#yݿFJ;/%s/c~p?Wiusv8tFU$۱8%3^~]Ý,]΋=~`dʋnGr <+C98?:ն/s㇑|~\{:͗ۊgƝMOcΞNSuNj:Snb^y{F̓󵜛ZnPWrs3}{&Y=Wi&Uj:w^2sPֈ}GSoq[[o߶> r{s5:@8vdi}lU_|IUWxɾhmz>k'Wk2O{=Q~YCdqiX82/󔫑Ηsfw/cogw7;n\q΋-н#$/V=o=Lzҋkz8'iYV:?5fT>w;Ցo>r_9uHsNz:_VUO:eeKFݿ;O-~$k]#ky\ƅqa\ƅqa ¸0. ¸0. qa\ƅqa\0. ¸0. ¸0\ƅqa\ƅqapa\ƅqa\ƅqa\nIyҞu[;-^cپϸ|uc<|d?S|AN/VMxwT|/v?b;{|R~^'.)4Wpw$﯊kʋ>1Rn.x}z$offMRz~Ƌm^m?;]_;/LW?կ%3ˑ~θ>Jev27#u\t7:Ov6Uצ.謥2'W?FfK;SzwN2(5%3':ıζ_%?܎d9IM꘦}Omkx\'?;.O#_>Iuf5~*kA_~,\^^_u5wl/.um\UP޸Wup<G2Y?}i$`G\_dֲuή~Ņ:y&'UH}f<׌9qIӞ}T͵y濧<. ¸0. ¸0pa\ƅqa\ ¸0. \ƅ ¸0. ¸0\ƅqa\ƅqa¸0. ¸0. fx%8ޏ/Le^,3%3-虼XcKrΝ<;fƋ:/v;<^XbybmȗF^Q?)L3?=)Z< rlyeI'D=y>7w#45뫫¸0. ¸0. ƅqa\ƅqa0. qaƅqa\ƅqa0. qaƅqa\ƅqaH|.sf5.xG:.Ώ6s5^ilz~[XϦcKه}FGՋxezRK_ҵ8$WXq[ϴM7:UQqI3mch?;o绋%yU?`e5gv5LS9O%u/NKCuj7#թ-k89'H=FߗdH_ĺ{d=ȗ1]X\xt~v\y.jF{g5|Фq[ؾ5sYw^9u__R;O*~$rDNϞ ¸0.…qaKÅqa\ƅqa\¸0. {pa\pa\ƅqa\~0. *\4\ƅqa\ƅ$>"y?R.Z&ZlfK};j ޕHeCʟ^lybm3^,obn_ţFmzwO~Ɨ圢^[|:q^<1_KҿF;v Np^7fJa/1(*ȹFfRg 'stݼK,7ףsfڳԐ繽_S{8ލL9)?͛t+@:oxssaY߫5%ymG~<l?.ϗ4^,:?}+ͺio ,i|֌*7RpŢ?ijz2. ¸?. ^. ¸0. € ƅqa\؟ƅ/ ƅqa\ƅqa ¸0.O ¸0. ¸0vˑNku-5,OZ/D,ov)^m_wI5ؠy/k7<'Xgq[)/vwYOG~%:z_q^,F/sy-ϲn<\q =$)Wx~auqX9?]drn72Ժu6mo<:=Bqj1~uvNm?rZ}qjO@O뺻ZRɚ^)D&E_sԚR眹Ly7=W{SD{Utj=z9tkZnw1EwQ'^\ƅqa\. ^ ¸03 ¸0.O qa\߫sra\{Fpa\ƅ pa~0. {uN. G{*x^=޹jG:/VPyg26[wLo}ݏd{}l/֍3wM#գ=yy&0m{|x<ؠu^Ցu,U>:/]@O{^iM:뻪ܙOLւ=AΝ[Vu~55:f}gI(josǓ>4-ȯӅzrN[*gak^m5j%u~YZ\3Ȍ ˚m/_=ݍx. ¸?pa\ƅqa\ ¸0.0\ƅqa\¸0. =. ƅqa\ƅov#d_td={nV/ϲ|lӶgzw߱u-ǐ7KNU uw{;ҽkk1Uz%3wjO'cCx{!GrU6/I2Z5;%/׶s^]9#_ϟ>k,.l[9җ*hm9?Vc?,iڏǻֽX'yԺ ¸0.O  ¸0. €ƅqa\؟ ƅqa\ƅo . ¸? . . ¸0. &gG>7ލ^,%u^,0<ʿ[Ni\tcz^_՗5N->_xoOGVVU_rU}m׶8sX:P8r[XH[],brYwNsotk%t^߂k.+* vkwHuUj=Ժۚq@>OrXO?.i?oz_{/Wp޲?܌ ƅqa\/ƅ4\ƅ ¸0. ^. qa\Kqa/ ƅqa~$Ñ7IŲlIzIOޓW/mX| k.Fw{lw=WbYyF[Yz2+>kI23UI㈻ߋR r-w:Z-\ی_+ZC?>{uy1H֑߉\-!zL.GoyR_Tv6r<܎Lpd[Ucz&U<ԌZRT׾ѣu}?^,{RZbuKH^?\ƅ ƅ%\ƅ ƅqa5Åqa ƅqa…qa\xpa\X…qa\SHWctaL9;{?ҹ΋󨺰Ȍ ˱DglfO;ɗ;5zKwKlӺwʔ1I7I~|N@Gzz8S%ZzHWku%Yȗ- ..Gjn .,;GZ5K{{mNiu˨y6.,}5riƅqa… 0. p \ƅ 6¸0. )pa\*\ۀ ¸0EzǧH:;zO/P~=2fWnFw_3,lwDvnkʋMwPNy1L;*Aֈg=gwyکuQWy-~[)H: +"/zWu^&\U^iں]kcXp;{TH^o=${qa\Åυqa\S¸0. ^¸0. )pa\pasa\/]u^^Ch/lӍ;͋5}fc<O_m\Fضzcǹ$q*SˤS;F9y8=hoFw7#_>T^am:-mcϞpÒn3exH֐l\¸0. 9N ¸0\¸0. 9N ¸0\¸0. 9N ¸0*~`w v(EJ8XΑOgys^˖H}ËJ)1ys)ZIf-+E®.Gl9}Ʃex؏ySQ繞_7y ׶;xIL`+ƅqaUpa\¸0. . 4\ƅWqa\_Eҳ\].ޑ|&bs\kEUI8sc d1]Ņ\Œեqp'8l8H'w1> /v<ݾյuu4|Gܕƅ pa\Wqa4\ƅUpa\/ ƅqa^3n$H-瑋qRE{:|&f=y n̴mocfv}//Η9.xhٞB/.]=z7۔Y8ZS뇝S9Gz'gʹw#u9G.,E5kJ\<\ƅxmpa\\pa\qasqa\ߝ2p7}"}+dǐ&nG\-5Y_]-jZK_#Ȍ#g\X=o 0. ¸0. ƅ\ƅ¸0 ¸0q8܍b-zE]/mIg%ũ-M9a\+׺ΦYdw}O׏Gw%_v.Gҏ\^luj3>-?nyww#Xy0. …qao. s zˋΣy&GYwj׻%y̗˪[ҹ<~Uqao. xpa\vu[-8lzw6ͩ7KZv9RmI®.GoZ~/0. …qao. _9HΣe{:㎖,qjHO-2   53Nj$|YԮ2St.x<. o. o. kNrjpw7 W……M:Cw [ [ ;#=c9+ /……^?Ό[endstream endobj 257 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [333.9886 592.0322 394.4358 603.7217] /Subtype/Link/A<> >> endobj 262 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 477.5328 159.7844 487.1011] /Subtype /Link /A << /S /GoTo /D (section.1) >> >> endobj 263 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 461.8624 182.8146 473.5519] /Subtype /Link /A << /S /GoTo /D (subsection.1.1) >> >> endobj 267 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 450.4344 213.5116 460.0027] /Subtype /Link /A << /S /GoTo /D (subsection.1.2) >> >> endobj 268 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 423.8549 240.3696 435.5444] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj 269 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 410.3057 198.0571 421.9952] /Subtype /Link /A << /S /GoTo /D (subsection.2.1) >> >> endobj 270 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 398.8777 202.0571 408.446] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.1.1) >> >> endobj 271 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 385.3285 261.1481 394.8968] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.1.2) >> >> endobj 272 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 371.7793 239.7238 381.3476] /Subtype /Link /A << /S /GoTo /D (subsubsection.2.1.3) >> >> endobj 273 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 356.1089 194.2086 367.7984] /Subtype /Link /A << /S /GoTo /D (subsection.2.2) >> >> endobj 274 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 331.6506 316.2335 343.3401] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 275 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 320.2226 198.9055 329.7909] /Subtype /Link /A << /S /GoTo /D (subsection.3.1) >> >> endobj 276 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 304.5522 220.2692 316.2417] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 277 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 293.1242 210.6934 302.6925] /Subtype /Link /A << /S /GoTo /D (subsection.3.3) >> >> endobj 278 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 277.4538 216.1783 289.0221] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 279 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 252.9955 204.5513 264.685] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 280 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 241.5675 170.2085 251.1358] /Subtype /Link /A << /S /GoTo /D (subsection.4.1) >> >> endobj 281 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 225.8971 242.9965 237.5866] /Subtype /Link /A << /S /GoTo /D (subsection.4.2) >> >> endobj 282 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 212.3479 316.6329 224.0374] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.1) >> >> endobj 283 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 198.7987 241.0875 210.4882] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.2) >> >> endobj 284 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 187.3707 227.7541 196.939] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.3) >> >> endobj 285 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 173.8215 254.8753 183.3898] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.4) >> >> endobj 286 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 158.1511 248.5117 169.8406] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj 287 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 143.9959 266.239 156.8975] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.6) >> >> endobj 288 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 131.0527 236.2692 142.7422] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.7) >> >> endobj 289 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 119.6247 227.0268 129.193] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.8) >> >> endobj 290 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 103.9543 333.7239 115.6438] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.9) >> >> endobj 246 0 obj << /D [242 0 R /XYZ 81 752.9534 null] >> endobj 247 0 obj << /D [242 0 R /XYZ 81 732.6296 null] >> endobj 261 0 obj << /D [242 0 R /XYZ 81 492.1844 null] >> endobj 244 0 obj << /Font << /F23 250 0 R /F20 253 0 R /F24 256 0 R /F26 260 0 R /F15 266 0 R >> /XObject << /Im1 243 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 294 0 obj << /Length 2918 /Filter /FlateDecode >> stream x\[o~ϯG 9|ܸI Ejeɐ{xG!Q vkx>}sn<2i0#MK%(҂f~ 7 x/͹qƴF Wі*'h&\~LC(E\p՜)JTؾūhFk\\5Q0]\kEO$瓿nzF&Ug_{s&6_ dwۤER0b^!E3q:{+&R5Q 1Fi0 j, rı=lw !Wlܬ-G ȩT{N U G>'ο(KKX_\%Qj(H6o7]va <Ĉ4z<9L>gE1HTjv̗|9)erG:KKbwrrx.=1vÛR\{>[S$P Y tk(m^\Hy[]o3pvƓ~^uN%cS xgHI?^f N!&'som% ʠ,8ۊ8\psHWT?Eh[L"Q€i'os(“z\J9`+T2M5[I56 oJvT aYep Y2]J$C MLrEۇ@jYiD1kc[HH 4!n̑>7yp&U8R5\QU?+ϗo#r*"}SN@r(51Xb>s +ϒ@ hM !T )%q=/£l-6akٶreVBkl bi8/Gx9hR]'TC"=?".q*Ul/g:ޱ+}< Ш yX0~rYU]|BN1?6Ňkvnmmz 驖&E3xgjm({J(AB/@CU=1kژ~ol3֞/w_ miޚ>&M j`pKհS):QPUʶʗ&Ԟt&5 #cdHQVet$@Dw0֖7v+&LL fr2P&:uB Q-Pюg8bV/g)FYT8+)JEB~^Xng*"gJpኵS+()α>$q-)ky>|crPo!鑝+ﶖC5<zD$@st%s&,3_FΒIͫ raǎ}saFV3ʿ_ohS:1%@s!&"Hń@m_w&|+o6_ƷOpoA.-k?Zzõs\T݀R5Tz1dՄeYZ2>N ɔ'Q€o] C _;pfCvjE&U9pjb/7݁B-߻ e3(fV;mUɹyӇ|<PAǓT P{_A#(*Η8@`(is`L2uM7ncD=l[U~شt)<vxT?yƒE$,%_FȒ 4Oݸ(>6v_ohlV~˘v;L9I31Ϛ'A=$he[٩J<ɒ9iFɐ֛]_1,¡EZ8 S_{!׹AOںr1@fj6eZo6!Tm\P%',_\rP<'fuy4ZBv |4)Y^?$?D?BUa"b|9ñғ&nVD1AZ/Xޘ9myZ>?U&0pjH XK>nhڃ׬6_βu| qTqDtǛQ€׮insm8gn=_b _&U;8Uhjb㢇Uawn\Pal\Dc|N22<.X)jwJd1 /7ۃc(=iRrj8f=1=tߑ "EDXDV~+cG?h!KT9NQm@DW0E`ͭi]n{ crޭwCG KT !|s]!R4:j)e5(oǿ H1EϺI9;fendstream endobj 293 0 obj << /Type /Page /Contents 294 0 R /Resources 292 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 291 0 R /Annots [ 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R ] >> endobj 296 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 718.5532 264.542 730.2427] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.10) >> >> endobj 297 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 707.1252 243.9056 716.6935] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.11) >> >> endobj 298 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 693.576 241.1784 703.1443] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.12) >> >> endobj 299 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 680.0268 183.3904 689.5951] /Subtype /Link /A << /S /GoTo /D (subsection.4.3) >> >> endobj 300 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 664.3564 191.3904 675.9247] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 301 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 652.9284 205.9965 662.3755] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 302 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 637.258 282.3602 648.9475] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 303 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 623.7088 252.4511 635.3983] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.4) >> >> endobj 304 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 609.5536 419.7543 622.4552] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.5) >> >> endobj 305 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 585.7013 274.0606 597.3908] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 306 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 574.2733 186.057 583.8416] /Subtype /Link /A << /S /GoTo /D (subsection.5.1) >> >> endobj 307 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 558.6029 211.0874 570.2924] /Subtype /Link /A << /S /GoTo /D (subsection.5.2) >> >> endobj 308 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 545.0537 207.1783 556.7432] /Subtype /Link /A << /S /GoTo /D (subsection.5.3) >> >> endobj 309 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 520.5954 241.7787 532.2849] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 310 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 507.0462 270.8148 518.7357] /Subtype /Link /A << /S /GoTo /D (subsection.6.1) >> >> endobj 311 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 493.497 287.2693 505.1865] /Subtype /Link /A << /S /GoTo /D (subsection.6.2) >> >> endobj 312 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 469.0387 167.842 480.7282] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 313 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 455.4895 211.5419 467.179] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj 314 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 441.3342 224.2692 454.2358] /Subtype /Link /A << /S /GoTo /D (subsection.7.2) >> >> endobj 315 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 430.5123 230.5117 439.9594] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.2.1) >> >> endobj 316 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 414.8419 346.5118 426.5314] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.2.2) >> >> endobj 317 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 403.4139 222.0571 412.9822] /Subtype /Link /A << /S /GoTo /D (subsubsection.7.2.3) >> >> endobj 318 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 376.8344 185.936 388.5239] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 319 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 365.4064 198.148 374.9747] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 320 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 349.736 297.3905 361.4255] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.1) >> >> endobj 321 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 336.1868 276.9966 347.8763] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.2) >> >> endobj 322 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 322.0315 429.5119 334.9331] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.3) >> >> endobj 323 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [121.4584 309.0884 293.6026 320.7779] /Subtype /Link /A << /S /GoTo /D (subsubsection.8.1.4) >> >> endobj 324 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 294.9332 215.8753 307.8348] /Subtype /Link /A << /S /GoTo /D (subsection.8.2) >> >> endobj 325 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 271.0809 207.8028 282.7704] /Subtype /Link /A << /S /GoTo /D (section.9) >> >> endobj 326 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 259.6529 178.5116 269.2212] /Subtype /Link /A << /S /GoTo /D (subsection.9.1) >> >> endobj 327 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [96.3674 243.9825 146.9964 255.5508] /Subtype /Link /A << /S /GoTo /D (subsection.9.2) >> >> endobj 328 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 219.5242 200.4755 231.2137] /Subtype /Link /A << /S /GoTo /D (section.10) >> >> endobj 295 0 obj << /D [293 0 R /XYZ 81 752.9534 null] >> endobj 292 0 obj << /Font << /F15 266 0 R /F26 260 0 R >> /ProcSet [ /PDF /Text ] >> endobj 331 0 obj << /Length 4000 /Filter /FlateDecode >> stream xڝ[[6~Re!$gl*ę$lVzI{.[js,B,r#(X?[hW8ЭB>g"KˬO im* Q~dYKEҷK+xq\acݻ> C)oMk#TIUcٕL, SD)Rg AU]3zvFbUY\-lb CB W@G1O*n[jMUSߺ7ln^mrW-e|Y4)L.841E]N u2XKNmjL9#Tez"ZO9WeK=kn7&]Q/#xMPkǰ/G?/j|~(,s%EɂJ.% z#.q.ݓS lȼayfT7,gv"L@Ҙ9 "rJ#'"L͌9(⇣|}<ץ,Mi= ?Dݡh>J*jv׬k]l^vֹeeaP#c9qj0BvU F#Ԁȩzh0zG &/~|C?2aذXod`aiITN3z3BI4!S]6bG7Z]+H ́qIIj`iyml|Zt8nk:/S.`V\*(;t[T'eʢ0~@0&x+,x](ħ'7jtQv[ׄ"yGT^ی`39$`F z vAL~#TZUV2xM{܌NHIVvqg/aHp OvK#xL=G80Jȅ,4Ɱ,:C.aɮcqiV{fTXi#\Bȓ]G҈Bq!#,ŗ%l<r;-TH}PE7R 2-\m OE㞁m4=Bg<ljTC#( 3JPdס4btsP }8`W!Ϣd ګf4<Yf⽘lή ƞ 0E&:ޘEMԩM} 1GYd,CZ =QBfjA)ęP1sҁ(M/Cቮ:e}-H{e9햊n \nQ$3cbkg\LA Dz3pAڊMQ(~)_A @ yl /,4FBYDG}Va'f2Ә?#TE] K4`gC48|e!#OaW*:Z k)Xf* .#]2O~q 4~IH(祫8Uݽ_Wn /TîwTw-=['k _\e߫3pЃ#^_;1T^NZa_svO#Q]\k"ͱL--\Tt}Va'VY=]N|EMl A+s.&hP֯j/(Vx` 3Exx!M* gGfVi*5i7a:*Q|r,੮s8H}@/*)SȆռgĐBԡ[̉:uqƛof{u֕^Z65PwRJSx5FŢ>ob<=NL38 ),V, d)–thy3 6 LL1UO5#d=КkʱW62߂L1{IRia@u˸S~sg46(( 6EQA=5]>>}syӕ.<(32ߚ- C)(?W V!}gcDD)Oz7s~8E@$`evSB2Jʉh]V':D V-+D&E?d"S)L @u1(H*o>ŋ[q>Ȋ v7"!.|`SiKށ; eY}9vPsjOch߸sLpOr8#R:flN1"nxaދrW|>I-$ ,)>$yx `ThqA ;Y?N00B<dr*XEnZ222"Hȏl0- _%3~Ok\ Ź`Teȱ^]%݆:u, q/XzΨT's)\(m_={z4 7t=;vWz88[,Otsi8^y'~2r2u>2x$ -!gvg[̞U]\kLDz TȑzjfZrW@J r*aK'[nEufgMZᑕ߼ _p$:q!^Αg:fAWC> U K1*ͬbgcvdr?j;:ܞtg.?UW4;ÿ˾5wUJeRT8k ;6\cոVOm{'HHŃ9椞jF*<c.Ix/\~ RCQ"fX}q O+v'7XWZ> endobj 339 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [291.5754 689.504 298.3003 702.7129] /Subtype /Link /A << /S /GoTo /D (Hfootnote.1) >> >> endobj 346 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [165.8012 678.076 173.2482 687.0989] /Subtype /Link /A << /S /GoTo /D (cite.JLex) >> >> endobj 347 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [269.8221 664.5268 282.7238 673.5497] /Subtype /Link /A << /S /GoTo /D (cite.flex) >> >> endobj 351 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [375.0492 392.7846 382.4963 401.8074] /Subtype /Link /A << /S /GoTo /D (cite.Aho) >> >> endobj 352 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [393.2115 392.7846 400.6586 401.8074] /Subtype /Link /A << /S /GoTo /D (cite.Appel) >> >> endobj 353 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [432.5616 392.7846 445.4633 401.8074] /Subtype /Link /A << /S /GoTo /D (cite.Maurer) >> >> endobj 354 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [291.654 358.868 403.3649 370.5575] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj 358 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [160.7221 331.1636 322.6547 344.0652] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 362 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [364.9391 331.1636 372.3862 344.0652] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 366 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [257.5954 317.6144 358.9163 330.516] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 370 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [401.3939 317.6144 408.8628 330.516] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 371 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [417.8227 317.6144 522.9963 330.516] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 372 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 304.0652 141.4989 316.9668] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 379 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [183.7802 304.0652 191.2054 316.9668] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 380 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [465.1771 291.122 522.9963 302.8115] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 381 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 276.9668 155.2784 289.8684] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 388 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [196.813 276.9668 204.151 289.8684] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 389 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [290.2078 264.0236 305.861 275.7131] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj 390 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [307.3146 264.0236 396.1554 275.7131] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj 394 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [507.2146 250.4744 523.2581 262.1639] /Subtype /Link /A << /S /GoTo /D (subsection.7.2) >> >> endobj 395 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [385.6273 222.77 467.7144 235.6716] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 399 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [510.291 222.77 517.7817 235.6716] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 400 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [117.9346 209.8269 125.338 221.5163] /Subtype /Link /A << /S /GoTo /D (section.9) >> >> endobj 401 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [127.0072 209.8269 152.723 221.5163] /Subtype /Link /A << /S /GoTo /D (section.9) >> >> endobj 405 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2159 195.6716 213.1486 208.5732] /Subtype /Link /A << /S /GoTo /D (section.10) >> >> endobj 406 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [255.4591 195.6716 268.3608 208.5732] /Subtype /Link /A << /S /GoTo /D (section.10) >> >> endobj 407 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [295.4592 195.6716 343.9366 208.5732] /Subtype /Link /A << /S /GoTo /D (section*.2) >> >> endobj 332 0 obj << /D [330 0 R /XYZ 81 752.9534 null] >> endobj 6 0 obj << /D [330 0 R /XYZ 81 732.6296 null] >> endobj 10 0 obj << /D [330 0 R /XYZ 81 647.5307 null] >> endobj 14 0 obj << /D [330 0 R /XYZ 81 449.1451 null] >> endobj 411 0 obj << /D [330 0 R /XYZ 90.2154 132.5172 null] >> endobj 329 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F41-8 338 0 R /F29 342 0 R /F18+20 345 0 R /F15 266 0 R /F24 256 0 R /F43 350 0 R /F45+20 357 0 R /F44 361 0 R /F47+4 365 0 R /F48+4 369 0 R /F49-4 375 0 R /F50-4 378 0 R /F46-20 384 0 R /F19-20 387 0 R /F51+8 393 0 R /F52+8 398 0 R /F53-8 404 0 R /F30 410 0 R /F38-20 414 0 R /F36 417 0 R >> /ProcSet [ /PDF /Text ] >> endobj 426 0 obj << /Length 2149 /Filter /FlateDecode >> stream xڥYYs~[l2N9wn)D"@Iٔ$jt7`PceQ8%dm/h}HUۋk%F% 8đ_eݤMdaB,rz]|{sSBq6eN htw&i0mΡ9@fbt㉴'CYhAk$q5:JbXؔ4Y-'Pc$ ̤ړh "x{<>iyda RY*1d5VE:E=(ul櫧tk7ϊxL SpWviŢ p,"6їMU!Y-Y+M<]8UeƠDFGy&__P5eg1#0QmLkD@DoV4+xT`:Fx&t}]e'ۯ}6ZmZ&tu,NI馔M/A Ҩo^/ܻ4˾Mvؤ<\ؾ q<עlngh嗳>4<^w˳Ҧ3U8@1=8k]I,}ڱc3[ugQlV㪺aǼԎáo=b1 )/ a7O=i"lwLsRN}v Ev/=6ؾC;| eS*-α|ϑ* qqbZ0U=0DpvVbq28d<:CDsrct0N;'RdCMVmsdbf$kxEpK5|ڔsw{70⧟in./qV%  >H~ϛ^|SAa(?} WukVuJ }&LyX1O0Y;\&RcHXafO*.)3OKain~끾4 l|$^: Я a D8sI uT`,&{dgqҽ볂>g+dVk^&-~5o`7-R7o+^D+e{Xm&._B@h3s4ν$0b(xj5KAp U% R7\I[V=AN,q5S(_6ggׁWj;ʤpé;QrIUZ ­stSSO&iprb=> ̕sendstream endobj 425 0 obj << /Type /Page /Contents 426 0 R /Resources 424 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 291 0 R /Annots [ 429 0 R 436 0 R ] >> endobj 429 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [162.1724 597.1546 168.8973 610.9695] /Subtype /Link /A << /S /GoTo /D (Hfootnote.2) >> >> endobj 436 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [89.2191 99.4416 187.7172 112.393] /Subtype/Link/A<> >> endobj 427 0 obj << /D [425 0 R /XYZ 81 752.9534 null] >> endobj 18 0 obj << /D [425 0 R /XYZ 81 732.6296 null] >> endobj 22 0 obj << /D [425 0 R /XYZ 81 708.0781 null] >> endobj 26 0 obj << /D [425 0 R /XYZ 81 682.853 null] >> endobj 428 0 obj << /D [425 0 R /XYZ 81 629.7324 null] >> endobj 433 0 obj << /D [425 0 R /XYZ 81 318.6032 null] >> endobj 434 0 obj << /D [425 0 R /XYZ 81 236.208 null] >> endobj 30 0 obj << /D [425 0 R /XYZ 81 189.3613 null] >> endobj 435 0 obj << /D [425 0 R /XYZ 90.2154 114.6844 null] >> endobj 424 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F15 266 0 R /F18+20 345 0 R /F19-20 387 0 R /F29 342 0 R /F57 432 0 R /F24 256 0 R /F30 410 0 R /F36 417 0 R >> /ProcSet [ /PDF /Text ] >> endobj 439 0 obj << /Length 2169 /Filter /FlateDecode >> stream xڝYݏ6_Ț+R(&p֖ʒ!Jly7(XҐ3 rŸ\$rab.v) V>o^]5z!C\lJFi4nxo+,2vUEAVmxo+W޿-7_f(mj ")TO8="N&I.2uWmPO>9!2 'q^ݲFXPXFH*:mۻy4cQC]}3U¶V$iR2G~z|?<'\IE$`DIWSЄ7wxpp1ۃvҽ+Z~`􀱀_e]QWbҠ,B2@Ggm ,z{gYƭS[0-yu Qic`V_S "/թ#r2׎1t"Q*+$)\SVj'5ŖwԶ$x$F,%g^P /Eё`Ķ9gnOkqlP>yrt=<$AY[zu5=cp >-Ҡ-ݜPD[LN&!TҀC("m95E:x@[T&g2%|p:k65~}:ېa@Kݥhɇ@4=q8Ȋ2qS U6ZqEhW0f}tKV$m_Ols'׆!۝(,=*{:ߐ OunY/ǀdaB+ dH6 wOCG(*T:GwR^MeqzЩYHEC C6[`(5RP~cjJvzW |g} ppе!xKOʒsH$"ŨI=SGm/$|7H FF, Ő3xE%`x8'N}C̸&$g{(kE{;:K] ['vsfm>-M (sxCiJ!} ǮEܕnOǝDdx-y }Z!0DX~?VI|]74M6KڲET[/pYl"D.#Z "7F@9.9aUYW|t,=XR sZ*١3X= p#QϾd_3vQV쇬уL>AvnzO<<%j"E^`WHw,ww'-\[oK<ϲ_wЉwNdjINiX._Z͕ !bJ5W3ahz( 5S1M16DTz=Can u; 1 ԧ='} t}86ffemu}s,DƆ>%xdR/Ib<𰫍 lܪ9i/b=?.&򍇃NSr%2af"\Ph10|] K?xt39VAg?z2dl~yIendstream endobj 438 0 obj << /Type /Page /Contents 439 0 R /Resources 437 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 291 0 R /Annots [ 444 0 R ] >> endobj 444 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [79.731 543.9612 182.674 555.6507] /Subtype/Link/A<> >> endobj 440 0 obj << /D [438 0 R /XYZ 81 752.9534 null] >> endobj 34 0 obj << /D [438 0 R /XYZ 81 461.2271 null] >> endobj 38 0 obj << /D [438 0 R /XYZ 81 319.4477 null] >> endobj 437 0 obj << /Font << /F54 335 0 R /F24 256 0 R /F18+20 345 0 R /F57 432 0 R /F15 266 0 R /F19-20 387 0 R /F50-4 378 0 R /F58-16 443 0 R /F51+8 393 0 R /F47+4 365 0 R /F26 260 0 R /F41-8 338 0 R >> /ProcSet [ /PDF /Text ] >> endobj 447 0 obj << /Length 2092 /Filter /FlateDecode >> stream xڭYKW(E(䲟$ @ =MN=pČDjIj[iwV xVUuW.U *gLPBt#. qJXiVw+DP?X*Mc!DԯcӚEK2 /忬c)Uvph峓Ȣ/w_}Ϯ8RD*V` yR҈$P,Y(n A)n*gi L9*f"QU,2σ@ Yd!Hr)92ZG_G5㞏e^yvNtW<GƳgo*C/uCi* OGV8JA1c&eLM1#_y\̢#s?Gc;MjJţ[ ԞEEVWBG:*;'uOU=,nLE<5S:U!N x9e8ڭ[fS"aZ3gl$ýnc!pjh uh|82/ǥg! (>F@BO1hv<{Cb.!!Es 0 .lPIJtޙE.׌2m/~. Lt=jf%x3.Y{/M.^̐5 g\Kfz! l$d@B:4b2:cn~Uˡn`QjL;{ A0vc tƢyB݆`'#{0opjOOGFۼ*LHcL-$ꏮ7܄ݩr@e-mPOUUƓM( (dd ΀QU0ΙGDQ9?lz{^>f('(L=L7GfJ%ImPGQtΠPpsù09QߞCAw0GzփˋSpp&oty)J%pY$\Mnj_g4t͆,Mi3}O܅YT>oc%av,%in+!i<sm9H@D?b_gM#*ͦ!tA~nzKi0LиUacF’WR֞]zrݶ3/uShg(qE2<1%z22P%yj\ug䪂0VFjmc}-BMZZLdЫ& V,;b$(|z5%?mK{2ҽn7(޿әs6?/mx1aT:zZoú쟝J.t浉m;w2WEK5p y vOFͰ{u~"0YWW)Jt-؏> endobj 448 0 obj << /D [446 0 R /XYZ 81 752.9534 null] >> endobj 42 0 obj << /D [446 0 R /XYZ 81 166.5221 null] >> endobj 445 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F18+20 345 0 R /F59-12 451 0 R /F19-20 387 0 R /F15 266 0 R /F47+4 365 0 R /F26 260 0 R /F60+16 454 0 R >> /ProcSet [ /PDF /Text ] >> endobj 457 0 obj << /Length 2082 /Filter /FlateDecode >> stream xڽY[o~ϯRBr}HܤA>$iASĆ"-893;oݗrvvv e6sB6;Yζ@f>zgu"7bf"XWjp]<Ϫ6ag,}+\?Tą> gpJ>9LTizYPo"X;MLt\6t˾ JZgU4euc"Buxһ.}:_8!R$鷪Sa D9^V ΢ vY ĕ*ߊuE9 b$Pō$hJ*Ɇ>cp>[ <yMy~FMkVtXN&?p2[VZQ(bK4򸊹\ZT~$W* R0,c6(])8o@D}{HzZd!U,Cmу텁U>,R=: uw 90&4Js8!Ua瀕KT٦Feե' [xO'^WS^ ficգ2Z*!'FS@ ӨNvhCX!ū".2z#z\ ]! +`67]t4x!×́_T0' _N8zict!hLufGʋY4^=3wpC%vh3ZGaw.t_3z]!mJCfu1W֦ DY:Y*Hi Y71)jm0!'#`^b0:ұ=cwM$X8*.G0r'pp5\:^+8Oe/rӛA7ҖoXƅjLwm;zE\aOQML#«;D{\HMfEYw(A_TǢFf/ƒKs=RAח-ZVIjiHz5f$찅G,C!i!rOePv{b䞂"Ku:espTT&72?L$?f_{Wujؾ>n6m** "E{cj7Uv7:7N2ZBqs:(k6Ǫ D9/x:a YY{ u*f}/[o1Ǎ=^~}(ExZv'S֬ )^}d_}B}Vj9ñU4i_ȇ?G?M;y 4W5e|W~Ѳz6\@uM݇zB׳~U EBo/Tyz29"Y5A,"db97^^~ˋy3|9ahsm8C_]>|CӠQ^_Es)+`b ~ߎ~rΥ yavF%1t(S.[qendstream endobj 456 0 obj << /Type /Page /Contents 457 0 R /Resources 455 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 463 0 R /Annots [ 459 0 R 460 0 R 461 0 R 462 0 R ] >> endobj 459 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [227.5134 693.576 234.9604 702.5988] /Subtype /Link /A << /S /GoTo /D (cite.CUP) >> >> endobj 460 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [259.7271 623.1028 345.3888 636.0044] /Subtype/Link/A<> >> endobj 461 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [470.1538 625.83 477.6009 634.8528] /Subtype /Link /A << /S /GoTo /D (cite.CUP) >> >> endobj 462 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [196.216 598.7316 203.6631 607.7544] /Subtype /Link /A << /S /GoTo /D (cite.LangSpec) >> >> endobj 458 0 obj << /D [456 0 R /XYZ 81 752.9534 null] >> endobj 455 0 obj << /Font << /F54 335 0 R /F47+4 365 0 R /F18+20 345 0 R /F15 266 0 R /F57 432 0 R /F50-4 378 0 R /F59-12 451 0 R /F45+20 357 0 R >> /ProcSet [ /PDF /Text ] >> endobj 468 0 obj << /Length 882 /Filter /FlateDecode >> stream xڍV}o@4;@ܺĶ3v,Kc݂z oM;NZ||sA dbc80*S|_1VTt?(ȁ@EB2P!T; 0 uА _2U=sXn74ꗸԕxIB(.֌H}n cǺ.KLڊKG:F hԱz".$$=l AH؋(2h0wM4g8kcM@7u{ ѥspIJD(~]4t M["-lq",K#\){"/8,S8xXb?y=:V FKcZc϶W'e>gCv:l:g>{FmS S (J]-(! ,#w;_EJM`H6ty3@*:͝-7[9Ls{/bgD#]߿ւKnӭ{dt[Va4KB$GN D//#2 #,]z`Vh? i˘uov"L2ݛ}~+7x>gշ,b7yyO8!9CUr^va[}Q-m5`99tp2&G]:9r@:9DV(|>DjS[D݅!"zC٦Ʒ %{WNڶ0]D~ãułDfbMfn5;zER|Q2D//)իUW>Q/KXo\fu;-`-0qV+yendstream endobj 467 0 obj << /Type /Page /Contents 468 0 R /Resources 466 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 463 0 R >> endobj 469 0 obj << /D [467 0 R /XYZ 81 752.9534 null] >> endobj 466 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F15 266 0 R >> /ProcSet [ /PDF /Text ] >> endobj 472 0 obj << /Length 3243 /Filter /FlateDecode >> stream xڝk cEYIQҢ@ܥwmV֮Օ%W eIb0Ùp"?h'Zl{,`WX?^}Q IB$WO-W:+.W+B t-NwUj/R3j~ƱypGQx/o?_}yR~0CJ _Ҝ6X6R A,fI$# <"7Mp>-˻4{7JYKZ7 64376> \*!-y8ۤMuwDF bS{}xwk#/.]WT*e [ԓP_`r*a$+~ D]QW<F? C^MAj1cS}DHWs/C%, 2v166LlVa^D4^U;sGV̠`,WVI*R`r ͈dhA>2Bo m\%6)%FRa+[x>M~HRxhVRLQ~Q?o~q2oXXfpԲOnߑQT 9XaO6H."%6H:mͽ,qPXXΉ kwBZ Qfaw9svUD6n-@pΞI(11}#F)YK'O;&+un~ģW</[VкݞJC(r.[!-Zi/w>tWl[i Y5pίLdH>`, |48 uE*Bկ5ĜWSX/"T+* ]c\ Q4tA j4YSW32>NY &a?n9rp_ZC'֫9Hrpws|;$ghnr2aĢI!̀_8xxƲ̑3pu[{JBiӵκxB73;t9s⁃'`3N<7s9M$#JsQ68 뒣)exl|5'@YňBsxyX? ?Fg8Xl8ɮ#~dlNB=E.!4j_iB]ViroƄSW(v֕=}C B1نo R.0'eːZ)I OkipNM첞P|ԐEHZ s#M/7;RB+s.rs9F5- 0m]/ ց#gSfNc@c'2Dv!|!XB X|pb=K+٭Տܥa((lQ gCqI(Rt9O)yX+ e+K q~I\c& 11d,,M@x)NDP&~,=:3%=q@{WMtK$˓|a)8]bx#kZʜWWr 2{{'cǺUkOʋt?Omv=)0$p .ӇSdŏG%R\*Wlwuӝ_Ҩ@6r.)X0g%Qp_w E\{N#y+[~/to!7>պsBEP(j +OR&`:)d8#¦סͿ-d: 5tf|ڕ#4X`g+4Wr-O+~fY,ĝ&N(?t[4э) r|VG@pv "_!{zxp<+:ɱX+/. s{iC ۔d%}+ =8i#G agly򡱔J˹qθ8gB{ rf1Ho`jΡ@ۭ֓zoqnw1.K~(Ȫq]jҽ3|=WK`j{ bqܛʈ){ǗO7'%&$Qgep-p! #.,m:@ ?O.$ԡ+mg-aJ^Ry5;|n1AoAK{)-uYf<͝?1&r'k˘mPz.JNNiCsV.o) ;*zI~@ErV0= '̄:G}Wy;rj˾CÆ}M[ЇP1ݣǟ[w{AE+;\Rv40BjߧY>}@GaҖ̕+.&7@Su3kOi{'vٞP|=M9> endobj 474 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 564.7861 150.2691 576.4755] /Subtype /Link /A << /S /GoTo /D (subsection.3.1) >> >> endobj 475 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 542.2705 225.7843 553.96] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 476 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 521.8761 165.4206 531.4444] /Subtype /Link /A << /S /GoTo /D (subsection.3.3) >> >> endobj 477 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 276.3065 177.9956 287.996] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 478 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 240.2418 155.0867 251.9313] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 479 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [348.7687 226.6926 356.2594 238.3821] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 480 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 190.3248 132.1779 202.3173] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 481 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 167.5062 137.9051 180.4078] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 482 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 131.4414 149.3595 144.343] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 473 0 obj << /D [471 0 R /XYZ 81 752.9534 null] >> endobj 46 0 obj << /D [471 0 R /XYZ 81 507.6073 null] >> endobj 50 0 obj << /D [471 0 R /XYZ 81 392.088 null] >> endobj 470 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F50-4 378 0 R /F18+20 345 0 R /F19-20 387 0 R /F15 266 0 R /F24 256 0 R /F26 260 0 R /F58-16 443 0 R /F59-12 451 0 R /F51+8 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 485 0 obj << /Length 4222 /Filter /FlateDecode >> stream xڝ[Y6~r(ۢG̮[Y{#Q#:8KRxS߷5."hu#"/RqfFItu?_a@pDfQ&nvW"B%l jm(xZ+fAy_P`/?pw&Z4ڊ?c[UɭvOEݓxލ_F$.R"(D]%Rq%ƛ=dX&A l|Ŕ1"a,_7< CsU]=}uO2؟0|1'R02q2=i$]6}}|ͦ>- hezZ̪ ZwD~r~y'`yMu^R*( Ы7:y1IÓ $- FIO-`9Gdt/EDV&$%nG2|ڴeuj%<5FhS@oZ Z--GEQ_Q(S W_<为{-ckyKE!8dilQ(ݮXb'Re;.ׄJcuaJ ipq R t7yӻ'\}F p|BbO>ϧ< 2A%L*y0Ŧrw)qWr4,'#SSgw/% [9uqB~d6G&jO. Ycj+2FJhdx}N9ƫMC1Qri3bd@^A8 IgS8{1btF׿_&k(%ְT_!>BҩrZ;gbE7V '(} 5+_@EoG_76taKnǰ q5G25a(͍$B)ESpcQgpgvWZ;T`D9"# 8F)Fci IsY翡{$:m"gbzF8pom|{Xuc`3 ?ǸnOe|d;M 'euARhpȗPJkOV4 clh eq<(EI*9G|v*Wpur+)є1cOVKlZ.D7)4 LJ+~@ksf]E>THn_nW2;g"F_X 8"4bOk18`8 ˹]uƠilHEUOsA"l20ҙJ`һ3Ϧ@<T+41wYR|&KoBA%d%9̪ݞ{γ 9εn:#A@61jqv=ɗCi< '=nDf#6R2z'N=~ *KrӷVa )?4j;5[9͠|cssݔ..גr33n.P`7 %MʫFBm' {Dn_, 0SmkY 5SQs^وh? 9]e) nMut`gϘ\E KDZr vnRqe" f@ӢB$I( {0 8tqg , 㦨hM*V)Žx<ՔIqǭKӘ>8Ӥ6pCSb"$Kֶ=ԯ?k-7c{7cGhrBR#VK߳Ђg]YK 7 P,e'Q 47i tn6miQҐIĐV_~ű5вhJX?֔.UֹCq.kxZր% pdkM.i@ś:R=%?\Wcqj'5 ,ŐP_1Ȥ6 4ʚ F _?yQu'*xܦ]br7PPI+t?]*ef¸~2~IAn,bJVI( @Q{/J{>,SU,b|>?$0\K;ȜR5\hBP>U#bAxJgKP&۩DRefSI ApXAR0\)m|Io:?rJE5M)]`_RW}ʪ8O-h j' /q<6Ņ(klx66kEI|N Rbi }R ++ }NVnVl"ԭzV/KW͵nt /pʘ YxϐkZKW6sz{f:GtJ&bu2b2$GXK),){g6^a Jw@`:Ȅ0Α`~< #Qu'~0;>Lw![S5ҡ(>e[]Ej=P==LӐ9eб}K]i9>}gy3uO]&:61tf.aSC4=92JAӑ>Q@RM&1Θ²k~.O ^PK`T&4ŸK=DEB?ioPHĤ9LN HU 3*mzZ ϵ+~r']'.ީCa+4_A~Řwo8&C.ߋ箪re4W z^+#Q}dK3~p,Z(]D3) 3\L O-'m:&}I:׍#aB1Mqo,Yj ?饠J'؅dݥ&.݀ŷ[0rWRb.ZgEf#C2G UйxU^ 6-Ƃ "σz!w\5fyozts>ADӉh/}.L~endstream endobj 484 0 obj << /Type /Page /Contents 485 0 R /Resources 483 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 463 0 R /Annots [ 487 0 R 488 0 R 489 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R ] >> endobj 487 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [183.626 718.5532 225.709 730.2427] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 488 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [292.0376 663.7503 307.6907 676.6519] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 489 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [309.2742 663.7503 385.0689 676.6519] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 493 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 505.8072 189.45 517.4967] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 494 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 469.4394 189.45 481.4319] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 495 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 447.2268 212.3588 458.9163] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 496 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 316.3177 189.45 328.0072] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 497 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 279.9499 166.5412 291.9424] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 498 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [79.7288 185.2944 156.1751 196.9839] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 486 0 obj << /D [484 0 R /XYZ 81 752.9534 null] >> endobj 483 0 obj << /Font << /F54 335 0 R /F15 266 0 R /F57 432 0 R /F47+4 365 0 R /F19-20 387 0 R /F51+8 393 0 R /F46-20 384 0 R /F18+20 345 0 R /F64+12 492 0 R /F50-4 378 0 R /F24 256 0 R /F41-8 338 0 R /F59-12 451 0 R /F58-16 443 0 R >> /ProcSet [ /PDF /Text ] >> endobj 501 0 obj << /Length 3412 /Filter /FlateDecode >> stream xڝZoB' gm/>Ң/ȥ>I8(hH6;3|:rvwvZ."'\$Vj0CL7`BF"2-d -mԫj^\Ǖ\ 2!? v6.QT|u]MO8W7h4w>~]*;)p,D8A )asPx}%ED ]_l< e^![z+)/25 pLI#G^Y,tsD5dyu(r6geC=:XS⠮p.>֠/ZWIɻү&*[vyY|jp: BdӱҖ'̫-6]rgבk5r#|,~^Y8)0 *#Pnw4sKNN*H%}QE$hhS; o̻ͦv N9oG;=68t+YC|Igҡp"aDz!W7yECSۖe㩻 (k ΰ:Sp  ״ײVeD-@]7L-?_ϱjlIѧÝ:#dN[Z>Ňz(Z8:%>pczANG9C>-mNىnÄ+Ժͼ0O-JAg*K"tff4cuITq='0yp,L{^Bt!Ko |ChARD06JTi OE_3YQb|srWg̀O$ԄiTǟKRfBFs|X ۥ,{ gLh {Ҏ&"Vo_LHY2b"@u~$wd)z<) )N),&z&*3@Ɠ]])7uz$64ogo_.RJd zwHW; KT'|RR։Hcsi@ 50avs;'f ˎ~ˎ8;|L+\؆}xm<0M2ބi;y ? xWq@e0C2Y5C({B1Ȓ{8P|p;ulA!J47 hQ!GB:״%@x;R !-(Eݎ7!N*Ox#g޼Xƥo l&AlB0ݠN)hfyM$> &eIƙa`PD9#7Ȏ\hRuI†Oպ:Б3sd#.x;V_@,2IJ"&6&KD?)P&&ale(ʧJV֠I ذ^[f\U\mrC,̶sECdJ6 o3y@C~BjQш= oؑz{rxQwS¥֣4Sj߼ 7fLPO;ނCiI|jg7P0%HwQ­!0gc*~-v`̈Oԍ̀}xέzMƕƍNTc.Z~,B@ϥ`?y;ʼ7o$*"cw' d(Mi@F+Rx/."-21KR5/7kN_` 3>קΏGp}|RTG!r h\?:ip- )砤1b.!E%"b++dY}L5#~Ch(9[^ѝBUiT<Y>\gJk c]^Vǘ @}bO|ΩV&vE C􅖰AmJEKžp9H5ӱ*2$NjT7^OG3z!̫`h.)c;v%¶ro#5סt,+a eye|*EFZN`DZoOŨ#qMy']Ђqy^DŽӗ| byp|(;( PAD:K;P?Pbn1,j!S#2#Z0zHEߙU",A7\Rn U r_T >yp/ Tkrҭ,Vė*q{9NM,8`ߦ7c>xoxUةn͊Y>m*.BMyAἥ*b;|=}!'Q'~p5J]ƻ %мX*rl{>S@5U> endobj 503 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.4319 639.0648 415.6965 650.7543] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 504 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [84.4874 625.5156 115.116 637.2051] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 505 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 304.0054 207.9949 315.9979] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 506 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 210.1345 522.9963 220.6118] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 507 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 197.4944 522.9963 200.8505] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 508 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 183.0361 87.7235 193.5134] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 509 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [116.2966 126.7825 330.196 138.775] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 502 0 obj << /D [500 0 R /XYZ 81 752.9534 null] >> endobj 54 0 obj << /D [500 0 R /XYZ 81 732.6296 null] >> endobj 499 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F18+20 345 0 R /F19-20 387 0 R /F51+8 393 0 R /F57 432 0 R /F59-12 451 0 R /F15 266 0 R /F64+12 492 0 R /F50-4 378 0 R /F44 361 0 R >> /ProcSet [ /PDF /Text ] >> endobj 512 0 obj << /Length 3077 /Filter /FlateDecode >> stream xڍZ(DN:>H?5Aܡhd):[k%GooQ3}kO@?6ü%~n;>7LRXq^ ([/wN'Wh6 *+N6X7ё!:J(^uVYQZTI.!J* ї{^<VvRe3he0@0ʌIvH:¤^,͝.ղcFX1  +\ѠwaMw'$2 c9!LS& B/J=[Axh[#o8Tq)m0p!fݢ[-*s!`6;7}ǥ]]nP={/OH^m-H5UtnDthjZ"ОjZG!:as~ Ʒdj߂xȅ*e[K)SM049`%Z1>km L䫺%SԷ#VQ?mcXf @P?gNZЫ9ʚL %lsmgPra%rp|*GZEcޕ3 Vؗ&*xL4Ɉ\tIvcRdzVD*:/`at&a?NS\&R]ep葢P I)1toS_|qFiޭ5SX:7(ā8 4jܨw(ܡ5Nk'DI8%ihwC lm(M}Z{K7v%Rx9cP~_Y:/ΜX32ۊN"~"}ʀK~^pp*J7e"&(KAV' ݙ>[kŒbfpG;- ~+7r(p =BM/ sNp!׃'P\漴qZ JjNljBkв̴  *|9?@Ү1H,׷; gޞe109_+6fC(J\^c>z2y>*YDcV4n#yӕ\qȡ| mNCFii,K}$qʹ` άUmjgkJ%:5JĨ ΨCv|ilXaywz?R̥2HA,ؓl8<{ C?_\TK/7V3*)? j,B;^T]^UqMx,Qwh.YsgHM7uqNs*un=v '+(yRyح/KCwRW0Fu]J@ڪ/g١-עwR*j "9ezL(GXha6I,n]@p6OJT_>R)1\A؅/)lh*)og\vg0[{O@u*) WV|* 5oމMPպC[`|dQ 8Յkxu!i z^~ڬL|S.o,E@P Dve}+J,_OO"[2Obhd]i|vCgGuؕciCHh5^;jH(8IZ57){=6g;JgS] p GN$ /A:+ꜹ WB :Wp79 d7ylҥU"D[kV.Z=w[_,U';߅7*ϣ.IIHmh1F߳ L2"'܋=mܢFs/!! ۛ4qZu3jOU!4GBN`Dp?MCkqq?> Z| 5yrF7 :ZTrc|f6̗ Lb c0; Q^l>)l715cX7/-[* r pUr(TK&C endstream endobj 511 0 obj << /Type /Page /Contents 512 0 R /Resources 510 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 463 0 R /Annots [ 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R ] >> endobj 514 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [163.821 654.6595 314.721 666.652] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 515 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [158.5796 595.7657 206.3898 607.7582] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 516 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [229.2766 477.5814 236.7237 490.483] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj 517 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [238.3676 477.5814 315.9216 490.483] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj 518 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 209.1372 127.8139 217.7964] /Subtype /Link /A << /S /GoTo /D (subsection.4.1) >> >> endobj 519 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 179.6146 219.4493 190.698] /Subtype /Link /A << /S /GoTo /D (subsection.4.2) >> >> endobj 520 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 154.9405 156.45 163.5997] /Subtype /Link /A << /S /GoTo /D (subsection.4.3) >> >> endobj 513 0 obj << /D [511 0 R /XYZ 81 752.9534 null] >> endobj 58 0 obj << /D [511 0 R /XYZ 81 522.3001 null] >> endobj 62 0 obj << /D [511 0 R /XYZ 81 293.6077 null] >> endobj 510 0 obj << /Font << /F54 335 0 R /F18+20 345 0 R /F57 432 0 R /F15 266 0 R /F19-20 387 0 R /F59-12 451 0 R /F41-8 338 0 R /F26 260 0 R /F24 256 0 R /F44 361 0 R /F50-4 378 0 R >> /ProcSet [ /PDF /Text ] >> endobj 523 0 obj << /Length 3218 /Filter /FlateDecode >> stream xڭ]=XwVOIEQ m"AH󠵵^5J (Y7@J"3|ldl*JU9_YB?>~wJnXI6.U?ErSIX~E !nYtx&P ۟GO\q>&<Y8݅z Ww,i1$VvF,:s^vY(,uu,RF_PV%J0P` 4v.p~A ߡ`q0.Ŀ a^ "ĸbߞ<-ϢktfyatM8!S O?_::ɐm󷳳ch+i‰ jDŹLu!.#6g.BhU"55r d,)0ڱ7Z:\cXޮid6rj tǍ{G dYvieW ʼn3nf'A_XgBd$ANެЎKP7P88 8('ʦN`HE|!z2A30G0o+F%|}}q5quFX"iDNS% :a]yyLrp5lL<}1'u"l\G>Nž9ˡDTÒ=r f"7Õ5Ko*J%1|UB>M3w2&Mk3X1PK]sޤq-Ju!Wb;wP&[md1^dPhA$0]/2&{0/:1i9>oyKiO~ 'jA5\(cꈃ4wK(H+lzieѣlb.:;r'7k1(ʅdJd 哩+T +l.^><zz:]HI6%|i 9&+l8^}= Ծ!dҊe]R] .bw5z}& i} {1˴ Ylrx=@Z :kg;ڬ'. :qX  }@2XЕG^(oڬڇL3s&r[4;` a-^f~;~ah;o3%mNTZ XRm]bKBD/eǁ֕ Q&Qɹp@wHF[H>'C*=y@%lnP=iy?؉8yR1tnŘz&,pzLN2ō=S;K+ODJPAąYQRXfH;*D/I̫Wu{U]-zbaΒ<0s.[l7,@&z5ܰv|nRM(=`$ &%i…%l[5VgMKQJR<,)6)\&P6z[t}2KW'2 -y,; 7!R*ߢ?/Ou͚.;)uMG(T9ݪ#KLaKrLC>)bOM؞bӼ4})!I#l`8%I{W"򹸠Rk!ȻLbЍ⹎dęX N1Mendstream endobj 522 0 obj << /Type /Page /Contents 523 0 R /Resources 521 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 532 0 R /Annots [ 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R ] >> endobj 525 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [326.1521 579.8635 362.0586 591.553] /Subtype /Link /A << /S /GoTo /D (subsection.4.2) >> >> endobj 526 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 554.8863 143.4874 564.4546] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.11) >> >> endobj 527 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [166.4871 554.8863 251.0165 564.4546] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.12) >> >> endobj 528 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [384.3311 554.8863 457.7115 564.4546] /Subtype /Link /A << /S /GoTo /D (subsection.4.3) >> >> endobj 529 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [481.1309 456.773 522.9963 469.6746] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 530 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [80.0037 443.2238 140.5418 456.1254] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 531 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [191.3372 443.2238 198.7843 456.1254] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 524 0 obj << /D [522 0 R /XYZ 81 752.9534 null] >> endobj 66 0 obj << /D [522 0 R /XYZ 81 732.6296 null] >> endobj 70 0 obj << /D [522 0 R /XYZ 81 624.4929 null] >> endobj 74 0 obj << /D [522 0 R /XYZ 81 428.955 null] >> endobj 521 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F41-8 338 0 R /F60+16 454 0 R /F64+12 492 0 R /F57 432 0 R /F59-12 451 0 R /F15 266 0 R /F19-20 387 0 R /F18+20 345 0 R /F51+8 393 0 R /F45+20 357 0 R /F24 256 0 R >> /ProcSet [ /PDF /Text ] >> endobj 535 0 obj << /Length 2876 /Filter /FlateDecode >> stream xڽZ[o~ gw=Iۃ[Nh#Q*ImRPE\gfz^zD&ȢЮZ=_ mzcdWZielPo"ֿoU7ah׿~cuy]i[]uI{ᗛȘSZ/ԁIM2$ NTwaFȒ dp_2J+:5!3\n j&1XSU@Ou4W; Qlܛt]l Y3n"rf].o]tЀ`g_#e .ד]E}.w$.l&/GsX눖w606`%s;$q`%sT_8llc5'lsmD`l˖ohypX@mA^ ~╰<o4C -?v Y 3((88…UVIcKYes-k]U J"]rY`ε&GO$D9=pHl%`VFԟ;afU),. >ewadv ̭tX*En\8"W#QH`s"(Y b"ґqg|T~*VLB'egNK*[\ w`ZχԱZ( ZRswc1z,G4myr.UI=t}r18 )tUEY~8_ۂ0ۂ!]m .Jۂ3 mH7;-uA@;_mbû3zQ`YHqx-`bz\ ;#[c3̠EGcG‘3Qtno36Z Ws8W"f"'$]7}U@6|wHwJ ]M?{ɬAq'vu/X/-B:_c;yDعQ&Ziul&; l5Nljg!< ӫgsvEQ ,Cڠn;֩^ xmhz~K.),E蠍 ,?CL#5mՔ!53Jv wMfCHD}u=}0.Z3VhGcZxz`l0)cpbmGi\l[Zvbsʆjy\(Vj(/VgrH]UWQpZ(Zl|nYp\82u, Ԡ̨=mb C0cx_\pScseԡ]72K ʩC z~eYR ]z^6R VE/KLgTA^@j%9yYpL,61U9#gaFtW h\M?vZMgŨM"(QǖaDsFP*%- HxX@'Z؎9Mj(1e=n.ߴ~7~. ~եa[H('AK9$*v^c &^7)AI y[}齌~dgbt%Agzq; wHF.y'^Uu'xA49y-j`s'3ZiMmxDt>>,'b~bƛ-)d)d<s6 te2 N*F:k@0QY,p@'!1ɻLcR$FIKh 5&2 +;-T{SUt]ySz4,׊6XR~14fh>sҟr&VɣS\ ^m&j5mBC ɮbE=&]đ; ͼy\Kj[rhUv>9/^r.B>%Wy}H՜kFb"k/,?>\O܉N}?RQ8mx0TPf!q|D :!xRɼ5hXh%umb(ZQlF#8PhܹSC ȄE9<GzCGx NWؗq}uQ' ʻUxpIM3q]Đ> endobj 536 0 obj << /D [534 0 R /XYZ 81 752.9534 null] >> endobj 533 0 obj << /Font << /F54 335 0 R /F24 256 0 R /F57 432 0 R /F15 266 0 R /F19-20 387 0 R /F50-4 378 0 R /F18+20 345 0 R /F60+16 454 0 R /F47+4 365 0 R >> /ProcSet [ /PDF /Text ] >> endobj 539 0 obj << /Length 3284 /Filter /FlateDecode >> stream xڭZ~X ǤH EFYԐzCtqeqy8k$^XU74!`c3IB,P@@ՒQ\G,r9g;gI!'N,]?4>hm|9dY{߹40tc _w qC~pc$zR; Iv#ϔBd)J'2U#*=l[;7RyiSp5ju!XG1:p랙P۱lL6N1 DKYT:3*T> ڞg[ yęNż4@Px){ڄ>-%Re:}~GӲusY=GXO"A7N2X 6⭳X ֞}v@?6֡P))a#l}:ɕwXs[^DάD/,vBq"shE n+Մ&!c⻐9\# pȊi>' ,u!zFLC'g XQu!ik'10zޥo3rǴ I!O]G%q<نfVMJ_Lsz&lHdce蝲|wG:e̜@YATSjX89yCgQj=;$XƟz(MXqڅ"F>YHK^:$+ʡsN#]v.=A'4]թc+%3%Mn& .r s'=/AG=V^ "`oU#L}R$*٤ߴB%cqQf>dJȾ?91g(XI!\ s|af uN(xAcP0[Hcli2Émer?$Uq+ 9b-otn k^u;Љ'`$@t)Nlc1$ʝ&?Ʉ%w7?}~~@ÿ iG94*v!hfZ5s 8ί~Kuڀ|}m"^x#rSx63ଝUc g;4EzO~[i@RqPk{~'Lt⻪$BKW}Hྗo/lIcdto.{JR)"npÑ81廄!7˳G~5y%0ّ*! aendstream endobj 538 0 obj << /Type /Page /Contents 539 0 R /Resources 537 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 532 0 R /Annots [ 541 0 R 542 0 R ] >> endobj 541 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [222.5549 366.0329 247.4563 378.0255] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj 542 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [192.531 352.4837 217.4324 364.4763] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj 540 0 obj << /D [538 0 R /XYZ 81 752.9534 null] >> endobj 78 0 obj << /D [538 0 R /XYZ 81 525.9821 null] >> endobj 537 0 obj << /Font << /F54 335 0 R /F24 256 0 R /F57 432 0 R /F18+20 345 0 R /F47+4 365 0 R /F19-20 387 0 R /F15 266 0 R /F50-4 378 0 R /F26 260 0 R /F59-12 451 0 R /F64+12 492 0 R >> /ProcSet [ /PDF /Text ] >> endobj 545 0 obj << /Length 3336 /Filter /FlateDecode >> stream xڥkxX^~A49Hl>}xw}Lm-$˯-z%Io79dZBK=$,8͟>h +on7BiD oEj$V}weT[ȢjhW+jW3Ǜn=q-ۘD9DBkǺ"Ϙݢ|8mR8M"Ľy#YbrРvQ{⾴;'ҨR[`!%ks-OE<'#-D^G|} >;g4QplO 2rq#g,ƫ%J %LVmt+jʾGY|RLڇ㾆(ynR 03#,A;_ƒvّ@jw};eXkSjr Mxp- M9 ݠ"x%kǮj1K&mIUh> _b[2S@Z8a[fˇ>s$"cITT[pnD+Id*;zk.v=z4y A\xB .xNx{ㅦsMϺr<3jL6vh]jQg;ΓSvŽ$ؑi-rSшy]l%sޖh4 &nzDY~2趶u]}EhHw7Zn3 -@j$}=]Kn'jAS,Ob>͈/7bD{{׀AY`l*y$+6{-w36 *ၮC9r"OpVuiq&vSخ0ݏ[3*}][xgz[of) C7p]< CkՑyvGr!rxiܚ8\ sq}!4?)SxVL%ٲAy8Z2OGF5DW3ƙvH1frrK0;CM}Ly9`de䁮"2W pK$!<&Pk{tHK^ _@Rendstream endobj 544 0 obj << /Type /Page /Contents 545 0 R /Resources 543 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 532 0 R /Annots [ 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R ] >> endobj 547 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [458.3839 677.6026 522.9963 689.5951] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.3) >> >> endobj 548 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 664.0534 154.8118 676.0459] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.3) >> >> endobj 549 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [234.4142 664.0534 298.7659 676.0459] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 550 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.0016 650.5042 131.903 662.4967] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj 551 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [272.9558 122.0855 297.8572 134.078] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj 552 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.1598 122.0855 398.2428 134.078] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.6) >> >> endobj 553 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [480.9133 108.8393 522.9963 120.5288] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 554 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 94.6841 127.4812 107.5857] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 555 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [209.3069 94.6841 233.7237 107.5857] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 546 0 obj << /D [544 0 R /XYZ 81 752.9534 null] >> endobj 82 0 obj << /D [544 0 R /XYZ 81 509.7849 null] >> endobj 543 0 obj << /Font << /F54 335 0 R /F18+20 345 0 R /F57 432 0 R /F19-20 387 0 R /F15 266 0 R /F24 256 0 R /F26 260 0 R /F59-12 451 0 R /F47+4 365 0 R /F48+4 369 0 R /F64+12 492 0 R >> /ProcSet [ /PDF /Text ] >> endobj 558 0 obj << /Length 3049 /Filter /FlateDecode >> stream xZY~_!,`Gt<>XkX$p!'$Oݼ%XņM뫮+7Vf#4J7lv5)Trn jXC`;+Dgv meݩ8ȷ;?4+ zoo~}J}Z*QxtJQ,~j4uM? 7sPa"/؏ZҵIbL 뻯HVIZ*Ðwftډa72yĘL2N`BR wЅEGԠ$8ڗC~( P=,+K%֒4L ~*ʒ"f/d19qy;b ;3j젱ė/n]i-K'+ч_ܞd"1FabIf#!ִ6L{Mm !ha$ψ"8+nNƏwפ4H'uq`2]OhEV)o>|4'{Ia7:4:2yww%W܀y[ۏCfE@WYq~;c avU4v*K}}*ҝTґ JgUˆ;5gZ6[ -)>d%^sQ22s9+ogؔR&2M´aMdRxHuc7q_=nnvToXi- ~dޕ`fM( $h" !,+^cMg,.m>4 ;4ܗ |*0͕JQŇ1J8XQ<\,6:L d1y\&cKDe+E)Œ?YXo33,b) ع 8bZ6 )DzI猉\H{#:dH HK=H:#,(4߅v Xd%$iк> I v.R iA $MDǪiSϪRmcI_wRgt2sFl%?_{ˎ0RuxxREgc͹n]$#Y㳨o}0jrRv%U;Wc5n8Af5FMae*ZN 4`lѤK@nBLȊ]QqJW*E }VUyӮ[2"8ĉ8>Ġ9DWܭv ^p36!:3㌭[exȸ&;J={\MKlQo *&"]?ĭEjvi?yKeEnʈ#d_|@\ΰ=Y*oNTAʢ>_@m'.})wbN,KSStQɻS":cCWjDLa^) }ZyjkrjHM\C7NH(3줠Y:(܀(X݉NO1ݢCNoS2!6q*Y};~Y\^nw-/T`̥8m<=TK</etA h}yKXr=v4`IǬ_Bvd(ݵ@4ij<^";! YD"ڣO"Th>+d~w\/^NxC>\K pL6LDrv.RaA 2Lh84b3> endobj 560 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [356.4438 645.718 398.5268 658.6196] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 561 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [293.5296 501.3593 318.4309 514.2609] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.3) >> >> endobj 559 0 obj << /D [557 0 R /XYZ 81 752.9534 null] >> endobj 86 0 obj << /D [557 0 R /XYZ 81 324.6993 null] >> endobj 556 0 obj << /Font << /F54 335 0 R /F24 256 0 R /F57 432 0 R /F18+20 345 0 R /F51+8 393 0 R /F59-12 451 0 R /F47+4 365 0 R /F15 266 0 R /F19-20 387 0 R /F26 260 0 R /F60+16 454 0 R /F50-4 378 0 R >> /ProcSet [ /PDF /Text ] >> endobj 564 0 obj << /Length 2620 /Filter /FlateDecode >> stream xڍYێ}0hDƶ9lMxo.WVXgreL|^qq/W*XH+iymj6#QJ|eP%c,bD˘ êa ][+;7 ",( zlP4؁+6ZͪNW/L4yh,(ҽ8)-7`I[h 2Re׍3&ʚhBM+e SM.oq?-m^ KTQbk:?- M=, Oϸ}[=s %`oY tʷy\ <]{|HG_79ou21VXn jak~]WM!&k% \b&Nj(ET .pm5ڽY}!b RQdDdz5оASJ% B g!X >gtdXyTR#p& D6 0V!%R4 Bkά=|凬$WV ="yQ DNWWeh@(d-~. woi;K <WufM m:2dbxq #hlyd(GHpecJް{HD2Exg$;`*s Z~ܢWs߁`t-z١sl,TECqh"!Z;pէ&J6`(s Mif*RRD%N\0thj}|t;;v*ӓI=?0"֑6zǺ-) a(5B@ƾv /x|6ˢy^Q" pq/#%Mv$3XGX;{s^u9V^o4Nu:"!=: /j@rw_W79e$S S*Slq"}R1ct11 &`_´0!|Pe>$=l^jIe / zW )[SQ=xƎ;/e*Hhx[! [|&X!ei-7R;ZEW%etK +j5Y[Ny)Đsti]i@6WV(N(K^ow5!tpz]Mek.,6u'l}Q @d¯e4UϿZax{. `v5i2b+䔺܋ @!5H K.(4=K=N ܈/іsugU(=@u4càzOLVW"UyC,}ft|$RΌPPBJR"P0pqTyz*8a&LÕ<'gf>i~ \MC3@- Xs-d"d3bߎK{7;{}ŸQ7+eoQZ\pjqv#1`ZsU^ɰ]:cSCۅ=œԺ4mOaxtbїjiu:r 4_BVrPeIXѸS8Kqrd Dl&˜w&`(jN\{#Y]O 8*_sz"qeKENf\(38꒥:+ee4]B$|؎}}l"X@x$tKHhklq2 b_KU0au L1U0-/RY.oD)UlK1)gqUpi)7ќ"p*d*MU镞0}fH &fdp{ro+F #C;6TNAq! n cbVр*34J:bׁ5Mf CT$|.N, 8;_qs7N.Ll`>D靖8 EXfC:]w%4|a o=9:,a؋*}A5`endstream endobj 563 0 obj << /Type /Page /Contents 564 0 R /Resources 562 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 532 0 R /Annots [ 566 0 R 567 0 R 568 0 R 569 0 R ] >> endobj 566 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [243.689 619.1028 259.3422 630.7922] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 567 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [260.7455 619.1028 336.2087 630.7922] /Subtype /Link /A << /S /GoTo /D (subsection.8.1) >> >> endobj 568 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [253.8339 197.2384 270.0446 210.14] /Subtype /Link /A << /S /GoTo /D (subsection.8.2) >> >> endobj 569 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [272.0789 197.2384 370.121 210.14] /Subtype /Link /A << /S /GoTo /D (subsection.8.2) >> >> endobj 565 0 obj << /D [563 0 R /XYZ 81 752.9534 null] >> endobj 90 0 obj << /D [563 0 R /XYZ 81 663.6368 null] >> endobj 94 0 obj << /D [563 0 R /XYZ 81 242.3784 null] >> endobj 562 0 obj << /Font << /F54 335 0 R /F18+20 345 0 R /F57 432 0 R /F50-4 378 0 R /F15 266 0 R /F26 260 0 R /F19-20 387 0 R /F46-20 384 0 R /F24 256 0 R /F47+4 365 0 R /F45+20 357 0 R >> /ProcSet [ /PDF /Text ] >> endobj 572 0 obj << /Length 3876 /Filter /FlateDecode >> stream xڝZKWUR@Ɏ)KeW+q$z%jBR;;翧_ҌS:@яw ~.w3Qb{=}lt!gﴊrwwƺHSjC&ǵ^=7&]^m_ۢ5|i׿{ŷΘ1iuLgwXG&3MjLft*UdweUwlۻ àqln<,! )KS[H2DͿm綜 ,q:4 bCZIK!b)2DE)ogO&NIڗ55 di\h@@H2%*ؖT8^{6걪jV٪c2nYP๖EOw2=7}O8Xͪi0Lھ޾9d ;Ctqv$pV$iB#x(n*D&aªe*4QP4]y_\O /*= %f$ք{eOgⲨS^H' Tܯj} [߸.ZPE(pTqH1nF1ȭӥӹ9cf^Gln{7F6YE%fI<9u"8,I$SW8Juhh4%lǏ-ņBkAkoIhl ^:doV_Dyb+Ũz jԝ:-Pw@v7H20ñɴ^-xu@סk;btuPڭ#v+[n) l eʭCÒŶb#UW"I&};ckGe`E^A]s!(^cέJXb4h(Qz\Zq,G3Q]Քۮ굷E L^H:jLDLgJQbjggmIFm1iiP#rBM܍]%e-IYbձ\I(S~~/> J3qǣECm.M5mpǬǯ'pQKԄQP{sn}N(B6>-#pc2۫bB!`pd;K!6^| 2u%7{r)?ǠU@)ĵIDuEug3DwGi5cL溔=h=@@_{ioW,)|䆀rV&՜uHp#g d7gsټWr7qnRfR硝Zk\_ *A6KҐفKS-P >K'fR8_X?x| ?2r$r|iS?[59X` H oəXG,Zp`RQ@*y%Mӻ&yW ._&{t_ [FLBG,U[VRuUqdHKIU'T ʿVeMŴZRuKlr[.X9\J"{Pǡքު*4{I{#"X̹oue\v)4Rz=V1J>7@lys>{%M:18e:/ݷ,з 7|iXќZ3nKr`HTm'u:n|Y%o?"لz p 'XZp1r!779#/,D|Wv2$`ƹ˸w%> endobj 574 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [407.647 437.8201 420.5486 446.8429] /Subtype /Link /A << /S /GoTo /D (cite.MachineSpec) >> >> endobj 575 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [225.5654 343.1969 233.0125 352.2197] /Subtype /Link /A << /S /GoTo /D (cite.ParseTable) >> >> endobj 576 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [245.0501 343.1969 257.9518 352.2197] /Subtype /Link /A << /S /GoTo /D (cite.SparseTable) >> >> endobj 577 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [269.9894 343.1969 277.4365 352.2197] /Subtype /Link /A << /S /GoTo /D (cite.Aho) >> >> endobj 578 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [308.6195 343.1969 321.5212 352.2197] /Subtype /Link /A << /S /GoTo /D (cite.Maurer) >> >> endobj 579 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [515.9201 326.9205 523.2581 339.8221] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 580 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.2765 313.3713 168.5884 326.2729] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 581 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [143.9695 124.2067 151.4602 136.1992] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 582 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [153.1105 124.2067 214.4223 136.1992] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 573 0 obj << /D [571 0 R /XYZ 81 752.9534 null] >> endobj 98 0 obj << /D [571 0 R /XYZ 81 651.3379 null] >> endobj 570 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F26 260 0 R /F47+4 365 0 R /F15 266 0 R /F24 256 0 R /F19-20 387 0 R /F41-8 338 0 R /F18+20 345 0 R /F51+8 393 0 R /F58-16 443 0 R /F60+16 454 0 R /F50-4 378 0 R >> /ProcSet [ /PDF /Text ] >> endobj 589 0 obj << /Length 3325 /Filter /FlateDecode >> stream xڝZnH}W0WS^q'Bv_ 3ؙޢ`43S5m`F<Խى#hq$2vN.,qd97E@P޷7(M'pڅZhyܺ'/>:5t }ONy}8]qNA3 |( @0p \K0^4`n̍?Ctڤ}{(hS z~)(:&W|CF"s:4t( [ #Pw0ׄ/҃<˰C縻E; [qK * b6]!t?.ę[{ swuٰ pf8m#!Υ V͛ț.6 nj:0hyV_0 h{,DZcXIC/b2TRVg6B.P  0e竇Cv?hDCQ+;')%H7|| ?C\] vHͮ: H꘧%h{mcgw>ӄ@'oX'3S;#ttO<ٳ<wKY&ᇬq#Pa޻1p'(iP*|_"&&1Eϳ(9]: 1q,ҝ @w`@wI=![u/"!ң1"뗜x]3V l}.L}hErn [ gjh$M;gT\&^-~jez$5lQo^Ez~^ثE{~L] @AJA RYx:%".>(${P'Hz|'={lbv[33J=p}v=by؛nUFGh$`Y}|KSu.6 Y44(K,=ͬapdiWOC\B(]ǘ#'pXjB*ぁ=9XVfiaCo<9B"1Q8}[kE(V̩8dn"=y9I \agg]gpqA8K)#neabLH8xy9:"ֿ6d qhy6Z]ٖ+=Џ#M>ЌQ49l|8f= %`v''2k L?YDQ`w|/4UsRoQ ONLq+߄^/ Z8k-"Ls7,(=c (RP'oĀJpLO]N[J7K1v<Fr$<2;DzpKL^Ԭ^ֺX<-)'}yF|"*  @zWIЋt (~gm޾}> "~8 E/[;JCƑ~F|TvkǤDTPm=퀸e/'G ?=duy^<3z$.x֫F=JTfb ރP=c'yq-`%*{Aɶpm}5#뫗wma(Ӻ2"W lv֋?g[Ձx 艪J7,>4;/I3Rpb0kR 6 #!|ZR)ԑJd?. iqyνK/T!)?!}y51V;>;n;R~ 7CJhV Mbsmm6?/O\*i54z\ۀUJ Nfsv$S;dž 1\Ls}T>ÉI$vRWΗ.h/lԬ%rI$~ɌQ/~"V*rs]S0odNL&t{%P̫zO(?bNb]*I8/mg= i9 j<ooָ+> |pZ*8ttEn:}}5lTJZhbobW`#~뫪6}aXtεƍ6TVłosHC.A?X(C2"Hw摭o8LbbvEI!B"WG&s׊K -POJ']T@^\1\D4$]"j=86u] > endobj 591 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [437.4246 634.7954 444.9808 646.4849] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 592 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [331.8998 499.4031 339.4123 511.0925] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 593 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [340.9885 377.5599 348.3265 389.2494] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 590 0 obj << /D [588 0 R /XYZ 81 752.9534 null] >> endobj 102 0 obj << /D [588 0 R /XYZ 81 732.6296 null] >> endobj 106 0 obj << /D [588 0 R /XYZ 81 162.274 null] >> endobj 587 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F24 256 0 R /F57 432 0 R /F19-20 387 0 R /F18+20 345 0 R /F15 266 0 R /F59-12 451 0 R /F50-4 378 0 R /F64+12 492 0 R /F58-16 443 0 R /F41-8 338 0 R /F60+16 454 0 R >> /ProcSet [ /PDF /Text ] >> endobj 596 0 obj << /Length 2756 /Filter /FlateDecode >> stream xڽZYo~1@aN<;X`A2-61%SKd`լ뫣eOldQz;\,,pL?<Ԇqfmh8~_]VnCtp6qoC/\]uoכOnzF)Zj&c=Yp0\ #}@ 3͜:EUA)Y \upE]݅"pwlN,fl.W9,LQ,7Q< 6liTJsYKDSʝE1Oe2|YCN 9SADAj6 YXi@DBRQ/ 12asaa>#0D(çr"f a yg$DtdBÅ])Lcg,:P$M:BNW7{ǠD N9T`9?X>S 1Ր`VNDȒP O@3Yވ<;'q5_x\%ރ=I^q"hʦ;HYPk`4B'hkpfxR x4'?`SOѶviMD|~76)D3@G$\Lm9B6cJ|+z7L|GcI.mW2z{|XY'&NZ8&8{7SYCj<'/__n`91-P(3[ʆx>³'ں}*M|*wl ^%0lp ^eN8!׽=TI˫ςZjbyD^ȍ|WfMB鈙,vՆԤ5`fr\yIX|\RN&,R 1"c {*8]?Oixb_%xi?&Xnf+BI3#OQۛ6iUV=UGVũC,2w-vĝ}h!EK/g[ʒb?jcmi.pN-%I|vV=|. u}7Y"1u5cJ &ԗŰMcfy&]ܶg[bem_N bDzFd$6hKyӕ!C;Pɽ= ]dP9nFtlD!قI7.{O.J\k,RqܧK 9"%2,6'=m>m ̩x_P)J֏/RKѫ{ћ0PHZH˻x=nFNWdM'5v]ä@'u|5 ݋{*טbIu䜙D#PǼ,s:9#Eo!1E~mng鼵vG)iha2U+ew]{ 8gc74gyJ;iTk\aU'Dt9J7?|4L4- TDXSڦ׋ۯ|Yz);\(F8}///:c8fJh_cfthDJ#3#ʄTwsӓ Sy|ns7_lgӢpwU8t+)(6M??)@652݈TOY.6qA4UW8GyɵXV٫rh,g3428j-Ʃ͟"7h,L$a7@A8):j7 32c(X`~ZÒRc3ԛ B茓OS8F@0!1˅0|kl{!-Yk8jА`93" 󜈲nAq4iz3fܮ`j̖l ǛS4)NP)K4T zS2 d? >FCo9rS)[M$ms\n=O~$HCQ?\#Kx3R,,Lendstream endobj 595 0 obj << /Type /Page /Contents 596 0 R /Resources 594 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 583 0 R /Annots [ 598 0 R ] >> endobj 598 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [116.428 139.9179 140.8448 151.6074] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 597 0 obj << /D [595 0 R /XYZ 81 752.9534 null] >> endobj 110 0 obj << /D [595 0 R /XYZ 81 557.5637 null] >> endobj 114 0 obj << /D [595 0 R /XYZ 81 384.0763 null] >> endobj 594 0 obj << /Font << /F54 335 0 R /F41-8 338 0 R /F57 432 0 R /F59-12 451 0 R /F15 266 0 R /F24 256 0 R /F50-4 378 0 R /F58-16 443 0 R /F64+12 492 0 R /F26 260 0 R /F18+20 345 0 R /F19-20 387 0 R >> /ProcSet [ /PDF /Text ] >> endobj 601 0 obj << /Length 2800 /Filter /FlateDecode >> stream xڍYm6_a, n" %E!oM hmVcK$'k\߼Qb5Eƙgf`/,EߩY:]w/Ef(?SY0̴|*}!xma^}qW C ǥEŪʻM7=H i u ZڏuZ ?NT zDjkjj"NŮʮ 7!KA$P R~fg&8RAC2Q$qJ%M1o>< <Pb8e|xMٔMY4` -~䟦؞wǦh[Oxp:N,mfwBE^YȜ9@kTl\ZtA'tP|IEjot =__3[8;CpSQAIPLF.enOt=x@#& :Y7w:+$p퉢uYۮݵl ﻝ kHbbBb g HqűWT$#Z^{W1I@|H |pf߫Lx"?>pNDˢ+}5ѽ [PjAhyrSG˩8 P4cײm%4tId&i6p}Gf;{RFʒиH0D: RA=G?_@gf$0?`zJiBh,];?uӑ-62pt| )+) 1E~l4&V#H"^ ޾ ÙpVVPY߲o:qӋɪVe8( 44.I԰XJM`H~1HxpSj8w `u ho-Yr^_j釁-(P ڦ$Rq |d2m}[ys bYG.eNCplA5%ʍ1Zg: bcux^' DN S?xgW\}!fpџD 3%>巔-{bZuG4,x߆܆\ vye}A9w>w ;;^ " gվhԱx]i@ ݑV1h(MUbnQb[TXs7]y(P0 _Y<"͛&P;/!Js4^ @gBE>"m!TqZO%aA7#SPgɿ 4{^ m[6Z$3D'nbMXwA5 IiWY_9Н{TɪS7vC7U~p]؆,jtl-*U'ŪNW8 -KbڠorG$m\73w 9ھ1V;Ċelм\!=y66W$TGX_K,D1gC r JzIw7'Ǣ#am<͗m]Gȟnw~`;I͒F}'xj)*Uvp$Fdp믎Ш4wgj `N#E_;9;9[\5&v4U`[P1RJ^\[> endobj 603 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [190.8826 615.5157 206.8146 628.4173] /Subtype /Link /A << /S /GoTo /D (subsection.4.3) >> >> endobj 604 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [208.4584 615.5157 267.0066 628.4173] /Subtype /Link /A << /S /GoTo /D (subsection.4.3) >> >> endobj 605 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [178.4549 524.8266 194.6656 537.7282] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj 606 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [196.8649 524.8266 290.2646 537.7282] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj 602 0 obj << /D [600 0 R /XYZ 81 752.9534 null] >> endobj 118 0 obj << /D [600 0 R /XYZ 81 732.6296 null] >> endobj 122 0 obj << /D [600 0 R /XYZ 81 411.6224 null] >> endobj 126 0 obj << /D [600 0 R /XYZ 81 325.3227 null] >> endobj 599 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F15 266 0 R /F57 432 0 R /F18+20 345 0 R /F44 361 0 R /F50-4 378 0 R /F59-12 451 0 R /F43 350 0 R /F60+16 454 0 R /F45+20 357 0 R /F19-20 387 0 R /F47+4 365 0 R /F64+12 492 0 R >> /ProcSet [ /PDF /Text ] >> endobj 609 0 obj << /Length 1877 /Filter /FlateDecode >> stream xY[o6~p%)mECb<-uEr6mo%`CQ>st 2Lb2E$<“,^|.GO_pB0XrBCpi-bq3air3 gĻ4Ot0Mu'rFÌ+#J9cH Jʼ;Tfw:J@OBAݍjmHPcLKyΣ#=c =<:i рy鼶:)̊olO0ҟEȖm8Iv!K%ٶ\/߇L̶XoWZaiMfs _NJqj@pp,w[bZpSt/aY&l\mAH>}IotAS(`LU!ld$\ 4[770Abe0Uɤبej-fFcJeF- $0ssL#Zh#> endobj 614 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [510.8728 434.4691 518.3199 443.4919] /Subtype /Link /A << /S /GoTo /D (cite.LangSpec) >> >> endobj 610 0 obj << /D [608 0 R /XYZ 81 752.9534 null] >> endobj 607 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F15 266 0 R /F24 256 0 R /F18+20 345 0 R /F65 613 0 R /F64+12 492 0 R /F60+16 454 0 R /F43 350 0 R /F58-16 443 0 R /F19-20 387 0 R >> /ProcSet [ /PDF /Text ] >> endobj 617 0 obj << /Length 3428 /Filter /FlateDecode >> stream xڭZm6_8*_E!E?OZ[WYdoCR,yaF3p^/EF$R-Wlܑn~7oZp,ۇP:anVk.j-Z[ifY|Yֿ2ʢ#U$|+N`#]|.54"rx0,Y􆵄+?ze?bA Gl7 2a2!L|&qO/̲;90 |XiEes[Nz Wބ}X72Y^]> &0i>~L(A!rlY7E!XեܡB:xfUC:"Ni+ /SIܼyMv*G ׇ?+>Ga2DƓ=7$F{3;7x7*cߘvfJ zWH3ٳz*C=UFt.YB܃_Oo+).I`ΞQ4TP,O#kd+Hcs[VRa {fpsJZ%TcsDi6E\~vPaXxT}Z(gz}*hf駸/_S$:A6ǎ$*ݤj:@[Q pʦl/Q)T|D3gkm^)ECXHl(1刀l9(X0( RL`&]u(]]Sk#f 4;[A]+Ê@SG%l w><žP6\g5DR?̠CkDeҷF%L,E+/4r?R7$ V}wI4BɞH4cjҀDt\w[E8z*ceUO2=6A"`h2_- oW&옱<Ƶ3,#h錼"\ EY!RQ_oy"܁µ Wu. k{a w $Ugj6W2j {6^g 3u <˼;cS5fo(p>p8Z)'>9OyC1r>WȞUU/O'u<]P$*1|θ&Mf &>-F70Fy{/ >:=ں|ԙT][Z |܉'q Heϱ|SaSRMx22/'u5RT1cSaVux#*^uD{o^&Qo-փ_:!b =(]~u}yޅo܄Z;hվs. +rrb U /HLOFg+ZyWY<}5 .nοN֙7< 8-GF}I1eE%t81:pնdi*7uslij"s~0MFrS+rMaՇvGhѧ{nҋNS5vTϻq^~8l!VG28+a|qL% KGGGgՎڐ.coZz`il"WtM5AzDp>rcC1Yc7ݥ KNh6Cu%Yp7@n`Y{vG/-w_Q֛**2aO*'gF(r*!NejB`^:O&?|KnBSؓ|>+"Ҁyendstream endobj 616 0 obj << /Type /Page /Contents 617 0 R /Resources 615 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 583 0 R /Annots [ 619 0 R 620 0 R 621 0 R ] >> endobj 619 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [319.8415 655.5414 327.2886 664.5642] /Subtype /Link /A << /S /GoTo /D (cite.unicode_rep) >> >> endobj 620 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [472.8619 358.6065 502.1272 371.5081] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 621 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.0016 94.9871 171.9935 106.9796] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.8) >> >> endobj 618 0 obj << /D [616 0 R /XYZ 81 752.9534 null] >> endobj 130 0 obj << /D [616 0 R /XYZ 81 417.2957 null] >> endobj 615 0 obj << /Font << /F54 335 0 R /F43 350 0 R /F41-8 338 0 R /F19-20 387 0 R /F57 432 0 R /F15 266 0 R /F59-12 451 0 R /F24 256 0 R /F26 260 0 R /F18+20 345 0 R /F60+16 454 0 R >> /ProcSet [ /PDF /Text ] >> endobj 625 0 obj << /Length 2569 /Filter /FlateDecode >> stream xڥZݓ_!m/ع9+U^?N+Z.Z!d&鞞AvRW>LtX?Hh2-b}$^la/wd+[|gUPn B[}0eSwT@]P巎b̦&1G"И M5$AkG Zg%z&Wj=9nXl8+ ;KM9!_Tը.)#f~Yqv?"3Q'=jrV}0`Ek"qכyu|L,>U6ƭ)<74*]1J=mQhET,>`%E}t">ÞDZ]Q$P֚$dJw f+׳=Ю=3&5OA@Ӵ>3H2bUhVo(tA~Osp :KJh I'Ú2v]mt0mPq/Sܝ0dЪRN_!!;#sEj2 ?Ł3Ł^BzG H!]w05~I۾ҭV,S1x};]w0;2PX%IbPNLz#4HɉO,I 4=P8b JFh-**!ziG̶Glp}BRJhIt\}˰ !)@2@63HjeLArDPغJߪ߻kҊB]A]w =x6tƄԚ ͧccH0KO|EOBxV gR' Λ|~ՇcSLEǩ&E8FE\ݖX+YeX۞BX@&."ɘISwO.OŌ?9z2+Ŵ?Jg(YB1 Ɖ[Z%tZ JR9zn$?$kGfEiҮNv=:aמXkܴQE _pDwԸ8QO(R͜!UjW< zOjN^ૡ)_bWUWda:F7)|ZvoҶ8Z@GvxAC8JiPq?NsP,]55$-Uaǻ2>Mp^# z\[Yz1%qw YZ;0sm>O!=^u35 h}PlqVgm8R z =FӪnzH{P2M gv1[8շfS| -N9M)]Ao"׺'{ xM  }A /&ݓ|BY RF?%&dWT 2/ϟG?:E3JC5>MNt>O5?Ú7|,hde Cj>1/]HuUN?IX&3Λ]ITL&ztdbt;mH0;2c:;e3'[m}bq4ftXAP o ᤦ{E8\)T[ DB}b4n0evJ>6./T }ӃQܹi=TlX,3ӜHYNfp.;5Kb_ǥ@oǮw(l24dAϯi&9@Qe*HZ,|c+$z:PsY׷^PSfbnUęI z_]} 7 F+d(\??3_endstream endobj 624 0 obj << /Type /Page /Contents 625 0 R /Resources 623 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 627 0 R >> endobj 626 0 obj << /D [624 0 R /XYZ 81 752.9534 null] >> endobj 623 0 obj << /Font << /F54 335 0 R /F24 256 0 R /F18+20 345 0 R /F57 432 0 R /F15 266 0 R /F47+4 365 0 R /F19-20 387 0 R /F58-16 443 0 R /F60+16 454 0 R /F51+8 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 630 0 obj << /Length 4109 /Filter /FlateDecode >> stream xڭ[mo6_aZd*"ERQ^\Vu]6߼e@ KICp8|慴៸ĕ2ug KvÔ𻷟zՕ<+t'|{eǻ,!IA],TY u{/׷o>g|Jd&͔p> )fTW 'Q~J2D&8z5_|EEl]㮚@Y` 13FRuK 7|?MuÀZn)k:op#DC} ȯyWgXg|ėȾ2(]lבYh98)#mR7wicHFJ&XJŹ7vo|ꅙӉjϖ 42` HG{MOtuR~|UŹ_fҠڽx>Mv5, }肋Q$iZZㅶ> 90Q-kP5HA"D˝ ?i+?{P8@fĂKSDeW\AЖ[݆T4I,ydEB$iQ}`+勰g"?̴%cn8|m]oQjRG`]1 D|%;h:slƓ'KD3_|v5n[OڠV}vM!hS`21h[ˍkT\UF}HI".\b@BƲt]v`4e}'nl^d,3ʹwf!h}5JX4[~e ʤ+A@!H$Uwsa)Q@!QK% \*d5rw ihl̗NmC"ϸikl0F$hˊ%l yqsw\[gb7؝[rr_1FYv<,4.:(n]aTZa*שR9zZOS|QbyR&'牺p|Zbt倀m?~Dԍtqjk?$;>>(l64? 0#"m 07Xa"1XgWhH2K\/**'H5l84Q^0GD-2ib{vgғs2$2kՋ-@!5PƗd;Vr+ p|IoIjfW"LN9 r6GL77Y%p 2Uh#ǔ ,4$$>?:z"rB>2'9v- lD՞_ T.L -邏H dXٌ#ùǪs|Ēi*~s 8\]ˢ$X2l6LR(dD>(7\)&3ܾr %Cˡ,%QBEjR=A 5 qb"*5*K8GЛvUgczwˣf_^ 1?i`ҙJS=pvvK;R}FW>nV$Ğ*8zN+' ٞnBNwlFK,e_Rv;!'š#'Ol>CY^F"͗e!& V]$'^ks{rXۓsy>sU#˹Im$ENP>efb؄rgSߜ׆Jk3FchquÐR+lMܖY ؖ8u3rK!Fԗ@RP. |Hd\$͆. $Gg}9RDH4.I.xĕg,YxW~1U߬:0xf?>Y]**AQB( Zb_ΰ J˃B:QfkՌec;[̃`g\/Ae/ziΩ!,дau@uI,PJ odi*[WzWXб5x +}{86fbdfŒuBs>ـc5oRYЌ (a*RC'\ [X j#*W/:Ɉ }zÓ{l@A"֎謇Ooޞ%;ɗz/ 6 04N`OhT#qo ubx%^㠪8]y˱BOYsEu,`hX_#4UWbaJ88闟b~WvWA8oO=)Ial:d%H@Mn9[b6oWzY 6uрzNYrQ`Ó2]^*ed&Dvr!/g%8D `S}!z|HeR="knӻ׆㺌T4}YY5z(]Gwo]p9WSVž Uu r:˝%,q}{fqSd#'R Fu{Le ;Sq~4tfָa,iK%Y"svWVoVdE&YJ,)B(?pn-JR:ڙ\S.]QŸs)>O3Ʋ 2 p <:zN#Nbq)Å+,=R%]X&֧ŹNTy32&J}AZG(=TG^{~<}'Xl;.٫6SPa_N8UG|-|SC CB{>>M$D%ܵ^ bJw]arۏ*;& Y+v Ct:^3x&8VrGU fzzߍ(nXuiu{7Tyqm>gS}j8RyDhH"̣@b"h(4E8\>6QKo9 G)kU=^pǻ*7^U蓞i{Wapt-4[˷ݽF;ʸÁ3<[vG42^$ur=t_+\ɛ.v}Z]1^Wg:X;?R@V\0&ھihJ Bj>0!WѬ9H&GXGw_5jB*i6J'_4=Cendstream endobj 629 0 obj << /Type /Page /Contents 630 0 R /Resources 628 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 627 0 R /Annots [ 632 0 R 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R ] >> endobj 632 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [475.2942 565.3308 482.7413 574.3537] /Subtype /Link /A << /S /GoTo /D (cite.unicode_rep) >> >> endobj 636 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [123.3468 463.0623 147.7636 475.9639] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 637 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [149.4074 463.0623 274.3809 475.9639] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 638 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [260.5106 406.8958 267.9577 415.9186] /Subtype /Link /A << /S /GoTo /D (cite.unicode_rep) >> >> endobj 639 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [187.0446 291.3048 274.7005 304.2064] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.3) >> >> endobj 640 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [318.7265 291.3048 343.5918 304.2064] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.3) >> >> endobj 641 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [245.7599 250.6572 269.7282 263.5588] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 642 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [271.1821 250.6572 393.3316 263.5588] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 631 0 obj << /D [629 0 R /XYZ 81 752.9534 null] >> endobj 628 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F15 266 0 R /F19-20 387 0 R /F58-16 443 0 R /F51+8 393 0 R /F18+20 345 0 R /F50-4 378 0 R /F47+4 365 0 R /F59-12 451 0 R /F66-12 635 0 R /F44 361 0 R /F43 350 0 R /F45+20 357 0 R /F46-20 384 0 R /F41-8 338 0 R >> /ProcSet [ /PDF /Text ] >> endobj 645 0 obj << /Length 2548 /Filter /FlateDecode >> stream xڭYK2)QI7b4,9mD;<Ӎl{Ea݇STU,~U7Mo2kTaf!B_XrX>d"*I o$FQze 8 t MTPH'벯xӭqrkیDs+[ 6ZY}u6U>ʦAِ])_(+T͛jqxlq?_BfM]i"1e8p,fK0|?|cU/ C0974zHŅnB ]AV8u Ƀ LP H}[MMwk dY厇N$Iwø:Zt1\L~lrkұN{7 '#XqHE93V;4Q^5ʦYIa[b-͓̳. b\Bj3FZr^$nI/Pq; FNjE*8NB6N3V#o3m$JEdChDL6ƫ-ȤBP(X@H[@Xa$m7ͩfS/Jy|ܑ{0H% lpێli qКO!nˠ徍SWޥC%ӱ[VSC!8\A.t>֘vEh#emLyh]ss JA̻anZm d0J`,i^Aպ;uY&ϑ(@%Zc%e6L}ȿ17gg&|m@.BQL5Q"*(RcM1 ht^Z''d"e+ m{& 9V3GxY>1qHZL cG`GV!Uj:e F~07~%&e]$′Xǣgpwkfgb}pi{;ZC7d 0_-^P06KrvutQ`3 $lP.ЉkG8=7 uߏ ͫg d>lr$'}Ox0џbv@cUna~|B<ݦ[UIXtZJn+8blCW==5Y(Ogz,Y$R$*@F/e$p -Nu\8B\2Вh3Ds>G$1W Uvtyj$)wZ\*L> endobj 646 0 obj << /D [644 0 R /XYZ 81 752.9534 null] >> endobj 134 0 obj << /D [644 0 R /XYZ 81 557.6567 null] >> endobj 643 0 obj << /Font << /F54 335 0 R /F15 266 0 R /F57 432 0 R /F60+16 454 0 R /F26 260 0 R /F19-20 387 0 R /F59-12 451 0 R /F51+8 393 0 R /F18+20 345 0 R /F24 256 0 R /F47+4 365 0 R /F58-16 443 0 R >> /ProcSet [ /PDF /Text ] >> endobj 649 0 obj << /Length 3719 /Filter /FlateDecode >> stream xڕZY~K` ;bc5μq8gDNHjgA{!jv=dz7NoEjR+ܸMnt*')y'ӤF8Id6NM۝+=L7oNfQyU4 q;MײS-Lٙ,. tXQpסX72z`B؀cI$U$ָy _Uf<6xe3>7x^vk],ml3q}{e4aÅFVXE hܛH idl7]?Q 1yL 8f7e:Ns'bwlm1N[a80o8r&Umd[ N\o?隬il<g 3-^Nyק'[4tT;f۠<˘mWHH5OK:S JE"EՂs#!r\ Ǻ[.}Ekւ2!|,{eP^ buCu[OzB⣉޹)I%B'G'xg-.#E=΢n4ZgHMߌUF87$˕,`,Y4h 58s&[wՓ1L4`5bҀۖxߌڼ",HR|lpn̕wvqb9m-/xlCpLn֊iK"szB Skb}x;0 0jY7 < R co-vfδ4SH,w]I(]K~ࣅ3>U2ߙ˙%vp xM41n  ^'f ͡p3U5 jQ"2]Lia #3HT;Xz挴 ߥV#^8|7El^Cϵr&+~4U6Y1% ofF<82/yiePuoZ*o,p$2v$B&*4H#5yG̠h) m]>Z TK]6^ۀ5s190GGKtjDFe/oC` ᇸQ_ W,Ca^I7!ڂj|@B9eRdBx|+b+_> 6.;R D^:[1lc 1Q{3LKyO*V|cV @c4ꀻjm{$F8ʪ%EZ)[ϼ &aL\p0dCo&Vj]PIfaTd?z3 iV^lB@eɻyv1Vbs fmZ cl玭o(2 *_mj`70+NZM#\y߆`oKT]DgAy&(\qtʊIV.x"@3Um 2vJ_:"!xx$Vbb@Lv~R ќW]iyyAm/pȊ2u\k(`1/|}K.܆R)EBg6?IC!~hOu#ωWj6C9^ֺ(>\@RtIT_yvݼegHNyC-y%t=O1gl?7|3Ҩ$vOOyDgB'bVIk 1ưv:Ȑ P/GB:kwg!Q'Qj'u9Ok: $y$Z9wb[݋g4Fm [Y1ؿCapnS*"HfBE T_d|1"~|EzD|xz:VjթI0 @I*Qx~eFLV1:Ve?'€S#ny*t,:` 0C'Z[i8=&ѣ!A/BC}J;gyǹ <;ȼᚢ } Uϝ6fDƊ8Tp =:V3+n @"1$ rP (tRB bH'+B.S߫@U<o]JO) b)(ӆ:OyWWh R<9oo(.p[E\3Iq+.i9lp~=̡B!e+NK;9;NXmmXx=nwvӗ8~-9(YcBE TorƉIEʇz`բ=H. ƬGpmƯڙCN}V€=po>Hyki@կ/99xC!&?' ێ;G'0\?u7[7??gх9WJ(ʹԠ}͡f0+d<0>!q dYI|9_ΝLQߧmQCoyYBy0ĭ{J{eG2OԅlNA%'N  :~_@@k5Zgѣ|Sl-@E-rꛯaΞUZ\9SanY^3w Χ`,|3Eᆜ1=x>o%I.3D -{> endobj 651 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [138.6395 342.8013 163.2357 355.7029] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.1) >> >> endobj 652 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [254.1427 288.6045 278.5595 301.5061] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.5) >> >> endobj 653 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [282.6393 229.7108 307.5046 242.6124] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.2) >> >> endobj 654 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [404.3677 148.4156 428.7845 161.3172] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.3) >> >> endobj 650 0 obj << /D [648 0 R /XYZ 81 752.9534 null] >> endobj 138 0 obj << /D [648 0 R /XYZ 81 478.0244 null] >> endobj 647 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F58-16 443 0 R /F18+20 345 0 R /F41-8 338 0 R /F19-20 387 0 R /F15 266 0 R /F24 256 0 R /F59-12 451 0 R /F26 260 0 R /F64+12 492 0 R /F60+16 454 0 R /F51+8 393 0 R /F47+4 365 0 R >> /ProcSet [ /PDF /Text ] >> endobj 657 0 obj << /Length 3236 /Filter /FlateDecode >> stream xڝZ[o6~ϯ/2:uE`mRtJ,<s!)ɖb0D~*k uH, uO0Ul t)?62JLfZHPq/Y#)姪: MpR~IP*(Je|_]}wGZ-EtJ8EEB]Bq"_` i'-\`H g7)_rIpS}_C](4л%"y-c*d mUeY,oaߗ; ^x3!.y:̈́])w+8>֎ H#~oV&(ȻTZN@\!E~BҠ Ӝl[EBiZ $`^k ~9_ *Z"2e3Dn .P˰Ǝ7VpM }Tm@/QU =?}PJ: u5: "ᥱL-]!8 3K: vd%V?p0 f"L2ףCha۪@i|+wxthޠg"*d{s3@΀-5) m㜇]ymxt;6r +F #;p: ǖF7x?n O`WH:x?_FGl~?yQ2 MsWF&=%3.0HS=;t+ʼkzNj.A'J(<:+Fu].pGkE&,덭• D< 00vp +q`| @K>MxeTǑٳQ^rd[EekC= -v=3*,dmI6J|2,0_'[)X&eUaIqs;POL(scc6+k3I* sw-ujy0*\18'L<`;Oy]8ibLj;鞫%efF\]9# 9]@眒"R Þ oF6P;lH16Gr#ˬw(GA˚&Ճ_MP@@J61FZ2e;' t}#ܺ3 }cNH:y&FO'qhŜK\%"d\ c^JjT_N ]#t:g|7t#KWלjӟ.l3%YpDxuKg c:{K'`^? &?bzNU38e4lʏԗko^&|NT !te[.|ۘ'dbBK *WxvAnq!Tkڇ,B&nD#9sK7Ty\a>S(sȚ\'{[9:{]38Qz~b1؜,c;wxʩSQPɐˑFEQw/*5qyF@!Gw#lẇ38D,[+TeQb\2q%T[QzVh^,Ies=3۹gVPTDƸp>8 T޳=%qb%D3FZ"\݋7(3T} F@aYrI %=K˄zQ1d:v%CС`K^7K'~O^5ˣ Jlҧ єbS~Q+C x#-֙Kr8lLtYGVkeß]d*rZ#a\J)u#OF<~L .`ǓG=)v/?E G6tt*4 8tFb[s@0p zm?JkKкy]=yǞDS'S7S9w27h1?sUXhl$jd"9)d&/Z\򬷜<,իU3=)\rw>[4huOL =aQmZKa/[?ǾDeãt"aoiűr\)'MP5 [;IBFLRd-0PΎfNI9&00Xئ:jY]خwl(L|GrRvSLY8Tvχ=#}ap w[Xj;b!'1.N|w~7.$l Xvg¬6 7iJFjI _ 8#ZςkqO͎p-8KN |'=VF~qOf2-(j{Uf왚ս-7UC=Rk`bgaVcGfeuև,ZgG%3_uߪ,`Bރ?=y<|˟Ox93y4L"UvX~KG'B5fk6RKs߆l"R ߳ل' 1P; |ڽP֥LkP9u9dH;- )jKJ8mDSnqo)Ly ? $EA:TئJtoKߠ,;ҩͦ"'O0+x.+CW=PK?-w)ߢM˦r(Ζ>,s,ZMendstream endobj 656 0 obj << /Type /Page /Contents 657 0 R /Resources 655 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 627 0 R >> endobj 658 0 obj << /D [656 0 R /XYZ 81 752.9534 null] >> endobj 142 0 obj << /D [656 0 R /XYZ 81 732.6296 null] >> endobj 655 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F19-20 387 0 R /F57 432 0 R /F18+20 345 0 R /F58-16 443 0 R /F59-12 451 0 R /F50-4 378 0 R /F15 266 0 R /F24 256 0 R /F51+8 393 0 R /F45+20 357 0 R /F47+4 365 0 R >> /ProcSet [ /PDF /Text ] >> endobj 661 0 obj << /Length 2162 /Filter /FlateDecode >> stream xYˎWxB"O=ds/2YIj[Z<)H%sq4fLSEVevۥ\ ;?#L?A.sۏJ%9aǥ"TP>nxwm/XQ|EBퟣ2PN<C6;\q>##ؗέbe|nxK]UiьgS_j>8NL[Gǜ;Q*97[nҸ\#é.] >tlک4XqƯEseviZR:e-~Zk3[gnH8~?mAa~=wL!]bArLڻSO 1LgǯpTD %Rɾ.>術쟴pYf"`t\(38*c=mC2XB3f D28 b8R7x\ Qɓ|jvւ4Ksg{wXڕS])VܕVgbImħ61z3BCT:-y_IL[ŊP`+M8bŕ(oۺD8]xOC1 E;19Cw)qd(S'CUk}F#\J<'r ݊IB%\vcZ56d f~0"ڡc<1B GS"]k1oD ݌dž13+TN?I00d_o2w P.%G0I RXуQ. xe8|pm]Av +L(}Q;mـ(~Pu3|gjtںnJ"Rn7Ddo"cG ) yuC?kەd{}-G (,Pͣ!&R:&1ء|j2=fڻ.J]YBuT&`A{AfLQ0O $y .Bg棳$2~4G)G&d@dμeC/CJ4IPÍwRK4O2T.?_嘃>érSdqje 4@%6;N]<@oZX=#DV23yu,GR!^?p% *2kDR/%ڏpu22S0GaN:/icr5U-ߡ ڪ,ekI˩pze2z=HC@|_ BxՁ q‹Pj_b~}Yu.]usĻ9\* 6X65]zG²~ܫRd Zdⶑ rJ6+st, \S:j46ץ pM3[YGԮ{ܹ/vM.Zڝ_9O|n'yDfDO+ ],YA"H{/v375iw%'?hJ×>CNM{1>R:10 ㄩJx/;+FlLF␾8dP _O}_@GJMJcz̿1  N^ W^r0/l5HAjUȤ(`qf% ΝT JprX >KdH%pR׺gILB-(+SxyBNL[!ү [{"endstream endobj 660 0 obj << /Type /Page /Contents 661 0 R /Resources 659 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 627 0 R /Annots [ 663 0 R 664 0 R 665 0 R ] >> endobj 663 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [445.1875 203.8747 475.8161 216.7763] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.9) >> >> endobj 664 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.0016 154.2608 137.6302 167.1624] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.9) >> >> endobj 665 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [107.0016 104.6468 149.0846 117.5484] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.9) >> >> endobj 662 0 obj << /D [660 0 R /XYZ 81 752.9534 null] >> endobj 659 0 obj << /Font << /F54 335 0 R /F24 256 0 R /F57 432 0 R /F19-20 387 0 R /F15 266 0 R /F47+4 365 0 R /F59-12 451 0 R /F18+20 345 0 R /F50-4 378 0 R /F58-16 443 0 R >> /ProcSet [ /PDF /Text ] >> endobj 668 0 obj << /Length 3611 /Filter /FlateDecode >> stream xڍZ[~ϯXbٗ)`ݦ -Р%JR!V_{CjWk/ X3ù9\fMMan4ڔi߅7{y{!MnL)Dl< jaS2n6AZGyP78w8v8jh/UWs㟸EP>~ӝ2&I(Q\,'^^76YTfQvcMd^9MhEo dYk t ~e9ܭAbsnx)6Ea/&Y򽉖2*MMVLJC ,uv7"X:ZZrmMn `omyqn.H K#h혈 ; E=Z"#}0Q򛵉7iRFG Zu?IT Et8##zE-xlMW:ef5V qת{p˞nh~urv?BF;nm@Wz%4 ]Yt]uz0#x`b0i^d+LڒK맑-$hG&S ]!{#E;' 53bF ̲me+ |8}ePC@ђU"%ԼS }YGV^N*8=QlЧ5 r w0cܜg8?ȻWpșk HG%&o6nM_a8ŋr6]- q Ϙׇ주f[g4 LyO1H| :mjG,+ ĢL8W{%6L{(s)s‡bF1wN}L03ZLX8 tN#^I&a ޫIѭSf$F<^DRCqd]u{ ^"oY|qB 6 ֧+}0(FL"s5*PJܭ|gK=1 PH\xv#'?2]V>Elz Ao'Ra~1BC_nPxɃZ D Uv}|;Z?zBO>b6\BHe3nj= I&ʟ.LSrCy7 )P`Y9 22vQ =f{׌AhclZ)% hoƱ <=Џyߎc)7_-a8~P.V~ RY$&^|\Njh4#'|_5ljL >'+^f9[:-%7D'e~(D pKPBp 1j c8_ NT WK/4_փpCj^"c-4 rI GIp}O_8Sd~o+a`NThzMX@v>2yh tSY|bp^>Zf ~g'~C㯬xƁ*eNT <&/Vi|N|%y5%j[iR 8M|y4\֗d7rď2.1~ =돘7^]k 3Y)qp܄ˀ๐(I Ȼ;|БAm>4 0a_;8ZQ%7x>S`N~D/!*Mg܍͵?ʁ˗Zendstream endobj 667 0 obj << /Type /Page /Contents 668 0 R /Resources 666 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 670 0 R >> endobj 669 0 obj << /D [667 0 R /XYZ 81 752.9534 null] >> endobj 146 0 obj << /D [667 0 R /XYZ 81 732.6296 null] >> endobj 150 0 obj << /D [667 0 R /XYZ 81 648.1368 null] >> endobj 154 0 obj << /D [667 0 R /XYZ 81 208.4102 null] >> endobj 666 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F64+12 492 0 R /F18+20 345 0 R /F15 266 0 R /F41-8 338 0 R /F19-20 387 0 R /F50-4 378 0 R /F47+4 365 0 R >> /ProcSet [ /PDF /Text ] >> endobj 673 0 obj << /Length 4056 /Filter /FlateDecode >> stream xڕZ[6~("FD]؇m&6E3Ɩm5dҙ{n.'-KyxxnS7I3F7sJ@~sݨςLnRIL2 xgVk޷JyZyjo[bþŖuOp̻] ;Zɫ-??*78Dm}hVQfV~ -dl'd$~%u('nxhʎ;es:W]^WLlS /?@5*Ӝzi6Ͽ?֎fga(NBƂXNtrVX48+x9;ʻB\Dl\~wX:2{Þ-V:!`S]="ʨ=<(CY͐2K坐 W(RtMMu9q }e,x@;$EY ~Y`3c 8 5h*<?RWa 9֧bi(S(~[C*WFOz_ (3==&˺ŅJ]_ac_ @3݅ ' DYq4&hAbTޮP!W}ҁ4< A6?Z˪ !uT$zR_FbOlZgL7bZRQW4-~nĵ:(ч^JhG}㏰x$L ~*CFO6/8Eh~3ly2t4aY錭{N/٪g /Vmd乕2A{@l}+qyWᔟdg ʦ]9rpHwgG4?Sv4ȚU<ʙ$T%_.>`?ҳ&4R4ũweyU'nʏmOSiOBY=i[J8r*6_ެƯZIز>!_Rr~GىGѳrZ *3bX)XmƆ=J,ebY6|' %(}Ȉ|;ߎ3Ix% Hȁ>- ԉ&+2c٘$E BDR'!3q4zʢTe7I:nL( ~8{"ܠ·I&,5^dMer!!D60!Av&?Z`=}+rlyO i@](TPeÌt>]!$:m Fmٖ`aѰ_؆II'39 t9oD۔ÄlL@^1*^2J;saqWE;\IƬqߡ/WV,_JL0X}GsɫjPdYیjBJ|7աɥBM0JcPӰ5 _OyAZd>l+f-ǺNO\l^4#X4ЪUyO m06" U99͞ŶTk0 ָUzArY$u[;9!nVZSW?٬)^uֻ+K2"5)lL@'`*k3Yn?+mx9pHCZnIX!#zwq@+u,sz}VhN&9=Qfᗒ8޲0(5LxзsYPeS.m/SAܤMv\&{WՏ?z9 DU 5H ޟM12(M` L/sc`e_uC焛aFxs DTCaL " >zf_Xt̖`bn`:NLG r> /SA -@L-J,Q~M]&z[m}~MWMq ?2P$Z@yr߯JWlwF 5P3$12nѷ=%2*&[jFl LN !eWH+c]dXVP 6TXN`7MgAs.Lt\tWilTfX2+]ʢry8kC߆)3=ˉG-D{yAٸc\Ԝ4*[(-V}7OעuzZ:w!~+"9)$%yJOH2#P=GlE:|L{ +>0oH 1(J)Krx*ox}xV2؂N(8L$`9ŝl˩/3 [~?{k k&bd Q&[+'˼1,ɩ%~S )"IxDK8E٣ IdO7>9!rN6#҉FHhDTJ;\ &:Y(QOn]OR1I9 Xީ[v R;:JR$~ޛU tv4Tcu#lW` ] F83U6B] BeqOm)5f)KzȾڥ@CHL4u$/67E+B`I7aEN72lbzPe5SOJEDW o'#^&įChtrItpB0Z;gCJ_ut4ED}[˜,*.S?rT$JkPiٳYa_^`3+@@e 64 =*w2(@'*5PA`cr41C3_%`/!2[m<;T?\Ht/K_KbM EMkR<%Q@(s#V}MJ^{o6b洆tdH%go?:OBkjAc!m. ouwt^U@znl9,#g8ytSk`؀C>:vVpw 2؇,S[w)JOrehȔ)u&ȵ,3!? Ѡ 1$R/"k,~UWlyvH{Bxy+2a{:6r>rj 4"4)` {ө%O=&H#zH_CDE;¦l=Wd.5Py$:n;%Nrh*4?6X6e~V¹'3f!Ze~B#i7sw߬-8ioԧu[*?֛vߗⶬ(Ńl,XUweSboWUz1DCn[yS`@{?.~vCV/D?= 0.BuZؗd$@3cC$K$!|E'ryU >OMyQi*@kv(*W s1<>7"oƀ8Sp+Ɗ7Uc\=]O4rrw VѸiblj-fʀDR#:7 3Ky>endstream endobj 672 0 obj << /Type /Page /Contents 673 0 R /Resources 671 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 670 0 R /Annots [ 675 0 R ] >> endobj 675 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [222.9383 215.6183 482.6553 227.6108] /Subtype/Link/A<> >> endobj 674 0 obj << /D [672 0 R /XYZ 81 752.9534 null] >> endobj 158 0 obj << /D [672 0 R /XYZ 81 190.2245 null] >> endobj 671 0 obj << /Font << /F54 335 0 R /F15 266 0 R /F18+20 345 0 R /F57 432 0 R /F19-20 387 0 R /F58-16 443 0 R /F47+4 365 0 R /F50-4 378 0 R /F41-8 338 0 R /F64+12 492 0 R /F59-12 451 0 R /F26 260 0 R >> /ProcSet [ /PDF /Text ] >> endobj 678 0 obj << /Length 3460 /Filter /FlateDecode >> stream xڝZY~+ +okg'ٱSn% 6̿O_Iݤj`].WwYE}Mxwi;O7'NA. x"M%ayq9'l67mw蹿myvǭ4{ϧo$Qu,[[F D*H0#Y;Ew40mʞÙ1A6'%A0~`;wnE2u_ȫ/avJ| ?(nmǶ[cL%:PEr8|:kWK b^+$:x˧8(78m]Ω n ED8ɂaQ [nQlS[i7:s]ߪ`RַTQ:yY9kiĪ<ȣHό ՓgN4,B_->BRr^ip/i NoeۼQ ~E;`m/ȃ-tY4ySnakސHiȞY={(~y۝zAP]>D@T`c06ӿlxFSUA0)dX\NbŏAH6ho< ~W,\pdFda)9Rd2OjM2]BMŪ^*kO ^Fzۆ Zpdm_%cwMj1 D@A8b{Arle$#_Ob"+֮0Pp>= dЉGkkA@ӝG-(^4` K,[iMs\"OVT +- ,UL^(eT 噝 ~y;-oX^-q]^H!m`1#! ˵Z u ^U}v&KLW"淩2;^qGI ROt,PU^{k =ɦ<ش2} U;0:<(2TNz j@/H/sX#±z3*"uAtQg1U|Oa~ϑ' L 0b,lɤ+Yb{|=X02`hOwh%+^*FpNMUnlpO9-t。N1.`=6zlq!=1'4* d9V*<C~Q1$8~1E:u0ys[Av V!-+J cg\TR5rV˭Km|p.Ȩf*^~P\3.}FCcx3 . %¾ydD#t>G,2 .^EuVLLzVJ&)ݳf^M~efۼ j{]j$x jASԧmLmbwFB:[8Q«an9)ѳ/P)WQ{,&F0ITҔ`{^03Kwc}mxY95崓\8, khת-V> endobj 680 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [439.9918 428.9509 501.1279 440.6404] /Subtype /Link /A << /S /GoTo /D (subsection.6.1) >> >> endobj 681 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [170.822 415.4017 190.4509 427.0912] /Subtype /Link /A << /S /GoTo /D (subsection.6.2) >> >> endobj 679 0 obj << /D [677 0 R /XYZ 81 752.9534 null] >> endobj 162 0 obj << /D [677 0 R /XYZ 81 495.1752 null] >> endobj 166 0 obj << /D [677 0 R /XYZ 81 401.1328 null] >> endobj 676 0 obj << /Font << /F54 335 0 R /F60+16 454 0 R /F57 432 0 R /F19-20 387 0 R /F47+4 365 0 R /F41-8 338 0 R /F18+20 345 0 R /F15 266 0 R /F58-16 443 0 R /F26 260 0 R /F59-12 451 0 R >> /ProcSet [ /PDF /Text ] >> endobj 684 0 obj << /Length 5440 /Filter /FlateDecode >> stream x՝]s㺑WʕK|ܻMmIr:Sًl.tl٣ĖG![hpOK /hJ]O]qꜱWO{n`o|9{ꪫ;uJƛX^cVo]}jr:l7}rӧvs/? JqZI3ҭnŽ`ϟtoJuz<~ӟcIe*g†j(l|9qT`[Wm]Pu[)V)$U6)lT Uj9UwR2X$'>Z;qHUg^rn UM<1cv$jotUV .u;n$ EE{P"u H$D)#sikUMu-X;%g"^09/yMyd.wF-5R,ߗבiaꣳ|.$wF/= w9wi퉪\k4WCiN5»qhRޗ]Ը4#ݩqW]3zT/jkyӑAB(ҝQt/ Q:{u;um2НыtO\ˉ;:yR[$"" 1 ^ӄ}3l8+%Q뮌֥ڶuS3'bPQOk~~y-P>oh]yרcӮ-X"yWu&k@< ͻi DH(F'q'I/'RHoM[8ڦdIY"tL i(oUEK>o=>\!Z+=AOkŁ~y->o:> bQg"p:}u}%c@/&zF1>99A/'R@@;a[8=)N yT\K> [ZUxK^Թ4;5 bm`,ޓ_^$ϛioHy E3rT&R~y]P>ݥ12e a<Dܔ+5O.IW7!5߼ޮwEۧj?nۄ;tPN꛾%߾~*iVP}=sv+>Cb\V/COc`_~($nV6|Pk/ZXWqp}b9G1LA~tz^zP(BCcMۡ-v7}뻡](G:N^L©b2骴87#UtU1hsntl.]U֭ۏU\\cj&*& ajl\pDDUFG Gqd!ʦʅ(aZPΔܙӮ瘻d:imk.<W&"v}3Ľm̙siY\ٲr P<͜U 3sI73giLB E3r4F l]=z9ӓ"łDHfJ{R$ ;|Z{ ]'FHx*rD)%qߚ2|8$ 5SwF/= ;p|_^$|ϛ|Դ.»X"Du$kgw 3zQx{!x4жVWJYq_hqRtg$FSs.&t#ݩƅtuٳ(i;ʟ\S1}3ҝ1ɗ].FHwN-ҝD})ҝq^#D\"9H(!^ [[)-snk4;=O{^#mMD\*,g*`JbI*@wW֥I,2ʋVByFDKy6[u-P>oX0iST (E3z''zaN/3]cqʮDH(H':^P쥐[=6t9v~,Ot%=9RBzIH/j]yx3>tei,r]N/Mt닒U9ESۼJy5e <)%6EPPAO5 7[o=|GzR#ƹ}30-K*3xQҌ;MWvC^3T0{'a|td<5mMy E3r\ǧ.+]#g(2^,H^d|a"ĊZXz4mM{jM]y5 oo}FfHR MrDm{=L)S"aی !־h8r(W!1q}߿< wwOŧǐyمCv*l/]{&BF7i"j l_Jx#O_Ͱul|K o_CO| u3$PjU]CK:^bfz ,axӔ=޼w5@{ɩT̺*7~3!WB=lȇ )wfDPC 062!=|W>V) u5htPc6˺jv|b}-q)}^.|Ӧ  Isǔ`5j |;ur7q cvtć0 ;INyZr< +ۘ[0Pk3zJNex~MԹ& 㵶6L2q).'uuHdDc.XL9.8c2qj6L,Vۏ\2\W=LT08:#xM2^䃄ir!k&BL<7Bx~}!d4Ddb+&FL<7Fx#(Bf7/=s3tf5]Dx^#.FNDY,&,@gOs{nm:{9mr P-M yw*qۥ4Լ-[$[y߈v0H3r''r 5Mg{'"Έ3+Dyӈ$Bb!"TgNTO6 jG|ꦮ\q򺱕wa='"g.:}30e%`+{Nuicqb]k۔^3Is>B 18 -!R<!v&Bk!>-!<03GqbOP\;_yy목}<)OyT\K> @'Q2,Xֺ4|bek`=z/M=tWrAg"\S@v%|#]8I/$ByF/R J{)Yvކ`6&x"q.di]DqiGVk^; x~v=9=S.DZ;UkOKp_^7"pϛF'* a;#ٞ&U TB^=Yp;E^\;%gNs ^|'{4.KMM&(RQ;M&5t_^G"tϻƅǍp;M')~>APgZǽW]ˮ ʼn=0Jw!ga{?2DmK=k;r6R `=Nv|%zrd:ln'"=Nj]@u  y^-Ҝm-''R`n 01}e8uiʼn7\ָ4#ҩqUpfJES0Z-uMG .uF-0DHy1h a;^w9Bw8IZ>KOnZG{^#KD\',g*`ZT@(֥Yz0KO3TqɥZ(|4fabR<9OB/י1K(J !=IO{g |*jI*_IX #ĹR}-wj--o\uwVJ@lKґ`4 ޳q~yblϋESMǯ_^"dzVi KP=D͋IZU|`s81%FSs.,Xg*N+.\yԹ2UvF0 l_^%pϻtOd"E)❑|rۂ./]#»bA"g"`,JBqu~}[~>=wHA_/߄endstream endobj 683 0 obj << /Type /Page /Contents 684 0 R /Resources 682 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 670 0 R >> endobj 685 0 obj << /D [683 0 R /XYZ 81 752.9534 null] >> endobj 682 0 obj << /Font << /F54 335 0 R /F15 266 0 R /F57 432 0 R /F60+16 454 0 R /F19-20 387 0 R /F41-8 338 0 R /F58-16 443 0 R /F59-12 451 0 R /F51+8 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 688 0 obj << /Length 3978 /Filter /FlateDecode >> stream x\K6W\el!x`nw}Ļ9$9p$D['$e{vsUv Fw鶘p'&VLR#Yf,dwwCyG߼4z"8x&&on'R,Q Y2Mfs\)5->`AO?̤VjGw9L@6-oo^?ۛ#XƎ< Tm˙=I`ISwv]큉z6N͆ gs1} -,EAC 9QZʦ(\F}whIv4}T_A5bWy7hInf2?ƏϠ&٦9F,_PE]z(x™*̅bFg֣p @/74}.\2ejKP-H0藁NMX߬+.E˝"TP\Y,J `bKCٛ{Zb|Cәs20ˤNh؛5-2lH) rj%NVEC9=,稆l[ cNٛ|Qgnj|{u*ie{rQՖďֺYU>ufZR }K/}t^m[ VIru$#{ƕP&p,PѮOM-%^0cj"{[eh~fY8ihG̤&vO*2av6SI8D=ސ¤iPd`Gj拙L)cz7\ P)vx,i%d GhL>g"jGZyӣdžf>Kq aA8`,u'\1kϢTiLL['6ds(qiILϱڑƫPrsD0aaY $ifL",?y2X RÙ(sUVi[PuGո3u@=ЈJpUˌ'J,?fhti»TԹz~ c:9 3 AsE ?\1ű \\rȦΒ5"v]cZlfLeIpl4?]^=RKq aa(yY$pUɥ$2ai:;&aV󃥒mny HSyApcqAӌLE]шh8zGc.EbxL8zGc&?Ge{|~yG8zELJn`t43`2=VJOZ`4A\\Q0iuF% 0 F/3)4RC.:أ;yςWJ2Xv_^y+:FzCf0t< ՖLkwz#0|ȝ>8^Ec6/cG+L%O!MWh`X<،T)j0̪wM<#4"5iw b֜,5j@A%TJ3^aK=R H/3iKxL@zHc&gjtV,3W˓:+Rw@:ZfWt4K2=~"J^Kd"r1;yc8:G/X 0_^ѡC:F8zGcfͧ=8Fd,lr=HUcPKj U`]F}hQl1K']$tk|밤.RGPCIBXR0"`k2kmuKAUc ӧ R( #༇Q2n+'1s.!|!r6 Uծx}5ĸ )KU6۴%F{b)yW11Un.W_4Ƴv: B]Z'kqtGBJ Ĩ|v K(~,Xî) 7!zޏT}|qؤvɇQ!PM%{n'"\Er==wuL"J iʃ`+?b$WTA̕/vF++IL;C}%gॏK6P@+` c}Tn#CY§MͱEi?[K7.5!H}~*x#@coiL QrfGCF8UG絟ح]QԤ$u] 5; /vMN?yB# rj(b3پȤ3qʁyB~z|:59њghΥ͛wD?~!EF'$A晃k]|;GT5m ;Z0.[Rʓz /? g=|]1`?*OlF*N!O( [6> ~&B :jWn'K pwJnb%EjX\@%fhZrI%_:̏87]|C[h8@cd ,2`xya \gtRږ>7nrZEq" Vqn[;8oY&^F:WHHD5!A_>{5S,hRbv0T `G~Sa2 yᲟ/Yk ??M\G*^8:"8]-Eu!o漝s7YewJs^(%\ݵts;g~:T>Zty/F.u "Iੰ{F+CV_IƓ49@P@/Vr} +w|S17ʝA;m ~ ^m駮pYafjO^:xܮߞz%3$g>@upRt|QzVa+/:[&Siܬ*@$O: (}>es][2bǤ%sd)ӧT1}r2PíRP4JS&I"ucS&Gݥ\?J|LXx#}Sę#ls[B"Ƅ66r茝v^𒾫]فeO. +djM/a]a C& gCvs-ݬv6A,j\[P.2N٩FZq2?Kb3^R)K3>mJtph!χB5qidkaCb68M uܬNo:(4bn6m VQ)D|ک~ڀǻhph=iX 5GAtcFz K6?h6K6Wot'La&/p]̜6cZ],]a㥠⸿KW. QXM8 EO0k4=y_`jY,:9weHPځӝ2h{'xև'!= ӆ֬,`i7]bS -:Nᢗkx|j_5-> endobj 690 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [221.087 223.5569 233.9887 232.5798] /Subtype /Link /A << /S /GoTo /D (cite.flex) >> >> endobj 689 0 obj << /D [687 0 R /XYZ 81 752.9534 null] >> endobj 170 0 obj << /D [687 0 R /XYZ 81 341.0943 null] >> endobj 686 0 obj << /Font << /F54 335 0 R /F18+20 345 0 R /F15 266 0 R /F41-8 338 0 R /F57 432 0 R /F58-16 443 0 R /F47+4 365 0 R /F59-12 451 0 R /F66-12 635 0 R /F26 260 0 R /F24 256 0 R /F64+12 492 0 R /F67+12 693 0 R /F45+20 357 0 R /F50-4 378 0 R /F19-20 387 0 R >> /ProcSet [ /PDF /Text ] >> endobj 696 0 obj << /Length 3219 /Filter /FlateDecode >> stream xڕZmܶ_q0 D [(zi?mRE8 (vJI1vw. x%"gf៺)Miv=~/Wɰƅ?~w:QqTŕI"<'Pq~iOO a7r{&z(=n[o~W:Qt|8pE—YHTqA1|jxQ|]V]l<̣LPQ&M q_y0mBڭ7#x{fkZixܱ'na|E0AfsS~Xi BfFTm '޸H<]Ϊvm p5ۚO; 7rT~:8Ҡmx{}^ ;bst8JU&7yFq/Bčk8()rP?? b':4t<>?Y;( 2̠-*Xgbŵ6o}yzgz79ޜO )&'7aGUU* ~?9mM?}oʹA Xh S+m-68垀Z-4yh(W!tqyݞVdl7CYC2 9k]Eikx^xj9Y8O<(+^\Wbݥ-~O7;~yӉ B:}{:v$JnGay[!78&SH-]C;rгcÉ}'ߣ-Moo[u;c *B"e&%}`՟de*,p'gŗ-¶([GW︗mz.Bnm,ޅ:-ZisQ;v+!`. N9t^c%2TKZMA̶dv (](=oc=avT2R2WW3ɿ.bZDU^U26rല[(BS܌{uf$<6GfۡJ9V%tVř#=ٞ=( H*ѣB4?ջ% k: no!O,7#hAiF f:fJr[C#΃ x4LVG*e꿳<v^/8u+gCmTo-nqd6Z"hق~|h,!(c>OFh)% i{HqbCGXkń[fev+Fr,0%F_!C3p(Xć[seOGfm$8:T}qUio@Oǚ"YYb0H7MgyN! ЧzM:p[{ \bW<BE:*Ru05d*2fzk* j(GP48gC3 g4AM 4՝ O* f $ióPW aKYRs1-MIz%Q^Taaq*ax[# UT$EvF@Y,H:/SStz5Za/8^I s kQX*M7/JhV.m^uF Ygxt~}ͻ2*[)ǂl:KMsESݮ~#w[ۮBl"FIr*eK)> endobj 697 0 obj << /D [695 0 R /XYZ 81 752.9534 null] >> endobj 694 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F47+4 365 0 R /F15 266 0 R /F18+20 345 0 R /F24 256 0 R /F41-8 338 0 R /F58-16 443 0 R /F19-20 387 0 R /F60+16 454 0 R >> /ProcSet [ /PDF /Text ] >> endobj 700 0 obj << /Length 3058 /Filter /FlateDecode >> stream xڍZm۸~͗ȗX)R/ 4)P8 [ڵJmwHI^ "5 gV"VZVjw.Z=@ mY(̣\W:ѡx%HE?: n>>7q? sկ{_:e Pg: *L(v+;;7!XcV^ VM*a2NBzS*BllNf.-5%yƉJy*pc^ ko\ WǝSOŖD[<wq`8n`EKtUQhJeXqMq8n1kG}>SjY~@cZmj&/?+aЛgl;p DN9]u6h@=OPt?ڋGvY'B&5z"vfE)TՁ_XfW_Zw|Skvjr `ծyZv s6PTrN㏁M]@m|I!5q_Ѩ$=NNE X%WQ]arOSDIh=[w8:N=I{LfKDqEvіaW yF eXgMa)&edǹ6[]{O &Ԅu&f@Y:W֪0"޿O>T[`C_ñ*Ybh%?;h"p/|ò!Q( Z߀Pɜ+?TǪEifwx|A"q:?,),HRPQp;#A:t g:N>pE)XZ=t{gBi vcU+:4['"Q",p p;kL䯻}-XDD g(*:P:h=5Y*גǐ]t>\*r3T ˭8Wç'v Lgb|`KR>sn*g 4ԶoPf NIZF dE9ndRn*C4ϢT!SG<)tj]ŝ1$?H"Vm&{2pq*,ngCj1&굔&8 d 6IPb wdQF Y\S %h1L"RfcL5yyvo`9X:ۗg&'sZ͌ۥtrQ}_jL0wwB -&]ͲCUny$~JL)a5Qm_aR[Zص䪒<'Eؕ>U ӽk8 &?+ .axӷbN՜ROLT%tC@+gذAY>Щa$ +E~/vrmd+)7~O [[)czsj|U 383?HN|vS[(B౹?eO|GD-<f3b -q܊QJcXkCniSFJϡ)w|vWIT 'r,ߺwNĀ@Q1&qQ4^o#]/}5\[ kNoϮx5}@7@d#P0gg,$g<~\0o%_KBU$th^. &bendstream endobj 699 0 obj << /Type /Page /Contents 700 0 R /Resources 698 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 704 0 R >> endobj 701 0 obj << /D [699 0 R /XYZ 81 752.9534 null] >> endobj 702 0 obj << /D [699 0 R /XYZ 81 732.6296 null] >> endobj 703 0 obj << /D [699 0 R /XYZ 81 717.2907 null] >> endobj 174 0 obj << /D [699 0 R /XYZ 81 627.1038 null] >> endobj 178 0 obj << /D [699 0 R /XYZ 81 593.0028 null] >> endobj 698 0 obj << /Font << /F54 335 0 R /F15 266 0 R /F43 350 0 R /F18+20 345 0 R /F26 260 0 R /F19-20 387 0 R /F24 256 0 R /F57 432 0 R /F41-8 338 0 R /F50-4 378 0 R /F60+16 454 0 R /F47+4 365 0 R >> /ProcSet [ /PDF /Text ] >> endobj 707 0 obj << /Length 2659 /Filter /FlateDecode >> stream xڝY[6~ϯ0 obFDQ*n, ,OM4=`C -O6'LY67h$a<Oz/Gj89=ؽ'ۊ7Cm *X%O86&( Uhe3E z}(V&s`2biOqkʂ$J2- I0eKKYW/~iekwÒ8Y;^ }S27EL?$8 GrrWhU8H8c6h@zv޿y7j'؎ :.k#A2Y*Bʮەeaf:iO/dzk}UəgQ6H-l{k+ο8me9mǃ#b|4jPuWs6& JMp4[9pr`%;m@ VpDA+ ){هE~@z7TRM-Qa\{$dw682.(Ap4 5G($[t~ eThI )Ok~0kEdW{~,@ \*wKظXZDTǢ/*۪AwO_[``Hy) sHcAʢJ@Xe,°]DKYy Ȗ~Ao!%˖ -9Pz(>d'!xR&P[¯tgr#,pd/v`pbC4w9OP~8H9*@Tr"Wq{|'|&lV@ME߰ㅄNG /iK0vtA2eW:|qUrQct 4Gʦ@4_3n9]]篟 !]&R *K0|4|τ&?!r9ɥL-R56,⹭{`RjZ E+ۙr2fvZ|-.有 ~)n*%AZ(L/._Y2`w o6*Fv8H&O%C_06sP\1\$;U3'r&IL7:9#.\PA}aNNp|`ۖp9m#ێB^hF/t2#<<<@}<1O%_N7 ux3؉X;ԁ|^S;(0i $H \_=)lTlD{lKeO+ ^5 Z]]H.2>F4BZ+[*?NzE%*DxbG. q8endstream endobj 706 0 obj << /Type /Page /Contents 707 0 R /Resources 705 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 704 0 R /Annots [ 709 0 R ] >> endobj 709 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [312.5752 577.7742 325.4768 586.797] /Subtype /Link /A << /S /GoTo /D (cite.flex) >> >> endobj 708 0 obj << /D [706 0 R /XYZ 81 752.9534 null] >> endobj 182 0 obj << /D [706 0 R /XYZ 81 634.1347 null] >> endobj 186 0 obj << /D [706 0 R /XYZ 81 456.9175 null] >> endobj 190 0 obj << /D [706 0 R /XYZ 81 253.2284 null] >> endobj 705 0 obj << /Font << /F54 335 0 R /F15 266 0 R /F57 432 0 R /F26 260 0 R /F19-20 387 0 R /F18+20 345 0 R /F59-12 451 0 R /F64+12 492 0 R /F51+8 393 0 R /F58-16 443 0 R >> /ProcSet [ /PDF /Text ] >> endobj 712 0 obj << /Length 2775 /Filter /FlateDecode >> stream xڝYY~_`W>y$ȃmx,8H%9俧IQ;`fj!O-rȜ3v]=L9*Oۛ߿sv(d7w 06'7_zLyۤ~k_/}uTacuo_}vZND$f~zaּp١+QS"9^nUG|Z"r) 4 qCmRlI\s-6?õKiRAxS-/Ҥ=ڦ5f.ꮙϕoo4x]}6t| X!x*?|mٳ{4W>?1Xm۱lޱhϓvms=7'! nvwx菰uY Vjr1pC>Np/ՅЩc˄ dꩾFhq "(ŀ"҈"&h4YvVVknj5Z-\] r#\/`δ':HwicW%o7Zgf̓yQt* U]Tyܿf7xQ+Zv[U ZHg=\M_d̜eem.,xFj=%8]1oV`vQ2?*K!,! i A{t z}ܮqH=J`*}5Dv?/ !02-r 6R-}DBBU%NI]eWfd:vD2-ƌ4^\ف PN đUQ m?e n˴8dIaɣܗb=wN.U@: 55ᦽ㸴V [5p.)9J)"??=+84ok-R;fW :x击~ijϿ\Y_Z7-$MciAUÏ靇FTSUX לf Q1[gbSSlH %Kxo.XM)<`qa -؄#M#u($g7M}\Hiq70}vIb|E( †'}'{M(}c\a:.ӇiPW)rF7lN qL} UΕ!<`c AၭE $B8:C5'nV@MQo.NZya'9 x= J}и朗~Zpʫ}S=ۓyWeӰ[KϤD'T>g,p\5)?_Q.֠WR"wG&^쮌e~^tz!R2h{ښ^tp'Z:\e$R N'0ZV5Oz*$6ayW\iMu#pP0FO-3PBů_ÚpѬΧ/3Z#1:Po|1 vݟ؎ȸ3}V$ UHM`w\p:{NN;@X*MŇ(SЃ쵾YaT(>E_bdm䵀]Oiه =[~={jƳ'l;kU=xoM(E[w1nJaM:Q R >ErSR~C7%.w\ sSnC ǟrAsgfop'9G:h8~GjfVXyfTϓ7)d!ݠgp=@wŔ+vet~OU\_B;% #PEs_OPQFS40rv|F3P ! Uʰ|qѵe!OCM 67h]~5O;wq$̢0b/h{dIpbFwnǫ 3DN?=lNu}@7S ᆦl (nendstream endobj 711 0 obj << /Type /Page /Contents 712 0 R /Resources 710 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 704 0 R /Annots [ 714 0 R 715 0 R 716 0 R ] >> endobj 714 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [161.0782 441.4235 168.5253 450.4464] /Subtype /Link /A << /S /GoTo /D (cite.CUP) >> >> endobj 715 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [442.86 438.6963 467.7614 451.5979] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj 716 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [103.743 325.9997 128.6444 337.9922] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj 713 0 obj << /D [711 0 R /XYZ 81 752.9534 null] >> endobj 194 0 obj << /D [711 0 R /XYZ 81 644.7846 null] >> endobj 198 0 obj << /D [711 0 R /XYZ 81 531.2167 null] >> endobj 202 0 obj << /D [711 0 R /XYZ 81 497.1157 null] >> endobj 206 0 obj << /D [711 0 R /XYZ 81 397.9351 null] >> endobj 710 0 obj << /Font << /F54 335 0 R /F18+20 345 0 R /F15 266 0 R /F26 260 0 R /F57 432 0 R /F19-20 387 0 R /F58-16 443 0 R /F51+8 393 0 R /F47+4 365 0 R >> /ProcSet [ /PDF /Text ] >> endobj 719 0 obj << /Length 2404 /Filter /FlateDecode >> stream xڥnF]_1/ p;ؤ75`M,I(gD3TxX5@`XXM7F j6&7w`!Sݼ~ՆG,RoVLDv6Qwn>-PJt6Akj|7B|J1)d2 E2x*Cp3L: mW8VQPWtPA Y^,@X#4,4SAZ8*;' ׎뷿qTod[w0A;؄\# U,, "+O0Jx#BL p+Z61I]Q9|K=ah!b+I<{勮ZO!sA푲Ŷ }{U\'-U#4ؑ2G-Bm'"6VM G1pwn]6N4zk 0aO~:;/ psef>fK+Qo,I`?o~#7 <;2 W7g2{_B7UҤ#i;O]y,/2>`.!3fz3@h"nF`^EZd֑$ }|Kmz>juNcyhknLQ,M\4{NQy')5R~9 -g}.zhCāW[06uطvҝGkDkO(-)NQ 3bdik07H&1%OH8<BJCO9yP#hm͚ДCGf4&`$ySګL:G9vHپf{' kBd-ǖuza_[9*G5#'*50iMԛkӰВ_7 O)cִrhFӛ? ^Ä0c_9AMI7bZ`e~I˟Ǿ_'_A.,gHa6\"ݛϫR-ëf=#8/P)LsMd0~hj"ءZ ||xY4)6\طީbZqT|YgM-35h"z"0T<AFyWendstream endobj 718 0 obj << /Type /Page /Contents 719 0 R /Resources 717 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 704 0 R /Annots [ 721 0 R ] >> endobj 721 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [237.5299 382.0138 262.4313 394.0063] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj 720 0 obj << /D [718 0 R /XYZ 81 752.9534 null] >> endobj 210 0 obj << /D [718 0 R /XYZ 81 732.6296 null] >> endobj 214 0 obj << /D [718 0 R /XYZ 81 458.6462 null] >> endobj 717 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F19-20 387 0 R /F57 432 0 R /F18+20 345 0 R /F15 266 0 R /F50-4 378 0 R /F60+16 454 0 R /F59-12 451 0 R >> /ProcSet [ /PDF /Text ] >> endobj 724 0 obj << /Length 1722 /Filter /FlateDecode >> stream xڵXn6}߯ &MJ. MiIZzWVJZ_P;!w%Ev\a3sxf'Tx Y"0V,`(,.PIT>2P.S7eY/^Q$Z/hVtfak;1J*/ 0W:Q dA8 JVڳN`TYij '^ "Оb^ WɯrV6Wnw&U}n-5 oh=jV铐½ TKX0=vj[7=5%"qjrth;60[FogUݲ^;If+2p\$toZm#\!Tp⢡/v_MHazsVWt/0~y"13wAmج$Sv4ݐ0NVնcĪJ]K#G\1W`, cG Zkqr{kEyubacAˤc_60M{@ $lC@ ᄐIh!aS,h(XѢ7CymPcKl1AVHY:8Y~kTX2EPb Rʘ6Mo`^3: @#oupH.8m7='y\ua4)*@Rq:QB  u+řDFH/hXVnvΝR,<J0ZN9efW=l 6.0q 79:0p$s(rh9A5cPo#-%ӫovFnUQDHi {TuxKusǁKXocRElC&`ټ]o-FPkQ5 ؚ^c2G|6GƊ)=WerBǔ׮=|7,rܚ`hnV9Q}s4eI1Օx7!yw(0h9 $ hq ^~>I(nno0jfϸgiM?u_KD)TD5>qon|@Mwe"öX)_-X~tAc0T9PQt7~ l~M2k[y$`lZw\p Wmᐥ13mr3ZT6 S[$Tع\ @V: Uғ|ȓ>$.*.} }~{B`v״=an#ku_n5{ ,POA犮Jץ $69[u&.t-u&&fCF*sb#;dBeoPw;`U;**Q*]}9 ꪴ$4|H 9H|$C&EɈU؜WB?9 OѩUi+ʴU~0#z|Fwhw@VI:U&@ZRJo8>P3=bNuɍWMd.Ip LiG$fP> endobj 726 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [464.8843 508.1706 489.7857 520.1631] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.2.5) >> >> endobj 725 0 obj << /D [723 0 R /XYZ 81 752.9534 null] >> endobj 218 0 obj << /D [723 0 R /XYZ 81 566.5568 null] >> endobj 722 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F18+20 345 0 R /F59-12 451 0 R /F19-20 387 0 R /F15 266 0 R /F26 260 0 R /F58-16 443 0 R /F51+8 393 0 R >> /ProcSet [ /PDF /Text ] >> endobj 729 0 obj << /Length 1059 /Filter /FlateDecode >> stream xڍWێ6}߯PAuyH I>4Ei,ECɴM-^gFs9CS/reIH$rsxKX~?>M7ͮأ)z&1< 4 IM4b_°Yɔrc=j'>^FI^fH< iE^RfAM8#X;`)KV`oYL7';Z# cÆA5y%֓0dh 9v@$W%IJg068)z8 irP &[->;!_$Dl 6T}huy)x˻ڶDQ.%% *I%JԸ =▌.=@B?T"@z$wj%hYҩ<-vFk@c@jn-\u rέמbk 2bm9P/GXSLùe;_ѩ (;&6EI"Z!ME~Q oj)MseD)22J[,S4:|g[oIRl8o,7٬y= U캽"X/ ^N Tzm9nt g,AqAh~)AhwdF\fKۑŒE0a͉7cfERCX+ cfH?Ăӽwi{+UI b8\mm&Hg%*Lw4hdBC7X ۱kJjr0N˃ۂjB,ϩWbײsE4 rS}w8[ a(;E`0",.UY0ʁa ׆{yiucā0="_pmZ ]HI\wE9v}kz2 KƮ ~6L)geѷŷE6@hW9na@bSzo!Vendstream endobj 728 0 obj << /Type /Page /Contents 729 0 R /Resources 727 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 704 0 R >> endobj 730 0 obj << /D [728 0 R /XYZ 81 752.9534 null] >> endobj 727 0 obj << /Font << /F54 335 0 R /F15 266 0 R /F57 432 0 R >> /ProcSet [ /PDF /Text ] >> endobj 733 0 obj << /Length 2472 /Filter /FlateDecode >> stream xڭYm6b k-6h.\!Hckf ){ƻAֲLQ$E>$5|?"TJ<axrK;&9xX|q^3GMɉ)5y;vdʏ/:E}M1=D.)3_6I.CCw]^W4e῞ï`blZMzLx\xy\ЩrTϼq^[;MS74,qnedOKXo?BI:,2GiW.STb8c$E[<:ޑcը3 *0(um#'k54dB!pFMwBH&"% BA.٧":#+$A8>!L gF1M$ dK7ʹ-z %@% D㺊hIGIZV(-&CH d"SXG/}YYJ~iA0TSk"]`C0g gf b z 78W/-6l&얰%bN#πgZ$,6F> d/ї.9=H((w ǹ9&wW]^jvXb6Xx, tt),ͷQT9Wɤ=񕝉s~*knsZWVvHPX2B%+GoE *Dp"1O $UBbI,פ!OOyQnI+t{{L؆MAdypfb Px"\PBwzz]W0SBlyKCm =u6`~ѴV=5 (Sm$gӤtPYC!'G@B}TQ!|4(:]6O+0a<5z#EY_Xv;Z3ohˏˈs@?= }g `*A D_!DO'!/9a'QT=Wh}wLˆ69&r9֭hL:xz&E M{ S~;=I <#vydgEl UM 7sҺԂ5ʹWY[έ{l[@bIie>`A$bs jڂ銱$ءfCݨ6FdqF4F,PϺK4R{/Bs*FPxZߐ`hyvLJ;&pAԍn` @|bģGC͡%݈ZngWm;p2Q=柟\Lrnu2I#vg|(SAt[Z!ɓ6xH)BtM>RS8l)5J9 _?= GT~$6]z 6Ŭ;QHOh"d^ѭ#`חOt {(B[B%4L5"gjg1%Voi\ܿ˷&3=GznN^H{<mf䵷I嘋pU{Ζ5!]> endobj 735 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [313.2424 493.0525 355.6229 505.9541] /Subtype/Link/A<> >> endobj 736 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 0] /Rect [360.2755 495.7798 367.7226 504.8026] /Subtype /Link /A << /S /GoTo /D (cite.BYaccJ) >> >> endobj 734 0 obj << /D [732 0 R /XYZ 81 752.9534 null] >> endobj 222 0 obj << /D [732 0 R /XYZ 81 538.5911 null] >> endobj 731 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F59-12 451 0 R /F18+20 345 0 R /F51+8 393 0 R /F60+16 454 0 R /F15 266 0 R /F26 260 0 R /F19-20 387 0 R /F64+12 492 0 R >> /ProcSet [ /PDF /Text ] >> endobj 741 0 obj << /Length 1426 /Filter /FlateDecode >> stream xڍWmo8ίXVĵһq_XtB!YH6$f<6FUUxWϊ?H"}2X߇0lyC'`!8Ky*LI pI\/Mn[W8'eto Z'C581bL8 d/b0PC8~;d]ݴ=@( O0, R__yzkbc㳧yG1_c}5/rM#? >2O`dVݗVm, oWo~@8C˚V5H3WԾz0/ﲒctz]*iFjwvz_j,GQc,s;{BRG%IiI &BRAU 7;}ręKnT|[<]#I:]mC .^v--zvފѺꆹ^λbD:Yeso (ho #p&i;qa#0s N5- (Q ϡι<_΃9KVhppiEg=#4E?U6eDehn~ ZpԆR,"|>J1!#؛d(G$NuD(RMpː~)dp6^&"\ ˖qU;<әE3;WZK"7/O&!0[ӺQkf\|#J&= = q!d+]ݘqsvfgf·gbt܆)$2~񨥇3Le(5/a@tJˌ}u}d0GawX!cT7Koi£A:?Ν6 ‚VPoն+L=bHȨ\!#83=Ɠpñ> endobj 742 0 obj << /D [740 0 R /XYZ 81 752.9534 null] >> endobj 739 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F50-4 378 0 R /F47+4 365 0 R /F19-20 387 0 R /F15 266 0 R >> /ProcSet [ /PDF /Text ] >> endobj 745 0 obj << /Length 1578 /Filter /FlateDecode >> stream xڥXKoFW-74nKAQ$AAQ+E ˕|e՝>>h(U]Ye~imcs`ʑ/ذs\?L]^զު>p8|QtSV#Lqb1!nI7"!P#&; RB(8ah\d403i^ƮiuuD:5 VX8O0L &2 ]?IvRo1zraAwRgn?*!ӴC &BvPR)+45RE^U(>qF/QK2A0c?'Li nO$A:Ϙ|$+dij Hܮy8 Xմ G\vi;&V抗J#hI/Xe[ݸi_Z0O]q ScáeErs?GLז@-iA9,̬+CT쏂G3pqK$I #+^/yQ|1Z=[ RIx#G1A&j{*m;rnp3mߍCP792W|iQ(Bd뉬ފ81-c.Bq) #?˦a~xnI~upcύ2\W01Id E)AǡT02sK JXfz p+0pzggg݀ArkQycR;#mm'J@ 3nVe# +[p˹2-'f=:Qe@.ZbtHmjCܫa7vB8;ސm'󺽲qs`A̴, ،Q?riT(j^ƘTwq$GeKnF+;"WN렍t8<8%'i unoM8Qv#~Ѐĕ~v;q0 `cendstream endobj 744 0 obj << /Type /Page /Contents 745 0 R /Resources 743 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 737 0 R >> endobj 746 0 obj << /D [744 0 R /XYZ 81 752.9534 null] >> endobj 226 0 obj << /D [744 0 R /XYZ 81 212.6491 null] >> endobj 230 0 obj << /D [744 0 R /XYZ 81 176.4269 null] >> endobj 743 0 obj << /Font << /F54 335 0 R /F57 432 0 R /F18+20 345 0 R /F41-8 338 0 R /F64+12 492 0 R /F15 266 0 R /F51+8 393 0 R /F26 260 0 R /F50-4 378 0 R >> /ProcSet [ /PDF /Text ] >> endobj 749 0 obj << /Length 1578 /Filter /FlateDecode >> stream xڕXMsHWpDa4ޜW*:Jm$R oa~u"#D,5J݄kX~ o]7|=̮g)OE0_R+Pid8ߔL§b?z)lw"F"o5>e@`ER0ء\d{Dbi$cp^ǺA4pE!: =eq##Fڈp'fxScÌV m[?K-| }.J\юm#+|6z^a$gσH(ft*6UC Y-ˊ?E +?UvK+͆Lpԣ?tW][g9,'r+#Yвo-m (6L ANz_,Xy=OvqfRJ.+ Q@ H^pa<}Ek{G?xψٽm\؈U`OJw͗rG`ԝSհX84SHh+httDL#gsLse[<ȳj~ ZjZٴMZTT R6ޮ +9JPwX"8lk{?[++*X%ӅPqa J]=Es!Z%[VLHᇙZ]ݞj( bܥt6h&O BuAKJA8+0Z[ejOǡצlTfj egLIL0cJ7ȯm$&HZ֦6k6} a4wa@3 M,c@A1-X)/ŪCUrO\5H~Ǭ:ۋz8bE,ejKyc,yo}^eS|t\/CNb7oDM#^_B !stz+)VIaU\0ST>E 6'"z?[|}?y[df޴C1aqDBh4QG"J琞(7p g ڏ$}vHoa:]C6 y_7%~{{K0ť9rե!hD{WsF}f| ̤Qf $B*w,v|LLe"F&" ǯl'& )֜@b0ShR3R3SzAZ-Q &sq28jfnc?sԑ-E0@yjh`LgQ F?qmy>,3QYR^ZϜ f>lоԀ̀ ˤd?8',LR *]zXc0f2HZ3s;_Aendstream endobj 748 0 obj << /Type /Page /Contents 749 0 R /Resources 747 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 737 0 R /Annots [ 751 0 R 752 0 R 753 0 R 755 0 R 757 0 R ] >> endobj 751 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [437.0646 614.0073 443.7895 627.2162] /Subtype /Link /A << /S /GoTo /D (Hfootnote.3) >> >> endobj 752 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [486.095 545.8891 492.8199 559.0979] /Subtype /Link /A << /S /GoTo /D (Hfootnote.4) >> >> endobj 753 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 .5 .5] /Rect [135.7613 479.7226 189.2988 489.2909] /Subtype/Link/A<> >> endobj 755 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [89.2191 105.1203 175.9488 118.0718] /Subtype/Link/A<> >> endobj 757 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [89.2191 94.1614 241.5489 107.1129] /Subtype/Link/A<> >> endobj 750 0 obj << /D [748 0 R /XYZ 81 752.9534 null] >> endobj 234 0 obj << /D [748 0 R /XYZ 81 690.7352 null] >> endobj 238 0 obj << /D [748 0 R /XYZ 81 598.5642 null] >> endobj 754 0 obj << /D [748 0 R /XYZ 90.2154 120.3632 null] >> endobj 756 0 obj << /D [748 0 R /XYZ 90.2154 109.4043 null] >> endobj 747 0 obj << /Font << /F54 335 0 R /F47+4 365 0 R /F15 266 0 R /F26 260 0 R /F19-20 387 0 R /F29 342 0 R /F41-8 338 0 R /F57 432 0 R /F30 410 0 R /F36 417 0 R >> /ProcSet [ /PDF /Text ] >> endobj 760 0 obj << /Length 2451 /Filter /FlateDecode >> stream xڝYs6_{8j.َƵidјyAPAmcJ-G,-5$dY Ey3Ih BAds KMjgΦ\[4\ĮYapϸyC~sk<҇8AL#!&̲> Z/P][Mi+<^E:\^C/ЍL(7acg8{:(B#Lf2 ,,0 ۅ)Jzqa7f.'聜 #1c}K0-My7G|3x=7&-Q6y"b”YC[Q,1^w&n$ʀ]?1ͳ§!! `aD )u_op00{R[`r-b!)4dM.^PKC[xIH9s7W馬zTL3IY5 ġOFRX[|;" ߤ6_|_5[U^"q^"y5(bnl X IUɧ<1 OS66ahH0Pج@lƌDP@%3PCu'ض@[weC,˟rUf~mun.7i+s38_3#Ρ2U>Z-ğ36σEdb"Rǫ|)kwXtm:KxRo (rQ?z9(ICRB$b@ỳSs8{ vCۏGL(.cíbg#h QtDd)J!ia6m$T@KO!Γ#7q;u}}x kPE}>6zh~5!4DG1oh 3Mt|,I]nE 2%Ek|{$t > endobj 762 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [108.4886 630.6206 408.2961 642.6132] /Subtype/Link/A<> >> endobj 767 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [108.4886 544.9419 436.9322 556.9344] /Subtype/Link/A<> >> endobj 768 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [108.4886 472.8124 310.9335 484.8049] /Subtype/Link/A<> >> endobj 769 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [108.4886 436.7476 402.5689 448.7401] /Subtype/Link/A<> >> endobj 770 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [108.4886 400.6828 282.2975 412.6754] /Subtype/Link/A<> >> endobj 771 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [108.4886 364.6181 328.1151 376.6106] /Subtype/Link/A<> >> endobj 761 0 obj << /D [759 0 R /XYZ 81 752.9534 null] >> endobj 423 0 obj << /D [759 0 R /XYZ 81 710.8676 null] >> endobj 420 0 obj << /D [759 0 R /XYZ 81 710.6539 null] >> endobj 421 0 obj << /D [759 0 R /XYZ 81 685.411 null] >> endobj 418 0 obj << /D [759 0 R /XYZ 81 662.8955 null] >> endobj 763 0 obj << /D [759 0 R /XYZ 81 627.1337 null] >> endobj 622 0 obj << /D [759 0 R /XYZ 81 577.2167 null] >> endobj 585 0 obj << /D [759 0 R /XYZ 81 541.455 null] >> endobj 465 0 obj << /D [759 0 R /XYZ 81 505.0872 null] >> endobj 464 0 obj << /D [759 0 R /XYZ 81 469.3254 null] >> endobj 738 0 obj << /D [759 0 R /XYZ 81 433.2607 null] >> endobj 584 0 obj << /D [759 0 R /XYZ 81 397.1959 null] >> endobj 419 0 obj << /D [759 0 R /XYZ 81 361.1311 null] >> endobj 586 0 obj << /D [759 0 R /XYZ 81 338.3126 null] >> endobj 422 0 obj << /D [759 0 R /XYZ 81 304.975 null] >> endobj 758 0 obj << /Font << /F54 335 0 R /F26 260 0 R /F15 266 0 R /F44 361 0 R /F57 432 0 R /F19-20 387 0 R /F46-20 384 0 R /F58-16 443 0 R /F68-16 766 0 R /F51+8 393 0 R /F52+8 398 0 R /F50-4 378 0 R /F49-4 375 0 R /F29 342 0 R >> /ProcSet [ /PDF /Text ] >> endobj 764 0 obj << /Length1 1014 /Length2 4871 /Length3 532 /Length 5555 /Filter /FlateDecode >> stream xy5m*$yk XppH_+H,G"1DCbaN ƺ8}NB(% ^\Vãh,$.)BH7uJ O(GcA iA"W` گ$ 5M2 _$ #M#SԿ ?TJ6.qS)xSe?Բ_(~wOQHT\KX yH ~6A'F (@B"ʫΗR{*RVg  1L/hkY*%vOp8s;լTꯨU3 m͌OB'N^ZOYzg*͹(=흝KF_O?1Z}A!L<`7Ke9l~o?Ő E1"D nM0΀YV#:2 eގE:gMJ:cmذM̼+``yq QOP KCK^كha낥N~DRpVb7 p=,@M *ekDrV4tb>Of1/숉op( %߂Z֠H'4oM^}E'w yuYhj >zf]}hE Qbm{| c }[z-~xIkrIiD85sq;#ZtqQ/2u2,ru^x*: YmMK\㘻'_"VR-.]FPj2meOn`Z@:6CHN՜wUrXM'/i>zx>dtԔfAEEy ~h0_Fbc`N؁jQŰH#L= !_]yC0,JDwcN$Pڶjtp!~JrlTOf.HlyW0ZI}S ـSr3r٧<;~NF%K ~)5 7ipZ6$aA?32ذ$&k-n3 3:cq@*O H9F}}O8+e hm2Rq,%(#^|?džCxQ/KdafN Wڕ7F%M7Ekt|b^u$B"f+2Iu#,6cz/ՕHj2_s0  Nilp bj`mpkZ+tp~{kbI[j,_gfvU}[l;j]!MVku+yU:7ߟٚ|.yM"ۈȯҺ-$ 7g|}g`qBq[Ȋ\?!ݲ&# T // # yu> b78hnqջ @ߑ;w*2ИO?a3=xcu>`C@bBi'-@Ԩw&KR %k_3.7`tqm|Xȃnq2{@Gňn ovI"MʼnRJ8듳8ܝ s{Y^>U!*wV[r C6j-Ǩ)v‡nv5FlQH'캋-:[0qݳWi4цۨSwY,IԦv*{;biQuBX!'uvpW)i{2 c/bU=ښ qxOa.{1j#cU\!jY`VY5`XOFaDrDZjyܕ&pŻf{mMs4ԏJ^oƭf:3kq|mn5o솕 \<&.p= nmkfW'i:a`bEQh1эyN|gֻ,i)qleW2 Hk>(4;ƴz_#<Va8'Fj ZJ 7.efjj|<t!Pgm$&F`m|+=je[H?9%pQn#3l-T.Ҥ蘓ǙpnMOTustQcN6|,`.p1ΣWRLb4T5Jc4ie01# aϑB3OXa|rökۑ/0~6 &&_ȏ$ڛ&UY#9UYR' 3%}w8'8.C{ذ1$L~M4u41V61B{l>ij\;(*  ȷ*c~fml`BW]-_tpϕfL.غ6' %EF8)ySL>7NPBLɣĥ ƶ jyQB/+%^i1K_LEsq>SZky!ACj1*$-ͪalAUoO3dS_vs\[Bp#ڋ5zQkȲ 'E),^#=:^w~)۱@#`eDSt$je_Rį=t䲻$骬wؒ+Co".O'@[.{F2Nx3Uڅ>[)|s<ϓg=7U'B~> 4;fO. $iTs6f\zV\ ,)H@(hy.e XZF~`elUN%SkjY-P(3ƌ!T.+~@$".ZQqrKFV"8Φ~T%h5_4&ݺ`[hܓ{DJVbd ^K9UZp3O]w | Fu(°$˹; \1YN}pbj51ܰ&bq"[U۔?+Ghh[qɡ9'mڲFԦo=Uf͗xecsUq'O8Oa+'TrG]ӋBwq 7.YKξctq>.1V{M{nJ>CDzוRZeM+YBˮew4M7$y@q$ޟ[G?YRbDv-*(dD_Y^Y:[R>E"E}l& Ԗ&ooSioD|8l`cC|֣,RAvX&s Qn p2a`ΙMA`.Cn}ٚH/X nCW/J6$96ZmW'<#/|Eն 3mp> '6c::jp²m?_ n N*zz#Oݗ/L2ƫ]mvK6nd"Iw^kQR O~>ߓj yN\.Khg %Xt*ecDxO7w㍦y7[.>jqƗ*6}KZmZvVh;]X]Z o3 vf礒q0I#Bs-ijxKNn:>h7@6[E3Ulo|U /1=ZӢ@" 59>f|xv;_+)}9NN *xi-uY˛R!׽X_n!ayaί8ui96g]3c~a `2 d ORRz3Tnlf>gDj,mn"Y60joՌ(m{8:S'nov?*QZ×]~XJІ$oi.d"Yif u wkAllccE Cö'VL+k*LD>=> endobj 765 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /IDPEFB+CMTI10-Extend_984 /ItalicAngle -14.0362 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/E/G/R/U/a/c/d/e/g/i/l/n/o/p/r/s/u/x) /FontFile 764 0 R >> endobj 773 0 obj [667 0 761 0 0 0 0 0 0 0 0 0 0 718 0 0 731 0 0 0 0 0 0 0 0 0 0 0 503 0 453 503 453 0 453 0 302 0 0 251 0 553 503 503 0 415 402 0 528 0 0 456 ] endobj 772 0 obj << /Type /Encoding /Differences [ 0 /.notdef 69/E 70/.notdef 71/G 72/.notdef 82/R 83/.notdef 85/U 86/.notdef 97/a 98/.notdef 99/c/d/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 108/l 109/.notdef 110/n/o/p 113/.notdef 114/r/s 116/.notdef 117/u 118/.notdef 120/x 121/.notdef] >> endobj 691 0 obj << /Length1 1027 /Length2 4809 /Length3 532 /Length 5506 /Filter /FlateDecode >> stream xeXT]ǑT:. FJšp`bCKNiDCF7wPDg/[ʗ1uĄ|_ĢF!H1V1[0j0x3f0c_ipc!|ȑt3z~{#; {gA*/vcS|q6VN_ f>eE!1*8HD]}r -=ۢB/-?gwqA{¤qUq*~,] Zm1%hV-L%#B8?vc|'lfodXbS6P[l#H4. P\{yF܏PpLI{P@H4fqOMSkW^\]/ aҙUM1.b*| n1SIk|)MJȈ< rx{3% }ZR}(B͑BYF=[EJ-drZh[kU5>-[S35EŻ;G*@?VAӱ/!l<7Yn|{:O īfb+c'"}ޓCݽ8ȃ?p$3DՒv$;gG>7)XhMtKq;LR*BQ/$XRuRҖ8X?ȫ=}pAKT}1D-_Zs Ziy+YRwgE9;: N-0I'obEy{^<_eӒQUUgW.'mOc"wQ>3:`3C%E=j]Hpɼ.yz(- Gt*:X h& 峓rewB&&o:Er6&oNӛV1jGw yiYڰΝ>n WpųF)tG .Sp\4gtopW7{1 ,=%2-`T /O(F튒$gwSFkQ"g'#66+nR5ofӐSy o/4tU<ϕ{H]E˕ܐ>r33>ۑ{L9P7PThvSz A`,^2![,@>lf1|s,i jCqw'- @'A/DjqP" Af=it6'|e'5L+Q9i*W7@nIii`Lfɖ`d4WyK K\ uӖ!vVoeACT2wWE$A#? yVPskmfܹ7Sہe|LxV5'V:]r1FRB$["~›oT meU7)Q hgiOS?5noXqdDRPvʟG(d~D6nboC' \'I4jKG|~?o;ʑPdհ#e2ξ"7b8~,UNPܺ8`B7A=s~J#ĕLSGDTPr{ y 7K~2P[[i# R.>t`B(8ѡ/Le%*Vp5i-*~ٖgKۄ湟WԝY#z2K,}{KdC[DŤY?΂maxڰFGn$kDާt9(r\тZ 2YNH{9z%MC))%nػs,:eD,slg\{HJa{!ϐM;H%>sGH4|~.Q˭*6I,VgƲ]4zS5f1PG4.J;-1OOKwֶ;߽Òֶn 1A2&`qG3񏪕E|3tR~ ݃w)U65!t_DkqY: `A _G]xPq 18*00FBu7gl]L&/U\~wLSbў jP`^#U?.(ܢ8Ys8<l()m 9w=᪬gXӐk^>(o1%3E4]#^MqYaU+tXmM-> endobj 692 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /WLROKD+CMTI10-Extend_1012 /ItalicAngle -14.0362 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/G/quotedblleft/a/b/c/d/e/f/g/i/k/m/n/o/r/s/t/y) /FontFile 691 0 R >> endobj 775 0 obj [783 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 521 0 0 0 0 517 466 466 517 466 310 466 0 310 0 466 0 828 569 517 0 0 427 414 336 0 0 0 0 491 ] endobj 774 0 obj << /Type /Encoding /Differences [ 0 /.notdef 71/G 72/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g 104/.notdef 105/i 106/.notdef 107/k 108/.notdef 109/m/n/o 112/.notdef 114/r/s/t 117/.notdef 121/y 122/.notdef] >> endobj 633 0 obj << /Length1 825 /Length2 2085 /Length3 532 /Length 2682 /Filter /FlateDecode >> stream xRy^|A7W-S$Ш!4m WCַ|dkeS($r4XSÂ۬G&፨nd!q$ؐxw#{qJV ׿m1'Կ 3dWW Dexm s'pV)bMxDu4ut pgt $@@JcpKQ!Fl=3hb_!w 5H@7%{ mO?iA0*Bjh]tȿ1>t:Helש?1} 67Ȭ) 5-|\ʧ-,keg $wكr29 QLQ ;RYvٳ.Hne_z 3󰻆G T5Oy\[S _ sZU\|C 1'JVbs9{k#?X֨R[rk7g<ܜѻ׮ӈג7')Vu sǏ&oJu/mhFd>^OHmߧ.6lkrZAԤ'eWD6=I>F= u=3RNz/ ǘ{r]U¶59;SPG6ZB a9=xPe&@^a5L#J~`m4%ǥl>OݱFv2r7ϒv)Mx{2ۤMUn)Dh8x{2w#Zհ\RKoLGW3:Sŷ%4)d˱ x_'G{‹ʥ~ e)Ɠ t}1qCrSZtF Ljߋ [W _Y/1x$9wyqa֧Go^LqNUhLse^]Oy87ٿ̳ P2C[?'oȣ2UR1íOo,'ɏ|R^Ecbn|X/5ě$PǕ;=cd3sdwd(gZ5cgڦե _xTY;3\ᄭkSO)@Qy>Ap` 8^ #]y=j'-Z$&stY'ڭj&'ZKME电{Z%lKQCJѦ;q9r1-" y91Vy O_7aJngzT̡*3I=5\yaOBjNx5{ (Fb/Ԅ:~l7]M8]2qs6vRw*]xP$!%lG\̅ v9Ա;_N@7T\cͯ_q/RRhrcӘ_3O2L\]|!J}aEYEcMsGrzc^wR> x:Z%xhd^x<:l{r ѯV$qžFeGrUgΘ%%@ YPҦc Wy3şYcq~@]zHe.wM$MT}9q!`D  dGg(8'Pendstream endobj 635 0 obj << /Type /Font /Subtype /Type1 /Encoding 776 0 R /FirstChar 105 /LastChar 116 /Widths 777 0 R /BaseFont /XCTQUF+CMTI10-Extend_988 /FontDescriptor 634 0 R >> endobj 634 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /XCTQUF+CMTI10-Extend_988 /ItalicAngle -14.0362 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/i/n/o/s/t) /FontFile 633 0 R >> endobj 777 0 obj [303 0 0 0 0 555 505 0 0 0 404 328 ] endobj 776 0 obj << /Type /Encoding /Differences [ 0 /.notdef 105/i 106/.notdef 110/n/o 112/.notdef 115/s/t 117/.notdef] >> endobj 612 0 obj << /Length1 906 /Length2 2934 /Length3 532 /Length 3559 /Filter /FlateDecode >> stream xy<dz%SŕIf14lYR5 0f$J"DR-ND(-[YVi=|s]\s>|?9_=X"4ӘHRY;8  IӌLP@b0H:7Ab{q"4 2OL/AS{: 2`B~Tv?8 a$ L$ i$:+Ld: 29PcHQ"H霳@ S77aQ(x?x*_:՗2hKYD2{֜ X'4Z0_q 9$ڒ/`? ~ڀ=aaoS{?x2 ?s 9_~;͘F4OJ3 q 2` 1F39%g2a΀X6?#t478p¿ qA_SK9~AN+/ !'p5hjr~hcb0@5o&9@xE'z_8zW WefD{^8K"q"™GDjT>65/*(-ȱDuqn{,D0=0@#[~@'~1:=4 9Wg{?r=gJN&Ylc@y[l̹<-VdۓBrcҼ7B%ZYmWν[ҧk7τKgoJ꺗wm/a.ݖnGxZLSO=0bQa2Nhl<.D+70AW'{nZ]9;"_ Fgx}sN2yl$~,{F{͗N 1q-\6'͘?f%n{tSkp -]g}ԲP ڹ{aWxŴhp4~1 oQ4y+=qr~v" ŷ'/YIX,5V)qr"s&_b[BtVs #7%F4k7Uc#e$1ƛR+?v&lʽvymk6KT|hi!wzP Qr~3_ay%cAvlXN>j_wjos/GySa*A7y3fNhw˘(>E""^g-$SKO4Komm},Xܡw;_v *z)'u !aAoto©?|e3=_3KJ KE dYv'rP""enIH:\L޽EؠJQBދ+/G4;glOnL;ҧvEu?|d{->I>zDn]NRP㏡AЫ*_.q+{>qDndN|Jo j3wzh]˜rS&V6W >r_5bxc5fMdLDdz(߱Ãm=j(FӞ#o3ӡ.Ӻ:þXaqʂB5oL>@+;k~7`x5Ko)y"8}S;,E* 8D?D]D6*feԫ5l;YD~߂ L2gIl{֋];nx?J}ҕ0`kEm'~VmY:5*d FAM ֦b.Unef]^8:ꃍ4^ Ni.Cy8]?nSRMqUo烙eiV0;"3)gz][<[_abC#n^ڙV~2=]܆$ }OeC:ʃ<վ/Z^üPCo UᰩhD5bΧ 3#~t>MnD)Ļ0UA1,v ӳ*ߕm!f Z0[*& W[InqO㺎zJ9髲]f:5N]*(\]ݻOb5V=1C3:VG'Q!%FctpTH^q5Fp{DH?0Ml0<4]MOKir7 ÊdԬFag:9Եo-;*)gU_7T/ox|kV-0qcQ2,S r##? (֦&QWȺ$;暸<{[Nϊѹc[,dC 3az𨭗/mMRqĖ<ŏST4Ֆ>6^#SNjת)bhǬ8ɥ{gTRfj-9W2K3zfziUf1ϛ18Yu1&~i,^:|!ne@ۏ4}-Oڹ‰ ЀbrEs`oM˜-״Rx{jZl^Ƴ*t(5Ζwد^Zj`)x{]VW}''yOw i>(JZK#Onv"GHORuU̵Hj|҈3Ȩ! ^ļGAMXϻ̅\S>鏻Syb>c1|6 ը>fZNMhVWZB E,j vڱ?g#vm+Iik!\RbͿsn$k;4}jE qrn"3m[ Z= 6䬃h*N1f Va]tm"ECKnC_]ۇi.{F"-KǦ!vMNSyF:^{f"}`xwH"WZ;}af6gԜfab#E7?р@ &g@ endstream endobj 613 0 obj << /Type /Font /Subtype /Type1 /Encoding 778 0 R /FirstChar 66 /LastChar 116 /Widths 779 0 R /BaseFont /QYJSJC+CMITT10 /FontDescriptor 611 0 R >> endobj 611 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /QYJSJC+CMITT10 /ItalicAngle -14.04 /StemV 69 /XHeight 431 /FontBBox [11 -233 669 696] /Flags 4 /CharSet (/B/S/a/c/e/k/l/m/n/o/s/t) /FontFile 612 0 R >> endobj 779 0 obj [525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 0 0 0 0 0 0 0 0 0 0 0 0 0 525 0 525 0 525 0 0 0 0 0 525 525 525 525 525 0 0 0 525 525 ] endobj 778 0 obj << /Type /Encoding /Differences [ 0 /.notdef 66/B 67/.notdef 83/S 84/.notdef 97/a 98/.notdef 99/c 100/.notdef 101/e 102/.notdef 107/k/l/m/n/o 112/.notdef 115/s/t 117/.notdef] >> endobj 490 0 obj << /Length1 1718 /Length2 11241 /Length3 532 /Length 12223 /Filter /FlateDecode >> stream xeTͶ`;65Cp$hpww$գǞZk֪zj@NJ/l`l&`JWaf0301:Z9؋Yf/?v6v8r+JAa;3g+#{0-@Ջ lk Pg @̔`je 06cGI_aS7~nPK4u1*8]n FvQc#;+[= `jlC?>v5250WET`ndbJ;/Fi)YUeyҋ{0318%#+{W5/Wg⿘;l a_SM?jۛ8Z[X9FF^p$v3` \#+p #?3? < `trs_0(``JG[7?6џ;O8 XObkb'`6sv:؛ف<+˘]v`{spkǍ+)Dp迉X_K!`d0C̢YT0!?̩onDn6m?; l6s!_ω -Bz,B:L.Y@'(e e V!/Z9@+h\B_r V~@+ϿhBWDD<}Yؙv?F9_R]lVny7:)_g9$ EsB}\'|7P1Y':HDx.QʓANi 3[43IOۛoOAg˒ .N7~ԔȰU`%VAIs*` _@IJXi]rpC{.M|}C5 bU٦P9<-- GAPuCIgUgy7Ğwk$~#[/5`5,Y*bL(p|~? By`j 'rpgA1x 0H#3ᝬp>.Hl\nSM+6nF5j(Ԣ~'NM."⮗.:!4_ Ed8وS;螢ySL`)WL֝Q+̡i;g 0aVλ C[m`'v/ήBr<)"99.RA \\Y0PV?oaXS1$'Z1MX ^ -} ޒ2o_1&xphPmXU= u L c\YX-y@l-t\R5f|1?ms(GlIL  Pɧ*~3v əTjZ Ԣ>=/:ȴ6`Zz "]HYtVy;:!-,or'םքKVzg:QLW_.˸ 6Lˁ (xZ /&˺Nꡘo&?z*aMt8&Buh63tF)_U,.Rf޹̋ծ]cI PJB,LG BL~ H٨BZ?<(|f?U,O+{ 3$m"3^sR6XwbiN ōNJj ˥mF'l¸o7 za]Ve]FG~Gkw=yu2a~O*5~]ӱ7$7Ui2y/fn2nt%^˄ґ+^OZeOja(9hk:)=;vXL' yHd{R #Ɛ@oCjd>n.7؎/.qn׸`hmǦMN­[!,><oN2jnl e :邰4C>c Ml焈. 夽%5.Uia.N=Q k.fSK/t&!rqXӤrṟhP13 .>)ȸ|aP{z4S -mlz$9HZ@eoLJ zM7WD_#,],%҆:* NJ+’zloUнŮ)gy𵍛<Z+L=#"_0x7S "Ua {ys*YfM1i!ӅQAeoL>g"Iӕx?ĆFt۰g]d݊{YOav*)5~)Q!uߓi8 ՚uIIotr4:{j9JK& YeaVy"^@{J |?b xi}%#a4J-d XU:R"u{X&1%'voqǯeGs6G@bm-["eՌ4asP,.Q#jT6u(#~e_th ;Dd[^L<L hbGP |K hb7l7Vri8:!pY7qeC/& ut7wT6d߃kLRNFjdv>z:ka;mmn\VD0)IeAf)h1nK?DƇM@"X(bjo Qtwg toJt]0)u?+k cXǜIF(rƜI֜4\ ~}m;/6Y-y7W#7#Zʥ O8gw_d[9_@|W +r`]ʶqNAg+g~9|u+o79iT4Sd~pqeAy*MI1GgAApyP+BSci'ʣ~mK0*҆+sj, &9s'?}7 C~_!]c1#y&Oİ6 3r5}m]+)iCσ3H+sʚ4\@JixitCN y@ޝY6WÀC8 W'%ĩȞ{Vf?qIk#oᭈr7U?X]d3~ 5YV˗O82XSf:=jfBmp#'A;D?PAW]}brW~n\pQD|֣Q`4~0dNpNeeQ`vO*@C8wE.7rcl.TJab Cjګψ cw0Z5/^uWU✐ot!>6$kφNyPQDy}1s3+|s`>c nkS*yw+-!gO]dd!`ߠ_B_O?URSOQ۷k큲f쀖Aƒ^]M5& ,@V_bO mɝ1vK[4+ѽ-UA )5hmuQyev9C2_G4T%YW_Ժ8 /*rؖOetLK vN\ZW{Zޭ<0O-; $dh} ţ>߶ g kp08bVȢ'b\KNRg̯X}V04[@ e/9ް'HSa.F`P^}TK.J| n*JWJa,q2gG:u $۩nSvKޜ+c](ZnѭIa=/%No["V3iJ%Zi*'!|i*#_NvG#MQ ̬F!fPthMwN.frku8'C覟lῼ<l "kӜh!V[ ²1ndfO뽻o~Y`O-OF"W?tHCa7CvYwpD &BϞ}I1Ǖv7+A・Wfڇ;/}nswuUc}hu#V;7t(2Q|ث1XO: esB]~ ~mZeSq$ofrpR whL=bv˦M6D^F0=սc(U| ɢpokT lbYm&a¡6,Ğugdo' ӵQ1Xq܈7_Nn Ba"ÈDa}EV4"*x4 #LrI3 3k&1t [y-Hw{%@5zD,~LfGa_8"6p(y1M4w l@Ck O=Dϋ<"[¾֬ fє\dXՔ(!,YvsgH t?/bnt*K7 P HD`~Nֿ_g.U92X!2OD#uuF/ ŅԮp/,v<8RY}~U~s } P02jky#;hHK,WK)pD50a-,WliaoO(ԏkn6ov[%:Fa h asԺˊ7ܵB aFdF?iTDsI0&A mcWa6P`fưR<>ذ\^t0=N=xw9$?y*fx̵~ [Bt'{ʝ~5|-).c{bpMX;q/ԋr"! Em$צ ! [tDW~|LWc*y:ΏELᴷqnBcfbnY,E~kڢ輘u ru;5ɆFcD^:[7*a; !f ļhC09Rr13:!7IQ9m!wg5ideB5|֯nv4WVGtJ {:paRv:l;Mb "OZu'`LZ"CmA~B%Wmfv]%,:$\΁{4Lyȏ* *dVos d)ʲ&beޱLJX9'Yzz)݊OML'HE2Wv uЂW!Է9Wh/4R ҟhiz +FX" *cW SZ|}s`pa\27ifndd 5ʍ77>!iQuI`A=L,rw4Rlz^TC!<ٵ|9Ó`8gڤEޱ܎nH,i&?c|0ןC\3ur ZY(wr029F^)V[%jcQϥVB"/eGcP2j'n lH uc\m9Qfl:V8]?5s_4L) 7 B%|~Ss :vx<9y+DL:5(۫=i a[|n&QGfximS kedZfJ4\GLd! YrV!=u1$٥Ͷ{ 3i&x_Mz:4T| elt dnOFW?SVTD@a̙k:Z;PJ%8uSYY;JDOvB=|Z>]X<}1<9FmN@uIpR@ wikT4?ю,c4^y~W%:(_N%V qM?v%p MjE49&`zٰ۾x2z13%lP8eX[pN'G4iaZE7_gHe?D Џeh Vo1ÈI}!dgqe:UUk ~Iq\Ԣ4:5 +`<OXwb\{qI+e.X5 g)A%R&'ӽ~\QhK (ǺhէXhrͿpg[mӺQ `**9H1/@P^B;q ipY6P oݏ ,77`<;H`DL5֫;SÏ7tUYapK#Xށ\JR &y@,\Y?;K]L{#'}g{5*(6"fr<$-O>_D3ky/xl$s+zEE3G< A D1F"]Ǩ^?5lo r.+/tJ%ʱ# ߥayY#:,X3 V)LK@UWrʊXD@_2I|@qq7R4rt'%@)I}և Sh c 6H)[3Qiq&| , *.8AٔQD0;yϷ@gwm/Ee.ҦJFOۖ Nu]F$(/%*[%"A(7<>U;h%#1Y/把QmZ6[#J9Uժg+Iٌ"PO85M?,q=r!l8>$]gq.>:gI' aTKYPhޔ'JW[ZmȽ񂿗Qar @F}Q:y2c-jrK"mHQiG6Iy' z{Gr}\e iKX!E/8kaʞhKlݖ+ji.yC,F7z\Q5N NOuw$7 jT~zsxP- '^Dk6m!Tf."̃Q?pN\?lCvB<Ŵx,ĝO'i6m,a*xeJ^ۏQRp_[XH ^w.~_DG?u#K怣$l SjR/_򨓬gV1z)T @#I*>RN i1D(ߥqyxT1zWhuʈS(_%x%m S$Kj(7Rˠ}_*JZq&e6;&0|퍸1ŅV5gzHwW wNubQ%!M 0IbP&]Oh_[ݯctӠ<݉{QU kkG4 cCԠ|gUd"7v+mh)틐 bʐ^adQ4=I'gcRujd? v3nmtiV.~"fX*IS܏{fW q_@Cܯ$S߰6{}qM1Hg!Yj'p2H#oP8aN6(Ħ AhM-6lձO+^e%L I˵)RXTjBDEԦ0<껙:'G~VwBX{'O)KUX`(&'ueL>){v2lF*qJT ӆY4N 0 Ca.鐛~d̀ ]S&;3xt«E*y*x?lSQݐ-%biTpV[569ju @3pS ϮLs HDe<[4 $_otSYy=}%0qH,QĪ/hF=ֈjDvǸ)tDRK<վ`-! 0pz~fr8d &_wU$3-9̥9.Xr+A;oJ9f-75 dKN<߼ֶHק>%TIY]ܟN6Ĥ6H"ܔs,B'mJ ~/T/|jd;{4^8s#55`7w;ت_ &aP39TBBrԉRsS_uO] %i_5 1]I<7_/Yig%֣Ł@louZ@"DATw lQ7`ۘ^u֢o8%C6U¹j/fͣ4s'Of^?W$053rvu3r_ endstream endobj 492 0 obj << /Type /Font /Subtype /Type1 /Encoding 780 0 R /FirstChar 11 /LastChar 123 /Widths 781 0 R /BaseFont /IHKSQM+CMR10-Extend_1012 /FontDescriptor 491 0 R >> endobj 491 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /IHKSQM+CMR10-Extend_1012 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/five/eight/nine/colon/A/B/C/F/I/J/L/O/P/S/T/U/W/Y/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash) /FontFile 490 0 R >> endobj 781 0 obj [590 562 562 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 281 394 394 0 787 281 337 281 506 506 506 506 0 0 506 0 0 506 506 281 0 0 0 0 0 0 759 717 731 0 0 661 0 0 365 520 0 633 0 0 787 689 0 0 562 731 759 0 1040 0 759 0 281 0 281 0 0 0 506 562 450 562 450 309 506 562 281 309 534 281 843 562 506 562 534 396 399 394 562 534 731 534 534 450 506 ] endobj 780 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl 14/.notdef 39/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash/zero/one/two 51/.notdef 53/five 54/.notdef 56/eight/nine/colon 59/.notdef 65/A/B/C 68/.notdef 70/F 71/.notdef 73/I/J 75/.notdef 76/L 77/.notdef 79/O/P 81/.notdef 83/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash 124/.notdef] >> endobj 452 0 obj << /Length1 1432 /Length2 8705 /Length3 532 /Length 9562 /Filter /FlateDecode >> stream xeT֠nkpww i =H𠍻t}75k{g>v4sqs#S$@`kK+$=lmfP2qC03̬.1;; gv3#̭\@KkdJr Ͽ殎 vJѤ@%Avs22:C?vS6=F&vwtuJ s ?SrS[^9;k31K; _!kgik;k3+38?%GESBEMGշR.\#6V63vpt a?  m?߿-[ dn` `&Ы J\o69 Z`#>l ߱ 6^wh:-W?9,f {{?.OZ d:;П$nhؿ*!":΢o֩!hh3˟#⃎b]37BEBhP˿`B;`B/:P)je _P+ǿjB!/ZP+׿jB ;/Zyy&jAoٹ/߭qof`EϢ!-:4C^ ۤ4I}/y+n\5ݎ#֮`DaF4}sDiSlӎNW3E#ůCֆ#.Xoʼn:Yg$5v_-tugshKi~ WLu* ]qL2gĸtjsžCIxeFơ+rTQ7T)Tv^."eTfyIMK)25i?Rslq0Yz*Ez:$}iSHZpꃑ^^%9Z %nzw\/6LM"1?d GgoWt1gdM;q?Sw }j`huhO5}wӑjXJSJp>+Xfj b_=ǹ,DrBPM4CXv*Е vZҩڄFTF5j S_f%j͜!RjeX4,W ҁ]VF+c̤%T,L QN0 _Zk2ԣ<ئ +,Ts\9U /y) ݔ9Di7YNMKIZ2ϛ}:GG>`68}) tBpqev7o{} jc%`PN`"~>X胁bÿ~Fg 7g=uvnfmދe"S/WF]nk@QHRӾ&mݔ+Yܓ<Ӆѐ#IdGöIի:uQk9}k.ia'l5),Ҟ0[$k' pdHs<Ƿ6? ؖ#l|hhWҀdR桜 B߫ˈ3;LH?XlW` i#i(9Q+iCdڼ[,Iw*B7Ry~ܳ.b/ l$ξ6rP-tDCs}C,XyGRJ]zsczϴCW*W9x/<|b1Z><~%zA.sgM'>kH4/xt g;.م:aFXB6bz$C@0t$%3$5AMcSQ]SRی$0x9:\)Seg2D} ˂}(7" O{RBrK DՋhҘ>+8t[8[^P%+ݰ茔-[ʠE͹{?_ s"+2[2@&\p+vvxuzm}d%ޘt#^5p$rӄ >w5 vUQE]o:m[ώ' Z)hĽ;Ld7etH!(OMa|WjNC#Gx bo*D,!-|ZT-,U0g>z\lؠ 1l*DPaဥ⯧ͪ0f7 +wNƲ330&U?ϹA7 e]=+Y8c"W(j'댷$M?q@BU4a[eڗis'L][cPw6i{qq4fC>e22 MƂ76V{jtX&*;qS#SJrq{l >,^e20,V*}IzoxϙDhg?-0pÍsҽFa^pD➇5$+ꔛjGE\\U04,[Xw^ ľg5l1Cë+{gJ^p$!ݛ!MT32!P{\9F "3ufˈw).f`R24EћxN"Juik~ÌHJ6}>;|LXba.wuRJ? )l.BRBb$wXXv{GOm]v/J .)ÞH;!ӀЦi=VȂMa閊U,@^W{g9XX_ 6%h`l60"#o/cq@cj_rIF7yҌ4ipm>SPҝ૷ͧ;:t j?5\J"t:W l o1O(dwsWUu=+1 *Az-Gh$Qn %)S)`~2P;k׊}wz3*mD,ǞfIVA a+ELLȼTE+'1 I&F˩fHH뮸J݆(XO/8;jl7]nzEp&VrRqN-uX ?Xpz=٣~ϛa2+)6Vs›SlqmY)%=sx%59)rp\Pkkۮ\dM$jyvep}FODw/c&%D<^ -MQ/Fާa2+mY[]aSb0P{MVw).HfJw^Зa_WLiw4} S,[7ش_Bt5zM2Hd fDM9qs%RII+d^oI 95; Y7M*y}oGKӝN [tvܿ*?94{{>!DXc]\=KNܽlepne _[ɹv+j%vՒɈssI+dMlBUz &VSI٢,s%.$tBՓO*]+_ˎkɥ7> {MWU 9bCK"saq?a8~Kpmd)18J:K~3(B,|8^XwaAl*9Ja|2]YX>13܇t> 8woƲ u˼˱k՜ءѕu^ΪL$̇=ʮQYFGm}ZNp%#\-j=.3 ݳ7֟ZcRc|N U,b*F=L.唗r62|\U/ܕ{Jl ]Db~.d}|c+h~%|+s9{rd2mO".6Lj;JBqM ۴3 #]'trT]vF‡6gX]q\n䊃qR;5(N֖ygfIsjF@-tvqJHAKGt[:A֢61jjnOL"oįsG. mhk11_OH˾>lx\GC4~M2~ۈ_Oj9sOt;"XhҠ9,h˳JMij?7$A7[Y Ȣ4=jG#T}q9XbP'<ٺ7Q@|:Q|O*0]9ЇmH1zU&*.;(j7~u!=;AiUKF1⧞bcЅ|[P9y Bku}Ӄ:aO^ [(鿊˚QK$'*Ioh`UhbWd恇s0o ԏ {7ʙ@w䞰Q)&]SZRdTݬꖔ`:ޢCùF31_K~NySb0mWܡԻ7ZkO6h-[ebYzL[%. wYJ6 RS!%zA~<`3=gI ^s U r/"TJB1i+)Sy5mo^>%"H\|5<T'j4(ĮA$_vp!ئiC '7M)֮P~Ngӎ@M3 .?ۼQԸBmr hO$6C4" N>EZ<t]=!5&h\{@oMTVO5+z-zsaGa m{ Yb-OL0R{;:b6^'I%z0Q %{F=O3#\4\A]Xi6`]L^Wv?͊0˾\a$Fšn  BQe7xS2䇲q--{VxV5Ip{KG.;lfs^.dq3]0p^G=f|_z* (͕Fq<͠Qx:Yzo$Dgac;$VE$"6en/I7ߤ#?N๐T #U.e<= !@hYG!b(*Y1Gja ~rПzw.u(O̶.6LzaZP^v7LebW2qZ"g& a  h$km+׺;Q;2:ȶ'P Z[b]xUӦ5}}`6JK|]hʣ;NFL&\mztdO@@h)Eu3پX[cm1Hb$92ѺqVBոr0aSG8=B%H[A(@yB vB!/uK-wՖ_%7>P=6- #[nzPd2?| YQ+uƼc|FДz9ٴF0!Vk)Х <_ (r,^nl'TqH$%O[~^#Oa7:UnULq"h=EoitT-؃wϪBz/FץuN?XSa80w6dVbF}[kXh>¯0{4?{Pm4c'~UhxFncYI Y<Ƅtx0nA|FbRQ&lspf-ٸOhA\d+")M'p|@8jD82[M_W{է> CPθ "3*yS0^Hx)/s'kE@[ɆNGקCí#o, AZ"df_V]kx ̢C!EO Ǒa:H~ MH+i 6ZP5^X""Ůar~l6 lǎ}關޽-~Qib3F#j G~;Z*jq xC)$x>Hh rNԜXs8$ ߓF~E+]_`VH0'}qUU#?_'K3ەDA3~<?$ZY<Ӄ4bBMGd{q6\ouZy>\e$ l3ql)IMHokhB'Cɭ۶b:t-e.!#]*e+B cZDᛈzdVcgx<9Im&9C`EP)-*9kF2 .s]/G;"Y$t^WrJWhPŖ=Ep-[v"=Hw` +-ĥ z N8.(yxqi"9aŷU Ge{-~i/r37/u Y}b͈hnRfO&Qz,*@xEDU0O4 7|&'i#8*gө6k%YKZL>2iKIWx'6|jV Y {/L"(𾳷d%W}B.lc@+-Www/0i*ȖMh1Eu{ }^zM_sF|VqK(#YҼ;GҷӎSPf|m!|]>I`A 7bGj̓ٯ4IIia6/6b>(ڟ+CџtFؠl)BDռ51'cL LΟst4T! < ߽)qvr]~$5%{r>$2'~&w#87RZA 3Pf KLToQcϺq=kļ'reā"[&\SbX}(/lQL409l:b{%|( {}b@0mTO:[pa/ib/\t; v~/4ldעu/+]ݦun/XFNDKFz?}_6--~'b{UcA9Ujr-BL@J-ݨ|N/MaaFI_VzK{IzC=,z;[ lگT"=PCDoӀwuoG҉J&gB=*KD2̜2ӌ)uUpD19VUjfgrhuj9e e?ݻ+ ݗ-;9TW=*lRF]C:67b:\%m4M,EJDA3 !w~= ^-ʸ SFpvm`!-B%BdIulJ{М FlrZ$k,cduk,Z>SS7CP֎X v%:NgqŅ VXܐƆFBл#sGCgɻ!'+̋>/&΄_ne@yJd' !CR2$dAL&*|aCZqAR,):kp*JЁB?)- ixwnOcVZ3CnP[}z5rgJ>EPBwS]G&Sؠvc=գsk̚940ǎmbHHh$ PM}Psm{}{rY--cN0٫jqIO:Om/?M. {-M=cendstream endobj 454 0 obj << /Type /Font /Subtype /Type1 /Encoding 782 0 R /FirstChar 12 /LastChar 124 /Widths 783 0 R /BaseFont /UCORYL+CMR10-Extend_1016 /FontDescriptor 453 0 R >> endobj 453 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /UCORYL+CMR10-Extend_1016 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/colon/A/F/H/I/J/L/N/S/T/W/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/emdash) /FontFile 452 0 R >> endobj 783 0 obj [564 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 282 395 395 0 0 282 339 282 0 0 0 0 0 0 0 0 0 0 0 282 0 0 0 0 0 0 762 0 0 0 0 663 0 762 367 522 0 635 0 762 0 0 0 0 564 734 0 0 1044 0 0 0 0 0 0 0 0 0 508 564 452 564 452 310 508 564 282 310 536 282 847 564 508 564 536 398 401 395 564 536 734 536 536 0 0 1016 ] endobj 782 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period 47/.notdef 58/colon 59/.notdef 65/A 66/.notdef 70/F 71/.notdef 72/H/I/J 75/.notdef 76/L 77/.notdef 78/N 79/.notdef 83/S/T 85/.notdef 87/W 88/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef 124/emdash 125/.notdef] >> endobj 449 0 obj << /Length1 1681 /Length2 11732 /Length3 532 /Length 12694 /Filter /FlateDecode >> stream xeT\֨Kph!H]wN4w߽ɷ{qѣYj>jTEQ(WTce2!PRMܬ$L܀|V^^6Ɇ@ wtvrЈ X8Mܬ5Lf@7o&@5+h΄ 06s-Qupp;l<. )Ϳ4i IsG;o9YT rCrS2g66 Nn@9SvS[\ `ab W`4T%@Ƽ<XH^/4swCnA7a kzV;^ Y<\̲-QBb$p ygF,L}}n?i`Č}Y>:Y{Nd']󛓕%ù#'*4`ٟu4#I2+#9"6s83 :\eV%r?JY.yS).PS hI;lq􆳲g|XQns4EȜS}E E\wОlh_MQFTpZp\E~{3m,Ī++j@Qbl;Bmרz} .C G5 wfܯ@QDjˢP>zo3*7UnB; uH W<W]T?3?)2xsaBVXJ3PvMnqZ ^k|%S嵸]3]U?9L~#nsmJqU_TlTJ >ZLw-B Aƕ`?ndDqpInciț+C`@Tfu{H-weP{3gԮN{:,"l67-Ҽ͑5s8 r"}_27_L9 ̽ICbO| ckZLa?ҏN5sJ 9[*K:z=g|Cuh])M\jcDG ]ɋx0~H?3 x]]" F'g+Êv >$ ^SP̣[},LEb]ICfZNќ)#4ׁJjSL P%;edZ&Xr~‘$=2dqMSઍYB">Yzbjbdz#E_s4nF&Ta̧`Mqvdy"Cn"}pvv,QXKJZ&i_lʂybXxzT!=!r-/OՌ8Tlٸ'|eψ Pwףg;dc!rR*%畄d Uaz$v[p׸Yk\U>aLT[6$ 4Uك uު%yONےFᑧPy|.1)ι@ BUSsi h˫"B6$2#&ǐT-.DCYd:\oy`nʒmCbϣkJ] mS-`"+Ja8DQXŚIx|Pݬz`ml$Z[1 ԡD3*ҝ9o4"p@X|)X3#]:VL'A]oP o&>~æ ƚT.A}&R4τ;CޔIHtHj17}~|eؓpEw;." p0)`@@~ζ~`GN WC+8XcfzPԞd[k}o:qUy&p~? >^3tcY8/aAKAqIQf^]japK[=cypב16B=_D6&7ˀjU faS.\enZQR03U'&mVd8դ/u> 9 2Su~" !A,bn~j8dJAY`nt//TDMP-jbIsN?t˔ʻ@o1pU+H-@ٯ)H}7}\Pa u K-Ws$n;t &öGgn? g;*l:[u'7x<=a^"=j<ίuE24GAYwDx@௩ }cn-p) +e?4#BY B}-yd$X]!~V ԰ϝ̩ WUqҢ1WdӛDXQ,Ưz5I.]ѪUM˜?w"T謗RȊStRo q^@\/_smvG᝞͞G|k0ȟc!:NuQ"*yQ{^kcUyzSbqI!O`d,+FnX.fRiKI&Wj&fh$G!A!Dh䚱NlRd\j y~jJWr [t6ۥ(I.q|~l69QE95)[@1ʶ*FRu-^y R^I,u6IZpQeIdKVm dDzBq)|%8vll/N_Oc2)^hn*6]yzR1gJ:~z4~3߰;^[E 2d #=z>\8jE%G R*Ǣ~{˵~ ̼+gޛnAwhĠ2;B"#:)/E{IKJtxU'hbox?+FU@OmzW7,9|rs4ZAbfjǴMD(s9jrKď;P_Ǹ㈵w!:hbdaIXϘYڳ,!>]M8l}%ҨvJ=J,SXo%yd"$Λ i ^mk^ۿg^E]3ZH6ǫd6(MPnw2P}d,-.^~={Ajl-jm)b]n%壥zVv,L\8yL; d{6%DZ,W-B"cetJS1UF=wp|xC'm?nӆNBZ?ׅ *x:#,# `E'@m6| 'pb;^)޲YE.ƍT>֎ح< lrNq;%׮g#5Pzq+zSWO!7Ta_$a[ Mfs֓\#xaap/Y&W>'{"RϗІ*eL%~N3!6o 7wކu%jV[Vҥ>g'Cr{ӟCaׯL ͂բ89ξYjGKG{]o(r N5=MuV]r'Sr[+I vp{I!4Q)ˆ5&Lh`krdMI J }|a@amWW/սBgfp:zⳆz~>y8.E_5XoY' r?_dm)'ykBߦK@jCDdlSUp#xm([Z(';a7 8(mu}g,'<8 RXurJLP\/,yXƗ0Oi<7׿yB^h@C̈W/|D= v_i3 ݛl"ݜ: dSE{Ix&mxKe7f#Y/⠺Хӹ9 EZl|-[YF$ao-nvc@ɊcH<#`YmB]uڨ^_(z ^pd?v\re':|&nDGVW,B( 4&-w>0b`9\=Gc/ʗ! ܻb/ۭx{<ȸ,!5D4IezKGqϋ,H>%kȼgsZz:mM 7FG\bc;~]i(jX8x(=\ї@qk|1зc@+{%~;𚦺)vxLYZs~ ܴ\r\%:UmeVC}&:ltFf23uP@IS޵]|3{mhxq)XӬQÜ tA2:]K? qn|Vy%Q)|;ܳ(%ډaLC$1ǯRyhp)éN$o*UYGsavڛ h0 (0 bڼ/y6x VZrTZhԂ]yP1ŚT_aW+θwmlpi @h'k3^v|vOlKˢX vO]EGimWo&ky4Nា3$M*Z`߹,kΡs2x&22M=vhI b8?aEF-ҹva x[L|y;W@`fy*k uudO/(Z'{f6/I1/U;_tyz7&f>L8t>INeUid5K6}[9ܡPVt2iW lEr]Jx.+)[=&)GJkPW1?B},`ѡʥ;8rR*O׆VČ".wu8\ x)& iQ dB,C}:W)%`>sN p r<),gO-J84 7\Ϧc]7DE?6D1YX{ajVHE c[v2 3N`埝u2Ēvo:nys)k1~Rvi tZ'K%Yvv!?V2ސ6pmcAvQ%Nx= 颡RDpȖP&YBssR>^CrRpYKs98˾3[["CvEirjvDm9o'x@, Bۑn.U &N+=euJskSr k=%)# J[Ddk8h+.l?[KL^#Gn?'^-2akGyN &w@,x i߂{ GWՖ]3nk< - lv)>Oc8sH>Ra&-R070>xOɓ?_JR* ~8Z  q씔ʆR|9lUcn2w`9a<jN/@Z#.DDHlJ2/#qYZ\%~Xנ~GArNY /斚i{X+Ԙ*,aϐXuG?Y3cE\OɕNAA/x](l864*%n3 xGJ9,sUڮAן*|[+RfwO4;Zּ8*/$f>ex؛@f~S8z:ݥ] /Du=)NQ驈"Zu 3 i, l5HJ40DFZV &9u&6hD?>OkL #Ud01N.h1 rݣRWR7&%E3ƋkCxh ^ Ț sTKdjsH$exI^rDox<ִz `C@RCzz zl_#>FHd%6 b[9IS%.wq O3c2yJtV,+[F( dv@3gȾWl1fͫ\ ZÖ́ oX|UvqԳCpkt. P+Cd|(䨂ppdk*z-Pؼ؂eS|V}b}&{] (3ďd0鿶` !7*&~;<]"ĬaZ*Dw1pws#dYAS (8[M:вBxcq?㼛P{rAԝv+O8|O`Fl%׳yi;J/pHz? pM↿kXvԡ$CcKSnAOCo"ټ 3\`H{ <,mx,c+pAᮿ?"+x\nWVҞ|C.`_bp-œ37KZr$6fHhu&n]3JK˵5,\0zcW'gFNZ* d܅^*a jeUFG w39Y'%Cy[j׀#46үOT ɡ_|_Sk;\#i匔 wŖܮW8(|ń7WPh5ι㒉t씜yҗPKԎ%rȗ-p.3mIdMv xE[t<@ZD۵grxC8]7g$p\#إrHb&Ԝ[b<4qYĚ܎ڑL 5(~0 ,7?85Ò!E43S֢8q,ϮR>sܤ=C[9yq}% 8[(-(F\z _f|a>q\zG'Bk:n-f {*Zc1kuR/ZPӗ" $ r s$)gvөj^%p+9xY-/~3|xqfbG ۽+D'V} %?r&%,Z4'}@!wDJ-]Vy_n{a'ګI*Iҝ=oelm"xu_<&J'E,[WqtAn3 Cput5 ] \H0 GoceóA2K9xqI=̙g2/H=]Џ^+#-%% hL:#z;sROڃQo(eޥK_88)xyG,^kD;H1NTDd}#wYzcWV˦Y+W%G]41{*z{m@U5VR %u#'hzU aWԹ%Y g)Gr ^ٌg~sEʯhǽʆTQr6ZPqfpx'Z亗bg.A4r(wELUiO g/K̅4-s^&[m%/$7+;D\zlRN(BDL/ O]"7@<}_zؾ];E-+'wRKErB&B}sR$ΓbٔSgv=T? jUZq3!|?d L.B!v0{.8K&33KQM{%Ώz^jU vJ'*lLWX?%9K2O%RvFkX `Բʴ950wUgêYKkLuK!> endobj 450 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /GGAZAG+CMR10-Extend_988 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/exclam/quotedblright/quoteright/parenleft/parenright/comma/hyphen/period/zero/one/two/three/five/six/eight/A/B/C/D/E/F/I/J/K/L/M/P/R/S/T/U/quotedblleft/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y) /FontFile 449 0 R >> endobj 785 0 obj [576 549 549 823 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 274 494 0 0 0 0 274 384 384 0 0 274 329 274 0 494 494 494 494 0 494 494 0 494 0 0 0 0 0 0 0 0 741 700 714 755 672 645 0 0 357 508 768 618 906 0 0 672 0 727 549 714 741 0 0 0 0 0 0 494 0 0 0 0 494 549 439 549 439 302 494 549 274 0 521 274 823 549 494 549 0 387 390 384 549 521 714 521 521 ] endobj 784 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 33/exclam/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period 47/.notdef 48/zero/one/two/three 52/.notdef 53/five/six 55/.notdef 56/eight 57/.notdef 65/A/B/C/D/E/F 71/.notdef 73/I/J/K/L/M 78/.notdef 80/P 81/.notdef 82/R/S/T/U 86/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y 122/.notdef] >> endobj 441 0 obj << /Length1 1657 /Length2 11259 /Length3 532 /Length 12220 /Filter /FlateDecode >> stream xeT\֨ !Kpw'[pmwww.]w!~N>?uѣYUs>kZ5FS(2%lXYxEUXYE)(DFvbF@bnnVb 1 OA,jghafLL-J$.baȖXh0&VX=UYDt:MYXM,@3 [xmM툹6qC@G'14iA&v&@Sx&;P5 N.bm`dO XX{;{g# j&4pQig#k 5! ' w3 8%@ݿTݝAs ?{ _Arp'auA_zUZ`gbakFIlhL b!5ALvΠ%Ġ9sA[_#+- lL.v@cp3ٺMlg9hk 4+? * 137) Z bg'h'9@n9@@rX RC"I֊@%!@9(]3(I?@ޗ fxn5!Pu *o&/gc $dڄ %˿dBL!/Y +dB_r AV! d<""bB bܜ>L#qש :q7Z2 _^[6LCт5+wv -}.uݨ|@G:: r{wlV pO;p5dZa^RNԇ}>8u1/N^x/uL6_(k-YlVTN4-GB}3%$S|7M>9)Kxe5HxFX {Dvo7Ie*r'5}!!`(n&Kki)* ٩U~]`(oܝ_>KPwMHAӹx=xW쾪ʟ`,Yn6M[q.]u!Iȃ2鏛}]@n>]KԏBS+k!?Q/N U3vi5a2o̳!ń<,bSQm]7t># ہEnߟ_6c{I$LQOTDvУVruT~rŠ\lOSH_'W"R@6z"ϮG;Gx;)'PTb,Djݚ+.] Qxm>JuD].6x{v-#0/މ/&tɒrǗڔkcd$"xv)`\ɧ8 }45miǩz[Ś4K5N4y+rc LU SSW7`Zc^k[ [iWdL_:EU^۷ d:$6-eZ1rr?q꺹( efy* Dr(F53'~4ISz< Ѝ&?!ܟ `3ğ)۶IP.pуm{҉(^n5|d5dՇQb2 a'T^[= \ƘQĩUVa800rd)4+XJD#-5_Kg^KμְT J*fzCjΰT6M#7,UDJ)nvU7 Ǐ4⦡*qu4ݜc{)*Uk\&N_a뫰Ws_T*-O@6`7DY2`Lk8 ZqR59!k1G_mS׈Mt6l_pulIzhRڎڕve&fӪq1zA));2FRX[dI@PV;k%!qX 6xkB}IkvA|Ɨg1E\e< prtIf&h PKjs*WIOtsrRrԠw̯-S4ݗ6bh rJT20f]iIKj6f%vG5Gjվ$4c=3`U'{^|69Dz8 CRP&+>LG3;ۍg=5mӁ7ܯNp_7~ Xix'(n!U3掠V4ԉo};ՏwD)1%`(^S~ǎqrYK+trgQzCf^@m;nɚp+#[j:{RAۼRc|揬c Q.@R^De= 1`[ctܕJ/]ÏUkN2!qvp;0O3~o=kbt\4Mᑟ!ni{Mؠi)Hۇ ۨyG&nw^r6.Ň"Zz-Q$xCy]*af`NU;{luJvc>ؗkwE!UY O|HgLܵsoQF+=^3r@W8/,ԗ)T3sd̎o` \gxGhI e£Oasbm|Jβebg؇A ?PDyhB=RI .(Z̫ZmPu{ ېw|}hsߨo/?ͳhdx|k<5^|h9=dY0;?)n~U|0 )| -Kя@2a-}+s,7:{;U 65䜇~+[#=*Wk6B7Ңtúq;f(*Huk&^wiW*1A9V}w_jBs]YS[D>7.d"s||M-gF;8F9̿ocjIۛOzOڑF4%0>&Z. zeۊߊ/w8 p:cMN᫏< / nRAKA-6@ˊ3~ީn}ZlM@ ]hK&SBGAi'ך2o|YAD2!nHFP]_H2Nfu)TTi:b Uhܱ LâfS &D TB>H1v=F>,/K/!y NHpoA*EH.;ZQCyQ 呟"tZ `~yƹAso ;v׃xNK\KftՌbs}Tlb̷ԗ zc撉zDeg YM)^}Ƙ(7c(fIlA)ty:I|gY\xdIB}`3vJ0K\U;8WUe&HuюOx R'(Yz>?FRc%{ּ4//-3zǖW(WGNH&ˆU]y},SgKgpF r7Idj#iD!% w]ѓ_e4"Yi\b+g;kwn՜8|)Vv=OzS|HOXe$љ¾ZJq MroבD:i`IeCݡ'5\o>,+R<<:ۊj zh#v3ySbane᫄j(O\vdϵNm.mek(CAC~&WjvRɓ  l9r|2Űm.˿Ϣl5WJ|ؽiˇW36~WGlE"ڬO4ix_ ղNݨ:o|z-i` O`72GxDHUR7%hU7݃fy&$@ysȢiuJo?5 <0b*;V,)fi%! zV~bjA";]osth'vFq)X\(/5,xbӰ.>4nǠقSg<`_X6#k:nq(͓d@*){;Jekju+qUOMo1ud=U*h7 [؎Fì 2-]xWcoDE2,&*%/E('ϗ쭌[KkMh= )'yem r(1^. mf) tKۓm"t:{%5^To>eÍCǾ`F3Q}q.`҆@)@Ma Fd6+^~m ũfi'Bچq SO:mx #!+:+ʟu -LAa"~sQ ma.V' "i$"  1ɧg 3o%ܒvCf_8ҋJ\EysfD')tԝsMo;&+LZ.-je}&Ѽu(#%lcQ)\1 L8B,_xK1kb));BHt ދ^f;?ߔ|/a&;B2KC5!/`yۘF/ vCY$ư0fvXn ET=d2J}ϞEn{)yU6~+p|uE.-VOϥMU%ZS UZ@~b7m  N"y\r$m%I_8 E~Ņ z;vߠȼйBdz"7qv[.j$'6"{s#`I3wH+|"[}{̟ĈۄdA<Ñph'l),202AV<0\?v,ߚ=^ɓcFߒa籑MUckS00/wmV_ XCPk0ͽ6S1[M,} ~-淍6aVɐ x?>]Šp V#KpGXQnj0P#ւB1K]02B^NlwCеgT e~p0Y![r8lf5Y'k?mʮPL47I"Rw2vHeBN@AI}~eJ)~ eĜl8XHb_^>VX&U<>6Ea%LλNR:~ XJS7tM,SHY؋!K$ l"(I%,D`Pzfuu^I!k2@>@l  1 e9L'y 2x4V#F<Rvԣ@ [ QK)Ixec|qGDvS,ՂLa`0t'f#3 &9ڭcyfI7s e\>RuQC[;rB|:ZE^E6x˷)$W;<1Vh|=s[3`PUD? ,2GJPbOElBQ`b}07ۉPQz2i;W`o"k;mM[r̳Lҡ)hH  I&#dk,g:}+"rUlH7bR8 ܷ.FRm!D݀ILA^pR84N|L0KsRB"`Fmbe -)&_)N9tz7!9ͮ*,wu<ϰ~·ˎɏ aVƩ0J_.keGi?kn?]SG cd#ohv]N qUI$bDȕ0Y!ްRScdQ43-tejtpFߓW5}Gd]P&5Ah!VMPD}w0̘,+fiκp8,.Ź+l?N5'{{V,K|h76ztmF7.|Ll~3U$4sS.69ަם@ﰀW 7B.M'LF]~vpq11`1i=,Ea6¶ nlDٰw:;4lϽPIv{nNW=j;"L/re&~+x8yh~]b`Bx$O3IZ9u ӢY}е1;Ej9={a,Y= :l@c,T\![O |$ӒL'40//$7%IDniL 4O oB_p~FƉ'YD.0Q,jav4!r[0C!^dRS݁#-MVQyApLq_Hz/K՝M\xe U|Jjn6sL~Jv UF<c 4p}?:71&J%47 C3*sgÖg1kw?er2.\E<^OZӢ5ʽ|5Q .m7( %[ۡ)#ULrsoç|i.=+o|z xM֜f 1ۅ5 GaIOz/'LhlָzƏ_8^Z[֜ [Kn )kዚX#/6m".Qj}JRձ /nMWW= Gp ܟbyrTHUb :¼ EV#d5|\x<=ą8?+y<$UE#}ٷ&Пa?zQގO]ʋ.sXEFHl11E NE1[hb1Swwl֧94u֞KvoϘDnBq6#B3M[rRoQ9?Ey hWʯ1\|(,e8c=Rm?7F 4~ߠwfӛI̪19sA.a;ELݛJGz8 @հQ{>%sΡ:kJ 8 ͛<}G,C{/h٫X4j/?'Fv6FV d_endstream endobj 443 0 obj << /Type /Font /Subtype /Type1 /Encoding 786 0 R /FirstChar 11 /LastChar 121 /Widths 787 0 R /BaseFont /ZEMMQN+CMR10-Extend_984 /FontDescriptor 442 0 R >> endobj 442 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ZEMMQN+CMR10-Extend_984 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/quotedblright/numbersign/quoteright/parenleft/parenright/comma/hyphen/period/zero/one/two/six/eight/colon/A/B/C/D/F/I/J/L/M/O/P/R/S/T/U/V/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y) /FontFile 441 0 R >> endobj 787 0 obj [574 547 547 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 492 820 0 0 0 273 383 383 0 0 273 328 273 0 492 492 492 0 0 0 492 0 492 0 273 0 0 0 0 0 0 738 697 711 752 0 642 0 0 355 506 0 615 902 0 765 670 0 724 547 711 738 738 0 0 0 0 0 0 0 0 0 0 492 547 437 547 437 301 492 547 273 301 519 273 820 547 492 547 519 385 388 383 547 519 711 519 519 ] endobj 786 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl 14/.notdef 34/quotedblright/numbersign 36/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period 47/.notdef 48/zero/one/two 51/.notdef 54/six 55/.notdef 56/eight 57/.notdef 58/colon 59/.notdef 65/A/B/C/D 69/.notdef 70/F 71/.notdef 73/I/J 75/.notdef 76/L/M 78/.notdef 79/O/P 81/.notdef 82/R/S/T/U/V 87/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef] >> endobj 431 0 obj << /Length1 2266 /Length2 14876 /Length3 532 /Length 16106 /Filter /FlateDecode >> stream xUX\ݶh; RKppw .\=xpS{/y~6G2DIA(ag WUea023 PP: -l V# PD=-̝Ԣ4$qmƆyCgs cCkك lm P '2 4aD`aX;fL8Iۚ+lb?M@G'_4h`5 ݹ?kvC kΰwq:L;U_r@ *lhma,lkf 0WIhdllpvt+ 5 _JΪ1; _P"?׏ۙXؚX98" mA@c0sDll&P? \윁&FA?7}sL쬭 C\&{1=]|0;3(hk 4+ `2t ' H=71|=́R3y #&O{tv3l+lj>6 ]S ׿2@NJAN@׿\AUe@pTm-瞭nl,3 :'b^fN?{]هރ qw'N;E +N Yw@|'; $#N wȽE@. rQ7q\ @.rQy';\ N whEr~'? l`2s;??t20p4vy_< eжdl>@7 5 e?/ +$c/9Y )d~[, /Y +9V_r AV.!/Y#+/Yy +Ͽk SX9;?+zl;[XWIKD݋ X@+?Ҍ]A @݁Kv|AM!e_ &ˡiE̚g::Юi>Vd`A=th<&q6jQ2Ccמ.iHYV@7%j1}U׆ N.M k:J6e4057p-t+v.py_a"XEr',?f0s銙=E}w1QeVWG]j[RQ6 oD;SvIBYWR *P*D7I0SH]JUڀF(;HԈ2il 쥯\OQ-OpO.Qvu>%?>cOD8_G9oE|,֌T ᶆshI,=r|˒$Tw"O0/b:"+3'P;(J<7Yԃq{ȹ3'\rqȃzEvQ]T]pdLCOd=B \Css]/o i)֣,50'٤>ӕ;8A1OP/򩥔5б/&p;ΘD\|,?.R}:e. ïPu?ŏqqh7XGQʅN c^9*€j|X }y'Χ>zEvCDqU,=߷" u950&e Q%7Xcb̅8+2gcd}n`i>DYNɊ3kz%g]έIKL[ " ?97$WV:63nyw *T4|/)ؒ҆raUk/D-ٵVtz.0R!c̰onLط{|健C)PDk*}laREgD/7{9?-G9(Q)?S'ߨߤ$>}޷t/> $uD@ 8c(m5/Z eZThu6/<?O;4wT.}vUXݹ05ߒWyr Ƒ`'̟^'{|r܀ɁЎFNU(swpHR.i0?kԆ6B2OјkK+h$3:,^¹bMT=oY8XF]IG$kx |l|w\_i7o[7@7k_aQK/9@`\S-`!ENύo1dr<2gR+HL 9\mm{T6kzw^_lsR)R[H9XM])vm堐}gؼ7`^0S`Ot*!OvCC ?D?6"Em <240j1n$EFWA_kwE߁ g $ FI/SԔ.^tNA؟fs/ů7L߮`q)PϢju+g+U *7I/qJҖjӲR`rse\{L2kO7,@sd/#i;cMa ,i(7R_$\3oE`m)$lROh4 ɢNjkSI ߵ\1A`l I\$,Tkbޮ,Z3pďt7Fܝgm[da;}ӤzsV 3g Ž1s ^:M@Q_bݓ{&d3] "/}ֺPϜ|J3x,4I׊F5~ԜUe7x{q!`|NGѡgg.Yk:/E$hVx1 7,F{ߞ^nܨjL!a3wًM]󔄃'PbkfC'S.wYӛ 0B+EAQ:!41q d_E[b-fRRZ OœzjihW\1,$% Bj3Gz@YϖMQkouo ^Wx:\T!lPGDV.]tsU-S5nt1ϡy|׮ڤWuߎXL&7¼vOi7G|nxsWƝZ$P# *ȋ4rc7u._ƞCƲb3[i9T;$lJDk䪯a{c *i1HTQ3e՟㹯聲z /H9bP?7%( N8gxTE X9v[mEKʳI H n](%fVYwFȾG-L<.)EtX[Ͱpynr7*/eh]ȝYd+0E {c걤"`?>uNKx㯯9Bcx̺J 5a5cJ}m7,u 5֑ѿj˝#trfDۇZ.7dZ]2.jfM3RXS-TI)솈cn&?q J O!Ų1i@'wgOb::ȹ|=VQӬŠw":Y%h5/"wOV|&_+E -xS3 Iɱ̭"We 3ʐQZP,ln/3?/Dto):ɾO20GႉD3 ~ '푙oUr<dl5ot⮸j-̧t[ l`.n˥}](YU%+)MyӂMS|EGl;J͈,[5~7L7ՕcݥdDʺq2LXr\}NP-5Ʒ49=jl)])ŶVt2$Bͷm9!&%jI΍U:xn]|.j`k3\JBNC}}+y :s7hi`? =DPBIF} ̈́Vw(["ba4'OBTVmx焄!Y6 Y[ojCyNRP?UV%mNJɝH8ȶ,j 姠=sWV$1f=*מzBRJ~rd}3L"E KSZTtƤ >՚EnSTW2n KˏVT8cȼ9XQff-;mR}6Ox`_c,G$\~hop9#kFӏ̚୧F><4A"&ONL9Ǯ/JAhARx*}؉ːdԙc L+@plGq.,bYsv Y:Bk⧗ ߷n l,fc]rt,V:iZ0j4 R8ԚNOS|Y+5GN'GVe|!2EJq3=<2MR)CY=F(/lĊ6il~ yNGrGV?L >WmMR)=ѤJ,n8[(FQ!(ۏGN  Fjr < 0^c  ~c&u\}'}2* C`̥L#+<6,og,4;fq+(M#iL8zZָP0Jfz KmQX'_冂sVjI"d)㼃m:B<)37`4G5Rk{H:y>nTaw%N8YՓqC:9O:J"u1MEe\jEK|6K\joHD'o$b L(e=ʱ;RC;yL;[aomA#:dˋH/-}}NQjn(]3]W^3tk,>"[ ބ/06t&~ir7G2<*Lְ6?|5/Ôt TEcbfق@k,oQ>N M$M#7~PEPj_]IAs@bG 9!MY0~`[Z{ O@뀡ECRPFިHtMJ'Zs@L1@[=֖`-M:E(YuuX ?qN:f.`82%\$KCo7 Apb7*/BHKoLl1s\BaL 71IHj)қ I!3oTߛE+Sf'O7Sy[?RHtRxQo4#(FypcS[wUN$,eQTe:nu`S }PNF16t{ ]39ԁvhy~+GK1nA}QH96EܼcT9S31e2 PNode&AXbV#W|͋)&|;,?"m"cCT ~m` Ŷ"DOoF(-mŵ nQdTlxzDҨUT&ki;2M1>zrN)cͬ[1&UA\Sy/seHXijdgf[qpnRB:GKQxV&A-tki9Fɭ&nX;{&ZzMxB >W^R/&ًƂԄ ]FmE=v2oF_vN_LE-}MX%nHsL;G#sVtZh&:S>/L PDRψT"*JRS(Z&, aM)C:,+W]qF-dxRվnx76LŅh(ʕά)b525jA{ݭ k_P|gmN>9|)wsaM[_c3t[/Q]s; jzqMH7X $O -YxhF>uպ~ zyŔ(Sy'(57wx64q_9*wԯZx sq643/ @*1pVA;RGX2Q1{i9oӺ?'RbQlAۚ׻C#^ji9ʄۙv}R` W+/Z6>DroLJ.u.]\Yϡc.>Ƶ>93 kȧ >xֺLi:aƾ| 2ldb}+kh?].QS9v1C578^0Ȁ< O)__ &p ]lGD;裡VD olk}l47)u۞aɞ !e]/h&'pHH]!01=7FwÐ; ĉRJQi-gq۷]tY)Fi7I#P8*<̮[pnoPcW|rX$ãBá_it-&^b"}imrZzYzVHDrքcX8]G> @S51g޷4K%W/0<7`B0 $/(C_xͦf~QZt SAD:yşᤴG>Eh/;tds~$o2]Oڌ:}ʿKi4S mfMqu#jcq_S).: /JPUr3_W66ecRlzǮGBS]ǩN6bhno*9 VmC&\i+wɌ3+n;Cғt|nԧ R"D%c~S4m02g?}+w2R oݦC):F+:$t$AjV3熷#@>3 8NkkM~ FDcBe2Lܠm3#\(/rdueA"s{FBƃW=s6 qs^NN kLw> It)Z9Ñu֏\͒{c+E"$U."!+HL~OUnEq  KQPi\5(k;g:@ysu |p?Qq\oަ52Z|03KWWͶ=enHfGEU>_J4Xli; 5̻ o!nS s `C^J8%z[oeڝKdxY@9T..YL`+~>`–"8H- ;g"36Tyv>;D3ޚi?)c8*kLf vr=67pZ+D-=_#C+3Ile}Cϩ7kL֜NׁL)AZ? \Kv!lqV']ۢ IحwB*d}J6i_G-7*459IqϭF_99:%JNDNec*݉&LV?Q,8t)~*^#ʹ֑ =Ż0Lr*_CrpoLNԜA;bka{}rQW/6w0Np0䟂۶9mgd)4W< cRPZxupUts t"7W1SJ䨇P$1ӉoF_r ^q>/KL9X&p!Ą^ˑFɏQzJ{l+?uF ` C{p3ٌ7!?N//_]> vk K`uqitNfrk=S6ɟ`|M5N1j f>Sl{̽i-G ypg06ig2Hnj 69znLZB,q$2 cU*~AZH-ϛ̂I29ԛ;[OdphY({V5Of^؞!|b"_F %{Z2>9}ρ,w4%ل'e:?M9kV\4$eBD=xFgU"|&Nz(r2 2EW,]Hb +LEy]VG.JOoy@E8@ctAC(|yhe\ P,j; v*X2L0{c/auݘ3K rEp9?'9.R]Zd/W|=$y/kCI۬8,qx|ӹ3[aL*cxmAR%} 4 wflmoޘ eJY[ôZxMPl. E}98_oDJ_cf>٭pu?Biju/"S {YgS8G NN9W]zW䊪FGI%X$ eOѼ $Z5q o5gYao0F!0W\L!JLbqĿ;ɲ+au!Xw}["Xo%?TuWsN=(7[]0k)?'w8ND,fM cP&Sp$_A.m ^r/U6p7b6Pc˼ry5&sXY޻6\6YTE,vPn$ٶ=_OW@y7Aa,*K7J#IIz$ c솜Rǔ0!®KPzɲ,Yg)2IrO.ѕ~QwQ4ԲZ4RKqwsf"Jg%Ÿbtظ ?ୄ^ؓ*KDKFA3r[Q[ ;;M1|S#CQe>Gd 7酸XM`F1);:oD)O0':5zl dƽqKLf߇KG\W&q@Vǭ>Z&9s2:[_ ɬwI(M LC~ jSa  : Qя8s|27Yz*&9GEU30OSz$Bkj:rsQ=$y*ނ#9J&wH7bXRAyڋ[=:>$bд~Ȋt&T.+iARlgcYiiy%e!KgQS<Ts>9!A?wY~&lΥ >Utn9Brӽ%*e謡ڶQ$"ddt=`323*7v)Ewa dG2\=.b}cDN oF,n,Was|g0=ws dC-C\ͳ)͂|1&adѵQVS8ߘv Fe3 G|QwL R<[/L L #v[D#BbYm| A# ƴBed^iXcfH8,>z Tz&'T"N':YӖ˔8EP%]r`τ_NJwa;ڍ$KYI#dN Vz"P'qq!9˗5t~&.\2r4]0`֚ boH|t<- )m~{O!JfSkPς?yӆݨuEb|,325GAϴNmBP$ZM5@mcS=ͪFip$DL 5_ ޯ0:w\VBe(:95iFg'4h6JM> endobj 430 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /VAEAHS+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/dollar/percent/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde) /FontFile 431 0 R >> endobj 789 0 obj [525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 788 0 obj << /Type /Encoding /Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign/dollar/percent 38/.notdef 39/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef] >> endobj 416 0 obj << /Length1 1207 /Length2 6024 /Length3 532 /Length 6787 /Filter /FlateDecode >> stream xe\kQ@pɁ`d``FJZ))MI3{キ||O_Bo!`g $ #`7z.$ PW 헇D h@L> %ؿPY[[?a = B"@;"$68z:A(Cj(:7g91t%H ]@oh}2P ѧ|]$^ m7D@h!ZuQ!Z7D7D?u>W.1 z_ -H_=z͖0B- jy+cߓVnm أPYBJrM kW4~l^OntCfdWBoQA^GAN&&#F@a}^pP6QCQ` Q|,``:CDe.nVܭ9yE# ;na^0a]{wT=ݣA<ݝFtr@!D'g}> 5SS<|ރ\Di۠~:(Y=}`; :d!Y fS{ J.~:~'V)lHE9#%{7)2jt)LQ' fw~٫iSx0U(5OW#/bVhqU '4FyUJƩjQX?XWJ6Hξ>p@.ۗ5pF2~=_~OB.:Nf!fWe6ӌztN"Oisi-=&?Rtޤ~"/%;C(}w CH mV> #ʀw=!xJ)skcR+% <s8ɪ;ʚ hIy$'5 F}7fyn#q3_@v^TKȕD` ~r nO:]P$s'q~k1xz8%u&M[/F2)()SOi"J#=z&!NjSڔ;pW@v*6Yxw 2,ǜ<1X_H̲Σbr>a*πـi&*0M3zQx;YYhs6#6]> OQS8(+()h|'5߯TSiIddI`W: PݱRc>|Cl16"ȉdf=hE&z/96Ƿfd$ޑ4ܹTi3& R4P=5%gZ\73e3g$&|^)X7&o-[}KG=eת:ΉSK=ݹ*ۈ >Y_0thɷ6_]YeWd'ZXX%n #=Ύ9x4LJ ƕM~Z_ 𬼓oe &o悤E7-|E*Nl-grFǺc| ? WAV+ 0iM]a;=ُ3H9Po!l|#sq UbyN=,zox#x#_{`3jTݑy^_"|T)L{k9yOg,GM"}W$%ci']ڦ)MGT(<]+;uzq[Z܅+{J}ELAiQ7G"ޅ;axS, _!}F,c&~22I7u`m*fs9J܆f0ϳLϪ,ͮWM1o Y<=D؜48va~'I):XbQW߳ԍO|uHk/]fWR]gH`=J&ǘcή/(?36 ml+%)i]Vs wnbiea ԪL9z\nC)zUbNḶi;::'szIAn,j]a]{Nɖk@g&͞xk31\c7XdX`[Y=BeBCx'rrfF\f+f$Q%Bk\#_ qi=/g0E[98xG8@pS8[!O6rt.?Y5^MBC7/ F/Lf=_+'w,GД㍕Xl3~7if2nM\l-bղwl$;g:9M+$N_5Y2g#8j'qw`Fy-rZDUѽ?bhF+uTk"a\x jz4]Ba֖Bwc=)tôEٺty_Ps:R,JnK-HL—|WY#qYWj 'PY.Ұ6T03v216`V]a=vAEn?sωB_T؂ F NzT$|7c~4sQ}n[8OP]s8EU"VQizD s6rIPr`dv135 .I0 `GS9CI!tp1@˼Oz5 jũTzfYBuMuO?.P`=_u-D 5omw!W+ xUz 2Ea*1iXfYp"Qs)W_/ka[q C[xsq!t2-}~7m<{4U_6Y=z);oYe,$ԖEC3Bj3N U1Z̒/F]OS]f&]P9i `NLU۹ntS?mbͳy6 L hojݿZ[B -؄'N5%umfRξDz\JgᏹImC-|o{`uQ{'3T,~YM \8W37H}aRxɟ'S{%Mmt29 v DٷvJ:hӣn.ɯĵpbIf cU6xbQCVBM֣是BK g9f`.6d ߴ)m}SI[|%ϸ]/EJ2 X{Qi s,8SjyU,b80amPsR=u.n443U5 "U8 LO?jqZ; \k*w`g`2%4r[O$ɐd:E*03 36& h Zo i=XԶ֤n'ΏeHf8ZsQv 0*$=JSْ.8e$_"U94QoL0& 1T<đw܃N=tH$E़\A4nh^qUoΩU3ْyCz+gy1[gi=#a{؟/WTAs/^w;h=@&}ŠM9wv ܙOͲZ'mf.d X)@MUmԧЙ>'NZqřfɫOFGD򶱼(e*{bb_F,Z X6?H/;R;ܿun˰&L{z𵌬 Ͳ5=Oj.ե`^?zAdz`h1ÅHצqyKo3XV3֗6ˊL#{}X"}bHׅǬ~ǐV S'HWAfdEi<TIwܮͧr ֲ̼UXEGk'('o7|5]9 ^qA?R"C\EG:/]mM;K 4&s 8X7eRio-|w(h%rg}8ߣH?m~,OX3TcwRbړIZ'UҁJ !2ӎ=zs3YGt>ǰnP qf\&5rPiU##_vLp\EDl>0R/㵗muMd,lSݖukU 7}XBl q))Jw^ݖ)t7濺,ݑNރ*7 *?ܖ?rzBܩ-q!-?yG(;'{9mf|zW~ezn^ 0m%#DQzP:^G:O3:2hv-yc@,b7-y{Ažuî` B[Ak{/7d].LNa -R음:g^f9^й]b.gZ+YRig_{f%sUL (P8vε ,7^X|[D 8tD؂6g3endstream endobj 417 0 obj << /Type /Font /Subtype /Type1 /Encoding 790 0 R /FirstChar 13 /LastChar 122 /Widths 791 0 R /BaseFont /FKDYXQ+CMR9 /FontDescriptor 415 0 R >> endobj 415 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /FKDYXQ+CMR9 /ItalicAngle 0 /StemV 74 /XHeight 431 /FontBBox [-39 -250 1036 750] /Flags 4 /CharSet (/fl/ffi/comma/period/slash/colon/I/M/S/a/b/c/d/e/f/g/h/i/j/l/m/n/o/p/r/s/t/u/w/x/y/z) /FontFile 416 0 R >> endobj 791 0 obj [571 856 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 285 0 285 514 0 0 0 0 0 0 0 0 0 0 285 0 0 0 0 0 0 0 0 0 0 0 0 0 0 371 0 0 0 942 0 0 0 0 0 571 0 0 0 0 0 0 0 0 0 0 0 0 0 514 571 457 571 457 314 514 571 285 314 0 285 856 571 514 571 0 402 405 400 571 0 742 542 542 457 ] endobj 790 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/fl/ffi 15/.notdef 44/comma 45/.notdef 46/period/slash 48/.notdef 58/colon 59/.notdef 73/I 74/.notdef 77/M 78/.notdef 83/S 84/.notdef 97/a/b/c/d/e/f/g/h/i/j 107/.notdef 108/l/m/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 119/w/x/y/z 123/.notdef] >> endobj 412 0 obj << /Length1 1161 /Length2 5278 /Length3 532 /Length 6033 /Filter /FlateDecode >> stream xgTS{ET HW i! J!@B *{/Q*RR)RsşY|9?g' qv B@J:0ITPɩCPgeR @B $zPvn ;8 ҁ#=p4@!ݼA h4 W y mP(pY#P~4m1 mܱ@\ @<w@6g7i bZH SlFhOPh1NXw7$AYj5 Y 78PpC#AB \UQ^H(7=vEG:alZh)T@ˍPj))v(g7Co_8'Cf˜p(/'\C3cr&,-!( B9 @H/{3ƍpDhE$Aw adN3|.89 XB毐7 $EJ!e$ ~T aBAo( v( : N#t1!At]C~C ߐ`o$ߐ'mSTx 7//wLXd[aÑH/$u vH -W)TvHѮíAqD^-tZʕ+l̮-T*4RǛ`1qtQXH v#ե4n،+3CAa |Sw܄_GԈ6"/lUn0իj ru֫MZäbyqP%\c-f)gi_9Q$_2i/tLVFw@W񺤢2Ybft[a; l,vQa+W4qv ~S/$7 {ϯrҔ"׭NB}rPu8)v~A= O\N7K+_:t= Sn,*ȒSmyq5yIw2-p~xj_]_Fb!̔\D+Ki`e%D]k Tw \v・7YvMxJa$沰UφQ%SG} E J$kW;͈55Y>Xf6-B*eŹD0m;7nl:mƌH,/-ynh"%]mx(;F1 EF7}C14aķ5-EjK'rr'ߧ?j-0%sUjmG?za-Ścx77kD&SƱJߥ#aKwQ>`uTNqTm-v9J`Egʚ5:\:֞Ji1L]T2re^:el^^>|#+rh0QӁ9V=#&bz,$eHiϪc;3۸.?H@~oo*fR`?r+@~wdܰCW(G P-rCS$@tNgL!` rUMU| &ķ3WdEj iӤ}ˍȠpKJH.H8HdsS,Iꜯ(\ԉhƢUU|gÃ$0,k%ˈh .:rD@TASe/oKi1ckӋ!.I|{?C_S~]7:F.j#5es *Z$ZF|W/챜G[2cFeһ+1Nsf=UNJ}N* p1f,.̈Z*p6L|{ahPnU1/rYk" ;|<K"Ѹwj206t-{qS?2SͅVy01&_'h ^2۸ P?uvW4aL)H:&}Qi.%хl3wCߦfgx AYzƞ+DS]m':at̍dhK Z#dV+=6ZS5jx\N.}gǫ@7s;O 1 KS7yA_d}jaܹ wɋȧ#v@(Ҩ·p[KJeD2ޱQ{#˽{_M g+~R^ ςF <" #?9^k+qM:Le ".*E>y;|Wȕ?G}ǁf;0炊ĺ#Sv]7_MKu{Vze(H;|)F֊6Ԩ}ɹ|r2mb2Y'zC \B׊tZ c\9`C\4>EGM8 ^(AʲLV”=!kWf m݋;a\kajx-&IDLtntNOm|zh~;# Pw.zs]fr-"pDKw4NQF 6OdyϢesҽ,T{ #+ #O2Oo7AcWNjҳh-:1 czֱ\njY$+Kou'烎+.XX15 Yfee/qRZ3YA]-N݅[o}pd u槟"ng< >>&vVhAIlu3}$'8]RݥUUq=ݠ Y1̑qv^~O/_~KC\. gN7G<-˖2 >]'z42ܵ{3c4m8HxsH%"zLg 4O eIݶw9dsf)e7FɧQ5[Nz;fuQCphMp< \QЈ;.R1kl*аP95)kvRW f/}H3B||:ǖ&,9Teǥ%)V Ec_9  f{VTC`ă<9.XL1vg&nG&4w52ۭyOI/͗ $E>1'ǍrV az8XPT]UH.DU^Y= ďy^I]}0+E~B9]Da#@w#N;/T+N9Z\;>wm6YOyF%DD,$wߓz s|Oe_ȃ$aQ娝 [mYL!2 胼}6>}i~赁 ~ӓs"[Yi}E8BiGW5z#s_<=w!b͚OTlH,u2Ւfg rD5 ?ox)cci\ؑ< (kv k5_um%֔@`+HO^)O Їkl@WjֈjZ*HT\+k 3+"AErDqcgKݐu:uKSJJ*G]qUE~0#;\b4įZ5Ҩ;R|3($nZ[% fjcõt-N\t])޳uXHNmUDDfݖp_˺J/>/oo 3V"rسQ!siO~5' 9Ncsk"g①5%چa1I4GCj bI{tWcE=|fomU~]ҵOqР8VՁ2a*tW6y[帎U2s=UqzXT-m-L^w:4}+%'):;(Iw|[9)R޾/t\G[&TSĖgag$V?~:1o/0YvN9u5e eBh@#87Dw |endstream endobj 414 0 obj << /Type /Font /Subtype /Type1 /Encoding 792 0 R /FirstChar 39 /LastChar 121 /Widths 793 0 R /BaseFont /KSXQOC+CMR9-Extend_980 /FontDescriptor 413 0 R >> endobj 413 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /KSXQOC+CMR9-Extend_980 /ItalicAngle -0 /StemV 74 /XHeight 431 /FontBBox [-39 -250 1036 750] /Flags 4 /CharSet (/quoteright/comma/period/F/I/J/M/S/a/c/d/e/f/g/i/k/l/m/n/o/p/r/s/t/u/v/x/y) /FontFile 412 0 R >> endobj 793 0 obj [280 0 0 0 0 280 0 280 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 657 0 0 364 518 0 0 923 0 0 0 0 0 560 0 0 0 0 0 0 0 0 0 0 0 0 0 504 0 448 560 448 308 504 0 280 0 532 280 839 560 504 560 0 394 397 392 560 532 0 532 532 ] endobj 792 0 obj << /Type /Encoding /Differences [ 0 /.notdef 39/quoteright 40/.notdef 44/comma 45/.notdef 46/period 47/.notdef 70/F 71/.notdef 73/I/J 75/.notdef 77/M 78/.notdef 83/S 84/.notdef 97/a 98/.notdef 99/c/d/e/f/g 104/.notdef 105/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v 119/.notdef 120/x/y 122/.notdef] >> endobj 409 0 obj << /Length1 786 /Length2 1538 /Length3 532 /Length 2113 /Filter /FlateDecode >> stream xRk0(2q0afU$\HI?Y7p=0Uޭ.rԊEW~>zM#ĸw8yG{[vDJZ%wTW]{UwE48OdUA{s+!4!֙?>Gn= WX;I[;ө)wgGy3姭D^ZSi{3w n]YCP!]EBcݿ;jv&f0?=2tِ$ڧ3+B饞- b۷RLCn^vDf SCݞ$ -iQV_a&[ɛ?Ī|S*Wԓ;d$ar*se魄,G$TD=nVD10tOLZropu &5ho:ѽ"m̚0 :I>ZwUod7h0s6P96ƫCWMS7NS{?FԸir.ZCÊLmU[N_k?mc[-'_ ZE*&u Mb# r)| v3]X%1ky M7_ybOR[WSޘSxIyycK_P g9Znha݃{Wo9ښՎ7:uJJ=r}D 0BxP>߄7O GEMgGDFKoynP/t2矮R}7RXADvajHT9v0qM4g4̧qeeǜK)8] sWEv6eX~~ȼGNw7Z[]S󔛡Zm #3)F{'))1*|+ح ;?toMV*1K@;(A1e,'~m6Ј+bZr+qG Dz~?.S2I(Z.޾Uɹ5`9Dž,갗FP͌sYG3WX{<|en]%9DžBD0A'T̢yaendstream endobj 410 0 obj << /Type /Font /Subtype /Type1 /Encoding 794 0 R /FirstChar 49 /LastChar 52 /Widths 795 0 R /BaseFont /BBPJGG+CMR6 /FontDescriptor 408 0 R >> endobj 408 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /BBPJGG+CMR6 /ItalicAngle 0 /StemV 83 /XHeight 431 /FontBBox [-20 -250 1193 750] /Flags 4 /CharSet (/one/two/three/four) /FontFile 409 0 R >> endobj 795 0 obj [611 611 611 611 ] endobj 794 0 obj << /Type /Encoding /Differences [ 0 /.notdef 49/one/two/three/four 53/.notdef] >> endobj 402 0 obj << /Length1 809 /Length2 1988 /Length3 532 /Length 2579 /Filter /FlateDecode >> stream xRk<cܪ-[n 3K l]4jGØafh$-"p({"esvW(ٿ}N9וּ>}]zVwrYR^-(SO DZAY Cc2#q@Sebb؂^p1( Dfhg8& X,$O؃L.L2 K:pެ` d8(42i bSAe/aJ tdB& P@* 7d}6Nw$mr/yO?<_SÃZYD-tH/qۖ)N4 @%VdPV"oK nE0̆Om>ωDcp p BX4.,EnN!@m_m 3)47`$ )!B!(Ơ\ /3a 4*2Yg`fh FOB@,܂Ca!ZeL0&$X Ʉ4 ~ls4^_ʼ֪b|VY;T]%;!(TbDT|noɳ'=Eҟ^䫍 U?8:f*NJ{i)7m/L= BL<M _mY;¼g59"صWwHg\DqmM_54œA}N~Gilvv@O.9繄pbsDGeDq¯bύFU>B괙]L5P] z#8?dXnQV4P{rucAAPҺ #vBkt5?U| [+-%w}P ?z+44޺sTxN Z]ǰu7Wo8sG"YJݲ7PxB#AEfO|~u3&Z"K=k;YڒExS֣W^ن#&fC/2A\֋7R%Vg @I>r`RVzsmnS⟯_}&ms~쪬iVe(TP ,eDBCKp*K\{6rSf` V[l}HLNY5~'Z5Dvjg'7-n*n!`P]g#Y"AA~Ct2\{a{ol`hR9ჳn3ƾgW]N:5E6 L˽x:u h"ƣJdzؼ"Vnā&#>\jVJ1J0,vGEJI.l;*n qSYʢ[[,z dr~Xv|VГ5A9}!1nϏ@s|lP}4 8x% 7c/k3,k;x+F ސzrjMZkJ{~/t򿙑ߝP)2Qaa5zn]c9T,ϗ$ L9C]49;DkiY *Q*+˓W jENrPnԝ33sJk'|m<oC?)4]{3-!Yc tJTS>t\aR﷓}F%:5q>çE,1^c:@fz.C}bR+Fr.\];oŒ4v1c'/ tBu:\gxr?|*4|fy-qJh|UMơΉ:š aT'SGLD  a#Ƿ{W3N׮Ql4 nN̞/7S_3J#â*vF-V)Jm\M5Bc2Usa{|o՘` iZ߶F{`Q3կ ?~sK4c9TaV"Wnw$F);-n67GFQX,OE>͕9'ӊ]uǝAL2q&=AeDt~n¤^)/N9NaH}Ft!鸐:%-mx<['`BQCбc+Fv Kd+4LچG`Åv5}ؚTP<ç-^BV35*ԉ3}{H%@gTptc3B' Rv㥊 %ɽ6T;\cw-tj."kc&T!Ғz\ {v*ZqIWeˎ%]6_Un^s^YK=FDU?Ʒ-J~wee^+.?M|S ' aXJGendstream endobj 404 0 obj << /Type /Font /Subtype /Type1 /Encoding 796 0 R /FirstChar 66 /LastChar 117 /Widths 797 0 R /BaseFont /ZCVIUZ+CMTI10-Extend_992 /FontDescriptor 403 0 R >> endobj 403 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ZCVIUZ+CMTI10-Extend_992 /ItalicAngle -14.0362 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/B/g/s/u) /FontFile 402 0 R >> endobj 797 0 obj [698 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 456 0 0 0 0 0 0 0 0 0 0 0 406 0 532 ] endobj 796 0 obj << /Type /Encoding /Differences [ 0 /.notdef 66/B 67/.notdef 103/g 104/.notdef 115/s 116/.notdef 117/u 118/.notdef] >> endobj 396 0 obj << /Length1 1075 /Length2 5583 /Length3 532 /Length 6296 /Filter /FlateDecode >> stream xW\S۷`C"5FJPU%A4i" ]iґD4" H4xܵ9o9&?XLEi`1b (o-!a8Ũ!yf̳r04,1hYu6Ejnʹ8pDjAdYhabP~2KT{}JQgFl7pکwkbnJv@r?v7Ҙ;~!i_7{)kpN ʓ0~=Y0ߧ߇Gp=MNӀ?N/#({`,J̛VqJ&l]cc>%-YJk<{)~H*b9Fj|E@/M7~uFB[n|2Rz}Ng13!V7M'+,Ve%=V$2~xFlo~Wp2K|Q=#~a:6=.j8 k{!ԃ'm?>|z•,kFuP>8=So LƞeY+0y4(Ƚ$!zh{frJ ;,\3?KN`#9((^f&ǔC *Uw_Q<Ԭh_}ȻN:Vp5IWnz5O݀eGb!gIB-*k5\}wݶVXӜ yPʗD}| p.?UKg0W0n*xJbJmt:Hw^+,b:77hNM:_U?SF!K@Α %UEV'cwn "ө .m.-.>5p\~$I}$%E Ƈz1*`R$ ?8/:WWzCu c!i^xk鳃*`cN8rQÿ2 qB`bDUS8Fv=хEqttW"{~]?m|HuU;ʸlY¨iLww ; ku~:˟-#ʋe>44(G[4idBL`s{;pl^pv'岞8&`Vky.0ttrXBۮ2ֿN 'R?B=Ki :bB[&tlG}ngz7ޅ$56>5byK%T=}N}y5*0ezTRe{v,q#JuF?y"7Ϟ\?a A0]hWb~^x[!s5y,yԫF;Dһ˴U&oIɲ(r;=43'fl}]<'fy8|,RejB/UY.>&Ea#yQҬ FOȻj]5513vSnQ/xURYӖYؔ:lrX+ k[pWY\h^قcU!H$^}hTEʌyyQ..RYC0ue1#7oI/Kv=ȋ-EzBĎn7{gYd\ٿ`>ZN`ogz~{2=0닼AįZL]ӼdcB^)wQE3)}"=X7`u惋K'#>#աᑩk~BS;g=lZ!?-_tiSeq~ Ne^w[[EOLQh维U,/x?.+9%++ډ$ԉzgD o+l 79O|2̴[=hq|w6}ZnXzuDg8om4w_]ܤ6緖"$95\R}9f39K T E1ɘj9l]+cp7J>Y|XYeD7*uDž Dw⍼#S74L/*~۲{&#D<-)rXwXQ0(x0wفJ@0I? 7_ajnlzO!PDjq:>&1S'(ʀUw9{8y)lVh*"L=Z%e:jm wt1~9,{ŒRV:V>j|/J|順Ǒtѭ$E!Ց!o|K~V y-{1NIJ?7<3mIiWu/8đT~Υ5uֹ܎)v[1NH$z|ƏVj9?h4F! |cAP|Hw!gz ύV #Jd:OˆoYqfI|fƕЧ?E_ !k[+`,NJKİ@>6*s4ߚ6o-]B-ŸL3N *u KZQyq)fh˝V35Wj]JMz=:pTyI5z*De "z:tL1RAJ! .E)V+n gxZ(4t( O‹sLɈ۹OtV"s-bb:JsHZtAZ1}~*\AWB? 2FL $Ǒe d3˜ң7όs1HX V=ig1Yp8Hca#ߓy;n`¬0BQS5UU:轛sqe>,iB7s)Xf>ܙ= Я /E-?KqyiU;T!!3,A>r{ jҨ{5N0cfO?) {$<-fG%ΌwI SS^oրN6$RW!Κ$0_OL͎,/ƋFE?tƂD;ipnEJvΡ2/Bnym~l0޻w)hx3-2*YƉm Yy(Oi eeaz!uaւk&WۓN}"wctE[y$1v]RlCsU^4hΨr'Lm=aoOg9eǜ1ح@3$`z3Jr<ȡ|'9o S >~636) 6F *3ȏu1d@{MFY}qeEe͋_#?|? \P's:fendstream endobj 398 0 obj << /Type /Font /Subtype /Type1 /Encoding 798 0 R /FirstChar 67 /LastChar 122 /Widths 799 0 R /BaseFont /WEADFJ+CMTI10-Extend_1008 /FontDescriptor 397 0 R >> endobj 397 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /WEADFJ+CMTI10-Extend_1008 /ItalicAngle -14.0362 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/C/O/P/T/a/b/e/f/g/h/i/k/l/m/n/o/p/r/s/t/w/z) /FontFile 396 0 R >> endobj 799 0 obj [721 0 0 0 0 0 0 0 0 0 0 0 773 684 0 0 0 721 0 0 0 0 0 0 0 0 0 0 0 0 515 464 0 0 464 309 464 515 309 0 464 258 824 567 515 515 0 425 412 335 0 0 670 0 0 412 ] endobj 798 0 obj << /Type /Encoding /Differences [ 0 /.notdef 67/C 68/.notdef 79/O/P 81/.notdef 84/T 85/.notdef 97/a/b 99/.notdef 101/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t 117/.notdef 119/w 120/.notdef 122/z 123/.notdef] >> endobj 391 0 obj << /Length1 1780 /Length2 12440 /Length3 532 /Length 13443 /Filter /FlateDecode >> stream xeT\֨Ӹ7ڸ{pC xp A5Xpw r|=5SEC"ndqrtg`H*kp8X%hh$]fNRf@A'@hDH:9Z۸%I;]m-f6@f -݇ 4]=HK[ w9%yG+'߿ÖKtr,VHl*Nj@Z=b,l` N@W%SuvSZz8wB;d&c TuX܀-[rR`Vd*;8ׄyjfZ>O17?o5`j>M`ql-7xlN.\``W F 7hiE07;ZJn`'`q: 8Y @fn6"6_ӟX{{i۸gN\,_`]7n@Ͽ\;S!pOC !!SCzJ\O?4WC <|ux<ş  ٳmmB_^d@!k6ǿlB_r 9D!/[y`+Ͽlף V>!/li t}IH8yp?{!_0a+[5 z-,ޅeDVJM}enMRiF[J(07=Ufc{=v˜$eοye]e+:Sއwݜ@άV] Ki3l ӓiGE4rQh`dTDsGyaME!1^:uy`=!&bZtsib=)/@^+t hȇcGIL_OHG+{3wQ_/1b2)VX*aH)r{D}=?|RL >GOu/1b0@m7Ι@&DtM{~/Pdd'j>0$vL8F v%Zid6ASyFY ʿk b]LZEs`NHwc$v ^ \94>^gc6uUH݈rSZ ]xyiڠ sȢC $Fxk-d%]ǨQ0+.Bƻ)eBlz`.2O jl03wC.p7 =`8?5{7g0VQe=?乴|T8ʽlKOK#hqRF o?~ nOF=;0n}|iyΦC[d9\`ak*Ḭۡ~+FnZUYV)*~HIDJ D 9OEhܕw_& ]:L#Mbwćw<2".AN^KC^:'qKeɊ ǽE&v9vJRV#~ ײlؽ,~ihQ孒 C;hIN6IM>ZiTJIQ FRJ9ZqA[bC˯cl69WoeIhs^_9{q_?p\4Q(ETssvX3dgK{xCeeD>C'{1CW:V&혀}@9# x5s8^, &ޣ>!?J)EX.6 <'lm&x?JmZ5^;1ԗ3W}`]$8rƵ.Ud"@Ni?'etkΧ;=r'H^DH6t&.ebpBmn̓'=VBf:qDB~ UG<!̣ Q3 )5=>'-D0D~PYfs4daJj b(gLVk9z!jTPVOZ<#(y)FCBB=w\~]H! FY[V` B_[<}L_(7l6=~0OlHw2$QEw|Z-JېaE|gP++jhtGYJgkiGV~ʵII#]Jf!ӟ R^U8K>4(H0" ZAW'=9*`\Nw_6VLPWvy70k!5-x# O qgl$C"WuG}u꧰wWZ:OMΰfU" u*j12bM֦BDfج.i^KYzD+sތ;ygVYEE;vtTF[75? jUŝw 7&+3]!DNm 'q5 .#3_lŊHOj1OW:Y2J8XһSOՔ8ϋ|k|D?3#X7d aW,}O1r  ƑdAZ w5~Gt|E==,^ [$ *FK.f(dм{3{sW3S+3L˫Nn93u>_ PW 'f{;}BnvwlX{۫S6TA\M4^\4uD;qϴYٛi:tD!ܹfG~T R I#زyß0_5OQW>@rdL8_;.$4fNN݄(ܘqI"m8:G Eag T0R0)"*ɌFԚ_AoV=[6 ÉP94GJ~d" ʰmVU:tBനX0ZÚ\gʔ $𬠿Trh7<3W]7ޒ ui7֟l2L`6B=S̑pAĨpCHA2"!s;|ї{fʩ )}{;r\idQQaL;* *_2I?O k ԰,jܲ1$BE)\fIZ F#cgBC:>equ`%Y+HR `IgLh34ȓx͚Bj%plK Iq mga:g{2HB#4"&u_tG]~th]TY ;k:KFxg٭Jb%WɁ]e*Ӭ@v΄JX#/CqLna Oe[4(SElFԯLjxN<`]C7;T_PbtI7 -  gh&W:'/]+H y&ymΎtCA1ߍ'ӋIZ#{`Idé%cNT@ HI2З:Zt>g& tT)5+̝vIvӹ/WMߺɗfal6Ŀ1%9<,t{ ƵU[†ݸW]#<=c`B =k>z!ʢ7PH-/${v *%k-HK|y3xnôVŭyjml.Fѻ>]JůC8m{qjʹAz!| vdߙnql=Щ[ZD <bdnC]4?Jk"X[:dyHRuvJlxo 8NZ ?JZ {Ǟphp|o@Fh10uR`6++{ZY…·ʢ2E \})-XL.Z].᤾%g(iG4-9e~l/`'V>7 c ).4B+ `;c^zitRj:Io5rDa+r~Oljz\ t璾UGcBY~ 럓KSZ 6]_Ae0DMYg_S>HsDN-8Fm`h򌝠D-U]؞pYEo QE\˾(Tbh)O&k#.1}Y9-I3hRb' inD;)\ b:&\T0iʻf@ )#fx8pBLګdd2"oÞk\4u:cifiUP d,KZ>B}r+C'qо".^ՠt ԥ'as*HrQT&f`43C ;F?ڈ0UiA PDNE7z$0?yp+vc+uS",r/fԐB-x8q.,+Qi Z0~9 jHD6acWTHGZya SW=9n~YsE -j3'1--?yY 8;miSGHKOK< ٶW 9 [V^8E`C]_ 6C&M ?}jJuQ[L'O./JOfQ72z /!*br㘖*6BjX%jx?}H[Z'ձ_R[iYH/G~% l~]ag'ȲJes϶D mYNozJ9HLLl51RZA]F=&9U!|K7L鱖GGKNdvwte_.$vCZgپ$MGP 38z1 <'L)j `Puѷ 3`4@L̽Sz,u5߃42Wrr]㮮~^'ӓ`ae!%^ZԙtLH!R Q-DS|E~SKȻ^_ɟQጆ2?GˇEJ4m]E@.E`mS\@SĿnM9u!zHxQ;[8#HX9ZTʻrw4h}h:0{yG7`g6EGS#yuNyXΠ:w򶾩'ehABhͺ­1lr!~r`s}ВQ1|tbJ©zf&_V%iLWpJ;hek|ϩWnӯ'_ n̯Bo8Q|!_TƬd)'y?RD1演ZwwDsb~I }yZìlbav穱_W^3IӬxI"( [%ut:P!(nnN݇HQOK|vtc7$7|m9. tyI=zoHqQ:/wm*MmĝC7J/":N^(4%$Ob\}R UmnhJد^ɞuGVD?ESo#ɪJ|Õfqa$;"盓ꏊ֗Y['~;`[ %!%Bx6$ZСA;eB)7oV&9Hr4 =u0FMY:Cs4rfPgu>ol|vg¾g7RGA5JkPD́f xTgnF{c. DCH~d@P:YR(pD9T u ~eZ:cV)_WCN{ŷ"gˢ ugЁl{\HqƌC0Y瓞iBrnBY_a ֕enᣯ"p-Y~os#`2hYAyqGL/!O% vZeC8|9~9@ZC.9"SM[C5PFxbڻgC*2 .['rXMkoWxfό˓r E0]) V n/hBk!5;CvoVޅagT/']F d/B]:jD C> us\ H~lxtˑ_/8rR Q11ylo!U!r;ʶaPb:9yc*(;WMjMu rYͥQSP6z1}nvEm~-e{ݺGJbql2Flnl$__ˌѳzi7#{a8/s;BvJBĚ>EI㰰ɑJ^LoEȢŤ{5ڤ&:÷=zbY Ƒv0LV\ ]v NJNi6.RMy4>[> S5xuiܤx vq|}ɉ0!"H%M8Urh{Vzһc=id'25.1HELŸSSa9>h ^b6:*!ާO>tq5 X ۰ƾtrS;l?+M"_D;>m̂45Tduq1UuSw9 &]M}e48_r^:e`3=Pc!t7?witۮ޴W$9R3{B q#P9#,љ-3Dh&{.I˗R۹9AI$m<dz#$˃:O'h~ QF]a(t~φƝʅ(yRQw3‹TUHjfqB"܍TN4Gx#hKQ帕G=Sc87~9R: B=O̤ZXg<S8u {- E-Cמ:;D$OP111ޱ\^NriGV: 07IҐlbNshz $?a,S8 ֝~iXm oL_*̈oi&bj.^ws؏.$<*vv:9-bKͷ1GH']]A}د@藹]^H_a zMQDcO1BJ!Im: ʞwLLyOq1pO Ilwm=dKH %"QDv z9!"64{7]b[k;.{BJ+ߩn!WaQy䧜lhDrIY.yB7ٮZ rؔpD7\&aw^;:T\%6JJCAfm/#֜n_E1lKj, e_? r>, V͓8{Ϸ'ק,UJ~侨xg?+59#obԶIѴgl%cnI9n};X27yK`6=1xc #|˺`y<$Ig8cl=-g1w*Z,i|W<vQN G6H{1l1 ^ MzfHү[7ª̲Px cr⠞e$7V546&vigͱpTA_iKic.nS, ^zT N-k3l7z/moųHy , ;6j@wz/=a#?֎^*n/M4ő#NEΟs oh=Ay_?g(v6n "^)B=rNJC< 䭪1z4U9{?n MU=$"myBPЛN,;GƦ$3{O`a),-YZfFXHŐ׎kXs6GE&d lE5hG:y⨡G]ˈnVz]ZZ Y1{[>d) 3Tovj_ud]JwOrĶK_+@5FQw? p?h?t#10`J\~f/|j(`˭W@w`zaET92ѰWϸ⊰D'A*Ҵbe/xxƶ˕ד`a4ٸ-"JXyf Vđ|}m|V;k s#F('Ňk&_׈-Ŀ^қWvGyrImgnF/~~.jŠDd>ՐƟ?˹~`=?NPXCh_ۗZAZ(G_5Y,U&$` ;"S+d|/b!::/Lh^'+!'y6&p(p݈(Dk~ȬQVO9zu:)n]kdcO"h}vH>햅rU rR2}KH%֯ר7h}Œ_"0ߣhP_g cD,Uy~1ut:AWu_؈xj9hjdzꋋNxJ$O =ss3 Bqe?D 7.kJr^Y 5WԦy"P @ɢHmщtVN$)Yݶ٘ { `HA9kQ[Hѷ tn= ]F_aY18='`9{fA,^M2ZZς"nŽ\!#/7ț&L$.bVܹòb8Izf~ﰆZbo|V5p%??[G ?{6H=|sӏF:1.`fSymӀbdL(cvߚ\>@ڐp{f&QAωGW\ORwfNQA^~ o *]E , 裲`ٹy%S!LQ++'O;T ++|f޻d~)_)Y(KM bFEa}d"qgҁ‹'hM8c:#u&pBF['0*YxF/I9ӛ;ĵikjVy+w3UQ5݇<>߅ŧmo" ybK$ngs?$2O=4 ȠV39EP?L(齢i`zAMQvTA8g mc ?ܓ/km[KW@!l[,v ҇9-Gbe1i00 S*f2)wܽOמ+׸:v<1ҧe b8RIA셛e83Y^t![Wx^5YA`ITѿ2R$!tڼ寬v0퐃5Zk'w6D0_HBb<-G#EFecodɏfU&sK+~j4e]"h4o#DO{QXm] _{Ejג=GSeyod1jԩ6=w0~ơ67~qKƹr!zGDm#NZ#@G;ȕ2vǡWN:u< Λ<>zx im+k1dC_߀zc뷷[rzW\!$^:64?U< ZgXrfD@QkrR{4-8S(rV)Ldot-j(&z$3f&F%u$I]=JcIK\:ɱbhn^/OlӾգ<_݋=|NhE?;4ic/%e_a1?c .ix1yZDzn2ݹ.yYk{œ2S;|*<Fl7CMd&?>8XɅ:Moô傊UyւsPP2֊1Sb"Vb-ʟq{'ՉSMEj| Oʮb䊱S2##D@ Ҕgwn+O[ Ps=[0yњ (ݷ(a^Qܖ14zό6V$\LYIEalsZ;5zm;rAlB(R]mJq,XBEʡJLK=~GE3#"hZs\f5g&Mu̝>[wdEH/81ʼQ۬~r5A|L;Tø邠B&F>͆[z~YN戥TU k[qe:7Uv+"Hd/ nHuO%2nLAvFc~ J#6>ëM"BI'F& 0pdV,>qf"1#G鿫 M-re8Ͱ\\h< AJ`8[zsM!6ٶoѴ]hy֐xi2ϕ|<֭:h"볅!!1iYIm|_ :4ysS͙Z9y0^(1f,@@3Ww'3W{(Ќdendstream endobj 393 0 obj << /Type /Font /Subtype /Type1 /Encoding 800 0 R /FirstChar 11 /LastChar 127 /Widths 801 0 R /BaseFont /ERXUJC+CMR10-Extend_1008 /FontDescriptor 392 0 R >> endobj 392 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ERXUJC+CMR10-Extend_1008 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/quotedblright/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/A/B/C/D/F/H/I/J/K/L/M/P/R/S/T/U/W/Y/quotedblleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/dieresis) /FontFile 391 0 R >> endobj 801 0 obj [588 560 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 504 0 0 0 0 280 392 392 0 0 280 336 280 504 504 504 504 504 504 504 504 504 504 0 0 0 0 0 0 0 0 756 714 728 770 0 658 0 756 364 518 784 630 924 0 0 686 0 742 560 728 756 0 1036 0 756 0 0 504 0 0 0 0 504 560 448 560 448 308 504 560 280 308 532 280 840 560 504 560 532 395 398 392 560 532 728 532 532 448 0 0 0 0 504 ] endobj 800 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi 13/.notdef 34/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight 57/.notdef 65/A/B/C/D 69/.notdef 70/F 71/.notdef 72/H/I/J/K/L/M 78/.notdef 80/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 127/dieresis 128/.notdef] >> endobj 385 0 obj << /Length1 1994 /Length2 14441 /Length3 532 /Length 15535 /Filter /FlateDecode >> stream xcxڸ4mvҨib۶mNVcIc{oǙOs:׍HQN ncHDM("HD( KF&bw4wp2qq1 /7+73,#!?8fքr+`*6fG7zB!KKBZ8*#zX&&B#3CGB5,?JR69"gP_T@I#kK7B#1, 0\R^[TurwU FfNVTQP@+HДX8Kg_ brB4RsuͬUlvb? ({3WBmFL3rqLz_Ŭ m̬M `{ HlLfFWB+P؄8C^6,/p0+odddb 98 ,)22-E'*Z:9 XY2ٚ؁im8,LD8 6@_k ( hj?3ed'\9U\0P+p5f6"O#v`7B؅6C8Dp8[AgQ uE/ d.v,$Ŷ̫Vd艄lLf[/b͵ ttXIHʣ~/"b' 7<+ $OufKyV:=g"Tm_[In$$Cɪf1Od v[m1%G\qtm>ЯJcnTt9{&og f"C~<&0Q&_07H =u@a.+j0lQy:7?zK_]99”Rnc N)6&̥32 v櫨WkIgX, G$ܭk1\:!E&fܺo*-{& sVL%"* t-DgEN>ep3ܔ OޙFJsMqR`N-wW8ϧJ=)}g 0 S9c'R>䪒J_c9<׃]6/D-&]X+'Uw ]Gy?80q@ܨ#C AGv\ ?O8}2@EC.gpRY+Qom35bQȝ o/ٍbAfJw, AmR(!vE7krJw_ɀ|Q?Og\ 1Ls7-, J'", ;{q'nKȟHk1^_tb[%eZzt ̶~a#Ey=/ ,r}<(0)SOb`B` 㤟os-hrtC~m$t"1AXw[_ 9 Ҽim YuFIZ#"D+=o@s>3ͥkŃnt 5B-8eA{ytg3 O6Ec]hYͳ_D&XOʹIFѻ)J7G74OK}jao3}[=V-N;H [3C0NXoJRDQ#q8u#X `eF8&ѪBTR1?W=>eCV%]oG-]'9U Ad%KMMh]c BQXjA5.ߨbKwwddՒف!ڼTXb2ST{%w#DUZ(H,E@x0YD1ӣ״xn-oc)Y{xi'ۓi-IWelD1(> jxF_|{M)ҧI# ={(.7Ê=tgaG'K2JP\eHK5]H2R  q(ۄ>[h~5\ IH=X#dfC颼ktr|8؛qO6%GJ1e9|] A)q?㌙*y}V*FD۰c+oH ՙE;!bY/2wP 0fjjTo5X,bƧC;s@tZ 8 rSaHJ3;4J"Hn-4Xw/NExq{3Q u?giL~F% wfK1fQ^9Sě&"UѐR V.W?Dp$ݘT{^>`ZZy5 ҄q>OMcmΝCm7b HS,RqJ{Yۭ j/+uS0\}lqg$lM,^5: _(ɴ,X%oé"XW7Y/s_m@cg,2nREd/`"fByzJxqx cKz g3RKqf-9j?B7;LH7{`Fh{ UpO,> 8Â|y.s5Q ͈Vkz[M֣{ucx3K䦴vݗ 6%u`&xH<Zq#` p l\'߭mtK(:] >F+Ѓw*]}cE6V|:s˰ N!Kn'}AJd{ 33QamsU,R,C4 o" D/uHegz?$vZ~*vč-reOjYmB:&,cFM D8BLE5wTگA9 M,þ7~;'nS (%mF)"0ŀ#$7.dXBbcTmv,]p4jêxTRutkNi)8!fLN`Zf6989:D'XRGN^i2pQc0)ȾW6N: qDuEi5:D)Qgf;ﳮjw=Bw% ]pPq66䨗yj[GW}^WF+KMy>;UU{˫}CoC܊ CȉP&KTBVU:eV { *yO\Qxx_5*5?S#ۄx7҂] Zҁu#rb fBꆓFb>q Ju^Û~Q )U5]eϏP* -eQ&j3I>}nϤ#\%?W*F.kfͫGK"yD^Դ$$LqOK/'qۻԢ;Ҟ\fV%=|[غV<@)قxmIImqN /6[&JtϖEp@0d>j;6a#^Hx|F[tΗԤM /m_y@鈒`sxGs2Eqa7EJ8n8d{ע&+*E1 I[24bn\]RR݃(Ii!d͞$I;{W|<&F#k]j߆v{ ѭ_-Z0z̯7_rts#`RgȰnxDW qM k*L#]qT8BbO1TRŒ%hB2:v|Gӟ<H[mZ TI7$6.e@%”$4KZ E+viSX"w N]!^htȷ810.vЪ ֒d&;幰:h";:~*87w$^p_~#ٳ=+9 21H^_v:4ňdEOm$%ER;(zG$R{'LHնGS[nキ)3*.؂ai뻖;7v=У~_}5`y틫g6uB6*~7vK6zVj}kp%QfmU!j rT+BS˘#5saG}#;Bz'"? ;mWqwOТLyC@iRCk.Ju\Ŀ ~HcVi'@g,F;]>y-025u} \"ML2~i-FXfeӽQ8•/q;eYK SiVI\ˇa[I%dREΝ,Z}d.Jcx])POTs:PjZkg dJ$hh+z(&NO{A-DJ̮?o ]NLNQIӉkUHUwFPcU~Al%pPFK%FԨ}(5^ZP߿io,MѲ35vG+F>"Sږw̋zf/jz|qQl+oP9PAut|ԁldvW^, .%nŮ`]sϠ e3n-)~֓V%aoR"w^ǯ }X<'8"1M\6ph iRX`|FVt,5>«@\Cv ǣ'LDNʀ$\=pA&aU:^3;i Y[h ;0vqݛ]!2a|5 ZX8€2I 7rh3{V* Yצc0hPaAUӭAڴ }[paqI s|Ȩj`V'p,G;ϷF5: AR/:?F %㏱IK}3wDu[aПQ96mwShi;n"TZOm)l!Rkc( խ)|3 G'eT֚wȌ~Bbr쁷#l*ẻoܿ/JgI3 5J 6CHH Ͽ_xt3n\F s«Iڞ=S>ɬh9UD4?ɐN@b~m&q쬨R^ڴc fv^Mƽy>G3Q3n6$@SL@@2:8V=Dew,عJՎVMӜȬ / e,6*jf8A3/a7eRӔi*d IjF*~Ϗ bs%ߌr* P!i>(o٦٤T)_F>eq@Tdӕ6oxrmzp cX^НOUCbwѝӡiS0d沽̑8 # jfd6굯YYgq쫘{ː:s-Ey FE_ek33.Z>wgzmmFp bYo0;, xq ޴LA U09KcHxBMDJJ>7䫣 ELa6)qdyRdV6xlG8 f%MܢyeƿÆ7콉%G֭tecKnO"v?:>g"xޒC1,kKUnTWM|]B(|P2/*?e'0Lvo+ϒvMgS(gQvޚCLRvE2HoQ%9 c}ʡN9 4qlKgm+A6%is}ˋ@xCMu\uA |NJm(kZLFCS|\l!PUq=݅{/Ӊg&xি*;hD^ug6 {9lw *Rt es{e9$"&. P?\ā*L$O'hIuk~.P |uu?`,[~O3Ri{^y3WLd*㹏2Ug'Li!2|;rd!'G(>8NjMTfve|X)Vwh(bj*ܘZ'?zʈHp,5ˤx#e([3Ȕ x>Z A\A,iKN2/0A6gT Z(bG%RO;ߓT`TWℍ=wSGa{㊙ڮ7]f/Ӊ+TWMŃ)&1ǯTW`vl@ 1$w|/ ǂ]iv;z& (8*y=g*EmQܶK@RK5D EڹY Oh[+1zy4_K7v3Y94@\[mߩ7r_U/YFnh^)=8.dj{M(ߥc0'[hJHK~^8Z.dHJNȨ偕*xņUc9\ l:l<,s̱d țV 3VK|EP-=JF¡2dTBԤ/YjEtJi@&K?ᗑsAggr4|/`+7Լ|j\p, 5'ɣʣ(T2:JKK=K_G@|UgtS+#/b2:Fq}k?ʤK˒6lY0پS z7iȢˋA`$(+dAElg{ ~o=aHOAѝ~-ޝսZHx"@R NUtCEvuu'EZYH^I!>}mK=B񆞩Bdn܍Цe2BI{ԅߙ)E(Σr$% qWCpURa%fF><2ӅKB54 ۗ*bO]'!V$LfsEggSw"\%LZveSʠ 2u zv|\}rl>;ߢ s4&M^Q'FX׊TRYP"vC- Q=SJ]!FhryWEx NHVa(9m:*ӔzhYVk Ğ'tlD (n0?D+bZƀo$,7q3.",NǠiBns&\q(1MQ_o*s3,!D|{i:A5Lfj#0UMQfE?\6|90āESގ[][n{X,ڊU=4Ӡ%R<%43G%Nkx RX8 x6/uhR4KW,QV10Hpz1-^zSG +HG6)T䣁vn(Gm5u1KJBX~ £2q'imX#Z's,$Tu;@Tt75uE JxLoЮ`wwh of*zdwToݣHѮ|> z(C^.u0()#0,ϫ;l3Jly d)̎bb],|ɣ* PP1]\Di|E6gB|#w=O`&YL/ X-H2=b.]XY:ف\rLU8DxW_L }#/6!*PRlo!٤I#v._a+A&$ !x!r|0^+t9bÅ+{< F{=As&V'c 8Hk& ʲ1IҀ6X*LQG $_TpG)K&-;߫}B-) p =R`81\W=Ue7 ( m{ ׳1w!J'N|{V33'ki%)x-L^Gm i]ʿlIj84wު.h5`XhdUOo mIt`'Uq{JsRh?Vz|܅؃6:~j%S&|2%aػu1Ti"ǫBYM2m>`R>8 Z0D%z BE1r[C 7| R*t 5d$XP8-LvPE5Е/:BNXzlCK*pɸ|τ4g_Ԉ7 "  ;0>#C}*.8C/t)zDYIU~8uDG @&^T~[aʬ06>k\A⪬/CDfO+& V]\/gϋ&%q}:< aop;0%FR۸rޜoO~76&<0R+B?$c4%|-͸ypidp>LN`JD'J:?D]4rrRڨkI}9 QQX*XZKҚKAμGVK7㎪h[v݄'/Χa@jkA73Y2{(!8mgf~h'ڏcr\j9p` gD26H9W0,x]ORuͱ'o[8dll&Ş-|ptU[4R}~#(myv`đZln'>$VF"W[Q`.aWsQ"$uBY],Ws ðy04fŠ]GJW 2;ߋk[vJ8ܢ݋xyXpəVCbw`PAVt_p{#Hҽ h!߻op)8>'<z..(1 qAj2kA0J|0ꬄf$D_6T?t u|~·sv:71*մs@ׯXE>~|l~B~9HYq'}.j3nqn^)`/^v \l,fLlypUZۆ>ח;GY:5Qm["qxn;1?OU̳K92$4ao JXyk]͉'ߦoܼ5/[kl^vn⊭N,f>]%oFsGƹ.jKbcHR%LDE=UvD{Y1zFqt<6[߹73ɯχ̇N2b ˱c`0O\s]n_h@#7ٻ[ꂔS829[Eg{f(uL~}"T0FSzs5穅Ś)Zxʗ\VY{ 2=ZCawpzmöN7(^*ֹ;;~H?ϗ[iE#"^aA䶒8km:/Z 98=uma#Xp4a<\60dX(-Ե 7֥4<9#{X ś)J ̿<9 5S;5i+VIKNT,O\ӤlTұ3 [t;3\!>K$NDFJd<΁~Ah{uýVa&丐aW #NL"͂4#mtےܝI6W¾}B1BP 7-i?0Y8{r nh[>\YpA׌8.΍'V{XAԷl$ݮeSZ8ciEzVaVX[3-Z̬cETU?{~ScQgˬЉQN(gȜjuL =0#\Kagsʍ'm1jiMfxz t"~~Tj^׿z~R)ꩂ 5d nf-`Bl^5!$d'NQ>Cw֭H|RD3 6nb3lyaBmMkqWx$.> sC;-OIS8zo۷T4gkW1_+M(/~>M9_cfHO*XJ3?CK~Hendstream endobj 387 0 obj << /Type /Font /Subtype /Type1 /Encoding 802 0 R /FirstChar 11 /LastChar 127 /Widths 803 0 R /BaseFont /WREMPA+CMR10-Extend_980 /FontDescriptor 386 0 R >> endobj 386 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /WREMPA+CMR10-Extend_980 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/quotedblright/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/Y/Z/bracketleft/quotedblleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/dieresis) /FontFile 385 0 R >> endobj 803 0 obj [572 544 544 817 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 0 0 0 0 272 381 381 0 762 272 327 272 490 490 490 490 490 490 490 490 490 490 490 272 0 0 0 0 0 0 735 694 708 749 667 640 769 735 354 504 762 613 898 735 762 667 0 721 544 708 735 735 1007 0 735 599 272 490 272 0 0 0 490 544 436 544 436 299 490 544 272 299 517 272 817 544 490 544 517 384 387 381 544 517 708 517 517 436 0 0 0 0 490 ] endobj 802 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 34/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W 88/.notdef 89/Y/Z/bracketleft/quotedblleft/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 127/dieresis 128/.notdef] >> endobj 382 0 obj << /Length1 1250 /Length2 8314 /Length3 532 /Length 9106 /Filter /FlateDecode >> stream xU\\۶ N @ w).U@AA܂4 ; -ާs׫9kUEK*Advά 6PRYSqpHhi%!P3D@̞O7@ {8B- %m!PsS;) 7B=؀0PN@uf@@0h$og+ v)Wӓ) 6O&p; O^o2.0_7hwA\@v _naow)$%!~ .q7@vIV+CO ֱCO^MOCOM 2?dOV-'Y?|Oft$> 9O]rr>Oܸp 7@VNn\yLsGGo-l}:2;077 %G:oщ,(h-.EmYoʱaLB 7ZtX^%"^=n ƜT c}#.lیכ +m(UJ \pٙ3ߑ9d0V0Y)q@+iz{kifE D2t=fzN7_nmuF- ޢ"o8֓(1p1plZpKBf`zm>WŤ[D~I V͜V~cI>QFWdS6#`xQ%gmIK^|"e_^MQ_y}K=0@G0`o lgLԼ՜5e2:޵zdVPHJm73tF iCw\n\k(QvaƜĪ|>ak?5;‚` zI$)%M|T[-3Xz/"󱁶zTNر ڞB9:yLzjBlN==o)}v.|oCy #p  ЅѪkZHΔ0>3(7bmV6 :}d8whE)r}{J G8s}z[" Z:ŒF*! AcbkQ1*7Nd.slW%s{@t.vt[w A!yLw+!1fg*ep A&[Cd=]4.؀%RY-A3~ H(]+^ũE5Y~vZuW>ڰLN8?klg5 n.dI,l׏7.7B:M0\?+ /)lʴ(ξYAae&/J`CSrmu'ΓON6r[ |Vה WoϺnV7_Q5-smf⼴?'!H[PgȋQ|dJh]~~4-pK"hi#4Rcds%Z3P$1~t&UKg"cp;tnHm͆JЅW{e8xzUmCŌdɯwpAx&~8/z* +찛=3{JVKd׾flJoZd,38-O J8vƵX=Σk췬8d^ PvP,)*P3+VCgaj5e*FkPQzL9ԙ\ağo(j3=*?XQ(#^+(h1 {K|0)g!-"G~wSU^P]vT^9Z,}6H6F-?Ѭei/;>bp=-_Xp_+:$`<<*ti{S7*/ϿC.NJ*<^꣰LFD !Zަ$ܯyOg&onȽs 3ŹpUۨaC=&$EP}~!.}bB-1/iSWc*}M .oYi6 H:Xu-TNn&*ՖORTj8듭ƕNkvXx0fQ\!iNȤH1Y\ N]?:gg=Y#~/*H1'%X^B4`/xoj! ]f2y& ]pϝ.׵ fao4k0-J7>H`{9F"Su/8e%lC{NOpx޾0+H !c헸!`6ic1GfZ2N36m ]"io雾e*] :[2_v+ZͻTਲM}_$ܪO,fY}e3ޔ!8F`,'` Yph Z晭~0KVKQx 2 8+0&̊8h۽ɫE5'jeKML7ҐcVM3|0ϫj3GS"Mb"-/ 蛤Iiw|M$䝬)%#j[Ql6U;][UNy:\-WL?ͳh<(~^8/Dj!/%Y{+o-8?؉õ%NW&a^Ksy߫I\@I_`[ 2sZw&t܃\>  jI Dur{8-w2LMcFrvՁ_ Y rvlsBuU/ovپלHo Z4eLe JNX-SIB6yЏ&e΁ SiAd4 Ƹ^=(ݚܱh&>ډpC;D%XӬxN^窞fMWp"/!_?d``K 8Pu/jT|Y&̈͠K!S&]Mn|;1،stVӊ/NZ­`=Df @*@Ҹ!-IQ^˲E(Z&)__qG;09U;^I{+uăhM 3 ;)/5o5P+&p p~gxZ'}Rt !嘩V겈:6ndWlظ [ H`y//m=!Rj3!ߡ!|ϲz #Zر/[A|)fFURD f _g^-[l(4@ Axӛbeo͚x.pe>mw',#r`t&9O4_wG2.+eЎ/.#sJw)Lv@:1ʍGz.3QQP“ް | W2ȗ;JJ@'+9p\TUy3p)QGZUwo+2-lFGzk(~po;j@7f+s)$*mtCRƛV >C|B6.4 oXøp[/QLnjr(Gܕ:o"GO3 d}&WmTTGT6 \c((5E% knq6jSVLŨ>66*4r}UsVd:Ġ9]j ww>]w 9z;BV亸ҼB}4kka3͗#1 0/ȑ,m UȦ}AWW"՛]De.9B|։!͙@@hUj W&f4֜]c̑uOX7Sntn$zZC4>9|;Yi3zzD-7NU:*bV͌`ws 1yC@",ͽaˆMf>A@Ԙh[ہs@>sbxegË9(+Ǣ-l_kS# l~ge&h# dOQ'D'Ʒ}6ɩcd|)s;%{YH%8C^ŤfM#LrG" r^܍l%8te'pˉ_P=f*Vҫs aQGCWUܿA.حY o6I]Bi(' ΢]pY#*`Z])m*Mc^DĚÏ4}agGhiWsiLD 9l6o} >ژ$|tMV4 pZqz2P .B=ejT]O{98i2#L :J5RW&v|zǒbFuy1GQ־ :-hqkz#2)\U:׻`SA/nڧ>|#(lg\kе XONt36%騵yw1r[eAflǯ+ TOb'C2 IMvmi@SC}q\4˪~WyPڇ ]i}E^y1#RvvܒXĘ'taOà5M˾E}_4"RI$3nxA)T22a4ֶ1\%C* o>jy3#p]rUx\ɖSY-ZQmbΆC/ =QcDa=Um_*wv#ȇ9~;bɜ*)AV&y 0=Z:C3_k>X/fYa=IIK0i5]i95 Q6E9e[4F&POJs$,恄ʳ+mVi#L^bh 4FM\m ȿshxe* %[2 '% HL(pt?!N9PBs*]!!| 6@g7;GZ:n,; ䷆kL:׶cZ[~nVlN)i!ӎ"FэG˭˩ѪvzW<xtEpN 2bT߯Ѫ $iyl6fLiF|YhݐuQjNJM_Ҥ{\':C+7Hj,W=NOhOQ9ͩA4uVX몧d*#wɡV !.&;%7EK| ŖrWeT:8nVy%F#qF1qP}FĘM{DSU}:GrgUw+  S5nT,NmW=/&rMPש㻛ߵSaRspD+mmq̂ ZJ8 sv3,YrӾ,~) +yO \ac*v$Uf0 Fj;ֺJF0bu4zy`[LAFӏ,&!7?5pӅ,.U,pպ`0M|w{4[kGAUR~vذfGwcΜe! ' 1bro(njqC(j9)rX"~*,vn_T$,=5V&v􉲽uoJ]9l&N_ҼR-Ԑ(D @`0Z@ST|s, Zt_7խ 1klEҼ9Шذuf]:5 .j)WK bNQIQC Y b`󴮊dKbstɏϯy;qp~ \ū3tj)q8Oǥ#"~ĥoz{m-@aNs+ٚ}Dp\]-Z=9wnxT:aP #Dҁ>Ȩ JdylTQaLس(vTl3#>ux?c-ؖ,9Lшk= %iu9Pw?[Dz=JFVwu(U$1?kx >J'-Lg4DȴnI2Ik/?]5s@z] Hs5rX}ilKORm{{,# 9r3%OSM!G]P.VT\(t|2LH,_D jS"`4\R <{}wҹ ADmYGtPN!I+k?U!G\ҿ9d,`\Pq޽D2'I:=@Cm6Aޒgfժ䑁{lA=#v`Fg# RLVۮ(k2i3o4H`| L7p5K`huz_PwKa}u$OnmV݈C::t-r[dXayuƕjTs]VJ-A/EiDF9~R$Wsl^@84a΍j_zt< ?oxVzHHv0~u1-E,~V8H˲'#T`dv/خ:o~/TMdcs|~TА~3T thd"mb8ۆ!-^Ź.4y1: |w\N_]m S殝Z|C0H'^b fp@ $8//Dsnkh/[endstream endobj 384 0 obj << /Type /Font /Subtype /Type1 /Encoding 804 0 R /FirstChar 14 /LastChar 121 /Widths 805 0 R /BaseFont /MRBTOA+CMTI10-Extend_980 /FontDescriptor 383 0 R >> endobj 383 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /MRBTOA+CMTI10-Extend_980 /ItalicAngle -14.0362 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/ffi/hyphen/A/C/E/F/H/I/J/L/M/P/U/a/b/c/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/w/x/y) /FontFile 382 0 R >> endobj 805 0 obj [864 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 351 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 728 0 701 0 665 640 0 728 378 514 0 615 879 0 0 665 0 0 0 0 728 0 0 0 0 0 0 0 0 0 0 0 501 451 451 501 451 301 451 501 301 0 0 250 801 551 501 501 0 413 401 326 526 0 651 455 476 ] endobj 804 0 obj << /Type /Encoding /Differences [ 0 /.notdef 14/ffi 15/.notdef 45/hyphen 46/.notdef 65/A 66/.notdef 67/C 68/.notdef 69/E/F 71/.notdef 72/H/I/J 75/.notdef 76/L/M 78/.notdef 80/P 81/.notdef 85/U 86/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 119/w/x/y 122/.notdef] >> endobj 376 0 obj << /Length1 1742 /Length2 11978 /Length3 532 /Length 12967 /Filter /FlateDecode >> stream xeT\ҨKpw4Kpwwow{pܝ$;=p|;~j՜PքLIA dٻ00DUX,"N@c+  ?x9y9X) O'+ KGQv@'+Sc{%-@djtdTY P:܀f,,3+S %i{sa3WytrK>K4z̀L p5 \Vi%\]NyS5vYSic[+Sa{ [ !+g +%8%ݿT=\<[Э\:\1 s_qb1L;޳lb|:VV?\- PuW "7wEڡESxאвPf"TMz HyM僖GCjM39łzUP3OIoޮB¾ΈV;O"4/MIdUHc.Db<7t澨`ȿʫAtQbaMׅTJ*U?$yOrI|F E6Vudد @AQ!X3MgNM?7 <+Ivf%D*ou0ҧN1|".kձ=DCNL|dJ2 7Ջӂw-Uhi\){Ь̿ ]uRi{as _[Vnڎ^t Hnj'F79}ȋW4`?<ljG9?2a~ki.IJ ju(/TLفfM0RzZQQ!<~XNTLˮ "}7 G'Y`ԕJ[=NQU!;i#; AGl?Eq, ST+sXN1$iPބ`{=kPM%4 KR.^_UŘ$K{]&%r\l\kSW'B"YECR&QsKiQ2C"U?u?$j5[v3ΚIGnUǟ/K"7xTjԛ]O}(uhm{Kղ/)I(Г>G\?G"̠a$,3~KRI y=ْy ۦnDGVu{LSnPzz1H餇gѓ i]U  PkÑbZ@mp~O#"w5C2gݳsW1 0Li?jIZxkJR#}n(AS6`֍$l Bo/jqX펁;kTC7Ut[>|m+~M6Gc1P`ҴYMȤUc{ߐy6N JVD!- xn CqV߈*4n˖mY 2'C6%xHBϽ?6Iľ4OqpCEY;NM)\;#LзPli>H;&;&K (k 9_$YB[= OUķO @W5A a銕dd[eJ] $})w?ZUo3:V7'v XuV@,PYNLYd 'f/s:bx?wF})u5@G,S N'冋zJޱ*ן"Oremv,E8hLe U}wwVS>y\O"0 x2br)[ \d,Ľf$% ¡pp&s),FKx,IrkG*'&+U.鴮A{) ""GGBogbR5 # Y.T—]ciS|3t]^4jy3E[h yח%Ireo7L _?Ysv >Ҕr}?CXbM(^*Q,o"߫W:d˶n1k ga q|]>?l$61%s"YNR^sD4}ѧ~i_-q3VnU5bt+ ;Ɏդ R4{]Z\RY9Z3k֕Tv.&G?4!_UI 12o#}kG%jk֔2ᦝ"zd3=d:NWÏ֟+|D<$!D;6+8Kd#7Ra]5C7c Lhtaqr4pqO!N/ȿz?*BcO(Ѷ|c,mNpԧ竮:ivK8+s + v,|(Mc9>!D9hCL0tm)~L\ ND;>Z ek-{leMekլH@]x>Zĉ/ +w`wku>Q4¢Ž‚ԬfXU|}M|@4ڸkL:O(T*g+>รͶ&ԂE¢'P#\&Xi3$!vh [f gKwQjB+ֿRA.U\~ZhiʋEwr!G]GRr! t p}uogޭ#S@ɱ^%Ѓ;~IO$~r41ρch!N S+б7 H[Ĕ\7{f)~H=hhq_,Uaʋ*MBCua*=܉I}X!:B$<] ٨O;j{P5cëdSDXq-cKI gW9r=;{7r/μݻ:ѣBe"Z}!!> uM*]EzYk5;X_5b3i]G:ArK|HrsDy -dW/ UyJuVG+q+H ]ZqSa.yHbnr+Iz$|qqA%~ӭo>~fLuROb R;"OSj0%3r5!qcuK}k2 >#_a"am[Q9S`06yl7ТM$ ~Xr 1_h&Ȉ4O-/@KOYH+ Į}sKX(=z{R2)#$ӖؒwA 8u-{iE<]TaьOv髙eAfjeZ=!^/5םtT#Ѡk2e?\x8b=!uDbϯcԪuRzxac|rt()[(ҽ; Ŷ g Q9洎U3>:'ڇ [|I^3Wc\߼Mcc~dRGa)K_0؋M.8[0@76tȠ:1bEziF$Ϧ=H{ɹ/ 짵RV!g'nI?KYx{Ud1A:Lx#*]C <w3ŗ+]8un{#dZ4d|ռToa`2ets?}sːI`/wՄ0xV+UhPr Y9(UK hCӿ=}=ciq,''pҕt‘-u>05;In5e,FždTVB>r,}рj6O Y9|~B$jKsā42o5MY5ELRasl&%|8[i^=NCcG\%9([](>Š_ɨVXހ p,~Fo{ߋ߂Fd4l AgVB[h67R]QW[O9K!hB ڢHdW;,$a 8،G(1S~[Œq%/Ewl)K2 fvVMKVۉ˼@.N (k3zY,)1ȏsa#j#QQR"IiNdL-˱[xTKw~>/ჴ$&$9t{&/f/JIDs7r𣤣R՝ Z 7:BS-#ܰ,sz]B:̚x7򵡢窺]8 RTU:Rܘg(DjdciΑ,Gg]\uɇJ(ںD3XFr,6 9Rc''fq2yBiZl%̚/+DхUcvQ\srbOY=y1Ɉkdi}ZBΙe@8<_'ފTiu]~#]Hu=hW2+}K!T#ju,ڡ0[/÷C jބWk`c0%נ. .RD@ٚ`I.%E>f]`n71&fk6Hh/1uݙ$ҟUV }8<]WfYzn=1HFyKbV3Tgؙ㞷 .G)牐Ŷ`RΈCؓ_E@mq]̵`vk`w'+r吉SF?xk%G\C営@ϪBA16arAl)ysr+\ZN̢~If8t6 l}5OHn~S`dK>z!> JUТa8ʶbdl @Ʌ9F,9.M*Ae2Je$vY]-_K C'9ߥXYt3=zؑ<݄Ztd"kOiNnLHn./P&[΅ *X3PW|6-Xhܒpo]u;\liǷìdwѽry!ޝ?J.`xYn6Ep ,g9TؽssDGJ5VkrUPG6h_W$2q@@u _kxx~/\[ۡ4iR}sALsLhץ5TN-aD!Oz?lg掝 ? ,w4x*-HHmN}PI]\= n r&8qE%K %[PWC7/YGζ#> fi؊ӅCTyW.QvЖ_ ;9ENC㐨0M@RYw^e*޵>gG$a">:v@p¦v@rͳ̑)_$f:ܱD-ULvş }#>^R!KXLVX? ݢ4ju\CccވEayy&ё0EF..N,P;D@١;12$2]2gd@p\qg UT^3䚥(*RcNy+LMryU4]*ZVCPܢT#\MojNRbt34Na tУ.)W6/ɟ g҅W]9}L҄ʕ^a,_x/>;C*-P EOO)`%7qsYB=õ?ݍj<J}hDԑRJɜLQm 2p?"҈h8qvL^- ʭo; Lyhk=H$+SwЎs' >շb,d:2Ӓq߈F8 citO$#C$='x=޴>//ʯfF_.fO?Buy?~}-]N:B꺗Kw2,FL1w7-!TA{πgaFf*_X{3֏Cpa@x j3eVH^wGG;Hdcc:9z-WlXn=1;jb '5幇x Q˒JJW`ֹX?b$Q7__?>p%$ ""LC 3(CQ`%芨z -!%qì&j(1Мн'OG.}l`GC&l^CqX]@ I oIKh>*,$ryp`)-uɯڭ >-Tݎ(àSx) T}CAmӹ ;@Zctc/cz .mH}Ӊ"KXOae{&()0]O_)ƴkji$ɹXօƆbhO_ޱZ!f=KctKw!9 ^vY=P%(c=)0桧`QqDE Sc}afˋwlwҔ 6,, Nw8!" ɵ2_k.ʑXwa~g"9)3[Q~o̐%' $9p.(G#"{JeS/i=49IUf3|e͘lDz4+LBhFv )Sb):I ɡWn'ɗD5΍ U9\IV.Q@]6E[uũiHj#ӟ)ȵ`Xe?&T"|z+aJ tz{BWqzgp2ބ TeathN9VjOiySMK]9 (}_%x)Qc'UT^xN5NxpwnwĮmX$:NWF?s>#1ڞkUJd;ܾ5=䩜.H5!A >oRQ LmN. ;c'[endstream endobj 378 0 obj << /Type /Font /Subtype /Type1 /Encoding 806 0 R /FirstChar 11 /LastChar 124 /Widths 807 0 R /BaseFont /QFWLMF+CMR10-Extend_996 /FontDescriptor 377 0 R >> endobj 377 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /QFWLMF+CMR10-Extend_996 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/acute/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/five/six/seven/colon/A/B/C/D/E/F/I/J/K/L/M/N/P/R/S/T/U/Y/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) /FontFile 376 0 R >> endobj 807 0 obj [581 553 553 0 0 0 0 0 498 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 277 387 387 0 0 277 332 277 498 498 498 498 498 0 498 498 498 0 0 277 0 0 0 0 0 0 747 706 719 761 678 650 0 0 360 512 775 623 913 747 0 678 0 733 553 719 747 0 0 0 747 0 0 0 0 0 0 0 498 553 443 553 443 304 498 553 277 304 526 277 830 553 498 553 526 390 393 387 553 526 719 526 526 443 0 996 ] endobj 806 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl 14/.notdef 19/acute 20/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two/three 52/.notdef 53/five/six/seven 56/.notdef 58/colon 59/.notdef 65/A/B/C/D/E/F 71/.notdef 73/I/J/K/L/M/N 79/.notdef 80/P 81/.notdef 82/R/S/T/U 86/.notdef 89/Y 90/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 124/emdash 125/.notdef] >> endobj 373 0 obj << /Length1 999 /Length2 4444 /Length3 532 /Length 5127 /Filter /FlateDecode >> stream xg\S[!DP)"JЛRH B@TEzދ4AzEzAJ z}ş9: K  @ A"EX! JI TOZL\*0NOH[;+I", xaec0HZC nk0 Y#p K- I mIvuהra &¤5zF0^7lS\Ҳp%SmzG'W cX?S!2GX#]9@!ж(H* G :HG}42,쎻H~$%%W3xA^EHwCE!B~=2Gme ,X'3uAb (F? FcpK@`_,)DABHtB$Ho YHEI? FD^Ha@axa^( !oﻧq ARR^%EqžmpGXg0V2 ٣E$|.דd2'oF 7ŗ5JmĖj<{<fz2v6Miklq|pk&)b!.:vZL\f4h!?D odcfs{$П2/9N ̀M&>,)lӥT+h}nS:I3ZXI%"ٷad[K}Տ%=߄_gLn-BMSO!7#)'l iG 'D}qrlfLW_͜A>zfA'5Szke6XsL8l8!᛭rp|7]*Vgvmkݧ!*טDGQ ]VTuMH o܁|~t.(OV2z Tҵ{c>?O[+b؉/4b׈b3NQ~=Oyb\o֫J8R2D+){t責%IdL*5{}_(W %>K;]LTt*0<傷6L.Ϡz#:-^@LFGY.y)Z0lǜq&X.ѢYG?:z; GG£v3`A8MIT&eSe-'!`1V?pp\ 䢘8r=I[z5ORo%e?w19vH7׺Y&o);|Xi{EN9C9}Wּ&QV*q/ 2UNrd(C. 8iYGp](vJE>l= Lm tE<1&ò^kp= > ,wꕺ/?~Z形 "3D5? sd]Q_T_kkl82/ &sk$l1Q~}l D(lU4IIn(ϮOKU)&|g6KO k BJ`G`T2"xTܤZǾŒ UtrGҥ8񠦃M"=f&o 3' (`MOmJebu*H\CabFn7,M  vyjٙQ;,A7wRiKREqWwzdP6.rQ󮗥ootk|J^풣j9ywpg ,&4"~s%+̝|S+Xc¥ش1WAq݂!Fe,1[ߴ$o7w1}ddgiKd*꒔caGʹ7X;xNRn#[̒IAf+9 AF~Mm{8ĈmSRPz?;Fb|OT$Y[Jl'қ35124=)>UM5ƾ&?%!gp/~Ϯ!Gbzp3Q#`8z˿^-|Ye,JX]?+Voxof"*0 ҡ(mˠ1~?OT3Y⿯Fq}L CWWS]Ҷ2p@u$6pELfv/|<7*˕9R:,K][ 8H`4UڧYLU7FT|2<, Ұ M[5cRF˘U鷫1:(-+X[G*dT- c߭sp #+p%gV/i=Op}LaI(Ԝ6S>Wꅭe(Uxjr"/'J~{8xxD/tۯ@,Wɉ{>INőӘS$I rddʹmS"9ParV(fӊlC{Ԡt"XΫG/|0]\4$(zmdo,ĭ#\^vg:1wv7|t(#fP83MشGȝ`T~>7A͓WJ=e4o3S՘#MmS[jK(F1?gg]c~"꨽zzڨbF3s~Z_JWXH#6kc:Z;'V: ҷe)Οsߔ6I&zn7Hyh\d^744?z?s;A@L|2t ZbXiI]Cy\3y>1oxS(Pm4YG^=<\sIj*CvMW3i6&;|˱] 'PnYiNN(;n`yI%X}90p.Ē"]sӓyuTv1陧SHƞuZأYX|kBx4)q^PC;& s(7?8^uĵW8 A\ų;6Sru"=G~#cn8C5F)KNQ{@ 0J-^qWxf Ʀ &<>z%PyCvi(DNt,ͧ<g{X/eIQ+YJKGǡOy’M$Ɵ,o|Mw7]Ʒw5|w/%1j:™W3Nt)u2\N=sD۹j{J)1Մo+8'f»NG"~j;w/+m õEv0Kf+OD2u۟fE\֢V-<*Uk Y솑q2@>Ģ%p۴B wuXv!h.dE^xyX.^ɘJ 5pkr1`sEBͺRtO9Ö1D] bzǦ-94!)csЦ2Ak8E*J?) Ӕy^npo;9gk)̵*)][As{mT]SHP* `ԽlZ3Mg |xn=q(Is~xЛ`!,u=.(*My· Oжu>VDτY=Zm (l.ca?|ΠEOŐB*x[-mG=bHưkK:N|y"烡Yp_G#*%ʜªuu^ ۚF,((u*Y\0*(gMn:[E-1!Zi ifArԘόխMYNK@Ú!>Cb jI9@7f.jJE<4RYXAQ(DCW;,Fu=~h~޹dӀ<5RP[=u'2D@t}c'jU,)!"*٠5୒g)`HT.m7&z+*74Bzhԡv,5 / yh;nbB}~]F{H`e7{{(V +8Z`hKoendstream endobj 375 0 obj << /Type /Font /Subtype /Type1 /Encoding 808 0 R /FirstChar 83 /LastChar 116 /Widths 809 0 R /BaseFont /MRRIKD+CMTI10-Extend_996 /FontDescriptor 374 0 R >> endobj 374 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /MRRIKD+CMTI10-Extend_996 /ItalicAngle -14.0362 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/S/T/U/a/b/c/d/e/g/i/l/n/o/p/r/s/t) /FontFile 373 0 R >> endobj 809 0 obj [560 713 740 0 0 0 0 0 0 0 0 0 0 0 509 458 458 509 458 0 458 0 305 0 0 255 0 560 509 509 0 420 407 331 ] endobj 808 0 obj << /Type /Encoding /Differences [ 0 /.notdef 83/S/T/U 86/.notdef 97/a/b/c/d/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 108/l 109/.notdef 110/n/o/p 113/.notdef 114/r/s/t 117/.notdef] >> endobj 367 0 obj << /Length1 1079 /Length2 5542 /Length3 532 /Length 6256 /Filter /FlateDecode >> stream xe\TݷǥadHifhD$DDBppSàCRy}yZgonvBJP5L *:`, )U00+,Rn22@u-!y, 0pۧX /')CP@+S* |aX7a449000 B,f GD~iD٠R2C 8^ En@( !՝]+'pzNX0%N;!B!J([ (wT p,) mTr5:DT 5M%XH{l ;5tAGf|50 t5ߡ_/2Gq5 l@+ puHQP+zՁ0 ^M h~g(PŁ"4iER(IIEE _tEEWE (ŀ"PJEU]xuDPU]xU* 9WcFѫ̮eeXR ($*X(#)_ "6n[b0*M$R`Z)xGO5'Ֆ|/]7hfLrw[霜 a%鐏w|K;ur)4c}ry5~/?>4ex.oljP6#$ez2T&ܩO!5U'^ptPS_oRԧX4 5O7e7O(tsGQ`_0~Yw QRyz8N*c>zl܂EWH@ )gok3W\ES?ںSѸHg'.4 ߆ 逝K%26e1Oir`_z-ЈIIH2̬}NT2p|' `Lz5{r??{]7Wk)WŏH({rGگ~4~$[*?5 !h)8R;%?P% ۶TNS Ot贋: p7Je%N5*]+k΍`\=84,(ԾKqdosqWq"#DiLhu6f?`\njCG ma8aK-qI}dOB6<5}x0f ( 6z_xھ&--h\}z_BVE(|RI3 @L(\8L/AKʤ9^C-9* H  NvT-w[irbIT.-mu1u'gKaHwQ% [aXxϸEV 8LFrmJ~;EN)͠Neۙnn+#nնh3<բ]h@y*}]@}o6uڦP.#UX~g,\¥i^zd"r.NΜn"u5=%Z7 Fvbဩam-T6}rfz E-5b,򍞃&}V.b1DToO/`TKT|5͝xo]?EDu,N[}av6G+ڹwR:WE)G=Fmn#?lاr`?4oD΄ d۶,84v  HLZO 1Ǔ7 l}ML3IKOjtL$GBY̧qҴNMZ1q jk3mꡄbxer[`2BR%~\2*$t b #QO&- M(u%ѱ-̵ QڍtsqC7|}4<;ǽꊅ9W?:yx8Ta&})NKNztp@aFkܓ@RE8T_&wx\I7nAVsk5gѼV|׶xEfz/ʘt 6_{ilII) 9Ve{뮂 ֪)ї-fKMg7C/.˻vAPMJUOF[9[A˗DS!V{t4:P &FQj|j񉀴V]cAAB2(B%c-1F=\^GD<ۛbu&gϓ:OSX~3S1)m=:ͧ% -X6خ~HBZ= Z;%@vC`,j\<#냈qO"1@L<~2/& blI!a\t`>H=CԤ&MoKihF*괡~5֑nr<5d5eVSʋַ9w6JWZ M_>Yu\Ϩ 9h*M=_:H)\ +>:cc>q)-XG5uuIrywAɚ9YZ,n4 fDaw\r8h84"J,?ڹX]X}$%kRE#K˟Lke//4FL{x\(&?solG̼;kHGLDM{'ܴ:Bak;U[)bwY8- ;I<gg?`ȟ?4.D0|QgL )_;c)T0`F\GK D7t:r'1!3 :gQȥN%zzē?M'-xTO_q'4b1 ;Ԡ; y&XbzԤcA Z)ϹMeY=M\) >"93 5 bg]%Ö!!bwv^XiSHE6Y/\jEw_Fv9^GJ]LKf?KO:Ŭ fgcC,kpfZ7;=xԢgg> ;G~(v yDSkUr~2Z\uIWC! 8mJoDE):5kncg`ɒRbUQ[t0FjOy)}gP2mNWdɞq?awBߞf˟ӧPmۂB){:C#*iƼYib+wF<0;7 O+ussF|Mc3UEhֹ}C_讖Ot[͘fsiC! 9zcFK?ƥf.˯1jE \gy?aݡEg-lר䆔,7-7)sOvװj-ݱK Z~f,R^I9n!|}ƨV=2Xn WӇkǒV!Qѫ _jkj|{ s%/snH3-ȜW@ݵcjMXx"QoYxw ꤳ,^e{3`uU6&e CkyMElA+osA"8Ul=7df%)h]kMe_j-mҴȬLUp>䕱РPTP jUnZ O6 d,# ;'"_~ҚN_f_ v'oj^7yE}韑uf֫WդD,0co-7-Ђ?B臜 xQ?$s҃,p( uV^j"ޫ"7CД#_VkJjidc[*WcۖBD`V14' DxZun$<|³.j9eY&&6-3[0ނ/UKnB35(B&]Fw_kQqH[䨣@bWC:cʹIKyן4{C3p{hFK!et~JrE۫wvX<$g'`1V*S\ףڗisau"U_#Exu?U{rťH| ?Od肟db3LcTe 3?RDlhOm_ΙehVHQgȕoxą*D-jmw_DHي(?7ƾuc# uě[EFd2U=R!n')RM99p~ UD%ZXftoڤ3@ٷ|L=p=w,Bs_%/y#dm"xMz'5? E#00Kwendstream endobj 369 0 obj << /Type /Font /Subtype /Type1 /Encoding 810 0 R /FirstChar 12 /LastChar 120 /Widths 811 0 R /BaseFont /DWETIX+CMTI10-Extend_1004 /FontDescriptor 368 0 R >> endobj 368 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /DWETIX+CMTI10-Extend_1004 /ItalicAngle -14.0362 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/fi/comma/E/L/P/a/c/d/e/f/g/h/i/l/m/n/o/p/r/s/t/x) /FontFile 367 0 R >> endobj 811 0 obj [564 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 308 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 681 0 0 0 0 0 0 630 0 0 0 681 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 513 0 462 513 462 308 462 513 308 0 0 257 821 564 513 513 0 423 411 334 0 0 0 466 ] endobj 810 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 44/comma 45/.notdef 69/E 70/.notdef 76/L 77/.notdef 80/P 81/.notdef 97/a 98/.notdef 99/c/d/e/f/g/h/i 106/.notdef 108/l/m/n/o/p 113/.notdef 114/r/s/t 117/.notdef 120/x 121/.notdef] >> endobj 363 0 obj << /Length1 1660 /Length2 10727 /Length3 532 /Length 11688 /Filter /FlateDecode >> stream xeT[8+Z48ݥPܥK)PܭPV8d~y;ngsެP3ALR{fVV>+Ј;] .`>+//@ l}qrq!NV.z7%qDNVEcKtSc[: 5v;XPYYfV.=*/%Y{s_a3WvrJ|JAm=f`sTZ uK*5__l=;bv(BN "?ʺZ[؂ֶxXޑaN"ca9GuT$1>ӎNW+ίLEmCNXoeo ?Kh"-S|skŭ#iRGNX⎕2g¸tp}uW/۴]mWmW0 ',`aYmX6('/"IS1pEG.-CvFCB"ib2izÛ!O3%/F] Vk*̬ \/VlM"Q?TJgoWL}QbgTM;k7~&h_T~4)Q#pŊdNWe:Z [aJQO7ͫl骈ZIzh_V@G9,p^*CKocPGN5b)$N{C&uePͰSȽ^]Ǘ43ɚ3'Y0M|ф靸b\V>řJ}&tS08(d&$݃/]? `[-1ӹSqeU\AyEbKR]]OmӊI+kSƘf}+[q8ZbRHyY@_%C/?čs:(,n71.أ;ϊ}Sٛ?&gW%T͌D@S-Bw"9%Qh0I`vXRѬ!)-%jDu~U,=`"G:P'lS-p ٚ"R*-,O @fx'`| %GUs;"q q&N9KK2bl|]:qF}3kr~hӫ9k ~#0Y`rl)ЯEj輈j45fI\3CaC0 tJO]cյwh28U_ML/̧qp=7~E7*S$J VQx;wk=,cD'5DJ]ZDS Y,J颂8[F~K&k:~"#(9[AİO64Y8ucFtJNyidpGfU:<"t `&,TIy\&|i.> 趩"{h0P>tj9QպO;ǤܡV'd _2I/+te&e$x+>?;T0.l=dq/ۡngqUs830i݌cE)fD-&2sgJ{"ymWSn'U&j9fM yXSKS'-Vtd :l@V[  >iNa܅Rem&2t{ϯzW!ms@?k^{"DZn6/KIq g+& % K 0'0R|*ŧ13"D\O.?M `ԉ Kȇ!Z{ʩ~=WCѷTIrX!``9x3Ep-|$qVAL xEa::/"l[V9Y u!ߚ9d5|hpx??NY\g{W Y\ D<\آAQϽ$Ļ`Q_vPk}QAt N z*%SAI#,_b%LP̐/[n/v5hCwƹ$XZnP~o(5֋$k?cY3 q?U(U N)PD6N8~ !rHNUETL0RlJ&wv7 {Yn+bw\eL쎶 ZC1YZW0Lunk; k,RPwuL}A1L{3 E:$;r;QD-L75HuGq`Nas<9/ ؍sccbun7prk݆;!ng#t nuޛױ9nS{.ھ*Ek,fiJ96s#SVJʓ^[S!Qh9耞WXءgU/c&1d[k/G=ދy[ӪHt눓fG>cG5QF4M6.OV]rbkΙ) ܰ|}2[m5QU zais[P]KHWZLM3w"՟St'sRZf:o3 *E _׈ >91_FQn(H:6W" w9,N;@f:?a1^ӻq} _[ɸY7B> .cw]`DskB>ґ^4K- d>Lv4TrL2Rgi*^da)CH\JMwX;:Ȳ|1zmai'@kIIjT)YD QHXܩ=tS-ϻg ~$T9:hO5TOxx }0baY&JSSa(qgx~N U#LV5Iu iIJ ǷbN&duqku驮x jESQ"6@:G(CQ`qbi|mQ>X\XOA)EÚDcÏoNĆkwzUra߇Cm^J45Yjpk<ct|b~BЪ4l(̐^@m!0`{95d2`"`Dŷ *t$bE 4—c0^Tb߸*0HgN˃-E!.iܘ0h %8[蹔&h1Zg_+5w8@w L̤2N|I-{ߗil 9ݜԖ@1' aF#ņB틓Ŋ\d-2^ŒYq5cO~Y1LSdWTm;>Mb3%) 9O#` s%_,eS2B)/<'sej֎^@3?rTՊ^[NvOeQJTg lsxA:{zkH(HO^KfFQm!*'v(О4g O%p?yw|J3 K/įeB(i騋ټh8tf]s9tor2Q3X`jF/{+.IVؽ/skIL ڹ\ƽ D )iH%@#OWj(orLW+^TUϋ6̵O&wapv$ds]{}؜v&̯aX6+ZFC2ew1"1_ P}{9m/\ ȏmDRgK xo&PzQ {sYS&Q9fβ٪n[ދŤ6 Zeuo->Sn3L,їJE*eL0kkl4L5:;T7SX>KQ%Sr]-fR5hgE?لd)*.qamdo4[7אkvjJW+uG.%a:(9[\Nfu&}SY8Oqa\E _s\vEk%ܥ$l8 'ӓ7k3=gk uQԵQ^Υ ֕Y2I:6̳5hl_ksBG#~Z/rH ldjzl8xjjڔmor4:!D+&,FO )`fPc.`Zeo;$WNgl=E:+"T ȏч=75X ѭg\ߺ&͑m4P~ .MvgxxYAnkIu,]ꪮo*ؔFwI>E"wbfDvWt UhSPmX?ꉥI)g!t g+n󉕥dxh+:Bd4Q+ Ca[SmD"I:k|1ԫ} `6n/ڦuNq4n囔S7<'NO .Y'EJkMYhDſ}#p h\y~x6rylqc")BKN;3?5#B0j؜Q;o%  ׾"0eH+Ѧp/"JyڑfV.V~LQ%T*t<&f#~vDG rwѫ(iujBZS*>losTɽ_JjΖъeƵ4/Q9j :F1 ݺ)YN]['4sY= ZhPgd(v/^(ڶ?lł[QxT(nQrǶJnj^"ނ %_l{'̈́,Faf }kR(U?h?l[ ;-hSK k50dR$tyb3R33#VtHmI u?]3əU]o V\_nZ~Ox#\[c2|{kKDw8 ǗnTNˁPGܙy$'ʵ4[O+2J8[йhMs)[܃e)=wa .鯟hi(˯OsSe1s_wt2te_g%E~4"F'Loǭ ".}Qt"l?^D>r0 n#!;U g 2ѓ&%D^Byש~!}]ݙ>d6\`@{vhεx1 {i>?)zt%){4:)F*ѳMū-*e@i'u3o7֙Q#{Rfes$v=pJ2- ykkJ;Cr.*wA=n{~`'ΞQ4;2ӎo!dgTFVK7(m qJBr֪)@O"f5>YM$3B 'gOI%lCmq\}<#y."|Kם>?ph;>~m#dćkFm+}^\8KUUixrc^!_,$锢Pҩcd(s=DTvE A$!Vf +{ rY45}w/{.jQ#KBD3RQbdIJz k ޥj{Vo7;ػ W5"_DO΃NqE%Qb%2_`3:nFr8c_B(g]F`YDl*C%Ջ3:UUVMC\7pS LHbҖ#F(#i_/&7䌙ro~ϼy0rJ#3of&b߿蔇5˦U l7L8p#zk+xP70t:757y!)P.(xѴ<zի6?|ji.@ⱢTEUHGxK.ӒC!͔EyZ+G2)]Ŗ4an4-{LWEeXsڌ#+./\2xHNi>Bĭ$ /b7 \yLQُrx킇) pZ"|eKw嫤?Q}Wo}()m!LpHɯ s e6 4,7ӓ+!6 !{ `zxvo0au 86 Luj=ɰ:+ +еUugώ8=9bej$/*3{d0-(_Q]!ErDDR rt7eRߐ(ܪ R\pXJ!-%I(겾6?RF.MlΌґu7؎Rn`2NqM;hYd֡GL`%Ճp^ %}!(;o-U'ѻ,," CJzWgqŋ vBrE:Q ,h,݀!Zdٻs[h_4BX)0u,WB$Dޣ+"(,//DGP8*ȿoQJFXyV+׭?CU*h\"Dc;{^l'xƚ]qa&ŗ8\CPjAg׎q(X[wQC 'UBi"' s9[,>/Of#?TTa܎ M6_6k`: -oq9B5(q2vmTo'nRnTR2s?e'J2A'YD̍p2&Ӷ۪[Z3#?Uؙ"՗b歙~]ӎ;g`a~&_`~RB`R OV}YYGYu-.d]?bo&:k6Ebܤ+5soCNȽͯkFrĕ$ _eԽbQ-䇛|-n8Ee^~)#0c.6Qqѱ`+QW0K LmN.;c'x#endstream endobj 365 0 obj << /Type /Font /Subtype /Type1 /Encoding 812 0 R /FirstChar 12 /LastChar 122 /Widths 813 0 R /BaseFont /DVKQZP+CMR10-Extend_1004 /FontDescriptor 364 0 R >> endobj 364 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /DVKQZP+CMR10-Extend_1004 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/fi/quoteright/parenleft/parenright/comma/hyphen/period/one/two/three/four/five/six/semicolon/A/C/D/E/F/I/J/L/N/P/S/T/U/W/Y/bracketleft/quotedblleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 363 0 R >> endobj 813 0 obj [558 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 279 390 390 0 0 279 335 279 0 0 502 502 502 502 502 502 0 0 0 0 279 0 0 0 0 0 753 0 725 767 683 655 0 0 363 516 0 628 0 753 0 683 0 0 558 725 753 0 1032 0 753 0 279 502 279 0 0 0 502 558 446 558 446 307 502 558 279 307 530 279 837 558 502 558 0 393 396 390 558 530 725 530 530 446 ] endobj 812 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period 47/.notdef 49/one/two/three/four/five/six 55/.notdef 59/semicolon 60/.notdef 65/A 66/.notdef 67/C/D/E/F 71/.notdef 73/I/J 75/.notdef 76/L 77/.notdef 78/N 79/.notdef 80/P 81/.notdef 83/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 91/bracketleft/quotedblleft/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 360 0 obj << /Length1 1484 /Length2 11420 /Length3 532 /Length 12299 /Filter /FlateDecode >> stream xUX֨ ݚ!6;w܂][k+9k_s9oYUO9 1PΙ **`f`b''-Č<fnnOwY[8D A&Fv9#g {#%ك lcPg@M&c r! =zϩssPC{? `_?iLj/|w5 e-wۿ]/| 5lhkỆ_ 59V.ổ_nYޭw+/|lj ,]EEDݽ9X,Ls9}_&. _;MMxRL}v"L+  nHe8^E5MЂѬ,QV2o}Ra ^DB¤KW979#g6+|dס|võ!3g>id˵B)ٯz9mq'KE?pto1^z~Z"qGḀ?1Qm3gX,ifsK4죐2 +-#q8Y%=>.Wmpc25[1tؐ K`d+Y3e`怉r1a֬`tRqslި(9W 1 xYgЪ"j]KYr?9{aC&82-U_fK#ƈ6`bٗBw"FȔY&ai |fD_n\y:ȬɌI\i~pޓepDЯԺ>4{ NEN;s|F9pW"AFT>{N/!&s20oʅūA[j\aGk,Yi\FM5KQ"4hw#g Sh'V W' nB¾,epG[|xywmƒSm)Ei*b@k>]3Ż7zcLwPZuko$a0MrW)* Bڝ|HhĨ8=/o%+L@Qt-iȭvYOLQǕȤnR( Q&h` g.uFz(bZpB 9ZM G' ^6GlmsDBG R75 HE.a:!+jIS=v7twpw@BTD |h2єMcÊ`}sAgCҎYz_LQ,jE-‹|# "C[$f"/Se%y"4G-H7㽯 ]\bk$]ޤjPwMB!!>'5s8Q\Crʎ[dr2`#A)m%ʂI1{j^V1HǣJ+U*W[{/!N>jzo^G`+$'EG2[]T,:ꧮ:Z7j?p ZQ L~Kďo^WE}C!?35s-/\rvC0)!KCd6P4i kVi8&>OxbUlBtfH#imzܫuĒm:!߾7gTsgphNSlD3Ik~{]3B+Oے9 <=ɣ)oNgu7ŻBW_pB  /<a}7M,7}5}bXzR &'J"Z,19=5F>>;ۡDAZ0_E`B`*%x8^!ݪJxM 1*&*T j RfA=Ȍ)uvʛ!@( .[?vZZ {Vڑ]%ٗ|AOՁ<>[A1DlC:Wr"9'vTKMft0|IV؃RogH^o Kg~ `u}0f\>S4l,tQ]@D9[H3D7HC־ĸ' iܫ:۫cY4cK÷K = } v,U<ªG'r}ޯ3=K>60β/#`㓳FS3q U{f*Ogjz4>sOx1mtOǵ gg(=,=͍̋OSoL5'F @4+pzz'+"`'%ucZU:D*ЄG)]ЮqTS&嫂/ ®ZhQ7Y6pF4|0󏔽36/&X20K}3;< K;ml׏.rU8ޑQ^&9T*R]5hOc% +4S:Xڈm+ӸY+ [FX5GA=dC(?KdS=L  %FgGI]ػ:0WwFw84EϿѼgύ6S͟pgQ/=dԌ@d u0e`Bg9_G_6ODH뿖B3݌%vHxT$J01+ jjIBx j[HǏ 2\9nhic}h*ca`X*Px>- 챂VncUk~mou٘ -v؋ # *=2oX\fB!*M!nּ+~@ΎN%5BX h=\;}f<"+*}MY-Ў ꧼ] e^Mw9߹VL:wf4ӈPt뵧`j85; y~OhPxTH[-͐UM"W;ُ80_Aseo!n)SX=˥K8$Sfmjn~<0TF8 IJ+vCpkfk`6tfcsM/1OЯk[Mr:iLuGmi"0ЧUpK h~^pjh#qLΚ)==Â$T+c3\wϴjENҲ7.`2ƶy$ p8ħxv>ZYCy!Qe:Ȗ^A΋ s$NWL)wwClx#9k5_bgw:?dgq }|T@iw |xRK-^caHU\J!JSH`e~B%8Co`x#tFL\czED$ : 2u:cXKh/?i M 'Е)zf vpaQ!JC`2 .JY&<0EJuΈ"e';ތ+Sm}L49W.嚟UyJ:vBfz$Bq;Yq|Hz,=!4} r)m˺Gh:rbf\X(ok`sCi:?!%pqcx׽͈~&M}35vg[խm{Bl,&JU&jSHrB=Uɟ摅UOl֯d[vDZL4Z)QK|^~ib-[ ULȋ Z#ST+7GM"N Jq Hӻ㌵,(BO~E2o|SPXYL*S ކN5 vSx 瞮67u8bC!̶&ۆ{2K1E!{>:Y޺Um$p=(R>L7m丵)1^Mqѧ`hdK*YڬɁjA-xrܓ$vRPاtĻ#8Cyv4[S0$cQ+W(P9!E~PsgPvѢ/-Hv_ޏJLQeU E݆R{3/n/S4s36>/4ChM/y%I%z=䧾ajV'Η.䤙.sꇑ]|3! ϾEE0||pFm$R}fuA@gU/)&w,$3!R4}D3ׂiefFńsl/Gx*ܸ9i=~g5;o@so6g G+$$8 XoH]7IcsYoԁ,[ \"yhPcdȫJVANP؍67h-~#s]o(WDW½b ukp dk ]Yh$j"kUU̠uݑt,19rj[]g+"M iM? {[3U,p 5䌸ruci; \멢Vx%șӳv%BإcDr;-P$ŀSH0VgcKO,5 $Ꭶa+xJ ju`%8Rg %q&%5}{3q/?[+Ter!J:'+I[вuNr<-o!:?pQNS3+EHҩywg[!%tF#7A#]ҕCAO~GvvwRI*`bY3ōƬl+|̹ԧz7\xHoj:߶~spSO_ᦂ8D~bd&.gPc:k)wS ::rOFt ҺÀx/A> }k],jS_^VVP򻆵] joe@[7}d~6F83UҾc=!ġy˸h%c8}D]&w&Œ0cEJXbVP M0PY)..84L lĜ f_ЮQp.K-q$AyFC&sb[pgH"ɈUe?ޑ̅ bj鈵#*M @Ɯ^1Hq P(H?2mY!F2O',rE.4~" /n TֲJü(>gS* ܪmU.(Y.9(sŃ3Hr}gF LļnŢƨ *c)LZ(jƓ_ڝ$hF^foӇ]~R:\s]s<Ҏ i, i5LQ!?Tkuɣ0J*bf gW=uF$`^?ίev#Aj1䘀/>dfv?AꋙGd!9X+EȪ'~3+K0}Sڋ~8,)0.Lw$Vc{Z/deyOJeR&Vgɭ^ TC? Ե&]bTD P4]);J#5ض>X>֔ѓzxZǿ`󉐰4` GoT{؈-|\A!7y+St"k@c&mJâ=}4ӯ]PlB6=qKj`%!Ȓz۶8k%d9ރr 펐B2M1S3-TΤmU_QxS 08gUϠ۷),G)Jjn,EydHj_hIeU(EEǷY(Bݓ?E#-FR;2 V+rZj賫2 7 MUf=WEjQ2@vN`tN2̫Eqˍh~f>Ft[|la.a Q>Yts"|(CiP~LTaLִl=IqK@^y#AƈΒMi+Gn#dRͷEC]p{^Si2a =wJWQ6gN4qPpX4@.-{]ȷ0EKc.-$eMZ7"Cc>;+I9,3mP>}+bk#uF)/MQ&hr\+\nEz`iiw#ͼ̑{4GZLʆ#"UH%wio*-#*fSa+{H)&OYվ>xXޗI _?>np}rʶB:lCuP[ġ7,@<d•)W'؉ 610LK(Ry*^<ÍH[2"N0J b)Y\PҎEya֚ EfŶsaɟZ|;C (kt?;2׊y(fT ȷ=2]N횛fV%h3Y hZxhWl[Z +5">??WUp}BCR3-?Ce-BTa3Eз*V 3A+iH0YT @I<-Dm$ DHXkIdW [\at*fb"4Rlv|w N^c ԡ>U5cvȢ!Dg1UŜYr .6Ҫ*aElo*zv=^/Up y"4Y=C{A.MP#%tܚ[m|BDv|\\mS\ꠎcj 1(IB+j q[TOSОa->s1J\jmByWBÀᕦ'G.FfjA(11_Pa$uts#k$UVS^cLUɔળfZ*2"gaDaICYͩ)ޯY!U5Uẍ́s#jƠuO|yGDBzۛI6o2d;Ol[XS ,o!cbuh#7"\o PkgD$EC{dԏgr EZ\,ۍx׆AG, VRKVوvײ 3(lhE ݐ{s>|-e ;Ȅpm6rES[q(ֽ^VEai B`WRO3oBy ISj1#U/HS:1S$1c[4b3Or u_cB?OW R*2=<Ƿn,H 2N/ bWY2P\(u;i5Wư)jHt"#,!g5E~aO()݀q2躝/;^kg5zqYŁ%v4aOAt5*dOrgo^*9JzA^yѯ7풜11`Q'K/6_s~X%}t {`ȹtVenk|0ͳ5!$И NG*jՠ"CM x7F]]m+*BsoGYhr5Y?S c`endstream endobj 361 0 obj << /Type /Font /Subtype /Type1 /Encoding 814 0 R /FirstChar 12 /LastChar 127 /Widths 815 0 R /BaseFont /ABIGBB+CMTI10 /FontDescriptor 359 0 R >> endobj 359 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ABIGBB+CMTI10 /ItalicAngle -14.04 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/fi/fl/comma/hyphen/slash/colon/A/B/C/F/G/H/I/J/L/M/P/R/S/T/U/V/W/Y/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/dieresis) /FontFile 360 0 R >> endobj 815 0 obj [562 588 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 307 358 0 511 0 0 0 0 0 0 0 0 0 0 307 0 0 0 0 0 0 743 704 716 0 0 653 774 743 386 525 0 627 897 0 0 678 0 729 562 716 743 743 999 0 743 0 0 0 0 0 0 0 511 460 460 511 460 307 460 511 307 0 460 256 818 562 511 511 460 422 409 332 537 460 664 464 486 409 0 0 0 0 511 ] endobj 814 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi/fl 14/.notdef 44/comma/hyphen 46/.notdef 47/slash 48/.notdef 58/colon 59/.notdef 65/A/B/C 68/.notdef 70/F/G/H/I/J 75/.notdef 76/L/M 78/.notdef 80/P 81/.notdef 82/R/S/T/U/V/W 88/.notdef 89/Y 90/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 127/dieresis 128/.notdef] >> endobj 355 0 obj << /Length1 1209 /Length2 7069 /Length3 532 /Length 7849 /Filter /FlateDecode >> stream xg<]E F-Hft{e %z% z==!zu~;y?i\ay~9 e;Sw"07 @H%FyHmHg_;x;9!ϔdkd;ĿI Cw;ҿIN A2 N 7q@@. rA? xW+kյ-:w}@wu8w6]]<H7O.~ 7/@!~!M AP0{/Io#n f 䚐"ܯqXhS W sn- ?@ՎhZ#$(p%q^OMP4i/9kv&d/} C-쳓.-8eJrw"M-@%3a:^n"s3}Fi'dg;lRd*cM^YCw63zBrU$ .Sj*DǬqb%q3\9N?b*<eܒ~3H1fzyC01@Ѯ侜 p{=HobI@5|oOqR {_+QԠu=rGט@e)@@b LA8֢mjTfL*PE?/ fp@p1e~rE_ǒ,fH{9l]0*7Nh/sqiz|GO;MөE>HY 2U`$NgD#`. 7Q $k"֥짟Mci.x7f߄Etϴp[яٹߧ vDJ !UvQlw4W,x V{_ u&qo.3zzo ܚ$r1K%N.M]jcݪ( !#-M&='C˛sdǜ #B4: Q$6e;hAAWW@ 7]FxedM 473G&~{lzz+;zQoYQ8.T_1j'쎒s}UeK'aƅc3 W_`k*=uL 3`QCsOCx./Uhf8̊9@g ~鏌n_ QU(͛$ҼC؜+E]^2kёϭʱ9 ¯42*Vt2t>Ύuhӷu.{8㮕7:|~9~|JPEO*LUbIW1vͫ-oeX!Y6Yʵ=T a"5Hf{Ȱ-j=~mtC@8~y]zL>niR( ;;'>d8px]צbcA s[j_O7OaڽwHOʄ;:C:[çTw++ xb`DʉH7Ǎhշ;o [!ӑAI XU ;rW WclQC/ $xJ0:8XKYS> 5̓rL@ztb/*xR*qe9 Uv*Mo3}5 hJ@xD?_ID=¸tJ1)y/h'Z?1'F*яN%)Jy:2ؓKj֙xTPZ;erZ;!kt]2sNmѤTwE? eB?ríX*i&(O|\jn.3_-y&uixRE+n:vޣbqF44;x+=r*hN~-;BNZ߈m76^h4mڋF&hpa:"!:q_nh oME ΋L)ߛw]vB^Lo8.HeL10˘f#ɏU o Ty5>!8EUM%9a-x {]rYKc boz/QrkK,;ු=WI?~6ha<)-ă}f̋6Hۀ 8ihmB [v\Ybp@QaxEnZ,dY*v:ÁӒlƙu3^\;1!uRg@_O߹֫'RRK+@ baX~sBiU@ LJ Bzy}qV[<k 8#:ઘDt58~S;7/&~xx)@Ad/%͠M{YVSR|M0|ͥ tmL8ufWǥZhZүLu /k'U`D;&Kߟh9bJ9n(_W$S|^l{q<<0iz{5/tqHCbt)rq$ cK~**@#ن^V|PA|S܊krT \*-zFú.(οb; `M[Z ` D輬yׄ %}O1s~Όof3`45d^ƱfK'7羜pi`Gґ}NS }h\0#ו}4JջWpY*H U}4̗7n4nF>&قb~D,(?u-ΦjѤ/#T#`jRO'b6axxV!]!v*yI $06#\w+R΃fO3 4Ҳ/!&6ڽv./~[,ޝHP1E\#n/2+*lgՊ$~|E,HG%DN Iw_ PVW 8U.rgWb eZ͘ӼI H^p~d#덡S,Moe訙.l2:0;_+a*8M|gn)~_j6ophE_etsIBby*1QGWS3+1O%XQPATS&ݑ!hf2l,_m(7r>8m UΕ#evD `Nb&ULVX|6-(c_>q[j93|F˗:CH<+=G\ {<bDg <:x -ϨS8scĕxV3>WO탍:Ҫq"­6m}e0C{FHcaǯ,]9,y>U_atè~T۵on0f/w᛻;?Ny:pxkk;QbSyp$ .!ZsZy SjE+솬bڵޖZVŮYE8VL+#\oeF$ܩm^YwX`g^J'1 =mb1 S`4px'@t&3E]Euh](;%Ɵ9b6שl2>c[ΕK>#Ӡi_5}\ϏcT՝`!6K:$"fCS?%nR6=aApB: Q 졗 @EӬƊ\26w|oQd`I\@7|&T:& e / Qsw f~Џ q.jxGl,H䘌0o3a *m]+˿anDTn?|]IEݔDClppϋ绚nL\Fuϯ pЁ$ > -'@iQ{0@\'ޤMt=U|Oggsޏh/F0d:UO v$ ы'^>Dy"X%@dOyوw[!\Dl%ޣVcuS414d95@XNPh*/29'f{WZ@珋[b|MbOUÀYJp_]]n-Y~Efi $nQ.O^8m%T mMP%,u:SXiƬܶul~"kSκpg_D "lbSU;;G JlF2RE5InZG94\7M,M5R;k]!)]tT--sź(˕w\eiK1I_}3خĈ(H`8/BIu =wKەRUT֙ [2t' Ia{ԘbXIE| G8IJ'<81F|rSiDa%E]WBh{BJ7l%r8ElAx~*KL5G^e}`|gasЩR-gKqQbD' ZHonJ++SO"[}\Cn!+')#figUB`~Q{VMbHC@~4ʏB+= a>Qm&FZwc~^6ۊK$T8춷1!Ʌbi+gx? *m{cǬŊyOpBaL( ;Qޓd?WЯ@Ո)Æ ߧM <1e|4ꁓE@S':7vl֕%ɪaܽ$UM:r_s9zKH(sS (GiKSdR>OQlLisԣ[sV'mP>UB K^z03k\ ,~LUkHOͫٚS /HL Fb┦3P^V\[;\h#+?ᦼ XE+c=]MbTȸ:{3!/z-WS̜dY#hz~uYuʉbx㿏+ K[9ig)endstream endobj 357 0 obj << /Type /Font /Subtype /Type1 /Encoding 816 0 R /FirstChar 34 /LastChar 121 /Widths 817 0 R /BaseFont /KBROHE+CMTI10-Extend_1020 /FontDescriptor 356 0 R >> endobj 356 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /KBROHE+CMTI10-Extend_1020 /ItalicAngle -14.0362 /StemV 68 /XHeight 431 /FontBBox [-163 -250 1146 969] /Flags 4 /CharSet (/quotedblright/period/slash/B/F/J/L/P/Y/a/b/c/d/e/f/g/i/k/l/m/n/o/p/r/s/t/u/w/x/y) /FontFile 355 0 R >> endobj 817 0 obj [525 0 0 0 0 0 0 0 0 0 0 0 313 521 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 718 0 0 0 666 0 0 0 535 0 640 0 0 0 692 0 0 0 0 0 0 0 0 758 0 0 0 0 0 0 0 521 469 469 521 469 313 469 0 313 0 469 261 834 573 521 521 0 430 417 339 547 0 678 473 495 ] endobj 816 0 obj << /Type /Encoding /Differences [ 0 /.notdef 34/quotedblright 35/.notdef 46/period/slash 48/.notdef 66/B 67/.notdef 70/F 71/.notdef 74/J 75/.notdef 76/L 77/.notdef 80/P 81/.notdef 89/Y 90/.notdef 97/a/b/c/d/e/f/g 104/.notdef 105/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 119/w/x/y 122/.notdef] >> endobj 349 0 obj << /Length1 1308 /Length2 7279 /Length3 532 /Length 8075 /Filter /FlateDecode >> stream xUT\q'P;Ppww.+8$'~ {9~ѻ55׬詵tإm V@;;7@V]ƀ %EO/ tA,݁"naa EDgW;I$A#dmPt:kX[:k݇ ^5 ؀V@;矞l!m< tu0e7iqlX.kX:YNuKGGgw+@btuT}@CF v\ @@-=+to eSPZM E-Keaxw\Ac.x{LKLbr ,]]-}'~7d99 Wl!X(9m yy.x |\NgKWh[JpZC-%!6So)Cr*$|8 W۴\26!|_N.j8A!m8t 6 !܆ou n!\77m޿!\7>n|;/k<\jLkWn@7k;Z4mfSdE|T%* ݗdoa _U]X nrqwQw)bNC\w=-vs|[( .r}viÎښfa3kiЁ"-&9=jcφpA𛨈:^Y.|Q^i)(ao0Y!oK0 S~YŹGϻc?[B24G 0oV^uASE:g-E:뽂W˕ VkHhehޯQRO[ٙ6d q*5Vp[l 6v$$Kθd vORe?(*}ky\4|*/1]r1ҵKjLH`r<8 Cdy" yccԞ"(>lÍv<T[jBց{9 ^WU:ϾRv 2# 3Cyp*811F+ @ Z|&?aCfY\GfNj#x &4ɂzzXDa*ǂR ntqr_ RB է@]Tǥ)r(:{.>|5.F}>_GvŰp>kN.9ՅZaZw=vU%a6!R8a3[nPO9mer_mUcD6jC ^aM6ez[jw(\`=#h3C'ϕ >׷%}jK:~ngHMmlKŁ`f6nPD9X~.E1-1cY{O?⦲Umvbk0rdEH*S)zq݅O5Kb}G:z U}ֺ +s@~o~Tb%E )T&ӹ_$tgF=bΜ"?B>O٪/)i}]䥾359|T#}{G]l"ӀA1%)JzAOZPEO˞Hscqj_5J[=MXN0r?d9| 5I|ƒvE;;VE*}v3 _bP_R=I÷_s\YjƤ 鳰 KvHiG$'s*zdSSڒÌ՜%kglfrLH^ |==Ѧl̙;VC8ZT{ҟ Y2&XkHHü#@F*˧gy&CJ8רLiP 0eE*o>n?Ko~f($<= ~!9TPZGkpLT9/"mZCx›4'+C*- 1"lsŸ/IT(i↾yMIZg$ 9Pt>m+o"lvTWAaQ̯š!k5͜*'+"GQôK 'y +-U|;ԱPʙ6]2?;odW{7V_h8V%^N35;.|"Zc8*{"qϱl1}:Rq|: C5:B/gn ,Yyj LR($X[f~,Xa @Ҩj[?y!tI̢ߘ[h2ͷmbZIMYDv!˔^Z:6s:ge%[Ẽ m|Hf†BעFUܣxE0&#h!HDI#b:eC7kD\Lk${UG)hsc"q bexu_h|hT?{ҹfY\Vtb"ZK$xKxQ-ez3PGTPUr<7{~K1ӢJ$ވ1vCɌ1Zԇ5|-G 4BE0.^rƤ((榎#0~{~m<.`pXE8|4y i|~n=s-QTm27qluZ3~N[U╦4lی3%f0CJU/fL Bф\h }0Z |{:/}7\ DhFCFMzݓLmVCJ2uY;w$=Rg,XzҨ)ָ͜Fr(RAz&.C4R}/_ ӌ?{:L i FVh@~&=7v9'f.zJd̲RU,wH c}a5@d%̄l:laOiy\"n>a *áVGzZsdDHL1u\˴jƓ_@w\J +)ALŹ]FZOUNtwˏ 7[f,tLxל6pV[z"wv{^]xH2`ɥڛؙ#M6SՈ\Ƨxg>lr(  狋 i,<e(`=78 t[Nc*~=}YA[i+ǛyLɽ Am3W3 >KQAƛǗ3j׮95^ 5=-W-dRt`@u vU1G.ZqxWR<ŔDVCRރS-Ȭ)RpqXt,N ^-ԝ0дFcVz/hPP '=6`>:jʩLc784-tObrD4n}WiSj{fq#zZ_T{ryNƌvD06~ ZGޯWz\t d7OZF)D*f$`QeJ/.c3<C6/bc3.ط# v}BcO'7`VHxP_9cINbG\tt+!P.=^]ՀWQ>S}>w,R|y)kv~whH##|9-P9MG@)ׁښSxw6[ HOw" jR?IcZ o(Q@xS ު~>u1Yqh74KR'x/uL 鑗q_*UtHd7̀ElO' &`T2zj9׃T潢~|+drgKE'x,{ 56 fbNNP6;:Z?<gV妻GE"JKQk>{`iB0M &kK-S]1Wd\Gc]&•I9E]KQlx]i`lxEuK*JcuiXS`aPKWJ\%}FIf=s$:>ka߹<ܧ=GġΫ͏[x\-%!e j5ЫjC2LK(k]yulQKXw#Ls)=; *CǺ335%SK#v(=]x_9]Nzpi[a"x@h[BH׊&LSkv1*_ۥ|[rJ sU0MT;Ns&0%#[yt _8b`ѬVҤd`Mqg0VhhLOvށku+7L7#;F]iIKhH!UuC2%`/k*I73ST~Ws/ԭ\a1|Eю-w?/fyž^:OxH"'мaqWyϾf|Rp\xoLa\p7,Kd]$~ےQZ2B}d*lg@ Ad`,㴀u̺FF9.QϞ7* =[?NSAc_ W?CI\Wsc W[pDFͅBݩs沮H][1vWFL]Cٚ{"2Ǧn p}u X*xTGj[ u2aS ϭ+q{PM}56&epг#s'zNߗP~%kf`_acSI5^ ἪD{ kd"[V\a:c6Ikڐªⵥaq΁Àٵ0Q _MkS[C@nťc9=3c-VZ ư-: E{%45J_4tXIDƦ:U6ME^u\ۧE-"/VQlϳES;+ N jZ9dܷ+id  D.'dkhLBoF|]V<$ɸN+Lyn~)BQn]W=VЮݾWEiT^XdB1$}=Nmv˘AC!A5%l֨F&al( P-KrNR}+˲,-t]v;7ogHՍ!cŸAdʛ9m [|',AY{ӧ^pKr!H"!h#w3h5l)䴪6 Zaڬ'nzLRnt-cNF Yt};>DV3Oxyћӫ]Tۂ1'% q#DhPa=b}UfyI%DO/_BVoDp7<ֶ~z)F r*]Ejä葊DA;pj˄C6u|I ?<lLү_]bsC6'|4TdrӟQu&z%2DD{ޤMk/QMy[ ԞU'2zf{鼷eyXN9fI:9)L#r0Qd>tx[ dOjqT}إDE` 0s 4dFE ̓ţ̕]ad<$T6w28egP>'Eby+b4>$SDz6оvI9W*;3fxm kNq @7Z>oUksMXH3{||%@\_g!lDHjLro@/7=-ï Y{̡P#[Ph\~i悕I->a6Z<=Bp+5&O1 .vdey@ &[ ކkׄF̒wJ'\7Y1L9WTgCo.i^|}sV!%+;a+$GŚO(|t?;R8_PT_1FU]:r6M8}OlQ CaYU,C'Ѥe:N6SyXӚ}#jy$VyXm^t#}6Qoyޥ ~)}l"fO+y;&]֠(wj!DS闛B yqc~4[4}h\Ft͡8KpN}sBW|d4KP`2NѺԿe?r02#Y}iX)}{41t9[wN\K}\~\,o<zU7&ot T @Ws)_N9M?:sir/<asY%8k A1 kcS0PtQ?!~ ΣX̖{tfN,yMq  eҞ"I7[$}`F-VL }CȬI@^UH8{:{=ESӾ<qDaׯfY\kMx{ ,uGd[ AD~Y/Io\2Mڝܶp5N!c$f|_33ZT vkP.U]谕'(13`-)X_ ʢcwE6b|7])GF&Btİ6{~m fEqUEw#a4|WG)84EDOSO_*¢\*m/t˻c&OWsb KL`g֨qM*U}?dK;Z[/Oj1=ؕsFq;M$O%aܘ-:fNf.=b[1m)o"qp- oM֣tO톽_#X!Y@m,^r߭6M 9/ukB]Ԯ}5X64w#}+3WY[gd/t7hۼ&gƕ{5t)]U)0 =O;ja.9 }/l6ʈM/ 4Q"Gj\:s|Fl1jd)4 Hz(e(1tZ& ?Q tu8Z:`/2f endstream endobj 350 0 obj << /Type /Font /Subtype /Type1 /Encoding 818 0 R /FirstChar 11 /LastChar 123 /Widths 819 0 R /BaseFont /OYALOU+CMBX10 /FontDescriptor 348 0 R >> endobj 348 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /OYALOU+CMBX10 /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [-301 -250 1164 946] /Flags 4 /CharSet (/ff/fi/quoteright/parenleft/parenright/comma/period/C/D/F/J/L/P/T/a/b/c/d/e/f/g/h/i/j/l/m/n/o/p/r/s/t/u/v/x/y/endash) /FontFile 349 0 R >> endobj 819 0 obj [671 639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 319 447 447 0 0 319 0 319 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 831 882 0 724 0 0 0 594 0 692 0 0 0 786 0 0 0 800 0 0 0 0 0 0 0 0 0 0 0 0 559 639 511 639 527 351 575 639 319 351 0 319 958 639 575 639 0 474 454 447 639 607 0 607 607 0 575 ] endobj 818 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi 13/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma 45/.notdef 46/period 47/.notdef 67/C/D 69/.notdef 70/F 71/.notdef 74/J 75/.notdef 76/L 77/.notdef 80/P 81/.notdef 84/T 85/.notdef 97/a/b/c/d/e/f/g/h/i/j 107/.notdef 108/l/m/n/o/p 113/.notdef 114/r/s/t/u/v 119/.notdef 120/x/y 122/.notdef 123/endash 124/.notdef] >> endobj 343 0 obj << /Length1 2054 /Length2 14883 /Length3 532 /Length 16008 /Filter /FlateDecode >> stream xeT\p Npww@p()\Kpwww $8]Ͻw_=Q̵eͽ>@I bjo 20)0023QR9vF@/ +$trrQ;x8Y[IhhE"b p41#Q0ZlAsِٛX$"66$p&Q8\p,,$&@c?J2vf$\8&W3H_$ IS{;S=(\F)::N$ 'U o7nXؙHtt*[M,ȞlLrR`QӖWӦ*;׀&T6{8'?,T)'Kw/̠RוJ-agbojigNIbdL b!3ALv@P|H-dؿ 650*=`jli0;3 `W3HOO`' Jko'Elcl'M pYHpٻ8 S=K׿ztA? u LZ3Holcg'?8sl CyEhN?P-Z,@C ?Z!(!(A.]!Pv?ʮ@5(e@ٵC<;XUAv7gbЩgr!PN?3hɦ!BPBTT\fPB_gYAۊ/Y +d AV.!/YurB_ A[ӿOVP6SKJ3^T݋~?<$<<> tr ,A/`hodR+Q8#ySb]\|rV)tEv ťVX:oM`g (pj&D_lixc~|F9Xb3@vEf$9+e CFe $kkawa*]E9T^NcmrIuwxLxb$6J瘼D{-T Nʙp'6(N \al/j$ry I&Տw8%֡@[]ns1jg-G}V7JR R7$JdĂf"LVbBKY{Լ*j]EVd<2sSz'ѲCfQCN 0Jםv컯;*ĬFn\OA7mŜp~݌;ESO|i7R .ЅDZ GrmTVUnoǼk&Ly$=/X0,wv"pJƤ#/C Xe  _=;H@Qp}A>-I])'Z[ Zx*_5yQmwKݖ%J*.;7=r]0b+J8v 7M8wO[|&bƑԠ`칏nA HyTǯĹyU`HfS4 [9 X>᾵5D:3* B]`{:qjg&,@/,r;Σv QALi 7Bcܠ1:i9=z=wa&aO#uW?;:Uk" tzw~STM ɇ<.Ųm(^ɚl{W%4r_ɫeX^Yx)|C;ӬͤtjҞaR~O j u#1D@DAUmF”Y~_ߤ`Wܕ};S>h93~M5cEvL#ziIl3.DGaҚ(Z״M\(K7^8"pq).k+KE|~}r4HlrjDQiֹ؍pX(z 6-6 Y$6tRs5kY NK^pTcr9;|Gm^2'd]N tRgd)sm(TӶ q˳f*tE*XQ=eɮ:;K,UTy G-\F( X87Tcۖ 9pz#T?aL[.n\'&[4AJ=s8<=UY8,h<-:$Ǎ^bOZtw(뇬к&WVJ8\|8 li<3.L9"!:u8}qp4z)rScANzxb>DvostoOZ[%c|KQ EA"FX1|zQxjCKFy4=pt Hyyqi1gַ), g+FKSC4W׫Ѧu>xC=sXQS% dCߗ{C)z&ӍPQM j.ӮV4}/q^s_w5,9l\l&ω_v}3S[gZyN"6s3}SwIFA3 _zؒh/جFnG%OY,0W5dӬe:p))hn;VX#֖ۊz o]܉T#aێ_U٬_I dPͰ~;F[Vu4d@oҷnZIv` Il4Ź.Z^!VvsΆE5u̗!Nt,$pt-VjPIXx ~%_2E͛PW>_Sk,iwQI N. i\CsW&:! ;P{8Bk8̡0u=֏,REaQY\s ȥ7!`=O g Cz?UCO-7Ӽ1䇕*Đ2g0Lq/[E3a51#0Rd.F :Tjm`xδKo;98p϶r$NnAb$*OdWx"Sdd)s gPjv~nϝ>pmaxqR}DPV*׹UkĀ6C#o˵=(l{p Rﲯu#U&oXdJ*j>`*!@De"H[&j9E9 sNB*z++49b|\iC!׊F_LnV%GAY:>^ /*M@8H '~.@BR6ƁPzT?D* 0<47jBR?+Sa<)/ וa}/{2һMJ`Pz@{;|ʅOFyȅ~;aNF̦b^9jAOVcXg tx tg3mU)K 6ց\D9҆Z4zJ2R'm" GF۱nALoߚݜq{ jvj)#0I 5={ n]> Irh/'_t6$C 3h FPr5U3u2(_x%;7b\9x2_+EKD${f>FFYUs$~¹2&.(UFa:9{!.)%(͊m'@!tpNCʇwC%J^uojifs*&1uš~Bag^K(ևϹ.ސXO8˩-&V= Q-.!+voVg5]q5[3&Lؖס:E_#Bf;Bc7ULX&rjQFH@0vX+9+Pqd8wΩd=B/iRAp.#ZI#gMPyN#F2?eFXf=!ʯQ.S$I '5Wعwhj"_ҦFݍɌ"g.8` XX ҁJ` i>N %1:\[5,~eN@Kdꛌ  uifo44c z(neH>CGd 9Dqd`RLLsʵBz^&y+[l)ǟwf r\d2@u~&B;t)U.(Fkd‘pX>eH<ˡ_WYb٘W (I"s:Z&#t0WQ\=M*+uL)rl:j)Khhd=W=ZBHjA=6#aX ,z(l ~۰ @ Ϫg%^ EYq&-*!C4񼣾':%ʍlfHZ__`R.64OV'58WʹEpōBOZ)ݰ7Gxk~g`5 *;tW~Rn Lj8ߎѡc|) ~H6Ϊއ QVqJ5H3utw! 6imQ++~EΤNFlG#p*ST7L3.gr6O PZJÍtեQBoig*q.WLS,3^! zjV*S)\-Ss^]%rbp{d _( Qc %zBRtĮ̺QanzJ_ITJF+ma\ڵS-GleE=OùMr:x=H"ULOU1!&0TRΏcy5mNDϔ:W k Yp,?2>RW xC`%˳B4ibhl>I]e` ^Cko鴽P&4vZ_W!;GVu"8JY_ߵS$4!BW3S YnXa^~ {A`I`q*{JI72G4 "7 clJbZA* _9 t_63G)tlֱp3@~sewݼQ*Uk (]}NCT̴; ya%e@nʼnr%tWI˙ n#}$bVb} @/ۼ#b^f4C.x Dk8MTGL1_Ǐx٢lcfb.[~=t u `fMr4De*$OlVt˂r+.l,tK=α%Y⛈ޠi9 |N diƅJkᒇIrH AiQ?X"W}3'qs@ n0Nx<ٓ*џi!Xuqg .7Ϝ0j35g~- M7 gSRJިTMkI)Iz%6ұi/Yn?LbUӳ-kL>|Ԅ¢Ux]EQAN^ֻlH8Fy]JgfbyPx`߬~^L%+5S=?ͮQr?؈1g# V*yZo9TojF@"fV4zz&ԡwD ֹꪕ~ "+~Dkz1ҍ!_!53+*R}WHs:8O ![+gr/$#'?'1]dt`]F ֿ$(Lng3i[Xbunն(/p!+ޭTxww/=0m>7J9؉#L!K,itWyT^@?K `G,Dl :&BAģHF3Rpv\{υF֕}5=:Z" ]L*4F j-}HrA#{y8pϔz;/Nu(oFLJP˥A`)QwoFfO躮%ƕ@ wX>|q&1QW´ixhDV6$H&ض핹Xx(nn٥1hϦ(vL/:7vnt/{egF 2^ s 72ȗ*xNteos}2LMyYV-`NP%t޶n^o5jVW ʈ Vv {?\iYkNb$E!f EO?@pdЁNzC-rmI6${+PaxǪ]e/bMF!vG6]%Q5 'f%mX[փ^< 5Q;BRaRC}2Wq^}_p ~mcayHPۯpFU;dɻPԽ]˹oCL8ݏ|ʘM3=(Õ!j|M}@`=9>is g@$j**d <6[W)B.bso|k䦍OY.zQZGnziBd=PFKgŰVRL8*Ӳӗňvl>ziZE6`Gg1\IKA>ύJ%?_`3UDuکdO}Sf48pkQc+ca3wWvؘ!6a0`ٴCax8@AS:pN*T(M[ i.~t?Wp;v>/6 _,e6;s+ (^QAnOU--C|~F}+iR9M>8jX3y_ ,^u3yV ~I4%BB71wG67^qب\FWjʩ*΂*ɐuL 5 yZ 2񭐥0e2Z28;B3vfJ= lHo2Ng]-F<"}z K41YBVPXP %1Fw09CEKkلܠ 76b<9"LKG%O'Sp:YӰc GT,#ۑwyA^'i?KjBc5BUHN ĸ&tMYS+0OKIog[I8;Ү2ժ)NP>̙2;2}g;>^wxǕmF@^=r!%W"^OE̶O'0ˎ/c?fSՓpf^/=H>vQnkĽUcy99Ȍ {rpD`lRGE9ъD562'Z4^]6ֆyH+ESϬ>8%5\[`w^$Tc8|8@Mbu<5GtiEQ9 U8uFw&`fP1W![ ~dZ-P^{w, b&M٤TjUϋ3(4IC5;EH/d#78P7l֮dbˆ\%f~Kd. a%i-qOZs!΢B"qCr"yR[(,.iWa7['64@-X7 w4 v~@_Y u4b> $+dWNm717_u;ڨ a/݂DqYtT5#oq'r{V2䳄{ɠ@vR2]c \qn <\n&dCe$1"'9Cl(.#jL"q/CnjqB?SR߸%.LɕvJE@D՝2Sn ~#RRa cqM")S#ڸx0k뀿L R}xT1 tFԽΗ/iօ ˩e&~6Pdfy7Ym#vQiGv@`9jZD{<=e浂ͦ w6CU=MX-!Rgezsz$JP<Ѳ-hZ*2Z>"nt^6U0㨫p sJs$sDZ[[XB=%1a7X^߅K ˥.+}lUyFd@^:9Zέ% 5e,BjusR28~r,űAX>j)]"qaO8<~PkqGBmԶh+߈$ʷ/д~KHr>׆8?OQ Uv1TZkюU^xSO1=(S1"*zmo%wxcAƟ+:.1$'*|?8%6n!h:F?>pj;07O^4Aj Hϝ69#օ/wO]H澰gY,&q zgBQ(J6D@~C.&s$/BLK jPQ("tZ؂aYwS&%_X|Q MӸE2mZ T=guF$ [C'ek7\ȟ^GvqHDsgVYH$)x<ܑͭ L^˭[C>0 Nw ²uv aaR Eੇ ~5=r!0 &=tWU0N\N=ďO)C{d=\IIҘn_ )$"%0w`U֤FUIIao]{h@T[IJkߊ^l}JB 2us0hh'i CyQCn 3a@;ѭLq-t/ބv~PGOҩ  \4[>Z7.v%U47EpO:TZ` S̘H bT]g٩z@aefjXOP e)`}L (:{NnsЂ:B\-J1=W9I{Q這'i{mh!+_ユo:dC,;{y:l@a,.e#K5egmΔ:iu;D{0bb}a8_GX=t62C`"H)6)s@7{V #HOk|P$0T\r!4hK+2 KI~JU?=S[aPJrQVKxbWzWV~a=%MWCkf5]zOU}M}4`I.j4UZYv#gAag3>uΓfz0` 0QdbMm^*u:hr2&1k*QKa?R,WN|@BlKJ1n+2淂AA){Tc-7\f/&9՛/ǹ&1gS^:v GNC&I+bfsPge&Ǘ1[*FgxBM.df l儈ⵂԠY^?PO@8{h.OxÔE)^J@Q#Ok,pE< sj$7t*BV&HYOhndxG{kCJEUt\_9na>p˥vw&1wߨ^I*vߤc懘=8KDIG]+E;()?C\?(ߴ v فR.)ϊ/ilCi lZ`,FK[$itY<},L~@{ ,a}e<] yj`Ës XÕG~)րcoVr?_!o2Y$Y)ja +@HJҥ,~/mɟBpAo8IE{ap8 ?h1iu64C̷ؔLjEs'gdXCp@Ƽ ']bK4plΏJRS,5$8*G&QXLϟif+M~_51?bL;jendstream endobj 345 0 obj << /Type /Font /Subtype /Type1 /Encoding 820 0 R /FirstChar 11 /LastChar 127 /Widths 821 0 R /BaseFont /ZSYLSY+CMR10-Extend_1020 /FontDescriptor 344 0 R >> endobj 344 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ZSYLSY+CMR10-Extend_1020 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/acute/quotedblright/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/bracketleft/quotedblleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash/dieresis) /FontFile 343 0 R >> endobj 821 0 obj [595 567 567 850 0 0 0 0 510 0 0 0 0 0 0 0 0 0 0 0 0 0 0 510 0 0 0 0 283 397 397 0 793 283 340 283 510 510 510 510 510 510 510 510 510 510 510 283 0 0 0 0 482 0 765 723 737 779 694 666 800 765 368 524 793 638 935 765 793 694 0 751 567 737 765 765 1048 765 765 0 283 510 283 0 0 0 510 567 453 567 453 312 510 567 283 312 538 283 850 567 510 567 538 400 402 397 567 538 737 538 538 453 0 1020 0 0 510 ] endobj 820 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 19/acute 20/.notdef 34/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W/X/Y 90/.notdef 91/bracketleft/quotedblleft/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef 124/emdash 125/.notdef 127/dieresis 128/.notdef] >> endobj 341 0 obj << /Length1 786 /Length2 1519 /Length3 532 /Length 2087 /Filter /FlateDecode >> stream xRy<(M%),ؗ IAɠb̼̼XA05PY'-EdIvIQN&{;~|SUq>¾ 8S(UU+H@0ӚM s],3431GH‚923@D!3G2d 28S t:| lhP!  & F_TnзdS:bR@,Ra&=4 F' Sߋpt'2cY/]238T~R!.AQL?:` t6RM XD'\i9!&pH?E+'FaA| bq}w~&BLd 2EA!s  @L*@>fD`j1M + `8`/ ]C_@a:z.a#lĿ)\ drV& AH )~bv2 Ti2qMuӕƇcO/ܳ?2iW}23j 5H]*L)'oSjj:~|`{mKHj=n^Ką 3l-bJB(jOz,Ĩٕm9-'1(F{]-|2ᤠzFrb©=? jsdOІDZU/^ ^l;90 !$=cFl\DiΈ=ZWQD=)ty`OpPb+%ES~nkwTe&> endobj 340 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ALOOQN+CMR8 /ItalicAngle 0 /StemV 76 /XHeight 431 /FontBBox [-36 -250 1070 750] /Flags 4 /CharSet (/one/two/three/four) /FontFile 341 0 R >> endobj 823 0 obj [531 531 531 531 ] endobj 822 0 obj << /Type /Encoding /Differences [ 0 /.notdef 49/one/two/three/four 53/.notdef] >> endobj 336 0 obj << /Length1 1600 /Length2 10352 /Length3 532 /Length 11275 /Filter /FlateDecode >> stream xUT˶q`A \wwwhqwwKpww%[^kﳒOwܦGfUzο*2E!S;c3 # @DN,DE%4rي9y,ܬq1 Dp[8hDh:LlrF@p#k ( t:MXX g1d_aSr::4kvSx7 &w7+__F6 kOwq:L9U/79)?GA&B@B 'q;Tlb03vښr+0ji[A<=MdaY~3P w3-e ,lMLAVNa5`&F[;gD>3;G ~ YL.v@Sc50;3hk 4#Lg710Yx[m8kؙ}0y~2v d # +" X.ob0I&ok&rpN΢YTS7sC'^Orc?ww& /?`Q?ljUA ;Y`)?leV [9`+?l\@r$@Vn AX݋`nNn1|H|@+ t -/ؙ[4LA 7uv -CZ8ЭUmvSҸyC\˾~g UǞ=}1z[ hYVaq"d=:=\ja!_߱)c:a$%MZ!4_kwU{iNʦMCऴ0 kP`\<"&&˓@`oB,\]왊Sox׀EREB]e4Oϗ#@w~L7zs^.6,j%vz' M/@ҫ`Oh㗥0퓯12za6^vL2#Ipcͦl2ӌ*wɺrIJPon@{@^6](ZjR4y14<8Wztv/OޗRSGU})YIjsyji9cxF8kbM{E(xe!JdӓN!7.5ԓj LT佀K8l) | ?R*z(r ҞWo>+e^xw %KŌ%Fa4})V4$h~')َsv5n~{DgRV :dcmu*BdOתrIrZAA>,~HVDT˦"m՘#Yԃ,0 t2(ڽqϨ>k˝8y /Sd Sh$N q{ KYQ%P*<ggeF)%ZpC˛$裕f(6FrX;i)UEw) eԄ7$ڽZIköSG=+bp{J ˸hJOcRmntTX7'aU]NvWidٷb_ EiL+BH(ؼ]~Кj*7P/F УV 3%d2~x,"!`85^Ǘs kDݡ?wܨ4tBY+wPWF2`.z\Ka"e!ok: } (Z~tVecLmNgN>*9-Zg6<(=&&S£ J@OѽG{q8 Qםɣ.9 B7-+gIҋL;R"T́xl%=k9"lgyswa|wOM'{a_*(wrpQ;+__RS=^[Rjc:fa<ʣwʵ#J*Ϟɗϣjj^n1-~/ǿp)ļ@ԗDيd:{ܤαtKpz{q"zjJ1r+Z rbl`-LOOW}p[|+|qP =yYԂ7i5L\Dq9I+lD)6^T@Eg*53r#G!*u^W<>D\AӼ:QA?@c%.4 ֲä>K{R%_9T,(&ˍ Zd[9*([[3]R;X%(H B`(:fQu@)jx"lvӍ Ac(1yS[}.r~Ԋ)ͺK$|%Cf#V_ҙ>1+{=k'F+ &[vdFIF[/9=s{>CRBH6KOX| )KuDF@< fܘg9s&7I/_՝Z_&3uI| *I߹0(Fk(yјX3E.)0d:nݼÄ^"f\h/𪹟mѰU,Aji[C](d󏛫Z#awv|kXmDpDV]LyG#J#aiЫyqlyNVJf9=IwrM.r6o^fiΚMJW |N=Ӊ+'8 &} B-7  , !T` [)D FXRY~s?? {ܐQ@F%>|sf;Qqwd]CD}MRUTK㑣íqI.{K}A NOM1},v^IG%P,}`md 5E-\?}Sb{lyl%y~|f>t:;/]5ytd>mxĭ/RNYp߬MLMH.ע]Q3.࿷cվ^ln.}Bvf6OVO[`vU[yj-niLOT؅M{԰ PRm T`#N'l]K$R,n:u7bO2zHs#TX3;!c2s[sÊ#.Ihӏ2hegR9KT/%~r6;WQ;]1ތr-]X-aby[^-%#ONv>rwOaiЉ{?kK1嚝I(S"GB 盧ަWic#Gh̢Jp u6 *1b0ucȟk'}r,D[WHhC5L,&P(| M}v ,,€;ZpG1GuƳ(D5ZUR!mz >ek+7ZCMK3ߜ:}Xq̢x+D {?oO8 W!%"7<'9́f&Q%deY&QḀ+m8$\# {V vCuPwA6U28:GI£7vG6*54I/'L߭6?RV.XTL>M#\:s\;iC\[,82_y{ 0^;|[alΗsŎ%} ?!yr͕]q%ˎ/i2t#p1 J/s/~1doW!c@SY^3v+ۊPD%zKLJo+|)92v$]E<{vfTH8$ظ3U1ʗ@O΅ʴ(BwC}"]@01.Ud9l#UĢ `V]w'I$T]Zs910?7ix_zҽi 4^+f ">hoхjuOO{ F{(XzAU7 d5`m <˲OƯoL__`1K\  9\Dm_,Z;GIl@}:Ž!4ctXp/F`Qc;H%}UrU`=!DLFu95]I}KD!V'C}Z^& 1 8 eiL/o0ysq0aI3T_{ՙ}ұ>e| ž=UЗg+қWe8iʷp3P#d eDfg?)\ȮfTb}#_Dy_2̢&5p3vϕXQGujZF<>@"*gwJiTl.օQ7ag]yTkemx[įh"aR*~41x:x\S<JۏZ2.āo|oY4|Up3[EeS7QYtm(IZNK_ !޶~ƮhBͭ<2&< ~$#𰖉+D0)[PMO\+ $h+r4ZB{JW g˩,^Cz) 40I3.g\־oWFX-aI[v_Nǣ7y?AGùlTކ ~(5!Q<$A^̱J'?VxA4 A򮠈.)2fk=YSW^,v^P\ҝTp@[5VXl;fh6>%dm }w \\C raHZ( dO2+A%Oi[>%v;@Wu F3Öp 2vɜ7E؝&Ʊ߬{zƱx.IJc`#эT=-9xn`^|ff2"NkĖMl( S+HeaD#Qcb?[JȋEF{_45\f7v+Iуq %QW]>GKoGu NvЫ,sT6 JA7Tb5t lNZ=ѿjҢWz%.9oK"ژ)ޒo8 -AK Hk$bbE(3Hh *-퐟PcT|C.q)zQ7ݍʢΠc]S7鹜yY%)a[?'AhW`&8s^׈>nE7 ?"9xmk#<$ݕKRtXXͶ5=V?}QEӄr՛ G~J_& FfYp+ XE38ߪ2H-W .8`o*1)6 l Iy4L mֲQyp"_b?3ߺ"~̄#*E$8lͅTmUC.*&09{:竧%rO;ytN̵j*5Gwiu\x]]UBfxn!Y(اP(ȔfX LKD50C3bn3H@:@6;EaI"vypj]x,eHQdzE5}l3| ǀi'` f'>oX#*U8۱.J_rgqC Jp=K=PIQ8+*ie _ˈ"T^kЅj|Y{b8ds2{&P\ǝ9FjA/PcMG7X&,YZE8D nyGߐYedk` \#K}Oޢ?0hE,W:{ټY%͊ؔuL#'-P$~Zҫ$CLkMό-NjEP>:%?OKI0`g`j)JgN܀6|RJ=^;ռi#-<`W#U)c G ٲDS-E!1t/%#9"cse֯ъ{F5\_M> ~kOG>$)jDA:ӵ.LJ񗯖p 0UڶufxjO6)u}4$wn)`mihg7k'ڑ2颧TI6!x7C x"bGa^yJ~㾛N|~H&8pq{Hd< x=k#GR+0 =G0;$ӜStVSpo.As1LV 6fs WRlc ,cF^'bt$0;r4۳<[RMSF` 9+ohv}a Aji >d$A$>V{koW|цWxvuEs ۍA3QZ)tJ]=)½_JkQ129r.F$ eq]GW~h+qwZ%9_j`jI Z$]=`ϲG*$V)MRH), ыz #?r  .E\/]\_Ŭ${B:>@sr2Nfx[>p}ϓ[Km#jk*!Qk\E;ismƁCIUztfq7V BFe*ۦ cڣQYN' {~%#aDždB'ZtDI:su6!o5߾/\CiM"W@c%{fII(OJx*Lozu)1%MK|a3xQT4(z?y|)shἣL``KS~y9yܨϕFո5^<x*zEG"(=$ʯR^)y (5Lr]K7u:VFߙa֚7*s=[h52„`WB㖚+9~߬'C4anY+ t˞tj)I`'QQLkS}5I6+32ݺl-{ϡU`4=yJRd1YsM)TCY9/+}􌴹,f;^MPɡ( EP7IbB̘շ5 (X 2PL8l۬WJ4}!nO4)OO½.ɔd@Fdnnjd } K's.pf)&gQzrQii ӘU]iz]$=)Q?~T-'c(p+n +aD8$Cx!K-ʑݼu]̖O#m[ŤdjQ C0_t{U5N㘒J˳oR>>hi;F`U'(%(BSnd Mv@rQ3|Í{)%7I2ۃ7"mv-yA!aed?AґQo>vZGmx"`*'.&`G|"uќ~YИ'\kJ[XȅB$S"~+E2m{1^@M=$D֡yIhPޠS"x ]\a#ED6 E4M{Aj)=ú~c-\@uJL٢{ae醫߼{̓h[8ilwm`b6If5זɷҭk. )PRg5$AJ#Ͼ?)BN)vI 0#M(@y[KI=jtԕrR}%A s1#F!+݅\u2W~- ɽ~4f(!GN&d^2FZX7^: B^Ƭ2 Eb93i`D SJ))fe{|y\GO0wle"|YaNnM-ٰ-tLvʋQ۸9[47c-IWݴAm*K}w7Xlp&ǿ1s+[Ϣ*jA.,G9qe63* }pd:[Y {A䡵' ;҈w(yϧоq$z ^.L&+"~}^eNU1DmY<Sz2KU.ñvSLJPV_{՝yn :!'ٔ8vكgq$?H_!szfۭtP$7śQ_Q8GMc#k9 `tpc=9 ޕgC[C͐[Fh]D MͮoAQolDq7neSd)Ts\8~ 1|joSG\\6n<:ze e(t$aop§Ƥ$k>3E-N'GVSZ dzfawOꃏ%3 ķT &PGB9W_ٕuTRPzĠjr!^BW8װұmӥ$Wn/R#w>UF2!GQM)d/=fռ"G`z @Kl 1a9Zwx໭<1b,^ dx=nӼe-)̜3"WueʦH별ERD⹛.mܢ7=zSJ(RJ* t%#WSⵤhӱ ,"O"c Hj06?މv%aP- o7p4QȄj& "!v3G4jȓރbupod~{ϰ%' W u*un#>1}~$D(vBk9ʎHɼ-δ 8!$o'j{6V. {q1C~t} fKؿ,e J[O&fyB|l#H.%;߂3+ܼgAQ*`VJ`EqB.ҼU;we;6i4&ZBE=4dOn$ ʿaĀya"HXͅ3> endobj 337 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /DTCDYW+CMR10-Extend_992 /ItalicAngle -0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/quotedblright/quoteright/parenleft/parenright/comma/hyphen/period/zero/one/nine/A/C/E/F/H/I/J/L/M/P/S/T/U/V/quotedblleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash) /FontFile 336 0 R >> endobj 825 0 obj [579 551 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 496 0 0 0 0 276 386 386 0 0 276 331 276 0 496 496 0 0 0 0 0 0 0 496 0 0 0 0 0 0 0 744 0 716 0 675 648 0 744 358 510 0 620 909 0 0 675 0 0 551 716 744 744 0 0 0 0 0 496 0 0 0 0 496 551 441 551 441 303 496 551 276 303 524 276 827 551 496 551 524 389 391 386 551 524 716 524 524 441 496 ] endobj 824 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi 13/.notdef 34/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period 47/.notdef 48/zero/one 50/.notdef 57/nine 58/.notdef 65/A 66/.notdef 67/C 68/.notdef 69/E/F 71/.notdef 72/H/I/J 75/.notdef 76/L/M 78/.notdef 80/P 81/.notdef 83/S/T/U/V 87/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/endash 124/.notdef] >> endobj 334 0 obj << /Length1 1473 /Length2 10143 /Length3 532 /Length 11020 /Filter /FlateDecode >> stream xUXҦ! H4wwwonҸ;!܃;-Xp?Nf\}wZUOUWS+2AL@R#WPdYѩš cG+XN6:+ wZYX:hqځV`% 191Dmm*p@Pg3:02u,,(Ce6s%g& @ II4mf stE, .dkhlOu[7u;{'G1A /q 3+'\u42[؂L\err)[9Z̍m@f)ּ`QSӔcSעQ`/aXV]VfVV _Ll 1Î' 5vCq<+r)faCa[x!P d[crpXL!vv,<w `AfNV˟uN -<q1/XZXfNA?. n o!^|Y_H6ND!=tw$ Ƀ,^>-uL,ce) ̤>ҹolѨ$.n3m-,8G,uJcPjXHS^~gFxW<*R^*)D6TbMܗ][q+zҹ0oq {#'#ָy.<捾VgA,\cGMUusvP&!9'A~gVwUZ}W CVq+'7Ur+^L`b DLiҗ3Ia\#I$j\휨QIjmP!dxZ@ڪ%T9陿-b-׍H@V1geUi_R˳5*.{qlT>5gO]U7l-9 ;^X_R ,ѡt~?7QR Ч>;EbnxLP_N.?s?;>! wn8Q`v٭-ˍl-|-2W&f+Ӭunvboj >F׏h3 rQbKL3ˍ.M,`_)lCG>${۟(䚞]pvem'nm rLԊnr-0KfNpFfTWD|nIAhl+.CE܃+؟N3HU,37?|ޣnڏ}mJVܙz|Ҡ%FќG)BDg )CGF\Kvk( 0'K!~nsk=SUݐMHa8-"gE9E, do]loNkϦ/]ߔU$>N\f`շ +"D<~yyVẌ m]}ˌpKоQQD`~6>} KCeEѷ5<5P FxHP-^kJ9)SAw6hVA]sQC FQ҈)òA/Bi hƔ?rX.'nMDu\,O ze O :w8c,] 7--0 1ax_&~/M9Rd^$pVMtU>M^vuO? 6رYnTe 5^F뵖5˩g&r~\rry,fVb_G)އϛmt=EeJ-,rڢFT?ŏzTF^Ft5mR"}w'eYh@JrI@g +-#:K5ސ"e,k ضhꃙ_l'#i`?R+4g,5l59zF9u<@L%El_ LwA`C6Ԇۚ }2DC0Ӱ KgN9׿!?m[r%9-&!xJLrSjԊӑRkpzc!˒bf} qO{YmJ7mL6>3eD]'ԲKWwvIе]vQF-hZ%jj+ܼϹUS"lw"SHPVN>NVcBS|U D~&Q ݁ &\H[WJ4.זuDt`!vkv@QRWCߴD^ 9[WN9*zP9;wn9H {-T_tRIWZI͊i5k"J{'*N- \͠iZ?0y ĵų[~lAM1ЏO|ͥ|TBtޟ{y+$ E~^|0Qx&8bҘ%ۇٱK:7+tɂ> +eH-;ĮL=aU0ڈƊ<-DSWZOs[P"K< m([[ů%>0ѾM ^La"LOC 9y5fKG%/}쎌$xȥm=qݒ3Ja tP8@! L{ѻSYO˜OO!HvzkrQ^tP>\Y1ɿ~W7=n Fr'NqZ{ֈ=oiYUqWo`kۻտf^8byHxҚ7T(\I` ΟK /T2*r|ߦZm @GL%VˆͼMȘQm$n^H3k4{![\Fͻz: BXbpʇD/?J Nȑ5<׺K\>1B\q||Qgf,WYתUkduNu?[nfXCt)PRP|9y.ڋ1Q\[Œ~e_"+!|)@+tQYth [WWuMHoLbiW$|Gnmg5nE+Q*5TOz=uh]fJ~/ZsjL,TK%]r궧×#gg*RQ̉H_wUN3}IX7H![jEy/&H|tedq0s]گ|፤6̘#<8epb5M'zB2Z:{]y0;"{8Iю)Eٮs(ƙ7ȹ*6^M65~}l m]K: wq̏o .A#f *O/sn,ot47SIb'_,{Gl0?/Z71; j מqsH ; sAdISi =LVzq_)qёa8L:X:q'qvxLODҿC FZX;π2y|F:E4fnxMERd43n;.o/p%P!a1WlOčVx㘣ͣ+o<8 ePy1÷c^C] b5B]у\͞OmFyoS+wCyGӋEKbkK,6k=nșu5R\K(nLgf;:++`kWaLr7х O"yXVrǗ▔`#O^B'7^n ?^h[fEZ`1\byI8%J}8fSjP˯MMpYl\_.H/9̻X#-bET'I!S5(뮇ydC.H*]ow9.M {3M4yU}{$Cn8v4#YR SiHT"E"ڪU}^L2G0p5ץ-h~v`]9Wq$%0TiZ߂2}NZ/{M[}UV3S&:៽zXhT"; 4#_i'5TyZisײ· ?P=#_ DL;*1I2NF=gզeܾ"LYB:Hمfi6wv@1){i)K%߂$֌k=+# ͌~YKHhˈbsc?j٧)HM^[Ԑݏl{ĭ&wZلFoՉݔR.?2^N 9ϖVaq|AEZ@łSWx>;t&ecZ\|8 zod ^G8ovt+0"t7h%϶!8M/9#*EcAЮ629Q~ ' woV28wbKLpi/:Ѐ! Q[ 9 d.IiٚBX-UpNp ROMTPu̾_m~UL^}sQtrKu6ap]q Ci{Y(A^&v{ _DdQ'.`{kN~uh<#o@ '=yA恨t~™vcy3:RtR{|HZ?kĘ{3(7X6^hg.bg@WrE8-l 97k>|x[êrD$1}un[ g{WzX. =w}$?eL mb4C '{4p Q]rlP'Y3c*Qw&FUrAt @58YkSɹ^;IkxEQc'gIۙ}OA.u NŢyNPsJs ;B yobS>< C 1/LC=[`:}\@xej0%}M#}oV7uώ`^ӄ !^z1JT|\YPN{e7#,TB%QM}xf*vfSAP)cq^"($m5Tx"KE%gB$[;6\5'Ia[r!G7:psFu4,D6RyO!kZX]Tu}RPdYscǛ_|mԄSjΫ_ W1 |lHI?WN-{|P.7{]jc[+/zYa0ҋ+lպ,q$IxbX-YbƏ%  ̎FW.RX7ekI(F~PYeZw÷Q@ȋ:K2 @FkA-8 Gv`iW&u>{'ЖG7EcKlP{ -LdE3s.Ԝ۝^QҰ?m9eiby8Ҥ_z)j[)CĈ/?Jv ;SuX~uUi7`Q6?NN6`up$>E?K/Tz663QN"th6[;gp|1$#&PʹkLC@;woX ·h :v\LL G7OYFO5]}jD-ӻx< xW#C/]Mf64c1JDSN:YP]1a6cYg@'~}2%* acnId^s53[Э''n.Yk7c<JpNĔM =U XfN gZ[4TIy*qB=pn8>4JQFt4}wh\*G ]a'G̾ݚ[s5:چAP0҈7k<6LeTT(A) ݫI?_a) |f)5 n2BЈ $ Hb@|IrC"27UJ:+cYSso5rFdMU=ܸiZ|[iE}wEQ<C^{ :hg4!y[^iT9.iF =LJ~3\/2d΀X:355R)'T(C't x+z[s'eIzh4$`o]W6$s`_Nqh@H)ܚ02P34uL=M:t@6c::ǤSǨ$Y;#*oUWޤ$a{12d5DٲoKΠD#u3#`I䚰K!ŏB#PIU3ݔ!;П;~~ɭ̝SJy-9vV_WReeZnG#'m_nf6ޅW֠%P@,(tʽZKפpF r6w1rE{`D,W,|Ԝ;[vş*#&-0bJGۖ^ԳdIo,|f $4,J[jI]h{˩$qlRlic /줚 +39IN~aawve2R˯UϡNqE(k Ckצkw7˫WhJĵ~fY'=B$:;ޠLh񙐖gKH"_PyE:Pm3'3tNlA V"?DeZ8s^0 c}*`s?۱٬xTTl$ -=9 7:fLD՘3٠?g8kAמ@H稜T8=W^/a:%~d97zf,6/ tdn=r%$\>CƊagMVArpsX"S;!|M}$oP_:7plJzu )W]7IcD)hX3Z_A909eNTHږ1L.88! Vl7ulΐ뗪):Y;_61$q0Ty)6+t)ˋ;Qjr\C,t B=.>VJY@}aosdXVF[D_wKD u*|NL_~Rw8#Ғݹ)P @? kFd wi}wόg WX(њx*f8_\buʬ,9~v8Gr[W )YQo2XϗJSYk}ĖܹHa^zOܰ~6!V$]n~3vsjAˈ,Yhl 5Sa#`6?On!ïZQ&ٰyH-]X#.?\?ZfKpcO O]:xz+D7r-Bq}A5ζ0[˩=_Xylr) =]x͜N7>`y2mj_"ns >71WW 3-:^! c#j?>endstream endobj 335 0 obj << /Type /Font /Subtype /Type1 /Encoding 826 0 R /FirstChar 12 /LastChar 121 /Widths 827 0 R /BaseFont /TTWFAJ+CMSL10 /FontDescriptor 333 0 R >> endobj 333 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /TTWFAJ+CMSL10 /ItalicAngle -9.46 /StemV 79 /XHeight 431 /FontBBox [-62 -250 1123 750] /Flags 4 /CharSet (/fi/comma/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/H/I/J/L/P/R/S/U/W/a/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/w/x/y) /FontFile 334 0 R >> endobj 827 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 0 500 500 500 500 500 500 500 500 500 500 278 0 0 0 0 0 0 750 708 722 764 681 653 0 750 361 514 0 625 0 0 0 681 0 736 556 0 750 0 1028 0 0 0 0 0 0 0 0 0 500 0 444 556 444 306 500 556 278 0 528 278 833 556 500 556 0 392 394 389 556 0 722 528 528 ] endobj 826 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 44/comma 45/.notdef 48/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 65/A/B/C/D/E/F 71/.notdef 72/H/I/J 75/.notdef 76/L 77/.notdef 80/P 81/.notdef 82/R/S 84/.notdef 85/U 86/.notdef 87/W 88/.notdef 97/a 98/.notdef 99/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 119/w/x/y 122/.notdef] >> endobj 265 0 obj << /Length1 2036 /Length2 15321 /Length3 532 /Length 16434 /Filter /FlateDecode >> stream xeT]Ͷh-N. w's4Ƭk̚5XI^(`JWaf0301:]Ō]<fnn;; 9@@%JO'@lejl7v}ajl Pu0z1mm*\P݁f p3+SW %i{sfn=tvPK!i`o01*8|T~'pU0g YzW+ `tߩͬ-'L`nlWho%>:/FyiyM)[ٻy9g;V]2$~|'UK0vv6=aXٛ=@aF{׏K=;8sC?9bFhIkhlDX?2\f&09; qΦ@Ҹky5G3hW+OOhh ٟЇ'`?]-eb?m`Ve|| /׏[kfP[5:]9N?C9EDŽbc!ΏUK5KJ ?R?">\ЇpQC.!?Q]}TWCGu?Q]}TCյGuMMmc~y0.da?jC% ~ ?`~t ᇓ_!ae?Npt&mENr͏Уց$Fl&9͌t'G(&/Wgd-Bh<8ħtL(';H+t%P4*2'Ka.RZ"\:n/)GcĿ_U DAV%P7Vx=l5cf]npC[3e6^p(ʙ#Wu j6T_tyN'hS~\FHR3Pf E' 93u/ CZyC 鵰M *NSMRqeoDtDR6J#D{%BN ʅ`q'!4^Ta d7z4 .Q\'p~73QJG-/Bd,s׊͒M_gdNńz*@ꙚyG]YxDWzA4 IiޱK8Y(;x<]/ 2F}}Cvk,A$,Οh"eZˉo/!TCm@ A,,3¹cTN0gCyTصn+ǥZytG@vh)%xg)Q{)4S-6nvlX4"ͭѵ1rB. `$ڼm̊cdѻx1/X!X◧!^+R iwPGV1;KtT<v5D҂P phoG&} I)jI)`z_gCYq 4x K-h?QYuÓ&VB*18]t \ERp=%+Hp<S[6ҌW-&7 ]3H$$UoE6T]Lb R'L%)'!7@ żg݀s;Liǩ26j 25N2wf 4r賤I* xI,ܝ װc|ٯ|PW>-Dg-$ZL4TfJx񏦂 0 qf&!mVQt;5q`m]Ą2B7@z(޼w#]/%2C+'~P)Mmtȏ>ʤ7@f-CkvV},QOX.==^S3uqJq +Q9hʢ2TǷqѶli\>EYϼd3mՄTh(R0Hϡ؛o8vޜkȕA*;:c C56cPթUnYf em6vl[+KKۦ-AGcc0(r)blY(MpKҵbFV{ÀF=ihN?ِ^ن#HqZS9Mbj˝Z9^xR WFj}@9[cy}`#CHdT^.@!LJPfe'({IaK|&ם]<׮o9BR;&dψaֹ,4,QlY?Of]Nz*wڍ&ۭAe eنSES}TD\H_;\OGh}) NX|Ë@gL+D d.S89Ox2ːeu_,|PgVܷa 9@‹]>e!wƹkl*eOba]j_<2q)9 3+ʡ`>Sܴ&~ߖ`i=Kb_kLAAgnEq/\)΃@!rPu)TRe<– |`B`^8jc4 H9@Z[w=鲏،`N'|NFK9cc82t+]$RzLAa6 `U~4p;a;^Y 4z0*AEaQ I}ofyLRDcɀڊ (u'"3w:'Yf)~rRlQ;2$u|Pr/ c]:ihǾPEsHϧ\WtV k:&4},b(5ּTY61CZ? iiq߳$]^䤹<_AFs)n9{% kwk#gu7ėr@#(]?ƅ.:imfYht&ğ:VUYu1q| mRtJ+a"O[r5BD,0LjTFFEǛv-DiR)K~Rإ ]-H J $-(iplXd,*1K\йە 1!xm>$ȵ{^@4Y` W ]ՐWf}%cj]H;ò ,=OE4QD+ isW+&~6[ qT3]>%FN7C]ѻyۂ.._?*ܬ͙m7> D_jb6@D(qSh~*\yB o: BWH3v@ExRD[Y> z|q9V8=)ՒpL_Cu_/X'Zvl'uJzbt 襒yd!?G6= *]@ C (rSZy|4=~W)˽UmlXE @}˜1Ȍ7}euԩ%'cq2]Qn$+jqEl =]u}%0 ]{&njګ܏JBc({(>k=6{Q ?7l7߫dMz)~?l~PWX:ߴV^;ߴmpWI<"Z6U_N7 -EMy{Hݳe] 0Ap)ZX.Qǣ_Kޗ&~OL,:jaO[uiv0yA6?@X9?S€ҩ-W9?qf8 yvnu"nh{ai) vn]C燇]UẢW;KN}s6`ApYau~͂UzN N$"R&%+*‰R`1n'@$Iúאw~8Sk칢xk]vP^,Ki0%.sTk>}Yι҇Om5:7p}o~5=u#vLyz,=Y\YAyF!RO259 gOTttoڃ>8u?`>J:LF>;poY+0Ašłf#e2edB.5U+Lh"%*Dr[YNƐFzp]mI9pX#{6⸚j]c5z?#$Ry\q xK&<d/&`=~OuHu#7CWY)7szEL{\/o*0hOYFn&bX A$tոDMdv$9fS8iR| :v ^3Վ)1:IU8|Up;iN,]8Q:Bψ/Nutjx ?z#~lvuI4 ,]Y K3CMw-jn)6۬t!mr-N%e~.@y/)aE%QFM|Ϯfn[y|NrR+yZ/ҷW Ϙ ZJc8K'U$ SQ(Xzb}uq ,0,q , BN#ZJ|.1 r#6bCPW9iߡxVt b*-6[|ɹ2Q )ya.vA@>&T2( O^Bj1ifh4!@k6UĢrX!aoKEI2*MibD Ԅ{*u%BݧOlLؘ~p몛6Mg sJe|`HyO!JHD6E%D ]"d^"H ߀{=Yű;#F͒ܚmZ,Smo.EZV9  7ㇵ]Z wQWB@,ۤx:DlfDy6ܕqR&f]ZY%V|J==H]Z"ao*˦R]ix_cDylRG,[oL{~Ȭȁ~*+*0unK[ڔCu '[%5lz d6Ջ|eEviIs 3eizk l WqՖwN[Eay.)ac;j tJnK FpNYC1hrAW1X)|ͮ9ʝ )OG;.2!k[wzAe)q(r󶸒 JX:oĖBZ)A ?}S)-~fĚe(+%DF8"l 9+k}& UIAMl>OoZ0-\y@NfM!VǢ!K OWJ|JM +>^mJ􀚫PvLhnG8v?8T[Y[דbbDv,Gr; Fl`RL&!@q].03qG,DTW R[Jb Wīa`.[/Z8GDw k@ԍ~1sz6o4KHSdf4L9j"Ra9Vf1q>V:~o%v9cO }l2=fh` DpERDG$]U}6M\S,&e›p bp:>xQ{ :/ c:/.VZ/2gq+wrx20]-]Zdr/͍j_I9pjF#aHAWV]i$3k2mOʁdjⓊm$m;;k ą |'.$A|8c}K#vGnza'-`Ⱦ)o`zwZ +)dTR)t-Q_,_lU^[f30|ЌVOG/L:ɏ 9@צ"F@2F((:x<5FyVer°Uw8+/6lȳOgOUij0CD6ֈMbLnO{'Bt!lNo{~Bow5H@Ad EzMuO- 1%s8-otA5/a$ 5PVkcPM7V9eNfW,oȷ1A$)3OICQZE`spv#O/`Obze\qMakFByiI'HɧZuK_jY;'Pd"W^s&=*z9iXRPR$1X2$V\.}-[?R`51MV%@3N"yK300"i[ʹ{Fs؈ɥTdu/nP+$T,ӰpWrhIuD՟W ehl\-ǣ/[fw;Fw*R|֊}9!5j N%gC#NtQPWI`!Q[^ j@(wѱzuPD:KSa!fBaL͸YCbtjbH&S$t޼Euv~_`*VC;,F~MSЭ %w՟<%7.ķjᜈ*41<ق:@׈GZ&__v]}\rz(1a8ٞQQ^UetDq}o$$͕e#[A4a[ܟje_J:W=*p l]Q[Mf6䟃Иt R Ni"t`.Ҵpi4ѺE#E]tտjfdz2å3 ]Ձ?,HGH11nt?m01nI Kd.3QrY p֕͞Zj~il@ L(gG>P2](npTƒm:`ĸ -CAmscXY_j ) T:nDT΀@#;'6MI^" v.Yv%ùE/fibI]+y?I|¬EhY%lFW4Q]سm<儊%}',n(yg ɋsNNq#^e_;eaB$Jt(Ar(ʇժW4q~,tYo\k/ Ms@%0=.m95[~Xy_ƻ,1`H '=&|o܌[%yN҂u8_e+l$J1 Q=V I " ݨxasv.NIhCGr|#f-J$ȏ WnCxY@*yR@Mo5iWNi^c145Ë%e5RV7\yh@ nɓ(uq#cnH0\|3Zn;֗}68TɝpԢm2|^6~9k&עwg_^J7!.݄{FP`x2SaM=6wfjW͙%‘Qu@=& H>9xFļhD ;}l ^Ozlo[;Y!iJІ#AT;rϤd*zDbC 2yAί,rmGO" "G'=v=fŶyeͮS^y*+|A[8vȤ>1jZFZ;blJ/eig?R jX\ޭPE=vrv`)DEl)__xҎ}?J[7 e?lO@ы@"V,zq7##- &B._𝚽+apl?kTBzu֧sk JC!/]J|zc_=h;`4;B2'mW0Bo삪fn{][7 cGQQ2e$) zIV"N-q6Z~Z=X]۸Lqd\v$)Pr5|j:Hi'znDl#i܏=,WK\guR[]tq=&# L&/)r,x{Ktp`%IĘ_cNJPOCmO[p]r>`jIXDW2aW78~%Ě|]͂\Q6TQ+ϒ3=v"Tt^~2i9LJSg%DkG-)̚O'l+3VE]DŽ-h5䝽yɮF=glF[G6M~O?SA*[ u6^xQ ,Of LOe ݣ@.vW#Q2f4o:Ys8πpt u_hwlx/JXVQQb3Qϲ؝r#HBi81ɤ]b2mT@.O,NW,S!nf ˚!3mвKqu2JcM%j<ѽ)e"#}oFPG'MШzHs8MppYXŜӼMevx򳞎|q6y)xi$6}{J47`DvPֹ9?hX}4{֜"7ָ+nIh r^*QF j 4d ghO#nU"ߝXyչ|w 7heȝj =4H}߯&AbԾSy۝k.k[lcck-tczhfT}#%3M~)ƕo$qa.Ux>tqxK(_,GfƓ ÊÝLK4L0z`OBߍܜ"꧁uԡ]ɇ{jvY\ j>AyL_RK; )ڥ\]V>@Q .!s]5{jEQtJTE&ܝklcN\DhAyޢ1y`Jyд8~>(y.ur"D4SJwa,fIoڢ7qr$۰3 /Jc_0pC_Q̥#C4j4늄| eٮ <]gqǨmcs;WgNwnxpρ;Y )γ`d7~hXBmQN`< 6" Ak&߶Xc^x;704,L,žvF >': %qŜ+ܣ@(e6tZ>:_2#3X=le&DlFlNmSEEpfM2xGm'9#ę,2䋷08V67ySI&fk4omL`id#%)+f©le42QQ[3B}.[LR4~~G qw=)7 =m=mG7ĝ}yb-t46 *Dj0He4EÇ4Deo~uN 4%|u|@ d:-{z\m7USַuխoJH %@:ر\\8@WM1`*nVNOS1Sw'W-c" L~&ᛝ>&}}Bzw@{EN|L s% ('mZFP˜CQ QḁJQK5.n)$ۘhLZm @:agseZE3IVf|"G1T_3}+xŽV֭B=x"I.PWW-bFw(reo6V~4U}ks dVACcR4M>L#EĉO8'8V]Ԗ~d<9_djG ²T`T$(3*bG/`1[*Ij j[w;A[t1' @:jiDF xD3,vL`g[^dk-s>LOT+=oNnUM9]֮~5 !%2t8GFvSdw|GMVYs<@'U/ j| }( D-;>,۪<:`iJ OEXm1 blo҇\ /.V͘o1U^OБ~9>8uNuZQR~|bTGy"r̩~ӿvݒd׆( ZvªyRo1) 7gNMksO8QMfw>yݵ@BG(WEY'uIWNGy޴c[+ypIű N0XKXn?3xVO2mеj~@Mn>탣n8^b#MVQpIO,-"Vs%BDV*Ս َ6"l) "[h<32&01sHan>oǯdy _ [XtYX{7'hyq:bvfȄHC4˾jZ; :UvǙ 8GOMhr`]K%00\^1:fjIypI D@x Xt-Vu,Ռ?wtUTf5V3AzR\ xaۘ0][ LKeKCiFdD<,Rcp{YR ]6ٵD!﮿cІ*Ʈhq w# G7Vӣ9;eVDg=Ngoq=sAM?QC.X}ǚ Qo3rub^+#$XMXX5$>HD^//3က8xHAX غT(s:]/$ܨHI} 1#jl?W;KRWM\V04 .K.IJ:\ufX2FVZ9"_o.#Gw"\|ri)YX#õj, v]1-l9-v}t־NM3dP8hB eYRGdqcBW%[uS2I`2v*`&do&/v1+ Qnulӷihh_M&[ҷПZWeب+Bٟ_l8Vp(v&]'|KcC-:Pᩤ_pJ}D0ymNbPqL Dž-*g*Pv=M teo1U00O @Z([TʟH=|]<U Aߦ$?2p%W]|4]zkcԐU/XND0KdGFQ{-9 9@²uCFQOZ1 %Yھ^^Ky׽`)]bjG@)w\å4Z E>-ˢk6PMdtwFhjZ*'!B,jc˞oSҧT>oL 뺪k 6#,)>|͸K]c&p1D9[荽^[_K @qm(VZ~ kB1+>H?Oh:׭efm>/cK!gǧ KK{>'~00LvK3E"WJib,ѣXJ_grMI3 r#ejKɇHP~' eѸF|כz r)N͍0LYS6 d2gJ,-1?'@cgW;cgɄvendstream endobj 266 0 obj << /Type /Font /Subtype /Type1 /Encoding 828 0 R /FirstChar 11 /LastChar 122 /Widths 829 0 R /BaseFont /ZMIJMW+CMR10 /FontDescriptor 264 0 R >> endobj 264 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ZMIJMW+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/acute/quotedblright/dollar/percent/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/bracketleft/quotedblleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 265 0 R >> endobj 829 0 obj [583 556 556 833 0 0 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 500 833 0 278 389 389 0 778 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 0 0 0 0 472 0 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 0 736 556 722 750 750 1028 750 750 0 278 500 278 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ] endobj 828 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 19/acute 20/.notdef 34/quotedblright 35/.notdef 36/dollar/percent 38/.notdef 39/quoteright/parenleft/parenright 42/.notdef 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 63/question 64/.notdef 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P 81/.notdef 82/R/S/T/U/V/W/X/Y 90/.notdef 91/bracketleft/quotedblleft/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 259 0 obj << /Length1 1693 /Length2 9588 /Length3 532 /Length 10547 /Filter /FlateDecode >> stream xU\\۲q,wi܂kBMиw `Aw AN^x/Q_5', waR*ZZ@NN lb6q @ 6'-ɇA8x:YYXrH؁@&K,Y]<Ϳf84`'7;0LViR7e6su& I4zX.0L Q\Vݧabge>;W@bvO7ɓD .&V { [0_&+gY+ `nb 7O -CMU^?k?O 됓@sfdA3+{ئ89xbvx@i``MC0ZR /ۿ k߽`a?y ɓ 1{28mM-,/ü0.O㼰.N?< d:+?<`ڜaya v?Y`Z^T{?U-i,BH>lJ?DV"X% O+C`O`!X'e|"X'e~"X}:O`CcjM zy01f l9_kY0y L{?avl9@*Sd8?&pa2@ ' LII7?;"z;._ln`0cnN~Afr&O) 5E}Y`ҩ~D ?ڪ/P̜w*:ߋMȔz 70Bĵˈܙtg9\q\ %=|T23}g?:ٌf+ 0Yϕ9Hd iҸ"v`T Tʫ;te *&N;Ʈ믙%YqċiصSB;*dG } 2+ïJBx#cC{J\.M)l atn%/|3 3js&8OВiZ  Cd[Uz|{nF+="[k\a MT'" zs][\̩z74Rc680c v1IƊoo(7 %̎}%;UzB$ho i5%ҩf=Ax^.Mǹ*l5x"Xx?~Qm{;ØՓ$v8\.i V^KceW0o7]UjӍ18{3mB$(!_=g/!Wo UijoWRw5%ᑄlpP rUZm텚/2qm4yr(cnmaN}gd=}^SN-cxŎD{O j9|E_P΀_? Q9I<>i#`vEK&bk/ݝ5Wnt:\6!lb`/Nbe0LD/ %^`J<9X*Ql QηNTڝ Wt%~Rz^ϵLU8g9mu\ĹΞU̞|ϕm\p集A^!Tkozrr~[7n!yQvIi(IB %j)wq%]8N3Eø2rLIfKcӌ(a!A\DJkAEeSyLs;V%nςA隣=Z?ԟnl{墻x~yPpӦoCmI/_{nGC5i[ U \|108_5dqvS 9RdH8ezNVܒ=0*6le&Ks+iZɫR7}9+ڸV58@cGESuzCA9>D`. ox?a!])UDd~̔~cj>Z80ù́1]_+bpX0fC|,Bqnw\X%ԣl4{3s}>HJ6wd%5i}) R(JtB.Q9^}"|ܮ-0)4khβqݥBL FCΠNΝ"e~\vd?JJmˡR/9ZM^Ypjug$3 9K_ӆu~K V$&9yALx,UBQ885Ѧ0r : yb{;N+8n@0r ^BXrof_Ze~\q|(pDr:U! /| Ɲ]OYGֵ!\m( 1^2'XPi AwkIć`lV -:Ո&駇߬׫T% o.u5a}Qih]ʖV"HDix nGv"zQ&1UDŽO L[s9*K[Nؘƾ~序:LmV໕EKH |'"-ۭS.lFi^(i XvK+k[hA2 Ћ얍1e^kBYކ])bވ9s>X;e Sua;=_%d;RsO{wݢqڥ@c^Vf&y.ݦ-MѢ@ ZGOj"@ݖ@̞/mug=O2/QB7܄jU;r !cs:T M4Q;w:>+*?6}^҅0$UNg3?fozŗͫAB rTo 4Lջi 'u>BUWy =yfP sYnxEUjn}_#~c 9Yj9誘;+K>|~x憏z澵'pE`ҫ Y- B!X?7d)dcS((Y;s/5]^ZA5^7Sa:6zixC+>w׌nS6m}8˭qdt0 R\Ys/;wp7ƶG;A"?e71 xV~G{ r &9.DPg-T%z> I,^XX#$mDX?iAX}sJ< umH?lF1r9Q1<{I33Mk :{(=L2|4;0MՋTVML\xlIu媏V-8| Ӫ #;p3堆( .S A@]2ʾᙔD 0V*Y#ՇP OEHleJ}gU쫩xH2Qk~Zq?S{f AdS}Hyu 9b]:Cԗ*س@5'i霟m,m en~Rf>bW[θYWi9m:\W=r߲ ͙N!s鬮uGH^ *l]%0tjpS3)cOYLWSQ4Q #f[V1]iIYF ?wbƻn;jv8{#t#=`Rx܅TfTٌ O?9ӛwrtVʍHa`#A钅8r}hHox2?QW#v1=wM A95)#-c6s_9wh=vȟzRx/@1Hz7hy.4@':[+/%P:d(_kۓt.'M1ZeLA,So#oI[o4v?Z&H\KWYm#[M:іkZxwS[?[%GVQf:?!O$\ OB !!pV?׏qp*|Uu .0+50 ~/y#_aF_g2 .)/-{摾, |eّIa@n'nQIu>l++@,I -ɠf>hmg[V7C9P?yg-id|7t>UΡkxIi_f|hlxdM~K?Nw _VVp7\Md H@K[(cX4E_G6е}TW'@cؾĕU"=nHb \xN\Coum˜ԧ۹Osj-Ls [C8"]'ƢG4("H)rƉ?o}A*8S(jj^g 5(ؽg!2,ɍߌhW E܃|Dz$:nr6g*z9c0 -I[9lc|Y\p]-6]d`V̜iK`W RXDǨFi]P,D>.WlhnL’Jak.p{YV/G,\j ϮHj)7/b HO[ p!#잤j!oޘ&4,DYV }+_7y&ܺ$\j >4< Z8g8ZR q96Whl%jmҡ e FT}WȊlAfK[JJ'|/Cc !8B#OSBIPq(=lc<}=CjҪUZ_I.ozti>N>s=8Փ?tuAk|s̘@2?gq-#;:淧(/SH(y)~1mcYkؔ&Y>ëYk"1cK%ޗ+m;XnYhbNn['̳>hU^b|Rym UJgIz7fe-#\+_*uG U50-Y 1Qu'XS*76A0SMnry䮱NjJJ vci@8q2HCڇo{j:Ҍ@#!>xF:*\d)N׆78[b%ne&I7UeߛXʉn1{oB _eqj^W&Ep|nmNf}.!0ЏünrJGPТh+q8iZz;_A^gW^G "+/+}^3"um*Ld8Ŏψ9VxhN'&Ķ~2NeLmtGS35>t;'\г72Q@XNrIpߢV|PJ<>r2 춽 ղ^YϳkY2?#|y;6!cs}kKX )?.I sK{toj1 H?;s< IyE\V'2 vJ֙tB^aғy3#/ƌ?1?.Ex"YB#-gy˟ܮYT/G捀3ޝE@&Z&Zݪݕ{ þ2b|L)A1^MH Q!}E^'ⱘ?[}CѮbL _RR )W# /fX1WcCP+ߨ'ag;V^'̱mCřzf*yC?!yy{/H=8V;fFкIF'Emմp)glZ)q 4P0ZM#F9əkUJXha3 LFr:*֓{k6/?9W7l2 Ka68R6> hC:1h_2IKΠ8OB )̻v˯xƙL _WV-p:ownR]H$V!~Ie4sGߋHuuhQ$YVܶd*J5\!ey+8dd碚N뜗W ԊOJIozTr#ѾVX?6K ^hZ06!0oAϞ7"GUGiz=jJvۙE$YMbRu*:Mp\8p!211jo4U:uOZ/byWV40: *@9~J(*omuq+!+R[m%lRdQ I4 j!LOf80p(%z_SjU&Eӎu&hA(܂]퇒L>N; 0N42ãj4Z3]ΝZqvO-*R~g7K3K=-@̄f48oю{14Nc9ѷVh% [D|Q~apdPOPsj }.{ucL*l[ȓ}xxGhީZ)_ v Tޕ'g)z1ڲYd BGze' h`xr!;RѦcP#s>>lH$A, )%|UžPHR3TVzxtvzK=Wteș3A+y(q -bz yix1Zj"("HÛu|$3f&Dsq5R < +z钾6߾BB0TFsc;WQ,709j#"Qd!_sAI5]BڢĄ6&K4$(S1GTG_hgq塄ssnzG|mxOu1(//ZO~NqUQ_3e u9?~UZow/c1?g˓_DVm?\(%5tC&6)t^by1 ЋȟU2G:ND$6Ik5& ^5|(],`crZEfzx1J{1K{/ ̃}:'ѻ JrՌ2Vxb>UʝU1K5xeB9Jю>h*&q;]2G=fWy+_cF93+J`!s6te]",Ճ,גij#;pM_L,ZhA}Vw>k^6;◤\<{põSuqY!b~8 ~^6IIe.};8fJGw$ɤtsTzD_~}!3UP/AՉ|=5pWOgb2ZI ׌ZM*[*{RH o}b%鈼zo!h ȉ>t2rԄZ׵#f"rlolc1.WTs:#vZ_%.S9}5m54݊H}.jߕ^ #N\>$rӈ(2瓛`[8U bz=L^n*L +Luڅ|;٤v{ombH:&u䣟VɣJi@nt,IV*GpwbC Ai3咐1\L}o09cB)J ¾x-hkԱ;Q HK}e$bsΞޡwrИMqPH:\&\OL>RB XI(uY3p̾ϯ7bG=yz2,~О T)C|qXD S"aBP= ީ^  lMi2Vn X[:<z̿QZOBy_R'kRE•+UUxPݣw+GP[ WS߷VC+.VRI~pꝜtԬ *nJ2YeBsElc܉sߺ< .x&u\KPSy  2?m8Sl&6Mm> *mbz3m #M|\O0Zk3AdO%oD4S,1:B Z;p=$#T(URgo2Je{ǖQ6v'ҿc)tl|_dٛL $S<~c0}p[(LCZb+Ƀq5dsC> endobj 258 0 obj << /Ascent 694 /CapHeight 694 /Descent -194 /FontName /ONHXYS+CMSSBX10 /ItalicAngle 0 /StemV 136 /XHeight 458 /FontBBox [-71 -250 1099 780] /Flags 4 /CharSet (/fi/fl/quoteright/parenleft/parenright/comma/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/A/B/C/D/E/F/H/I/J/L/M/O/P/R/S/T/U/W/Y/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y) /FontFile 259 0 R >> endobj 831 0 obj [586 586 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 306 428 428 0 0 306 0 306 550 550 550 550 550 550 550 550 550 550 550 306 0 0 0 0 0 0 733 733 703 794 642 611 0 794 331 519 0 581 978 0 794 703 0 703 611 733 764 0 1039 0 733 0 0 0 0 0 0 0 525 561 489 561 511 336 550 561 256 286 531 256 867 561 550 561 0 372 422 404 561 500 744 500 500 ] endobj 830 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi/fl 14/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma 45/.notdef 46/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 65/A/B/C/D/E/F 71/.notdef 72/H/I/J 75/.notdef 76/L/M 78/.notdef 79/O/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y 122/.notdef] >> endobj 255 0 obj << /Length1 775 /Length2 709 /Length3 532 /Length 1265 /Filter /FlateDecode >> stream xSU uLOJu+53Rp 44P03RUu.JM,sI,IR04Tp,MW04U002225RUp/,L(Qp)2WpM-LNSM,HZRQZZTeh\ǥrg^Z9D8&UZT tБ @'T*qJB7ܭ4'/1d<80s3s**s JKR|SRЕB盚Y.Y옗khg`l ,vˬHM ,IPHK)N楠;|`xFiC,WRY`P "P*ʬP6300*B+2׼̼t#S3ĢJ.` L 2RR+R+./jQMBZ~(Z 3sRAVH*'<"C'j]#K]K3f 榵( KRJN0~Z&0lSS+Rn^Onɚme X9X&u3SjM*,y־% mHx֮"&4׻,^5+Åa3>_xV/'x楼pZkBZAo`(&^yeO;M~wgx[4;/ߞpŦ]%R쏮x#ۡԮH𲊯]uO_xݻk?'~Yw/n9H}̉NhMI7g̴YOB77l]jiݏesOuySU|PZ=m3"/}nQCa+7;e[۴}ş59s a!,kU|g=!~X x{S^9moޕ2_h{˦UBN?v9w\ZJT|?Ϩ߿4Y];Fwɟh+& j'CuڣYѭO50|Jxg{vɝ|aao巰,тwV6m*ٝm",ɇvl{llk%fvrT%8z(4,N-QR4$?7( 0endstream endobj 256 0 obj << /Type /Font /Subtype /Type1 /Encoding 832 0 R /FirstChar 13 /LastChar 15 /Widths 833 0 R /BaseFont /RTKFMZ+CMSY10 /FontDescriptor 254 0 R >> endobj 254 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /RTKFMZ+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/circlecopyrt/bullet) /FontFile 255 0 R >> endobj 833 0 obj [1000 0 500 ] endobj 832 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef] >> endobj 252 0 obj << /Length1 1222 /Length2 4387 /Length3 532 /Length 5157 /Filter /FlateDecode >> stream xW\벆H/ - 7)ҥB@ PP"E]AzP@ HޛJ&HvZ{gs$7yf;}IyM1p '(5 !` D ¡8P(I)JI)JIw?,ּHc0(hŹQ  4pP|hc舀pgHvrw$ L^,:bH?# 2z N7LS\ 4~CQ߿*0(w/ 48±Z6gwDxA: !_9 CUErͫ[7AH m{:(0A@) $t = A BeH؆HPe?0$FF~ azm?渚,(.I8DBd[ qNWؕ5aڹd"εCcy]"?R._"[9lkګyqW)~|!kt5û2ƃ 6ӷޭek]_%jnI} +gV^5O('đ)DaRfşga5~X VR~ Yrh7/}"5OЦ%l=imwUJ^^!kQ2KkԍEOZSl1Je XwP@<ΔbCZi6{frK/'C*Lj)u:ÌC|{U7FͬļQ%0&ZeSù2QLQ9 AobמPlYe/lb5}pvUZ#@ɐFS^8aE*Bʆ@Ҹy!kHD~4{C5t^NW*٣=1E c;T;o9viaevRǸX̛x%9Γ'?j?~2_vէ1 w_k,`/.TdIyOW;R>U@> D7~1Hx˟_(LJjZԾc=KxT=h=5dr]HfZn9S&Xl$/d_ =p_UE@ÕA ݰ}nNI ~~uZn=ѡlaaEyۻi`-6v5&EYo5KF#]ŴWDEp7C:|p UOI-M?llK씸xIvlEGh4j҇>4s7 jDm'2Mg/pw- [* ;%IGZܮI\o:ɨzųpdl8Y\J*Kc(ͪA#~Db\=1A{4X Od{zڢvߗT=-v:-%>E IzfZ^3k?˱}{wL[qcvω'/y8&o|yn-Ckg4̖tB7=P3GGCcFc hLU'43^%!Zǟ.0_xnXLСPGQ>P'RWUmj n !&68kBIuU)\46Fdf&#k.p M*2'oJNӣ} _m񣙙/3ǿhon[=jz5`-9jmFvJ+ 0עRi>DTӹVewwLywgV33#^Tz \z}qp~rp"3;Z& Wٶ}oP~ALu/S/#H+M?wWh0lzZ~X2{>:2t}Wac\0XVת*^E/r[8@Eli)Uss~ !Psvs@ CnҟPb */2qtoh2(nЖU1&M&o S$ih*]KR.3":SEYݠՂS\*_uoag@ѺsCKvܝt͹iR/K%P;ܺ`gEns0ݡ(6DA dDi+c,02kYwL $9p76;aUPӫ2kwDm6v1R_7{>S:@>[.BJp!TII+r08Ayhͅl2$"Rh`M'DPW5Ŗ'ǓZi Q yAm[uEge˪vʜ[r~t qGA[0׶éYyZZNZ}vf4*C&z1\1b5!1pE4nߕf^@¶`L8t۾տOUͿۛ꥝P)k̙2bIMb{t*ӎޫ[ }9kUB6҃;7$OQ zU^5O8{~J3zc`--NX|)ئׂp3gaPb (0֊l•!qc-R@V"Fd.Y̲1VvjP'iy. L8eoH")ALQv+u;MDKQsWXcPH\gT󀈠 *T=j[sKM/;KKPZL?Yb'a#O `ylU{32J.yW]FJ $ΑEX vJwb}7I<|yk2gc?2&헔v,~oCVZ@+0 s򦸨ĭwLT\Xv˵ō7pN@&;Ft;'tO qγW26K5XHmlNёcيvE&f ɮg26 % rN%1E0kFX6{h3d~ ӝqE0Gi5dHAdj͇p`'f]~y Ԟ1ìQF(^,m jS^[bMJ@9h=`ǡ`(QmQÈ}a&3sC-Ч;~DKإlug]"r+eOp(AAnхdendstream endobj 253 0 obj << /Type /Font /Subtype /Type1 /Encoding 834 0 R /FirstChar 44 /LastChar 123 /Widths 835 0 R /BaseFont /ELCMYZ+CMSS10 /FontDescriptor 251 0 R >> endobj 251 0 obj << /Ascent 694 /CapHeight 694 /Descent -194 /FontName /ELCMYZ+CMSS10 /ItalicAngle 0 /StemV 78 /XHeight 444 /FontBBox [-61 -250 999 759] /Flags 4 /CharSet (/comma/period/zero/one/two/three/four/eight/nine/C/G/J/K/V/a/b/c/e/g/h/i/l/n/o/p/r/s/t/u/w/y/endash) /FontFile 252 0 R >> endobj 835 0 obj [278 0 278 0 500 500 500 500 500 0 0 0 500 500 0 0 0 0 0 0 0 0 0 639 0 0 0 667 0 0 472 694 0 0 0 0 0 0 0 0 0 0 667 0 0 0 0 0 0 0 0 0 0 481 517 444 0 444 0 500 517 239 0 0 239 0 517 500 517 0 342 383 361 517 0 683 0 461 0 500 ] endobj 834 0 obj << /Type /Encoding /Differences [ 0 /.notdef 44/comma 45/.notdef 46/period 47/.notdef 48/zero/one/two/three/four 53/.notdef 56/eight/nine 58/.notdef 67/C 68/.notdef 71/G 72/.notdef 74/J/K 76/.notdef 86/V 87/.notdef 97/a/b/c 100/.notdef 101/e 102/.notdef 103/g/h/i 106/.notdef 108/l 109/.notdef 110/n/o/p 113/.notdef 114/r/s/t/u 118/.notdef 119/w 120/.notdef 121/y 122/.notdef 123/endash 124/.notdef] >> endobj 249 0 obj << /Length1 987 /Length2 2678 /Length3 532 /Length 3329 /Filter /FlateDecode >> stream xy<{Zd+$wDmf1Fٲ;m 0f0YNHeMGpVhAD={IY?^s_;~FOM \ allj\+'gDt"b\K 0 յ(^9ˤ ^t@I( ҈8,`^ Ò*ҙXX -ī H~vxRԟa<2(L,PK*, K,J%I̿2d_*QO4DU4K" ( MA <$K7* P3Ju9,Be#9 ÿ2>4b SDwPpT< ѰL^l "`1TBTj BWP@Cjz ~%-,PdYߠ&%}E8dIQAdI,Ⱥ2Рo%`l;5~Pz#J`ET%~Z0ӯ2"f"P0ھ0JzOmbsl{|!ŃHP ӳ+T~˜'e7b=qP_.?]1;xdrr>i+9SP= м]jmsktZ)Ʊvw+G.EH<ߢ>mӎN衷"~?b^AiHQ{.?q>wüok^|bzU\À+ףmJz sSB\IDIspT,{^4%b>^>;vQ`GN&8/3BZ k$vM s7( DH/ǁ'xJy >j m cS Wp,hڌGPWzrNu%f{vtbgg8X *5OJr5ENM"u"=^}tlyb\0*4]r_EOks gͩJ\/%,3rb8t)0U`-dM]8K\ 6/͕=M3S:)8*se-t`L<8"nfpjWӑ82@徃B阣-[t2W%|JJQև̅x?wѩx%{չȄ"[)+&f"Ӌ9qv' 6ԑtl"ő7?ϲHF:"*!k۬-BM8tm)A?f.Vßp#-yI6{xoL|qpk$.n;-OII<s:5,Q[sG˔ܟ4l]0q,rM'/ S-}q"W:|ˇ  -fGqN8Iۗ?|p>pw5x7jP<*M z,o]+r.>Z7/YY&=+?ΒW16a\AKxij+%otLbyOd<[7~bA]Mb&)3tHS֥-{g i埨>4 /nbd܇Zcvy-99I9I풋wR P:̫n=&]gjUJ'?=ʫmB.Gg崟hx sASf99>'G 7h[բ#{nG6Loo2]O-.ީ5g.v6R~-}RYuՊA5A ' Ӥ5Sʟʝ '9&A9p\!8MPO|4OE,1/)e29{).lxxŲ~&o>QY۬׵kKrW.;0U8F3b{ ZBIR~JZڇ]'TJᣅbmn< ihʖX0M2ɗ^є[(OOek]$Bq?׌ US13ֲϵF-ֺc Nb-\ =JZD)a0_&)̝pC`4ʗwԏ{уm9dн׮Y&vݗi#@Hr5t bIJ7gP's`Gєk]}m2Z7Jc ={=[ b~>3 w/=yofn^C <u~w^ V{$pײh#߅#G +Y7B:~ԑctd8ڨJSPXik3 2׾j(͹uva?Vq)CW-p$VzC9[FqJ⭾OLť)rB\[^VS#BV`fѻO񈰯 S EղȰ7 f{Ҳz& (-\27)eA!zQjCzz_'ƸzE4<~*?CRWOPy&7fšAoೇ˒J.٤xZ,x+ ")Qġ@Z jX\x'-,v꠴;uC`90b~錹\tأک)zMwpÔ;ʲUڰ'p$KSXendstream endobj 250 0 obj << /Type /Font /Subtype /Type1 /Encoding 836 0 R /FirstChar 65 /LastChar 121 /Widths 837 0 R /BaseFont /WLKDXY+CMSS12 /FontDescriptor 248 0 R >> endobj 248 0 obj << /Ascent 694 /CapHeight 694 /Descent -194 /FontName /WLKDXY+CMSS12 /ItalicAngle 0 /StemV 76 /XHeight 444 /FontBBox [-62 -251 978 758] /Flags 4 /CharSet (/A/F/G/L/T/a/c/e/h/i/l/n/o/r/s/t/x/y) /FontFile 249 0 R >> endobj 837 0 obj [647 0 0 0 0 556 653 0 0 0 0 529 0 0 0 0 0 0 0 668 0 0 0 0 0 0 0 0 0 0 0 0 469 0 435 0 435 0 0 502 230 0 0 230 0 502 490 0 0 333 375 354 0 0 0 448 448 ] endobj 836 0 obj << /Type /Encoding /Differences [ 0 /.notdef 65/A 66/.notdef 70/F/G 72/.notdef 76/L 77/.notdef 84/T 85/.notdef 97/a 98/.notdef 99/c 100/.notdef 101/e 102/.notdef 104/h/i 106/.notdef 108/l 109/.notdef 110/n/o 112/.notdef 114/r/s/t 117/.notdef 120/x/y 122/.notdef] >> endobj 291 0 obj << /Type /Pages /Count 6 /Parent 838 0 R /Kids [242 0 R 293 0 R 330 0 R 425 0 R 438 0 R 446 0 R] >> endobj 463 0 obj << /Type /Pages /Count 6 /Parent 838 0 R /Kids [456 0 R 467 0 R 471 0 R 484 0 R 500 0 R 511 0 R] >> endobj 532 0 obj << /Type /Pages /Count 6 /Parent 838 0 R /Kids [522 0 R 534 0 R 538 0 R 544 0 R 557 0 R 563 0 R] >> endobj 583 0 obj << /Type /Pages /Count 6 /Parent 838 0 R /Kids [571 0 R 588 0 R 595 0 R 600 0 R 608 0 R 616 0 R] >> endobj 627 0 obj << /Type /Pages /Count 6 /Parent 838 0 R /Kids [624 0 R 629 0 R 644 0 R 648 0 R 656 0 R 660 0 R] >> endobj 670 0 obj << /Type /Pages /Count 6 /Parent 838 0 R /Kids [667 0 R 672 0 R 677 0 R 683 0 R 687 0 R 695 0 R] >> endobj 704 0 obj << /Type /Pages /Count 6 /Parent 839 0 R /Kids [699 0 R 706 0 R 711 0 R 718 0 R 723 0 R 728 0 R] >> endobj 737 0 obj << /Type /Pages /Count 5 /Parent 839 0 R /Kids [732 0 R 740 0 R 744 0 R 748 0 R 759 0 R] >> endobj 838 0 obj << /Type /Pages /Count 36 /Parent 840 0 R /Kids [291 0 R 463 0 R 532 0 R 583 0 R 627 0 R 670 0 R] >> endobj 839 0 obj << /Type /Pages /Count 11 /Parent 840 0 R /Kids [704 0 R 737 0 R] >> endobj 840 0 obj << /Type /Pages /Count 47 /Kids [838 0 R 839 0 R] >> endobj 841 0 obj << /Type /Outlines /First 7 0 R /Last 239 0 R /Count 10 >> endobj 239 0 obj << /Title 240 0 R /A 237 0 R /Parent 841 0 R /Prev 227 0 R >> endobj 235 0 obj << /Title 236 0 R /A 233 0 R /Parent 227 0 R /Prev 231 0 R >> endobj 231 0 obj << /Title 232 0 R /A 229 0 R /Parent 227 0 R /Next 235 0 R >> endobj 227 0 obj << /Title 228 0 R /A 225 0 R /Parent 841 0 R /Prev 199 0 R /Next 239 0 R /First 231 0 R /Last 235 0 R /Count -2 >> endobj 223 0 obj << /Title 224 0 R /A 221 0 R /Parent 199 0 R /Prev 203 0 R >> endobj 219 0 obj << /Title 220 0 R /A 217 0 R /Parent 203 0 R /Prev 215 0 R >> endobj 215 0 obj << /Title 216 0 R /A 213 0 R /Parent 203 0 R /Prev 211 0 R /Next 219 0 R >> endobj 211 0 obj << /Title 212 0 R /A 209 0 R /Parent 203 0 R /Prev 207 0 R /Next 215 0 R >> endobj 207 0 obj << /Title 208 0 R /A 205 0 R /Parent 203 0 R /Next 211 0 R >> endobj 203 0 obj << /Title 204 0 R /A 201 0 R /Parent 199 0 R /Next 223 0 R /First 207 0 R /Last 219 0 R /Count -4 >> endobj 199 0 obj << /Title 200 0 R /A 197 0 R /Parent 841 0 R /Prev 175 0 R /Next 227 0 R /First 203 0 R /Last 223 0 R /Count -2 >> endobj 195 0 obj << /Title 196 0 R /A 193 0 R /Parent 183 0 R /Prev 191 0 R >> endobj 191 0 obj << /Title 192 0 R /A 189 0 R /Parent 183 0 R /Prev 187 0 R /Next 195 0 R >> endobj 187 0 obj << /Title 188 0 R /A 185 0 R /Parent 183 0 R /Next 191 0 R >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R /Parent 175 0 R /Prev 179 0 R /First 187 0 R /Last 195 0 R /Count -3 >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R /Parent 175 0 R /Next 183 0 R >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R /Parent 841 0 R /Prev 163 0 R /Next 199 0 R /First 179 0 R /Last 183 0 R /Count -2 >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R /Parent 163 0 R /Prev 167 0 R >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R /Parent 163 0 R /Next 171 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R /Parent 841 0 R /Prev 147 0 R /Next 175 0 R /First 167 0 R /Last 171 0 R /Count -2 >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R /Parent 147 0 R /Prev 155 0 R >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R /Parent 147 0 R /Prev 151 0 R /Next 159 0 R >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R /Parent 147 0 R /Next 155 0 R >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R /Parent 841 0 R /Prev 63 0 R /Next 163 0 R /First 151 0 R /Last 159 0 R /Count -3 >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R /Parent 123 0 R /Prev 139 0 R >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R /Parent 123 0 R /Prev 135 0 R /Next 143 0 R >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R /Parent 123 0 R /Prev 131 0 R /Next 139 0 R >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R /Parent 123 0 R /Prev 127 0 R /Next 135 0 R >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R /Parent 123 0 R /Next 131 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R /Parent 63 0 R /Prev 71 0 R /First 127 0 R /Last 143 0 R /Count -5 >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R /Parent 71 0 R /Prev 115 0 R >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R /Parent 71 0 R /Prev 111 0 R /Next 119 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R /Parent 71 0 R /Prev 107 0 R /Next 115 0 R >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R /Parent 71 0 R /Prev 103 0 R /Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R /Parent 71 0 R /Prev 99 0 R /Next 107 0 R >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 71 0 R /Prev 95 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R /Parent 71 0 R /Prev 91 0 R /Next 99 0 R >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 71 0 R /Prev 87 0 R /Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 71 0 R /Prev 83 0 R /Next 91 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 71 0 R /Prev 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 71 0 R /Prev 75 0 R /Next 83 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 71 0 R /Next 79 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 63 0 R /Prev 67 0 R /Next 123 0 R /First 75 0 R /Last 119 0 R /Count -12 >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 63 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 841 0 R /Prev 43 0 R /Next 147 0 R /First 67 0 R /Last 123 0 R /Count -3 >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 43 0 R /Prev 55 0 R >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 43 0 R /Prev 51 0 R /Next 59 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 43 0 R /Prev 47 0 R /Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 841 0 R /Prev 19 0 R /Next 63 0 R /First 47 0 R /Last 59 0 R /Count -4 >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 19 0 R /Prev 23 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 23 0 R /Prev 31 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 23 0 R /Prev 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 19 0 R /Next 39 0 R /First 27 0 R /Last 35 0 R /Count -3 >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 841 0 R /Prev 7 0 R /Next 43 0 R /First 23 0 R /Last 39 0 R /Count -2 >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 7 0 R /Prev 11 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 841 0 R /Next 19 0 R /First 11 0 R /Last 15 0 R /Count -2 >> endobj 842 0 obj << /Names [(Doc-Start) 247 0 R (Hfootnote.1) 411 0 R (Hfootnote.2) 435 0 R (Hfootnote.3) 754 0 R (Hfootnote.4) 756 0 R (Item.1) 428 0 R (Item.2) 433 0 R (Item.3) 434 0 R (Item.4) 702 0 R (Item.5) 703 0 R (cite.Aho) 420 0 R (cite.Appel) 421 0 R (cite.BYaccJ) 738 0 R (cite.CUP) 464 0 R (cite.JLex) 418 0 R (cite.LangSpec) 465 0 R (cite.MachineSpec) 584 0 R (cite.Maurer) 422 0 R (cite.ParseTable) 585 0 R (cite.SparseTable) 586 0 R (cite.fast) 763 0 R (cite.flex) 419 0 R (cite.unicode_rep) 622 0 R (page.1) 246 0 R (page.10) 486 0 R (page.11) 502 0 R (page.12) 513 0 R (page.13) 524 0 R (page.14) 536 0 R (page.15) 540 0 R (page.16) 546 0 R (page.17) 559 0 R (page.18) 565 0 R (page.19) 573 0 R (page.2) 295 0 R (page.20) 590 0 R (page.21) 597 0 R (page.22) 602 0 R (page.23) 610 0 R (page.24) 618 0 R (page.25) 626 0 R (page.26) 631 0 R (page.27) 646 0 R (page.28) 650 0 R (page.29) 658 0 R (page.3) 332 0 R (page.30) 662 0 R (page.31) 669 0 R (page.32) 674 0 R (page.33) 679 0 R (page.34) 685 0 R (page.35) 689 0 R (page.36) 697 0 R (page.37) 701 0 R (page.38) 708 0 R (page.39) 713 0 R (page.4) 427 0 R (page.40) 720 0 R (page.41) 725 0 R (page.42) 730 0 R (page.43) 734 0 R (page.44) 742 0 R (page.45) 746 0 R (page.46) 750 0 R (page.47) 761 0 R (page.5) 440 0 R (page.6) 448 0 R (page.7) 458 0 R (page.8) 469 0 R (page.9) 473 0 R (section*.1) 261 0 R (section*.2) 423 0 R (section.1) 6 0 R (section.10) 238 0 R (section.2) 18 0 R (section.3) 42 0 R (section.4) 62 0 R (section.5) 146 0 R (section.6) 162 0 R (section.7) 174 0 R (section.8) 198 0 R (section.9) 226 0 R (subsection.1.1) 10 0 R (subsection.1.2) 14 0 R (subsection.2.1) 22 0 R (subsection.2.2) 38 0 R (subsection.3.1) 46 0 R (subsection.3.2) 50 0 R (subsection.3.3) 54 0 R (subsection.3.4) 58 0 R (subsection.4.1) 66 0 R (subsection.4.2) 70 0 R (subsection.4.3) 122 0 R (subsection.5.1) 150 0 R (subsection.5.2) 154 0 R (subsection.5.3) 158 0 R (subsection.6.1) 166 0 R (subsection.6.2) 170 0 R (subsection.7.1) 178 0 R (subsection.7.2) 182 0 R (subsection.8.1) 202 0 R (subsection.8.2) 222 0 R (subsection.9.1) 230 0 R (subsection.9.2) 234 0 R (subsubsection.2.1.1) 26 0 R (subsubsection.2.1.2) 30 0 R (subsubsection.2.1.3) 34 0 R (subsubsection.4.2.1) 74 0 R (subsubsection.4.2.10) 110 0 R (subsubsection.4.2.11) 114 0 R (subsubsection.4.2.12) 118 0 R (subsubsection.4.2.2) 78 0 R (subsubsection.4.2.3) 82 0 R (subsubsection.4.2.4) 86 0 R (subsubsection.4.2.5) 90 0 R (subsubsection.4.2.6) 94 0 R (subsubsection.4.2.7) 98 0 R (subsubsection.4.2.8) 102 0 R (subsubsection.4.2.9) 106 0 R (subsubsection.4.3.1) 126 0 R (subsubsection.4.3.2) 130 0 R (subsubsection.4.3.3) 134 0 R (subsubsection.4.3.4) 138 0 R (subsubsection.4.3.5) 142 0 R (subsubsection.7.2.1) 186 0 R (subsubsection.7.2.2) 190 0 R (subsubsection.7.2.3) 194 0 R (subsubsection.8.1.1) 206 0 R (subsubsection.8.1.2) 210 0 R (subsubsection.8.1.3) 214 0 R (subsubsection.8.1.4) 218 0 R] /Limits [(Doc-Start) (subsubsection.8.1.4)] >> endobj 843 0 obj << /Kids [842 0 R] >> endobj 844 0 obj << /Dests 843 0 R >> endobj 845 0 obj << /Type /Catalog /Pages 840 0 R /Outlines 841 0 R /Names 844 0 R /PageMode /UseOutlines /OpenAction 241 0 R >> endobj 846 0 obj << /Author(Gerwin Klein)/Title(JFlex User's Manual)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords(Java, scanner, lexer, scanner generator) /CreationDate (D:20090131234326+11'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref 0 847 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n 0000102828 00000 n 0000606156 00000 n 0000000054 00000 n 0000000084 00000 n 0000102884 00000 n 0000606084 00000 n 0000000134 00000 n 0000000165 00000 n 0000102941 00000 n 0000606011 00000 n 0000000216 00000 n 0000000252 00000 n 0000106202 00000 n 0000605887 00000 n 0000000298 00000 n 0000000345 00000 n 0000106259 00000 n 0000605776 00000 n 0000000396 00000 n 0000000431 00000 n 0000106316 00000 n 0000605702 00000 n 0000000487 00000 n 0000000513 00000 n 0000106545 00000 n 0000605615 00000 n 0000000569 00000 n 0000000609 00000 n 0000109491 00000 n 0000605541 00000 n 0000000665 00000 n 0000000698 00000 n 0000109548 00000 n 0000605467 00000 n 0000000749 00000 n 0000000781 00000 n 0000112189 00000 n 0000605342 00000 n 0000000827 00000 n 0000000886 00000 n 0000121894 00000 n 0000605268 00000 n 0000000937 00000 n 0000000971 00000 n 0000121951 00000 n 0000605181 00000 n 0000001022 00000 n 0000001059 00000 n 0000133286 00000 n 0000605094 00000 n 0000001110 00000 n 0000001146 00000 n 0000138062 00000 n 0000605020 00000 n 0000001197 00000 n 0000001235 00000 n 0000138119 00000 n 0000604893 00000 n 0000001281 00000 n 0000001322 00000 n 0000143057 00000 n 0000604819 00000 n 0000001373 00000 n 0000001401 00000 n 0000143114 00000 n 0000604692 00000 n 0000001452 00000 n 0000001495 00000 n 0000143171 00000 n 0000604618 00000 n 0000001551 00000 n 0000001603 00000 n 0000150705 00000 n 0000604531 00000 n 0000001659 00000 n 0000001693 00000 n 0000156149 00000 n 0000604444 00000 n 0000001749 00000 n 0000001783 00000 n 0000160092 00000 n 0000604357 00000 n 0000001839 00000 n 0000001877 00000 n 0000163944 00000 n 0000604270 00000 n 0000001933 00000 n 0000001969 00000 n 0000164001 00000 n 0000604183 00000 n 0000002025 00000 n 0000002065 00000 n 0000169920 00000 n 0000604094 00000 n 0000002121 00000 n 0000002156 00000 n 0000174314 00000 n 0000604003 00000 n 0000002213 00000 n 0000002247 00000 n 0000174372 00000 n 0000603911 00000 n 0000002304 00000 n 0000002359 00000 n 0000177880 00000 n 0000603819 00000 n 0000002417 00000 n 0000002458 00000 n 0000177938 00000 n 0000603727 00000 n 0000002516 00000 n 0000002554 00000 n 0000181978 00000 n 0000603649 00000 n 0000002612 00000 n 0000002649 00000 n 0000182036 00000 n 0000603533 00000 n 0000002701 00000 n 0000002734 00000 n 0000182094 00000 n 0000603454 00000 n 0000002791 00000 n 0000002817 00000 n 0000189167 00000 n 0000603361 00000 n 0000002874 00000 n 0000002903 00000 n 0000201346 00000 n 0000603268 00000 n 0000002960 00000 n 0000003004 00000 n 0000206325 00000 n 0000603175 00000 n 0000003061 00000 n 0000003100 00000 n 0000210144 00000 n 0000603096 00000 n 0000003157 00000 n 0000003233 00000 n 0000217483 00000 n 0000602965 00000 n 0000003280 00000 n 0000003333 00000 n 0000217541 00000 n 0000602886 00000 n 0000003385 00000 n 0000003416 00000 n 0000217599 00000 n 0000602793 00000 n 0000003468 00000 n 0000003507 00000 n 0000222381 00000 n 0000602714 00000 n 0000003559 00000 n 0000003596 00000 n 0000226744 00000 n 0000602582 00000 n 0000003643 00000 n 0000003689 00000 n 0000226802 00000 n 0000602503 00000 n 0000003741 00000 n 0000003789 00000 n 0000237386 00000 n 0000602424 00000 n 0000003841 00000 n 0000003896 00000 n 0000244859 00000 n 0000602292 00000 n 0000003943 00000 n 0000003977 00000 n 0000244917 00000 n 0000602213 00000 n 0000004029 00000 n 0000004066 00000 n 0000248299 00000 n 0000602095 00000 n 0000004118 00000 n 0000004159 00000 n 0000248357 00000 n 0000602016 00000 n 0000004216 00000 n 0000004251 00000 n 0000248415 00000 n 0000601923 00000 n 0000004308 00000 n 0000004364 00000 n 0000252234 00000 n 0000601844 00000 n 0000004421 00000 n 0000004454 00000 n 0000252292 00000 n 0000601712 00000 n 0000004501 00000 n 0000004537 00000 n 0000252350 00000 n 0000601594 00000 n 0000004589 00000 n 0000004622 00000 n 0000252408 00000 n 0000601515 00000 n 0000004679 00000 n 0000004726 00000 n 0000255505 00000 n 0000601422 00000 n 0000004783 00000 n 0000004826 00000 n 0000255563 00000 n 0000601329 00000 n 0000004883 00000 n 0000004957 00000 n 0000257979 00000 n 0000601250 00000 n 0000005014 00000 n 0000005061 00000 n 0000262744 00000 n 0000601171 00000 n 0000005113 00000 n 0000005150 00000 n 0000266676 00000 n 0000601039 00000 n 0000005197 00000 n 0000005238 00000 n 0000266734 00000 n 0000600960 00000 n 0000005290 00000 n 0000005322 00000 n 0000269709 00000 n 0000600881 00000 n 0000005374 00000 n 0000005398 00000 n 0000269767 00000 n 0000600802 00000 n 0000005446 00000 n 0000005485 00000 n 0000008278 00000 n 0000008628 00000 n 0000085093 00000 n 0000005537 00000 n 0000084919 00000 n 0000084977 00000 n 0000598840 00000 n 0000595229 00000 n 0000598678 00000 n 0000594271 00000 n 0000588831 00000 n 0000594109 00000 n 0000588464 00000 n 0000586919 00000 n 0000588303 00000 n 0000080540 00000 n 0000585706 00000 n 0000574874 00000 n 0000585542 00000 n 0000085035 00000 n 0000080712 00000 n 0000080867 00000 n 0000573422 00000 n 0000556705 00000 n 0000573261 00000 n 0000081027 00000 n 0000081187 00000 n 0000081342 00000 n 0000081502 00000 n 0000081667 00000 n 0000081833 00000 n 0000081999 00000 n 0000082159 00000 n 0000082314 00000 n 0000082474 00000 n 0000082634 00000 n 0000082794 00000 n 0000082954 00000 n 0000083108 00000 n 0000083268 00000 n 0000083428 00000 n 0000083594 00000 n 0000083760 00000 n 0000083925 00000 n 0000084091 00000 n 0000084257 00000 n 0000084422 00000 n 0000084588 00000 n 0000084753 00000 n 0000599524 00000 n 0000094041 00000 n 0000088251 00000 n 0000085253 00000 n 0000093983 00000 n 0000088649 00000 n 0000088815 00000 n 0000088982 00000 n 0000089148 00000 n 0000089308 00000 n 0000089474 00000 n 0000089640 00000 n 0000089805 00000 n 0000089971 00000 n 0000090137 00000 n 0000090292 00000 n 0000090451 00000 n 0000090611 00000 n 0000090771 00000 n 0000090926 00000 n 0000091086 00000 n 0000091245 00000 n 0000091399 00000 n 0000091558 00000 n 0000091718 00000 n 0000091884 00000 n 0000092050 00000 n 0000092216 00000 n 0000092370 00000 n 0000092529 00000 n 0000092694 00000 n 0000092860 00000 n 0000093026 00000 n 0000093192 00000 n 0000093352 00000 n 0000093507 00000 n 0000093667 00000 n 0000093827 00000 n 0000103061 00000 n 0000098206 00000 n 0000094126 00000 n 0000102770 00000 n 0000555609 00000 n 0000544305 00000 n 0000555447 00000 n 0000531525 00000 n 0000543094 00000 n 0000542922 00000 n 0000098556 00000 n 0000531177 00000 n 0000528811 00000 n 0000531018 00000 n 0000511012 00000 n 0000527315 00000 n 0000527142 00000 n 0000098713 00000 n 0000098868 00000 n 0000509977 00000 n 0000501619 00000 n 0000509815 00000 n 0000099024 00000 n 0000099179 00000 n 0000099336 00000 n 0000099494 00000 n 0000492584 00000 n 0000500728 00000 n 0000500554 00000 n 0000099648 00000 n 0000491525 00000 n 0000478942 00000 n 0000491363 00000 n 0000099804 00000 n 0000465664 00000 n 0000477647 00000 n 0000477474 00000 n 0000099960 00000 n 0000458304 00000 n 0000464855 00000 n 0000464681 00000 n 0000100115 00000 n 0000100270 00000 n 0000100425 00000 n 0000452304 00000 n 0000457724 00000 n 0000457551 00000 n 0000437792 00000 n 0000451053 00000 n 0000450881 00000 n 0000100580 00000 n 0000100736 00000 n 0000100891 00000 n 0000427468 00000 n 0000436868 00000 n 0000436695 00000 n 0000410239 00000 n 0000426068 00000 n 0000425896 00000 n 0000101046 00000 n 0000101200 00000 n 0000101360 00000 n 0000395176 00000 n 0000408914 00000 n 0000408741 00000 n 0000101521 00000 n 0000101682 00000 n 0000387903 00000 n 0000394494 00000 n 0000394320 00000 n 0000101836 00000 n 0000101989 00000 n 0000102144 00000 n 0000384540 00000 n 0000387412 00000 n 0000387239 00000 n 0000102299 00000 n 0000102456 00000 n 0000102613 00000 n 0000384192 00000 n 0000381800 00000 n 0000384033 00000 n 0000102998 00000 n 0000374622 00000 n 0000380947 00000 n 0000380776 00000 n 0000373729 00000 n 0000366661 00000 n 0000373569 00000 n 0000274295 00000 n 0000274758 00000 n 0000274180 00000 n 0000274238 00000 n 0000274874 00000 n 0000274122 00000 n 0000106665 00000 n 0000105666 00000 n 0000103437 00000 n 0000106144 00000 n 0000106372 00000 n 0000105816 00000 n 0000365148 00000 n 0000348758 00000 n 0000364986 00000 n 0000106430 00000 n 0000106488 00000 n 0000106602 00000 n 0000105974 00000 n 0000109605 00000 n 0000109109 00000 n 0000106860 00000 n 0000109433 00000 n 0000335007 00000 n 0000347521 00000 n 0000347349 00000 n 0000109251 00000 n 0000112246 00000 n 0000112009 00000 n 0000109837 00000 n 0000112131 00000 n 0000320748 00000 n 0000333736 00000 n 0000333564 00000 n 0000309820 00000 n 0000319676 00000 n 0000319503 00000 n 0000115476 00000 n 0000114598 00000 n 0000112436 00000 n 0000115418 00000 n 0000114764 00000 n 0000114918 00000 n 0000115106 00000 n 0000115259 00000 n 0000599641 00000 n 0000274584 00000 n 0000274526 00000 n 0000116794 00000 n 0000116614 00000 n 0000115652 00000 n 0000116736 00000 n 0000122007 00000 n 0000120215 00000 n 0000116892 00000 n 0000121836 00000 n 0000120421 00000 n 0000120582 00000 n 0000120741 00000 n 0000120902 00000 n 0000121057 00000 n 0000121213 00000 n 0000121369 00000 n 0000121525 00000 n 0000121681 00000 n 0000128196 00000 n 0000126527 00000 n 0000122225 00000 n 0000128138 00000 n 0000126733 00000 n 0000126887 00000 n 0000127048 00000 n 0000295995 00000 n 0000308513 00000 n 0000308340 00000 n 0000127209 00000 n 0000127363 00000 n 0000127517 00000 n 0000127673 00000 n 0000127827 00000 n 0000127983 00000 n 0000133343 00000 n 0000131955 00000 n 0000128463 00000 n 0000133228 00000 n 0000132145 00000 n 0000132301 00000 n 0000132455 00000 n 0000132610 00000 n 0000132765 00000 n 0000132920 00000 n 0000133074 00000 n 0000138176 00000 n 0000136718 00000 n 0000133561 00000 n 0000138004 00000 n 0000136908 00000 n 0000137061 00000 n 0000137217 00000 n 0000137372 00000 n 0000137527 00000 n 0000137687 00000 n 0000137846 00000 n 0000143227 00000 n 0000141689 00000 n 0000138391 00000 n 0000142999 00000 n 0000141879 00000 n 0000142039 00000 n 0000142205 00000 n 0000142372 00000 n 0000142533 00000 n 0000142688 00000 n 0000142843 00000 n 0000599758 00000 n 0000146613 00000 n 0000146433 00000 n 0000143477 00000 n 0000146555 00000 n 0000150762 00000 n 0000150166 00000 n 0000146802 00000 n 0000150647 00000 n 0000150316 00000 n 0000150482 00000 n 0000156206 00000 n 0000154396 00000 n 0000150980 00000 n 0000156091 00000 n 0000154602 00000 n 0000154768 00000 n 0000154934 00000 n 0000155100 00000 n 0000155265 00000 n 0000155430 00000 n 0000155595 00000 n 0000155761 00000 n 0000155926 00000 n 0000160149 00000 n 0000159553 00000 n 0000156424 00000 n 0000160034 00000 n 0000159703 00000 n 0000159868 00000 n 0000164058 00000 n 0000163082 00000 n 0000160382 00000 n 0000163886 00000 n 0000163248 00000 n 0000163408 00000 n 0000163569 00000 n 0000163728 00000 n 0000169977 00000 n 0000168232 00000 n 0000164276 00000 n 0000169862 00000 n 0000168438 00000 n 0000168600 00000 n 0000168762 00000 n 0000168925 00000 n 0000169080 00000 n 0000169238 00000 n 0000169394 00000 n 0000169550 00000 n 0000169706 00000 n 0000599875 00000 n 0000274700 00000 n 0000274469 00000 n 0000274816 00000 n 0000174429 00000 n 0000173630 00000 n 0000170225 00000 n 0000174256 00000 n 0000173788 00000 n 0000173944 00000 n 0000174100 00000 n 0000177996 00000 n 0000177515 00000 n 0000174679 00000 n 0000177822 00000 n 0000177657 00000 n 0000182152 00000 n 0000181110 00000 n 0000178230 00000 n 0000181920 00000 n 0000181276 00000 n 0000181437 00000 n 0000181598 00000 n 0000181759 00000 n 0000184732 00000 n 0000184372 00000 n 0000182415 00000 n 0000184674 00000 n 0000295430 00000 n 0000291588 00000 n 0000295267 00000 n 0000184514 00000 n 0000189225 00000 n 0000188457 00000 n 0000184949 00000 n 0000189109 00000 n 0000188615 00000 n 0000188778 00000 n 0000188944 00000 n 0000274411 00000 n 0000192270 00000 n 0000192090 00000 n 0000189441 00000 n 0000192212 00000 n 0000599992 00000 n 0000198242 00000 n 0000196664 00000 n 0000192475 00000 n 0000198184 00000 n 0000196862 00000 n 0000288209 00000 n 0000291185 00000 n 0000291011 00000 n 0000197025 00000 n 0000197191 00000 n 0000197357 00000 n 0000197520 00000 n 0000197686 00000 n 0000197852 00000 n 0000198018 00000 n 0000201404 00000 n 0000201166 00000 n 0000198538 00000 n 0000201288 00000 n 0000206383 00000 n 0000205437 00000 n 0000201638 00000 n 0000206267 00000 n 0000205603 00000 n 0000205769 00000 n 0000205935 00000 n 0000206101 00000 n 0000210202 00000 n 0000209964 00000 n 0000206648 00000 n 0000210086 00000 n 0000213407 00000 n 0000212693 00000 n 0000210451 00000 n 0000213349 00000 n 0000212851 00000 n 0000213017 00000 n 0000213183 00000 n 0000217657 00000 n 0000217303 00000 n 0000213612 00000 n 0000217425 00000 n 0000600109 00000 n 0000222439 00000 n 0000221984 00000 n 0000217848 00000 n 0000222323 00000 n 0000222126 00000 n 0000226860 00000 n 0000226215 00000 n 0000222675 00000 n 0000226686 00000 n 0000226365 00000 n 0000226526 00000 n 0000232781 00000 n 0000232601 00000 n 0000227081 00000 n 0000232723 00000 n 0000237444 00000 n 0000237031 00000 n 0000232973 00000 n 0000237328 00000 n 0000237173 00000 n 0000281751 00000 n 0000287552 00000 n 0000287378 00000 n 0000241220 00000 n 0000241040 00000 n 0000237741 00000 n 0000241162 00000 n 0000244975 00000 n 0000244563 00000 n 0000241425 00000 n 0000244685 00000 n 0000244743 00000 n 0000244801 00000 n 0000600226 00000 n 0000248473 00000 n 0000247944 00000 n 0000245205 00000 n 0000248241 00000 n 0000248086 00000 n 0000252466 00000 n 0000251534 00000 n 0000248679 00000 n 0000252176 00000 n 0000251692 00000 n 0000251847 00000 n 0000252011 00000 n 0000255621 00000 n 0000255139 00000 n 0000252655 00000 n 0000255447 00000 n 0000255281 00000 n 0000258037 00000 n 0000257613 00000 n 0000255811 00000 n 0000257921 00000 n 0000257755 00000 n 0000259546 00000 n 0000259366 00000 n 0000258227 00000 n 0000259488 00000 n 0000262802 00000 n 0000262196 00000 n 0000259644 00000 n 0000262686 00000 n 0000262346 00000 n 0000262528 00000 n 0000600343 00000 n 0000274642 00000 n 0000264694 00000 n 0000264514 00000 n 0000263008 00000 n 0000264636 00000 n 0000266792 00000 n 0000266496 00000 n 0000264838 00000 n 0000266618 00000 n 0000269951 00000 n 0000268638 00000 n 0000266980 00000 n 0000269651 00000 n 0000268812 00000 n 0000268970 00000 n 0000269127 00000 n 0000269825 00000 n 0000269294 00000 n 0000269888 00000 n 0000269465 00000 n 0000274931 00000 n 0000272678 00000 n 0000270147 00000 n 0000274064 00000 n 0000272860 00000 n 0000274353 00000 n 0000275192 00000 n 0000281041 00000 n 0000280868 00000 n 0000273079 00000 n 0000273288 00000 n 0000273475 00000 n 0000273693 00000 n 0000273874 00000 n 0000281452 00000 n 0000281292 00000 n 0000287973 00000 n 0000287815 00000 n 0000291464 00000 n 0000291410 00000 n 0000295800 00000 n 0000295654 00000 n 0000309310 00000 n 0000308941 00000 n 0000320359 00000 n 0000320023 00000 n 0000334515 00000 n 0000334155 00000 n 0000348284 00000 n 0000347926 00000 n 0000366143 00000 n 0000365751 00000 n 0000374311 00000 n 0000374007 00000 n 0000381469 00000 n 0000381227 00000 n 0000384441 00000 n 0000384405 00000 n 0000387767 00000 n 0000387635 00000 n 0000394930 00000 n 0000394754 00000 n 0000409741 00000 n 0000409356 00000 n 0000426980 00000 n 0000426569 00000 n 0000437462 00000 n 0000437158 00000 n 0000451845 00000 n 0000451469 00000 n 0000458095 00000 n 0000457973 00000 n 0000465402 00000 n 0000465120 00000 n 0000478424 00000 n 0000478067 00000 n 0000492205 00000 n 0000491853 00000 n 0000501281 00000 n 0000501025 00000 n 0000510611 00000 n 0000510291 00000 n 0000528257 00000 n 0000527839 00000 n 0000531426 00000 n 0000531390 00000 n 0000543842 00000 n 0000543488 00000 n 0000556285 00000 n 0000555946 00000 n 0000574339 00000 n 0000573932 00000 n 0000586469 00000 n 0000586104 00000 n 0000588717 00000 n 0000588686 00000 n 0000594809 00000 n 0000594565 00000 n 0000599241 00000 n 0000599071 00000 n 0000600452 00000 n 0000600570 00000 n 0000600656 00000 n 0000600726 00000 n 0000606265 00000 n 0000609246 00000 n 0000609285 00000 n 0000609323 00000 n 0000609453 00000 n trailer << /Size 847 /Root 845 0 R /Info 846 0 R /ID [ ] >> startxref 609786 %%EOF jflex-1.4.3/doc/manual.ps.gz0000644000175000017500000100536411141044634014345 0ustar moonmoon}GImanual.ps;ko8+X[sO.d4DǺȒG{yWU$%9Vzn,UUEJ_nWW8Wnf2-DX5_]3zi;m{.(L(*_Woa!`}Rol= c(`ۿ2Y c|I<܆yG@JyBd(``j٪bkEyZX }b5 \|RZ7a&ɣMceXZ_U=U&DHyCܓY;euV=4L,=[O!"<2k,؆dt' ݐy##FaxM"mиU94{9MN6,_X!JȩI+@Ne>bϲ dɵ`ǵ5VjqC6YϘzb}Rug}wr_t6y_-􁚵iY\p6Un}]q sH1O Yx"_OҺn+8a vA kŹТm+A]QIVO~{b3@jaMՂ>` (PVruxy߷IL-_ZC<{ÑF唇AtNKf$ z]5q.[ӄ79BWPt{mD!(FQn4K]?Z7p";_CFwSq RLWĖ8$XpDN']sAq^g;h9ZAuU %?uR)$)v x T^ɶۙ?i䴢E ²b`sB`i_P]#1Agi M'W~UB^XcgiRFD*jʋT4d}*wAs>5!bAۥv5ajRZjR-E,Var\vNWl\L3 ehL"E i8ٜ 8=H ~4=bzZ~IZp㙸g/7!z[6VΆ0P$& }f1ۆ= X;vX )K1a屬 z.㦜X Äo\Xj5B8jVU}OX';$qAB0C:S EVB.CJsr^`H<" u 77E/!BN[᳼ !M0zoԪݡcݮ!T,da J+J+,:)7+]¢G jzt3.ԑ G]n\]kXv'y/TQ(+sg3Y'Ɍ4gs2\3ڬ[l>?YKڠTLխ>٢ڴdhH}J!/sL1JyW7͐" | nʐ9)~K+ڙ>ݶ.NIFBT.ox;.}+b>bmˮ\C_!,5½8,gX] ^/@['˔҈qCLV$Z=r힆1A 5Q_ŎHSUvPhD^112<5WԘ;IҌE^Kg(R(1iN!FvՁæՓ ]ba,ΩiY-JbL(Ot) ]/Ms뤤+h0[?F"҅lzi>O_=|u}ͫ$V E׆M`x&*#.&25w|S]`@ui:]^s+Vz*J[`oaYuĪײ~XMDo-"3Qҡ\B+陬5nnUHI}4>]FT[ }Q؟x ^gS-vЕBDx q[#'IsN!bE- N4̄CB")'VdppP.(ܵ/+YVEl5ޚ$tւfX@qҙv 9OzTyC|pir/[Tk^a$o,n<͋d{|!Z$t;EO9Iu30%C_M!+غ`ƕZW]Dd[02@Ce o=JS£d]MIѐi2vzVαf1pO>~- L1vpM{~j*) y5OcpD]tfP/BtH" ?X"6t#Rmk :JAPN5[@ad_dU sh=MC;x'+j܄9̎64Z]%,rmG*{ PQټSWm7EыpIaan=I)·'QJ׵鶫0j=>b:HN" Lpd/jqMn fU =SQr:m8܂ tO~><_z 7P!6_hS& o@$`Ͼ\o2|N{aԩ&)+8-: :6I,&{YXԈ2 E.b;@$;ަ$?J!!Q']~ S͐nfN^vEFT=\ 44E'##۱-5͋l ALfgP{%qi`QѪ ez4ckFP*SQSfNcZ`"ȫҴc˰\9}>OJx>p{57vve} zYxM[(X; ?C,HK T8uEEu{N 6)#_n#ƒ{%ӥܠ W{îc×S WV ciZ7.ÍeJTJ`4.Q8> /Xt8~юqnf SYlٿoJvNupc[3:>-C价'>52@w{8W#ǀd.^( | ų}.!F#ꇞGz=?h+vvMO.!Ѽ:1L F,#NQK ̼fSm l ~ցCEzelr)ԘKƼ4rUB5/\3E.f*O,e%x.#qRJ7ok`3[~g?Mq95;Ϳ4 +q͝x̝w׃ѵHi| 'Œ߄ (ձp%oQu>s>ԟk+p!?s1γ2O/B' H^jQ-8MG](nD_0M1]\9,i<)AķImA{Az$e2.L;6gLb͇| 5QZ=X0+lzx{s@Kꎸ0wtVU !+vi_\+J0*#?Oghu7o%3_d4p1xm }gh0N#o2ĝ'9Ow6t |ϙ/\y ޟ]{s &Ny}w1f#Ǚ3p=\7t,Ե>< Y,(N&|›-dn{`:N8v`>8 gbd,',?{`1 {?=,`/}MGЛs0Lcﺵ[L|AvwYΜ974߃m%ms]%`ٲZZϚ332##x7]|_yC(o cQ#ŧ";r|xYX\Q3܋>;})圞rZCu+Ŗ'li}pT1'kDl{Q߲c9OZyl`^mlz'̰];Oxp>O1$o{6Ÿ[jn}١XcnK =:_nL3؂à n9c q1)>eʍݔ0[jHXa񩩕P#>i!;[o/=b&S}λO\}m=ȣJ嫳e<ʽocaw%.o\g*ysZ6)ٶo@|3⪍ǽyʿda9ce?h͕v5`Fg']8ub1;&>M.bッՀq:uמIH;%gZ+߻XTn_Y߼_~}q/95y6s_XS`m?vq}q>?cկcX"[Z[z,88f o^SxQ۬ߣsN3Q`w-.sV;ns-x|?šݓ{U淏QEדp4cKm0*i =B70mߛp't]cb%Ya j+axM|}M wJ2p#ygGG0`ZҼ3ʽiA 8ЏCv^Bj_9rj{PFًc&QY{1~(K|I߹pٓU^w"ݵ!dV0&.W('<՚+^1܉!f7W{X+sRvdG}jw"\A7_V'zpX Ŏ Fx1u%omz;V?&Ӟ/;fO$?'opqzY܃OկψQ}}e"bm~Ś&p8 oqD8F 뭛ŵ"6^r:~rj$Xy 0\D}ā#JAÀhSJ 憣O&NHň]`zY 7X1rLƭ,\a쯏Md/0?7憦aTq`z5қ jXmЩyg&xC@e,BRx9 )bxy:NE f^}? |d}Anq7̋0'?HuMIL.# _LxDQD֥0ϗq 6}B.;܄W81@oĜ |Áyhhp 3q3we%ҶMDGbgcUcb@`M|910 p JawbJ7 q {dŤ<x~ y?_0B :q:)x=d 7<Nwx}ٍmx 6@,Ϝj oLV3;7K9-BZyF.]OP(;S"-<#XÇ{1 $qy5l4!V7fgxIbp@x8\XfNh%pnqHp@l^~ N6 ߈+±@F9ɒȘ7 ey/0@+Ԝh+MJSʌ_ x86ӡaW0ysT`4MX3ۼ{d^@׆Unb+|@= %q^6Y y8oJ SĎӤ Ź͇\?F}.5.B~xa3 Fh;A!`2ruM3<X {K4B6@2G|\en a`@B0F`0T"3AG9za}ȋ&6MXWq< 3ida80d PEi{&6 #pʚZU%(a0N4*pY M'M#(YZ:8zmԂaف# V L+Fz_ '`F\4. (,BxF33j|?#Gfl*> >zs&z7X}WX~"kbbS'G0@ڌ9EeUrg¡_YKq<&u6d0S\yV_O%Hy^%ۉƃ{Fq ^E frPl!lj_N:D{ Lq.dAGl~w^<`TD~.k_88Q>1 n,3N VqVm)u-|e3D\_% Wэ/j~ן{WןiV)T?R?gx]33~?׿\Lӯ_\[/~__o~/ß{_C.~o[?~կ_X d/D_Óٿ/O]yOO_/?~-mo+'xem*'xܿ`Y_7??ۏ6?/ռoTw_e78L<ys_]|þ|ŃU_ǿ|œO~g/?+WH?}?98VSP?\0a2hU0:`OJ,Fay l=rI}oXKWz 10ޭFȹ5gw?r* +ok2C^g>X5TM;\d d7Lx-ry9C^<>3-h?>)|Jb̜ٖO[?S*` KZ||{N/]N C 3[_֠ 1&w0j3V ~{yҖY]f*$7PW}Z sgM}ʘ'-|ߋU ezq l·j7/o_[삏zM/k+?:=׎ $~G~#N)v3VNUs/<)o,oSSWNlw_,\d]v W,ka^S/)e⇯97ckI Rp!7WO7)ywke|`zvtb+xǰJ/qiRi ȧmW~SL<5mmKJX'Ny+6S`{+@0sWPf y6ox|{s>G yyP/pwXb#ﯙ&o4^z^9=Oq*AY;q>My%S{E$*%uTЭo^;'odj4W^^O}F7oaî`,uM[=?U4ͽAkM4$9qcכj%_DּO h[߯}1v\M1zFnΜT.,Xl'sЈ|t)UL<SE6CxaU,Ҝ]d\*Ƨ?7qdA8:6=u}pC98Gl V9r"fHݘ ޞSBbzu3b#r[Ǻ~ k 8Zz0]CqP^Kuh- NB^$z%c3.eX9er=r;DŪ\k4Y!@|"pT'0eʖ0p+-3{`<z8ڼdGpEg@9y뱵eQQ;6 | X>jolOMF2Y>:9DFN5~ 2\tFBĖX{c9i1, {4le1ۏN׳hϸg9DЧY'_O^8v15"ocFBPu v@U8wUO8 4o+ FM.@t--g Tj,x#Bq0b4Hj}->[SP KycZ %m6?]D?lܘ/ ߈]L8W[l#T//7̙@X4{5ʕf!6.CPE#NSa.< &:;N ?͟xs{l"Y&BoCXNxxhOvҪÝyv 8ͪn̹^~ 8 =YxN@Đ̠an^2o qA1| ޶TKW(%( n>%*&>Q ph~ =<8|ݖ#T,]_\Wiq"k#w_y FylZ\%q'Pdq VETv21suo0rmOt¶ש/z׀z>aKSy @.@"e=ova_ a9O8UY++8mQDz}0v*04KYp9>FRֺғ<#AyرZ͏0ÁNă!`ӝ.>A᳅^l iRi^\C݆=;(! s6Z_Bh3 HX?d~V4^g}Y<;C!zCH7A拌?F!!{w`S`Ph,J`eS<  w@ %@ ,~o0c2&G '0ٺg0YZ_y\F}PƇ05dHp,ṕ&/2^+=0D5 Xp7[ >21͆)V)S$z?8l?7Vwe^ |ۃ.Pd/lSggP [ZaKTX-e]`'ӹ-<bf29haB,v\tK8Vk ;HVg2 ;n@+Ӟdp\n5=t#0`b&le= ">g@PD / f*$aP%6f͠ 4 LG?]B8SJ̷>^Gip5,KNˏ=XՕ-*." /[ ^ ίذ9fSO^h-\CSn 0/vYch&y]}.ߕ &q CJYL mIpixݒ/G7^:ÇsŊI|Op =tNw&ck[JP!us̴v6}LVⵦ)+261˰H_<fjNRf!-5MoXn ~ҩ)]_Ly.C;r!< \z^{, Œra {u~ &`5 ,}%ڈYâSoy#E.zrƦw;@p8"̧I P&] ?%07~lGp`IĽ@8/U+f-12خ~%y3`\͹#+8W3 k SUp\_l8P`3ٙkr`+G0C9r"f 'fVd%`؋7N+bp[* >ޅoOoMY^oy;\ݘX? F6˼p:e&>N&#{}[,}=3M<5'Uĵ )O8VƙesKza43cw8Y؛; oaǪ=@/xd L qx \6n}2\e[v@J`gH":$r2ݔ+PLr 3jאּo"wZB~thY-L]MWJ>Wf}4be(ٰ-y '(%#5| `ofZ1OMy r=r&@RJw,mRev_{%UW\Nݺףpὅ=Bǀt fYC/,?xfՀ38 _W>Ada>9v-, Ғn`na9a'\AeE; T x.i 6O1d>< LvT6Ht&' hi ܦ쌲k7d<A6gaPVznRL' G . }|^]K~2,&hiC?^|/9'x ~8ӛMXƒlA@ ψd 68oۡOp dk1^;Vp]=h0v RxC"gw|'%VA,}0/ze%LF]}B罀P@b;#=Ca6 |vY0Xs/˾t26p'WQDYlGٍV}68%>ଜۚs"%Va}xX65S<4+63T"u&;1 2MM'Y"QԒ޾*>7}~^l♊WMN5yknFdjx=U3íDBs9rmIu,0t,n߶7mn+~GdޫX/I?xa{~Y-TWɰ Dyb@Gi?ÂF$v97ˇ=v;~8 Y[dqsd#X,Xs+8ݕ'Z ,&d3r5Q4<SboBJo8&x77d}=J/Mܞ t4\~X`޷3$ &cH`WU*WAwEap~]u/r0Se9˭zabޢAޱ]6Q9j`0aQO)x:pHPb*50 րLRr|]5ώW '(/|8!`Whnb3]>ⶼR08LzMW9=٧Aq! JN`Ϟ-iP揭iӭ/ƥE=l#}V4 c;!(gOmEɽ. vhd=~OŠCYP*HV)/ Q j!@& ~ 2ա͈Wb=-a.|[EV B=H R~txB?DRf@AdIWa"P?%A -<, Mi8*@m$OvMJ6Ѽ)][|4BKJJ XKuN$b^z{'íWj,ʏ`?MCz]~=7wrg8v/lA,X%=F17M*d5TP=sxA7Mv7sxxoB[.,B(بq+(p7rE  O(Pk9%x\lԆg-JABA @Zh&?ڨGe%^dQer|t *_<(cG,u2 }o V ^֋cN?h)Y9)%DT䶬|s6^uf8&,ՙŒ'x*BUq.q aY Vb2l|E!4;FMxʓR&=L}ؤ}ISU)09=$[0p!y]mED a!lĭ #CW>1krN(eK'ƫo>y7 Љ'iLo JL 'xxٗ.滫Aɒ*?a/pߊYo1 ˩YxX ɑ%Z7LǦmpz9нS.ӦjRHc@[2?"kZ~wfp'QiS3} P_\^}&~ݏކ3L8̿ǂZwu0b1XY8 045,F殂`#Gk2x5#UZzs$X4ɯ? E ^p_ȮWdiyxP'H)[*:zX*|axV *7,{ Ntúq@_؛`in0I=΀#nD<%4K>$u>Pݫ4RtfejۖO#-TVYz9]c%([|ow߹T9_ q!|Y0O驷C´%:F C$jg |ih KN<)ۄ`z >!|{ L@񙐏b!Pmi`UrO^ ,u7`h?t%.~h:Օ`0-w/x؋yk7*X6 ?|lWeQV9M;[]|,P&@ ݪh}^e e--f.GȳOLEo=S|Zl)G &?`YC6$,σyfVf,| :,KtZ8g0s`qm1@hEyK49;O3U8pكXZ/2(mW!;yz(- |W*]جhii̤UoBCΏ=x ^OߍaYKn~fG(]%8ذ\lx: O,rl-^pSuI%Iw\B}W{Yf@X4S&Lfؾ|xle ˠw+:h$޷ s]l:{-Ud8n1Z R+]2HNNʄH2 &k@M H;9떾0,_=0~" ou+WO Mjy.6@0Fpj6sE\Y\a$ÏƧZpa4Ȳ_MKyvϕ`; ?N Bq fCl?XE2tXMf8eE{Q`2ʯEѫ2/ƽln )l'$@S;-E8UwgX׻DW # [Epː/F._{X2Q4YF {! PQ:&{TNڇ|JT/R[apq9q*A~6Wc1!BuI+Lĉw(",7Xn NӮIn< /6S_sǵkϟ^S6ZlyQ>+/M59i)!v7^*KMNp FyNUVy"VU!O# ΍q`opYH0YoÓoO[ {VHCl w #JF}Dˋ0ڐtk2؀X7*!sˌ+٦uZڟ0@HZUPlLSP~] dVpK|{=ޖ)8NQsҊWb|gy(CU%H T.ޢoح H9!RKajK"N@0VVOշ7']l#RIb3v@6oo% PѭSWPD'j!DpUvfag? H#}Wx=˴ X6?mخ&÷TɧTixU: WrѰv cZ C, 9M[q S3= Ăt n/jgP8Aj{;AIE{1ҿu/pxX n Xt/\oCb^+c[ vzpUj-#~d,K8؄PN#-iƱ8̌9?B6cJ-^C8x.{x ΀1`p Aprui֏ Y|,h hA,Z0aVuYuP^q,F]m P`zZK+Ygai?{ NZM,V?̱E1 qA *[٠?p&4'qTț9Yϫrn]Du֫[?ӤTI<şc V] Ӱ2aB4덝߳`%46\pP \iǯuI&| ("bu=7qc@#x!K eM[wj&A ;-vv·xr(.>9/[i>op](dw=NW ?h۰Kk=19W,y#7gm(/ADvDnߙZ<]y!3A]^9W<1jc`NV M,-r1)\s"\w `AsXqƒr:v=ari}TV|/gD϶/Kc:c mɬD!E{rT><(&; ,f 39]-ATtMC] 6'k:u;HM BPK z' qQ{3L3`?%\Ufp`Hp$k>Kw8*js^a2Wpi*tBhΈm85aFDŽYxM&odX2;J>/NمTqh" N!\Y fLp@G2K Yug8s}.BZ_[tG ݗ8ѹ?"qYrM5q(l⸔nth$L_|Pp|zʳIHTЂ5{&s'=JxLV87.$8 4Jm+nG>.jE/%쀲45]^i].`ཆ%4BxB>=<9϶wpkNVZMLv✽Χ/CƔEn(,95su{; /q,dLH# Ӑ9z^C[ ,k>M.@Db xBMBŸWqQ`[FKqL6ϱ:V&< 8%'U?QC6s@Y;5Yڵ9N{ڎǎϹ^:& /`HFtu4gIsݶ 3&Z3޽EN(*w0-bp8!N0QȽؤ̕7@mt xGM$yk굣''PN͙qr_\+nl(qQ;^_B$$惗,'K+#3:-Jꀾ\ qs7gh9ޘ4}6^T J:굩\Rqy,;iXo`_d3wXjCǿS[svd@4cך@zl{[՝.^ P^">o2S0E[NJUqPs/Rol1y7tfQ~cchx9Nsν ]Q]f3 U* xHS Q<:x=Ew8 _Vb$=nH:- /%Fs@_c* <桛3%a-LfU߽G᰷zd}ި7cij5 ;ϭ/Ԏy>l4OsH:<;_Ҳ=_^C lwNYjg+mPe^vmBiU|ciM[Ѳ n Htzp>J*g^k^K)guRffɈC뜓Um~r.lW8p Tj|RU' E2k#{;"j0IKm V`òoA A,ڛr+ol߭@KEU6G"fL47ET?>&R" BO5V>NlL`OM)GhqXy .H2! SǣpCʢ~\\`-`Dpz&>E)mI29rS YDl N)\GXe,.[Gmp':YX%pE( έ:gtr7;A<UP5#p3W2խKvSm ~=ZԦeU㨪-ՋVg92gGqgb\W=:vC)bj+'ZAJusspo*uJEBX33ߺuJzl\0H8Srf4O&:ll\ WT!~e=pn#z{ w|,:݅dC'XK.{TP{sG,5NF12i+ހN͐ϣ0<7Ùׂ3c͖Xza!b%a˖ٔ&y>YZ_r5ZA'dY/USOyrsxKy]iTL1 Z0%u#W/%>7`ء羦΄}r~lrV ve(94 ?Lɻy׀E$h?yΦ :U2ff=v_Ձ6ۥ X,E6?G;ez$!mO,84d+im&wj~]n8͊/6A?(?́?.^˧ǚ1ͫ@h1Oh{\#: lpE{W@GJ ?_+x5/NWSlpEI@&̛gU>qp= =d S:5v Mduů\,>l{s+kiA IM'<M`ih\[6"^Jj![y-/ut4&1+ZRcVns[ Mp`ʞ?ȗ3%quz- z_ )" Dl%f 5ڣxN F uUQU p;,]D7]tb0=`ES,F4ErJOQG0pNA5>]S~8q֯KP.Pb%DTy=6%U,NV\RE3pӫQzJl",`Zr[& :pz+C^|++*k8+NqkHdvC}u\aqHGE3A`$`feشֽ!ضqؘ.k_xAԸ~<# UӚ U=%=}*w@XP}^`N8kզ0AKlTΐ]tpCaB..\Kم^#j@e0O»9AS9D*@x 5I͑^:3]|dzq8x=/;q𹀵NdF"0U;2fKs]/ 0[iI:,Yad{XQ^cBSt!alD{9tl~)!?{z}8#pvchh/Tp\3[l_Q wF}"ZP&sE1Mnwr%Ke=`hlUaND~cۗ9@PV}y al%xyծԨ[Ad~̩^Y:J]:[8" W꾜yRV]=X3+rup,ºjU~WMZ`nf)Cg'1]5S2 eH/AMwQc:9h3Xi?9qޏ󁶧/n0dzzc?\`]Ce ^X"M{~p ,Zܐ:9DgV8=y6! u:>Өr=-[4S |$"l6WkNH۱bSYeh (9ؼ&ٮI2}ڒ5_;$"4p4QpIi28j}R {"-UEqb<0WN=qXB+$rlTKBԿkPZl" h*k^9CNӊz9u\ͺ{{@Ǧx7pm%Bыf*ށ@>&ۭ8BW07ef̷ڏ,>hALS6`. k"*uԩϭO,Ζ%(qdXRDn(?T;S.Z*Ғtj[&ɽy_3N75J991,p?۟/I?7?_g?a?lwS4_O|'~/͏?Oo׿/?3׿?oO?/~ÿOOg?F/Sm'*?GHy>oW?Y/ʩ~c?_?[7?'???G//ݧC,~??Oo7jïͅAU?_q??//Sӯ_iڅ2~/2~7"[S}9w'w NZυk?G=iEyS'h%S@\3 PニN,=08Ts8:JQ?r~8i6pl9YJgvr&*濪M֤}U'p`.GS3Xgw,7OIǸՅnK1j^DCrqwK<LOl5óѱ5DUŸ(6C$xCfwr?փ}j[|*a:Q;m۽&^Ly=(K}0*عN>NΧm1r}ѡVrG'BKx[_oG0ilEz6vvL6Pyyjc'P+Vgb9#;q[-j\9́їW-S*_[!0ZZÙkurGlފ׬3#+x)K䏸#⧍7!z2 O›NW)|`19NPmpdᢿy8BXPsPtc["껳:c])KelbrYdl~Ӷ, ֥MŽ8jyBHg#2j_WtjP;]0a 3|;G9bP 6:|Up 5@trHWKz#)/FRl ~,löJSɰtGx1pjK59%ƪnGb|TT;3Oɩ)oz]e6?cXk*S ˙,<)I٦#PΗ흶^ qj{K!.W熥N\6Pvi+U.m}czlTqѾxxJ*> ?Q3ޭ%%{v⤪3"Zh%SHxy:,̦ѧCҌؚ4(jS*ҎF]'YaNqU+i8;Xb礒w#ZagIѥ:kVWq ?`.c.-N{.XU;VcigmT>K#Ru4]R/3>,ئg:@3¨jF<K k|uN>2Vq&xaȹJ*Tm-Q ] #}]}.QT; NǓ)2YS+tέDUȷmyT ). V#V v굳Jdͱ\g2, +DztK,bJ:K객@rdy8C Q>d}xK7~; U +,`Ɛr2a!p8Dbl9xtl <~Wz;2)jz5*(:x-B?<}  B*Kl'pA+R=ϬWi'=&iO'vu~UDHʴUƝ|ĻH#9uf׼,@^">6z8i٧wXƹ*nBY,pKaoɆͥrO8Yթ;jK-߁z7slN)@L{e,{(Xs d瀡[Ql +&tx԰̈ =}9BypNvZHU)kvmAj|AR/nl-!wWxVYʲЧ ZKZ v&)d<7lTBN `bN]S!{ Y3%d4_鵝3# Ϝت^9gǛa :9ֹӅ(MjAmz9ݱۖ0?|`r nMWGكn%<<ӔU cv&_Ap޽c,C'e)1f A@apˆ8UYئ9_M>Jo#qNNzםxǙ. VH6p-I:6wHr&[b2hǦ%Xqnù4,xML[ChRZA 6t8`9Ϋmɲ'GXyO#va9YIX<؞]G,-ViYu29<,+[ʲl0;K)S$*7.hmK.*Nk9 d:|pg#'Xa/Y_,~&E_q%gr0>Gēǔ6/o* `?3l")X|F8[g@#o%(LjhuK0Jn*q8ޓeDXJǛ-_g>eispŷr_7>CyXNQ5Ij[9NKo ?F`b]}y XMh-9-zm,:N܀鑒}f!?tVzwCVlmߢBl{ŋ;KSԆ^(8qpGWu* (9.[ӰDQ1gudJe i ?z&T=О:v^,+UbQm6]"m , 7OT(OG*$yn,BT~f.pE:%ʧ ?+}`e!`ɟmCn> Yt FzW %D!~׮6@c4oM k:o*^~e%2fC>umCOh` \o*َsU1T;C!1B ;*OKK׶Y_Ӷ^?mUHVv؇ipXY/o%,j |8O4(++|m1zzy&AxN& Vr)]|G霛"jK2y ~n:T{ӫÒb9|Į?w{8"t⢒̯:P[6ZTe(N U > XZ9._yf RB$W38|4ߟvtRvh{Oso G|XjIf ÝUk-&@ hygܗcћv8akD::ݼ*y^0p׬0DÛv("WU@Һ뗝_gzׄi% !o\uL@V3n6ֺڽhP=S\Tp08qUHpGQ>%>Z<{AtFYpƜOIYZ\Uwr@J: 85YNpB[vqvPOI ǴC%o*żt0Fw4hV YN`Sf3>Z^6}pbf# ^k6JjĎ8̶pQ)errfչ^Roݶ:*_ٮZUSv:,8#o "(8`߾r`lWEUx49YaYP%s[٠"|˙ hg '1 X&+!zm8CWDMg uϞ_ j@+WvmtxޝBկNCĪSiM $@gX;vSQ 2n8t*`B}Fd >`7z+찥KS} P-搷nh# |d3$̉ijUV*`O,> bx7TښxYYu~h<?\N(;l=FT ЕzsYPD{>',Z1x7s TADe~1v4b4{5);,&oS|1LG9_D3G>ގ)մ 8Ӆ_Gg3_*c [\i";9yz۶.Bt{tt9D)( VnkˁՖr:uxeg*L̏zOAÌ:n[߻LQC;njfQv4 mmU%VZ?ɼx죰+;i(Z, bK9];7y(ӊDQa=TgS8ܩwMS|N5Gk]6σ#i+MyZ&㩬U:3ČcѽX~qgz-Źw\3{aoވιFD/(k1!urMSMۼ^`^QmtrʷU}@ى'ETs26d{{?؞n'T s|AǬį|l%9Z8:|<{IԜ@ٰCUƍ׳ax*/:Rk=Z|>X1'CW'7A' 8QMnA@`*>HfbKl\Fg WZv1<aŤa ly8;q:1/9 ~}ݤښˋ\ Hb3>y{ߺV ێPVQùzQL  qMfxݾ!J`L`+YlNnzs9nu+ t'p0>3:v w,еiuq漪Q$pP<z?&pe59pF{mc=SѲ9P`LJR| 5xv X8WT ;Oyhly1^:hGv NJԋXT]=xzu .7D %*dk*GW.;[w_壢ܺ,[Aj6(M戣)IdsK) /Nq^-ƤBTPW@p{ckU/\`X@'z*N H9u"0jNrx9N< JʐU!-$v܎\JCƵ0TBDQ6 *cܣ09%' ƔqwG-@U2V>ۡz6Ox&^-{9Bw 2K\l9%X逫eo.l鼬Mv1&eV9pmuNiޣ,(fNZ ^\SŜcAG P:=JkړCDʘZUd){4[39m]vA#SU0 dXe5pOl"슋u<ŻEvҾӾRDջى=AVKD> ^>,ȻO'WU=j,< >Ke3yJf+ \5y GܦNtS =WQG2ff ,b'(rȣc2hHTREV;h~?mOw[Cq<ę6jG>Ѱph=ﮌzP [:lo+ %dspQKTo2eȷN8Cɖ+SЂ=%=8glC DΪVU-smG l)"Ӫ3pp&*,'#h3^;TfC~yT^o*ScPv<8: PZd~ăr{ FP/(?o+VVI]mU@`l RlILs.S=G6Tb;A{]1B_hVLh "9:2]$j-hzh;4mJ5qNMb97k$%pMY8r*т<(l}܁S/2931tgP@%ۓ66l)=/_Dun1eU( lO'Xv4 Pv;W#K.,~b|3m!-]3ת((>T^ ^l*"\K5-x9qeZΕ**Tqzk=VŕG)diY'h4-s̶ j5؟@w>IjO`~'x6 ~e[\ۓ=6߰v}x՞-ʬW_wP+GJPPbʹ:59J[=wQ讶>])eE&v =tyj/֫978T>!*jNvcCbE5LٙY`ԝ2g:dy߬π UNe{@}_w\'.vI?}?3jGN?YŕJC rcF?ҍ+-+r_ٿ/io5>i~W?W?L?;:w_+旯{_Kol]xBz<IWǗ|?ov2oӓғ~z /hb%SV{@)&Ҟ&墚 n_5'|e!n"p/]XDAf#Co'2KכsN)ގ*eB*6+&2IWKR;qQIji'ۭ|]%p̥Z!0y o7_>y$ 8=Jqܼ^UU "4|v`VQ)O6]+gM\zƱn9CIǂ2㫓5[]>^#LZmq:,Ǽo1o?0B0_l' *tCɇn c+RXM؀+(XX#9v9Vh*0rpZQ Fbcs_P oR!|u'%[>]kmzԜWaydln+pԚqJ0tK8J~1QfZԻ,m͛ShB^9ʖt8{9WfF>Z4gAT8^ԉ="4+]Pb&St9~ew=Jˮpc1K),ە>:~.Dl|rQ!978p9BlfTYu.:eVoD kp[pĢVθθuzU |yɡ= c/͙ŲVP`:hSyEaO!vӂ9Ǒ4_| |k s*~4R9 :j>) -4|և# r˗6§ i4#56-8P =US<G{mTgVCV4Mauh6U͔nWwt[ey'VɆr^clypv=Mj;EEf\s0Y3{澪\*CF~8ZExXR9VNuv+7hF@0QKp_*Z`N#{bo9>9f4CT8MRnIΘޅv{uʢ~ޤGxsY:MK2 ~8)V tJ ]J&<-grٝVaMcSՑwh+ r4!êX7OՔ1KQ Jg0+a3~cF=rjC+^٬cgWtԡ}_ &)mM)NV"AIv®Ci';3<~RFLK>oVp2N=x[U Y;Q ?Sޡ𣲋2hC8|8Y䜉ǖ4KHkyv!bz;$/*: Ȱ(C<]-V^ί*HF_WpX}f-xQT)?m)dב"+P")O]aȘGn`K݆lI<iT;D*{0brWzMQg\ Ev$w0Mk2RjҚ|ٰ6p{A > :їbR6*ɳ̭NF/gpaY:Wl[fQ>Wg-%d'.UZsPB!bާ98Wm_uAɩ-Ap}d"}Ziֳ,'x6 ¥:?W3axYz`+XyGǡ6g$;U𳼸%| | 1;c$~#=y915,_`tE(H5ȱz>qW?Pa2YQu|M,GXQ595lQٛaUtvZut 2aϕe=D3>_\jz2=RlsZDZjN&.4:+6/wQ5UhܜǁKnz+=+ @g\ z=M,w$X @;]/+m/00g@a1h! <}3gr^쑻XEtL]yGZдұ3ޯ #Pys0lMq*oӅ,ф{ۛ뷿z;_E R%f9nGCT%* e9giPl,- p**8<~Mv4+ߗF`#kDe6.F Mcsbsvu sNQH oY{L~N2}^mv4ݖ87X:hm8 1+aՖ;#0j*llаUWf f+ G!ײ7'bU=zn/T6Dۆaߠy#%:a~wdSJXi]oVw*Je?6qWEpZ(Ap#a/(B:vc^ Dw& &;>Z;G9\YgMr!ZljD#p6yXïmt{p^VBݲ>xy;?:YuPM=e[!{}D.DU kV0i*r|  vvЅ;3 sjN lXa7V=E+PvծG~!-qF共JprB`m* 3Cyw&jaeu?bW #r F UyU||R[71g_L OӉm^SmWLdVF63Vԇ с]#=`JhV_K[#^dci<X,ð!;v(l,?O7V]g7۲ì񳔜f%bgUqV%cL08\N[iu&@1 l@|1u d "+; `X95ە3]?oíƙ¢WU_LĴ1fQsٖ$Vں|\^Ru9\W Ҳj%0!MoXZCa.OJMDSL'VI[I3uj#Wn59'n>9Ty bg5S7I(&VIɪ8Ix[|q΂oNM3/3^ ޵e WzK94,ӡ$V8N 6."QG8V30̓nBy.)9Z$Tm&03~N@Eno@g>B^-zpGC j /;+{:-N|$[q: J||l8qōA |lW`DߓފO)c^`F;AF#{b<n(^3a:f8<ʂOUP xĦeߒ!#<3 H*T}4@8xrʡg4>s&qdCNWS7`A{ OM֣R{bٷW\;^DG=` !9M;ʧ@Ik#k{L51gSPūqkC YF&(bϘUӟQLd[J8FdRp&V;Xl4BjpxZΥdv8wycj VJ$)CR x|@ xru-Jd[|OuS*`=sxP'k`BK8Na~2pcTg5S"aDRRO?5IϬ08xGeo)K %[J}IWԀeqݱx̼H "Xur]:cꭦCN+U;Qr<Tl^[v-.[[vY`we`Fur68 \u YAȖNq?]NaNvzPmgeRⳔ`zjtgukN1'QSLY|$~#Bv<ǯj }-U)n`isŒ}{~` N:)L@;(R BXrW@޾S+K?Ѭ#;:1'޼\j|%C-k9#`a NV:LxnKq,TQ}y-zPߎNZL֛n(0<) s[\g(ǰf*0kSwy\@{+z5@/xRXLyJk8ۚP]9]Ͱ*'8|15}zSv8Prx%"7!J?%!_b;{{d[56eՔH/VvpiVm8RV_ MXYԀhgբ0oڷNGÌe"+Ӕr{f|9劧yTPP]IX6A`il@Z3A{ E:\1" ;;rj9Y*{@pɒ&@}dRD (t_3.tM`M*J49!րBj1lg^ޖS"ݐo3ӺO6m 촶p \1& PެZƅ݈+NJĪ6>g5}ٶ#;p*k^$8kG Bw߽3bLڂ #Odx% x4z>ށuy-I ztaэ_^-pnIŁjD}I@%eGa㕝 ?+B=CRrL D1A¨h넁3RT߹X{1E$5ޖKdSx7qMyӥA@\$7&cWm`ΥaWM>O.a% X=+ ټ԰7lXв0R ԬbhoՉ iIeϋRh&0^fvyx1ɝuF~rkd:L?nH.L7`eQIek=M/9!ZqqEWq+;DVtU ?QJ?ٲ/f&$ɘw1!nSr2B?<;-u>1[,5Fa)oɫvJa>V7"4f^l&jJ(fyJ d^&(GjU1aCxw+pl~&BqFISZ^ FZIj;ΖԋAyӂrڹqZ/LTAMt(;0^J&>6 hKժNh}&eڹӷR2t0(N^ ě; mD{@mDŽz3l'mK4=VJAQbtG^崜E%A|֪ύb8 qYaZRT$v0[lha(ǯy8? ػ{oi8qvK3FtrC` {~Y&8ӡsGS:mbsUTN<r{thu7؟+1n9}7CGF.תm =8:j2u#+pz:VaA,Iđ9.v':α/X*.pNc.+'*ﺜ$\իoܳ*GDܼN'Т~,˽Z^2ˁ`AM(6"PL+f?y%}u ;5y{%f>7Ort9e^coC9ܲo삣$?\ qL4}ԖM9j{8'9Ꮳp /䄜ks-nmq\e.g\U[h)c2Mf/;彭g?'[@Mx {VNt<u2  ;=JJ9q5;c H{B >$K8sja~o^(g.e٪=qm(t'gL3I]Bg_?R g(8bMM,zl-wc U9ʑsMkٔo=7ɡcf5p\*V%c]N5[+ NQ]ŭhDoQ6_:0?,Ѧm}['`!jmEM惛'=pۏ 2%hR%~:Uѹ W -nkqf =LhLѫT3NZ0[msm\o8']E?0n1A6A >|2*mkHŀ/0(DL|s{^B(pٮJ 4uw8M遼ӻ\1op,= ;(.j9/,' zý*c/oVGW>Z5u6`l1 _MoE.<ȺJ~*PѬc EzO(=, Z͉Ỵ#͎v#yC# ~L6^:;rw[.[p&Up* GUyuy4k%6v@ݓH=ꤾV[˛$>(hHa5HuyyB5 oe;&!c1a}Ω ׎*^#*  4lFfv).GHo%/Ⰶ΋&p4@P=7O=tq.3xA f;'`?u@o& +3XyPLV$1gs+`;]HjKL{Y2ab=V~ 1{ao8BՁuI~;wGc=hxj+ԜD emMerBg j\"2$f$5~$lh%㕝\ KXTꄻO% ¬3 ћehppWcٲ 8_Ŷ14l] g+<]iP"^FlPw] U w#_NMQn4YwqNaj̃>@뀼ʛN~i|p*Z-6۩?ig m[#eIO)bPe%CL`xȂc(I 3 7L1Y.Dt[VPG AN:dQ/~^P*Zo{0rDiINJ3P, c/Q/Y_貸XjqԺ2׳!p8;Uj/مc4mx? -Rn Xq $8Y?oJN8Y>➩zmm b Į _IjaÆ/%6x."80&Tj1jҶ.o[^5֎\H^.4 5Pt;`8cjZKݶtĂWHײ״c#,147v݊cW~W;brl[˧ :,f l;icg# .sQ,!2 *׫C[$Ur 3Mut[%EvARFb,my;\[ jОJsFdmTEHQM(h[UnSj;G6O[,hzñ{5D_v)1>My@B o;v|g2΀^cy9[OyW~p7&Μ&;7V" nX-W~ 7-m8Fw<J@ѳz)\'^^ u!^śp'ꭓP{åm ?gf,2eM)0RURV> `yKÓs& b]OHt3*&sl&hkn22wkq98jSbq gQGr*'[x MN 3XuنQD (&uBKxkvc^({(-B4|²f.Ԩpa%0o*ŋ mfDoթ#` lmwRp ?e/')LrB|:Ջʳ*6]r@]}^þ'`'cA l3MSn>G`f*w։ Ng!2~Ā AxX<=7?mYp4ik[2Ҟ?VJ[m^ːUK%ͺUyt9lv "0Պ}8l͙MQ IPzyee *uEb@Z6skTUtуE]PLUQF UIێYo8dJAKdsYPv KBn,jvrD`e\]ak9Z"~[ vv32r n qHl5}$/6^G)U߶cMGw eJ{-HV{ ЊމR'DF7'ΣQڴۤ;r!NƖz `͢loPew—:>lrg+A–UoAPiFM;YE~GKL Svd6v رzKmSQVh{f$_z~On%iP4*? ,mէ Rռ1tdo``lnZW4qXg%Iq*0\iZձ $2qU;&7siu[g%8{'%ّd )4 cCl|yn!kOΫbijz5X`.~"^ R}-Ɲ%ڧcsIRZVpd<2S E]5"Z0ζ5m9v_`h^,nښfw8BtRJ6C Xȑ~03(贼+[_y)ny#  5.b M-EL:RJ0Q"5q3~*[0|/_W` g3>޸+ B=7%Ǫljq/>P1J<sh4Ζ;umfRy:X2[Y:1`pP4\ B@ кu1K@0=l@5ej_m㮺½> ]MywqZk([k@rd"stAxWa6pd{ޒGUZ~Tl3lzWW5NwHo5n W#?Nby;8>h.Em( R.Z鼝X**y@vs7fb81ײp$.TDz|2h喌Ќw1(Ih+Ⓥx E,TwƱTR$- Q+{,m6l7Q5lHx9K8b1Χ*a@L-99'uUV!KgƛVi~|w.gyv+3} ?rhYt,^3cքӯƨgc_D55oL1ȋ?Q]/o]@v2W+?ݥG >+A(3*^>z㛎sw oNz:4YNl]^[+R/\No'PB}y?G+;$e ~n(3 Hm~t n[Y$ޒ A rLtp~ WzJaL)֮pO9?NK$0rH|nwrUl;ߢuQ^q)U@)*@>-'$f~yY+J{ A?e]z:WQ7`H$@OXݢ"eRTyJ hJRz<s11T䞁o1248Ck0mZ:;q.` Lg;DU%(hʊK?^USR=7,[qa!9jdc=cR{cΎR\S47 [o0sOZq߰4#@9 -ܚ hctܴYpY ~8l YAtv된zhnˬ8)/m(f҇.6x+GUk' gXgB$U>:i{ocW@S!8~ۺ3ܝ8n(jwv矇k@j]i9ˆ=l}R-Nڻh`d௩*^˺?a'o} dq߱>;ʢGXS8#D˰5({;G8 a)2sD9@z,8`} %mg5uԀo˗v49;%t'˯M\MDņ\?wqxh~jXj†+?5K̄M߹~쥦}}!ka\%GcqlM)Z}j+o.N?cw&̂NP(¬j6+ Ǟһc{_g`U}ۑ{-#6|,5Iܷfd?99|j)dkvRɤTŹDW)•m2)+ԡh:6[~.b"V/u˖)y% ;+Ox:qam gUiv`GN[o|p;[wҔ&=ByWQn;Rɉ%?F݊{s[l YKSC ~_{. !<~ސVx꧄Wm5lq}V6/e\S h\;J[OGJ8 }y.iڗ<$M!E"Dަp^q+W̭-Þu5<r)@Opn; NzYRW9!fxUݵ@Z]R<+rq8^F!bUcR8[I3jш[d6u"ńHy b ǁڨWXΦފZ~q,ڲhqT£֩VQw*D~} @h귝*unЖuҟD!,|xͬvNIT嵻᜚GST??Nd)5Sga?Wwu>P4xmQ|0\\)Τ8i ::cSBC6zt4<#jigDbׅ _"+o]TBWjOoKF>%@AK"h zuL&KиcU]8kYG%\v$7ϱ\b3;䪻ʢ~EȽݞg/ATK$'8JdAL“eYŌkl{!+679ݒjo[a :+oy:j0Fz2`+jSW7]L]CuVoU6D$,\ Bd4OewP?Ȯ)ɭ6[ NiP\PY'[ 5w>VX2;eC#稜J*N'L*e~&GRE'h"*G͓/W~}G'i惘 ׶(^Wp+hh"//=*`ådl9mT B=Np؜MnRXӨyx*97Q0xg+ۆs;$Tq=v9\h{xFV:֓5zRp\PWn^6@ZSjD׮ GHj[m)d/\SxԣS F8Bvd%d?=]dV9]Q־V~4|`lznO xi"@ͧ ˏhO>Yzx5%ix *﨡Bw5ŕR`i)4ǡyՁFPladU*9u*$%%\d7"ry8$53깵|&s99%i:HVWkKNWݖ;ʗYrH6(N)O4.ޟ\_I1*$:$hizۯ)aS+&C^.eAHWv7>h1yG#؅YD>wi.}CsAǸ8ž4`(9wbA}cc#E hҺU Yr:?0";D&/5tYmT7qېB&mwJ;5Ml޶l;Rv9o\,]]xQ1jƜ-ie 'ޭl`!@3D菝AN܀-|9.+J}⥫A~Pޔ?ROD]l[֔YuSZ9C@G| /nמM}Ai0X=|??lⲫIz[f8&hyv< ]3l9de8lVul$Fnj ͎NrtUϤ˴f%iJJl1BQ6ġa(a= J-9\pl=_Z$ 9iPX,/ۆv 8Y%/k0lM#U?tjH_v$ -/J#%,V? OWd s^m劤5lZo;,,y4OKi"j9Ū]?o& 4zXJ 3+DՍ6MwC&&6IEOG,җ,'.<,O ?τwWR6)'m t٧vOHd1=})mmyYJ<Ƚi'%oFB#K;Ej$T`jpXW e5,RQKe*gM1,0I. /Z.0k+xc ZՁxV%f5-F l+j+;`6:F@RN"rˆf%?x` >-rm5[YGXɬ% grx9Flk'>x, <7ܤ' [=ɟҹ(X$(:1)JpX,ESlkj:!;i9.?.Й} +" [~reg탧]#~}bu\ܥ5=+ aQKs{*VAD%%OZIwtZ屾aZa 5 &KjT}NᐾO[AZz٥S}p44Jv|]=tπ{I0AJ|\ `SĢ"MSBN2@Ĉ@B3غpOGӄ!sbe@l&Uw_P_:f{lvP;z[[>VwỲ<ۻT3>* 2xHRIفjqn0a3 yz:ieR쯽}+ )0Hɾ Vwx ZJD~D[-.6WQd37@5Lb&wS7fle 3cgaY!s9)Z/SF3mIRR*f1u;n%^vqƴquP!P.ڷ:eFZ=6ii’=uN2m(35.ޔf%d޶Y~xB^N&&s$X ܉vyG|T+=bb\Ul#W)DRǙ-Tx$56^>}3׶ՠΩͤSΥtWEUs<Ħ;!Ѷ"ݗ|<}4 @f&@ W=zFlJ`+=beԳۉRbb0*)s$\ 3eKl @pKc`$h hwoPo_l1IQ'>A%ǫ4YpjT8z1.q)NfO@YzM z#}i>_gx\z&VoAAٯva<=5 D5 6m`]mmB&HCL> rU+3m#WLꑘP)d:X6VA2{4=7> Cr8I$  0s`| jZ5ʞIQť3H!Wk~ &zS;h+DWNxYds0`nc Jw=z-ZJl8aaA'se۾stGZarǞW\VI~Đ;k1ctGT X;?+!OαZյOy?uا16Vϼu36KzϱXZ-ۨj٥=$hOѧz>~5pUlvWzT5_;i*9,Qdm0Ob]7[J,Sa]ҢKM4{W- .MTl3MzJSby)Ћ%UJ=G" ]kSp4Sc9tFȺ3@_ʩw5I}U;jE8xрQO=  B}!d5򳥺ւ~DY`0G bpC8 qQhGxfjfzA {zPlTN& I#R2?Q&/ qT9EmR&-);,.T^GvUꔣ{iL9AeKߑzA@vhJm-֣FJLFiӮ(m6W˴fevj¬_cyUtˌ5ڞoPcޗV$7甏"98gRҖ`ϝXկqCA[zҼozxv3 }=\ K,RiǮv'Jt,\ -9Ҧ vC;ZׁnA!G(P?5*+ @R˥?s< Cq, s?#O³<挅g՞.2堓"[ӟMuPxH&Gy1mA>`}`+8NΊ$`Q3"M6PUrDZn"yTjnI[ ( Ҋbw췜!ŝ._mq qjR@ .N__ Q9U_v)H@'>Qm eҡddid*ey7^lE.h7L|y%>tCRF7Xwm _uW@z@ݯL赱4xZczcOk2Qy$*Bn=UlU֭|_y3rDc& 1tkJȆD `vt+>(uPeyӨZGWOoG fG ĢmChRtY"zd1xo_!*J?}?b$jqUY)YB%B `)L*,Vm\k+*Rob%S|/K7)9rh+v"{ O$O~>OUʔ偲m2MAiZ؉eQtٚYQA?|Pn!9EVP, hN􋽕'kf6Y=|0 A&7Vu(5EV*̲'@h)RqA!uJT_67ت@.l ]2f;.[+bgu%dYOӎL0|{ ]c*$+v/LRKJ+ꭢv jfkxm\\x.T1%-u=(KUzpYo;>-^ܐj74!:h(<ө3SB?!ǴO=B~ϵ~2/AL45?~W?\_//׿_/"ٻ[?2/"nq.n˟K!}? R? w(K4˟/o }\P]jߋQpÓQ'-_x8\WBk=ՌNj(6?`nO`jqX> 8E 3zF˧gMwRe*$p*_/JL!w5GoЫ 8 zi$W4Og_8(v xZ…Cnݾs;lk Њոv-?OEȪ`Ѝ,>,ԫo&/ ՙ(LÄ7NY֧f=: e~`c6T@?z >7yQUA5RKYwievGL/cl5jᐬ@[X mb:mgS/ndR:W W` (R" /dH7E1q2y|WM_~bX/ެxF|#R9|aqX̮{B=z/(ëp H'OzlySA`ϵۇiHW?n~|t fO_%QXdnn᫔{sӁ-<_Qt͚*X?L:?8BS2ukڱ~Œ˲uw:a| vs;ad^@URYSOnԹۨsr(e@^,T0|,K^7-Z\d<QF*Z:黏f 2[5_]wobw5|ip**BX\݊rG(ĿY"qxFXOxz/ˤqE8n*qk3k𙺬:o.{tWʭ@)q$cnLH'*e@#w?,DAUxDž9խM3Pv=IgeLR86 !kP%] Q:0<%MsKq<(+c, -MyMC<ܿ^d^փxlu%oG\ ӦMԠT֌A@Pk>+T]IJ_R=Q4-A{hdqnW8Z7}ӹLx3϶-=ld @8g12_V-D}b~19IOJ$x5p%];"ε!08Ng=HZЫ)q3!a4s)~T#k\n-qۢEQl-\G*VIE{wO k`8l|H#jz&?nu#є3[X9NexL<1.X9zI]C^b %D$vtxUz v_gfEB:r(QLoWnI-BDUz_vױe7Q|Ī399j=$GqGHD  D<+kOB\LݔFm ujۋȩ.;FI$q UQ}IkH7qX|TORL?`lC"j/*k(&:IT#ԉѦ6uT1k5: a\R:[ƺQ2^捔!Pѓ vB^&wU;>Vr)q{=%^3tk˱j(i:AJl&i,:X blM2\ipVɮ09A~D/]Z:j)8rIB?MOB+.u1{YѦX{ CfkۢKũ 8# vf$'P굔w%Tԡ[A(h6K .ӵ]6p 6o; $7/dE`~zY@g[xzY7 _ĪZk¥V]8<?yJ::Is]9ϡ_$$n*|1RMl0>^:m^@NhyI@32EU~}T&[!Fɭ)PQSQ'P=>}W^-ѭQ h k}iG?s: -X]_6-ٕo?u{/-F&am9P^nwUzS3mL(ؼ19 1)_@G` VNd!.k9ᐺ2f#dxjgU9"ˆϜhFY`';[߈.Gk+Vk̢J)3W8(aA)OGCӷu;wD\vNzIOGO`3 drMYyEGd58)D-Hh:yٓ#NVLjjp QmVYA)}i xFpt-n}zUM&&gPR|pMr\ҙtJy}$CAn SU?M:YS00bLGӔdVx<؁ׁ/E=Хnbʎc-ZΪD}˹۠<3}F7QHI:ѱ'EB2x۳HlQ &x|;Jj'r)v­xFrp>lG T*Pmk@g;bm!GR%s&sDXxm5At$hZo$ afEԭ>'m7y88;;dd@D`PtMzUb*pz^W:} i󼇽 ,AX3DGbZK9.z>7΂h㛕ن]c Θ=tJ E&J<|[r P67,w6Q7%!qz]|7kqz@%i/9:!V >GI1G~5ڙ4>FUe|˥~55WVZpV&EbԽ]DaC] D?._vq`.UvDgXh?jYE7 &y0@@tOcf_;O |S2f}-h)S8 3˙ Qp焿8T)v0<`zǙ=kpe @Zŗx GYm'%as]ӆ:3Y'*=ͪ%Ȟto{6 zњgl҉)󹋕k%HL[ǣuf-9iU+auΩ4: XZł W>0v !>]a#*PFQ4.{D! q˃x9bHi~~R'Fܾ˜RJe+P~_Դ3 Imt"Oŏmld=xe*6/'.r~OPoNplNpSٺP=Os@!}UU @Gh6s,X` /& (rJMoTbK TGirRrm5m%H=% q"%Ivj! ^ =~WVTmQ!է}lA`,XWF Ī-'fضFڧm4/(OX/MМ[ZVY] )VS}z/;i j] . Υ\°8[TR (޴"w Ъԁ|L:@KA lGy&KыWV\XUتD#GjzP #Jެyhp[H_ӕnۈmCh7>H$Lt)J]{FӜsM,@j>Y+mk,[2vTTb{4/s]nΠzQM( gjUk*Lii p~`u^Rjf1n<,Wdˎyňn?(!gA~]q]F-v)H䴔open*zrf*U%̏PGH*8iq~~{\y٢M & &6!Rn-r-+84O^nG*v&IV}eT=v_(bMڌ%M- !؆5l0lͭ>~zU?jdYlSe@sr潕j]{t"q-[Ȗ*A'rǡ'z mB==n32g漴hdAq`Y%~Hhu&IҨq}9Nu,c5:0Olrs \5I Lжf\QI3S{$;fL Hp1M`^|&;?^7%B$Fc&{rZ%=RΉ \}E~2lgRmjJP<`A)H79+[ *}4]v1]ؽ}vus _೻k?N˔j3 ^D(~چ/^=6ZuܚF?CK(#…R"h+ jy5H,G}FQer[eCc5riG ҔNédh5;)B4ܯ䅦$12.da *`lFu !rGGj^v]X Ac_% ]ߦr_bӸ^CŇaZ{wϜ m)62zwgQ-Ycv>5Ԏe$} Mnpt,Wr+~O!v[۶KdKz gI(b*u=?ێdžT"`(~4ֳq^eU,PW%aD66m2awHGzwilzI{PcH}{{٢fw-"pjIJx&x lt4]#:&4y6Ci8S//P&&fl'_o[` A0\0T,{O6ޭk=4MXWw"{0Dfc^6m|VQ7Oz$o;770\?߷266;x{c#Tc.7EzjFn͆.Hګ'KA ;kyd g{,S̼vyh,窧IK M=ulŸ$i\w Mo?mu=[ R_Wt 2)> 8ܿ^tD'i^,V09Ox]z`GXqt&4˳ۓ/"O%҆fB pIfuÚL;ܧXȨzœ~MdI \MXN]!q$K﭅ךm  f"|?cr^Mʶb ^)+><Y#sP풯scTֽmPJKqs{9w {%x@Zln÷wm>_ާz=@bnjt<_0#@ڈiVpS*龹LN-bUM졫\Yy5(oȾ -8 {5y-Yl孢hQ ; _ D7UF;9nHak;Uh}>GIS悋V5gbLfc}\6] (|ѹ-ɷӭV2`cPv$gt %v|5LrXZNh`dka`@#֝Zh>69-aОęVһL Wk6F#?:M`>AT _l}se3|D43r}sXR_.Z@RP>'Dg״-0U #f*fǩ(ifwK1tOrU(&i8WGx~) ={zLyXt9͔ T ;+qI\Ш.E#Vum~w})KJ8durax0_`Um*qGIi*SA^~* IM=}!mG#k?|neM4?%jk}4ϔ ]z{=~E`S8K4C~4lioT'թS$mWq0V_ID$Sf/*-'| z}AXV0;3~J laY}9&ay=Zj[ݶTDGBprη]f_yZEˎFkqG'~a#ϙ$y5\9DI:h}( .xc*e}V>3LNA_u pD7źvV\6+t[70^78(dʖa5_VQq<7i?5'ٯ#:~ANU΢Xw׻NESoImFi/ 9jh n++J*mY=åk1-kk SG0Khw=D"wNUi#Ñ~?P@`Cڹh>m$! KcWOgchěY(z bukXwk%r)Ӑzu%}f=*ê>$V ,Wblgh)i~J69Եyayoa{/%uEUVDU{g>^V^P=R{Z < c ɃWyٺX!(r}&}hwjњX,ڦ[ T'~]6#`oK%lj+.! rll|ONm~.+oWֲF1wIL?J=cat'"v- ,Y&,vhY?Jܿ);J忐JQQY=1nIln]]S>yAZc ]'(PiYK3@i-܊UA~=!O.9*/$NcRW3?nuX=H}HKֵc_ ](~Bsp[G&suDŽw[m-gwJAyycL*\3 Ƒ,Оfg\vk &0۩k;* p֕;c!΋W֯JqZ}M]+ AX'o*M夞sS=\q~i\2.֦ )t -J:80ʔl,{Y@|LF56AmmlBZ8T'?7y˚}v-)Us^ܸHnȮ|ߝ8jx^dKr>j{l<5 q׿prAfd69m, +&НU asn0]!ߗ.q񐬷Ief‹Mzk~"'֜'V_-܄n" /[_fKZvc3lzh\%A(֧"`gYN.tNT+tw}֜qէFEƇ]F'pҝV4/*Դ=z @F|`l whKau\k WԫT ;DrK[miȲ-gPu:R}͑)I_HOМ% K`/΃ЮOuOmp+]##Q˯@fY/*}v6Ti9 +rofC%qaA'zeVjUE ;ʃ묩 cˤ?*]էUZ=uDM\+#eD XCg,]@U >WVVU*q+T+)ޞ%m-41/OPŞx06WAs$/BhZ\{y5 :[G:'(x5ާFbUΚ!tfG$Uaԧlc]6(wkJ3 2,:νpnF!`~6؟Dg`jC|p@Hʑ\W m>$0繞G5l[!LH%@}܆J;9 kpɗl<8@\Bd/{GILfNnMw nnGzҩ٥mwvuq~fJV(iZӡf9Yٵ!¦m!6N'J,TŇK&[ mo5MW}Իx} 7|aiC$ SpzZXJM2[ރteeJv)E3%f$J?E@ZPV&ۢqRqٛθ3ェѾK'&>\j(dț=ڴ!sY K3[|\TZ8V)[seDǩf%S앫?&et ڳz<VF^ H#F2w R**4swx8R;MKW6LpYǴ9,'Տ XwXy_9p*@5' ng!G0UO/i /n" sJ?[gޝ/u\%R:I:LdG/99S6v.kdynspOvOn-=d-8XlX:zN/ (r!eyK%8k7JB5}&#_ +q|8X5/ [{`iZ}gڴT>F? H){ P4MAdW?QaD1VJA 2T8P* <8-_ }!A}[IPPX]t2lmG T1kVgpO% c@&3y1E-! Yu2gT㸧 9jǀSJZ0өxJ@[ŃH!JHBՃ*?Ď>WThjvڋDžzQO,ٓl*#Ro鄤QhuVW!ȡ}c X5qS ( @z9T+N<R>_ hH~!'6Xһ&vP~;0?; \?v9/+m3N#T a RzxЗs+WݟRݐieW(z"}鋭-I(@gww8IUEC!u<wIZDxy-SSM9T>?bi! h V& M @(Z9zN|n=3NڡNJftJpbiY%$7K*rk:E<<2;-#%o3} R>FyÄ^/C} \rU8Y*ю9<ޖUl-^[-)d{ГYֻZ Wu D1nYښ|zWC+jVp>%ۣ0Oq ^IVz5m]9M3jo2ށXA*giMG0mK`X }eJkSrkݪSvX}TH]SU?=VЇ6G\ɩN+Qh,'Bt]"y۪:R:EΥ8g*h ʀ4.V:j$It \qTdnҌQS3C@ _קt<^KԎjao 0 ipZ z['tUzoP uRj{;GՈ& רu,J>}p G|~A 4ۺزNx Cd hlGNi} B7~H*-:1}2DR n@46lV1-(ѰYV~ssܢf+(.$hab K~֌Fu @+]kAT}S~.@لKk$bnf7PN'A =x&BXt Uf1)jC0`G4=!bW^rŘd("p~7F|yj@WߐdŖZd+/D髳|؂c!vK)<󾑧@V~f[%Wh}uËIןZ}Â)Xw@f[;m% N v>v4„ ěOtzَR}R5(E}ez *pYk4H?HW׉{u/$SuD#?XWGcF5IS{lG$f~x=킼mȫtU;Qy .&*OdPxh?;_ t?'Gm׏v}qkC).>_ڗŭꕑ/@iްn5FZ,L{kMR)zh 2UЛ_!&w[2N >myxmҪ@ѹ!Rs237 ( +݀{\jy~oz(cQ2Xaup6͑,kSCm;ZPuXnJ!{ rA^NѶHt+>!] >*[>ꑐHI;ZG06(Og l<E \V^Rc(i;3dwQ @JƆcS ')f)wdD;ՆxWJϺ{fl6(a=}k2$%6fSClUul }jBrz#(ncVxtInLv֯h5ul5fAn~RurosRPZNJmw#*04Bw;g?*P+W.9(#s'u:Y`#la@?LmOXkwNp’I4SV=Y r_hC[ULP:-x|m|,Uҥ͵v{ү ,Q^S,{Nh:}DzR^-ݪP]Tf X3>O)I"U9N7bU]S=M,nۮgY50w6ؘ slp)2]JMcP뫧/ $KPOVkA'8^P:Iq#Iͫ#@$uVꪶ \;R=mՓ굀TEeJ"gFV{d]Jgn ܐG #NdN2¿c#&^HNQv#ͿyBHBS0 OZ/i;N_7@Di:/8//֪M[Zo{99jؖ|idR8C"҆Z)frḅ@lO!<ѬkGgɾdK11tJe%HҊdƩe ||4@:_tvy:Shænl쨏F 5ȶo]sb5eOxAm!7XƎyD#PNՒe}8,#(9|Z!JA|Vj^'k"TӌA3 RMP"cg>;Lաww5Zzpf);:D5%ްX'e¯B@T`vš84ud槙] |nH(+eDX<}ob| ~IPG n%N@??Ňկvu㷧9}[jJ{ $dSRz78lyz#fel$G%JBz-5t~(2TJvX yckNgF=Q[_e2c=o Xx_lBV  dP{O,FK.R= ʞ&[[hG740gA5̦? K F(<- AMNeg)df.P(7c Bپ#ys1x"%%D:0吏aw`mt-7A(/,\OZ~K(IP*nr19=C7]Y7rg _ %v螕3c+[{1[g6B'"֧d`[1M2ezRЗA\+Sl݆{L$ߪg8/(Giln**RvEha.u '9RYrvUGWQnGv8˃eNVv]d.{ӝPmw*PJzxؿ[$Y8- ^<Zr & '(U{a}Jl S0:G΢zNlJ3wvv|omױlTִTG-y!(^~/TR:KġKh1K:A$= AN:hxao/UG&w; =nWu*< I!k)Di`uwI{cxV.~pЄ(%gigU#) ˒f^)|Oi5 0sN$'Hx4Y8Q߿OA .^)uIy$@.nÁpGC\$b|هyN1ؙ|_6:mjaJXeZoXn> }7pZhfY*'#ࠉ-fzI @.Oj,op34š1vR6hyzi#luLwI5[c3U 3Qf"0YB[<\}>Es ;hnm_%|q.ߢ 'f3JF@߭%gF'jHp봮h kp|;qM]adyyR .3Spt~8 ?+n%:-/'5Ͳ;+$ %Cq^Vg0wEQuづ&;YAXR[I[:Gyemե*j ' <2_i-D5- PQHgRGӼ\>OՖCJk G:8AĖo U`~wrݳc]-;yo=hٹ z8-K$Uz#JT)H?_1שe%'1Pҭz!qc س?Ω!G{K p"{YTq=*<1!«v9R՝X`t|T&*Zؙ䫫*p ΂k$ ɉURFEX sSOߎŢ X=[B9QHݣ ϴY?'tZZc3J4}PM,3 8%Aޘw]0qG۟;\U GM)l5Ag䏲yT/ħ 嵴άq,MA%b`/P;?E Ba*O֙ز#PrfB;_ 9#fwOw0T἗il+yAMn(ɨ5TC & pt.8)a;6穀6p⨘3:uzY,b5'SLBV|bY߰åtSkʾGczøQ*Uk/Wu0J="1)j.Q+Ղc=Ja=_r/GRm#hkR >C#/pRU"َ ]P5=|ۧ\'4sf2?ؗ[NuԘYeҲi#0{: *;깼p&Wmt-4RZk=㒏ҹ]Éhii}7K7O1x vpj;YNJJ|V8X]旴H[VUڂU^mr_kO5[Ls˳1~rN'̕e軽(hl{1쫨pL}aMRLeX5jQ8Ixxڰy[QqZn>Ic\5~>g\-ȝsxoG[:hExeS.Wé/8c-M$VPYۤ*l9EMBcx8LJn?+5؟~>vkq2:|ڝ;U|[ޣûe^ZdN-:Ov>=3X(bEP/oc==ONO引AQgoUUXRz؍7X+G:޶Z1꤇[[4\rEryrI \<~ǣ'8 WrkhcN᫮BFգ3Eg;Y`KAtP κxJʑMQyOࢶs=(]GFFoۡhs-_5k}ݤ^Ƿ"<[돞\L~uwľ~x&Ϸ>Rˍ`ߨbڭV:?sweU煖s ؓz 8FjmI:Vc,F^Z-ݟ{ڇg۰:.[PUyT!~(MvшrOƼsY! ҞzS ,qK $%>6wwm]a~rx&[d{*%,CgCK+zc3ilɿ(:Mlt-BHqw{ `#s@\#g冧ma _4V?-|jсyJ2lzd=|S?Tos<0"\2X 6J9T1t^m|zf&Ë| Pxм3uFfje{xܕIxdKh&ꐲςr6}"<(idv^X>ޓ6X::NHJ5lUL-Yhb .7"{۶ >~u ʞiQUz⡵s6:7Y&]$EUe~bؙa`7vnϪ:+-.x  * q;-!^"qN$$k eBײem5KeY)U bmox`vpJfiQ'Gs&s07I,L0SpUI1b/-6⦝o!y4lw651nK翹layRTQ~dN^2K!i-YRreh}= qzj+LC^ k4 `kVwڠv;1f޸TLtK[/N5 a:mTJvI%.)J/{:%*M\d;}ȏ8J{-%:zG;#xG!yER86ӯaË+vҕfi29FxNc=/D6Oz"݂M`3Z]g 0H\Sl\PIw +w;>.`/.K{T!f:{xK{,x][kMpm ZC^^Uh1H_KųƶjH>0sɌi *)=; @[,(ٱ;f3?YRgɇ2rb?To%("^l*I$O`a,n 9 k5' J&23W"3[F uRS3\ )HvS9Ơ NG# کZc WhϵUL u?HbHX&{*\Hnx>]ETp]GU5Xae/v؆b#lgQu r\v^;@{y@<{ɒidQ#oN6 Eu,es_`.H\FZRy+>BXӡ5gjpSJ F7l!ׁBb亩6>05 @]gr>q(.d tN;̐@0a[D<*  J癁=(RJoMa 7GAU>ޣ37'tyoV='5]SݍY ".N ?;w0HzGlbw~a8){NԻա" H!;,t65.f\6 glU|`p8Al(϶7@ ,姎p꩓Ϣsc&|5tAoJNpgO7ɻ*-۟h>?˥ 뭕A Unr~?{],ͅ }]j?'zK x+ap<q\'XS>Tܩ(֞ JDyL˙缛3X鸀F(Gx5UlO,{; St|2z,G^5+&dE=ޠӄt,[͵7bS~.y8j(xu,ĺRE~{2OrVSgW4yHաU .5,*LZCl¶e%Q( X-ue'+sNf pN37lRnP pE_Oi;#A(@pՇTJR:^LSC!~ GA8 -(?ѹ&VjO_dS?$UeiYJDRMb-ĩcQ4bv7)$>܄?d`"ӖV[CP ő $u_ayQ3,<Nbd6M@@>3ݨ*V:K*3Ӭ}v":YJϣ+SyM4Y>V| rӌx̱<~2:A bu+KuCAc#y6 $wӷ˲4$c,ֲѡz*Ơ\v=?N|Qf=hu0td0@'tMUiqQ`e⥉%ήhJpXV΂[}>%}^2aNMoq3wzXvUIeseSK;hR I1.2un@":k+Y.fm|.!BGZT .@'$(;%u&4>dxш*{zo<;p,vŨ8剬A p=Z-.4:Lij5FaVkΔCMIgķݠ;> zM#[=]Cujpl,:5ml|tV&;\Kd.  ߴQveu3٪qjۓc6 GXX^kc7 'R1_=*H޺˖G/._wh>6#x٩UJުmWg5q%e>})Yo(%cM*gQQ|X[HRbkKr(;ܑWeX0P|;RZHtAgtFpt2JZA`w]0* P%\̣NEU&` 6W`}몲PK3#zkiu{G}Gm= ݏWhZt]掠m'W'cUd{6l!`t=ҡQ ޚ!z#[O#ǽ} *%Sj]S;$֖ TR~^ULkMҒ;8_ RAp'DoS ـv۠uѱTt}H,BSqm{65#KAd2U:⬪g[GW/肣^a˖l,Wf&>Eq7ܢ{/ٚ}lÅ"nZ_qBN>ᨤQL.<3!+>zhUgokl`KB*; V~XT 5,y;6)ID]_gn:+?0<@V)uc[ ]3g~YnAQPr=IᨕIui5@ 1+`.dCB7;W7S#kZ}^O&j7q.c$yt:l5qqyߺ:g/4{UcǰyM%\>ˠ8T~I L+f/xB7ܛuHL(K5%RUsڸp_,{|]ESfn]6|_=vHP`NG{C<@=O}- D6X1>T.՚VޱhZY@}yaca),Kif<9ΗO7`$OaZٯz_t'Ė $xbm . .AStVY%ݔyI+h]xYA vSǗr!+7 > +=SӣwTQ[ƢW>֫cDrQ26ڪ `G0B'ojM+*}ͼ hC}nzFAնYیJ~m1t-Y۔粓5AB]yVzGrr/`+T@ȻzB JErba)7:ݮȂneQssʳ։R6Pz6mUP_0E|5ؘmF u=6Ta}FE?~V{XJꎿq<1̈|9zOmQA 8|Tz`V2QƉpWaЭ W &NҖgzƟSzNch70OyקTm׆bZ=-f j~f' MgڊߚBve*]ܺ |@ ^%%F{ZU?As&eEW/[x uCc΁;Uީa۝QYvjv7y]nJU͖iL;etj7w:]U i;۵Xa&-oU 70GQ.7v,"*Q:G/2&u{S/Lמ)ZQN*/ 1t!oAM1])&6B;+ɲ !?<}rhskyȶKLUbNc:-_Q@>o-tXqΡIǤ#8b|G\Ɣ%=agٶ@#KQVk/w}4^*ViC7TmdNgUo`vԣuCe? !.dswU1-3h 25Uh.Z#o=,;e0 `ԇXatᒭv<ծ:j`Dq;#]2T@a)RkQ$Rndٝxd, mL΢F:+Chvs-:%zS֚GO)9߫-ّll3<3!_@U6C|8[)HG^j>j27 HĠiD^w"KI<Jn`rϳks0&IT|֝&}F jYZ<%`'+Zԭ! 4l,%;*fTO(gⰰKΆU]v=&ώxkũ"iRpΡN pvA^-u ?ZG%G:ۙ)Iy&#t볊-kؚeq:] 96V5tʀ{P:)`%Yw3U״ʶTGYJS@z` I9ڿpԗ:L@f3F㩰4XǝQ%or)` \7RyK\w)TK])$u 4Ԃ_?C ՟3__r"38cl>KC(IuR0Vζ渼hDGlC+BZN?ά76Κf!Wֱ"oҹRg3,\jPq=kx?ZyQUje 8T؞vlZyD-QzXcd /-{ rihvpz)צ$ܚn KA FۿFy\Y[h^G0K>cWYaƭ^C>:f>EW(FGQ2,3k&Œ5yW r-@=I*l}ADt"c&;򮏇\ZR șoyomt6FVYKq%D#Yqv<~7f~<ٜ;cj`+􄽫Jث.~A\^ JL?>LzU;0Bp VQ'wsު 4WRXb.mxq,oW3cxu#!>kF5w̞6zy)ߧ<^ҠW\ņ8"G1Aek:yotՓrqHwހI<8/=0:pVwN_3 e}HW? ɓa3pOkm룮Ih u^Mos=njN}Ij8.+?>с(7x-uf7z1kZo!´뼲E<50oRaXg{#Mt zX*mo$"Uui &+Zf,^ yOLH3A/%kARToNr]u>"lɵxZ'bӲ-IihOh.Z>'_OC\7x!'Pul I PFlGթH= s~ wyX^bgzC0G.  G#X=c*@P {vێ%X-)7P]DFZMT7eit4EqZu6Л,U[v=55{U|G)*I%kK+ "DDrZs$@$'!I/zHU=rWKe`.BML.zGO{D!ޏ%Ma'urۺ#&F*?’a' }uĢ?0~r@PeËp$IFl{w]zС`K5P {Q;ݬYxNDdmI ʠ9d7kGB%Kn(/ TYrJrosٞ:=究VK.Zl]n 4ֹ$4`v.PJx)Xp8l si{U=j:`V 1.mx_y(hkD|U6kptj 89H"OΫ2ij8b+LܗKe HwV<0T Y`NZb)G$^pF9(W!$E<~=emX=<,j=֫Ac:7%AR[aV/6jGYFqv#9LMpt:erpE++ר`I|-f=>ӪgU=EմF}t+v, (֬ 0'?hGҥo}uK/D@e -8}!כ0uw2ϋ5hE-[e_۴|^juThd/^uثkm.*eN|/Xvd&''w2ԑ.4ڗusGyj,GGvC^OtBٳ0xd/6T,!Gq"%i2hK9:̢+nۧ;J6٧aF!چǢ?ˊ]k> VRp6tl^cvA2ur١+nu(>xJiQQ)aU5ۆ/@S*?#q?ETL!{B԰nS-)fwx Nv7NmƂBX}He/YydN]mJ#&U ,Ck.]}j;X1j' ᶸWPi%n~TP|MFm`H&(H(g_h~#%DلP`68Y5͜ +u׫q-%oN<=37M!A#:fGɫ5W$ۊS`oaU>/0*zYՙ~Cs]EOY;KH@ﰠl}v\EFBNv8"׸yź'H,3alT֛CgYV_]yɼ'Én5rWEVE E><_ `N* Zz:nma<И,89$k ٳ|=v?} VvvzlrԹasx.ֻZ bBȃmwsgypO\Ν8&X!/j+g|B܇YxH" q]k mF>[MHji[񾁂_"89 \o>28N8 _x0\Du=hVe+32e1H9{:M+T >yMդXDt禦%2 XSҗG[O?pII^2OL>k .B Hq 2Y3cc4*&kUnqM⒞YyF鴒CL-G2_gK {%1v1J(S%MÚ;H}ygi$Ir%~_FءECCs@w csUȌȉDU }jfQe~,?x,Xg,ZMF 2iRj3QHgC [ D!@桛2d<>MN"L-c]H=Ai^&J^C{]AwnTH7iMáA3UB] 1؃omv5M6oQJvrnzZM|έMK3 fOF&wNU;0+4B[brV y{!~-lmXq.&9biZ%u'\v 4HPh$jF+Hc@^} 1=-TBuvEhCi/=е/QHw -VH &(" Э!7oAwȑ-΄'mA edQܵ8dڐh`wDN 8v,-s0 9by?$o׶eR!,B>JS=Y%yBZȕG߷+[k"76Dfs"jiȍh;d3>0 f('S\yv3S%kmdh ؓ+6 AƕޘD |AE *AythE!4QŹ:=b==}r!@^%kPZ\r5T&׭l_$itv(^m&$*yllz,9]u \p'b|"CGCsw@FtjF4= 5(-ޓY%92hݶk 7r#@r2dW3ѬANd&|׌<0QMYIrꎗIQz-ք (dhCCMrA{(AКlT%g6sD!E ]" ﳛ,1t2lێ\&YA$EKh0vDot/m2GS5z4 ǾQ iE `@m ݍYCyk %-W02W+@F4-Y3pm]&ܒUkZtdvt5 CTwnspeĒH肰|&Ë|(%m%XH t-d4tZ].J!8p44L2dу2>4⾅9[.k(Yudj1,k- w V=щhȖ01[zUD g:D$Qi tt+еk!; ;MMx1E}B]E M4!V4h'Ovo֚YrȖ׊&`d̶E}2Xk@G`}Knj7D;"HaEA~Ρ\K4}ΗX G&=p;h:H"&0Vms ՆpF Z"Z 韣Z:Pa-pw{*8,.53_;@nnO#WoP=4B@8ѥ'04;$Й79 0=v C4ڡSa*t 9*!G(x<#*2O(pA2R0!0jǜ≂ 4J0{ [ Eޞ)v  :+(ݵ4_ աvaFM)ZoCIcrAi P@F Xf;4ѯ 7t^k 2?Lj^#Em$WЗKrBA/(W7()F y'Gf P[,>c[lNaMl%t(ڒY'7GX}JӤ)%&K[E7m_='ore B?G!ʖ\h#Fys$_m%O%QW]_ -hJ:Cl r[߇"v4)iBa+dt~LM, i P;JM-M\paL7 Ղvh9(TӦh J%ۡgycdI7@& njҵQdwolQN$=<+pZ =ZBG*BKr_VYY Tf!jo5iȽ"8*J {2%@ypñl5aņ9W7oхDӃ"(8 1;|zo??l^4>|ͻ?=:۟ߟCg[CO3{I?ty>wEig.wDhiqC5O6{ztt~gDߟ?|Tӷwiq>ӷgOӷ?u]=twtQ?jۓG Ο8{p|m{rp{t6VZ(n('W<*X]o0C%-pklQoE,!!J&Q; "|@K }hdJ*:7ma i@znUh~:7QC}}n[PxjN@eѡ\e F1TZ.=ۡFTC'ZlAv_ (<%k 0tt.uL@,S1H\dtAZY a ;+!%zi* xN47hն-bi]H V{ ][RBl ^5ᖮ!L䖀h`t>Dڮ\>-\G6 SX$F9V4P92'8BnFU32V)m 4h贃I^(ͬ)QX^JO``:r_0@-mi¯N7;hL'fNh-ܣحF}ǖ\o;4P@gdP~ӛ4Fz~tVrkI99t :A.\Znr6{ϴ޵ -vfHw:䌡&wiZ=d, f$Mtqo5wլAwjA4v"PY{!/YmhzV=pZ"H<<NKB}~3FV `fG=hgP UE@+/7 fQ05.vSFi&@ll@(|)[(RpT"8l!ݠ::`K 'B- ='7r{Whek 8|W50rV0oZH޶e6|#%pRQ!j[Ї6PnȗJz-PIUMk$VaP W:1zH-4$q8xpKm-uMZ)"3&Рdwfns+!/Ah9Bjsԩ#C46 eH5 *7=䱣*ݎ8y4q7- ~`K=K[A%_!١{Z/Mvxl PNfG݅BGH%;\ ɮ jnlSoQ;n7hC( "ef8-]9xuWvlV8/l5h@ UȦyz|B@ˌ㢁BGؖF6==Cm@c}lw ]E$oY7j(4\]˽^B41w ih jO=u6^iz|Z"-:C{\r"ꡚA(׍ :ۺhlRot `vz 1ùܛ{h!2[S="usHƠ9nn .BjOymёS&LH|Ўp6(=sD7-Jw,} DTT4e2+UDC5[i, ])c?dZ{,GwӪYo #_ ȥ'(fۿ&nfh+ [͆Y@gנ=Khmf{Xr P:vө%L#Mp 7*]٘AՎ]46@ 9e:8-sĒk zR{b3!{\Qչi]i -AA pMm0xs%#Q++G_6=C؎n X7 BkFzg շx@;fEW&]뛙v T!HG;[.V{J<.5u97 AއtZP!H2=C nV)-׈B3F@fn.[/Q-kd$zFMN>$*=ҵ ΟѢ$AmP=uvE*@/(Fhhܜ~MN TfFǞ |t!@mCA9f>sEvZ[F f` S`>_=vMvbMfG)4AziֶGӬ:+1`ޯ\]1N/VY-*XdB}XLZҴ Bjtmzb:7dyFGڢkY?h kiDP.'Ma;hRC·2XiC2j贴DYf sBЍAPY@m"YL5PD$ 5L[ 4Z%Ņ?t;;4BEr1:[TP f &BN ?Y:zե=@+E>t Exc dKH9MU S82%>*)=_hԻӛ%44 %K9%~ѭP؂J>io r>Ph4ZShmo7 4IKW_@KO5{2Pׇp:Ȫb dg@6XS@>Z6l%]e}^kM߭ e|0Fz @U}AOyL3őn;]ѺEsEu3ۮ= e{5k ]p44!Ijnsdr(kцMӺڢjsZvXr:› pANخgV\ C{b(ȇڢ7 J.԰c D=j ='HR? fR(P5EҳAn#MxV_R!k+SڸXAQs=h bФhn8fD"!M=-!gXՀ%z &Ҽ …L\ِsܒ˱#A:TVlhpQ^#P4Άxak?Q$L rdXQwASBj?c%$;ǓBZkh}%|XyHHʷQGisgtrk̃hh<_YD9UlA +TtZ%bK^? df~%7G[j%#B^#Y@fiݒˉr2 ,g仵ݿ%B=Xuw@|!DqkP^E]zH!Whet=Ae*ћ 14C 0{zH y@$hu!9=\ eTt]/WJu^1>(ա9(FeQB{2Ci>M:!ۣm 4>Az\@YA_+0?bʐUh+hVcC`̡4POvx91-^cZ ! (u6K-}ЄX5"q A.oj4,ں:!# $_>C5C;-#Ggs(2mP^0'9Y5-:9IEѮQȣ .Q%ܒ{+=苧ф V\vi(G ݠs{l7=erp %LimM=D jBA`g?.zfYCJhEH>zgg`S9!6H;A%^(1NW+2VhMEkYBt^c 0ٯŐE$щNbk{t-T)04H AzJۡkZB[H0n] B{t6;zPDO1ZѐEne՗ MlM6fB BS浅.*nTOqf{ۂ6h@L} PA+1K{[Cj~d {ٞ1tȦ64{Bl(d4BM -=!kFGV$LгNC5!r `Lnp-ABnK#5n ڸ,fzEBŶUʒfTՈ$ =֖OWV ѵMK!ffYMibGNJ~td!@d5l].Ulg]1x}F$!S.H3tg_ģv9=` BnE7ɠW HS+KӲl6HޣT/ h6.LOXK橷-`iZ6tw]M}k-BAx3VnӃ'.\ Zhu@!ENr=цf9zovtJjBI%BM=EKzhsѰfV5n<%7 ȨB{oZz"5Pio!}ݮ綤~=F s[M+~~s(gZAgZn,P@ f?Ά fǯCoƋ@ !Hu/7{:D:>4..:r7%dPV.~j$@ftL..-K[{\YQ]9(qQs̯ۥgq<`RBp5p:hG(#O.튜B4vtiѶBр< DAinPg9]{g B-''fI:n! Aݜ=4{Hl(y6@K4zzv|e^:*'/C*9=fy-qB*2 umALו5:ABBa"Yy/ ]KQG;Mi#IG6cJ!oBƺ'% zr2dzsҠRA#ͷu RM&ZF(}٭{p!ɛ -9'l2D !(u4+j+C.Ruю 4!yaK dcPiyTЮi,DȉAjM. rP֭ :==%X@{hJאki AC5U@oe`(kf;hk@cieӊP&=6($rqCR5=zQvڵ}_б&tvJ0->4MiZ֘(3K@3Umd8h@h޶ л`H<^-H}TO tkiFcZ? swgzo=- *f}67HL#wO3^4ӫ.Ke?o؟F6wKŒ.Kx2o|/] ͖wNGLMwnu8֖k{e| ^sZO/foo꿸 7jowݖvV3tfH%)yĉw4 <|5_|W@+^ڕŘA;L%w*t3~XP1m0F^mQ<-6J셁 ̛/Z1N;{1zEr Kaz{Lvz3oqe: o\s̥5X-d!k+'xZ~gqz28ynQgt~ڋ~mpOwY7ƚ^IAC%n3poSd٬i܍|\wPjE7\´k$H(4'f5cK ZtKooVLZ8Nf[ybPg]Q>3700mȭJOKZҪmplH4vjܣ=8xsX҃-m-4vRk˶c?;n-,KtФw|jz?i;&y?x@] o3xwj+kftO Niue^ 7'?<ۏG'ھߟ?'B,߻_ri9Y->Oÿޟ~ }t?<~o7~30ݮOsw?}<=;?|w *⻧oO|OOO`_?}۟L+ڲ?||tN[t/tZ}Wwio?=~?O8 ~w8 zOπD?[oFw~a<}O>ݧ'4/<>?3]Tt^/~&#kSUf=\o=m:uF/2y>Gj ;םM|D|8zw5_vˏ'ppxE~S?7\ٿxuf;~z,.MױC 3}9,o|Wy:~x٤ͫoua֜V#,Mӧ~n<jq-|0X᝾йg?~VzlB3]{[{Ktx&?:xwxBۦoY޺OB&{|D5/'qOx V{^65љ1;>>?G2lVЅ͊'g1k=j~޽mkF:U#/ry gzy`Y:R=en`DYւw$`gaSV{.\:Nd-ܒwx{\yׯV_ˎk?|?|~GF@U~|v:^ۗnF?~>ȫM>{޽>{(mxrѷ~<_%#O 6 x?ixz>Y@bW?ݧO?KoJv`˯otC}~aLcjv%`Z>}I/`h98O?6[3/<9h}:|-+s7%)p )}iH' +$h}aRlO 9}l*'_O>䷸$"D_ؖc̶CL7y &)q"zS. :+[/wi.M+F_knzg_O_?M ψ3B:w5~'h}OrO3N䁖Ct/?}'(œ*ܿm~Oi^⛖v5v.[Pqe/ݫ7spN [֐b5Hfjoǧegb1_>?{[m@&qj|s7i |<pK?i7Iij_@q8<:2D GI} yr<0M==%"? 8/dK>Hǧ؟nSEGXNX=O??;Y|ϟf f% !}?S8C䥝ʦ@Ǫ_=???????????????????????????????????????????????????????_<w&ߍƇѽ͠~ ~ ~ s\7JWҴ^+Z&97`6J7Ij@w*vMRm'%i Zo.@3MSP\΍u|ar6+U]80;ݸ<;Ϲ83x0{Kњ3׍RqpJlW]vOn_hJn[ov7~ ~ ~ ~C6~kOQy.sҙSV쇙v{710~ 2bUDo7߹qHW*p2J+yxLh\q~|uwy扌A'q8w]>JwJ/%.7vn&u'~45i7=}aʏVӭg7ڏ] 0M&rrf7]2v3Νe9<NH!$-! 111^l#4:!$NI5߹NcCU%>yW͵;GjQ*ncc_`<ʸx6.I.l$ bCL +uaN\]eՎUު?+( H{@ ´D|ІSM:6fIX\w). {s/nPצ2D~2VX1 t7?_otې+Ϗorz-LV:Nu zњ=-&*֚A!F)i6S|&st4'63.ܸj???_ݜOE l#C4QΚѣFI Z+ozm&Ek:G_ȓDFTjcc3Y%St:j E"t Zu`޻5*-~3No~=59[9v;?nZr+UEZbkCZMI>Jb0R*Z)X%w^R8}']Bt^9`DR:YEV7q qAg)[ޱ'6{:4$6J/bO??55Ʀ V$766c`h{GwtidzϖM9Xr\zs.AoI_-%ɓ]H9GEcclx tScw#4[}ǼEiړsv?HO]:z/E޼Eocc_Q#wifmf+{8^UnE3! O'KCM]V=?e gM05[)i/bߑii7U\+߲߮q97o&.B11/dpoMx} vFP ?8XLl$[%Vb\^caօs2Ϗ?`'' > 0)>'-'k)wz'>xp,ɓAyhvr578ImىvpQP#H2MMBp&n)#RM`| oe4⤵^Ϭ< Sۛ$?`'Y) fb*B).o*MNOr/ ##*_/\0.~zI|SW[1ɓOr+a7tB,베Mt DW6$%ݤ0=I%[ތdtWɓjr񛕃:}SR9๒6L'O~311QFKF){aCbd*qR='NM 1yRԠⷃ Oⷋ鷀弧uh֌$?`X a@N|gTٴ@ &'s$7uI'lo6ⷁKLE{q2!P)X'$y ~ 9 7Qo:f/&'SƻrrS&]0[f'(.qMeح=k2'[~5tl/Sb2\E.}J۷MP:j?遛oⷴmkmځ7s!QVnbi|%L.NfBDWO&-͛~ɖ[17[koWo%K`ZMc)|311x`xA,ҹ/?.gQ T5'QtI2bR):!*-~C-a'.µɓdVϳNm~~ؕ~ ~ sh'[Vw *('+~˸܂R.6ݪ t*m$U`̈́qIrb8Co\ҙDL^$ H PWس7[/J䛉7-۾Is $ϭ%}@pJ\6" $ܮ'';]qRb7%d_T:9䱢=*ݰ1yM t؏o|#J.Sf?)Fo?H)8 dA'sS(%[8)y2zT=VGpQ`hξK͛a7-Mg1&:L [B-"ɜ o(IaaZ-O9BsMj]˿sFa]o7B lA4:0s+aڪ:s}ei)[?CnspoTn"P+[}W h߄Zf~^4O*n:*-CGdg֌ra??Nnugv4 O>%(n q[Mr4Uo+rQyIKM].~;;4^DUozaGd]h$;}JDo"Fv[]{8٥i4V7|LLٌm_k,}R9EV63w#z .ܥ כa7fVޕ(sjV+ȓ]%fM%OJ5 յKT9j[qm.,~o8[-ly5,r}97E>Vpmo K{ݔpJf-->靸$[^7 >dm9"iE:yRMfțkC۷]"tߝccD Oh@4KJ\fxT[jM*.ǖM(~K=WxMWv?2!].ɊD(uɀJ}Dɫ{̾u֊uy Ql)z)y Q檊#ɀ޺h"|NMi0xCEn-VN֒o)No|ٮ73o HEI\FoY;C fiⷴnRzn[?6HufwKIp*;d@o]EeçmobpGQ9n IA$<ɻr/~' c7)mM vK rXۯKrN:YGS7\\V. =Bϰއs ψ_$}“ȓ27mn F.kQdLܮ'=CI'oLm1*Gpc )|mTǗW6="b2m0O"'~w}[9Q Rdgs֜2EoI3Oo77_˂7uЉt ߠIFa7|.Wo#BɷB'O\R&ե7ב8Y˿ 9rW*>MMv7o'=ގLg 7cc/>Nz F&gΡ+}]2HHG Ґu焬TePo(~%W[ IT{>Itȵ}:+oT~ ~ ~4ΔFHLn<\.iu!w5(TZ]&Nڽo)yɮ9y#Or'{KnQ04V7ndBȓ֙LDp9u27 Nⶱ䛍JD[ O%4YW6h#jR[|;[ vԁKpZ7 ϳS"D9`D$Eti)\iDM7NM!N7lGN׫ϢͲB$V/~Jq,yR4չg(|`N &s$N^pݨv4J6F@Ml=e[6j7gzuI% m70\2L%)L<_~siz.B͊ueUn5 .H5<)R;/IigRڱ gy.J`x3\qW2=Wuղ\ &Oqvp :mM̤QzqڭP'N=Bh+ԾMھw7FGfը{q)o_| ۤl6{h _7 ExE VTCMCpq6lNȍo yi[I̒o\'u9u\Ffcc͵ ~QE3Csɣ_ R咜&gcc/n8wocz3O2'NP(dor-5:^%Nuiėk7'{ܒ7~e7K<%Q<`꓌3nstM}+>"ZaRpݩ@?}PGNm^ڷ+W["/ufCyyeLmc_‚I\?(GȓҤϳ˿n2m0 4#Z\s~h/l97vvIomOʊJFo'ges~68uY.w3]w~ <2V0Qȓ@B-2;FwQVeݓާHZ֔Ds^wG9G'tWxkk,d}޴|%k J3o9@*{g9ⷂwϵ{},n_2L%{pWJ-[z̏0< +\ չd7+r@OPe76b-%SC\9zio.﬍NcV̹@ɷJK{^7t8XrWGS̖l1y2պB';UK[|[ɓ8'C\_n',nsgQzCc/5xŨ"z$-|?}rWr|_9̿m12S&+ȎkPLr];$5EP&߲[ NIkŠ\"o>._vIWwMϦ{"k>| Mx)dhTyf.'mt2ԛ$l ŕ.H)X T 8Ck;T'UYY$L)370)up\ .:p0`Fғ"WiÆ-M{_YANR|0j G^ Wt~ġW-'U}Ip[LSw 6."F˦IM[M|O-od` 7`<rcMB8X<)jPy-]v]ҙ(x,IKC#RI*r0$$5("GL:OȚ)rN/`f\.LhuUz~ J!T=RpBLoy7ڷn,6sU= -.H#*7[fln3* \IQ\\ܖ4I bTRх JjȧxLWT=l$ z h$ QI}gGD*7Tܶ?7eQO+auNZ$}2d;jeKo6>߷ VY43 'ڛtlu(}OcLs[t($~sʓ+sKtM=+C5N|IK5g/P-./- 7`<r(}[2[|* X0-HuI+}Xi޿|Z`I`6s.ko<9=Wo߻1M 6E[L fqmi-nvq/pYkWq4qf˸ov\jrj7FPe=r^3V_/AL(vol9)m,@,(PUzn3Joz ~`n"2rU}Ƒ' %t[PLbyFWnmN $턘+Bɓ7LH̴&A m;þ;,W.yapo>s~ ~c{-u'Gz1q2f8b熣>|3y%O^j+:|>Z82Nmܰ;HakmN$t' V9d'ɓ9I!Τ T5Rmb7S֘ She)i#M\[7Ü' 5B <7_·ܭ=xFXq.5a M8em8:%NɣW{H/Oro1yr&ɐb7dhrH"zܾBRxV9vWأW2؉M9i3]sdAa..WfItggUSdRŘȻ0^m[fy{@Y(ثz o8V$:5؞sAR+f{K9M3 hV[`7{.|<ن=}oXŅVw[ogD"/+ WKɓ3RUK6Lw<Ѝ[/nc =ݖ%҈!X 's|T`9.MPE3B6~XqF@AG -{Y-GqhbVby|MzvTn=.aϴR44X͖Bl0Y{UQQdF U'kZAdBɇ25)QR&$7Jq~ESH4kB9s᥻ݍ_| kIf"uN1+FL|瀫`-":fj_gb!K5K +] &E/ɿX%ڶ͸8ˡ[vWJWy$l_,[ I|1igK+R,ͣmXr2-nb@c)əрd<׺ARz*M[e2rMÊKvS'tԿڡ8 h=SQZd(*Qp3( 7c̓/%=kf,MDpar6Eq2 t+8 1 7[&!G2grd|RMй Š8s;aY>incDCYt/ / 9=;{cJJUhjI|s`_[$Dض,x7uޞzᚩ*nMQ=}νc1Cx܃۸ hjKHA\%mP41eU@j, 6*-{I8'>}s8SLB{2ߜ 3.žx^H=Z' Ʒ M]ܔ.u:mb4pC\,M^RR' NsB' %ûWZkyz-'c+Z_1vZC]GL`'u"61Y?>IYV"ywOnنYq@w'-}P# D^#}P`8ξf0h&#&_W<_boٕܕ|-QL{c(B T^-&B:αr%3Mk<3f5Ֆ.`H_&&%P*F٩)&,\l-[ PI@.kF鵧 d;TtjZR|,3y_p^r&;p"ȗxi r\6']N:X+za5/|8 ũCte%GnZVټ[BT9}S|Zt>zgRnæ\ AtќY[2KFqw/j41za{4x-01M~<@՞=T)~jS*-3X7qraFgeVq g+;vc|ȓdTM$oUt%STT=!CK޺muDr"~s.ӌRqؽ6?hd"Gsd <߯3xRbpi (ʃ/i,'F5<+e[1ۼᰧWpAOOJ$ܪGg&"TЄI2RB`,HSCԇܘQrΘ`anH$hn$䔿l|m,gUyeʞ]52ɷQ2];MJtI<)>.v榥7}mѦLEgK[yJX Exؔm,G9xxI[템R'+{-&+%G IzN5J;\d20KLs6ڷL:6&lw<{M_ZIҤt,fƕ'Sˊ܃Mt=KsUKdjM~_Et9p)19yRw0M՗T~/ ;Z0'O@Gp7wLNzy_mY?%fv&8we4L,Oj)\{cx7oe $ߴ{+ ۓ'%m@Lڙ&OFfd$m u\$P~!5/;iqܯ(m߼`ȶ)[ɓ:~5o"Č \gE  {^ X.DZ)L4j@]Ln(qrKrfq3o]N5ޮs1)\ c -$FmR;*ળs"Ȑ:旃# <9JT'ul׼:#N.kE;먟X<" pe;D]^ WvWўsdWpXy$k?^2-35U72X&ߊF)u2p i/2r%7VE3єA2Xcpi^e˾o[B9Q'M<)Aư`qcd/t#tKlslf}f*buoN1a("T|Kn?*|~uVq[JۦzsIcbۍ kp^n?cH]jݮPKM9Wp Q,"JSt9sggyi{\Cɒ ꯾G96@PV4M5V3`ĆI6u\7F,0WA7)#~ +đ"tmM2&$~޹- 7Nی8y-9p>z‘K9s'q_%y|O@oy Γ'UÒʓ y2{ʮ4#׵]'}HyLkr*ę/1w\msRw} ؍bn&ON/ے-#MuN276n#8!HWMr=#J`mx[n,l|ڰU2erJ9˯В`}K8 }KlSX,=%BR'dk"i8iݖs>{P޸.cmǷ7U֫"I߷B=ea΅ ->']^}p@pw1\ W"uϳ@sܬ9㈔Pm }̓]'gg֣yүrG&Uvk,VAt&no)tS)K?mfkNSj}j7{$lCaq}7o}9n&!w N!h,P|NobU1(NfKsrD'% QR*#=bޠ%y.B)\ 1z˕K<'eϷZ̓lBtM&1|?5>`oȹ;t&̲q9j7^%}5etz4Ypv}gY[YTÇ#DGUP5s*TɋO^4'T%MN=7k,(Ͽ|@r`7z~c7YƟ'}櫨}<%N~VUnpiמ<$Iۧzo\YۙHTζP8:<[6fwf8AwSYUz[td{7Tb%4wmofpgXa;Gp3ȾDVoPSgJt|pěJ}ddB͆۠ c%N==rm5'J[:*<9vD'Ik\-§cܷKlQ ]N˜X<^Yr8N:RY4,Y2QhTkSS3n9BS[ӁiyGu{b|U'=sU0U!*st:ȟ4w93naML) d7[JT&fxC ? {nY) KX,oh(~˵'h5&2!) YdW!Oە,x<6u{g|mb:5J#fT`28JSDp\.nq=feCw~lrJbԩ@(Wֽ v,nD 7Ǫ'k|$5x}}͐ rV 7~j:G4K:"%oZqtsͥo7d+0,۴sָ`(8.ǿ*P}*E/xϒSbi\l)x'm_̩؂@2.]j@sA'ɺF{˶^>8HI nN@t2/N':Y0 RtcsȦ#eC7RFAVb: '̵o*tjt}Вvk=$ɷm, ,xF'5m:C'ms;cny̳3Ӯ+Rщ.:]C-' g7n*Vʬ /'o:%;{fQzC5?BpW 4If[b+0K>>bgk977\\ke9@sQtݥ:ukjXdZW ZEքKJ>!+TVi~s8-)Ðr~Sf[Bo|,|qYBG(LBZ2tQlC@ _Bn1J>$8y!:2 7|$w,TwPTȿ0ގS2zLEs 琝\\/>˾%30]ƀ%y2k#j[B|K{Y޸fN9dR$J0iF{_z{΢-D d=n.Y(/z7/t荡Lɕ Rnr ~גs#5Bɓ .wGюܲ\[?#7l}5[cS I/9U Q4􋛡t3b2cruencu_#NbqoiΕ%•( 4>:_Es1Rd/~C2R­:*W5pەI&̭ɃǷ&I*bܒFևwĩ-zwp"vM%ݮ :MԄuR$|Y220c zN9v L|Tv.ב< g%tpEa|lnb_dُsSXDDq`FuZA|/lV׵7Lɷ< 5V%O5$OUKʴ32dKu6'9Kɓ{?+rE抽K 8W7rɓī[F #K Ἰ .ֈK"&5ihյ-\0q75j{‘?wf\.c7+4UMJku4*G). K.K|pbOo݈5X5mm[6FIȶ!Dpg[7`ucT*`r5lVK{qju]HAƵ%&<ݠzYO UܪX /o.wn~}UAOAlg-2Me4t}2"e#vYP&8vXI#<% ,yRu%.R_'Oۖn^1veNF0-~=rcV*=IKGTi-PDᷜ(}<şgw=N^d|ۻ t؄vXIb!J̛-vz 6-=5ANnǯǡmBR}9tp5fL4.7aBQuj-e`>"nWE*l@so;8n|񛑄M~fɓ'$yrɷh |pppMz<<"Yt`n]/uvۧl 5h.Zٓ#) U1!zN61Z}yM4mx!2Dۤe}{uo5IwQҝf(ztݰ :w_moaӅٞeAџr*bpjnAtstƄR;JoޙTpv0oϹM(HX0.f[+ԜS#zK!fTF[7I[' 'itqA1ܶ  P.r?zȽuBw66w6g$)$C )CGKVEp:0vRniB>i.֭gǰMa9fy%@tg -Fq{8dG2ߌϿ%oYl.⃧0r9 @\3^_8LBL?; D.? f8UJ`RoLT)ns>’T Iɺbٖd =߂w6CٷR j*KWK, -D{Kq(bl わ G&b8$x_ye琢%WWkMƶ❏>d0 19*V%tZ|Gd**PI~W+ [%M0q -t\%c+35T0~(o&x#$+}HdևV@"qe7ᄐ>,owpoKgO:מ..m e8qbA8Fc\mMїF``x%MbX9(o!?6&Q$'TJlr]__8X .w΅Ո^a$OH\SEoˌt~ q2W͡8qdUD@_ڢwTfo=!%Oj_SN>'tDpDp@έo!]@{Pw58QVB|1qM^y$7:8nJ]S5_ؘyvP6> 6a (:M.@ͥoN\x~>D'ovŸ\-ȓڳz~2RaM%W#YT;- x26= *m&P^~-$T"ȷq )ܥ| 4IOaV ȹxoI;P<oaCx 8,[u.v$9Z. ,F*$HgQGZJ41S_e&eMX#TsvY9oNˍ>\ty/ӥrn>$Uq/өE6eƹ8Y\ 35HޤB'K6 vNu%R 01RLn"慊n})fᥘcej4g$@ɷVx۔di=+ŧaNJ풡r|`{ )/^o"{E4Xɷ )0ڈhrbIO4v ;#6d|׮sPGA2UVnj@Zf&)M9d̼D=J,&u*#Pvs1)YWʘ.ou`:oPLuY9W'Gm.58tj<5\%EN75p93hkGfNg[c 37=;VI-~d'DuF2-v/T 9[(qW 8[@o<mNA.u\nU)Xب\8e L_ѹJЛ ϡI1s^V'a[=Q t#g\?b>q*pHyfPn.KfIr8WY%rٷ<ŅkZ> 9Hwh'.lAbrs08llI=~F2IsPDpqQ)˲Α.dnRҐe8[' };Ӆuҭi7D/$f+~8ƞK1 $5QѩQjqӆ`@wDpoys O^˂#> zyoffj]{$^G>ynxsO (ou=~p;.vVjad"ʹN'5`ҌV:3N̸_0xHJb: *Q5,׆ -vm*V)ȓNPd-)yĒ?tqP]JF(/xl\ONȓQ2I72B֗1Fd{g}74jMT",oS&\S7 |m#)yqͣM1tJjP" K7j |I-C| II](}˺mr 3;'mܓ q2Fy&Q)\ ˳:74V3JW*rTDճovmUIu g7ghfg!Ӊpgmc: E݂69-pOEf+{QuѝBjB9$g6.K|m/R9 &?fKu-:phQ}cۀ@SʓID3öu&2z3BgdjZK?U ZWeBqjo4N ]F1e o^~c;8)c>7Z;N 8|08Dvʫ%shrXo2kXGuQ,6>%-o`ZrvUiN&d2%uBT饀r%IzwcN0,EJ3?gH׈`joҨ}s> d|xb+샍%K2I|,J;eɵ, LR%OK϶<%{_: {UrթnmǍ' u2srG[FbחH5CCZ%9`<3Kb_#OdNĞ3AxQ+Gz< 8U0U"}㷬:Ѳ m^@yrJ]3f 1Mq w pYh*p6Hv(Ą[=Z4 {#@dI`q8^ [nϸNd%T"z3Ro2v zHhB-[zLDMCMxo ѥ*cRbroiEmDL5oWKAX*L$CO|aړŊFC@ *gxbTfpA:%t3JXIWJ+4;UIt"Sõt?QJ;X~(c#VF0vHF /^vlarbg%(([!(?KfO;ճo1@DŽ'T,YvLz~+%NIs3R8dLX(꾸BZ)t­bE eDmuuX Jbv7Vɽe'qC }ق|NjG2"VdNdđLU-j]Un}udOc!^bg "w[7ҊY?g<}ɐ᝸fKx6NF%?J[HEE)vvL5 |gkc +eN3%5[zS%vc.*YY 9 QyUYS'S۰ F$ߘtT)9Kިf,h!Ӿ9߰wuo. r9g o}גo70 ul.O[S⸫ܔ| Z;_MT3٨:q2n8p2&A$ xk4Rmt]lxjB%Vrɀyi(:(Ozgrd5 N=*ļuj{;1(tn[_r.]qIl>o3 ~5W F94Km00kD6a#dW+*+9:z_oLgj1甓'M^'/vOcs)[4Dn;&OV$, {!mrosev2I-nX5i㠙Lje.i&D᛻7ߪF"9aOY~;r%.yܲ'ߜK2M^}.,.&)!L ` ]coo@UrB݅uD g5%iZz-%oFĥf(ϼY$?[_L9!ŔrVq] Y*:*OM$u&+0 o!xtY+%}p8.+`8g=' yJ݌%=!q5h}+K>,=nJU]E+n~9bL-OU5A8i,iҤ |l 4_trFh !g)eXM:@ʓf$ `ΤK'e0"͖F2bQX0&w֝mO*n;بb OI+s>'IɓXE.Zb8X݆hP.x>gsU?,b,EϮTڛw!7cTuy?K)?5+{@7Y"dM 4J?G`Q9f9~`4SdީnsỈe`e=xdHb9=~JY#vQ6^vV 1OQ \^(JTu$_4iR%c8xAw(#~SɵpiS])ohEe.09ZK}U{XF:\''G6+YsoU, z~w>Yۑ3oWnV{Ǥ&n␯q.`"<4P ͭl5O8_ ,1=`+7 T q;J{#*#e^p0΍9CsTCPVzRs֡ {Ppq{G3;y mdUE܆s8۵7 SϦ8z_}k=i} pKM9.&W Yf;qTI,VMK\%qљ.H/۵͐1>w䞝QoWϔɁp)RI{pOGH7qǓoJ1[I۩$=ʥwh.oUZ_1fJl+b #~\r! <[se' n)iz;*5s+jYА|KqtUgWZ,>:ńsS~# EIsMzɷ19q$XN'ܝ3]Uq2Z9`Ju%cX&)Ѕ=х?*l+~+jN=:'+wBWfC'-s&p7gԭ0*r k[t]HTn3z]d~]:*X$Y~86![ 'xS,=驓%X288^RU/J@F[o.5 2ey]%LBn<X*SOAqU k \xV U_$M'"/K+w͕: Nu#_J -|k%8c]i B>F7i*·" n& ݽ-gDFDިDornyfreꤑ.Lq5]4Pers@ϨVt>qzCc!xBi+d$gKTwX7bZ{4ӵ7wo:x%{b׿{2w>0ʧ`kWDo#7[r09iSZxBƐKYf)x2e-o1ݘ" %X.ȤKg&O6&@( ogҚ\=7 84*%Ea&MDRђ9gsޕ  @@./U.%eK{GIRNLnd2+fdY# T]0JnHf"#m͝'fڮ$_sV~D*}j?L7qfxKP$u?W)3u삥]T^sH_$uxUѶ8gǧߤ.Ag@c~ *iҝia 7.& !0$2噎o*CjRp_@=`%w)~ CvH\+];q=ۤrdd-N 20K˿E1؄El._ ?s97 )MP 'Ҫ;_#d${s7vSp'Ybz$W,aeb YC5j/S'/l 8dj'"F [tlvՃJ1Ryhdp&^-)X%g=S4ohL%8=Frt}9](νP[_o'#} dC&3wʸ^NyzgjIlϘ(| F k%pm0D~ eCFvb:&U譝I4ئRUcaϋ${9:r gW+2G=GtG딧%奼2yҗ<2 Le)8UMXKd_*N3YȒvs a т0*4c0"&޼DVAo5d[W 7GP9WZ7]>vw%:ɓnI%M زFDm}r(VC5DϧUg<%-xT_I\xyҚ䙺>=ki|ms9'Asdz7IOH\/4m xSv6lz +KoUB5 &%<.ҿM iݛEn2\I#苙gbl*3c ItM+R)$y;Gt=KߪE<7RD؍p`^5pۍ,<((!hlJQrX)O&ݕ͑'βN˹(aE|um5P\A)vAx%9c+Tbpg@|;&,^Ue)@[ݢ{j$~'8zZ-\8y^ƫdۯU jJ޶%|_Bp.Bk!&YcJ]NgREn(~铃k-T_0yg"< Z&<&d]G"9z+ W9c9Mɋ,7GS%"vW)NX16ػ'i9pMje[&( 4G9ǠTSiM"I'/R'10Lz*mH[}+_@WHLeUnLMώE&<xA;n'۷J';iHTueE7Br[b&6aUI"]3]Zǀ`p; 8 d"#qu cʴ[5:xnAv@vTr[z=Tmh3hkzr*o\ ` M={ yɗ$9?=O' ] nf>Y)ܓɂ7b ȭvt&de#]IRcIpⁱ7=0oS6cKmz,:7>>OI&ѭp[n)剶xb (Ǟ5[ϟeXzۜ'O"wͣ |8պ^U:1l=_x8fXO,%ljKhm1o3r4Io2(N$,xzcnv;dxJua1աZV P73; !*7Kx*Cotx{x܌C.=gj<~$F7&N.S IPN^*krh4J;Ц]Oo!(1 Pm&|S|?~)T,MaÏIfZ%PQ&.e5S2c3gmm]\Yz$M9!)qqT[^~ZN%j#s hC4鈓4ys+,~W4׺hoj)\}skIT.۱LICB1D 尒ⷔ@ye2Rw$|^pc\{>s@Y0@;߶M|tݞc|-)_p5 6|㰼n&LzsԔ8c7_͇tLdN>8ZJ9h.oINyk rDփ0($l"| f_2J%;U0aK3 'yqw+A4&)iR+q3.7Qv$Almɓ5I*J&2j5n>P]_ASI}ܩHq%M8S\nzU$Ͻ:6@׆2[]'Ҋ$s4X"rv+4K)&M)&&ͥ_6 toGd7'^]$NJ +rl$meOR!OVCR$Ԓ&X(m`+%zcz9l$O3:OY5dDXdU6xN3yMe;{Pm߫R#[PLI͈ ~+ol^$p M$ܣr#TP'ut# zKO[kYI|hH T j%6:%eo g dJ`Jkuנ]&-)`3q9QRf7q6.I%)'ֽzTO^GƋRso.ZzGKf^&]2鰣[e(8gͪ.-dFlNT4j޹Ob8K,S ڪ/%rK֠e-B7/7]l4E+]*9xS\ڜ )"N?K3%n/vIs6ʄY,"~c w!R7tHp;H۽.EUnh 20ܕîo`v;wv}$M/%O OeJ &+ZNJ/4ҥddP]>Xzb΁7 ap|oT4GDGjM8YkO$l"q2EpUW^,~o1s: {@M~3*uL}t#eX9>إDʳIMo4)qrJnHp5(¥R㴢pٴ̟*/9@)Do_2h:6EnSI얛*6IVn"BY[=.dW"4X Nq4Val=[q|& lүLnE\Wnֽ}Θʄ}-i8FvkIxW\*}mJ 2<5o[Ņ8Y&ҏ8yL[[»TItϳN&Sz]u)rK\wAhB%d-Ov'[G}X{#xB1K'9dIC^Ӟ֢ %ѿՕ QK“ZM^>H7gGo߹ ME6j2d[\Ra.Wd,e%M2vKIM"%G%/Fu([JyW.ŗKg8g^e? piI5b|[Mop*DS7$[ޜ.,dE|oV7Fp,#4wB]cJiFI6^hÂRC'˓iFXl,iE])ɧ_+t72^n'TFGq]25)Y\R6[*^݊d@oC{I/PHjSV2ݖ69ȼ9G$tKŌ!' gԕOzJ&DRxKV#ZvP' 1TEH_oוKFס#ud`oV"Q|!(>x]N+x Vo(o@&-pAHTaLbQ7 *4Ef|7͝"ԛ4bA'[Sʍ$r?K~n[jC훫Ǩf[5aez&oB>Ht!luIO1o>lEECc6I:Pb"cW}nw6QD+[́t98 RȭHN9uzSiRL'Xd[fM4~E+7{ˢRxIe)PoKNCo9|r>*[npjmsJZBY7\xB}}_&D- }i+]$s0KˆؽEdv4JxT%?.'} ɷҕ[ՉG2~nw[ͱI$M}=&oL2fI&Go6]xJ;q1Xnp"b4"fx'+i0$,E%Tw7sbt ¶G7Hꭺ)\׀z@%c6 d;x'M:sCY>U<$g7\`}藊/4-P>XOK8[ŽEfH0¥$vz+\,\5rzlw\anV%㷄`*[(*- á,wWozLT [3aaW:3a0J']CBP/a[W)LFG(@8McE<|L#$sM%i sS=CpnNk()|u "ݸ7!n&GoaU_7&M&7}f(+r |d4W9W7'%tSѧŋ0HwQ$w dgs4[Dmi6b69rs)vZ[Ip1V-M8lаaN`a]LYNfk(K8G!<3}V r~Jwq Ą1ЪBLЛH$Une7+|H0WD3)?VYJ[|몐Ma7ǀ%Htg}n8)25m|: iu:DΞ\Eb.=Z":[&;|Kغ+QԳi$Zv!Q 4) MFʛ+x.tq7ߐ|o7# Ўg{b\dlJd 71㕛?Eכ۽ ^HuRP&#-8"A7EB߳惩'MA,`[B.KB$T7_o۱Q5KS\ɉsL2^?^C7 UI?*8g/K\n:xK>&*|:AqەSyB f -hs$6cǶ)aciPmK[ <~nVOWuL<". i!}h]kn~ ifҊܥ7!R ]{Kw-@+͇ NUe yu#KGTEP#s|pMH9rJYOvbXٙ:‚UR3OLEC&C At4[$ۘ&[! ܲE(o8ݩSw<.hGݽ[RC҉Kj_r.o dh }4jl2ʷj`W|&Vy+td\9[w-;Ru!/HNwg%Zgm6]KF]K}k t ̴!<~^Ukߪfso6# i(_կ͸v ӆ19~h;!7}N@VKgkq)VHT8s6\K]U0J 1cmgrbhU  ȄSQ;&#M2nKۘҗۮljznX<'Ψ·N:s)Ro)?,`8Fx7]MI&ĞQHKT']@2ُ##w)]25\Ozjq;b=λ3M$H'DTr6o <pgt⭊jAGð\J7,'\,%VyFۤo3iUܿվXDG #.}0*uLG ܧ ƝJ[ѤPpۑ{֭I+Roh}< ٧"e8zPĊdde$J&&+ΰ}H!Qq }lXB`?-t\anV'Y6;qcb`1XOr ӑq(7$x3FM$7ҏm$եpyծR8 I\L|d-7TQܙ;}v#~#sj C!-[ć*.Rko(Vf4G#Klr2nEw}2\*$&sͿ]y$喈Rf?BZu4iv,җۃzFJH恖{At#ح~Ω&zo6P'}L4YkɃnI5P['' ?{\!9`qN'@4LZ^VYskſ9k쉋Kй1$)~;7痵ڵЍVsl~a^ߙgy=$D%}v,U{dL&F>oܶ+] Mtef͹g]& ҫ-Kv/C Jnp_[}v\5$XJTiL:K2cQSh#7;YQ|6y\DO9y "XϖRpmE/k1M oQF %`$lvrᗌ6]Pt8'%!ڭ0~*OF_AE{*Ә<՚S i%_o! ;N@:; " c[Ru}c7(bƈ'~eB$ބMQѨȘгKke9 RhϝA%voE.d4˚+[7U˽&(Si-ڋN~]RN!Ih㸭\v>yK_"W$\skq2ꔢ p'o,[ͭ55On3>wr@X9%z>b}F to"=c!C!ꭎOV93񱗉78p>f-({zPX"B͓&-x·fjWRh])<ɰ["f\-ha5Ir4T r2N1gh7uXxIo͕e%DJ%KAST&O݇~Ah|"t("g#vH2u^O1@+ɓ^x^ ud8|$JIf` C75CW)>t6T9qr|]J4M&% 7HrVIo=:#"4w5L$ \ei"72u2Km*#@ M[ƨȹKÎ Q ?HwVv|6@)~FƝe%u!I-j5­_)rD)LM|sRpdL{B]̼CӟNIeϢm-^퓗++M#ݤ;$2̏EP\.]&MaC$*gPiU4sɷ!'q>(v5"gX@~>֜53sd$ԙɷKFa;)*2u,`8]XDb{ސ3}>'1#~trذ'NM7̔&'zIخssq9n :QMpNf߾p[V~c-s x BJ0ߌo \{kF`y #}gpv~*O&: /탗8Z`+|*<@QggzJ?quLP\ȥnHɦ&}{3dh,7Kg}T`Y*si4i17is)7ixdEt&"S1Ҽo?֋ޕ`⤱6;*-_(ԲTn&ST: ߎ:ti"B훺-)7֪>v>FoHpǏRٗ֩6l.1dcTvL Kp'h ьhVm j .- -,4ocrnuJ&]pi-7岰K#_YF3[>?NbvI Mk#&oſ@E]t_mnC2UBXjxWҟ]O!ks63'?) fI^kM0J+x!CI6޵=I_g1K޼=}g㾬Y;O*"Q,NUm  Y$EITO,Ld"d .oRq LUl FnJNnFhJ\E.MfMӠ@Go{mWYQoIRǂQ;eROvst+$$Sd>neU8h>F+ $u3JJ#Nłm̹0$>,))9oD]~nd}}#_ow}:иJ߸R*hROx¢ʛoy/|bRygbul6ܳ2/yKn1tYoSgUm &(Sߓ7[/`lV|LqC%HLiaЍ!X޿ZT2*a7*5}XyDɔ ~=KT,9n݃`z&*8/'ty7;Ԋ)Y*?Ho~!zPHj6+(tW =SP 0R/LzY 5FuI3 ?+̦zE.'ީ*-XA0ցGd:-+O$n as1{m|]NS(MҦQT>o?NP|d YU 1x5t\tn}f[P!u/*fS5CoG LK>5S+8@+O1jDLc?3& 7C_fY#ra>JL1yKq7ɒq%2r3d7Ng y& B7[($t8'psy+ ! SB@xhD$9v!H=sxov%S() Jx126YU4ފxt |7/ޗc Reb25 m7cBVRVXHchTSA*}7S//UnY0U2r8āEMe-$ nu羟JY'F{N"ﻛg3|x&ֱo'5bt(MD2J4i*x3zԶ[AY"^Tʛ ѐEp@J̈́\0QȴzJ)X g$&^m8E9o: `# .~W'_IŠѷf@hܧm{MaaoZoTCl)h !, `*7ԃoOLR0vt6 ;;gt'^R}MPU)|^3ȿ:X XyK"Hs-F=mĊ m90EHqu~»7Rpғ\ o֝"${Vsh,-އcWў 3 L$ķ+BAQy%Ie!…ş=7|FA<Te/"{б7m RF$ `+1ڇ?xkjʅ/ҪjH&::Sv ŵ!@W [ %D<[ )ws@^M?]8&Y&K1I+2BN괷 na:F>!UIKՄ̵~o,X%,Zg6n/b>E* x5r3DfUL_^U xꍻM%$?"̔loIWg.F B*ubKlȢ*O=(ueS~efjt7,t!-L6'LI Jy=~|4^&-M1"o%86t31d4V.cҲt-|JJ2F.>wae^gRXHg֙o%e^kS,*J5NSzq[Mu3 BcԛC|Dbʥ!3:vjqEa.a^TJ7<`9`YࣥS])녪} CxjԬW fی9`/wUX$xR7Ŧq2ܖ6LRsV؃PtM7%ZPPi[tX#po_XKy#B ¸\?T| ܸuH.tr!:` 8<Fz2r}Ѭ(ey4sdѫZpό0$]p:,y2͕/3_2jRm!Ēw{gv8:tuǢ‽JT}$)+t*B_xaga9 Pt!T^C?Wv+U4ՃH**QxaIL%4#v. %#9,Y*sOҿ}FnAԌpf};:[ci۝]ה7Xi‚585繇6`M9mt{_%RiM %SƑ7"!.@71WhF%=qҊ .D;~nѸ&̏hDEC2z{FKDu?Y D0՛ :hy&QKZ`f$z0ɾ<&[JZq>&?qy\+Jf0 sXlE猴̳u mhĄ"&#=s9ؤͳ y©dBZ8 | pS-D5g},i\ĵނ`gq T)Jj{aB}8fU.~>Ԁ&&U1w 'c KB@)Np+Wۆ^"&pF,Ry%m,͜Q[oiЪrsxA||9g,2D  >tᷚ "t7i>ٕ IG~nsMbp*Vm˹318C*JFpezȠP o>$L@|hh=:ZaO9hPwsA5w%nBݿ U-{wQiΉ Dr̐'ug` 3ZX{TxDn&ŀ햾s_*eۚxTNA+t8.Aۄom^wc)-KhHj+7RwH̯A C+}ÎF5} /`6$N~7 abUhv28ޘG@ܥw%ub\ˢi8<6\ܙ:NF(KUABM.|uoQtc:r'dR(eR4nEmf^De`(m Ǫn=l7W 1p2id 0۟g~f+oޱۂp!F.p5H#}EQ~"L[midm+cR &7 IGi2܌ȑ8Ov#k":+VLx9JѢk)U\Kj2ުRgQBR$Ga %6TjvDB٭M~ݴJѰ ۛUǴ.Hb.y ZtR8޸A-.b\Μ3 tħr(ņQ%R$iЛ>1rS4o4oq|Jb92NІ*UM[nwh';#kk},iWŚ.xbIxK%t]o8ZOw tiX;$Zmz?k3ҵP_e:M03قΘhm4I>nmzr'yۍ t' g-Rxh[I%Jj 2rY U;+VhQ#JifMz1;=̈́!"뾠U5q uieݦ1\=LlsZ ߅:nG+oRH+7,MqΡdrYv]% yEP&Jѝ/* Q A WR[tFn5/ҦQ<'+5MUQWY\#7eE\)_H\W1w.Eft\w_.&(&zNv==YlhgMUņcL7kBGE?aJX6w )g]e%cJm!]eV]d{ͩ%?5J3YN (X[|F쇁@[BWFW,>okanU GX*B8ﻈ)7WX,]~. @_;g~RE7y%45[rb%n$N7}t;ɋ@t*Zib-͑R" ,+ի*I !sM%W:" u}zBi@&}o ex!es`žRG\3%$ Ph'?Gley~*uBp`c$}z%(.M"N3|n5ڷmF.s^RK$O q擏FSI~Xԧ.z׫"F;EH&@aآktƛətނ|7B<\F]T selފEY;֛EH Ld-8) CIt`nn/Q->AnnIȫqCN4C|;ȕܷ 0>a  SH8ք@t0Ņ(rLf;eAG7S4I^\I"`,g Nfa^Tqh,w$[Af&NU&qaY-&Jx% xe @(Sxga2 V컯Koe^V@B:ef ƿ H4I;/5wPF\5eAH{23U"J dMbZ2{xlc/*ޓ;X?pR'ߺ po0-)q+ZŮPڃÏJaT dQVP%VRB F;-LF,A)](}h'[" ] Yt /qЊY B9g8Fhz%Pp{wQm}3FX(sӛ#oOCqqUue9\ !ZqsW7(/W O3S"h5.BvqbY3g1MZo~꜡R1> ΁'LmQł+yhj2BzA1ʆ"~~ &3W>Lrnx%dR6wܡ?,$Pshfza.)a 3: 0|mN<'>U.(rEJ6L$ qW%&ⲄW )/ztֱ`2ڌ~"0 o8YxG%ߘD^B:dl~.r"eo}{T)LPSJ.խmJ.# W*Sy%HJ.(!"*S]1(h禫OtE92A`ʸ] iS~h|%~ϏujȆsɼH$pۺ?dۀ&oo Q-\ ]$_7v8+3eja䙌L7:-!ɍ^ʑmhLŀsGʖR7縎T<OBiL45T، &; %*a F:#M j pC1.7vSɨR.S:n38rH@; Tb<@톏FI=]V Cvjb~i&Th Giy1,qf>GKN Cwj# '%" PI$Nr.jŀEtRǷ(NʊJ{+ۍS(ZLdEs\,7βLW"j)a8/TLx A7 ;7ԕ*]a6FXv8m8$t#mhJ^.3s%jJJ$dURSЂ`F [tަ,*.yMBe\2:ՠ}:ua nvqb$(} 2 ?ɏ\#f;2^[ Q w#-O֛ҀYVrdn@hyy~ƘII,NY8!GIo(Iܛ⾡YZp'ʇӊC"¬:-!$MBTEjG=V:oz|P U?ql4ް;v$؊eбzۋ#iGԟ r[ےLyԭQ+?< M6P /޲Ġ+Y"/]m>FPz?Fg#I$Q&JeFfYsPA.e gIFbB(թm(¾Hσs*v pcn7DJEo¡inN IHz쒮r4Y%F]-2o%*y5 )<[s9e:0>BN~%RV\.`ʹl3؄ l8'T by*OZpBYV Wݞ'ÙMbFDx:9]M:Q_Bm#IIѸ@CBTSoĄ3D0 +[^"αMXVLlՕԦ9L4m7mG#(x.9_rr6* RYpjRn!c} .FwEF,0aR|ss`f 0\ϼUl0Q]K%dE[!7 ;:Oߍx̕VHۥ R7ނfQs)ӈ%6m;*ι[_K/)gTk"0yy~Xu' !ku-8!iXq2UYpΡuc3⡛WiD32$LVa6O|{5r;dpMI|ݮ\]F#VFrȬIMJᓈ]6*s >1_Ġ,'Ϫ֫,"[PqF&0yy~ ̄pbTW4/$?M7 ZpvEM*RVh ,:M*IKPV6`NH y 5Bd,@ ~TZ= K0yu0e-p_e}1w@;i\V>~AѫZV+*^]PqWEAیLIQSKBP<3 **h_le>?¸/4#Z$CTp՚N YpS3uW 4&GfZsCQ8KqIN sҫ72tF۸t,#HhyR<Ϸ7֨zdǻx. M >+sZb? o3 gz?ZOH'zb1%%+xCa~7hRvYz]Pb-Fh[3.QRI֛TlqT8Y$vu ;$ ;T9#1ނg8QWR7z>XrEc$x[8a}tz49Hy1W[xjV7i\ Yn}Pʄ|\ǩshkCޢ: LJЂ#Sr%HLlǒx5R7y\7_W9*Ś 碎*sߟ9 mcJ{WTPıiK$YX5zO$7;8ɚZ b>%Kʋ1)Bd2'Y_ x?E?8 SPNDmΈ[jDyU UUUE耩ra(ND--JTdVƢb;b zVs@<Ƙ>40ތ&I} jXYF%~vL&g .VIOrh5/DʲS`)K}0E9| .1}:iPy━y$ 9HƛzsrR.mEϗ%Gf; _q#xVEwR~,)g% y9r6LȦ3C ~eMӉ3_rD T+R\[oERg\xuBby.@0WpF6^]yRq* C{A̜ il Ysޘqܿ,2ij8g֋DRa7 ! ϢW=UcѥX9:xVp\.}%!p2JOt\ZSzfw⋝U`E 3^+ eEu_L3WUy(< -y 7tĿTZnx8G1Ϗqr  cW p\:ț&G]L$l{;4 Ay hLrma!s!tC+$xYD+3@(Д6E\%*eĆ(]jnk1,'S7/<\r?ƍKݮh;+玥OdP L,/YXm)c#be%ux9/!%A`2V|0ɭ5&G #htl*ڂLD^mzIъLWdEZ1xm)K.$}q`oJ紹խI=wxӁ7ٻbSM5pr҂0_wh1U~ ޷õEB6iR|܌ ":(= xE 7ڊBi"v=EV^URYtCv\led_j ҸqfAe}ܴYÁ^:I5. g?&KO]TN@(aj{VWaȭ#=p2Ӹ^GH*R][{$ZtJkנ$Ép2@V ӘnXJjfȆKY{:8SxѾϱ7.f Xoz4:&i4ׄfwE_n)n: +y9xCU'=҉k iRʏ5T)NrBJgﬓ Xn}*iI-JKhm7.Զc: hj}Ѱ/հ a w+JRRxJi4Y  $ᷙ7ߐy4wnJpb(pU6~ jq'3qՔ6 "c 41!Pr4~fbUEhl=9]IvTdomјpal2S0Q deBIJC)(oGx&2 b͗pR6ch'HDTiR jC)hD4RZlS,y |+ ,U#DnM3h{/R o}Ѹ0'S઄#C *ȃVRtR(%<#ToI&ݱεCJ/]*@D dzoh$JʽWxVP[%[@$[6ܳy 4 x|ѾG rA8Q4&P*NNYp®/M8C\wX(TՐ$?̡N1=%/X(=X Bhⲯ8@-CQz<^%oaEgp8v)Ӷ7I[.ԩTKpE|H:3q:1\m.osll0 yjX3i-*q|>xz*$UflڈP'J/Aqٸ`z jS%)UV[p2+e(}gvRX?Tca5Nƹ%3?!M_lyr8n#}Mk>Y) Ij2LD&0k8]N9!+G|3 &crNrHpB;6Xp]C-2:tkgVw96~k3Yc8.>:Ol&N>ߔeVeJ/RBęoA%oi*4$*+=NLJbp"dʬd\ו/'i>B($ʦ )ll(瀓b9c|l7)Q) ^EuؖL\a )CV,XwhQYϝJ)R8$Lʂ,dw 5JE Γc)p <AG5X 6?UhUfP("&c*&s ~H0;1'\LLJ*#x 0Yph-Bp/DSzSU2`Zp8+* `TI%]$"[pqnh<E k=ҩ:6~ .҂(@ݙBA8m;A:). DCcU +k]H4 f|a lϒs)'(U㌮mx" MɰTJ^`.mq%fxjG9UD|\ U4%FтS\?e5X i( lv̱lԽϣcXBk[N+xryEjɅ=@d)Vp,WTR.yIE;{kK"-<1ό*P:*SWȎ: cp#YSnܳJE&61vl<8p0ep*,5VTC$Xd\d Y7ca4 4}=}L9L&'Vd汯RryT5*9Lo3{ Ιl97[,Ȅハ?(s}t"gc NqL!8FhRC@8|%wx(FhHrʚs(a.|€E%7J]IABU*AݸBA}?ܘHhuT% x(1W|]@̜m(]5w)*A8B_$޷/li-  T+x=pϳDYOzAo"> PZ(tRWcԘJetotcqS9C|5R9ȮiJxsW0^ ͵o $gB}E(jX蒟ehy7a[.N+N|tc ژKG_dlȖ||,ՍoTeդ>w]%q:f: |La2e*OU.j+2PY!8-8ӹDY> 'wƷnLOS֜hUCr[v'KRaGXR%LP]>x{+| o+\ U[,8UrP(x (wH(=;6q d*2YtbyPRwfMȇf m4 u~Z(%푎Q^;DIZ'V m1 |7|l|l|WL9+B{̚{ ߰Rnh36u+I~GvƒF|Cd[ʂCu5E8g{&%pyl̋_l .(aLX'#a D2E͆ D`c/C/meVL'\y q2Ai`)rXW"\)b}٢u~ tD&u*Ԗ% 46 ,9uoU_G65 9B!4k,I% g*Fɏ;.yl|l|৖ WhU+\"tLOp 3vZP\8/H'm7G$GhՑ(O&Õz##Kh,iWz& KLK+f,4w/zMŖMs2Q<r\LچjK}>6X.Vr`W*ߝqIif˂?0s'?΢s&oJ[W̝qRT?UW]J |T+  s.st%@ξbw«4[hyh <ѮSA(+D7WC@'A8`ָL1ǶGn% Q&4Lv< xģ]gD)i:g:/ "pMTWmp/ޘ2< lWS@l3}ZhGSg7ÐfD`*8S:Jo1_WIߤJWlT\;pv ސPzt|l|l~S̼*ئ[ȍ /9 DG>`7V0b*nJqt=N\cؘ,}KL&a+ [/%U}TʛM(R*!龓}|l|l~S\ R*Oʖ-NqS9)JԀƍL!L tr.~|l|l|l7\@JDbEX-Yޱc'{\z;6>6>6~ku&S TD|N2W+J{|l|l|l4-:Ӷ\l02'҉7JJƪʢXsD։9/We/u x?g>6>6>6~čﴧrEPry'Rzoc3_rL˹zu[m-fYKLՅ߸rIA:K/k–0A\>kM&pWQ\.aU+u7mUN\.,:U^|pǒ)gbKh- x?g>6>6>6 Kp)VRFXrDXqo3? B*ær3ߪ6&~c,UTU/♏?l˹iL$* Q6>6>6~čE(!T`ЖK>g>6>6>6~̍- r%?g>6>6>6@S벋d"䚖oƉ~HQ'(S| |l|l|l7BX5 x|l|l|l4f[Nr/曯}l|l|l8DcBdoq 8ЖT3(-7,U^+[C}l|l|lXl94*s7V7Mu7GcccƇңkP}l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|l|Ƴx1n禝g1Z4mkM?bQ-q1K cccƷJmo٭6?]7Y_[c~y5fvڛٺbsmz^ǧ=69y}:lmͨ_YVN/ٵN.wy{v߸O>f}vs{?zxl_O&ᄎl>+ ;lqh٦;5vg{z6|Į^ goX'xjWv\G'iߜ='&=m϶3/>_m[&ZOGg'\hwzZfpt\ =>ttV}nvY9Iua Ik V5^&X#Zd\Oh}WG'|:W/ZSlKvЖrwVʝԨ 7Z2[=4^Fu>OgSXVWܾD'8fnP8;6ZX?4xuL.͞~jTAI4*$d-17f}{krHaxVl}syZM7WW?v#R goq7ۻLka+mw8|;)7V>u/xrJgq2^Aâ%Z6` WZuIaP6(8OmR8M-Ԃ]<}3n2:U-֝wí Ki&g)5js eLg]DqΉr,D;rcaw͔*$oU[x thBfeҌ6&ѻ8]YhBtxnFN`n}WH[}[AƇOUvI& l;[?FYmV o~'$5wt^S,szk ><rL+*gT.44\ƨw|y"0[ֻ[^wcrxjOb2ogV^ȾnŰg'+vwp NɛlpwKpLqkS+z/QPElh?.S:)noisjI}mvG6Q!WV96r h<8v3?.>?{9ۼҚzpfѰ-ܥ{bbGLw |u3L?.3YL~ogO+]gOG>Yeڳ&=x9U3a[q沔R;}hb^r8 (gA}QEi.;\NGd.Wֆqk&x`ǝE*$Ձc*wAd8;<$1evBfvo{WWg1<*tAҝ K1,_ ~lਪԵOGw\cSl?;!Fn|b'͞# @O~Zk{~}yi'x6ي¥ ʗI6r=j jv1ͮ_.vZnk;O|ڟWj՗-J. ]R3^ zin/wm}!pm<ʣ~xZrEC8B90c>Dlj;JY/vvRtwߴ?w^KVO68}}G<;,8n B[`왔|PnFv Z2yoJ9h1lI ~5aWR:>3sx,Va7cz- sLb66Wp_;t!E1)5:\qNxy(α}ʛCU\vCq۷/ z`Fիir5jguUi䛹{8y {(w{~Cmy|pA=t2yO{Iz)}j`7sz' &VeڹUUӭ}L,-;oQ} 0/Nw:3!90r}yErl`?]6__qV%0㕆-|$woww[]r~d4`TǨ0@H8n7veyZԨw@ҩ ~A%^`O:y >*'ft cuP!sn4C'sFwgV{ViYfb}l8NO9>ۛ[-wǚlgÔO.Kԍ͕B÷5Wk]考w١xL}4)gM:k2 'qX;lg_bQ(Ts@ `a@jIM l+0cwNz/c˦2ܗ} 3hhv{a¼ k5W9]qjp{{]=uOӪW WRzWi JN|cI*&,[] qRroqx=Xl7ʼnD99rg|oMVރ;FԲ7EINݐ>JDqQaDRoq}[w>ד}^IU7EiϛzFoofU& ?l%g50dtCԿ#|+^q=Be6ˇSq: QmBs[Zucmvr?wVM7xǝdx'pf 9IJ)~4aa*g5߿h mce8N!O/u"_e o~euz:.ʑ\X(7vQ֬51\: [/RJFtB;@2Kw)!kq]$܃-0~3T{zLAYyļ:Gً3F=T L6W5]npY~W= Iěe˓I^ "qs)7q:w_ٹy<8hvр+QwD=C']X4?Ng"Lʬu+\ ;fڟn>O%7Ua9 ~1A^J ܂?A] P/2M4m.#[{A  aFդ KM99 P!v y^0l8ƃ:NΓnfZFV`a<ZCۋ3w|ޓ-y§ %&o;[Ռbg™w7x;;.IAcC\HxH-*4X*K:m INj׻C0!W{DH}7>0SX47"^8{䛋347Vo=Cvәp8 c#Zv6r,*ɂ߬gUöz1wuA}|7DU5u=4Qi@:9D 1O =tO1tDIY_N WGC@Gť%:\WNݶ'_Yc3;XNN QX5z8KpY귵Vl֧ w :hvTM3[z,񓧓 tmo[0vTK fۇ8^ @@[zOXm?V+h_Bʇ<_y/aw&٤$ ֒CϜ"#J:0Tګ& pz^{wu;CP?]/1tfۿ/]qRY~j3"wr>@QA]^7{{-7OJc?_E@=O+-@?{f0=,v{YAA 7?# F  u[By+|n,ƨ]Ww9ޕߺ>_Sup.76z?ϾXIջ‰ݭ-ƮpV+~YaFY'>lݷ]"<'faB o1_& s>=xK`zլ!=fKnbڶ]!yZ-IVS:-O:{ bw7>5޵#,;!&yIN>j9.E~t=x`<ӓxD+ \YktǓАR}\Vx]7`䔮s.%T,p gMiF:o\77aLo,XʂPVPl)ƴ"k h W lD Vk ۖ-  Hj*v2J|ġ}^Qh2l-;˰hFdUзO6nQ/<}f f DQ a<_Z) X bbފU*Zދu'z'!I J#tS'=]k+r kGrx;[bwt1 }/ƴŘTP/)#/?2x =xb>}xZW:ax~y#~0($=ar0fRS4BKMr~ Yn\/أR=7a!$sxqX/VS`҈ۀJTa_-XA 2>F:mECS,R9{LUvoBy1 3]?4\pB'%գ /NڰJ>ߑwn8׼ӡ*&0t'b6b\D@)WQz!zvU+rI|˃G}(W-Br`-\n͎dZm&ͮ% mr~)x.bjj9:BW]P5\j܆4\Oo'HQJDS'NWl$!m:aXZInQfsZpDj 't|_#n/d^LfCج* C1k6ha ivNS7 _+t3 VZf͖g]5;9>/-tCQwA|2&'س>?}$ss '{+7냎#u({\$_{'8.t,Rd]n P@OaZDB_,+WJͳoKЙ+;߲owY_jL43U' [&?O GmfNRYRӢN7jw2hRTO{#4'w~{GZz LrяF'гI-&щzPK> |¾E;"NBQv%1Vrc\ؚZAz%3n pJWHt(M)}sR N7 f:et;!*̧zy'pfٿOLJkG.DoNLVḥʹט -LJܭEҝ?uvZi>i2j&U ݼnW0h lVKP ߂IÀ8=Xck/vɖ.-T  | Mzw9$3A^΅W8`=ō9u2Foy Ϩ9BB_ݾ L;#Us -> Y2`Ayjyi!'&b>5x3lO7W͖W`a5tNdeHP?'(cz29f|{d?ƒȐKMoȷ7jҙt&,F BgEq?Q'7/6D:ѫmۢ{}EpVs8 .UaHa#A2W>{~( )Ԓ9Ỻ؍{Bz򝯷v7[I"aӛv;AcL[ vZZy, [OU#>C)⣱4_YŪ+%D[':zȹ>zouQguϞ?ia;KIks[i2V?>H)-v2eGU _=}z3rS4wXɡFGm}l0TO:_Ɲ؝30mgZ2>ro FҞ7rp{uXC3hnưKQlB5 SWm핸'.5יŭgKoKzQ/.)KWxHYdv^)vRj[Mmq\!Ue=}e5NX pEJӺ⩤@ jkCR,$wO?eZ+5_j4'žG< Nu6v"`WmX7Iɘ'rE^V6 ь쬶=4"Izy2=|@} .C^Edy;.~  Cn(<=B"9 4T8otԡ쮇UT{`wT.?][Y쪞uiLD/ٜZvدH Ҩ5vzPJ(UBY5> OQL3QYFgkkL/^fqZŋ{ܪR[; oR hŒkMoYa9w2O]} O];z {o__ {7^ջ"2xx<(.ΞSJ ^clriۡeO}`d&e?)ѲQ8~HQ4,q(Kfy ēj%ol̅kOPÜSD^?K#sqyd(UM <7sh0NO5FC{xQ貳V뿴Fp쎷 |eZeӜDo \hJ.fY YO([zG 5rr^B)Iz7/<'e~>qޛ(tTvuvu_?ӹ qqn[ pFq i;>U_;|om;*&6b %Ii q풍ܸe}pbhbWU+gvuNi10T<1ڬg[ ْ,t5 X ]}z~J~q(p8l/CV/lcu\X-ݧ#i?_E}R&p М1R?QJ vGyM]VdR ]Ewz۱4aUIa–IS <;U+3q6P оhf+J@8[CXj=Jȭ1y1s.6>=*ïaϾ:(Y/Ǔڭ4\^r@_.0]lP=6Z 8Hot& ۈq}Bak W<").9 QOE$ w E#*m` vWg-_</ᬁQZzyl[fp) ݽƙN7DCz~֗E"eNڪc^aKfVSK{%QJwV)ҧU\Ȟ7%t~jOG):S*NͤYɼ/M$! W?5RDmo cz_s!ƞ>>Ĭ쎸?gbq97wT䝶h//}]cvt9xѼD 00Yx!n ^0kv-yͥO ˺P|s1\_, v+҅7'@2tLj5:ό]1H1@ךK0/8jOUI(e0r W x,r /z>EdsA;&¼M/}<ߛ_³I/VbBދgy9@2 [½Ka_%¿T&ؽ\wG?[ vh^" jVSN)ˠZ#!k >y" .!k`b%SR n;Jegkѣt@/dG dO=/x9vWӠ)Yb0_@*myAі9ݶ6ۃz1VSxXk2?uon0RFa4q9^'Y-\B(a1ZčtF.a\;WvܯȚNbۯΞh2U i2L~3rJ~Yur-$k`y-RY荐W.ٓbP|'H)΢=+ܖ 'z`^'4lz͋qN|OlAњHq>VG*^5'@GY\;u-\?ʴhQgy!3yuD ״wחBnMmG"1PL+jLOMuhN/ܞZV]\*h;܃Ό u'U(Je]-NY=S $8=k]- AZP \>#,E<n8ir2aZ߅5굻gN vomSNX8|cC(`Gkb*"brf! 3o0ߐ0u;ym+iRc;y6)HB @Y @toOpt{@Tw_؛w/i-Iĥ5&n$^Ƶ= vJ<9 r $rC݊ƻW Gzjא@@/{PAW _a7 <}i#Hx˵U@85g E-#n%V1F"+f7$[U^RZq!>68~R:eYvyهǡ EH[@@bm聡MA9އrZ'g~8 4hpkm)t7N,3r /7[>amgEk#ΓR]BAI󣬽ʃ,:*1歍#T#~D;%ZVmNa6 % |`F &L?G`*. YrY ы* -6Im<")IHL% 34vj` b\N&b'B(A>Źf=gWպ#<^m~:2>{ofxլ/rͫ:o7 @c_p}B?=]- {0GRr 8IH7hRɟ Sv1RH DÚIIp^=)$ ͫx+8Z%ߊ!wCC)6J+ %ÝbBT3VWѻg ]]'e6A$ $:kFv6cO)~a J^~*ී䒔;L\8sΞHIkfN?_3F/N%\Ǭ8+GfTv3 ޔk>'j;t]c/`ɂti9Gx+>A8U-e=B>W@TU6 ?#@7&V+;r6*.w{S|~X3m??RHi̱=VNAw_]`~LRP: ɤĬmkwfp'M98 ^ nm^oJGCW3xaڽY۩][tͤ_9Nvzc,cŖC9^ߓ~ǂ`{Ϸ}ڿffc~aM)_W-$s o7*W>?Lbo:lC^<Ã_m|M8d_EkmNFЋ/\@W0xtnf7p_/jvsFwo9r?O?@ՠ'~d6G|+r@N'ͦ)%}BgJQˆOzE3aojoQ" u$ϋ̸:>-@'!'qT ăR_I9_u~zov[="/yp kTڗr̾r?~Lm; = ߠ p(Ca2OO6}+܂_ tK+ !ɻgٜ~ v/ܜ{HB}y+/6˶,c ~1_xm/meKvFm<tVɎTIظS_B;Ɠo[޵@{I3w-_RKovCp[QoԼ4nϟdwbǛԿs+i 69ap{s^(b$ɸ\ !<;Sd/S:„[O9r: ͢٣vV#.oc۵=RZ89QMa/^%y2|e 2RBJOMdLP>2ܼ;e7<>"i>x9K=P O}y7duNq8x.W~3 _[]Ǩ*~ jTių;hٟ}@ } yoWUh:klosmcw }I^U&H&Hˉ%Ձ8j}RGdmɣ*#U%1U"PZ{h.//JA#޻_+_m7@NMӏq\̙_[sx=/~o>7%A'x"lx9 ^N1+d^H4O.^d1 n. tR>Wj3,q= WʡK6/C=7߶ a'/a;%ē)_s <0m1&ʃr8zҥxqsEB_ -Az;*p'1F<gX{DpLggnBOZVP" (oKC]_]d"K|:$۟ q f{? 0d`$kȬ}PTKtd;@g'Qci ZM6ΐ WE5 hq%+;U-_*ܱx/?_;yTB^3(^K/d:&pc>X=]c;$/lS8~;]>t'ɨ&r ya\1 h=]9#׾i6Rj ڻ]WytYD~ςlakHS.0N S;?n$S9t|PPXopD2bBvo\n]rv9nKYY2"׋ ?15Jl>_8}X,"G]t٩%2\:^LLCa9!HRH]} ~ؠ0cs~ +o÷X>jZ`yw.@CL2ۏOeqU`v]pZB\r1V 5'D&9JPL$ CWo\h@Wzr|,R7:`y=(wxqU2Cs #<JR{9es_ӡ;/+@&Jxqn,%b];FoS)GH^e@pPͶ-=8qnn̙sN,.`_ W~ "\G*2?BԛEoCźy6[x_,:Ũ>)G8~5nvF) !L(9. !_ !W AR[LY19.oW=3 \\¹RqYwsEKj|NվaT@^rg7[mw WԙL|G%ʶF)[Td>1 _G\=!lJ?շ{9zMUݲ;Q>j79!p> KxeP@V9tPڇE|^(;O??J4sխSC5$ߚzXRЩUQ R6d[;Bjb^n`W ʗ/4AG ːAhzS[؋O G'gc E/[G ֤x|&P m2% QeWWN-PG#Ԏvܥ.tec `[f`k8rXxC잠'5/ꄼ Y[۽-+c1CrE ^@ꁬ zq-YJh}/ڭV&Uq޿R< 9 z3,%NލJkJۍ묑 lֺtxԇY{M;ÂvG-p*KH92VTF vrYİҧaxxT ;t@xxTA95解QE!ǁ5o,Xw֐hY@XF`TJ,2e@/\G%"SpWEA'.H fQ*LxvXL=' in-‡,UӎHcF;ם9Wcw{-][Q8sLȬR=ۜnCVv6bf~J{ńFg4.˞q};czjt4ԟ-͌&S}+HNi!FKеVGm!pb2STzGօ ޓӺ_ĸQtOq2yGZZ 1ťqJ0FкFn |e];f+:2 0}NG <4 Ej8:€#Jrn( 7EJ"H2 S5lN5`x@ v#U]z%ݕ8վ( ;F!P=%q=$ Mțso5pHdaL.SU3΋Qe_1xSXCW{T0 ktvl #҃c߆ҊS c9Ys)<ū]n;/Nx4e8-U:`U~…bY1H,9`bds' gO]{eIu9k[.jW9P6d^߾r]͙ϣA0Q >e9:38}yf;05:_;yo3?ƼV&~ބ'99 b+Zऀ n/Kk"Ǘ%ja!T' LjjkR ["0S=3,ޥPu^i ` "Z&}U'/xw{a - 'u\e壂-u=+3]l %R0eVH&$Nl%r2tي7H Z\l]%~ 6gsQ~*409Z6Jr\+cnRvǍmTհ=L}Y-" Uᦠ=VAw:%ViyEAQ\AȩWZT ,D'wWL0/QCm`#`] 9䚸P4E 1B /YK5XZ$la+N 5yHlY D&6w**P:Nt.qe7`G'aw7Q{‰ "E Kt_D7WUG=f*瀳9+=H)/b *"v/clTǰ, dZNSv=wKz/z;6+}_;}p`+!c;vT];7ZLB ќahV\Wuo9A%Oy̶vᙣc8DgQdDtRګbonc7ЁEʦ[ԔMBz,^I Vwrz$'5fF@ D:T*yY FSq*>z Ss2  Ċr0#2 GDښϾ,k"ڕģ0ıB!T57N.{@^ȿ†2:;pWpֻ`zl*"pe8*(Hj%ъ&0nVʀ2E; PAH2Y.o'gy#VJ/i/+<֯p`Af,Q#lWooM5M op:2yDN:/g5;+FsG4yp⏧@E#&s Z y{Frx;<;;ר"q$8g5QyWio+on.17рAk'6~SlWk=M0IA vN#EM1Q'q~_:Z\&aeRi5t7&nt%[rbڒ )Wغ%JsWN84>TvOsVqH#LfӒ].Ld6=BQ=C=ࣇ1-IQRpJoޭ Y (t5#|/7j '|΂-(ΟaJqxU_T9VNNØu9ҕ9z UY/?_=FwwIfSѩæ3!tz1ixǡEХ_,½<@٭W5z̀z{ ACGS Jk}i).a ȣWnWBvpܳa5-G e>= *} Sx@4 KkdHV\^[r\JiL>B۹%c/闩MRLJ_'m#kVvޗFGL2|;'PXd+ ,=Dèl1e͖S@K(0bߣbLgfljq+1,XvY#'5fHG1l`4.s>7>Tn5՞v==|ab/%Gwb}t-X~YCU͖%Lo#5/)_Ҕ~PqMJ)Vͨz> ۑd<I A~{wqPP%1 S*:wO62x2K D PD=Jg:=KY -GKk= c;WHkа(CSv; ,[_03Ty ů}h [0.8- t^4'Vdk# G|?}(LmwcWEvt Q}`-cQxMgNDZg4蓟3Ɋ׎"^' *52zjpo0UnLqbz}2"22R+w=%1hb4}7O#8asL5|D7oo y [v.9{`eW_ lzu:=+>T">9) 2+v+7!p 6:%rEgXWv-*ܮk.]R|m{G.vf*T}?%ŦpPP~^wvP:@tJ<@W3&!Fg`OQ|`Ϟk50Mjs=EaEs ?|HF{GC!d1$dLw ;Vd*WHTꒁ•\!tÜdQZUZ8j]uzE.΋bb]y\FTX µSA {9kfj*aᥝVR B|k:5J* χɵZi{vE[_IhwP+PBtANN³N?܂ ۼzEێ(>qJx:+:ޥ*sUc+(. t.`OtH yo3[ߑ^ӓlo:€j}8e|lP$ᲲcXr'qGDP\+ !ҐqLxlu 2,Mh( @ZE=lkĠ5gC;d%-37;/Hra_ ]Bq"0Փ֕`jBR\ ^CeTvn#7^zyek:N_.p$nׇf4z&."czZVNULoC:lRK':cJN' BsJ@gwuBrސU l8ϒ={7V7 68J ͥu^iLbC+9V<- )asG8[oC + TI^%?$rHc@ O&Q`S x)ͫ9KNћvM]:岁wQxbל#JQe"?vdu c%F)wJO1k ֈ[K$.cTh!FxXqu|)"v븄3P{cP! |^lSz@=m7bU]ݗ!-'e=0{6Y?VԠܤgskUIWW7s|+(ҫHee== 53hh_SjC_໏%~)u:ɨ9Ǝ2]6[ @<Q4C L~!ܴquͲ++1#;1Fdעe (G}eTɥ<* W%$1bqqD)w,9L&43ʻd3|ٹ5.i1tN~ڿAW4B+rr5ChZ19 @uOk.+iBTt@="j+ 4`80vmsȗ8[*.ULUIdBX0ּB%5%pEP8xug EprTqw@!0;õdtc9L! Dsv}8G?PߵW?2_f9>j0v<;v.N<ў,Э3atz۾˲2qRum 2%U{sӽ prz`*ڟH.}- &&0ak z'c<+6#< '8bFҼ&a]MPvwG͸QzFy4FSn-ʵwPJ ,Ϭk(#'=2Ph\Tɡp<?pAÇ~A5:d5H~DkU: ToOnXUE[j42~%z}]SU,T2m Z@ks~rsTZ;") S %׳ Gez>u}2Lסo^EUIF./i #}ܥ5)A".%`|@)AB)y 夎{Hq`sfkM~F;DkJVINWѺS 3hs:טxWOAéUҊ>&R߁o}rVhxdt5`>CC#v%S2lN7B^veԻt}9_@Ӭ$l֫Ykd O)Pc80dO _srKΜAjG0}$PoUqA]D ;;<,rUvtw62ž|yͭ Sj$4TP'j Y5M D^bl,?%\ ~y} 2W5%<\2f)^11 nE*@WQYWWĽ\^fJ3뫤9R5Ԭ0U2^*qI8Cv#0±"IXutA@xc}:`(Ʉ)O.vo_ݑTNwhXYl378gE ф$WJwh0?6B?{lcu.l:NYB,UrW .8ܯ->*ٷZ¦qt;ry)㹛6Tsr)ǘ {+D~OPzPD(+jN |I' 8aWK`Uw Gӫi!֊& C0Bt9 R@l娣?I2CT=ewF!%i/P8\4c!Hڭ=@:w&P^ lu'8n #N?Zˀ{l|B A7j?Y|& Q I5}BC/ui`ևYy$*ڬ.Ixlo:0V AՍP{ 3gmNnbJx(?PI؅ϰ'򧠚睘Wt/{yg(d7}G 4jJ4) 7S̬qoξ f|}c7أoN({٪iI?sBrVGw9/Tb~EUtCz@^W'-eЙ5f8ϕe٥sz\md*)$Ūd^[Y=,}r&FA3B$eAQ$%eo)#9 e*&bn2h%G 7hFhY1aufL+ʩ8 ;ɮ#Z -3!aZtX! fvlVDnDBܚ# j9D1A~B+\tTK?16)&@W8 rrYL'@ s=[&C<%:+api hjkz9ab^N{ $9>\~THv)h;"H.XǠuF|h՚ !Wۿ}ǯ\h53xTJFv5 i5&$)j\%HH9+h٫O暜H6VΖ}KEP5QD nz-R6 >=e=rN:jZ^qWO}[FUi;M\e|/칧wSӜ 8 RƊޢr_U:GR4<`vK[Հ][]@ h6*9>XG17'Uc)`XPK 2x%_q*Q pS4\dW+ASr:T7#Wp-@A{P0Ⱦ1E+*.{/^f, ի٠7;3?'@w[">iSY,@5[=oI5-\S9wDy씱Gbej㜛'ONkZ7gNa>߃Յq68ՃuPL:^vB'&G__΍:!9t MEa'׷=1 .?G6EyM6x54X AkvJEiԚjm~ݾe0Q/[­!**D}?@]Z}"ӕ1B 8:O:" ޾sTW|ry xS^QlMؚ7G&4#ES2wHqVOSY ,9oqxx8}ǷF:.xXgOT=HֹC*A]ud@91wK7*6Ra] naj-wqT2 څRD=8mxʱw0aLHm+U G(^3 !*mN&QJPRAN[rl5z_Ā*\gf=j\he=galT E\=VY让QU; {[CMEjkc.:QSBE3 $´'|ŋz5CO?|e d~ N0.Q+RaEBы@9ׁ_4Zs2LbFeYޯ} յ׋%YM _'y΅\oFgcڟ|PA $ER@6MYi~W1ũ-"B#UZ52c+ F}?-^lHr*OdZU'#$ԖȳHSv.+Ϻ wiI\Vx+^eOތO1J*?0@0 C4-TjpQȴ<%’ 4~Բ+  w/ T7 G#a)Ȋ6-*+yzZh!Q+ٴ 玵h}G}戄PanH( ȅZW0MU kրclҊc/-j:^ZuˮuYF /pa͖r  fP^Y oיLe':ANPKXABe`礁njlh` u3-gCck rbs!rWQQqMŁb?)sFD'%X%K%nOG㳥DAS &5n e.0( փHkL/{FǬ3nޱc `Džtۜdp`p>]h:mq~Gw! ~ F5ȨYP-qn@LҗQ !O*@eZCY =8lϺ m^Բm8٥TIAZ]<5TKᩥ#&J'W5NP sK0Xv!L7[thRߊ[}h(U>9w'}+ګLvW؝ 뷺s@C>J %ɍ5-Y B+ d =\!N"q|GԉHqNMp9BM<.Vê Z{bi]ɒd4jTak*i=պh~J6`XbaG3Dl}#> zepb}Ti B0Xpǥ9/xi7_ё!FGƘq$Ӯ8E=F">Y1uFZ0-u S7[^qٞpZyL_ N)'5ep(7t]CA~~r~Iͅ~(dbDfr_ԧ("GTޠluyA% m1op&J+7Etфw +Ay?]nov{ q436&eV*]^UEgCͅ)*k.ZH$_67tK'9 PcJYtNu&3q5T K^/Zoh8+pR͡zͫ+iI"ĭ/{ l_%vڳC_].794"7lRrWbD>'ȁyx|hK0VmoT@:VU0PuYbwׅ+#.ꄢA*A3eI[qfW_BypsƂZ;ۋl5㪊C<؃qdJv# ~dzl\d9dBHn~_Q7ϭqJ~aѱ1d`c%VRduv!@z{pE :͏T(d6*%L~[3\p (TbA&Ȧh xd4o*RFzQ 68am0SJ>9

ZbþnT `{T0/+k)B ;sI{YCkSE,=ŽQ1eE:&sv?⺣* @q]{;.A~:~ z Tti]`}@' 4 ]IKM%?M'I;͟G}κ|Zg81%,cEؾ BM gvF ;,A7'1TpS`3%HII#J4wT+cJ7k`$9_>pmdVr ٙTADC.=ŌI%p~-sIu'!x&BkFj]7Gl"F/_gۿ~sƜgnC [jV@}rE?ovc CH[Z^CtpױY[}jw=Sᚿ- H vX/Ḓt5t4җ:p뉑yS7}jɤʁͶzũ:e߲ތ,yՠ}FuY㐮*ꋭ8B!q`խMU= Ծ/&pLr c+׳C: D抝KLB*^Ssv; Lɟث~֞sH(Ȓf ENްͥ_XE82|A#[?٣/}ZCx߆-eIji˟f3,bͦ8(»)n$AP{PcfT7qZ](}(<{%*SD˟ЃK\%. XՑ"z;noڭғ.pY]TrrdžkB:#D.@:NJ]xadܻ!Ù,k5 l &L+36Q蠗k Ɇjs:,,r5S ͌~6gsùsfZ.RH B#Jc>rYhSK,:=ذgkH1Q3@/edZ@,vFa(ޖYhl2xU 0ӆ[\V `;Xɉ< *9yUG .4QqBQ/ J7Qbeʜ%жi9(/そM3䚵vUӼXSf%;u xL|uE \D6֭ɌKqK\5WYO > D% 96% 2uo*b)&=m-)Bik2ZhuS9{9Dh#J5b =3R1'O>zo^^i1AA7 #;ϻv"KvTĜv8=(+gUq='FY_TQ (~7x+;욭23.GPARES*A&Ԅt*]:BBOF34XxBJ`k zpU622:q\OF5,x$I68͑EmucmlEQ6MzOujŅ*::GۃTC>gTɦ9yT)Ïd/b)`SjxTkDa*01^vK 0 k\Ya吻`ѹ+I+)'Dv`*֯L%?˚_" }o{mu2dIt_?{!ӿOhn:Bo4£.'0v]nlLb}*?MvML/[gvK3cw`̜wC/=IoS91=V4NU<&Z$&ttl,4({R_A7K),T騪re:IuY(A1z[Ur"|aח $0C*"v:B!xH&|%vDfƪE3U`{yTĀ Ś8z0& *lUOhQ4x)K;9c7/[7[PT.㜉%_nbd`z YtML*\_*)W8v40Ûȷ]1C< \(o B Q6͔mʙJLA Mhi8"BʰG94f 蹂,L{JiWSo1"OmU|XwqF7.6'K.Kew~%Y);hH:IWPS;NgnQyQ^JvU\t-k…yDĜ,L@1 ힲV\ƕƷ4)=<6M|9X̂ +9=Sl[ΝЧ}&^:Aw:6'PC|Rf>QcWLaN>9;|[Wn(A0 ]X-' Ƭv~?Cע}P]sByc~z4$JƿZ+f%,SEcK ֖K8E1QϬkǛf|gS _!KX$lDsʤF\#^yû_\n#Z6IWżi'X^ ydOGUc l?w; jp!{g 4 grPcO'JH,)J@ҲVb)L24i(x{,[I}ohڵV/atIک+~DVp#3&F$I5G7"(%8+m:~?<#2;BI9n9\ j)Kxōo22VVAh:)۠1=5BPFoszChAF`  Fϱ&݂8LFQv/oFbIJ/EԐpu F0ۢ_垐efyQZK^c[J'a׳ZbI 3 H%aqḂ;o|}nhvK['>SL+ "SWdiC!q=,橪T`w9jJrY),V/VHtE^'*na7;$ξ#>H;%J(]{U=,! =1qAt_%l24"Nd&82212GFFQS`g1rk^["ANkM4NX_`x_; QB crVr-=cԽdV%X.Wno@W~D 1D*TN㲊̂rݶDeG$ԏѡ$~TAF LT'_̀)rV)Xv`Od$SמSBxb~ahDFYO~W>9|"1?Er,I@.<U+/q /s?Dmx =#]΁4 c5MO-a @L }]e17i0ͲM}a$[q{Շ?^Mr$Q'XVoZL8 ms,+ %ũ7+@X]s&]=)G.hOjzZLWS[g[I1ŗw.;$Ϸϟ_)+xb/7Bn/+bl^_رX\6[%i)4|cg{FpB];/уH *r|sŒU_F"{^z0W!ׯ:/jY˱ZVzղ֫#V 80 7o_L20a\x~U CnT\]oPLsN>1( 1nHpvgt2VU/Vao=Be)ytP7RJ᜗0ۆ! E>I9Rޔpɹ&ôž_/$=\a ;tF,5uv7ЃʶP~aw..dQ㻰rl&uYH m$>pԹ:R}z:c"DuJ+Hk~fBXѠߗ¬>sޞFN) 'TsyReXn oսF}3Xqh.?؍3$?nZdh/|b nfvvAסӟE DPO}FL'7R:hqЧEeIvN Nܾ_r" %qfڛ•V++USᐕ_؎b_/xTY4&I<u=U &d==^<Bу|jDGpĎLdGǦ;%W`YEԫ;u}y }8f)([ye k~BaMZNjn$\Y@X+;xn镏3'P?cHad/Jqjv0CR(٘3Φ'"`ѥIYG5-0+J2< OwXN362kpJaCX L9O\- ^kŭ<䂨69f!,)AWi/R!Sf y `T*}8LgOeK|zH}{GĝqƗ]^||"t}Xvq? P䰅 Xl'1^dv.뼋 dO8{'%5C1ԬƽD9)ŋ?mȁ+w%y%7 Q=ed = FvR{َNWġ!J B,܁z$xzз=cwfuEڑM:_aAI ffqn*LlR1Yxۼz4@|}eoC)`\ b5)qZe"f^s$!<Ƕ)\yضY7Oc9C3gi|%R# ~".k^F6 RAȆ @] lw bkaDBM=ցM[I Զuyr >K.`&{Qp.]d.cQD.AB uB*5CȑKW=)8j)2Hl@skwu:.7]]t4AMXRm>LdP1|CC^u G'aRi tu\d,*$<&b&(/rӄrUɘY/j䭸țf#&ڴ'"w9v3t9H{T!hJWgR24?u֭Z6/#pTJ?|$S 0ҨR@PT{>ѹ?U?~~y5Z_)? 5>W0A,V?U{~9Be]ǿ|l{EOf 52~FU/mgN8/>~O~3drW+ǟ~l;UN3a7KSy8&n"`+^W~+˨w _qK~L ~3uwǟؓeN+F/:poUܲOsyu>~ؿoI~#=52|gp(C/4 /|p savί@}$YbCbλ?|ΛJg33Y]MHgu 00*Oq|tIah~J̓ipDQD7bPuuU ܽ[,v(8ӀwGUl|ع=dr%аwTCJvP-R aP~h糧G(2nBlc㳐>~B-R&W /ǧtm(kQ`Fya~AلQG0|1!^f=xv'g`1ufōUPX9cz? } c߮]D_%¥wWl~' rX[ ~,=ʾ-?kmi_ k΂Ͼk;_Hf[Džih G'|f'3rj!;k2ᄃ S`삨}wT*zDJնE:N٣^\ie_NV29f>a 95xr賺46`蛾(^Kˏm^;C 6w;8@F3.-b'lб^d鲅dVluuW$S/\!Eݽ7_zGnbns6sN J *vTO"^̾.ndYvӞX!& ʱ䨿ڱ+'I.V&Z/vgaIv- ܬ|pN9LtC8WwWkpۯVnNσ}aϱicIFg99`[rwQҪ35 )5a8B5خze|>J#w:YV^nd C={q~_1pklں(ۯǻ4=fq5T>YF7@y}9PWٍFUvUV^|2#Ȟ{iݧ[PtK-Y]K]jDS3G"^CLۍ2!OQtȾ.VQ/LzOíU+銋}*@|Dl?a扥ׂ@/}"8s~uݍ-3'0J/{mdz9&@ p.bcHXdSj\a̷^E;ګY5Ŧ;Au$T)s_6 (R^G(Yt%ޙӕQP I&L\/􃧗S*y˧nl֗lHn^Glf9edymĎ'N]cZl-$j)x6ǐ!sHBaWHtX^'%a~$wN?LPrDJTڴU%B UOfBϊhFr&*F]gCG̿ "NN"O rE'}@~IMܥ9Tz̼r"M&rp!fOV VKz\`PCx(ʓf-uLZ9+kV&G6m;ybOYM14?jV-͋1Iz hTj>;:(3U"A;*Uߣ!yYa5ON訒7 p7RjRܯĶM͏l|.ʿA}}"ycΆ/w!ee<7v0 eioTHNuZSfVV\QG +|/EF+yss%%YR∬|qǯ]y!$3C!BK[֗O> g6ѳF<:>M IP7fQl̀?H̟)ski6zS'˃&嶱DjB\2F]"\Be_r<㺌I b1zH\+]'?$;QO2v_ -4^)NvE)جm{!1!~N5qYPlaRb|ÃU#O=c+uiɦS֞&m`*aݷIҵysZ(_;"r+*"Kj<N7_jiܮ #H7F5Tnv#`:F2+aOat]̧ ҆BVZ;4o?`vkVV/ VR)\rvQóFBM(@@1Mpi7\ϞĹ񉞵z,]yDӳH=-w]>N;08&սUpf#Vdog+rJXg+W(9}Mp{,'Tf+YJth ʼLfOIbܒwI7{-Wb5wRBho8FqF wb~#'~]E/54 mj^%ILbjeD }Z|e+/GVpW`Ռci3ESVI+|<:ƕІǵ"\|Fq?uC.Ș=2lo;L9񂥛+T a934`?,NAza9ܖOS$C5+CV4NM#20F^e~|sB ov7^S0'XnoKF 3p;ov |cyD2VZI6RQ%@CHɁ3^v-S瑟q=jd(gkƖp_a3V^KPnsɫ}m# "LA<Ŀ!R*_sdUd(ǀ.θɥ tw} tuèxO)l1wYsgi$vRtdBA\ZNL,KĐF._;t;uىZrxa۸"&v{j,/:0)ǯ}>5ja[wA"$ saBvB/5Ȏ vPch8^P9SLIr7?DOC!&!dt AZDF~A_1Pxc~RvG :IZ#B$9n٩oA `.=pVwhdfTɋ8`B J[#<='%+FYF5V 87CWLx=()룞]Jsuynڰ fsK8]JwK"/,n:C@ ^i6Rizd[Wg/u1uY%/Rg̫ q^}ռ;^ut h$ k3i & C*f T_{1ҚD0,k*VduPxh\۱_۵wkwm.ז.14KYD~܆SLM@|I0w3F_1W;r@„8 dՎljP !B6Ҟfyk/0* TugvTbkV]al?O>xڷ%"ms~OGrH 'FFMXD&^{V.vc[e3pjvB)wŶAcX+ g1m:gq:P?Hdy BJpy|/e~)/7bA'pX~n,4D/iԁ̸(=[c,W9q?ptPS$+5Y8|{˒o0wjFK.`G14gN;<UԘ+8f{oM[(8,,GX2KhΞ"և*%  *}EioRAh6n3Ѭc4@m/D|g/$U9[Ä+t )< GW7<ɇVB~ AgP{,>4KozJ'ɨѻA? _D2Q;IS1ςRўC4 gB77Z,o^PjˤlG .% pwޥ,lƇ-+tݳrɝ}( @4*mmD##C?eW,ޣ'Phg4>b\3RCş8fsZH$`8mjD *wR01Qm Cm,:m5P "iVXWZp?Z6Cf^v]muÓGZaխB2c' {'vګ񟛞>CpTv+z_z?.754 k# Il1*[o -"tlm9% 71fŨ.cII!h[3%݇Bro1W.4u+VK7YS-1:Z6-.cDdH.SP>p|}> Ƙ7~@{KuK#tg'S>lLQ< Ե1p=vP.?cbtB?n5U1_y?w>G^2Ih{IvNGq2 grXf{GlVlhINܜw {in<mnMş8r WrQ[(_J8! f7h0J_ GIM:nq&՚ZQ^V][l憈oЛI󽄝dk_pG9/^f<T&>R@[RfaGJ7.p7De:ۨh%sG; y<$/>ɟ{|)O(/%qNm@+!Af{eO tMU!Bz@|ϹRN/x,ߐˌ5ߌf6@Y5UkZF簓MtrLFS䵗t+,,놾/UY;NQ$"f?$N}(ҳD^~C(LTʋLb`E;*4^0ijl"j,t.(K0niQtaa.QL&D]8Rɍ+\]!Xj\MDr9;p,-z51ciX F˵*<8g TFdɡwc 8 (*w[fw\x#p&ؤT^P0zVKdCG$qj)7P` vX!KDHV^X屴Qb)vl6lNKD!Ng@#'aM}F^z\ vt!" 2r3BRz%gNGy?cv2rt mqrIx 1-{3*;sаV)K֫p)P&Ȼ{[L!@-a\W 9t-Z)mT24?篿~S-9LGAs#bZ uFdS_k)Wtooj0XqU:ZY+SRJi ?glX-c'A(wTs}6$˄+ѨfYX3zD"V`a)e5'yp`OevfV(4CĒ3?f~ɿFPW#V#m$%/i;|j}u'+q#B_dJ%8_^?#G?JЗ@C2#,ϓt  p|u:w?| Xad}uA 5YtdkڙhЖ7-@Pj"wɓfH/}HblW Po B -!ӓ\j=u0Cmocq&Ɲt 6DCjf͞M&uҊ :gTa f_ 7<3-+ *Ɯ0 /a/MHB@4N%9xTqPt6W;GemT٣8.EuqeN9^3ęan(}*BeH1qgPf*Aro`se&CDxlѤLfa멂ydt Sxh%5ו]!.wMG].R9cQ#v沔Y{ϴ;TYD ܅njKшG<|4њB͞Z:,uک )ANd wCV̙S*?61/[*yZ]w":RIzf(m=Mّ;\>$!1^mkMnϺ/~ x2`ûfBM5L7zk'DY ꝋzp)7N& #-F8/E(shּV  ->+D*qVD<"}hT^ =:">l@Q gΦuqLN'T筰[D]oˌAӺ`9Iw5Ľ JfFwh+^u+"6Auo/77F[L[Qaʤ ,:#s6ʼnbqгo. 7Kp-@RFVN^9Y:y弡ˎ-cMmޑ` bZ "9~'u`t0tGc8؄xAnY?ЀD*Dkn^p(c)Ҩ$9؈]^]mRCQ8zHxjì6p p (-M`IہpRT77ϡ'LFQʆ_Y1ؕC&jrW{kKKܮf2^ [ 2CV4z1a"m=WRS/??2'ܨO^jD:\PIXc^z͇p39i&Ÿ[~wzXVfG7'RmN*KBD7oqP"K [}H/̋cfkM~?fZs;2v?_ҥǟaE.UCcoh%&l4ӠBQ[LȍQ+@nTɏx</g87T4}%vqz'j&9Tbց6W!yyz87=v*rgMgM4KD]j_DmUY1z^f̀+ow!@cmW꜃ՓLɆ/5w `> N 6 .~ms8C k|ǝ'xE_xs<鍻Աo,j>T`޾U@ e3V`w!*vW S}emsQ$F݉(tPtwhċa%o{yH4s)u[2GY|zFf++7HXhd*Zyֿ1\`PKY`jP#εEHqcz!oAiI9RԎÖHH%R,hcIn @fpk#uӃD^lPT4!KLA9gb? @찶YXz*店T}ЂͦӟI?9?sܬ>DiBa`srZG_I~b$:[rzj:j1cTv)e-Jpgm`wdGPg+xU_-H{6Q??j?NVL,׵ˌU$`%N#>\擴" >L{! 8M:˨%E!($qa ZlR .{ L&hw/G,]zJ¥Bmwtgҕbe%OQ>J{+_*9U`CHgIL\$j{FˤY&E<"X[!B*o'~~ 9ȩά\sr!5u^JttQobZ?~!I&Il#}fLPA"|*B ~OW 3vv=[Їݖ?m6Q(Fc! I4p5-E{BE\Qc̙xcq# MT1K'1CKIlvj O >"9i>ȫ-uA̙4OFTT7͚ԃy/%c٣(FVoB}f_=P؁Z:R%nvl~0^o+7Pr:yi@XNzNl9/-/9f_l GF!U!ٳuGH`ü2&9c c#4%\qHt Z-NC^k~\8eisѼfu!oMW%u<]m *U;1]z9Nb<\űhd_LUE)95a.:^pkJ˦YIҙ{b{@ϛ|{Pxhr[X5Õڿɗ-zBMr BbZkj\ʙ0bTY=ݡ~-,'Q[;sBC砲(% r:&e5o(I- Up Tt $Ϝ%CO5H+(PL0U^ʤLl0C3+WRPт0"C UV\'"FZܥA-CcM6z"hK[3 vH7V %a,fVk|rWIB9i Vɦ wEufsc[F oUAz"{gNIlVoaSFiRtUhrgaǬ5Qm5f@uo iJ#Pڏ]٠)2v'u[ <&Z^KT &>)GeuTc~`'*qbIor-{RcM5)x@q4}F<+yp  Ã,0^<]hau,VHb By GDUY]*f ؔ"0`0ژsu\gX+c-me`ޜ~ %Z6a=ؖ{n >7/!I/RyxeE{S&Xjez:#ሂ~)T`zjYJhٔ Qبj͚یٽX/>lEhCom%erS% KjysaM:R5 ) .+myPg{m&FVH܉c z:X$@%Om_ 9gXvh͓Y,%rʟ!kN/KZd$o;)\W˝6Me꜡4Ӕb3c&KvYw^Ti"4/9ퟗS(r8^$kЂ}qH\B8QCJ^veyA8Z݌҅ЖNfq\ /چ܁l;46 Y&lܨB܃z$^ַkBow4W[ 8F t0 u Y)y7NK*n)s]}AÀ%FZ[Wlȅ7f.߃2zl3$:Ѳ Y HT\ϭSA?Ÿve6TxyeٝM3UmIrP $Qj}/,;ɲpb(}hGK.:Њ:oF ;]mF-n^4`ǠqG'7^fGͳmg1WF٘jz;\O;'~Nr.C;Fw5\뤧k #=o\9Gvs_-4"pFldU8J15- C (LT_>(Wn? 2#ZR,(o8!)PqW-~hkT5\mq[ 1'_1Z5GXkPr1787e']k@nlL ӫ^VaY1n-A3= +6K$:L%3$\q*l|y p(Qy  ONZ{>I;Eb?&~ɨ.$(}kJk=Bw[Y%deיE5cSOW>ÎmhmJMŵ+Q*_p;me 15F`3}AW:ЖtΦ/0<*Dpn 2\(|MR$k2-D//-Z$Vy (51cwړcw1nT)A{&\?1ޙG}[QT~09R4dڎ@ P|3¯ЂNm'NVhC,{)iEC;7(ݣpјbXk]tqx8^H/cʀ@ƕ~;HTءZե2IY%fOӱحkc%e%]cZܝeaj0EnKBZe"beUshXd][\ {[qitcXY"+ Gm. |  Fh]tP+vN)/*HLHWC2Q-$OJ[i]0ʩsm`U)[cM^ϫo8X|D1qnDjX#-^CZ e3;L 7e۴Rʝ#YlPYEAȾf;]=u6M:]gI1"9g\C|yw !W%]lc{hks[͖f)z'޻}LCV{=2"H!:/z;n1d 6dLw l ?;UJ~ '|ʵ įe~Uh|aO&Y,1ʵFװ{(7޹=v/!O]6;l]ZlN2&1 1KvOֲp#!h-aVTQGɾ1ܭ \ ȍo'#iab"Ҫ !cuJBdӠYi6Pc>Jt"e[⬚\C rXOoZ緰z3omOTzXBndBBKK"nN*!#k_^mv煆xuY^TsDZ•-Ai0;jjA#HqؐOxa="R(xitqL70't$$Z_2F;|";.“jSHRA 5as@Oן}J+U7.٬I(-_od{Cw&=잲3FQtѸO]kfD)xKcf9WJ- U?9!/VZ b|E z5v Ql*4$5;44e7%( 3q2p\. 0殧Tdb¬HzR$Z~s0+&;cU+G|nJ}h֐_=d.qWby7$XjwU.%U?7+=O izfn41s_xOAJO}d\4+TF)X(@c#dx  }'75wfIrbpJ"tt$Olb<%&Ӯ !XPgx 248*w +2pxm++ o&/yҏP:K7l9%QօOPL`HAJf+ݘ񩞬MJe2d3=),CdGƴ dg_M宯~ *}wvJ4#?+֢v~,ُ|~R'?-ؘc/'`f\1.NԊĥƐ'K%⠪,E<uk5{1xa,> +Tmujl$0 -߲$ H/wQ: A9[!B=%qEMC-/1JU߃/@p_L[ą@ 'ȻdZ~3ȲH@Ilyy#k '7;#]_;jQive鸡׌iG{$?YZj{ɻ3Y߀(.C`/*jPNsjyJBG(x s>@Ө۠ꤺh(ԢсF$5$oΜMYlNBjݴ#k@.f*:4d,1JL7Y[q"|gîiW;ni,_o5a|/XA8 `R!;\87ϔu .SwWs|}Lz1VҋW S#lMYCI)rmZшGkHR5ɥ-5%r"098KxV;5/B}S Xhņ+SO/ZuN. /٫jIܣWCD"ۖǸ\K?(Ho$+{Nٚs'HQ(X8?%7 1za:[^Z4{faJHƚ3sMt|P8>w\n+T ~9 e:1]mS;4y<5%˗8ƣA#Cido-y"~¨g]b][ Qq@_o=oXRm/ ³B-(]f1˼M@fUe<$Ɩ{J[oG9 wPW$ioETSkI.A[Y5?5 EtL"]n܈h/$YmFo%-M=> ]Fҵ%N5cWk1_jLSʗ!LOpdDI\QUܗ4h*)IqB%y Nlor qIIchyWqkcHcpcm.s7"Hc"\eIqGT2?F,xn`gLիL2!uȖ>GIIf<)&t#}7Sb_IӫQ(`+ 5ElF_  a ˝㱹sT/GFR*y+W/|V*˗|/jxAo QGd+"qF.n )a $nmd.hCϺ\=k!5ÞN#;i49JчmUr=I; `*hP<[*9s^ /U0fp`4q3tZ-tXЃ&a/$H',)ɩB6 3gW>(L +wpl?cGQhnB.SXTo '7as8!OƐ}ZE,CAdduOD<4 ;Jeы{,4B"h9J'ዢ{H=#bsy(yneIfjOvKVԏ,m稘#jDž8uh룁cҐ~j"~/klAR8W!?{\]S5= ud=Is.K #~VQٺ xɥd˩*ȣJ(J3V($^/صHxq ZcB}t-Z~Bw-.] }ZkOͽZk ks̥Β6\'^lL3Pzpx(<"⫤:PNK k$Q] ]pDv݊ OR3d_|Ҟ>+BMcsht,`txX9ZWyBxF'%+',K-0QWr+m>ײ}> kK@9%)+ӧfY<],NBwfr;aI*ٌϊPrIvn,IY˵> eVJV1Y(rYV'D̗!b]4 ] g67֋lt:K4:|1+H 8xPj`D1- HzQ(t2x2+wk^tFIxEn;T/Yq(]\FHҕAB"Q9*M}sLda1=4޲"M /c|D:7xD|DZ_%M?E;zHn 5iӨ&O[ƛ~M o/'eмȦu5aLwZFi̴^Aއȼc 7X ϑ}NdۡHO<e!eT*203|4#D 600! (zf2-7lp"=$9,],OH6x$,7$4a> -7}˟8R}Xӂ܅G<7ljQ՞- <D2F9z/JȰzr65LWR/^_o TXEڲ!7a" J(=#Ӊ 6\h.;,8E&ZSg{2Xjq<ׯ%sQУOVE71IQ1(S{l-&(\A^'_yIN$3.if3>|m'cE/NL!^23]p}IIbqJ9q-_gmRXg2[yb5l;ٱEjHpLNn1b̲\ᅹʿ͕/\bS`gL5nWӬw|d<$ 1$"ytO2V- u| O?Osb&|5T7c\+- ګ n|Zm@|aS|<y\wt/X.|m@FNNʪZzVhClYOdhߢ L7Kg-"S+$aA&S6 U5#PE-oI&\)f-/g3%d391|a ׹0\P1)q8Z@oP9[Y΄NTzP%g8lFVN֚B̰e$]p{h`"s vhP[1r0()\~aUAs>mS%ˌrq3ng9:$xnWFSW8s} »Bfg|e-3A4o3a\r"V Z2š+&D9m)SǒY6BM6SP;6Ej-2I7!b+[Z/,yvf61chWGZ9qjgJr_jA4z]VzY9xԿz!^xCt;Ho#S4Fr-7m26k }̵M9N՟_༵zS57 ոuCr= g %iV7~ cO-fn5e@!/N1r>9u{rm%L>n%ِ/^KB>% kA@s%71&t w-w=Ό9u1x~k". Q=Q@>Vv><͌EM}4_ uAI53{jAL/CnV#I__s{2f\IKnA<3 Q~U43f<̼GҼ(|dkyP`Ze9"oQEH *63|@$cmG%6͎ZL0</msiiCښ4+%GfZ$I3Np\< bM ?;FrP)&1ҞTGݻccG>5O9\QËP y鲔rFZF>!ZLOo= 1͍¢.4JcOA#b|BT[@]0/k#.Cg`mf8g|"ܠw>1x]1OHaʓ}=+a.{7F+\MN5]VO58mmWc]ߢ*,ܤt$?NI|'ոo6>W15O ath$$c+Zz7V5=p 7峿g桹>T sr< <[Fű,i XNX6_]N t4M޵.jFK^YLs.75~)^o1߫=g$6CzGhnFt6N:w3sd;븠 'G~'BgW,F2BPrm_\CZ3%o {w`se!4GHʗ rWEw5Nӓ,VK㐢=Jm*y% T#/KvP[ Fz/u)Ct Fj)0^H*sG ɥn)Cˤǂr6`bqc΅T84Yq}=ejMV*׸J/ `9Lw*l1};+J:`'ڵiYvx9|\gXrۗ["~$U Z*Q  %hñ7[{>f+ؒƴGѣkB b1D9'l QA"i>BN^c27˜&c'$Ha5tMسǁ36C=l7V@}`i:<2Xi&[ӕ b?:紧,Al !OɿGeFg؋3^}{Q?m{MY7t v`·O %[Ǡ؃(*k<$Tb%贺q G.΢D|ڲ289~^sz/W֒{I;RJqC5[d2ZI/(\yZ7D/ ]VK69;l{oHZи<2)6s#m/2Fs#檺Vi6kuA_SQSLÃH)UUL^/\lE!A Q1s?N} {ieͱZE4N[3rvgVPAה:e'(> Z a]>yR[A3ybX;ONUG7O)ζĊGޓ0ЖXPEA G֎ ӝw lm1$fa4V05(_@PpIiixJc"%9mh+`n;jqp6AF-'M0(`LpiCc'br?ޣ\AR{ 7M+Hd, rlmK՚3mUg[=7qUQչmͷĽv/^_밗2'X>U&_z׈Oȓ %:N'wj xrD:ڎ4 s|5OF7R!KT=9!& \/m3]C PK=B9uԙB ѕ;Y=job5 J .FnD][$n+J[6,qBiLB8̴dq.%r?6ⷔmzBh9iXmQT<9n{ple:$jlߗ톛(#N,hZ&i6IT͍t & o##7E[ZDvyeQ531KR[V^4w=E6-f͛]}y#j ЎPSF7svs mLGm>WM8eѥ 3vs⃡DXOT3EK1yi0or&{+wڟdش0_E)KM0NA6f~5q>1wy24EYD(tww0,#maZN] TMJNp_oYb6;B =jRCXdc@̠;±Eo⅄4f5_#_;(XYY%#}NwF#K!+ qfP4C. )}FQb%yGV.F ܿÏ*}7̐ع"-󷥀'y=&io[P#Cz?m,Iv淩wLdl[A0YZuio;(XY2kkOvL/\FH=#Ag G44HP­#A}=B+Su700FHw1'!P~ Hy2*hcҫz  &z\OSN1rrڎm^<j:ˌ Hz7t0]a,%ѱNuݠ ?eQT͊1( d sÛpfhѣ?p]oѵ8 C**/ϖTwsL[!3(p嫪\sL+Fl1Gk7W棵jԬ]$u3{a8ɢlQ.-9gTk߁mⰁTRSs=-}Q@X付QzP .xih{n.Xdx >D/yp2Y0xH66~Iռ өk ݪB%-p5~> @5o3x9- G.~_ dCqWʝO-Ўip1^jżqeG'4]3?>O}i/acX3Հ"ʏ]3 f~uB<3Uct65BG_t|bWƇz=E og6(RlO-8ځW;+.N6P"&7h~&W^X~(B.Ua<R&f&IGB/%B}=22[[!'#X{z7F;TQ)]C=t}d nN(FU=ٍܲŻW7riHEJHA ڂchR9ֽ<͔;3*1钝('Pج sYt9|(_b>"Q +8aD5_!CƻFO[y\K/KѰq~Q۵_ԝ% O{D v)oκfFjmp'CT}&103迵Th8$:Y;?',j?w/wi\/5i(c0,9`4fQ'(+O[6q[]FI_ k#dHI;vpuy=f6K>aSZȇƂ$R(rא"iMv>먅vۄe11N_2߁XJp рTafL0mrS}`CVIgKMhNSuˮHQv2hri'Knl`hBKbWvcD7!fXoշ%Ky$%^pkrLM>tV>W_4+y+pa1# ጅ/Ycl0m/7MҖ)%zi:w${~-(ƺ@ٌF Apa|SBq:e$REZ_23UH xW;VTRD.R9)ٌ^J/)2B8z 9Ih?=w+=gw/i|t]eGW0c9`,yUZpZ!Oi{5D -s$MC -{? r)~{W"E^Xj )v-p>l[. P!b3.t߄(  PAS0[r*VC Z.HJ )6,b\\X(!%-DT<(\4la4}iK +u1b6\zhfHHa0@kѣ2g>B ƉiizIzg^K^k޹URI8>!}: /lzOOb,iU8?e'vqrE?BOE,`w'< vJܾ Ϳ֛re%t8c,qWi F dS3;m#4XF%Q;.Jc&Ԭ߹p{| }uDR1]rc1}~"σ!:QwT Q)P~⚊5GY7<0p):pv w,)uNBF$b膈oOX^x59$?1(@AZUB:HTxi/BM8+|Z29k^- Y.FK yd-3Y&S"qNI\.ݧ6:yFo/" H@U:Fvxtk]M[(Gt@1gě1 FB1ܩՒKC`]JG<vaYEs06@됇͡?Rŋo̫x;0j{XtFgxhA9C}˾ZA?3tdHAyoKpJuSHG>4]`}PFrv٪!s=5;>JJ AK'ikxf(&ظ}.#sMl?3Өڧ9M!9Ԭ"ŏcV~HF|쬙`8:6C_t,"Zkl*2bɉ&PMl~m"YB\& gR$z/YꖛTrU$hL9*>kWӗ WWWC41h~gE>I."o`Jg5YU_Uia>n~=lg_s&yWx5ѿ)WC 3g2w4Ϲxs1DDc?t{4Ӭn[*Ix+IrKIjhRT1-Z6wkY6:pz/ݒA!I3L0G͖!sOSVǞFON=#w?䔘1أd Rֻ~><9w~p>s %vզ^)^{5MI܃*֖kj J[(:,璧Daۃ+pR\d¬>zjLI_ώȻa?2}A>T}/!1;mr \45Bƣnǒ,`SjTX57%r,k0؞ZxaΜG ?03'"3h.Pn=ȨKQ(Nk:1:RہC̜<0>F AH2).`f5Uk|ˁU1*׿аVfs/8^v ;gV--%%(<'ϫE~&kSf6f9f2#q.v̡/C KIH)>x! @,j`vI8\`eQEWeʁ\GxQlH"ZP ӳo$s#/ɜn,'uneYN$D22s=qZ{,`KAdcncxW To%[WXX~Z/Ed!AcR|݇c㎣N7#_Zk(߸{Tۛkr@SC" 67 & O߉"0NQkv 2BHL##?H;ύxsʀ돎v|Աv<4_ 7l .nPnxD-jÚ+psV$B}Qq- ,H`DBzFЈc0DOdИhJ'=a?-hťf%HEȨ9]1sAPuT [қs\NBd|ѪZ,(FmBRefbT^'ܭUG[sfkqtΠO}, p^5;k ̪#(q`  CP*r0qQ+fүqq;„\.4Q}BT5d F:7' p* 0S;y !XKIL{gK)G23G}PI2?*#V 7`7:mi&X 8~Hȫ#+}Y}>~%Q8 a/(HNvoYI{!nCSvvG%8f|w/x{&ty|OsL#}'߶=ǿ(ZU)-|' Zui2kOlÉG^%)gVBw,~oj'uq.a/d:i1 =lJn5 ݚ(@:>nMƉ&{y5?;x88ի%iFZeWAҭ $:F-E $$~!9 :Kі"42b}hҋG#<҂s|jm%eCQ>߇j <I2ry4ib Uj ED{ z`%NTQ%Yx|)ӋcHABHxYI= S`U8K dP<$>JPu$^M빍!SrWÀ>׉b\j0TdyO3J3qw|3>9ZR3KiBZx(pGN$O 8z¾?x%\kDa}9H7V14NZA.1=#R7J=wp7*FSR{fRTcqucwXs!93>ygIv]x]kp#XUŅ_IF5W$( !J]__'%G$ɥW̙ ̟%sX2JWl%.$M)Le 5\\PK&D ި}iS/+E{m)LuB-~f갷!EcJ-"v9lT5 /2`&ڽ"x"bQ9zF~"{=-sň=,jLj&ĥI;;~s^#vP'L)uH)B0{iR`hˢG5~)SwgyU (]ui"l=^n:ZImv.#P}>Q<5;)za[)Yu"KQo1w~.qs56}xۈz_7fW;c6ͨXj|x_h߿ he,oܠaef/1A? _/џT{6FP3 67-# SOAtQǰR2 6j˺=´.6v3C9Y lx)Wҏt@GSu}4s2TzKfPWaM^{HCm:eA+[>2+C QJNxNgroKyyp>d@ٌTy>%r},In%-TRs{IPö iB6J=%R).?؊d.%*h\]1`K#-7F꾝fTFt/[{1c4oŇT73)<@C<ө3Xdm72Ű3ۂL%~ZDJr5;}X*kur_D+&m1FV j Uyls4uUiHTq,!8M4B$U@QC48V 36~Pbt~6߰Ad-G90o6AeF|J*W#yᆖ?oӸ%ou`h!Ax=تIHx%]84a 4H ɪϣgӿ +D*EC=DгtMp='аNJfi+ua"C?~aM},!*f}洙DZhC_&W8,{s''x::*V}eE"ȗ'`DzN[ISEw7@ 3&3bO ,x#6;;\3{=*[.].HUs([T( %15m)ӟ=px@=@gR&%"*>~oΔC=(bi% )׃ꪾ pP|t>Ԥ %+4vdanY4).j !2m+sh&7[2P Sʃ"xVsML9h"-HYOέ`\Q*iOAEI9TT6Qاۧ,q]samְ$ N}R aVd׻?lA3%\mbFllX?4C&9\Og,1TIcMV6p2jeΎ]ذ-*Nb/c2G\:i\8ƭR3t8p~Æ.pmi*3khք˾cc\4gMx1K?o< :~K[p$0qҠI쁬ЮL qKOrř^jj(#,f]_40Xzs!C-&6e 65z .[%EAUIIqp {Lgaf/J͏rLKT.ӹ.EY}lZf2D]\{ ޜsc0gi1`O=UWSu(uvɺ"((ZНEGԃTHlUY'΢!QTkAẎ0f(% J̺pt\! _Rfg51S7K hq0`Hp2,3qEOY  =MG=R®tHcb4HF%Tkd4Lp-S>*JE4omS= BߐQݿa툱 6 evf _{s'%cZz-lf)ewEi_YMSa50CnϿ0᳘˯zbeŇ~W^9gDr ՈgʑO1ݢ M7 fmF˿:kVpsC!-Oҫ }LPS۶9i@t%wVV~rM5'oXwd1TCHG!p/W{" VUGؙuly% zO.ܐ4CKJ/~q3"7NHߎFȱU(b2_|CKFA 4}Eݍҏ4=gzWܔ'Fލ}>XF+hW{v<]z0>]T84=XɐO`CLK,g2^+x2-%߃:zPϭNщ%73NE/1o-v+#t,h^?p荳\^6$N\ xeajuIi G& 2Y(!doo 措vHEEoCӂ'';Nw3G<#^~oL,ߴ%ߏPBCෟoER/gnZī\G ߓȓ>W68X~L,9W 4z~n(5[?-ߔk n}fwR=w2Ks c tϯ 'm*yӤi9-輡O Si.xŧ3Swr?{j7?gM ;%-4"3a,=K*ݦ;>{/w ڹJQ@AoLic @=bgFI=FÉ 'ڐ+/ JdԃO9ي[c2wb6V ɗC\Q!jC^MN^K纔xL2Ut cU׃W<\Ԩ !,wY_{7{(}[fE*gW▖e1%zUUп~j ٿ>4V~{L@ ʋxBL2N)ɸ]*ns\OΙϤߩ479wO?Odz76׃MGu֢ '?c9c.Li3VvڞO: ̶h_uhe0&T _]6{+"-ސn~eVu\g7ʈ)M7z77na7UCh/I699uF;gcvXIY 4_Aum1E0 %GhOLFϛkAZu2'52 Kw;uO~`tЙ/Tjڗ_T*^߯7;'#2oAEXqtھB\bbxo5 {Wי0I):Lzi)7 t9a\@/?\E}iӏ{'{hG+~e{f${{7೙VWW{=3U5WG!e? |:~{O+jW?²=[T. 4 6^|TqjFvEQgޥ?wv3b?! 2Az=#g_|Ǝи3r42(YɘY#ZZF0fuO'Zu638 {ej#Jo\iS{jtsff9Njfw>Gk_bq|sOs2:zrӾ36:/{ >w >n)?B:+=qj88pi0Kځ-38A.Q(~/1^W{ P\Ov?d!t66Y0?+zJޖi"* ϖF]ܭ7o_5 s_|bjflex-1.4.3/examples/0000755000175000017500000000000011141044624013144 5ustar moonmoonjflex-1.4.3/examples/binary/0000755000175000017500000000000011141044624014430 5ustar moonmoonjflex-1.4.3/examples/binary/binary.flex0000644000175000017500000000367111141043444016602 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ import java.io.*; %% %class BinaryLexer %8bit %int %{ public static void main(String [] argv) { for (int i = 0; i < argv.length; i++) { try { System.out.print("["+argv[i]+"] is "); BinaryLexer l = new BinaryLexer(new StraightStreamReader(new FileInputStream(argv[i]))); l.yylex(); } catch (Exception e) { e.printStackTrace(System.out); System.exit(1); } } } %} magic = \xCA \xFE \xBA \xBE %% {magic} [^]+ { System.out.println("a class file"); } [^]+ { System.out.println("not a class file"); } jflex-1.4.3/examples/binary/Makefile0000644000175000017500000000047207606571215016107 0ustar moonmoon JAVA = java JAVAC = javac JFLEX = jflex # ------------------------------------------------- all: run run: compile $(JAVA) BinaryLexer * compile: BinaryLexer.class StraightStreamReader.class clean: rm -f *~ *.class BinaryLexer.java %.class: %.java $(JAVAC) $^ BinaryLexer.java: binary.flex $(JFLEX) $^ jflex-1.4.3/examples/binary/README0000644000175000017500000000157307606571215015332 0ustar moonmoonThis directory contains a small example of a scanner for binary files. The example tries to detect if an input file is a java class file by checking if the first 4 bytes contain the magic number 0xCAFEBABE. It uses a custom Reader class that copies bytes to characters one to one. The characters the scanner gets to read are the bytes from the input stream without any conversion. Many thanks to Stephen Ostermiller for providing the custom Reader class, the original version of that class is available from http://www.smo.f2s.com/utils/ See the JFlex manual for details on how to scan binaries and how this is different from scanning text files. Files: binary.flex the scanner spec StraightStreamReader.java the custom reader class (by Stephen Ostermiller) Makefile rules for make to compile and run the example README this file jflex-1.4.3/examples/binary/StraightStreamReader.java0000644000175000017500000002525207606571215021401 0ustar moonmoon/* * An InputStreamReader that does no character encoding translations. * Copyright (C) 2001 Stephen Ostermiller * * Changes: (2001 by Gerwin Klein ) * - commented out package declaration for the example * - original version at http://www.smo.f2s.com/utils/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * See COPYING.TXT for details. */ // package com.Ostermiller.util; import java.io.*; /** * A StraightStreamReader is a bridge from byte streams to character streams: It reads bytes * and translates them into characters without using a character encoding. The characters * that a StraightStreamReader returns may not be valid unicode characters but they are * guaranteed to be in the 0x00 to 0xFF range. *

* Most of the time you want to do character encoding translation when translating bytes to * characters. If you are planning on displaying the text, you should always do this and should * use an InputStreamReader for the purpose. Sometimes it is useful to treat characters as bytes * with some extra bits. In these cases you would want to use a StraightStreamReader. *

* For top efficiency, consider wrapping an StraightStreamReader within a BufferedReader. For example:
* BufferedReader in = new BufferedReader(new StraightStreamReader(System.in)); */ public class StraightStreamReader extends Reader{ /** * The input stream from which all methods in this class read. */ private InputStream in; /** * A byte array to be used for calls to the InputStream. This * is cached as a class variable to avoid object creation and * deletion each time a read is called. This buffer may be * null and may not be large enough. Make sure to check it * before using it. */ private byte[] buffer; /** * Create a StraightStreamReader from an InputStream * * @param in InputStream to wrap a Reader around. */ public StraightStreamReader(InputStream in) { this.in = in; } /** * Close the stream. * * @throws IOException If an I/O error occurs */ public void close() throws IOException { in.close(); } /** * Mark the present position in the stream. Subsequent calls to reset() * will attempt to reposition the stream to this point. Not all * character-input streams support the mark() operation. * * @param readAheadLimit Limit on the number of characters that may be read * while still preserving the mark. After reading this many characters, * attempting to reset the stream may fail. * @throws IOException If the stream does not support mark(), or if some other I/O error occurs */ public void mark(int readAheadLimit) throws IOException { in.mark(readAheadLimit); } /** * Tell whether this stream supports the mark() operation. * * @return true if and only if this stream supports the mark operation. */ public boolean markSupported(){ return in.markSupported(); } /** * Read a single character. This method will block until a character is available, an * I/O error occurs, or the end of the stream is reached. * * @return The character read, as an integer in the range 0 to 256 (0x00-0xff), or -1 if * the end of the stream has been reached * @throws IOException If an I/O error occurs */ public int read() throws IOException { return in.read(); } /** * Read characters into an array. This method will block until some input is available, * an I/O error occurs, or the end of the stream is reached. * * @param cbuf Destination buffer * @return The number of bytes read, or -1 if the end of the stream has been reached * @throws IOException If an I/O error occurs */ public int read(char[] cbuf) throws IOException { return read(cbuf, 0, cbuf.length); } /** * Read characters into an array. This method will block until some input is available, * an I/O error occurs, or the end of the stream is reached. * * @param cbuf Destination buffer * @param off Offset at which to start storing characters * @param len Maximum number of characters to read * @return The number of bytes read, or -1 if the end of the stream has been reached * @throws IOException If an I/O error occurs */ public int read(char[] cbuf, int off, int len) throws IOException { // ensure the capacity of the buffer that we will be using // to read from the input stream if (buffer == null || buffer.length < len){ buffer = new byte[len]; } // read from the input stream and copy it to the character array int length = in.read(buffer, 0, len); for (int i=0; i 0); } /** * Reset the stream. If the stream has been marked, then attempt to reposition it at the mark. * If the stream has not been marked, then attempt to reset it in some way appropriate to the * particular stream, for example by repositioning it to its starting point. Not all * character-input streams support the reset() operation, and some support reset() * without supporting mark(). * * @throws IOException If the stream has not been marked, or if the mark has been invalidated, * or if the stream does not support reset(), or if some other I/O error occurs */ public void reset() throws IOException { in.reset(); } /** * Skip characters. This method will block until some characters are available, * an I/O error occurs, or the end of the stream is reached. * * @param n The number of characters to skip * @return The number of characters actually skipped * @throws IllegalArgumentException If n is negative * @throws IOException If an I/O error occurs */ public long skip(long n) throws IOException { return in.skip(n); } /** * Regression test for this class. If this class is working, this should * run and print no errors. *

* This method creates a tempory file in the working directory called "test.txt". * This file should not exist before hand, and the program should have create, * read, write, and delete access to this file. * * @param args command line arguments (ignored) */ private static void main(String[] args){ try { File f = new File("test.txt"); if (f.exists()){ throw new IOException(f + " already exists. I don't want to overwrite it."); } StraightStreamReader in; char[] cbuf = new char[0x1000]; int read; int totRead; // write a file with all possible values of bytes FileOutputStream out = new FileOutputStream(f); for (int i=0x00; i<0x100; i++){ out.write(i); } out.close(); // read it back using the read single character method in = new StraightStreamReader(new FileInputStream(f)); for (int i=0x00; i<0x100; i++){ read = in.read(); if (read != i){ System.err.println("Error: " + i + " read as " + read); } } in.close(); // read as much of it back as possible with one simple buffer read. in = new StraightStreamReader(new FileInputStream(f)); totRead = in.read(cbuf); if (totRead != 0x100){ System.err.println("Simple buffered read did not read the full amount: 0x" + Integer.toHexString(totRead)); } for (int i=0x00; i 0){ totRead += read; } if (totRead != 0x100){ System.err.println("Not enough read. Bytes read: " + Integer.toHexString(totRead)); } for (int i=0x00; i 0){ totRead += read; } if (totRead != 0x100){ System.err.println("Not enough read. Bytes read: " + Integer.toHexString(totRead)); } for (int i=0x00; i 0){ totRead += read; } if (totRead != 0x100){ System.err.println("Not enough read. Bytes read: " + Integer.toHexString(totRead)); } for (int i=0x00; i * * All rights reserved. * * * * Thanks to Larry Bell and Bob Jamison for suggestions and comments. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ %% %byaccj %{ private Parser yyparser; public Yylex(java.io.Reader r, Parser yyparser) { this(r); this.yyparser = yyparser; } %} NUM = [0-9]+ ("." [0-9]+)? NL = \n | \r | \r\n %% /* operators */ "+" | "-" | "*" | "/" | "^" | "(" | ")" { return (int) yycharat(0); } /* newline */ {NL} { return Parser.NL; } /* float */ {NUM} { yyparser.yylval = new ParserVal(Double.parseDouble(yytext())); return Parser.NUM; } /* whitespace */ [ \t]+ { } \b { System.err.println("Sorry, backspace doesn't work"); } /* error fallback */ [^] { System.err.println("Error: unexpected character '"+yytext()+"'"); return -1; } jflex-1.4.3/examples/byaccj/calc.y0000644000175000017500000000723707606571215015520 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * All rights reserved. * * * * This is a modified version of the example from * * http://www.lincom-asg.com/~rjamison/byacc/ * * * * Thanks to Larry Bell and Bob Jamison for suggestions and comments. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ %{ import java.io.*; %} %token NL /* newline */ %token NUM /* a number */ %type exp %left '-' '+' %left '*' '/' %left NEG /* negation--unary minus */ %right '^' /* exponentiation */ %% input: /* empty string */ | input line ; line: NL { if (interactive) System.out.print("Expression: "); } | exp NL { System.out.println(" = " + $1); if (interactive) System.out.print("Expression: "); } ; exp: NUM { $$ = $1; } | exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | '-' exp %prec NEG { $$ = -$2; } | exp '^' exp { $$ = Math.pow($1, $3); } | '(' exp ')' { $$ = $2; } ; %% private Yylex lexer; private int yylex () { int yyl_return = -1; try { yylval = new ParserVal(0); yyl_return = lexer.yylex(); } catch (IOException e) { System.err.println("IO error :"+e); } return yyl_return; } public void yyerror (String error) { System.err.println ("Error: " + error); } public Parser(Reader r) { lexer = new Yylex(r, this); } static boolean interactive; public static void main(String args[]) throws IOException { System.out.println("BYACC/Java with JFlex Calculator Demo"); Parser yyparser; if ( args.length > 0 ) { // parse a file yyparser = new Parser(new FileReader(args[0])); } else { // interactive mode System.out.println("[Quit with CTRL-D]"); System.out.print("Expression: "); interactive = true; yyparser = new Parser(new InputStreamReader(System.in)); } yyparser.yyparse(); if (interactive) { System.out.println(); System.out.println("Have a nice day"); } } jflex-1.4.3/examples/byaccj/Makefile0000644000175000017500000000064407606571215016057 0ustar moonmoon# only works with the Java extension of yacc: # byacc/j from http://troi.lincom-asg.com/~rjamison/byacc/ JFLEX = jflex BYACCJ = yacc -J JAVAC = javac # targets: all: Parser.class run: Parser.class java Parser build: clean Parser.class clean: rm -f *~ *.class *.java Parser.class: Yylex.java Parser.java $(JAVAC) Parser.java Yylex.java: calc.flex $(JFLEX) calc.flex Parser.java: calc.y $(BYACCJ) calc.y jflex-1.4.3/examples/byaccj/README0000644000175000017500000000100007606571215015262 0ustar moonmoonThis directory contains an interoperability example for BYacc/J and JFlex (a small calculator) You need the parser generator byacc/j from http://troi.lincom-asg.com/~rjamison/byacc/ for this example to work (version byacc/j 1.1 has been tested). Use the Makefile to generate the lexer and parser. The example can then be started with java Parser files: calc.flex JFlex specification for the lexical part of the arithmetic expressions calc.y BYacc/J specification and main program for the calculator jflex-1.4.3/examples/cup/0000755000175000017500000000000011141044624013733 5ustar moonmoonjflex-1.4.3/examples/cup/lcalc.flex0000644000175000017500000001127107606571215015707 0ustar moonmoon/* This example comes from a short article series in the Linux Gazette by Richard A. Sevenich and Christopher Lopes, titled "Compiler Construction Tools". The article series starts at http://www.linuxgazette.com/issue39/sevenich.html Small changes and updates to newest JFlex+Cup versions by Gerwin Klein */ /* Commented By: Christopher Lopes File Name: lcalc.flex To Create: > jflex lcalc.flex and then after the parser is created > javac Lexer.java */ /* --------------------------Usercode Section------------------------ */ import java_cup.runtime.*; %% /* -----------------Options and Declarations Section----------------- */ /* The name of the class JFlex will create will be Lexer. Will write the code to the file Lexer.java. */ %class Lexer /* The current line number can be accessed with the variable yyline and the current column number with the variable yycolumn. */ %line %column /* Will switch to a CUP compatibility mode to interface with a CUP generated parser. */ %cup /* Declarations Code between %{ and %}, both of which must be at the beginning of a line, will be copied letter to letter into the lexer class source. Here you declare member variables and functions that are used inside scanner actions. */ %{ /* To create a new java_cup.runtime.Symbol with information about the current token, the token will have no value in this case. */ private Symbol symbol(int type) { return new Symbol(type, yyline, yycolumn); } /* Also creates a new java_cup.runtime.Symbol with information about the current token, but this object has a value. */ private Symbol symbol(int type, Object value) { return new Symbol(type, yyline, yycolumn, value); } %} /* Macro Declarations These declarations are regular expressions that will be used latter in the Lexical Rules Section. */ /* A line terminator is a \r (carriage return), \n (line feed), or \r\n. */ LineTerminator = \r|\n|\r\n /* White space is a line terminator, space, tab, or line feed. */ WhiteSpace = {LineTerminator} | [ \t\f] /* A literal integer is is a number beginning with a number between one and nine followed by zero or more numbers between zero and nine or just a zero. */ dec_int_lit = 0 | [1-9][0-9]* /* A identifier integer is a word beginning a letter between A and Z, a and z, or an underscore followed by zero or more letters between A and Z, a and z, zero and nine, or an underscore. */ dec_int_id = [A-Za-z_][A-Za-z_0-9]* %% /* ------------------------Lexical Rules Section---------------------- */ /* This section contains regular expressions and actions, i.e. Java code, that will be executed when the scanner matches the associated regular expression. */ /* YYINITIAL is the state at which the lexer begins scanning. So these regular expressions will only be matched if the scanner is in the start state YYINITIAL. */ { /* Return the token SEMI declared in the class sym that was found. */ ";" { return symbol(sym.SEMI); } /* Print the token found that was declared in the class sym and then return it. */ "+" { System.out.print(" + "); return symbol(sym.PLUS); } "-" { System.out.print(" - "); return symbol(sym.MINUS); } "*" { System.out.print(" * "); return symbol(sym.TIMES); } "/" { System.out.print(" / "); return symbol(sym.DIVIDE); } "(" { System.out.print(" ( "); return symbol(sym.LPAREN); } ")" { System.out.print(" ) "); return symbol(sym.RPAREN); } /* If an integer is found print it out, return the token NUMBER that represents an integer and the value of the integer that is held in the string yytext which will get turned into an integer before returning */ {dec_int_lit} { System.out.print(yytext()); return symbol(sym.NUMBER, new Integer(yytext())); } /* If an identifier is found print it out, return the token ID that represents an identifier and the default value one that is given to all identifiers. */ {dec_int_id} { System.out.print(yytext()); return symbol(sym.ID, new Integer(1));} /* Don't do anything if whitespace is found */ {WhiteSpace} { /* just skip what was found, do nothing */ } } /* No token was found for the input so through an error. Print out an Illegal character message with the illegal character that was found. */ [^] { throw new Error("Illegal character <"+yytext()+">"); } jflex-1.4.3/examples/cup/Main.java0000644000175000017500000000167407710761643015510 0ustar moonmoon/* This example comes from a short article series in the Linux Gazette by Richard A. Sevenich and Christopher Lopes, titled "Compiler Construction Tools". The article series starts at http://www.linuxgazette.com/issue39/sevenich.html Small changes and updates to newest JFlex+Cup versions by Gerwin Klein */ /* Commented By: Christopher Lopes File Name: Main.java To Create: After the scanner, lcalc.flex, and the parser, ycalc.cup, have been created. > javac Main.java To Run: > java Main test.txt where test.txt is an test input file for the calculator. */ import java.io.*; public class Main { static public void main(String argv[]) { /* Start the parser */ try { parser p = new parser(new Lexer(new FileReader(argv[0]))); Object result = p.parse().value; } catch (Exception e) { /* do cleanup here -- possibly rethrow e */ e.printStackTrace(); } } } jflex-1.4.3/examples/cup/Makefile0000644000175000017500000000072207606571215015410 0ustar moonmoonJAVA=java JAVAC=javac JFLEX=jflex CUP=$(JAVA) java_cup.Main < all: test test: output.txt @(diff output.txt output.good && echo "Test OK!") || echo "Test failed!" output.txt: Main.class test.txt $(JAVA) Main test.txt > output.txt Main.class: Main.java Lexer.java parser.java %.class: %.java $(JAVAC) $^ Lexer.java: lcalc.flex $(JFLEX) lcalc.flex parser.java: ycalc.cup $(CUP) ycalc.cup clean: rm -f parser.java Lexer.java sym.java output.txt *.class *~ jflex-1.4.3/examples/cup/output.good0000644000175000017500000000012610143316617016151 0ustar moonmoon2 + 4 = 6 5 * ( 6 - 3 ) + 1 = 16 6 / 3 * 5 + 20 = 30 4 * 76 / 31 = 9 1 - 1 - 1 = -1 jflex-1.4.3/examples/cup/README0000644000175000017500000000133107606571215014625 0ustar moonmoonA small JFlex+Cup example It comes from a short article series in the Linux Gazette by Richard A. Sevenich and Christopher Lopes, titled "Compiler Construction Tools". The article series starts at http://www.linuxgazette.com/issue39/sevenich.html Small changes and updates to newest JFlex+Cup versions by Gerwin Klein To compile: >jflex lcalc.flex >java java_cup.Main < ycalc.cup >javac Main.java To run: >java Main test.txt Files: Main.java demo of a main program Makefile makefile to compile and test the example README this file lcalc.flex the lexer spec output.good how the output should look like for the test ycalc.cup the parser spec test.txt sample input for testing jflex-1.4.3/examples/cup/test.txt0000644000175000017500000000005510143316617015460 0ustar moonmoon2+4; 5*(6-3)+1; 6/3*5+20; 4*76/31; 1-1-1; jflex-1.4.3/examples/cup/ycalc.cup0000644000175000017500000002331110143316617015544 0ustar moonmoon/* This example comes from a short article series in the Linux Gazette by Richard A. Sevenich and Christopher Lopes, titled "Compiler Construction Tools". The article series starts at http://www.linuxgazette.com/issue39/sevenich.html Small changes and updates to newest JFlex+Cup versions by Gerwin Klein */ /* Commented By: Christopher Lopes File Name: ycalc.cup To Create: > java java_cup.Main < ycalc.cup */ /* ----------------------Preliminary Declarations Section--------------------*/ /* Import the class java_cup.runtime.* */ import java_cup.runtime.*; /* Parser code to change the way the parser reports errors (include line and column number of the error). */ parser code {: /* Change the method report_error so it will display the line and column of where the error occurred in the input as well as the reason for the error which is passed into the method in the String 'message'. */ public void report_error(String message, Object info) { /* Create a StringBuffer called 'm' with the string 'Error' in it. */ StringBuffer m = new StringBuffer("Error"); /* Check if the information passed to the method is the same type as the type java_cup.runtime.Symbol. */ if (info instanceof java_cup.runtime.Symbol) { /* Declare a java_cup.runtime.Symbol object 's' with the information in the object info that is being typecasted as a java_cup.runtime.Symbol object. */ java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info); /* Check if the line number in the input is greater or equal to zero. */ if (s.left >= 0) { /* Add to the end of the StringBuffer error message the line number of the error in the input. */ m.append(" in line "+(s.left+1)); /* Check if the column number in the input is greater or equal to zero. */ if (s.right >= 0) /* Add to the end of the StringBuffer error message the column number of the error in the input. */ m.append(", column "+(s.right+1)); } } /* Add to the end of the StringBuffer error message created in this method the message that was passed into this method. */ m.append(" : "+message); /* Print the contents of the StringBuffer 'm', which contains an error message, out on a line. */ System.err.println(m); } /* Change the method report_fatal_error so when it reports a fatal error it will display the line and column number of where the fatal error occurred in the input as well as the reason for the fatal error which is passed into the method in the object 'message' and then exit.*/ public void report_fatal_error(String message, Object info) { report_error(message, info); System.exit(1); } :}; /* ------------Declaration of Terminals and Non Terminals Section----------- */ /* Terminals (tokens returned by the scanner). Terminals that have no value are listed first and then terminals that do have an value, in this case an integer value, are listed on the next line down. */ terminal SEMI, PLUS, MINUS, TIMES, DIVIDE, LPAREN, RPAREN; terminal Integer NUMBER, ID; /* Non terminals used in the grammar section. Non terminals that have an object value are listed first and then non terminals that have an integer value are listed. An object value means that it can be any type, it isn't set to a specific type. So it could be an Integer or a String or whatever. */ non terminal Object expr_list, expr_part; non terminal Integer expr, factor, term; /* -------------Precedence and Associatively of Terminals Section----------- */ /* Precedence of non terminals could be defined here. If you do define precedence here you won't need to worry about precedence in the Grammar Section, i.e. that TIMES should have a higher precedence than PLUS. The precedence defined here would look something like this where the lower line always will have higher precedence than the line before it. precedence left PLUS, MINUS; precedence left TIMES, DIVIDE; */ /* ----------------------------Grammar Section-------------------- */ /* The grammar for our parser. expr_list ::= expr_list expr_part | expr_part expr_part ::= expr SEMI expr ::= expr PLUS factor | expr MINUS factor | factor factor ::= factor TIMES term | factor DIVIDE term | term term ::= LPAREN expr RPAREN | NUMBER | ID */ /* 'expr_list' is the start of our grammar. It can lead to another 'expr_list' followed by an 'expr_part' or it can just lead to an 'expr_part'. The lhs of the non terminals 'expr_list' and 'expr_part' that are in the rhs side of the production below need to be found. Then the rhs sides of those non terminals need to be followed in a similar manner, i.e. if there are any non terminals in the rhs of those productions then the productions with those non terminals need to be found and those rhs's followed. This process keeps continuing until only terminals are found in the rhs of a production. Then we can work our way back up the grammar bringing any values that might have been assigned from a terminal. */ expr_list ::= expr_list expr_part | expr_part; /* 'expr_part' is an 'expr' followed by the terminal 'SEMI'. The ':e' after the non terminal 'expr' is a label an is used to access the value of 'expr' which will be an integer. The action for the production lies between {: and :}. This action will print out the line " = + e" where e is the value of 'expr'. Before the action takes places we need to go deeper into the grammar since 'expr' is a non terminal. Whenever a non terminal is encountered on the rhs of a production we need to find the rhs of that non terminal until there are no more non terminals in the rhs. So when we finish going through the grammar and don't encounter any more non terminals in the rhs productions will return until we get back to 'expr' and at that point 'expr' will contain an integer value. */ expr_part ::= expr:e {: System.out.println(" = " + e); :} SEMI ; /* 'expr' can lead to 'expr PLUS factor', 'expr MINUS factor', or 'factor'. The 'TIMES' and 'DIVIDE' productions are not at this level. They are at a lower level in the grammar which in affect makes them have higher precedence. Actions for the rhs of the non terminal 'expr' return a value to 'expr'. This value that is created is an integer and gets stored in 'RESULT' in the action. RESULT is the label that is assigned automatically to the rhs, in this case 'expr'. If the rhs is just 'factor' then 'f' refers to the non terminal 'factor'. The value of 'f' is retrieved with the function 'intValue()' and will be stored in 'RESULT'. In the other two cases 'f' and 'e' refers to the non terminals 'factor' and 'expr' respectively with a terminal between them, either 'PLUS' or 'MINUS'. The value of each is retrieved with the same function 'intValue'. The values will be added or subtracted and then the new integer will be stored in 'RESULT'.*/ expr ::= expr:e PLUS factor:f {: RESULT = new Integer(e.intValue() + f.intValue()); :} | expr:e MINUS factor:f {: RESULT = new Integer(e.intValue() - f.intValue()); :} | factor:f {: RESULT = new Integer(f.intValue()); :} ; /* 'factor' can lead to 'factor TIMES term', 'factor DIVIDE term', or 'term'. Since the productions for TIMES and DIVIDE are lower in the grammar than 'PLUS' and 'MINUS' they will have higher precedence. The same sort of actions take place in the rhs of 'factor' as in 'expr'. The only difference is the operations that takes place on the values retrieved with 'intValue()', 'TIMES' and 'DIVIDE' here instead of 'PLUS' and 'MINUS'. */ factor ::= factor:f TIMES term:t {: RESULT = new Integer(f.intValue() * t.intValue()); :} | factor:f DIVIDE term:t {: RESULT = new Integer(f.intValue() / t.intValue()); :} | term:t {: RESULT = new Integer(t.intValue()); :} ; /* 'term' can lead to 'LPAREN expr RPAREN', 'NUMBER', or 'ID'. The first production has the non terminal 'expr' in it so the production with its lhs side needs to be found and followed. The next rhs has no non terminals. So the grammar ends here and can go back up. When it goes back up it will bring the value that was retrieved when the scanner encounter the token 'NUMBER'. 'RESULT' is assigned 'n', which refers to 'NUMBER', as the action for this production. The same action occurs for 'ID', except the 'i' is used to refer to 'ID'. 'ID' is also the only thing on the rhs of the production. And since 'ID' is a terminal the grammar will end here and go back up. */ term ::= LPAREN expr:e RPAREN {: RESULT = e; :} | NUMBER:n {: RESULT = n; :} | ID:i {: RESULT = i; :} ; jflex-1.4.3/examples/interpreter/0000755000175000017500000000000011141044624015507 5ustar moonmoonjflex-1.4.3/examples/interpreter/AST.java0000644000175000017500000000346007606571215017020 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * General interface for nodes in the abstract syntax tree. Contains * only the method toString which is already inherited from Object, * so the interface doesn't add any functionality. It only provides * a common super type for all elements in the AST. */ interface AST { public String toString(); // already inherited from Object } jflex-1.4.3/examples/interpreter/build.xml0000644000175000017500000000165607710750575017360 0ustar moonmoon jflex-1.4.3/examples/interpreter/example.as0000644000175000017500000000060307606571215017502 0ustar moonmoon // example program for interpreter testing // contains division and modulo functins input a,b functions div(x,y) = if x < y then 0 else div(x-y,y)+1 fi, mod(x,y) = if x < y then x else mod(x-y,y) fi output div(a,b), mod(a,b) arguments 324, 17 end jflex-1.4.3/examples/interpreter/Main.java0000644000175000017500000000644407710750543017261 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ import java.io.*; /** * Main program of the interpreter for the AS programming language. * Based on JFlex/CUP. * * Steps: * - scanning (Yylex) * - context free parsing and AST building (yyparse) * - build up symbol table (setSymtabs) * - check context conditions (checkcontext) * - prepare interpretation (prepInterp) * - start interpretation (interpret) */ public class Main { public static void main(String [] args) throws Exception { Reader reader = null; if (args.length == 1) { File input = new File(args[0]); if (!input.canRead()) { System.out.println("Error: could not read ["+input+"]"); } reader = new FileReader(input); } else { reader = new InputStreamReader(System.in); } Yylex scanner = new Yylex(reader); // create scanner SymTab symtab = new SymTab(); // set global symbol table scanner.setSymtab(symtab); parser parser = new parser(scanner); // create parser Tprogram syntaxbaum = null; try { syntaxbaum = (Tprogram) parser.parse().value; // parse } catch (Exception e) { e.printStackTrace(); } // System.out.println(symtab); System.out.println(syntaxbaum); syntaxbaum.setSymtabs(); // set symbol table // syntaxbaum.printSymtabs(); // print symbol table syntaxbaum.checkcontext(); // CoCo (DefVar, DefFun, Arity) if(contexterror>0) return; syntaxbaum.prepInterp(); // var. indices and function pointers // im Syntaxbaum setzen syntaxbaum.interpret(); // interpretation } static int contexterror = 0; // number of errors in context conditions public static void error(String s) { System.out.println((contexterror++)+". "+s); } } jflex-1.4.3/examples/interpreter/Makefile0000644000175000017500000000210607606571215017162 0ustar moonmoon# uses JFlex >= 1.3.2, and CUP >= 0.10j # # targets: # # make all # generates lexer, and parser, and compiles all *.java files # # make run (or just: make) # starts the program on a test example # .SUFFIXES: $(SUFFIXES) .class .java .java.class: javac $*.java FILE= Yylex.java parser.java sym.java \ SymTab.java AST.java \ Tnumber.java Tident.java Texp.java \ Tfun.java Texpinfix.java Tuminus.java \ Tboolexp.java Tifthenelse.java \ Tdekl.java Tdekllist.java \ Tparlist.java Texplist.java Tprogram.java \ Main.java \ SymtabEntry.java STEfun.java STEvar.java run: all java Main < example.as all: Yylex.java parser.java $(FILE:java=class) clean: rm -f *.class *~ *.bak Yylex.java parser.java sym.java Yylex.java: scanner.flex jflex scanner.flex parser.java: parser.cup java java_cup.Main -interface < parser.cup jflex-1.4.3/examples/interpreter/parser.cup0000644000175000017500000001053307606571215017532 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // definition of tokens, if applicable with token type terminal INPUT, FUNCTIONS, OUTPUT, END, ARGUMENTS; terminal IF, THEN, ELSE, FI, ERROR; terminal COMMA, LPAR, RPAR; terminal EQ, LE, LEQ, MINUS, PLUS, TIMES, DIV, UMINUS; terminal String ID, NUMBER; non terminal Tprogram program; non terminal Tparlist parlist; non terminal Texplist explist; non terminal Tdekllist dekllist; non terminal Tdekl dekl; non terminal Texp exp; non terminal Tboolexp boolexp; non terminal Tident ident; non terminal Tnumber number; // precedences, left associativity precedence left EQ, LE, LEQ; precedence left MINUS, PLUS; precedence left TIMES, DIV; precedence left UMINUS; // here the rules start program ::= INPUT parlist:p FUNCTIONS dekllist:d OUTPUT explist:o ARGUMENTS explist:a END {: RESULT = new Tprogram(p,d,o,a); :} ; parlist ::= ident:i {: RESULT = new Tparlist(i); :} | parlist:p COMMA ident:i {: RESULT = new Tparlist(p,i); :} ; explist ::= exp:e {: RESULT = new Texplist(e); :} | explist:l COMMA exp:e {: RESULT = new Texplist(l,e); :} ; dekllist ::= dekl:d {: RESULT = new Tdekllist(d);:} | dekllist:l COMMA dekl:d {: RESULT = new Tdekllist(l,d); :} ; dekl ::= ident:i LPAR parlist:p RPAR EQ exp:e {: RESULT = new Tdekl(i,p,e); :} ; exp ::= number:n {: RESULT = n; :} | ident:i {: RESULT = i; :} | ident:i LPAR explist:e RPAR {: RESULT = new Tfun(i,e); :} | LPAR exp:e RPAR {: RESULT = e; :} | MINUS exp:e {: RESULT = new Tuminus(e); :} %prec UMINUS | exp:l PLUS exp:r {: RESULT = new Texpinfix(l,'+',r); :} | exp:l TIMES exp:r {: RESULT = new Texpinfix(l,'*',r); :} | exp:l DIV exp:r {: RESULT = new Texpinfix(l,'/',r); :} | exp:l MINUS exp:r {: RESULT = new Texpinfix(l,'-',r); :} | IF boolexp:b THEN exp:t ELSE exp:e FI {: RESULT = new Tifthenelse(b,t,e); :} ; boolexp ::= exp:l EQ exp:r {: RESULT = new Tboolexp(l,'=',r); :} | exp:l LE exp:r {: RESULT = new Tboolexp(l,'<',r); :} | exp:l LEQ exp:r {: RESULT = new Tboolexp(l,'!',r); :} ; ident ::= ID:n {: RESULT = new Tident(n); :} ; number ::= NUMBER:z {: RESULT = new Tnumber(z); :} ; jflex-1.4.3/examples/interpreter/README0000644000175000017500000000174407606571215016411 0ustar moonmoonThis directory contains an interpreter for a small functional programming language (called "AS"). It uses JFlex and CUP. Directory contents: - Main.java is the main program. It reads an AS program from std in and interprets it. - Makefile runs jflex, cup, javac and the compiled interpreter - Classes beginning with "T" implement the abstract syntax tree. They also contain context condition checking and the interpreter. - Symtab.java, SymtabEntry.java, STEfun.java, STEvar.java implement the symbol table. - scanner.lex and parser.cup contain the scanner and parser. - example.as is an example program in AS The language is described in: Manfred Broy: Einfuehrung in die Informatik, Springer Verlag The files are a solution to excercise 3.40 in the book: Manfred Broy,Bernhard Rumpe: Uebungen zur Einfuehrung in die Informatik -- Strukturierte Aufgabensammlung mit Musterloesungen, Springer Verlag, 2001 Both books are only available in German. Sorry. jflex-1.4.3/examples/interpreter/scanner.flex0000644000175000017500000000545007606571215020040 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ import java_cup.runtime.Symbol; %% %cup %implements sym %{ SymTab symtab; // externe symbol table public void setSymtab(SymTab symtab) { this.symtab = symtab; } private Symbol sym(int sym) { return new Symbol(sym); } private Symbol sym(int sym, Object val) { return new Symbol(sym, val); } %} %% "arguments" { return sym(ARGUMENTS); } "input" { return sym(INPUT); } "functions" { return sym(FUNCTIONS); } "output" { return sym(OUTPUT); } "end" { return sym(END); } "if" { return sym(IF); } "then" { return sym(THEN); } "else" { return sym(ELSE); } "fi" { return sym(FI); } [a-z]+ { symtab.enter(yytext(),new SymtabEntry(yytext())); return sym(ID,yytext()); } [0-9]+ { return sym(NUMBER,yytext()); } "," { return sym(COMMA); } "(" { return sym(LPAR); } ")" { return sym(RPAR); } "=" { return sym(EQ); } "-" { return sym(MINUS); } "+" { return sym(PLUS); } "*" { return sym(TIMES); } "/" { return sym(DIV); } "<" { return sym(LE); } "<=" { return sym(LEQ); } [\ \t\b\f\r\n]+ { /* eat whitespace */ } "//"[^\n]* { /* one-line comment */ } . { throw new Error("Unexpected character ["+yytext()+"]"); } jflex-1.4.3/examples/interpreter/STEfun.java0000644000175000017500000000372007606571215017534 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Symbol table entry for functions. * * Contains arity and reference to location of definition */ class STEfun extends SymtabEntry { int arity; Tdekl dekl; // location of definition public STEfun(String f, Tdekl d, int a) { super(f); dekl=d; arity=a; } public int kind() { return SymtabEntry.FUN; } public String toString() { return "function "+name+", arity "+arity; } public int arity() { return arity; } public Tdekl getDekl() { return dekl; } } jflex-1.4.3/examples/interpreter/STEvar.java0000644000175000017500000000410707606571215017534 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Symbol table entry for variables. * * Contains index in the parameter list and a flag if it * is an input variable. */ class STEvar extends SymtabEntry { boolean is_input; int index; public STEvar(String v, boolean ii, int ind) { super(v); is_input=ii; index=ind; } public int kind() { return SymtabEntry.VAR; } public String toString() { if (is_input) return "input var "+name+" ("+index+")"; else return "parameter "+name+" ("+index+")"; } public int getIndex() { return index; } public boolean isInput() { return is_input; } } jflex-1.4.3/examples/interpreter/SymTab.java0000644000175000017500000000534707606571215017576 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ import java.util.*; /** * Symbol table for the interpreter, contains information about * variables and functions. * * For every binding location of a name a symbol will be created. * The symbol tables are connected hierarchically by pointers to * the predecessor. Lookup takes predecessors into account. */ public class SymTab { Hashtable h; // contains the liste of words // key: String, value: SymtabEntry SymTab pred; // predecessor symbol table (if exists) public SymTab() { this(null); } public SymTab(SymTab p) { h = new Hashtable(); pred = p; } public boolean enter(String s, SymtabEntry e) { Object value = lookup(s); h.put(s, e); return(value==null); } public SymtabEntry lookup(String s) { Object value = h.get(s); if (value==null && pred!=null) value = pred.lookup(s); return ((SymtabEntry)value); } public String toString() { // for output with print String res = "symbol table\n=============\n"; Enumeration e = h.keys(); String key; while(e.hasMoreElements()) { key = (String)e.nextElement(); res += key+" \t"+h.get(key)+"\n"; } if (pred!=null) res+="++ predecessor!\n"; return(res); } public int size() { return(h.size()); } } jflex-1.4.3/examples/interpreter/SymtabEntry.java0000644000175000017500000000362107606571215020651 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Symbol table entry for names, there are subclasses for * variables and functions. * * Defines constants UNKNOWN, VAR und FUN as kinds of * symbol table entries. */ class SymtabEntry { String name; public SymtabEntry(String v) { name=v; } public int kind() { return UNKNOWN; } public String toString() { return("unknown "+name); } static final int UNKNOWN = 12; static final int VAR = 13; static final int FUN = 14; } jflex-1.4.3/examples/interpreter/Tboolexp.java0000644000175000017500000000454207606571215020167 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for bool expressions */ class Tboolexp implements AST { Texp exp1, exp2; // left and right subexpression char kind; // '=', '<' and '!' for "<=" public Tboolexp(Texp e1, char k, Texp e2) { exp1=e1; kind=k; exp2=e2; } public String toString() { if (kind!='!') return(""+exp1+kind+exp2); else return(exp1+"<="+exp2); } public void checkcontext(SymTab st) { // context conditions exp1.checkcontext(st); exp2.checkcontext(st); } public void prepInterp(SymTab st) { // set pointers and indices exp1.prepInterp(st); exp2.prepInterp(st); } public boolean interpret(int[] in, int[] par) { int e1 = exp1.interpret(in,par); int e2 = exp2.interpret(in,par); switch(kind) { case '=': return(e1==e2); case '<': return(e1 * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for function declarations. * * Also contains a reference to the symbol table of * the paramaters and their arity. */ class Tdekl implements AST { Tident ident; // identifier Tparlist parlist; // liste of parameter Texp exp; // function body public Tdekl(Tident i, Tparlist p, Texp e) { parlist=p; ident=i; exp=e; } public String toString() { return(ident+"("+parlist+") = \n "+exp); } SymTab params; // symbol table of the parameters int arity; public void setSymtab(SymTab st) { params = new SymTab(st); parlist.setSymtab(params,false,0); arity = params.size(); boolean isNew = st.enter(ident.toString(), new STEfun(ident.toString(),this,arity)); // CoCo (Fun) if(!isNew) Main.error("funktion "+ident+" defined twice!"); } public void printSymtabs() { System.out.print("funktion "+ident.toString()+"\n"+params); } public void checkcontext() { exp.checkcontext(params); // CoCo (DefFun,DefVar,Arity) } public void prepInterp(SymTab st) { // set pointers and indices exp.prepInterp(params); } public int interpret(int[] in, int[] par) { return(exp.interpret(in,par)); } public int arity() { return(arity); } } jflex-1.4.3/examples/interpreter/Tdekllist.java0000644000175000017500000000475710036465164020336 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for declaration lists of functions */ class Tdekllist implements AST { Tdekllist dekllist; // rest list (optional null) Tdekl dekl; // declaration public Tdekllist(Tdekllist p, Tdekl e) { dekllist=p; dekl=e; } public Tdekllist(Tdekl e) { dekllist=null; dekl=e; } public String toString() { if (dekllist!=null) return(dekllist+",\n"+dekl); else return(dekl.toString()); } public void setSymtab(SymTab st) { if (dekllist!=null) dekllist.setSymtab(st); dekl.setSymtab(st); } public void printSymtabs() { if (dekllist!=null) dekllist.printSymtabs(); dekl.printSymtabs(); } public void checkcontext() { if (dekllist!=null) dekllist.checkcontext(); dekl.checkcontext(); // CoCo (DefFun,DefVar,Arity) } // in function body public void prepInterp(SymTab st) { // set pointers and indices dekl.prepInterp(st); if (dekllist!=null) dekllist.prepInterp(st); } } jflex-1.4.3/examples/interpreter/Texp.java0000644000175000017500000000422107606571215017305 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for an integer expression. * * The non terminal exp is the sum of multiple variants and * therefore modeled as an abstract class. * * The interpretation function interpret is called with * valuations of input variables in and parameters * par. Before interpret can be called, pointers * and variable indices must be set with prepInterp. */ abstract class Texp implements AST { // test context conditions (DefFun,DefVar,Arity) abstract public void checkcontext(SymTab st); // set pointers and indices for variables and functions abstract public void prepInterp(SymTab st); // interpretation abstract public int interpret(int[] in, int[] par); } jflex-1.4.3/examples/interpreter/Texpinfix.java0000644000175000017500000000452507606571215020352 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for infix expressions */ class Texpinfix extends Texp implements AST { Texp exp1, exp2; // left and right sub expression char kind; // kind ('+', '-', '*', '/') public Texpinfix(Texp e1, char k, Texp e2) { exp1=e1; kind=k; exp2=e2; } public String toString() { return("("+exp1+kind+exp2+")"); } public void checkcontext(SymTab st) { // context conditions exp1.checkcontext(st); exp2.checkcontext(st); } public void prepInterp(SymTab st) { // set pointers und indices exp1.prepInterp(st); exp2.prepInterp(st); } public int interpret(int[] in, int[] par) { int e1 = exp1.interpret(in,par); int e2 = exp2.interpret(in,par); switch (kind) { case '+': return(e1+e2); case '-': return(e1-e2); case '*': return(e1*e2); case '/': return(e1/e2); } return -1; // error } } jflex-1.4.3/examples/interpreter/Texplist.java0000644000175000017500000000530207606571215020202 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for a list of expressions. * * The interpretation of a list of expressions stores the * results of the expressions in an array that can be used * as parameter list for function calls. */ class Texplist implements AST { Texplist explist; // next list element (optional null) Texp exp; // expression of this list node public Texplist(Texplist p, Texp e) { explist=p; exp=e; } public Texplist(Texp e) { explist=null; exp=e; } public String toString() { if (explist!=null) return explist+","+exp; else return exp.toString(); } public void checkcontext(SymTab st) { if (explist!=null) explist.checkcontext(st); exp.checkcontext(st); // CoCo (DefFun,DefVar,Arity) } // in expression public int length() { if (explist!=null) return 1+explist.length(); else return 1; } public void prepInterp(SymTab st) { // set pointers and indices exp.prepInterp(st); if (explist!=null) explist.prepInterp(st); } public void interpret(int[] in, int[] par, int[] res, int index) { res[index] = exp.interpret(in,par); if (explist!=null) explist.interpret(in,par,res,index+1); } } jflex-1.4.3/examples/interpreter/Tfun.java0000644000175000017500000000527207606571215017310 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for function application. * * Also contains pointer to declaration location of the function. */ class Tfun extends Texp implements AST { Tident ident; // name of the function Texplist explist; // parameter list public Tfun(Tident i, Texplist e) { ident=i; explist=e; } public String toString() { return ident+"("+explist+")"; } public void checkcontext(SymTab st) { // CoCo (DefFun,Arity) explist.checkcontext(st); SymtabEntry ste = st.lookup(ident.toString()); if (ste==null) Main.error("function not defined: "+ident); else if (ste.kind() != SymtabEntry.FUN) Main.error("variable used as funktion: "+ident); else if (((STEfun)ste).arity() != explist.length()) Main.error("wrong arity at function call: "+ident); } Tdekl fundekl; // pointer to location of function declaration // set pointers and indices public void prepInterp(SymTab st) { fundekl = ((STEfun)st.lookup(ident.toString())).getDekl(); explist.prepInterp(st); } public int interpret(int[] in, int[] par) { int[] newparams = new int[fundekl.arity()]; explist.interpret(in,par,newparams,0); return fundekl.interpret(in,newparams); } } jflex-1.4.3/examples/interpreter/Tident.java0000644000175000017500000000452007606571215017616 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for an identifier */ class Tident extends Texp implements AST { String name; public Tident(String s) { name = s; } public String toString() { return name; } public void checkcontext(SymTab st) { // CoCo (DefVar) SymtabEntry ste = st.lookup(name); if (ste==null) Main.error("variable not defined: "+name); else if (ste.kind() != SymtabEntry.VAR) Main.error("function used as variable: "+name); } int index; // number of ident in environment boolean is_input; // is it an input variable? public void prepInterp(SymTab st) { // set index for environment STEvar ste = (STEvar)st.lookup(name); index = ste.getIndex(); is_input = ste.isInput(); } public int interpret(int[] in, int[] par) { if (is_input) return(in[index]); else return(par[index]); } } jflex-1.4.3/examples/interpreter/Tifthenelse.java0000644000175000017500000000437607606571215020652 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for if-then-else expressions */ class Tifthenelse extends Texp implements AST { Tboolexp boolexp; // condition Texp exp1, exp2; // then and else branch public Tifthenelse(Tboolexp b, Texp e1, Texp e2) { boolexp=b; exp1=e1; exp2=e2; } public String toString() { return "if "+boolexp+" then "+exp1+" else "+exp2+" fi"; } public void checkcontext(SymTab st) { boolexp.checkcontext(st); exp1.checkcontext(st); exp2.checkcontext(st); } public void prepInterp(SymTab st) { boolexp.prepInterp(st); exp1.prepInterp(st); exp2.prepInterp(st); } public int interpret(int[] in, int[] par) { boolean b = boolexp.interpret(in,par); if (b) return exp1.interpret(in,par); else return exp2.interpret(in,par); } } jflex-1.4.3/examples/interpreter/Tnumber.java0000644000175000017500000000357607606571215020015 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for a number */ class Tnumber extends Texp implements AST { int n; // value of the number public Tnumber(String s) { try { n = Integer.parseInt(s); } catch (NumberFormatException e) { n=-1; }; } public String toString() { return(""+n); } public void checkcontext(SymTab st) { } public void prepInterp(SymTab st) { } public int interpret(int[] in, int[] par) { return(n); } } jflex-1.4.3/examples/interpreter/Tparlist.java0000644000175000017500000000431607606571215020174 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for a parameter list. */ class Tparlist implements AST { Tparlist parlist; // rest of the liste (optional null) Tident ident; // identifier public Tparlist(Tparlist p, Tident i) { parlist=p; ident=i; } public Tparlist(Tident i) { parlist=null; ident=i; } public String toString() { if (parlist!=null) return parlist+","+ident; else return ident.toString(); } public void setSymtab(SymTab st, boolean isInput, int index) { boolean isNew = st.enter(ident.toString(), new STEvar(ident.toString(), isInput, index)); if (!isNew) Main.error("Variable "+ident+" defined twice!"); if (parlist!=null) parlist.setSymtab(st, isInput, index+1); } } jflex-1.4.3/examples/interpreter/Tprogram.java0000644000175000017500000000747307606571215020174 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for the whole program (top node). * * Also contains two symbol tables, one for input variables, * one for function names. * * All operations like context check, symbol table build up * etc. start here. */ class Tprogram implements AST { Tparlist parlist; // input variables Tdekllist dekllist; // function declarations Texplist explist; // result expressions Texplist arguments; // input values public Tprogram(Tparlist p, Tdekllist d, Texplist e, Texplist a) { parlist=p; dekllist=d; explist=e; arguments=a; } public String toString() { return("Program:\n=============\ninput "+parlist+ "\nfunctions\n"+dekllist+"\noutput "+explist+ "\narguments "+arguments+"\nend"); } SymTab inputs; // table of input variables SymTab functions; // table of functions public void setSymtabs() { // calculate symbol table entries inputs = new SymTab(); // set input variables parlist.setSymtab(inputs, true, 0); functions = new SymTab(inputs); dekllist.setSymtab(functions); } public void printSymtabs() { System.out.print("Input variables-\n"+inputs); System.out.print("Functions-\n"+functions); dekllist.printSymtabs(); } public void checkcontext() { dekllist.checkcontext(); // CoCo (DefFun,DefVar,Arity) // in function bodies explist.checkcontext(functions); // CoCo (DefFun,DefVar,Arity) // in result expressions arguments.checkcontext(new SymTab()); // CoCo (constants) // in arguments if (arguments.length()!=inputs.size()) Main.error("Argument list and input variables list differ!"); } public void prepInterp() { // set pointers and indices dekllist.prepInterp(functions); explist.prepInterp(functions); } public void interpret() { int[] inputEnv = new int[inputs.size()]; // set input arguments.interpret(null,null,inputEnv,0); System.out.println("Result:\n============="); int[] ergebnis = new int[explist.length()]; explist.interpret(inputEnv,null,ergebnis,0); // calculate result int i; for (i=explist.length()-1; i > 0; i--) System.out.print(ergebnis[i]+", "); System.out.println(ergebnis[i]); } } jflex-1.4.3/examples/interpreter/Tuminus.java0000644000175000017500000000364607606571215020043 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2001 Gerwin Klein * * Copyright (C) 2001 Bernhard Rumpe * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * AST node for unary minus expressions. */ class Tuminus extends Texp implements AST { Texp exp; // the negated expression public Tuminus(Texp e) { exp=e; } public String toString() { return "-"+exp; } public void checkcontext(SymTab st) { exp.checkcontext(st); } public void prepInterp(SymTab st) { exp.prepInterp(st); } public int interpret(int[] in, int[] par) { return -(exp.interpret(in,par)); } } jflex-1.4.3/examples/java/0000755000175000017500000000000011141044624014065 5ustar moonmoonjflex-1.4.3/examples/java/build.xml0000644000175000017500000000234407710751751015726 0ustar moonmoon jflex-1.4.3/examples/java/java.flex0000644000175000017500000003421211141043444015667 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* Java 1.2 language lexer specification */ /* Use together with unicode.flex for Unicode preprocesssing */ /* and java12.cup for a Java 1.2 parser */ /* Note that this lexer specification is not tuned for speed. It is in fact quite slow on integer and floating point literals, because the input is read twice and the methods used to parse the numbers are not very fast. For a production quality application (e.g. a Java compiler) this could be optimized */ import java_cup.runtime.*; %% %public %class Scanner %implements sym %unicode %line %column %cup %cupdebug %{ StringBuffer string = new StringBuffer(); private Symbol symbol(int type) { return new JavaSymbol(type, yyline+1, yycolumn+1); } private Symbol symbol(int type, Object value) { return new JavaSymbol(type, yyline+1, yycolumn+1, value); } /** * assumes correct representation of a long value for * specified radix in scanner buffer from start * to end */ private long parseLong(int start, int end, int radix) { long result = 0; long digit; for (int i = start; i < end; i++) { digit = Character.digit(yycharat(i),radix); result*= radix; result+= digit; } return result; } %} /* main character classes */ LineTerminator = \r|\n|\r\n InputCharacter = [^\r\n] WhiteSpace = {LineTerminator} | [ \t\f] /* comments */ Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment} TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/" EndOfLineComment = "//" {InputCharacter}* {LineTerminator}? DocumentationComment = "/*" "*"+ [^/*] ~"*/" /* identifiers */ Identifier = [:jletter:][:jletterdigit:]* /* integer literals */ DecIntegerLiteral = 0 | [1-9][0-9]* DecLongLiteral = {DecIntegerLiteral} [lL] HexIntegerLiteral = 0 [xX] 0* {HexDigit} {1,8} HexLongLiteral = 0 [xX] 0* {HexDigit} {1,16} [lL] HexDigit = [0-9a-fA-F] OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15} OctLongLiteral = 0+ 1? {OctDigit} {1,21} [lL] OctDigit = [0-7] /* floating point literals */ FloatLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? [fF] DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? FLit1 = [0-9]+ \. [0-9]* FLit2 = \. [0-9]+ FLit3 = [0-9]+ Exponent = [eE] [+-]? [0-9]+ /* string and character literals */ StringCharacter = [^\r\n\"\\] SingleCharacter = [^\r\n\'\\] %state STRING, CHARLITERAL %% { /* keywords */ "abstract" { return symbol(ABSTRACT); } "boolean" { return symbol(BOOLEAN); } "break" { return symbol(BREAK); } "byte" { return symbol(BYTE); } "case" { return symbol(CASE); } "catch" { return symbol(CATCH); } "char" { return symbol(CHAR); } "class" { return symbol(CLASS); } "const" { return symbol(CONST); } "continue" { return symbol(CONTINUE); } "do" { return symbol(DO); } "double" { return symbol(DOUBLE); } "else" { return symbol(ELSE); } "extends" { return symbol(EXTENDS); } "final" { return symbol(FINAL); } "finally" { return symbol(FINALLY); } "float" { return symbol(FLOAT); } "for" { return symbol(FOR); } "default" { return symbol(DEFAULT); } "implements" { return symbol(IMPLEMENTS); } "import" { return symbol(IMPORT); } "instanceof" { return symbol(INSTANCEOF); } "int" { return symbol(INT); } "interface" { return symbol(INTERFACE); } "long" { return symbol(LONG); } "native" { return symbol(NATIVE); } "new" { return symbol(NEW); } "goto" { return symbol(GOTO); } "if" { return symbol(IF); } "public" { return symbol(PUBLIC); } "short" { return symbol(SHORT); } "super" { return symbol(SUPER); } "switch" { return symbol(SWITCH); } "synchronized" { return symbol(SYNCHRONIZED); } "package" { return symbol(PACKAGE); } "private" { return symbol(PRIVATE); } "protected" { return symbol(PROTECTED); } "transient" { return symbol(TRANSIENT); } "return" { return symbol(RETURN); } "void" { return symbol(VOID); } "static" { return symbol(STATIC); } "while" { return symbol(WHILE); } "this" { return symbol(THIS); } "throw" { return symbol(THROW); } "throws" { return symbol(THROWS); } "try" { return symbol(TRY); } "volatile" { return symbol(VOLATILE); } "strictfp" { return symbol(STRICTFP); } /* boolean literals */ "true" { return symbol(BOOLEAN_LITERAL, new Boolean(true)); } "false" { return symbol(BOOLEAN_LITERAL, new Boolean(false)); } /* null literal */ "null" { return symbol(NULL_LITERAL); } /* separators */ "(" { return symbol(LPAREN); } ")" { return symbol(RPAREN); } "{" { return symbol(LBRACE); } "}" { return symbol(RBRACE); } "[" { return symbol(LBRACK); } "]" { return symbol(RBRACK); } ";" { return symbol(SEMICOLON); } "," { return symbol(COMMA); } "." { return symbol(DOT); } /* operators */ "=" { return symbol(EQ); } ">" { return symbol(GT); } "<" { return symbol(LT); } "!" { return symbol(NOT); } "~" { return symbol(COMP); } "?" { return symbol(QUESTION); } ":" { return symbol(COLON); } "==" { return symbol(EQEQ); } "<=" { return symbol(LTEQ); } ">=" { return symbol(GTEQ); } "!=" { return symbol(NOTEQ); } "&&" { return symbol(ANDAND); } "||" { return symbol(OROR); } "++" { return symbol(PLUSPLUS); } "--" { return symbol(MINUSMINUS); } "+" { return symbol(PLUS); } "-" { return symbol(MINUS); } "*" { return symbol(MULT); } "/" { return symbol(DIV); } "&" { return symbol(AND); } "|" { return symbol(OR); } "^" { return symbol(XOR); } "%" { return symbol(MOD); } "<<" { return symbol(LSHIFT); } ">>" { return symbol(RSHIFT); } ">>>" { return symbol(URSHIFT); } "+=" { return symbol(PLUSEQ); } "-=" { return symbol(MINUSEQ); } "*=" { return symbol(MULTEQ); } "/=" { return symbol(DIVEQ); } "&=" { return symbol(ANDEQ); } "|=" { return symbol(OREQ); } "^=" { return symbol(XOREQ); } "%=" { return symbol(MODEQ); } "<<=" { return symbol(LSHIFTEQ); } ">>=" { return symbol(RSHIFTEQ); } ">>>=" { return symbol(URSHIFTEQ); } /* string literal */ \" { yybegin(STRING); string.setLength(0); } /* character literal */ \' { yybegin(CHARLITERAL); } /* numeric literals */ /* This is matched together with the minus, because the number is too big to be represented by a positive integer. */ "-2147483648" { return symbol(INTEGER_LITERAL, new Integer(Integer.MIN_VALUE)); } {DecIntegerLiteral} { return symbol(INTEGER_LITERAL, new Integer(yytext())); } {DecLongLiteral} { return symbol(INTEGER_LITERAL, new Long(yytext().substring(0,yylength()-1))); } {HexIntegerLiteral} { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(2, yylength(), 16))); } {HexLongLiteral} { return symbol(INTEGER_LITERAL, new Long(parseLong(2, yylength()-1, 16))); } {OctIntegerLiteral} { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(0, yylength(), 8))); } {OctLongLiteral} { return symbol(INTEGER_LITERAL, new Long(parseLong(0, yylength()-1, 8))); } {FloatLiteral} { return symbol(FLOATING_POINT_LITERAL, new Float(yytext().substring(0,yylength()-1))); } {DoubleLiteral} { return symbol(FLOATING_POINT_LITERAL, new Double(yytext())); } {DoubleLiteral}[dD] { return symbol(FLOATING_POINT_LITERAL, new Double(yytext().substring(0,yylength()-1))); } /* comments */ {Comment} { /* ignore */ } /* whitespace */ {WhiteSpace} { /* ignore */ } /* identifiers */ {Identifier} { return symbol(IDENTIFIER, yytext()); } } { \" { yybegin(YYINITIAL); return symbol(STRING_LITERAL, string.toString()); } {StringCharacter}+ { string.append( yytext() ); } /* escape sequences */ "\\b" { string.append( '\b' ); } "\\t" { string.append( '\t' ); } "\\n" { string.append( '\n' ); } "\\f" { string.append( '\f' ); } "\\r" { string.append( '\r' ); } "\\\"" { string.append( '\"' ); } "\\'" { string.append( '\'' ); } "\\\\" { string.append( '\\' ); } \\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1),8); string.append( val ); } /* error cases */ \\. { throw new RuntimeException("Illegal escape sequence \""+yytext()+"\""); } {LineTerminator} { throw new RuntimeException("Unterminated string at end of line"); } } { {SingleCharacter}\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character(yytext().charAt(0))); } /* escape sequences */ "\\b"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\b'));} "\\t"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\t'));} "\\n"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\n'));} "\\f"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\f'));} "\\r"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\r'));} "\\\""\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\"'));} "\\'"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\''));} "\\\\"\' { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, new Character('\\')); } \\[0-3]?{OctDigit}?{OctDigit}\' { yybegin(YYINITIAL); int val = Integer.parseInt(yytext().substring(1,yylength()-1),8); return symbol(CHARACTER_LITERAL, new Character((char)val)); } /* error cases */ \\. { throw new RuntimeException("Illegal escape sequence \""+yytext()+"\""); } {LineTerminator} { throw new RuntimeException("Unterminated character literal at end of line"); } } /* error fallback */ .|\n { throw new RuntimeException("Illegal character \""+yytext()+ "\" at line "+yyline+", column "+yycolumn); } <> { return symbol(EOF); } jflex-1.4.3/examples/java/java12.cup0000644000175000017500000005525211140766326015704 0ustar moonmoonimport java_cup.runtime.*; /* August 1999 - modified by Gerwin Klein to interface with JFlex scanners, allows empty semicolon in class decls. changed productions: class_member_declaration ::= field_declaration | method_declaration [..] | interface_declaration | SEMICOLON ; interface_member_declaration ::= constant_declaration | abstract_method_declaration | class_declaration | interface_declaration | SEMICOLON ; */ /* Java 1.2 parser for CUP. * Copyright (C) 1998 C. Scott Ananian * This program is released under the terms of the GPL; see the file * COPYING for more details. There is NO WARRANTY on this code. */ /* JDK 1.2 Features added: strictfp modifier. explicit_constructor_invocation ::= ... | primary DOT THIS LPAREN argument_list_opt RPAREN SEMICOLON ; field_access ::= ... | name DOT SUPER DOT IDENTIFIER ; method_invocation ::= ... | name DOT SUPER DOT IDENTIFIER LPAREN argument_list_opt RPAREN ; */ parser code {: public void report_error(String message, Object info) { StringBuffer m = new StringBuffer("Error "); if (info instanceof java_cup.runtime.Symbol) m.append( "("+info.toString()+")" ); m.append(" : "+message); System.out.println(m); } public void report_fatal_error(String message, Object info) { report_error(message, info); throw new RuntimeException("Fatal Syntax Error"); } :}; terminal BOOLEAN; // primitive_type terminal BYTE, SHORT, INT, LONG, CHAR; // integral_type terminal FLOAT, DOUBLE; // floating_point_type terminal LBRACK, RBRACK; // array_type terminal DOT; // qualified_name terminal SEMICOLON, MULT, COMMA, LBRACE, RBRACE, EQ, LPAREN, RPAREN, COLON; terminal PACKAGE; // package_declaration terminal IMPORT; // import_declaration terminal PUBLIC, PROTECTED, PRIVATE; // modifier terminal STATIC; // modifier terminal ABSTRACT, FINAL, NATIVE, SYNCHRONIZED, TRANSIENT, VOLATILE; terminal CLASS; // class_declaration terminal EXTENDS; // super terminal IMPLEMENTS; // interfaces terminal VOID; // method_header terminal THROWS; // throws terminal THIS, SUPER; // explicit_constructor_invocation terminal INTERFACE; // interface_declaration terminal IF, ELSE; // if_then_statement, if_then_else_statement terminal SWITCH; // switch_statement terminal CASE, DEFAULT; // switch_label terminal DO, WHILE; // while_statement, do_statement terminal FOR; // for_statement terminal BREAK; // break_statement terminal CONTINUE; // continue_statement terminal RETURN; // return_statement terminal THROW; // throw_statement terminal TRY; // try_statement terminal CATCH; // catch_clause terminal FINALLY; // finally terminal NEW; // class_instance_creation_expression terminal PLUSPLUS; // postincrement_expression terminal MINUSMINUS; // postdecrement_expression terminal PLUS, MINUS, COMP, NOT, DIV, MOD; terminal LSHIFT, RSHIFT, URSHIFT; // shift_expression terminal LT, GT, LTEQ, GTEQ, INSTANCEOF; // relational_expression terminal EQEQ, NOTEQ; // equality_expression terminal AND; // and_expression terminal XOR; // exclusive_or_expression terminal OR; // inclusive_or_expression terminal ANDAND; // conditional_and_expression terminal OROR; // conditional_or_expression terminal QUESTION; // conditional_expression terminal MULTEQ, DIVEQ, MODEQ, PLUSEQ, MINUSEQ; // assignment_operator terminal LSHIFTEQ, RSHIFTEQ, URSHIFTEQ; // assignment_operator terminal ANDEQ, XOREQ, OREQ; // assignment_operator terminal java.lang.Number INTEGER_LITERAL; terminal java.lang.Number FLOATING_POINT_LITERAL; terminal java.lang.Boolean BOOLEAN_LITERAL; terminal java.lang.Character CHARACTER_LITERAL; terminal java.lang.String STRING_LITERAL; terminal java.lang.String IDENTIFIER; // name terminal NULL_LITERAL; // strictfp keyword, new in Java 1.2 terminal STRICTFP; // Reserved but unused: terminal CONST, GOTO; // 19.2) The Syntactic Grammar non terminal goal; // 19.3) Lexical Structure non terminal literal; // 19.4) Types, Values, and Variables non terminal type, primitive_type, numeric_type; non terminal integral_type, floating_point_type; non terminal reference_type; non terminal class_or_interface_type; non terminal class_type, interface_type; non terminal array_type; // 19.5) Names non terminal name, simple_name, qualified_name; // 19.6) Packages non terminal compilation_unit; non terminal package_declaration_opt, package_declaration; non terminal import_declarations_opt, import_declarations; non terminal type_declarations_opt, type_declarations; non terminal import_declaration; non terminal single_type_import_declaration; non terminal type_import_on_demand_declaration; non terminal type_declaration; // 19.7) Productions used only in the LALR(1) grammar non terminal modifiers_opt, modifiers, modifier; // 19.8.1) Class Declaration non terminal class_declaration, super_cl, super_opt; non terminal interfaces, interfaces_opt, interface_type_list; non terminal class_body; non terminal class_body_declarations, class_body_declarations_opt; non terminal class_body_declaration, class_member_declaration; // 19.8.2) Field Declarations non terminal field_declaration, variable_declarators, variable_declarator; non terminal variable_declarator_id, variable_initializer; // 19.8.3) Method Declarations non terminal method_declaration, method_header, method_declarator; non terminal formal_parameter_list_opt, formal_parameter_list; non terminal formal_parameter; non terminal throws_opt, throws; non terminal class_type_list, method_body; // 19.8.4) Static Initializers non terminal static_initializer; // 19.8.5) Constructor Declarations non terminal constructor_declaration, constructor_declarator; non terminal constructor_body; non terminal explicit_constructor_invocation; // 19.9.1) Interface Declarations non terminal interface_declaration; non terminal extends_interfaces_opt, extends_interfaces; non terminal interface_body; non terminal interface_member_declarations_opt, interface_member_declarations; non terminal interface_member_declaration, constant_declaration; non terminal abstract_method_declaration; // 19.10) Arrays non terminal array_initializer; non terminal variable_initializers; // 19.11) Blocks and Statements non terminal block; non terminal block_statements_opt, block_statements, block_statement; non terminal local_variable_declaration_statement, local_variable_declaration; non terminal statement, statement_no_short_if; non terminal statement_without_trailing_substatement; non terminal empty_statement; non terminal labeled_statement, labeled_statement_no_short_if; non terminal expression_statement, statement_expression; non terminal if_then_statement; non terminal if_then_else_statement, if_then_else_statement_no_short_if; non terminal switch_statement, switch_block; non terminal switch_block_statement_groups; non terminal switch_block_statement_group; non terminal switch_labels, switch_label; non terminal while_statement, while_statement_no_short_if; non terminal do_statement; non terminal for_statement, for_statement_no_short_if; non terminal for_init_opt, for_init; non terminal for_update_opt, for_update; non terminal statement_expression_list; non terminal identifier_opt; non terminal break_statement, continue_statement; non terminal return_statement, throw_statement; non terminal synchronized_statement, try_statement; non terminal catches_opt, catches, catch_clause; non terminal finally; // 19.12) Expressions non terminal primary, primary_no_new_array; non terminal class_instance_creation_expression; non terminal argument_list_opt, argument_list; non terminal array_creation_expression; non terminal dim_exprs, dim_expr, dims_opt, dims; non terminal field_access, method_invocation, array_access; non terminal postfix_expression; non terminal postincrement_expression, postdecrement_expression; non terminal unary_expression, unary_expression_not_plus_minus; non terminal preincrement_expression, predecrement_expression; non terminal cast_expression; non terminal multiplicative_expression, additive_expression; non terminal shift_expression, relational_expression, equality_expression; non terminal and_expression, exclusive_or_expression, inclusive_or_expression; non terminal conditional_and_expression, conditional_or_expression; non terminal conditional_expression, assignment_expression; non terminal assignment; non terminal left_hand_side; non terminal assignment_operator; non terminal expression_opt, expression; non terminal constant_expression; start with goal; // 19.2) The Syntactic Grammar goal ::= compilation_unit ; // 19.3) Lexical Structure. literal ::= INTEGER_LITERAL | FLOATING_POINT_LITERAL | BOOLEAN_LITERAL | CHARACTER_LITERAL | STRING_LITERAL | NULL_LITERAL ; // 19.4) Types, Values, and Variables type ::= primitive_type | reference_type ; primitive_type ::= numeric_type | BOOLEAN ; numeric_type::= integral_type | floating_point_type ; integral_type ::= BYTE | SHORT | INT | LONG | CHAR ; floating_point_type ::= FLOAT | DOUBLE ; reference_type ::= class_or_interface_type | array_type ; class_or_interface_type ::= name; class_type ::= class_or_interface_type; interface_type ::= class_or_interface_type; array_type ::= primitive_type dims | name dims ; // 19.5) Names name ::= simple_name | qualified_name ; simple_name ::= IDENTIFIER ; qualified_name ::= name DOT IDENTIFIER ; // 19.6) Packages compilation_unit ::= package_declaration_opt import_declarations_opt type_declarations_opt ; package_declaration_opt ::= package_declaration | ; import_declarations_opt ::= import_declarations | ; type_declarations_opt ::= type_declarations | ; import_declarations ::= import_declaration | import_declarations import_declaration ; type_declarations ::= type_declaration | type_declarations type_declaration ; package_declaration ::= PACKAGE name SEMICOLON ; import_declaration ::= single_type_import_declaration | type_import_on_demand_declaration ; single_type_import_declaration ::= IMPORT name SEMICOLON ; type_import_on_demand_declaration ::= IMPORT name DOT MULT SEMICOLON ; type_declaration ::= class_declaration | interface_declaration | SEMICOLON ; // 19.7) Productions used only in the LALR(1) grammar modifiers_opt::= | modifiers ; modifiers ::= modifier | modifiers modifier ; modifier ::= PUBLIC | PROTECTED | PRIVATE | STATIC | ABSTRACT | FINAL | NATIVE | SYNCHRONIZED | TRANSIENT | VOLATILE | STRICTFP // note that semantic analysis must check that the // context of the modifier allows strictfp. ; // 19.8) Classes // 19.8.1) Class Declaration: class_declaration ::= modifiers_opt CLASS IDENTIFIER super_opt interfaces_opt class_body ; super_cl ::= EXTENDS class_type ; super_opt ::= | super_cl ; interfaces ::= IMPLEMENTS interface_type_list ; interfaces_opt::= | interfaces ; interface_type_list ::= interface_type | interface_type_list COMMA interface_type ; class_body ::= LBRACE class_body_declarations_opt RBRACE ; class_body_declarations_opt ::= | class_body_declarations ; class_body_declarations ::= class_body_declaration | class_body_declarations class_body_declaration ; class_body_declaration ::= class_member_declaration | static_initializer | constructor_declaration | block ; class_member_declaration ::= field_declaration | method_declaration /* repeat the prod for 'class_declaration' here: */ | modifiers_opt CLASS IDENTIFIER super_opt interfaces_opt class_body | interface_declaration | SEMICOLON ; // 19.8.2) Field Declarations field_declaration ::= modifiers_opt type variable_declarators SEMICOLON ; variable_declarators ::= variable_declarator | variable_declarators COMMA variable_declarator ; variable_declarator ::= variable_declarator_id | variable_declarator_id EQ variable_initializer ; variable_declarator_id ::= IDENTIFIER | variable_declarator_id LBRACK RBRACK ; variable_initializer ::= expression | array_initializer ; // 19.8.3) Method Declarations method_declaration ::= method_header method_body ; method_header ::= modifiers_opt type method_declarator throws_opt | modifiers_opt VOID method_declarator throws_opt ; method_declarator ::= IDENTIFIER LPAREN formal_parameter_list_opt RPAREN | method_declarator LBRACK RBRACK // deprecated // be careful; the above production also allows 'void foo() []' ; formal_parameter_list_opt ::= | formal_parameter_list ; formal_parameter_list ::= formal_parameter | formal_parameter_list COMMA formal_parameter ; formal_parameter ::= type variable_declarator_id | FINAL type variable_declarator_id ; throws_opt ::= | throws ; throws ::= THROWS class_type_list ; class_type_list ::= class_type | class_type_list COMMA class_type ; method_body ::= block | SEMICOLON ; // 19.8.4) Static Initializers static_initializer ::= STATIC block ; // 19.8.5) Constructor Declarations constructor_declaration ::= modifiers_opt constructor_declarator throws_opt constructor_body ; constructor_declarator ::= simple_name LPAREN formal_parameter_list_opt RPAREN ; constructor_body ::= LBRACE explicit_constructor_invocation block_statements RBRACE | LBRACE explicit_constructor_invocation RBRACE | LBRACE block_statements RBRACE | LBRACE RBRACE ; explicit_constructor_invocation ::= THIS LPAREN argument_list_opt RPAREN SEMICOLON | SUPER LPAREN argument_list_opt RPAREN SEMICOLON | primary DOT THIS LPAREN argument_list_opt RPAREN SEMICOLON | primary DOT SUPER LPAREN argument_list_opt RPAREN SEMICOLON ; // 19.9) Interfaces // 19.9.1) Interface Declarations interface_declaration ::= modifiers_opt INTERFACE IDENTIFIER extends_interfaces_opt interface_body ; extends_interfaces_opt ::= | extends_interfaces ; extends_interfaces ::= EXTENDS interface_type | extends_interfaces COMMA interface_type ; interface_body ::= LBRACE interface_member_declarations_opt RBRACE ; interface_member_declarations_opt ::= | interface_member_declarations ; interface_member_declarations ::= interface_member_declaration | interface_member_declarations interface_member_declaration ; interface_member_declaration ::= constant_declaration | abstract_method_declaration | class_declaration | interface_declaration | SEMICOLON ; constant_declaration ::= field_declaration ; abstract_method_declaration ::= method_header SEMICOLON ; // 19.10) Arrays array_initializer ::= LBRACE variable_initializers COMMA RBRACE | LBRACE variable_initializers RBRACE | LBRACE COMMA RBRACE | LBRACE RBRACE ; variable_initializers ::= variable_initializer | variable_initializers COMMA variable_initializer ; // 19.11) Blocks and Statements block ::= LBRACE block_statements_opt RBRACE ; block_statements_opt ::= | block_statements ; block_statements ::= block_statement | block_statements block_statement ; block_statement ::= local_variable_declaration_statement | statement | class_declaration | interface_declaration ; local_variable_declaration_statement ::= local_variable_declaration SEMICOLON ; local_variable_declaration ::= type variable_declarators | FINAL type variable_declarators ; statement ::= statement_without_trailing_substatement | labeled_statement | if_then_statement | if_then_else_statement | while_statement | for_statement ; statement_no_short_if ::= statement_without_trailing_substatement | labeled_statement_no_short_if | if_then_else_statement_no_short_if | while_statement_no_short_if | for_statement_no_short_if ; statement_without_trailing_substatement ::= block | empty_statement | expression_statement | switch_statement | do_statement | break_statement | continue_statement | return_statement | synchronized_statement | throw_statement | try_statement ; empty_statement ::= SEMICOLON ; labeled_statement ::= IDENTIFIER COLON statement ; labeled_statement_no_short_if ::= IDENTIFIER COLON statement_no_short_if ; expression_statement ::= statement_expression SEMICOLON ; statement_expression ::= assignment | preincrement_expression | predecrement_expression | postincrement_expression | postdecrement_expression | method_invocation | class_instance_creation_expression ; if_then_statement ::= IF LPAREN expression RPAREN statement ; if_then_else_statement ::= IF LPAREN expression RPAREN statement_no_short_if ELSE statement ; if_then_else_statement_no_short_if ::= IF LPAREN expression RPAREN statement_no_short_if ELSE statement_no_short_if ; switch_statement ::= SWITCH LPAREN expression RPAREN switch_block ; switch_block ::= LBRACE switch_block_statement_groups switch_labels RBRACE | LBRACE switch_block_statement_groups RBRACE | LBRACE switch_labels RBRACE | LBRACE RBRACE ; switch_block_statement_groups ::= switch_block_statement_group | switch_block_statement_groups switch_block_statement_group ; switch_block_statement_group ::= switch_labels block_statements ; switch_labels ::= switch_label | switch_labels switch_label ; switch_label ::= CASE constant_expression COLON | DEFAULT COLON ; while_statement ::= WHILE LPAREN expression RPAREN statement ; while_statement_no_short_if ::= WHILE LPAREN expression RPAREN statement_no_short_if ; do_statement ::= DO statement WHILE LPAREN expression RPAREN SEMICOLON ; for_statement ::= FOR LPAREN for_init_opt SEMICOLON expression_opt SEMICOLON for_update_opt RPAREN statement ; for_statement_no_short_if ::= FOR LPAREN for_init_opt SEMICOLON expression_opt SEMICOLON for_update_opt RPAREN statement_no_short_if ; for_init_opt ::= | for_init ; for_init ::= statement_expression_list | local_variable_declaration ; for_update_opt ::= | for_update ; for_update ::= statement_expression_list ; statement_expression_list ::= statement_expression | statement_expression_list COMMA statement_expression ; identifier_opt ::= | IDENTIFIER ; break_statement ::= BREAK identifier_opt SEMICOLON ; continue_statement ::= CONTINUE identifier_opt SEMICOLON ; return_statement ::= RETURN expression_opt SEMICOLON ; throw_statement ::= THROW expression SEMICOLON ; synchronized_statement ::= SYNCHRONIZED LPAREN expression RPAREN block ; try_statement ::= TRY block catches | TRY block catches_opt finally ; catches_opt ::= | catches ; catches ::= catch_clause | catches catch_clause ; catch_clause ::= CATCH LPAREN formal_parameter RPAREN block ; finally ::= FINALLY block ; // 19.12) Expressions primary ::= primary_no_new_array | array_creation_expression ; primary_no_new_array ::= literal | THIS | LPAREN expression RPAREN | class_instance_creation_expression | field_access | method_invocation | array_access | primitive_type DOT CLASS | VOID DOT CLASS | array_type DOT CLASS | name DOT CLASS | name DOT THIS ; class_instance_creation_expression ::= NEW class_type LPAREN argument_list_opt RPAREN | NEW class_type LPAREN argument_list_opt RPAREN class_body | primary DOT NEW IDENTIFIER LPAREN argument_list_opt RPAREN | primary DOT NEW IDENTIFIER LPAREN argument_list_opt RPAREN class_body ; argument_list_opt ::= | argument_list ; argument_list ::= expression | argument_list COMMA expression ; array_creation_expression ::= NEW primitive_type dim_exprs dims_opt | NEW class_or_interface_type dim_exprs dims_opt | NEW primitive_type dims array_initializer | NEW class_or_interface_type dims array_initializer ; dim_exprs ::= dim_expr | dim_exprs dim_expr ; dim_expr ::= LBRACK expression RBRACK ; dims_opt ::= | dims ; dims ::= LBRACK RBRACK | dims LBRACK RBRACK ; field_access ::= primary DOT IDENTIFIER | SUPER DOT IDENTIFIER | name DOT SUPER DOT IDENTIFIER ; method_invocation ::= name LPAREN argument_list_opt RPAREN | primary DOT IDENTIFIER LPAREN argument_list_opt RPAREN | SUPER DOT IDENTIFIER LPAREN argument_list_opt RPAREN | name DOT SUPER DOT IDENTIFIER LPAREN argument_list_opt RPAREN ; array_access ::= name LBRACK expression RBRACK | primary_no_new_array LBRACK expression RBRACK ; postfix_expression ::= primary | name | postincrement_expression | postdecrement_expression ; postincrement_expression ::= postfix_expression PLUSPLUS ; postdecrement_expression ::= postfix_expression MINUSMINUS ; unary_expression ::= preincrement_expression | predecrement_expression | PLUS unary_expression | MINUS unary_expression | unary_expression_not_plus_minus ; preincrement_expression ::= PLUSPLUS unary_expression ; predecrement_expression ::= MINUSMINUS unary_expression ; unary_expression_not_plus_minus ::= postfix_expression | COMP unary_expression | NOT unary_expression | cast_expression ; cast_expression ::= LPAREN primitive_type dims_opt RPAREN unary_expression | LPAREN expression RPAREN unary_expression_not_plus_minus | LPAREN name dims RPAREN unary_expression_not_plus_minus ; multiplicative_expression ::= unary_expression | multiplicative_expression MULT unary_expression | multiplicative_expression DIV unary_expression | multiplicative_expression MOD unary_expression ; additive_expression ::= multiplicative_expression | additive_expression PLUS multiplicative_expression | additive_expression MINUS multiplicative_expression ; shift_expression ::= additive_expression | shift_expression LSHIFT additive_expression | shift_expression RSHIFT additive_expression | shift_expression URSHIFT additive_expression ; relational_expression ::= shift_expression | relational_expression LT shift_expression | relational_expression GT shift_expression | relational_expression LTEQ shift_expression | relational_expression GTEQ shift_expression | relational_expression INSTANCEOF reference_type ; equality_expression ::= relational_expression | equality_expression EQEQ relational_expression | equality_expression NOTEQ relational_expression ; and_expression ::= equality_expression | and_expression AND equality_expression ; exclusive_or_expression ::= and_expression | exclusive_or_expression XOR and_expression ; inclusive_or_expression ::= exclusive_or_expression | inclusive_or_expression OR exclusive_or_expression ; conditional_and_expression ::= inclusive_or_expression | conditional_and_expression ANDAND inclusive_or_expression ; conditional_or_expression ::= conditional_and_expression | conditional_or_expression OROR conditional_and_expression ; conditional_expression ::= conditional_or_expression | conditional_or_expression QUESTION expression COLON conditional_expression ; assignment_expression ::= conditional_expression | assignment ; assignment ::= left_hand_side assignment_operator assignment_expression ; left_hand_side ::= name | field_access | array_access ; assignment_operator ::= EQ | MULTEQ | DIVEQ | MODEQ | PLUSEQ | MINUSEQ | LSHIFTEQ | RSHIFTEQ | URSHIFTEQ | ANDEQ | XOREQ | OREQ ; expression_opt ::= | expression ; expression ::= assignment_expression ; constant_expression ::= expression ; jflex-1.4.3/examples/java/JavaParser.java0000644000175000017500000000372211141043444016771 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ import java.io.*; /** * Simple test driver for the java parser. Just runs it on some * input files, gives no useful output. */ public class JavaParser { public static void main(String argv[]) { for (int i = 0; i < argv.length; i++) { try { System.out.println("Parsing ["+argv[i]+"]"); Scanner s = new Scanner(new UnicodeEscapes(new FileReader(argv[i]))); parser p = new parser(s); p.parse(); System.out.println("No errors."); } catch (Exception e) { e.printStackTrace(System.out); System.exit(1); } } } } jflex-1.4.3/examples/java/JavaSymbol.java0000644000175000017500000000135010036463365017007 0ustar moonmoon public class JavaSymbol extends java_cup.runtime.Symbol { private int line; private int column; public JavaSymbol(int type, int line, int column) { this(type, line, column, -1, -1, null); } public JavaSymbol(int type, int line, int column, Object value) { this(type, line, column, -1, -1, value); } public JavaSymbol(int type, int line, int column, int left, int right, Object value) { super(type, left, right, value); this.line = line; this.column = column; } public int getLine() { return line; } public int getColumn() { return column; } public String toString() { return "line "+line+", column "+column+", sym: "+sym+(value == null ? "" : (", value: '"+value+"'")); } } jflex-1.4.3/examples/java/lexer-output.good0000644000175000017500000003320011140766730017422 0ustar moonmoonLexing [TestLexer.java] line:20 col:1 --import--IMPORT-- token: line 20, column 1, sym: 23 line:20 col:8 --java--IDENTIFIER-- token: line 20, column 8, sym: 98, value: 'java' line:20 col:12 --.--DOT-- token: line 20, column 12, sym: 12 line:20 col:13 --io--IDENTIFIER-- token: line 20, column 13, sym: 98, value: 'io' line:20 col:15 --.--DOT-- token: line 20, column 15, sym: 12 line:20 col:16 --*--MULT-- token: line 20, column 16, sym: 14 line:20 col:17 --;--SEMICOLON-- token: line 20, column 17, sym: 13 line:21 col:1 --import--IMPORT-- token: line 21, column 1, sym: 23 line:21 col:8 --java_cup--IDENTIFIER-- token: line 21, column 8, sym: 98, value: 'java_cup' line:21 col:16 --.--DOT-- token: line 21, column 16, sym: 12 line:21 col:17 --runtime--IDENTIFIER-- token: line 21, column 17, sym: 98, value: 'runtime' line:21 col:24 --.--DOT-- token: line 21, column 24, sym: 12 line:21 col:25 --Symbol--IDENTIFIER-- token: line 21, column 25, sym: 98, value: 'Symbol' line:21 col:31 --;--SEMICOLON-- token: line 21, column 31, sym: 13 line:29 col:1 --public--PUBLIC-- token: line 29, column 1, sym: 24 line:29 col:8 --class--CLASS-- token: line 29, column 8, sym: 34 line:29 col:14 --TestLexer--IDENTIFIER-- token: line 29, column 14, sym: 98, value: 'TestLexer' line:29 col:24 --{--LBRACE-- token: line 29, column 24, sym: 16 line:32 col:3 --int--INT-- token: line 32, column 3, sym: 5 line:32 col:7 --intDec--IDENTIFIER-- token: line 32, column 7, sym: 98, value: 'intDec' line:32 col:14 --=--EQ-- token: line 32, column 14, sym: 18 line:32 col:16 --37--INTEGER_LITERAL-- token: line 32, column 16, sym: 93, value: '37' line:32 col:18 --;--SEMICOLON-- token: line 32, column 18, sym: 13 line:33 col:3 --long--LONG-- token: line 33, column 3, sym: 6 line:33 col:8 --longDec--IDENTIFIER-- token: line 33, column 8, sym: 98, value: 'longDec' line:33 col:16 --=--EQ-- token: line 33, column 16, sym: 18 line:33 col:18 --37l--INTEGER_LITERAL-- token: line 33, column 18, sym: 93, value: '37' line:33 col:21 --;--SEMICOLON-- token: line 33, column 21, sym: 13 line:34 col:3 --int--INT-- token: line 34, column 3, sym: 5 line:34 col:7 --intHex--IDENTIFIER-- token: line 34, column 7, sym: 98, value: 'intHex' line:34 col:14 --=--EQ-- token: line 34, column 14, sym: 18 line:34 col:16 --0x0001--INTEGER_LITERAL-- token: line 34, column 16, sym: 93, value: '1' line:34 col:22 --;--SEMICOLON-- token: line 34, column 22, sym: 13 line:35 col:3 --long--LONG-- token: line 35, column 3, sym: 6 line:35 col:8 --longHex--IDENTIFIER-- token: line 35, column 8, sym: 98, value: 'longHex' line:35 col:16 --=--EQ-- token: line 35, column 16, sym: 18 line:35 col:18 --0xFFFFl--INTEGER_LITERAL-- token: line 35, column 18, sym: 93, value: '65535' line:35 col:25 --;--SEMICOLON-- token: line 35, column 25, sym: 13 line:36 col:3 --int--INT-- token: line 36, column 3, sym: 5 line:36 col:7 --intOct--IDENTIFIER-- token: line 36, column 7, sym: 98, value: 'intOct' line:36 col:14 --=--EQ-- token: line 36, column 14, sym: 18 line:36 col:16 --0377--INTEGER_LITERAL-- token: line 36, column 16, sym: 93, value: '255' line:36 col:20 --;--SEMICOLON-- token: line 36, column 20, sym: 13 line:37 col:3 --long--LONG-- token: line 37, column 3, sym: 6 line:37 col:8 --longOc--IDENTIFIER-- token: line 37, column 8, sym: 98, value: 'longOc' line:37 col:15 --=--EQ-- token: line 37, column 15, sym: 18 line:37 col:17 --007l--INTEGER_LITERAL-- token: line 37, column 17, sym: 93, value: '7' line:37 col:21 --;--SEMICOLON-- token: line 37, column 21, sym: 13 line:38 col:3 --int--INT-- token: line 38, column 3, sym: 5 line:38 col:7 --smallest--IDENTIFIER-- token: line 38, column 7, sym: 98, value: 'smallest' line:38 col:16 --=--EQ-- token: line 38, column 16, sym: 18 line:38 col:18 ---2147483648--INTEGER_LITERAL-- token: line 38, column 18, sym: 93, value: '-2147483648' line:38 col:29 --;--SEMICOLON-- token: line 38, column 29, sym: 13 line:40 col:3 --public--PUBLIC-- token: line 40, column 3, sym: 24 line:40 col:10 --static--STATIC-- token: line 40, column 10, sym: 27 line:40 col:17 --void--VOID-- token: line 40, column 17, sym: 37 line:40 col:22 --main--IDENTIFIER-- token: line 40, column 22, sym: 98, value: 'main' line:40 col:26 --(--LPAREN-- token: line 40, column 26, sym: 19 line:40 col:27 --String--IDENTIFIER-- token: line 40, column 27, sym: 98, value: 'String' line:40 col:34 --argv--IDENTIFIER-- token: line 40, column 34, sym: 98, value: 'argv' line:40 col:38 --[--LBRACK-- token: line 40, column 38, sym: 10 line:40 col:39 --]--RBRACK-- token: line 40, column 39, sym: 11 line:40 col:40 --)--RPAREN-- token: line 40, column 40, sym: 20 line:40 col:42 --{--LBRACE-- token: line 40, column 42, sym: 16 line:42 col:5 --for--FOR-- token: line 42, column 5, sym: 49 line:42 col:9 --(--LPAREN-- token: line 42, column 9, sym: 19 line:42 col:10 --int--INT-- token: line 42, column 10, sym: 5 line:42 col:14 --i--IDENTIFIER-- token: line 42, column 14, sym: 98, value: 'i' line:42 col:16 --=--EQ-- token: line 42, column 16, sym: 18 line:42 col:18 --0--INTEGER_LITERAL-- token: line 42, column 18, sym: 93, value: '0' line:42 col:19 --;--SEMICOLON-- token: line 42, column 19, sym: 13 line:42 col:21 --i--IDENTIFIER-- token: line 42, column 21, sym: 98, value: 'i' line:42 col:23 --<--LT-- token: line 42, column 23, sym: 69 line:42 col:25 --argv--IDENTIFIER-- token: line 42, column 25, sym: 98, value: 'argv' line:42 col:29 --.--DOT-- token: line 42, column 29, sym: 12 line:42 col:30 --length--IDENTIFIER-- token: line 42, column 30, sym: 98, value: 'length' line:42 col:36 --;--SEMICOLON-- token: line 42, column 36, sym: 13 line:42 col:38 --i--IDENTIFIER-- token: line 42, column 38, sym: 98, value: 'i' line:42 col:39 --++--PLUSPLUS-- token: line 42, column 39, sym: 58 line:42 col:41 --)--RPAREN-- token: line 42, column 41, sym: 20 line:42 col:43 --{--LBRACE-- token: line 42, column 43, sym: 16 line:43 col:7 --try--TRY-- token: line 43, column 7, sym: 54 line:43 col:11 --{--LBRACE-- token: line 43, column 11, sym: 16 line:44 col:9 --System--IDENTIFIER-- token: line 44, column 9, sym: 98, value: 'System' line:44 col:15 --.--DOT-- token: line 44, column 15, sym: 12 line:44 col:16 --out--IDENTIFIER-- token: line 44, column 16, sym: 98, value: 'out' line:44 col:19 --.--DOT-- token: line 44, column 19, sym: 12 line:44 col:20 --println--IDENTIFIER-- token: line 44, column 20, sym: 98, value: 'println' line:44 col:27 --(--LPAREN-- token: line 44, column 27, sym: 19 line:44 col:37 --"--STRING_LITERAL-- token: line 44, column 37, sym: 97, value: 'Lexing [' line:44 col:38 --+--PLUS-- token: line 44, column 38, sym: 60 line:44 col:39 --argv--IDENTIFIER-- token: line 44, column 39, sym: 98, value: 'argv' line:44 col:43 --[--LBRACK-- token: line 44, column 43, sym: 10 line:44 col:44 --i--IDENTIFIER-- token: line 44, column 44, sym: 98, value: 'i' line:44 col:45 --]--RBRACK-- token: line 44, column 45, sym: 11 line:44 col:46 --+--PLUS-- token: line 44, column 46, sym: 60 line:44 col:49 --"--STRING_LITERAL-- token: line 44, column 49, sym: 97, value: ']' line:44 col:50 --)--RPAREN-- token: line 44, column 50, sym: 20 line:44 col:51 --;--SEMICOLON-- token: line 44, column 51, sym: 13 line:45 col:9 --Scanner--IDENTIFIER-- token: line 45, column 9, sym: 98, value: 'Scanner' line:45 col:17 --scanner--IDENTIFIER-- token: line 45, column 17, sym: 98, value: 'scanner' line:45 col:25 --=--EQ-- token: line 45, column 25, sym: 18 line:45 col:27 --new--NEW-- token: line 45, column 27, sym: 57 line:45 col:31 --Scanner--IDENTIFIER-- token: line 45, column 31, sym: 98, value: 'Scanner' line:45 col:38 --(--LPAREN-- token: line 45, column 38, sym: 19 line:45 col:39 --new--NEW-- token: line 45, column 39, sym: 57 line:45 col:43 --UnicodeEscapes--IDENTIFIER-- token: line 45, column 43, sym: 98, value: 'UnicodeEscapes' line:45 col:57 --(--LPAREN-- token: line 45, column 57, sym: 19 line:45 col:58 --new--NEW-- token: line 45, column 58, sym: 57 line:45 col:62 --FileReader--IDENTIFIER-- token: line 45, column 62, sym: 98, value: 'FileReader' line:45 col:72 --(--LPAREN-- token: line 45, column 72, sym: 19 line:45 col:73 --argv--IDENTIFIER-- token: line 45, column 73, sym: 98, value: 'argv' line:45 col:77 --[--LBRACK-- token: line 45, column 77, sym: 10 line:45 col:78 --i--IDENTIFIER-- token: line 45, column 78, sym: 98, value: 'i' line:45 col:79 --]--RBRACK-- token: line 45, column 79, sym: 11 line:45 col:80 --)--RPAREN-- token: line 45, column 80, sym: 20 line:45 col:81 --)--RPAREN-- token: line 45, column 81, sym: 20 line:45 col:82 --)--RPAREN-- token: line 45, column 82, sym: 20 line:45 col:83 --;--SEMICOLON-- token: line 45, column 83, sym: 13 line:47 col:9 --Symbol--IDENTIFIER-- token: line 47, column 9, sym: 98, value: 'Symbol' line:47 col:16 --s--IDENTIFIER-- token: line 47, column 16, sym: 98, value: 's' line:47 col:17 --;--SEMICOLON-- token: line 47, column 17, sym: 13 line:48 col:9 --do--DO-- token: line 48, column 9, sym: 47 line:48 col:12 --{--LBRACE-- token: line 48, column 12, sym: 16 line:49 col:11 --s--IDENTIFIER-- token: line 49, column 11, sym: 98, value: 's' line:49 col:13 --=--EQ-- token: line 49, column 13, sym: 18 line:49 col:15 --scanner--IDENTIFIER-- token: line 49, column 15, sym: 98, value: 'scanner' line:49 col:22 --.--DOT-- token: line 49, column 22, sym: 12 line:49 col:23 --debug_next_token--IDENTIFIER-- token: line 49, column 23, sym: 98, value: 'debug_next_token' line:49 col:39 --(--LPAREN-- token: line 49, column 39, sym: 19 line:49 col:40 --)--RPAREN-- token: line 49, column 40, sym: 20 line:49 col:41 --;--SEMICOLON-- token: line 49, column 41, sym: 13 line:50 col:11 --System--IDENTIFIER-- token: line 50, column 11, sym: 98, value: 'System' line:50 col:17 --.--DOT-- token: line 50, column 17, sym: 12 line:50 col:18 --out--IDENTIFIER-- token: line 50, column 18, sym: 98, value: 'out' line:50 col:21 --.--DOT-- token: line 50, column 21, sym: 12 line:50 col:22 --println--IDENTIFIER-- token: line 50, column 22, sym: 98, value: 'println' line:50 col:29 --(--LPAREN-- token: line 50, column 29, sym: 19 line:50 col:38 --"--STRING_LITERAL-- token: line 50, column 38, sym: 97, value: 'token: ' line:50 col:39 --+--PLUS-- token: line 50, column 39, sym: 60 line:50 col:40 --s--IDENTIFIER-- token: line 50, column 40, sym: 98, value: 's' line:50 col:41 --)--RPAREN-- token: line 50, column 41, sym: 20 line:50 col:42 --;--SEMICOLON-- token: line 50, column 42, sym: 13 line:51 col:9 --}--RBRACE-- token: line 51, column 9, sym: 17 line:51 col:11 --while--WHILE-- token: line 51, column 11, sym: 48 line:51 col:17 --(--LPAREN-- token: line 51, column 17, sym: 19 line:51 col:18 --s--IDENTIFIER-- token: line 51, column 18, sym: 98, value: 's' line:51 col:19 --.--DOT-- token: line 51, column 19, sym: 12 line:51 col:20 --sym--IDENTIFIER-- token: line 51, column 20, sym: 98, value: 'sym' line:51 col:24 --!=--NOTEQ-- token: line 51, column 24, sym: 75 line:51 col:27 --sym--IDENTIFIER-- token: line 51, column 27, sym: 98, value: 'sym' line:51 col:30 --.--DOT-- token: line 51, column 30, sym: 12 line:51 col:31 --EOF--IDENTIFIER-- token: line 51, column 31, sym: 98, value: 'EOF' line:51 col:34 --)--RPAREN-- token: line 51, column 34, sym: 20 line:51 col:35 --;--SEMICOLON-- token: line 51, column 35, sym: 13 line:53 col:9 --System--IDENTIFIER-- token: line 53, column 9, sym: 98, value: 'System' line:53 col:15 --.--DOT-- token: line 53, column 15, sym: 12 line:53 col:16 --out--IDENTIFIER-- token: line 53, column 16, sym: 98, value: 'out' line:53 col:19 --.--DOT-- token: line 53, column 19, sym: 12 line:53 col:20 --println--IDENTIFIER-- token: line 53, column 20, sym: 98, value: 'println' line:53 col:27 --(--LPAREN-- token: line 53, column 27, sym: 19 line:53 col:39 --"--STRING_LITERAL-- token: line 53, column 39, sym: 97, value: 'No errors.' line:53 col:40 --)--RPAREN-- token: line 53, column 40, sym: 20 line:53 col:41 --;--SEMICOLON-- token: line 53, column 41, sym: 13 line:54 col:7 --}--RBRACE-- token: line 54, column 7, sym: 17 line:55 col:7 --catch--CATCH-- token: line 55, column 7, sym: 55 line:55 col:13 --(--LPAREN-- token: line 55, column 13, sym: 19 line:55 col:14 --Exception--IDENTIFIER-- token: line 55, column 14, sym: 98, value: 'Exception' line:55 col:24 --e--IDENTIFIER-- token: line 55, column 24, sym: 98, value: 'e' line:55 col:25 --)--RPAREN-- token: line 55, column 25, sym: 20 line:55 col:27 --{--LBRACE-- token: line 55, column 27, sym: 16 line:56 col:9 --e--IDENTIFIER-- token: line 56, column 9, sym: 98, value: 'e' line:56 col:10 --.--DOT-- token: line 56, column 10, sym: 12 line:56 col:11 --printStackTrace--IDENTIFIER-- token: line 56, column 11, sym: 98, value: 'printStackTrace' line:56 col:26 --(--LPAREN-- token: line 56, column 26, sym: 19 line:56 col:27 --System--IDENTIFIER-- token: line 56, column 27, sym: 98, value: 'System' line:56 col:33 --.--DOT-- token: line 56, column 33, sym: 12 line:56 col:34 --out--IDENTIFIER-- token: line 56, column 34, sym: 98, value: 'out' line:56 col:37 --)--RPAREN-- token: line 56, column 37, sym: 20 line:56 col:38 --;--SEMICOLON-- token: line 56, column 38, sym: 13 line:57 col:9 --System--IDENTIFIER-- token: line 57, column 9, sym: 98, value: 'System' line:57 col:15 --.--DOT-- token: line 57, column 15, sym: 12 line:57 col:16 --exit--IDENTIFIER-- token: line 57, column 16, sym: 98, value: 'exit' line:57 col:20 --(--LPAREN-- token: line 57, column 20, sym: 19 line:57 col:21 --1--INTEGER_LITERAL-- token: line 57, column 21, sym: 93, value: '1' line:57 col:22 --)--RPAREN-- token: line 57, column 22, sym: 20 line:57 col:23 --;--SEMICOLON-- token: line 57, column 23, sym: 13 line:58 col:7 --}--RBRACE-- token: line 58, column 7, sym: 17 line:59 col:5 --}--RBRACE-- token: line 59, column 5, sym: 17 line:60 col:3 --}--RBRACE-- token: line 60, column 3, sym: 17 line:61 col:1 --}--RBRACE-- token: line 61, column 1, sym: 17 line:62 col:1 ----EOF-- token: line 62, column 1, sym: 0 No errors. jflex-1.4.3/examples/java/Makefile0000644000175000017500000000170710036463365015543 0ustar moonmoon# You need CUP v0.10j (or newer) for this makefile to work (for java12.cup) # # CUP classes should be included in CLASSPATH CUP = java java_cup.Main -interface < JFLEX = jflex JAVA = java JAVAC = javac #JAVAC = jikes JAVACFLAGS = # -------------------------------------------------- all: test test: lexer-output.txt @(diff lexer-output.txt lexer-output.good && echo "Test OK!") || echo "Test failed!" lexer-output.txt: compile $(JAVA) TestLexer TestLexer.java > lexer-output.txt compile: scanner parser unicode $(JAVAC) $(JAVACFLAGS) JavaParser.java TestLexer.java parser: parser.java parser.java: java12.cup $(CUP) java12.cup scanner: Scanner.java Scanner.java: java.flex $(JFLEX) java.flex unicode: UnicodeEscapes.java UnicodeEscapes.java: unicode.flex $(JFLEX) unicode.flex clean: rm -f *.class rm -f *~ rm -f Scanner.java rm -f parser.java rm -f sym.java rm -f UnicodeEscapes.java rm -f lexer-output.txt jflex-1.4.3/examples/java/README0000644000175000017500000000222110036463365014753 0ustar moonmoonThis directory contains a scanner and parser for the Java programming language. You need the parser generator CUP v0.10j (or newer) for the parser to work. Use the Makefile to generate the lexer and parser, or type: jflex unicode.flex jflex java.flex java java_cup.Main -interface < java12.cup javac JavaParser.java TestLexer.java The parser can be tested with: java JavaParser The scanner (without parser attached) can be test with: java TestLexer files: unicode.flex JFlex specification for the Unicode preprocessing phase (see section 3.3 of the Java Language Specification). Demonstrates how to implement a FilterReader with JFlex. java.flex JFlex specification for the "real" Java 1.2 lexer. java12.cup CUP specification for the Java 1.2 parser Copyright (C) 1998 by C. Scott Ananian (with small modifications to interface with the Lexer) JavaParser.java a simple main class to run the parser (no other useful output though) TestLexer.java a simple test driver for the scanner, produces debug output lexer-output.good lexer output for input file TestLexer.java for testing jflex-1.4.3/examples/java/TestLexer.java0000644000175000017500000000454111141043444016652 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2004-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ import java.io.*; import java_cup.runtime.Symbol; /** * Simple test driver for the java lexer. Just runs it on some * input files and produces debug output. Needs symbol class from * parser. */ public class TestLexer { /** some numerals to for lexer testing */ int intDec = 37; long longDec = 37l; int intHex = 0x0001; long longHex = 0xFFFFl; int intOct = 0377; long longOc = 007l; int smallest = -2147483648; public static void main(String argv[]) { for (int i = 0; i < argv.length; i++) { try { System.out.println("Lexing ["+argv[i]+"]"); Scanner scanner = new Scanner(new UnicodeEscapes(new FileReader(argv[i]))); Symbol s; do { s = scanner.debug_next_token(); System.out.println("token: "+s); } while (s.sym != sym.EOF); System.out.println("No errors."); } catch (Exception e) { e.printStackTrace(System.out); System.exit(1); } } } } jflex-1.4.3/examples/java/unicode.flex0000644000175000017500000000703611141043444016400 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* 3.3 of the Java Language Specification : UnicodeInputCharacter: UnicodeEscape RawInputCharacter UnicodeEscape: \ UnicodeMarker HexDigit HexDigit HexDigit HexDigit UnicodeMarker: u UnicodeMarker u RawInputCharacter: any Unicode character HexDigit: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F only an even number of '\' is eligible to start a Unicode escape sequence */ import java.io.*; %% %public %final %class UnicodeEscapes %extends FilterReader %int %function read %switch %16bit UnicodeEscape = {UnicodeMarker} {HexDigit} {4} UnicodeMarker = "u"+ HexDigit = [0-9a-fA-F] %state DIGITS %init{ super(in); %init} %{ private boolean even; private int value() { int r = 0; for (int k = zzMarkedPos-4; k < zzMarkedPos; k++) { int c = zzBuffer[k]; if (c >= 'a') c-= 'a'-10; else if (c >= 'A') c-= 'A'-10; else c-= '0'; r <<= 4; r += c; } return r; } public int read(char cbuf[], int off, int len) throws IOException { if ( !ready() ) return -1; len+= off; for (int i=off; i { \\ { even = false; return '\\'; } \\ / \\ { even = !even; return '\\'; } \\ / "u" { if (even) { even = false; return '\\'; } else yybegin(DIGITS); } .|\n { return zzBuffer[zzStartRead]; } <> { return -1; } } { {UnicodeEscape} { yybegin(YYINITIAL); return value(); } .|\n { throw new Error("incorrect Unicode escape"); } <> { throw new Error("EOF in Unicode escape"); } } jflex-1.4.3/examples/pom.xml0000644000175000017500000000250510722057760014474 0ustar moonmoon 4.0.0 de.flex.examples parent 1 examples Examples on how to use JFlex and maven-jflex-plugin pom de.jflex.maven.plugin maven-jflex-plugin 0.3 generate jflex JFlex repository http://jflex.sourceforge.net/repo/ junit junit 3.8.2 test simple-maven standalone-maven jflex-1.4.3/examples/simple/0000755000175000017500000000000011141044624014435 5ustar moonmoonjflex-1.4.3/examples/simple/Makefile0000644000175000017500000000063410036407731016104 0ustar moonmoonJAVA=java JAVAC=javac JFLEX=jflex CUP=$(JAVA) java_cup.Main < all: test test: output.txt @(diff output.txt output.good && echo "Test OK!") || echo "Test failed!" output.txt: Yylex.class test.txt $(JAVA) Yylex test.txt > output.txt Yylex.class: Yylex.java Yytoken.java Utility.java %.class: %.java $(JAVAC) $^ Yylex.java: simple.flex $(JFLEX) simple.flex clean: rm -f Yylex.java output.txt *.class *~ jflex-1.4.3/examples/simple/output.good0000644000175000017500000003476510036407731016672 0ustar moonmoonline: 1 match: --class-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : class index : 43 line : 0 cBeg. : 0 cEnd. : 5 line: 1 match: -- -- action [76] { } line: 1 match: --Utility-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : Utility index : 43 line : 0 cBeg. : 6 cEnd. : 13 line: 1 match: -- -- action [76] { } line: 1 match: --{-- action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } Text : { index : 7 line : 0 cBeg. : 14 cEnd. : 15 line: 1 match: -- -- action [76] { } line: 3 match: --private-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : private index : 43 line : 2 cBeg. : 21 cEnd. : 28 line: 3 match: -- -- action [76] { } line: 3 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 2 cBeg. : 29 cEnd. : 35 line: 3 match: -- -- action [76] { } line: 3 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 2 cBeg. : 36 cEnd. : 41 line: 3 match: -- -- action [76] { } line: 3 match: --String-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : String index : 43 line : 2 cBeg. : 42 cEnd. : 48 line: 3 match: -- -- action [76] { } line: 3 match: --errorMsg-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : errorMsg index : 43 line : 2 cBeg. : 49 cEnd. : 57 line: 3 match: --[-- action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); } Text : [ index : 5 line : 2 cBeg. : 57 cEnd. : 58 line: 3 match: --]-- action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); } Text : ] index : 6 line : 2 cBeg. : 58 cEnd. : 59 line: 3 match: -- -- action [76] { } line: 3 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 2 cBeg. : 60 cEnd. : 61 line: 3 match: -- -- action [76] { } line: 3 match: --{-- action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } Text : { index : 7 line : 2 cBeg. : 62 cEnd. : 63 line: 3 match: -- -- action [76] { } line: 4 match: --"Error: Unmatched end-of-comment punctuation."-- action [57] { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } Text : Error: Unmatched end-of-comment punctuation. index : 40 line : 3 cBeg. : 68 cEnd. : 114 line: 4 match: --,-- action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } Text : , index : 0 line : 3 cBeg. : 114 cEnd. : 115 line: 4 match: -- -- action [76] { } line: 5 match: --"Error: Unmatched start-of-comment punctuation."-- action [57] { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } Text : Error: Unmatched start-of-comment punctuation. index : 40 line : 4 cBeg. : 120 cEnd. : 168 line: 5 match: --,-- action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } Text : , index : 0 line : 4 cBeg. : 168 cEnd. : 169 line: 5 match: -- -- action [76] { } line: 6 match: --"Error: Unclosed string."-- action [57] { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } Text : Error: Unclosed string. index : 40 line : 5 cBeg. : 174 cEnd. : 199 line: 6 match: --,-- action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } Text : , index : 0 line : 5 cBeg. : 199 cEnd. : 200 line: 6 match: -- -- action [76] { } line: 7 match: --"Error: Illegal character."-- action [57] { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } Text : Error: Illegal character. index : 40 line : 6 cBeg. : 205 cEnd. : 232 line: 7 match: -- -- action [76] { } line: 8 match: --}-- action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } Text : } index : 8 line : 7 cBeg. : 237 cEnd. : 238 line: 8 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 7 cBeg. : 238 cEnd. : 239 line: 8 match: -- -- action [76] { } line: 10 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 9 cBeg. : 245 cEnd. : 251 line: 10 match: -- -- action [76] { } line: 10 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 9 cBeg. : 252 cEnd. : 258 line: 10 match: -- -- action [76] { } line: 10 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 9 cBeg. : 259 cEnd. : 264 line: 10 match: -- -- action [76] { } line: 10 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 9 cBeg. : 265 cEnd. : 268 line: 10 match: -- -- action [76] { } line: 10 match: --E_ENDCOMMENT-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : E_ENDCOMMENT index : 43 line : 9 cBeg. : 269 cEnd. : 281 line: 10 match: -- -- action [76] { } line: 10 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 9 cBeg. : 282 cEnd. : 283 line: 10 match: -- -- action [76] { } line: 10 match: --0-- action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } Text : 0 index : 42 line : 9 cBeg. : 284 cEnd. : 285 line: 10 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 9 cBeg. : 285 cEnd. : 286 line: 10 match: -- -- action [76] { } line: 11 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 10 cBeg. : 290 cEnd. : 296 line: 11 match: -- -- action [76] { } line: 11 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 10 cBeg. : 297 cEnd. : 303 line: 11 match: -- -- action [76] { } line: 11 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 10 cBeg. : 304 cEnd. : 309 line: 11 match: -- -- action [76] { } line: 11 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 10 cBeg. : 310 cEnd. : 313 line: 11 match: -- -- action [76] { } line: 11 match: --E_STARTCOMMENT-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : E_STARTCOMMENT index : 43 line : 10 cBeg. : 314 cEnd. : 328 line: 11 match: -- -- action [76] { } line: 11 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 10 cBeg. : 329 cEnd. : 330 line: 11 match: -- -- action [76] { } line: 11 match: --1-- action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } Text : 1 index : 42 line : 10 cBeg. : 331 cEnd. : 332 line: 11 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 10 cBeg. : 332 cEnd. : 333 line: 11 match: -- -- action [76] { } line: 12 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 11 cBeg. : 337 cEnd. : 343 line: 12 match: -- -- action [76] { } line: 12 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 11 cBeg. : 344 cEnd. : 350 line: 12 match: -- -- action [76] { } line: 12 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 11 cBeg. : 351 cEnd. : 356 line: 12 match: -- -- action [76] { } line: 12 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 11 cBeg. : 357 cEnd. : 360 line: 12 match: -- -- action [76] { } line: 12 match: --E_UNCLOSEDSTR-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : E_UNCLOSEDSTR index : 43 line : 11 cBeg. : 361 cEnd. : 374 line: 12 match: -- -- action [76] { } line: 12 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 11 cBeg. : 375 cEnd. : 376 line: 12 match: -- -- action [76] { } line: 12 match: --2-- action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } Text : 2 index : 42 line : 11 cBeg. : 377 cEnd. : 378 line: 12 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 11 cBeg. : 378 cEnd. : 379 line: 12 match: -- -- action [76] { } line: 13 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 12 cBeg. : 383 cEnd. : 389 line: 13 match: -- -- action [76] { } line: 13 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 12 cBeg. : 390 cEnd. : 396 line: 13 match: -- -- action [76] { } line: 13 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 12 cBeg. : 397 cEnd. : 402 line: 13 match: -- -- action [76] { } line: 13 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 12 cBeg. : 403 cEnd. : 406 line: 13 match: -- -- action [76] { } line: 13 match: --E_UNMATCHED-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : E_UNMATCHED index : 43 line : 12 cBeg. : 407 cEnd. : 418 line: 13 match: -- -- action [76] { } line: 13 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 12 cBeg. : 419 cEnd. : 420 line: 13 match: -- -- action [76] { } line: 13 match: --3-- action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } Text : 3 index : 42 line : 12 cBeg. : 421 cEnd. : 422 line: 13 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 12 cBeg. : 422 cEnd. : 423 line: 13 match: -- -- action [76] { } line: 15 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 14 cBeg. : 428 cEnd. : 434 line: 15 match: -- -- action [76] { } line: 15 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 14 cBeg. : 435 cEnd. : 441 line: 15 match: -- -- action [76] { } line: 15 match: --void-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : void index : 43 line : 14 cBeg. : 442 cEnd. : 446 line: 15 match: -- -- action [76] { } line: 15 match: --error-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : error index : 43 line : 14 cBeg. : 447 cEnd. : 452 line: 15 match: --(-- action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); } Text : ( index : 3 line : 14 cBeg. : 452 cEnd. : 453 line: 15 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 14 cBeg. : 453 cEnd. : 456 line: 15 match: -- -- action [76] { } line: 15 match: --code-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : code index : 43 line : 14 cBeg. : 457 cEnd. : 461 line: 15 match: --)-- action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); } Text : ) index : 4 line : 14 cBeg. : 461 cEnd. : 462 line: 15 match: -- -- action [76] { } line: 15 match: --{-- action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } Text : { index : 7 line : 14 cBeg. : 463 cEnd. : 464 line: 15 match: -- -- action [76] { } line: 16 match: --System-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : System index : 43 line : 15 cBeg. : 468 cEnd. : 474 line: 16 match: --.-- action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); } Text : . index : 9 line : 15 cBeg. : 474 cEnd. : 475 line: 16 match: --out-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : out index : 43 line : 15 cBeg. : 475 cEnd. : 478 line: 16 match: --.-- action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); } Text : . index : 9 line : 15 cBeg. : 478 cEnd. : 479 line: 16 match: --println-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : println index : 43 line : 15 cBeg. : 479 cEnd. : 486 line: 16 match: --(-- action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); } Text : ( index : 3 line : 15 cBeg. : 486 cEnd. : 487 line: 16 match: --errorMsg-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : errorMsg index : 43 line : 15 cBeg. : 487 cEnd. : 495 line: 16 match: --[-- action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); } Text : [ index : 5 line : 15 cBeg. : 495 cEnd. : 496 line: 16 match: --code-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : code index : 43 line : 15 cBeg. : 496 cEnd. : 500 line: 16 match: --]-- action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); } Text : ] index : 6 line : 15 cBeg. : 500 cEnd. : 501 line: 16 match: --)-- action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); } Text : ) index : 4 line : 15 cBeg. : 501 cEnd. : 502 line: 16 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 15 cBeg. : 502 cEnd. : 503 line: 16 match: -- -- action [76] { } line: 17 match: --}-- action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } Text : } index : 8 line : 16 cBeg. : 506 cEnd. : 507 line: 17 match: -- -- action [76] { } line: 18 match: --}-- action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } Text : } index : 8 line : 17 cBeg. : 508 cEnd. : 509 line: 18 match: -- -- action [76] { } null jflex-1.4.3/examples/simple/README0000644000175000017500000000127610036407731015327 0ustar moonmoonThis directory contains a scanner for a toy programming language. It is the example from the JLex website with some small modifications, to make it a bit more readable. It does nothing really useful, because there is no parser for the toy programming language. It's just a demonstatration how a small simple scanner looks like. files: YYtoken.java: the tokens returned by the scanner Utility.java: small class collecting some utility functions simple.flex: the example specification test.txt: sample input output.good: output matching the sample input from test.txt Makefile: (for Unix only) make to generate scanner and run test make clean to remove generated files jflex-1.4.3/examples/simple/simple.flex0000644000175000017500000000554610036407731016624 0ustar moonmoon/* this is the scanner example from the JLex website (with small modifications to make it more readable) */ %% %{ private int comment_count = 0; %} %line %char %state COMMENT %full %debug ALPHA=[A-Za-z] DIGIT=[0-9] NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012] NEWLINE=\r|\n|\r\n WHITE_SPACE_CHAR=[\n\r\ \t\b\012] STRING_TEXT=(\\\"|[^\n\r\"]|\\{WHITE_SPACE_CHAR}+\\)* COMMENT_TEXT=([^*/\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])* Ident = {ALPHA}({ALPHA}|{DIGIT}|_)* %% { "," { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } ":" { return (new Yytoken(1,yytext(),yyline,yychar,yychar+1)); } ";" { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } "(" { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); } ")" { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); } "[" { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); } "]" { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); } "{" { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } "}" { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } "." { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); } "+" { return (new Yytoken(10,yytext(),yyline,yychar,yychar+1)); } "-" { return (new Yytoken(11,yytext(),yyline,yychar,yychar+1)); } "*" { return (new Yytoken(12,yytext(),yyline,yychar,yychar+1)); } "/" { return (new Yytoken(13,yytext(),yyline,yychar,yychar+1)); } "=" { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } "<>" { return (new Yytoken(15,yytext(),yyline,yychar,yychar+2)); } "<" { return (new Yytoken(16,yytext(),yyline,yychar,yychar+1)); } "<=" { return (new Yytoken(17,yytext(),yyline,yychar,yychar+2)); } ">" { return (new Yytoken(18,yytext(),yyline,yychar,yychar+1)); } ">=" { return (new Yytoken(19,yytext(),yyline,yychar,yychar+2)); } "&" { return (new Yytoken(20,yytext(),yyline,yychar,yychar+1)); } "|" { return (new Yytoken(21,yytext(),yyline,yychar,yychar+1)); } ":=" { return (new Yytoken(22,yytext(),yyline,yychar,yychar+2)); } {NONNEWLINE_WHITE_SPACE_CHAR}+ { } "/*" { yybegin(COMMENT); comment_count++; } \"{STRING_TEXT}\" { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } \"{STRING_TEXT} { String str = yytext().substring(1,yytext().length()); Utility.error(Utility.E_UNCLOSEDSTR); return (new Yytoken(41,str,yyline,yychar,yychar + str.length())); } {DIGIT}+ { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } {Ident} { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } } { "/*" { comment_count++; } "*/" { if (--comment_count == 0) yybegin(YYINITIAL); } {COMMENT_TEXT} { } } {NEWLINE} { } . { System.out.println("Illegal character: <" + yytext() + ">"); Utility.error(Utility.E_UNMATCHED); } jflex-1.4.3/examples/simple/test.txt0000644000175000017500000000077710036407731016174 0ustar moonmoonclass Utility { private static final String errorMsg[] = { "Error: Unmatched end-of-comment punctuation.", "Error: Unmatched start-of-comment punctuation.", "Error: Unclosed string.", "Error: Illegal character." }; public static final int E_ENDCOMMENT = 0; public static final int E_STARTCOMMENT = 1; public static final int E_UNCLOSEDSTR = 2; public static final int E_UNMATCHED = 3; public static void error(int code) { System.out.println(errorMsg[code]); } } jflex-1.4.3/examples/simple/Utility.java0000644000175000017500000000077707606571215016772 0ustar moonmoonclass Utility { private static final String errorMsg[] = { "Error: Unmatched end-of-comment punctuation.", "Error: Unmatched start-of-comment punctuation.", "Error: Unclosed string.", "Error: Illegal character." }; public static final int E_ENDCOMMENT = 0; public static final int E_STARTCOMMENT = 1; public static final int E_UNCLOSEDSTR = 2; public static final int E_UNMATCHED = 3; public static void error(int code) { System.out.println(errorMsg[code]); } } jflex-1.4.3/examples/simple/Yytoken.java0000644000175000017500000000102607606571215016755 0ustar moonmoonclass Yytoken { public int m_index; public String m_text; public int m_line; public int m_charBegin; public int m_charEnd; Yytoken (int index, String text, int line, int charBegin, int charEnd) { m_index = index; m_text = text; m_line = line; m_charBegin = charBegin; m_charEnd = charEnd; } public String toString() { return "Text : "+m_text+ "\nindex : "+m_index+ "\nline : "+m_line+ "\ncBeg. : "+m_charBegin+ "\ncEnd. : "+m_charEnd; } } jflex-1.4.3/examples/simple-maven/0000755000175000017500000000000011141044624015541 5ustar moonmoonjflex-1.4.3/examples/simple-maven/pom.xml0000644000175000017500000000174610722057760017077 0ustar moonmoon 4.0.0 de.flex.examples parent 1 simple-maven 0.1 A scanner for a toy programming language. It is the example from the JLex website with some small modifications, to make it a bit more readable. It does nothing really useful, because there is no parser for the toy programming language. It's just a demonstration how a small simple scanner looks like. junit junit test jflex-1.4.3/examples/simple-maven/README.txt0000644000175000017500000000532010712623562017246 0ustar moonmoon ------ Usage ------ Gerwin Klein Régis Décamps ------ November 2, 2007 ------ About this project This sample project parses a grammar with JFlex. The project management is done with Maven. The project contains a simple grammar for the "Toy programming language". It is the example from the JLex web site with some small modifications, to make it a bit more readable. It does nothing really useful, because there is no parser for the toy programming language. It's just a demonstration how a small simple scanner looks like. * JFlex JFlex is a parser generator. Given a grammar, JFlex generate Java (TM) code to parse documents that follow this grammar. * Maven Maven is a project management framework. The project is described in as a POM (project object model, stored into <<>>). This document isn't intended to be a tutorial on the use of Maven 2, you should consult the {{{http://maven.apache.org/}Maven web site}}. The integration of JFlex and Maven is done with {{{http://jflex.sourceforge.net/maven-flex-plugin/}maven-flex-plugin}}. Usage * mvn generate-sources The maven-jflex-plugin will read the grammar <<>> and generate a Java scanner <<>> in <<>> This is defined by the following section +--------- de.jflex.maven.plugin maven-jflex-plugin 0.2 generate +------------ By default, the maven-jflex-plugin generates a scanner/parser for every file in <<>>. * mvn test This goal test the generated scanner (if required, the lexer will be generated and all Java classes will be compiled) by running all tests in <<>>. There is only one test in <<>>. In this test, the scanner is run with the input file <<>>. By default, the scanner outputs debugging information about each returned token to <<>> until the end of file is reached, or an error occurs. But in the test, the output is redirected into <<>>. The test is successful if every line match with <<>>, which is the expected scanner debugging information. References * {{{http://jflex.sourceforge.net/maven-flex-plugin/}maven-flex-plugin}} * {{{http://maven.apache.org/}Maven web site}}. jflex-1.4.3/examples/simple-maven/src/0000755000175000017500000000000011141044624016330 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/main/0000755000175000017500000000000011141044624017254 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/main/java/0000755000175000017500000000000011141044624020175 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/main/java/Utility.java0000644000175000017500000000107610712616761022521 0ustar moonmoon/** * A small utility class. * TODO: use reosurce bundle */ class Utility { private static final String errorMsg[] = { "Error: Unmatched end-of-comment punctuation.", "Error: Unmatched start-of-comment punctuation.", "Error: Unclosed string.", "Error: Illegal character." }; public static final int E_ENDCOMMENT = 0; public static final int E_STARTCOMMENT = 1; public static final int E_UNCLOSEDSTR = 2; public static final int E_UNMATCHED = 3; public static void error(int code) { System.out.println(errorMsg[code]); } } jflex-1.4.3/examples/simple-maven/src/main/java/Yytoken.java0000644000175000017500000000111110712616761022506 0ustar moonmoon/** * The tokens returned by the scanner. * */ class Yytoken { public int m_index; public String m_text; public int m_line; public int m_charBegin; public int m_charEnd; Yytoken (int index, String text, int line, int charBegin, int charEnd) { m_index = index; m_text = text; m_line = line; m_charBegin = charBegin; m_charEnd = charEnd; } public String toString() { return "Text : "+m_text+ "\nindex : "+m_index+ "\nline : "+m_line+ "\ncBeg. : "+m_charBegin+ "\ncEnd. : "+m_charEnd; } } jflex-1.4.3/examples/simple-maven/src/main/jflex/0000755000175000017500000000000011141044624020364 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/main/jflex/simple.flex0000644000175000017500000000554610712616761022561 0ustar moonmoon/* this is the scanner example from the JLex website (with small modifications to make it more readable) */ %% %{ private int comment_count = 0; %} %line %char %state COMMENT %full %debug ALPHA=[A-Za-z] DIGIT=[0-9] NONNEWLINE_WHITE_SPACE_CHAR=[\ \t\b\012] NEWLINE=\r|\n|\r\n WHITE_SPACE_CHAR=[\n\r\ \t\b\012] STRING_TEXT=(\\\"|[^\n\r\"]|\\{WHITE_SPACE_CHAR}+\\)* COMMENT_TEXT=([^*/\n]|[^*\n]"/"[^*\n]|[^/\n]"*"[^/\n]|"*"[^/\n]|"/"[^*\n])* Ident = {ALPHA}({ALPHA}|{DIGIT}|_)* %% { "," { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } ":" { return (new Yytoken(1,yytext(),yyline,yychar,yychar+1)); } ";" { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } "(" { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); } ")" { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); } "[" { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); } "]" { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); } "{" { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } "}" { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } "." { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); } "+" { return (new Yytoken(10,yytext(),yyline,yychar,yychar+1)); } "-" { return (new Yytoken(11,yytext(),yyline,yychar,yychar+1)); } "*" { return (new Yytoken(12,yytext(),yyline,yychar,yychar+1)); } "/" { return (new Yytoken(13,yytext(),yyline,yychar,yychar+1)); } "=" { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } "<>" { return (new Yytoken(15,yytext(),yyline,yychar,yychar+2)); } "<" { return (new Yytoken(16,yytext(),yyline,yychar,yychar+1)); } "<=" { return (new Yytoken(17,yytext(),yyline,yychar,yychar+2)); } ">" { return (new Yytoken(18,yytext(),yyline,yychar,yychar+1)); } ">=" { return (new Yytoken(19,yytext(),yyline,yychar,yychar+2)); } "&" { return (new Yytoken(20,yytext(),yyline,yychar,yychar+1)); } "|" { return (new Yytoken(21,yytext(),yyline,yychar,yychar+1)); } ":=" { return (new Yytoken(22,yytext(),yyline,yychar,yychar+2)); } {NONNEWLINE_WHITE_SPACE_CHAR}+ { } "/*" { yybegin(COMMENT); comment_count++; } \"{STRING_TEXT}\" { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } \"{STRING_TEXT} { String str = yytext().substring(1,yytext().length()); Utility.error(Utility.E_UNCLOSEDSTR); return (new Yytoken(41,str,yyline,yychar,yychar + str.length())); } {DIGIT}+ { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } {Ident} { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } } { "/*" { comment_count++; } "*/" { if (--comment_count == 0) yybegin(YYINITIAL); } {COMMENT_TEXT} { } } {NEWLINE} { } . { System.out.println("Illegal character: <" + yytext() + ">"); Utility.error(Utility.E_UNMATCHED); } jflex-1.4.3/examples/simple-maven/src/main/resources/0000755000175000017500000000000011141044624021266 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/README0000644000175000017500000000040310712616761017217 0ustar moonmoonThis is a small Maven project that demeonstrates the use of maven-jflex-plugin. main/flex/simple.flex: the example specification test/resources/test.txt: sample input test/resources/output.good: expected output matching the sample input from test.txtjflex-1.4.3/examples/simple-maven/src/site/0000755000175000017500000000000011141044624017274 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/site/apt/0000755000175000017500000000000011141044624020060 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/site/apt/usage.apt0000644000175000017500000000532010712623562021701 0ustar moonmoon ------ Usage ------ Gerwin Klein Régis Décamps ------ November 2, 2007 ------ About this project This sample project parses a grammar with JFlex. The project management is done with Maven. The project contains a simple grammar for the "Toy programming language". It is the example from the JLex web site with some small modifications, to make it a bit more readable. It does nothing really useful, because there is no parser for the toy programming language. It's just a demonstration how a small simple scanner looks like. * JFlex JFlex is a parser generator. Given a grammar, JFlex generate Java (TM) code to parse documents that follow this grammar. * Maven Maven is a project management framework. The project is described in as a POM (project object model, stored into <<>>). This document isn't intended to be a tutorial on the use of Maven 2, you should consult the {{{http://maven.apache.org/}Maven web site}}. The integration of JFlex and Maven is done with {{{http://jflex.sourceforge.net/maven-flex-plugin/}maven-flex-plugin}}. Usage * mvn generate-sources The maven-jflex-plugin will read the grammar <<>> and generate a Java scanner <<>> in <<>> This is defined by the following section +--------- de.jflex.maven.plugin maven-jflex-plugin 0.2 generate +------------ By default, the maven-jflex-plugin generates a scanner/parser for every file in <<>>. * mvn test This goal test the generated scanner (if required, the lexer will be generated and all Java classes will be compiled) by running all tests in <<>>. There is only one test in <<>>. In this test, the scanner is run with the input file <<>>. By default, the scanner outputs debugging information about each returned token to <<>> until the end of file is reached, or an error occurs. But in the test, the output is redirected into <<>>. The test is successful if every line match with <<>>, which is the expected scanner debugging information. References * {{{http://jflex.sourceforge.net/maven-flex-plugin/}maven-flex-plugin}} * {{{http://maven.apache.org/}Maven web site}}. jflex-1.4.3/examples/simple-maven/src/site/site.xml0000644000175000017500000000032610712623562020772 0ustar moonmoon

jflex-1.4.3/examples/simple-maven/src/test/0000755000175000017500000000000011141044624017307 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/test/java/0000755000175000017500000000000011141044624020230 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/test/java/YylexTest.java0000644000175000017500000000301510712616761023056 0ustar moonmoonimport java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; import junit.framework.TestCase; /** * This is an integration test. * * The class Yylex is generated by JFLex from * src/main/jflex/simple.flex. * * @author regis * */ public class YylexTest extends TestCase { private static final String OUTPUT_FILE = "target/output.actual"; /** * Test that Yylex parser behaves like expected. * * @throws IOException */ public void testOutput() throws IOException { String[] argv = new String[1]; argv[0] = "src/test/resources/test.txt"; // the Yylex prints status on stdout File actual = new File("target/output.actual"); actual.delete(); FileOutputStream fos = new FileOutputStream(OUTPUT_FILE, true); System.setOut(new PrintStream(fos)); Yylex.main(argv); fos.close(); // test actual is expected File expected = new File("src/test/resources/output.good"); assertTrue(expected.isFile()); assertTrue(actual.isFile()); BufferedReader actualContent = new BufferedReader( new FileReader(actual)); BufferedReader expectedContent = new BufferedReader(new FileReader( expected)); for (int lineNumber = 1;lineNumber!=-1; lineNumber++) { String expectedLine = expectedContent.readLine(); String actualLine = actualContent.readLine(); assertEquals("Line "+lineNumber, expectedLine, actualLine); if (expectedLine==null) lineNumber=-2; //EOF } } } jflex-1.4.3/examples/simple-maven/src/test/resources/0000755000175000017500000000000011141044624021321 5ustar moonmoonjflex-1.4.3/examples/simple-maven/src/test/resources/output.good0000644000175000017500000003476510712616761023564 0ustar moonmoonline: 1 match: --class-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : class index : 43 line : 0 cBeg. : 0 cEnd. : 5 line: 1 match: -- -- action [76] { } line: 1 match: --Utility-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : Utility index : 43 line : 0 cBeg. : 6 cEnd. : 13 line: 1 match: -- -- action [76] { } line: 1 match: --{-- action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } Text : { index : 7 line : 0 cBeg. : 14 cEnd. : 15 line: 1 match: -- -- action [76] { } line: 3 match: --private-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : private index : 43 line : 2 cBeg. : 21 cEnd. : 28 line: 3 match: -- -- action [76] { } line: 3 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 2 cBeg. : 29 cEnd. : 35 line: 3 match: -- -- action [76] { } line: 3 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 2 cBeg. : 36 cEnd. : 41 line: 3 match: -- -- action [76] { } line: 3 match: --String-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : String index : 43 line : 2 cBeg. : 42 cEnd. : 48 line: 3 match: -- -- action [76] { } line: 3 match: --errorMsg-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : errorMsg index : 43 line : 2 cBeg. : 49 cEnd. : 57 line: 3 match: --[-- action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); } Text : [ index : 5 line : 2 cBeg. : 57 cEnd. : 58 line: 3 match: --]-- action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); } Text : ] index : 6 line : 2 cBeg. : 58 cEnd. : 59 line: 3 match: -- -- action [76] { } line: 3 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 2 cBeg. : 60 cEnd. : 61 line: 3 match: -- -- action [76] { } line: 3 match: --{-- action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } Text : { index : 7 line : 2 cBeg. : 62 cEnd. : 63 line: 3 match: -- -- action [76] { } line: 4 match: --"Error: Unmatched end-of-comment punctuation."-- action [57] { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } Text : Error: Unmatched end-of-comment punctuation. index : 40 line : 3 cBeg. : 68 cEnd. : 114 line: 4 match: --,-- action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } Text : , index : 0 line : 3 cBeg. : 114 cEnd. : 115 line: 4 match: -- -- action [76] { } line: 5 match: --"Error: Unmatched start-of-comment punctuation."-- action [57] { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } Text : Error: Unmatched start-of-comment punctuation. index : 40 line : 4 cBeg. : 120 cEnd. : 168 line: 5 match: --,-- action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } Text : , index : 0 line : 4 cBeg. : 168 cEnd. : 169 line: 5 match: -- -- action [76] { } line: 6 match: --"Error: Unclosed string."-- action [57] { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } Text : Error: Unclosed string. index : 40 line : 5 cBeg. : 174 cEnd. : 199 line: 6 match: --,-- action [29] { return (new Yytoken(0,yytext(),yyline,yychar,yychar+1)); } Text : , index : 0 line : 5 cBeg. : 199 cEnd. : 200 line: 6 match: -- -- action [76] { } line: 7 match: --"Error: Illegal character."-- action [57] { String str = yytext().substring(1,yylength()-1); return (new Yytoken(40,str,yyline,yychar,yychar+yylength())); } Text : Error: Illegal character. index : 40 line : 6 cBeg. : 205 cEnd. : 232 line: 7 match: -- -- action [76] { } line: 8 match: --}-- action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } Text : } index : 8 line : 7 cBeg. : 237 cEnd. : 238 line: 8 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 7 cBeg. : 238 cEnd. : 239 line: 8 match: -- -- action [76] { } line: 10 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 9 cBeg. : 245 cEnd. : 251 line: 10 match: -- -- action [76] { } line: 10 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 9 cBeg. : 252 cEnd. : 258 line: 10 match: -- -- action [76] { } line: 10 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 9 cBeg. : 259 cEnd. : 264 line: 10 match: -- -- action [76] { } line: 10 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 9 cBeg. : 265 cEnd. : 268 line: 10 match: -- -- action [76] { } line: 10 match: --E_ENDCOMMENT-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : E_ENDCOMMENT index : 43 line : 9 cBeg. : 269 cEnd. : 281 line: 10 match: -- -- action [76] { } line: 10 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 9 cBeg. : 282 cEnd. : 283 line: 10 match: -- -- action [76] { } line: 10 match: --0-- action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } Text : 0 index : 42 line : 9 cBeg. : 284 cEnd. : 285 line: 10 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 9 cBeg. : 285 cEnd. : 286 line: 10 match: -- -- action [76] { } line: 11 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 10 cBeg. : 290 cEnd. : 296 line: 11 match: -- -- action [76] { } line: 11 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 10 cBeg. : 297 cEnd. : 303 line: 11 match: -- -- action [76] { } line: 11 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 10 cBeg. : 304 cEnd. : 309 line: 11 match: -- -- action [76] { } line: 11 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 10 cBeg. : 310 cEnd. : 313 line: 11 match: -- -- action [76] { } line: 11 match: --E_STARTCOMMENT-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : E_STARTCOMMENT index : 43 line : 10 cBeg. : 314 cEnd. : 328 line: 11 match: -- -- action [76] { } line: 11 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 10 cBeg. : 329 cEnd. : 330 line: 11 match: -- -- action [76] { } line: 11 match: --1-- action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } Text : 1 index : 42 line : 10 cBeg. : 331 cEnd. : 332 line: 11 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 10 cBeg. : 332 cEnd. : 333 line: 11 match: -- -- action [76] { } line: 12 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 11 cBeg. : 337 cEnd. : 343 line: 12 match: -- -- action [76] { } line: 12 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 11 cBeg. : 344 cEnd. : 350 line: 12 match: -- -- action [76] { } line: 12 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 11 cBeg. : 351 cEnd. : 356 line: 12 match: -- -- action [76] { } line: 12 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 11 cBeg. : 357 cEnd. : 360 line: 12 match: -- -- action [76] { } line: 12 match: --E_UNCLOSEDSTR-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : E_UNCLOSEDSTR index : 43 line : 11 cBeg. : 361 cEnd. : 374 line: 12 match: -- -- action [76] { } line: 12 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 11 cBeg. : 375 cEnd. : 376 line: 12 match: -- -- action [76] { } line: 12 match: --2-- action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } Text : 2 index : 42 line : 11 cBeg. : 377 cEnd. : 378 line: 12 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 11 cBeg. : 378 cEnd. : 379 line: 12 match: -- -- action [76] { } line: 13 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 12 cBeg. : 383 cEnd. : 389 line: 13 match: -- -- action [76] { } line: 13 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 12 cBeg. : 390 cEnd. : 396 line: 13 match: -- -- action [76] { } line: 13 match: --final-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : final index : 43 line : 12 cBeg. : 397 cEnd. : 402 line: 13 match: -- -- action [76] { } line: 13 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 12 cBeg. : 403 cEnd. : 406 line: 13 match: -- -- action [76] { } line: 13 match: --E_UNMATCHED-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : E_UNMATCHED index : 43 line : 12 cBeg. : 407 cEnd. : 418 line: 13 match: -- -- action [76] { } line: 13 match: --=-- action [43] { return (new Yytoken(14,yytext(),yyline,yychar,yychar+1)); } Text : = index : 14 line : 12 cBeg. : 419 cEnd. : 420 line: 13 match: -- -- action [76] { } line: 13 match: --3-- action [68] { return (new Yytoken(42,yytext(),yyline,yychar,yychar+yylength())); } Text : 3 index : 42 line : 12 cBeg. : 421 cEnd. : 422 line: 13 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 12 cBeg. : 422 cEnd. : 423 line: 13 match: -- -- action [76] { } line: 15 match: --public-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : public index : 43 line : 14 cBeg. : 428 cEnd. : 434 line: 15 match: -- -- action [76] { } line: 15 match: --static-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : static index : 43 line : 14 cBeg. : 435 cEnd. : 441 line: 15 match: -- -- action [76] { } line: 15 match: --void-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : void index : 43 line : 14 cBeg. : 442 cEnd. : 446 line: 15 match: -- -- action [76] { } line: 15 match: --error-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : error index : 43 line : 14 cBeg. : 447 cEnd. : 452 line: 15 match: --(-- action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); } Text : ( index : 3 line : 14 cBeg. : 452 cEnd. : 453 line: 15 match: --int-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : int index : 43 line : 14 cBeg. : 453 cEnd. : 456 line: 15 match: -- -- action [76] { } line: 15 match: --code-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : code index : 43 line : 14 cBeg. : 457 cEnd. : 461 line: 15 match: --)-- action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); } Text : ) index : 4 line : 14 cBeg. : 461 cEnd. : 462 line: 15 match: -- -- action [76] { } line: 15 match: --{-- action [36] { return (new Yytoken(7,yytext(),yyline,yychar,yychar+1)); } Text : { index : 7 line : 14 cBeg. : 463 cEnd. : 464 line: 15 match: -- -- action [76] { } line: 16 match: --System-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : System index : 43 line : 15 cBeg. : 468 cEnd. : 474 line: 16 match: --.-- action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); } Text : . index : 9 line : 15 cBeg. : 474 cEnd. : 475 line: 16 match: --out-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : out index : 43 line : 15 cBeg. : 475 cEnd. : 478 line: 16 match: --.-- action [38] { return (new Yytoken(9,yytext(),yyline,yychar,yychar+1)); } Text : . index : 9 line : 15 cBeg. : 478 cEnd. : 479 line: 16 match: --println-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : println index : 43 line : 15 cBeg. : 479 cEnd. : 486 line: 16 match: --(-- action [32] { return (new Yytoken(3,yytext(),yyline,yychar,yychar+1)); } Text : ( index : 3 line : 15 cBeg. : 486 cEnd. : 487 line: 16 match: --errorMsg-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : errorMsg index : 43 line : 15 cBeg. : 487 cEnd. : 495 line: 16 match: --[-- action [34] { return (new Yytoken(5,yytext(),yyline,yychar,yychar+1)); } Text : [ index : 5 line : 15 cBeg. : 495 cEnd. : 496 line: 16 match: --code-- action [70] { return (new Yytoken(43,yytext(),yyline,yychar,yychar+yylength())); } Text : code index : 43 line : 15 cBeg. : 496 cEnd. : 500 line: 16 match: --]-- action [35] { return (new Yytoken(6,yytext(),yyline,yychar,yychar+1)); } Text : ] index : 6 line : 15 cBeg. : 500 cEnd. : 501 line: 16 match: --)-- action [33] { return (new Yytoken(4,yytext(),yyline,yychar,yychar+1)); } Text : ) index : 4 line : 15 cBeg. : 501 cEnd. : 502 line: 16 match: --;-- action [31] { return (new Yytoken(2,yytext(),yyline,yychar,yychar+1)); } Text : ; index : 2 line : 15 cBeg. : 502 cEnd. : 503 line: 16 match: -- -- action [76] { } line: 17 match: --}-- action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } Text : } index : 8 line : 16 cBeg. : 506 cEnd. : 507 line: 17 match: -- -- action [76] { } line: 18 match: --}-- action [37] { return (new Yytoken(8,yytext(),yyline,yychar,yychar+1)); } Text : } index : 8 line : 17 cBeg. : 508 cEnd. : 509 line: 18 match: -- -- action [76] { } null jflex-1.4.3/examples/simple-maven/src/test/resources/test.txt0000644000175000017500000000077710712616761023066 0ustar moonmoonclass Utility { private static final String errorMsg[] = { "Error: Unmatched end-of-comment punctuation.", "Error: Unmatched start-of-comment punctuation.", "Error: Unclosed string.", "Error: Illegal character." }; public static final int E_ENDCOMMENT = 0; public static final int E_STARTCOMMENT = 1; public static final int E_UNCLOSEDSTR = 2; public static final int E_UNMATCHED = 3; public static void error(int code) { System.out.println(errorMsg[code]); } } jflex-1.4.3/examples/standalone/0000755000175000017500000000000011141044624015274 5ustar moonmoonjflex-1.4.3/examples/standalone/build.xml0000644000175000017500000000111007710746221017117 0ustar moonmoon jflex-1.4.3/examples/standalone/Makefile0000644000175000017500000000026307606571215016751 0ustar moonmoonall: run run: Subst.class java Subst sample.inp Subst.class: Subst.java javac Subst.java Subst.java: standalone.flex jflex standalone.flex clean: rm -rf *.class *~ *.java jflex-1.4.3/examples/standalone/README0000644000175000017500000000063307710746221016167 0ustar moonmoonThis is a small example of a standalone text substitution scanner. It reads a name after the keyword name and replaces all occurences of "hello" by "hello !". sample.inp contains a sample input for the scanner standalone.flex the lexical specification for the scanner build.xml ant build file to run the example use ant or type: jflex standalone.flex javac Subst.java java Subst sample.inp jflex-1.4.3/examples/standalone/sample.inp0000644000175000017500000000014707606571215017303 0ustar moonmoonname someone Hello This is a sample input file for the standalone example scanner. Have a nice day! jflex-1.4.3/examples/standalone/standalone.flex0000644000175000017500000000346311141043444020311 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** This is a small example of a standalone text substitution scanner It reads a name after the keyword name and substitutes all occurences of "hello" with "hello !". There is a sample input file "sample.inp" provided in this directory */ %% %public %class Subst %standalone %unicode %{ String name; %} %% "name " [a-zA-Z]+ { name = yytext().substring(5); } [Hh] "ello" { System.out.print(yytext()+" "+name+"!"); } jflex-1.4.3/examples/standalone-maven/0000755000175000017500000000000011141044624016400 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/pom.xml0000644000175000017500000000162410722057760017731 0ustar moonmoon 4.0.0 de.flex.examples parent 1 standalone-maven 0.1 A standalone test substitution scanner This is a small example of a standalone text substitution scanner. It reads a name after the keyword name and replaces all occurences of "hello" by "hello <name> !".</name> junit junit test jflex-1.4.3/examples/standalone-maven/src/0000755000175000017500000000000011141044624017167 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/main/0000755000175000017500000000000011141044624020113 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/main/java/0000755000175000017500000000000011141044624021034 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/main/jflex/0000755000175000017500000000000011141044624021223 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/main/jflex/standalone.flex0000644000175000017500000000353011141043444024233 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** This is a small example of a standalone text substitution scanner It reads a name after the keyword name and substitutes all occurences of "hello" with "hello !". There is a sample input file "sample.inp" provided in this directory */ package de.jflex.example.standalone; %% %public %class Subst %standalone %unicode %{ String name; %} %% "name " [a-zA-Z]+ { name = yytext().substring(5); } [Hh] "ello" { System.out.print(yytext()+" "+name+"!"); } jflex-1.4.3/examples/standalone-maven/src/test/0000755000175000017500000000000011141044624020146 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/test/java/0000755000175000017500000000000011141044624021067 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/test/java/de/0000755000175000017500000000000011141044624021457 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/test/java/de/jflex/0000755000175000017500000000000011141044624022567 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/test/java/de/jflex/example/0000755000175000017500000000000011141044624024222 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/test/java/de/jflex/example/standalone/0000755000175000017500000000000011141044624026352 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/test/java/de/jflex/example/standalone/SubstTest.java0000644000175000017500000000234210713074643031166 0ustar moonmoonpackage de.jflex.example.standalone; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; import java.io.Reader; import junit.framework.TestCase; public class SubstTest extends TestCase { private static final String OUTPUT_FILE = "target/sample.out"; public void testSample() throws IOException { // the standalon Subst prints status on stdout // redirecte it into a file String[] argv = new String[1]; argv[0] = "src/test/resources/sample.in"; File actual = new File(OUTPUT_FILE); actual.delete(); FileOutputStream fos = new FileOutputStream(OUTPUT_FILE, true); System.setOut(new PrintStream(fos)); Subst.main(argv); fos.close(); BufferedReader actualContent = new BufferedReader(new FileReader( actual)); // the expected result is in a file Reader expected = new FileReader("src/test/resources/sample.expected"); BufferedReader expectedContent = new BufferedReader(expected); String expectedLine, actualLine; do { expectedLine = expectedContent.readLine(); actualLine = actualContent.readLine(); assertEquals(expectedLine, actualLine); } while (expectedLine != null); } } jflex-1.4.3/examples/standalone-maven/src/test/resources/0000755000175000017500000000000011141044624022160 5ustar moonmoonjflex-1.4.3/examples/standalone-maven/src/test/resources/sample.expected0000644000175000017500000000014410713074643025173 0ustar moonmoon Hello someone! This is a sample input file for the standalone example scanner. Have a nice day! jflex-1.4.3/examples/standalone-maven/src/test/resources/sample.in0000644000175000017500000000014710713074643024003 0ustar moonmoonname someone Hello This is a sample input file for the standalone example scanner. Have a nice day! jflex-1.4.3/lib/0000755000175000017500000000000011141044634012075 5ustar moonmoonjflex-1.4.3/lib/jflex-mode.el0000644000175000017500000000477707670613570014505 0ustar moonmoon; -*- Mode: Emacs-Lisp; -*- ;;; jflex-mode ;;; author: Gerwin Klein ;;; $Revision: 50 $, $Date: 2003-06-08 21:01:12 +1000 (Sun, 08 Jun 2003) $ (require 'derived) (require 'font-lock) (define-derived-mode jflex-mode java-mode "JFlex" "Major mode for editing JFlex files" ;; set the indentation (setq c-basic-offset 2) (c-set-offset 'knr-argdecl-intro 0) (c-set-offset 'topmost-intro-cont 0) ;; remove auto and hungry anything (c-toggle-auto-hungry-state -1) (c-toggle-auto-state -1) (c-toggle-hungry-state -1) (use-local-map jflex-mode-map) ;; get rid of that damn electric-brace (define-key jflex-mode-map "{" 'self-insert-command) (define-key jflex-mode-map "}" 'self-insert-command) (define-key jflex-mode-map [tab] 'jflex-indent-command) ) (defalias 'jflex-indent-command 'c-indent-command) (defconst jflex-font-lock-keywords (append '( ("^%%" . font-lock-reference-face) "^%{" "^%init{" "^%initthrow{" "^%eof{" "^%eofthrow{" "^%yylexthrow{" "^%eofval{" "^%}" "^%init}" "^%initthrow}" "^%eof}" "^%eofthrow}" "^%yylexthrow}" "^%eofval}" "^%standalone" "^%scanerror" "^%switch" "^%states" ; fixme: state identifiers "^%state" "^%s" "^%xstates" "^%xstate" "^%x" "^%char" "^%line" "^%column" "^%byaccj" "^%cupsym" "^%cupdebug" "^%cup" "^%eofclose" "^%class" "^%function" "^%type" "^%integer" "^%intwrap" "^%int" "^%yyeof" "^%notunix" "^%7bit" "^%full" "^%8bit" "^%unicode" "^%16bit" "^%caseless" "^%ignorecase" "^%implements" "^%extends" "^%public" "^%apiprivate" "^%final" "^%abstract" "^%debug" "^%table" "^%pack" "^%include" "^%buffer" "^%initthrow" "^%eofthrow" "^%yylexthrow" "^%throws" ("%[%{}0-9a-zA-Z]+" . font-lock-warning-face) ; errors ("{[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*}" . font-lock-variable-name-face) ; macro uses "<>" ; special <> symbol ("<[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*\\(,[ \t]*[a-zA-Z][0-9a-zA-Z_]+[ \t]*\\)*>" . font-lock-type-face) ; lex state list ) java-font-lock-keywords-2) "JFlex keywords for font-lock mode") (put 'jflex-mode 'font-lock-defaults '(jflex-font-lock-keywords nil nil ((?_ . "w")) beginning-of-defun)) (provide 'jflex-mode) jflex-1.4.3/lib/JFlex.jar0000644000175000017500000053563611141044634013625 0ustar moonmoonPK ?: META-INF/PK ?:ngwMETA-INF/MANIFEST.MFMLK-. K-*ϳR03rCq,HLHU%AE%)N zf 9 yz\y9V ^n9z ^.^.PK ?:JFlex/PK ?:JFlex/anttask/PK ?: JFlex/gui/PK ?: JFlex/tests/PK ?: java_cup/PK ?:java_cup/runtime/PK ?:O JFlex/Action.classuV[pe6Imޖ)b4)\,!@[E lӥYtT><2#7} eҙ9Υ_Mx77"AȘS ȋ8罶LA1+Ԉ9h,lx8$E^.,b>q "^ZWC!-9krxA?#}xo&)T>9K'g^lj,qƎ%ɉt.˷ ZɃu~f2`IfǍ +^QYU-)#¸! ŷKTc6}ԧakFՔlunJLS%4)WTKQT)́ry0Q0T]#0i}F1FՙR9[}q_nnd0ѾB U"97zR(<_"F(~BU.䰛y`XZڟu~et}aZ$&1EHcoW hڢxZ6[9h3FђS\[BN?Fd[ 2j z<^az5Bx/,R \PV;IkDVcOoM^ޢah2C v} 2!lGo;xIi aP ƹ2E#rha;2cP`<˽˫${hp\v7濁🸇1Id R#uӛe$!zFr85YU&ڦLTՀI $0lc9jc ǿ'?Ps\J (6/c*.aEI: E rA I -,Ej>ڭm!M#WL!ˠViv:r¨({).좃KoP, "bV'.lM!XrTvZbB v9rLA7ݕvߜoNڶPr]9e}wTr{YAE'YX ڨ|SNo=T 4aNf9rȒĚ]Ԥ5i]Mz&Ԥgm1M3Rq-ahSiʙPK ?:ա)^ JFlex/CUP$LexParse$actions.class| |Egzz$sp[PQC H8 I$ ^x߈ **B@Q^EQvUuU{3I~~RUWu;~}1`Ћ.n2N%5d_&jTIvlM2U2MVeuN YTIns, HDN* ZEd+y* DdVNX(:K ֐ *Yd'1M*i֠4A7eJh|9C%K5cAVgJi9W#y*9A. r.%6rr\!F`(Y. \+뤅(^%7H6J>od)*M.žC%wʑ4 UrSIFd#{mdJLrFzk^$`#mE%ldxF-RH&I|}F6I)S6OR<->c#JgHk>'W~.[;eJ^\2F^ϗe*iuSzCVoʅ%e#oKݒUyW=z˱dWVʾH}RdcDbS|&Ws|a#_jp'J%_jcU.#.36Oitq9 $ਚFxQk'Ҩ '8&Fb8䲆)-k^8[rΏSۧ):7CDiMYhi9UM5uǍ$φHQzZ/9Hmq,V}l125*)6/Jj,)+"kg}Uvr$V#߭N4ɌhNq" ԅ&9#N-CKZi(%t4.k, 2RZςnӥK$*,E񱨱([AI7s9jjLV5K˫UͱXׄ Ek=:UpucMRH|4Ģ%цh y  ߾mSU?|1\lAhNɾ_0ur Z}Nz4abPM]MtʂdLiSPb VV5755U8ʛ"U ZVnG^dZ)IN,wE초SjsP-Q;h5{ԪV+%lj\GsH3֨b$0M9E6iLs]6s-i>DнRh\\׌7" HV(-V`hmtJ6a.۸oPhC1ja8^q,["#aS̜iÖ5ag["-6芛.nnΚVmu̎[kc>ZZT[5q=dFH?KH\NBtV\2)րwԌm 7\Xu]瘹4,0_H[_[~h*"ⶺB.q/m4KuthaQj=2cBi(Zg)eĻJܟ&+nACo?2SЛMjXqaS}C2x<"*i&׭9VY#@g3^FEޯ%f>V'|u J'N~!VdEdEeȯP=pN9Utx"Ȕ ԦRN5x\xeow:H2=tEݲ:8;$%I>eIHna#˵D/<:l:&^Ui ME3JWiNC4#oJ3tIt O4GVa4*@G3_:ͣhsF贓4ޖ^qqiUJ^4]&u'\c$]^D `x] ND{6aGӸ:=Nr8s(7/mOs'?t 7w2,QR_Wd"Oeb^i U:Ht:͌HL"6jI[_ 2/c͵Q:.=z-{Q_;Q4R[ Ѫ95U%-Y,JX+J W|x92Hۆt:yyh.\-=1nn EO2zDZ :Iq):*Otvɷ2RIbhaaB'WIy*͒:!W}:SfI#tNEVS4;OH>%*Oca;WNi!B !plIF갹l:#Sϩo_ uڰM2[M[o yGA(Og M&h楼3>.#C58j k i"DcH*Q[Mci5sk ^8!+֟s͍6,6"Rҥ ZqO |D@>VTN/8Xo&b]<ۺƁvE7IbI?M7Ұ") ֺ)r԰voh#3tH%2t¢Ap' df#`NgQޫ]bg dDe7n޷wcs:.&[.MmsFN,*-,/[X$CF6͓IB6 Sd&(sn;@NǢ o>⦄c۪"2'\ɒ_eR{Efj`;AX^1lGÈ6\Hl$fGJT6Tn&ţR\TQ"XhgI!15N鈃4\~'AMFRtDsT:"4}ȈҭƣTVPL:w78){PZeaa`y}!IUXAСNNхE@%ԴQ?%nX0meP^dn^( Tf#5E%ВX:k xe9Rӈ);_*On wmɦ"#"5z,#6YަWcq@5`Â)!?O̍'Co!>ӁH 0NjMb-Xk>x߻(h4N)4i&tЛa ͅbigiO{}`f҂zq M–--m_WAZ#_oװ@6#sL<*wIZyȺ=p>;|[ 4ө&HNvAyni^!G2qD5>ʬbd8A+@+{!ծef 'Bt::ЕA:m[8h za)ca>8KC Zƾv}'va1ZoYl9mFK<J`Ɩ" z&%,@G*[-.!]ȣy^xzȒ l-z=n2ܰr~OqA#eZ<24THӠN NgB)D׍@Ά NQÜǙ*ZF& A| {xtC1>|`[^}vyCJy^&mu#`6o^76`з{Я56'oC& ]ߠywa4]ci1Qp2‡8' ߆FbI ˳XnReFEXRr.>aȚ9 C_`t46 ,˱ÂNy `j?o{\eoX܅D6,./buXP^r&G]y!C_b(?})Xz6 DnIJ@2@t6Z8W8`=B!8Q%oЧ!}ҧ!}GDonD{3.E cF+\n! .m%&6BimrJoJHV_x2 ALqBp*$yʼߧ!t$ ӊj5iw@~Hj-Pd=S| ѷVaAtC\YSk>,qRܐMPd%ti!CPL`%BvƔ_sVBפ1h 4GHJc\zyz^Bv5Q+Akkwkw!'9#Q&Cmzt_hs0v7JLKt☧eLqsy$ph͉yyH;HB0x<c̗DTEDEK.c=!aTYfjf9NN\oK5T;W9#ݒ4w6}e0;sBSx*茭wWAh TL٭IҀ`VCGnC$I,D4@> p$SI8q%+2eyO ӒU; sD銩OR'ƓUkg_qJ]dtv #uqGW kt8]{m#=ʱY' _q'/m g|85鰛qϝ!lf>l&l49m/73#{$+gYqTOO'Zw-Pς;ɆL“ho3K~K|?Xߚx|J]$'Svoy k7II&kc1 ?h ;Gv{VЉCz {a-wDGI˵ f%IVO?\"!a|܎sXq.yDd_;[讐Y\A%I>mjD-dw$QtQtIR=-.3X]4]r3\%9r-b9~iۃ880]r,2xce ZZHȗϷ53nZ hMqn ZԊ7=[k 6uJl۞m{~B(lO s8;r<%z~~85g %?Wf9d Q"RC/!JRO"d%]Anד[ d ]I 62I ?һO^ڍi =nh =n>JO V>Os J=t>πt"ˠ/eVA_eSl:}͡XΥ>.{ei:я7cv~]SK>~Nj=At?o?eg~>w0f*/ؙ̮CĜJ_RNV&1Xr. )Wte%PֲLeR^b9ʫ:e]oYWgD.zb(%Xo1#~b);AN b#"bn6\F=lQd5J՞l:SH6Qej=tu;E]NUWl(T[JU3cS<[ͷ `lmƳF,dkdͶi5lvm;Ӷeαϖm|]bwK2{ov]aˮOcW٣l> x'?Շw\DD^ W 亊Oq৺3\LF^gv#>r;x;Gݽ>=׸:ww"<~7M7x}~s~{?_%|$~g?SʗyNy? oF7?|SV\owʷo]÷n;|}|}}}~O[c|?/{WokG Kn/?6?rρ@!5Pf)UH`B*,E WFت=+W)WJJ'%5a%;(@%78J V(33s˕0Z ޯ|\|N|M9.rB320ŧ K *))+E))Jq,edJ2:l$BeL 4e2.e2!JyNej.eZez*SNMJ$ծN )UݔAJ4u2'u2/FYZԧ^,JZ9-Z۔ũ%[3R*KS(gUSKF9?rAK0ͧ\vrI@ʴ!Uieii˔k*ץݫJO1a妴gv*ܚv@=DC&Pֆz)Q:Vy T<lMW Wl ]<Z<Z<ڠl mS}<Ry.-)ʎ.G*/OS^JQ^N_~jM_)oU^O^ٙFʛ_*2iʻ{==3ʔ2f*{33Uq/v壌 O+d3ci7g3]ݕ/3)_gNTϜU~lVg^ysZ-ʯ+2w \f g#IB͚*S3kpe5 w2Z!Y?kHzXvEFg"3a*rSp9{]. g爾~׊cWgo'd*NY99bPN181$gS( sƉbD4Q3C9_\$r.rV9 99EyNQWLBLp3]EeX1+'n!nBܖXX"ebC(P%B<7El͋''򖊧n= m;/,^{]5ox-oؙŮx;?G!?J_bO~x?؛_/>_">ʿE|".eU77ŷ@|߉:gO] xOnM^N[OU bkx#clp<=`O5ݫp|bFA-̂O%ϰOc:ϱ`p|:_6G(,+΅^5|(2iX tΠS_Mo@f8 (:_Zx1m ($s{kWjp5mݔW_,S1o0;,L1t\k(W@D(Zb!?~p*]֌p5[8ߜ!TXdC~|EL%_/8`". Db8`p->ĞWq$nq5FKTsM0pݞAs Rl #Mz8YۜۖtNq:qq:90ݢ,`E&A^q:  M:T8ޢ~`]ǤYtq٢ݤ"AIWH:BR%[("!i{PKQݿOD0VA_ '` =U_Kʿ/._qq}R R*Rfť ƥ ,K=$QALj>parvHIUu p:2<-Q~4T-ncFJg9#xٜ2.5gT(2 OD)Pe)jL!\s#2vfdH;Ԉ ݵ7mac:\cBpԞO:(I&] tiC0nVifi xv*' XմgXմXR  z[Ӎےlے#tF[G ?H-C+qwKIjRRGhoH t?JzS(]/QGˤDIzz 3w/ ]i%w߄gJ󤯃[ pԗ<1 C @?O`F9Δ/r5H|exēL2`)_ƹ)_)_p)_є/i̔/uXjʗԐ/8Ք/7tH3'Đ/3g!_f3UC̋ESQS̵|[`)_| Shȗw%pJ YAR_)x73=knI2^DߝrwwLix9=o 0^5o/%IYsϯ4q {t;8`oňٻ2XA$ڡLf"{3ENF\My&M^b.sn< E$^ !C>W+cRdRCIDB IZfKh<03Z?i>Ƃy 0#PvMo`oU{K8slRDT"o^ h)pRmcZޮfvPK ?:{;JFlex/CharClassInterval.classuQmOP~mݬ@^ծ2 |YYHJjG4q#2s;5q}sN}  xE%?U'!EV#}쏂frlv4(Q _ XIw7LZJ6B5(ewViemL`҆0IJ_}T4u4^WIFsw+0Oq}:9^ߚ;>Xi#4\%z@  9#;m6<$o-{^u77`~ӄz`2Pa^zxu]WhƵ ҲFu'-9!,;2Cb Rn2qrZNFǿPK ?:;.W yJFlex/CharClasses.classWT왼aA Q!$bZaQAcC@"р C8(n6ZXV[vնj~70t˝{w]^pc1> b9vSS~ehL>{q#~D Ye%2|Ea4"Gʸ&>.èfcxBoI9vO;|p(A8*0. ֏sedRcA,~ڶ5/UP[*ZSɌKZݱDd|@lug,MVzL(:vvǚVE͞gAXZ/fsXB-oգXʌGFLjp~ScՈ*TE=jljd:287YȲvCz/z3m?q+=d$A ]݋u,.K7bZ971iu.F1*=*w>\C97wqܜZ) TqG}jl?#(xLk,VsZ!uWX˂6:gqt %ka;z8%kD]54 9ɧ=D'4gю#`T^^YTAl #ׅĖZ d1D;6uw49D8/KN0V/kuDSCޱcG\ a5z>3 5 MGUTർvJ#RΖGݫҋQHHԛt|H=$o4FFJ8E\.}x .OG.y945cǂ-w Rk9,'6F'rX^mC$0a>R/qG|Y4D|%BlP*TYRՈ,Ta4XNZUj.l: ;ٸQ->_C"[usImul|DmNB8"qv +Wsuu TU}:BKq>}8blꝆKN` ӉZj#+_MU]K]'x4e-8%u ^mu=QtxW1B,eiL[^7]X /C?v ˸w{GޱjÞm{aXup=P{6fvXsK $DGL þ \ԥLd{(L) U!9mTY,Q75f QQb ^[e t&,}g`pf۝T5s}bow]9;N0X§ rSPK ?:惴JFlex/CharSet.class}T[WUCP0Zj i VT.Ph\b V2XK]_|/}].'[ Ir;g?^ÇnXQj'q-%#ˤl?k*iD1!|E_;\71/Λb] |s[; ^_p?E \V8V*aFqC5gy%Ӯhh3!fm՚2-!:5OX)44MX[R9cHO|3Fٔ"ɉ+嬲5ń4Y!FVe3y$X}}%>\rAK⥐ge^kW".+q5Pe.)9Wlô*򻁹]eZptFoѰVz]/y4؊&l :yctcyY &-msj”"KuŻ:mףOwыC ` :58Bkh=\F`&(t1,֚" ŲhgVUc5״aX5cӛ̞٭a\6r- ~!.g}C)Ζ`TKeU[Ⱕrtbڴ3Lm=Bڹki;oqe73݁ځ=GS}1(IEKWR"тouE0վ _5N> ͵A :d"V(z L0JzM4_nO?1 svz?\/\dY! W 8"8x"TI4# UBKWGwdH6v7:FW}©=:Űec,8a0GHtWH'$HTS6ދ+"BZ,=m"{"V{?W+;@LnfڜHzu p6ib;ZKD8Xxn*#թq F r@KPGX%°G _Ww9PͻSSۈMohzxvcqmpsEHʓ5NOVs`PQM|/`e-0%7[|aҜEeM3+NsƝPK ?:0JFlex/CharSetEnumerator.classTNQ]3v K !$ rvLRco_BB%01D?ƺti>^˯;pIQN(ӣ(NMojlgQMpni)/==k26)ɉ,$ǖ-wVzChq;cElGNfSҝRFri+3oA[ՍƝլt-/H3h=21b-YNZ\5,[9WgdV:^ޏud ~U7-'l޶n`ZL4DM4 f@m&0aD:1@LIf,Ar&"*S6tgy)Q:B ^H+WgDOx؆HE}Eh-j[yUd+w EooFa&TvڐHA .MqNCN- bl=s\@+3 wLS4=̊9;2z[=챮֧Zҏ}h Ш_q.:K2Wp`XUa q yDٔPfY@(. (jb}q<'MW4kmvGf3V7ҬEya,ҵת5se Gc~]oPK ?:j zJFlex/CountEmitter.classuUMP[UnᒦTBjoiKBZKjmHiA}//Psʕniq+g]rʥ[w{KВ=|9>~DahkEr3)T  ii%,GVn瘓r3q<_XXe8pp|ȱ:&G#aplqlK\A;-+FM3n-5BæmW:}OXYh{{(4^SܩisMY7-DŜn-)-tvf2gƋ۝5]pwX&RiPؒ]s$9^6eZEhJD04ǧն9'sO*%P89cʔ#ޥ}CXrA*[[#t*(9UO]R5'?.)5!>{ ݄:FbbDƾFDJ"FE:@"RncyHŽ5/G/pze4d}JXi: >LwW"wo['j/0)]Hh;nL&%!NM׋ڼ8Nu݄*$kD"j iOU1 i%so;4  FsΓҺkݢmK%˾>syqyǏQD.\bߥ/Ekh9]m:.!-Y1RzVZ_SLPK ?:9)-F\3JFlex/DFA.classY xյ?a!O2 Ȃ50@0 d0I&d`0IV֭U"DU@6Ejk>q}V[[[٧߽I>z~TGڜ##(ɣT1.t\* UTEHE>cQ5S|4G:|':|,vx'sård|T8:V,QJUL,3}XQióW9Y/q /ƋV_Tx /U$u,-WW8|WU:E_:jqk:pIMnvx-^:pot8p]6;6]ns͛ެlQ#_×;epJ:|Wc5LҺYuUKiήh[h;&Eu̫dvE1&z5ιhI^~Ʈx{ӈ5 &b[ә|%K]1EYmݭ]G&%=33qAϭYOLl€D{hK,ڴ 8x[k&Փ3sڛx[lQwkC,Y&1XMU?5DZ%Ii6$ʜ Ӗw S,Ś4;c]Uo{X@VW;kNz9юhcPWb -=Tk[բۜn;h2 ݝ- ѬQY0=[\}Ծf'0]IO4>}qUZBRmjKF: fNuz$o=MNT5|ڗv%mFO0bgN(+1a%c p*8ivvwss,ޜwob,>enf 0Vayl\umՖXGJ%Fs\i8xPyS{dkTA%ָ!)km>]MvzBqmJ'S9'Vw9[njvnj YPKF&nŭj_\@8<>1Tl;P!2C*@fkZ2cr7wCހr6堌Akh5hj"jZGӨΥ8͡4hS#uA)IXh }A-r 0QfE+ Vj݊-6=6 NH~=H-zhH N}أ@ G@d,k->@U~?e+՞x`qaG4U2Lxfd(R2ӷqՄn=͒EciW !cIA}9wFٸ5rFHIGJrS tFInA UA9%!5SR"]bfLX04NʙEW'U߉ RKrǃHFXg>#p=`tWFgsW up\z{/&~Jm=It03wpU <=(x*!ڪ> _,2v9]࠰r!:e!:uexN[X:y?I~pCT5Lyfdv+IkIy 9֭5pl zQ{dU5ϔm"!x94rU mz"0֞k[-"]VXAc-FAmkGۇuz<~FdU9BFF:Wdd;ڃ2nU`ڀu+x]O'k5RtM*ǫy^< nBOzz`Ls~2o4c9x-wt#n%'CF ܂t* #{FW<z{Ft\ g0TY&] MUq$N@wUPqe$A n*(6ԫ=V=-jB70`{ZƼ~PȌy۩Tku@J;S~MPրVuê7Z/- &/$u<Ç׵QY%SýXᄣAqAe(":&BhB eyrO!dCF z0fZg&(~2$(it #\QpUsIt嵙5@S^Eg+^ţy5ዹy /393:P /Ay5'FnAs/>e|%bÿo:3_/u1ogb&&b!oKyXw|Xǽb=+ZO$Aŕ ?"nG71wN> Iϡ~Wx+>{~Ae@/, nr#< 76&W (^B_>ICn-R!nz4|> H^<~Z;Z@VL=*jmȡH|U+J鱐qzo(m7Ԙs"a$_z|I [eƮGR&ZctX(2;8{Wc׷?y~{V4#u)K"Io:}B܃1H*k_hXB=V!ulUB)[7@Z2ҮYHNǟy-Vۅ HT"Ai *ʾ~Ev'6%uH["ԮG]c!|t= VFwسn%?ڕ;~L#]|tHz.c,vF~HP8x,?*B YSAttiT`/ X*|K6 )B]Hk*YކSOrkʙE%G>z@o 7jDo~@#~FR/3[U&so oʀgkq%FѵB'MbQj/LP3KLP3K1ޗ {)1@ ;9;MY(-lRG^NZ3Lsk*mdxꋵkҾڀ:FO:R &L..K˰bOZG2#BZKgd5e%kx-8NHf?Ί{T(~Coixbw*>-C)~O?O_',qFitT+ Z&M(-WڴS:_5e9;^ԦZ"}%e.!:橜*G%6 lY\ 5\]0E+ Pi禲D SҀ >m,3B>}LJ +tH_PO8vP.UN*(oIoɑqi;(ov62qL Qg?FlF :j.,4SM➻Ѯ2[}spm.렁P 5BMsw/7ȳ-|kIS4޺jFhbL0ZR;ߪGJy ` T@#a@e&B*E4MsX)'O\ޣ!ad~V҄ۚhfIQk@%*g ))ϼGtDh;\S #8-::9{ V" !yj){kR~t.嵀u~7Fz/5ySeQ?>&]DqmΠ;O40~Wg|:dÑ{1ׇ:!ژɍ/;MiNH;G3JBPiZG܎U?ޘJyLG9)GpJV(6< JtN5NZ~cCf~ฃZ- E/33*ب8+PK ?: QsJFlex/EOFActions.classT[Se~dΕ"D#=r'C@AZj=,d l,:#W ‹rÅH3N3&Kqƛ;}w/xOэ)iU`VD 0/B*ߖ*ڑTbYFX4 if esEc+=^l|A/XVhM_襬5e; %^9A˕vޚ[E3Io(!ӆ@0iTiw( {{g93w|/3wf̜9̙s_< ])|/̋G)DO_)}I9_)5%Q>L?@Ws _R Z(M~H_S$G (g @R`IBP,)(P J$SN *^JtE'B{LA*i)HW+s0HKDwDOJdPRUSJD_%Qq PD~%(DJ TbP%W%)qÕH%DCRDYJ8%(.WbPhʘDRb2eLQ*1Mj%+1CJ,%f+1GJSb XD@EJ(QDPJ,QbuJ,SbJPAJDa%"J4+RUJVbkXz%6(q'(q')qؤ)JiJlVt%PL%Rl%AQ*q |18qA2Bq+q*U˔\+J%xWS|ە>Sb+A))B-skMj'nwPpgrv%ZKhSn%Q^%S~%PA(x~JRc%>O:Mh}}J|,_S  ;%pďJ4_ߔ=I[?RX8a'%%%( 8ɰDr$JJlZZ$eLIU3J)Et%*MT=8L%doJd6}d_)_JP*WIyJ+Yd`%(9TÕ%V%U>%|Pɇ|XG|𘒏+d 'S)O+*H3R@_/Kr o'_Q%_W %T-%V%%0M;5IO(W~Hx|))9_P@)FowJ~O((_W)7P / h[@S (jYx(H9JNRR0#,{)jduH:2+J* KC H!2#PDjr)@$ rY`e``}ai%E #uԅR E9 ɞ"3"&,z*.8 SHK5`vaep42Oc)LEbES(]`.W^yV$Xk`JCS0-n Z6q#u'K5Hj@8\a"`ʺpݢpT]C]d4x^$EȊPm]j^(dZ 4QΔuoVEl6V`y 5Fq8GҎ UNkmSjhܦXDn%7VbΠ6'@nlzj7#o,-ȶFzlYMBhUD(R[51Ωy"J$@x|2Z^4խu"(wl$)d)iEI:ħ}V&"5KmH;ijK8? C5lir1&:j3"KֆjdAUbn(PjEPm`h)Ih`V7ԗaq)@B,#qkPj*P1QjB͚+IQaD'䰛6N|@ysC=kP%N`ȦZ!`LISS`)(44Y)kE`5*D$M/G2U+ ,ЪZJ"HE͚hɁhE4&\ 5 ҨdlR.iZBAU[8b%ɚ̡8miJEI3s|wLi%EXTQS0\iPy0@TLs %ͬ6Le*ie ai3$pTV}`-+Ih 8J]S($(ةg<}mpqLml$ld"ENz/)Q=t͜ wAF6i#\G(o1*V,Rؓ1:-k5ȏ .[+/G5ɒug@o8inDr2v4^Rjf!^H< 7/E|mk$OIV7q^C^+蛎t7qRNdz`]2_$&n8$䫣(+1czP ^>Wyy/| FC^^ZEeJz{-ke[]tNtaZI^?q@+?ַkl_82X )5f}mÀ\}UX}.(X|mZyEҗd{~Ob0CMҠVY>ab(z\"Xl} |>Ta+1Ϸ(|s֮-kPIJg^0vzyyi92TW55 k*$R&oa.u^k etTǕ+X%u_vrY^JT7h*!Ŭ !Yl dž>T$EB˃ Fl1Ҕ%[ߚhX̀-Zk . ^bQާ-ھ\ ".C`P[F *@ bTKO 4&ado +\{ԚP&b?3uQ"Մ)9r}Ph6>G_H3Uay]BD(8w uN!v`rsvP+tou;Q K"K1?/O2g-ͣpih9M|qfQ ^9_:Րqg_Pw :f9`δ5aF(Դe7v{62ӫ&VMY嫞<*|& ^s}kN!}肄|$#d(5i//M@D .j^]赎@l #؀:>fu5TY9)Y_*Pk 'x>(݅Mh֭N3Rn$Bh:w'@>lm@GBݲɦYCys1FRqlFGd pGpΡl(NÅ8R{S7vijDkpVl&ԇ:o:iBV4m4"K<aDiX^j7R;"+?(_tP Ƅ 05?6iLl<+-ߊ`diF(ET lDPhN]YBڳRʢUzq@DwiY:"VMD&Rz9jj4HiEjEFc+?yz*gD ]:P ͞N+o}QZHZR?W1ŧBKa좂cuEob2^jBa-j)9'޵kKt>Z!}JX2'7מQ}9c5{UH9Z䐨dSU_CUFγ wAuiOb-zp$Z$PVZ ;42)jUk0ZsWb0a8Cƪ &TN56cfڵMMhN +q][PK[biS{T(kǠrN\yn stb(vf!@8}E5^|-nL%hfi[RgƐq 8]'O 4-jX +אS(cmcŅ縠.T}a*\~q 콴2q Be3L(8vb1+o>+tRj┲b/dzTwf L))X6N{z#;ɪZh.u|-j< _'}]-ͨJyz gl>F'R+`9$UGۇ,Erp12^~,)94h\UQ\R]=btT[?/Uw4{5P'prNhMCm3 VT=\P#i=7qVS+b'Y^k\mZki}9Zt3KVUT8 !=֊m& tr&р֌,i)UA-X4RR/xXhzu;hp!aqeGJ%FcMzw@%p]#,tѶt|72h:O.jjg"ӐA&svcFUz=DOh63q ™w&/f )x=H)b=m+ols1 ]V(3z 'ޟ6cZq.fhE ë{x9NM}sqU;`d)~DC ~TɛW䈐&W8,.[;]E.:LOl@fkvff`jnZ""xzǍAֶ8:[y1(*ļQ@rM؂oj_sZ[-Fm~:+j3YkX)ؾ6x|mk*'hhUm8::-Fi!!66ta\M܉톋CmAV:2=4G u U^-O!8 VjZ͵f\:u3q+\}]bSh6I5׆ѤC̶&aGqXӾWfGGӝcΠm֙Z]6ZgYg'^ZLHmVWLͤkcMfu_VtS/38‘脜K;.E|݃ tbմMm% ΣblCSZ]ʧMZS=lR@^|:i5HEG;Y59p hJ7Pw'"2 go9Cj׿tq.I}đĴl5Bb# 6A[9T͜T&փVC/EsIAPme86`S֯?(~} ~ !A+\gqubƙ8’/;/v_)/G=鮒)q*eH}e)zc)/z%!;Ͷf !tvѦ݌7 ..J8ty%L'-(t/&#Mqd>S5 mCeqn&CM~P| (W[k]Ag eW,fDk9V 594v쓃t6B ͜bsF[I/>˟|:ӡ5 i'YN7(b[&ݔZCeBH+jڡ\KO:C=#v{.0]WZ[;<`7pW{t' N`3@ޡOsb{#M{RE-K)M`SdMVC m_k)KÜELDlv T . a N`|3 6H O@dnns䜭'/ZE%-:%"=cil 6tH䠩[ j0 6nvNxH/byLM*J҇VcEaٮ-tmLn/y K:իdm3pG}OK|&Wp$_.+ zӤV &'7t"(Vw,Qj8ꇹFE_qvkrqeFsb!y͗/Viﺰs|l ѫԘM=ԃn)w-c & ܋&ጦKoʤ"5 g,TU2%N35_Nrt\D^IJǓsiZbgx]>Οkϳ:^:^8ZL |^{@S=0wCnHZ0RyHˆJ=蜚j@A6eֽzX{^z쁞=᧶@߿2wCv{7V‚{ȾCb1#ABtIȍcp\ӠL U0 Nṕsa.\Zϗ`f|)_#\?{_z_prt\PTӨ8lT`o{{*XIAzSWS^Ecq$OCaA~HkO@{a,daΤЛ)ӹeXI-6 ** sRUU ᠭz0GA|6ɧ vg>GS U+\ehoQ$GTa?[3 +S.oFb[8c5$%;g*։]:] YW4^d~cY\^;{1p?X?>GJ˧2??,ײ0װ!6g#lɯdlX1~V?dcgXEW6^ ab;ZXX&q1;FcSlxOEvxC6G|o</PzX@z"jdwV+{,rm{}rda/Imq6vXx2.:rԫ]:VpNޠuxo-:Upo:Swprv f1@DW`B;;z&gĚa[ *VZf`6[ X̎zv4a5; g'&`ڳs j;itmW}peD/*: G ܏J=u[=#GK*\TµYȞ'S:^؞)zI}.VS.z!V6!9 .tvda 2. ɮ0 ְktv-le;Fvv 2GH-be^K-e`[RhW3ЉL$V-z+ I)b6C1'4*> ?C?zjzBoYy#%wN~yw Tx$[m`ڛV~[@gS#~2K?P~ řqrTnGΤ>,$XVN@Gr]z7q1?8h $óЎ=] 8q_Bx5ȫPބ:ށu]8l\>Gp9na|/)%<ǾW(1{߰=^0V ptm7[[n| v%LvnE;(3̯QXOZ·R W~d4~ t92,Y6Gׯ HCҭ̫!yYң #~⊋7YH{6I /7~ 8:ߑ F%OT@vIĐ`*9\B[{`=Oy;Ľ.Ex\ǻ +λ9$ b$`&*IQ %K5p/$!fTtOg۵mdPOdqe: x_Hs`"E,x>ҸHHA|k{z ypR/W9t`o@;Q<v:g G,H,3PjP829d2sguJI|*chSjmAneZO Y>piʏQR҇B^T+I82a x4a3J46%XJ>`'$-oiyݪBnU mlJc1IBԎ* Z y鲅uZsC/Be&t)n&wx$Fm(EFAEC͇<x УU8j rBXQ#7\ 5Z6;w-}~6M#'m]s[yj&+^^ 뼇Y"i!iK—'vHq֐ݬK#V.&ќgevR?PgZ.?K4O` ~Vap(@<=mxF+] s 2lЕondTPIJTO|3g τ l8=a-Ep:嗠_~9+F~~~51\gtoo20Co,ch3ߩ70w, u7:!?0@̥(˝r=IQp܂_f&]bβg$?:e<~_h99aՇI˟U\y/|u qv3m p:J̲Y,a~i,7*Ic(bT4'nKb *:qXơbCݲ<,_1)fe[d C^f)hm<2KZ(78oB{EC4K>c'>E_?u 8 YOp͓_t2\H24Ҵ\ۘ Q&*فil#+cOOcG#ev;\$el6b<0 6C6v@4ڋ.&a ݑ=(ƋL.`EZNL[.yp(b (b0!p Y1 ^G‡b8|'Fb$E#Y1cX?186Dal +,"*Z1)jg̲Uu .> W۴k_JeS ai@Qq5MLN$TNJjgਈ9r{|ٸ'cbdݦxG&O n)0OAk>';N̂b6ts | a)'KQ`XNjIb'Ȼ9Oe!2HN܊ +U''IEO\lVKXadMI:f+t1S&G}v!4SDƚa"[X5,6ќX[!3:kM<8D LDkĦMiVnإuBZ=Pg*.3r՛hL2Q3Q&D+MDc514[1{)]GeWGMtN4I&:9Fc6hN1ѩ&:DMt F"B0gгLtαB-cUw q7A@ P,֡^YS0[5$\6*q*la8gt6\%|KlK2x[\+WkpU1qSb n`F+nbHq -nee6V)viv6[N\Śn^aE ;m>vmŽ.qG'Ń{M<ģkI<%ēX<Ǐb//e>UgWBDY׋7F?CKŻ|x_/緊nO~?,>O3/柊o[!\ ŏIt?^O*ob]%1^GLj#EDdQrJ qbę#$U*M&+nD(cxFexSvncS|)3bk]+t3m 󌜝o-QKc ]Қ.bRdoH> @̆/d sPdk+vq:h]]CRX*wкOgekkcԼDWh5wM@5P(C U,y$# G@GA)r4Lc`< ʱP/KQ*9pgJCo6xvȳ'zّMrOeNBc+s,,z |pH}ӦM3=5 إa3[΄XX"gA ,r> ^{X8c4c ͇P[9$ΦMzVΞm1~ ztW(8(x0O?P6[ӭ!#z$۶0̓!vHC=geewTjawJD]̫ xW.x 2K˥(u+!MId8!pQn#0]6<U(ktΓ'DBnr)O< gkE.~|L"~m(hq(w|IuN' I{3`$@8EmQyv(iQkϤ|ssIk E/*Bοny5iWwq}nmv#qUC3^@~q=jL =.x*I.l3&zDϹMcϛ腘)5Y/}el^DZ?faW-Su#LO7vWcg? sl['̅-/|y1NKa jL^gmpq"쀧 PodI&A-,S1ّV$dAyYXakQtO{f+f6y?^>n!dI{A>ʾǹO^)W>3||QFdك̇v>?/[;n~>F`T~͹wxy-콫za=O9T:s$ O 0/> ^qo0RY+glj'pR[FOZnQ+$U\}פp%?K5 `>/M+f?ƾq6Eup`_]:ɾǾ0k/Al' Kc9*?/xWP%H/4|q: oH\@'[R[@.gC~"Ww[S~Ǥ䏬M76Uf?[$z Xbl&Ks,.,va[I)KՎlgՑ:Vg~'X]Te |ᬗ3{}Y‚,Fx^90,a$ p:Q{/1806u.M'c7mߊ~1wzgen:=cH֐Ȯڰ{'oT,#Ôp,gde%)qL~Voe yV_n j+Y `h:ks\ŷޱvtßo=}fG9YyJ $u^,dA ೽6vxڝaCLOZO̸г anUmu5Xc: BU cqPn!5XYGC5Iƪ)pu kMۭך,Ags}9M^p &%9O"K!C̆$k.xyݚc`UbX`bkBgKA.a-BNj1&*LO* iˑ3,s}_o1bW$xqf쪜>VBjq80Z(ü*djZk68SHxi:9N_rJ҆LM;z=hrvl7;>K搬BapSʠY{wNdMV oXC%Vʊ~@9U2z灰>G^S[0tls$y0:X[xB8Ϻ.2xa^D׬+t,>im}\/DHMI>s0좗Tt}h%w@肆 yB8Be齒{N-vk!ӺY;`*v:%apmռ|4mEr_I=@/Naqb.tHQz2C=- ӅHQf (t>3 :±Rh6),L2dn\k>peBH[2 ˺n8k*{q~$!8zNGQ<F݅XO9'PCÉP_㷢Ȕ@D߆]~8˦u:ko?~=[ֿhz5sF~gCki; EZ?~i 5Hw#?@Zi!c'HOBZi57h3)3ȡr۾ƥNx=l\,oBO w!W_akt oEcL¿wܞ0g\i<},놿끿i<#j'?~Қ{᯷c94xk0I_!e579d.d^3?YBAllP fpsHshb=[ ˨.G@dzI|O{3l^~|8F#ZȻ`ZbmzGPK ?:% }JFlex/ErrorMessages.classy`ǿo7$B8RAQCPlfl؝%,Ò,!lo۶mmk[nKS]|Ъ;G_~ 5SC ԡ>AjƝ|0pC4ay2Q˙+C5V24V1ifX9R^(ụ53Gkl`bh|̬˜)N3<ϙ_0k|\A sBId~zQzTCnT"RX7^[K&SXېQkՖo?.NڎcU ';29ԐY;4f>'XIqva`,k1 s,_Yw ca M܀h6Nt"bT01Ŋ(};'BTBٖUx hjH_;7|Vy;GOqTΟPX=ֳ;i y "mL{^I&0-Rd^v^}+uNmn.om+훩&Ӝojޅu ;3ItV.6M-u4ܞ3k3?S6џZ'5GQ(pG:<-o)?_B'T/nFr~Co;}Rpd{ЯU_5OW6wnůZT+G֯"~| ~Xk}ÍLuA=F'Bw.?渇c)2+8VrXͱc-ǽ8slȱ>s< Cs<±c+ǣ88Or<43rxy8vrp8x-os.{s|!8>c/ǧq|Ǘ_.?wBW}dgoεS8o>O77gk R?:>^=He3 jjY.:ɦ^T: Q"x%7Kn{ .3\np*Նk kpÍ 3lx>d#[ >j1톏>aSO>c 7|p዆/l᫆n 7 2m;g1cO ~j_~i00NO: ё߶5PeV<e7w@|⇈*>H|a⇋?BHKŇ.>B|(G?F|ď?^NjO?IdS'ŃxH|xxX|xTWO'4j)3g*~+>[<->GFV<#>WN|x| śěOooϊ/?C|g-~牟/D /XK/\ +ůZků^oYg?-oo'~ G$gcV#1S胍оE)lE QEgb:Eʹ$.4܌jFWD~g/LEpүiKҦ3>9jjѨUQԩ٘Pc hPbj%f48]DڍVY <J+F[~%Ԃ ͛y3 Nf[HiZA._) t3馞ddQ1dU.j{$]+ZWJg墤G DSےƪ1]9}ϒW 304FpM+gm/qg 9|4Gm#t' Cw-k̯/CPK ?:$ġ:JFlex/HiLowEmitter.classuT;pEֲGICI ܝ+ NBĖ؎0?,'dTTTiefI 3TTTTTTTPa 4kw%Xa\GJRp+D/)k#3~#xcw98989qXx񞄯I~a= a]4 l!2mc8dt\ ]QӕpGi3[lk8#d-P$ ؒ6 LrjZ A*5'gL2C8 q #Ga1'jH0YێkibuM9EC>+*QŇ(0!&156vn5,R:kT&R(T LIRn&(2_OLS dS%$p -)B|p1!F>ёbQ U^B$5:G$#Zj_&O{f7t?ZɷY]tKnPL&DӭdKm\Iw]ŌUJ+׉b5{nF=NtWpA38|ylB4۵l6蠾my9#^!u)#V| =901z8̕j&=\Ůs n8.AIq~(Yyi==2 :֠ 5žVL| x;zN:}.)qKZVG=zV" oKK4L$i:E~TL'`v:Ni11xWϴ z饎1OYO''{Bݽ/Pԝ0G5L:&>sF%n n#&3); lkFLv1F1n4&kLcP[v?}TZWXOhm'=@(Eq:? z/PK ?:7WM JFlex/IntCharSet.classW{pTݻfcBB61M (ƘX "<"  ݰBT|** >$Vکv3GiǾuZ{&&s;=N>o{~ ŀ.$ Q^ "#CRe#-2 Bw[!eCwʐ2%t[#{e/~<e/ã~c2<= Ó")/Vh_qڢPܖL3DfS4>h,1S{xZsgtO~0o2{3T{ #աPpy,˴rvі3J:c s`퉛&ob7̎qʸ9Tߑȴ툦֛0jڄ_֭̚YN MJ(kV^3 EF:vU},/ݓ>31qQNg;m"W3n+zL4H[r?Klr4wFY{vRfVI#J%lM[[-(-[?eNLk-lҬ4Ldl `G^pn73! )="EtGWk-Lr}&EXT9]R>ksmћzx}r0kIȕ,,EqjΛP9glWGpX%X@;X)C'KBħt\k†P%6/^`Gwc#2mͷ ^rޝ2 `b²/km^ّC psDdyM>"RvN-#d2ӈBJRfrG:3G(ދfL3yزMonnr!a$Qސs\tEN*Xn2Fr<=g [3(NjZT$\'>㸾y2A%w WpKh[ɶ[\U5 xsE8UX6']&6U1u߄GT/˨%ylŸ-6Va2b:Y[ H8G~;EN\x9^J&(A QL )o{uk˳*;bc~l+WF-b13ZCգ6T74,ݚLC9L\keӝD|؉k摗Z":,d]ccU6rbÏeiDQiНFwD{` +%2gbQIDEܒtLg+d^EYjC౫%gb2Վ~v.|^t)TQ>/>F@ٜca!ȩaUi,C2>bJf"K̺Q zX$|\.@#(e^ u399,b H+е_I}'ЏY0\Pn ?o.^^`3k;vk1ն3)fܠ\NRC}^$%"-,>Z7TFȉϫ~5& P]X* lOK{OVvxj xuc͹\=OWQDFu|gJ{RzKiUقcEK!3'sos%o/KUPQ`BDШ]]j֨Z\¸AEpZ!uqZU3RcX`T+ZS ?W+KՎj|:ZT'Vku~56X4Qq ֈ 8<'VKӗIq7tsgzs}s}.$g?1Ln|ex3\ZK4as"Sm1T`$Q0_)44V rųԐkҖ|a5Vljao׈ d[ ɵ ~~6ļe'S'+"Ƿt~)[8 (\cMڏY>,7RSdهjn +.ѮSX8.lW%k{z >4JA .Tb me]Ⱥ^,9F[K[KPK ?:41JFlex/IntPair.classuQMo@};~)ﮝC*QTؤn*8qP ޸M%\QٵDؚ76CYXiX6(r&C0b`5 2Qjs1~=kxkhӎ]4E@N6$^;ւ]%zJxM^?D-Ʃ׌v7Kёs&DuNs"MoϗDȦZBu,Q`#avqأcKUp,Cq\Iݮ 9<EK.) ժSL  Zp/R/4e[X,։cvcŜ"/1LUrP꛸!ݯ(RE`4$eEl6J Ihu˿J'gBq[rS?A`F݌-2=aa9uWȐ;K}W#}xm aJCd\\kF1;WEZ PK ?:8o]JFlex/Interval.class}T]oW=׻fKb v 7! h!))a,Q7T@}SJR*~A2Ͻw93g8pT`3]I|—حkSu/Q6،U Z1QPlwN 1N0J|7-9[YΚ(ye2m#uxž48ѪX_c}Tsq)W~ȼA<& 5B{sEkbg̞ˁ mtG-{?Q9Bmʫe{aʎ#:V[G:?4Oriop̈́~ no-׊^D@o'yd]hFtD(b, +CF;j: ֮D!B%2u-Y@0FtҧKar4B(&i>h9Fk1DhUm'; ;f$˄u|B; Q!!dD)z1uDهHϠ* u,r_n ps˕?\|+\=Wz#>2 OWP@\Y0m?1U PHbi|O4LhN?M,AXOh Q!Q ~ #ѤLs M% 9mn9Vl9yr[`oH1uRuOћ$ަ>z#}XBls mvv/BEt= ;O©(1f]Ss98fI^*up pp+N6.E~kn2(g9M=~7V& e*>lP1! lPK ?:ȗz)JFlex/LexParse.class͚{WTW*QcFDĤii[s A, ؓ\+uqSazKnTUf̚c|y:qVY={*{K\<+B)JN-UbBNrmB/.7&ytI]HS^|U%UC\J\-v˅9ʅko^|cJ o jwkm]-:L(smi]sDI{__"v~d#Ͽw[{Ls=ik4u+>H9αVj{g{/6P]M2tڕ rMZ;>ln'u_(bÊFvwZvkWLG8&9 v!Pb+:NRrW*"X$?܀Cj k;`\-$ؕO= n*ɧZo{Ǒsm_;uhZ{[; us]׺L'{YQJF$95}i/inm(x(!!b@TĶuj5[u0EXfvЋAp Q(,V=XR?~HQG~-&7 IMo|$&7e^i.8999999p .3́.3n8pÁrZ uD#z^': ^Z4{f/eLi2M\˹YќCgEtYDgEtYD'I^b{سĞ%,g=KYbϒVU PU PU PU PU hE-o|["5NS4NS4f;lf;4NS4NS4NS4NS4NS@@@ZF7 Do z 7Gp}Gp}ܗ ~tSd]P,eAՂU T-ZB]P,e. uYB]mmmmmmmmmmmmmmmmmmmmmmmm_Yr+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+t+tkt3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t3t                        k!o~тЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂЂ$$$$$$$$$$$$$$$$$$$$$$$$|x\caaaaaaaaaaaaaaaaaaaaaaa @ 2 d0a @ 20È#:0È=x+G>j}#HG:>|ļ nG̻EnTclcٍynnn 1#1#1#1Ӿn)ަ4!hCІ A6m!hCІ A6m!hCІhsكrⳕ g">,Ⳉ">,³"<,³JW^@nqdƑGfqdw}8"㈌#28"㈌W$c$C3F1Tc$#1cPC=F1cЏC?~ j)_~w|P^@y] _@_@_@_P?Rr9π; vr'N8 p$I'N8 pO.'p9h \Nr 'N @8p 'N ۇm-?86#G4ql#G8p8q#G8p8q㪍O^}{AO7n p&@M5j PLW[.ᄌRY%M;EIShOQ%M1c )S4g )8SpL҄FxiFxiFxiFxiFxi$ݓWrk-(D%J.QrK\%(D%J.QrK\%(D%J.Qr4A޺I5mp7|]mTxԓrzC~E>HM4Ο9'p6)bqTN֫%eIk+BwI}N]{uD>O}r7>n9g'tI/kcS?83g?:ӒTkW[۾>u%G&Ïf^b|Z.\}=Cq^HafUBpP&eTOn1s>4_!LF7Nݛ[sE3$uNr o:ܜBT>/$BE\|._.*tEz/*KW(/K(ګ.R{+ث 8;V۔Oh!!V̨N*aTW xUFj[P\T=݂.&\)PW+~%׊7Y0zu>|eFW%\VHc]rۏswީ+ǒ;Oӧe/׌^FMBQ~XcvI&[F'D͊`^ %.Īжg/ 44㢶HJP(]^u%/ߡP$Egbð0FƔ4)K!*65%MN @+ѠإxAwqTg5&^W챂Ey1X'dO^2b'Is\3P44 yMp?QgnQ{[Qm,4^lڣȶ~fPK ?:]?$JFlex/LexScan$ZzFlexStreamInfo.class}Q]OA=Ӗٶ,, (~h4b:m&W&nL|k{"n2眹{gw~yla#U5ua6&Caᎅ INƛg곪zauy,PJ[NXE b'IE:߆k}*؋^r5+I{uhPl2CxSeW kG@v(}I[:zZ>E&a[*x GƏđV獠R+ QW28ڤ V.є^u/-j6F1fc6&ઍY٘gp86 _i*8t;ȯ$F9mzeZÓOeyPK ?:FY`JFlex/LexScan.class}y@WUD51&&JА($f3$6` }wT\h陞i훵{o;HuN{sW?.q).mWDJ< hCK~?8AdW}KQFODqI]y%*#W!q!qc(Sh?bRBORʈS[bJK OOI T"D~Mo:#P{oڕ:'ECi$&iv(-l͡;EkO.埕u_ʿ_OC]w{jCRR?D8Ps%UUŮvU"S<6uIԤ蔄 ),."8:-5#3!5󃄔Iw*?xӧ̙q "[ϽΛ7cat|ܼyR̈hySpC ۬sR&Mbff爞?g93<嘩>;;n&C;SDϜ:5ݩLŰo%ƒ1Bqb3: GϚe;[{IE^@|8&yόۥP>>P=k셳Fa3L:a\JBq89ud`HQhXyq7yCG[7gj\)z{YKs(ǽa˜9s/5u^;4K͞?ii3  gE'fCBSa'"EWIJXt5id깙 IpI&'&8m%ѽzNczV^E7H$l:o[*%95e Pry*<5sZL8FݝO;9I5m [7~efr 0HH_LĴaYNHLNK]Z3mIr u1ј2Q=Fr6L[ ~]!36.HNMY'󖥧}ҖJvP HLHIOOK61iN\1wEip鳙m&e%$PVI5xQ +2Ѽ(h%)HΈMLZJk'F𱧦eOM1{墔DnJ3.90V#-e~FEjqB /{1 ,ƶHĄ$`CSSVf$00C/1%- F._DK3bLJ]lBk%+S4L*)uު _'g$/JNI\EcgOM_a vw&E|8 TB'$|Q.y١BgٌUMg@],)[v~*a85QWEhN2.ry a3` T6*mI+SȯҖ,H/k$v$T%N5%"L$חR,xW[t&ꭟ@6΄E+ "wQfvU#i,-sYrMz. +y4c#c-_%tHZ=0.3M6dKA.dxX.FFI$&{-O*i9E$33Y)񼌔#eQr4j" x S^/I&(N`'վ #&J}Ud|CN.oR[r*im %]̤t* JxIB5lrC5+)UpT S(:Gx)?9'P;%9Mz`NYS~.82Aq!83P,(Xs"eATqyˀ6^I&KdRRdF=7KC !/y1EJg+ ˕ML72MV8j@Q?dt%QHޣ(+ȩT ^P7HO!NhGD~,A6x ڋuJq6BszT.m@I#D(x\ըoPV!S1D:*$Ti;dN/R9d-Sm}CuwC#9jxG=Kn+r(QU(dQ֓cEYg.e,ʪ[U(zCQV+Ѣ?9Sne(e_mjoQ__.EY{(~(~{j+= g=r.5 yzw~:[@rwW\=iv`_qۛ ׂ Җ` N=rQup<xA69n0k̺\[ la[i#f,\\V,]6]v,^^N,_._,`^`>,a~a,bA`!wkX{X{ sX{ Y{괱&/gYj9,kkmn浣uUt+_hWuYګd5C CMeCm,ACmܠ6j7׬W.<>-ĠhЇժ}t²<>o, ukuk.nP.P6b6AOfxvVv6vvNۅۍu{uuuuuuGuGuǰuDZu'u'ɠSXٺXٺXٺsXٺXպ XպjE,h%,f|cX̺X̺kX̺XXX[X:Uê`UbUaUR؜ 2W?==FU^ׯ~= 7M~3 p~ pw~ p ?p#(?p? p?p/[_^}jWp5\7p-[|[_p{n}!`! 6 kj:ڐ dž apl džaplvdža}#4 {fþ޺@m8Dц@m8D{Q "'k)p6 gozEp!7\ np@7+* _ tMp @7 wrCitCn B H7< tc ݘƵ@qPn\7ƍ 7P߸P7nԍx0l;z.޸7{z>޸7zaxx7ލu>0o< O,0o<Ӱwcn/ˀ1H7^׀pu x7(8rrc>Pn @(7>ʍp#tm| pZܴ7ein6i nڶΘcvܴ(7MNzv=@i/PnWhZ#d5Mua@tP7Muq@tP7Mu@tP7Mp ܔ.YJMS.nB^M׎y~Q7|M t뮷6oM7݅{>Po*1@1PokzZ޼7gcz޼7o[zV޼ 7o?eDw2yo w݀y/o@ o>Л#(@o>O@Pn> @Pn>srE| (7_͹@ Pn @&Pnpo;96|h66?f#hd͖5 y:@ڒ H[66l-Mfڲl-ۀkvڲaG|j|[vߖ=e/m|[֖ `m9X[֖`m9X[N֖ TX)r-oyrߖm |[ror \&m|[nߖ;%ߖmOs/-oC<՚[u5oFۺ n&-@u+md[w֝u@m P[ֽu@mP[C0l=0[c8l=0[O l= 0[la%`ؚ [֫[l4[o֛@l 4[fk&ւTwk=z(=mcthmkСm-m[l۲mz`۶ضmmkڶmg@:۶m'nEupܶmpAvmGpQv m'n; ඳn;.උn rpv]mp v mwp[`mm.`mX7S{|߶G1PmkjZھg @}#mD7-@}+mD۷4Ҿ|ܱSw=}/oT@ qm?nG i? O pn?;y~aaG{o/de.oۯ>0μ:oo[6o}{>o/0zZ'P sA~lLWS*d_pl\+FmZ_!=2CԡCA}Ӳo`j!?"))#*AyW)ԑn rk2Rnd^2RNH˻8ed)Mz')2:rbZQb`tmS޶{-[fwpwewe|o &u dm2ls#79O/?pϓG`0/>qU>WT~||ӈ4g6O;o\茢N9/BELL@1OQ^5@/ҫ~?+6ȀhD`L=SH=S!rvk^CaLKᶔ!-Hb$Y~))R\4?2L\+נo*]u)T'=_yga(8?4q9#7"( >}#9^ѫ0t}/^opHوb[Dj]6 )^KR_FI>LCn.Xڥ}x3}bo;]a,1en~gb{4]FcV'.o Z|PŇI< UGd1S4? SiCrCZqY|[`DGBypӉ4\vng(oSqS yrU>&\HA#Ks`?SR4y f85bo4=x+*^^l Ή7JnpA '(xyƒ2Ȝ̟/-Tuu~F<o HKMo)Ix l/^/$0G<~EdcY=ΜszxElS=eX64 l c,۬|ϥ:m1m ,%,8 J}yw^D< ʖ Gd _S+8"(V?݁ɲYe#I&L6e>!zaىDqƲaٙJYYv΍CN gܓkXLGlSvAHb.ʲKS6& ,Li2//-TI r^AwR05w-Yvu\-Į!nqr[wE=G;=/ dK~`[h.4Btٽ^L[uzY!}WVi1yklgeF-+19?VL>i~pzQXJ1qO=<'5>/_xu=^˳{|X>7cV10l@|S`D( C:WwFXo,ۿߙtG l.GO|w|[|_a1;=>""~zV~r@!9<D7~hQY~L' Js#+;'OS,?C_<@MȲs]3"\Wu*~fK>s1/?O uv*^^eT٦ [/wCK UfA)[*dy,W_W뛒/ZSK}ʕ_ T$E^sgBE!-k![nҧfG[~?/ӑZ1vM?,/`wޣ?J,+^]L}Z$h%~eya*e==aϣ};9 <6=|ډ֊5zJ=Um"[_Fx$ QTlDSN4עRL&[Vl1ePgtD=vu=+6_OYŘ@*Yҷ؊TQ>E)bw=NW%|RH>Z1eg5T5zP23VqHV5P$# QTq''ZqG98Z| 2'HZVzZafTIۤ4tLDV!3]5YZLxyƒ#sH>_87ɩK>³ݼ.-dE/~K-+.[c+reP_N9R/B^QqEVWlsU5\᪞ W}T)"_y)/p:=Yok.ҧ :O^:*\V7!ȊHV4X.<9U2В+"/S| {xKsϪ*{$r? eP$>݇*";`aD[V<15T𰳆z2^ЏQ9Wy@Vòsb = &ҫH/!UّmLӁm3_E!)EO,,;6xg@r2(+◲²WUq];~ D:"gË6bo /[Vᕺc,qtԝ*Q(u Fb[C~^I2|C,zr_juVRuWR5qU5WK^Kc^;O=tIr G}L!K#$cP=;hU5e80OEVЪʪu,J"TeWJRjdZ)Ne7IZq6(ȏFH:6vӅzI/Yx`]*@vHЀW T^*0Ň"+iU[e6Pȁ"AʪwWǹx<͔O4ԒGq !"Ajgohڪ]Էj B/Yx`*S_ IZwfI/YxPLjwe՞|v+jlIUzRe/vhiXV]vUN7TK]37c;gG̫'5sr6veʞSBj}sZuMMRn$ף t 5ZVݶuiz|5/wͲ#ȴ;e}UiXU]̊jɬ`<ɣ-i7GuȼFUe|urgSξ'xUz UatZBvAa}o0P0q)MnuTŁʑ-|o/>e41(oo~hTv+YGNQZ%אXZYN9!Tg'u`Bv'ڰvIa\3By:pCCz^ߡ[#-Tu_(vNU{ꍲzj8j褐z3˕-z+R  ӮJH٨zKDV[Vo15۸Tװm|~*@b9qToףmu/p0N]g> ȪCaHùIµlql ;ȘQSV26g; 8i]gEQzkvjuV_V'9 ]V@|f r^P`P>&e=34^k}=Vj{]$͛eAOp%wY}~Ν (R}TWEv#G5oZ}<JP]ñPpGZ}HNo+_U+UW{Y'FQ}WK'N0x'N`O;'$pnF!L1Np(W@LR-s/jƭYyNl3l#}6X9KU9-KYhamHjZLI\w&.h'^љ>}Szd=4cm4MV߷ui֛t8{ Z]{d?c4~H )2`RеTdC3kȚJZ ΍ԋ5k"jjJfyYǕu5$UGZƉDt]ҔdM6'v̀.P,hPN/eYeif'kv$YMtRIr"QtOQLjO(DlJhO{lr"ɋS/;r229?Ye ;C3hoNWssjJ8[|fO U΅DHR5ZXv=yyv#%ҋ9EȂidMbDkNyxTqɛd^}JYFz6DWs)Gk15矃m.KC{>?2IeWeN*sToIuq/"G=CJZ5 @j.u{?2(Ie]V&55 NjM.nb(Mfr )|2b/_s9;y7s~wJ&ƕ.5䰠֜0h5}68Asn`'/y6F=<͛ɽ//ۨ|<#{Q^_?}GMM[ 6wA/8j?|Cw#v#V&5{h؈ݼو^)i,*{O,<]}޽5Gt$]5ԝȓT)2Ӑҩ{T ^qJQy~\^$Lc8\QwZ)E5~#FI蒥s0ڤW6hR3 1cia$F>"v%z(uXDB ӍF`C RWqӟك ԋ@5ЈӌpHiꪉ3K9sjNEԔ udJ{)y#g^~o7?Iq$s_ ȿ=j/"!jG-oK_ GYQ>R(ytR5CNx9[_4Я2z|ȇD>" 5п.ԌU=r|#fR 4C=0i:\}#PgeGΒ3ux]0G\H=__zd9Z&{+DyG-'FP?##sX:%ã>/K]?jcW#=H52ʣVxԱjaVE_JY_XL6sr]Q_PR  c WLC}rѣ m/ =+#rt"WH5 NR'{u7<ԚI D{2ߣN!j1q?kرBE}֐P߮Bƶ^LϤ'eLOͰn$#}O #ߤWڽEֻ̤4~W@bq?_TRM"o"jH ʯH'*Z3Hx:yfP7d;5V}#h,G\~~"٣.T ")ǽaܰyydv)ɩI0,1-e1cwnj(hA]Mb|ax!e`N#[a[ц9l m (o05cosbFi+EԤoW &-{k+R̢`&d0RGv9Q+*BHP޲TEN;dw8&C4n2B>h5\r+g zFA ! 9Hi}D jdc8:6Ed4P"O/JOx/pz ]QDЗ#?@¦ '2"Ax-ZjY ǩ&4i(a4H%DpL5ר]CvZYMiM1"HZۏiMd)iihu*>߹84Ħ#> cBC{+ &¼7V\>.#(k0yf_"/eC=F`L =Em6"#LaYz/J /w]^1JzZ~<J1d0HsE5Sbl341N3vSp_CiA:PApBI S*m̊,Uwg]/\ῡgv.n1kgrx~Cʃخ6:a9JPV+ V}4L $iJhidd5h`( БĹhiUc-;jLTAcYD?~n7ٍG_}:,Ԅ}Ip[ON2 Fw )+}1,3-mXJB$zN.~ї88yp< tkV"`x{􄗚g-2(.~ӧY87c(3NׁxIPؽjLc9V$g$qڿw\0sgN;W3~~̅g]0 ~ 9Ċq1͎6*,;o;s?\aB͋3+6n*;:Ϩ gFO3'A Ba1OƺYLJ$/t$D8ui3$rٽ[^: NǴp^ƻR2Q׽<᫤neLX,`7W] |h?2 |ĐT~a?/{q_dbdܗe=2_ܸ4¸ iW7[ʸ6?4?2?6qq2kZNf}q 7}zc-rnz/ Iuy5{P#TaI\﩯Fףnƽ&4fxvpV*>< {4@)'jQ11hpD1*jp*s#lMFmE؎o9evŴdpg$Eſ@;w1Q^g@@y6[g'[.'8bh $NWQpFyAswAN~)l+BF]GNE9/^N f|V̆( !2XCbFo%hCD 5G>Va3L^2@D2i뤽@<嫼bpoSyoCB*@ !iB3N R'"l%gD\{E=uR<[I1a'E_ܜ'E([58B)7a/edw 3$a+%p'p21V.Uh[m~.>B|a3d_.<\窼 u(&?4 _bnB`-7>4G ٗfFmqb$tk_[VaC;tN8PpʅsT98pEG1b1|1x~C|o [ńe, Lg0a7!lh@;aGh;&vL2 !WA.@ RQ(-O<U( e/vڎ`;#nΉ vEl?X֡u"uxh߃1 F؅Ee2*qy, yXZڐ>NgdN:D4?[.B;}Fux'S]nw #BxC{xޛMBixp:ĻY#F!F B:.^両@xN9F (yF|Z{Bpb鮂Gw̨B(2 gq3t>haT'}xc!^O;WqkuqȵO7o[}( 8.=asqGavb-J % RtU.+taq{ŀ< LpΧhu">G犁ys }NUzc%AB1w{Rj ~G/H+~GȢ~\ysyw|z//ٓū/TWb=E̶/Sb{e%{-IVMߘ1+7y$_|P$•ٶ;#2dd'?!q|hR'ԛ C8 a5؍kp:e/ß6i]&1Ǿ"ٷZ&hL*L/k}؇ M2|yϾײ框O̕m /JnJ$ (Aup e!pKb"$]ۯZ&o~ϵO펟smo_sNFrs)7})) ,AOd"j/4/ oiU6 7NatV}X1ɥNtӊF8aKo.RpqMc;z<,Ҹ;a[أ%KFc"܇ۇPT0|j=E}a}=g';$ֈ+8`b9iL="+EG0]l ּwuy("AmM 6Ӻn8#I2,8iv8G;J/FD<]א =W[7"Oq͚hCgp)i_ *#`_yz[PoQDS򚧫6qM%#|Sט2w X$[ ?['Gk?cA*app'|>c>s%2՟nB=v|q"$Q7c\TÅpa9{~+.3Qԗ kdƞk.@Ǻ: (G8{- Q x;Ac*dơ>~No 2x7 NxeN qꎣ}+7 &!FCsR؈=OAiu Qw!¸A;|?.`C~Ko1?G!_=\ԭD-c!@ v@m1g t= [p@&A u?4LلS9@y<w .z}hWXZ/3./Dmæl} Yuo!9h^M;tO ob\إ; ~} ktY\Wq\؆޷a6m0)lm73E?c,ʙ>bIX\ξV|؊u`\mS\>pb휀+̙k;#'Rp\ l. }]Jƅuwa\op]\poN W:.8ܰMs#\ո`>x:xF\؇ z0GO 5`0|({?s /`Opa sE{-\p!?8`[/sx!-!!\ ~ O`߅'Bsw( 6N_Gz7TodT* PgX/N􏎈 ŏ,vK>}5g61 =b]&Yj秦a+b޲!lrؔ#M 3f'&*nP{ɹc9QtШP٢B# 0l[~#qvQ@BMuThV/veksBm1xo/@`o l4w-ӾRe  I`vGA7<ǨQ==<*wPgo<٤au\55?{q "=on1.]y Pʵ?*4BF>sk:+c\_Gs\|qL?PnXGc kyqvYwʼnJ: fGiLn:w4??%?0DZA 51pxy9|( r7{+ }1vuެer/:w0ۯD>gx?xt;)^8sg+,.g lxc Boéll!!hWR@W0QkYeيB\m۵(kslG Wj赂-'mu%DЫ?Tȶ LQ,ش,H]BqM)DR$ jE![:Y_PEHð'aAKiN)#g'=f/ 1OۀM(#}n# D$zy2,LL2,xرcS MpWXi@9?OYV!񯊖cVO$c"90=E|mCTh_]Gzzq^m-QM5r9Q}@66ʚ;o_r4A\^Q5r,U}I}IJ"<b@(-4U?("1Ag1"H@)UDD#(( {KBZkOOΝ;{wwvݙgQ<ͯ1h(Iq. ]jAh"t.R ,0wa/+pl^ý3(.Pv߸A _p~E%=Lj̈́K* &'@×gac0J0 R d`SA&^ `sa^ S `L,l^U=` vJ`gX]`vM [fsa7[D$󄅷Hþ"8@;DG=px9x(a"*!b'6(!qG$#8N4qLe8I'e{,6&t9q/{H>X-'9|Ib,\J\(rȏ =D(_9X.U{nxׄOq^1|z>ž!F] -xnqg _\܋ p?c%-xB)MQgA Q&ݩ[=4L5TiL\zHBU85ƫ1UH fѓj.=j T>j/= 04[U\ e#WѫFzhK >TbEF>-6Rc(-3Q8UO[tZi+ڮw9 x6i;yӕ7:&'7;ü۝GytnYҙ{ω9oQgT1]>F>lSv>3>9?;'#W9tJrM: 4nCeW+mlr幷znV*cU;U]F}MeoTe+Twݨv?V5n**Th.Vtu}4C}Gu~:F7уq-zN@,빪wk֪y]`o7R=z0oFx>Uzď TH $VJ vY-FTXD!o| [b•|%R4C"znjDqXSlGz+Qm=5Ɗ@ϛ)٧4q\ch{ķc&_G2N9uGedĒ-߉f5W,Ni,NT?R.WqHє2-7Y_d2؟V 28xbHīk[R8T#o6AhNB pzdh֪rp TamAzs"d⌟ a-⟂>:ƕ;Ƥ:\X3KWG.kƎ%ƴSo5/Q֯%ly_ Nw5uurс*d5 f׉z]2ns|ua?V]aF('->EtXZv9X7vZ=@e[U{@:3<<-C`'/@Zm kzֳ /`};aڦiHB@)FUY *D 兢")7/)*s"%Tp) C"P x J K ʕq"y;lN S$ar _PK ?:{!JFlex/LexicalStates.classuT[OAve(rQB[,"HA \ʤ,n%7|? D?xfw)af.l adPP1!ю'2*L 7EBNB32fe1D-[Yl֍fڶs q,5K _:/ڕH0k5qZ7u{!L3HtۼA0 JQ3ֵ.bRwu~SKOZQݴxfJV ,enr/TU6)MSYۮeT *jzd׽JU+&A$0vKeR6߉aA=d=`l*:pyZ*:ѥ%^1_&n yboT,!b+Ȑ\`.{RFZ4Pܔ\J?S d2 )v,M?bB0)}T[gSh0ď:Z`b*R239BgBcSB HfiA+Fd Fu)p3%.7 :bGHo@ٔ>B9C˪Cwd ]*0EJ9ҘF 3_3q9Ү@jX :& w7?QaQr H{c:1!6{;_"V=2\ +u6@\G[3~+uFPK ?:}?JFlex/MacroException.classmJ@Ӧh;AVl.+݈]HtaiH2\3iP\0o=LhJ|B")L"IOEL_ Ae5һA\.D ( z'XS,v~J ]JU2TW} 3 8qVpb@fyE;GU`XS[ .%Үa[D_L 67F᪐aa- rzDzzX뭳[pbhʠab[aQ!묀kP٘bpg8n*8rIyE'-9  Yi kш*51 ]NY>03zDCZ|S)u$#9AwlgXSqN ۩3d-Ի0B쌌ILڔ*,Qy4x/ãW 2^>x^؏וҨqdF5X- 2BhqSŇ7JQS-FeǛiJdw8w23˸6ӣsڀي 2UꦯTL_ku Pq ,=%wmW"Ih;U Ok kJY(5VS:EvRs)P- 2j5T]Q-a p;J$~| mG%T^ZSߺa{`{וn5i)|vCq{e@V-ݢmܼξ\iyQsej-`,3jDr96+_г;D d0q.p" 7ل=XAO{Qk Lz.E :hit$R'cyTH[p'm>_hYsKl8 bS?_h jA"k#"ș - 07\K@&E$dxF13 O"[xҴY(qph+̬)Jyϩ0O "fQرLڝA6 XnH?Fr73$V[F& Ǧб;9E* ,2Y4|iy\FQ*~tگ7*t$)yj0z|9FU9R']m*#V \HV4o.,|j_d `մ?q%-^_Y̥a9)5&1RJg16v;J~mh( &px|_a_zqy^YIޖڽ:cI,¼|8qLfj ؈1lit T;qC^|}@D ~o Fj[p.FJ}lB+(q+N7c3]|''zYj 42 BdPK ?:fn(JFlex/Main.class}W |Tdp@yB QAԈh$ nd%y03oPV;VV%j2nuiUJ]VjvQl{9s=}#(>NOxW{^~ >X(_|E)>WyQS7ap~ /E?e ?|-z1d7^fDO.XDn/&R1o"O aPW֒WӼrJceQ,`O4N"s$B%8*`/{i ^NbB3eþ ͒lT*4GتEv4K~R0#*-Bd"*"QPt8\#TUHTRJ B9JUjyTZPQݬRJ*P/JTjKWZ5X֪tLWNT$:TJAwcD!w #RJJTZ/b*ETS)*%UTJQUڤRJUJtXv-<]3Uh;)tB*tAh$f,J5 l T6+aF%4MZ:Nb3jZKEsVKc!Ǝi2FK*i$aCł@”uz$AkZ66U7(PX̰gcn0ơ?m%f5RPvR J3[j*ٸ1U}Ĵ,#IL[0e; NL s45ev5X>yG9%Fi-ėxʒsʆV Hhs[6ZI:˟$eOQ-pԉ̭UɴD\[,K$< wn͎)pF ".K4)]e3}waH\+R6t%a }WI.h+]u]O7ryэr4F:TWQsUvK!۶ktU8bF %ƫ{4A݋5 xW)t ;siv;r!P[abΑLo=#Q0znk8 {R{J4h)Я5zF.jΑ:Jk(sU=0<5zAk8'!~ыK?B&{Y"yz#bV CG7;b:>M&*s:cICTeF4õߐ2 KD&P*ۣ|٩F{pv~{p\aPݣMqhWLeuXDL4zClax ^eMjs[Nd'ɦj~:,ۜi}]A_s*}]vE#a9NCE9x:sԻDeپEn ~'B]z*i&Nh Ͱb % K]TrZ=bX= ]\w ę V/E07:c̈-־ɆzT9[`CLÁ^JIӖk37ۑXf"hn֥:9.Ӂ^{s7Yފ'b #d%%6zeƱ,an$Rw^~$X>LZf0)e4nXǗj'' :|U}n.magā:͜Jh=j =蝮eF5/)&)~p6$RN>FO"uU[߅a-NN*f%.7gn ںƖ7 Aэm|+͙iFVu=Ⱦ 8 :.&טVn/_ղuMKږc&JWT)L ǘBF_qG6gjVCKٯY7o_؎;pB% axxߜ aL58Dq h"c#g0^ct>g[el op h MZM5sPO4!eMޚ!(3m!bLk<B9h{ÄDŽƤ~TlE&3uJ?4tا3Ii;Y]i̙ʆs1o^ /2LS0M~T[3_ m3sB~Oqfĉ!,Z[UPqPZ`G!"y=>X59b X"4UpdK~ <:z(&b,Az-!㋨p=~r{˜#/8EXR,d"A15,0γ#5ƥ8zш8#f܌);І a5c;8o$)}MCs@F"N@됤(Rt 6Dgc3]SRFW*>ӽ8O~=iç?^.p1}K җp9}+\EUk=y |D26=y ^Ha+0as5٣<{=8ȧ2=γ/ }=x$l ۙ :E[d>.P)[ӕ'v=}t`dT\93N0&|I4BA<,Ʌ 9MS0?OqS`Ně%O\+I*S4ry<מhD+2q*%:]7h+ޤmx6=w Ko=z .|H_#⏹|ᯮ Ukp-W&ӵ_I߸[Wu*\Rr*vEnp=RjSܮSq~˧*Ug?^Ce?u%ocśy.NOسK\&g8Mp\-' *SplpcVQ6|7bd b ^c^Q9*hqQII8*pMb4 sYAӰtG$D3`LDi_o>QɽaTPc Ҹ1nSp w4~.OP:[9zo[͍TC0th!Ⱦ>Ք 1siRK+Q.ljǐ}kZv#ت*j7{%iWRkF9u}BŞa5_Vw.~p'8pod'ϫ-yq(ѕjq)nxPD͎)c?|+Ŏ>MݏQJ% 쎦1wy bD,+J_H=]?N"%gB*x ݹ'7 qyE!R@+洬`Vm-8g/ k&Sft:l]Ca4iEh $%RJl)~(2j4hQv3gxf<Վzq:fT|thM#Z7*֔(: z@;z/hsy+czi`r,VFg3:Q:oX. @-TMnjU?;ҏ*h/[~D]Wp$n)C? "';<*ڍ@+ֹ4  xt&R{! ¥̯Xׂfs9լ;M&Z*FZa[WAhnEa&=76az2jrHPLrWWH6A/X :sg&!{7AZגJ)J>`sblZ$ĪC)]^v%{a6o o xq|z`svL ў$pӿ:^NΎK1YY.cF{n;2:p(NR,57̀}Nʽd↸#> [KB,oYF ֱ`riDlȱsqϨLP`#x%H)}Z䩝شu(Ћ%]_V[S49elc%q[K(c&ĥn))>SB3h_h_s/ "{H?TzdӴ4~B5ẒTm}TZ)q&l‘fQ L$\ b`d-PqNkcizi w o˯}gŶTGy^7(TQJYL53]~k9hlq;,**5Osu?q/ >c3 <0C[ӛ-0@FCKHU3gA` ; 0+tY0pP~RQCG2E\OtnU-_yHM@CK=5?z;TfްNJz1> L)j-% G VHf^DoXIIb0< 2J;P0JFlex/NFA.classz |T{geI`! F@$`("VA@$C2$ { ZEŦUA(.`mu]jjmmjk=wdOܳngx?!JMAz7ʣIx}I- y!ø+H>)^.WH 竲jFVZt_'AZ7&fEUq[.-n}w$K{||w=>7{ ;dd>aN?/??(/H ?|S~!??Gp<<#|D ??)=%cOˬ'xFGqLgS?Z x5Rr#OZ>5J 6q>UIF7ǘr֬^P:iY2-%g0bmMF*ZLjj&o.$shiߤ1qU-I& /֖\ִy7Eqt tv[ܺh[ U4FvE[Zb P蓱DaֶRc6xch2,+ԚaW.fsf0֔cM-MvaUՄQ M-McuD|;f Te9'T!UOO#(!۲AxkI&5aNiBF aZjm @wf֯Z#6[ZM"WhF{B]gHo8 :'-0%МAsړM͓Ҋ kji%yNc,Z_o%3z荨{&ķ>e֜>Zhk)M#&c=xs}u!و1d{qL2fUF=1N*漴'-T/=~ltTS-UV -UB"u l%3ya+c-6b] a7*a n +/hoҭ 5V`j<@Dw,xOQ/3-VJKVs嘤 a[HyORgCLl77tbV7u֢WUKEN^Y'X"s, )Q0^1 P*C'uMZ Jf@X@3,,"PuarK]!j+U9>RWk,u-/$lAm-EiaL=ԍcN%kDl3Ө޺-SH8 %n4s9fu?I4,G>sئXF^v$Jgeb0dR[{fй.-O_?=@L¨0Ez~}B"& 2E9.ll1-S[ߎRo_f.=pNR~Sbq661@'t!aXz£07c.Cm_چOlR6 {z?.(xz~A_ĒNERjT9o9sIv.=7m "qUZS]5oHȣ%$WixؠWkk⥦Zk4N^r7s]Nh`eUu+V-=М7з+]@ gcrWK}XՌVL=VgJ iO!oU.]-t ,1(cnQ@u4>vjjsX?!T7o[\=NDB?KHQ*7+~yy?Q7#F٤ߨ J ȍVO,םdNH6AR܃dDe$38yW޾=f@$/ O<#8h4 p[M!ZH#F"/$ ZJl^s0S̺%*MZ_"䖄Y4 Ek;iP HD zHęrFR*FBN'8M Z:TDuTF@NF44mB\«\«:nB %J`&Vxŭɘ-{ D}6͚˞6l"a+9Sf,cv>ZCR4)7?/Ewt}` 4!h[I3g6J&Jv´*Bh;4t!5S1{ wA4[ apiB;03}` ˷FDBwT[ Rt|M#4i7 D`1N.: ;!ELg2BH@Z竣'μ G4#妀ȻNӛM2cErOzR7r Ki붹\C;kYb D ~=U Mѝ&2gpWF j˂PPkjBAVG S4F.BtZb}@7X<ҿ d\p=nt Pq+`Q;Хt]M{u/Oߥu@U߇uGCz>`R<:y=SQ>q#JO1og:ʷ`Avj.C .# Fv8 Jh'S.j`Z҃@gbl|kFy|!}A_Jnl;{MƂI졓GsO8@9H[x]2DW`WҕX+j;6c/aG`(6?h g!It&N{r7넣0#vF@Ot#_ QMn>nCL8Ws/2%'rKJ";M_AÝY2 ڈP c& ΥG1E87JHKgЂ il$E:eweNӌ̎a6Ḧ́7, yHדQ0L4O'Mz>%%B 1 Mz[Ӓ-+Ev!)>472Hv}Se4Qif0,P0G(vi| @HqMGiM _|% ;xV,z /e+lΫϦ|MuP|-t:h7JCtBR_ GjnpO+:3sU /Bc.2Xo,Mњ:W%tRe⋠KxJZ1#q~.`J' $U\.p8TS\tڅEGil/L -ؚs4wH &q#od[?%n kњ8%IghS13W(G'|βL|7ĵr^:SsNWr ^,|:A`EPuT]Қuu8q0y l9Eøư~q8֧ZWdkaӯjF 8N B%c 1;L>ՇiӮZWI]$qLҿNeQpP6e_CghK}Eaa:ak6_4[})E-vj#W(m&ц<+u`8 UB|?"C|ֺr(le"M- Io, vtPr6ȽL~N# /R)Wدi1jw~ t9x]эn+Sz?G=W^UNw/Y85'a+ʹm.E9:~q(ՔlKŻipΉVg%:y~/ɨ]D1 BfqJ!>t%|fNe ]HUj7HnA\C~3h!h E9j6)4ZJN*\RXͧ3UMO}L-ߨԥfG-s瓹o;4/1%pgţyhg,Gw`I'w._UIWtҕ Rt554d~f!a_ǎ%ѵKu VhZMyjΦƫshu` y64O9:Ν:4ДMc 0-rpDCȍG\Tc. ٯ.AbKxOU\vr-fSiv+ˤt.H zD6]Ԍr$m1:&jzR.#EZnOe;KtNQ8 y" ^݁BL_0Bw^ELu=ehpMS7S~{2s@_"a_w\p> (m{h3X]/D y/ʹ%g~_k ミ.Ev˽|b{[- g9CGiϪ|뤻3*E4!u;yԝ]R{(_ME:Y Zuթ@Nڡ~{PRZ`'#щBopEw+x|šk* b^Em#/=/Ca'RzCx{D#T!8Knw 8%pC`+xNJ䢭vdݒnI& bvai$)I1æ$1I^ylgBQoF tr,@^]" 4<ֆy 2]e>D+GD@ onL{j˂֖eE"E#2+d4Ž!Kn;,Q|gwg;+]^Ȫ-}"u&lu ,2a}[}L|( ;F V:b4JYu~Ecկ~C:II[Tp>Pz2 +]>ktӃLO~jiOF}l ύe c1s0=刑SQ|Q^jF!o0&p Ѿ s2&$q"0agSkZgA: zک3pSx-Wi SQڣ%t?ܽ ?oOYPC:{{unœCٽe7O9|=- F:}ƇNM"r}mv좠4i}y_I?={ Ri^.{LțD!/ա=xYG1{TҕLTI!̍<):^ʸsUɨ!\~>3XHӌg,jc1-7cEWPc4Е-eZ0QGz:llgD 5yTzUhfCh 4JW*_p_p~˃,.E4Fɿs;ħ@oI|wyQen+V?w9M7E0:]^:~Ի}y0EI}N=_d3_.7QM iOKijʸ+(f\M5]n\GW7-tq=dN;Yc|ƽnUTC;@F>uȇn ^,B Yw):.#>Qhj¹{YV./tmLkw?*xkZ:xoPCw:m-eS:?JkZ5%:h"!-Rt_^"+dkBVesP; ڝ$GƊ3ۦ l?J 2RfNJa N|?";C݌ccGҍ#eoc\A)>=;kw ڢ([چBчiOvi\â\ooPK ?:&u7JFlex/Options.class}TSUB-PJ5-}* Rima\B7 CПPFfw(lքs͸:Xh%,FSP'쾏 #(>XtIOut`Ax(຀) @A`S-mq]ej:hVDùcWM"g\rYL ʛ\ Ӊ+YOvT4B2㹖]",âYQp>qҢ\јrUfUj\f[A DgSbAD>, |Q7̃ e`vNGnl(fv] WcV%f;^̌=lC5/[䬲kRaz7 l`O9ZWXUVcqΓ7pM $ -wK?K$YrOl仔ݢ+6ӪJrYlVS5DCw5ZЫEI8VeK۬j6N%O _ wq$NA_㇠˄q*]鵀^(ӑ[;>68F.I w9N &FM_o|\OohwSs@sH#4U- o:)Ay4ƔR`-5l}_pv@~uI7Jq/tFlqDXܯAY/hx%b^LЬzA4nGzCsq}rOիy!>%QڒG.QA/߄>T٧`óG7.+}}s~Qoǖa՚&>mPK ?: Itx ^JFlex/Out.classX tTn2p[!7y܅##؃w|']ONvq S)or,xrx,  Ӱ`h2|Egl׵Zlw<,ns[mc z$_U߰^dJ M:HXJ42Mlɶa ,+p38?BIWaDږA OgSɥP=3X;sڶ(doe6#z`kn$) TsB򪬷8Nf<)"qRnkcYMpAv&$GI9--T;vQ;DyBrP2Yl'r{ѰkV^*CRb fe[iGʾ0'GC̊'fY:q{` {-hFs)P^oK7(a*VL(™Q5D XgMxx;e;V& fy'kTUC>S| %d褢f0)j8On ,7MFmMiHR'-7Ead]RsNYA/h/=/\]C7KI횂X{CqeD9vl7IwxI߼ұⶾBXHZ|T&ɹ(\';=JAK6q-՛Skc@m|#Ќ=(Bq1@;N\c b?BkD^N+#1XY r :|H^)]wh . 聍]JZ?)WcN&S@؆m Πw/n2-.bo ˈki B􏶙hIYbAL "q ;+xF爭4ݍ\b/v\c¬ /DίK=pNi 'wT0(( R"r .>j{zINu:Es{PvG}n|T v渀ǐOVօ!]څa0DnD:6{k}H~(a1 ;̱J czlKGor`y=.y{ǐ\(d4z,ry]"]wE o# bzF߀1>eeth)BxQ4 NޠGdVx;ߦEяRHc.jKɵ+PPI#CB9s98$.ڤXUx@"hJ}ԗ -BB1ݨQ]ٍ)zu7]6P^a).P!\Jp2pZ5׫(nUeC M/?/ab\{no"vߊ)jye>іfJЀ^^7Hj7UO_U:mO3 TU*?SDNn@~rяt4T]AoOq%t#\ujZFGR_s)V {?j߅9cZ$ԫ,U,,5,YNe!BXBXQ!\w/GPƚ9;D}dhIM)GxJTit"Ըۿ#y՜pPivD(S.*To,sY8N8~Fax^}{(nDډCnuVm: 9̡}=n f}U{F@4vƸJzXnʗ@rPfQ>%9ABD/( 0rPN, ʉBYDiJcePRb'M.Rwb n{p/;tx^݋}*XOMPp;2/\enⳚ.{5,ZYcLoPf >r(1uIԨpz33gYyL![ ~zۊا闽+T<[˃3u֭PK ?:{ JFlex/PackEmitter.classV[sSUN&ᴤ^ !R+ -m- pғX@xaE_8Zg@::>3#|~{4 Rd[{?_@bKPA1R pG5⨏+O80u1 ^TPC8F\X2ŞUPqREBń KER*%"bʇUN{qʋ ܖ>a(tЧniśwuVWt*&LH%'4g,n48)&I[A=1 ~EɌ6ؘ&'6NX}4YxLk԰x̳ǴL!5$hrVvPOfbH# H2')m =ad걓mmK%1Gʰv9!T;i|Lb)6B,mBc'B:r4!kE94=hpDRDˆ뉽xfmƌm&Lul\O12DCF6ep:*rإh؊:1hG 7!Q2&m #Jً5 p g͋sa / K gZO kT:ηJk'ꓬpmu%9v⮹zI@y6.;"|r*1[O|EjyUErboE I}"ƂjwgqF =|8]VDD54kpG\CnX͆k2w{ H+"E:!q"9(Jk%x~N9؊&v~ŚJ2W9a"|$qHX9XZ+:Ri͡r\'0|QQ`jcT>qaPjSRW(x$_FuXu3x9n#CWY(ZǯMjzx9$a4rqFkֈ60U<ݎRV3V̿"P=j)ĚB!`U~ "rum~ÛyIXJpx2x:Ad]D.б7[ZI=<-2oC(+dD6,c9gPٿ y>l+T#ukmCHW|@; @%N› TG .3SQݎYQ҇Dqz9g-U-tt8ׅ"AIȗ2OnbаOE O a3C{Hóx5{fm'q븕lc8sΜ]T8#W[j674:mS㈚o|Sͯ#TrZMK vE[aHcD}?m?0>ɼ:DCsٳ:,6Ч$*хԴۄ|BV _?C=hdW>^c-eq1[h'+:r€/U|5O%.(х@S]*ft Cpզqk7P^LdXޟe>gpo^|\e1gwu&n[^Ex_K]QKb^|z%3YTqT8W:|YO"=dvVOYM+^BUyE5i,LѭK˰?dv]en]#̤]꨷ Ո0Ȥnaw3ۙU q+-yq1Oˊo(C,fΙ-joՊXqyn C,wIDBhÂh¨eˬ$ WJe=Hj^˟?' ~"I]L=\_~YE>Y~Ϭ+!*N]??}1E 2BȲSrQqSEA-oXPǵW ^5_]"˶c rmt-X{b6uf{!^z-KuQw{65Fnl2GSk6T_zkZeBܨcwu4F@t,p^(q8`E*с%)E-qEE\5L1*lݮl IqJhpfj1O~BzG3d'Ra,@"R qIHI>_ O ז~ ?#9B*{h 䩯GGt2&v_MOc B1(vਈDx"J""D<(v,,`LN*|'Eh! _/E0ƐЎ"!1ߌ[v x\'$;]BuJdg.I'W.z DJlYV-ϙO/-+.ьP,1aqqyǝVr%ly7_7Ps f~diq&Gsd\?4 X9Xp{|40!ƓCYJ%Ϸ.dbd:!Ɏ D|">JsTWt$/)6JBUj>y,7͍Ҭo0,@,]XxY32HOuˉ+le@۸VOL2 M+ŮAk͘f׊h8T-8#J֔F52ϟpdU gs^3<湨Ju(, Ȗ4bDQVqO~(bc%/ 楫mǻ{!빲хNDt[DRDif[m!;tl coᴍg9+6鎴q\mqm /x /[X ^5q^z9 cE gcN."pl1ްAxo+N{ut0!< 邳5Ӟ[tHv^./<<Q6UmVr9.Ȟyյ>i+zN3Τ'SC#i`'UCisHi]ne~RVW#*U)~AK禑Ft71jQN3l@[1ɑ9_eՏdԯ0&CӬj9VP7Jsh1@L+Y5ja2P@wނ;ps>!ܩdDZX5̫yGj9ԪU=uni ҧom)l5x;Kkomxelxe[-p9+5N4L7|t1٠Qߛ}}dC;| {=]N|iSi{ ׽ ͷY}$t%_:ʜ!`h~D6<*quf. kJy%>tqJH%k${̈́y Mf\t6T}y9NՍzX_foB^^%T.rcnffr WWfi&xwlP)ri4yw%KZl 8P*A䫝آ_X'X͗pL-j6"r^l)#2>x4 h hy=7ShI&`g´D3oj*| 6H~u5 ]y,~ Ix^3/d7{emAn+Ob{7>NnJNÂB?PK ?:{cJFlex/ScannerException.classn@NB\ǥ-Iu촹A QTP" TK7uc#Ay^ B̮44.wΌ_"|yȗG|yb*Ef,B 7MQFG^{>]W&t^|*|';qLrU=&mv?u)[n]?v" )u%€Q_ϙgfncje3D/7JFTè6G0v1`kXm %T,hаP@Md,3ư~9 ̥aϒ[ \IϓMh}SĸuS3bhC}PB7We!Y{cȖXFnwpuQk"*XDa A7 eD5VFq?SEDk*H#qNےt¥U\>τt9)J ȍ@5B2/ J 䤛. xed?KL'Wfof?D?'2ʜLv}"c(:.=:O꩎>ѧ:z#M|oPK ?:e[72 JFlex/SemCheck.classVSTU}EED(A)DHlW BeY.²w[]3_|k/Z1+K4}h>4L3}h#߹{]v>o9sw^OaĎypvj{Y; 6aM&xЁBZgt&c FlȁGF 3en>=v̆+~1 ֗ 1 /$22$d{aBkec@*w5,Z fGiK֥JUj&ץy=vO/ %giFVG1+ E5 jwz6{Zy?ֈdf$ϤkAa$h'uy M~p KItH[ѲW F`DtEO}孑?QjjTt@ "=if TVZG{ު \Bֽ/+x ج`  T2*؆$@ c vJVULTQ`/*R,Ta%Q= ,cwp7Ql[a֚`%X. "`A]qX8&flTT^IY8$>5J Bb8JS7BKzTOW=/[uz]_T9ֱ]VBB+cm1AVmUcs::߿!ũR ?mp$IA weƏ&>۸kؑj%4ťv5 A,w=økMJf̈HߏykG/yxjũdCJ^ʷr:@ N ]+1ذ@waA&_\kY ϡřgRmGku>fT;(ϸgu #22smGn|yS,] (-/MVVzJ,JrsZX%xA\xhF_E +CBZ齘\i̻UYCm.U3 S~fJb0qsYT78@:HrMӤI?>Cwy_vDizdyXcI5[Cl711=$G."=_sorƃ)\ìkqs+EAnx$GFeFހf`FGюQ|c/‹+[ FXr~ ^`"(KLGPOXy&bJOT75eAI'H;E҂Ӱbx`4Bp,(Qw? B;ȷNz{'*>Danj3xpG@.N%o5[oNVPK ?::BFJFlex/SilentExit.class]NJ@͏={VP"^*oRG֍ky<>8g`>LI!e] }hłY6/S?lQڮú?.x5Z5O[B43Ϻyo:G0#[YjږspIU0:w &x#|1>R/PK ?:Ցy JFlex/Skeleton.classW{|S&M/(Jڴ ZK4emi n+m I`뜏= eMQp[T(V; 6ܜ/TDtnS{4?ryð+) >ȸI ngnN*l/Anmbء݉;e|ɉ;L;q..#f܋dQP&D^s/&2`.pA OlP u8H IC2!tH=,f#bL8"?*0S/!GeSCH8 ~'dTƓƭo]o7Ip7k[i1h2 bѤE6-%ؓk|6n E?7#(7'_UH-Kr n YS=6i"Z29{uCDݲEF,*aR:AAҒI7! ѰB´ѶXm觉Toh:#p7"mZ",֙M)LkK)5YSשG/lB^mNm[5C&tK4IF ӚbA'hqTwлj||M}!=nM+d"Kń35ʬ fVK0!B=e#5mzȈ $gaigEԒEϕq%'xD Ѯgg»ٙW($NB&~T163ٕzfRHnԬk{(xʠT]Ś,Sf?9-REW 9H5 3bhW~ 3ZCL+-T"[aͻj!IS* I FI1YDD,!ℊv<'hQф*>Uh\y< Ysq+U$HD-RIQ#ߔ74ʣ1S/"'US*^)/^Qs UИ9*^ĿDeӜ_֦p9$_،-YLBk5;;$T'^Wo;TRgEE>TJV|,?zRoG&"YhU\T]XQeUTf$1 YdS% R1Չ6Q㚉,ɪJT#kLhss3blݱD@ճgFLj=\L(܅ -/y]\}~BIk†vR,̊X".@veG˚zh(E6bQI\]IT+*2*e{'6>^u:ꛛͫ.Aj^~Vx'd{tp uuGtQc`BKף=Bg^zZ*EZ:D#]9-ExwN2ZNaZ9#tMBOv4\w=ɜM{e!L=2i`f`7ø`A,~[BM42u1sQy9Q)~_G22#כ3JW :%7zL: aE^DtpofјG0ߋ`(^4*vbreUTҨ8j7A߁Oz7e*Ө)uߋIm,8mm/u4FmtX(l3nom5#̴؎鸕n;;P;Iw7AXCW#l{^r!&@AHEEF0eq"5 |g1( dI(@Ϫ;}*UnۑbRn).((,v ~V !YJ/ Ҿ郿_3 Ҭ5랹wsΝoa  D.bRĔAqCħq3 1-ѷEDiwp7TM!PQ*mZfH3d)ՒГ*Rs{ݭ:eFբS^svŅ7pճn#rJ%qV&#۫=>-n;ogeU(ELG;_P0J:ne"*;JY/ OԦ-c7ч~"41G¼/ $ս\3m$ nTM,&2X ၉,r!,cY '׷"C'#ܴmg]mSBʾ 15V匱b^ 7€v3"-&!Kzѳ bp9^wھZS3Bl1^x{ =ښԡ[Ep>{KZj);X=Fcl!ĩ. ĢS?qW?U @7--zc-G9DP|1cyIk(o?ҟwH8OOcV0S5nXm pzHZˌ)ߺBKj)o3]ԙic:ܲQ_O58@O kP&6XAw |s\ϋ&ч LˇN J pͧa,f){ҜG1iȯB3#>b0cFϒi O?Bp|7!4y=tU,Rˑeį:!G0'9@9BD,gPK ?:2 "Ϙ |JFlex/StateSet.classWmP\W~'B$,eɚ/$@B -$-ij7Kv6Qk5iGXD DA9NQGi3sν]Qsy9<~яf׽aЋUHxK응iddo؋8瘵\҄:_pދe u97.zQ1)%ܸ$Ke7>Ui>#td8&9Hg"H|Ф%.h(l?7F]H22;.nmKw:(eyOp%bFfQN5'X84E6a5}h@G|;Ņ9|އ]r_KpTJSIDJK_˾5엽p tQ^+a 9O5LUO$!.mԉ,;"i-H4+ZrRfQG2ed2b[1`9Obʁ"FqG\2`-r\3eٖRl`z1p LCR7 sq&ȀuجI[,Gxgȵ4mh`47oÑUXmm<P͛ R,{ 4 c\#uT,)8 ff Q+Ur[iTo?ý,1Ȟ݁+kjqFN9rnv *V:73d閃񰷼pK [PVC{j`bʄJTLPc%M''mN.[rcK4 SAoP\;HNOz.X7/%Lg?LMui'WVlJ*{MvFGO\ܩ5oP99'&f?\:* ntY44\ꨙA6,Z\{.}6) aMaB}o~856IaϵW7SjLGxxU :{$5Ld G)z2MzxXGFg~P.Ĩقh4+:ӣMu2ࠊQH{ּ7-L2biL{Lҵ?Cܼ _4t]zA5V QR!*Yukto{n`(s?tӦd^$/_o3^'Wy^c(n6!V))zߦ|QAz|%x*}rʳF-PL4C֐}Z'"ԡ;$wK7w7&[:~wP~nMm!cEp?+K#+UL1#ͼu^R}\"͕&;˜FXmZՎR\uJ~SZjNzrf BI<-_0"_nOŧUŬ5*GU& Q}2tWڟLיV(`2RoNP"UTY6CЁ95];=+; })j>)}C;k?x|hҳs1u\3cJy&@1ʧMx`n]@3z^믡ί[R}_J+)+~JnueaՅ/dd>~"!Fh:3'$T*M8l)_M*.R-.90}e*8Ivsv2`>~+8x\Q-Ȯ};TT){!JPpfl-dԊG~<)h5XY jq0Xq#FnXb'G-JGj(PPK ?:ޙJFlex/StateSetEnumerator.classuT]S[U]'Iz)Bk~KKԶPihZh:TV'&7ͥeF;? /0Cu~O_Lĵo똙>>+_weA>4^O bΉ9/#6Fm\P0NN|pMARhR ^e]' nU[YPzM-úB6}P%n]-k3e_ϮWK:*tԖʂ%FV&PTE7yNUxa-9EǪKijw~mo/pN1feb̪Tfk^Z'+}Iu׍0NF9NH.3_[TYX=N.upDL: GMl'_\^b`9%/o#;pXi2:U vTK i^,H;8LRj3>J;DjDɋn#fu$q5qOHզ;c.)r3a;v`>qY%Χ{1]c[{ئce/34S!,9omOd3Yps>ωp| 1V1}l݌&D,4Tǥ q5sQ~B Ҽm 0W{ݑ}r]Gp^61|JqDy[{Oݜ v@>^_ݠ#'y&6'E|EZi6p_P7ʤ&FYNӈgfkd?7 SXe+[AU3 *v1κi0Btn9 Zl[ SV۪vޚesD4uגq jlElcp&q:.wN! wOP-g~uŅIeǜOD&$1UݨTYxkڨHaj+lVɼA#٥otԒ'{Qi,:Ҹ$N鸍uH"2:d1'9].긇5I8Zj6a}UH;?WX =~Ye Jn\#2]-Fl?Sb8{`ث5zEL!+$uҦqV]w 4id8p6f 61N \$= {xVD>Eiȏ(_H0_B" /7պ TV=h|-+ d~ }L^#|/2Ĥ9۬)IzU!b@PD֭|:{y1 (?3{!l0QǫlbW1H+yJ,r/oȇgff7%=1ΎKelmcC]rX/_$jCLy) %{GE׻C <4PK ?:7JFlex/Timer.classSYOa=0]łP\KAp ֪v )/h5>ib4Gӂc=sso>\`;Ep'؆"DP kOu:.}Ƕ"")ŧ|VS݋;}by_A6/NwG6+*b%|_ƃ^|EU|M׽G7xX^pT|[w~qP!Hɷϋ#E=*crwEx 7N-' 3"Ί'TS"3KZ̐`X:}7~b '0˜ŐZq3IXwɰ̈nHh"=.\`FLVA~U N"],cVlX ÝFv)7Fǵ0e)l1Mξ܃ #&rm&9S(Ŕ>\T#No;)2ψn!7qbJQF9-b"r 2egzLnIz9N&ODzL Ud=X} .Xi!|fjyCo(|R+B>}|&ևv.">+Cev#<_'yHޙI&Է9`ct`qL Km)1PK ?:HC7Lt JFlex/gui/GridPanel.class}VS]Ңe&6(0 `m qC\ZB Z"$"|6h3id&a}if C:k3}h߹Y}s=uHOAK lOxʢ(%OxBec!WLZSQM nFȳ-'dD>z yN+dJHQ͛(Y/d`aWM,Y,I>oh%WLī d!7 WETMb͗gt&J,\bܙ,"n~mM]-%HyԫSk;gfNb*swa2O]BunPYJL/NJn|*ݤSme0Z.,B"_u3,+bYǝR2 {7pg[ӕTh)̩bobt&``3NfLwt",ޣlܰн騔JeXGkT*;)Iv&M3FԻ5i]Xa8 &h1эBN9ہdq`A]8dɑ!l\Ǩ~S!BB^rPhkcṖH l` rz9񦉷lwZ*u>d&LBwE2a&SسC.Wnַ35Vy>b̓XT್ Ra 9Sԇ&6ңNaG)1cesx\`]0y0|l &v諯xJ^Ch6$hsyKlSTwk^wwcN ׄrz%ƸFyFz9+)76BPjZ\AtC>9 4'+`5@EB k$C!e2޸Mkk̡ g)m,fY rrsNҜƠJFM6*oc쾒YCk==޲G]8+vy'\y(tԨ3ȇױ#UXG?noF<{+TstO䀨FGl2EuyJ3=7r]EMh>f5XLS)kM'N7 ֽ;>8=~Ec<[5b<jo)mm9ݣS.s;؟EVbJr%]@:aկW6!f xkA.$')ct;FOƜ} 5to1}h?(ƣKo\gAj#Z9/oWZb5qaWVwpgNô3ǗZ˕?m"A mzM5= hyFo}YGSwКl_iu!^`EfZ,sXAU.<^% {; }z?&6xU?L͐k^7+!ǎDYMs፿^YE]rۇ[YY+4z o7dh]7øg8_|= g_[W1}p絭47;Dy'eA;bQ? 4[3tq?, Ȫ5w:AjރwONBu ?|!&זxCd&wPԉԅExpLF;C%@> \     讄5'Ex撎PK ?:i"N{#JFlex/gui/GridPanelConstraint.class}N@P @JҐ4+Ug,rldokV<bfkn+7ǧ?aW &=gKA@SR<4 8sg MC%PM[kC./4EG:=hOy65 xJ7VG:RD%56Fq ñL4@ktv{DO/eaݦFr/@h>q ޸p5Fj 2kPhӿ8^nWjIHO6[J{oo/Ckdf۫^N/,F>Ѕ#tgu ЂGOئonvq+L~ bǖسm*v]4vLݨ{PK ?:}tJFlex/gui/Handles.class]N@B9E[T_@yS7ޚn6&Cgf؟~k҆Fq7^e\fL eHD8Bq()[.wDp@VrLk͏n.ڛV&B$,"+{jmC 6*>f*\n=U뛥0U_X#?OޖjFZIj[E5;d.v4但55>,,b) VQW\/s.U3=ϐ|TQWD%T2:dĢ7R #&[R~-+Rh.y u>*<SDx ʻd(?Ju˰Viw0r@ȹ1K1X~?pESjS;d#Uid2X~+Ī;>CĐw],j5HѸ.Y蕠E8E{U}n d06iuMlaӣ3Gt3oH-S?&Qzhs]4 Fj PK ?:jJFlex/gui/MainFrame$10.class}Sn@=7) K7@ BB@" gIrޔ\KG!f݈ajiW33]Elm4`a%lڸ+&jk[P{2m ^$TzOTODaV=eHCͭ0H0Tijd(]>YGHgX)t#z@퓣* 1l>?=q f%Lb~RݏI(z1MqӁ3\[hZh9m;0-3,eWcp_a#K S-}.0iڸw?b~]q{RD#:d/O^NJbXqg߾Nww |Nj>ͥEJcFk\@kʫݡ vXOYe,Nĵ 3V51 f k(uWpqV3V/\njv=c6Q1BײXɔ. PK ?:6)gJFlex/gui/MainFrame$11.classuRn0=nKCC~JQ k!$dpѩvS(qx%x(gQ!HN>?}"vFe\w.nbTl;Pc[ kn,NL\n'PSz,D*2\Nԙb(x5 Dr1!4q'3d=WJ$ gPߧDKZ>g3j$ ~xOx@C<3 j| ۛΒHt pϴxpCw㡁eG14FNPZIGy4?ni59pWxHv7SE Hh1YMӉTQC;)l=t/X6?` i@Cm|k4r]&K.`)VQ0 ů(\ʵ壕iLu5,Y'6tٮ7PK ?:[&DJFlex/gui/MainFrame$2.class}QN0=n i ,Ptx!(\"ԀQH gQ%"x%3o/V\ `f\b JDp،ĝٓd()}% xK**s^ @*qEreƂ89O#@)Ea~_xCRXɏ>&(gSSEѨ;PK ?:P0JFlex/gui/MainFrame$3.class}QYO0BC,r}A !*!xwi]*q9~?{+x6x#3oc \ g̹ǂEK -TpԈĝIKHxWl3n -C*ޑJ? ߗ J0IoFG>>%\BoEebkl8dXc{ K~$?q BːK%f')Ca? j <DrejA'ɂgwH#2,6PXkLŐaL73gKLlM1Z{=gI(Z/րJ -C*~-okB/ @*q6 DreA'ɂgN)"2YdC-cu!8v03;틙P?%oMlM1jI(Z~|a@\l{p`.ԯL +V%j" L@Z/3Z!a(ҴubXV-Ъ7t`-eFn3o`=ؚ% e=4 /}G޵Ϥ~o9sF9^:V-FmPK ?:v_DJFlex/gui/MainFrame$8.class}Sn@=7)MKi)iBkB BB@VJ7Βn嬑)|>B̺Үffg9;;mg: k6.c\55]PpMޗIcXuCq&}Υ|, 3J -J~(ԏ}R' /x1D!E(aYd9s)x;m"Pհ!3g:F+J8+O+ .c\;ΐLg+i%,PK ?:veJFlex/gui/MainFrame$9.classuRn@MBLiK/ii)& ^"".< gl嬑)#oARQEp-}vZ\T .۞MB`CWPK ?:`j= ;JFlex/gui/MainFrame.classW xTL›<  EL&! ;@ l$ `PI%y2fVtѺ7*(S[qVZjUV=罗G2'/s9=lc}/NxPd T1 IiR1Ϩx9 xQKxR+B_B_uOBPgaT𖊩x[x ݇T}>򡊏OF_ >Q1 (9B?U1Og*jX$JD Kya X!ԫb(r"Gy* C})4L*hFQ*Q>~B>!Qh-4Nx^TG(>M*V$a&4*t F#&_Dh|TbV\pTA Uh͔aBUt4@s}4Geq )TB|3"l:_wFp{2W6ƣ,R> Q{9g[ˆ lxDfff9U3 7J³sFo b|S'1-#DU/*F uh-å2\"E`Tٖ+4Q\G-|d=T6)]\7kyFąY*iihty9jҐ@E{@]XEsd4rљ(ȈFBaGdYɈ :#/&dZ\yõU3*B5fd$CԴR6D%՘]fĺ~\Q34VL([Rkú mܶ!#n)Uྐྵ?nK-n_c8YAK!r!HyUjWPaIhHTJ:.a)V<@ͽn))@ yl8.E{\R70rxlk:WfTp۱tJ$%![%*YMYQNjqqy;tG̓2=i~fy(珧EK(V(7nWb3Jqa,_m~Ox&T#陁^2v;q~kAø3p~ /KMzlG<[$ڧJⴌ f0`n- ״oHb%*WJ^xm~l?O)x߲Qcܸ|<$SӮc1gܥ}Ah',BW!@ C7xJRӋW{3 3ls8g_dS^r4~-f**؝":vlM"L" '߰y|yx 5.]>Yzw|ri'̉ȇ81o xCoq&]ƥo,t6P- 1l.$5tY| B9ΎQ4y v7 ۋ38+]/+dG>bQO8?|ƅw3 z,NtcfAgI\ǬœO1(v0{#{~ԁd@p˥\1CLC404Q>e>^+grleTW4rqЂ<H zB(GqgV!GqWV# QT(aݟĎHi{";Xv~1EϢZD_"k+%r:ˡs:ϡ ZE]PK ?:{@FsJFlex/gui/OptionsDialog$1.class}Q[K0jͻsUMe*U&9natӟ%x($Dpsݚ||#5,YHb6,#F!TԖÜ{r{ՕE' $6Cd;RhPX3$~S0R.G7W}1`+%P$?dy jRJeq"G 9WpkY?UACI&Ȣh#t%( LIv7y'Cs `H6$ 5'FoCTmQ'VأشbVF0ל+Ѯ2'^[fј5t5)Þ6ݮ/PK ?:*@ JFlex/gui/OptionsDialog$10.class}Rn@=1hiBiJ !%ȢA} Zd[w]śR U<|bvB`,wfv朳(c Vkc |\z 7p- fFG`9zK4UslTJ@F!pcy"PoVl T> FJӋQL2N9eLwHYXQ7yN4wXٜ2t7Pw(֚с<|mB:!mmyf-'L0JqƣzʩmMlxh=[X5v) wJ?D*7Ľ(7LV,CJ;WP`j@ƵՑ LaNx$t*;u2_oׂm aϰ}[_!ZQrf_-\}2T\ǻEi}B_P (;}njYZK0] .*lwPK ?:$t : JFlex/gui/OptionsDialog$11.class}R]OA=.]OV-%DK f#5<6޴ˮN3_0~@xw&{s;׿.&.,PD x᱃'* u_bѱ*VIU2JzJXI ^X7jfڮ@tI`*P1}thQv"I(]9P F8A3iJ)gTXٴtRS/uV<<>Rmyg,+L0RvNZʪnԊF7EP 8SDg .GwƂ9sϹ'~|#,b* m̠`aœ"CjȤ0ޭ{zd&Q}!wP'– f(T2.2{ѕ`{2'VM2E>.y,f 08Ga(⽀' d[:s_Cg"▸b(V&.SrwMʁ1F %1Q;š4~]D6J,ZwOAS-a=5f4D }tE{"ʐ((LԵZ9/EF(Et7Hԣ]shwLl#Ojz#(ЩzOH ÷ .zhu4t4FfO$ nPK ?:ވJFlex/gui/OptionsDialog$3.class}QJ1=ikzֻ[7E/,*(klS֬^>KP?JĂօ$9g||#,x9LDi3 . xpt{֔ɍJ$CA2$¦TRo1KmK R0q*s^G<sCD4L+F <4ЩHZ\2̔>ӾJ;6erܳ@Zʮt90n_[ }ZU?6D4T }lxm#Jy&W`A5`\љ2\tRNw_<ڜ Pݳ bMQ*?!ߵxLow^KDÄ匡߲h_PK ?:m-JFlex/gui/OptionsDialog$4.class}Q]/A=ӖRQ} [7"GB6Hvڕi$x(qg4dfܳ~|#,dL٘FŒY s J&äwt{ْɭQID C>6e(Cҕtٍ!Pn">a/ypc0m09 CZ/&:Qr`¼]}2 jIZaOLgHWBQ}_$IyVCC5]љRlt[)ZA/`gMN? ( FHF0QئS+UzEoEFc;14`82,yPK ?:.JFlex/gui/OptionsDialog$5.classuQJ@=ۋ1}M}RD*A*oҮD?gׂ&'sΜz@Xtm`œy =%Ba;mv{rdQs!W UK(aWR1g Jt.=eCOy# dċ|.6P+cALR6J\WaS3 ~]~\q-B(PGjuھJcO Ms`cс^ KGK4IM' +z?=+A/gHI2}_qa\"4K]5=љRlREw^Jk/H=~5펉m (ƺ tj3RoHm?PG18a=i8S6,oPK ?:zȃ<JFlex/gui/OptionsDialog$6.class}RKo@6 qc'-iƑ@\@\,z꡷;JumdoB{)~bvB`,w|3?}2v`*V\⎋5pwPw!PnL~ZIL8?.= "Nx 4 3*YH+l HƇ2SF+$<',?bb3JYOKMLt,NHiD9湑,/ՖC^:"*K-æ\[v]{Zy3] i;U[H`s'( Ӝ93|%>&Yb!6B4w>L1[ #Mq c.a o(A#]+Hc$#-X9KaU[?~PK ?:$~I9JFlex/gui/OptionsDialog$7.class}Rn@=q+7( MiJ<Tdч>m㌒-]ś^~ Џ:T!0;3;s%D݅XqG.c'xESi.|hFtw=*wJFIw[:u 9~+RɌX(4 L*~d;bl2ړe`h@ۉc4"Ė$LlZi귴ɸKJp /OGk}m)Em%AHMefdy ζ"ඒA?dY3a 04-?k]Ս.˝(0!mj bx\=VXrxl#|MSr|<>c֍ŭ~~A}wFv1Yu!Bo0^w俢 P\3~HsC$#X1QPK ?:O@JFlex/gui/OptionsDialog$9.class}Rn@=q+7h!@qTdч>ڸdF>U<|bvB`,wfv̙_]4}xX5:6* 7=T=(ʪMi;7RKR=V2I{*ɨ*#Znց@L4= 4|. [4Ɂ*%KC4l%2ˈ-yIج24i՗GDP2!6<%8JIGØʑ#gÆp;@;jP˝0p{B"A'R!@fy/@2aǔe{Mc?SէE7=r2 LȸSc7|O~>Xf.׿BԷ?>[̺+حXͷEB_PK({};s1pa,\vQPK ?:n޻ JFlex/gui/OptionsDialog.classW x\UlM6JH4KIC)I45mєNf^G&3aI)kˢ""( K)(,/(L$s{ιopDN3-L$$׈6&)Ћ߳KnܡN ٸ SG P ?x a.2xD_𨂿xLܯqOxRS P*6{>yRw+xYC%Q_PxMjX԰[j;G:jX1OŇ?bOT|3|Ng% VSySa;2Vi$hN"obip)JG!y4G9LrLg2IY}Rq/:[s1W1;^!2V hN#\ iˊF@e3LF`Yd2vzV\0m>2Vv(/99l LDwX cԱɹLar63J\T&WHǍ <}إ{Duq#EjНׅNp.?N}S'PXJ]}CuqXDU?)%UP7}`;`mfشvxw*8_}~.fόSYDo;l#e.!*q]8\>LY63+踀_Ţp薍E(`8V1f,OYAwaᗤ'gSI\KD.2kٝA)lt5U0Yj:#b1E,cErfhnԾ:3r]+$s*X13^۳cE*Q#E"V(FGjƺu D.֊Eh\&{eU#2scN?Aޱ/a[H(K'?Ut f6~Msj줳.ia{QyZ@4B.C6dZY'X8]C$G`2z?#ttݍH yD42GMKۓ&Q'ӛ~&Jm6iJZd[̳ݍ[06'MCM P K'YXx)ԛ1#HBo/mDT3(,HԴRB CP6h }N+-d_ '98_:n '3(;̐T _QsiI`~q?;Oo -&dC`aaQΤ$¢L.L` O-L!0i ]|AZh_i0~ &O:wq1`8P:\˺D`k/-ۚ3=ȓ` fI0smMbނ!т P(flp%ȷR(7Kaa?vJ~6\*N \-.µJ\'nV Mqϣ_[\. ᚃ+*pk5R8ڂ]mSq,ڃ"r *O+!.h8R6J39g;㛋8OS85T_'I 6VK DhC~|t;h߸W pN7x߃CtAskcd(6 ;B?eK5_ۭeTrj%2ˠznF>V ,p8 }Sig0b>!xxx %xާ.WsJg'оY3''yۏy%G~Dݏ~tˑQIz+$Ei͇$á-$QhS~yym4]J} o#!Mߏ~s,G*7>wc:O*?M=-!KK33L'G4^ǁj`CІlaɿ'~T*& u".~ߌrAs\\хo".;3gtឈ2pMō]/iwo#lȿ W:|ë^_Z;$?PK ?:s JFlex/skeleton.defaultY[S9~^ Mf6$2)*%wv/rRf*}EVPҹ~{_/̊d) 8UT)+R taS`+%\Zuf]L&w^R 1FhY,+8Bdәu}gIK{9==|HY I I tg:o7uoO/ӓˈtbr'6X8)6J,RYk" Zl6x?ȟ  )q$ꁞ~omC_$6B:GiI4GYܩ$,/o;k15`\80اc"skM^dtSQ | נ9`%zT. =6/ʣ9 lr58Jg9ı!0  A @+}+yl6HᏚMPđBEu~"k/ӊӓ.WyЏ==ӫK1W@93 ư1xGRp[,gh%>1շl=3<2|HVU6cV#~Y'5mS*)lm0"17,π*3՗%t*OPW\{p89ymr2q&бO_+2P;A ;"k(r+6*# 1 "=B[A9uG`}2 -BoA:&WS7bw5(L(ϠT斅ydQ`@)Q>pܘR̂G)OBlS, 1Пzէ9(88+dn5w,^U2lCLeLuu"Ԫ]jڔ`Ee- SrGεx3*_emw$8@̴t9̋A[*䀺JxeOkZ-Vm~}M:6Cu@ΆZukc ּwwYy=FL/IŽpͤ2O *I=Q:SPAf jV7 Ǡrז|PC"nɖłbWFo;AvQPHt& (@$mj%\070J%u(5X'hJ0Ƀ˽R,x"xS]B4LRfQ BJAYr9Tz(Ul+ހaD f^BAW ashvRw7;YPIPm*"# 4(R?ȀTnelSpآGtg=1J5ij!F f0@ QdVkqӨJg}c:a6Gƴ#t>ܛ;x40̶ GXw9>UOqBՁ DP56 jQB mP KTC @_t_%Qw6XMrbҶ'ݩèU)i4ޛ>Ppݛoq Qq^'~D2\ۮM(8Ԥ#(Vm"ݾs,Ə콪mY:)Ph`]"1h()X ccNs+8Y~nN59DH$*W7jPUH̕EՀgǕrKzf(<%V *:ߝF|_37tJt|F;#GEfJ  /n_c LZ&xGvzY 6W[bN>UW;` дa[RtLÇF4<A W(CJZˍՀGxFsq&4Is乍{RyJw5?5eںSW [D πHڵJy n pkv4LRmAZ b!Wy1Ȏݫ5׼[_*-#poA 6EYSxl6ϞoehcͿ_F&۪F!n=@=bP03? a:^#Y-haK5tG6TH[XH!lBEN}_?{m}d=2l[pкMYOx D㑝"(;6}T8޴xśb̜Z1[!O@ {BI[A~ PK ?:cFJFlex/sym.class]R1p {&|2WTbC`dWˇ<@*t~+iZ,q'Κ]ɀ3q^\O/wիJ1YZ\+i8YS78w "0%;"2Zʢpv g-JQ" Mdv,U q윯m5L$tS5DrmEsNMjȠ0Jj,Mb̸ɕ[ kcN0 7nf], Vκ7"{Q~(؎g 7*43dHV9??;7㊰`M9J2gKKܷέه\+}`=Ni[8kAP4[cZȼ+I߶ 7rj:TP^R? PK ?:H._JFlex/tests/AllTests.classUmoG~6q|ˑ1 ic } & @v7%:G*DE_*3{NՖvwyvfٻx ⚆4|n:0hd n4t,44%Ұ㖁1,F;sW=WuTy^5: 4<5V+ܔ/[~+{\UlZNXbޢhgߖ]8q׬nABi/bAҞ{#*KGITweS8HU _ۿ&0˯ Jn] LmGV{D6(5ny6͘mS" QT!*d=v=ӳ{XT,AOF#St._iS-ړ]o2 Ts#*<Թ,0{vK|ۮXjrf}jL ߚWf/GtCn$s= ߛ?xK JJpaD uUSg9vks[7!eb#nb)N4@*n@jS=l1'H@r Eֶ=qpoVjzTT5 ˎ߶U1Vێ#=^aw4^,!uiztnP:׶Ϛ Ys!+C>+F+Ddi4C(W3H6} Q,C|&<&F7Aq9sh 8Myfp w^T$(cFDZ[^>8ǘb8'xPx"'?I'CxO)<ӌgş,UAZ CBFҾ&E1' ^o/k(@<)c-F 8Q0zJif˗.oq0Oi6e]maYzjѽeڀ\cTRۜu=%f.2>8k9y E}Wy#3(]d憲He' E#̀:myŅdd)ǰScN̡nɴ7*DW"^_R9L7Y)9Bq*!( >R$Tq>PZxwJT4# 6R^*u&-5V",F= H=ٺ' w8`%xP@JY^ޥ/෶m'Do eYc]N"1٫F(6bjZ!48qK؞.`R=Www|P{ Xdu3J܏[A؀}uAs-7̟S"9'p X?ހXHQ^" W 8kN鬸PK ?:m/6!JFlex/tests/CharClassesTest.classVFGITSiC$@8Ą(b )M՗Eߣf>@.H]GeahE|1{f=#?сaЋ(Ƣ̝"+qy/RƤpd<1-㡌1H 3XƬ9?b> Sm֧%\Jv׺fvY+].OI:%C…im]շ-sNQt?Y5 rsFzMVt7k鵚Q[$t<"R MRiTBGJtԌm\"_bZm 焹le#׸$YՏ(zɔkbr keXSEcu^l(DA.3U;GE1,)aIBd&9Hnm&uɭ,#ŊxƺDX6sxĤ+M"RU`7V͓V!# FA*^(XWJ#<,'+XiUF5 nл^VUHJeEzRkTiZjऎK d(RY=c=b$O"riR;ke7ވ4ð-eٸ l6 > It+y#|v!F+cl ]5ZF/K7B~_8+!몮Vy\unFih8zY[`Vo>TSP.I5A{ _MQ|3˜— ^|C!i:ٸr ^3,9R<`>>_?NGɐV\f |B2X11(H#2%>\I=>cEϹR ~Jwukfm :ն߬-s[/hqu:ש۾Ioœ}3P xns<՝kXyU:~PK ?:jxSW#JFlex/tests/PackEmitterTest$1.class}QMO@}V>j+FDMcLPn`.c2F Λyofw?>& e鼞F )9q^>q$exPHɣ[ K(\ H"᤺>xϞxaH~h9C!{TB  @C 2 y 8.j]9ICTz>Ah-T#a#-KHk-͐eJy=M> 4d)6tNNުo^""lha+< kTL=_ž&gJ-#G$\OPK ?:>6N!JFlex/tests/PackEmitterTest.class}UmWE~@vB(lm-&PI 54ʛЩ.MlD?= zgC9sw}d>3"mnU(* Bׄ8/E[ ʦ^S0[R5T!A(ĺ\rRVժk?3=KygC1˪x'^f7* dF:6$l*6C &B⃽+;v<W20TUw LK()8%2Γ\:7x 5kR\KsmkS >ד\S\Os}HrCHq#͍nT4y`PT C<~ Λ5<+^ET2;GM-3HRK臸A( eV}C:)_vSp=1?PK ?:b@6JFlex/tests/RegExpTests.classuTKSA<& ,ABhIX&,,/޼TQ=QBJeo陟1cث"cNZ)5_ʙC$uw2^KSr֭V Ȼl"lc|ɜpZk;,]M>cr XAY)1gJZaIE7Ό%rUrw&HAUtTi-Zք# .Wђ6*h%hoDp[hr=n`i/ VC]tX4>?@ezB&DOc\B+xI%H# fܪ,{ת'եp^Y>ݤ3ꇟrAdqr~PK ?:-JFlex/tests/SkeletonTest.classTRA=ۆe!H@BbQPp)CQ>M .$E>ARZ#ڳY.leflO3=c2z1F<0Fe~2Є1FÃ02&1%i Øсa(FJBZC(mT {7\3yuGٖQIl3kE!5SϛZ2QgȮfuʺ۵Y)΄CJ3yBAD`koZ> g3^i3ȹcC>KL #c:%10 p'/aA3,*XBL2V(q{N4 +xxʠg2jZSEO*huOIJRҩg± 3y` 6@/u^ZC*k^u"l:gDS #(*a^-Ҧpw&5HE+g0(wo#jFl.a`<<ȏ#W.W<Ö%79˲/0dqxJ5㵿jM}x=1}r}8>i>g99 Ag4JYZ- A sa^BZ&!Ce' |DbN'8ҧ8G|4s!VWo-Y F^FBy,M_g=sm VmdΝdeZn0UB;+!QSY Ȝy8= Ǧct1#٩4к{2C'NRZ[Pt*̰+rC݂˒ַ@0 ݏ;d"1"RT"̧2Iw)$߽eE@Cq9røO|D(E(tI' =RDOR4[樮!Ҙ1A#8+"8+*%ɪ1 1 {1R:-Sj%{ Q!"*DD\\,MP2lr{A*=F=0k4~cW2KPs坣PK ?:XHn4java_cup/runtime/ComplexSymbolFactory$Location.classRnP=7vVLSҤ4-$ⲯH"ER'nqqȵ '@G!fMi@fν3~aXa%shpгX- ek9s༙ŭ,n yd0pTs-Q#!SyJ!Z%ZMQkf׵YķLw >'j9q-t|ZgM<<)u^[Q"/tz{}~9u}w˴B?8^Հ뱓\ƸvLFS 4K7m97r;qwyo=I P0gޞh{G 04,j6ov/ʹh߷]1nbkz/ե kB({yJ BqNGtRA }C>'ɝUO:C*L?@;ѹ HD!%PăEreWFl"IUJ_ +RPH4%Dp[Wd^!r\)OzBBӄO}HT. D̵40B du8|c00Y2h zA7iPK ?:uEO +java_cup/runtime/ComplexSymbolFactory.classVmOP~֮Q) (Q 3$QصP D?xn[nBf0{y? ^Ƞ"Ynrs9n湹Эf'ySܡ5ot&r1{Φ8b;S{Xrw4-v-TWV[3VL>vAzq s})yinr3nyΐ/zH #5>oOo|6zF3IPmg6  ߱tG!O3@=͑g7 L_@$P$a"$L䤜BJ5f1H axt ,0f1ǀGI~4Dωoě%q Rvۧ&h5A Z-d*(ٕʼP?vTJe^̇*'BUz{j@ւer| K0I 8j!DP_\^&BOa4! QV')-p (A i1fp|?E R!MIHPK ?:{eMS+java_cup/runtime/DefaultSymbolFactory.classTmOP~X7V@M@E@|]B4CJÿOM4ܖ~( [s{y?FxbY<lca_a7?$6e%[gū4 +TѾ-'Uv+|qOlWmݺmy.$e.pyD Sg M+}%CqSt|-tlɇ2ācZèXm&觑6ALШ,?(Ha5`iL&EZaܢ6'0QB9F@R&ʅtA=i" 8ø\ϣT&hpz`P3BG::+U׃HUTHUTPf=NHJ\m'c{IG&Zc1Xgq?@sC |dJKRi1ȊHITI%29k$8!駃>Bz&]Hl#g]i~ܴ.9JPK ?:5zjava_cup/runtime/Scanner.class;o>f]vNv.FԊךM>؀ /xI'vNPKj;鱓S7FOzjuwzZQ2-Z;MG2#aCN {Ln⏔$-::aW#2.bI7n!%S/E\AJt>w/P +NMKi 'z<1 :t7/u,Q%&ݺ9&ڻb9G_qdPK ?:<$java_cup/runtime/SymbolFactory.class;o>f]>vv^FμܤF" IJDļt̼tkOP|ri~Qi^Ifn>D5~ !IY%֚822$PR|V8ംhWa3ĢXcӎW?Wp~iQr[fN*#D-1$RAf*Ft120201+ #000iV(4'P%)@PK ?:8QV(/ java_cup/runtime/lr_parser.classY |T?;ᅄ!QBx$$ Hd$ʢE C2!#0 (V*@6bq ںERZ[k[֯;7/3CH~~ۻsg';T،Eu<͍{@&X,d07jG> ~8 M ױ~8HnF\ ?+ʃx&7xV.n,q cxx:N`:nyz>&h27SL=x!бW.b.f1gYl7Ԣ\ʋsi#󸹌?,f!7t\:^]cKt Tf[t ت2t x5Kqauձ)1Ɵo"״/sՁdX2G7PŢHsS<6 Dij4O"p24:x(6.B8Bns2֔.FOu)"=Pxt#/ѷhK9FDzFO m Җ5ћ́H$C˝7"FڂڸM,UP$'N+#ȩ'f(l_ , ӊwf9xn/D[hN/S*ކsD]{FYEkt,h̴o#'BFR1U^f2A,Dmf֬{ڜt_;)/u7LIxM|Jc-Ѧ}E }i$;m8%^D3mus O$@[qΝ}'}l%iJfo,%tZ@UQE"ˈ1!meҫ {w{0,SFzb$if~+; R":5f|d$l 2O] FPh";Xʖ :p粍EEW!eX|F$Bd^mHK8hjp[)$<5`[K˚zV9?;[Mv3)rHޫ)[D@Cֱx[XU}SbyE^) :)Ven[بkE]j\dV1(l EZMHkQ -kS2c%kg:? в2!O3 \=m-?AW*tCQy IX46#@tЖh T=ЅWjXlm{, ,h2( #gyo ^Š;a'zA5@3"2zր-Հi 2ee`'|πE 6&fN3(t 8Ɯ"zDsˆȨiۄJЙP47]+Omn|'o#~`@7܇pZFMtO3ArF_LۨKF@(fR00ɨH2h*&eðۀG9 ܼ CÍ <M;πࠁ9<B-X--5al &([js Yi4gx"s3߅W LddJ6NxJ)RPG@P12\U3\}KzH4ކ:"2s:e\kX6j?+z xDpw BWx_i9;M5JPhjBYr+\! t}͝;g.W 8@>{8d&s@ $)PrsA)E G̓fڤc32?ZIִ "ӕYg)Y7:kl3XII]S%D;Aku2()Ti,RQ=U5STaDKL5̡=꼟hSQK^] ~à-<r?VdKP6tmh>_yr==DE4kMGH>k\H{W|5_<.Ýisy@4۾f9j4]6A>\e9{N~#NJ"Vy"UGݿ=8hpbnD6#.vsUN(TLqD~rs,dH*iU"yE rb`p1(^};OaP.0/]0[J.(pm󞡆RN|7yxwt .ōNe#"GE,O#[Itw$IPe`.t#!=l QEʳ=JIB~Y\EHWԺG wC6>(&bwQκW?ķ!bҸ6^> ˖"Yz[ VW۸]gq{SQ#oЀwv+v+rj="A#PG#e84C 3-?#hC;Vp?P l#_/ ؁0 ޥĒ |xFfP\ Vx_8CLYCp+OPb*^@sKBP[Di#-zIsf|; @~xjy 0.N8-"uʽw%;`qBu+9 :pO B6§N]1گRA潰 f<6PMu~nO)rIT*?3άzZU)h:$+9fʙN,n%nC;Plb,> 62ő4Dm7ms?$7\=uC,0o@KiK5l w[h:?S9[#ٕ)~ޅX(y/õ Rd.zfTZUwKb]p8e Y<aH5o̥Zt`@T%֩boH"W'WZjR[ a? z V̻pdsK,;WR8?jk$"Rl=ʹ{[l38$g:Ol/~^'MĪ4JKG=x6O)MCi`waxGp80OB| ׉?S _cKxB|?E/xM k>4ԴtkX8R-4/N qV h|V1m0> 5цaQx\Z5U; yR)kH.Bp$;RR(8)H? {PA#'rV6}}vȷV8%Cj{m yXc֮ԡvuƥ>#X{ܬ ݏZ:l+dO}7/v%=-Z jWCjp.pF:\Vj7u-^ ݑ?7:s#<"۷Igؿ r.e2mI{u~S'm3FiwB RMb;̧ #8Xz§]=>kֽߺg$8͓8ٷ3lIWd&YL5!v*WO|oӴ=0p= ghO]މWXRV<ПC9<۹yaL_߹>OUwH;5lYyr4]#8(Y@kpn3a;%ɹl\ɅJI3}\H@;gP*?Vp+Si+\k7ժc6'!L0k{J_Wf,+m+RwIqԱSUшcߏmTqUn~mgw oq{Q1_>3X!r?Ndy/"6#&bLM"_|+eX ,s|I^=7+6W2:ǘY@K)O7V)Io#a@W/L$<7I7XN!/=2U_e|_ϊrmƻE9K5EJѦ}׹9]zXz'! ʟC /LΑB|_b> "?_Ow_+`Q L4h0ܞ$e>BX`Bj?ʠ ٱpP S~/)_PK ?:s4*java_cup/runtime/virtual_parse_stack.classT]oE=o|8M6^5M@R $`0-`J`6l޵ֳ> /~R)q$"AߐQ;Gܙ{9s@ WQ1 ī:Z g8nJ4dnxoJs'1*;I+^K cnŇKrk!=x~ DHvLXgn_9^󀼾=3ej>C,#)Thb9Tj.歶RY tX[v٠OpPURUA:NgP&Q !pZ^3ΰ\<5UZ` %B2oR^fa}0K i 5 >B(1L Ed䁁5YdWpaޤ^&kR]0}T]F38 oʆKgviD#6K"R3<װL~@M8_SoS-;*--Jct+(c!s%RR[M>hgG)𡣍It!G} M|6r">two[хo ~K5{Cr\W"I郖뇮~8~>ԃtoJҸA%5I/PK ?: AMETA-INF/PK ?:ngw+META-INF/MANIFEST.MFPK ?:AJFlex/PK ?:AJFlex/anttask/PK ?: AJFlex/gui/PK ?: A<JFlex/tests/PK ?: Afjava_cup/PK ?:Ajava_cup/runtime/PK ?:O JFlex/Action.classPK ?:ա)^ JFlex/CUP$LexParse$actions.classPK ?: 1JFlex/CharClassException.classPK ?:{;G3JFlex/CharClassInterval.classPK ?:;.W yN5JFlex/CharClasses.classPK ?:惴?JFlex/CharSet.classPK ?:0DJFlex/CharSetEnumerator.classPK ?:j zGJFlex/CountEmitter.classPK ?:9)-F\3_LJFlex/DFA.classPK ?: QsjJFlex/EOFActions.classPK ?:џCnJFlex/Emitter.classPK ?:% }JFlex/ErrorMessages.classPK ?:ycJFlex/GeneratorException.classPK ?:$ġ:;JFlex/HiLowEmitter.classPK ?:7WM JFlex/IntCharSet.classPK ?:41@JFlex/IntPair.classPK ?:8o]JFlex/Interval.classPK ?:ȗz)lJFlex/LexParse.classPK ?:]?$JFlex/LexScan$ZzFlexStreamInfo.classPK ?:FY`JFlex/LexScan.classPK ?:{!KJFlex/LexicalStates.classPK ?:}?NJFlex/MacroException.classPK ?:jy OJFlex/Macros.classPK ?:fn(VJFlex/Main.classPK ?:ӧgJFlex/Messages.propertiesPK ?:96K!Q>nJFlex/NFA.classPK ?:&u7JFlex/Options.classPK ?: Itx ^OJFlex/Out.classPK ?:{ eJFlex/PackEmitter.classPK ?:RhfJFlex/RegExp.classPK ?:j6AJFlex/RegExp1.classPK ?:zl3OJFlex/RegExp2.classPK ?: ˢ:JFlex/RegExps.classPK ?:{cJFlex/ScannerException.classPK ?:e[72 GJFlex/SemCheck.classPK ?::BFJFlex/SilentExit.classPK ?:Ցy JFlex/Skeleton.classPK ?:.ȡ2JFlex/StatePairList.classPK ?:2 "Ϙ |RJFlex/StateSet.classPK ?:ޙJFlex/StateSetEnumerator.classPK ?:aJFlex/StdOutWriter.classPK ?:7JFlex/Timer.classPK ?:r%Ȑ /JFlex/anttask/JFlexTask.classPK ?:)O@JFlex/gui/GeneratorThread.classPK ?:HC7Lt 6JFlex/gui/GridPanel.classPK ?:i"N{#JFlex/gui/GridPanelConstraint.classPK ?:}tJFlex/gui/Handles.classPK ?:b6N!=fJFlex/tests/PackEmitterTest.classPK ?:b@6vjJFlex/tests/RegExpTests.classPK ?:-mJFlex/tests/SkeletonTest.classPK ?:  9pjava_cup/runtime/ComplexSymbolFactory$ComplexSymbol.classPK ?:XHn4aujava_cup/runtime/ComplexSymbolFactory$Location.classPK ?:uEO +!xjava_cup/runtime/ComplexSymbolFactory.classPK ?:{eMS+G{java_cup/runtime/DefaultSymbolFactory.classPK ?:5z3~java_cup/runtime/Scanner.classPK ?:l|7,java_cup/runtime/Symbol.classPK ?:<$wjava_cup/runtime/SymbolFactory.classPK ?:8QV(/ }java_cup/runtime/lr_parser.classPK ?:s4*java_cup/runtime/virtual_parse_stack.classPKccŸjflex-1.4.3/lib/jflex.vim0000644000175000017500000001356207670613570013746 0ustar moonmoon" Vim syntax file " Language: JFlex " Maintainer: Gerwin Klein " Last Change: $Revision: 50 $, $Date: 2003-06-08 21:01:12 +1000 (Sun, 08 Jun 2003) $ " Thanks to Michael Brailsford for help and suggestions " Quit when a syntax file was already loaded {{{ if exists("b:current_syntax") finish endif "}}} " Include java syntax {{{ if version >= 600 runtime! syntax/java.vim unlet b:current_syntax else so $VIMRUNTIME/syntax/java.vim endif "}}} syn cluster jflexOptions contains=jflexOption,jflexCodeInclude,jflexComment,jflexMacroIdent,jflexMacroRegExp,jflexOptionError syn cluster jflexRules contains=jflexRule,jflexComment,jflexActionCode,jflexRuleStates,jflexRegExp " java code section syn region jflexStart start="/\*\|//\|import\|package\|class"me=s end="^%%"me=e-2 contains=@javaTop nextgroup=jflexOptionReg " %% " options syn region jflexOptionReg matchgroup=jflexSectionSep start="^%%" end="^%%"me=e-2 contains=@jflexOptions nextgroup=jflexRulesReg syn match jflexOptionError "%\i*" contained syn match jflexOption "^\(%s\|%x\)" contained syn match jflexOption "^%state" contained syn match jflexOption "^%states" contained syn match jflexOption "^%xstate" contained syn match jflexOption "^%xstates" contained syn match jflexOption "^%char" contained syn match jflexOption "^%line" contained syn match jflexOption "^%column" contained syn match jflexOption "^%byaccj" contained syn match jflexOption "^%cup" contained syn match jflexOption "^%cupsym" contained syn match jflexOption "^%cupdebug" contained syn match jflexOption "^%eofclose" contained syn match jflexOption "^%class" contained syn match jflexOption "^%function" contained syn match jflexOption "^%type" contained syn match jflexOption "^%integer" contained syn match jflexOption "^%int" contained syn match jflexOption "^%intwrap" contained syn match jflexOption "^%yyeof" contained syn match jflexOption "^%notunix" contained syn match jflexOption "^%7bit" contained syn match jflexOption "^%8bit" contained syn match jflexOption "^%full" contained syn match jflexOption "^%16bit" contained syn match jflexOption "^%unicode" contained syn match jflexOption "^%caseless" contained syn match jflexOption "^%ignorecase" contained syn match jflexOption "^%implements" contained syn match jflexOption "^%extends" contained syn match jflexOption "^%public" contained syn match jflexOption "^%apiprivate" contained syn match jflexOption "^%final" contained syn match jflexOption "^%abstract" contained syn match jflexOption "^%debug" contained syn match jflexOption "^%standalone" contained syn match jflexOption "^%switch" contained syn match jflexOption "^%table" contained syn match jflexOption "^%pack" contained syn match jflexOption "^%include" contained syn match jflexOption "^%buffer" contained syn match jflexOption "^%initthrow" contained syn match jflexOption "^%eofthrow" contained syn match jflexOption "^%yylexthrow" contained syn match jflexOption "^%throws" contained syn match jflexOption "^%scannerror" contained syn match jflexMacroIdent "\I\i*\s*="me=e-1 contained nextgroup=jflexMacroRegExp syn region jflexMacroRegExp matchgroup=jflexOperator start="=" end="^\(%\|\I\|\i\|/\)"me=e-1 contains=NONE contained syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%{" end="^%}" contains=@javaTop contained syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%init{" end="^%init}" contains=@javaTop contained syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%initthrow{" end="^%initthrow}" contains=@javaTop contained syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eof{" end="^%eof}" contains=@javaTop contained syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eofthrow{" end="^%eofthrow}" contains=@javaTop contained syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%yylexthrow{" end="^%yylexthrow}" contains=@javaTop contained syn region jflexCodeInclude matchgroup=jflexCodeIncludeMark start="^%eofval{" end="^%eofval}" contains=@javaTop contained " rules (end pattern shouldn't occur, if it does anyway we just stay in jflexRulesReg) syn region jflexRulesReg matchgroup=jflexSectionSep start="^%%" end="^%%"me=e-2 contains=@jflexRules " at first everything but strings is a regexp syn match jflexRegExp "\([^\" \t]\|\\\"\)\+" contained " take out comments syn match jflexComment "//.*" contained syn region jflexComment start="/\*" end="\*/" contained contains=jflexComment " lex states syn match jflexRuleStates "<\s*\I\i*\(\s*,\s*\I\i*\)*\s*>" contained skipnl skipwhite nextgroup=jflexStateGroup " action code (only after states braces and macro use) syn region jflexActionCode matchgroup=Delimiter start="{" end="}" contained contains=@javaTop,jflexJavaBraces " macro use syn match jflexRegExp "{\s*\I\i*\s*}" contained " state braces (only active after ) syn region jflexStateGroup matchgroup=jflexRuleStates start="{$" start="{\s" end="}" contained contains=@jflexRules " string syn region jflexRegExp matchgroup=String start=+"+ skip=+\\\\\|\\"+ end=+"+ contained " not to be confused with a state syn match jflexRegExp "<>" contained " escape sequence syn match jflexRegExp "\\." contained " keep braces in actions balanced syn region jflexJavaBraces start="{" end="}" contained contains=@javaTop,jflexJavaBraces " syncing syn sync clear syn sync minlines=10 syn sync match jflexSync grouphere jflexOptionReg "^%[a-z]" syn sync match jflexSync grouphere jflexRulesReg "^<" " highlighting hi link jflexOption Special hi link jflexMacroIdent Ident hi link jflexMacroRegExp Macro hi link jflexOptionError Error hi link jflexComment Comment hi link jflexOperator Operator hi link jflexRuleStates Special hi link jflexRegExp Function hi jflexSectionSep guifg=yellow ctermfg=yellow guibg=blue ctermbg=blue gui=bold cterm=bold hi link jflexCodeIncludeMark jflexSectionSep let b:current_syntax="jflex" jflex-1.4.3/src/0000755000175000017500000000000011141044624012115 5ustar moonmoonjflex-1.4.3/src/build.xml0000644000175000017500000001020511017215650013735 0ustar moonmoon jflex-1.4.3/src/changelog0000644000175000017500000003240511141005161013764 0ustar moonmoon* JFlex 1.4.3 (Jan 31, 2009) - fixed bug #2018299 (lookahead syntax error) - fixed bug #2010261 (min_int in Java example scanner) - fixed bug #2007221 (zzEOFDone not reset in yyreset(Reader)) - fixed bug #1999301 (%type and %int at the same time should produce error msg) * JFlex 1.4.2 (May 27, 2008) - implemented feature request #1212181: Now supports generics syntax for %type, %extends, etc - implemented feature request #1762500: Provided %ctorarg option to add arguments to constructor - fixed bug #1464525 (Reader.read might return 0) - fixed bug #1968897 (Ambiguous error message in macro expansion) - fixed bug #1832973 (Syntax error in input may cause NullPointerException) - fixed bug #1629920 (Need to defend against path blanks in jflex bash script) - fixed bug #1540228 (EOF actions may be ignored for same lex state) - fixed bug #1498726 (syntax error in generated ZZ_CMAP) - fixed bug #1282840 (lookahead and "|" actions) - fixed bug #1164852 (yytext() longer than expected with lookahead) - fixed bug #1065521 (OS/2 Java 1.1.8 Issues) - fixed bug #421495 (dangerous lookahead check may fail) * JFlex 1.4.1 (November 7, 2004) - merged in patch by Don Brown (fixes #1049791 Uses Old JUnit method assertFalse) - merged in patch by Don Brown (fixes #887821 buffer expansion bug in yy_refill()) Thanks to Binesh Bannerjee for providing a simpler test case for this problem. - fixed bug #1035407 (ArrayIndexOutOfBounds in IntCharSet) - fixed bug #1003569 (Cannot use lookahead with ignorecase) - converted dangerous lookahead error to warning - print info for EOF actions as well in %debug mode - fixed line number count for EOF actions - internal: removed unused methods in LexScan.flex and IntCharSet * JFlex 1.4 (April 12, 2004) - new, very fast minimization algorithm (also fixes memory issues) - new --jlex option for strict compatibility to JLex. Currently it changes %ignorecase to JLex semantics, that is, character classes are interpreted in a caseless way, too. (fixes bus #751757, %ignorecase ignored by char classes). Thanks to Edward D. Willink for spotting the incompatibility. - support for even larger scanners (up to 64K DFA states). Thanks to Karin Vespoor. - removed eclipse compiler warnings for generated classes (feature request #778747) - implemented faster character classes (feature request #604589). Expressions like [a-z] | [A-Z] are interpreted as one atomic class [a-zA-Z], reducing NFA states and generation time significantly for some specifications. This affects the generation process only, generated scanners remain the same. - new %apiprivate switch (feature request #513500/1) that causes all generated and skeleton methods to be made private. Exceptions to this are user defined functions and the constructor. Thanks to Stephen Ostermiller for the suggestion. - allow user defined javadoc class comments (feature request #513500/2) If the user code section ends with a javadoc comment, JFlex takes this instead of the generated comment. Thanks to Stephen Ostermiller for the suggestion. - fixed bug #491095 (undefined macros in complement expressions do not throw exception in generator). Thanks to Stephen Ostermiller for the bug report. - fixed bug #495422 (yypushStream/yypopStream in skeleton.nested work as advertised) - fixed bug #611118 (no wrong macro warnings on regexp negation) - fixed bug #655528 (%cupsym now also affects %cupdebug) Thanks to Eric Schweitz for the fix. - fixed bug #510010 (single-line %initthrow works now in case of extra whitespace before newline) - yyreset() does no longer close the associated reader (use yyclose() explicitly for that). Makes some reader objects reusable (feature request #513492). Thanks to Stephen Ostermiller for the suggestion. - fixed modifier order in generated code, removes jikes compiler warnings Thanks to Michael Wildpaner for the fix. - ant task now also works with ant >= 1.4 (fixes bug #526905) - yyreset() does not declare an execption any more (fixes bug #913132) - %cup does not include %eofclose in JLex mode (--jlex). (Fixes bug #910562) - optional parameter to %eofclose: "%eofclose false" turns off %eofclose if it was turned on previously (e.g. by %cup). (Fixes bug #910562) - jflex build script switched to ant - internal: central Options class for better integration with build tools and IDEs - internal: change naming scheme for generated internal variables from yy_ to zz to comply with Java naming standard. Thanks to Max Gilead for the patch. * JFlex 1.3.5 (October 8, 2001) - fixed all bugs reported for version 1.3.4. Thanks to Amin Ahmad and Fred Wehrhahn for their excellent bug reports. - implemented feature request #459014: vim syntax file. Thanks to Michael Brailsford for his help and suggestions. - JFlex should run with JDK 1.1 out-of-the-box again. * JFlex 1.3.4 (October 1, 2001) - fixed all bugs reported for version 1.3.3. Thanks to Mike Akerman for his excellent bug reports and his help. - implemented feature request #459355: exclusive start states. Thanks to Ed Beroset for the suggestion. - introduced %s and %x shorthands for state declarations * JFlex 1.3.3 (September 21, 2001) - fixed all reported bugs except #39 (lookahead check at generation time may fail). Thanks to Axel Schwolow, Karl Meissner, Angelo Borsotti, and Paolo Di Francesco for their excellent bug reports. - enhanced %debug output. JFlex scanners in debug mode now print line, column, matched text, and executed action (with line number in spec) for each processed token. Thanks to Karl Meissner for the suggestion. - introduced %cupdebug directive for readable CUP debugging. Generated scanners print line, column, matched text, and CUP symbol name for each returned token. Again thanks to Karl Meissner for tips and contributed Java reflection code. - new %cupsym to customize CUP generated symbols class name. Thanks to Karl Meissner and Paolo Di Francesco. - new %throws as shorthand for %yylexthrow - code generation now customizable at command line with --table, --pack, and --switch - command line switch --info prints system and JVM information (useful for bug reports) - command line switch --nobak for not generating backup files - an Ant task for the Ant build tool http://jakarta.apache.org/ant/ contributed by Rafal Mantiuk. Many thanks to him. - better error message for missing ] in char class. Thanks to Karl Meissner. - performance enhancements in the runtime system. The engine is now 10%-50% faster. These are only the first implementations of a few of the many suggestions from Angelo Borsotti. Thanks to Angelo for many insights, tips, and fruitful discussions. - a new warning if a rule can never be matched - macros and regular expression can now span multiple lines (note that | at the end of a line in a rule is a special action, not the | operator) - updated the manual to contain more information about the generated class, clarified the description of lexical states. Thanks to Michael Binz, Angelo Borsotti, Vasily Karyaev and for the suggestions. - Simplified java example lexer, and allow // style comments at EOF. Thanks to Thomas Mulcahy. - Byacc/J example updated to version 1.1 - New interpreter example using CUP. Thanks to Bernhard Rumpe for the code. * JFlex 1.3.2 (February 24, 2001) - fixed bug #32 (this time for real). Thanks to Thilo Goetz for his quick report. - updated the binary scanning example with the more comprehensive and usable class StraightStreamReader by Stephen Ostermiller. Thanks go to him for his contribution. The original version of this class is at http://www.smo.f2s.com/utils/ - added a link to a Japanese translation of the JFlex manual (it's in Japanese Shift_JIS encoding). The translation is for an older release (1.1.2), but most of the text still applies to the current version. See the change log for the differences between 1.1.2 and the current version. Many thanks to Yuichi Nakajima, Yukio Ikeda, Katsuhiko Yamazaki, and Koji Ooya for their efforts. If you would like to translate the JFlex manual into another language, or if you already have done so, please let me know. I will include a link to it on the documentation page. I can also give you access to the latex sources of the manual, so that printable versions of your translation can be generated, too. * JFlex 1.3.1 (February 20, 2001) - fixed all JFlex bugs reported for 1.3 (bugs #32-#36) Thanks to Hans Kratz, Vasily Karyaev, Alexey Yakovets, and Tom Moog for their excellent reports. - added two new example scanners: . a demonstration how to scan binary files . a small calculator example for Cup, based on the example in the Linux Gazette by Richard A. Sevenich and Christopher Lopes. See also http://www.linuxgazette.com/issue39/sevenich.html http://www.linuxgazette.com/issue41/sevenich.html http://www.linuxgazette.com/issue41/lopes/lopes.html - manual section about encodings, platforms and Unicode. Thanks to Stephen Ostermiller for his valuable input. - switch for skipping the minimization step in DFA generation (--nomin). This feature is still in alpha status and not yet extensively tested. It might be useful when you have very large scanners and not much memory available. - switch for generating graphviz dot files for graphical representation (ps or gif) of generated NFA, DFA and minimized DFA (--dot). Might be useful for teaching. This feature is also still in alpha status and not fully finished yet. It is included as preview, comments are welcome, please try it out and tell me what you think. For information on graphviz see http://www.research.att.com:80/sw/tools/graphviz/ - changed to --style long command line switches (single - still recognized). - moved part of the project to http://sourceforge.net/projects/jflex/ * JFlex 1.3 (October 21, 2000) - Fixed all bugs reported for 1.2.2 (bugs #23-#27). - Better start script for Linux. - Customize for internal error handling in yy_ScanError. - Empty charclass [], and any (=negated empty) charclass [^]. - New negation operator ! for regexps. - New upto operator ~ for regexps. - Customizable buffer size (%buffer). - New char yycharat(int) for efficient access to single characters in matched text. - Split up of too large lex tables for even larger scanner sizes. - New additional external skeleton with support for nested input streams. - JLex compatibility: BOL ^ and EOL $ use unicode line separators as in http://www.unicode.org/unicode/reports/tr18/tr18-5.1.html. - New resetStream method for reusing scanner objects. _ BYacc/J support (%byaccj) + BYacc/J example. - Include files in lexer specs (%include). - New --dump switch for a dump of the generated charclasses, NFA, DFA, and minimized DFA tables. * JFlex 1.2.2 (August 23, 1999) - Updated JFlex to the new CUP version 0.10j. - Eliminated some remaining platform dependent newlines in the generated source code (affecting the readabilty of the generated code only, no functional changes). - Minor improvements in error reporting (out of memory). - Added a --version command line option for printing the current jflex version. - Updated the Java 1.2 lexer/parser example to CUP 0.10j. * JFlex 1.2.1 (June 25, 1999) - Fixed all bugs reported for version 1.2 (#19-#22). - Webpage redesigned and moved to http://www.jflex.de. - Example java lexer/parser switched to Java 1.2. * JFlex 1.2 (March 21, 1999) - Fixed all bugs for 1.1.2. - JFlex now works again with Solaris JIT. - Significant Unicode optimizations in scanning and generation performance, - changed the empty string match wrt. EOF behavior to the one that is commonly expected. - added command line switches for more customization - external skeleton files - new GUI without any console output - <> as in lex/flex - better error messages - better generation speed - better generation memory efficiency - | Action, trailing context (/ operator) - new %final, %abstract and %extends directives - uses jar file - included makefile for JFlex, - %pack now uses string packing, - %pack now default code generation method, - new %switch directive for old default code generation method, - more convenient declaration of exceptions, - new %int switch, - manual now written in latex, available as html and in printable .ps.gz and pdf file formats. * JFlex 1.1.2 - All bugs reported for version 1.1.1 (#8-#10) have been fixed. * JFlex 1.1.1 - All bugs reported for version 1.1 (i.e. bug #7 and feature request #6) have been fixed. - Scanning speed was optimized further. * JFlex 1.1 adds new features and fixes all known bugs of 1.0 - Revised directory structure. - Fixed all reported bugs (#1-#5 and some unreported ones). - Fixed thousands of typos in the manual. - whitespace characters in regular expressions, - flex style repeat expressions, - %caseless switch, - %eofclose switch, - method for closing the input stream, - method for the current lexical state, - method for rereading matched text, - backup of files that are overwitten in the generation process, - improved error reporting, - graphical UI when no filename is provided on the commandline * JFlex 1.0 (May 1998) was the first public release of JFlex. It was developed using Sun's JDK 1.1, JFlex (bootstrapped) and the parser generator CUP jflex-1.4.3/src/java_cup/0000755000175000017500000000000011141044623013704 5ustar moonmoonjflex-1.4.3/src/java_cup/runtime/0000755000175000017500000000000011141044624015370 5ustar moonmoonjflex-1.4.3/src/java_cup/runtime/ComplexSymbolFactory.java0000644000175000017500000000762711017215650022375 0ustar moonmoonpackage java_cup.runtime; /** * Default Implementation for SymbolFactory, creates * plain old Symbols * * @version last updated 27-03-2006 * @author Michael Petter */ /* ************************************************* class DefaultSymbolFactory interface for creating new symbols ***************************************************/ public class ComplexSymbolFactory implements SymbolFactory{ public static class Location { private String unit="unknown"; private int line, column; public Location(String unit, int line, int column){ this.unit=unit; this.line=line; this.column=column; } public Location(int line, int column){ this.line=line; this.column=column; } public String toString(){ return unit+":"+line+"/"+column; } public int getColumn(){ return column; } public int getLine(){ return line; } public String getUnit(){ return unit; } } /** * ComplexSymbol with detailed Location Informations and a Name */ public static class ComplexSymbol extends Symbol { protected String name; protected Location xleft,xright; public ComplexSymbol(String name, int id) { super(id); this.name=name; } public ComplexSymbol(String name, int id, Object value) { super(id,value); this.name=name; } public String toString(){ if (xleft==null || xright==null) return "Symbol: "+name; return "Symbol: "+name+" ("+xleft+" - "+xright+")"; } public ComplexSymbol(String name, int id, int state) { super(id,state); this.name=name; } public ComplexSymbol(String name, int id, Symbol left, Symbol right) { super(id,left,right); this.name=name; if (left!=null) this.xleft = ((ComplexSymbol)left).xleft; if (right!=null) this.xright= ((ComplexSymbol)right).xright; } public ComplexSymbol(String name, int id, Location left, Location right) { super(id); this.name=name; this.xleft=left; this.xright=right; } public ComplexSymbol(String name, int id, Symbol left, Symbol right, Object value) { super(id,value); this.name=name; if (left!=null) this.xleft = ((ComplexSymbol)left).xleft; if (right!=null) this.xright= ((ComplexSymbol)right).xright; } public ComplexSymbol(String name, int id, Location left, Location right, Object value) { super(id,value); this.name=name; this.xleft=left; this.xright=right; } public Location getLeft(){ return xleft; } public Location getRight(){ return xright; } } // Factory methods public Symbol newSymbol(String name, int id, Location left, Location right, Object value){ return new ComplexSymbol(name,id,left,right,value); } public Symbol newSymbol(String name, int id, Location left, Location right){ return new ComplexSymbol(name,id,left,right); } public Symbol newSymbol(String name, int id, Symbol left, Symbol right, Object value){ return new ComplexSymbol(name,id,left,right,value); } public Symbol newSymbol(String name, int id, Symbol left, Symbol right){ return new ComplexSymbol(name,id,left,right); } public Symbol newSymbol(String name, int id){ return new ComplexSymbol(name,id); } public Symbol newSymbol(String name, int id, Object value){ return new ComplexSymbol(name,id,value); } public Symbol startSymbol(String name, int id, int state){ return new ComplexSymbol(name,id,state); } } jflex-1.4.3/src/java_cup/runtime/DefaultSymbolFactory.java0000644000175000017500000000334211017215650022340 0ustar moonmoonpackage java_cup.runtime; /** * Default Implementation for SymbolFactory, creates * plain old Symbols * * @version last updated 27-03-2006 * @author Michael Petter */ /* ************************************************* class DefaultSymbolFactory interface for creating new symbols ***************************************************/ public class DefaultSymbolFactory implements SymbolFactory{ // Factory methods /** * DefaultSymbolFactory for CUP. * Users are strongly encoraged to use ComplexSymbolFactory instead, since * it offers more detailed information about Symbols in source code. * Yet since migrating has always been a critical process, You have the * chance of still using the oldstyle Symbols. * * @deprecated as of CUP v11a * replaced by the new java_cup.runtime.ComplexSymbolFactory */ //@deprecated public DefaultSymbolFactory(){ } public Symbol newSymbol(String name ,int id, Symbol left, Symbol right, Object value){ return new Symbol(id,left,right,value); } public Symbol newSymbol(String name, int id, Symbol left, Symbol right){ return new Symbol(id,left,right); } public Symbol newSymbol(String name, int id, int left, int right, Object value){ return new Symbol(id,left,right,value); } public Symbol newSymbol(String name, int id, int left, int right){ return new Symbol(id,left,right); } public Symbol startSymbol(String name, int id, int state){ return new Symbol(id,state); } public Symbol newSymbol(String name, int id){ return new Symbol(id); } public Symbol newSymbol(String name, int id, Object value){ return new Symbol(id,value); } } jflex-1.4.3/src/java_cup/runtime/lr_parser.java0000644000175000017500000012742611017215650020241 0ustar moonmoon package java_cup.runtime; import java.util.Stack; /** This class implements a skeleton table driven LR parser. In general, * LR parsers are a form of bottom up shift-reduce parsers. Shift-reduce * parsers act by shifting input onto a parse stack until the Symbols * matching the right hand side of a production appear on the top of the * stack. Once this occurs, a reduce is performed. This involves removing * the Symbols corresponding to the right hand side of the production * (the so called "handle") and replacing them with the non-terminal from * the left hand side of the production.

* * To control the decision of whether to shift or reduce at any given point, * the parser uses a state machine (the "viable prefix recognition machine" * built by the parser generator). The current state of the machine is placed * on top of the parse stack (stored as part of a Symbol object representing * a terminal or non terminal). The parse action table is consulted * (using the current state and the current lookahead Symbol as indexes) to * determine whether to shift or to reduce. When the parser shifts, it * changes to a new state by pushing a new Symbol (containing a new state) * onto the stack. When the parser reduces, it pops the handle (right hand * side of a production) off the stack. This leaves the parser in the state * it was in before any of those Symbols were matched. Next the reduce-goto * table is consulted (using the new state and current lookahead Symbol as * indexes) to determine a new state to go to. The parser then shifts to * this goto state by pushing the left hand side Symbol of the production * (also containing the new state) onto the stack.

* * This class actually provides four LR parsers. The methods parse() and * debug_parse() provide two versions of the main parser (the only difference * being that debug_parse() emits debugging trace messages as it parses). * In addition to these main parsers, the error recovery mechanism uses two * more. One of these is used to simulate "parsing ahead" in the input * without carrying out actions (to verify that a potential error recovery * has worked), and the other is used to parse through buffered "parse ahead" * input in order to execute all actions and re-synchronize the actual parser * configuration.

* * This is an abstract class which is normally filled out by a subclass * generated by the JavaCup parser generator. In addition to supplying * the actual parse tables, generated code also supplies methods which * invoke various pieces of user supplied code, provide access to certain * special Symbols (e.g., EOF and error), etc. Specifically, the following * abstract methods are normally supplied by generated code: *

*
short[][] production_table() *
Provides a reference to the production table (indicating the index of * the left hand side non terminal and the length of the right hand side * for each production in the grammar). *
short[][] action_table() *
Provides a reference to the parse action table. *
short[][] reduce_table() *
Provides a reference to the reduce-goto table. *
int start_state() *
Indicates the index of the start state. *
int start_production() *
Indicates the index of the starting production. *
int EOF_sym() *
Indicates the index of the EOF Symbol. *
int error_sym() *
Indicates the index of the error Symbol. *
Symbol do_action() *
Executes a piece of user supplied action code. This always comes at * the point of a reduce in the parse, so this code also allocates and * fills in the left hand side non terminal Symbol object that is to be * pushed onto the stack for the reduce. *
void init_actions() *
Code to initialize a special object that encapsulates user supplied * actions (this object is used by do_action() to actually carry out the * actions). *
* * In addition to these routines that must be supplied by the * generated subclass there are also a series of routines that may * be supplied. These include: *
*
Symbol scan() *
Used to get the next input Symbol from the scanner. *
Scanner getScanner() *
Used to provide a scanner for the default implementation of * scan(). *
int error_sync_size() *
This determines how many Symbols past the point of an error * must be parsed without error in order to consider a recovery to * be valid. This defaults to 3. Values less than 2 are not * recommended. *
void report_error(String message, Object info) *
This method is called to report an error. The default implementation * simply prints a message to System.err and where the error occurred. * This method is often replaced in order to provide a more sophisticated * error reporting mechanism. *
void report_fatal_error(String message, Object info) *
This method is called when a fatal error that cannot be recovered from * is encountered. In the default implementation, it calls * report_error() to emit a message, then throws an exception. *
void syntax_error(Symbol cur_token) *
This method is called as soon as syntax error is detected (but * before recovery is attempted). In the default implementation it * invokes: report_error("Syntax error", null); *
void unrecovered_syntax_error(Symbol cur_token) *
This method is called if syntax error recovery fails. In the default * implementation it invokes:
* report_fatal_error("Couldn't repair and continue parse", null); *
* * @see java_cup.runtime.Symbol * @see java_cup.runtime.Symbol * @see java_cup.runtime.virtual_parse_stack * @version last updated: 7/3/96 * @author Frank Flannery */ public abstract class lr_parser { /*-----------------------------------------------------------*/ /*--- Constructor(s) ----------------------------------------*/ /*-----------------------------------------------------------*/ /** * Simple constructor. */ public lr_parser() { } /** * Constructor that sets the default scanner. [CSA/davidm] */ public lr_parser(Scanner s) { this(s,new DefaultSymbolFactory()); // TUM 20060327 old cup v10 Symbols as default } /** * Constructor that sets the default scanner and a SymbolFactory */ public lr_parser(Scanner s, SymbolFactory symfac) { this(); // in case default constructor someday does something symbolFactory = symfac; setScanner(s); } public SymbolFactory symbolFactory;// = new DefaultSymbolFactory(); /** * Whenever creation of a new Symbol is necessary, one should use this factory. */ public SymbolFactory getSymbolFactory(){ return symbolFactory; } /*-----------------------------------------------------------*/ /*--- (Access to) Static (Class) Variables ------------------*/ /*-----------------------------------------------------------*/ /** The default number of Symbols after an error we much match to consider * it recovered from. */ protected final static int _error_sync_size = 3; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The number of Symbols after an error we much match to consider it * recovered from. */ protected int error_sync_size() {return _error_sync_size; } /*-----------------------------------------------------------*/ /*--- (Access to) Instance Variables ------------------------*/ /*-----------------------------------------------------------*/ /** Table of production information (supplied by generated subclass). * This table contains one entry per production and is indexed by * the negative-encoded values (reduce actions) in the action_table. * Each entry has two parts, the index of the non-terminal on the * left hand side of the production, and the number of Symbols * on the right hand side. */ public abstract short[][] production_table(); /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The action table (supplied by generated subclass). This table is * indexed by state and terminal number indicating what action is to * be taken when the parser is in the given state (i.e., the given state * is on top of the stack) and the given terminal is next on the input. * States are indexed using the first dimension, however, the entries for * a given state are compacted and stored in adjacent index, value pairs * which are searched for rather than accessed directly (see get_action()). * The actions stored in the table will be either shifts, reduces, or * errors. Shifts are encoded as positive values (one greater than the * state shifted to). Reduces are encoded as negative values (one less * than the production reduced by). Error entries are denoted by zero. * * @see java_cup.runtime.lr_parser#get_action */ public abstract short[][] action_table(); /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The reduce-goto table (supplied by generated subclass). This * table is indexed by state and non-terminal number and contains * state numbers. States are indexed using the first dimension, however, * the entries for a given state are compacted and stored in adjacent * index, value pairs which are searched for rather than accessed * directly (see get_reduce()). When a reduce occurs, the handle * (corresponding to the RHS of the matched production) is popped off * the stack. The new top of stack indicates a state. This table is * then indexed by that state and the LHS of the reducing production to * indicate where to "shift" to. * * @see java_cup.runtime.lr_parser#get_reduce */ public abstract short[][] reduce_table(); /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The index of the start state (supplied by generated subclass). */ public abstract int start_state(); /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The index of the start production (supplied by generated subclass). */ public abstract int start_production(); /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The index of the end of file terminal Symbol (supplied by generated * subclass). */ public abstract int EOF_sym(); /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The index of the special error Symbol (supplied by generated subclass). */ public abstract int error_sym(); /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Internal flag to indicate when parser should quit. */ protected boolean _done_parsing = false; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** This method is called to indicate that the parser should quit. This is * normally called by an accept action, but can be used to cancel parsing * early in other circumstances if desired. */ public void done_parsing() { _done_parsing = true; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /* Global parse state shared by parse(), error recovery, and * debugging routines */ /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Indication of the index for top of stack (for use by actions). */ protected int tos; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The current lookahead Symbol. */ protected Symbol cur_token; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The parse stack itself. */ protected Stack stack = new Stack(); /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Direct reference to the production table. */ protected short[][] production_tab; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Direct reference to the action table. */ protected short[][] action_tab; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Direct reference to the reduce-goto table. */ protected short[][] reduce_tab; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** This is the scanner object used by the default implementation * of scan() to get Symbols. To avoid name conflicts with existing * code, this field is private. [CSA/davidm] */ private Scanner _scanner; /** * Simple accessor method to set the default scanner. */ public void setScanner(Scanner s) { _scanner = s; } /** * Simple accessor method to get the default scanner. */ public Scanner getScanner() { return _scanner; } /*-----------------------------------------------------------*/ /*--- General Methods ---------------------------------------*/ /*-----------------------------------------------------------*/ /** Perform a bit of user supplied action code (supplied by generated * subclass). Actions are indexed by an internal action number assigned * at parser generation time. * * @param act_num the internal index of the action to be performed. * @param parser the parser object we are acting for. * @param stack the parse stack of that object. * @param top the index of the top element of the parse stack. */ public abstract Symbol do_action( int act_num, lr_parser parser, Stack stack, int top) throws java.lang.Exception; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** User code for initialization inside the parser. Typically this * initializes the scanner. This is called before the parser requests * the first Symbol. Here this is just a placeholder for subclasses that * might need this and we perform no action. This method is normally * overridden by the generated code using this contents of the "init with" * clause as its body. */ public void user_init() throws java.lang.Exception { } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Initialize the action object. This is called before the parser does * any parse actions. This is filled in by generated code to create * an object that encapsulates all action code. */ protected abstract void init_actions() throws java.lang.Exception; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Get the next Symbol from the input (supplied by generated subclass). * Once end of file has been reached, all subsequent calls to scan * should return an EOF Symbol (which is Symbol number 0). By default * this method returns getScanner().next_token(); this implementation * can be overriden by the generated parser using the code declared in * the "scan with" clause. Do not recycle objects; every call to * scan() should return a fresh object. */ public Symbol scan() throws java.lang.Exception { Symbol sym = getScanner().next_token(); return (sym!=null) ? sym : getSymbolFactory().newSymbol("END_OF_FILE",EOF_sym()); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Report a fatal error. This method takes a message string and an * additional object (to be used by specializations implemented in * subclasses). Here in the base class a very simple implementation * is provided which reports the error then throws an exception. * * @param message an error message. * @param info an extra object reserved for use by specialized subclasses. */ public void report_fatal_error( String message, Object info) throws java.lang.Exception { /* stop parsing (not really necessary since we throw an exception, but) */ done_parsing(); /* use the normal error message reporting to put out the message */ report_error(message, info); /* throw an exception */ throw new Exception("Can't recover from previous error(s)"); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Report a non fatal error (or warning). This method takes a message * string and an additional object (to be used by specializations * implemented in subclasses). Here in the base class a very simple * implementation is provided which simply prints the message to * System.err. * * @param message an error message. * @param info an extra object reserved for use by specialized subclasses. */ public void report_error(String message, Object info) { System.err.print(message); System.err.flush(); if (info instanceof Symbol) if (((Symbol)info).left != -1) System.err.println(" at character " + ((Symbol)info).left + " of input"); else System.err.println(""); else System.err.println(""); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** This method is called when a syntax error has been detected and recovery * is about to be invoked. Here in the base class we just emit a * "Syntax error" error message. * * @param cur_token the current lookahead Symbol. */ public void syntax_error(Symbol cur_token) { report_error("Syntax error", cur_token); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** This method is called if it is determined that syntax error recovery * has been unsuccessful. Here in the base class we report a fatal error. * * @param cur_token the current lookahead Symbol. */ public void unrecovered_syntax_error(Symbol cur_token) throws java.lang.Exception { report_fatal_error("Couldn't repair and continue parse", cur_token); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Fetch an action from the action table. The table is broken up into * rows, one per state (rows are indexed directly by state number). * Within each row, a list of index, value pairs are given (as sequential * entries in the table), and the list is terminated by a default entry * (denoted with a Symbol index of -1). To find the proper entry in a row * we do a linear or binary search (depending on the size of the row). * * @param state the state index of the action being accessed. * @param sym the Symbol index of the action being accessed. */ protected final short get_action(int state, int sym) { short tag; int first, last, probe; short[] row = action_tab[state]; /* linear search if we are < 10 entries */ if (row.length < 20) for (probe = 0; probe < row.length; probe++) { /* is this entry labeled with our Symbol or the default? */ tag = row[probe++]; if (tag == sym || tag == -1) { /* return the next entry */ return row[probe]; } } /* otherwise binary search */ else { first = 0; last = (row.length-1)/2 - 1; /* leave out trailing default entry */ while (first <= last) { probe = (first+last)/2; if (sym == row[probe*2]) return row[probe*2+1]; else if (sym > row[probe*2]) first = probe+1; else last = probe-1; } /* not found, use the default at the end */ return row[row.length-1]; } /* shouldn't happened, but if we run off the end we return the default (error == 0) */ return 0; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Fetch a state from the reduce-goto table. The table is broken up into * rows, one per state (rows are indexed directly by state number). * Within each row, a list of index, value pairs are given (as sequential * entries in the table), and the list is terminated by a default entry * (denoted with a Symbol index of -1). To find the proper entry in a row * we do a linear search. * * @param state the state index of the entry being accessed. * @param sym the Symbol index of the entry being accessed. */ protected final short get_reduce(int state, int sym) { short tag; short[] row = reduce_tab[state]; /* if we have a null row we go with the default */ if (row == null) return -1; for (int probe = 0; probe < row.length; probe++) { /* is this entry labeled with our Symbol or the default? */ tag = row[probe++]; if (tag == sym || tag == -1) { /* return the next entry */ return row[probe]; } } /* if we run off the end we return the default (error == -1) */ return -1; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** This method provides the main parsing routine. It returns only when * done_parsing() has been called (typically because the parser has * accepted, or a fatal error has been reported). See the header * documentation for the class regarding how shift/reduce parsers operate * and how the various tables are used. */ public Symbol parse() throws java.lang.Exception { /* the current action code */ int act; /* the Symbol/stack element returned by a reduce */ Symbol lhs_sym = null; /* information about production being reduced with */ short handle_size, lhs_sym_num; /* set up direct reference to tables to drive the parser */ production_tab = production_table(); action_tab = action_table(); reduce_tab = reduce_table(); /* initialize the action encapsulation object */ init_actions(); /* do user initialization */ user_init(); /* get the first token */ cur_token = scan(); /* push dummy Symbol with start state to get us underway */ stack.removeAllElements(); stack.push(getSymbolFactory().startSymbol("START", 0, start_state())); tos = 0; /* continue until we are told to stop */ for (_done_parsing = false; !_done_parsing; ) { /* Check current token for freshness. */ if (cur_token.used_by_parser) throw new Error("Symbol recycling detected (fix your scanner)."); /* current state is always on the top of the stack */ /* look up action out of the current state with the current input */ act = get_action(((Symbol)stack.peek()).parse_state, cur_token.sym); /* decode the action -- > 0 encodes shift */ if (act > 0) { /* shift to the encoded state by pushing it on the stack */ cur_token.parse_state = act-1; cur_token.used_by_parser = true; stack.push(cur_token); tos++; /* advance to the next Symbol */ cur_token = scan(); } /* if its less than zero, then it encodes a reduce action */ else if (act < 0) { /* perform the action for the reduce */ lhs_sym = do_action((-act)-1, this, stack, tos); /* look up information about the production */ lhs_sym_num = production_tab[(-act)-1][0]; handle_size = production_tab[(-act)-1][1]; /* pop the handle off the stack */ for (int i = 0; i < handle_size; i++) { stack.pop(); tos--; } /* look up the state to go to from the one popped back to */ act = get_reduce(((Symbol)stack.peek()).parse_state, lhs_sym_num); /* shift to that state */ lhs_sym.parse_state = act; lhs_sym.used_by_parser = true; stack.push(lhs_sym); tos++; } /* finally if the entry is zero, we have an error */ else if (act == 0) { /* call user syntax error reporting routine */ syntax_error(cur_token); /* try to error recover */ if (!error_recovery(false)) { /* if that fails give up with a fatal syntax error */ unrecovered_syntax_error(cur_token); /* just in case that wasn't fatal enough, end parse */ done_parsing(); } else { lhs_sym = (Symbol)stack.peek(); } } } return lhs_sym; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Write a debugging message to System.err for the debugging version * of the parser. * * @param mess the text of the debugging message. */ public void debug_message(String mess) { System.err.println(mess); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Dump the parse stack for debugging purposes. */ public void dump_stack() { if (stack == null) { debug_message("# Stack dump requested, but stack is null"); return; } debug_message("============ Parse Stack Dump ============"); /* dump the stack */ for (int i=0; i"); if ((i%3)==2 || (i==(stack.size()-1))) { debug_message(sb.toString()); sb = new StringBuffer(" "); } } } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Perform a parse with debugging output. This does exactly the * same things as parse(), except that it calls debug_shift() and * debug_reduce() when shift and reduce moves are taken by the parser * and produces various other debugging messages. */ public Symbol debug_parse() throws java.lang.Exception { /* the current action code */ int act; /* the Symbol/stack element returned by a reduce */ Symbol lhs_sym = null; /* information about production being reduced with */ short handle_size, lhs_sym_num; /* set up direct reference to tables to drive the parser */ production_tab = production_table(); action_tab = action_table(); reduce_tab = reduce_table(); debug_message("# Initializing parser"); /* initialize the action encapsulation object */ init_actions(); /* do user initialization */ user_init(); /* the current Symbol */ cur_token = scan(); debug_message("# Current Symbol is #" + cur_token.sym); /* push dummy Symbol with start state to get us underway */ stack.removeAllElements(); stack.push(getSymbolFactory().startSymbol("START",0, start_state())); tos = 0; /* continue until we are told to stop */ for (_done_parsing = false; !_done_parsing; ) { /* Check current token for freshness. */ if (cur_token.used_by_parser) throw new Error("Symbol recycling detected (fix your scanner)."); /* current state is always on the top of the stack */ //debug_stack(); /* look up action out of the current state with the current input */ act = get_action(((Symbol)stack.peek()).parse_state, cur_token.sym); /* decode the action -- > 0 encodes shift */ if (act > 0) { /* shift to the encoded state by pushing it on the stack */ cur_token.parse_state = act-1; cur_token.used_by_parser = true; debug_shift(cur_token); stack.push(cur_token); tos++; /* advance to the next Symbol */ cur_token = scan(); debug_message("# Current token is " + cur_token); } /* if its less than zero, then it encodes a reduce action */ else if (act < 0) { /* perform the action for the reduce */ lhs_sym = do_action((-act)-1, this, stack, tos); /* look up information about the production */ lhs_sym_num = production_tab[(-act)-1][0]; handle_size = production_tab[(-act)-1][1]; debug_reduce((-act)-1, lhs_sym_num, handle_size); /* pop the handle off the stack */ for (int i = 0; i < handle_size; i++) { stack.pop(); tos--; } /* look up the state to go to from the one popped back to */ act = get_reduce(((Symbol)stack.peek()).parse_state, lhs_sym_num); debug_message("# Reduce rule: top state " + ((Symbol)stack.peek()).parse_state + ", lhs sym " + lhs_sym_num + " -> state " + act); /* shift to that state */ lhs_sym.parse_state = act; lhs_sym.used_by_parser = true; stack.push(lhs_sym); tos++; debug_message("# Goto state #" + act); } /* finally if the entry is zero, we have an error */ else if (act == 0) { /* call user syntax error reporting routine */ syntax_error(cur_token); /* try to error recover */ if (!error_recovery(true)) { /* if that fails give up with a fatal syntax error */ unrecovered_syntax_error(cur_token); /* just in case that wasn't fatal enough, end parse */ done_parsing(); } else { lhs_sym = (Symbol)stack.peek(); } } } return lhs_sym; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /* Error recovery code */ /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Attempt to recover from a syntax error. This returns false if recovery * fails, true if it succeeds. Recovery happens in 4 steps. First we * pop the parse stack down to a point at which we have a shift out * of the top-most state on the error Symbol. This represents the * initial error recovery configuration. If no such configuration is * found, then we fail. Next a small number of "lookahead" or "parse * ahead" Symbols are read into a buffer. The size of this buffer is * determined by error_sync_size() and determines how many Symbols beyond * the error must be matched to consider the recovery a success. Next, * we begin to discard Symbols in attempt to get past the point of error * to a point where we can continue parsing. After each Symbol, we attempt * to "parse ahead" though the buffered lookahead Symbols. The "parse ahead" * process simulates that actual parse, but does not modify the real * parser's configuration, nor execute any actions. If we can parse all * the stored Symbols without error, then the recovery is considered a * success. Once a successful recovery point is determined, we do an * actual parse over the stored input -- modifying the real parse * configuration and executing all actions. Finally, we return the the * normal parser to continue with the overall parse. * * @param debug should we produce debugging messages as we parse. */ protected boolean error_recovery(boolean debug) throws java.lang.Exception { if (debug) debug_message("# Attempting error recovery"); /* first pop the stack back into a state that can shift on error and do that shift (if that fails, we fail) */ if (!find_recovery_config(debug)) { if (debug) debug_message("# Error recovery fails"); return false; } /* read ahead to create lookahead we can parse multiple times */ read_lookahead(); /* repeatedly try to parse forward until we make it the required dist */ for (;;) { /* try to parse forward, if it makes it, bail out of loop */ if (debug) debug_message("# Trying to parse ahead"); if (try_parse_ahead(debug)) { break; } /* if we are now at EOF, we have failed */ if (lookahead[0].sym == EOF_sym()) { if (debug) debug_message("# Error recovery fails at EOF"); return false; } /* otherwise, we consume another Symbol and try again */ // BUG FIX by Bruce Hutton // Computer Science Department, University of Auckland, // Auckland, New Zealand. // It is the first token that is being consumed, not the one // we were up to parsing if (debug) debug_message("# Consuming Symbol #" + lookahead[ 0 ].sym); restart_lookahead(); } /* we have consumed to a point where we can parse forward */ if (debug) debug_message("# Parse-ahead ok, going back to normal parse"); /* do the real parse (including actions) across the lookahead */ parse_lookahead(debug); /* we have success */ return true; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Determine if we can shift under the special error Symbol out of the * state currently on the top of the (real) parse stack. */ protected boolean shift_under_error() { /* is there a shift under error Symbol */ return get_action(((Symbol)stack.peek()).parse_state, error_sym()) > 0; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Put the (real) parse stack into error recovery configuration by * popping the stack down to a state that can shift on the special * error Symbol, then doing the shift. If no suitable state exists on * the stack we return false * * @param debug should we produce debugging messages as we parse. */ protected boolean find_recovery_config(boolean debug) { Symbol error_token; int act; if (debug) debug_message("# Finding recovery state on stack"); /* Remember the right-position of the top symbol on the stack */ Symbol right = ((Symbol)stack.peek());// TUM 20060327 removed .right Symbol left = right;// TUM 20060327 removed .left /* pop down until we can shift under error Symbol */ while (!shift_under_error()) { /* pop the stack */ if (debug) debug_message("# Pop stack by one, state was # " + ((Symbol)stack.peek()).parse_state); left = ((Symbol)stack.pop()); // TUM 20060327 removed .left tos--; /* if we have hit bottom, we fail */ if (stack.empty()) { if (debug) debug_message("# No recovery state found on stack"); return false; } } /* state on top of the stack can shift under error, find the shift */ act = get_action(((Symbol)stack.peek()).parse_state, error_sym()); if (debug) { debug_message("# Recover state found (#" + ((Symbol)stack.peek()).parse_state + ")"); debug_message("# Shifting on error to state #" + (act-1)); } /* build and shift a special error Symbol */ error_token = getSymbolFactory().newSymbol("ERROR",error_sym(), left, right); error_token.parse_state = act-1; error_token.used_by_parser = true; stack.push(error_token); tos++; return true; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Lookahead Symbols used for attempting error recovery "parse aheads". */ protected Symbol lookahead[]; /** Position in lookahead input buffer used for "parse ahead". */ protected int lookahead_pos; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Read from input to establish our buffer of "parse ahead" lookahead * Symbols. */ protected void read_lookahead() throws java.lang.Exception { /* create the lookahead array */ lookahead = new Symbol[error_sync_size()]; /* fill in the array */ for (int i = 0; i < error_sync_size(); i++) { lookahead[i] = cur_token; cur_token = scan(); } /* start at the beginning */ lookahead_pos = 0; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Return the current lookahead in our error "parse ahead" buffer. */ protected Symbol cur_err_token() { return lookahead[lookahead_pos]; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Advance to next "parse ahead" input Symbol. Return true if we have * input to advance to, false otherwise. */ protected boolean advance_lookahead() { /* advance the input location */ lookahead_pos++; /* return true if we didn't go off the end */ return lookahead_pos < error_sync_size(); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Reset the parse ahead input to one Symbol past where we started error * recovery (this consumes one new Symbol from the real input). */ protected void restart_lookahead() throws java.lang.Exception { /* move all the existing input over */ for (int i = 1; i < error_sync_size(); i++) lookahead[i-1] = lookahead[i]; /* read a new Symbol into the last spot */ // BUG Fix by Bruce Hutton // Computer Science Department, University of Auckland, // Auckland, New Zealand. [applied 5-sep-1999 by csa] // The following two lines were out of order!! lookahead[error_sync_size()-1] = cur_token; cur_token = scan(); /* reset our internal position marker */ lookahead_pos = 0; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Do a simulated parse forward (a "parse ahead") from the current * stack configuration using stored lookahead input and a virtual parse * stack. Return true if we make it all the way through the stored * lookahead input without error. This basically simulates the action of * parse() using only our saved "parse ahead" input, and not executing any * actions. * * @param debug should we produce debugging messages as we parse. */ protected boolean try_parse_ahead(boolean debug) throws java.lang.Exception { int act; short lhs, rhs_size; /* create a virtual stack from the real parse stack */ virtual_parse_stack vstack = new virtual_parse_stack(stack); /* parse until we fail or get past the lookahead input */ for (;;) { /* look up the action from the current state (on top of stack) */ act = get_action(vstack.top(), cur_err_token().sym); /* if its an error, we fail */ if (act == 0) return false; /* > 0 encodes a shift */ if (act > 0) { /* push the new state on the stack */ vstack.push(act-1); if (debug) debug_message("# Parse-ahead shifts Symbol #" + cur_err_token().sym + " into state #" + (act-1)); /* advance simulated input, if we run off the end, we are done */ if (!advance_lookahead()) return true; } /* < 0 encodes a reduce */ else { /* if this is a reduce with the start production we are done */ if ((-act)-1 == start_production()) { if (debug) debug_message("# Parse-ahead accepts"); return true; } /* get the lhs Symbol and the rhs size */ lhs = production_tab[(-act)-1][0]; rhs_size = production_tab[(-act)-1][1]; /* pop handle off the stack */ for (int i = 0; i < rhs_size; i++) vstack.pop(); if (debug) debug_message("# Parse-ahead reduces: handle size = " + rhs_size + " lhs = #" + lhs + " from state #" + vstack.top()); /* look up goto and push it onto the stack */ vstack.push(get_reduce(vstack.top(), lhs)); if (debug) debug_message("# Goto state #" + vstack.top()); } } } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Parse forward using stored lookahead Symbols. In this case we have * already verified that parsing will make it through the stored lookahead * Symbols and we are now getting back to the point at which we can hand * control back to the normal parser. Consequently, this version of the * parser performs all actions and modifies the real parse configuration. * This returns once we have consumed all the stored input or we accept. * * @param debug should we produce debugging messages as we parse. */ protected void parse_lookahead(boolean debug) throws java.lang.Exception { /* the current action code */ int act; /* the Symbol/stack element returned by a reduce */ Symbol lhs_sym = null; /* information about production being reduced with */ short handle_size, lhs_sym_num; /* restart the saved input at the beginning */ lookahead_pos = 0; if (debug) { debug_message("# Reparsing saved input with actions"); debug_message("# Current Symbol is #" + cur_err_token().sym); debug_message("# Current state is #" + ((Symbol)stack.peek()).parse_state); } /* continue until we accept or have read all lookahead input */ while(!_done_parsing) { /* current state is always on the top of the stack */ /* look up action out of the current state with the current input */ act = get_action(((Symbol)stack.peek()).parse_state, cur_err_token().sym); /* decode the action -- > 0 encodes shift */ if (act > 0) { /* shift to the encoded state by pushing it on the stack */ cur_err_token().parse_state = act-1; cur_err_token().used_by_parser = true; if (debug) debug_shift(cur_err_token()); stack.push(cur_err_token()); tos++; /* advance to the next Symbol, if there is none, we are done */ if (!advance_lookahead()) { if (debug) debug_message("# Completed reparse"); /* scan next Symbol so we can continue parse */ // BUGFIX by Chris Harris : // correct a one-off error by commenting out // this next line. /*cur_token = scan();*/ /* go back to normal parser */ return; } if (debug) debug_message("# Current Symbol is #" + cur_err_token().sym); } /* if its less than zero, then it encodes a reduce action */ else if (act < 0) { /* perform the action for the reduce */ lhs_sym = do_action((-act)-1, this, stack, tos); /* look up information about the production */ lhs_sym_num = production_tab[(-act)-1][0]; handle_size = production_tab[(-act)-1][1]; if (debug) debug_reduce((-act)-1, lhs_sym_num, handle_size); /* pop the handle off the stack */ for (int i = 0; i < handle_size; i++) { stack.pop(); tos--; } /* look up the state to go to from the one popped back to */ act = get_reduce(((Symbol)stack.peek()).parse_state, lhs_sym_num); /* shift to that state */ lhs_sym.parse_state = act; lhs_sym.used_by_parser = true; stack.push(lhs_sym); tos++; if (debug) debug_message("# Goto state #" + act); } /* finally if the entry is zero, we have an error (shouldn't happen here, but...)*/ else if (act == 0) { report_fatal_error("Syntax error", lhs_sym); return; } } } /*-----------------------------------------------------------*/ /** Utility function: unpacks parse tables from strings */ protected static short[][] unpackFromStrings(String[] sa) { // Concatanate initialization strings. StringBuffer sb = new StringBuffer(sa[0]); for (int i=1; ilr_parser.scan(). Integration * of scanners implementing Scanner is facilitated. * * @version last updated 23-Jul-1999 * @author David MacMahon */ /* ************************************************* Interface Scanner Declares the next_token() method that should be implemented by scanners. This method is typically called by lr_parser.scan(). End-of-file can be indicated either by returning new Symbol(lr_parser.EOF_sym()) or null. ***************************************************/ public interface Scanner { /** Return the next token, or null on end-of-file. */ public Symbol next_token() throws java.lang.Exception; } jflex-1.4.3/src/java_cup/runtime/Symbol.java0000644000175000017500000000611511017215650017504 0ustar moonmoonpackage java_cup.runtime; /** * Defines the Symbol class, which is used to represent all terminals * and nonterminals while parsing. The lexer should pass CUP Symbols * and CUP returns a Symbol. * * @version last updated: 7/3/96 * @author Frank Flannery */ /* **************************************************************** Class Symbol what the parser expects to receive from the lexer. the token is identified as follows: sym: the symbol type parse_state: the parse state. value: is the lexical value of type Object left : is the left position in the original input file right: is the right position in the original input file xleft: is the left position Object in the original input file xright: is the left position Object in the original input file ******************************************************************/ public class Symbol { // TUM 20060327: Added new Constructor to provide more flexible way // for location handling /******************************* *******************************/ public Symbol(int id, Symbol left, Symbol right, Object o){ this(id,left.left,right.right,o); } public Symbol(int id, Symbol left, Symbol right){ this(id,left.left,right.right); } /******************************* Constructor for l,r values *******************************/ public Symbol(int id, int l, int r, Object o) { this(id); left = l; right = r; value = o; } /******************************* Constructor for no l,r values ********************************/ public Symbol(int id, Object o) { this(id, -1, -1, o); } /***************************** Constructor for no value ***************************/ public Symbol(int id, int l, int r) { this(id, l, r, null); } /*********************************** Constructor for no value or l,r ***********************************/ public Symbol(int sym_num) { this(sym_num, -1); left = -1; right = -1; } /*********************************** Constructor to give a start state ***********************************/ Symbol(int sym_num, int state) { sym = sym_num; parse_state = state; } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The symbol number of the terminal or non terminal being represented */ public int sym; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The parse state to be recorded on the parse stack with this symbol. * This field is for the convenience of the parser and shouldn't be * modified except by the parser. */ public int parse_state; /** This allows us to catch some errors caused by scanners recycling * symbols. For the use of the parser only. [CSA, 23-Jul-1999] */ boolean used_by_parser = false; /******************************* The data passed to parser *******************************/ public int left, right; public Object value; /***************************** Printing this token out. (Override for pretty-print). ****************************/ public String toString() { return "#"+sym; } } jflex-1.4.3/src/java_cup/runtime/SymbolFactory.java0000644000175000017500000000207211017215650021032 0ustar moonmoonpackage java_cup.runtime; /** * Creates the Symbols interface, which CUP uses as default * * @version last updated 27-03-2006 * @author Michael Petter */ /* ************************************************* Interface SymbolFactory interface for creating new symbols You can also use this interface for your own callback hooks Declare Your own factory methods for creation of Objects in Your scanner! ***************************************************/ public interface SymbolFactory { // Factory methods /** * Construction with left/right propagation switched on */ public Symbol newSymbol(String name, int id, Symbol left, Symbol right, Object value); public Symbol newSymbol(String name, int id, Symbol left, Symbol right); /** * Construction with left/right propagation switched off */ public Symbol newSymbol(String name, int id, Object value); public Symbol newSymbol(String name, int id); /** * Construction of start symbol */ public Symbol startSymbol(String name, int id, int state); } jflex-1.4.3/src/java_cup/runtime/virtual_parse_stack.java0000644000175000017500000001157707606571215022327 0ustar moonmoon package java_cup.runtime; import java.util.Stack; /** This class implements a temporary or "virtual" parse stack that * replaces the top portion of the actual parse stack (the part that * has been changed by some set of operations) while maintaining its * original contents. This data structure is used when the parse needs * to "parse ahead" to determine if a given error recovery attempt will * allow the parse to continue far enough to consider it successful. Once * success or failure of parse ahead is determined the system then * reverts to the original parse stack (which has not actually been * modified). Since parse ahead does not execute actions, only parse * state is maintained on the virtual stack, not full Symbol objects. * * @see java_cup.runtime.lr_parser * @version last updated: 7/3/96 * @author Frank Flannery */ public class virtual_parse_stack { /*-----------------------------------------------------------*/ /*--- Constructor(s) ----------------------------------------*/ /*-----------------------------------------------------------*/ /** Constructor to build a virtual stack out of a real stack. */ public virtual_parse_stack(Stack shadowing_stack) throws java.lang.Exception { /* sanity check */ if (shadowing_stack == null) throw new Exception( "Internal parser error: attempt to create null virtual stack"); /* set up our internals */ real_stack = shadowing_stack; vstack = new Stack(); real_next = 0; /* get one element onto the virtual portion of the stack */ get_from_real(); } /*-----------------------------------------------------------*/ /*--- (Access to) Instance Variables ------------------------*/ /*-----------------------------------------------------------*/ /** The real stack that we shadow. This is accessed when we move off * the bottom of the virtual portion of the stack, but is always left * unmodified. */ protected Stack real_stack; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Top of stack indicator for where we leave off in the real stack. * This is measured from top of stack, so 0 would indicate that no * elements have been "moved" from the real to virtual stack. */ protected int real_next; /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** The virtual top portion of the stack. This stack contains Integer * objects with state numbers. This stack shadows the top portion * of the real stack within the area that has been modified (via operations * on the virtual stack). When this portion of the stack becomes empty we * transfer elements from the underlying stack onto this stack. */ protected Stack vstack; /*-----------------------------------------------------------*/ /*--- General Methods ---------------------------------------*/ /*-----------------------------------------------------------*/ /** Transfer an element from the real to the virtual stack. This assumes * that the virtual stack is currently empty. */ protected void get_from_real() { Symbol stack_sym; /* don't transfer if the real stack is empty */ if (real_next >= real_stack.size()) return; /* get a copy of the first Symbol we have not transfered */ stack_sym = (Symbol)real_stack.elementAt(real_stack.size()-1-real_next); /* record the transfer */ real_next++; /* put the state number from the Symbol onto the virtual stack */ vstack.push(new Integer(stack_sym.parse_state)); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Indicate whether the stack is empty. */ public boolean empty() { /* if vstack is empty then we were unable to transfer onto it and the whole thing is empty. */ return vstack.empty(); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Return value on the top of the stack (without popping it). */ public int top() throws java.lang.Exception { if (vstack.empty()) throw new Exception( "Internal parser error: top() called on empty virtual stack"); return ((Integer)vstack.peek()).intValue(); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Pop the stack. */ public void pop() throws java.lang.Exception { if (vstack.empty()) throw new Exception( "Internal parser error: pop from empty virtual stack"); /* pop it */ vstack.pop(); /* if we are now empty transfer an element (if there is one) */ if (vstack.empty()) get_from_real(); } /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/ /** Push a state number onto the stack. */ public void push(int state_num) { vstack.push(new Integer(state_num)); } /*-----------------------------------------------------------*/ } jflex-1.4.3/src/JFlex/0000755000175000017500000000000011141044633013125 5ustar moonmoonjflex-1.4.3/src/JFlex/Action.java0000644000175000017500000001716611141010522015206 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Encapsulates an action in the specification. * * It stores the Java code as String together with a priority (line number in the specification). * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class Action { /** A normal action */ public final static int NORMAL = 0; /** Action of a lookahead expression r1/r2 with fixed length r1 */ public final static int FIXED_BASE = 1; /** Action of a lookahead expression r1/r2 with fixed length r2 */ public final static int FIXED_LOOK = 2; /** Action of a lookahead expression r1/r2 with a finite choice of * fixed lengths in r2 */ public final static int FINITE_CHOICE = 3; /** Action of a general lookahead expression */ public final static int GENERAL_LOOK = 4; /** Action of the 2nd forward pass for lookahead */ public final static int FORWARD_ACTION = 5; /** Action of the backward pass for lookahead */ public final static int BACKWARD_ACTION = 6; /** * The Java code this Action represents */ String content; /** * The priority (i.e. line number in the specification) of this Action. */ int priority; /** * Which kind of action this is. * (normal, a/b with fixed length a, fixed length b, etc) */ private int kind = NORMAL; /** The length of the lookahead (if fixed) */ private int len; /** The entry state of the corresponding forward DFA (if general lookahead) */ private int entryState; /** * Creates a new Action object with specified content and line number. * * @param content java code * @param priority line number */ public Action(String content, int priority) { this.content = content.trim(); this.priority = priority; } /** * Creates a new Action object of the specified kind. Only * accepts FORWARD_ACTION or BACKWARD_ACTION. * * @param kind the kind of action * * @see #FORWARD_ACTION * @see #BACKWARD_ACTION */ public Action(int kind) { if (kind != FORWARD_ACTION && kind != BACKWARD_ACTION) throw new GeneratorException(); this.content = ""; this.priority = Integer.MAX_VALUE; this.kind = kind; } /** * Compares the priority value of this Action with the specified action. * * @param other the other Action to compare this Action with. * * @return this Action if it has higher priority - the specified one, if not. */ public Action getHigherPriority(Action other) { if (other == null) return this; // the smaller the number the higher the priority if (other.priority > this.priority) return this; else return other; } /** * Returns the String representation of this object. * * @return string representation of the action */ public String toString() { return "Action (priority "+priority+", lookahead "+kind+") :" + Out.NL+content; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } /** * Returns true iff the parameter is an * Action with the same content as this one. * * @param a the object to compare this Action with * @return true if the action strings are equal */ public boolean isEquiv(Action a) { return this == a || (this.content.equals(a.content) && this.kind == a.kind && this.len == a.len && this.entryState == a.entryState); } /** * Calculate hash value. * * @return a hash value for this Action */ public int hashCode() { return content.hashCode(); } /** * Test for equality to another object. * * This action equals another object if the other * object is an equivalent action. * * @param o the other object. * * @see Action#isEquiv(Action) */ public boolean equals(Object o) { if (o instanceof Action) return isEquiv((Action) o); else return false; } /** * Return true iff this is action belongs to a general lookahead rule. * * @return true if this actions belongs to a general lookahead rule. */ public boolean isGenLookAction() { return kind == GENERAL_LOOK; } /** * Return true if code for this is action should be emitted, false * if it is a BACK/FORWARD lookahead action. * * @return true if code should be emitted for this action. */ public boolean isEmittable() { return kind != BACKWARD_ACTION && kind != FORWARD_ACTION; } /** * Return kind of lookahead. */ public int lookAhead() { return kind; } /** * Sets the lookahead kind and data for this action * * @param kind which kind of lookahead it is * @param data the length for fixed length look aheads. * */ public void setLookAction(int kind, int data) { this.kind = kind; this.len = data; } /** * The length of the lookahead or base if this is a fixed length * lookahead action. */ public int getLookLength() { return len; } /** * Return the corresponding entry state for the forward DFA (if this * is a general lookahead expression) * * @return the forward DFA entry state (+1 is the backward DFA) */ public int getEntryState() { return entryState; } /** * Set the corresponding entry state for the forward DFA of this action * (if this is a general lookahead expression) * * @param the entry state for the forward DFA of this action */ public void setEntryState(int entryState) { this.entryState = entryState; } public Action copyChoice(int length) { Action a = new Action(this.content, this.priority); a.setLookAction(FINITE_CHOICE, length); return a; } /** * String representation of the lookahead kind of this action. * * @return the string representation */ public String lookString() { switch (kind) { case NORMAL: return ""; case BACKWARD_ACTION: return "LOOK_BACK"; case FIXED_BASE: return "FIXED_BASE"; case FIXED_LOOK: return "FIXED_LOOK"; case FINITE_CHOICE: return "FINITE_CHOICE"; case FORWARD_ACTION: return "LOOK_FORWARD"; case GENERAL_LOOK: return "LOOK_ACTION"; default: return "unknown lookahead type"; } } } jflex-1.4.3/src/JFlex/anttask/0000755000175000017500000000000011141044617014574 5ustar moonmoonjflex-1.4.3/src/JFlex/anttask/JFlexTask.java0000644000175000017500000001576411141010522017273 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex Anttask * * Copyright (C) 2001 Rafal Mantiuk * * Copyright (C) 2003 changes by Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.anttask; import org.apache.tools.ant.Task; import org.apache.tools.ant.BuildException; import JFlex.Main; import JFlex.Options; import java.io.*; /** * JFlex task class * * @author Rafal Mantiuk * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class JFlexTask extends Task { private File inputFile; // found out by looking into .flex file private String className = null; private String packageName = null; /** for javac-like dest dir behaviour */ private File destinationDir; /** the actual output directory (outputDir = destinationDir + package)) */ private File outputDir = null; public JFlexTask() { // ant default is different from the rest of JFlex setVerbose(false); Options.progress = false; } public void execute() throws BuildException { try { if (inputFile == null) throw new BuildException("Input file needed. Use "); if (!inputFile.canRead()) throw new BuildException("Cannot read input file "+inputFile); try { findPackageAndClass(); normalizeOutdir(); File destFile = new File(outputDir, className + ".java"); if (inputFile.lastModified() > destFile.lastModified()) { Main.generate(inputFile); if (!Options.verbose) System.out.println("Generated: " + destFile.getName()); } } catch (IOException e1) { throw new BuildException("IOException: " + e1.toString()); } } catch (JFlex.GeneratorException e) { throw new BuildException("JFlex: generation failed!"); } } /** * Peek into .flex file to get package and class name * * @throws IOException if there is a problem reading the .flex file */ public void findPackageAndClass() throws IOException { // find name of the package and class in jflex source file packageName = null; className = null; LineNumberReader reader = new LineNumberReader(new FileReader(inputFile)); while (className == null || packageName == null) { String line = reader.readLine(); if (line == null) break; if (packageName == null) { int index = line.indexOf("package"); if (index >= 0) { index += 7; int end = line.indexOf(';', index); if (end >= index) { packageName = line.substring(index, end); packageName = packageName.trim(); } } } if (className == null) { int index = line.indexOf("%class"); if (index >= 0) { index += 6; className = line.substring(index); className = className.trim(); } } } // package name may be null, but class name not if (className == null) className = "Yylex"; } /** * Sets the actual output directory if not already set. * * Uses javac logic to determine output dir = dest dir + package name * If not destdir has been set, output dir = parent of input file * * Assumes that package name is already set. */ public void normalizeOutdir() { if (outputDir != null) return; // find out what the destination directory is. Append packageName to dest dir. File destDir; // this is not the default the jflex logic, but javac-like if (destinationDir != null) { if (packageName == null) { destDir = destinationDir; } else { String path = packageName.replace('.', File.separatorChar); destDir = new File(destinationDir,path); } } else { //save parser to the same dir as .flex destDir = new File(inputFile.getParent()); } setOutdir(destDir); } /** * @return package name of input file * * @see JFlexTask.findPackageAndClass */ public String getPackage() { return packageName; } /** * @return class name of input file * * @see JFlexTask.findPackageAndClass */ public String getClassName() { return className; } public void setDestdir(File destinationDir) { this.destinationDir = destinationDir; } public void setOutdir(File outDir) { this.outputDir = outDir; Options.setDir(outputDir); } public void setFile(File file) { this.inputFile = file; } public void setGenerateDot(boolean genDot) { setDot(genDot); } public void setTimeStatistics(boolean displayTime) { Options.time = displayTime; } public void setTime(boolean displayTime) { setTimeStatistics(displayTime); } public void setVerbose(boolean verbose) { Options.verbose = verbose; } public void setSkeleton(File skeleton) { Options.setSkeleton(skeleton); } public void setSkel(File skeleton) { setSkeleton(skeleton); } public void setSkipMinimization(boolean skipMin) { setNomin(skipMin); } public void setNomin(boolean b) { Options.no_minimize = b; } public void setNobak(boolean b) { Options.no_backup = b; } public void setSwitch(boolean b) { if (b) { Options.gen_method = Options.SWITCH; } else { Options.gen_method = Options.PACK; } } public void setTable(boolean b) { if (b) { Options.gen_method = Options.TABLE; } else { Options.gen_method = Options.PACK; } } public void setPack(boolean b) { if (b) { Options.gen_method = Options.PACK; } else { Options.gen_method = Options.SWITCH; } } public void setDot(boolean b) { Options.dot = b; } public void setDump(boolean b) { Options.dump = b; } public void setJLex(boolean b) { Options.jlex = b; } } jflex-1.4.3/src/JFlex/CharClasses.java0000644000175000017500000002673111141010522016162 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.util.*; /** * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class CharClasses { /** debug flag (for char classes only) */ private static final boolean DEBUG = false; /** the largest character that can be used in char classes */ public static final char maxChar = '\uFFFF'; /** the char classes */ private Vector /* of IntCharSet */ classes; /** the largest character actually used in a specification */ private char maxCharUsed; /** * Constructs a new CharClass object that provides space for * classes of characters from 0 to maxCharCode. * * Initially all characters are in class 0. * * @param maxCharCode the last character code to be * considered. (127 for 7bit Lexers, * 255 for 8bit Lexers and 0xFFFF * for Unicode Lexers). */ public CharClasses(int maxCharCode) { if (maxCharCode < 0 || maxCharCode > 0xFFFF) throw new IllegalArgumentException(); maxCharUsed = (char) maxCharCode; classes = new Vector(); classes.addElement(new IntCharSet(new Interval((char) 0, maxChar))); } /** * Returns the greatest Unicode value of the current input character set. */ public char getMaxCharCode() { return maxCharUsed; } /** * Sets the largest Unicode value of the current input character set. * * @param charCode the largest character code, used for the scanner * (i.e. %7bit, %8bit, %16bit etc.) */ public void setMaxCharCode(int charCode) { if (charCode < 0 || charCode > 0xFFFF) throw new IllegalArgumentException(); maxCharUsed = (char) charCode; } /** * Returns the current number of character classes. */ public int getNumClasses() { return classes.size(); } /** * Updates the current partition, so that the specified set of characters * gets a new character class. * * Characters that are elements of set are not in the same * equivalence class with characters that are not elements of set. * * @param set the set of characters to distinguish from the rest * @param caseless if true upper/lower/title case are considered equivalent */ public void makeClass(IntCharSet set, boolean caseless) { if (caseless) set = set.getCaseless(); if ( DEBUG ) { Out.dump("makeClass("+set+")"); dump(); } int oldSize = classes.size(); for (int i = 0; i < oldSize; i++) { IntCharSet x = (IntCharSet) classes.elementAt(i); if (x.equals(set)) return; IntCharSet and = x.and(set); if ( and.containsElements() ) { if ( x.equals(and) ) { set.sub(and); continue; } else if ( set.equals(and) ) { x.sub(and); classes.addElement(and); if (DEBUG) { Out.dump("makeClass(..) finished"); dump(); } return; } set.sub(and); x.sub(and); classes.addElement(and); } } if (DEBUG) { Out.dump("makeClass(..) finished"); dump(); } } /** * Returns the code of the character class the specified character belongs to. */ public int getClassCode(char letter) { int i = -1; while (true) { IntCharSet x = (IntCharSet) classes.elementAt(++i); if ( x.contains(letter) ) return i; } } /** * Dump charclasses to the dump output stream */ public void dump() { Out.dump(toString()); } /** * Return a string representation of one char class * * @param theClass the index of the class to */ public String toString(int theClass) { return classes.elementAt(theClass).toString(); } /** * Return a string representation of the char classes * stored in this class. * * Enumerates the classes by index. */ public String toString() { StringBuffer result = new StringBuffer("CharClasses:"); result.append(Out.NL); for (int i = 0; i < classes.size(); i++) result.append("class "+i+":"+Out.NL+classes.elementAt(i)+Out.NL); return result.toString(); } /** * Creates a new character class for the single character singleChar. * * @param caseless if true upper/lower/title case are considered equivalent */ public void makeClass(char singleChar, boolean caseless) { makeClass(new IntCharSet(singleChar), caseless); } /** * Creates a new character class for each character of the specified String. * * @param caseless if true upper/lower/title case are considered equivalent */ public void makeClass(String str, boolean caseless) { for (int i = 0; i < str.length(); i++) makeClass(str.charAt(i), caseless); } /** * Updates the current partition, so that the specified set of characters * gets a new character class. * * Characters that are elements of the set v are not in the same * equivalence class with characters that are not elements of the set v. * * @param v a Vector of Interval objects. * This Vector represents a set of characters. The set of characters is * the union of all intervals in the Vector. * * @param caseless if true upper/lower/title case are considered equivalent */ public void makeClass(Vector /* Interval */ v, boolean caseless) { makeClass(new IntCharSet(v), caseless); } /** * Updates the current partition, so that the set of all characters not contained in the specified * set of characters gets a new character class. * * Characters that are elements of the set v are not in the same * equivalence class with characters that are not elements of the set v. * * This method is equivalent to makeClass(v) * * @param v a Vector of Interval objects. * This Vector represents a set of characters. The set of characters is * the union of all intervals in the Vector. * * @param caseless if true upper/lower/title case are considered equivalent */ public void makeClassNot(Vector v, boolean caseless) { makeClass(new IntCharSet(v), caseless); } /** * Returns an array that contains the character class codes of all characters * in the specified set of input characters. */ private int [] getClassCodes(IntCharSet set, boolean negate) { if (DEBUG) { Out.dump("getting class codes for "+set); if (negate) Out.dump("[negated]"); } int size = classes.size(); // [fixme: optimize] int temp [] = new int [size]; int length = 0; for (int i = 0; i < size; i++) { IntCharSet x = (IntCharSet) classes.elementAt(i); if ( negate ) { if ( !set.and(x).containsElements() ) { temp[length++] = i; if (DEBUG) Out.dump("code "+i); } } else { if ( set.and(x).containsElements() ) { temp[length++] = i; if (DEBUG) Out.dump("code "+i); } } } int result [] = new int [length]; System.arraycopy(temp, 0, result, 0, length); return result; } /** * Returns an array that contains the character class codes of all characters * in the specified set of input characters. * * @param intervallVec a Vector of Intervals, the set of characters to get * the class codes for * * @return an array with the class codes for intervallVec */ public int [] getClassCodes(Vector /* Interval */ intervallVec) { return getClassCodes(new IntCharSet(intervallVec), false); } /** * Returns an array that contains the character class codes of all characters * that are not in the specified set of input characters. * * @param intervallVec a Vector of Intervals, the complement of the * set of characters to get the class codes for * * @return an array with the class codes for the complement of intervallVec */ public int [] getNotClassCodes(Vector /* Interval */ intervallVec) { return getClassCodes(new IntCharSet(intervallVec), true); } /** * Check consistency of the stored classes [debug]. * * all classes must be disjoint, checks if all characters * have a class assigned. */ public void check() { for (int i = 0; i < classes.size(); i++) for (int j = i+1; j < classes.size(); j++) { IntCharSet x = (IntCharSet) classes.elementAt(i); IntCharSet y = (IntCharSet) classes.elementAt(j); if ( x.and(y).containsElements() ) { System.out.println("Error: non disjoint char classes "+i+" and "+j); System.out.println("class "+i+": "+x); System.out.println("class "+j+": "+y); } } // check if each character has a classcode // (= if getClassCode terminates) for (char c = 0; c < maxChar; c++) { getClassCode(c); if (c % 100 == 0) System.out.print("."); } getClassCode(maxChar); } /** * Returns an array of all CharClassIntervalls in this * char class collection. * * The array is ordered by char code, i.e. * result[i+1].start = result[i].end+1 * * Each CharClassInterval contains the number of the * char class it belongs to. */ public CharClassInterval [] getIntervals() { int i, c; int size = classes.size(); int numIntervalls = 0; for (i = 0; i < size; i++) numIntervalls+= ((IntCharSet) classes.elementAt(i)).numIntervalls(); CharClassInterval [] result = new CharClassInterval[numIntervalls]; i = 0; c = 0; while (i < numIntervalls) { int code = getClassCode((char) c); IntCharSet set = (IntCharSet) classes.elementAt(code); Interval iv = set.getNext(); result[i++] = new CharClassInterval(iv.start, iv.end, code); c = iv.end+1; } return result; } } jflex-1.4.3/src/JFlex/CharClassException.java0000644000175000017500000000400111141010522017473 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * This Exception is used in class CharClasses. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class CharClassException extends RuntimeException { /** * Creates a new CharClassException without message */ public CharClassException() { } /** * Creates a new CharClassException with the specified message * * @param message the error description presented to the user. */ public CharClassException(String message) { super(message); } } jflex-1.4.3/src/JFlex/CharClassInterval.java0000644000175000017500000000553311141010522017334 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Stores an interval of characters together with the character class * * A character belongs to an interval, if its Unicode value is greater than or equal * to the Unicode value of start and smaller than or euqal to the Unicode * value of end. * * All characters of the interval must belong to the same character class. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class CharClassInterval { /** * The first character of the interval */ int start; /** * The last character of the interval */ int end; /** * The code of the class all characters of this interval belong to. */ int charClass; /** * Creates a new CharClassInterval from start to end * that belongs to character class charClass. * * @param start The first character of the interval * @param end The last character of the interval * @param charClass The code of the class all characters of this interval belong to. */ public CharClassInterval(int start, int end, int charClass) { this.start = start; this.end = end; this.charClass = charClass; } /** * returns string representation of this class interval */ public String toString() { return "["+start+"-"+end+"="+charClass+"]"; } } jflex-1.4.3/src/JFlex/CharSet.java0000644000175000017500000000640011141010522015307 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public final class CharSet { final static int BITS = 6; // the number of bits to shift (2^6 = 64) final static int MOD = (1<> BITS)+1]; add(character); } public void add(int character) { resize(character); if ( (bits[character >> BITS] & (1L << (character & MOD))) == 0) numElements++; bits[character >> BITS] |= (1L << (character & MOD)); } private int nbits2size (int nbits) { return ((nbits >> BITS) + 1); } private void resize(int nbits) { int needed = nbits2size(nbits); if (needed < bits.length) return; long newbits[] = new long[Math.max(bits.length*2,needed)]; System.arraycopy(bits, 0, newbits, 0, bits.length); bits = newbits; } public boolean isElement(int character) { int index = character >> BITS; if (index >= bits.length) return false; return (bits[index] & (1L << (character & MOD))) != 0; } public CharSetEnumerator characters() { return new CharSetEnumerator(this); } public boolean containsElements() { return numElements > 0; } public int size() { return numElements; } public String toString() { CharSetEnumerator set = characters(); StringBuffer result = new StringBuffer("{"); if ( set.hasMoreElements() ) result.append(""+set.nextElement()); while ( set.hasMoreElements() ) { int i = set.nextElement(); result.append( ", "+i); } result.append("}"); return result.toString(); } } jflex-1.4.3/src/JFlex/CharSetEnumerator.java0000644000175000017500000000547611141010522017365 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Enumerator for the elements of a CharSet. * * Does not implement java.util.Enumeration, but supports the same protocol. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class CharSetEnumerator { private int index; private int offset; private long mask = 1; private CharSet set; public CharSetEnumerator(CharSet characters) { set = characters; while (index < set.bits.length && set.bits[index] == 0) index++; if (index >= set.bits.length) return; while (offset <= CharSet.MOD && ((set.bits[index] & mask) == 0)) { mask<<= 1; offset++; } } private void advance() { do { offset++; mask<<= 1; } while (offset <= CharSet.MOD && ((set.bits[index] & mask) == 0)); if (offset > CharSet.MOD) { do index++; while (index < set.bits.length && set.bits[index] == 0); if (index >= set.bits.length) return; offset = 0; mask = 1; while (offset <= CharSet.MOD && ((set.bits[index] & mask) == 0)) { mask<<= 1; offset++; } } } public boolean hasMoreElements() { return index < set.bits.length; } public int nextElement() { int x = (index << CharSet.BITS) + offset; advance(); return x; } } jflex-1.4.3/src/JFlex/CountEmitter.java0000644000175000017500000000773011141010522016407 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * jflex 1.4 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * An emitter for an array encoded as count/value pairs in a string. * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class CountEmitter extends PackEmitter { /** number of entries in expanded array */ private int numEntries; /** translate all values by this amount */ private int translate = 0; /** * Create a count/value emitter for a specific field. * * @param name name of the generated array */ protected CountEmitter(String name) { super(name); } /** * Emits count/value unpacking code for the generated array. * * @see JFlex.PackEmitter#emitUnPack() */ public void emitUnpack() { // close last string chunk: println("\";"); nl(); println(" private static int [] zzUnpack"+name+"() {"); println(" int [] result = new int["+numEntries+"];"); println(" int offset = 0;"); for (int i = 0; i < chunks; i++) { println(" offset = zzUnpack"+name+"("+constName()+"_PACKED_"+i+", offset, result);"); } println(" return result;"); println(" }"); nl(); println(" private static int zzUnpack"+name+"(String packed, int offset, int [] result) {"); println(" int i = 0; /* index in packed string */"); println(" int j = offset; /* index in unpacked array */"); println(" int l = packed.length();"); println(" while (i < l) {"); println(" int count = packed.charAt(i++);"); println(" int value = packed.charAt(i++);"); if (translate == 1) { println(" value--;"); } else if (translate != 0) { println(" value-= "+translate); } println(" do result[j++] = value; while (--count > 0);"); println(" }"); println(" return j;"); println(" }"); } /** * Translate all values by given amount. * * Use to move value interval from [0, 0xFFFF] to something different. * * @param i amount the value will be translated by. * Example: i = 1 allows values in [-1, 0xFFFE]. */ public void setValTranslation(int i) { this.translate = i; } /** * Emit one count/value pair. * * Automatically translates value by the translate value. * * @param count * @param value * * @see CountEmitter#setValTranslation(int) */ public void emit(int count, int value) { numEntries+= count; breaks(); emitUC(count); emitUC(value+translate); } } jflex-1.4.3/src/JFlex/DFA.java0000644000175000017500000006712311141010522014361 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.io.*; import java.util.*; /** * DFA representation in JFlex. * Contains minimization algorithm. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class DFA { /** * The initial number of states */ private static final int STATES = 500; /** * The code for "no target state" in the transition table. */ public static final int NO_TARGET = -1; /** * table[current_state][character] is the next state for current_state * with input character, NO_TARGET if there is no transition for * this input in current_state */ int [][] table; /** * isFinal[state] == true <=> the state state is * a final state. */ boolean [] isFinal; /** * action[state] is the action that is to be carried out in * state state, null if there is no action. */ Action [] action; /** * entryState[i] is the start-state of lexical state i or * lookahead DFA i */ int entryState []; /** * The number of states in this DFA */ int numStates; /** * The current maximum number of input characters */ int numInput; /** * The number of lexical states (2*numLexStates <= entryState.length) */ int numLexStates; /** * all actions that are used in this DFA */ Hashtable usedActions = new Hashtable(); /** True iff this DFA contains general lookahead */ boolean lookaheadUsed; public DFA(int numEntryStates, int numInp, int numLexStates) { numInput = numInp; int statesNeeded = Math.max(numEntryStates, STATES); table = new int [statesNeeded] [numInput]; action = new Action [statesNeeded]; isFinal = new boolean [statesNeeded]; entryState = new int [numEntryStates]; numStates = 0; this.numLexStates = numLexStates; for (int i = 0; i < statesNeeded; i++) { for (char j = 0; j < numInput; j++) table [i][j] = NO_TARGET; } } public void setEntryState(int eState, int trueState) { entryState[eState] = trueState; } private void ensureStateCapacity(int newNumStates) { int oldLength = isFinal.length; if ( newNumStates < oldLength ) return; int newLength = oldLength*2; while ( newLength <= newNumStates ) newLength*= 2; boolean [] newFinal = new boolean [newLength]; boolean [] newPushback = new boolean [newLength]; Action [] newAction = new Action [newLength]; int [] [] newTable = new int [newLength] [numInput]; System.arraycopy(isFinal,0,newFinal,0,numStates); System.arraycopy(action,0,newAction,0,numStates); System.arraycopy(table,0,newTable,0,oldLength); int i,j; for (i = oldLength; i < newLength; i++) { for (j = 0; j < numInput; j++) { newTable[i][j] = NO_TARGET; } } isFinal = newFinal; action = newAction; table = newTable; } public void setAction(int state, Action stateAction) { action[state] = stateAction; if (stateAction != null) { usedActions.put(stateAction,stateAction); lookaheadUsed |= stateAction.isGenLookAction(); } } public void setFinal(int state, boolean isFinalState) { isFinal[state] = isFinalState; } public void addTransition(int start, char input, int dest) { int max = Math.max(start,dest)+1; ensureStateCapacity(max); if (max > numStates) numStates = max; // Out.debug("Adding DFA transition ("+start+", "+(int)input+", "+dest+")"); table[start][input] = dest; } public String toString() { StringBuffer result = new StringBuffer(); for (int i=0; i < numStates; i++) { result.append("State "); if ( isFinal[i] ) { result.append("[FINAL"); String l = action[i].lookString(); if (!l.equals("")) { result.append(", "); result.append(l); } result.append("] "); } result.append(i+":"+Out.NL); for (char j=0; j < numInput; j++) { if ( table[i][j] >= 0 ) result.append(" with "+(int)j+" in "+table[i][j]+Out.NL); } } return result.toString(); } public void writeDot(File file) { try { PrintWriter writer = new PrintWriter(new FileWriter(file)); writer.println(dotFormat()); writer.close(); } catch (IOException e) { Out.error(ErrorMessages.FILE_WRITE, file); throw new GeneratorException(); } } public String dotFormat() { StringBuffer result = new StringBuffer(); result.append("digraph DFA {"+Out.NL); result.append("rankdir = LR"+Out.NL); for (int i=0; i < numStates; i++) { if ( isFinal[i] ) { result.append(i); result.append(" [shape = doublecircle]"); result.append(Out.NL); } } for (int i=0; i < numStates; i++) { for (int input = 0; input < numInput; input++) { if ( table[i][input] >= 0 ) { result.append(i+" -> "+table[i][input]); result.append(" [label=\"["+input+"]\"]"+Out.NL); // result.append(" [label=\"["+classes.toString(input)+"]\"]\n"); } } } result.append("}"+Out.NL); return result.toString(); } /** * Check that all actions can actually be matched in this DFA. */ public void checkActions(LexScan scanner, LexParse parser) { EOFActions eofActions = parser.getEOFActions(); Enumeration l = scanner.actions.elements(); while (l.hasMoreElements()) { Action a = (Action) l.nextElement(); if ( !a.equals(usedActions.get(a)) && !eofActions.isEOFAction(a) ) { Out.warning(scanner.file, ErrorMessages.NEVER_MATCH, a.priority-1, -1); } } } /** * Implementation of Hopcroft's O(n log n) minimization algorithm, follows * description by D. Gries. * * Time: O(n log n) * Space: O(c n), size < 4*(5*c*n + 13*n + 3*c) byte */ public void minimize() { Out.print(numStates+" states before minimization, "); if (numStates == 0) { Out.error(ErrorMessages.ZERO_STATES); throw new GeneratorException(); } if (Options.no_minimize) { Out.println("minimization skipped."); return; } // the algorithm needs the DFA to be total, so we add an error state 0, // and translate the rest of the states by +1 final int n = numStates+1; // block information: // [0..n-1] stores which block a state belongs to, // [n..2*n-1] stores how many elements each block has int [] block = new int[2*n]; // implements a doubly linked list of states (these are the actual blocks) int [] b_forward = new int[2*n]; int [] b_backward = new int[2*n]; // the last of the blocks currently in use (in [n..2*n-1]) // (end of list marker, points to the last used block) int lastBlock = n; // at first we start with one empty block final int b0 = n; // the first block // the circular doubly linked list L of pairs (B_i, c) // (B_i, c) in L iff l_forward[(B_i-n)*numInput+c] > 0 // numeric value of block 0 = n! int [] l_forward = new int[n*numInput+1]; int [] l_backward = new int[n*numInput+1]; int anchorL = n*numInput; // list anchor // inverse of the transition table // if t = inv_delta[s][c] then { inv_delta_set[t], inv_delta_set[t+1], .. inv_delta_set[k] } // is the set of states, with inv_delta_set[k] = -1 and inv_delta_set[j] >= 0 for t <= j < k int [] [] inv_delta = new int[n][numInput]; int [] inv_delta_set = new int [2*n*numInput]; // twin stores two things: // twin[0]..twin[numSplit-1] is the list of blocks that have been split // twin[B_i] is the twin of block B_i int [] twin = new int[2*n]; int numSplit; // SD[B_i] is the the number of states s in B_i with delta(s,a) in B_j // if SD[B_i] == block[B_i], there is no need to split int [] SD = new int[2*n]; // [only SD[n..2*n-1] is used] // for fixed (B_j,a), the D[0]..D[numD-1] are the inv_delta(B_j,a) int [] D = new int[n]; int numD; // initialize inverse of transition table int lastDelta = 0; int [] inv_lists = new int[n]; // holds a set of lists of states int [] inv_list_last = new int[n]; // the last element for (int c = 0; c < numInput; c++) { // clear "head" and "last element" pointers for (int s = 0; s < n; s++) { inv_list_last[s] = -1; inv_delta[s][c] = -1; } // the error state has a transition for each character into itself inv_delta[0][c] = 0; inv_list_last[0] = 0; // accumulate states of inverse delta into lists (inv_delta serves as head of list) for (int s = 1; s < n; s++) { int t = table[s-1][c]+1; if (inv_list_last[t] == -1) { // if there are no elements in the list yet inv_delta[t][c] = s; // mark t as first and last element inv_list_last[t] = s; } else { inv_lists[inv_list_last[t]] = s; // link t into chain inv_list_last[t] = s; // and mark as last element } } // now move them to inv_delta_set in sequential order, // and update inv_delta accordingly for (int s = 0; s < n; s++) { int i = inv_delta[s][c]; inv_delta[s][c] = lastDelta; int j = inv_list_last[s]; boolean go_on = (i != -1); while (go_on) { go_on = (i != j); inv_delta_set[lastDelta++] = i; i = inv_lists[i]; } inv_delta_set[lastDelta++] = -1; } } // of initialize inv_delta // printInvDelta(inv_delta, inv_delta_set); // initialize blocks // make b0 = {0} where 0 = the additional error state b_forward[b0] = 0; b_backward[b0] = 0; b_forward[0] = b0; b_backward[0] = b0; block[0] = b0; block[b0] = 1; for (int s = 1; s < n; s++) { // System.out.println("Checking state ["+(s-1)+"]"); // search the blocks if it fits in somewhere // (fit in = same pushback behavior, same finalness, same lookahead behavior, same action) int b = b0+1; // no state can be equivalent to the error state boolean found = false; while (!found && b <= lastBlock) { // get some state out of the current block int t = b_forward[b]; // System.out.println(" picking state ["+(t-1)+"]"); // check, if s could be equivalent with t if (isFinal[s-1]) { found = isFinal[t-1] && action[s-1].isEquiv(action[t-1]); } else { found = !isFinal[t-1]; } if (found) { // found -> add state s to block b // System.out.println("Found! Adding to block "+(b-b0)); // update block information block[s] = b; block[b]++; // chain in the new element int last = b_backward[b]; b_forward[last] = s; b_forward[s] = b; b_backward[b] = s; b_backward[s] = last; } b++; } if (!found) { // fits in nowhere -> create new block // System.out.println("not found, lastBlock = "+lastBlock); // update block information block[s] = b; block[b]++; // chain in the new element b_forward[b] = s; b_forward[s] = b; b_backward[b] = s; b_backward[s] = b; lastBlock++; } } // of initialize blocks // printBlocks(block,b_forward,b_backward,lastBlock); // initialize worklist L // first, find the largest block B_max, then, all other (B_i,c) go into the list int B_max = b0; int B_i; for (B_i = b0+1; B_i <= lastBlock; B_i++) if (block[B_max] < block[B_i]) B_max = B_i; // L = empty l_forward[anchorL] = anchorL; l_backward[anchorL] = anchorL; // set up the first list element if (B_max == b0) B_i = b0+1; else B_i = b0; // there must be at least two blocks int index = (B_i-b0)*numInput; // (B_i, 0) while (index < (B_i+1-b0)*numInput) { int last = l_backward[anchorL]; l_forward[last] = index; l_forward[index] = anchorL; l_backward[index] = last; l_backward[anchorL] = index; index++; } // now do the rest of L while (B_i <= lastBlock) { if (B_i != B_max) { index = (B_i-b0)*numInput; while (index < (B_i+1-b0)*numInput) { int last = l_backward[anchorL]; l_forward[last] = index; l_forward[index] = anchorL; l_backward[index] = last; l_backward[anchorL] = index; index++; } } B_i++; } // end of setup L // start of "real" algorithm // int step = 0; // System.out.println("max_steps = "+(n*numInput)); // while L not empty while (l_forward[anchorL] != anchorL) { // System.out.println("step : "+(step++)); // printL(l_forward, l_backward, anchorL); // pick and delete (B_j, a) in L: // pick int B_j_a = l_forward[anchorL]; // delete l_forward[anchorL] = l_forward[B_j_a]; l_backward[l_forward[anchorL]] = anchorL; l_forward[B_j_a] = 0; // take B_j_a = (B_j-b0)*numInput+c apart into (B_j, a) int B_j = b0 + B_j_a / numInput; int a = B_j_a % numInput; // printL(l_forward, l_backward, anchorL); // System.out.println("picked ("+B_j+","+a+")"); // printL(l_forward, l_backward, anchorL); // determine splittings of all blocks wrt (B_j, a) // i.e. D = inv_delta(B_j,a) numD = 0; int s = b_forward[B_j]; while (s != B_j) { // System.out.println("splitting wrt. state "+s); int t = inv_delta[s][a]; // System.out.println("inv_delta chunk "+t); while (inv_delta_set[t] != -1) { // System.out.println("D+= state "+inv_delta_set[t]); D[numD++] = inv_delta_set[t++]; } s = b_forward[s]; } // clear the twin list numSplit = 0; // System.out.println("splitting blocks according to D"); // clear SD and twins (only those B_i that occur in D) for (int indexD = 0; indexD < numD; indexD++) { // for each s in D s = D[indexD]; B_i = block[s]; SD[B_i] = -1; twin[B_i] = 0; } // count how many states of each B_i occurring in D go with a into B_j // Actually we only check, if *all* t in B_i go with a into B_j. // In this case SD[B_i] == block[B_i] will hold. for (int indexD = 0; indexD < numD; indexD++) { // for each s in D s = D[indexD]; B_i = block[s]; // only count, if we haven't checked this block already if (SD[B_i] < 0) { SD[B_i] = 0; int t = b_forward[B_i]; while (t != B_i && (t != 0 || block[0] == B_j) && (t == 0 || block[table[t-1][a]+1] == B_j)) { SD[B_i]++; t = b_forward[t]; } } } // split each block according to D for (int indexD = 0; indexD < numD; indexD++) { // for each s in D s = D[indexD]; B_i = block[s]; // System.out.println("checking if block "+(B_i-b0)+" must be split because of state "+s); if (SD[B_i] != block[B_i]) { // System.out.println("state "+(s-1)+" must be moved"); int B_k = twin[B_i]; if (B_k == 0) { // no twin for B_i yet -> generate new block B_k, make it B_i's twin B_k = ++lastBlock; // System.out.println("creating block "+(B_k-n)); // printBlocks(block,b_forward,b_backward,lastBlock-1); b_forward[B_k] = B_k; b_backward[B_k] = B_k; twin[B_i] = B_k; // mark B_i as split twin[numSplit++] = B_i; } // move s from B_i to B_k // remove s from B_i b_forward[b_backward[s]] = b_forward[s]; b_backward[b_forward[s]] = b_backward[s]; // add s to B_k int last = b_backward[B_k]; b_forward[last] = s; b_forward[s] = B_k; b_backward[s] = last; b_backward[B_k] = s; block[s] = B_k; block[B_k]++; block[B_i]--; SD[B_i]--; // there is now one state less in B_i that goes with a into B_j // printBlocks(block, b_forward, b_backward, lastBlock); // System.out.println("finished move"); } } // of block splitting // printBlocks(block, b_forward, b_backward, lastBlock); // System.out.println("updating L"); // update L for (int indexTwin = 0; indexTwin < numSplit; indexTwin++) { B_i = twin[indexTwin]; int B_k = twin[B_i]; for (int c = 0; c < numInput; c++) { int B_i_c = (B_i-b0)*numInput+c; int B_k_c = (B_k-b0)*numInput+c; if (l_forward[B_i_c] > 0) { // (B_i,c) already in L --> put (B_k,c) in L int last = l_backward[anchorL]; l_backward[anchorL] = B_k_c; l_forward[last] = B_k_c; l_backward[B_k_c] = last; l_forward[B_k_c] = anchorL; } else { // put the smaller block in L if (block[B_i] <= block[B_k]) { int last = l_backward[anchorL]; l_backward[anchorL] = B_i_c; l_forward[last] = B_i_c; l_backward[B_i_c] = last; l_forward[B_i_c] = anchorL; } else { int last = l_backward[anchorL]; l_backward[anchorL] = B_k_c; l_forward[last] = B_k_c; l_backward[B_k_c] = last; l_forward[B_k_c] = anchorL; } } } } } // System.out.println("Result"); // printBlocks(block,b_forward,b_backward,lastBlock); /* System.out.println("Old minimization:"); boolean [] [] equiv = old_minimize(); boolean error = false; for (int i = 1; i < equiv.length; i++) { for (int j = 0; j < equiv[i].length; j++) { if (equiv[i][j] != (block[i+1] == block[j+1])) { System.out.println("error: equiv["+i+"]["+j+"] = "+equiv[i][j]+ ", block["+i+"] = "+block[i+1]+", block["+j+"] = "+block[j]); error = true; } } } if (error) System.exit(1); System.out.println("check"); */ // transform the transition table // trans[i] is the state j that will replace state i, i.e. // states i and j are equivalent int trans [] = new int [numStates]; // kill[i] is true iff state i is redundant and can be removed boolean kill [] = new boolean [numStates]; // move[i] is the amount line i has to be moved in the transition table // (because states j < i have been removed) int move [] = new int [numStates]; // fill arrays trans[] and kill[] (in O(n)) for (int b = b0+1; b <= lastBlock; b++) { // b0 contains the error state // get the state with smallest value in current block int s = b_forward[b]; int min_s = s; // there are no empty blocks! for (; s != b; s = b_forward[s]) if (min_s > s) min_s = s; // now fill trans[] and kill[] for this block // (and translate states back to partial DFA) min_s--; for (s = b_forward[b]-1; s != b-1; s = b_forward[s+1]-1) { trans[s] = min_s; kill[s] = s != min_s; } } // fill array move[] (in O(n)) int amount = 0; for (int i = 0; i < numStates; i++) { if ( kill[i] ) amount++; else move[i] = amount; } int i,j; // j is the index in the new transition table // the transition table is transformed in place (in O(c n)) for (i = 0, j = 0; i < numStates; i++) { // we only copy lines that have not been removed if ( !kill[i] ) { // translate the target states for (int c = 0; c < numInput; c++) { if ( table[i][c] >= 0 ) { table[j][c] = trans[ table[i][c] ]; table[j][c]-= move[ table[j][c] ]; } else { table[j][c] = table[i][c]; } } isFinal[j] = isFinal[i]; action[j] = action[i]; j++; } } numStates = j; // translate lexical states for (i = 0; i < entryState.length; i++) { entryState[i] = trans[ entryState[i] ]; entryState[i]-= move[ entryState[i] ]; } Out.println(numStates+" states in minimized DFA"); } public String toString(int [] a) { String r = "{"; int i; for (i = 0; i < a.length-1; i++) r += a[i]+","; return r+a[i]+"}"; } public void printBlocks(int [] b, int [] b_f, int [] b_b, int last) { Out.dump("block : "+toString(b)); Out.dump("b_forward : "+toString(b_f)); Out.dump("b_backward: "+toString(b_b)); Out.dump("lastBlock : "+last); final int n = numStates+1; for (int i = n; i <= last; i ++) { Out.dump("Block "+(i-n)+" (size "+b[i]+"):"); String line = "{"; int s = b_f[i]; while (s != i) { line = line+(s-1); int t = s; s = b_f[s]; if (s != i) { line = line+","; if (b[s] != i) Out.dump("consistency error for state "+(s-1)+" (block "+b[s]+")"); } if (b_b[s] != t) Out.dump("consistency error for b_back in state "+(s-1)+" (back = "+b_b[s]+", should be = "+t+")"); } Out.dump(line+"}"); } } public void printL(int [] l_f, int [] l_b, int anchor) { String l = "L = {"; int bc = l_f[anchor]; while (bc != anchor) { int b = bc / numInput; int c = bc % numInput; l+= "("+b+","+c+")"; int old_bc = bc; bc = l_f[bc]; if (bc != anchor) l+= ","; if (l_b[bc] != old_bc) Out.dump("consistency error for ("+b+","+c+")"); } Out.dump(l+"}"); } /** * Much simpler, but slower and less memory efficient minimization algorithm. * * @return the equivalence relation on states. */ public boolean [] [] old_minimize() { int i,j; char c; Out.print(numStates+" states before minimization, "); if (numStates == 0) { Out.error(ErrorMessages.ZERO_STATES); throw new GeneratorException(); } if (Options.no_minimize) { Out.println("minimization skipped."); return null; } // equiv[i][j] == true <=> state i and state j are equivalent boolean [] [] equiv = new boolean [numStates] []; // list[i][j] contains all pairs of states that have to be marked "not equivalent" // if states i and j are recognized to be not equivalent StatePairList [] [] list = new StatePairList [numStates] []; // construct a triangular matrix equiv[i][j] with j < i // and mark pairs (final state, not final state) as not equivalent for (i = 1; i < numStates; i++) { list[i] = new StatePairList[i]; equiv[i] = new boolean [i]; for (j = 0; j < i; j++) { // i and j are equivalent, iff : // i and j are both final and their actions are equivalent and have same pushback behaviour or // i and j are both not final if ( isFinal[i] && isFinal[j] ) equiv[i][j] = action[i].isEquiv(action[j]); else equiv[i][j] = !isFinal[j] && !isFinal[i]; } } for (i = 1; i < numStates; i++) { Out.debug("Testing state "+i); for (j = 0; j < i; j++) { if ( equiv[i][j] ) { for (c = 0; c < numInput; c++) { if (equiv[i][j]) { int p = table[i][c]; int q = table[j][c]; if (p < q) { int t = p; p = q; q = t; } if ( p >= 0 || q >= 0 ) { // Out.debug("Testing input '"+c+"' for ("+i+","+j+")"); // Out.debug("Target states are ("+p+","+q+")"); if ( p!=q && (p == -1 || q == -1 || !equiv[p][q]) ) { equiv[i][j] = false; if (list[i][j] != null) list[i][j].markAll(list,equiv); } // printTable(equiv); } // if (p >= 0) .. } // if (equiv[i][j] } // for (char c = 0; c < numInput .. // if i and j are still marked equivalent.. if ( equiv[i][j] ) { // Out.debug("("+i+","+j+") are still marked equivalent"); for (c = 0; c < numInput; c++) { int p = table[i][c]; int q = table[j][c]; if (p < q) { int t = p; p = q; q = t; } if (p != q && p >= 0 && q >= 0) { if ( list[p][q] == null ) { list[p][q] = new StatePairList(); } list[p][q].addPair(i,j); } } } else { // Out.debug("("+i+","+j+") are not equivalent"); } } // of first if (equiv[i][j]) } // of for j } // of for i // } // printTable(equiv); return equiv; } public void printInvDelta(int [] [] inv_delta, int [] inv_delta_set) { Out.dump("Inverse of transition table: "); for (int s = 0; s < numStates+1; s++) { Out.dump("State ["+(s-1)+"]"); for (int c = 0; c < numInput; c++) { String line = "With <"+c+"> in {"; int t = inv_delta[s][c]; while (inv_delta_set[t] != -1) { line += inv_delta_set[t++]-1; if (inv_delta_set[t] != -1) line += ","; } if (inv_delta_set[inv_delta[s][c]] != -1) Out.dump(line+"}"); } } } public void printTable(boolean [] [] equiv) { Out.dump("Equivalence table is : "); for (int i = 1; i < numStates; i++) { String line = i+" :"; for (int j = 0; j < i; j++) { if (equiv[i][j]) line+= " E"; else line+= " x"; } Out.dump(line); } } } jflex-1.4.3/src/JFlex/Emitter.java0000644000175000017500000013516211141010522015377 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.io.*; import java.util.*; import java.text.*; /** * This class manages the actual code generation, putting * the scanner together, filling in skeleton sections etc. * * Table compression, String packing etc. is also done here. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class Emitter { // bit masks for state attributes static final private int FINAL = 1; static final private int NOLOOK = 8; static final private String date = (new SimpleDateFormat()).format(new Date()); private File inputFile; private PrintWriter out; private Skeleton skel; private LexScan scanner; private LexParse parser; private DFA dfa; // for switch statement: // table[i][j] is the set of input characters that leads from state i to state j private CharSet table[][]; private boolean isTransition[]; // noTarget[i] is the set of input characters that have no target state in state i private CharSet noTarget[]; // for row killing: private int numRows; private int [] rowMap; private boolean [] rowKilled; // for col killing: private int numCols; private int [] colMap; private boolean [] colKilled; /** maps actions to their switch label */ private Hashtable actionTable = new Hashtable(); private CharClassInterval [] intervals; private String visibility = "public"; public Emitter(File inputFile, LexParse parser, DFA dfa) throws IOException { String name = getBaseName(parser.scanner.className) + ".java"; File outputFile = normalize(name, inputFile); Out.println("Writing code to \""+outputFile+"\""); this.out = new PrintWriter(new BufferedWriter(new FileWriter(outputFile))); this.parser = parser; this.scanner = parser.scanner; this.visibility = scanner.visibility; this.inputFile = inputFile; this.dfa = dfa; this.skel = new Skeleton(out); } /** * Computes base name of the class name. Needs to take into account generics. * * @see LexScan#className * @return the */ public static String getBaseName(String className) { int gen = className.indexOf('<'); if (gen < 0) { return className; } else { return className.substring(0, gen); } } /** * Constructs a file in Options.getDir() or in the same directory as * another file. Makes a backup if the file already exists. * * @param name the name (without path) of the file * @param path the path where to construct the file * @param input fall back location if path = null * (expected to be a file in the directory to write to) */ public static File normalize(String name, File input) { File outputFile; if ( Options.getDir() == null ) if ( input == null || input.getParent() == null ) outputFile = new File(name); else outputFile = new File(input.getParent(), name); else outputFile = new File(Options.getDir(), name); if ( outputFile.exists() && !Options.no_backup ) { File backup = new File( outputFile.toString()+"~" ); if ( backup.exists() ) backup.delete(); if ( outputFile.renameTo( backup ) ) Out.println("Old file \""+outputFile+"\" saved as \""+backup+"\""); else Out.println("Couldn't save old file \""+outputFile+"\", overwriting!"); } return outputFile; } private void println() { out.println(); } private void println(String line) { out.println(line); } private void println(int i) { out.println(i); } private void print(String line) { out.print(line); } private void print(int i) { out.print(i); } private void print(int i, int tab) { int exp; if (i < 0) exp = 1; else exp = 10; while (tab-- > 1) { if (Math.abs(i) < exp) print(" "); exp*= 10; } print(i); } private boolean hasGenLookAhead() { return dfa.lookaheadUsed; } private void emitLookBuffer() { if (!hasGenLookAhead()) return; println(" /** For the backwards DFA of general lookahead statements */"); println(" private boolean [] zzFin = new boolean [ZZ_BUFFERSIZE+1];"); println(); } private void emitScanError() { print(" private void zzScanError(int errorCode)"); if (scanner.scanErrorException != null) print(" throws "+scanner.scanErrorException); println(" {"); skel.emitNext(); if (scanner.scanErrorException == null) println(" throw new Error(message);"); else println(" throw new "+scanner.scanErrorException+"(message);"); skel.emitNext(); print(" "+visibility+" void yypushback(int number) "); if (scanner.scanErrorException == null) println(" {"); else println(" throws "+scanner.scanErrorException+" {"); } private void emitMain() { if ( !(scanner.standalone || scanner.debugOption || scanner.cupDebug) ) return; if ( scanner.cupDebug ) { println(" /**"); println(" * Converts an int token code into the name of the"); println(" * token by reflection on the cup symbol class/interface "+scanner.cupSymbol); println(" *"); println(" * This code was contributed by Karl Meissner "); println(" */"); println(" private String getTokenName(int token) {"); println(" try {"); println(" java.lang.reflect.Field [] classFields = " + scanner.cupSymbol + ".class.getFields();"); println(" for (int i = 0; i < classFields.length; i++) {"); println(" if (classFields[i].getInt(null) == token) {"); println(" return classFields[i].getName();"); println(" }"); println(" }"); println(" } catch (Exception e) {"); println(" e.printStackTrace(System.err);"); println(" }"); println(""); println(" return \"UNKNOWN TOKEN\";"); println(" }"); println(""); println(" /**"); println(" * Same as "+scanner.functionName+" but also prints the token to standard out"); println(" * for debugging."); println(" *"); println(" * This code was contributed by Karl Meissner "); println(" */"); print(" "+visibility+" "); if ( scanner.tokenType == null ) { if ( scanner.isInteger ) print( "int" ); else if ( scanner.isIntWrap ) print( "Integer" ); else print( "Yytoken" ); } else print( scanner.tokenType ); print(" debug_"); print(scanner.functionName); print("() throws java.io.IOException"); if ( scanner.lexThrow != null ) { print(", "); print(scanner.lexThrow); } if ( scanner.scanErrorException != null ) { print(", "); print(scanner.scanErrorException); } println(" {"); println(" java_cup.runtime.Symbol s = "+scanner.functionName+"();"); print(" System.out.println( "); if (scanner.lineCount) print("\"line:\" + (yyline+1) + "); if (scanner.columnCount) print("\" col:\" + (yycolumn+1) + "); println("\" --\"+ yytext() + \"--\" + getTokenName(s.sym) + \"--\");"); println(" return s;"); println(" }"); println(""); } if ( scanner.standalone ) { println(" /**"); println(" * Runs the scanner on input files."); println(" *"); println(" * This is a standalone scanner, it will print any unmatched"); println(" * text to System.out unchanged."); println(" *"); println(" * @param argv the command line, contains the filenames to run"); println(" * the scanner on."); println(" */"); } else { println(" /**"); println(" * Runs the scanner on input files."); println(" *"); println(" * This main method is the debugging routine for the scanner."); println(" * It prints debugging information about each returned token to"); println(" * System.out until the end of file is reached, or an error occured."); println(" *"); println(" * @param argv the command line, contains the filenames to run"); println(" * the scanner on."); println(" */"); } String className = getBaseName(scanner.className); println(" public static void main(String argv[]) {"); println(" if (argv.length == 0) {"); println(" System.out.println(\"Usage : java "+className+" \");"); println(" }"); println(" else {"); println(" for (int i = 0; i < argv.length; i++) {"); println(" "+className+" scanner = null;"); println(" try {"); println(" scanner = new "+className+"( new java.io.FileReader(argv[i]) );"); if ( scanner.standalone ) { println(" while ( !scanner.zzAtEOF ) scanner."+scanner.functionName+"();"); } else if (scanner.cupDebug ) { println(" while ( !scanner.zzAtEOF ) scanner.debug_"+scanner.functionName+"();"); } else { println(" do {"); println(" System.out.println(scanner."+scanner.functionName+"());"); println(" } while (!scanner.zzAtEOF);"); println(""); } println(" }"); println(" catch (java.io.FileNotFoundException e) {"); println(" System.out.println(\"File not found : \\\"\"+argv[i]+\"\\\"\");"); println(" }"); println(" catch (java.io.IOException e) {"); println(" System.out.println(\"IO error scanning file \\\"\"+argv[i]+\"\\\"\");"); println(" System.out.println(e);"); println(" }"); println(" catch (Exception e) {"); println(" System.out.println(\"Unexpected exception:\");"); println(" e.printStackTrace();"); println(" }"); println(" }"); println(" }"); println(" }"); println(""); } private void emitNoMatch() { println(" zzScanError(ZZ_NO_MATCH);"); } private void emitNextInput() { println(" if (zzCurrentPosL < zzEndReadL)"); println(" zzInput = zzBufferL[zzCurrentPosL++];"); println(" else if (zzAtEOF) {"); println(" zzInput = YYEOF;"); println(" break zzForAction;"); println(" }"); println(" else {"); println(" // store back cached positions"); println(" zzCurrentPos = zzCurrentPosL;"); println(" zzMarkedPos = zzMarkedPosL;"); println(" boolean eof = zzRefill();"); println(" // get translated positions and possibly new buffer"); println(" zzCurrentPosL = zzCurrentPos;"); println(" zzMarkedPosL = zzMarkedPos;"); println(" zzBufferL = zzBuffer;"); println(" zzEndReadL = zzEndRead;"); println(" if (eof) {"); println(" zzInput = YYEOF;"); println(" break zzForAction;"); println(" }"); println(" else {"); println(" zzInput = zzBufferL[zzCurrentPosL++];"); println(" }"); println(" }"); } private void emitHeader() { println("/* The following code was generated by JFlex "+Main.version+" on "+date+" */"); println(""); } private void emitUserCode() { if ( scanner.userCode.length() > 0 ) println(scanner.userCode.toString()); } private void emitClassName() { if (!endsWithJavadoc(scanner.userCode)) { String path = inputFile.toString(); // slashify path (avoid backslash u sequence = unicode escape) if (File.separatorChar != '/') { path = path.replace(File.separatorChar, '/'); } println("/**"); println(" * This class is a scanner generated by "); println(" * JFlex "+Main.version); println(" * on "+date+" from the specification file"); println(" * "+path+""); println(" */"); } if ( scanner.isPublic ) print("public "); if ( scanner.isAbstract) print("abstract "); if ( scanner.isFinal ) print("final "); print("class "); print(scanner.className); if ( scanner.isExtending != null ) { print(" extends "); print(scanner.isExtending); } if ( scanner.isImplementing != null ) { print(" implements "); print(scanner.isImplementing); } println(" {"); } /** * Try to find out if user code ends with a javadoc comment * * @param buffer the user code * @return true if it ends with a javadoc comment */ public static boolean endsWithJavadoc(StringBuffer usercode) { String s = usercode.toString().trim(); if (!s.endsWith("*/")) return false; // find beginning of javadoc comment int i = s.lastIndexOf("/**"); if (i < 0) return false; // javadoc comment shouldn't contain a comment end return s.substring(i,s.length()-2).indexOf("*/") < 0; } private void emitLexicalStates() { Enumeration stateNames = scanner.states.names(); while ( stateNames.hasMoreElements() ) { String name = (String) stateNames.nextElement(); int num = scanner.states.getNumber(name).intValue(); println(" "+visibility+" static final int "+name+" = "+2*num+";"); } // can't quite get rid of the indirection, even for non-bol lex states: // their DFA states might be the same, but their EOF actions might be different // (see bug #1540228) println(""); println(" /**"); println(" * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l"); println(" * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l"); println(" * at the beginning of a line"); println(" * l is of the form l = 2*k, k a non negative integer"); println(" */"); println(" private static final int ZZ_LEXSTATE[] = { "); int i, j = 0; print(" "); for (i = 0; i < 2*dfa.numLexStates-1; i++) { print( dfa.entryState[i], 2 ); print(", "); if (++j >= 16) { println(); print(" "); j = 0; } } println( dfa.entryState[i] ); println(" };"); } private void emitDynamicInit() { int count = 0; int value = dfa.table[0][0]; println(" /** "); println(" * The transition table of the DFA"); println(" */"); CountEmitter e = new CountEmitter("Trans"); e.setValTranslation(+1); // allow vals in [-1, 0xFFFE] e.emitInit(); for (int i = 0; i < dfa.numStates; i++) { if ( !rowKilled[i] ) { for (int c = 0; c < dfa.numInput; c++) { if ( !colKilled[c] ) { if (dfa.table[i][c] == value) { count++; } else { e.emit(count, value); count = 1; value = dfa.table[i][c]; } } } } } e.emit(count, value); e.emitUnpack(); println(e.toString()); } private void emitCharMapInitFunction() { CharClasses cl = parser.getCharClasses(); if ( cl.getMaxCharCode() < 256 ) return; println(""); println(" /** "); println(" * Unpacks the compressed character translation table."); println(" *"); println(" * @param packed the packed character translation table"); println(" * @return the unpacked character translation table"); println(" */"); println(" private static char [] zzUnpackCMap(String packed) {"); println(" char [] map = new char[0x10000];"); println(" int i = 0; /* index in packed string */"); println(" int j = 0; /* index in unpacked array */"); println(" while (i < "+2*intervals.length+") {"); println(" int count = packed.charAt(i++);"); println(" char value = packed.charAt(i++);"); println(" do map[j++] = value; while (--count > 0);"); println(" }"); println(" return map;"); println(" }"); } private void emitZZTrans() { int i,c; int n = 0; println(" /** "); println(" * The transition table of the DFA"); println(" */"); println(" private static final int ZZ_TRANS [] = {"); print(" "); for (i = 0; i < dfa.numStates; i++) { if ( !rowKilled[i] ) { for (c = 0; c < dfa.numInput; c++) { if ( !colKilled[c] ) { if (n >= 10) { println(); print(" "); n = 0; } print( dfa.table[i][c] ); if (i != dfa.numStates-1 || c != dfa.numInput-1) print( ", "); n++; } } } } println(); println(" };"); } private void emitCharMapArrayUnPacked() { CharClasses cl = parser.getCharClasses(); println(""); println(" /** "); println(" * Translates characters to character classes"); println(" */"); println(" private static final char [] ZZ_CMAP = {"); int n = 0; // numbers of entries in current line print(" "); int max = cl.getMaxCharCode(); // not very efficient, but good enough for <= 255 characters for (char c = 0; c <= max; c++) { print(colMap[cl.getClassCode(c)],2); if (c < max) { print(", "); if ( ++n >= 16 ) { println(); print(" "); n = 0; } } } println(); println(" };"); println(); } private void emitCharMapArray() { CharClasses cl = parser.getCharClasses(); if ( cl.getMaxCharCode() < 256 ) { emitCharMapArrayUnPacked(); return; } // ignores cl.getMaxCharCode(), emits all intervals instead intervals = cl.getIntervals(); println(""); println(" /** "); println(" * Translates characters to character classes"); println(" */"); println(" private static final String ZZ_CMAP_PACKED = "); int n = 0; // numbers of entries in current line print(" \""); int i = 0; int count, value; while ( i < intervals.length ) { count = intervals[i].end-intervals[i].start+1; value = colMap[intervals[i].charClass]; // count could be >= 0x10000 while (count > 0xFFFF) { printUC(0xFFFF); printUC(value); count -= 0xFFFF; n++; } printUC(count); printUC(value); if (i < intervals.length-1) { if ( ++n >= 10 ) { println("\"+"); print(" \""); n = 0; } } i++; } println("\";"); println(); println(" /** "); println(" * Translates characters to character classes"); println(" */"); println(" private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);"); println(); } /** * Print number as octal/unicode escaped string character. * * @param c the value to print * @prec 0 <= c <= 0xFFFF */ private void printUC(int c) { if (c > 255) { out.print("\\u"); if (c < 0x1000) out.print("0"); out.print(Integer.toHexString(c)); } else { out.print("\\"); out.print(Integer.toOctalString(c)); } } private void emitRowMapArray() { println(""); println(" /** "); println(" * Translates a state to a row index in the transition table"); println(" */"); HiLowEmitter e = new HiLowEmitter("RowMap"); e.emitInit(); for (int i = 0; i < dfa.numStates; i++) { e.emit(rowMap[i]*numCols); } e.emitUnpack(); println(e.toString()); } private void emitAttributes() { println(" /**"); println(" * ZZ_ATTRIBUTE[aState] contains the attributes of state aState"); println(" */"); CountEmitter e = new CountEmitter("Attribute"); e.emitInit(); int count = 1; int value = 0; if ( dfa.isFinal[0] ) value = FINAL; if ( !isTransition[0] ) value|= NOLOOK; for (int i = 1; i < dfa.numStates; i++) { int attribute = 0; if ( dfa.isFinal[i] ) attribute = FINAL; if ( !isTransition[i] ) attribute|= NOLOOK; if (value == attribute) { count++; } else { e.emit(count, value); count = 1; value = attribute; } } e.emit(count, value); e.emitUnpack(); println(e.toString()); } private void emitClassCode() { if ( scanner.classCode != null ) { println(" /* user code: */"); println(scanner.classCode); } } private void emitConstructorDecl() { emitConstructorDecl(true); if ((scanner.standalone || scanner.debugOption) && scanner.ctorArgs.size() > 0) { Out.warning(ErrorMessages.get(ErrorMessages.CTOR_DEBUG)); println(); emitConstructorDecl(false); } } private void emitConstructorDecl(boolean printCtorArgs) { String warn = "// WARNING: this is a default constructor for " + "debug/standalone only. Has no custom parameters or init code."; if (!printCtorArgs) println(warn); print(" "); if ( scanner.isPublic ) print("public "); print( getBaseName(scanner.className) ); print("(java.io.Reader in"); if (printCtorArgs) emitCtorArgs(); print(")"); if ( scanner.initThrow != null && printCtorArgs) { print(" throws "); print( scanner.initThrow ); } println(" {"); if ( scanner.initCode != null && printCtorArgs) { print(" "); print( scanner.initCode ); } println(" this.zzReader = in;"); println(" }"); println(); println(" /**"); println(" * Creates a new scanner."); println(" * There is also java.io.Reader version of this constructor."); println(" *"); println(" * @param in the java.io.Inputstream to read input from."); println(" */"); if (!printCtorArgs) println(warn); print(" "); if ( scanner.isPublic ) print("public "); print( getBaseName(scanner.className) ); print("(java.io.InputStream in"); if (printCtorArgs) emitCtorArgs(); print(")"); if ( scanner.initThrow != null && printCtorArgs ) { print(" throws "); print( scanner.initThrow ); } println(" {"); print(" this(new java.io.InputStreamReader(in)"); if (printCtorArgs) { for (int i=0; i < scanner.ctorArgs.size(); i++) { print(", "+scanner.ctorArgs.elementAt(i)); } } println(");"); println(" }"); } private void emitCtorArgs() { for (int i = 0; i < scanner.ctorArgs.size(); i++) { print(", "+scanner.ctorTypes.elementAt(i)); print(" "+scanner.ctorArgs.elementAt(i)); } } private void emitDoEOF() { if ( scanner.eofCode == null ) return; println(" /**"); println(" * Contains user EOF-code, which will be executed exactly once,"); println(" * when the end of file is reached"); println(" */"); print(" private void zzDoEOF()"); if ( scanner.eofThrow != null ) { print(" throws "); print(scanner.eofThrow); } println(" {"); println(" if (!zzEOFDone) {"); println(" zzEOFDone = true;"); println(" "+scanner.eofCode ); println(" }"); println(" }"); println(""); println(""); } private void emitLexFunctHeader() { if (scanner.cupCompatible) { // force public, because we have to implement java_cup.runtime.Symbol print(" public "); } else { print(" "+visibility+" "); } if ( scanner.tokenType == null ) { if ( scanner.isInteger ) print( "int" ); else if ( scanner.isIntWrap ) print( "Integer" ); else print( "Yytoken" ); } else print( scanner.tokenType ); print(" "); print(scanner.functionName); print("() throws java.io.IOException"); if ( scanner.lexThrow != null ) { print(", "); print(scanner.lexThrow); } if ( scanner.scanErrorException != null ) { print(", "); print(scanner.scanErrorException); } println(" {"); skel.emitNext(); if ( scanner.useRowMap ) { println(" int [] zzTransL = ZZ_TRANS;"); println(" int [] zzRowMapL = ZZ_ROWMAP;"); println(" int [] zzAttrL = ZZ_ATTRIBUTE;"); } skel.emitNext(); if ( scanner.charCount ) { println(" yychar+= zzMarkedPosL-zzStartRead;"); println(""); } if ( scanner.lineCount || scanner.columnCount ) { println(" boolean zzR = false;"); println(" for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL;"); println(" zzCurrentPosL++) {"); println(" switch (zzBufferL[zzCurrentPosL]) {"); println(" case '\\u000B':"); println(" case '\\u000C':"); println(" case '\\u0085':"); println(" case '\\u2028':"); println(" case '\\u2029':"); if ( scanner.lineCount ) println(" yyline++;"); if ( scanner.columnCount ) println(" yycolumn = 0;"); println(" zzR = false;"); println(" break;"); println(" case '\\r':"); if ( scanner.lineCount ) println(" yyline++;"); if ( scanner.columnCount ) println(" yycolumn = 0;"); println(" zzR = true;"); println(" break;"); println(" case '\\n':"); println(" if (zzR)"); println(" zzR = false;"); println(" else {"); if ( scanner.lineCount ) println(" yyline++;"); if ( scanner.columnCount ) println(" yycolumn = 0;"); println(" }"); println(" break;"); println(" default:"); println(" zzR = false;"); if ( scanner.columnCount ) println(" yycolumn++;"); println(" }"); println(" }"); println(); if ( scanner.lineCount ) { println(" if (zzR) {"); println(" // peek one character ahead if it is \\n (if we have counted one line too much)"); println(" boolean zzPeek;"); println(" if (zzMarkedPosL < zzEndReadL)"); println(" zzPeek = zzBufferL[zzMarkedPosL] == '\\n';"); println(" else if (zzAtEOF)"); println(" zzPeek = false;"); println(" else {"); println(" boolean eof = zzRefill();"); println(" zzEndReadL = zzEndRead;"); println(" zzMarkedPosL = zzMarkedPos;"); println(" zzBufferL = zzBuffer;"); println(" if (eof) "); println(" zzPeek = false;"); println(" else "); println(" zzPeek = zzBufferL[zzMarkedPosL] == '\\n';"); println(" }"); println(" if (zzPeek) yyline--;"); println(" }"); } } if ( scanner.bolUsed ) { // zzMarkedPos > zzStartRead <=> last match was not empty // if match was empty, last value of zzAtBOL can be used // zzStartRead is always >= 0 println(" if (zzMarkedPosL > zzStartRead) {"); println(" switch (zzBufferL[zzMarkedPosL-1]) {"); println(" case '\\n':"); println(" case '\\u000B':"); println(" case '\\u000C':"); println(" case '\\u0085':"); println(" case '\\u2028':"); println(" case '\\u2029':"); println(" zzAtBOL = true;"); println(" break;"); println(" case '\\r': "); println(" if (zzMarkedPosL < zzEndReadL)"); println(" zzAtBOL = zzBufferL[zzMarkedPosL] != '\\n';"); println(" else if (zzAtEOF)"); println(" zzAtBOL = false;"); println(" else {"); println(" boolean eof = zzRefill();"); println(" zzMarkedPosL = zzMarkedPos;"); println(" zzEndReadL = zzEndRead;"); println(" zzBufferL = zzBuffer;"); println(" if (eof) "); println(" zzAtBOL = false;"); println(" else "); println(" zzAtBOL = zzBufferL[zzMarkedPosL] != '\\n';"); println(" }"); println(" break;"); println(" default:"); println(" zzAtBOL = false;"); println(" }"); println(" }"); } skel.emitNext(); if (scanner.bolUsed) { println(" if (zzAtBOL)"); println(" zzState = ZZ_LEXSTATE[zzLexicalState+1];"); println(" else"); println(" zzState = ZZ_LEXSTATE[zzLexicalState];"); println(); } else { println(" zzState = ZZ_LEXSTATE[zzLexicalState];"); println(); } skel.emitNext(); } private void emitGetRowMapNext() { println(" int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];"); println(" if (zzNext == "+DFA.NO_TARGET+") break zzForAction;"); println(" zzState = zzNext;"); println(); println(" int zzAttributes = zzAttrL[zzState];"); println(" if ( (zzAttributes & "+FINAL+") == "+FINAL+" ) {"); skel.emitNext(); println(" if ( (zzAttributes & "+NOLOOK+") == "+NOLOOK+" ) break zzForAction;"); skel.emitNext(); } private void emitTransitionTable() { transformTransitionTable(); println(" zzInput = zzCMapL[zzInput];"); println(); println(" boolean zzIsFinal = false;"); println(" boolean zzNoLookAhead = false;"); println(); println(" zzForNext: { switch (zzState) {"); for (int state = 0; state < dfa.numStates; state++) if (isTransition[state]) emitState(state); println(" default:"); println(" // if this is ever reached, there is a serious bug in JFlex"); println(" zzScanError(ZZ_UNKNOWN_ERROR);"); println(" break;"); println(" } }"); println(); println(" if ( zzIsFinal ) {"); skel.emitNext(); println(" if ( zzNoLookAhead ) break zzForAction;"); skel.emitNext(); } /** * Escapes all " ' \ tabs and newlines */ private String escapify(String s) { StringBuffer result = new StringBuffer(s.length()*2); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch (c) { case '\'': result.append("\\\'"); break; case '\"': result.append("\\\""); break; case '\\': result.append("\\\\"); break; case '\t': result.append("\\t"); break; case '\r': if (i+1 == s.length() || s.charAt(i+1) != '\n') result.append("\"+ZZ_NL+\""); break; case '\n': result.append("\"+ZZ_NL+\""); break; default: result.append(c); } } return result.toString(); } public void emitActionTable() { int lastAction = 1; int count = 0; int value = 0; println(" /** "); println(" * Translates DFA states to action switch labels."); println(" */"); CountEmitter e = new CountEmitter("Action"); e.emitInit(); for (int i = 0; i < dfa.numStates; i++) { int newVal = 0; if ( dfa.isFinal[i] ) { Action action = dfa.action[i]; if (action.isEmittable()) { Integer stored = (Integer) actionTable.get(action); if ( stored == null ) { stored = new Integer(lastAction++); actionTable.put(action, stored); } newVal = stored.intValue(); } } if (value == newVal) { count++; } else { if (count > 0) e.emit(count,value); count = 1; value = newVal; } } if (count > 0) e.emit(count,value); e.emitUnpack(); println(e.toString()); } private void emitActions() { println(" switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {"); int i = actionTable.size()+1; Enumeration actions = actionTable.keys(); while ( actions.hasMoreElements() ) { Action action = (Action) actions.nextElement(); int label = ((Integer) actionTable.get(action)).intValue(); println(" case "+label+": "); if (action.lookAhead() == Action.FIXED_BASE) { println(" // lookahead expression with fixed base length"); println(" zzMarkedPos = zzStartRead + "+action.getLookLength()+";"); } if (action.lookAhead() == Action.FIXED_LOOK || action.lookAhead() == Action.FINITE_CHOICE) { println(" // lookahead expression with fixed lookahead length"); println(" yypushback("+action.getLookLength()+");"); } if (action.lookAhead() == Action.GENERAL_LOOK) { println(" // general lookahead, find correct zzMarkedPos"); println(" { int zzFState = "+dfa.entryState[action.getEntryState()]+";"); println(" int zzFPos = zzStartRead;"); println(" if (zzFin.length <= zzBufferL.length) { zzFin = new boolean[zzBufferL.length+1]; }"); println(" boolean zzFinL[] = zzFin;"); println(" while (zzFState != -1 && zzFPos < zzMarkedPos) {"); println(" if ((zzAttrL[zzFState] & 1) == 1) { zzFinL[zzFPos] = true; } "); println(" zzInput = zzBufferL[zzFPos++];"); println(" zzFState = zzTransL[ zzRowMapL[zzFState] + zzCMapL[zzInput] ];"); println(" }"); println(" if (zzFState != -1 && (zzAttrL[zzFState] & 1) == 1) { zzFinL[zzFPos] = true; } "); println(); println(" zzFState = "+dfa.entryState[action.getEntryState()+1]+";"); println(" zzFPos = zzMarkedPos;"); println(" while (!zzFinL[zzFPos] || (zzAttrL[zzFState] & 1) != 1) {"); println(" zzInput = zzBufferL[--zzFPos];"); println(" zzFState = zzTransL[ zzRowMapL[zzFState] + zzCMapL[zzInput] ];"); println(" };"); println(" zzMarkedPos = zzFPos;"); println(" }"); } if ( scanner.debugOption ) { print(" System.out.println("); if ( scanner.lineCount ) print("\"line: \"+(yyline+1)+\" \"+"); if ( scanner.columnCount ) print("\"col: \"+(yycolumn+1)+\" \"+"); println("\"match: --\"+yytext()+\"--\");"); print(" System.out.println(\"action ["+action.priority+"] { "); print(escapify(action.content)); println(" }\");"); } println(" { "+action.content); println(" }"); println(" case "+(i++)+": break;"); } } private void emitEOFVal() { EOFActions eofActions = parser.getEOFActions(); if ( scanner.eofCode != null ) println(" zzDoEOF();"); if ( eofActions.numActions() > 0 ) { println(" switch (zzLexicalState) {"); Enumeration stateNames = scanner.states.names(); // record lex states already emitted: Hashtable used = new Hashtable(); // pick a start value for break case labels. // must be larger than any value of a lex state: int last = dfa.numStates; while ( stateNames.hasMoreElements() ) { String name = (String) stateNames.nextElement(); int num = scanner.states.getNumber(name).intValue(); Action action = eofActions.getAction(num); if (action != null) { println(" case "+name+": {"); if ( scanner.debugOption ) { print(" System.out.println("); if ( scanner.lineCount ) print("\"line: \"+(yyline+1)+\" \"+"); if ( scanner.columnCount ) print("\"col: \"+(yycolumn+1)+\" \"+"); println("\"match: <>\");"); print(" System.out.println(\"action ["+action.priority+"] { "); print(escapify(action.content)); println(" }\");"); } println(" "+action.content); println(" }"); println(" case "+(++last)+": break;"); } } println(" default:"); } Action defaultAction = eofActions.getDefault(); if (defaultAction != null) { println(" {"); if ( scanner.debugOption ) { print(" System.out.println("); if ( scanner.lineCount ) print("\"line: \"+(yyline+1)+\" \"+"); if ( scanner.columnCount ) print("\"col: \"+(yycolumn+1)+\" \"+"); println("\"match: <>\");"); print(" System.out.println(\"action ["+defaultAction.priority+"] { "); print(escapify(defaultAction.content)); println(" }\");"); } println(" " + defaultAction.content); println(" }"); } else if ( scanner.eofVal != null ) println(" { " + scanner.eofVal + " }"); else if ( scanner.isInteger ) { if ( scanner.tokenType != null ) { Out.error(ErrorMessages.INT_AND_TYPE); throw new GeneratorException(); } println(" return YYEOF;"); } else println(" return null;"); if (eofActions.numActions() > 0) println(" }"); } private void emitState(int state) { println(" case "+state+":"); println(" switch (zzInput) {"); int defaultTransition = getDefaultTransition(state); for (int next = 0; next < dfa.numStates; next++) { if ( next != defaultTransition && table[state][next] != null ) { emitTransition(state, next); } } if ( defaultTransition != DFA.NO_TARGET && noTarget[state] != null ) { emitTransition(state, DFA.NO_TARGET); } emitDefaultTransition(state, defaultTransition); println(" }"); println(""); } private void emitTransition(int state, int nextState) { CharSetEnumerator chars; if (nextState != DFA.NO_TARGET) chars = table[state][nextState].characters(); else chars = noTarget[state].characters(); print(" case "); print(chars.nextElement()); print(": "); while ( chars.hasMoreElements() ) { println(); print(" case "); print(chars.nextElement()); print(": "); } if ( nextState != DFA.NO_TARGET ) { if ( dfa.isFinal[nextState] ) print("zzIsFinal = true; "); if ( !isTransition[nextState] ) print("zzNoLookAhead = true; "); if ( nextState == state ) println("break zzForNext;"); else println("zzState = "+nextState+"; break zzForNext;"); } else println("break zzForAction;"); } private void emitDefaultTransition(int state, int nextState) { print(" default: "); if ( nextState != DFA.NO_TARGET ) { if ( dfa.isFinal[nextState] ) print("zzIsFinal = true; "); if ( !isTransition[nextState] ) print("zzNoLookAhead = true; "); if ( nextState == state ) println("break zzForNext;"); else println("zzState = "+nextState+"; break zzForNext;"); } else println( "break zzForAction;" ); } private int getDefaultTransition(int state) { int max = 0; for (int i = 0; i < dfa.numStates; i++) { if ( table[state][max] == null ) max = i; else if ( table[state][i] != null && table[state][max].size() < table[state][i].size() ) max = i; } if ( table[state][max] == null ) return DFA.NO_TARGET; if ( noTarget[state] == null ) return max; if ( table[state][max].size() < noTarget[state].size() ) max = DFA.NO_TARGET; return max; } // for switch statement: private void transformTransitionTable() { int numInput = parser.getCharClasses().getNumClasses()+1; int i; char j; table = new CharSet[dfa.numStates][dfa.numStates]; noTarget = new CharSet[dfa.numStates]; for (i = 0; i < dfa.numStates; i++) for (j = 0; j < dfa.numInput; j++) { int nextState = dfa.table[i][j]; if ( nextState == DFA.NO_TARGET ) { if ( noTarget[i] == null ) noTarget[i] = new CharSet(numInput, colMap[j]); else noTarget[i].add(colMap[j]); } else { if ( table[i][nextState] == null ) table[i][nextState] = new CharSet(numInput, colMap[j]); else table[i][nextState].add(colMap[j]); } } } private void findActionStates() { isTransition = new boolean [dfa.numStates]; for (int i = 0; i < dfa.numStates; i++) { char j = 0; while ( !isTransition[i] && j < dfa.numInput ) isTransition[i] = dfa.table[i][j++] != DFA.NO_TARGET; } } private void reduceColumns() { colMap = new int [dfa.numInput]; colKilled = new boolean [dfa.numInput]; int i,j,k; int translate = 0; boolean equal; numCols = dfa.numInput; for (i = 0; i < dfa.numInput; i++) { colMap[i] = i-translate; for (j = 0; j < i; j++) { // test for equality: k = -1; equal = true; while (equal && ++k < dfa.numStates) equal = dfa.table[k][i] == dfa.table[k][j]; if (equal) { translate++; colMap[i] = colMap[j]; colKilled[i] = true; numCols--; break; } // if } // for j } // for i } private void reduceRows() { rowMap = new int [dfa.numStates]; rowKilled = new boolean [dfa.numStates]; int i,j,k; int translate = 0; boolean equal; numRows = dfa.numStates; // i is the state to add to the new table for (i = 0; i < dfa.numStates; i++) { rowMap[i] = i-translate; // check if state i can be removed (i.e. already // exists in entries 0..i-1) for (j = 0; j < i; j++) { // test for equality: k = -1; equal = true; while (equal && ++k < dfa.numInput) equal = dfa.table[i][k] == dfa.table[j][k]; if (equal) { translate++; rowMap[i] = rowMap[j]; rowKilled[i] = true; numRows--; break; } // if } // for j } // for i } /** * Set up EOF code section according to scanner.eofcode */ private void setupEOFCode() { if (scanner.eofclose) { scanner.eofCode = LexScan.conc(scanner.eofCode, " yyclose();"); scanner.eofThrow = LexScan.concExc(scanner.eofThrow, "java.io.IOException"); } } /** * Main Emitter method. */ public void emit() { setupEOFCode(); if (scanner.functionName == null) scanner.functionName = "yylex"; reduceColumns(); findActionStates(); emitHeader(); emitUserCode(); emitClassName(); skel.emitNext(); println(" private static final int ZZ_BUFFERSIZE = "+scanner.bufferSize+";"); if (scanner.debugOption) { println(" private static final String ZZ_NL = System.getProperty(\"line.separator\");"); } skel.emitNext(); emitLexicalStates(); emitCharMapArray(); emitActionTable(); if (scanner.useRowMap) { reduceRows(); emitRowMapArray(); if (scanner.packed) emitDynamicInit(); else emitZZTrans(); } skel.emitNext(); if (scanner.useRowMap) emitAttributes(); skel.emitNext(); emitLookBuffer(); emitClassCode(); skel.emitNext(); emitConstructorDecl(); emitCharMapInitFunction(); skel.emitNext(); emitScanError(); skel.emitNext(); emitDoEOF(); skel.emitNext(); emitLexFunctHeader(); emitNextInput(); if (scanner.useRowMap) emitGetRowMapNext(); else emitTransitionTable(); skel.emitNext(); emitActions(); skel.emitNext(); emitEOFVal(); skel.emitNext(); emitNoMatch(); skel.emitNext(); emitMain(); skel.emitNext(); out.close(); } } jflex-1.4.3/src/JFlex/EOFActions.java0000644000175000017500000000635411141010522015720 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.util.*; /** * A simple table to store EOF actions for each lexical state. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class EOFActions { /** maps lexical states to actions */ private Hashtable /* Integer -> Action */ actions = new Hashtable(); private Action defaultAction; private int numLexStates; public void setNumLexStates(int num) { numLexStates = num; } public void add(Vector stateList, Action action) { if (stateList != null && stateList.size() > 0) { Enumeration states = stateList.elements(); while (states.hasMoreElements()) add( (Integer) states.nextElement(), action ); } else { defaultAction = action.getHigherPriority(defaultAction); for (int i = 0; i < numLexStates; i++) { Integer state = new Integer(i); if ( actions.get(state) != null ) { Action oldAction = (Action) actions.get(state); actions.put(state, oldAction.getHigherPriority(action)); } } } } public void add(Integer state, Action action) { if ( actions.get(state) == null ) actions.put(state, action); else { Action oldAction = (Action) actions.get(state); actions.put(state, oldAction.getHigherPriority(action)); } } public boolean isEOFAction(Object a) { if (a == defaultAction) return true; Enumeration e = actions.elements(); while ( e.hasMoreElements() ) if (a == e.nextElement()) return true; return false; } public Action getAction(int state) { return (Action) actions.get(new Integer(state)); } public Action getDefault() { return defaultAction; } public int numActions() { return actions.size(); } } jflex-1.4.3/src/JFlex/ErrorMessages.java0000644000175000017500000002137711141010522016551 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software); you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY); without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program); if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.text.MessageFormat; import java.util.MissingResourceException; import java.util.ResourceBundle; /** * Central class for all kinds of JFlex messages. * * [Is not yet used exclusively, but should] * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class ErrorMessages { private String key; /* not final static, because initializing here seems too early * for OS/2 JDK 1.1.8. See bug 1065521. */ private static ResourceBundle resourceBundle = null; private ErrorMessages(String key) { this.key = key; } public static String get(ErrorMessages msg) { if (resourceBundle == null) { resourceBundle = ResourceBundle.getBundle("JFlex.Messages"); } try { return resourceBundle.getString(msg.key); } catch (MissingResourceException e) { return '!' + msg.key + '!'; } } public static String get(ErrorMessages msg, String data) { Object [] args = { data }; return MessageFormat.format(get(msg),args); } public static String get(ErrorMessages msg, String data1, String data2) { Object [] args = { data1, data2 }; return MessageFormat.format(get(msg),args); } public static String get(ErrorMessages msg, int data) { Object [] args = { new Integer(data) }; return MessageFormat.format(get(msg),args); } // typesafe enumeration (generated, do not edit) public static ErrorMessages UNTERMINATED_STR = new ErrorMessages("UNTERMINATED_STR"); public static ErrorMessages EOF_WO_ACTION = new ErrorMessages("EOF_WO_ACTION"); public static ErrorMessages EOF_SINGLERULE = new ErrorMessages("EOF_SINGLERULE"); public static ErrorMessages UNKNOWN_OPTION = new ErrorMessages("UNKNOWN_OPTION"); public static ErrorMessages UNEXPECTED_CHAR = new ErrorMessages("UNEXPECTED_CHAR"); public static ErrorMessages UNEXPECTED_NL = new ErrorMessages("UNEXPECTED_NL"); public static ErrorMessages LEXSTATE_UNDECL = new ErrorMessages("LEXSTATE_UNDECL"); public static ErrorMessages STATE_IDENT_EXP = new ErrorMessages("STATE_IDENT_EXP"); public static ErrorMessages REPEAT_ZERO = new ErrorMessages("REPEAT_ZERO"); public static ErrorMessages REPEAT_GREATER = new ErrorMessages("REPEAT_GREATER"); public static ErrorMessages REGEXP_EXPECTED = new ErrorMessages("REGEXP_EXPECTED"); public static ErrorMessages MACRO_UNDECL = new ErrorMessages("MACRO_UNDECL"); public static ErrorMessages CHARSET_2_SMALL = new ErrorMessages("CHARSET_2_SMALL"); public static ErrorMessages CS2SMALL_STRING = new ErrorMessages("CS2SMALL_STRING"); public static ErrorMessages CS2SMALL_CHAR = new ErrorMessages("CS2SMALL_CHAR"); public static ErrorMessages CHARCLASS_MACRO = new ErrorMessages("CHARCLASS_MACRO"); public static ErrorMessages UNKNOWN_SYNTAX = new ErrorMessages("UNKNOWN_SYNTAX"); public static ErrorMessages SYNTAX_ERROR = new ErrorMessages("SYNTAX_ERROR"); public static ErrorMessages NOT_AT_BOL = new ErrorMessages("NOT_AT_BOL"); public static ErrorMessages NO_MATCHING_BR = new ErrorMessages("NO_MATCHING_BR"); public static ErrorMessages EOF_IN_ACTION = new ErrorMessages("EOF_IN_ACTION"); public static ErrorMessages EOF_IN_COMMENT = new ErrorMessages("EOF_IN_COMMENT"); public static ErrorMessages EOF_IN_STRING = new ErrorMessages("EOF_IN_STRING"); public static ErrorMessages EOF_IN_MACROS = new ErrorMessages("EOF_IN_MACROS"); public static ErrorMessages EOF_IN_STATES = new ErrorMessages("EOF_IN_STATES"); public static ErrorMessages EOF_IN_REGEXP = new ErrorMessages("EOF_IN_REGEXP"); public static ErrorMessages UNEXPECTED_EOF = new ErrorMessages("UNEXPECTED_EOF"); public static ErrorMessages NO_LEX_SPEC = new ErrorMessages("NO_LEX_SPEC"); public static ErrorMessages NO_LAST_ACTION = new ErrorMessages("NO_LAST_ACTION"); public static ErrorMessages NO_DIRECTORY = new ErrorMessages("NO_DIRECTORY"); public static ErrorMessages NO_SKEL_FILE = new ErrorMessages("NO_SKEL_FILE"); public static ErrorMessages WRONG_SKELETON = new ErrorMessages("WRONG_SKELETON"); public static ErrorMessages OUT_OF_MEMORY = new ErrorMessages("OUT_OF_MEMORY"); public static ErrorMessages QUIL_INITTHROW = new ErrorMessages("QUIL_INITTHROW"); public static ErrorMessages QUIL_EOFTHROW = new ErrorMessages("QUIL_EOFTHROW"); public static ErrorMessages QUIL_YYLEXTHROW = new ErrorMessages("QUIL_YYLEXTHROW"); public static ErrorMessages ZERO_STATES = new ErrorMessages("ZERO_STATES"); public static ErrorMessages NO_BUFFER_SIZE = new ErrorMessages("NO_BUFFER_SIZE"); public static ErrorMessages NOT_READABLE = new ErrorMessages("NOT_READABLE"); public static ErrorMessages FILE_CYCLE = new ErrorMessages("FILE_CYCLE"); public static ErrorMessages FILE_WRITE = new ErrorMessages("FILE_WRITE"); public static ErrorMessages QUIL_SCANERROR = new ErrorMessages("QUIL_SCANERROR"); public static ErrorMessages NEVER_MATCH = new ErrorMessages("NEVER_MATCH"); public static ErrorMessages QUIL_THROW = new ErrorMessages("QUIL_THROW"); public static ErrorMessages EOL_IN_CHARCLASS = new ErrorMessages("EOL_IN_CHARCLASS"); public static ErrorMessages QUIL_CUPSYM = new ErrorMessages("QUIL_CUPSYM"); public static ErrorMessages CUPSYM_AFTER_CUP = new ErrorMessages("CUPSYM_AFTER_CUP"); public static ErrorMessages ALREADY_RUNNING = new ErrorMessages("ALREADY_RUNNING"); public static ErrorMessages CANNOT_READ_SKEL = new ErrorMessages("CANNOT_READ_SKEL"); public static ErrorMessages READING_SKEL = new ErrorMessages("READING_SKEL"); public static ErrorMessages SKEL_IO_ERROR = new ErrorMessages("SKEL_IO_ERROR"); public static ErrorMessages SKEL_IO_ERROR_DEFAULT = new ErrorMessages("SKEL_IO_ERROR_DEFAULT"); public static ErrorMessages READING = new ErrorMessages("READING"); public static ErrorMessages CANNOT_OPEN = new ErrorMessages("CANNOT_OPEN"); public static ErrorMessages NFA_IS = new ErrorMessages("NFA_IS"); public static ErrorMessages NFA_STATES = new ErrorMessages("NFA_STATES"); public static ErrorMessages DFA_TOOK = new ErrorMessages("DFA_TOOK"); public static ErrorMessages DFA_IS = new ErrorMessages("DFA_IS"); public static ErrorMessages MIN_TOOK = new ErrorMessages("MIN_TOOK"); public static ErrorMessages MIN_DFA_IS = new ErrorMessages("MIN_DFA_IS"); public static ErrorMessages WRITE_TOOK = new ErrorMessages("WRITE_TOOK"); public static ErrorMessages TOTAL_TIME = new ErrorMessages("TOTAL_TIME"); public static ErrorMessages IO_ERROR = new ErrorMessages("IO_ERROR"); public static ErrorMessages THIS_IS_JFLEX = new ErrorMessages("THIS_IS_JFLEX"); public static ErrorMessages UNKNOWN_COMMANDLINE = new ErrorMessages("UNKNOWN_COMMANDLINE"); public static ErrorMessages MACRO_CYCLE = new ErrorMessages("MACRO_CYCLE"); public static ErrorMessages MACRO_DEF_MISSING = new ErrorMessages("MACRO_DEF_MISSING"); public static ErrorMessages PARSING_TOOK = new ErrorMessages("PARSING_TOOK"); public static ErrorMessages NFA_TOOK = new ErrorMessages("NFA_TOOK"); public static ErrorMessages LOOKAHEAD_NEEDS_ACTION = new ErrorMessages("LOOKAHEAD_NEEDS_ACTION"); public static ErrorMessages EMPTY_MATCH = new ErrorMessages("EMPTY_MATCH"); public static ErrorMessages CTOR_ARG = new ErrorMessages("CTOR_ARG"); public static ErrorMessages CTOR_DEBUG = new ErrorMessages("CTOR_DEBUG"); public static ErrorMessages INT_AND_TYPE = new ErrorMessages("INT_AND_TYPE"); }jflex-1.4.3/src/JFlex/GeneratorException.java0000644000175000017500000000340411141010522017564 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Thrown when code generation has to be aborted. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class GeneratorException extends RuntimeException { public GeneratorException() { super("Generation aborted"); } } jflex-1.4.3/src/JFlex/gui/0000755000175000017500000000000011141044622013707 5ustar moonmoonjflex-1.4.3/src/JFlex/gui/GeneratorThread.java0000644000175000017500000000626611141010522017632 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.gui; import JFlex.*; import java.io.File; /** * Low priority thread for code generation (low priority * that gui has time for screen updates) * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class GeneratorThread extends Thread { /** there must be at most one instance of this Thread running */ private static volatile boolean running = false; /** input file setting from GUI */ String inputFile; /** output directory */ String outputDir; /** main UI component, likes to be notified when generator finishes */ MainFrame parent; /** * Create a new GeneratorThread, but do not run it yet. * * @param parent the frame, main UI component * @param inputFile input file from UI settings * @param messages where generator messages should appear * @param outputDir output directory from UI settings */ public GeneratorThread(MainFrame parent, String inputFile, String outputDir) { this.parent = parent; this.inputFile = inputFile; this.outputDir = outputDir; } /** * Run the generator thread. Only one instance of it can run at any time. */ public void run() { if (running) { Out.error(ErrorMessages.ALREADY_RUNNING); parent.generationFinished(false); } else { running = true; setPriority(MIN_PRIORITY); try { if (!outputDir.equals("")) { Options.setDir(outputDir); } Main.generate(new File(inputFile)); Out.statistics(); parent.generationFinished(true); } catch (GeneratorException e) { Out.statistics(); parent.generationFinished(false); } finally { running = false; } } } } jflex-1.4.3/src/JFlex/gui/GridPanel.java0000644000175000017500000001134111141010522016407 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.gui; import java.awt.*; import java.util.*; /** * Grid layout manager like GridLayout but with predefinable * grid size. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class GridPanel extends Panel implements Handles { private int cols; private int rows; private int hgap; private int vgap; private Vector constraints = new Vector(); private Insets insets = new Insets(0,0,0,0); public GridPanel(int cols, int rows) { this(cols, rows, 0, 0); } public GridPanel(int cols, int rows, int hgap, int vgap) { this.cols = cols; this.rows = rows; this.hgap = hgap; this.vgap = vgap; } public void doLayout() { Dimension size = getSize(); size.height -= insets.top+insets.bottom; size.width -= insets.left+insets.right; float cellWidth = size.width/cols; float cellHeight = size.height/rows; for (int i = 0; i < constraints.size(); i++) { GridPanelConstraint c = (GridPanelConstraint) constraints.elementAt(i); float x = cellWidth * c.x + insets.left + hgap/2; float y = cellHeight * c.y + insets.right + vgap/2; float width, height; if (c.handle == FILL) { width = (cellWidth-hgap) * c.width; height = (cellHeight-vgap) * c.height; } else { Dimension d = c.component.getPreferredSize(); width = d.width; height = d.height; } switch (c.handle) { case TOP_CENTER: x+= (cellWidth+width)/2; break; case TOP_RIGHT: x+= cellWidth-width; break; case CENTER_LEFT: y+= (cellHeight+height)/2; break; case CENTER: x+= (cellWidth+width)/2; y+= (cellHeight+height)/2; break; case CENTER_RIGHT: y+= (cellHeight+height)/2; x+= cellWidth-width; break; case BOTTOM: y+= cellHeight-height; break; case BOTTOM_CENTER: x+= (cellWidth+width)/2; y+= cellHeight-height; break; case BOTTOM_RIGHT: y+= cellHeight-height; x+= cellWidth-width; break; } c.component.setBounds(new Rectangle((int)x, (int)y, (int)width, (int)height)); } } public Dimension getPreferredSize() { float dy = 0; float dx = 0; for (int i = 0; i < constraints.size(); i++) { GridPanelConstraint c = (GridPanelConstraint) constraints.elementAt(i); Dimension d = c.component.getPreferredSize(); dx = Math.max(dx, d.width/c.width); dy = Math.max(dy, d.height/c.height); } dx+= hgap; dy+= vgap; dx*= cols; dy*= rows; dx+= insets.left+insets.right; dy+= insets.top+insets.bottom; return new Dimension((int)dx,(int)dy); } public void setInsets(Insets insets) { this.insets = insets; } public void add(int x, int y, Component c) { add(x,y,1,1,FILL,c); } public void add(int x, int y, int handle, Component c) { add(x,y,1,1,handle,c); } public void add(int x, int y, int dx, int dy, Component c) { add(x,y,dx,dy,FILL,c); } public void add(int x, int y, int dx, int dy, int handle, Component c) { super.add(c); constraints.addElement(new GridPanelConstraint(x,y,dx,dy,handle,c)); } } jflex-1.4.3/src/JFlex/gui/GridPanelConstraint.java0000644000175000017500000000405311141010522020456 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.gui; import java.awt.Component; /** * Constraints for layout elements of GridLayout * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class GridPanelConstraint { int x, y, width, height, handle; Component component; public GridPanelConstraint(int x, int y, int width, int height, int handle, Component component) { this.x = x; this.y = y; this.width = width; this.height = height; this.handle = handle; this.component = component; } } jflex-1.4.3/src/JFlex/gui/Handles.java0000644000175000017500000000367411141010522016132 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.gui; /** * Constants used for GridLayout * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public interface Handles { int FILL = 0; int TOP = 1; int TOP_LEFT = TOP; int TOP_CENTER = 2; int TOP_RIGHT = 3; int CENTER_LEFT = 4; int CENTER = 5; int CENTER_CENTER = CENTER; int CENTER_RIGHT = 6; int BOTTOM = 7; int BOTTOM_LEFT = BOTTOM; int BOTTOM_CENTER = 8; int BOTTOM_RIGHT = 9; } jflex-1.4.3/src/JFlex/gui/MainFrame.java0000644000175000017500000001652211141010522016407 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.gui; import JFlex.Main; import JFlex.Out; import java.io.File; import java.awt.*; import java.awt.event.*; /** * JFlex main application frame (GUI mode only) * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class MainFrame extends Frame implements Handles { private volatile boolean choosing; private String fileName = ""; private String dirName = ""; private Button quit; private Button options; private Button generate; private Button stop; private Button specChoose; private Button dirChoose; private TextField spec; private TextField dir; private TextArea messages; private GeneratorThread thread; private OptionsDialog dialog; public MainFrame() { super("JFlex "+Main.version); buildContent(); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { quit(); } }); pack(); show(); } private void buildContent() { setBackground(SystemColor.control); generate = new Button("Generate"); quit = new Button("Quit"); options = new Button("Options"); stop = new Button("Stop"); dirChoose = new Button("Browse"); dir = new TextField(10); specChoose = new Button("Browse"); spec = new TextField(10); messages = new TextArea(10,80); messages.setEditable(false); Font font = messages.getFont(); if (font != null) messages.setFont(new Font("Monospaced", font.getStyle(), font.getSize())); else messages.setFont(new Font("Monospaced", Font.PLAIN, 12)); Out.setGUIMode(messages); generate.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { generate(); } } ); options.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { showOptions(); } } ); quit.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { quit(); } } ); stop.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { stop(); } } ); specChoose.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { specChoose(); } } ); dirChoose.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { dirChoose(); } } ); spec.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { fileName = spec.getText(); generate(); } } ); spec.addTextListener( new TextListener() { public void textValueChanged(TextEvent e) { fileName = spec.getText(); } } ); dir.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { dirName = dir.getText(); generate(); } } ); dir.addTextListener( new TextListener() { public void textValueChanged(TextEvent e) { dirName = dir.getText(); } } ); GridPanel north = new GridPanel(5,4,10,10); north.setInsets( new Insets(10,5,5,10) ); north.add( 4,0, quit); north.add( 4,1, generate); north.add( 4,2, options); north.add( 4,3, stop); north.add( 0,0, BOTTOM, new Label("Lexical specification:")); north.add( 0,1, 2,1, spec); north.add( 2,1, specChoose); north.add( 0,2, BOTTOM, new Label("Output directory:")); north.add( 0,3, 2,1, dir); north.add( 2,3, dirChoose); Panel center = new Panel(new BorderLayout()); center.add("North", new Label("Messages:")); center.add("Center", messages); add("North", north); add("Center", center); setEnabledAll(false); } protected void showOptions() { if (dialog == null) { dialog = new OptionsDialog(this); } dialog.show(); } public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.width = messages.getPreferredSize().width; return d; } private void setEnabledAll(boolean generating) { stop.setEnabled( generating ); quit.setEnabled( !generating ); generate.setEnabled( !generating ); dirChoose.setEnabled( !generating ); dir.setEnabled( !generating ); specChoose.setEnabled( !generating ); spec.setEnabled( !generating ); } private void generate() { // workaround for a weird AWT bug if (choosing) return; setEnabledAll(true); thread = new GeneratorThread(this, fileName, dirName); thread.start(); } public void generationFinished(boolean success) { setEnabledAll(false); if (success) messages.append(Out.NL+"Generation finished successfully."+Out.NL); else messages.append(Out.NL+"Generation aborted."+Out.NL); } private void stop() { if (thread != null) { /* stop ok here despite deprecation (?) I don't know any good way to abort generation without changing the generator code */ thread.stop(); thread = null; } generationFinished(false); } private void quit() { setVisible(false); System.exit(0); } private void dirChoose() { choosing = true; FileDialog d = new FileDialog(this, "Choose directory", FileDialog.LOAD); d.show(); if (d.getDirectory() != null) { dir.setText( (new File(d.getDirectory())).getAbsolutePath() ); } choosing = false; } private void specChoose() { choosing = true; FileDialog d = new FileDialog(this, "Choose file", FileDialog.LOAD); d.setFile("*.flex"); d.show(); if (d.getFile() != null) { fileName = d.getDirectory()+d.getFile(); dir.setText(d.getDirectory()); spec.setText(fileName); } choosing = false; } } jflex-1.4.3/src/JFlex/gui/OptionsDialog.java0000644000175000017500000001637111141010522017325 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.gui; import java.awt.*; import java.awt.event.*; import java.io.File; import JFlex.GeneratorException; import JFlex.Options; import JFlex.Skeleton; /** * A dialog for setting JFlex options * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class OptionsDialog extends Dialog { private Frame owner; private Button skelBrowse; private TextField skelFile; private Button ok; private Button defaults; private Checkbox dump; private Checkbox verbose; private Checkbox jlex; private Checkbox no_minimize; private Checkbox no_backup; private Checkbox time; private Checkbox dot; private Checkbox tableG; private Checkbox switchG; private Checkbox packG; /** * Create a new options dialog * * @param owner */ public OptionsDialog(Frame owner) { super(owner, "Options"); this.owner = owner; setup(); pack(); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { close(); } }); } public void setup() { // create components ok = new Button("Ok"); defaults = new Button("Defaults"); skelBrowse = new Button(" Browse"); skelFile = new TextField(); skelFile.setEditable(false); dump = new Checkbox(" dump"); verbose = new Checkbox(" verbose"); jlex = new Checkbox(" JLex compatibility"); no_minimize = new Checkbox(" skip minimization"); no_backup = new Checkbox(" no backup file"); time = new Checkbox(" time statistics"); dot = new Checkbox(" dot graph files"); CheckboxGroup codeG = new CheckboxGroup(); tableG = new Checkbox(" table",Options.gen_method == Options.TABLE, codeG); switchG = new Checkbox(" switch",Options.gen_method == Options.SWITCH, codeG); packG = new Checkbox(" pack",Options.gen_method == Options.PACK, codeG); // setup interaction ok.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { close(); } } ); defaults.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { setDefaults(); } } ); skelBrowse.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { skelBrowse(); } } ); tableG.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { setGenMethod(); } } ); verbose.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { Options.verbose = verbose.getState(); } } ); dump.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { Options.dump = dump.getState(); } } ); jlex.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { Options.jlex = jlex.getState(); } } ); no_minimize.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { Options.no_minimize = no_minimize.getState(); } } ); no_backup.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { Options.no_backup = no_backup.getState(); } } ); dot.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { Options.dot = dot.getState(); } } ); time.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent e) { Options.time = time.getState(); } } ); // setup layout GridPanel panel = new GridPanel(4,7,10,10); panel.setInsets( new Insets(10,5,5,10) ); panel.add(3,0,ok); panel.add(3,1,defaults); panel.add(0,0,2,1,Handles.BOTTOM,new Label("skeleton file:")); panel.add(0,1,2,1,skelFile); panel.add(2,1,1,1,Handles.TOP, skelBrowse); panel.add(0,2,1,1,Handles.BOTTOM,new Label("code:")); panel.add(0,3,1,1,tableG); panel.add(0,4,1,1,switchG); panel.add(0,5,1,1,packG); panel.add(1,3,1,1,dump); panel.add(1,4,1,1,verbose); panel.add(1,5,1,1,time); panel.add(2,3,1,1,no_minimize); panel.add(2,4,1,1,no_backup); panel.add(3,3,1,1,jlex); panel.add(3,4,1,1,dot); add("Center",panel); updateState(); } private void skelBrowse() { FileDialog d = new FileDialog(owner , "Choose file", FileDialog.LOAD); d.show(); if (d.getFile() != null) { File skel = new File(d.getDirectory()+d.getFile()); try { Skeleton.readSkelFile(skel); skelFile.setText(skel.toString()); } catch (GeneratorException e) { // do nothing } } } private void setGenMethod() { if ( tableG.getState() ) { Options.gen_method = Options.TABLE; return; } if ( switchG.getState() ) { Options.gen_method = Options.SWITCH; return; } if ( packG.getState() ) { Options.gen_method = Options.PACK; return; } } private void updateState() { dump.setState(Options.dump); verbose.setState(Options.verbose); jlex.setState(Options.jlex); no_minimize.setState(Options.no_minimize); no_backup.setState(Options.no_backup); time.setState(Options.time); dot.setState(Options.dot); tableG.setState(Options.gen_method == Options.TABLE); switchG.setState(Options.gen_method == Options.SWITCH); packG.setState(Options.gen_method == Options.PACK); } private void setDefaults() { Options.setDefaults(); Skeleton.readDefault(); skelFile.setText(""); updateState(); } public void close() { hide(); } } jflex-1.4.3/src/JFlex/HiLowEmitter.java0000644000175000017500000000631611141010522016340 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * jflex * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * HiLowEmitter * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class HiLowEmitter extends PackEmitter { /** number of entries in expanded array */ private int numEntries; /** * Create new emitter for values in [0, 0xFFFFFFFF] using hi/low encoding. * * @param name the name of the generated array */ public HiLowEmitter(String name) { super(name); } /** * Emits hi/low pair unpacking code for the generated array. * * @see JFlex.PackEmitter#emitUnPack() */ public void emitUnpack() { // close last string chunk: println("\";"); nl(); println(" private static int [] zzUnpack"+name+"() {"); println(" int [] result = new int["+numEntries+"];"); println(" int offset = 0;"); for (int i = 0; i < chunks; i++) { println(" offset = zzUnpack"+name+"("+constName()+"_PACKED_"+i+", offset, result);"); } println(" return result;"); println(" }"); nl(); println(" private static int zzUnpack"+name+"(String packed, int offset, int [] result) {"); println(" int i = 0; /* index in packed string */"); println(" int j = offset; /* index in unpacked array */"); println(" int l = packed.length();"); println(" while (i < l) {"); println(" int high = packed.charAt(i++) << 16;"); println(" result[j++] = high | packed.charAt(i++);"); println(" }"); println(" return j;"); println(" }"); } /** * Emit one value using two characters. * * @param val the value to emit * @prec 0 <= val <= 0xFFFFFFFF */ public void emit(int val) { numEntries+= 1; breaks(); emitUC(val >> 16); emitUC(val & 0xFFFF); } } jflex-1.4.3/src/JFlex/IntCharSet.java0000644000175000017500000002421411141010522015765 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.util.*; /** * CharSet implemented with intervalls * * [fixme: optimizations possible] * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public final class IntCharSet { private final static boolean DEBUG = false; /* invariant: all intervals are disjoint, ordered */ private Vector intervalls; private int pos; public IntCharSet() { this.intervalls = new Vector(); } public IntCharSet(char c) { this(new Interval(c,c)); } public IntCharSet(Interval intervall) { this(); intervalls.addElement(intervall); } public IntCharSet(Vector /* Interval */ chars) { int size = chars.size(); this.intervalls = new Vector(size); for (int i = 0; i < size; i++) add( (Interval) chars.elementAt(i) ); } /** * returns the index of the intervall that contains * the character c, -1 if there is no such intevall * * @prec: true * @post: -1 <= return < intervalls.size() && * (return > -1 --> intervalls[return].contains(c)) * * @param c the character * @return the index of the enclosing interval, -1 if no such interval */ private int indexOf(char c) { int start = 0; int end = intervalls.size()-1; while (start <= end) { int check = (start+end) / 2; Interval i = (Interval) intervalls.elementAt(check); if (start == end) return i.contains(c) ? start : -1; if (c < i.start) { end = check-1; continue; } if (c > i.end) { start = check+1; continue; } return check; } return -1; } public IntCharSet add(IntCharSet set) { for (int i = 0; i < set.intervalls.size(); i++) add( (Interval) set.intervalls.elementAt(i) ); return this; } public void add(Interval intervall) { int size = intervalls.size(); for (int i = 0; i < size; i++) { Interval elem = (Interval) intervalls.elementAt(i); if ( elem.end+1 < intervall.start ) continue; if ( elem.contains(intervall) ) return; if ( elem.start > intervall.end+1 ) { intervalls.insertElementAt(new Interval(intervall), i); return; } if (intervall.start < elem.start) elem.start = intervall.start; if (intervall.end <= elem.end) return; elem.end = intervall.end; i++; // delete all x with x.contains( intervall.end ) while (i < size) { Interval x = (Interval) intervalls.elementAt(i); if (x.start > elem.end+1) return; elem.end = x.end; intervalls.removeElementAt(i); size--; } return; } intervalls.addElement(new Interval(intervall)); } public void add(char c) { int size = intervalls.size(); for (int i = 0; i < size; i++) { Interval elem = (Interval) intervalls.elementAt(i); if (elem.end+1 < c) continue; if (elem.contains(c)) return; // already there, nothing to do // assert(elem.end+1 >= c && (elem.start > c || elem.end < c)); if (elem.start > c+1) { intervalls.insertElementAt(new Interval(c,c), i); return; } // assert(elem.end+1 >= c && elem.start <= c+1 && (elem.start > c || elem.end < c)); if (c+1 == elem.start) { elem.start = c; return; } // assert(elem.end+1 == c); elem.end = c; // merge with next interval if it contains c if (i+1 >= size) return; Interval x = (Interval) intervalls.elementAt(i+1); if (x.start <= c+1) { elem.end = x.end; intervalls.removeElementAt(i+1); } return; } // end reached but nothing found -> append at end intervalls.addElement(new Interval(c,c)); } public boolean contains(char singleChar) { return indexOf(singleChar) >= 0; } /** * o instanceof Interval */ public boolean equals(Object o) { IntCharSet set = (IntCharSet) o; if ( intervalls.size() != set.intervalls.size() ) return false; for (int i = 0; i < intervalls.size(); i++) { if ( !intervalls.elementAt(i).equals( set.intervalls.elementAt(i)) ) return false; } return true; } private char min(char a, char b) { return a <= b ? a : b; } private char max(char a, char b) { return a >= b ? a : b; } /* intersection */ public IntCharSet and(IntCharSet set) { if (DEBUG) { Out.dump("intersection"); Out.dump("this : "+this); Out.dump("other : "+set); } IntCharSet result = new IntCharSet(); int i = 0; // index in this.intervalls int j = 0; // index in set.intervalls int size = intervalls.size(); int setSize = set.intervalls.size(); while (i < size && j < setSize) { Interval x = (Interval) this.intervalls.elementAt(i); Interval y = (Interval) set.intervalls.elementAt(j); if (x.end < y.start) { i++; continue; } if (y.end < x.start) { j++; continue; } result.intervalls.addElement( new Interval( max(x.start, y.start), min(x.end, y.end) ) ); if (x.end >= y.end) j++; if (y.end >= x.end) i++; } if (DEBUG) { Out.dump("result: "+result); } return result; } /* complement */ /* prec: this.contains(set), set != null */ public void sub(IntCharSet set) { if (DEBUG) { Out.dump("complement"); Out.dump("this : "+this); Out.dump("other : "+set); } int i = 0; // index in this.intervalls int j = 0; // index in set.intervalls int setSize = set.intervalls.size(); while (i < intervalls.size() && j < setSize) { Interval x = (Interval) this.intervalls.elementAt(i); Interval y = (Interval) set.intervalls.elementAt(j); if (DEBUG) { Out.dump("this : "+this); Out.dump("this ["+i+"] : "+x); Out.dump("other ["+j+"] : "+y); } if (x.end < y.start) { i++; continue; } if (y.end < x.start) { j++; continue; } // x.end >= y.start && y.end >= x.start -> // x.end <= y.end && x.start >= y.start (prec) if ( x.start == y.start && x.end == y.end ) { intervalls.removeElementAt(i); j++; continue; } // x.end <= y.end && x.start >= y.start && // (x.end < y.end || x.start > y.start) -> // x.start < x.end if ( x.start == y.start ) { x.start = (char) (y.end+1); j++; continue; } if ( x.end == y.end ) { x.end = (char) (y.start-1); i++; j++; continue; } intervalls.insertElementAt(new Interval(x.start, (char) (y.start-1)), i); x.start = (char) (y.end+1); i++; j++; } if (DEBUG) { Out.dump("result: "+this); } } public boolean containsElements() { return intervalls.size() > 0; } public int numIntervalls() { return intervalls.size(); } // beware: depends on caller protocol, single user only public Interval getNext() { if (pos == intervalls.size()) pos = 0; return (Interval) intervalls.elementAt(pos++); } /** * Create a caseless version of this charset. *

* The caseless version contains all characters of this char set, * and additionally all lower/upper/title case variants of the * characters in this set. * * @return a caseless copy of this set */ public IntCharSet getCaseless() { IntCharSet n = copy(); int size = intervalls.size(); for (int i=0; i < size; i++) { Interval elem = (Interval) intervalls.elementAt(i); for (char c = elem.start; c <= elem.end; c++) { n.add(Character.toLowerCase(c)); n.add(Character.toUpperCase(c)); n.add(Character.toTitleCase(c)); } } return n; } /** * Make a string representation of this char set. * * @return a string representing this char set. */ public String toString() { StringBuffer result = new StringBuffer("{ "); for (int i = 0; i < intervalls.size(); i++) result.append( intervalls.elementAt(i) ); result.append(" }"); return result.toString(); } /** * Return a (deep) copy of this char set * * @return the copy */ public IntCharSet copy() { IntCharSet result = new IntCharSet(); int size = intervalls.size(); for (int i=0; i < size; i++) { Interval iv = ((Interval) intervalls.elementAt(i)).copy(); result.intervalls.addElement(iv); } return result; } } jflex-1.4.3/src/JFlex/Interval.java0000644000175000017500000001100711141010522015541 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * An intervall of characters with basic operations. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public final class Interval { /* start and end of the intervall */ public char start, end; /** * Constuct a new intervall from start to end. * * @param start first character the intervall should contain * @param end last character the intervall should contain */ public Interval(char start, char end) { this.start = start; this.end = end; } /** * Copy constructor */ public Interval(Interval other) { this.start = other.start; this.end = other.end; } /** * Return true iff point is contained in this intervall. * * @param point the character to check */ public boolean contains(char point) { return start <= point && end >= point; } /** * Return true iff this intervall completely contains the * other one. * * @param other the other intervall */ public boolean contains(Interval other) { return this.start <= other.start && this.end >= other.end; } /** * Return true if o is an intervall * with the same borders. * * @param o the object to check equality with */ public boolean equals(Object o) { if ( o == this ) return true; if ( !(o instanceof Interval) ) return false; Interval other = (Interval) o; return other.start == this.start && other.end == this.end; } /** * Set a new last character * * @param end the new last character of this intervall */ public void setEnd(char end) { this.end = end; } /** * Set a new first character * * @param start the new first character of this intervall */ public void setStart(char start) { this.start = start; } /** * Check wether a character is printable. * * @param c the character to check */ private static boolean isPrintable(char c) { // fixme: should make unicode test here return c > 31 && c < 127; } /** * Get a String representation of this intervall. * * @return a string "[start-end]" or * "[start]" (if there is only one character in * the intervall) where start and * end are either a number (the character code) * or something of the from 'a'. */ public String toString() { StringBuffer result = new StringBuffer("["); if ( isPrintable(start) ) result.append("'"+start+"'"); else result.append( (int) start ); if (start != end) { result.append("-"); if ( isPrintable(end) ) result.append("'"+end+"'"); else result.append( (int) end ); } result.append("]"); return result.toString(); } /** * Make a copy of this interval. * * @return the copy */ public Interval copy() { return new Interval(start,end); } } jflex-1.4.3/src/JFlex/IntPair.java0000644000175000017500000000416111141010522015326 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Simple pair of integers. * * Used in NFA to represent a partial NFA by its start and end state. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final class IntPair { int start; int end; IntPair(int start, int end) { this.start = start; this.end = end; } public int hashCode() { return end + (start << 8); } public boolean equals(Object o) { if ( o instanceof IntPair ) { IntPair p = (IntPair) o; return start == p.start && end == p.end; } return false; } public String toString() { return "("+start+","+end+")"; } } jflex-1.4.3/src/JFlex/LexicalStates.java0000644000175000017500000000557711141010522016541 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.util.*; /** * Simple symbol table, mapping lexical state names to integers. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class LexicalStates { /** maps state name to state number */ Hashtable states; /** codes of inclusive states (subset of states) */ Vector inclusive; /** number of declared states */ int numStates; /** * constructs a new lexical state symbol table */ public LexicalStates() { states = new Hashtable(); inclusive = new Vector(); } /** * insert a new state declaration */ public void insert(String name, boolean is_inclusive) { if ( states.containsKey(name) ) return; Integer code = new Integer(numStates++); states.put(name, code); if (is_inclusive) inclusive.addElement(code); } /** * returns the number (code) of a declared state, * null if no such state has been declared. */ public Integer getNumber(String name) { return (Integer) states.get(name); } /** * returns the number of declared states */ public int number() { return numStates; } /** * returns the names of all states */ public Enumeration names() { return states.keys(); } /** * returns the code of all inclusive states */ public Enumeration getInclusiveStates() { return inclusive.elements(); } } jflex-1.4.3/src/JFlex/LexParse.cup0000644000175000017500000005710311141010522015355 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.util.*; /* customizing code */ action code {: LexScan scanner; CharClasses charClasses = new CharClasses(Options.jlex ? 127 : 0xFFFF); RegExps regExps = new RegExps(); Macros macros = new Macros(); Integer stateNumber; Timer t = new Timer(); EOFActions eofActions = new EOFActions(); void fatalError(ErrorMessages message, int line, int col) { syntaxError(message, line, col); throw new GeneratorException(); } void fatalError(ErrorMessages message) { fatalError(message, scanner.currentLine(), -1); throw new GeneratorException(); } void syntaxError(ErrorMessages message) { Out.error(scanner.file, message, scanner.currentLine(), -1); } void syntaxError(ErrorMessages message, int line) { Out.error(scanner.file, message, line, -1); } void syntaxError(ErrorMessages message, int line, int col) { Out.error(scanner.file, message, line, col); } private boolean check(int type, char c) { switch (type) { case sym.JLETTERCLASS: return Character.isJavaIdentifierStart(c); case sym.JLETTERDIGITCLASS: return Character.isJavaIdentifierPart(c); case sym.LETTERCLASS: return Character.isLetter(c); case sym.DIGITCLASS: return Character.isDigit(c); case sym.UPPERCLASS: return Character.isUpperCase(c); case sym.LOWERCLASS: return Character.isLowerCase(c); default: return false; } } private Vector makePreClass(int type) { Vector result = new Vector(); char c = 0; char start = 0; char last = charClasses.getMaxCharCode(); boolean prev, current; prev = check(type,'\u0000'); for (c = 1; c < last; c++) { current = check(type,c); if (!prev && current) start = c; if (prev && !current) { result.addElement(new Interval(start, (char)(c-1))); } prev = current; } // the last iteration is moved out of the loop to // avoid an endless loop if last == maxCharCode and // last+1 == 0 current = check(type,c); if (!prev && current) result.addElement(new Interval(c,c)); if (prev && current) result.addElement(new Interval(start, c)); if (prev && !current) result.addElement(new Interval(start, (char)(c-1))); return result; } private RegExp makeRepeat(RegExp r, int n1, int n2, int line, int col) { if (n1 <= 0 && n2 <= 0) { syntaxError(ErrorMessages.REPEAT_ZERO, line, col); return null; } if (n1 > n2) { syntaxError(ErrorMessages.REPEAT_GREATER, line, col); return null; } int i; RegExp result; if (n1 > 0) { result = r; n1--; n2--; // we need one concatenation less than the number of expressions to match } else { result = new RegExp1(sym.QUESTION,r); n2--; } for (i = 0; i < n1; i++) result = new RegExp2(sym.CONCAT, result, r); n2-= n1; for (i = 0; i < n2; i++) result = new RegExp2(sym.CONCAT, result, new RegExp1(sym.QUESTION,r)); return result; } private RegExp makeNL() { Vector list = new Vector(); list.addElement(new Interval('\n','\r')); list.addElement(new Interval('\u0085','\u0085')); list.addElement(new Interval('\u2028','\u2029')); // assumption: line feeds are caseless charClasses.makeClass(list, false); charClasses.makeClass('\n', false); charClasses.makeClass('\r', false); RegExp1 c = new RegExp1(sym.CCLASS, list); Character n = new Character('\n'); Character r = new Character('\r'); return new RegExp2(sym.BAR, c, new RegExp2(sym.CONCAT, new RegExp1(sym.CHAR, r), new RegExp1(sym.CHAR, n))); } :}; parser code {: public LexScan scanner; public LexParse(LexScan scanner) { super(scanner); this.scanner = scanner; } public CharClasses getCharClasses() { return action_obj.charClasses; } public EOFActions getEOFActions() { return action_obj.eofActions; } public void report_error(String message, Object info) { if ( info instanceof java_cup.runtime.Symbol ) { java_cup.runtime.Symbol s = (java_cup.runtime.Symbol) info; if (s.sym == sym.EOF) Out.error(ErrorMessages.UNEXPECTED_EOF); else Out.error(scanner.file, ErrorMessages.SYNTAX_ERROR, s.left, s.right); } else Out.error(ErrorMessages.UNKNOWN_SYNTAX); } public void report_fatal_error(String message, Object info) { // report_error(message, info); throw new GeneratorException(); } :}; init with {: action_obj.scanner = this.scanner; :}; /* token declarations */ terminal OPENBRACKET, CLOSEBRACKET, HAT, DOLLAR, OPENCLASS, CLOSECLASS, DASH, DELIMITER, EQUALS, COMMA, LESSTHAN, MORETHAN, LBRACE, RBRACE, ASCII, FULL, UNICODE, REGEXPEND; terminal JLETTERCLASS, JLETTERDIGITCLASS, LETTERCLASS, DIGITCLASS, UPPERCLASS, LOWERCLASS, EOFRULE, NOACTION, LOOKAHEAD; terminal Action ACTION; terminal String IDENT, USERCODE; terminal Integer REPEAT; /* tokens used in RegExp parse tree */ terminal STAR, PLUS, BAR, QUESTION, POINT, BANG, TILDE; terminal Character CHAR; terminal String STRING, MACROUSE; /* symbols *only* used in the parse tree (not in the grammar) */ terminal CCLASS, CCLASSNOT, CONCAT; terminal STRING_I, CHAR_I; /* case insensitive strings/chars */ non terminal macros, macro; non terminal Integer rule; non terminal NFA specification; non terminal RegExp series, concs, nregexp, regexp, charclass, lookahead; non terminal Interval classcontentelem; non terminal Vector states, statesOPT, classcontent, preclass, rules; non terminal Boolean hatOPT; non terminal Action act, actions; /* grammar specification */ start with specification; specification ::= USERCODE /* delimiter is checked in lexer */ macros DELIMITER rules {: scanner.t.stop(); Out.checkErrors(); Out.time(ErrorMessages.PARSING_TOOK, t); macros.expand(); Enumeration unused = macros.unused(); while ( unused.hasMoreElements() ) { Out.warning("Macro \""+unused.nextElement()+"\" has been declared but never used."); } SemCheck.check(regExps, macros, scanner.file); regExps.checkActions(); regExps.checkLookAheads(); Out.checkErrors(); if (Options.dump) charClasses.dump(); Out.print("Constructing NFA : "); t.start(); int num = regExps.getNum(); RESULT = new NFA(charClasses.getNumClasses(), scanner, regExps, macros, charClasses); eofActions.setNumLexStates(scanner.states.number()); for (int i = 0; i < num; i++) { if (regExps.isEOF(i)) eofActions.add( regExps.getStates(i), regExps.getAction(i) ); else RESULT.addRegExp(i); } if (scanner.standalone) RESULT.addStandaloneRule(); t.stop(); Out.time(""); Out.time(ErrorMessages.NFA_TOOK, t); :} | /* emtpy spec. error */ {: fatalError(ErrorMessages.NO_LEX_SPEC); :} ; macros ::= /* empty, most switches & state declarations are parsed in lexer */ | macros macro | error; macro ::= ASCII {: charClasses.setMaxCharCode(127); :} | FULL {: charClasses.setMaxCharCode(255); :} | UNICODE {: charClasses.setMaxCharCode(0xFFFF); :} | IDENT:name EQUALS series:definition REGEXPEND {: macros.insert(name, definition); :} | IDENT EQUALS:e {: syntaxError(ErrorMessages.REGEXP_EXPECTED, eleft, eright); :} ; rules ::= rules:rlist rule:r {: rlist.addElement(r); RESULT = rlist; :} | rules:rlist1 LESSTHAN states:states MORETHAN LBRACE rules:rlist2 RBRACE {: Enumeration rs = rlist2.elements(); while ( rs.hasMoreElements() ) { Integer elem = (Integer) rs.nextElement(); // might be null for error case of "rule" if (elem != null) { regExps.addStates( elem.intValue(), states ); } rlist1.addElement( elem ); } RESULT = rlist1; :} | LESSTHAN states:states MORETHAN LBRACE rules:rlist RBRACE {: Enumeration rs = rlist.elements(); while ( rs.hasMoreElements() ) { Integer elem = (Integer) rs.nextElement(); // might be null for error case of "rule" if (elem != null) { regExps.addStates( elem.intValue(), states ); } } RESULT = rlist; :} | rule:r {: RESULT = new Vector(); RESULT.addElement(r); :} ; rule ::= statesOPT:s hatOPT:bol series:r actions:a {: RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, null)); :} | statesOPT:s hatOPT:bol series:r lookahead:l act:a {: RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, l)); :} | statesOPT:s hatOPT:bol series:r lookahead:l NOACTION:a {: syntaxError(ErrorMessages.LOOKAHEAD_NEEDS_ACTION, aleft, aright+1); :} | statesOPT:s EOFRULE ACTION:a {: RESULT = new Integer(regExps.insert(s, a)); :} | error ; lookahead ::= DOLLAR {: RESULT = makeNL(); :} | LOOKAHEAD series:r {: RESULT = r; :} | LOOKAHEAD series:s DOLLAR {: RESULT = new RegExp2(sym.CONCAT, s, makeNL()); :} ; act ::= REGEXPEND ACTION:a {: RESULT = a; :} ; actions ::= act:a {: RESULT = a; :} | NOACTION ; statesOPT ::= LESSTHAN states:list MORETHAN {: RESULT = list; :} | /* empty */ {: RESULT = new Vector(); :} ; states ::= IDENT:id COMMA states:list {: stateNumber = scanner.states.getNumber( id ); if ( stateNumber != null ) list.addElement( stateNumber ); else { throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, idleft, idright); } RESULT = list; :} | IDENT:id {: Vector list = new Vector(); stateNumber = scanner.states.getNumber( id ); if ( stateNumber != null ) list.addElement( stateNumber ); else { throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, idleft, idright); } RESULT = list; :} | IDENT COMMA:c {: syntaxError(ErrorMessages.REGEXP_EXPECTED, cleft, cright+1); :} ; hatOPT ::= HAT {: // assumption: there is no upper case for \n charClasses.makeClass('\n', false); RESULT = new Boolean(true); :} | /* empty */ {: RESULT = new Boolean(false); :} ; series ::= series:r1 BAR concs:r2 {: RESULT = new RegExp2(sym.BAR, r1, r2); :} | concs:r {: RESULT = r; :} | BAR:b {: syntaxError(ErrorMessages.REGEXP_EXPECTED, bleft, bright); :} ; concs ::= concs:r1 nregexp:r2 {: RESULT = new RegExp2(sym.CONCAT, r1, r2); :} | nregexp:r {: RESULT = r; :} ; nregexp ::= regexp:r {: RESULT = r; :} | BANG nregexp:r {: RESULT = new RegExp1(sym.BANG, r); :} | TILDE nregexp:r {: RESULT = new RegExp1(sym.TILDE, r); :} ; regexp ::= regexp:r STAR {: RESULT = new RegExp1(sym.STAR, r); :} | regexp:r PLUS {: RESULT = new RegExp1(sym.PLUS, r); :} | regexp:r QUESTION {: RESULT = new RegExp1(sym.QUESTION, r); :} | regexp:r REPEAT:n RBRACE:b {: RESULT = makeRepeat(r, n.intValue(), n.intValue(), bleft, bright); :} | regexp:r REPEAT:n1 REPEAT:n2 RBRACE {: RESULT = makeRepeat(r, n1.intValue(), n2.intValue(), n1left, n2right); :} | OPENBRACKET series:r CLOSEBRACKET {: RESULT = r; :} | MACROUSE:ident {: if ( !scanner.macroDefinition ) { if ( ! macros.markUsed(ident) ) throw new ScannerException(scanner.file, ErrorMessages.MACRO_UNDECL, identleft, identright); } RESULT = new RegExp1(sym.MACROUSE, ident); :} | charclass:c {: RESULT = c; :} | preclass:list {: try { // assumption [correct?]: preclasses are already closed under case charClasses.makeClass(list, false); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, listleft); } RESULT = new RegExp1(sym.CCLASS, list); :} | STRING:str {: try { if ( scanner.caseless ) { charClasses.makeClass(str, true); RESULT = new RegExp1(sym.STRING_I, str); } else { charClasses.makeClass(str, false); RESULT = new RegExp1(sym.STRING, str); } } catch (CharClassException e) { syntaxError(ErrorMessages.CS2SMALL_STRING, strleft, strright); } :} | POINT {: Vector any = new Vector(); any.addElement(new Interval('\n','\n')); // assumption: there is no upper case for \n charClasses.makeClass('\n', false); RESULT = new RegExp1(sym.CCLASSNOT, any); :} | CHAR:c {: try { if ( scanner.caseless ) { charClasses.makeClass(c.charValue(), true); RESULT = new RegExp1(sym.CHAR_I, c); } else { charClasses.makeClass(c.charValue(), false); RESULT = new RegExp1(sym.CHAR, c); } } catch (CharClassException e) { syntaxError(ErrorMessages.CS2SMALL_CHAR, cleft, cright); } :} ; charclass ::= OPENCLASS CLOSECLASS {: RESULT = new RegExp1(sym.CCLASS,null); :} | OPENCLASS classcontent:list CLOSECLASS:close {: try { charClasses.makeClass(list, Options.jlex && scanner.caseless); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASS,list); :} | OPENCLASS HAT CLOSECLASS:close {: Vector list = new Vector(); list.addElement(new Interval((char)0,CharClasses.maxChar)); try { charClasses.makeClass(list, false); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASS,list); :} | OPENCLASS HAT classcontent:list CLOSECLASS:close {: try { charClasses.makeClassNot(list, Options.jlex && scanner.caseless); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASSNOT,list); :} | OPENCLASS DASH classcontent:list CLOSECLASS:close {: try { list.addElement(new Interval('-','-')); charClasses.makeClass(list, Options.jlex && scanner.caseless); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASS,list); :} | OPENCLASS HAT DASH classcontent:list CLOSECLASS:close {: try { list.addElement(new Interval('-','-')); charClasses.makeClassNot(list, Options.jlex && scanner.caseless); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASSNOT,list); :} ; classcontent ::= classcontent:list classcontentelem:elem {: list.addElement(elem); RESULT = list; :} | classcontentelem:elem {: Vector list = new Vector(); list.addElement(elem); RESULT = list; :} | classcontent:list preclass:plist {: for (Enumeration e = plist.elements(); e.hasMoreElements();) list.addElement(e.nextElement()); RESULT = list; :} | preclass:list {: RESULT = list; :} | classcontent:list STRING:s {: for (int i = 0; i < s.length(); i++) list.addElement(new Interval(s.charAt(i),s.charAt(i))); RESULT = list; :} | STRING:s {: RESULT = new Vector(); for (int i = 0; i < s.length(); i++) RESULT.addElement(new Interval(s.charAt(i),s.charAt(i))); :} | classcontent:list MACROUSE:ident {: syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); :} | MACROUSE:ident {: syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); :} ; classcontentelem ::= CHAR:c1 DASH CHAR:c2 {: RESULT = new Interval(c1.charValue(), c2.charValue()); :} | CHAR:c {: RESULT = new Interval(c.charValue(), c.charValue()); :} ; preclass ::= JLETTERCLASS {: RESULT = makePreClass(sym.JLETTERCLASS); :} | JLETTERDIGITCLASS {: RESULT = makePreClass(sym.JLETTERDIGITCLASS); :} | LETTERCLASS {: RESULT = makePreClass(sym.LETTERCLASS); :} | DIGITCLASS {: RESULT = makePreClass(sym.DIGITCLASS); :} | UPPERCLASS {: RESULT = makePreClass(sym.UPPERCLASS); :} | LOWERCLASS {: RESULT = makePreClass(sym.LOWERCLASS); :} ; jflex-1.4.3/src/JFlex/LexParse.java0000644000175000017500000027766011141044633015535 0ustar moonmoon //---------------------------------------------------- // The following code was generated by CUP v0.11a beta 20060608 // Sat Jan 31 23:52:43 EST 2009 //---------------------------------------------------- package JFlex; import java.util.*; /** CUP v0.11a beta 20060608 generated parser. * @version Sat Jan 31 23:52:43 EST 2009 */ public class LexParse extends java_cup.runtime.lr_parser { /** Default constructor. */ public LexParse() {super();} /** Constructor which sets the default scanner. */ public LexParse(java_cup.runtime.Scanner s) {super(s);} /** Constructor which sets the default scanner. */ public LexParse(java_cup.runtime.Scanner s, java_cup.runtime.SymbolFactory sf) {super(s,sf);} /** Production table. */ protected static final short _production_table[][] = unpackFromStrings(new String[] { "\000\113\000\002\002\004\000\002\005\006\000\002\005" + "\002\000\002\002\002\000\002\002\004\000\002\002\003" + "\000\002\003\003\000\002\003\003\000\002\003\003\000" + "\002\003\006\000\002\003\004\000\002\021\004\000\002" + "\021\011\000\002\021\010\000\002\021\003\000\002\004" + "\006\000\002\004\007\000\002\004\007\000\002\004\005" + "\000\002\004\003\000\002\013\003\000\002\013\004\000" + "\002\013\005\000\002\023\004\000\002\024\003\000\002" + "\024\003\000\002\016\005\000\002\016\002\000\002\015" + "\005\000\002\015\003\000\002\015\004\000\002\022\003" + "\000\002\022\002\000\002\006\005\000\002\006\003\000" + "\002\006\003\000\002\007\004\000\002\007\003\000\002" + "\010\003\000\002\010\004\000\002\010\004\000\002\011" + "\004\000\002\011\004\000\002\011\004\000\002\011\005" + "\000\002\011\006\000\002\011\005\000\002\011\003\000" + "\002\011\003\000\002\011\003\000\002\011\003\000\002" + "\011\003\000\002\011\003\000\002\012\004\000\002\012" + "\005\000\002\012\005\000\002\012\006\000\002\012\006" + "\000\002\012\007\000\002\017\004\000\002\017\003\000" + "\002\017\004\000\002\017\003\000\002\017\004\000\002" + "\017\003\000\002\017\004\000\002\017\003\000\002\014" + "\005\000\002\014\003\000\002\020\003\000\002\020\003" + "\000\002\020\003\000\002\020\003\000\002\020\003\000" + "\002\020\003" }); /** Access to production table. */ public short[][] production_table() {return _production_table;} /** Parse-action table. */ protected static final short[][] _action_table = unpackFromStrings(new String[] { "\000\156\000\006\002\uffff\041\004\001\002\000\016\003" + "\007\013\ufffe\022\ufffe\023\ufffe\024\ufffe\040\ufffe\001\002" + "\000\004\002\006\001\002\000\004\002\001\001\002\000" + "\014\013\ufffc\022\ufffc\023\ufffc\024\ufffc\040\ufffc\001\002" + "\000\014\013\012\022\011\023\016\024\015\040\014\001" + "\002\000\014\013\ufffb\022\ufffb\023\ufffb\024\ufffb\040\ufffb" + "\001\002\000\050\003\114\004\uffe6\006\uffe6\010\uffe6\016" + "\116\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6" + "\034\uffe6\045\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053" + "\uffe6\054\uffe6\001\002\000\014\013\ufffd\022\ufffd\023\ufffd" + "\024\ufffd\040\ufffd\001\002\000\004\014\017\001\002\000" + "\014\013\ufff9\022\ufff9\023\ufff9\024\ufff9\040\ufff9\001\002" + "\000\014\013\ufffa\022\ufffa\023\ufffa\024\ufffa\040\ufffa\001" + "\002\000\052\004\034\010\044\013\ufff7\022\ufff7\023\ufff7" + "\024\ufff7\026\023\027\031\030\020\031\042\032\035\033" + "\032\040\ufff7\045\041\047\022\050\037\051\024\052\021" + "\053\030\054\025\001\002\000\064\004\uffba\005\uffba\007" + "\uffba\010\uffba\011\uffba\025\uffba\026\uffba\027\uffba\030\uffba" + "\031\uffba\032\uffba\033\uffba\035\uffba\036\uffba\042\uffba\043" + "\uffba\044\uffba\045\uffba\046\uffba\047\uffba\050\uffba\051\uffba" + "\052\uffba\053\uffba\054\uffba\001\002\000\062\004\uffcd\005" + "\uffcd\007\uffcd\010\uffcd\025\uffcd\026\uffcd\027\uffcd\030\uffcd" + "\031\uffcd\032\uffcd\033\uffcd\035\uffcd\036\uffcd\042\uffcd\043" + "\uffcd\044\uffcd\045\uffcd\046\uffcd\047\uffcd\050\uffcd\051\uffcd" + "\052\uffcd\053\uffcd\054\uffcd\001\002\000\062\004\uffce\005" + "\uffce\007\uffce\010\uffce\025\uffce\026\uffce\027\uffce\030\uffce" + "\031\uffce\032\uffce\033\uffce\035\uffce\036\uffce\042\uffce\043" + "\uffce\044\uffce\045\uffce\046\uffce\047\uffce\050\uffce\051\uffce" + "\052\uffce\053\uffce\054\uffce\001\002\000\064\004\uffbc\005" + "\uffbc\007\uffbc\010\uffbc\011\uffbc\025\uffbc\026\uffbc\027\uffbc" + "\030\uffbc\031\uffbc\032\uffbc\033\uffbc\035\uffbc\036\uffbc\042" + "\uffbc\043\uffbc\044\uffbc\045\uffbc\046\uffbc\047\uffbc\050\uffbc" + "\051\uffbc\052\uffbc\053\uffbc\054\uffbc\001\002\000\036\004" + "\034\010\044\026\023\027\031\030\020\031\042\032\035" + "\033\032\047\022\050\037\051\024\052\021\053\030\054" + "\025\001\002\000\062\004\uffd2\005\uffd2\007\uffd2\010\uffd2" + "\025\uffd2\026\uffd2\027\uffd2\030\uffd2\031\uffd2\032\uffd2\033" + "\uffd2\035\uffd2\036\uffd2\042\uffd2\043\uffd2\044\uffd2\045\uffd2" + "\046\uffd2\047\uffd2\050\uffd2\051\uffd2\052\uffd2\053\uffd2\054" + "\uffd2\001\002\000\006\025\112\045\106\001\002\000\062" + "\004\uffd0\005\uffd0\007\uffd0\010\uffd0\025\uffd0\026\uffd0\027" + "\uffd0\030\uffd0\031\uffd0\032\uffd0\033\uffd0\035\uffd0\036\uffd0" + "\042\uffd0\043\uffd0\044\uffd0\045\uffd0\046\uffd0\047\uffd0\050" + "\uffd0\051\uffd0\052\uffd0\053\uffd0\054\uffd0\001\002\000\062" + "\004\uffcf\005\uffcf\007\uffcf\010\uffcf\025\uffcf\026\uffcf\027" + "\uffcf\030\uffcf\031\uffcf\032\uffcf\033\uffcf\035\uffcf\036\uffcf" + "\042\uffcf\043\uffcf\044\uffcf\045\uffcf\046\uffcf\047\uffcf\050" + "\uffcf\051\uffcf\052\uffcf\053\uffcf\054\uffcf\001\002\000\064" + "\004\uffbb\005\uffbb\007\uffbb\010\uffbb\011\uffbb\025\uffbb\026" + "\uffbb\027\uffbb\030\uffbb\031\uffbb\032\uffbb\033\uffbb\035\uffbb" + "\036\uffbb\042\uffbb\043\uffbb\044\uffbb\045\uffbb\046\uffbb\047" + "\uffbb\050\uffbb\051\uffbb\052\uffbb\053\uffbb\054\uffbb\001\002" + "\000\064\004\uffb7\005\uffb7\007\uffb7\010\uffb7\011\uffb7\025" + "\uffb7\026\uffb7\027\uffb7\030\uffb7\031\uffb7\032\uffb7\033\uffb7" + "\035\uffb7\036\uffb7\042\uffb7\043\uffb7\044\uffb7\045\uffb7\046" + "\uffb7\047\uffb7\050\uffb7\051\uffb7\052\uffb7\053\uffb7\054\uffb7" + "\001\002\000\052\004\034\005\uffdf\007\uffdf\010\044\025" + "\uffdf\026\023\027\031\030\020\031\042\032\035\033\032" + "\035\uffdf\036\uffdf\045\uffdf\047\022\050\037\051\024\052" + "\021\053\030\054\025\001\002\000\040\004\034\010\044" + "\026\023\027\031\030\020\031\042\032\035\033\032\045" + "\041\047\022\050\037\051\024\052\021\053\030\054\025" + "\001\002\000\064\004\uffb8\005\uffb8\007\uffb8\010\uffb8\011" + "\uffb8\025\uffb8\026\uffb8\027\uffb8\030\uffb8\031\uffb8\032\uffb8" + "\033\uffb8\035\uffb8\036\uffb8\042\uffb8\043\uffb8\044\uffb8\045" + "\uffb8\046\uffb8\047\uffb8\050\uffb8\051\uffb8\052\uffb8\053\uffb8" + "\054\uffb8\001\002\000\062\004\uffd1\005\uffd1\007\uffd1\010" + "\uffd1\025\uffd1\026\uffd1\027\uffd1\030\uffd1\031\uffd1\032\uffd1" + "\033\uffd1\035\uffd1\036\uffd1\042\uffd1\043\uffd1\044\uffd1\045" + "\uffd1\046\uffd1\047\uffd1\050\uffd1\051\uffd1\052\uffd1\053\uffd1" + "\054\uffd1\001\002\000\036\004\034\010\044\026\023\027" + "\031\030\020\031\042\032\035\033\032\047\022\050\037" + "\051\024\052\021\053\030\054\025\001\002\000\052\004" + "\uffdc\005\uffdc\007\uffdc\010\uffdc\025\uffdc\026\uffdc\027\uffdc" + "\030\uffdc\031\uffdc\032\uffdc\033\uffdc\035\uffdc\036\uffdc\045" + "\uffdc\047\uffdc\050\uffdc\051\uffdc\052\uffdc\053\uffdc\054\uffdc" + "\001\002\000\016\005\uffde\007\uffde\025\uffde\035\uffde\036" + "\uffde\045\uffde\001\002\000\064\004\uffb9\005\uffb9\007\uffb9" + "\010\uffb9\011\uffb9\025\uffb9\026\uffb9\027\uffb9\030\uffb9\031" + "\uffb9\032\uffb9\033\uffb9\035\uffb9\036\uffb9\042\uffb9\043\uffb9" + "\044\uffb9\045\uffb9\046\uffb9\047\uffb9\050\uffb9\051\uffb9\052" + "\uffb9\053\uffb9\054\uffb9\001\002\000\062\004\uffdb\005\uffdb" + "\007\uffdb\010\uffdb\025\uffdb\026\uffdb\027\uffdb\030\uffdb\031" + "\uffdb\032\uffdb\033\uffdb\035\uffdb\036\uffdb\042\077\043\075" + "\044\076\045\uffdb\046\100\047\uffdb\050\uffdb\051\uffdb\052" + "\uffdb\053\uffdb\054\uffdb\001\002\000\032\006\047\011\051" + "\012\050\026\023\027\031\030\020\031\042\032\035\033" + "\032\052\055\053\052\054\053\001\002\000\026\011\uffc3" + "\026\uffc3\027\uffc3\030\uffc3\031\uffc3\032\uffc3\033\uffc3\052" + "\uffc3\053\uffc3\054\uffc3\001\002\000\026\011\uffc5\026\uffc5" + "\027\uffc5\030\uffc5\031\uffc5\032\uffc5\033\uffc5\052\uffc5\053" + "\uffc5\054\uffc5\001\002\000\030\011\070\012\067\026\023" + "\027\031\030\020\031\042\032\035\033\032\052\055\053" + "\052\054\053\001\002\000\024\026\023\027\031\030\020" + "\031\042\032\035\033\032\052\055\053\052\054\053\001" + "\002\000\062\004\uffcc\005\uffcc\007\uffcc\010\uffcc\025\uffcc" + "\026\uffcc\027\uffcc\030\uffcc\031\uffcc\032\uffcc\033\uffcc\035" + "\uffcc\036\uffcc\042\uffcc\043\uffcc\044\uffcc\045\uffcc\046\uffcc" + "\047\uffcc\050\uffcc\051\uffcc\052\uffcc\053\uffcc\054\uffcc\001" + "\002\000\026\011\uffc1\026\uffc1\027\uffc1\030\uffc1\031\uffc1" + "\032\uffc1\033\uffc1\052\uffc1\053\uffc1\054\uffc1\001\002\000" + "\026\011\uffbf\026\uffbf\027\uffbf\030\uffbf\031\uffbf\032\uffbf" + "\033\uffbf\052\uffbf\053\uffbf\054\uffbf\001\002\000\026\011" + "\062\026\023\027\031\030\020\031\042\032\035\033\032" + "\052\055\053\063\054\064\001\002\000\030\011\uffbd\012" + "\056\026\uffbd\027\uffbd\030\uffbd\031\uffbd\032\uffbd\033\uffbd" + "\052\uffbd\053\uffbd\054\uffbd\001\002\000\004\052\057\001" + "\002\000\026\011\uffbe\026\uffbe\027\uffbe\030\uffbe\031\uffbe" + "\032\uffbe\033\uffbe\052\uffbe\053\uffbe\054\uffbe\001\002\000" + "\026\011\uffc4\026\uffc4\027\uffc4\030\uffc4\031\uffc4\032\uffc4" + "\033\uffc4\052\uffc4\053\uffc4\054\uffc4\001\002\000\026\011" + "\uffc6\026\uffc6\027\uffc6\030\uffc6\031\uffc6\032\uffc6\033\uffc6" + "\052\uffc6\053\uffc6\054\uffc6\001\002\000\062\004\uffcb\005" + "\uffcb\007\uffcb\010\uffcb\025\uffcb\026\uffcb\027\uffcb\030\uffcb" + "\031\uffcb\032\uffcb\033\uffcb\035\uffcb\036\uffcb\042\uffcb\043" + "\uffcb\044\uffcb\045\uffcb\046\uffcb\047\uffcb\050\uffcb\051\uffcb" + "\052\uffcb\053\uffcb\054\uffcb\001\002\000\026\011\uffc2\026" + "\uffc2\027\uffc2\030\uffc2\031\uffc2\032\uffc2\033\uffc2\052\uffc2" + "\053\uffc2\054\uffc2\001\002\000\026\011\uffc0\026\uffc0\027" + "\uffc0\030\uffc0\031\uffc0\032\uffc0\033\uffc0\052\uffc0\053\uffc0" + "\054\uffc0\001\002\000\026\011\066\026\023\027\031\030" + "\020\031\042\032\035\033\032\052\055\053\063\054\064" + "\001\002\000\062\004\uffc8\005\uffc8\007\uffc8\010\uffc8\025" + "\uffc8\026\uffc8\027\uffc8\030\uffc8\031\uffc8\032\uffc8\033\uffc8" + "\035\uffc8\036\uffc8\042\uffc8\043\uffc8\044\uffc8\045\uffc8\046" + "\uffc8\047\uffc8\050\uffc8\051\uffc8\052\uffc8\053\uffc8\054\uffc8" + "\001\002\000\024\026\023\027\031\030\020\031\042\032" + "\035\033\032\052\055\053\052\054\053\001\002\000\062" + "\004\uffca\005\uffca\007\uffca\010\uffca\025\uffca\026\uffca\027" + "\uffca\030\uffca\031\uffca\032\uffca\033\uffca\035\uffca\036\uffca" + "\042\uffca\043\uffca\044\uffca\045\uffca\046\uffca\047\uffca\050" + "\uffca\051\uffca\052\uffca\053\uffca\054\uffca\001\002\000\026" + "\011\072\026\023\027\031\030\020\031\042\032\035\033" + "\032\052\055\053\063\054\064\001\002\000\062\004\uffc9" + "\005\uffc9\007\uffc9\010\uffc9\025\uffc9\026\uffc9\027\uffc9\030" + "\uffc9\031\uffc9\032\uffc9\033\uffc9\035\uffc9\036\uffc9\042\uffc9" + "\043\uffc9\044\uffc9\045\uffc9\046\uffc9\047\uffc9\050\uffc9\051" + "\uffc9\052\uffc9\053\uffc9\054\uffc9\001\002\000\026\011\074" + "\026\023\027\031\030\020\031\042\032\035\033\032\052" + "\055\053\063\054\064\001\002\000\062\004\uffc7\005\uffc7" + "\007\uffc7\010\uffc7\025\uffc7\026\uffc7\027\uffc7\030\uffc7\031" + "\uffc7\032\uffc7\033\uffc7\035\uffc7\036\uffc7\042\uffc7\043\uffc7" + "\044\uffc7\045\uffc7\046\uffc7\047\uffc7\050\uffc7\051\uffc7\052" + "\uffc7\053\uffc7\054\uffc7\001\002\000\062\004\uffd8\005\uffd8" + "\007\uffd8\010\uffd8\025\uffd8\026\uffd8\027\uffd8\030\uffd8\031" + "\uffd8\032\uffd8\033\uffd8\035\uffd8\036\uffd8\042\uffd8\043\uffd8" + "\044\uffd8\045\uffd8\046\uffd8\047\uffd8\050\uffd8\051\uffd8\052" + "\uffd8\053\uffd8\054\uffd8\001\002\000\062\004\uffd7\005\uffd7" + "\007\uffd7\010\uffd7\025\uffd7\026\uffd7\027\uffd7\030\uffd7\031" + "\uffd7\032\uffd7\033\uffd7\035\uffd7\036\uffd7\042\uffd7\043\uffd7" + "\044\uffd7\045\uffd7\046\uffd7\047\uffd7\050\uffd7\051\uffd7\052" + "\uffd7\053\uffd7\054\uffd7\001\002\000\006\021\101\042\102" + "\001\002\000\062\004\uffd6\005\uffd6\007\uffd6\010\uffd6\025" + "\uffd6\026\uffd6\027\uffd6\030\uffd6\031\uffd6\032\uffd6\033\uffd6" + "\035\uffd6\036\uffd6\042\uffd6\043\uffd6\044\uffd6\045\uffd6\046" + "\uffd6\047\uffd6\050\uffd6\051\uffd6\052\uffd6\053\uffd6\054\uffd6" + "\001\002\000\062\004\uffd5\005\uffd5\007\uffd5\010\uffd5\025" + "\uffd5\026\uffd5\027\uffd5\030\uffd5\031\uffd5\032\uffd5\033\uffd5" + "\035\uffd5\036\uffd5\042\uffd5\043\uffd5\044\uffd5\045\uffd5\046" + "\uffd5\047\uffd5\050\uffd5\051\uffd5\052\uffd5\053\uffd5\054\uffd5" + "\001\002\000\004\021\103\001\002\000\062\004\uffd4\005" + "\uffd4\007\uffd4\010\uffd4\025\uffd4\026\uffd4\027\uffd4\030\uffd4" + "\031\uffd4\032\uffd4\033\uffd4\035\uffd4\036\uffd4\042\uffd4\043" + "\uffd4\044\uffd4\045\uffd4\046\uffd4\047\uffd4\050\uffd4\051\uffd4" + "\052\uffd4\053\uffd4\054\uffd4\001\002\000\052\004\uffda\005" + "\uffda\007\uffda\010\uffda\025\uffda\026\uffda\027\uffda\030\uffda" + "\031\uffda\032\uffda\033\uffda\035\uffda\036\uffda\045\uffda\047" + "\uffda\050\uffda\051\uffda\052\uffda\053\uffda\054\uffda\001\002" + "\000\006\005\107\045\106\001\002\000\036\004\034\010" + "\044\026\023\027\031\030\020\031\042\032\035\033\032" + "\047\022\050\037\051\024\052\021\053\030\054\025\001" + "\002\000\062\004\uffd3\005\uffd3\007\uffd3\010\uffd3\025\uffd3" + "\026\uffd3\027\uffd3\030\uffd3\031\uffd3\032\uffd3\033\uffd3\035" + "\uffd3\036\uffd3\042\uffd3\043\uffd3\044\uffd3\045\uffd3\046\uffd3" + "\047\uffd3\050\uffd3\051\uffd3\052\uffd3\053\uffd3\054\uffd3\001" + "\002\000\052\004\034\005\uffe0\007\uffe0\010\044\025\uffe0" + "\026\023\027\031\030\020\031\042\032\035\033\032\035" + "\uffe0\036\uffe0\045\uffe0\047\022\050\037\051\024\052\021" + "\053\030\054\025\001\002\000\052\004\uffdd\005\uffdd\007" + "\uffdd\010\uffdd\025\uffdd\026\uffdd\027\uffdd\030\uffdd\031\uffdd" + "\032\uffdd\033\uffdd\035\uffdd\036\uffdd\045\uffdd\047\uffdd\050" + "\uffdd\051\uffdd\052\uffdd\053\uffdd\054\uffdd\001\002\000\014" + "\013\ufff8\022\ufff8\023\ufff8\024\ufff8\040\ufff8\001\002\000" + "\052\004\uffd9\005\uffd9\007\uffd9\010\uffd9\025\uffd9\026\uffd9" + "\027\uffd9\030\uffd9\031\uffd9\032\uffd9\033\uffd9\035\uffd9\036" + "\uffd9\045\uffd9\047\uffd9\050\uffd9\051\uffd9\052\uffd9\053\uffd9" + "\054\uffd9\001\002\000\054\002\uffee\003\uffee\004\uffee\006" + "\uffee\010\uffee\016\uffee\021\uffee\026\uffee\027\uffee\030\uffee" + "\031\uffee\032\uffee\033\uffee\034\uffee\045\uffee\047\uffee\050" + "\uffee\051\uffee\052\uffee\053\uffee\054\uffee\001\002\000\044" + "\004\uffe1\006\142\010\uffe1\026\uffe1\027\uffe1\030\uffe1\031" + "\uffe1\032\uffe1\033\uffe1\034\140\045\uffe1\047\uffe1\050\uffe1" + "\051\uffe1\052\uffe1\053\uffe1\054\uffe1\001\002\000\004\040" + "\124\001\002\000\054\002\ufff3\003\ufff3\004\ufff3\006\ufff3" + "\010\ufff3\016\ufff3\021\ufff3\026\ufff3\027\ufff3\030\ufff3\031" + "\ufff3\032\ufff3\033\ufff3\034\ufff3\045\ufff3\047\ufff3\050\ufff3" + "\051\ufff3\052\ufff3\053\ufff3\054\ufff3\001\002\000\052\002" + "\000\003\114\004\uffe6\006\uffe6\010\uffe6\016\121\026\uffe6" + "\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6\045" + "\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6\054\uffe6" + "\001\002\000\004\040\124\001\002\000\054\002\ufff6\003" + "\ufff6\004\ufff6\006\ufff6\010\ufff6\016\ufff6\021\ufff6\026\ufff6" + "\027\ufff6\030\ufff6\031\ufff6\032\ufff6\033\ufff6\034\ufff6\045" + "\ufff6\047\ufff6\050\ufff6\051\ufff6\052\ufff6\053\ufff6\054\ufff6" + "\001\002\000\004\017\127\001\002\000\006\015\125\017" + "\uffe4\001\002\000\006\017\uffe3\040\124\001\002\000\004" + "\017\uffe5\001\002\000\046\004\uffe7\006\uffe7\010\uffe7\020" + "\130\026\uffe7\027\uffe7\030\uffe7\031\uffe7\032\uffe7\033\uffe7" + "\034\uffe7\045\uffe7\047\uffe7\050\uffe7\051\uffe7\052\uffe7\053" + "\uffe7\054\uffe7\001\002\000\050\003\114\004\uffe6\006\uffe6" + "\010\uffe6\016\116\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032" + "\uffe6\033\uffe6\034\uffe6\045\uffe6\047\uffe6\050\uffe6\051\uffe6" + "\052\uffe6\053\uffe6\054\uffe6\001\002\000\052\003\114\004" + "\uffe6\006\uffe6\010\uffe6\016\121\021\132\026\uffe6\027\uffe6" + "\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034\uffe6\045\uffe6\047" + "\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6\054\uffe6\001\002" + "\000\054\002\ufff5\003\ufff5\004\ufff5\006\ufff5\010\ufff5\016" + "\ufff5\021\ufff5\026\ufff5\027\ufff5\030\ufff5\031\ufff5\032\ufff5" + "\033\ufff5\034\ufff5\045\ufff5\047\ufff5\050\ufff5\051\ufff5\052" + "\ufff5\053\ufff5\054\ufff5\001\002\000\004\017\134\001\002" + "\000\046\004\uffe7\006\uffe7\010\uffe7\020\135\026\uffe7\027" + "\uffe7\030\uffe7\031\uffe7\032\uffe7\033\uffe7\034\uffe7\045\uffe7" + "\047\uffe7\050\uffe7\051\uffe7\052\uffe7\053\uffe7\054\uffe7\001" + "\002\000\050\003\114\004\uffe6\006\uffe6\010\uffe6\016\116" + "\026\uffe6\027\uffe6\030\uffe6\031\uffe6\032\uffe6\033\uffe6\034" + "\uffe6\045\uffe6\047\uffe6\050\uffe6\051\uffe6\052\uffe6\053\uffe6" + "\054\uffe6\001\002\000\052\003\114\004\uffe6\006\uffe6\010" + "\uffe6\016\121\021\137\026\uffe6\027\uffe6\030\uffe6\031\uffe6" + "\032\uffe6\033\uffe6\034\uffe6\045\uffe6\047\uffe6\050\uffe6\051" + "\uffe6\052\uffe6\053\uffe6\054\uffe6\001\002\000\054\002\ufff4" + "\003\ufff4\004\ufff4\006\ufff4\010\ufff4\016\ufff4\021\ufff4\026" + "\ufff4\027\ufff4\030\ufff4\031\ufff4\032\ufff4\033\ufff4\034\ufff4" + "\045\ufff4\047\ufff4\050\ufff4\051\ufff4\052\ufff4\053\ufff4\054" + "\ufff4\001\002\000\004\037\160\001\002\000\040\004\034" + "\010\044\026\023\027\031\030\020\031\042\032\035\033" + "\032\045\041\047\022\050\037\051\024\052\021\053\030" + "\054\025\001\002\000\040\004\uffe2\010\uffe2\026\uffe2\027" + "\uffe2\030\uffe2\031\uffe2\032\uffe2\033\uffe2\045\uffe2\047\uffe2" + "\050\uffe2\051\uffe2\052\uffe2\053\uffe2\054\uffe2\001\002\000" + "\014\007\152\025\147\035\144\036\146\045\106\001\002" + "\000\054\002\uffe8\003\uffe8\004\uffe8\006\uffe8\010\uffe8\016" + "\uffe8\021\uffe8\026\uffe8\027\uffe8\030\uffe8\031\uffe8\032\uffe8" + "\033\uffe8\034\uffe8\045\uffe8\047\uffe8\050\uffe8\051\uffe8\052" + "\uffe8\053\uffe8\054\uffe8\001\002\000\054\002\uffe9\003\uffe9" + "\004\uffe9\006\uffe9\010\uffe9\016\uffe9\021\uffe9\026\uffe9\027" + "\uffe9\030\uffe9\031\uffe9\032\uffe9\033\uffe9\034\uffe9\045\uffe9" + "\047\uffe9\050\uffe9\051\uffe9\052\uffe9\053\uffe9\054\uffe9\001" + "\002\000\040\004\034\010\044\026\023\027\031\030\020" + "\031\042\032\035\033\032\045\041\047\022\050\037\051" + "\024\052\021\053\030\054\025\001\002\000\004\037\155" + "\001\002\000\006\025\147\035\153\001\002\000\054\002" + "\ufff2\003\ufff2\004\ufff2\006\ufff2\010\ufff2\016\ufff2\021\ufff2" + "\026\ufff2\027\ufff2\030\ufff2\031\ufff2\032\ufff2\033\ufff2\034" + "\ufff2\045\ufff2\047\ufff2\050\ufff2\051\ufff2\052\ufff2\053\ufff2" + "\054\ufff2\001\002\000\006\025\uffed\035\uffed\001\002\000" + "\054\002\ufff0\003\ufff0\004\ufff0\006\ufff0\010\ufff0\016\ufff0" + "\021\ufff0\026\ufff0\027\ufff0\030\ufff0\031\ufff0\032\ufff0\033" + "\ufff0\034\ufff0\045\ufff0\047\ufff0\050\ufff0\051\ufff0\052\ufff0" + "\053\ufff0\054\ufff0\001\002\000\054\002\ufff1\003\ufff1\004" + "\ufff1\006\ufff1\010\ufff1\016\ufff1\021\ufff1\026\ufff1\027\ufff1" + "\030\ufff1\031\ufff1\032\ufff1\033\ufff1\034\ufff1\045\ufff1\047" + "\ufff1\050\ufff1\051\ufff1\052\ufff1\053\ufff1\054\ufff1\001\002" + "\000\054\002\uffea\003\uffea\004\uffea\006\uffea\010\uffea\016" + "\uffea\021\uffea\026\uffea\027\uffea\030\uffea\031\uffea\032\uffea" + "\033\uffea\034\uffea\045\uffea\047\uffea\050\uffea\051\uffea\052" + "\uffea\053\uffea\054\uffea\001\002\000\012\007\157\025\uffec" + "\035\uffec\045\106\001\002\000\006\025\uffeb\035\uffeb\001" + "\002\000\054\002\uffef\003\uffef\004\uffef\006\uffef\010\uffef" + "\016\uffef\021\uffef\026\uffef\027\uffef\030\uffef\031\uffef\032" + "\uffef\033\uffef\034\uffef\045\uffef\047\uffef\050\uffef\051\uffef" + "\052\uffef\053\uffef\054\uffef\001\002" }); /** Access to parse-action table. */ public short[][] action_table() {return _action_table;} /** reduce_goto table. */ protected static final short[][] _reduce_table = unpackFromStrings(new String[] { "\000\156\000\004\005\004\001\001\000\004\002\007\001" + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + "\000\004\003\012\001\001\000\002\001\001\000\010\004" + "\116\016\114\021\117\001\001\000\002\001\001\000\002" + "\001\001\000\002\001\001\000\002\001\001\000\016\006" + "\025\007\032\010\037\011\042\012\035\020\026\001\001" + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + "\002\001\001\000\012\010\112\011\042\012\035\020\026" + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + "\000\012\010\110\011\042\012\035\020\026\001\001\000" + "\016\006\104\007\032\010\037\011\042\012\035\020\026" + "\001\001\000\002\001\001\000\002\001\001\000\012\010" + "\103\011\042\012\035\020\026\001\001\000\002\001\001" + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + "\010\014\045\017\053\020\044\001\001\000\002\001\001" + "\000\002\001\001\000\010\014\045\017\070\020\044\001" + "\001\000\010\014\045\017\064\020\044\001\001\000\002" + "\001\001\000\002\001\001\000\002\001\001\000\006\014" + "\060\020\057\001\001\000\002\001\001\000\002\001\001" + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + "\002\001\001\000\002\001\001\000\002\001\001\000\006" + "\014\060\020\057\001\001\000\002\001\001\000\010\014" + "\045\017\072\020\044\001\001\000\002\001\001\000\006" + "\014\060\020\057\001\001\000\002\001\001\000\006\014" + "\060\020\057\001\001\000\002\001\001\000\002\001\001" + "\000\002\001\001\000\002\001\001\000\002\001\001\000" + "\002\001\001\000\002\001\001\000\002\001\001\000\002" + "\001\001\000\002\001\001\000\014\007\107\010\037\011" + "\042\012\035\020\026\001\001\000\002\001\001\000\012" + "\010\110\011\042\012\035\020\026\001\001\000\002\001" + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + "\000\004\022\140\001\001\000\004\015\132\001\001\000" + "\002\001\001\000\006\004\121\016\114\001\001\000\004" + "\015\122\001\001\000\002\001\001\000\002\001\001\000" + "\002\001\001\000\004\015\125\001\001\000\002\001\001" + "\000\002\001\001\000\010\004\116\016\114\021\130\001" + "\001\000\006\004\121\016\114\001\001\000\002\001\001" + "\000\002\001\001\000\002\001\001\000\010\004\116\016" + "\114\021\135\001\001\000\006\004\121\016\114\001\001" + "\000\002\001\001\000\002\001\001\000\016\006\142\007" + "\032\010\037\011\042\012\035\020\026\001\001\000\002" + "\001\001\000\010\013\147\023\144\024\150\001\001\000" + "\002\001\001\000\002\001\001\000\016\006\155\007\032" + "\010\037\011\042\012\035\020\026\001\001\000\002\001" + "\001\000\004\023\153\001\001\000\002\001\001\000\002" + "\001\001\000\002\001\001\000\002\001\001\000\002\001" + "\001\000\002\001\001\000\002\001\001\000\002\001\001" + "" }); /** Access to reduce_goto table. */ public short[][] reduce_table() {return _reduce_table;} /** Instance of action encapsulation class. */ protected CUP$LexParse$actions action_obj; /** Action encapsulation object initializer. */ protected void init_actions() { action_obj = new CUP$LexParse$actions(this); } /** Invoke a user supplied parse action. */ public java_cup.runtime.Symbol do_action( int act_num, java_cup.runtime.lr_parser parser, java.util.Stack stack, int top) throws java.lang.Exception { /* call code in generated class */ return action_obj.CUP$LexParse$do_action(act_num, parser, stack, top); } /** Indicates start state. */ public int start_state() {return 0;} /** Indicates start production. */ public int start_production() {return 0;} /** EOF Symbol index. */ public int EOF_sym() {return 0;} /** error Symbol index. */ public int error_sym() {return 1;} /** User initialization code. */ public void user_init() throws java.lang.Exception { action_obj.scanner = this.scanner; } public LexScan scanner; public LexParse(LexScan scanner) { super(scanner); this.scanner = scanner; } public CharClasses getCharClasses() { return action_obj.charClasses; } public EOFActions getEOFActions() { return action_obj.eofActions; } public void report_error(String message, Object info) { if ( info instanceof java_cup.runtime.Symbol ) { java_cup.runtime.Symbol s = (java_cup.runtime.Symbol) info; if (s.sym == sym.EOF) Out.error(ErrorMessages.UNEXPECTED_EOF); else Out.error(scanner.file, ErrorMessages.SYNTAX_ERROR, s.left, s.right); } else Out.error(ErrorMessages.UNKNOWN_SYNTAX); } public void report_fatal_error(String message, Object info) { // report_error(message, info); throw new GeneratorException(); } } /** Cup generated class to encapsulate user supplied action code.*/ class CUP$LexParse$actions { LexScan scanner; CharClasses charClasses = new CharClasses(Options.jlex ? 127 : 0xFFFF); RegExps regExps = new RegExps(); Macros macros = new Macros(); Integer stateNumber; Timer t = new Timer(); EOFActions eofActions = new EOFActions(); void fatalError(ErrorMessages message, int line, int col) { syntaxError(message, line, col); throw new GeneratorException(); } void fatalError(ErrorMessages message) { fatalError(message, scanner.currentLine(), -1); throw new GeneratorException(); } void syntaxError(ErrorMessages message) { Out.error(scanner.file, message, scanner.currentLine(), -1); } void syntaxError(ErrorMessages message, int line) { Out.error(scanner.file, message, line, -1); } void syntaxError(ErrorMessages message, int line, int col) { Out.error(scanner.file, message, line, col); } private boolean check(int type, char c) { switch (type) { case sym.JLETTERCLASS: return Character.isJavaIdentifierStart(c); case sym.JLETTERDIGITCLASS: return Character.isJavaIdentifierPart(c); case sym.LETTERCLASS: return Character.isLetter(c); case sym.DIGITCLASS: return Character.isDigit(c); case sym.UPPERCLASS: return Character.isUpperCase(c); case sym.LOWERCLASS: return Character.isLowerCase(c); default: return false; } } private Vector makePreClass(int type) { Vector result = new Vector(); char c = 0; char start = 0; char last = charClasses.getMaxCharCode(); boolean prev, current; prev = check(type,'\u0000'); for (c = 1; c < last; c++) { current = check(type,c); if (!prev && current) start = c; if (prev && !current) { result.addElement(new Interval(start, (char)(c-1))); } prev = current; } // the last iteration is moved out of the loop to // avoid an endless loop if last == maxCharCode and // last+1 == 0 current = check(type,c); if (!prev && current) result.addElement(new Interval(c,c)); if (prev && current) result.addElement(new Interval(start, c)); if (prev && !current) result.addElement(new Interval(start, (char)(c-1))); return result; } private RegExp makeRepeat(RegExp r, int n1, int n2, int line, int col) { if (n1 <= 0 && n2 <= 0) { syntaxError(ErrorMessages.REPEAT_ZERO, line, col); return null; } if (n1 > n2) { syntaxError(ErrorMessages.REPEAT_GREATER, line, col); return null; } int i; RegExp result; if (n1 > 0) { result = r; n1--; n2--; // we need one concatenation less than the number of expressions to match } else { result = new RegExp1(sym.QUESTION,r); n2--; } for (i = 0; i < n1; i++) result = new RegExp2(sym.CONCAT, result, r); n2-= n1; for (i = 0; i < n2; i++) result = new RegExp2(sym.CONCAT, result, new RegExp1(sym.QUESTION,r)); return result; } private RegExp makeNL() { Vector list = new Vector(); list.addElement(new Interval('\n','\r')); list.addElement(new Interval('\u0085','\u0085')); list.addElement(new Interval('\u2028','\u2029')); // assumption: line feeds are caseless charClasses.makeClass(list, false); charClasses.makeClass('\n', false); charClasses.makeClass('\r', false); RegExp1 c = new RegExp1(sym.CCLASS, list); Character n = new Character('\n'); Character r = new Character('\r'); return new RegExp2(sym.BAR, c, new RegExp2(sym.CONCAT, new RegExp1(sym.CHAR, r), new RegExp1(sym.CHAR, n))); } private final LexParse parser; /** Constructor */ CUP$LexParse$actions(LexParse parser) { this.parser = parser; } /** Method with the actual generated action code. */ public final java_cup.runtime.Symbol CUP$LexParse$do_action( int CUP$LexParse$act_num, java_cup.runtime.lr_parser CUP$LexParse$parser, java.util.Stack CUP$LexParse$stack, int CUP$LexParse$top) throws java.lang.Exception { /* Symbol object for return from actions */ java_cup.runtime.Symbol CUP$LexParse$result; /* select the action based on the action number */ switch (CUP$LexParse$act_num) { /*. . . . . . . . . . . . . . . . . . . .*/ case 74: // preclass ::= LOWERCLASS { Vector RESULT =null; RESULT = makePreClass(sym.LOWERCLASS); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 73: // preclass ::= UPPERCLASS { Vector RESULT =null; RESULT = makePreClass(sym.UPPERCLASS); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 72: // preclass ::= DIGITCLASS { Vector RESULT =null; RESULT = makePreClass(sym.DIGITCLASS); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 71: // preclass ::= LETTERCLASS { Vector RESULT =null; RESULT = makePreClass(sym.LETTERCLASS); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 70: // preclass ::= JLETTERDIGITCLASS { Vector RESULT =null; RESULT = makePreClass(sym.JLETTERDIGITCLASS); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 69: // preclass ::= JLETTERCLASS { Vector RESULT =null; RESULT = makePreClass(sym.JLETTERCLASS); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("preclass",14, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 68: // classcontentelem ::= CHAR { Interval RESULT =null; int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new Interval(c.charValue(), c.charValue()); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontentelem",10, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 67: // classcontentelem ::= CHAR DASH CHAR { Interval RESULT =null; int c1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; int c1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; Character c1 = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; int c2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int c2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Character c2 = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new Interval(c1.charValue(), c2.charValue()); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontentelem",10, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 66: // classcontent ::= MACROUSE { Vector RESULT =null; int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 65: // classcontent ::= classcontent MACROUSE { Vector RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; syntaxError(ErrorMessages.CHARCLASS_MACRO, identleft, identright); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 64: // classcontent ::= STRING { Vector RESULT =null; int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new Vector(); for (int i = 0; i < s.length(); i++) RESULT.addElement(new Interval(s.charAt(i),s.charAt(i))); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 63: // classcontent ::= classcontent STRING { Vector RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; String s = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; for (int i = 0; i < s.length(); i++) list.addElement(new Interval(s.charAt(i),s.charAt(i))); RESULT = list; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 62: // classcontent ::= preclass { Vector RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = list; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 61: // classcontent ::= classcontent preclass { Vector RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int plistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int plistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Vector plist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; for (Enumeration e = plist.elements(); e.hasMoreElements();) list.addElement(e.nextElement()); RESULT = list; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 60: // classcontent ::= classcontentelem { Vector RESULT =null; int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; Vector list = new Vector(); list.addElement(elem); RESULT = list; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 59: // classcontent ::= classcontent classcontentelem { Vector RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int elemleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int elemright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Interval elem = (Interval)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; list.addElement(elem); RESULT = list; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("classcontent",13, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 58: // charclass ::= OPENCLASS HAT DASH classcontent CLOSECLASS { RegExp RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; try { list.addElement(new Interval('-','-')); charClasses.makeClassNot(list, Options.jlex && scanner.caseless); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASSNOT,list); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 57: // charclass ::= OPENCLASS DASH classcontent CLOSECLASS { RegExp RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; try { list.addElement(new Interval('-','-')); charClasses.makeClass(list, Options.jlex && scanner.caseless); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASS,list); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 56: // charclass ::= OPENCLASS HAT classcontent CLOSECLASS { RegExp RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; try { charClasses.makeClassNot(list, Options.jlex && scanner.caseless); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASSNOT,list); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 55: // charclass ::= OPENCLASS HAT CLOSECLASS { RegExp RESULT =null; int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; Vector list = new Vector(); list.addElement(new Interval((char)0,CharClasses.maxChar)); try { charClasses.makeClass(list, false); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASS,list); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 54: // charclass ::= OPENCLASS classcontent CLOSECLASS { RegExp RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int closeleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int closeright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object close = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; try { charClasses.makeClass(list, Options.jlex && scanner.caseless); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, closeleft, closeright); } RESULT = new RegExp1(sym.CCLASS,list); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 53: // charclass ::= OPENCLASS CLOSECLASS { RegExp RESULT =null; RESULT = new RegExp1(sym.CCLASS,null); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("charclass",8, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 52: // regexp ::= CHAR { RegExp RESULT =null; int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Character c = (Character)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; try { if ( scanner.caseless ) { charClasses.makeClass(c.charValue(), true); RESULT = new RegExp1(sym.CHAR_I, c); } else { charClasses.makeClass(c.charValue(), false); RESULT = new RegExp1(sym.CHAR, c); } } catch (CharClassException e) { syntaxError(ErrorMessages.CS2SMALL_CHAR, cleft, cright); } CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 51: // regexp ::= POINT { RegExp RESULT =null; Vector any = new Vector(); any.addElement(new Interval('\n','\n')); // assumption: there is no upper case for \n charClasses.makeClass('\n', false); RESULT = new RegExp1(sym.CCLASSNOT, any); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 50: // regexp ::= STRING { RegExp RESULT =null; int strleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int strright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; String str = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; try { if ( scanner.caseless ) { charClasses.makeClass(str, true); RESULT = new RegExp1(sym.STRING_I, str); } else { charClasses.makeClass(str, false); RESULT = new RegExp1(sym.STRING, str); } } catch (CharClassException e) { syntaxError(ErrorMessages.CS2SMALL_STRING, strleft, strright); } CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 49: // regexp ::= preclass { RegExp RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; try { // assumption [correct?]: preclasses are already closed under case charClasses.makeClass(list, false); } catch (CharClassException e) { syntaxError(ErrorMessages.CHARSET_2_SMALL, listleft); } RESULT = new RegExp1(sym.CCLASS, list); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 48: // regexp ::= charclass { RegExp RESULT =null; int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; RegExp c = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = c; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 47: // regexp ::= MACROUSE { RegExp RESULT =null; int identleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int identright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; String ident = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; if ( !scanner.macroDefinition ) { if ( ! macros.markUsed(ident) ) throw new ScannerException(scanner.file, ErrorMessages.MACRO_UNDECL, identleft, identright); } RESULT = new RegExp1(sym.MACROUSE, ident); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 46: // regexp ::= OPENBRACKET series CLOSEBRACKET { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; RESULT = r; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 45: // regexp ::= regexp REPEAT REPEAT RBRACE { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; int n1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; int n1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; Integer n1 = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; int n2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int n2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Integer n2 = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; RESULT = makeRepeat(r, n1.intValue(), n2.intValue(), n1left, n2right); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 44: // regexp ::= regexp REPEAT RBRACE { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; int nleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int nright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Integer n = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = makeRepeat(r, n.intValue(), n.intValue(), bleft, bright); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 43: // regexp ::= regexp QUESTION { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; RESULT = new RegExp1(sym.QUESTION, r); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 42: // regexp ::= regexp PLUS { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; RESULT = new RegExp1(sym.PLUS, r); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 41: // regexp ::= regexp STAR { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; RESULT = new RegExp1(sym.STAR, r); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("regexp",7, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 40: // nregexp ::= TILDE nregexp { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new RegExp1(sym.TILDE, r); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 39: // nregexp ::= BANG nregexp { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new RegExp1(sym.BANG, r); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 38: // nregexp ::= regexp { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = r; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("nregexp",6, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 37: // concs ::= nregexp { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = r; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("concs",5, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 36: // concs ::= concs nregexp { RegExp RESULT =null; int r1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int r1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp r1 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new RegExp2(sym.CONCAT, r1, r2); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("concs",5, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 35: // series ::= BAR { RegExp RESULT =null; int bleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int bright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object b = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; syntaxError(ErrorMessages.REGEXP_EXPECTED, bleft, bright); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 34: // series ::= concs { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = r; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 33: // series ::= series BAR concs { RegExp RESULT =null; int r1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; int r1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; RegExp r1 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; int r2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int r2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; RegExp r2 = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new RegExp2(sym.BAR, r1, r2); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("series",4, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 32: // hatOPT ::= { Boolean RESULT =null; RESULT = new Boolean(false); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("hatOPT",16, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 31: // hatOPT ::= HAT { Boolean RESULT =null; // assumption: there is no upper case for \n charClasses.makeClass('\n', false); RESULT = new Boolean(true); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("hatOPT",16, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 30: // states ::= IDENT COMMA { Vector RESULT =null; int cleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int cright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object c = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; syntaxError(ErrorMessages.REGEXP_EXPECTED, cleft, cright+1); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 29: // states ::= IDENT { Vector RESULT =null; int idleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int idright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; String id = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; Vector list = new Vector(); stateNumber = scanner.states.getNumber( id ); if ( stateNumber != null ) list.addElement( stateNumber ); else { throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, idleft, idright); } RESULT = list; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 28: // states ::= IDENT COMMA states { Vector RESULT =null; int idleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; int idright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; String id = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; stateNumber = scanner.states.getNumber( id ); if ( stateNumber != null ) list.addElement( stateNumber ); else { throw new ScannerException(scanner.file, ErrorMessages.LEXSTATE_UNDECL, idleft, idright); } RESULT = list; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("states",11, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 27: // statesOPT ::= { Vector RESULT =null; RESULT = new Vector(); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("statesOPT",12, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 26: // statesOPT ::= LESSTHAN states MORETHAN { Vector RESULT =null; int listleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int listright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector list = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; RESULT = list; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("statesOPT",12, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 25: // actions ::= NOACTION { Action RESULT =null; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("actions",18, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 24: // actions ::= act { Action RESULT =null; int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = a; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("actions",18, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 23: // act ::= REGEXPEND ACTION { Action RESULT =null; int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = a; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("act",17, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 22: // lookahead ::= LOOKAHEAD series DOLLAR { RegExp RESULT =null; int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp s = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; RESULT = new RegExp2(sym.CONCAT, s, makeNL()); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 21: // lookahead ::= LOOKAHEAD series { RegExp RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = r; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 20: // lookahead ::= DOLLAR { RegExp RESULT =null; RESULT = makeNL(); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("lookahead",9, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 19: // rule ::= error { Integer RESULT =null; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 18: // rule ::= statesOPT EOFRULE ACTION { Integer RESULT =null; int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new Integer(regExps.insert(s, a)); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 17: // rule ::= statesOPT hatOPT series lookahead NOACTION { Integer RESULT =null; int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; int bolleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; int bolright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; Boolean bol = (Boolean)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; int lleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int lright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp l = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object a = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; syntaxError(ErrorMessages.LOOKAHEAD_NEEDS_ACTION, aleft, aright+1); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 16: // rule ::= statesOPT hatOPT series lookahead act { Integer RESULT =null; int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; int bolleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; int bolright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; Boolean bol = (Boolean)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; int lleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int lright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp l = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, l)); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 15: // rule ::= statesOPT hatOPT series actions { Integer RESULT =null; int sleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; int sright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; Vector s = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; int bolleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).left; int bolright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).right; Boolean bol = (Boolean)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-2)).value; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp r = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int aleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int aright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Action a = (Action)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new Integer(regExps.insert(rleft, s, r, a, bol, null)); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rule",2, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 14: // rules ::= rule { Vector RESULT =null; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; RESULT = new Vector(); RESULT.addElement(r); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 13: // rules ::= LESSTHAN states MORETHAN LBRACE rules RBRACE { Vector RESULT =null; int statesleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; int statesright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; Vector states = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; int rlistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int rlistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector rlist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; Enumeration rs = rlist.elements(); while ( rs.hasMoreElements() ) { Integer elem = (Integer) rs.nextElement(); // might be null for error case of "rule" if (elem != null) { regExps.addStates( elem.intValue(), states ); } } RESULT = rlist; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-5)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 12: // rules ::= rules LESSTHAN states MORETHAN LBRACE rules RBRACE { Vector RESULT =null; int rlist1left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).left; int rlist1right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).right; Vector rlist1 = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)).value; int statesleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).left; int statesright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).right; Vector states = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-4)).value; int rlist2left = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int rlist2right = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector rlist2 = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; Enumeration rs = rlist2.elements(); while ( rs.hasMoreElements() ) { Integer elem = (Integer) rs.nextElement(); // might be null for error case of "rule" if (elem != null) { regExps.addStates( elem.intValue(), states ); } rlist1.addElement( elem ); } RESULT = rlist1; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-6)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 11: // rules ::= rules rule { Vector RESULT =null; int rlistleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int rlistright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; Vector rlist = (Vector)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; int rleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int rright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Integer r = (Integer)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; rlist.addElement(r); RESULT = rlist; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("rules",15, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 10: // macro ::= IDENT EQUALS { Object RESULT =null; int eleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).left; int eright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()).right; Object e = (Object)((java_cup.runtime.Symbol) CUP$LexParse$stack.peek()).value; syntaxError(ErrorMessages.REGEXP_EXPECTED, eleft, eright); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 9: // macro ::= IDENT EQUALS series REGEXPEND { Object RESULT =null; int nameleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).left; int nameright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).right; String name = (String)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)).value; int definitionleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int definitionright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; RegExp definition = (RegExp)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; macros.insert(name, definition); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 8: // macro ::= UNICODE { Object RESULT =null; charClasses.setMaxCharCode(0xFFFF); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 7: // macro ::= FULL { Object RESULT =null; charClasses.setMaxCharCode(255); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 6: // macro ::= ASCII { Object RESULT =null; charClasses.setMaxCharCode(127); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macro",1, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 5: // macros ::= error { Object RESULT =null; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 4: // macros ::= macros macro { Object RESULT =null; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 3: // macros ::= { Object RESULT =null; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("macros",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 2: // specification ::= { NFA RESULT =null; fatalError(ErrorMessages.NO_LEX_SPEC); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("specification",3, ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 1: // specification ::= USERCODE macros DELIMITER rules { NFA RESULT =null; scanner.t.stop(); Out.checkErrors(); Out.time(ErrorMessages.PARSING_TOOK, t); macros.expand(); Enumeration unused = macros.unused(); while ( unused.hasMoreElements() ) { Out.warning("Macro \""+unused.nextElement()+"\" has been declared but never used."); } SemCheck.check(regExps, macros, scanner.file); regExps.checkActions(); regExps.checkLookAheads(); Out.checkErrors(); if (Options.dump) charClasses.dump(); Out.print("Constructing NFA : "); t.start(); int num = regExps.getNum(); RESULT = new NFA(charClasses.getNumClasses(), scanner, regExps, macros, charClasses); eofActions.setNumLexStates(scanner.states.number()); for (int i = 0; i < num; i++) { if (regExps.isEOF(i)) eofActions.add( regExps.getStates(i), regExps.getAction(i) ); else RESULT.addRegExp(i); } if (scanner.standalone) RESULT.addStandaloneRule(); t.stop(); Out.time(""); Out.time(ErrorMessages.NFA_TOOK, t); CUP$LexParse$result = parser.getSymbolFactory().newSymbol("specification",3, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-3)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } return CUP$LexParse$result; /*. . . . . . . . . . . . . . . . . . . .*/ case 0: // $START ::= specification EOF { Object RESULT =null; int start_valleft = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).left; int start_valright = ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).right; NFA start_val = (NFA)((java_cup.runtime.Symbol) CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)).value; RESULT = start_val; CUP$LexParse$result = parser.getSymbolFactory().newSymbol("$START",0, ((java_cup.runtime.Symbol)CUP$LexParse$stack.elementAt(CUP$LexParse$top-1)), ((java_cup.runtime.Symbol)CUP$LexParse$stack.peek()), RESULT); } /* ACCEPT */ CUP$LexParse$parser.done_parsing(); return CUP$LexParse$result; /* . . . . . .*/ default: throw new Exception( "Invalid action number found in internal parse table"); } } } jflex-1.4.3/src/JFlex/LexScan.flex0000644000175000017500000005464511141010522015346 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java_cup.runtime.Symbol; import java.util.Vector; import java.io.*; import java.util.Stack; /** * The lexer of JFlex. * * Generated by JFlex. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ %% %final %public %class LexScan %implements sym, java_cup.runtime.Scanner %function next_token %type Symbol %unicode %column %line %eofclose %state COMMENT, STATELIST, MACROS, REGEXPSTART %state REGEXP, JAVA_CODE, STATES, STRING_CONTENT %state CHARCLASS, COPY, REPEATEXP, EATWSPNL %state CTOR_ARG %cupdebug %{ int balance = 0; int commentbalance = 0; int action_line = 0; int bufferSize = 16384; File file; Stack files = new Stack(); StringBuffer userCode = new StringBuffer(); String classCode; String initCode; String initThrow; String eofCode; String eofThrow; String lexThrow; String eofVal; String scanErrorException; String cupSymbol = "sym"; StringBuffer actionText = new StringBuffer(); StringBuffer string = new StringBuffer(); boolean charCount; boolean lineCount; boolean columnCount; boolean cupCompatible; boolean cupDebug; boolean isInteger; boolean isIntWrap; boolean isYYEOF; boolean notUnix; boolean isPublic; boolean isFinal; boolean isAbstract; boolean bolUsed; boolean standalone; boolean debugOption; boolean useRowMap = Options.gen_method == Options.PACK || Options.gen_method == Options.TABLE; boolean packed = Options.gen_method == Options.PACK; boolean caseless; boolean inclusive_states; boolean eofclose; String isImplementing; String isExtending; String className = "Yylex"; String functionName; String tokenType; String visibility = "public"; Vector /* String */ ctorArgs = new Vector(); Vector /* String */ ctorTypes = new Vector(); LexicalStates states = new LexicalStates(); Vector actions = new Vector(); private int nextState; boolean macroDefinition; Timer t = new Timer(); public int currentLine() { return yyline; } public void setFile(File file) { this.file = file; } private Symbol symbol(int type, Object value) { return new Symbol(type, yyline, yycolumn, value); } private Symbol symbol(int type) { return new Symbol(type, yyline, yycolumn); } // updates line and column count to the beginning of the first // non whitespace character in yytext, but leaves yyline+yycolumn // untouched private Symbol symbol_countUpdate(int type, Object value) { int lc = yyline; int cc = yycolumn; String text = yytext(); for (int i=0; i < text.length(); i++) { char c = text.charAt(i); if (c != '\n' && c != '\r' && c != ' ' && c != '\t' ) return new Symbol(type, lc, cc, value); if (c == '\n') { lc++; cc = 0; } else cc++; } return new Symbol(type, yyline, yycolumn, value); } private String makeMacroIdent() { String matched = yytext().trim(); return matched.substring(1, matched.length()-1).trim(); } public static String conc(Object a, Object b) { if (a == null && b == null) return null; if (a == null) return b.toString(); if (b == null) return a.toString(); return a.toString()+b.toString(); } public static String concExc(Object a, Object b) { if (a == null && b == null) return null; if (a == null) return b.toString(); if (b == null) return a.toString(); return a.toString()+", "+b.toString(); } %} %init{ states.insert("YYINITIAL", true); %init} Digit = [0-9] HexDigit = [0-9a-fA-F] OctDigit = [0-7] Number = {Digit}+ HexNumber = \\ x {HexDigit} {2} Unicode = \\ u {HexDigit} {1, 4} OctNumber = \\ [0-3]? {OctDigit} {1, 2} // see http://www.unicode.org/unicode/reports/tr18/ WSP = [ \t\b] WSPNL = [\u2028\u2029\u000A\u000B\u000C\u000D\u0085\t\b\ ] NL = [\u2028\u2029\u000A\u000B\u000C\u000D\u0085] | \u000D\u000A NNL = [^\u2028\u2029\u000A\u000B\u000C\u000D\u0085] Ident = {IdentStart} {IdentPart}* QualIdent = {Ident} ( {WSP}* "." {WSP}* {Ident} )* QUIL = {QualIdent} ( {WSP}* "," {WSP}* {QualIdent} )* Array = "[" {WSP}* "]" ParamPart = {IdentStart}|{IdentPart}|"<"|">"|","|{WSP}|"&"|"?"|"." GenParam = "<" {ParamPart}+ ">" ClassT = {Ident} ({WSP}* {GenParam})? QClassT = {QualIdent} ({WSP}* {GenParam})? ArrType = ({GenParam} {WSP}*)? {QClassT} ({WSP}* {Array})* IdentStart = [:jletter:] IdentPart = [:jletterdigit:] JFlexCommentChar = [^*/]|"/"+[^*/]|"*"+[^*/] JFlexComment = {JFlexCommentChar}* /* Java comments */ JavaComment = {TraditionalComment}|{EndOfLineComment} TraditionalComment = "/*"{CommentContent}\*+"/" EndOfLineComment = "//".*{NL} CommentContent = ([^*]|\*+[^*/])* StringCharacter = [^\u2028\u2029\u000A\u000B\u000C\u000D\u0085\"\\] CharLiteral = \'([^\u2028\u2029\u000A\u000B\u000C\u000D\u0085\'\\]|{EscapeSequence})\' StringLiteral = \"({StringCharacter}|{EscapeSequence})*\" EscapeSequence = \\[^\u2028\u2029\u000A\u000B\u000C\u000D\u0085]|\\+u{HexDigit}{4}|\\[0-3]?{OctDigit}{1,2} /* \\(b|t|n|f|r|\"|\'|\\|[0-3]?{OctDigit}{1,2}|u{HexDigit}{4}) */ JavaRest = [^\{\}\"\'/]|"/"[^*/] JavaCode = ({JavaRest}|{StringLiteral}|{CharLiteral}|{JavaComment})+ %% { "%%".*{NL}? { t.start(); yybegin(MACROS); macroDefinition = true; return symbol(USERCODE,userCode); } .*{NL} { userCode.append(yytext()); } .* { return symbol(EOF); } } ("%{"|"%init{"|"%initthrow{"|"%eof{"|"%eofthrow{"|"%yylexthrow{"|"%eofval{").*{NL} { string.setLength(0); yybegin(COPY); } { "%}".*{NL} { classCode = conc(classCode,string); yybegin(MACROS); } "%init}".*{NL} { initCode = conc(initCode,string); yybegin(MACROS); } "%initthrow}".*{NL} { initThrow = concExc(initThrow,string); yybegin(MACROS); } "%eof}".*{NL} { eofCode = conc(eofCode,string); yybegin(MACROS); } "%eofthrow}".*{NL} { eofThrow = concExc(eofThrow,string); yybegin(MACROS); } "%yylexthrow}".*{NL} { lexThrow = concExc(lexThrow,string); yybegin(MACROS); } "%eofval}".*{NL} { eofVal = string.toString(); yybegin(MACROS); } .*{NL} { string.append(yytext()); } <> { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); } } ^"%s" ("tate" "s"?)? {WSP}+ { inclusive_states = true; yybegin(STATELIST); } ^"%x" ("state" "s"?)? {WSP}+ { inclusive_states = false; yybegin(STATELIST); } { {Ident} { states.insert(yytext(),inclusive_states); } ([\ \t]*","[\ \t]*)|([\ \t]+) { } {NL} { yybegin(MACROS); } <> { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); } } { "%char" { charCount = true; } "%line" { lineCount = true; } "%column" { columnCount = true; } "%byaccj" { isInteger = true; if (eofVal == null) eofVal = "return 0;"; eofclose = true; } "%cup" { cupCompatible = true; isImplementing = concExc(isImplementing, "java_cup.runtime.Scanner"); if (functionName == null) functionName = "next_token"; if (tokenType == null) tokenType = "java_cup.runtime.Symbol"; if (eofVal == null) eofVal = "return new java_cup.runtime.Symbol("+cupSymbol+".EOF);"; if (!Options.jlex) eofclose = true; } "%cupsym"{WSP}+{QualIdent} {WSP}* { cupSymbol = yytext().substring(8).trim(); if (cupCompatible) Out.warning(ErrorMessages.CUPSYM_AFTER_CUP, yyline); } "%cupsym"{WSP}+{NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_CUPSYM, yyline); } "%cupdebug" { cupDebug = true; } "%eofclose"({WSP}+"true")? { eofclose = true; } "%eofclose"({WSP}+"false") { eofclose = false; } "%class"{WSP}+{ClassT} {WSP}* { className = yytext().substring(7).trim(); } "%ctorarg"{WSP}+{ArrType}{WSP}+ { yybegin(CTOR_ARG); ctorTypes.add(yytext().substring(8).trim()); } "%function"{WSP}+{Ident} {WSP}* { functionName = yytext().substring(10).trim(); } "%type"{WSP}+{ArrType} {WSP}* { tokenType = yytext().substring(6).trim(); } "%integer"|"%int" { isInteger = true; } "%intwrap" { isIntWrap = true; } "%yyeof" { isYYEOF = true; } "%notunix" { notUnix = true; } "%7bit" { return symbol(ASCII); } "%full"|"%8bit" { return symbol(FULL); } "%unicode"|"%16bit" { return symbol(UNICODE); } "%caseless"|"%ignorecase" { caseless = true; } "%implements"{WSP}+.* { isImplementing = concExc(isImplementing, yytext().substring(12).trim()); } "%extends"{WSP}+{QClassT}{WSP}* { isExtending = yytext().substring(9).trim(); } "%public" { isPublic = true; } "%apiprivate" { visibility = "private"; Skeleton.makePrivate(); } "%final" { isFinal = true; } "%abstract" { isAbstract = true; } "%debug" { debugOption = true; } "%standalone" { standalone = true; isInteger = true; } "%switch" { packed = false; useRowMap = false; } "%table" { packed = false; useRowMap = true; } "%pack" { packed = true; useRowMap = true; } "%include" {WSP}+ .* { File f = new File(yytext().substring(9).trim()); if ( !f.canRead() ) throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); // check for cycle if (files.search(f) > 0) throw new ScannerException(file,ErrorMessages.FILE_CYCLE, yyline); try { yypushStream( new FileReader(f) ); files.push(file); file = f; Out.println("Including \""+file+"\""); } catch (FileNotFoundException e) { throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); } } "%buffer" {WSP}+ {Number} {WSP}* { bufferSize = Integer.parseInt(yytext().substring(8).trim()); } "%buffer" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.NO_BUFFER_SIZE, yyline); } "%initthrow" {WSP}+ {QUIL} {WSP}* { initThrow = concExc(initThrow,yytext().substring(11).trim()); } "%initthrow" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_INITTHROW, yyline); } "%eofthrow" {WSP}+ {QUIL} {WSP}* { eofThrow = concExc(eofThrow,yytext().substring(10).trim()); } "%eofthrow" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_EOFTHROW, yyline); } "%yylexthrow"{WSP}+ {QUIL} {WSP}* { lexThrow = concExc(lexThrow,yytext().substring(12).trim()); } "%throws" {WSP}+ {QUIL} {WSP}* { lexThrow = concExc(lexThrow,yytext().substring(8).trim()); } "%yylexthrow"{WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_YYLEXTHROW, yyline); } "%throws" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_THROW, yyline); } "%scanerror" {WSP}+ {QualIdent} {WSP}* { scanErrorException = yytext().substring(11).trim(); } "%scanerror" {WSP}+ {NNL}* { throw new ScannerException(file,ErrorMessages.QUIL_SCANERROR, yyline); } {Ident} { return symbol(IDENT, yytext()); } "="{WSP}* { yybegin(REGEXP); return symbol(EQUALS); } "/*" { nextState = MACROS; yybegin(COMMENT); } {EndOfLineComment} { } /* no {NL} at the end of this expression, because needs at least one {WSPNL} to start a regular expression! */ ^"%%" {NNL}* { macroDefinition = false; yybegin(REGEXPSTART); return symbol(DELIMITER); } "%"{Ident} { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); } "%" { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); } ^{WSP}+"%" { Out.warning(ErrorMessages.NOT_AT_BOL, yyline); yypushback(1); } {WSP}+ { } {NL}+ { } <> { if ( yymoreStreams() ) { file = (File) files.pop(); yypopStream(); } else throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); } } { {Ident} {WSP}* { yybegin(MACROS); ctorArgs.add(yytext().trim()); } [^] { throw new ScannerException(file,ErrorMessages.CTOR_ARG,yyline,yycolumn); } } { {WSPNL}* "/*" { nextState = REGEXPSTART; yybegin(COMMENT); } {WSPNL}+ { yybegin(REGEXP); } {WSPNL}* "<" { yybegin(STATES); return symbol_countUpdate(LESSTHAN, null); } {WSPNL}* "}" { return symbol_countUpdate(RBRACE, null); } {WSPNL}* "//" {NNL}* { } {WSPNL}* "<>" {WSPNL}* "{" { actionText.setLength(0); yybegin(JAVA_CODE); Symbol s = symbol_countUpdate(EOFRULE, null); action_line = s.left+1; return s; } } { {Ident} { return symbol(IDENT, yytext()); } "," { return symbol(COMMA); } {WSPNL}+ { } // "{" will be caught in REGEXP ">"{WSPNL}* { yybegin(REGEXP); return symbol(MORETHAN); } <> { throw new ScannerException(file,ErrorMessages.EOF_IN_STATES); } } { "<>" {WSPNL}+ "{" { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(EOFRULE); } "<>" { throw new ScannerException(file,ErrorMessages.EOF_WO_ACTION); } {WSPNL}*"|"{WSP}*$ { if (macroDefinition) { yybegin(EATWSPNL); return symbol(BAR); } else { yybegin(REGEXPSTART); return symbol(NOACTION); } } // stategroup "{" { yybegin(REGEXPSTART); return symbol(LBRACE); } {WSPNL}*"|" { return symbol(BAR); } {WSPNL}*\" { string.setLength(0); nextState = REGEXP; yybegin(STRING_CONTENT); } {WSPNL}*"!" { return symbol(BANG); } {WSPNL}*"~" { return symbol(TILDE); } {WSPNL}*"(" { return symbol(OPENBRACKET); } {WSPNL}*")" { return symbol(CLOSEBRACKET); } {WSPNL}*"*" { return symbol(STAR); } {WSPNL}*"+" { return symbol(PLUS); } {WSPNL}*"?" { return symbol(QUESTION); } {WSPNL}*"$" { return symbol(DOLLAR); } {WSPNL}*"^" { bolUsed = true; return symbol(HAT); } {WSPNL}*"." { return symbol(POINT); } {WSPNL}*"[" { yybegin(CHARCLASS); return symbol(OPENCLASS); } {WSPNL}*"/" { return symbol(LOOKAHEAD); } {WSPNL}* "{" {WSP}* {Ident} {WSP}* "}" { return symbol_countUpdate(MACROUSE, makeMacroIdent()); } {WSPNL}* "{" {WSP}* {Number} { yybegin(REPEATEXP); return symbol(REPEAT, new Integer(yytext().trim().substring(1).trim())); } {WSPNL}+ "{" { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(REGEXPEND); } {NL} { if (macroDefinition) { yybegin(MACROS); } return symbol(REGEXPEND); } {WSPNL}*"/*" { nextState = REGEXP; yybegin(COMMENT); } {WSPNL}*"//"{NNL}* { } {WSP}+ { } { {WSPNL}*"[:jletter:]" { return symbol(JLETTERCLASS); } {WSPNL}*"[:jletterdigit:]" { return symbol(JLETTERDIGITCLASS); } {WSPNL}*"[:letter:]" { return symbol(LETTERCLASS); } {WSPNL}*"[:digit:]" { return symbol(DIGITCLASS); } {WSPNL}*"[:uppercase:]" { return symbol(UPPERCLASS); } {WSPNL}*"[:lowercase:]" { return symbol(LOWERCLASS); } } . { return symbol(CHAR, new Character(yytext().charAt(0))); } } {WSPNL}+ { yybegin(REGEXP); } { "}" { yybegin(REGEXP); return symbol(RBRACE); } "," {WSP}* {Number} { return symbol(REPEAT, new Integer(yytext().substring(1).trim())); } {WSP}+ { } <> { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); } } { "{"{Ident}"}" { return symbol(MACROUSE, yytext().substring(1,yytext().length()-1)); } "[" { balance++; return symbol(OPENCLASS); } "]" { if (balance > 0) balance--; else yybegin(REGEXP); return symbol(CLOSECLASS); } "^" { return symbol(HAT); } "-" { return symbol(DASH); } // this is a hack to keep JLex compatibilty with char class // expressions like [+-] "-]" { yypushback(1); yycolumn--; return symbol(CHAR, new Character(yytext().charAt(0))); } \" { string.setLength(0); nextState = CHARCLASS; yybegin(STRING_CONTENT); } . { return symbol(CHAR, new Character(yytext().charAt(0))); } \n { throw new ScannerException(file,ErrorMessages.EOL_IN_CHARCLASS,yyline,yycolumn); } <> { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); } } { \" { yybegin(nextState); return symbol(STRING, string.toString()); } \\\" { string.append('\"'); } [^\"\\\u2028\u2029\u000A\u000B\u000C\u000D\u0085]+ { string.append(yytext()); } {NL} { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); } {HexNumber} { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)); } {Unicode} { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)); } {OctNumber} { string.append( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8)); } \\b { string.append('\b'); } \\n { string.append('\n'); } \\t { string.append('\t'); } \\f { string.append('\f'); } \\r { string.append('\r'); } \\. { string.append(yytext().charAt(1)); } <> { throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); } } { {HexNumber} { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16))); } {Unicode} { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16))); } {OctNumber} { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8))); } \\b { return symbol(CHAR,new Character('\b')); } \\n { return symbol(CHAR,new Character('\n')); } \\t { return symbol(CHAR,new Character('\t')); } \\f { return symbol(CHAR,new Character('\f')); } \\r { return symbol(CHAR,new Character('\r')); } \\. { return symbol(CHAR, new Character(yytext().charAt(1))); } } { "{" { balance++; actionText.append('{'); } "}" { if (balance > 0) { balance--; actionText.append('}'); } else { yybegin(REGEXPSTART); Action a = new Action(actionText.toString(), action_line); actions.addElement(a); return symbol(ACTION, a); } } {JavaCode} { actionText.append(yytext()); } <> { throw new ScannerException(file,ErrorMessages.EOF_IN_ACTION, action_line-1); } } { "/"+ "*" { commentbalance++; } "*"+ "/" { if (commentbalance > 0) commentbalance--; else yybegin(nextState); } {JFlexComment} { /* ignore */ } <> { throw new ScannerException(file,ErrorMessages.EOF_IN_COMMENT); } } . { throw new ScannerException(file,ErrorMessages.UNEXPECTED_CHAR, yyline, yycolumn); } \n { throw new ScannerException(file,ErrorMessages.UNEXPECTED_NL, yyline, yycolumn); } <> { if ( yymoreStreams() ) { file = (File) files.pop(); yypopStream(); } else return symbol(EOF); } jflex-1.4.3/src/JFlex/LexScan.java0000644000175000017500000037003211141044632015331 0ustar moonmoon/* The following code was generated by JFlex 1.4.3 on 1/31/09 11:52 PM */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java_cup.runtime.Symbol; import java.util.Vector; import java.io.*; import java.util.Stack; /** * The lexer of JFlex. * * Generated by JFlex. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public final class LexScan implements sym, java_cup.runtime.Scanner { /** This character denotes the end of file */ public static final int YYEOF = -1; /** initial size of the lookahead buffer */ private static final int ZZ_BUFFERSIZE = 16384; /** lexical states */ public static final int STRING_CONTENT = 16; public static final int REGEXPSTART = 8; public static final int MACROS = 6; public static final int STATELIST = 4; public static final int CTOR_ARG = 26; public static final int EATWSPNL = 24; public static final int CHARCLASS = 18; public static final int JAVA_CODE = 12; public static final int REGEXP = 10; public static final int YYINITIAL = 0; public static final int REPEATEXP = 22; public static final int COMMENT = 2; public static final int STATES = 14; public static final int COPY = 20; /** * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l * at the beginning of a line * l is of the form l = 2*k, k a non negative integer */ private static final int ZZ_LEXSTATE[] = { 0, 0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14 }; /** * Translates characters to character classes */ private static final String ZZ_CMAP_PACKED = "\10\25\1\26\1\10\1\13\2\11\1\12\16\25\4\0\1\10\1\76"+ "\1\32\1\0\1\103\1\35\1\22\1\33\1\100\1\101\1\30\1\102"+ "\1\15\1\106\1\14\1\31\1\7\1\66\2\7\2\3\1\67\1\64"+ "\1\65\1\1\1\105\1\0\1\20\1\71\1\21\1\23\1\0\4\2"+ "\1\72\1\74\10\24\1\73\13\24\1\16\1\4\1\17\1\104\1\24"+ "\1\0\1\53\1\57\1\55\1\62\1\46\1\47\1\63\1\42\1\37"+ "\1\60\1\70\1\51\1\56\1\40\1\44\1\61\1\24\1\43\1\54"+ "\1\41\1\6\1\52\1\45\1\5\1\50\1\24\1\36\1\75\1\34"+ "\1\77\6\25\1\27\32\25\2\0\4\24\4\0\1\24\2\0\1\25"+ "\7\0\1\24\4\0\1\24\5\0\27\24\1\0\37\24\1\0\u013f\24"+ "\31\0\162\24\4\0\14\24\16\0\5\24\11\0\1\24\21\0\130\25"+ "\5\0\23\25\12\0\1\24\13\0\1\24\1\0\3\24\1\0\1\24"+ "\1\0\24\24\1\0\54\24\1\0\46\24\1\0\5\24\4\0\202\24"+ "\1\0\4\25\3\0\105\24\1\0\46\24\2\0\2\24\6\0\20\24"+ "\41\0\46\24\2\0\1\24\7\0\47\24\11\0\21\25\1\0\27\25"+ "\1\0\3\25\1\0\1\25\1\0\2\25\1\0\1\25\13\0\33\24"+ "\5\0\3\24\15\0\4\25\14\0\6\25\13\0\32\24\5\0\13\24"+ "\16\25\7\0\12\25\4\0\2\24\1\25\143\24\1\0\1\24\10\25"+ "\1\0\6\25\2\24\2\25\1\0\4\25\2\24\12\25\3\24\2\0"+ "\1\24\17\0\1\25\1\24\1\25\36\24\33\25\2\0\3\24\60\0"+ "\46\24\13\25\1\24\u014f\0\3\25\66\24\2\0\1\25\1\24\20\25"+ "\2\0\1\24\4\25\3\0\12\24\2\25\2\0\12\25\21\0\3\25"+ "\1\0\10\24\2\0\2\24\2\0\26\24\1\0\7\24\1\0\1\24"+ "\3\0\4\24\2\0\1\25\1\24\7\25\2\0\2\25\2\0\3\25"+ "\11\0\1\25\4\0\2\24\1\0\3\24\2\25\2\0\12\25\4\24"+ "\15\0\3\25\1\0\6\24\4\0\2\24\2\0\26\24\1\0\7\24"+ "\1\0\2\24\1\0\2\24\1\0\2\24\2\0\1\25\1\0\5\25"+ "\4\0\2\25\2\0\3\25\13\0\4\24\1\0\1\24\7\0\14\25"+ "\3\24\14\0\3\25\1\0\11\24\1\0\3\24\1\0\26\24\1\0"+ "\7\24\1\0\2\24\1\0\5\24\2\0\1\25\1\24\10\25\1\0"+ "\3\25\1\0\3\25\2\0\1\24\17\0\2\24\2\25\2\0\12\25"+ "\1\0\1\24\17\0\3\25\1\0\10\24\2\0\2\24\2\0\26\24"+ "\1\0\7\24\1\0\2\24\1\0\5\24\2\0\1\25\1\24\6\25"+ "\3\0\2\25\2\0\3\25\10\0\2\25\4\0\2\24\1\0\3\24"+ "\4\0\12\25\1\0\1\24\20\0\1\25\1\24\1\0\6\24\3\0"+ "\3\24\1\0\4\24\3\0\2\24\1\0\1\24\1\0\2\24\3\0"+ "\2\24\3\0\3\24\3\0\10\24\1\0\3\24\4\0\5\25\3\0"+ "\3\25\1\0\4\25\11\0\1\25\17\0\11\25\11\0\1\24\7\0"+ "\3\25\1\0\10\24\1\0\3\24\1\0\27\24\1\0\12\24\1\0"+ "\5\24\4\0\7\25\1\0\3\25\1\0\4\25\7\0\2\25\11\0"+ "\2\24\4\0\12\25\22\0\2\25\1\0\10\24\1\0\3\24\1\0"+ "\27\24\1\0\12\24\1\0\5\24\2\0\1\25\1\24\7\25\1\0"+ "\3\25\1\0\4\25\7\0\2\25\7\0\1\24\1\0\2\24\4\0"+ "\12\25\22\0\2\25\1\0\10\24\1\0\3\24\1\0\27\24\1\0"+ "\20\24\4\0\6\25\2\0\3\25\1\0\4\25\11\0\1\25\10\0"+ "\2\24\4\0\12\25\22\0\2\25\1\0\22\24\3\0\30\24\1\0"+ "\11\24\1\0\1\24\2\0\7\24\3\0\1\25\4\0\6\25\1\0"+ "\1\25\1\0\10\25\22\0\2\25\15\0\60\24\1\25\2\24\7\25"+ "\4\0\10\24\10\25\1\0\12\25\47\0\2\24\1\0\1\24\2\0"+ "\2\24\1\0\1\24\2\0\1\24\6\0\4\24\1\0\7\24\1\0"+ "\3\24\1\0\1\24\1\0\1\24\2\0\2\24\1\0\4\24\1\25"+ "\2\24\6\25\1\0\2\25\1\24\2\0\5\24\1\0\1\24\1\0"+ "\6\25\2\0\12\25\2\0\2\24\42\0\1\24\27\0\2\25\6\0"+ "\12\25\13\0\1\25\1\0\1\25\1\0\1\25\4\0\2\25\10\24"+ "\1\0\42\24\6\0\24\25\1\0\2\25\4\24\4\0\10\25\1\0"+ "\44\25\11\0\1\25\71\0\42\24\1\0\5\24\1\0\2\24\1\0"+ "\7\25\3\0\4\25\6\0\12\25\6\0\6\24\4\25\106\0\46\24"+ "\12\0\51\24\7\0\132\24\5\0\104\24\5\0\122\24\6\0\7\24"+ "\1\0\77\24\1\0\1\24\1\0\4\24\2\0\7\24\1\0\1\24"+ "\1\0\4\24\2\0\47\24\1\0\1\24\1\0\4\24\2\0\37\24"+ "\1\0\1\24\1\0\4\24\2\0\7\24\1\0\1\24\1\0\4\24"+ "\2\0\7\24\1\0\7\24\1\0\27\24\1\0\37\24\1\0\1\24"+ "\1\0\4\24\2\0\7\24\1\0\47\24\1\0\23\24\16\0\11\25"+ "\56\0\125\24\14\0\u026c\24\2\0\10\24\12\0\32\24\5\0\113\24"+ "\3\0\3\24\17\0\15\24\1\0\4\24\3\25\13\0\22\24\3\25"+ "\13\0\22\24\2\25\14\0\15\24\1\0\3\24\1\0\2\25\14\0"+ "\64\24\40\25\3\0\1\24\3\0\2\24\1\25\2\0\12\25\41\0"+ "\3\25\2\0\12\25\6\0\130\24\10\0\51\24\1\25\126\0\35\24"+ "\3\0\14\25\4\0\14\25\12\0\12\25\36\24\2\0\5\24\u038b\0"+ "\154\24\224\0\234\24\4\0\132\24\6\0\26\24\2\0\6\24\2\0"+ "\46\24\2\0\6\24\2\0\10\24\1\0\1\24\1\0\1\24\1\0"+ "\1\24\1\0\37\24\2\0\65\24\1\0\7\24\1\0\1\24\3\0"+ "\3\24\1\0\7\24\3\0\4\24\2\0\6\24\4\0\15\24\5\0"+ "\3\24\1\0\7\24\17\0\4\25\30\0\2\11\5\25\20\0\2\24"+ "\23\0\1\24\13\0\4\25\6\0\6\25\1\0\1\24\15\0\1\24"+ "\40\0\22\24\36\0\15\25\4\0\1\25\3\0\6\25\27\0\1\24"+ "\4\0\1\24\2\0\12\24\1\0\1\24\3\0\5\24\6\0\1\24"+ "\1\0\1\24\1\0\1\24\1\0\4\24\1\0\3\24\1\0\7\24"+ "\3\0\3\24\5\0\5\24\26\0\44\24\u0e81\0\3\24\31\0\11\24"+ "\6\25\1\0\5\24\2\0\5\24\4\0\126\24\2\0\2\25\2\0"+ "\3\24\1\0\137\24\5\0\50\24\4\0\136\24\21\0\30\24\70\0"+ "\20\24\u0200\0\u19b6\24\112\0\u51a6\24\132\0\u048d\24\u0773\0\u2ba4\24\u215c\0"+ "\u012e\24\2\0\73\24\225\0\7\24\14\0\5\24\5\0\1\24\1\25"+ "\12\24\1\0\15\24\1\0\5\24\1\0\1\24\1\0\2\24\1\0"+ "\2\24\1\0\154\24\41\0\u016b\24\22\0\100\24\2\0\66\24\50\0"+ "\15\24\3\0\20\25\20\0\4\25\17\0\2\24\30\0\3\24\31\0"+ "\1\24\6\0\5\24\1\0\207\24\2\0\1\25\4\0\1\24\13\0"+ "\12\25\7\0\32\24\4\0\1\24\1\0\32\24\12\0\132\24\3\0"+ "\6\24\2\0\6\24\2\0\6\24\2\0\3\24\3\0\2\24\3\0"+ "\2\24\22\0\3\25\4\0"; /** * Translates characters to character classes */ private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); /** * Translates DFA states to action switch labels. */ private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = "\1\1\1\2\15\0\1\1\2\3\1\1\1\2\3\4"+ "\1\5\1\6\2\7\1\6\1\10\2\6\1\4\1\11"+ "\1\12\1\6\1\11\1\13\1\14\1\4\1\15\2\16"+ "\1\6\2\17\1\20\1\21\1\16\1\22\1\23\1\24"+ "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34"+ "\1\35\1\36\1\37\3\4\1\40\1\41\1\6\1\42"+ "\1\43\1\44\1\4\2\45\1\46\1\16\1\47\1\50"+ "\1\51\1\52\1\16\1\53\1\54\1\4\2\44\1\4"+ "\1\55\1\4\1\56\1\13\1\57\1\60\1\61\3\0"+ "\1\62\1\63\1\0\1\64\1\0\2\11\1\0\15\11"+ "\3\0\1\65\1\11\1\66\1\11\2\0\1\67\1\6"+ "\1\70\1\71\2\70\1\71\1\72\1\73\1\74\1\75"+ "\1\76\1\0\1\77\2\0\1\100\1\101\3\0\2\102"+ "\10\0\1\103\1\104\2\103\1\104\1\105\1\106\1\107"+ "\1\110\1\111\1\112\3\0\1\113\5\0\1\114\1\0"+ "\1\60\1\61\2\6\1\11\2\115\35\11\3\0\2\116"+ "\1\11\2\117\1\11\1\0\1\71\1\0\1\120\6\0"+ "\1\121\1\122\1\0\1\37\4\0\1\104\1\0\1\123"+ "\1\124\2\125\3\0\2\11\1\126\24\11\1\127\12\11"+ "\3\0\2\11\1\0\2\120\14\0\2\123\3\0\20\11"+ "\1\130\3\11\1\131\10\11\1\132\6\11\1\133\1\11"+ "\1\134\1\130\1\0\2\11\1\0\1\120\13\0\1\123"+ "\5\0\11\11\1\0\1\11\1\135\5\11\1\136\1\137"+ "\17\11\1\140\1\141\2\11\7\0\2\37\10\0\2\142"+ "\3\0\11\11\1\143\1\0\11\11\1\144\4\11\1\145"+ "\1\0\3\11\1\146\1\147\2\11\6\0\1\150\1\37"+ "\3\0\1\37\6\0\2\151\4\0\1\141\1\11\1\152"+ "\1\126\3\11\1\153\2\154\1\143\4\0\11\11\2\155"+ "\2\11\1\156\1\11\2\157\1\11\1\160\6\0\1\37"+ "\6\0\1\37\13\0\1\11\1\161\2\11\1\154\1\162"+ "\1\154\1\143\3\0\2\11\1\163\2\11\1\164\3\11"+ "\1\155\1\165\1\155\1\166\1\0\1\11\1\156\1\0"+ "\1\167\1\157\2\170\1\157\4\0\1\171\1\172\2\37"+ "\4\0\2\37\7\0\2\173\1\0\3\11\2\162\2\143"+ "\1\174\2\175\1\0\1\11\1\0\5\11\2\165\2\0"+ "\1\11\1\0\2\170\2\0\1\176\2\0\1\37\2\0"+ "\2\37\4\0\1\37\2\0\2\37\7\0\2\177\1\11"+ "\1\162\1\0\1\143\1\0\1\174\1\0\1\175\1\200"+ "\1\175\2\0\2\11\1\201\1\11\1\202\1\203\2\204"+ "\1\165\1\0\1\205\3\0\1\205\1\0\1\205\1\156"+ "\3\0\1\206\1\0\4\37\3\0\4\37\3\0\2\207"+ "\1\0\1\177\1\210\1\177\1\211\3\0\2\200\2\0"+ "\2\11\1\201\2\212\1\204\1\213\1\204\12\0\3\37"+ "\5\0\3\37\1\0\2\214\1\0\2\210\2\143\1\174"+ "\1\200\3\0\2\11\1\212\1\215\1\212\2\213\1\205"+ "\2\0\1\216\1\217\4\0\1\37\3\0\1\37\2\220"+ "\1\210\1\0\1\143\1\163\1\0\1\163\1\11\2\215"+ "\1\213\1\0\2\205\1\0\1\205\3\0\1\37\2\0"+ "\1\37\2\221\1\215\10\0\1\222\3\205"; private static int [] zzUnpackAction() { int [] result = new int[826]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; } private static int zzUnpackAction(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int count = packed.charAt(i++); int value = packed.charAt(i++); do result[j++] = value; while (--count > 0); } return j; } /** * Translates a state to a row index in the transition table */ private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\107\0\216\0\325\0\u011c\0\u0163\0\u01aa\0\u01f1"+ "\0\u0238\0\u027f\0\u02c6\0\u030d\0\u0354\0\u039b\0\u03e2\0\u0429"+ "\0\u0429\0\u0470\0\u04b7\0\u04fe\0\u0545\0\u058c\0\u0470\0\u05d3"+ "\0\u061a\0\u0470\0\u0661\0\u06a8\0\u06ef\0\u0736\0\u077d\0\u07c4"+ "\0\u080b\0\u0852\0\u0899\0\u08e0\0\u0927\0\u096e\0\u09b5\0\u0470"+ "\0\u0470\0\u09fc\0\u0a43\0\u0a8a\0\u0ad1\0\u0470\0\u0b18\0\u0b5f"+ "\0\u0470\0\u0470\0\u0ba6\0\u0470\0\u0bed\0\u0c34\0\u0470\0\u0470"+ "\0\u0470\0\u0470\0\u0470\0\u0470\0\u0470\0\u0c7b\0\u0cc2\0\u0d09"+ "\0\u0d50\0\u0470\0\u0470\0\u0d97\0\u0470\0\u0dde\0\u0e25\0\u0e6c"+ "\0\u0470\0\u0eb3\0\u0470\0\u0efa\0\u0efa\0\u0b18\0\u0470\0\u0470"+ "\0\u0f41\0\u0470\0\u0f88\0\u0fcf\0\u0fcf\0\u0470\0\u1016\0\u0470"+ "\0\u105d\0\u0470\0\u10a4\0\u0470\0\u10eb\0\u1132\0\u1179\0\u11c0"+ "\0\u0545\0\u0470\0\u0470\0\u058c\0\u0470\0\u1207\0\u124e\0\u1295"+ "\0\u12dc\0\u1323\0\u136a\0\u13b1\0\u13f8\0\u143f\0\u1486\0\u14cd"+ "\0\u1514\0\u155b\0\u15a2\0\u15e9\0\u1630\0\u1677\0\u16be\0\u1705"+ "\0\u174c\0\u0470\0\u1793\0\u17da\0\u1821\0\u09b5\0\u1868\0\u0470"+ "\0\u18af\0\u0470\0\u18f6\0\u193d\0\u1984\0\u19cb\0\u0470\0\u0470"+ "\0\u0470\0\u0470\0\u0470\0\u0a8a\0\u0bed\0\u1a12\0\u1a59\0\u0470"+ "\0\u1aa0\0\u1ae7\0\u0bed\0\u0c34\0\u0470\0\u1b2e\0\u0cc2\0\u0d09"+ "\0\u0d50\0\u1b75\0\u1bbc\0\u1c03\0\u1c4a\0\u1c91\0\u0470\0\u1cd8"+ "\0\u1d1f\0\u1d66\0\u1dad\0\u0470\0\u0470\0\u0470\0\u0470\0\u0470"+ "\0\u0470\0\u0efa\0\u0b18\0\u1df4\0\u0470\0\u0fcf\0\u1e3b\0\u1e82"+ "\0\u1ec9\0\u1f10\0\u1f57\0\u105d\0\u1f9e\0\u0470\0\u1207\0\u0470"+ "\0\u1fe5\0\u12dc\0\u0470\0\u202c\0\u2073\0\u20ba\0\u2101\0\u2148"+ "\0\u218f\0\u21d6\0\u221d\0\u2264\0\u22ab\0\u22f2\0\u2339\0\u2380"+ "\0\u23c7\0\u240e\0\u2455\0\u249c\0\u24e3\0\u252a\0\u2571\0\u25b8"+ "\0\u25ff\0\u2646\0\u268d\0\u26d4\0\u271b\0\u2762\0\u27a9\0\u27f0"+ "\0\u2837\0\u287e\0\u28c5\0\u290c\0\u2953\0\u299a\0\u29e1\0\u2a28"+ "\0\u2a6f\0\u2ab6\0\u0470\0\u2afd\0\u2b44\0\u2b8b\0\u2bd2\0\u2c19"+ "\0\u2c60\0\u2ca7\0\u2cee\0\u0470\0\u0470\0\u2d35\0\u2d7c\0\u2dc3"+ "\0\u2e0a\0\u2e51\0\u2e98\0\u0470\0\u2edf\0\u2f26\0\u0470\0\u1e3b"+ "\0\u0470\0\u2f6d\0\u2fb4\0\u2ffb\0\u3042\0\u3089\0\u30d0\0\u3117"+ "\0\u315e\0\u31a5\0\u31ec\0\u3233\0\u327a\0\u32c1\0\u3308\0\u334f"+ "\0\u3396\0\u33dd\0\u3424\0\u346b\0\u34b2\0\u34f9\0\u3540\0\u3587"+ "\0\u35ce\0\u3615\0\u365c\0\u36a3\0\u36ea\0\u3731\0\u3778\0\u37bf"+ "\0\u3806\0\u384d\0\u3894\0\u38db\0\u3922\0\u3969\0\u39b0\0\u39f7"+ "\0\u3a3e\0\u3a85\0\u3acc\0\u3b13\0\u0470\0\u3b5a\0\u3ba1\0\u3be8"+ "\0\u3c2f\0\u3c76\0\u3cbd\0\u3d04\0\u3d4b\0\u3d92\0\u3dd9\0\u3e20"+ "\0\u3e67\0\u3eae\0\u0470\0\u3ef5\0\u3f3c\0\u3f83\0\u3fca\0\u4011"+ "\0\u4058\0\u409f\0\u40e6\0\u412d\0\u4174\0\u41bb\0\u4202\0\u4249"+ "\0\u4290\0\u42d7\0\u431e\0\u4365\0\u43ac\0\u43f3\0\u443a\0\u124e"+ "\0\u4481\0\u44c8\0\u450f\0\u124e\0\u4556\0\u459d\0\u45e4\0\u462b"+ "\0\u4672\0\u46b9\0\u4700\0\u4747\0\u124e\0\u478e\0\u47d5\0\u481c"+ "\0\u4863\0\u48aa\0\u48f1\0\u124e\0\u4938\0\u0470\0\u0470\0\u497f"+ "\0\u49c6\0\u4a0d\0\u4a54\0\u2afd\0\u4a9b\0\u4ae2\0\u4b29\0\u4b70"+ "\0\u4bb7\0\u4bfe\0\u4c45\0\u4c8c\0\u4cd3\0\u4d1a\0\u4d61\0\u2edf"+ "\0\u4da8\0\u4def\0\u4e36\0\u4e7d\0\u4ec4\0\u4f0b\0\u4f52\0\u4f99"+ "\0\u4fe0\0\u5027\0\u506e\0\u50b5\0\u50fc\0\u5143\0\u518a\0\u51d1"+ "\0\u124e\0\u5218\0\u525f\0\u52a6\0\u52ed\0\u5334\0\u124e\0\u124e"+ "\0\u537b\0\u53c2\0\u5409\0\u5450\0\u5497\0\u54de\0\u5525\0\u556c"+ "\0\u55b3\0\u55fa\0\u5641\0\u5688\0\u56cf\0\u5716\0\u575d\0\u124e"+ "\0\u0470\0\u57a4\0\u57eb\0\u5832\0\u5879\0\u58c0\0\u5907\0\u594e"+ "\0\u5995\0\u59dc\0\u5a23\0\u5a6a\0\u5ab1\0\u5af8\0\u5b3f\0\u5b86"+ "\0\u5bcd\0\u5c14\0\u5c5b\0\u5ca2\0\u4def\0\u0470\0\u5ce9\0\u5d30"+ "\0\u5d77\0\u5dbe\0\u5e05\0\u5e4c\0\u5e93\0\u5eda\0\u5f21\0\u5f68"+ "\0\u5faf\0\u5ff6\0\u603d\0\u6084\0\u60cb\0\u6112\0\u6159\0\u61a0"+ "\0\u61e7\0\u622e\0\u6275\0\u62bc\0\u6303\0\u124e\0\u634a\0\u6391"+ "\0\u63d8\0\u641f\0\u124e\0\u6466\0\u64ad\0\u64f4\0\u653b\0\u124e"+ "\0\u124e\0\u6582\0\u2a28\0\u65c9\0\u6610\0\u6657\0\u669e\0\u66e5"+ "\0\u672c\0\u6773\0\u67ba\0\u6801\0\u6848\0\u688f\0\u68d6\0\u691d"+ "\0\u6964\0\u69ab\0\u69f2\0\u6a39\0\u6a80\0\u5c5b\0\u0470\0\u6ac7"+ "\0\u6b0e\0\u6b55\0\u6b9c\0\u124e\0\u6be3\0\u124e\0\u124e\0\u6c2a"+ "\0\u6c71\0\u6cb8\0\u124e\0\u6cff\0\u6d46\0\u6d8d\0\u6dd4\0\u6e1b"+ "\0\u6e62\0\u6ea9\0\u6ef0\0\u6f37\0\u6f7e\0\u6fc5\0\u700c\0\u7053"+ "\0\u709a\0\u70e1\0\u7128\0\u716f\0\u71b6\0\u71fd\0\u7244\0\u728b"+ "\0\u72d2\0\u7319\0\u7360\0\u2953\0\u0470\0\u73a7\0\u73ee\0\u7435"+ "\0\u747c\0\u74c3\0\u750a\0\u7551\0\u7598\0\u75df\0\u7626\0\u766d"+ "\0\u76b4\0\u76fb\0\u7742\0\u7789\0\u77d0\0\u7817\0\u785e\0\u78a5"+ "\0\u78ec\0\u7933\0\u797a\0\u79c1\0\u7a08\0\u7a4f\0\u7a96\0\u7add"+ "\0\u7b24\0\u7b6b\0\u7bb2\0\u7bf9\0\u7c40\0\u7c87\0\u7cce\0\u7d15"+ "\0\u7d5c\0\u7da3\0\u7dea\0\u7e31\0\u7e78\0\u7ebf\0\u124e\0\u7f06"+ "\0\u7f4d\0\u7f94\0\u7fdb\0\u8022\0\u8069\0\u124e\0\u80b0\0\u80f7"+ "\0\u813e\0\u8185\0\u124e\0\u81cc\0\u8213\0\u825a\0\u82a1\0\u82e8"+ "\0\u832f\0\u8376\0\u83bd\0\u0470\0\u0470\0\u8404\0\u844b\0\u8492"+ "\0\u84d9\0\u8520\0\u8567\0\u85ae\0\u85f5\0\u863c\0\u8683\0\u86ca"+ "\0\u8711\0\u8758\0\u879f\0\u87e6\0\u7a08\0\u0470\0\u882d\0\u8874"+ "\0\u88bb\0\u8902\0\u8949\0\u8990\0\u89d7\0\u8a1e\0\u8a65\0\u8aac"+ "\0\u8af3\0\u8b3a\0\u8b81\0\u8bc8\0\u8c0f\0\u8c56\0\u8c9d\0\u8ce4"+ "\0\u8d2b\0\u8d72\0\u8db9\0\u8e00\0\u8e47\0\u8e8e\0\u8ed5\0\u8f1c"+ "\0\u8f63\0\u8faa\0\u8ff1\0\u0470\0\u9038\0\u907f\0\u90c6\0\u910d"+ "\0\u9154\0\u919b\0\u91e2\0\u9229\0\u9270\0\u92b7\0\u92fe\0\u9345"+ "\0\u938c\0\u93d3\0\u941a\0\u9461\0\u94a8\0\u94ef\0\u9536\0\u957d"+ "\0\u95c4\0\u960b\0\u9652\0\u9699\0\u96e0\0\u9727\0\u976e\0\u97b5"+ "\0\u97fc\0\u9843\0\u988a\0\u98d1\0\u9918\0\u995f\0\u99a6\0\u99ed"+ "\0\u9a34\0\u9a7b\0\u9ac2\0\u9b09\0\u9b50\0\u124e\0\u124e\0\u9b97"+ "\0\u9bde\0\u9c25\0\u9c6c\0\u9cb3\0\u9cfa\0\u9d41\0\u9d88\0\u8e00"+ "\0\u9dcf\0\u8e8e\0\u9e16\0\u9e5d\0\u9ea4\0\u9eeb\0\u0470\0\u9f32"+ "\0\u9f79\0\u9fc0\0\ua007\0\ua04e\0\ua095\0\ua0dc\0\ua123\0\ua16a"+ "\0\ua1b1\0\ua1f8\0\ua23f\0\ua286\0\ua2cd\0\ua314\0\u960b\0\u0470"+ "\0\ua35b\0\ua3a2\0\ua3e9\0\ua430\0\ua477\0\ua4be\0\ua505\0\ua54c"+ "\0\ua593\0\ua5da\0\ua621\0\ua668\0\ua6af\0\ua6f6\0\ua73d\0\ua784"+ "\0\ua7cb\0\ua812\0\ua859\0\ua8a0\0\ua8e7\0\ua92e\0\ua975\0\ua9bc"+ "\0\uaa03\0\uaa4a\0\uaa91\0\uaad8\0\uab1f\0\uab66\0\uabad\0\uabf4"+ "\0\uac3b\0\uac82\0\uacc9\0\uad10\0\uad57\0\uad9e\0\uade5\0\uae2c"+ "\0\uae73\0\uaeba\0\ua314\0\u0470\0\uaf01\0\uaf48\0\uaf8f\0\uafd6"+ "\0\ub01d\0\ub064\0\ub0ab\0\ub0f2\0\ub139\0\ub180\0\ub1c7\0\ub20e"+ "\0\ub255\0\ub29c\0\ub2e3\0\ub32a\0\ub371\0\ua8e7\0\ub3b8\0\ub3ff"+ "\0\u0470\0\u0470\0\ub446\0\ub48d\0\ub4d4\0\ub51b\0\ub562\0\ub5a9"+ "\0\ub5f0\0\ub637\0\ub67e\0\uaf01\0\u0470\0\ub6c5\0\ub70c\0\ub753"+ "\0\u0470\0\ub79a\0\u124e\0\ub7e1\0\ub828\0\ub86f\0\ub8b6\0\ub8fd"+ "\0\ub3b8\0\ub944\0\ub98b\0\ub3ff\0\ub9d2\0\uba19\0\uba60\0\ubaa7"+ "\0\ubaee\0\ubb35\0\ubb7c\0\u0470\0\u124e\0\ubbc3\0\ubc0a\0\ubc51"+ "\0\ubc98\0\ubcdf\0\ubd26\0\ubd6d\0\ubdb4\0\ubdfb\0\u0470\0\ubdb4"+ "\0\ube42\0\ubdfb"; private static int [] zzUnpackRowMap() { int [] result = new int[826]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; } private static int zzUnpackRowMap(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int high = packed.charAt(i++) << 16; result[j++] = high | packed.charAt(i++); } return j; } /** * The transition table of the DFA */ private static final int [] ZZ_TRANS = zzUnpackTrans(); private static final String ZZ_TRANS_PACKED_0 = "\11\20\2\21\1\22\13\20\1\21\5\20\1\23\51\20"+ "\30\24\1\25\1\26\55\24\2\27\1\30\2\27\2\30"+ "\1\27\1\31\1\32\1\33\1\32\1\27\1\34\6\27"+ "\1\30\2\27\1\32\7\27\25\30\4\27\1\30\1\27"+ "\3\30\6\27\1\30\5\27\1\35\2\27\2\35\1\27"+ "\1\36\3\37\10\27\1\35\1\27\1\36\1\37\1\27"+ "\1\40\3\27\1\41\1\27\25\35\4\27\1\35\1\42"+ "\3\35\6\27\1\35\5\27\1\35\2\27\2\35\1\27"+ "\1\43\3\37\10\27\1\35\1\27\1\43\1\37\1\27"+ "\1\40\3\27\1\44\1\27\25\35\4\27\1\35\1\42"+ "\3\35\6\27\1\35\13\27\4\45\4\27\1\46\5\27"+ "\2\45\1\27\1\47\2\27\1\50\52\27\4\51\1\52"+ "\3\51\1\53\1\54\1\55\1\54\1\56\1\51\1\57"+ "\1\51\1\60\2\51\1\61\2\51\1\53\1\54\1\62"+ "\1\63\1\64\3\51\1\65\36\51\1\66\1\67\1\70"+ "\1\71\1\72\1\73\1\74\1\75\2\51\31\76\1\77"+ "\1\100\1\101\1\102\1\76\1\103\50\76\2\27\1\35"+ "\2\27\2\35\1\27\4\104\1\27\1\105\3\27\1\106"+ "\2\27\1\35\1\27\2\104\7\27\25\35\4\27\1\35"+ "\1\27\3\35\6\27\1\35\3\27\4\107\1\110\4\107"+ "\1\111\1\112\1\111\13\107\1\111\2\107\1\113\54\107"+ "\4\51\1\52\3\51\3\114\1\115\2\51\1\116\1\117"+ "\6\51\2\114\2\51\1\120\3\51\1\121\45\51\1\122"+ "\1\51\1\123\11\124\2\125\1\126\13\124\1\125\5\124"+ "\1\127\51\124\10\27\1\36\2\27\1\130\1\27\1\131"+ "\10\27\1\36\5\27\1\132\62\27\4\133\12\27\2\133"+ "\57\27\2\134\1\135\2\134\2\135\15\134\1\135\12\134"+ "\25\135\4\134\1\135\1\134\3\135\6\134\1\135\3\134"+ "\11\20\2\21\1\22\13\20\1\21\57\20\107\0\11\20"+ "\2\21\1\22\13\20\1\21\5\20\1\136\51\20\30\24"+ "\1\137\1\140\105\24\1\141\1\142\105\24\1\143\1\144"+ "\55\24\1\0\3\30\1\0\3\30\14\0\4\30\7\0"+ "\32\30\1\0\3\30\6\0\1\30\13\0\1\31\4\0"+ "\1\34\104\0\1\32\103\0\1\34\77\0\3\35\1\0"+ "\3\35\14\0\4\35\7\0\32\35\1\0\3\35\6\0"+ "\1\35\13\0\1\36\15\0\1\36\71\0\3\37\13\0"+ "\1\37\107\0\1\145\1\146\57\0\1\147\2\0\1\147"+ "\1\150\15\0\1\147\11\0\1\151\1\152\1\153\1\154"+ "\4\147\1\155\1\156\1\157\1\160\1\147\1\161\1\162"+ "\1\163\1\147\1\164\1\147\1\165\1\166\1\147\1\167"+ "\1\170\1\171\1\0\1\147\1\0\3\147\6\0\1\147"+ "\13\0\1\42\15\0\1\42\70\0\1\43\15\0\1\43"+ "\6\0\1\172\53\0\1\147\2\0\1\173\1\150\15\0"+ "\1\147\10\0\1\174\1\151\1\152\1\153\1\154\4\147"+ "\1\155\1\156\1\157\1\160\1\147\1\161\1\175\1\163"+ "\1\147\1\164\1\147\1\165\1\166\1\147\1\167\1\170"+ "\1\171\1\0\1\147\1\0\3\147\6\0\1\147\13\0"+ "\4\45\4\0\1\46\5\0\2\45\1\0\1\176\2\0"+ "\1\50\72\0\1\177\116\0\1\200\1\201\55\0\3\202"+ "\1\203\1\202\1\204\1\205\1\206\3\202\1\0\24\202"+ "\1\207\1\210\1\202\1\211\3\202\1\212\7\202\1\213"+ "\4\202\1\203\1\202\1\206\1\203\17\202\10\0\1\53"+ "\3\214\1\56\1\0\1\57\4\0\1\61\2\0\1\53"+ "\1\214\1\62\1\63\1\64\3\0\1\215\36\0\1\66"+ "\1\67\1\70\1\71\1\72\1\73\1\74\1\75\12\0"+ "\4\214\1\56\1\0\1\57\4\0\1\61\2\0\2\214"+ "\1\62\1\63\1\64\3\0\1\215\36\0\1\66\1\67"+ "\1\70\1\71\1\72\1\73\1\74\1\75\12\0\3\214"+ "\1\54\1\56\1\0\1\57\4\0\1\61\2\0\2\214"+ "\1\62\1\63\1\64\3\0\1\215\36\0\1\66\1\67"+ "\1\70\1\71\1\72\1\73\1\74\1\75\107\0\1\216"+ "\21\0\1\217\116\0\1\220\1\201\56\0\1\221\1\222"+ "\1\221\1\0\2\222\1\221\1\223\13\0\1\222\1\0"+ "\1\223\10\0\25\222\4\221\1\222\1\0\3\222\6\0"+ "\1\222\13\0\1\224\1\225\1\226\1\225\12\0\1\224"+ "\1\225\57\0\31\76\1\227\1\230\1\231\1\0\1\76"+ "\1\0\100\76\1\232\1\233\55\76\4\230\1\234\4\230"+ "\3\0\13\230\1\0\2\230\1\76\54\230\4\235\1\236"+ "\4\235\3\0\13\235\1\0\3\235\1\0\53\235\10\0"+ "\4\104\12\0\2\104\67\0\4\106\12\0\2\106\57\0"+ "\4\107\1\0\4\107\3\0\13\107\1\0\2\107\1\0"+ "\54\107\3\237\1\240\1\237\1\241\1\242\1\243\3\237"+ "\1\0\16\237\1\244\5\237\1\245\1\246\1\237\1\247"+ "\3\237\1\250\7\237\1\251\4\237\1\240\1\237\1\243"+ "\1\240\17\237\13\0\1\111\103\0\4\252\2\0\1\253"+ "\7\0\2\252\61\0\1\254\2\0\2\254\15\0\1\254"+ "\12\0\25\254\4\0\1\254\1\0\3\254\6\0\1\254"+ "\22\0\1\255\67\0\11\256\2\125\1\126\13\256\1\125"+ "\70\256\2\125\1\126\13\256\1\125\4\256\1\257\2\256"+ "\1\260\6\256\1\261\1\256\1\262\36\256\1\0\1\263"+ "\1\0\1\263\3\0\1\263\1\264\15\0\1\264\35\0"+ "\4\263\27\0\4\133\12\0\2\133\60\0\3\135\1\0"+ "\3\135\1\265\13\0\4\135\7\0\32\135\1\0\3\135"+ "\6\0\1\135\3\0\13\136\1\266\73\136\30\24\1\137"+ "\1\0\105\24\1\0\1\140\55\24\11\146\2\267\1\270"+ "\13\146\1\267\57\146\1\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\271"+ "\30\147\1\0\3\147\6\0\1\147\3\0\11\151\2\272"+ "\1\273\13\151\1\272\57\151\1\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\1\147\1\274\15\147\1\275\4\147"+ "\1\276\5\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\5\147\1\277\24\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\3\147\1\300\5\147\1\301\2\147"+ "\1\302\15\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\1\303\2\147\14\0\4\147\7\0\5\147\1\304"+ "\24\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\1\147\1\305\1\147\14\0\4\147\7\0\1\306\31\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\11\147\1\307\20\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\1\310\31\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\20\147\1\311"+ "\1\147\1\312\7\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\2\147\1\313"+ "\3\147\1\314\7\147\1\315\13\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\1\147\1\316\1\147\14\0"+ "\4\147\7\0\2\147\1\317\1\320\1\147\1\321\4\147"+ "\1\322\1\147\1\323\15\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\1\147\1\324\1\147\14\0\4\147"+ "\7\0\11\147\1\325\20\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\1\147\1\326\1\147\14\0\4\147"+ "\7\0\14\147\1\327\15\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ "\1\330\22\147\1\0\3\147\6\0\1\147\62\0\1\331"+ "\106\0\1\332\116\0\1\333\20\0\3\147\1\0\3\147"+ "\1\334\13\0\2\147\1\335\1\147\7\0\15\147\1\336"+ "\14\147\1\0\3\147\6\0\1\147\3\0\11\174\3\0"+ "\13\174\1\0\57\174\1\0\3\147\1\0\3\147\1\337"+ "\13\0\2\147\1\340\1\147\7\0\2\147\1\341\3\147"+ "\1\314\7\147\1\315\13\147\1\0\3\147\6\0\1\147"+ "\75\0\1\342\14\0\11\201\3\0\13\201\1\0\57\201"+ "\3\0\1\343\3\0\1\343\54\0\1\343\1\0\2\343"+ "\20\0\3\344\3\0\1\344\36\0\2\344\3\0\1\344"+ "\1\0\1\344\1\0\1\344\2\0\1\344\1\0\4\344"+ "\2\0\1\344\1\0\1\344\13\0\3\345\3\0\1\345"+ "\36\0\2\345\3\0\1\345\1\0\1\345\1\0\1\345"+ "\2\0\1\345\1\0\4\345\2\0\1\345\1\0\1\345"+ "\15\0\1\203\3\0\1\203\54\0\1\203\1\0\2\203"+ "\25\0\1\346\42\0\1\347\6\0\1\350\1\0\1\351"+ "\116\0\1\352\15\0\1\221\1\0\1\221\3\0\1\221"+ "\54\0\4\221\20\0\3\222\1\0\3\222\1\353\13\0"+ "\4\222\4\0\1\354\2\0\32\222\1\0\3\222\6\0"+ "\1\222\16\0\1\355\73\0\30\232\1\356\56\232\11\233"+ "\2\357\1\76\13\233\1\357\57\233\11\230\3\0\13\230"+ "\1\0\57\230\33\0\1\76\53\0\3\235\1\360\1\361"+ "\1\235\1\362\1\363\1\235\3\0\13\235\1\0\34\235"+ "\1\360\1\235\1\363\1\360\17\235\3\0\1\364\3\0"+ "\1\364\54\0\1\364\1\0\2\364\20\0\3\365\3\0"+ "\1\365\36\0\2\365\3\0\1\365\1\0\1\365\1\0"+ "\1\365\2\0\1\365\1\0\4\365\2\0\1\365\1\0"+ "\1\365\13\0\3\366\3\0\1\366\36\0\2\366\3\0"+ "\1\366\1\0\1\366\1\0\1\366\2\0\1\366\1\0"+ "\4\366\2\0\1\366\1\0\1\366\15\0\1\240\3\0"+ "\1\240\54\0\1\240\1\0\2\240\20\0\3\254\1\0"+ "\3\254\14\0\4\254\4\0\1\367\2\0\32\254\1\0"+ "\3\254\6\0\1\254\3\0\11\257\2\370\1\371\13\257"+ "\1\370\57\257\11\256\2\125\1\126\13\256\1\125\10\256"+ "\1\372\57\256\2\125\1\126\13\256\1\125\14\256\1\373"+ "\53\256\2\125\1\126\13\256\1\125\20\256\1\374\36\256"+ "\1\0\1\263\1\0\1\263\3\0\1\263\54\0\4\263"+ "\27\0\1\265\15\0\1\265\61\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\1\375\31\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\1\376\1\147\1\377\13\147\1\u0100\13\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\22\147\1\u0101\7\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ "\1\u0102\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\2\147\1\u0103\27\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\4\147\1\u0104\25\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\22\147\1\u0105\7\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\20\147"+ "\1\u0106\11\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\2\147\1\u0107\27\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\10\147\1\u0108\21\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\1\147\1\u0109\10\147\1\u010a\17\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\1\147\1\u010b\30\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ "\1\u010c\2\147\1\u010d\17\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ "\1\u010e\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\15\147\1\u010f\14\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\1\u0110\31\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\14\147\1\u0111\15\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\1\u0112\31\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\14\147\1\u0113\15\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\22\147\1\u0114\7\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+ "\1\u0115\24\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0116\15\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\12\147\1\u0117\17\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\14\147\1\u0118\15\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ "\1\u0119\14\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\10\147\1\u011a\21\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\14\147\1\u011b\15\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\20\147\1\u011c\11\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+ "\1\u011d\13\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\20\147\1\u011e\11\147"+ "\1\0\3\147\6\0\1\147\42\0\1\u011f\106\0\1\u0120"+ "\126\0\1\u0121\37\0\1\334\15\0\1\334\61\0\3\147"+ "\1\0\3\147\1\334\13\0\2\147\1\335\1\147\7\0"+ "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\2\147\1\u0122\27\147\1\0"+ "\3\147\6\0\1\147\13\0\1\337\15\0\1\337\61\0"+ "\3\147\1\0\3\147\1\337\13\0\2\147\1\340\1\147"+ "\7\0\32\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\14\147\1\u0123\15\147"+ "\1\0\3\147\6\0\1\147\76\0\1\u0124\14\0\3\u0125"+ "\3\0\1\u0125\36\0\2\u0125\3\0\1\u0125\1\0\1\u0125"+ "\1\0\1\u0125\2\0\1\u0125\1\0\4\u0125\2\0\1\u0125"+ "\1\0\1\u0125\13\0\3\u0126\3\0\1\u0126\36\0\2\u0126"+ "\3\0\1\u0126\1\0\1\u0126\1\0\1\u0126\2\0\1\u0126"+ "\1\0\4\u0126\2\0\1\u0126\1\0\1\u0126\73\0\1\u0127"+ "\71\0\1\u0128\1\0\1\u0129\111\0\1\u012a\74\0\1\u012b"+ "\142\0\1\u012c\23\0\1\353\15\0\1\353\5\0\1\354"+ "\52\0\30\232\1\356\1\76\55\232\13\357\1\76\15\357"+ "\1\u012d\1\u012e\1\u012f\1\233\1\357\1\233\50\357\3\0"+ "\1\235\3\0\1\235\23\0\1\76\30\0\1\235\1\0"+ "\2\235\23\0\1\u0130\1\0\1\u0131\24\0\1\76\54\0"+ "\3\u0132\3\0\1\u0132\23\0\1\76\12\0\2\u0132\3\0"+ "\1\u0132\1\0\1\u0132\1\0\1\u0132\2\0\1\u0132\1\0"+ "\4\u0132\2\0\1\u0132\1\0\1\u0132\15\0\1\360\3\0"+ "\1\360\23\0\1\76\30\0\1\360\1\0\2\360\20\0"+ "\3\u0133\3\0\1\u0133\36\0\2\u0133\3\0\1\u0133\1\0"+ "\1\u0133\1\0\1\u0133\2\0\1\u0133\1\0\4\u0133\2\0"+ "\1\u0133\1\0\1\u0133\13\0\3\u0134\3\0\1\u0134\36\0"+ "\2\u0134\3\0\1\u0134\1\0\1\u0134\1\0\1\u0134\2\0"+ "\1\u0134\1\0\4\u0134\2\0\1\u0134\1\0\1\u0134\12\0"+ "\11\256\2\125\1\126\13\256\1\125\7\256\1\u0135\60\256"+ "\2\125\1\126\13\256\1\125\17\256\1\u0136\50\256\2\125"+ "\1\126\13\256\1\125\21\256\1\u0137\35\256\1\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\16\147\1\u0138\13\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\2\147\1\u0139\27\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\6\147\1\u013a\1\u013b\22\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\12\147\1\u013c\17\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\12\147\1\u013d"+ "\17\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\5\147\1\u013e\24\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\1\147\1\u013f"+ "\1\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\5\147\1\u0140\24\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\7\147\1\u0141"+ "\22\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\12\147\1\u0142\17\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\7\147\1\u0143\22\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\6\0"+ "\1\151\2\147\1\u0144\10\147\1\u0145\2\147\1\u0146\13\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\16\147\1\u0147\13\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\12\147\1\u0148\17\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\14\147"+ "\1\u0149\15\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\5\147\1\u014a\24\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\7\147\1\u014b\22\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\7\147\1\u014c\22\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+ "\1\u014d\27\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\22\147\1\u014e\7\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\1\147\1\u014f\30\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\2\147\1\u0150\27\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ "\1\u0151\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\15\147\1\u0152\5\147"+ "\1\u0153\6\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\4\147\1\u0154\25\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\4\147\1\u0155\25\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\1\147\1\u0156\1\147"+ "\14\0\4\147\7\0\32\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ "\1\u0157\14\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\7\147\1\u0158\22\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\10\147\1\u0159\21\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\16\147\1\u015a\13\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\12\147"+ "\1\u015b\17\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\31\147\1\u015c\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\1\147\1\u015d"+ "\1\147\14\0\4\147\7\0\32\147\1\0\3\147\6\0"+ "\1\147\44\0\1\u015e\106\0\1\u015f\104\0\1\u0160\50\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\14\147\1\u0161"+ "\15\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\1\147\1\u014f\1\u0162\27\147"+ "\1\0\3\147\6\0\1\147\77\0\1\u0163\13\0\3\u0164"+ "\3\0\1\u0164\36\0\2\u0164\3\0\1\u0164\1\0\1\u0164"+ "\1\0\1\u0164\2\0\1\u0164\1\0\4\u0164\2\0\1\u0164"+ "\1\0\1\u0164\73\0\1\u0165\72\0\1\u0166\102\0\1\u0167"+ "\113\0\1\u0168\123\0\1\u0169\117\0\1\u016a\12\0\13\357"+ "\1\76\14\357\1\u016b\1\233\55\357\4\u012e\1\u016c\4\u012e"+ "\2\357\1\76\13\u012e\1\357\2\u012e\1\357\54\u012e\4\u016d"+ "\1\u016e\4\u016d\2\357\1\76\13\u016d\1\357\3\u016d\1\233"+ "\53\u016d\4\0\1\u0130\1\0\1\u0131\101\0\3\u0132\3\0"+ "\1\u0132\36\0\2\u0132\3\0\1\u0132\1\0\1\u0132\1\0"+ "\1\u0132\2\0\1\u0132\1\0\4\u0132\2\0\1\u0132\1\0"+ "\1\u0132\13\0\3\u016f\3\0\1\u016f\36\0\2\u016f\3\0"+ "\1\u016f\1\0\1\u016f\1\0\1\u016f\2\0\1\u016f\1\0"+ "\4\u016f\2\0\1\u016f\1\0\1\u016f\13\0\3\u0170\3\0"+ "\1\u0170\36\0\2\u0170\3\0\1\u0170\1\0\1\u0170\1\0"+ "\1\u0170\2\0\1\u0170\1\0\4\u0170\2\0\1\u0170\1\0"+ "\1\u0170\12\0\11\256\2\125\1\126\13\256\1\125\11\256"+ "\1\u0171\56\256\2\125\1\126\13\256\1\125\4\256\1\u0172"+ "\4\256\1\u0173\10\256\1\u0174\45\256\2\125\1\126\13\256"+ "\1\125\16\256\1\u0175\40\256\1\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\5\147\1\u0176\24\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\6\0\1\151\2\147\1\u0177\27\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\4\147\1\u0178\25\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\24\147\1\u0179"+ "\5\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\1\147\1\u017a\1\147\14\0\4\147\7\0\32\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\7\147\1\u017b\22\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\4\147\1\u017c\25\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u017d"+ "\30\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\6\147\1\u017e\23\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\1\u017f"+ "\13\0\2\147\1\u0180\1\147\7\0\32\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\7\147\1\u0181\22\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ "\1\u0182\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\3\147\1\u0183\26\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\14\147\1\u0184\15\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\12\147\1\u0185\17\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\2\147"+ "\1\u0186\27\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\12\147\1\u0187\17\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\10\147\1\u0188\21\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\1\u0189\2\147\14\0"+ "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\4\147\1\u018a"+ "\25\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\4\147\1\u018b\25\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\23\147\1\u018c\6\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\16\147\1\u018d\13\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\7\147\1\u018e"+ "\22\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\11\147\1\u018f\20\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\7\147\1\u0190\22\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\14\147\1\u0191\15\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\17\147\1\u0192"+ "\12\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\15\147\1\u0193\14\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\12\147\1\u0194\17\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\7\147\1\u0195\22\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\16\147\1\u0196"+ "\13\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\1\u0197\31\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\24\147\1\u0198\5\147\1\0\3\147\6\0\1\147"+ "\44\0\1\u0199\46\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\2\147\1\u019a\27\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ "\1\u019b\22\147\1\0\3\147\6\0\1\147\24\0\1\u019c"+ "\133\0\1\u019d\106\0\1\u019e\101\0\1\u019f\106\0\1\u01a0"+ "\104\0\1\u01a1\70\0\1\u01a2\65\0\11\u016b\2\u01a3\1\u01a4"+ "\13\u016b\1\u01a3\1\u01a5\56\u016b\11\u012e\2\357\1\76\13\u012e"+ "\1\357\57\u012e\11\233\2\357\1\76\13\233\1\357\3\233"+ "\1\357\53\233\3\u016d\1\u01a6\1\u01a7\1\u016d\1\u01a8\1\u01a9"+ "\1\u016d\2\357\1\76\13\u016d\1\357\34\u016d\1\u01a6\1\u016d"+ "\1\u01a9\1\u01a6\17\u016d\1\0\3\u01aa\3\0\1\u01aa\36\0"+ "\2\u01aa\3\0\1\u01aa\1\0\1\u01aa\1\0\1\u01aa\2\0"+ "\1\u01aa\1\0\4\u01aa\2\0\1\u01aa\1\0\1\u01aa\12\0"+ "\11\256\2\125\1\126\13\256\1\125\4\256\1\u01ab\4\256"+ "\1\u01ac\45\256\11\u0172\2\u01ad\1\u01ae\13\u0172\1\u01ad\57\u0172"+ "\11\256\2\125\1\126\13\256\1\125\12\256\1\u01af\55\256"+ "\2\125\1\126\13\256\1\125\23\256\1\u01b0\40\256\1\u01b1"+ "\3\256\2\125\1\126\13\256\1\125\57\256\1\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b2\6\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\3\147\1\u01b3\26\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\14\147\1\u01b4\15\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\7\147"+ "\1\u01b5\22\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01b6\6\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\17\147\1\u01b7\12\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\7\147\1\u01b8\22\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\u01b9"+ "\31\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\15\147\1\u01ba\14\147\1\0"+ "\3\147\6\0\1\147\5\0\1\u01bb\2\0\2\u01bb\1\0"+ "\1\u017f\7\0\1\u01bc\3\0\1\u01bb\1\0\1\u017f\10\0"+ "\25\u01bb\4\0\1\u01bb\1\0\3\u01bb\6\0\1\u01bb\4\0"+ "\1\147\1\u01bb\1\147\1\0\2\u01bb\1\147\1\u017f\7\0"+ "\1\u01bc\3\0\1\u01bb\1\147\1\u0180\1\147\7\0\25\u01bb"+ "\4\147\1\u01bb\1\0\3\u01bb\6\0\1\u01bb\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\23\147\1\u01bd\6\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\4\147\1\u01be\25\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\12\147\1\u01bf\17\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+ "\1\u01c0\24\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\1\u01c1\31\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\2\147\1\u01c2\27\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\14\147\1\u01c3\15\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\1\u01c4\31\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\14\147\1\u01c5\15\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\3\147\1\u01c6\26\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ "\1\u01c7\25\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\17\147\1\u01c8\12\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\20\147\1\u01c9\11\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\4\147\1\u01ca\25\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\1\147"+ "\1\u01cb\30\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\1\u01cc\13\0\2\147\1\u01cd\1\147\7\0"+ "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\7\147\1\u01ce\22\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\4\147\1\u01cf\25\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\21\147\1\u01d0\10\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\16\147\1\u01d1"+ "\13\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\7\147\1\u01d2\22\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\1\337"+ "\13\0\2\147\1\340\1\147\7\0\15\147\1\u01d3\14\147"+ "\1\0\3\147\6\0\1\147\24\0\1\u01d4\130\0\1\u01d5"+ "\106\0\1\u01d6\111\0\1\u01d7\101\0\1\u01d8\106\0\1\u01d9"+ "\66\0\1\u01da\65\0\13\u01a3\1\u01a4\14\u01a3\1\u01db\1\u01dc"+ "\1\u01dd\1\u01de\1\u016b\1\u01a3\1\u016b\50\u01a3\30\u01a4\1\u01df"+ "\1\u01e0\1\u01e1\1\u01e2\1\232\1\u01a4\1\232\50\u01a4\11\u016b"+ "\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\1\357\55\u016b\3\233"+ "\1\u016d\3\233\1\u016d\1\233\2\357\1\76\13\233\1\357"+ "\3\233\1\357\30\233\1\u016d\1\233\2\u016d\23\233\1\u01e3"+ "\1\233\1\u01e4\2\233\2\357\1\76\13\233\1\357\3\233"+ "\1\357\54\233\3\u01e5\3\233\1\u01e5\1\233\2\357\1\76"+ "\13\233\1\357\3\233\1\357\12\233\2\u01e5\3\233\1\u01e5"+ "\1\233\1\u01e5\1\233\1\u01e5\2\233\1\u01e5\1\233\4\u01e5"+ "\2\233\1\u01e5\1\233\1\u01e5\15\233\1\u01a6\3\233\1\u01a6"+ "\1\233\2\357\1\76\13\233\1\357\3\233\1\357\30\233"+ "\1\u01a6\1\233\2\u01a6\17\233\1\0\3\235\3\0\1\235"+ "\36\0\2\235\3\0\1\235\1\0\1\235\1\0\1\235"+ "\2\0\1\235\1\0\4\235\2\0\1\235\1\0\1\235"+ "\12\0\11\u01ab\2\u01e6\1\u01e7\13\u01ab\1\u01e6\57\u01ab\11\256"+ "\2\125\1\126\13\256\1\125\12\256\1\u01e8\55\256\2\125"+ "\1\126\13\256\1\125\13\256\1\u01e9\54\256\2\125\1\126"+ "\13\256\1\125\21\256\1\u01ea\46\256\2\125\1\126\13\256"+ "\1\125\11\256\1\u01eb\45\256\1\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\7\147\1\u01ec\22\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\4\147\1\u01ed\25\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\22\147"+ "\1\u01ee\7\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\4\147\1\u01ef\25\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\7\147\1\u01f0\22\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\7\147\1\u01f1\22\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\16\147"+ "\1\u01f2\13\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\1\u01f3\2\147\14\0\4\147\7\0\32\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\1\u01f4"+ "\13\0\2\147\1\u01f5\1\147\7\0\32\147\1\0\3\147"+ "\6\0\1\147\4\0\3\u01bb\1\0\3\u01bb\1\u01f6\3\0"+ "\1\u01f7\1\0\1\u01f8\1\0\1\u01f9\3\0\4\u01bb\7\0"+ "\32\u01bb\1\0\3\u01bb\6\0\1\u01bb\4\0\3\u01fa\1\0"+ "\4\u01fa\3\0\2\u01fa\2\0\10\u01fa\7\0\32\u01fa\1\0"+ "\3\u01fa\6\0\1\u01fa\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\15\147\1\u01fb\14\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\5\147\1\u01fc\24\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\6\0\1\151\32\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\15\147\1\u01fd\14\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\5\147\1\u01fe\24\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\3\147"+ "\1\u01ff\26\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\16\147\1\u0200\13\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\13\147\1\u0201\16\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\12\147\1\u0202\17\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ "\1\u0203\25\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\1\u0204\13\0\2\147\1\u0205\1\147\7\0"+ "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\1\147\1\u0206\1\147\14\0\4\147\7\0\32\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\24\147\1\u0207\5\147\1\0\3\147\6\0"+ "\1\147\5\0\1\u0208\2\0\2\u0208\1\0\1\u01cc\13\0"+ "\1\u0208\1\0\1\u01cc\10\0\25\u0208\4\0\1\u0208\1\0"+ "\3\u0208\6\0\1\u0208\4\0\1\147\1\u0208\1\147\1\0"+ "\2\u0208\1\147\1\u01cc\13\0\1\u0208\1\147\1\u01cd\1\147"+ "\7\0\25\u0208\4\147\1\u0208\1\0\3\u0208\6\0\1\u0208"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\15\147"+ "\1\u0209\14\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\1\u020a\13\0\2\147\1\u020b\1\147\7\0"+ "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\1\334\13\0\2\147\1\335\1\147\7\0\15\147"+ "\1\u020c\14\147\1\0\3\147\6\0\1\147\13\0\4\u01d4"+ "\12\0\2\u01d4\6\0\1\u020d\125\0\1\u020e\106\0\1\u020f"+ "\74\0\1\u0210\111\0\1\u0211\145\0\1\u0212\11\0\4\u0213"+ "\12\0\2\u0213\57\0\13\u01a3\1\u01a4\14\u01a3\1\u01db\1\u0214"+ "\1\u01dd\1\u01de\1\u016b\1\u01a3\1\u016b\63\u01a3\1\u01a4\14\u01a3"+ "\1\u0215\1\u016b\55\u01a3\4\u01dd\1\u0216\4\u01dd\2\u01a3\1\u01a4"+ "\13\u01dd\1\u01a3\1\u0217\1\u01dd\1\u01a3\54\u01dd\4\u0218\1\u0219"+ "\4\u0218\2\u01a3\1\u01a4\13\u0218\1\u01a3\1\u021a\2\u0218\1\u016b"+ "\53\u0218\30\u01a4\1\u01df\1\u021b\1\u01e1\1\u01e2\1\232\1\u01a4"+ "\1\232\100\u01a4\1\u021c\1\u016b\55\u01a4\4\u01e1\1\u021d\4\u01e1"+ "\3\232\13\u01e1\1\232\1\u021e\1\u01e1\1\u01a4\54\u01e1\4\u021f"+ "\1\u0220\4\u021f\3\232\13\u021f\1\232\1\u0221\2\u021f\1\232"+ "\53\u021f\4\233\1\u01e3\1\233\1\u01e4\2\233\2\357\1\76"+ "\13\233\1\357\60\233\3\u01e5\3\233\1\u01e5\1\233\2\357"+ "\1\76\13\233\1\357\16\233\2\u01e5\3\233\1\u01e5\1\233"+ "\1\u01e5\1\233\1\u01e5\2\233\1\u01e5\1\233\4\u01e5\2\233"+ "\1\u01e5\1\233\1\u01e5\13\233\3\u0222\3\233\1\u0222\1\233"+ "\2\357\1\76\13\233\1\357\16\233\2\u0222\3\233\1\u0222"+ "\1\233\1\u0222\1\233\1\u0222\2\233\1\u0222\1\233\4\u0222"+ "\2\233\1\u0222\1\233\1\u0222\12\233\11\256\2\125\1\126"+ "\13\256\1\125\13\256\1\u0223\54\256\2\125\1\126\13\256"+ "\1\125\14\256\1\u0224\53\256\2\125\1\126\13\256\1\125"+ "\4\256\1\u0225\63\256\2\125\1\126\13\256\1\125\12\256"+ "\1\u0226\44\256\1\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\5\147\1\u0227\24\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\1\u0228\13\0\2\147\1\u0228"+ "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0229"+ "\30\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\14\147\1\u022a\15\147\1\0"+ "\3\147\6\0\1\147\3\0\2\u022b\1\u022c\2\u022b\2\u022c"+ "\1\u022b\1\u01f4\3\0\10\u022b\1\u022c\1\u022b\1\u01f4\1\0"+ "\7\u022b\25\u022c\4\u022b\1\u022c\1\u022b\3\u022c\6\u022b\1\u022c"+ "\4\u022b\1\u022d\1\u022c\1\u022d\1\u022b\2\u022c\1\u022d\1\u01f4"+ "\3\0\10\u022b\1\u022c\1\u022d\1\u01f5\1\147\7\u022b\25\u022c"+ "\4\u022d\1\u022c\1\u022b\3\u022c\6\u022b\1\u022c\3\u022b\10\0"+ "\1\u01f6\3\0\1\u01f7\1\0\1\u01f8\1\0\1\u01f9\5\0"+ "\1\u01f6\62\0\1\u01bb\2\0\2\u01bb\1\0\1\u01f7\13\0"+ "\1\u01bb\1\0\1\u01f7\10\0\25\u01bb\4\0\1\u01bb\1\0"+ "\3\u01bb\6\0\1\u01bb\13\0\1\u01f8\6\0\1\u022e\6\0"+ "\1\u01f8\61\0\3\u022f\1\0\4\u022f\3\0\2\u022f\2\0"+ "\10\u022f\7\0\32\u022f\1\0\3\u022f\6\0\1\u022f\4\0"+ "\3\u01fa\1\0\4\u01fa\3\0\2\u01fa\2\0\1\u01fa\1\u0230"+ "\6\u01fa\7\0\32\u01fa\1\0\3\u01fa\6\0\1\u01fa\4\0"+ "\3\147\1\0\3\147\1\u0231\13\0\2\147\1\u0232\1\147"+ "\7\0\32\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\6\147\1\u0233\23\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\7\147\1\u0234\22\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\1\147\1\u0235\30\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\4\147"+ "\1\u0236\25\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\2\147\1\u0237\27\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\14\147\1\u0238\15\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\5\147\1\u0239\24\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\5\147"+ "\1\u023a\24\147\1\0\3\147\6\0\1\147\3\0\2\u023b"+ "\1\u023c\2\u023b\2\u023c\1\u023b\1\u0204\3\0\10\u023b\1\u023c"+ "\1\u023b\1\u0204\1\0\7\u023b\25\u023c\4\u023b\1\u023c\1\u023b"+ "\3\u023c\6\u023b\1\u023c\4\u023b\1\u023d\1\u023c\1\u023d\1\u023b"+ "\2\u023c\1\u023d\1\u0204\3\0\10\u023b\1\u023c\1\u023d\1\u0205"+ "\1\147\7\u023b\25\u023c\4\u023d\1\u023c\1\u023b\3\u023c\6\u023b"+ "\1\u023c\3\u023b\1\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\24\147\1\u023e\5\147\1\0\3\147\6\0\1\147"+ "\4\0\3\147\1\0\3\147\1\u023f\13\0\2\147\1\u0240"+ "\1\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ "\3\u0208\1\0\3\u0208\1\u0241\7\0\1\u0242\3\0\4\u0208"+ "\7\0\32\u0208\1\0\3\u0208\6\0\1\u0208\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\15\147\1\u0243\14\147"+ "\1\0\3\147\6\0\1\147\3\0\1\u0244\1\u0245\1\u0244"+ "\1\u0245\3\u0244\1\u0245\1\u020a\3\0\12\u0244\1\u020a\1\0"+ "\34\u0244\4\u0245\20\u0244\1\u0246\1\u0247\1\u0246\1\u0244\2\u0247"+ "\1\u0246\1\u020a\3\0\10\u0244\2\u0247\1\u020b\1\147\7\u0244"+ "\25\u0247\4\u0246\1\u0247\1\u0244\3\u0247\6\u0244\1\u0247\3\u0244"+ "\53\0\1\u0248\106\0\1\u0249\140\0\1\u024a\44\0\1\u024b"+ "\62\0\1\u024c\77\0\4\u0213\12\0\2\u0213\6\0\1\u024d"+ "\50\0\13\357\1\76\14\357\1\u01a3\1\u012d\1\u024e\1\u024f"+ "\53\357\11\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\1\u01a3"+ "\55\u016b\11\u01dd\2\u01a3\1\u01a4\13\u01dd\1\u01a3\1\u0217\62\u01dd"+ "\1\u0216\4\u01dd\2\u01a3\1\u01a4\13\u01dd\1\u01a3\1\u0217\1\u024e"+ "\1\u01a3\54\u01dd\11\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5"+ "\2\u016b\1\u01a3\53\u016b\3\u0218\1\u0250\1\u0251\1\u0218\1\u0252"+ "\1\u0253\1\u0218\2\u01a3\1\u01a4\13\u0218\1\u01a3\1\u021a\33\u0218"+ "\1\u0250\1\u0218\1\u0253\1\u0250\17\u0218\11\u016b\2\u01a3\1\u01a4"+ "\13\u016b\1\u01a3\1\u01a5\1\357\1\u016b\1\u01a3\53\u016b\30\76"+ "\1\u01a4\1\u012d\1\u0254\1\u0255\53\76\30\232\1\356\1\u01a4"+ "\55\232\11\u01e1\3\232\13\u01e1\1\232\1\u021e\62\u01e1\1\u021d"+ "\4\u01e1\3\232\13\u01e1\1\232\1\u021e\1\u0254\1\u01a4\54\u01e1"+ "\30\232\1\356\2\232\1\u01a4\53\232\3\u021f\1\u0256\1\u0257"+ "\1\u021f\1\u0258\1\u0259\1\u021f\3\232\13\u021f\1\232\1\u0221"+ "\33\u021f\1\u0256\1\u021f\1\u0259\1\u0256\17\u021f\30\232\1\356"+ "\1\76\1\232\1\u01a4\53\232\1\233\3\u025a\3\233\1\u025a"+ "\1\233\2\357\1\76\13\233\1\357\16\233\2\u025a\3\233"+ "\1\u025a\1\233\1\u025a\1\233\1\u025a\2\233\1\u025a\1\233"+ "\4\u025a\2\233\1\u025a\1\233\1\u025a\12\233\11\256\2\125"+ "\1\126\13\256\1\125\14\256\1\u025b\53\256\2\125\1\126"+ "\13\256\1\125\15\256\1\u025c\41\256\11\u0225\2\u025d\1\u025e"+ "\13\u0225\1\u025d\57\u0225\11\256\2\125\1\126\13\256\1\125"+ "\13\256\1\u025f\43\256\1\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\6\147\1\u0260\23\147\1\0\3\147\6\0"+ "\1\147\3\0\13\u0228\1\0\73\u0228\1\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\2\147\1\u0261\27\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\15\147\1\u0262\14\147\1\0\3\147\6\0"+ "\1\147\3\0\11\u022b\3\0\13\u022b\1\0\60\u022b\3\u022c"+ "\1\u022b\3\u022c\1\u0263\3\0\2\u01f4\6\u022b\3\u022c\1\u0264"+ "\7\u022b\32\u022c\1\u022b\3\u022c\6\u022b\1\u022c\4\u022b\3\u022d"+ "\1\u022b\3\u022d\1\u022b\3\0\10\u022b\3\u022d\1\147\7\u022b"+ "\32\u022d\1\u022b\3\u022d\6\u022b\1\u022d\3\u022b\10\0\1\u022e"+ "\5\0\1\u01f8\7\0\1\u022e\61\0\3\u022f\1\0\4\u022f"+ "\3\0\2\u022f\2\0\1\u022f\1\u0265\6\u022f\7\0\32\u022f"+ "\1\0\3\u022f\6\0\1\u022f\4\0\1\u01fa\1\u0266\1\u01fa"+ "\1\0\2\u0266\1\u01fa\1\u0230\3\0\2\u01fa\2\0\1\u01fa"+ "\1\u0230\2\u01fa\1\u0266\1\u01fa\1\u0230\1\u01fa\7\0\25\u0266"+ "\4\u01fa\1\u0266\1\0\3\u0266\6\0\1\u0266\5\0\1\u0267"+ "\2\0\2\u0267\1\0\1\u0231\13\0\1\u0267\1\0\1\u0231"+ "\10\0\25\u0267\4\0\1\u0267\1\0\3\u0267\6\0\1\u0267"+ "\4\0\1\147\1\u0267\1\147\1\0\2\u0267\1\147\1\u0231"+ "\13\0\1\u0267\1\147\1\u0232\1\147\7\0\25\u0267\4\147"+ "\1\u0267\1\0\3\u0267\6\0\1\u0267\4\0\3\147\1\0"+ "\3\147\1\u0268\13\0\2\147\1\u0269\1\147\6\0\1\151"+ "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\1\u026a\13\0\2\147\1\u026b\1\147\7\0\32\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\1\u026c\13\0\2\147\1\u026d\1\147\7\0\32\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\5\147\1\u026e\24\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\2\147\1\u026f\27\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\1\147\1\u0270"+ "\30\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\4\147\1\u0271\25\147\1\0"+ "\3\147\6\0\1\147\3\0\11\u023b\3\0\13\u023b\1\0"+ "\60\u023b\3\u023c\1\u023b\3\u023c\1\u0272\3\0\1\u0204\7\u023b"+ "\3\u023c\1\u0273\7\u023b\32\u023c\1\u023b\3\u023c\6\u023b\1\u023c"+ "\4\u023b\3\u023d\1\u023b\3\u023d\1\u023b\3\0\10\u023b\3\u023d"+ "\1\147\7\u023b\32\u023d\1\u023b\3\u023d\6\u023b\1\u023d\3\u023b"+ "\2\0\1\u0274\2\0\2\u0274\1\0\1\u023f\7\0\1\u0275"+ "\3\0\1\u0274\1\0\1\u023f\10\0\25\u0274\4\0\1\u0274"+ "\1\0\3\u0274\6\0\1\u0274\4\0\1\147\1\u0276\1\147"+ "\1\0\2\u0276\1\147\1\u023f\7\0\1\u0275\3\0\1\u0276"+ "\1\147\1\u0240\1\147\7\0\25\u0276\4\147\1\u0276\1\0"+ "\3\u0276\6\0\1\u0276\13\0\1\u0241\7\0\1\u0242\5\0"+ "\1\u0241\61\0\3\u0277\1\0\4\u0277\3\0\2\u0277\2\0"+ "\10\u0277\7\0\32\u0277\1\0\3\u0277\6\0\1\u0277\3\0"+ "\11\u0244\3\0\13\u0244\1\0\60\u0244\1\u0245\1\u0244\1\u0245"+ "\3\u0244\1\u0245\1\u0278\3\0\12\u0244\1\u0278\1\0\34\u0244"+ "\4\u0245\20\u0244\1\u0246\1\u0247\1\u0246\1\u0244\2\u0247\1\u0246"+ "\1\u0278\3\0\10\u0244\2\u0247\1\u0279\1\147\7\u0244\25\u0247"+ "\4\u0246\1\u0247\1\u0244\3\u0247\6\u0244\1\u0247\4\u0244\3\u0247"+ "\1\u0244\3\u0247\1\u0244\3\0\10\u0244\3\u0247\1\147\7\u0244"+ "\32\u0247\1\u0244\3\u0247\6\u0244\1\u0247\3\u0244\54\0\1\u027a"+ "\106\0\1\u027b\51\0\1\u027c\151\0\1\u027d\22\0\1\u027e"+ "\1\0\4\u024e\1\u027f\4\u024e\2\357\1\76\13\u024e\1\357"+ "\1\u024e\1\u0280\1\u024e\1\u0281\1\u012e\1\u024e\1\u012e\50\u024e"+ "\4\u0282\1\u0283\4\u0282\2\357\1\76\13\u0282\1\357\1\u0282"+ "\1\u012d\1\u0284\1\u012f\1\u016d\1\u0282\1\u016d\50\u0282\3\u016b"+ "\1\u0218\3\u016b\1\u0218\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3"+ "\1\u01a5\2\u016b\1\u01a3\30\u016b\1\u0218\1\u016b\2\u0218\23\u016b"+ "\1\u0285\1\u016b\1\u0286\2\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3"+ "\1\u01a5\2\u016b\1\u01a3\54\u016b\3\u0287\3\u016b\1\u0287\1\u016b"+ "\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\2\u016b\1\u01a3\12\u016b"+ "\2\u0287\3\u016b\1\u0287\1\u016b\1\u0287\1\u016b\1\u0287\2\u016b"+ "\1\u0287\1\u016b\4\u0287\2\u016b\1\u0287\1\u016b\1\u0287\15\u016b"+ "\1\u0250\3\u016b\1\u0250\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3"+ "\1\u01a5\2\u016b\1\u01a3\30\u016b\1\u0250\1\u016b\2\u0250\17\u016b"+ "\4\u0254\1\u0288\4\u0254\3\76\13\u0254\1\76\1\u0254\1\u0289"+ "\1\u0254\1\u028a\1\230\1\u0254\1\230\50\u0254\4\u028b\1\u028c"+ "\4\u028b\3\76\13\u028b\1\76\1\u028b\1\227\1\u028d\1\231"+ "\1\235\1\u028b\1\235\50\u028b\3\232\1\u021f\3\232\1\u021f"+ "\20\232\1\356\2\232\1\u01a4\30\232\1\u021f\1\232\2\u021f"+ "\23\232\1\u028e\1\232\1\u028f\21\232\1\356\2\232\1\u01a4"+ "\54\232\3\u0290\3\232\1\u0290\20\232\1\356\2\232\1\u01a4"+ "\12\232\2\u0290\3\232\1\u0290\1\232\1\u0290\1\232\1\u0290"+ "\2\232\1\u0290\1\232\4\u0290\2\232\1\u0290\1\232\1\u0290"+ "\15\232\1\u0256\3\232\1\u0256\20\232\1\356\2\232\1\u01a4"+ "\30\232\1\u0256\1\232\2\u0256\17\232\1\233\3\u016d\3\233"+ "\1\u016d\1\233\2\357\1\76\13\233\1\357\16\233\2\u016d"+ "\3\233\1\u016d\1\233\1\u016d\1\233\1\u016d\2\233\1\u016d"+ "\1\233\4\u016d\2\233\1\u016d\1\233\1\u016d\12\233\11\256"+ "\2\125\1\126\13\256\1\125\15\256\1\u0291\52\256\2\125"+ "\1\126\13\256\1\125\4\256\1\u0292\63\256\2\125\1\126"+ "\13\256\1\125\14\256\1\u0293\42\256\1\0\3\147\1\0"+ "\3\147\1\u0294\13\0\2\147\1\u0295\1\147\6\0\1\151"+ "\32\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\15\147\1\u0296\14\147\1\0"+ "\3\147\6\0\1\147\4\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\7\147\1\u0243\22\147\1\0\3\147\6\0"+ "\1\147\3\0\10\u022b\1\u0263\3\0\2\u01f4\10\u022b\1\u0263"+ "\1\0\57\u022b\1\0\3\u0264\1\0\3\u0264\1\u0297\3\0"+ "\2\u0298\6\0\4\u0264\7\0\32\u0264\1\0\3\u0264\6\0"+ "\1\u0264\4\0\3\u022f\1\0\3\u022f\1\u0265\3\0\2\u022f"+ "\1\u01f8\1\0\1\u022f\1\u0265\4\u022f\1\u0265\1\u022f\7\0"+ "\32\u022f\1\0\3\u022f\6\0\1\u022f\4\0\3\u0266\1\0"+ "\3\u0266\1\u0299\3\0\1\u0230\1\u01fa\1\u01f8\1\0\1\u029a"+ "\1\u0230\2\u01fa\4\u0266\7\0\32\u0266\1\0\3\u0266\6\0"+ "\1\u0266\4\0\3\u0267\1\0\3\u0267\1\u029b\3\0\1\u0231"+ "\3\0\1\u029c\3\0\4\u0267\7\0\32\u0267\1\0\3\u0267"+ "\6\0\1\u0267\3\0\2\u029d\1\u029e\2\u029d\2\u029e\1\u029d"+ "\1\u0268\3\0\10\u029d\1\u029e\1\u029d\1\u0268\1\0\7\u029d"+ "\25\u029e\4\u029d\1\u029e\1\u029d\3\u029e\6\u029d\1\u029e\4\u029d"+ "\1\u029f\1\u029e\1\u029f\1\u029d\2\u029e\1\u029f\1\u0268\3\0"+ "\10\u029d\1\u029e\1\u029f\1\u0269\1\147\7\u029d\25\u029e\4\u029f"+ "\1\u029e\1\u029d\3\u029e\6\u029d\1\u029e\3\u029d\10\0\1\u026a"+ "\15\0\1\u026a\12\0\1\u02a0\5\0\1\u02a1\40\0\3\147"+ "\1\0\3\147\1\u026a\13\0\2\147\1\u026b\1\147\7\0"+ "\2\147\1\u02a2\5\147\1\u02a3\21\147\1\0\3\147\6\0"+ "\1\147\5\0\1\u02a4\2\0\2\u02a4\1\0\1\u026c\13\0"+ "\1\u02a4\1\0\1\u026c\10\0\25\u02a4\4\0\1\u02a4\1\0"+ "\3\u02a4\6\0\1\u02a4\4\0\1\147\1\u02a4\1\147\1\0"+ "\2\u02a4\1\147\1\u026c\13\0\1\u02a4\1\147\1\u026d\1\147"+ "\7\0\25\u02a4\4\147\1\u02a4\1\0\3\u02a4\6\0\1\u02a4"+ "\4\0\3\147\1\0\3\147\14\0\4\147\7\0\6\147"+ "\1\u02a5\23\147\1\0\3\147\6\0\1\147\4\0\3\147"+ "\1\0\3\147\14\0\4\147\7\0\7\147\1\u02a6\22\147"+ "\1\0\3\147\6\0\1\147\4\0\3\147\1\0\3\147"+ "\14\0\4\147\7\0\7\147\1\u02a7\22\147\1\0\3\147"+ "\6\0\1\147\4\0\3\147\1\0\3\147\1\u02a8\13\0"+ "\2\147\1\u02a9\1\147\7\0\32\147\1\0\3\147\6\0"+ "\1\147\3\0\10\u023b\1\u0272\3\0\1\u0204\11\u023b\1\u0272"+ "\1\0\57\u023b\1\0\3\u0273\1\0\3\u0273\1\u02aa\3\0"+ "\1\u02ab\7\0\4\u0273\7\0\32\u0273\1\0\3\u0273\6\0"+ "\1\u0273\4\0\3\u0274\1\0\3\u0274\1\u02ac\3\0\1\u02ad"+ "\1\0\1\u02ae\1\0\1\u02af\3\0\2\u0274\1\u02b0\1\u0274"+ "\7\0\32\u0274\1\0\3\u0274\6\0\1\u0274\4\0\3\u02b1"+ "\1\0\4\u02b1\3\0\2\u02b1\2\0\10\u02b1\7\0\32\u02b1"+ "\1\0\3\u02b1\6\0\1\u02b1\4\0\3\u0276\1\0\3\u0276"+ "\1\u02ac\3\0\1\u02ad\1\0\1\u02ae\1\0\1\u02af\3\0"+ "\2\u0276\1\u02b2\1\u0276\7\0\32\u0276\1\0\3\u0276\6\0"+ "\1\u0276\4\0\3\u0277\1\0\4\u0277\3\0\2\u0277\2\0"+ "\1\u0277\1\u02b3\6\u0277\7\0\32\u0277\1\0\3\u0277\6\0"+ "\1\u0277\3\0\10\u0244\1\u0278\3\0\12\u0244\1\u0278\1\0"+ "\60\u0244\3\u0247\1\u0244\3\u0247\1\u0278\3\0\10\u0244\2\u0247"+ "\1\u0279\1\147\7\u0244\32\u0247\1\u0244\3\u0247\6\u0244\1\u0247"+ "\3\u0244\46\0\1\u02b4\106\0\1\u02b5\77\0\1\u02b6\66\0"+ "\1\u02b7\67\0\11\u024e\2\357\1\76\13\u024e\1\357\1\u024e"+ "\1\u0280\1\u012e\1\u0281\1\u012e\1\u024e\1\u012e\54\u024e\1\u027f"+ "\4\u024e\2\357\1\76\13\u024e\1\357\1\u01dd\1\u012e\1\357"+ "\54\u024e\4\u0284\1\u02b8\4\u0284\2\357\1\76\13\u0284\1\357"+ "\2\u0284\1\u0282\1\u012e\53\u0284\13\357\1\76\15\357\1\u012d"+ "\1\u012e\1\u024f\1\233\1\357\1\233\50\357\3\u0282\1\u02b9"+ "\1\u02ba\1\u0282\1\u02bb\1\u02bc\1\u0282\2\357\1\76\13\u0282"+ "\1\357\1\u0282\1\u012d\1\u0284\1\u02bd\1\u016d\1\u0282\1\u016d"+ "\25\u0282\1\u02b9\1\u0282\1\u02bc\1\u02b9\17\u0282\4\u012e\1\u016c"+ "\4\u012e\2\357\1\76\13\u012e\1\357\2\u012e\1\357\1\u024e"+ "\53\u012e\4\u016b\1\u0285\1\u016b\1\u0286\2\u016b\2\u01a3\1\u01a4"+ "\13\u016b\1\u01a3\1\u01a5\57\u016b\3\u0287\3\u016b\1\u0287\1\u016b"+ "\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\15\u016b\2\u0287\3\u016b"+ "\1\u0287\1\u016b\1\u0287\1\u016b\1\u0287\2\u016b\1\u0287\1\u016b"+ "\4\u0287\2\u016b\1\u0287\1\u016b\1\u0287\13\u016b\3\u02be\3\u016b"+ "\1\u02be\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\15\u016b"+ "\2\u02be\3\u016b\1\u02be\1\u016b\1\u02be\1\u016b\1\u02be\2\u016b"+ "\1\u02be\1\u016b\4\u02be\2\u016b\1\u02be\1\u016b\1\u02be\12\u016b"+ "\11\u0254\3\76\13\u0254\1\76\1\u0254\1\u0289\1\230\1\u028a"+ "\1\230\1\u0254\1\230\54\u0254\1\u0288\4\u0254\3\76\13\u0254"+ "\1\76\1\u01e1\1\u012e\1\76\54\u0254\4\u028d\1\u02bf\4\u028d"+ "\3\0\13\u028d\1\0\2\u028d\1\u028b\1\230\53\u028d\31\76"+ "\1\227\1\230\1\u0255\1\0\1\76\1\0\50\76\3\u028b"+ "\1\u02c0\1\u02c1\1\u028b\1\u02c2\1\u02c3\1\u028b\3\76\13\u028b"+ "\1\76\1\u028b\1\227\1\u028d\1\u02c4\1\235\1\u028b\1\235"+ "\25\u028b\1\u02c0\1\u028b\1\u02c3\1\u02c0\17\u028b\4\230\1\234"+ "\4\230\3\0\13\230\1\0\2\230\1\76\1\u0254\53\230"+ "\4\232\1\u028e\1\232\1\u028f\21\232\1\356\57\232\3\u0290"+ "\3\232\1\u0290\20\232\1\356\15\232\2\u0290\3\232\1\u0290"+ "\1\232\1\u0290\1\232\1\u0290\2\232\1\u0290\1\232\4\u0290"+ "\2\232\1\u0290\1\232\1\u0290\13\232\3\u02c5\3\232\1\u02c5"+ "\20\232\1\356\15\232\2\u02c5\3\232\1\u02c5\1\232\1\u02c5"+ "\1\232\1\u02c5\2\232\1\u02c5\1\232\4\u02c5\2\232\1\u02c5"+ "\1\232\1\u02c5\12\232\11\256\2\125\1\126\13\256\1\125"+ "\4\256\1\u02c6\52\256\11\u0292\2\u02c7\1\u02c8\13\u0292\1\u02c7"+ "\57\u0292\11\256\2\125\1\126\13\256\1\125\15\256\1\u02c9"+ "\41\256\2\u02ca\1\u02cb\2\u02ca\2\u02cb\1\u02ca\1\u0294\3\0"+ "\10\u02ca\1\u02cb\1\u02ca\1\u0294\1\0\7\u02ca\25\u02cb\4\u02ca"+ "\1\u02cb\1\u02ca\3\u02cb\6\u02ca\1\u02cb\4\u02ca\1\u02cc\1\u02cb"+ "\1\u02cc\1\u02ca\2\u02cb\1\u02cc\1\u0294\3\0\10\u02ca\1\u02cb"+ "\1\u02cc\1\u0295\1\147\7\u02ca\25\u02cb\4\u02cc\1\u02cb\1\u02ca"+ "\3\u02cb\6\u02ca\1\u02cb\3\u02ca\1\0\3\147\1\0\3\147"+ "\1\u02cd\13\0\2\147\1\u02cd\1\147\7\0\32\147\1\0"+ "\3\147\6\0\1\147\13\0\1\u0297\3\0\2\u0298\10\0"+ "\1\u0297\62\0\1\u0264\2\0\2\u0264\1\0\1\u0298\13\0"+ "\1\u0264\1\0\1\u0298\10\0\25\u0264\4\0\1\u0264\1\0"+ "\3\u0264\6\0\1\u0264\4\0\3\u01fa\1\0\3\u01fa\1\u0299"+ "\3\0\1\u0230\1\u01fa\1\u01f8\1\0\1\u029a\1\u0230\4\u01fa"+ "\1\u0299\1\u01fa\7\0\32\u01fa\1\0\3\u01fa\6\0\1\u01fa"+ "\4\0\3\u02ce\1\0\4\u02ce\3\0\2\u02ce\2\0\1\u02ce"+ "\1\u02cf\6\u02ce\7\0\32\u02ce\1\0\3\u02ce\6\0\1\u02ce"+ "\13\0\1\u029b\3\0\1\u0231\3\0\1\u029c\5\0\1\u029b"+ "\61\0\3\u02d0\1\0\4\u02d0\3\0\2\u02d0\2\0\10\u02d0"+ "\7\0\32\u02d0\1\0\3\u02d0\6\0\1\u02d0\3\0\11\u029d"+ "\3\0\13\u029d\1\0\60\u029d\3\u029e\1\u029d\3\u029e\1\u02d1"+ "\3\0\2\u0268\6\u029d\3\u029e\1\u02d2\7\u029d\32\u029e\1\u029d"+ "\3\u029e\6\u029d\1\u029e\4\u029d\3\u029f\1\u029d\3\u029f\1\u029d"+ "\3\0\10\u029d\3\u029f\1\147\7\u029d\32\u029f\1\u029d\3\u029f"+ "\6\u029d\1\u029f\3\u029d\43\0\1\u02d3\116\0\1\u02d4\34\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\4\147\1\u02d5"+ "\25\147\1\0\3\147\6\0\1\147\4\0\3\147\1\0"+ "\3\147\14\0\4\147\7\0\14\147\1\u02d6\15\147\1\0"+ "\3\147\6\0\1\147\4\0\3\u02a4\1\0\3\u02a4\1\u02d7"+ "\13\0\4\u02a4\7\0\32\u02a4\1\0\3\u02a4\6\0\1\u02a4"+ "\4\0\3\147\1\0\3\147\1\u02d8\13\0\2\147\1\u02d9"+ "\1\147\6\0\1\151\32\147\1\0\3\147\6\0\1\147"+ "\3\0\2\u02da\1\u02db\2\u02da\2\u02db\1\u02da\1\u02a8\3\0"+ "\10\u02da\1\u02db\1\u02da\1\u02a8\1\0\7\u02da\25\u02db\4\u02da"+ "\1\u02db\1\u02da\3\u02db\6\u02da\1\u02db\4\u02da\1\u02dc\1\u02db"+ "\1\u02dc\1\u02da\2\u02db\1\u02dc\1\u02a8\3\0\10\u02da\1\u02db"+ "\1\u02dc\1\u02a9\1\147\7\u02da\25\u02db\4\u02dc\1\u02db\1\u02da"+ "\3\u02db\6\u02da\1\u02db\3\u02da\10\0\1\u02aa\3\0\1\u02ab"+ "\11\0\1\u02aa\62\0\1\u0273\2\0\2\u0273\1\0\1\u02ab"+ "\13\0\1\u0273\1\0\1\u02ab\10\0\25\u0273\4\0\1\u0273"+ "\1\0\3\u0273\6\0\1\u0273\13\0\1\u02ac\3\0\1\u02ad"+ "\1\0\1\u02ae\1\0\1\u02af\5\0\1\u02ac\62\0\1\u0274"+ "\2\0\2\u0274\1\0\1\u02ad\13\0\1\u0274\1\0\1\u02ad"+ "\10\0\25\u0274\4\0\1\u0274\1\0\3\u0274\6\0\1\u0274"+ "\13\0\1\u02ae\6\0\1\u02dd\6\0\1\u02ae\61\0\3\u02de"+ "\1\0\4\u02de\3\0\2\u02de\2\0\10\u02de\7\0\32\u02de"+ "\1\0\3\u02de\6\0\1\u02de\4\0\3\u02b1\1\0\4\u02b1"+ "\3\0\2\u02b1\2\0\1\u02b1\1\u02df\6\u02b1\7\0\32\u02b1"+ "\1\0\3\u02b1\6\0\1\u02b1\4\0\3\u0277\1\0\3\u0277"+ "\1\u02b3\3\0\2\u0277\2\0\1\u0277\1\u02b3\4\u0277\1\u02b3"+ "\1\u0277\7\0\32\u0277\1\0\3\u0277\6\0\1\u0277\110\0"+ "\1\u02e0\106\0\1\u02e1\64\0\1\u02e2\23\0\3\u0284\1\u02e3"+ "\1\u02e4\1\u0284\1\u02e5\1\u02e6\1\u0284\2\357\1\76\13\u0284"+ "\1\357\34\u0284\1\u02e3\1\u0284\1\u02e6\1\u02e3\17\u0284\3\357"+ "\1\u0282\3\357\1\u0282\3\357\1\76\15\357\1\u012d\1\u012e"+ "\1\u024f\1\233\1\357\1\233\25\357\1\u0282\1\357\2\u0282"+ "\23\357\1\u02e7\1\357\1\u02e8\4\357\1\76\15\357\1\u012d"+ "\1\u012e\1\u024f\1\233\1\357\1\233\51\357\3\u02e9\3\357"+ "\1\u02e9\3\357\1\76\15\357\1\u012d\1\u012e\1\u024f\1\233"+ "\1\357\1\233\7\357\2\u02e9\3\357\1\u02e9\1\357\1\u02e9"+ "\1\357\1\u02e9\2\357\1\u02e9\1\357\4\u02e9\2\357\1\u02e9"+ "\1\357\1\u02e9\15\357\1\u02b9\3\357\1\u02b9\3\357\1\76"+ "\15\357\1\u012d\1\u012e\1\u024f\1\233\1\357\1\233\25\357"+ "\1\u02b9\1\357\2\u02b9\17\357\4\u016d\1\u016e\4\u016d\2\357"+ "\1\76\13\u016d\1\357\3\u016d\1\357\53\u016d\1\u016b\3\u02ea"+ "\3\u016b\1\u02ea\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5"+ "\15\u016b\2\u02ea\3\u016b\1\u02ea\1\u016b\1\u02ea\1\u016b\1\u02ea"+ "\2\u016b\1\u02ea\1\u016b\4\u02ea\2\u016b\1\u02ea\1\u016b\1\u02ea"+ "\12\u016b\3\u028d\1\u02eb\1\u02ec\1\u028d\1\u02ed\1\u02ee\1\u028d"+ "\3\0\13\u028d\1\0\34\u028d\1\u02eb\1\u028d\1\u02ee\1\u02eb"+ "\17\u028d\3\76\1\u028b\3\76\1\u028b\21\76\1\227\1\230"+ "\1\u0255\1\0\1\76\1\0\25\76\1\u028b\1\76\2\u028b"+ "\23\76\1\u02ef\1\76\1\u02f0\22\76\1\227\1\230\1\u0255"+ "\1\0\1\76\1\0\51\76\3\u02f1\3\76\1\u02f1\21\76"+ "\1\227\1\230\1\u0255\1\0\1\76\1\0\7\76\2\u02f1"+ "\3\76\1\u02f1\1\76\1\u02f1\1\76\1\u02f1\2\76\1\u02f1"+ "\1\76\4\u02f1\2\76\1\u02f1\1\76\1\u02f1\15\76\1\u02c0"+ "\3\76\1\u02c0\21\76\1\227\1\230\1\u0255\1\0\1\76"+ "\1\0\25\76\1\u02c0\1\76\2\u02c0\17\76\4\235\1\236"+ "\4\235\3\0\13\235\1\0\3\235\1\76\53\235\1\232"+ "\3\u02f2\3\232\1\u02f2\20\232\1\356\15\232\2\u02f2\3\232"+ "\1\u02f2\1\232\1\u02f2\1\232\1\u02f2\2\232\1\u02f2\1\232"+ "\4\u02f2\2\232\1\u02f2\1\232\1\u02f2\12\232\11\u02c6\2\u02f3"+ "\1\u02f4\13\u02c6\1\u02f3\57\u02c6\11\256\2\125\1\126\13\256"+ "\1\125\4\256\1\u02f5\52\256\11\u02ca\3\0\13\u02ca\1\0"+ "\60\u02ca\3\u02cb\1\u02ca\3\u02cb\1\u02f6\3\0\2\u0294\6\u02ca"+ "\3\u02cb\1\u02f7\7\u02ca\32\u02cb\1\u02ca\3\u02cb\6\u02ca\1\u02cb"+ "\4\u02ca\3\u02cc\1\u02ca\3\u02cc\1\u02ca\3\0\10\u02ca\3\u02cc"+ "\1\147\7\u02ca\32\u02cc\1\u02ca\3\u02cc\6\u02ca\1\u02cc\3\u02ca"+ "\13\u02cd\1\0\73\u02cd\1\0\3\u02ce\1\0\4\u02ce\3\0"+ "\2\u02ce\2\0\1\u02ce\1\u02f8\6\u02ce\7\0\32\u02ce\1\0"+ "\3\u02ce\6\0\1\u02ce\4\0\1\u02ce\1\u02f9\1\u02ce\1\0"+ "\2\u02f9\1\u02ce\1\u02cf\3\0\2\u02ce\2\0\1\u02ce\1\u02f8"+ "\2\u02ce\1\u02f9\1\u02ce\1\u02cf\1\u02ce\7\0\25\u02f9\4\u02ce"+ "\1\u02f9\1\0\3\u02f9\6\0\1\u02f9\4\0\3\u02d0\1\0"+ "\4\u02d0\3\0\2\u02d0\2\0\1\u02d0\1\u02fa\6\u02d0\7\0"+ "\32\u02d0\1\0\3\u02d0\6\0\1\u02d0\3\0\10\u029d\1\u02d1"+ "\3\0\2\u0268\10\u029d\1\u02d1\1\0\57\u029d\1\0\3\u02d2"+ "\1\0\3\u02d2\1\u02fb\3\0\2\u02fc\6\0\4\u02d2\7\0"+ "\32\u02d2\1\0\3\u02d2\6\0\1\u02d2\11\0\1\u02fd\151\0"+ "\1\u02fe\36\0\3\147\1\0\1\147\1\u02ff\1\147\14\0"+ "\4\147\7\0\32\147\1\0\3\147\6\0\1\147\4\0"+ "\3\147\1\0\3\147\14\0\4\147\7\0\12\147\1\u0300"+ "\17\147\1\0\3\147\6\0\1\147\13\0\1\u02d7\15\0"+ "\1\u02d7\60\0\2\u0301\1\u0302\2\u0301\2\u0302\1\u0301\1\u02d8"+ "\3\0\10\u0301\1\u0302\1\u0301\1\u02d8\1\0\7\u0301\25\u0302"+ "\4\u0301\1\u0302\1\u0301\3\u0302\6\u0301\1\u0302\4\u0301\1\u0303"+ "\1\u0302\1\u0303\1\u0301\2\u0302\1\u0303\1\u02d8\3\0\10\u0301"+ "\1\u0302\1\u0303\1\u02d9\1\147\7\u0301\25\u0302\4\u0303\1\u0302"+ "\1\u0301\3\u0302\6\u0301\1\u0302\3\u0301\11\u02da\3\0\13\u02da"+ "\1\0\60\u02da\3\u02db\1\u02da\3\u02db\1\u0304\3\0\1\u02a8"+ "\7\u02da\3\u02db\1\u0305\7\u02da\32\u02db\1\u02da\3\u02db\6\u02da"+ "\1\u02db\4\u02da\3\u02dc\1\u02da\3\u02dc\1\u02da\3\0\10\u02da"+ "\3\u02dc\1\147\7\u02da\32\u02dc\1\u02da\3\u02dc\6\u02da\1\u02dc"+ "\3\u02da\10\0\1\u0306\5\0\1\u02ae\7\0\1\u0306\61\0"+ "\3\u02de\1\0\4\u02de\3\0\2\u02de\2\0\1\u02de\1\u0307"+ "\6\u02de\7\0\32\u02de\1\0\3\u02de\6\0\1\u02de\4\0"+ "\1\u02b1\1\u0308\1\u02b1\1\0\2\u0308\1\u02b1\1\u02df\3\0"+ "\2\u02b1\2\0\1\u02b1\1\u02df\2\u02b1\1\u0308\1\u02b1\1\u02df"+ "\1\u02b1\7\0\25\u0308\4\u02b1\1\u0308\1\0\3\u0308\6\0"+ "\1\u0308\22\0\1\u0309\106\0\1\u030a\126\0\1\u030b\47\0"+ "\3\u012e\1\u0284\1\u016c\2\u012e\1\u0284\1\u012e\2\357\1\76"+ "\13\u012e\1\357\2\u012e\1\357\1\u024e\30\u012e\1\u0284\1\u012e"+ "\2\u0284\23\u012e\1\u030c\1\u012e\1\u030d\2\u012e\2\357\1\76"+ "\13\u012e\1\357\2\u012e\1\357\1\u024e\54\u012e\3\u030e\1\u016c"+ "\2\u012e\1\u030e\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e"+ "\1\357\1\u024e\12\u012e\2\u030e\3\u012e\1\u030e\1\u012e\1\u030e"+ "\1\u012e\1\u030e\2\u012e\1\u030e\1\u012e\4\u030e\2\u012e\1\u030e"+ "\1\u012e\1\u030e\15\u012e\1\u02e3\1\u016c\2\u012e\1\u02e3\1\u012e"+ "\2\357\1\76\13\u012e\1\357\2\u012e\1\357\1\u024e\30\u012e"+ "\1\u02e3\1\u012e\2\u02e3\17\u012e\4\357\1\u02e7\1\357\1\u02e8"+ "\4\357\1\76\15\357\1\u012d\1\u012e\1\u012f\1\233\1\357"+ "\1\233\51\357\3\u02e9\3\357\1\u02e9\3\357\1\76\15\357"+ "\1\u012d\1\u012e\1\u012f\1\233\1\357\1\233\7\357\2\u02e9"+ "\3\357\1\u02e9\1\357\1\u02e9\1\357\1\u02e9\2\357\1\u02e9"+ "\1\357\4\u02e9\2\357\1\u02e9\1\357\1\u02e9\13\357\3\u030f"+ "\3\357\1\u030f\3\357\1\76\15\357\1\u012d\1\u012e\1\u012f"+ "\1\233\1\357\1\233\7\357\2\u030f\3\357\1\u030f\1\357"+ "\1\u030f\1\357\1\u030f\2\357\1\u030f\1\357\4\u030f\2\357"+ "\1\u030f\1\357\1\u030f\12\357\1\u016b\3\u0218\3\u016b\1\u0218"+ "\1\u016b\2\u01a3\1\u01a4\13\u016b\1\u01a3\1\u01a5\15\u016b\2\u0218"+ "\3\u016b\1\u0218\1\u016b\1\u0218\1\u016b\1\u0218\2\u016b\1\u0218"+ "\1\u016b\4\u0218\2\u016b\1\u0218\1\u016b\1\u0218\12\u016b\3\230"+ "\1\u028d\1\234\2\230\1\u028d\1\230\3\0\13\230\1\0"+ "\2\230\1\76\1\u0254\30\230\1\u028d\1\230\2\u028d\23\230"+ "\1\u0310\1\230\1\u0311\2\230\3\0\13\230\1\0\2\230"+ "\1\76\1\u0254\54\230\3\u0312\1\234\2\230\1\u0312\1\230"+ "\3\0\13\230\1\0\2\230\1\76\1\u0254\12\230\2\u0312"+ "\3\230\1\u0312\1\230\1\u0312\1\230\1\u0312\2\230\1\u0312"+ "\1\230\4\u0312\2\230\1\u0312\1\230\1\u0312\15\230\1\u02eb"+ "\1\234\2\230\1\u02eb\1\230\3\0\13\230\1\0\2\230"+ "\1\76\1\u0254\30\230\1\u02eb\1\230\2\u02eb\17\230\4\76"+ "\1\u02ef\1\76\1\u02f0\22\76\1\227\1\230\1\231\1\0"+ "\1\76\1\0\51\76\3\u02f1\3\76\1\u02f1\21\76\1\227"+ "\1\230\1\231\1\0\1\76\1\0\7\76\2\u02f1\3\76"+ "\1\u02f1\1\76\1\u02f1\1\76\1\u02f1\2\76\1\u02f1\1\76"+ "\4\u02f1\2\76\1\u02f1\1\76\1\u02f1\13\76\3\u0313\3\76"+ "\1\u0313\21\76\1\227\1\230\1\231\1\0\1\76\1\0"+ "\7\76\2\u0313\3\76\1\u0313\1\76\1\u0313\1\76\1\u0313"+ "\2\76\1\u0313\1\76\4\u0313\2\76\1\u0313\1\76\1\u0313"+ "\12\76\1\232\3\u021f\3\232\1\u021f\20\232\1\356\15\232"+ "\2\u021f\3\232\1\u021f\1\232\1\u021f\1\232\1\u021f\2\232"+ "\1\u021f\1\232\4\u021f\2\232\1\u021f\1\232\1\u021f\12\232"+ "\11\u02f5\2\u0314\1\u0315\13\u02f5\1\u0314\57\u02f5\10\u02ca\1\u02f6"+ "\3\0\2\u0294\10\u02ca\1\u02f6\1\0\57\u02ca\1\0\3\u02f7"+ "\1\0\3\u02f7\1\u0316\3\0\2\u0317\6\0\4\u02f7\7\0"+ "\32\u02f7\1\0\3\u02f7\6\0\1\u02f7\4\0\1\u02ce\1\u02f9"+ "\1\u02ce\1\0\2\u02f9\1\u02ce\1\u02f8\3\0\2\u02ce\1\u01f8"+ "\1\0\1\u02ce\1\u02f8\2\u02ce\1\u02f9\1\u02ce\1\u02f8\1\u02ce"+ "\7\0\25\u02f9\4\u02ce\1\u02f9\1\0\3\u02f9\6\0\1\u02f9"+ "\4\0\3\u02f9\1\0\3\u02f9\1\u0318\3\0\1\u02cf\1\u02ce"+ "\1\u01f8\1\0\1\u02ce\1\u02f8\2\u02ce\4\u02f9\7\0\32\u02f9"+ "\1\0\3\u02f9\6\0\1\u02f9\4\0\3\u02d0\1\0\3\u02d0"+ "\1\u02fa\3\0\2\u02d0\2\0\1\u02d0\1\u02fa\4\u02d0\1\u02fa"+ "\1\u02d0\7\0\32\u02d0\1\0\3\u02d0\6\0\1\u02d0\13\0"+ "\1\u02fb\3\0\2\u02fc\10\0\1\u02fb\62\0\1\u02d2\2\0"+ "\2\u02d2\1\0\1\u02fc\13\0\1\u02d2\1\0\1\u02fc\10\0"+ "\25\u02d2\4\0\1\u02d2\1\0\3\u02d2\6\0\1\u02d2\51\0"+ "\1\u0319\114\0\1\u031a\33\0\3\147\1\0\3\147\14\0"+ "\4\147\7\0\7\147\1\u031b\22\147\1\0\3\147\6\0"+ "\1\147\4\0\3\147\1\0\3\147\14\0\4\147\7\0"+ "\15\147\1\u031c\14\147\1\0\3\147\6\0\1\147\3\0"+ "\11\u0301\3\0\13\u0301\1\0\60\u0301\3\u0302\1\u0301\3\u0302"+ "\1\u031d\3\0\2\u02d8\6\u0301\3\u0302\1\u031e\7\u0301\32\u0302"+ "\1\u0301\3\u0302\6\u0301\1\u0302\4\u0301\3\u0303\1\u0301\3\u0303"+ "\1\u0301\3\0\10\u0301\3\u0303\1\147\7\u0301\32\u0303\1\u0301"+ "\3\u0303\6\u0301\1\u0303\3\u0301\10\u02da\1\u0304\3\0\1\u02a8"+ "\11\u02da\1\u0304\1\0\57\u02da\1\0\3\u0305\1\0\3\u0305"+ "\1\u031f\3\0\1\u0320\7\0\4\u0305\7\0\32\u0305\1\0"+ "\3\u0305\6\0\1\u0305\4\0\3\u02de\1\0\3\u02de\1\u0321"+ "\3\0\2\u02de\1\u02ae\1\0\1\u02de\1\u0307\4\u02de\1\u0321"+ "\1\u02de\7\0\32\u02de\1\0\3\u02de\6\0\1\u02de\4\0"+ "\3\u0308\1\0\3\u0308\1\u0322\3\0\1\u02df\1\u02b1\1\u02ae"+ "\1\0\1\u0323\1\u02df\2\u02b1\2\u0308\1\u0324\1\u0308\7\0"+ "\32\u0308\1\0\3\u0308\6\0\1\u0308\44\0\1\u0325\45\0"+ "\4\u012e\1\u0326\1\u012e\1\u030d\2\u012e\2\357\1\76\13\u012e"+ "\1\357\60\u012e\3\u030e\1\u016c\2\u012e\1\u030e\1\u012e\2\357"+ "\1\76\13\u012e\1\357\2\u012e\1\357\13\u012e\2\u030e\3\u012e"+ "\1\u030e\1\u012e\1\u030e\1\u012e\1\u030e\2\u012e\1\u030e\1\u012e"+ "\4\u030e\2\u012e\1\u030e\1\u012e\1\u030e\13\u012e\3\u0327\1\u016c"+ "\2\u012e\1\u0327\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e"+ "\1\357\13\u012e\2\u0327\3\u012e\1\u0327\1\u012e\1\u0327\1\u012e"+ "\1\u0327\2\u012e\1\u0327\1\u012e\4\u0327\2\u012e\1\u0327\1\u012e"+ "\1\u0327\12\u012e\1\357\3\u0328\3\357\1\u0328\3\357\1\76"+ "\15\357\1\u012d\1\u012e\1\u012f\1\233\1\357\1\233\7\357"+ "\2\u0328\3\357\1\u0328\1\357\1\u0328\1\357\1\u0328\2\357"+ "\1\u0328\1\357\4\u0328\2\357\1\u0328\1\357\1\u0328\12\357"+ "\4\230\1\u0329\1\230\1\u0311\2\230\3\0\13\230\1\0"+ "\60\230\3\u0312\1\234\2\230\1\u0312\1\230\3\0\13\230"+ "\1\0\2\230\1\76\13\230\2\u0312\3\230\1\u0312\1\230"+ "\1\u0312\1\230\1\u0312\2\230\1\u0312\1\230\4\u0312\2\230"+ "\1\u0312\1\230\1\u0312\13\230\3\u032a\1\234\2\230\1\u032a"+ "\1\230\3\0\13\230\1\0\2\230\1\76\13\230\2\u032a"+ "\3\230\1\u032a\1\230\1\u032a\1\230\1\u032a\2\230\1\u032a"+ "\1\230\4\u032a\2\230\1\u032a\1\230\1\u032a\12\230\1\76"+ "\3\u032b\3\76\1\u032b\21\76\1\227\1\230\1\231\1\0"+ "\1\76\1\0\7\76\2\u032b\3\76\1\u032b\1\76\1\u032b"+ "\1\76\1\u032b\2\76\1\u032b\1\76\4\u032b\2\76\1\u032b"+ "\1\76\1\u032b\12\76\10\0\1\u0316\3\0\2\u0317\10\0"+ "\1\u0316\62\0\1\u02f7\2\0\2\u02f7\1\0\1\u0317\13\0"+ "\1\u02f7\1\0\1\u0317\10\0\25\u02f7\4\0\1\u02f7\1\0"+ "\3\u02f7\6\0\1\u02f7\4\0\3\u02ce\1\0\3\u02ce\1\u0318"+ "\3\0\1\u02cf\1\u02ce\1\u01f8\1\0\1\u02ce\1\u02f8\4\u02ce"+ "\1\u0318\1\u02ce\7\0\32\u02ce\1\0\3\u02ce\6\0\1\u02ce"+ "\51\0\1\u032c\41\0\3\147\1\0\3\147\14\0\4\147"+ "\7\0\7\147\1\u032d\22\147\1\0\3\147\6\0\1\147"+ "\3\0\10\u0301\1\u031d\3\0\2\u02d8\10\u0301\1\u031d\1\0"+ "\57\u0301\1\0\3\u031e\1\0\3\u031e\1\u032e\3\0\2\u032f"+ "\6\0\4\u031e\7\0\32\u031e\1\0\3\u031e\6\0\1\u031e"+ "\13\0\1\u031f\3\0\1\u0320\11\0\1\u031f\62\0\1\u0305"+ "\2\0\2\u0305\1\0\1\u0320\13\0\1\u0305\1\0\1\u0320"+ "\10\0\25\u0305\4\0\1\u0305\1\0\3\u0305\6\0\1\u0305"+ "\4\0\3\u02b1\1\0\3\u02b1\1\u0322\3\0\1\u02df\1\u02b1"+ "\1\u02ae\1\0\1\u0323\1\u02df\4\u02b1\1\u0322\1\u02b1\7\0"+ "\32\u02b1\1\0\3\u02b1\6\0\1\u02b1\4\0\3\u0330\1\0"+ "\4\u0330\3\0\2\u0330\2\0\1\u0330\1\u0331\6\u0330\7\0"+ "\32\u0330\1\0\3\u0330\6\0\1\u0330\110\0\1\u0332\1\0"+ "\4\u012e\1\u030c\1\u012e\1\u030d\2\u012e\2\357\1\76\13\u012e"+ "\1\357\2\u012e\1\357\55\u012e\3\u0333\1\u016c\2\u012e\1\u0333"+ "\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e\1\357\13\u012e"+ "\2\u0333\3\u012e\1\u0333\1\u012e\1\u0333\1\u012e\1\u0333\2\u012e"+ "\1\u0333\1\u012e\4\u0333\2\u012e\1\u0333\1\u012e\1\u0333\12\u012e"+ "\1\357\3\u0282\3\357\1\u0282\3\357\1\76\15\357\1\u012d"+ "\1\u012e\1\u012f\1\233\1\357\1\233\7\357\2\u0282\3\357"+ "\1\u0282\1\357\1\u0282\1\357\1\u0282\2\357\1\u0282\1\357"+ "\4\u0282\2\357\1\u0282\1\357\1\u0282\12\357\4\230\1\u0310"+ "\1\230\1\u0311\2\230\3\0\13\230\1\0\2\230\1\76"+ "\55\230\3\u0334\1\234\2\230\1\u0334\1\230\3\0\13\230"+ "\1\0\2\230\1\76\13\230\2\u0334\3\230\1\u0334\1\230"+ "\1\u0334\1\230\1\u0334\2\230\1\u0334\1\230\4\u0334\2\230"+ "\1\u0334\1\230\1\u0334\12\230\1\76\3\u028b\3\76\1\u028b"+ "\21\76\1\227\1\230\1\231\1\0\1\76\1\0\7\76"+ "\2\u028b\3\76\1\u028b\1\76\1\u028b\1\76\1\u028b\2\76"+ "\1\u028b\1\76\4\u028b\2\76\1\u028b\1\76\1\u028b\12\76"+ "\10\0\1\u032e\3\0\2\u032f\10\0\1\u032e\62\0\1\u031e"+ "\2\0\2\u031e\1\0\1\u032f\13\0\1\u031e\1\0\1\u032f"+ "\10\0\25\u031e\4\0\1\u031e\1\0\3\u031e\6\0\1\u031e"+ "\4\0\3\u0330\1\0\4\u0330\3\0\2\u0330\2\0\1\u0330"+ "\1\u0335\6\u0330\7\0\32\u0330\1\0\3\u0330\6\0\1\u0330"+ "\4\0\1\u0330\1\u0336\1\u0330\1\0\2\u0336\1\u0330\1\u0331"+ "\3\0\2\u0330\2\0\1\u0330\1\u0335\2\u0330\1\u0336\1\u0330"+ "\1\u0331\1\u0330\7\0\25\u0336\4\u0330\1\u0336\1\0\3\u0336"+ "\6\0\1\u0336\22\0\1\u0337\67\0\1\u012e\3\u0284\1\u016c"+ "\2\u012e\1\u0284\1\u012e\2\357\1\76\13\u012e\1\357\2\u012e"+ "\1\357\13\u012e\2\u0284\3\u012e\1\u0284\1\u012e\1\u0284\1\u012e"+ "\1\u0284\2\u012e\1\u0284\1\u012e\4\u0284\2\u012e\1\u0284\1\u012e"+ "\1\u0284\12\u012e\1\230\3\u028d\1\234\2\230\1\u028d\1\230"+ "\3\0\13\230\1\0\2\230\1\76\13\230\2\u028d\3\230"+ "\1\u028d\1\230\1\u028d\1\230\1\u028d\2\230\1\u028d\1\230"+ "\4\u028d\2\230\1\u028d\1\230\1\u028d\12\230\1\0\1\u0330"+ "\1\u0336\1\u0330\1\0\2\u0336\1\u0330\1\u0338\3\0\2\u0330"+ "\1\u02ae\1\0\1\u0330\1\u0335\2\u0330\1\u0336\1\u0330\1\u0338"+ "\1\u0330\7\0\25\u0336\4\u0330\1\u0336\1\0\3\u0336\6\0"+ "\1\u0336\4\0\3\u0336\1\0\3\u0336\1\u0339\3\0\1\u0331"+ "\1\u0330\1\u02ae\1\0\1\u0330\1\u0335\2\u0330\2\u0336\1\u033a"+ "\1\u0336\7\0\32\u0336\1\0\3\u0336\6\0\1\u0336\4\0"+ "\3\u0330\1\0\3\u0330\1\u0339\3\0\1\u0331\1\u0330\1\u02ae"+ "\1\0\1\u0330\1\u0335\4\u0330\1\u0339\1\u0330\7\0\32\u0330"+ "\1\0\3\u0330\6\0\1\u0330\3\0"; private static int [] zzUnpackTrans() { int [] result = new int[48777]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; } private static int zzUnpackTrans(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int count = packed.charAt(i++); int value = packed.charAt(i++); value--; do result[j++] = value; while (--count > 0); } return j; } /* error codes */ private static final int ZZ_UNKNOWN_ERROR = 0; private static final int ZZ_NO_MATCH = 1; private static final int ZZ_PUSHBACK_2BIG = 2; /* error messages for the codes above */ private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input", "Error: pushback value was too large" }; /** * ZZ_ATTRIBUTE[aState] contains the attributes of state aState */ private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = "\2\1\15\0\2\1\1\11\4\1\1\11\2\1\1\11"+ "\15\1\2\11\4\1\1\11\2\1\2\11\1\1\1\11"+ "\2\1\7\11\4\1\2\11\1\1\1\11\3\1\1\11"+ "\1\1\1\11\3\1\2\11\1\1\1\11\3\1\1\11"+ "\1\1\1\11\1\1\1\11\1\1\1\11\2\1\3\0"+ "\2\11\1\0\1\11\1\0\2\1\1\0\15\1\3\0"+ "\1\11\3\1\2\0\1\11\1\1\1\11\4\1\5\11"+ "\1\0\1\1\2\0\1\11\1\1\3\0\1\11\1\1"+ "\10\0\1\11\4\1\6\11\3\0\1\11\5\0\1\1"+ "\1\0\1\1\1\11\1\1\1\11\2\1\1\11\35\1"+ "\3\0\6\1\1\0\1\11\1\0\1\1\6\0\2\11"+ "\1\0\1\1\4\0\1\11\1\0\1\1\1\11\1\1"+ "\1\11\3\0\42\1\3\0\2\1\1\0\1\11\1\1"+ "\14\0\1\11\1\1\3\0\46\1\2\11\1\0\2\1"+ "\1\0\1\1\13\0\1\1\5\0\11\1\1\0\31\1"+ "\1\11\2\1\7\0\2\1\10\0\1\1\1\11\3\0"+ "\12\1\1\0\17\1\1\0\7\1\6\0\2\1\3\0"+ "\1\1\6\0\1\1\1\11\4\0\13\1\4\0\22\1"+ "\1\11\6\0\1\1\6\0\1\1\13\0\10\1\3\0"+ "\15\1\1\0\2\1\1\0\5\1\4\0\2\11\2\1"+ "\4\0\2\1\7\0\1\1\1\11\1\0\12\1\1\0"+ "\1\1\1\0\7\1\2\0\1\1\1\0\2\1\2\0"+ "\1\11\2\0\1\1\2\0\2\1\4\0\1\1\2\0"+ "\2\1\7\0\4\1\1\0\1\1\1\0\1\1\1\0"+ "\3\1\2\0\11\1\1\0\1\1\3\0\1\1\1\0"+ "\2\1\3\0\1\11\1\0\4\1\3\0\4\1\3\0"+ "\1\1\1\11\1\0\4\1\3\0\2\1\2\0\10\1"+ "\12\0\3\1\5\0\3\1\1\0\1\1\1\11\1\0"+ "\6\1\3\0\10\1\2\0\2\11\4\0\1\1\3\0"+ "\2\1\1\11\1\1\1\0\1\1\1\11\1\0\5\1"+ "\1\0\2\1\1\0\1\1\3\0\1\1\2\0\1\1"+ "\1\11\2\1\10\0\1\11\3\1"; private static int [] zzUnpackAttribute() { int [] result = new int[826]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; } private static int zzUnpackAttribute(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int count = packed.charAt(i++); int value = packed.charAt(i++); do result[j++] = value; while (--count > 0); } return j; } /** the input device */ private java.io.Reader zzReader; /** the current state of the DFA */ private int zzState; /** the current lexical state */ private int zzLexicalState = YYINITIAL; /** this buffer contains the current text to be matched and is the source of the yytext() string */ private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; /** the textposition at the last accepting state */ private int zzMarkedPos; /** the current text position in the buffer */ private int zzCurrentPos; /** startRead marks the beginning of the yytext() string in the buffer */ private int zzStartRead; /** endRead marks the last character in the buffer, that has been read from input */ private int zzEndRead; /** number of newlines encountered up to the start of the matched text */ private int yyline; /** the number of characters up to the start of the matched text */ private int yychar; /** * the number of characters from the last newline up to the start of the * matched text */ private int yycolumn; /** * zzAtBOL == true <=> the scanner is currently at the beginning of a line */ private boolean zzAtBOL = true; /** zzAtEOF == true <=> the scanner is at the EOF */ private boolean zzAtEOF; /** denotes if the user-EOF-code has already been executed */ private boolean zzEOFDone; /** the stack of open (nested) input streams to read from */ private java.util.Stack zzStreams = new java.util.Stack(); /** * inner class used to store info for nested * input streams */ private static final class ZzFlexStreamInfo { java.io.Reader zzReader; int zzEndRead; int zzStartRead; int zzCurrentPos; int zzMarkedPos; int yyline; int yycolumn; char [] zzBuffer; boolean zzAtEOF; boolean zzEOFDone; /** sets all values stored in this class */ ZzFlexStreamInfo(java.io.Reader zzReader, int zzEndRead, int zzStartRead, int zzCurrentPos, int zzMarkedPos, char [] zzBuffer, boolean zzAtEOF, int yyline, int yycolumn) { this.zzReader = zzReader; this.zzEndRead = zzEndRead; this.zzStartRead = zzStartRead; this.zzCurrentPos = zzCurrentPos; this.zzMarkedPos = zzMarkedPos; this.zzBuffer = zzBuffer; this.zzAtEOF = zzAtEOF; this.zzEOFDone = zzEOFDone; this.yyline = yyline; this.yycolumn = yycolumn; } } /* user code: */ int balance = 0; int commentbalance = 0; int action_line = 0; int bufferSize = 16384; File file; Stack files = new Stack(); StringBuffer userCode = new StringBuffer(); String classCode; String initCode; String initThrow; String eofCode; String eofThrow; String lexThrow; String eofVal; String scanErrorException; String cupSymbol = "sym"; StringBuffer actionText = new StringBuffer(); StringBuffer string = new StringBuffer(); boolean charCount; boolean lineCount; boolean columnCount; boolean cupCompatible; boolean cupDebug; boolean isInteger; boolean isIntWrap; boolean isYYEOF; boolean notUnix; boolean isPublic; boolean isFinal; boolean isAbstract; boolean bolUsed; boolean standalone; boolean debugOption; boolean useRowMap = Options.gen_method == Options.PACK || Options.gen_method == Options.TABLE; boolean packed = Options.gen_method == Options.PACK; boolean caseless; boolean inclusive_states; boolean eofclose; String isImplementing; String isExtending; String className = "Yylex"; String functionName; String tokenType; String visibility = "public"; Vector /* String */ ctorArgs = new Vector(); Vector /* String */ ctorTypes = new Vector(); LexicalStates states = new LexicalStates(); Vector actions = new Vector(); private int nextState; boolean macroDefinition; Timer t = new Timer(); public int currentLine() { return yyline; } public void setFile(File file) { this.file = file; } private Symbol symbol(int type, Object value) { return new Symbol(type, yyline, yycolumn, value); } private Symbol symbol(int type) { return new Symbol(type, yyline, yycolumn); } // updates line and column count to the beginning of the first // non whitespace character in yytext, but leaves yyline+yycolumn // untouched private Symbol symbol_countUpdate(int type, Object value) { int lc = yyline; int cc = yycolumn; String text = yytext(); for (int i=0; i < text.length(); i++) { char c = text.charAt(i); if (c != '\n' && c != '\r' && c != ' ' && c != '\t' ) return new Symbol(type, lc, cc, value); if (c == '\n') { lc++; cc = 0; } else cc++; } return new Symbol(type, yyline, yycolumn, value); } private String makeMacroIdent() { String matched = yytext().trim(); return matched.substring(1, matched.length()-1).trim(); } public static String conc(Object a, Object b) { if (a == null && b == null) return null; if (a == null) return b.toString(); if (b == null) return a.toString(); return a.toString()+b.toString(); } public static String concExc(Object a, Object b) { if (a == null && b == null) return null; if (a == null) return b.toString(); if (b == null) return a.toString(); return a.toString()+", "+b.toString(); } /** * Creates a new scanner * There is also a java.io.InputStream version of this constructor. * * @param in the java.io.Reader to read input from. */ public LexScan(java.io.Reader in) { states.insert("YYINITIAL", true); this.zzReader = in; } /** * Creates a new scanner. * There is also java.io.Reader version of this constructor. * * @param in the java.io.Inputstream to read input from. */ public LexScan(java.io.InputStream in) { this(new java.io.InputStreamReader(in)); } /** * Unpacks the compressed character translation table. * * @param packed the packed character translation table * @return the unpacked character translation table */ private static char [] zzUnpackCMap(String packed) { char [] map = new char[0x10000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ while (i < 1788) { int count = packed.charAt(i++); char value = packed.charAt(i++); do map[j++] = value; while (--count > 0); } return map; } /** * Refills the input buffer. * * @return false, iff there was new input. * * @exception java.io.IOException if any I/O-Error occurs */ private boolean zzRefill() throws java.io.IOException { /* first: make room (if you can) */ if (zzStartRead > 0) { System.arraycopy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead-zzStartRead); /* translate stored positions */ zzEndRead-= zzStartRead; zzCurrentPos-= zzStartRead; zzMarkedPos-= zzStartRead; zzStartRead = 0; } /* is the buffer big enough? */ if (zzCurrentPos >= zzBuffer.length) { /* if not: blow it up */ char newBuffer[] = new char[zzCurrentPos*2]; System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); zzBuffer = newBuffer; } /* finally: fill the buffer with new input */ int numRead = zzReader.read(zzBuffer, zzEndRead, zzBuffer.length-zzEndRead); if (numRead > 0) { zzEndRead+= numRead; return false; } // unlikely but not impossible: read 0 characters, but not at end of stream if (numRead == 0) { int c = zzReader.read(); if (c == -1) { return true; } else { zzBuffer[zzEndRead++] = (char) c; return false; } } // numRead < 0) return true; } /** * Closes the input stream. */ public final void yyclose() throws java.io.IOException { zzAtEOF = true; /* indicate end of file */ zzEndRead = zzStartRead; /* invalidate buffer */ if (zzReader != null) zzReader.close(); } /** * Stores the current input stream on a stack, and * reads from a new stream. Lexical state, line, * char, and column counting remain untouched. * * The current input stream can be restored with * yypopstream (usually in an <> action). * * @param reader the new input stream to read from * * @see #yypopStream() */ public final void yypushStream(java.io.Reader reader) { zzStreams.push( new ZzFlexStreamInfo(zzReader, zzEndRead, zzStartRead, zzCurrentPos, zzMarkedPos, zzBuffer, zzAtEOF, yyline, yycolumn) ); zzAtEOF = false; zzBuffer = new char[ZZ_BUFFERSIZE]; zzReader = reader; zzEndRead = zzStartRead = 0; zzCurrentPos = zzMarkedPos = 0; yyline = yycolumn = 0; } /** * Closes the current input stream and continues to * read from the one on top of the stream stack. * * @throws java.util.EmptyStackException * if there is no further stream to read from. * * @throws java.io.IOException * if there was an error in closing the stream. * * @see #yypushStream(java.io.Reader) */ public final void yypopStream() throws java.io.IOException { zzReader.close(); ZzFlexStreamInfo s = (ZzFlexStreamInfo) zzStreams.pop(); zzBuffer = s.zzBuffer; zzReader = s.zzReader; zzEndRead = s.zzEndRead; zzStartRead = s.zzStartRead; zzCurrentPos = s.zzCurrentPos; zzMarkedPos = s.zzMarkedPos ; zzAtEOF = s.zzAtEOF; zzEOFDone = s.zzEOFDone; yyline = s.yyline; yycolumn = s.yycolumn; } /** * Returns true iff there are still streams left * to read from on the stream stack. */ public final boolean yymoreStreams() { return !zzStreams.isEmpty(); } /** * Resets the scanner to read from a new input stream. * Does not close the old reader. * * All internal variables are reset, the old input stream * cannot be reused (internal buffer is discarded and lost). * Lexical state is set to ZZ_INITIAL. * * @param reader the new input stream * * @see #yypushStream(java.io.Reader) * @see #yypopStream() */ public final void yyreset(java.io.Reader reader) { zzReader = reader; zzAtBOL = true; zzAtEOF = false; zzEOFDone = false; zzEndRead = zzStartRead = 0; zzCurrentPos = zzMarkedPos = 0; yyline = yychar = yycolumn = 0; zzLexicalState = YYINITIAL; } /** * Returns the current lexical state. */ public final int yystate() { return zzLexicalState; } /** * Enters a new lexical state * * @param newState the new lexical state */ public final void yybegin(int newState) { zzLexicalState = newState; } /** * Returns the text matched by the current regular expression. */ public final String yytext() { return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); } /** * Returns the character at position pos from the * matched text. * * It is equivalent to yytext().charAt(pos), but faster * * @param pos the position of the character to fetch. * A value from 0 to yylength()-1. * * @return the character at position pos */ public final char yycharat(int pos) { return zzBuffer[zzStartRead+pos]; } /** * Returns the length of the matched text region. */ public final int yylength() { return zzMarkedPos-zzStartRead; } /** * Reports an error that occured while scanning. * * In a wellformed scanner (no or only correct usage of * yypushback(int) and a match-all fallback rule) this method * will only be called with things that "Can't Possibly Happen". * If this method is called, something is seriously wrong * (e.g. a JFlex bug producing a faulty scanner etc.). * * Usual syntax/scanner level error handling should be done * in error fallback rules. * * @param errorCode the code of the errormessage to display */ private void zzScanError(int errorCode) { String message; try { message = ZZ_ERROR_MSG[errorCode]; } catch (ArrayIndexOutOfBoundsException e) { message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; } throw new Error(message); } /** * Pushes the specified amount of characters back into the input stream. * * They will be read again by then next call of the scanning method * * @param number the number of characters to be read again. * This number must not be greater than yylength()! */ public void yypushback(int number) { if ( number > yylength() ) zzScanError(ZZ_PUSHBACK_2BIG); zzMarkedPos -= number; } /** * Contains user EOF-code, which will be executed exactly once, * when the end of file is reached */ private void zzDoEOF() throws java.io.IOException { if (!zzEOFDone) { zzEOFDone = true; yyclose(); } } /** * Resumes scanning until the next regular expression is matched, * the end of input is encountered or an I/O-Error occurs. * * @return the next token * @exception java.io.IOException if any I/O-Error occurs */ public Symbol next_token() throws java.io.IOException { int zzInput; int zzAction; int [] zzTransL = ZZ_TRANS; int [] zzRowMapL = ZZ_ROWMAP; int [] zzAttrL = ZZ_ATTRIBUTE; while (true) { // cached fields: int zzCurrentPosL; int zzMarkedPosL = zzMarkedPos; int zzEndReadL = zzEndRead; char [] zzBufferL = zzBuffer; char [] zzCMapL = ZZ_CMAP; boolean zzR = false; for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL; zzCurrentPosL++) { switch (zzBufferL[zzCurrentPosL]) { case '\u000B': case '\u000C': case '\u0085': case '\u2028': case '\u2029': yyline++; yycolumn = 0; zzR = false; break; case '\r': yyline++; yycolumn = 0; zzR = true; break; case '\n': if (zzR) zzR = false; else { yyline++; yycolumn = 0; } break; default: zzR = false; yycolumn++; } } if (zzR) { // peek one character ahead if it is \n (if we have counted one line too much) boolean zzPeek; if (zzMarkedPosL < zzEndReadL) zzPeek = zzBufferL[zzMarkedPosL] == '\n'; else if (zzAtEOF) zzPeek = false; else { boolean eof = zzRefill(); zzEndReadL = zzEndRead; zzMarkedPosL = zzMarkedPos; zzBufferL = zzBuffer; if (eof) zzPeek = false; else zzPeek = zzBufferL[zzMarkedPosL] == '\n'; } if (zzPeek) yyline--; } if (zzMarkedPosL > zzStartRead) { switch (zzBufferL[zzMarkedPosL-1]) { case '\n': case '\u000B': case '\u000C': case '\u0085': case '\u2028': case '\u2029': zzAtBOL = true; break; case '\r': if (zzMarkedPosL < zzEndReadL) zzAtBOL = zzBufferL[zzMarkedPosL] != '\n'; else if (zzAtEOF) zzAtBOL = false; else { boolean eof = zzRefill(); zzMarkedPosL = zzMarkedPos; zzEndReadL = zzEndRead; zzBufferL = zzBuffer; if (eof) zzAtBOL = false; else zzAtBOL = zzBufferL[zzMarkedPosL] != '\n'; } break; default: zzAtBOL = false; } } zzAction = -1; zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; if (zzAtBOL) zzState = ZZ_LEXSTATE[zzLexicalState+1]; else zzState = ZZ_LEXSTATE[zzLexicalState]; zzForAction: { while (true) { if (zzCurrentPosL < zzEndReadL) zzInput = zzBufferL[zzCurrentPosL++]; else if (zzAtEOF) { zzInput = YYEOF; break zzForAction; } else { // store back cached positions zzCurrentPos = zzCurrentPosL; zzMarkedPos = zzMarkedPosL; boolean eof = zzRefill(); // get translated positions and possibly new buffer zzCurrentPosL = zzCurrentPos; zzMarkedPosL = zzMarkedPos; zzBufferL = zzBuffer; zzEndReadL = zzEndRead; if (eof) { zzInput = YYEOF; break zzForAction; } else { zzInput = zzBufferL[zzCurrentPosL++]; } } int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; if (zzNext == -1) break zzForAction; zzState = zzNext; int zzAttributes = zzAttrL[zzState]; if ( (zzAttributes & 1) == 1 ) { zzAction = zzState; zzMarkedPosL = zzCurrentPosL; if ( (zzAttributes & 8) == 8 ) break zzForAction; } } } // store back cached position zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { case 118: { cupDebug = true; } case 147: break; case 122: { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(EOFRULE); } case 148: break; case 113: { File f = new File(yytext().substring(9).trim()); if ( !f.canRead() ) throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); // check for cycle if (files.search(f) > 0) throw new ScannerException(file,ErrorMessages.FILE_CYCLE, yyline); try { yypushStream( new FileReader(f) ); files.push(file); file = f; Out.println("Including \""+file+"\""); } catch (FileNotFoundException e) { throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline); } } case 149: break; case 88: { return symbol(FULL); } case 150: break; case 92: { return symbol(ASCII); } case 151: break; case 21: { string.setLength(0); nextState = REGEXP; yybegin(STRING_CONTENT); } case 152: break; case 142: { return symbol(UPPERCLASS); } case 153: break; case 34: { return symbol(COMMA); } case 154: break; case 61: { return symbol(CHAR,new Character('\f')); } case 155: break; case 111: { throw new ScannerException(file,ErrorMessages.NO_BUFFER_SIZE, yyline); } case 156: break; case 104: { throw new ScannerException(file,ErrorMessages.EOF_WO_ACTION); } case 157: break; case 143: { return symbol(LOWERCLASS); } case 158: break; case 72: { string.append('\r'); } case 159: break; case 43: { return symbol(HAT); } case 160: break; case 48: { yybegin(MACROS); ctorArgs.add(yytext().trim()); } case 161: break; case 1: { return symbol(EOF); } case 162: break; case 59: { return symbol(CHAR,new Character('\t')); } case 163: break; case 145: { eofclose = false; } case 164: break; case 103: { isPublic = true; } case 165: break; case 112: { actionText.setLength(0); yybegin(JAVA_CODE); Symbol s = symbol_countUpdate(EOFRULE, null); action_line = s.left+1; return s; } case 166: break; case 40: { balance++; return symbol(OPENCLASS); } case 167: break; case 11: { yybegin(REGEXP); } case 168: break; case 12: { yybegin(STATES); return symbol_countUpdate(LESSTHAN, null); } case 169: break; case 68: { string.append( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8)); } case 170: break; case 62: { return symbol(CHAR,new Character('\b')); } case 171: break; case 39: { throw new ScannerException(file,ErrorMessages.EOL_IN_CHARCLASS,yyline,yycolumn); } case 172: break; case 5: { states.insert(yytext(),inclusive_states); } case 173: break; case 70: { string.append('\n'); } case 174: break; case 10: { yybegin(REGEXP); return symbol(EQUALS); } case 175: break; case 146: { return symbol(JLETTERDIGITCLASS); } case 176: break; case 19: { return symbol(STAR); } case 177: break; case 42: { string.setLength(0); nextState = CHARCLASS; yybegin(STRING_CONTENT); } case 178: break; case 116: { isAbstract = true; } case 179: break; case 75: { yypushback(1); yycolumn--; return symbol(CHAR, new Character(yytext().charAt(0))); } case 180: break; case 114: { lexThrow = concExc(lexThrow,yytext().substring(8).trim()); } case 181: break; case 109: { throw new ScannerException(file,ErrorMessages.QUIL_CUPSYM, yyline); } case 182: break; case 93: { packed = false; useRowMap = true; } case 183: break; case 87: { cupCompatible = true; isImplementing = concExc(isImplementing, "java_cup.runtime.Scanner"); if (functionName == null) functionName = "next_token"; if (tokenType == null) tokenType = "java_cup.runtime.Symbol"; if (eofVal == null) eofVal = "return new java_cup.runtime.Symbol("+cupSymbol+".EOF);"; if (!Options.jlex) eofclose = true; } case 184: break; case 30: { bolUsed = true; return symbol(HAT); } case 185: break; case 4: { throw new ScannerException(file,ErrorMessages.UNEXPECTED_CHAR, yyline, yycolumn); } case 186: break; case 35: { yybegin(REGEXP); return symbol(MORETHAN); } case 187: break; case 100: { packed = false; useRowMap = false; } case 188: break; case 119: { caseless = true; } case 189: break; case 38: { yybegin(nextState); return symbol(STRING, string.toString()); } case 190: break; case 76: { return symbol(REPEAT, new Integer(yytext().substring(1).trim())); } case 191: break; case 13: { return symbol_countUpdate(RBRACE, null); } case 192: break; case 139: { scanErrorException = yytext().substring(11).trim(); } case 193: break; case 141: { lexThrow = concExc(lexThrow,yytext().substring(12).trim()); } case 194: break; case 84: { return symbol(MACROUSE, yytext().substring(1,yytext().length()-1)); } case 195: break; case 2: { /* ignore */ } case 196: break; case 127: { throw new ScannerException(file,ErrorMessages.QUIL_INITTHROW, yyline); } case 197: break; case 47: { throw new ScannerException(file,ErrorMessages.CTOR_ARG,yyline,yycolumn); } case 198: break; case 108: { throw new ScannerException(file,ErrorMessages.QUIL_THROW, yyline); } case 199: break; case 31: { actionText.append(yytext()); } case 200: break; case 83: { string.append( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16)); } case 201: break; case 107: { notUnix = true; } case 202: break; case 89: { lineCount = true; } case 203: break; case 136: { initThrow = concExc(initThrow,yytext().substring(11).trim()); } case 204: break; case 131: { standalone = true; isInteger = true; } case 205: break; case 52: { nextState = MACROS; yybegin(COMMENT); } case 206: break; case 25: { return symbol(TILDE); } case 207: break; case 37: { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); } case 208: break; case 110: { className = yytext().substring(7).trim(); } case 209: break; case 9: { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); } case 210: break; case 55: { nextState = REGEXPSTART; yybegin(COMMENT); } case 211: break; case 16: { return symbol(POINT); } case 212: break; case 73: { string.append('\f'); } case 213: break; case 65: { yybegin(REPEATEXP); return symbol(REPEAT, new Integer(yytext().trim().substring(1).trim())); } case 214: break; case 80: { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(2,yytext().length()), 16))); } case 215: break; case 140: { initThrow = concExc(initThrow,string); yybegin(MACROS); } case 216: break; case 135: { eofThrow = concExc(eofThrow,string); yybegin(MACROS); } case 217: break; case 71: { string.append('\t'); } case 218: break; case 67: { string.append(yytext().charAt(1)); } case 219: break; case 7: { yybegin(MACROS); } case 220: break; case 98: { eofCode = conc(eofCode,string); yybegin(MACROS); } case 221: break; case 56: { return symbol(CHAR, new Character(yytext().charAt(1))); } case 222: break; case 28: { return symbol(PLUS); } case 223: break; case 101: { columnCount = true; } case 224: break; case 124: { isExtending = yytext().substring(9).trim(); } case 225: break; case 123: { eofVal = string.toString(); yybegin(MACROS); } case 226: break; case 36: { string.append(yytext()); } case 227: break; case 97: { return symbol(UNICODE); } case 228: break; case 74: { string.append('\b'); } case 229: break; case 24: { return symbol(BANG); } case 230: break; case 132: { throw new ScannerException(file,ErrorMessages.QUIL_SCANERROR, yyline); } case 231: break; case 91: { packed = true; useRowMap = true; } case 232: break; case 26: { return symbol(OPENBRACKET); } case 233: break; case 60: { return symbol(CHAR,new Character('\r')); } case 234: break; case 94: { isFinal = true; } case 235: break; case 27: { return symbol(CLOSEBRACKET); } case 236: break; case 86: { isInteger = true; } case 237: break; case 20: { return symbol(LOOKAHEAD); } case 238: break; case 51: { commentbalance++; } case 239: break; case 49: { t.start(); yybegin(MACROS); macroDefinition = true; return symbol(USERCODE,userCode); } case 240: break; case 44: { return symbol(DASH); } case 241: break; case 138: { throw new ScannerException(file,ErrorMessages.QUIL_YYLEXTHROW, yyline); } case 242: break; case 96: { debugOption = true; } case 243: break; case 64: { nextState = REGEXP; yybegin(COMMENT); } case 244: break; case 32: { if (balance > 0) { balance--; actionText.append('}'); } else { yybegin(REGEXPSTART); Action a = new Action(actionText.toString(), action_line); actions.addElement(a); return symbol(ACTION, a); } } case 245: break; case 29: { return symbol(DOLLAR); } case 246: break; case 17: { yybegin(CHARCLASS); return symbol(OPENCLASS); } case 247: break; case 105: { initCode = conc(initCode,string); yybegin(MACROS); } case 248: break; case 69: { string.append('\"'); } case 249: break; case 137: { isImplementing = concExc(isImplementing, yytext().substring(12).trim()); } case 250: break; case 126: { return symbol(LETTERCLASS); } case 251: break; case 102: { isInteger = true; if (eofVal == null) eofVal = "return 0;"; eofclose = true; } case 252: break; case 41: { if (balance > 0) balance--; else yybegin(REGEXP); return symbol(CLOSECLASS); } case 253: break; case 77: { string.setLength(0); yybegin(COPY); } case 254: break; case 8: { return symbol(IDENT, yytext()); } case 255: break; case 121: { return symbol(DIGITCLASS); } case 256: break; case 144: { lexThrow = concExc(lexThrow,string); yybegin(MACROS); } case 257: break; case 53: { Out.warning(ErrorMessages.NOT_AT_BOL, yyline); yypushback(1); } case 258: break; case 23: { return symbol(BAR); } case 259: break; case 45: { throw new ScannerException(file,ErrorMessages.UNEXPECTED_NL, yyline, yycolumn); } case 260: break; case 117: { cupSymbol = yytext().substring(8).trim(); if (cupCompatible) Out.warning(ErrorMessages.CUPSYM_AFTER_CUP, yyline); } case 261: break; case 58: { return symbol(CHAR,new Character('\n')); } case 262: break; case 95: { isYYEOF = true; } case 263: break; case 14: { return symbol(CHAR, new Character(yytext().charAt(0))); } case 264: break; case 99: { tokenType = yytext().substring(6).trim(); } case 265: break; case 33: { balance++; actionText.append('{'); } case 266: break; case 128: { eofThrow = concExc(eofThrow,yytext().substring(10).trim()); } case 267: break; case 63: { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(REGEXPEND); } case 268: break; case 81: { return symbol_countUpdate(MACROUSE, makeMacroIdent()); } case 269: break; case 15: { if (macroDefinition) { yybegin(MACROS); } return symbol(REGEXPEND); } case 270: break; case 125: { throw new ScannerException(file,ErrorMessages.QUIL_EOFTHROW, yyline); } case 271: break; case 90: { charCount = true; } case 272: break; case 130: { visibility = "private"; Skeleton.makePrivate(); } case 273: break; case 134: { return symbol(JLETTERCLASS); } case 274: break; case 22: { yybegin(REGEXPSTART); return symbol(LBRACE); } case 275: break; case 115: { eofclose = true; } case 276: break; case 66: // lookahead expression with fixed lookahead length yypushback(1); { if (macroDefinition) { yybegin(EATWSPNL); return symbol(BAR); } else { yybegin(REGEXPSTART); return symbol(NOACTION); } } case 277: break; case 82: // lookahead expression with fixed lookahead length yypushback(2); { if (macroDefinition) { yybegin(EATWSPNL); return symbol(BAR); } else { yybegin(REGEXPSTART); return symbol(NOACTION); } } case 278: break; case 46: { yybegin(REGEXP); return symbol(RBRACE); } case 279: break; case 78: { inclusive_states = false; yybegin(STATELIST); } case 280: break; case 120: { bufferSize = Integer.parseInt(yytext().substring(8).trim()); } case 281: break; case 106: { isIntWrap = true; } case 282: break; case 133: { yybegin(CTOR_ARG); ctorTypes.add(yytext().substring(8).trim()); } case 283: break; case 3: { userCode.append(yytext()); } case 284: break; case 54: { macroDefinition = false; yybegin(REGEXPSTART); return symbol(DELIMITER); } case 285: break; case 129: { functionName = yytext().substring(10).trim(); } case 286: break; case 85: { classCode = conc(classCode,string); yybegin(MACROS); } case 287: break; case 18: { return symbol(QUESTION); } case 288: break; case 50: { if (commentbalance > 0) commentbalance--; else yybegin(nextState); } case 289: break; case 79: { inclusive_states = true; yybegin(STATELIST); } case 290: break; case 57: { return symbol(CHAR, new Character( (char) Integer.parseInt(yytext().substring(1,yytext().length()), 8))); } case 291: break; case 6: { } case 292: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; zzDoEOF(); switch (zzLexicalState) { case STRING_CONTENT: { throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); } case 827: break; case MACROS: { if ( yymoreStreams() ) { file = (File) files.pop(); yypopStream(); } else throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); } case 828: break; case STATELIST: { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); } case 829: break; case CHARCLASS: { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); } case 830: break; case JAVA_CODE: { throw new ScannerException(file,ErrorMessages.EOF_IN_ACTION, action_line-1); } case 831: break; case REPEATEXP: { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); } case 832: break; case COMMENT: { throw new ScannerException(file,ErrorMessages.EOF_IN_COMMENT); } case 833: break; case STATES: { throw new ScannerException(file,ErrorMessages.EOF_IN_STATES); } case 834: break; case COPY: { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); } case 835: break; default: { if ( yymoreStreams() ) { file = (File) files.pop(); yypopStream(); } else return symbol(EOF); } } } else { zzScanError(ZZ_NO_MATCH); } } } } /** * Converts an int token code into the name of the * token by reflection on the cup symbol class/interface sym * * This code was contributed by Karl Meissner */ private String getTokenName(int token) { try { java.lang.reflect.Field [] classFields = sym.class.getFields(); for (int i = 0; i < classFields.length; i++) { if (classFields[i].getInt(null) == token) { return classFields[i].getName(); } } } catch (Exception e) { e.printStackTrace(System.err); } return "UNKNOWN TOKEN"; } /** * Same as next_token but also prints the token to standard out * for debugging. * * This code was contributed by Karl Meissner */ public Symbol debug_next_token() throws java.io.IOException { java_cup.runtime.Symbol s = next_token(); System.out.println( "line:" + (yyline+1) + " col:" + (yycolumn+1) + " --"+ yytext() + "--" + getTokenName(s.sym) + "--"); return s; } /** * Runs the scanner on input files. * * This main method is the debugging routine for the scanner. * It prints debugging information about each returned token to * System.out until the end of file is reached, or an error occured. * * @param argv the command line, contains the filenames to run * the scanner on. */ public static void main(String argv[]) { if (argv.length == 0) { System.out.println("Usage : java LexScan "); } else { for (int i = 0; i < argv.length; i++) { LexScan scanner = null; try { scanner = new LexScan( new java.io.FileReader(argv[i]) ); while ( !scanner.zzAtEOF ) scanner.debug_next_token(); } catch (java.io.FileNotFoundException e) { System.out.println("File not found : \""+argv[i]+"\""); } catch (java.io.IOException e) { System.out.println("IO error scanning file \""+argv[i]+"\""); System.out.println(e); } catch (Exception e) { System.out.println("Unexpected exception:"); e.printStackTrace(); } } } } } jflex-1.4.3/src/JFlex/MacroException.java0000644000175000017500000000403311141010522016676 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * This Exception is used in the macro expander to report cycles or * undefined macro usages. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class MacroException extends RuntimeException { /** * Creates a new MacroException without message */ public MacroException() { } /** * Creates a new MacroException with the specified message * * @param message the error description presented to the user. */ public MacroException(String message) { super(message); } } jflex-1.4.3/src/JFlex/Macros.java0000644000175000017500000001513711141010522015211 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.util.*; /** * Symbol table and expander for macros. * * Maps macros to their (expanded) definitions, detects cycles and * unused macros. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class Macros { /** Maps names of macros to their definition */ private Hashtable macros; /** Maps names of macros to their "used" flag */ private Hashtable used; /** * Creates a new macro expander. */ public Macros() { macros = new Hashtable(); used = new Hashtable(); } /** * Stores a new macro and its definition. * * @param name the name of the new macro * @param definition the definition of the new macro * * @return true, iff the macro name has not been * stored before. */ public boolean insert(String name, RegExp definition) { if (Options.DEBUG) Out.debug("inserting macro "+name+" with definition :"+Out.NL+definition); //$NON-NLS-1$ //$NON-NLS-2$ used.put(name, Boolean.FALSE); return macros.put(name,definition) == null; } /** * Marks a makro as used. * * @return true, iff the macro name has been * stored before. */ public boolean markUsed(String name) { return used.put(name, Boolean.TRUE) != null; } /** * Tests if a macro has been used. * * @return true, iff the macro has been used in * a regular expression. */ public boolean isUsed(String name) { return ((Boolean)used.get(name)).booleanValue(); } /** * Returns all unused macros. * * @return the enumeration of macro names that have not been used. */ public Enumeration unused() { Vector unUsed = new Vector(); Enumeration names = used.keys(); while ( names.hasMoreElements() ) { String name = (String) names.nextElement(); Boolean isUsed = (Boolean) used.get( name ); if ( !isUsed.booleanValue() ) unUsed.addElement(name); } return unUsed.elements(); } /** * Fetches the definition of the macro with the specified name, *

* The definition will either be the same as stored (expand() not * called), or an equivalent one, that doesn't contain any macro * usages (expand() called before). * * @param name the name of the macro * * @return the definition of the macro, null if * no macro with the specified name has been stored. * * @see JFlex.Macros#expand */ public RegExp getDefinition(String name) { return (RegExp) macros.get(name); } /** * Expands all stored macros, so that getDefinition always returns * a defintion that doesn't contain any macro usages. * * @throws MacroException if there is a cycle in the macro usage graph. */ public void expand() throws MacroException { Enumeration names; names = macros.keys(); while ( names.hasMoreElements() ) { String name = (String) names.nextElement(); if ( isUsed(name) ) macros.put(name, expandMacro(name, getDefinition(name))); // this put doesn't get a new key, so only a new value // is set for the key "name" (without changing the enumeration // "names"!) } } /** * Expands the specified macro by replacing each macro usage * with the stored definition. * * @param name the name of the macro to expand (for detecting cycles) * @param definition the definition of the macro to expand * * @return the expanded definition of the macro. * * @throws MacroException when an error (such as a cyclic definition) * occurs during expansion */ private RegExp expandMacro(String name, RegExp definition) throws MacroException { // Out.print("checking macro "+name); // Out.print("definition is "+definition); switch ( definition.type ) { case sym.BAR: case sym.CONCAT: RegExp2 binary = (RegExp2) definition; binary.r1 = expandMacro(name, binary.r1); binary.r2 = expandMacro(name, binary.r2); return definition; case sym.STAR: case sym.PLUS: case sym.QUESTION: case sym.BANG: case sym.TILDE: RegExp1 unary = (RegExp1) definition; unary.content = expandMacro(name, (RegExp) unary.content); return definition; case sym.MACROUSE: String usename = (String) ((RegExp1) definition).content; if ( name.equals(usename) ) throw new MacroException(ErrorMessages.get(ErrorMessages.MACRO_CYCLE, name)); RegExp usedef = getDefinition(usename); if ( usedef == null ) throw new MacroException(ErrorMessages.get(ErrorMessages.MACRO_DEF_MISSING, usename, name)); markUsed(usename); return expandMacro(name, usedef); case sym.STRING: case sym.STRING_I: case sym.CHAR: case sym.CHAR_I: case sym.CCLASS: case sym.CCLASSNOT: return definition; default: throw new MacroException("unknown expression type "+definition.type+" in macro expansion"); //$NON-NLS-1$ //$NON-NLS-2$ } } } jflex-1.4.3/src/JFlex/Main.java0000644000175000017500000002522411141010522014647 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.io.*; import java.util.*; import JFlex.gui.MainFrame; /** * This is the main class of JFlex controlling the scanner generation process. * It is responsible for parsing the commandline, getting input files, * starting up the GUI if necessary, etc. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class Main { /** JFlex version */ final public static String version = "1.4.3"; //$NON-NLS-1$ /** * Generates a scanner for the specified input file. * * @param inputFile a file containing a lexical specification * to generate a scanner for. */ public static void generate(File inputFile) { Out.resetCounters(); Timer totalTime = new Timer(); Timer time = new Timer(); LexScan scanner = null; LexParse parser = null; FileReader inputReader = null; totalTime.start(); try { Out.println(ErrorMessages.READING, inputFile.toString()); inputReader = new FileReader(inputFile); scanner = new LexScan(inputReader); scanner.setFile(inputFile); parser = new LexParse(scanner); } catch (FileNotFoundException e) { Out.error(ErrorMessages.CANNOT_OPEN, inputFile.toString()); throw new GeneratorException(); } try { NFA nfa = (NFA) parser.parse().value; Out.checkErrors(); if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.NFA_IS)+ Out.NL+nfa+Out.NL); if (Options.dot) nfa.writeDot(Emitter.normalize("nfa.dot", null)); //$NON-NLS-1$ Out.println(ErrorMessages.NFA_STATES, nfa.numStates); time.start(); DFA dfa = nfa.getDFA(); time.stop(); Out.time(ErrorMessages.DFA_TOOK, time); dfa.checkActions(scanner, parser); nfa = null; if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.DFA_IS)+ Out.NL+dfa+Out.NL); if (Options.dot) dfa.writeDot(Emitter.normalize("dfa-big.dot", null)); //$NON-NLS-1$ Out.checkErrors(); time.start(); dfa.minimize(); time.stop(); Out.time(ErrorMessages.MIN_TOOK, time); if (Options.dump) Out.dump(ErrorMessages.get(ErrorMessages.MIN_DFA_IS)+ Out.NL+dfa); if (Options.dot) dfa.writeDot(Emitter.normalize("dfa-min.dot", null)); //$NON-NLS-1$ time.start(); Emitter e = new Emitter(inputFile, parser, dfa); e.emit(); time.stop(); Out.time(ErrorMessages.WRITE_TOOK, time); totalTime.stop(); Out.time(ErrorMessages.TOTAL_TIME, totalTime); } catch (ScannerException e) { Out.error(e.file, e.message, e.line, e.column); throw new GeneratorException(); } catch (MacroException e) { Out.error(e.getMessage()); throw new GeneratorException(); } catch (IOException e) { Out.error(ErrorMessages.IO_ERROR, e.toString()); throw new GeneratorException(); } catch (OutOfMemoryError e) { Out.error(ErrorMessages.OUT_OF_MEMORY); throw new GeneratorException(); } catch (GeneratorException e) { throw new GeneratorException(); } catch (Exception e) { e.printStackTrace(); throw new GeneratorException(); } } public static Vector parseOptions(String argv[]) throws SilentExit { Vector files = new Vector(); for (int i = 0; i < argv.length; i++) { if ( argv[i].equals("-d") || argv[i].equals("--outdir") ) { //$NON-NLS-1$ //$NON-NLS-2$ if ( ++i >= argv.length ) { Out.error(ErrorMessages.NO_DIRECTORY); throw new GeneratorException(); } Options.setDir(argv[i]); continue; } if ( argv[i].equals("--skel") || argv[i].equals("-skel") ) { //$NON-NLS-1$ //$NON-NLS-2$ if ( ++i >= argv.length ) { Out.error(ErrorMessages.NO_SKEL_FILE); throw new GeneratorException(); } Options.setSkeleton(new File(argv[i])); continue; } if ( argv[i].equals("-jlex") || argv[i].equals("--jlex") ) { //$NON-NLS-1$ //$NON-NLS-2$ Options.jlex = true; continue; } if ( argv[i].equals("-v") || argv[i].equals("--verbose") || argv[i].equals("-verbose") ) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ Options.verbose = true; Options.progress = true; continue; } if ( argv[i].equals("-q") || argv[i].equals("--quiet") || argv[i].equals("-quiet") ) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ Options.verbose = false; Options.progress = false; continue; } if ( argv[i].equals("--dump") || argv[i].equals("-dump") ) { //$NON-NLS-1$ //$NON-NLS-2$ Options.dump = true; continue; } if ( argv[i].equals("--time") || argv[i].equals("-time") ) { //$NON-NLS-1$ //$NON-NLS-2$ Options.time = true; continue; } if ( argv[i].equals("--version") || argv[i].equals("-version") ) { //$NON-NLS-1$ //$NON-NLS-2$ Out.println(ErrorMessages.THIS_IS_JFLEX, version); throw new SilentExit(); } if ( argv[i].equals("--dot") || argv[i].equals("-dot") ) { //$NON-NLS-1$ //$NON-NLS-2$ Options.dot = true; continue; } if ( argv[i].equals("--help") || argv[i].equals("-h") || argv[i].equals("/h") ) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ printUsage(); throw new SilentExit(); } if ( argv[i].equals("--info") || argv[i].equals("-info") ) { //$NON-NLS-1$ //$NON-NLS-2$ Out.printSystemInfo(); throw new SilentExit(); } if ( argv[i].equals("--nomin") || argv[i].equals("-nomin") ) { //$NON-NLS-1$ //$NON-NLS-2$ Options.no_minimize = true; continue; } if ( argv[i].equals("--pack") || argv[i].equals("-pack") ) { //$NON-NLS-1$ //$NON-NLS-2$ Options.gen_method = Options.PACK; continue; } if ( argv[i].equals("--table") || argv[i].equals("-table") ) { //$NON-NLS-1$ //$NON-NLS-2$ Options.gen_method = Options.TABLE; continue; } if ( argv[i].equals("--switch") || argv[i].equals("-switch") ) { //$NON-NLS-1$ //$NON-NLS-2$ Options.gen_method = Options.SWITCH; continue; } if ( argv[i].equals("--nobak") || argv[i].equals("-nobak") ) { //$NON-NLS-1$ //$NON-NLS-2$ Options.no_backup = true; continue; } if ( argv[i].startsWith("-") ) { //$NON-NLS-1$ Out.error(ErrorMessages.UNKNOWN_COMMANDLINE, argv[i]); printUsage(); throw new SilentExit(); } // if argv[i] is not an option, try to read it as file File f = new File(argv[i]); if ( f.isFile() && f.canRead() ) files.addElement(f); else { Out.error("Sorry, couldn't open \""+f+"\""); //$NON-NLS-2$ throw new GeneratorException(); } } return files; } public static void printUsage() { Out.println(""); //$NON-NLS-1$ Out.println("Usage: jflex "); Out.println(""); Out.println("Where can be one or more of"); Out.println("-d write generated file to "); Out.println("--skel use external skeleton "); Out.println("--switch"); Out.println("--table"); Out.println("--pack set default code generation method"); Out.println("--jlex strict JLex compatibility"); Out.println("--nomin skip minimization step"); Out.println("--nobak don't create backup files"); Out.println("--dump display transition tables"); Out.println("--dot write graphviz .dot files for the generated automata (alpha)"); Out.println("--verbose"); Out.println("-v display generation progress messages (default)"); Out.println("--quiet"); Out.println("-q display errors only"); Out.println("--time display generation time statistics"); Out.println("--version print the version number of this copy of jflex"); Out.println("--info print system + JDK information"); Out.println("--help"); Out.println("-h print this message"); Out.println(""); Out.println(ErrorMessages.THIS_IS_JFLEX, version); Out.println("Have a nice day!"); } public static void generate(String argv[]) throws SilentExit { Vector files = parseOptions(argv); if (files.size() > 0) { for (int i = 0; i < files.size(); i++) generate((File) files.elementAt(i)); } else { new MainFrame(); } } /** * Starts the generation process with the files in argv or * pops up a window to choose a file, when argv doesn't have * any file entries. * * @param argv the commandline. */ public static void main(String argv[]) { try { generate(argv); } catch (GeneratorException e) { Out.statistics(); System.exit(1); } catch (SilentExit e) { System.exit(1); } } } jflex-1.4.3/src/JFlex/Messages.properties0000644000175000017500000000774211140775017017032 0ustar moonmoonUNTERMINATED_STR = Unterminated string at end of line. EOF_WO_ACTION = <> must be followed by an action. EOF_SINGLERULE = <> can only be used as a single rule. UNKNOWN_OPTION = Unkown %-option UNEXPECTED_CHAR = Unexpected character UNEXPECTED_NL = Unexpected character LEXSTATE_UNDECL = Lexical state has not been declared. STATE_IDENT_EXP = State identifier expected. REPEAT_ZERO = Illegal repeat statement. At least one operand must be > 0 REPEAT_GREATER = Illegal repeat statement. First operand must not be greater than second one. REGEXP_EXPECTED = Regular expression expected. MACRO_UNDECL = Macro has not been declared. CHARSET_2_SMALL = Character set is too small for this class. CS2SMALL_STRING = Character set is too small for a charactor of this string. CS2SMALL_CHAR = Character set is too small for this character. CHARCLASS_MACRO = Macros in character classes are not supported. UNKNOWN_SYNTAX = Syntax error. SYNTAX_ERROR = Syntax error. NOT_AT_BOL = %-option is not at the beginning of the line. NO_MATCHING_BR = Didn't find matching bracket EOF_IN_ACTION = Unexpected end of file in action code EOF_IN_COMMENT = Unexpected end of file in comment EOF_IN_STRING = Unexpected end of file in string EOF_IN_MACROS = Unexpected end of file in macros EOF_IN_STATES = Unexpected end of file in state list EOF_IN_REGEXP = Unexpected end of file in regular expression UNEXPECTED_EOF = Unexpected end of file (maybe missing "*/" ")" "]" or "}") NO_LEX_SPEC = This seems not to be a lexical specification (first %% is missing) NO_LAST_ACTION = Last action in the specification must not be "|" NO_DIRECTORY = No directory for -d option NO_SKEL_FILE = No file provided for -skel option WRONG_SKELETON = Incorrect skeleton file (wrong number of sections). OUT_OF_MEMORY = JFlex has run out of memory. Please try increasing the maximum JVM heap size QUIL_INITTHROW = %initthrow needs a list of (qualified) identifiers QUIL_EOFTHROW = %eofthrow needs a list of (qualified) identifiers QUIL_YYLEXTHROW = %yylexthrow needs a list of (qualified) identifiers ZERO_STATES = Your scanner has zero states. Very funny. NO_BUFFER_SIZE = %buffer expects the size of the scanner buffer as decimal number NOT_READABLE = Could not open file. FILE_CYCLE = Cyclic file inclusion. FILE_WRITE = Error writing to file QUIL_SCANERROR = %scannerror needs a (qualified) identifier NEVER_MATCH = Rule can never be matched: QUIL_THROW = %throws needs a list of (qualified) identifiers EOL_IN_CHARCLASS = Unexpected newline in character class (closing "]" is missing) QUIL_CUPSYM = %cupsym needs a (qualified) identifier CUPSYM_AFTER_CUP = %cupsym should be used before %cup ALREADY_RUNNING = The generator is already running CANNOT_READ_SKEL = Cannot read skeleton file "{0}". READING_SKEL = Reading skeleton file "{0}". SKEL_IO_ERROR = IO problem reading skeleton file. SKEL_IO_ERROR_DEFAULT = IO problem reading default skeleton file. READING=Reading "{0}" CANNOT_OPEN=Sorry, couldn''t find the file "{0}". NFA_IS=NFA is NFA_STATES={0} states in NFA DFA_TOOK=DFA construction took {0} DFA_IS=DFA is MIN_TOOK=Minimization took {0} MIN_DFA_IS=Miniminal DFA is WRITE_TOOK=Writing took {0} TOTAL_TIME=Overall scanner generation time: {0} IO_ERROR=An I/O-Error occured: {0} THIS_IS_JFLEX=This is JFlex {0} UNKNOWN_COMMANDLINE=Error: unknown option "{0}". MACRO_CYCLE=Macro {0} contains a cycle. MACRO_DEF_MISSING=Found no definition for macro "{0}" while expanding "{1}" PARSING_TOOK=Parsing took {0} NFA_TOOK=NFA construction took {0} LOOKAHEAD_NEEDS_ACTION="|" action cannot be used with lookahead expressions EMPTY_MATCH = Lookahead expression must have match with at least length 1. CTOR_ARG = Expected an identifier for constructor argument name. CTOR_DEBUG = Emitting default constructor without parameters and init code for debug/standalone. INT_AND_TYPE = Scanner can't have int and reference return type at the same time. jflex-1.4.3/src/JFlex/NFA.java0000644000175000017500000007466111141010522014400 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.util.*; import java.io.*; /** * NFA representation in JFlex. * * Contains algorithms RegExp -> NFA and NFA -> DFA. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class NFA { /** table[current_state][next_char] is the set of states that can be reached /* from current_state with an input next_char */ StateSet [][] table; /** epsilon[current_state] is the set of states that can be reached /* from current_state via epsilon edges */ StateSet [] epsilon; /** isFinal[state] == true <=> state is a final state of the NFA */ boolean [] isFinal; /** action[current_state]: the action associated with the state /* current_state (null, if there is no action for the state) */ Action [] action; /** the number of states in this NFA */ int numStates; /** the current maximum number of input characters */ int numInput; /** the number of lexical States. Lexical states have the indices /* 0..numLexStates-1 in the transition table */ int numLexStates; /** estimated size of the NFA (before actual construction) */ int estSize = 256; Macros macros; CharClasses classes; LexScan scanner; RegExps regExps; // will be reused by several methods (avoids excessive object creation) private static StateSetEnumerator states = new StateSetEnumerator(); private static StateSet tempStateSet = new StateSet(); public NFA(int numInput, int estSize) { this.numInput = numInput; this.estSize = estSize; numStates = 0; epsilon = new StateSet [estSize]; action = new Action [estSize]; isFinal = new boolean [estSize]; table = new StateSet [estSize][numInput]; } /** * Construct new NFA. * * Assumes that lookahead cases and numbers are already resolved in RegExps. * @see RegExps#checkLookAheads() */ public NFA(int numInput, LexScan scanner, RegExps regExps, Macros macros, CharClasses classes) { this(numInput, regExps.NFASize(macros)+2*scanner.states.number()); this.scanner = scanner; this.regExps = regExps; this.macros = macros; this.classes = classes; numLexStates = scanner.states.number(); // ensureCapacity assumes correctly set up numStates. int new_num = numEntryStates(); ensureCapacity(new_num); numStates = new_num; } public int numEntryStates() { return 2*(numLexStates+regExps.gen_look_count); } /** * Add a standalone rule that has minimum priority, fires a transition * on all single input characters and has a "print yytext" action. */ public void addStandaloneRule() { int start = numStates; int end = numStates+1; for (int c = 0; c < classes.getNumClasses(); c++) addTransition(start, c, end); for (int i = 0; i < numLexStates*2; i++) addEpsilonTransition(i, start); action[end] = new Action("System.out.print(yytext());", Integer.MAX_VALUE); isFinal[end] = true; } /** * Add a regexp to this NFA. * * @param regExpNum the number of the regexp to add. */ public void addRegExp(int regExpNum) { if (Options.DEBUG) Out.debug("Adding nfa for regexp "+regExpNum+" :"+Out.NL+regExps.getRegExp(regExpNum)); IntPair nfa = insertNFA( regExps.getRegExp(regExpNum) ); Enumeration lexStates = regExps.getStates(regExpNum).elements(); if ( !lexStates.hasMoreElements() ) lexStates = scanner.states.getInclusiveStates(); while ( lexStates.hasMoreElements() ) { int stateNum = ((Integer)lexStates.nextElement()).intValue(); if ( !regExps.isBOL(regExpNum) ) addEpsilonTransition(2*stateNum, nfa.start); addEpsilonTransition(2*stateNum+1, nfa.start); } if ( regExps.getLookAhead(regExpNum) != null ) { Action a = regExps.getAction(regExpNum); if (a.lookAhead() == Action.FINITE_CHOICE) { insertLookAheadChoices(nfa.end, a, regExps.getLookAhead(regExpNum)); // remove the original action from the collection: it will never // be matched directly, only its copies will. scanner.actions.remove(a); } else { RegExp r1 = regExps.getRegExp(regExpNum); RegExp r2 = regExps.getLookAhead(regExpNum); IntPair look = insertNFA(r2); addEpsilonTransition(nfa.end, look.start); action[look.end] = a; isFinal[look.end] = true; if (a.lookAhead() == Action.GENERAL_LOOK) { // base forward pass IntPair forward = insertNFA(r1); // lookahead backward pass IntPair backward = insertNFA(r2.rev(macros)); isFinal[forward.end] = true; action[forward.end] = new Action(Action.FORWARD_ACTION); isFinal[backward.end] = true; action[backward.end] = new Action(Action.BACKWARD_ACTION); int entry = 2*(regExps.getLookEntry(regExpNum) + numLexStates); addEpsilonTransition(entry, forward.start); addEpsilonTransition(entry+1, backward.start); a.setEntryState(entry); } } } else { action[nfa.end] = regExps.getAction(regExpNum); isFinal[nfa.end] = true; } } /** * Insert NFAs for the (finitely many) fixed length lookahead choices. * * @param lookAhead a lookahead of which isFiniteChoice is true * @param baseEnd the end state of the base expression NFA * @param a the action of the expression * * @see SemCheck#isFiniteChoice(RegExp) */ private void insertLookAheadChoices(int baseEnd, Action a, RegExp lookAhead) { if (lookAhead.type == sym.BAR) { RegExp2 r = (RegExp2) lookAhead; insertLookAheadChoices(baseEnd, a, r.r1); insertLookAheadChoices(baseEnd, a, r.r2); } else if (lookAhead.type == sym.MACROUSE) { RegExp1 r = (RegExp1) lookAhead; insertLookAheadChoices(baseEnd, a, macros.getDefinition((String) r.content)); } else { int len = SemCheck.length(lookAhead); if (len >= 0) { // termination case IntPair look = insertNFA(lookAhead); addEpsilonTransition(baseEnd, look.start); Action x = a.copyChoice(len); action[look.end] = x; isFinal[look.end] = true; // add new copy to the collection of known actions such that // it can be checked for the NEVER_MATCH warning. scanner.actions.add(x); } else { // should never happen throw new Error("When inserting lookahead expression: unkown expression type "+lookAhead.type+" in "+lookAhead); //$NON-NLS-1$ //$NON-NLS-2$ } } } /** * Make sure the NFA can contain at least newNumStates states. * * @param newNumStates the minimu number of states. */ private void ensureCapacity(int newNumStates) { int oldLength = epsilon.length; if ( newNumStates < oldLength ) return; int newStatesLength = Math.max(oldLength*2, newNumStates); boolean [] newFinal = new boolean [newStatesLength]; boolean [] newIsPush = new boolean [newStatesLength]; Action [] newAction = new Action [newStatesLength]; StateSet [] [] newTable = new StateSet [newStatesLength] [numInput]; StateSet [] newEpsilon = new StateSet [newStatesLength]; System.arraycopy(isFinal,0,newFinal,0,numStates); System.arraycopy(action,0,newAction,0,numStates); System.arraycopy(epsilon,0,newEpsilon,0,numStates); System.arraycopy(table,0,newTable,0,numStates); isFinal = newFinal; action = newAction; epsilon = newEpsilon; table = newTable; } public void addTransition(int start, int input, int dest) { Out.debug("Adding transition ("+start+", "+input+", "+dest+")"); int maxS = Math.max(start,dest)+1; ensureCapacity( maxS ); if (maxS > numStates) numStates = maxS; if ( table[start][input] != null ) table[start][input].addState(dest); else table[start][input] = new StateSet(estSize,dest); } public void addEpsilonTransition(int start, int dest) { int max = Math.max(start,dest)+1; ensureCapacity( max ); if (max > numStates) numStates = max; if (epsilon[start] != null) epsilon[start].addState(dest); else epsilon[start] = new StateSet(estSize,dest); } /** * Returns true, iff the specified set of states * contains a final state. * * @param set the set of states that is tested for final states. */ private boolean containsFinal(StateSet set) { states.reset(set); while ( states.hasMoreElements() ) if ( isFinal[states.nextElement()] ) return true; return false; } /** * Returns true, iff the specified set of states * contains a pushback-state. * * @param set the set of states that is tested for pushback-states. private boolean containsPushback(StateSet set) { states.reset(set); while ( states.hasMoreElements() ) if ( isPushback[states.nextElement()] ) return true; return false; } */ /** * Returns the action with highest priority in the specified * set of states. * * @param set the set of states for which to determine the action */ private Action getAction(StateSet set) { states.reset(set); Action maxAction = null; Out.debug("Determining action of : "+set); while ( states.hasMoreElements() ) { Action currentAction = action[ states.nextElement() ]; if ( currentAction != null ) { if (maxAction == null) maxAction = currentAction; else maxAction = maxAction.getHigherPriority(currentAction); } } return maxAction; } /** * Calculates the epsilon closure for a specified set of states. * * The epsilon closure for set a is the set of states that can be reached * by epsilon edges from a. * * @param set the set of states to calculate the epsilon closure for * * @return the epsilon closure of the specified set of states * in this NFA */ private StateSet closure(int startState) { // Out.debug("Calculating closure of "+set); StateSet notvisited = tempStateSet; StateSet closure = new StateSet(numStates,startState); notvisited.clear(); notvisited.addState(startState); while ( notvisited.containsElements() ) { // Out.debug("closure is now "+closure); // Out.debug("notvisited is "+notvisited); int state = notvisited.getAndRemoveElement(); // Out.debug("removed element "+state+" of "+notvisited); // Out.debug("epsilon[states] = "+epsilon[state]); notvisited.add(closure.complement(epsilon[state])); closure.add(epsilon[state]); } // Out.debug("Closure is : "+closure); return closure; } /** * Returns the epsilon closure of a set of states */ private StateSet closure(StateSet startStates) { StateSet result = new StateSet(numStates); if (startStates != null) { states.reset(startStates); while (states.hasMoreElements()) result.add( closure(states.nextElement()) ); } return result; } private void epsilonFill() { for (int i = 0; i < numStates; i++) { epsilon[i] = closure(i); } } /** * Calculates the set of states that can be reached from another * set of states start with an specified input * character input * * @param start the set of states to start from * @param input the input character for which to search the next states * * @return the set of states that are reached from start * via input */ private StateSet DFAEdge(StateSet start, char input) { // Out.debug("Calculating DFAEdge for state set "+start+" and input '"+input+"'"); tempStateSet.clear(); states.reset(start); while ( states.hasMoreElements() ) tempStateSet.add( table[states.nextElement()][input] ); StateSet result = new StateSet(tempStateSet); states.reset(tempStateSet); while ( states.hasMoreElements() ) result.add( epsilon[states.nextElement()] ); // Out.debug("DFAEdge is : "+result); return result; } /** * Returns an DFA that accepts the same language as this NFA. * This DFA is usually not minimal. */ public DFA getDFA() { Hashtable dfaStates = new Hashtable(numStates); Vector dfaVector = new Vector(numStates); DFA dfa = new DFA(numEntryStates(), numInput, numLexStates); int numDFAStates = 0; int currentDFAState = 0; Out.println("Converting NFA to DFA : "); epsilonFill(); StateSet currentState, newState; // create the initial states of the DFA for ( int i = 0; i < numEntryStates(); i++ ) { newState = epsilon[i]; dfaStates.put(newState, new Integer(numDFAStates)); dfaVector.addElement(newState); dfa.setEntryState( i, numDFAStates ); dfa.setFinal( numDFAStates, containsFinal(newState) ); dfa.setAction( numDFAStates, getAction(newState) ); numDFAStates++; } numDFAStates--; if (Options.DEBUG) Out.debug("DFA start states are :"+Out.NL+dfaStates+Out.NL+Out.NL+"ordered :"+Out.NL+dfaVector); currentDFAState = 0; StateSet tempStateSet = NFA.tempStateSet; StateSetEnumerator states = NFA.states; // will be reused newState = new StateSet(numStates); while ( currentDFAState <= numDFAStates ) { currentState = (StateSet) dfaVector.elementAt(currentDFAState); for (char input = 0; input < numInput; input++) { // newState = DFAEdge(currentState, input); // inlining DFAEdge for performance: // Out.debug("Calculating DFAEdge for state set "+currentState+" and input '"+input+"'"); tempStateSet.clear(); states.reset(currentState); while ( states.hasMoreElements() ) tempStateSet.add( table[states.nextElement()][input] ); newState.copy(tempStateSet); states.reset(tempStateSet); while ( states.hasMoreElements() ) newState.add( epsilon[states.nextElement()] ); // Out.debug("DFAEdge is : "+newState); if ( newState.containsElements() ) { // Out.debug("DFAEdge for input "+(int)input+" and state set "+currentState+" is "+newState); // Out.debug("Looking for state set "+newState); Integer nextDFAState = (Integer) dfaStates.get(newState); if ( nextDFAState != null ) { // Out.debug("FOUND!"); dfa.addTransition(currentDFAState, input, nextDFAState.intValue()); } else { if (Options.progress) Out.print("."); // Out.debug("NOT FOUND!"); // Out.debug("Table was "+dfaStates); numDFAStates++; // make a new copy of newState to store in dfaStates StateSet storeState = new StateSet(newState); dfaStates.put(storeState, new Integer(numDFAStates)); dfaVector.addElement(storeState); dfa.addTransition(currentDFAState, input, numDFAStates); dfa.setFinal( numDFAStates, containsFinal(storeState) ); dfa.setAction( numDFAStates, getAction(storeState) ); } } } currentDFAState++; } if (Options.verbose) Out.println(""); return dfa; } public void dumpTable() { Out.dump(toString()); } public String toString() { StringBuffer result = new StringBuffer(); for (int i=0; i < numStates; i++) { result.append("State"); if ( isFinal[i] ) { result.append("[FINAL"); String l = action[i].lookString(); if (!l.equals("")) { result.append(", "); result.append(l); } result.append("]"); } result.append(" "+i+Out.NL); for (char input = 0; input < numInput; input++) { if ( table[i][input] != null && table[i][input].containsElements() ) result.append(" with "+((int) input)+" in "+table[i][input]+Out.NL); } if ( epsilon[i] != null && epsilon[i].containsElements() ) result.append(" with epsilon in "+epsilon[i]+Out.NL); } return result.toString(); } public void writeDot(File file) { try { PrintWriter writer = new PrintWriter(new FileWriter(file)); writer.println(dotFormat()); writer.close(); } catch (IOException e) { Out.error(ErrorMessages.FILE_WRITE, file); throw new GeneratorException(); } } public String dotFormat() { StringBuffer result = new StringBuffer(); result.append("digraph NFA {"+Out.NL); result.append("rankdir = LR"+Out.NL); for (int i=0; i < numStates; i++) { if ( isFinal[i] ) { result.append(i); result.append(" [shape = doublecircle]"); result.append(Out.NL); } } for (int i=0; i < numStates; i++) { for (int input = 0; input < numInput; input++) { if ( table[i][input] != null ) { StateSetEnumerator states = table[i][input].states(); while (states.hasMoreElements()) { int s = states.nextElement(); result.append(i+" -> "+s); result.append(" [label=\""+classes.toString(input)+"\"]"+Out.NL); } } } if ( epsilon[i] != null ) { StateSetEnumerator states = epsilon[i].states(); while (states.hasMoreElements()) { int s = states.nextElement(); result.append(i+" -> "+s+" [style=dotted]"+Out.NL); } } } result.append("}"+Out.NL); return result.toString(); } //----------------------------------------------------------------------- // Functions for constructing NFAs out of regular expressions. private void insertLetterNFA(boolean caseless, char letter, int start, int end) { if (caseless) { int lower = classes.getClassCode(Character.toLowerCase(letter)); int upper = classes.getClassCode(Character.toUpperCase(letter)); addTransition(start, lower, end); if (upper != lower) addTransition(start, upper, end); } else { addTransition(start, classes.getClassCode(letter), end); } } private IntPair insertStringNFA(boolean caseless, String letters) { int start = numStates; int i; for (i = 0; i < letters.length(); i++) { if (caseless) { char c = letters.charAt(i); int lower = classes.getClassCode(Character.toLowerCase(c)); int upper = classes.getClassCode(Character.toUpperCase(c)); addTransition(i+start, lower, i+start+1); if (upper != lower) addTransition(i+start, upper, i+start+1); } else { addTransition(i+start, classes.getClassCode(letters.charAt(i)), i+start+1); } } return new IntPair(start, i+start); } private void insertClassNFA(Vector intervalls, int start, int end) { // empty char class is ok: if (intervalls == null) return; int [] cl = classes.getClassCodes(intervalls); for (int i = 0; i < cl.length; i++) addTransition(start, cl[i], end); } private void insertNotClassNFA(Vector intervalls, int start, int end) { int [] cl = classes.getNotClassCodes(intervalls); for (int i = 0; i < cl.length; i++) addTransition(start, cl[i], end); } /** * Constructs an NFA accepting the complement of the language * of a given NFA. * * Converts the NFA into a DFA, then negates that DFA. * Exponential state blowup possible and common. * * @param the NFA to construct the complement for. * * @return a pair of integers denoting the index of start * and end state of the complement NFA. */ private IntPair complement(IntPair nfa) { if (Options.DEBUG) { Out.debug("complement for "+nfa); Out.debug("NFA is :"+Out.NL+this); } int dfaStart = nfa.end+1; // FIXME: only need epsilon closure of states reachable from nfa.start epsilonFill(); Hashtable dfaStates = new Hashtable(numStates); Vector dfaVector = new Vector(numStates); int numDFAStates = 0; int currentDFAState = 0; StateSet currentState, newState; newState = epsilon[nfa.start]; dfaStates.put(newState, new Integer(numDFAStates)); dfaVector.addElement(newState); if (Options.DEBUG) Out.debug("pos DFA start state is :"+Out.NL+dfaStates+Out.NL+Out.NL+"ordered :"+Out.NL+dfaVector); currentDFAState = 0; while ( currentDFAState <= numDFAStates ) { currentState = (StateSet) dfaVector.elementAt(currentDFAState); for (char input = 0; input < numInput; input++) { newState = DFAEdge(currentState, input); if ( newState.containsElements() ) { // Out.debug("DFAEdge for input "+(int)input+" and state set "+currentState+" is "+newState); // Out.debug("Looking for state set "+newState); Integer nextDFAState = (Integer) dfaStates.get(newState); if ( nextDFAState != null ) { // Out.debug("FOUND!"); addTransition(dfaStart+currentDFAState, input, dfaStart+nextDFAState.intValue()); } else { if (Options.dump) Out.print("+"); // Out.debug("NOT FOUND!"); // Out.debug("Table was "+dfaStates); numDFAStates++; dfaStates.put(newState, new Integer(numDFAStates)); dfaVector.addElement(newState); addTransition(dfaStart+currentDFAState, input, dfaStart+numDFAStates); } } } currentDFAState++; } // We have a dfa accepting the positive regexp. // Now the complement: if (Options.DEBUG) Out.debug("dfa finished, nfa is now :"+Out.NL+this); int start = dfaStart+numDFAStates+1; int error = dfaStart+numDFAStates+2; int end = dfaStart+numDFAStates+3; addEpsilonTransition(start, dfaStart); for (int i = 0; i < numInput; i++) addTransition(error, i, error); addEpsilonTransition(error, end); for (int s = 0; s <= numDFAStates; s++) { currentState = (StateSet) dfaVector.elementAt(s); currentDFAState = dfaStart+s; // if it was not a final state, it is now in the complement if (!currentState.isElement(nfa.end)) addEpsilonTransition(currentDFAState, end); // all inputs not present (formerly leading to an implicit error) // now lead to an explicit (final) state accepting everything. for (int i = 0; i < numInput; i++) if (table[currentDFAState][i] == null) addTransition(currentDFAState, i, error); } // eliminate transitions leading to dead states if (live == null || live.length < numStates) { live = new boolean [2*numStates]; visited = new boolean [2*numStates]; } removeDead(dfaStart, end); if (Options.DEBUG) Out.debug("complement finished, nfa ("+start+","+end+") is now :"+this); return new IntPair(start, end); } // "global" data for use in method removeDead only: // live[s] == false <=> no final state can be reached from s private boolean [] live; // = new boolean [estSize]; private boolean [] visited; // = new boolean [estSize]; private void removeDead(int start, int end) { // Out.debug("removeDead ("+start+")"); if ( visited[start] || live[start] ) return; visited[start] = true; // Out.debug("not yet visited"); if (closure(start).isElement(end)) live[start] = true; // Out.debug("is final :"+live[start]); for (int i = 0; i < numInput; i++) { StateSet nextState = closure(table[start][i]); StateSetEnumerator states = nextState.states(); while (states.hasMoreElements()) { int next = states.nextElement(); if (next != start) { removeDead(next,end); if (live[next]) live[start] = true; else table[start][i] = null; } } } StateSet nextState = closure(epsilon[start]); StateSetEnumerator states = nextState.states(); while (states.hasMoreElements()) { int next = states.nextElement(); if (next != start) { removeDead(next,end); if (live[next]) live[start] = true; } } // Out.debug("state "+start+" is live :"+live[start]); } /** * Constructs a two state NFA for char class regexps, * such that the NFA has * * exactly one start state, * exactly one end state, * no transitions leading out of the end state * no transitions leading into the start state * * Assumes that regExp.isCharClass(macros) == true * * @param regExp the regular expression to construct the * NFA for * * @return a pair of integers denoting the index of start * and end state of the NFA. */ private void insertCCLNFA(RegExp regExp, int start, int end) { switch (regExp.type) { case sym.BAR: RegExp2 r = (RegExp2) regExp; insertCCLNFA(r.r1, start, end); insertCCLNFA(r.r2, start, end); return; case sym.CCLASS: insertClassNFA( (Vector) ((RegExp1) regExp).content, start, end); return; case sym.CCLASSNOT: insertNotClassNFA( (Vector) ((RegExp1) regExp).content, start, end); return; case sym.CHAR: insertLetterNFA( false, ((Character) ((RegExp1) regExp).content).charValue(), start, end); return; case sym.CHAR_I: insertLetterNFA( true, ((Character) ((RegExp1) regExp).content).charValue(), start, end); return; case sym.MACROUSE: insertCCLNFA(macros.getDefinition((String) ((RegExp1) regExp).content), start, end); return; } throw new Error("Unknown expression type "+regExp.type+" in NFA construction"); } /** * Constructs an NFA for regExp such that the NFA has * * exactly one start state, * exactly one end state, * no transitions leading out of the end state * no transitions leading into the start state * * @param regExp the regular expression to construct the * NFA for * * @return a pair of integers denoting the index of start * and end state of the NFA. */ public IntPair insertNFA(RegExp regExp) { IntPair nfa1, nfa2; int start, end; RegExp2 r; if (Options.DEBUG) Out.debug("Inserting RegExp : "+regExp); if (regExp.isCharClass(macros)) { start = numStates; end = numStates+1; ensureCapacity(end+1); if (end+1 > numStates) numStates = end+1; insertCCLNFA(regExp, start, end); return new IntPair(start, end); } switch (regExp.type) { case sym.BAR: r = (RegExp2) regExp; nfa1 = insertNFA(r.r1); nfa2 = insertNFA(r.r2); start = nfa2.end+1; end = nfa2.end+2; addEpsilonTransition(start, nfa1.start); addEpsilonTransition(start, nfa2.start); addEpsilonTransition(nfa1.end, end); addEpsilonTransition(nfa2.end, end); return new IntPair(start, end); case sym.CONCAT: r = (RegExp2) regExp; nfa1 = insertNFA(r.r1); nfa2 = insertNFA(r.r2); addEpsilonTransition(nfa1.end, nfa2.start); return new IntPair(nfa1.start, nfa2.end); case sym.STAR: nfa1 = insertNFA( (RegExp) ((RegExp1) regExp).content ); start = nfa1.end+1; end = nfa1.end+2; addEpsilonTransition(nfa1.end, end); addEpsilonTransition(start, nfa1.start); addEpsilonTransition(start, end); addEpsilonTransition(nfa1.end, nfa1.start); return new IntPair(start, end); case sym.PLUS: nfa1 = insertNFA( (RegExp) ((RegExp1) regExp).content ); start = nfa1.end+1; end = nfa1.end+2; addEpsilonTransition(nfa1.end, end); addEpsilonTransition(start, nfa1.start); addEpsilonTransition(nfa1.end, nfa1.start); return new IntPair(start, end); case sym.QUESTION: nfa1 = insertNFA( (RegExp) ((RegExp1) regExp).content ); addEpsilonTransition(nfa1.start, nfa1.end); return new IntPair(nfa1.start, nfa1.end); case sym.BANG: return complement(insertNFA((RegExp) ((RegExp1) regExp).content)); case sym.TILDE: return insertNFA(regExp.resolveTilde(macros)); case sym.STRING: return insertStringNFA(false, (String) ((RegExp1) regExp).content ); case sym.STRING_I: return insertStringNFA(true, (String) ((RegExp1) regExp).content ); case sym.MACROUSE: return insertNFA(macros.getDefinition((String) ((RegExp1) regExp).content)); } throw new Error("Unknown expression type "+regExp.type+" in NFA construction"); } } jflex-1.4.3/src/JFlex/Options.java0000644000175000017500000001022311141010522015407 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.io.File; /** * Collects all global JFlex options. Can be set from command line parser, * ant taks, gui, etc. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class Options { /** If true, additional verbose debug information is produced * This is a compile time option */ public final static boolean DEBUG = false; /** code generation method: maximum packing */ final public static int PACK = 0; /** code generation method: traditional */ final public static int TABLE = 1; /** code generation method: switch statement */ final public static int SWITCH = 2; /** output directory */ private static File directory; /** strict JLex compatibility */ public static boolean jlex; /** don't run minimization algorithm if this is true */ public static boolean no_minimize; /** don't write backup files if this is true */ public static boolean no_backup; /** default code generation method */ public static int gen_method; /** If false, only error/warning output will be generated */ public static boolean verbose; /** If true, progress dots will be printed */ public static boolean progress; /** If true, jflex will print time statistics about the generation process */ public static boolean time; /** If true, jflex will write graphviz .dot files for generated automata */ public static boolean dot; /** If true, you will be flooded with information (e.g. dfa tables). */ public static boolean dump; static { setDefaults(); } /** * @return the output directory */ public static File getDir() { return directory; } /** * Set output directory * * @param dirName the name of the directory to write output files to */ public static void setDir(String dirName) { setDir(new File(dirName)); } /** * Set output directory * * @param d the directory to write output files to */ public static void setDir(File d) { if ( d.isFile() ) { Out.error("Error: \""+d+"\" is not a directory."); throw new GeneratorException(); } if ( !d.isDirectory() && !d.mkdirs() ) { Out.error("Error: couldn't create directory \""+d+"\""); throw new GeneratorException(); } directory = d; } /** * Sets all options back to default values. */ public static void setDefaults() { directory = null; jlex = false; no_minimize = false; no_backup = false; gen_method = Options.PACK; verbose = true; progress = true; time = false; dot = false; dump = false; Skeleton.readDefault(); } public static void setSkeleton(File skel) { Skeleton.readSkelFile(skel); } } jflex-1.4.3/src/JFlex/Out.java0000644000175000017500000002766011141010522014540 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.io.*; import java.awt.TextArea; /** * In this class all output to the java console is filtered. * * Use the switches verbose, time and DUMP at compile time to determine * the verbosity of JFlex output. There is no switch for * suppressing error messages. verbose and time can be overridden * by command line paramters. * * Redirects output to a TextArea in GUI mode. * * Counts error and warning messages. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public final class Out { /** platform dependent newline sequence */ public static final String NL = System.getProperty("line.separator"); /** count total warnings */ private static int warnings; /** count total errors */ private static int errors; /** output device */ private static StdOutWriter out = new StdOutWriter(); /** * Switches to GUI mode if text is not null * * @param text the message TextArea of the JFlex GUI */ public static void setGUIMode(TextArea text) { out.setGUIMode(text); } /** * Sets a new output stream and switches to non-gui mode. * * @param stream the new output stream */ public static void setOutputStream(OutputStream stream) { out = new StdOutWriter(stream); out.setGUIMode(null); } /** * Report time statistic data. * * @param message the message to be printed * @param time elapsed time */ public static void time(ErrorMessages message, Timer time) { if (Options.time) { String msg = ErrorMessages.get(message, time.toString()); out.println(msg); } } /** * Report time statistic data. * * @param message the message to be printed */ public static void time(String message) { if (Options.time) { out.println(message); } } /** * Report generation progress. * * @param message the message to be printed */ public static void println(String message) { if (Options.verbose) out.println(message); } /** * Report generation progress. * * @param message the message to be printed * @param data data to be inserted into the message */ public static void println(ErrorMessages message, String data) { if (Options.verbose) { out.println(ErrorMessages.get(message,data)); } } /** * Report generation progress. * * @param message the message to be printed * @param data data to be inserted into the message */ public static void println(ErrorMessages message, int data) { if (Options.verbose) { out.println(ErrorMessages.get(message,data)); } } /** * Report generation progress. * * @param message the message to be printed */ public static void print(String message) { if (Options.verbose) out.print(message); } /** * Dump debug information to System.out * * Use like this * * if (Out.DEBUG) Out.debug(message) * * to save performance during normal operation (when DEBUG * is turned off). */ public static void debug(String message) { if (Options.DEBUG) System.out.println(message); } /** * All parts of JFlex, that want to provide dump information * should use this method for their output. * * @message the message to be printed */ public static void dump(String message) { if (Options.dump) out.println(message); } /** * All parts of JFlex, that want to report error messages * should use this method for their output. * * @message the message to be printed */ private static void err(String message) { out.println(message); } /** * throws a GeneratorException if there are any errors recorded */ public static void checkErrors() { if (errors > 0) throw new GeneratorException(); } /** * print error and warning statistics */ public static void statistics() { StringBuffer line = new StringBuffer(errors+" error"); if (errors != 1) line.append("s"); line.append(", "+warnings+" warning"); if (warnings != 1) line.append("s"); line.append("."); err(line.toString()); } /** * reset error and warning counters */ public static void resetCounters() { errors = 0; warnings = 0; } /** * print a warning without position information * * @param message the warning message */ public static void warning(String message) { warnings++; err(NL+"Warning : "+message); } /** * print a warning with line information * * @param message code of the warning message * @param line the line information * * @see ErrorMessages */ public static void warning(ErrorMessages message, int line) { warnings++; String msg = NL+"Warning"; if (line > 0) msg = msg+" in line "+(line+1); err(msg+": "+ErrorMessages.get(message)); } /** * print warning message with location information * * @param file the file the warning is issued for * @param message the code of the message to print * @param line the line number of the position * @param column the column of the position */ public static void warning(File file, ErrorMessages message, int line, int column) { String msg = NL+"Warning"; if (file != null) msg += " in file \""+file+"\""; if (line >= 0) msg = msg+" (line "+(line+1)+")"; try { err(msg+": "+NL+ErrorMessages.get(message)); } catch (ArrayIndexOutOfBoundsException e) { err(msg); } warnings++; if (line >= 0) { if (column >= 0) showPosition(file, line, column); else showPosition(file, line); } } /** * print error message (string) * * @param message the message to print */ public static void error(String message) { errors++; err(NL+message); } /** * print error message (code) * * @param message the code of the error message * * @see ErrorMessages */ public static void error(ErrorMessages message) { errors++; err(NL+"Error: "+ErrorMessages.get(message) ); } /** * print error message with data * * @param data data to insert into the message * @param message the code of the error message * * @see ErrorMessages */ public static void error(ErrorMessages message, String data) { errors++; err(NL+"Error: "+ ErrorMessages.get(message,data)); } /** * IO error message for a file (displays file * name in parentheses). * * @param message the code of the error message * @param file the file it occurred for */ public static void error(ErrorMessages message, File file) { errors++; err(NL+"Error: "+ErrorMessages.get(message)+" ("+file+")"); } /** * print error message with location information * * @param file the file the error occurred for * @param message the code of the error message to print * @param line the line number of error position * @param column the column of error position */ public static void error(File file, ErrorMessages message, int line, int column) { String msg = NL+"Error"; if (file != null) msg += " in file \""+file+"\""; if (line >= 0) msg = msg+" (line "+(line+1)+")"; try { err(msg+": "+NL+ErrorMessages.get(message)); } catch (ArrayIndexOutOfBoundsException e) { err(msg); } errors++; if (line >= 0) { if (column >= 0) showPosition(file, line, column); else showPosition(file, line); } } /** * prints a line of a file with marked position. * * @param file the file of which to show the line * @param line the line to show * @param column the column in which to show the marker */ public static void showPosition(File file, int line, int column) { try { String ln = getLine(file, line); if (ln != null) { err( ln ); if (column < 0) return; String t = "^"; for (int i = 0; i < column; i++) t = " "+t; err(t); } } catch (IOException e) { /* silently ignore IO errors, don't show anything */ } } /** * print a line of a file * * @param file the file to show * @param line the line number */ public static void showPosition(File file, int line) { try { String ln = getLine(file, line); if (ln != null) err(ln); } catch (IOException e) { /* silently ignore IO errors, don't show anything */ } } /** * get one line from a file * * @param file the file to read * @param line the line number to get * * @throw IOException if any error occurs */ private static String getLine(File file, int line) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(file)); String msg = ""; for (int i = 0; i <= line; i++) msg = reader.readLine(); reader.close(); return msg; } /** * Print system information (e.g. in case of unexpected exceptions) */ public static void printSystemInfo() { err("Java version: "+System.getProperty("java.version")); err("Runtime name: "+System.getProperty("java.runtime.name")); err("Vendor: "+System.getProperty("java.vendor")); err("VM version: "+System.getProperty("java.vm.version")); err("VM vendor: "+System.getProperty("java.vm.vendor")); err("VM name: "+System.getProperty("java.vm.name")); err("VM info: "+System.getProperty("java.vm.info")); err("OS name: "+System.getProperty("os.name")); err("OS arch: "+System.getProperty("os.arch")); err("OS version: "+System.getProperty("os.version")); err("Encoding: "+System.getProperty("file.encoding")); err("JFlex version: "+Main.version); } /** * Request a bug report for an unexpected Exception/Error. */ public static void requestBugReport(Error e) { err("An unexpected error occurred. Please send a report of this to"); err(" and include the following information:"); err(""); printSystemInfo(); err("Exception:"); e.printStackTrace(out); err(""); err("Please also include a specification (as small as possible)"); err("that triggers this error. You may also want to check at"); err("http://www.jflex.de if there is a newer version available"); err("that doesn't have this problem"); err(""); err("Thanks for your support."); } } jflex-1.4.3/src/JFlex/PackEmitter.java0000644000175000017500000001405611141010522016174 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * jflex 1.4 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Encodes int arrays as strings. * * Also splits up strings when longer than 64K in UTF8 encoding. * Subclasses emit unpacking code. * * Usage protocol: * p.emitInit();
* for each data: p.emitData(data);
* p.emitUnpack(); * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public abstract class PackEmitter { /** name of the generated array (mixed case, no yy prefix) */ protected String name; /** current UTF8 length of generated string in current chunk */ private int UTF8Length; /** position in the current line */ private int linepos; /** max number of entries per line */ private static final int maxEntries = 16; /** output buffer */ protected StringBuffer out = new StringBuffer(); /** number of existing string chunks */ protected int chunks; /** maximum size of chunks */ // String constants are stored as UTF8 with 2 bytes length // field in class files. One Unicode char can be up to 3 // UTF8 bytes. 64K max and two chars safety. private static final int maxSize = 0xFFFF-6; /** indent for string lines */ private static final String indent = " "; /** * Create new emitter for an array. * * @param name the name of the generated array */ public PackEmitter(String name) { this.name = name; } /** * Convert array name into all uppercase internal scanner * constant name. * * @return name as a internal constant name. * @see PackEmitter#name */ protected String constName() { return "ZZ_" + name.toUpperCase(); } /** * Return current output buffer. */ public String toString() { return out.toString(); } /** * Emit declaration of decoded member and open first chunk. */ public void emitInit() { out.append(" private static final int [] "); out.append(constName()); out.append(" = zzUnpack"); out.append(name); out.append("();"); nl(); nextChunk(); } /** * Emit single unicode character. * * Updates length, position, etc. * * @param i the character to emit. * @prec 0 <= i <= 0xFFFF */ public void emitUC(int i) { if (i < 0 || i > 0xFFFF) throw new IllegalArgumentException("character value expected"); // cast ok because of prec char c = (char) i; printUC(c); UTF8Length += UTF8Length(c); linepos++; } /** * Execute line/chunk break if necessary. * Leave space for at least two chars. */ public void breaks() { if (UTF8Length >= maxSize) { // close current chunk out.append("\";"); nl(); nextChunk(); } else { if (linepos >= maxEntries) { // line break out.append("\"+"); nl(); out.append(indent); out.append("\""); linepos = 0; } } } /** * Emit the unpacking code. */ public abstract void emitUnpack(); /** * emit next chunk */ private void nextChunk() { nl(); out.append(" private static final String "); out.append(constName()); out.append("_PACKED_"); out.append(chunks); out.append(" ="); nl(); out.append(indent); out.append("\""); UTF8Length = 0; linepos = 0; chunks++; } /** * emit newline */ protected void nl() { out.append(Out.NL); } /** * Append a unicode/octal escaped character * to out buffer. * * @param c the character to append */ private void printUC(char c) { if (c > 255) { out.append("\\u"); if (c < 0x1000) out.append("0"); out.append(Integer.toHexString(c)); } else { out.append("\\"); out.append(Integer.toOctalString(c)); } } /** * Calculates the number of bytes a Unicode character * would have in UTF8 representation in a class file. * * @param value the char code of the Unicode character * @prec 0 <= value <= 0xFFFF * * @return length of UTF8 representation. */ private int UTF8Length(char value) { // if (value < 0 || value > 0xFFFF) throw new Error("not a char value ("+value+")"); // see JVM spec section 4.4.7, p 111 if (value == 0) return 2; if (value <= 0x7F) return 1; // workaround for javac bug (up to jdk 1.3): if (value < 0x0400) return 2; if (value <= 0x07FF) return 3; // correct would be: // if (value <= 0x7FF) return 2; return 3; } // convenience protected void println(String s) { out.append(s); nl(); } } jflex-1.4.3/src/JFlex/RegExp.java0000644000175000017500000002346011141010522015155 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.util.Vector; /** * Stores a regular expression of rules section in a JFlex-specification. * * This base class has no content other than its type. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class RegExp { /** * The type of the regular expression. This field will be * filled with values from class sym.java (generated by cup) */ int type; /** * Create a new regular expression of the specified type. * * @param type a value from the cup generated class sym. * * @see JFlex.sym */ public RegExp(int type) { this.type = type; } /** * Returns a String-representation of this regular expression * with the specified indentation. * * @param tab a String that should contain only space characters and * that is inserted in front of standard String-representation * pf this object. */ public String print(String tab) { return tab+toString(); } /** * Returns a String-representation of this regular expression */ public String toString() { return "type = "+type; } /** * Find out if this regexp is a char class or equivalent to one. * * @param macros for macro expansion * @return true if the regexp is equivalent to a char class. */ public boolean isCharClass(Macros macros) { RegExp1 unary; RegExp2 binary; switch (type) { case sym.CHAR: case sym.CHAR_I: case sym.CCLASS: case sym.CCLASSNOT: return true; case sym.BAR: binary = (RegExp2) this; return binary.r1.isCharClass(macros) && binary.r2.isCharClass(macros); case sym.MACROUSE: unary = (RegExp1) this; return macros.getDefinition((String) unary.content).isCharClass(macros); default: return false; } } /** * The approximate number of NFA states this expression will need (only * works correctly after macro expansion and without negation) * * @param macros macro table for expansion */ public int size(Macros macros) { RegExp1 unary; RegExp2 binary; RegExp content; switch ( type ) { case sym.BAR: binary = (RegExp2) this; return binary.r1.size(macros) + binary.r2.size(macros) + 2; case sym.CONCAT: binary = (RegExp2) this; return binary.r1.size(macros) + binary.r2.size(macros); case sym.STAR: unary = (RegExp1) this; content = (RegExp) unary.content; return content.size(macros) + 2; case sym.PLUS: unary = (RegExp1) this; content = (RegExp) unary.content; return content.size(macros) + 2; case sym.QUESTION: unary = (RegExp1) this; content = (RegExp) unary.content; return content.size(macros); case sym.BANG: unary = (RegExp1) this; content = (RegExp) unary.content; return content.size(macros) * content.size(macros); // this is only a very rough estimate (worst case 2^n) // exact size too complicated (propably requires construction) case sym.TILDE: unary = (RegExp1) this; content = (RegExp) unary.content; return content.size(macros) * content.size(macros) * 3; // see sym.BANG case sym.STRING: case sym.STRING_I: unary = (RegExp1) this; return ((String) unary.content).length()+1; case sym.CHAR: case sym.CHAR_I: return 2; case sym.CCLASS: case sym.CCLASSNOT: return 2; case sym.MACROUSE: unary = (RegExp1) this; return macros.getDefinition((String) unary.content).size(macros); } throw new Error("unknown regexp type "+type); } /** * @return the reverse of the specified string. */ public final static String revString(String s) { StringBuffer b = new StringBuffer(s.length()); for (int i=s.length()-1; i >= 0; i--) { b.append(s.charAt(i)); } return b.toString(); } /** * Recursively convert tilde (upto) expressions into negation and star. * * @param macros the macro table for expansion. * @return new RegExp equivalent to the current one, but without upto expressions. */ public final RegExp resolveTilde(Macros macros) { RegExp1 unary; RegExp2 binary; RegExp content; switch ( type ) { case sym.BAR: binary = (RegExp2) this; return new RegExp2(sym.BAR, binary.r1.resolveTilde(macros), binary.r2.resolveTilde(macros)); case sym.CONCAT: binary = (RegExp2) this; return new RegExp2(sym.CONCAT, binary.r1.resolveTilde(macros), binary.r2.resolveTilde(macros)); case sym.STAR: unary = (RegExp1) this; content = (RegExp) unary.content; return new RegExp1(sym.STAR, content.resolveTilde(macros)); case sym.PLUS: unary = (RegExp1) this; content = (RegExp) unary.content; return new RegExp1(sym.PLUS, content.resolveTilde(macros)); case sym.QUESTION: unary = (RegExp1) this; content = (RegExp) unary.content; return new RegExp1(sym.QUESTION, content.resolveTilde(macros)); case sym.BANG: unary = (RegExp1) this; content = (RegExp) unary.content; return new RegExp1(sym.BANG, content.resolveTilde(macros)); case sym.TILDE: // ~a = !([^]* a [^]*) a // uses subexpression sharing unary = (RegExp1) this; content = ((RegExp) unary.content).resolveTilde(macros); RegExp any_star = new RegExp1(sym.STAR, anyChar()); RegExp neg = new RegExp1(sym.BANG, new RegExp2(sym.CONCAT, any_star, new RegExp2(sym.CONCAT, content, any_star))); return new RegExp2(sym.CONCAT, neg, content); case sym.STRING: case sym.STRING_I: case sym.CHAR: case sym.CHAR_I: case sym.CCLASS: case sym.CCLASSNOT: unary = (RegExp1) this; return new RegExp1(unary.type, unary.content); case sym.MACROUSE: unary = (RegExp1) this; return macros.getDefinition((String) unary.content).resolveTilde(macros); } throw new Error("unknown regexp type "+type); } /** * Returns a regexp that matches any character: [^] * @return the regexp for [^] */ public RegExp anyChar() { // FIXME: there is some code duplication here with the parser Vector list = new Vector(); list.addElement(new Interval((char)0,CharClasses.maxChar)); return new RegExp1(sym.CCLASS,list); } /** * Create a new regexp that matches the reverse text of this one. * * @return the reverse regexp */ public final RegExp rev(Macros macros) { RegExp1 unary; RegExp2 binary; RegExp content; switch ( type ) { case sym.BAR: binary = (RegExp2) this; return new RegExp2(sym.BAR, binary.r1.rev(macros), binary.r2.rev(macros)); case sym.CONCAT: binary = (RegExp2) this; return new RegExp2(sym.CONCAT, binary.r2.rev(macros), binary.r1.rev(macros)); case sym.STAR: unary = (RegExp1) this; content = (RegExp) unary.content; return new RegExp1(sym.STAR, content.rev(macros)); case sym.PLUS: unary = (RegExp1) this; content = (RegExp) unary.content; return new RegExp1(sym.PLUS, content.rev(macros)); case sym.QUESTION: unary = (RegExp1) this; content = (RegExp) unary.content; return new RegExp1(sym.QUESTION, content.rev(macros)); case sym.BANG: unary = (RegExp1) this; content = (RegExp) unary.content; return new RegExp1(sym.BANG, content.rev(macros)); case sym.TILDE: content = resolveTilde(macros); return content.rev(macros); case sym.STRING: case sym.STRING_I: unary = (RegExp1) this; return new RegExp1(unary.type, revString((String) unary.content)); case sym.CHAR: case sym.CHAR_I: case sym.CCLASS: case sym.CCLASSNOT: unary = (RegExp1) this; return new RegExp1(unary.type, unary.content); case sym.MACROUSE: unary = (RegExp1) this; return macros.getDefinition((String) unary.content).rev(macros); } throw new Error("unknown regexp type "+type); } } jflex-1.4.3/src/JFlex/RegExp1.java0000644000175000017500000000607511141010522015241 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Stores a regular expression from the rules section of a JFlex specification. * * This class provides storage for one Object of content. * It is used for all regular expressions that are constructed from one object. * * For instance: a* is new RegExp1(sym.STAR, new Character ('a')); * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class RegExp1 extends RegExp { /** * The child of this expression node in the syntax tree of a regular expression. */ Object content; /** * Constructs a new regular expression with one child object. * * @param type a value from the cup generated class sym, defining the * kind of this regular expression * * @param content the child of this expression */ public RegExp1(int type, Object content) { super(type); this.content = content; } /** * Returns a String-representation of this regular expression * with the specified indentation. * * @param tab a String that should contain only space characters and * that is inserted in front of standard String-representation * pf this object. */ public String print(String tab) { if (content instanceof RegExp) { return tab+"type = "+type+Out.NL+tab+"content :"+Out.NL+((RegExp)content).print(tab+" "); } else return tab+"type = "+type+Out.NL+tab+"content :"+Out.NL+tab+" "+content; } /** * Returns a String-representation of this regular expression */ public String toString() { return print(""); } } jflex-1.4.3/src/JFlex/RegExp2.java0000644000175000017500000000417711141010522015243 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Regular expression with two children (e.g. a | b) * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class RegExp2 extends RegExp { RegExp r1, r2; public RegExp2(int type, RegExp r1, RegExp r2) { super(type); this.r1 = r1; this.r2 = r2; } public String print(String tab) { return tab+"type = "+type+Out.NL+tab+"child 1 :"+Out.NL+ //$NON-NLS-1$ //$NON-NLS-2$ r1.print(tab+" ")+Out.NL+tab+"child 2 :"+Out.NL+ //$NON-NLS-1$ //$NON-NLS-2$ r2.print(tab+" "); //$NON-NLS-1$ } public String toString() { return print(""); //$NON-NLS-1$ } } jflex-1.4.3/src/JFlex/RegExps.java0000644000175000017500000001530611141010522015340 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.util.*; /** * Stores all rules of the specification for later access in RegExp -> NFA * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class RegExps { /** the spec line in which a regexp is used */ Vector /* of Integer */ lines; /** the lexical states in wich the regexp is used */ Vector /* of Vector of Integer */ states; /** the regexp */ Vector /* of RegExp */ regExps; /** the action of a regexp */ Vector /* of Action */ actions; /** flag if it is a BOL regexp */ Vector /* of Boolean */ BOL; /** the lookahead expression */ Vector /* of RegExp */ look; /** the forward DFA entry point of the lookahead expression */ Vector /* of Integer */ look_entry; /** Count of many general lookahead expressions there are. * Need 2*gen_look_count additional DFA entry points. */ int gen_look_count; public RegExps() { states = new Vector(); regExps = new Vector(); actions = new Vector(); BOL = new Vector(); look = new Vector(); lines = new Vector(); look_entry = new Vector(); } public int insert(int line, Vector stateList, RegExp regExp, Action action, Boolean isBOL, RegExp lookAhead) { if (Options.DEBUG) { Out.debug("Inserting regular expression with statelist :"+Out.NL+stateList); //$NON-NLS-1$ Out.debug("and action code :"+Out.NL+action.content+Out.NL); //$NON-NLS-1$ Out.debug("expression :"+Out.NL+regExp); //$NON-NLS-1$ } states.addElement(stateList); regExps.addElement(regExp); actions.addElement(action); BOL.addElement(isBOL); look.addElement(lookAhead); lines.addElement(new Integer(line)); look_entry.addElement(null); return states.size()-1; } public int insert(Vector stateList, Action action) { if (Options.DEBUG) { Out.debug("Inserting eofrule with statelist :"+Out.NL+stateList); //$NON-NLS-1$ Out.debug("and action code :"+Out.NL+action.content+Out.NL); //$NON-NLS-1$ } states.addElement(stateList); regExps.addElement(null); actions.addElement(action); BOL.addElement(null); look.addElement(null); lines.addElement(null); look_entry.addElement(null); return states.size()-1; } public void addStates(int regNum, Vector newStates) { Enumeration s = newStates.elements(); while (s.hasMoreElements()) ((Vector)states.elementAt(regNum)).addElement(s.nextElement()); } public int getNum() { return states.size(); } public boolean isBOL(int num) { return ((Boolean) BOL.elementAt(num)).booleanValue(); } public RegExp getLookAhead(int num) { return (RegExp) look.elementAt(num); } public boolean isEOF(int num) { return BOL.elementAt(num) == null; } public Vector getStates(int num) { return (Vector) states.elementAt(num); } public RegExp getRegExp(int num) { return (RegExp) regExps.elementAt(num); } public int getLine(int num) { return ((Integer) lines.elementAt(num)).intValue(); } public int getLookEntry(int num) { return ((Integer) look_entry.elementAt(num)).intValue(); } public void checkActions() { if ( actions.elementAt(actions.size()-1) == null ) { Out.error(ErrorMessages.NO_LAST_ACTION); throw new GeneratorException(); } } public Action getAction(int num) { while ( num < actions.size() && actions.elementAt(num) == null ) num++; return (Action) actions.elementAt(num); } public int NFASize(Macros macros) { int size = 0; Enumeration e = regExps.elements(); while (e.hasMoreElements()) { RegExp r = (RegExp) e.nextElement(); if (r != null) size += r.size(macros); } e = look.elements(); while (e.hasMoreElements()) { RegExp r = (RegExp) e.nextElement(); if (r != null) size += r.size(macros); } return size; } public void checkLookAheads() { for (int i=0; i < regExps.size(); i++) lookAheadCase(i); } /** * Determine which case of lookahead expression regExpNum points to (if any). * Set case data in corresponding action. * Increment count of general lookahead expressions for entry points * of the two additional DFAs. * Register DFA entry point in RegExps * * Needs to be run before adding any regexps/rules to be able to reserve * the correct amount of space of lookahead DFA entry points. * * @param regExpNum the number of the regexp in RegExps. */ private void lookAheadCase(int regExpNum) { if ( getLookAhead(regExpNum) != null ) { RegExp r1 = getRegExp(regExpNum); RegExp r2 = getLookAhead(regExpNum); Action a = getAction(regExpNum); int len1 = SemCheck.length(r1); int len2 = SemCheck.length(r2); if (len1 >= 0) { a.setLookAction(Action.FIXED_BASE,len1); } else if (len2 >= 0) { a.setLookAction(Action.FIXED_LOOK,len2); } else if (SemCheck.isFiniteChoice(r2)) { a.setLookAction(Action.FINITE_CHOICE,0); } else { a.setLookAction(Action.GENERAL_LOOK,0); look_entry.setElementAt(new Integer(gen_look_count), regExpNum); gen_look_count++; } } } } jflex-1.4.3/src/JFlex/ScannerException.java0000644000175000017500000000775711141010522017246 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.io.File; /** * This Exception could be thrown while scanning the specification * (e.g. unmatched input) * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class ScannerException extends RuntimeException { public int line; public int column; public ErrorMessages message; public File file; private ScannerException(File file, String text, ErrorMessages message, int line, int column) { super(text); this.file = file; this.message = message; this.line = line; this.column = column; } /** * Creates a new ScannerException with a message only. * * @param message the code for the error description presented to the user. */ public ScannerException(ErrorMessages message) { this( null, ErrorMessages.get(message), message, -1, -1 ); } /** * Creates a new ScannerException for a file with a message only. * * @param file the file in which the error occured * @param message the code for the error description presented to the user. */ public ScannerException(File file, ErrorMessages message) { this( file, ErrorMessages.get(message), message, -1, -1 ); } /** * Creates a new ScannerException with a message and line number. * * @param message the code for the error description presented to the user. * @param line the number of the line in the specification that * contains the error */ public ScannerException(ErrorMessages message, int line) { this( null, ErrorMessages.get(message), message, line, -1 ); } /** * Creates a new ScannerException for a file with a message and line number. * * @param message the code for the error description presented to the user. * @param line the number of the line in the specification that * contains the error */ public ScannerException(File file, ErrorMessages message, int line) { this( file, ErrorMessages.get(message), message, line, -1 ); } /** * Creates a new ScannerException with a message, line number and column. * * @param message the code for the error description presented to the user. * @param line the number of the line in the specification that * contains the error * @param column the column where the error starts */ public ScannerException(File file, ErrorMessages message, int line, int column) { this( file, ErrorMessages.get(message), message, line, column ); } } jflex-1.4.3/src/JFlex/SemCheck.java0000644000175000017500000001401711141010522015443 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.io.File; /** * Performs simple semantic analysis on regular expressions. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public final class SemCheck { // stored globally since they are used as constants in all checks private static Macros macros; /** * Performs semantic analysis for all expressions. * * Currently checks for empty expressions only. * * @param rs the reg exps to be checked * @param m the macro table (in expanded form) * @param f the spec file containing the rules */ public static void check(RegExps rs, Macros m, File f) { macros = m; int num = rs.getNum(); for (int i = 0; i < num; i++) { RegExp r = rs.getRegExp(i); RegExp l = rs.getLookAhead(i); Action a = rs.getAction(i); if (r != null && l != null && maybeEmtpy(r)) { if (a == null) Out.error(ErrorMessages.EMPTY_MATCH, ""); else Out.error(f, ErrorMessages.EMPTY_MATCH, a.priority-1, -1); } } } /** * Checks if the expression potentially matches the empty string. * */ public static boolean maybeEmtpy(RegExp re) { RegExp2 r; switch (re.type) { case sym.BAR: { r = (RegExp2) re; return maybeEmtpy(r.r1) || maybeEmtpy(r.r2); } case sym.CONCAT: { r = (RegExp2) re; return maybeEmtpy(r.r1) && maybeEmtpy(r.r2); } case sym.STAR: case sym.QUESTION: return true; case sym.PLUS: { RegExp1 r1 = (RegExp1) re; return maybeEmtpy((RegExp) r1.content); } case sym.CCLASS: case sym.CCLASSNOT: case sym.CHAR: case sym.CHAR_I: return false; case sym.STRING: case sym.STRING_I: { String content = (String) ((RegExp1) re).content; return content.length() == 0; } case sym.TILDE: return false; case sym.BANG: { RegExp1 r1 = (RegExp1) re; return !maybeEmtpy((RegExp) r1.content); } case sym.MACROUSE: return maybeEmtpy(macros.getDefinition((String) ((RegExp1) re).content)); } throw new Error("Unkown expression type "+re.type+" in "+re); //$NON-NLS-1$ //$NON-NLS-2$ } /** * Returns length if expression has fixed length, -1 otherwise. * * Negation operators are treated as always variable length. */ public static int length(RegExp re) { RegExp2 r; switch (re.type) { case sym.BAR: { r = (RegExp2) re; int l1 = length(r.r1); if (l1 < 0) return -1; int l2 = length(r.r2); if (l1 == l2) return l1; else return -1; } case sym.CONCAT: { r = (RegExp2) re; int l1 = length(r.r1); if (l1 < 0) return -1; int l2 = length(r.r2); if (l2 < 0) return -1; return l1+l2; } case sym.STAR: case sym.PLUS: case sym.QUESTION: return -1; case sym.CCLASS: case sym.CCLASSNOT: case sym.CHAR: case sym.CHAR_I: return 1; case sym.STRING: case sym.STRING_I: { String content = (String) ((RegExp1) re).content; return content.length(); } case sym.TILDE: case sym.BANG: // too hard to calculate at this level, use safe approx return -1; case sym.MACROUSE: return length(macros.getDefinition((String) ((RegExp1) re).content)); } throw new Error("Unkown expression type "+re.type+" in "+re); //$NON-NLS-1$ //$NON-NLS-2$ } /** * Returns true iff the expression is a finite choice of fixed length * expressions. * * Negation operators are treated as always variable length. */ public static boolean isFiniteChoice(RegExp re) { RegExp2 r; switch (re.type) { case sym.BAR: { r = (RegExp2) re; return isFiniteChoice(r.r1) && isFiniteChoice(r.r2); } case sym.CONCAT: { r = (RegExp2) re; int l1 = length(r.r1); if (l1 < 0) return false; int l2 = length(r.r2); return l2 >= 0; } case sym.STAR: case sym.PLUS: case sym.QUESTION: return false; case sym.CCLASS: case sym.CCLASSNOT: case sym.CHAR: case sym.CHAR_I: return true; case sym.STRING: case sym.STRING_I: { return true; } case sym.TILDE: case sym.BANG: return false; case sym.MACROUSE: return isFiniteChoice(macros.getDefinition((String) ((RegExp1) re).content)); } throw new Error("Unkown expression type "+re.type+" in "+re); //$NON-NLS-1$ //$NON-NLS-2$ } } jflex-1.4.3/src/JFlex/SilentExit.java0000644000175000017500000000324311141010522016050 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Signals a silent exit (no statistics printout). * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class SilentExit extends Exception { } jflex-1.4.3/src/JFlex/Skeleton.java0000644000175000017500000001536611141010522015555 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.io.*; import java.net.URL; import java.util.Vector; /** * This class stores the skeleton of generated scanners. * * The skeleton consists of several parts that can be emitted to * a file. Usually there is a portion of generated code * (produced in class Emitter) between every two parts of skeleton code. * * There is a static part (the skeleton code) and state based iterator * part to this class. The iterator part is used to emit consecutive skeleton * sections to some PrintWriter. * * @see JFlex.Emitter * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class Skeleton { /** location of default skeleton */ static final private String DEFAULT_LOC = "JFlex/skeleton.default"; //$NON-NLS-1$ /** expected number of sections in the skeleton file */ static final private int size = 21; /** platform specific newline */ static final private String NL = System.getProperty("line.separator"); //$NON-NLS-1$ /** The skeleton */ public static String line[]; /** initialization */ static { readDefault(); } // the state based, iterator part of Skeleton: /** * The current part of the skeleton (an index of nextStop[]) */ private int pos; /** * The writer to write the skeleton-parts to */ private PrintWriter out; /** * Creates a new skeleton (iterator) instance. * * @param out the writer to write the skeleton-parts to */ public Skeleton(PrintWriter out) { this.out = out; } /** * Emits the next part of the skeleton */ public void emitNext() { out.print( line[pos++] ); } /** * Make the skeleton private. * * Replaces all occurences of " public " in the skeleton with " private ". */ public static void makePrivate() { for (int i=0; i < line.length; i++) { line[i] = replace(" public ", " private ", line[i]); //$NON-NLS-1$ //$NON-NLS-2$ } } /** * Reads an external skeleton file for later use with this class. * * @param skeletonFile the file to read (must be != null and readable) */ public static void readSkelFile(File skeletonFile) { if (skeletonFile == null) throw new IllegalArgumentException("Skeleton file must not be null"); //$NON-NLS-1$ if (!skeletonFile.isFile() || !skeletonFile.canRead()) { Out.error(ErrorMessages.CANNOT_READ_SKEL, skeletonFile.toString()); throw new GeneratorException(); } Out.println(ErrorMessages.READING_SKEL, skeletonFile.toString()); try { BufferedReader reader = new BufferedReader(new FileReader(skeletonFile)); readSkel(reader); } catch (IOException e) { Out.error(ErrorMessages.SKEL_IO_ERROR); throw new GeneratorException(); } } /** * Reads an external skeleton file from a BufferedReader. * * @param reader the reader to read from (must be != null) * @throws IOException if an IO error occurs * @throws GeneratorException if the number of skeleton sections does not match */ public static void readSkel(BufferedReader reader) throws IOException { Vector lines = new Vector(); StringBuffer section = new StringBuffer(); String ln; while ((ln = reader.readLine()) != null) { if (ln.startsWith("---")) { //$NON-NLS-1$ lines.addElement(section.toString()); section.setLength(0); } else { section.append(ln); section.append(NL); } } if (section.length() > 0) lines.addElement(section.toString()); if (lines.size() != size) { Out.error(ErrorMessages.WRONG_SKELETON); throw new GeneratorException(); } line = new String[size]; for (int i = 0; i < size; i++) line[i] = (String) lines.elementAt(i); } /** * Replaces a with b in c. * * @param a the String to be replaced * @param b the replacement * @param c the String in which to replace a by b * @return a String object with a replaced by b in c */ public static String replace(String a, String b, String c) { StringBuffer result = new StringBuffer(c.length()); int i = 0; int j = c.indexOf(a); while (j >= i) { result.append(c.substring(i,j)); result.append(b); i = j+a.length(); j = c.indexOf(a,i); } result.append(c.substring(i,c.length())); return result.toString(); } /** * (Re)load the default skeleton. Looks in the current system class path. */ public static void readDefault() { ClassLoader l = Skeleton.class.getClassLoader(); URL url; /* Try to load from same class loader as this class. * Should work, but does not on OS/2 JDK 1.1.8 (see bug 1065521). * Use system class loader in this case. */ if (l != null) { url = l.getResource(DEFAULT_LOC); } else { url = ClassLoader.getSystemResource(DEFAULT_LOC); } if (url == null) { Out.error(ErrorMessages.SKEL_IO_ERROR_DEFAULT); throw new GeneratorException(); } try { InputStreamReader reader = new InputStreamReader(url.openStream()); readSkel(new BufferedReader(reader)); } catch (IOException e) { Out.error(ErrorMessages.SKEL_IO_ERROR_DEFAULT); throw new GeneratorException(); } } } jflex-1.4.3/src/JFlex/StatePairList.java0000644000175000017500000000537111141010522016514 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * A list of pairs of states. Used in DFA minimization. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class StatePairList { // implemented as two arrays of integers. // java.util classes proved too inefficient. int p []; int q []; int num; public StatePairList() { p = new int [8]; q = new int [8]; num = 0; } public void addPair(int i, int j) { for (int x = 0; x < num; x++) if (p[x] == i && q[x] == j) return; if (num >= p.length) increaseSize(num); p[num] = i; q[num] = j; num++; } public void markAll(StatePairList [] [] list, boolean [] [] equiv) { for (int x = 0; x < num; x++) { int i = p[x]; int j = q[x]; if (equiv[i][j]) { equiv[i][j] = false; if (list[i][j] != null) list[i][j].markAll(list, equiv); } } } private void increaseSize(int length) { length = Math.max(length+1, 4*p.length); Out.debug("increasing length to "+length); //$NON-NLS-1$ int pn [] = new int[length]; int qn [] = new int[length]; System.arraycopy(p, 0, pn, 0, p.length); System.arraycopy(q, 0, qn, 0, q.length); p = pn; q = qn; } } jflex-1.4.3/src/JFlex/StateSet.java0000644000175000017500000002022311141010522015511 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * A set of NFA states (= integers). * * Very similar to java.util.BitSet, but is faster and doesn't crash * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class StateSet { private final boolean DEBUG = false; public final static StateSet EMPTY = new StateSet(); final static int BITS = 6; final static int MASK = (1<> BITS; if (index >= bits.length) resize(state); bits[index] |= (1L << (state & MASK)); if (DEBUG) { Out.dump("StateSet.addState("+state+") end"); //$NON-NLS-1$ //$NON-NLS-2$ Out.dump("Set is : "+this); //$NON-NLS-1$ } } private int size2nbits (int size) { return ((size >> BITS) + 1); } private void resize(int size) { int needed = size2nbits(size); // if (needed < bits.length) return; long newbits[] = new long[Math.max(bits.length*4,needed)]; System.arraycopy(bits, 0, newbits, 0, bits.length); bits = newbits; } public void clear() { int l = bits.length; for (int i = 0; i < l; i++) bits[i] = 0; } public boolean isElement(int state) { int index = state >> BITS; if (index >= bits.length) return false; return (bits[index] & (1L << (state & MASK))) != 0; } /** * Returns one element of the set and removes it. * * Precondition: the set is not empty. */ public int getAndRemoveElement() { int i = 0; int o = 0; long m = 1; while (bits[i] == 0) i++; while ( (bits[i] & m) == 0 ) { m<<= 1; o++; } bits[i]&= ~m; return (i << BITS) + o; } public void remove(int state) { int index = state >> BITS; if (index >= bits.length) return; bits[index] &= ~(1L << (state & MASK)); } /** * Returns the set of elements that contained are in the specified set * but are not contained in this set. */ public StateSet complement(StateSet set) { if (set == null) return null; StateSet result = new StateSet(); result.bits = new long[set.bits.length]; int i; int m = Math.min(bits.length, set.bits.length); for (i = 0; i < m; i++) { result.bits[i] = ~bits[i] & set.bits[i]; } if (bits.length < set.bits.length) System.arraycopy(set.bits, m, result.bits, m, result.bits.length-m); if (DEBUG) Out.dump("Complement of "+this+Out.NL+"and "+set+Out.NL+" is :"+result); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ return result; } public void add(StateSet set) { if (DEBUG) Out.dump("StateSet.add("+set+") start"); //$NON-NLS-1$ //$NON-NLS-2$ if (set == null) return; long tbits[]; long sbits[] = set.bits; int sbitsl = sbits.length; if (bits.length < sbitsl) { tbits = new long[sbitsl]; System.arraycopy(bits, 0, tbits, 0, bits.length); } else { tbits = this.bits; } for (int i = 0; i < sbitsl; i++) { tbits[i] |= sbits[i]; } this.bits = tbits; if (DEBUG) { Out.dump("StateSet.add("+set+") end"); //$NON-NLS-1$ //$NON-NLS-2$ Out.dump("Set is : "+this); //$NON-NLS-1$ } } public boolean containsSet(StateSet set) { if (DEBUG) Out.dump("StateSet.containsSet("+set+"), this="+this); //$NON-NLS-1$ //$NON-NLS-2$ int i; int min = Math.min(bits.length, set.bits.length); for (i = 0; i < min; i++) if ( (bits[i] & set.bits[i]) != set.bits[i] ) return false; for (i = min; i < set.bits.length; i++) if ( set.bits[i] != 0 ) return false; return true; } /** * @throws ClassCastException if b is not a StateSet * @throws NullPointerException if b is null */ public boolean equals(Object b) { int i = 0; int l1,l2; StateSet set = (StateSet) b; if (DEBUG) Out.dump("StateSet.equals("+set+"), this="+this); //$NON-NLS-1$ //$NON-NLS-2$ l1 = bits.length; l2 = set.bits.length; if (l1 <= l2) { while (i < l1) { if (bits[i] != set.bits[i]) return false; i++; } while (i < l2) if (set.bits[i++] != 0) return false; } else { while (i < l2) { if (bits[i] != set.bits[i]) return false; i++; } while (i < l1) if (bits[i++] != 0) return false; } return true; } public int hashCode() { long h = 1234; long [] _bits = bits; int i = bits.length-1; // ignore zero high bits while (i >= 0 && _bits[i] == 0) i--; while (i >= 0) h ^= _bits[i--] * i; return (int)((h >> 32) ^ h); } public StateSetEnumerator states() { return new StateSetEnumerator(this); } public boolean containsElements() { for (int i = 0; i < bits.length; i++) if (bits[i] != 0) return true; return false; } public StateSet copy() { StateSet set = new StateSet(); set.bits = new long[bits.length]; System.arraycopy(bits, 0, set.bits, 0, bits.length); return set; } /** * Copy specified StateSet into this. * * @param set the state set to copy. */ public void copy(StateSet set) { if (DEBUG) Out.dump("StateSet.copy("+set+") start"); //$NON-NLS-1$ //$NON-NLS-2$ if (set == null) { for (int i = 0; i < bits.length; i++) bits[i] = 0; return; } if (bits.length < set.bits.length) { bits = new long[set.bits.length]; } else { for (int i = set.bits.length; i < bits.length; i++) bits[i] = 0; } System.arraycopy(set.bits, 0, bits, 0, bits.length); if (DEBUG) { Out.dump("StateSet.copy("+set+") end"); //$NON-NLS-1$ //$NON-NLS-2$ Out.dump("Set is : "+this); //$NON-NLS-1$ } } public String toString() { StateSetEnumerator set = states(); StringBuffer result = new StringBuffer("{"); //$NON-NLS-1$ if ( set.hasMoreElements() ) result.append(""+set.nextElement()); //$NON-NLS-1$ while ( set.hasMoreElements() ) { int i = set.nextElement(); result.append( ", "+i); //$NON-NLS-1$ } result.append("}"); //$NON-NLS-1$ return result.toString(); } } jflex-1.4.3/src/JFlex/StateSetEnumerator.java0000644000175000017500000000755011141010522017563 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Enumerates the states of a StateSet. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ final public class StateSetEnumerator { private final static boolean DEBUG = false; private int index; private int offset; private long mask; private long [] bits; /** * creates a new StateSetEnumerator that is not yet associated * with a StateSet. hasMoreElements() and nextElement() will * throw NullPointerException when used before reset() */ public StateSetEnumerator() { } public StateSetEnumerator(StateSet states) { reset(states); } public void reset(StateSet states) { bits = states.bits; index = 0; offset = 0; mask = 1; while (index < bits.length && bits[index] == 0) index++; if (index >= bits.length) return; while (offset <= StateSet.MASK && ((bits[index] & mask) == 0)) { mask<<= 1; offset++; } } private void advance() { if (DEBUG) Out.dump("Advancing, at start, index = "+index+", offset = "+offset); //$NON-NLS-1$ //$NON-NLS-2$ // cache fields in local variable for faster access int _index = this.index; int _offset = this.offset; long _mask = this.mask; long [] _bits = this.bits; long bi = _bits[_index]; do { _offset++; _mask<<= 1; } while (_offset <= StateSet.MASK && ((bi & _mask) == 0)); if (_offset > StateSet.MASK) { int length = _bits.length; do _index++; while (_index < length && _bits[_index] == 0); if (_index >= length) { this.index = length; // indicates "no more elements" return; } _offset = 0; _mask = 1; bi = _bits[_index]; // terminates, because bi != 0 while ((bi & _mask) == 0) { _mask<<= 1; _offset++; } } // write back cached values this.index = _index; this.mask = _mask; this.offset = _offset; } public boolean hasMoreElements() { if (DEBUG) Out.dump("hasMoreElements, index = "+index+", offset = "+offset); //$NON-NLS-1$ //$NON-NLS-2$ return index < bits.length; } public int nextElement() { if (DEBUG) Out.dump("nextElement, index = "+index+", offset = "+offset); //$NON-NLS-1$ //$NON-NLS-2$ int x = (index << StateSet.BITS) + offset; advance(); return x; } } jflex-1.4.3/src/JFlex/StdOutWriter.java0000644000175000017500000000710611141010522016401 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; import java.io.*; import java.awt.TextArea; /** * Convenience class for JFlex stdout, redirects output to a TextArea * if in GUI mode. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public final class StdOutWriter extends PrintWriter { /** text area to write to if in gui mode, gui mode = (text != null) */ private TextArea text; /** * approximation of the current column in the text area * for auto wrapping at wrap characters **/ private int col; /** auto wrap lines in gui mode at this value */ private final static int wrap = 78; /** A StdOutWriter, attached to System.out, no gui mode */ public StdOutWriter() { super(System.out,true); } /** A StdOutWrite, attached to the specified output stream, no gui mode */ public StdOutWriter(OutputStream out) { super(out,true); } /** * Set the TextArea to write text to. Will continue * to write to System.out if text is null. * * @param text the TextArea to write to */ public void setGUIMode(TextArea text) { this.text = text; } /** Write a single character. */ public void write(int c) { if (text != null) { text.append(String.valueOf((char) c)); if (++col > wrap) println(); } else super.write(c); } /** Write a portion of an array of characters. */ public void write(char buf[], int off, int len) { if (text != null) { text.append(new String(buf,off,len)); if ((col+=len) > wrap) println(); } else super.write(buf, off, len); } /** Write a portion of a string. */ public void write(String s, int off, int len) { if (text != null) { text.append(s.substring(off,off+len)); if ((col+=len) > wrap) println(); } else { super.write(s,off,len); flush(); } } /** * Begin a new line. Which actual character/s is/are written * depends on the runtime platform. */ public void println() { if (text != null) { text.append(Out.NL); col = 0; } else super.println(); } } jflex-1.4.3/src/JFlex/sym.java0000644000175000017500000000430311141044633014600 0ustar moonmoon //---------------------------------------------------- // The following code was generated by CUP v0.11a beta 20060608 // Sat Jan 31 23:52:43 EST 2009 //---------------------------------------------------- package JFlex; /** CUP generated interface containing symbol constants. */ public interface sym { /* terminals */ public static final int DELIMITER = 9; public static final int EOFRULE = 26; public static final int STRING_I = 46; public static final int CHAR = 40; public static final int CONCAT = 45; public static final int MACROUSE = 42; public static final int LOWERCLASS = 25; public static final int EQUALS = 10; public static final int CCLASSNOT = 44; public static final int REPEAT = 32; public static final int TILDE = 39; public static final int CHAR_I = 47; public static final int STAR = 33; public static final int BAR = 35; public static final int FULL = 17; public static final int LOOKAHEAD = 28; public static final int LESSTHAN = 12; public static final int BANG = 38; public static final int COMMA = 11; public static final int JLETTERDIGITCLASS = 21; public static final int PLUS = 34; public static final int USERCODE = 31; public static final int EOF = 0; public static final int error = 1; public static final int DASH = 8; public static final int CLOSEBRACKET = 3; public static final int HAT = 4; public static final int JLETTERCLASS = 20; public static final int IDENT = 30; public static final int ACTION = 29; public static final int CLOSECLASS = 7; public static final int DIGITCLASS = 23; public static final int LBRACE = 14; public static final int REGEXPEND = 19; public static final int OPENCLASS = 6; public static final int OPENBRACKET = 2; public static final int POINT = 37; public static final int LETTERCLASS = 22; public static final int MORETHAN = 13; public static final int DOLLAR = 5; public static final int RBRACE = 15; public static final int STRING = 41; public static final int QUESTION = 36; public static final int UPPERCLASS = 24; public static final int NOACTION = 27; public static final int CCLASS = 43; public static final int ASCII = 16; public static final int UNICODE = 18; } jflex-1.4.3/src/JFlex/tests/0000755000175000017500000000000011141044617014271 5ustar moonmoonjflex-1.4.3/src/JFlex/tests/AllTests.java0000644000175000017500000000433411141010522016657 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * jflex * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.tests; import junit.framework.Test; import junit.framework.TestSuite; /** * AllTests * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class AllTests { public static void main(String[] args) { junit.textui.TestRunner.run(AllTests.class); } public static Test suite() { TestSuite suite = new TestSuite("JFlex tests"); //$JUnit-BEGIN$ suite.addTest(new TestSuite(AntTaskTests.class)); suite.addTest(new TestSuite(CharClassesTest.class)); suite.addTest(new TestSuite(EmitterTest.class)); suite.addTest(new TestSuite(RegExpTests.class)); suite.addTest(new TestSuite(SkeletonTest.class)); suite.addTest(new TestSuite(PackEmitterTest.class)); //$JUnit-END$ return suite; } } jflex-1.4.3/src/JFlex/tests/AntTaskTests.java0000644000175000017500000001221111141010522017505 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.tests; import java.io.File; import java.io.IOException; import JFlex.Options; import JFlex.anttask.JFlexTask; import junit.framework.TestCase; /** * Unit tests for the jflex ant task. * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class AntTaskTests extends TestCase { private JFlexTask task; /** * Constructor for AntTaskTests. * * @param name test case name */ public AntTaskTests(String name) { super(name); } /* * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); Options.setDefaults(); task = new JFlexTask(); } public void testPackageAndClass() throws IOException { task.setFile(new File("src/JFlex/LexScan.flex")); task.findPackageAndClass(); assertEquals(task.getPackage(), "JFlex"); assertEquals(task.getClassName(), "LexScan"); } public void testPackageAndClassDefaults() throws IOException { task.setFile(new File("examples/simple/simple.flex")); task.findPackageAndClass(); assertEquals(task.getPackage(), null); assertEquals(task.getClassName(), "Yylex"); } public void testDestdir() throws IOException { task.setFile(new File("src/JFlex/LexScan.flex")); File dir = new File("src"); task.setDestdir(dir); task.findPackageAndClass(); task.normalizeOutdir(); // not default jflex logic, but javac (uses package name) assertEquals(Options.getDir(), new File(dir, "JFlex")); } public void testOutdir() throws IOException { task.setFile(new File("src/JFlex/LexScan.flex")); File dir = new File("src"); task.setOutdir(dir); task.findPackageAndClass(); task.normalizeOutdir(); // this should be default jflex logic assertEquals(Options.getDir(), dir); } public void testDefaultDir() throws IOException { task.setFile(new File("src/JFlex/LexScan.flex")); task.findPackageAndClass(); task.normalizeOutdir(); // this should be default jflex logic assertEquals(Options.getDir(), new File("src/JFlex")); } public void testNomin() { assertTrue(!Options.no_minimize); task.setNomin(true); assertTrue(Options.no_minimize); } public void testSkipMinimization() { assertTrue(!Options.no_minimize); task.setSkipMinimization(true); assertTrue(Options.no_minimize); } public void testNobak() { assertTrue(!Options.no_backup); task.setNobak(true); assertTrue(Options.no_backup); } public void testCodeGen() { task.setSwitch(true); assertEquals(Options.gen_method, Options.SWITCH); task.setTable(true); assertEquals(Options.gen_method, Options.TABLE); task.setPack(true); assertEquals(Options.gen_method, Options.PACK); } public void testSkel() { task.setVerbose(false); // avoid to java console pop up task.setSkeleton(new File("src/skeleton.nested")); assertTrue(JFlex.Skeleton.line[3].indexOf("java.util.Stack") > 0); } public void testVerbose() { task.setVerbose(false); assertTrue(!Options.verbose); task.setVerbose(true); assertTrue(Options.verbose); } public void testTime() { assertTrue(!Options.time); task.setTimeStatistics(true); assertTrue(Options.time); task.setTime(false); assertTrue(!Options.time); } public void testDot() { assertTrue(!Options.dot); task.setDot(true); assertTrue(Options.dot); task.setGenerateDot(false); assertTrue(!Options.dot); } public void testDump() { assertTrue(!Options.dump); task.setDump(true); assertTrue(Options.dump); } public void testJlex() { assertTrue(!Options.jlex); task.setJLex(true); assertTrue(Options.jlex); } } jflex-1.4.3/src/JFlex/tests/CharClassesTest.java0000644000175000017500000000747211141010522020165 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.tests; import JFlex.IntCharSet; import JFlex.Interval; import junit.framework.TestCase; /** * CharClassesTest * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class CharClassesTest extends TestCase { /** * Constructor for CharClassesTest. * @param arg0 */ public CharClassesTest(String arg0) { super(arg0); } public void testAdd1() { IntCharSet set = new IntCharSet(new Interval('a','h')); set.add(new Interval('o','z')); set.add(new Interval('A','Z')); set.add(new Interval('h','o')); assertEquals("{ ['A'-'Z']['a'-'z'] }", set.toString()); } public void testAdd2() { IntCharSet set = new IntCharSet(new Interval('a','h')); set.add(new Interval('o','z')); set.add(new Interval('A','Z')); set.add(new Interval('i','n')); assertEquals("{ ['A'-'Z']['a'-'z'] }", set.toString()); } public void testAdd3() { IntCharSet set = new IntCharSet(new Interval('a','h')); set.add(new Interval('o','z')); set.add(new Interval('A','Z')); set.add(new Interval('a','n')); assertEquals("{ ['A'-'Z']['a'-'z'] }", set.toString()); } public void testMergeLast() { IntCharSet set = new IntCharSet(new Interval('a','k')); assertEquals("{ ['a'-'k'] }", set.toString()); set.add('l'); assertEquals("{ ['a'-'l'] }", set.toString()); } public void testAddChar() { IntCharSet set = new IntCharSet(new Interval('a','h')); set.add(new Interval('o','z')); set.add('n'); set.add('k'); assertEquals("{ ['a'-'h']['k']['n'-'z'] }", set.toString()); set.add('i'); assertEquals("{ ['a'-'i']['k']['n'-'z'] }", set.toString()); set.add('j'); assertEquals("{ ['a'-'k']['n'-'z'] }", set.toString()); set.add(new Interval('l','m')); assertEquals("{ ['a'-'z'] }", set.toString()); } public void testCopy() { IntCharSet set = new IntCharSet(new Interval('a','z')); IntCharSet copy = set.copy(); Interval i = set.getNext(); i.end = 'h'; assertEquals("{ ['a'-'h'] }", set.toString()); assertEquals("{ ['a'-'z'] }", copy.toString()); } public void testCaseless() { IntCharSet set = new IntCharSet(new Interval('a','c')); set.add(new Interval('h','o')); assertEquals("{ ['A'-'C']['H'-'O']['a'-'c']['h'-'o'] }", set.getCaseless().toString()); } } jflex-1.4.3/src/JFlex/tests/EmitterTest.java0000644000175000017500000000427711141010522017403 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.tests; import JFlex.Emitter; import junit.framework.TestCase; /** * Some unit tests for the jflex Emitter class * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class EmitterTest extends TestCase { /** * Constructor for EmitterTest. * @param name the test name */ public EmitterTest(String name) { super(name); } public void testJavadoc() { StringBuffer usercode = new StringBuffer("/* some *** comment */"); assertTrue(!Emitter.endsWithJavadoc(usercode)); usercode.append("import bla; /** javadoc /* */ "); assertTrue(Emitter.endsWithJavadoc(usercode)); usercode.append("bla"); assertTrue(!Emitter.endsWithJavadoc(usercode)); } } jflex-1.4.3/src/JFlex/tests/PackEmitterTest.java0000644000175000017500000000533011141010522020171 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * jflex * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.tests; import junit.framework.TestCase; import JFlex.Out; import JFlex.PackEmitter; /** * PackEmitterTest * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class PackEmitterTest extends TestCase { private PackEmitter p; /** * Constructor for PackEmitterTest. */ public PackEmitterTest() { super("PackEmitter test"); } public void setUp() { p = new PackEmitter("Bla") { public void emitUnpack() { } }; } public void testInit() { p.emitInit(); assertEquals( " private static final int [] ZZ_BLA = zzUnpackBla();" + Out.NL + Out.NL + " private static final String ZZ_BLA_PACKED_0 =" + Out.NL + " \"", p.toString()); } public void testEmitUCplain() { p.emitUC(8); p.emitUC(0xFF00); assertEquals("\\10\\uff00", p.toString()); } public void testLineBreak() { for (int i = 0; i < 36; i++) { p.breaks(); p.emitUC(i); } System.out.println(p); assertEquals( "\\0\\1\\2\\3\\4\\5\\6\\7\\10\\11\\12\\13\\14\\15\\16\\17\"+"+Out.NL+ " \"\\20\\21\\22\\23\\24\\25\\26\\27\\30\\31\\32\\33\\34\\35\\36\\37\"+"+Out.NL+ " \"\\40\\41\\42\\43", p.toString()); } } jflex-1.4.3/src/JFlex/tests/RegExpTests.java0000644000175000017500000000500111141010522017331 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.tests; import JFlex.*; import junit.framework.TestCase; /** * Unit tests for JFlex.RegExp * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class RegExpTests extends TestCase implements sym { /** * Constructor for RegExpTests. * * @param name the test name */ public RegExpTests(String name) { super(name); } public void testrevString() { assertTrue(RegExp.revString("blah").equals("halb")); } public void testCharClass() { Macros m = new Macros(); RegExp e1 = new RegExp1(CCLASS, new Interval('a','z')); RegExp e2 = new RegExp1(CHAR, new Character('Z')); RegExp e3 = new RegExp1(CCLASS, new Interval('0','9')); m.insert("macro", e3); RegExp s = new RegExp1(STAR, e1); RegExp u = new RegExp1(MACROUSE, "macro"); RegExp b = new RegExp2(BAR, e2, u); assertTrue(e1.isCharClass(m)); assertTrue(e2.isCharClass(m)); assertTrue(b.isCharClass(m)); assertTrue(!s.isCharClass(m)); assertTrue(u.isCharClass(m)); } } jflex-1.4.3/src/JFlex/tests/SkeletonTest.java0000644000175000017500000000465211141010522017553 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex.tests; import java.io.File; import JFlex.Skeleton; import junit.framework.TestCase; /** * SkeletonTest * * @author Gerwin Klein * @version $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class SkeletonTest extends TestCase { /** * Constructor for SkeletonTest. * @param arg0 test name */ public SkeletonTest(String arg0) { super(arg0); } public void testReplace() { assertEquals(Skeleton.replace("bla ", "blub", "bla blub bla "), "blubblub blub"); } public void testMakePrivate() { Skeleton.makePrivate(); for (int i=0; i < Skeleton.line.length; i++) { assertEquals(Skeleton.line[i].indexOf("public"), -1); } } public void testDefault() { Skeleton.readSkelFile(new File("src/skeleton.nested")); assertTrue(JFlex.Skeleton.line[3].indexOf("java.util.Stack") > 0); Skeleton.readDefault(); assertEquals(JFlex.Skeleton.line[3].indexOf("java.util.Stack"), -1); } } jflex-1.4.3/src/JFlex/Timer.java0000644000175000017500000000656011141010522015045 0ustar moonmoon/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * JFlex 1.4.3 * * Copyright (C) 1998-2009 Gerwin Klein * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License. See the file * * COPYRIGHT for more information. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License along * * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package JFlex; /** * Very simple timer for code generation time statistics. * * Not very exact, measures user time, not processor time. * * @author Gerwin Klein * @version JFlex 1.4.3, $Revision: 433 $, $Date: 2009-01-31 19:52:34 +1100 (Sat, 31 Jan 2009) $ */ public class Timer { /* the timer stores start and stop time from currentTimeMillis() */ private long startTime, stopTime; /* flag if the timer is running (if stop time is valid) */ private boolean running; /** * Construct a new timer that starts immediatly. */ public Timer() { startTime = System.currentTimeMillis(); running = true; } /** * Start the timer. If it is already running, the old start * time is lost. */ public void start() { startTime = System.currentTimeMillis(); running = true; } /** * Stop the timer. */ public void stop() { stopTime = System.currentTimeMillis(); running = false; } /** * Return the number of milliseconds the timer has been running. * * (up till now, if it still runs, up to the stop time if it has been stopped) */ public long diff() { if (running) return System.currentTimeMillis()-startTime; else return stopTime-startTime; } /** * Return a string representation of the timer. * * @return a string displaying the diff-time in readable format (h m s ms) * * @see Timer#diff */ public String toString() { long diff = diff(); long millis = diff%1000; long secs = (diff/1000)%60; long mins = (diff/(1000*60))%60; long hs = (diff/(1000*3600))%24; long days = diff/(1000*3600*24); if (days > 0) return days+"d "+hs+"h "+mins+"m "+secs+"s "+millis+"ms"; if (hs > 0) return hs+"h "+mins+"m "+secs+"s "+millis+"ms"; if (mins > 0) return mins+"m "+secs+"s "+millis+"ms"; if (secs > 0) return secs+"s "+millis+"ms"; return millis+"ms"; } } jflex-1.4.3/src/manifest0000644000175000017500000000002707606571215013661 0ustar moonmoonMain-Class: JFlex.Main jflex-1.4.3/src/README0000644000175000017500000000170011017221154012770 0ustar moonmoonThis directory contains the source code for JFlex. Dependencies You need the following tools in your class path: ant.jar >= 1.4 To compile, run first ant gettoolds (this will download JFlex, java_cup, and junit jars for bootstrapping) then, run ant jar The command "ant help" should give you other useful targets. Directory contents: manifest: jar manifest file for JFlex.jar skeleton: a skeleton file matching exactly the precompiled scanner skeleton. Can be used together with the --skel option skeleton.nested: a skeleton file that supports nested input streams (see the manual for the API). Can be used together with the --skel option JFlex: source files of package JFlex JFlex/gui: source files of package JFlex.gui JFlex/anttask source files of the JFlex Ant task (contributed by Rafal Mantiuk) JFlex/test unit tests for JFlex java_cup/runtime: CUP 11a beta 20060608 runtime classes, used by JFlex jflex-1.4.3/src/skeleton.default0000644000175000017500000001763211043015664015323 0ustar moonmoon /** This character denotes the end of file */ public static final int YYEOF = -1; /** initial size of the lookahead buffer */ --- private static final int ZZ_BUFFERSIZE = ...; /** lexical states */ --- lexical states, charmap /* error codes */ private static final int ZZ_UNKNOWN_ERROR = 0; private static final int ZZ_NO_MATCH = 1; private static final int ZZ_PUSHBACK_2BIG = 2; /* error messages for the codes above */ private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input", "Error: pushback value was too large" }; --- isFinal list /** the input device */ private java.io.Reader zzReader; /** the current state of the DFA */ private int zzState; /** the current lexical state */ private int zzLexicalState = YYINITIAL; /** this buffer contains the current text to be matched and is the source of the yytext() string */ private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; /** the textposition at the last accepting state */ private int zzMarkedPos; /** the current text position in the buffer */ private int zzCurrentPos; /** startRead marks the beginning of the yytext() string in the buffer */ private int zzStartRead; /** endRead marks the last character in the buffer, that has been read from input */ private int zzEndRead; /** number of newlines encountered up to the start of the matched text */ private int yyline; /** the number of characters up to the start of the matched text */ private int yychar; /** * the number of characters from the last newline up to the start of the * matched text */ private int yycolumn; /** * zzAtBOL == true <=> the scanner is currently at the beginning of a line */ private boolean zzAtBOL = true; /** zzAtEOF == true <=> the scanner is at the EOF */ private boolean zzAtEOF; /** denotes if the user-EOF-code has already been executed */ private boolean zzEOFDone; --- user class code /** * Creates a new scanner * There is also a java.io.InputStream version of this constructor. * * @param in the java.io.Reader to read input from. */ --- constructor declaration /** * Refills the input buffer. * * @return false, iff there was new input. * * @exception java.io.IOException if any I/O-Error occurs */ private boolean zzRefill() throws java.io.IOException { /* first: make room (if you can) */ if (zzStartRead > 0) { System.arraycopy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead-zzStartRead); /* translate stored positions */ zzEndRead-= zzStartRead; zzCurrentPos-= zzStartRead; zzMarkedPos-= zzStartRead; zzStartRead = 0; } /* is the buffer big enough? */ if (zzCurrentPos >= zzBuffer.length) { /* if not: blow it up */ char newBuffer[] = new char[zzCurrentPos*2]; System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); zzBuffer = newBuffer; } /* finally: fill the buffer with new input */ int numRead = zzReader.read(zzBuffer, zzEndRead, zzBuffer.length-zzEndRead); if (numRead > 0) { zzEndRead+= numRead; return false; } // unlikely but not impossible: read 0 characters, but not at end of stream if (numRead == 0) { int c = zzReader.read(); if (c == -1) { return true; } else { zzBuffer[zzEndRead++] = (char) c; return false; } } // numRead < 0 return true; } /** * Closes the input stream. */ public final void yyclose() throws java.io.IOException { zzAtEOF = true; /* indicate end of file */ zzEndRead = zzStartRead; /* invalidate buffer */ if (zzReader != null) zzReader.close(); } /** * Resets the scanner to read from a new input stream. * Does not close the old reader. * * All internal variables are reset, the old input stream * cannot be reused (internal buffer is discarded and lost). * Lexical state is set to ZZ_INITIAL. * * @param reader the new input stream */ public final void yyreset(java.io.Reader reader) { zzReader = reader; zzAtBOL = true; zzAtEOF = false; zzEOFDone = false; zzEndRead = zzStartRead = 0; zzCurrentPos = zzMarkedPos = 0; yyline = yychar = yycolumn = 0; zzLexicalState = YYINITIAL; } /** * Returns the current lexical state. */ public final int yystate() { return zzLexicalState; } /** * Enters a new lexical state * * @param newState the new lexical state */ public final void yybegin(int newState) { zzLexicalState = newState; } /** * Returns the text matched by the current regular expression. */ public final String yytext() { return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); } /** * Returns the character at position pos from the * matched text. * * It is equivalent to yytext().charAt(pos), but faster * * @param pos the position of the character to fetch. * A value from 0 to yylength()-1. * * @return the character at position pos */ public final char yycharat(int pos) { return zzBuffer[zzStartRead+pos]; } /** * Returns the length of the matched text region. */ public final int yylength() { return zzMarkedPos-zzStartRead; } /** * Reports an error that occured while scanning. * * In a wellformed scanner (no or only correct usage of * yypushback(int) and a match-all fallback rule) this method * will only be called with things that "Can't Possibly Happen". * If this method is called, something is seriously wrong * (e.g. a JFlex bug producing a faulty scanner etc.). * * Usual syntax/scanner level error handling should be done * in error fallback rules. * * @param errorCode the code of the errormessage to display */ --- zzScanError declaration String message; try { message = ZZ_ERROR_MSG[errorCode]; } catch (ArrayIndexOutOfBoundsException e) { message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; } --- throws clause } /** * Pushes the specified amount of characters back into the input stream. * * They will be read again by then next call of the scanning method * * @param number the number of characters to be read again. * This number must not be greater than yylength()! */ --- yypushback decl (contains zzScanError exception) if ( number > yylength() ) zzScanError(ZZ_PUSHBACK_2BIG); zzMarkedPos -= number; } --- zzDoEOF /** * Resumes scanning until the next regular expression is matched, * the end of input is encountered or an I/O-Error occurs. * * @return the next token * @exception java.io.IOException if any I/O-Error occurs */ --- yylex declaration int zzInput; int zzAction; // cached fields: int zzCurrentPosL; int zzMarkedPosL; int zzEndReadL = zzEndRead; char [] zzBufferL = zzBuffer; char [] zzCMapL = ZZ_CMAP; --- local declarations while (true) { zzMarkedPosL = zzMarkedPos; --- start admin (line, char, col count) zzAction = -1; zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; --- start admin (lexstate etc) zzForAction: { while (true) { --- next input, line, col, char count, next transition, isFinal action zzAction = zzState; zzMarkedPosL = zzCurrentPosL; --- line count update } } } // store back cached position zzMarkedPos = zzMarkedPosL; --- char count update --- actions default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; --- eofvalue } else { --- no match } } } } --- main } jflex-1.4.3/src/skeleton.nested0000644000175000017500000002555111043015664015160 0ustar moonmoon /** This character denotes the end of file */ public static final int YYEOF = -1; /** initial size of the lookahead buffer */ --- private static final int ZZ_BUFFERSIZE = ...; /** lexical states */ --- lexical states, charmap /* error codes */ private static final int ZZ_UNKNOWN_ERROR = 0; private static final int ZZ_NO_MATCH = 1; private static final int ZZ_PUSHBACK_2BIG = 2; /* error messages for the codes above */ private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input", "Error: pushback value was too large" }; --- isFinal list /** the input device */ private java.io.Reader zzReader; /** the current state of the DFA */ private int zzState; /** the current lexical state */ private int zzLexicalState = YYINITIAL; /** this buffer contains the current text to be matched and is the source of the yytext() string */ private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; /** the textposition at the last accepting state */ private int zzMarkedPos; /** the current text position in the buffer */ private int zzCurrentPos; /** startRead marks the beginning of the yytext() string in the buffer */ private int zzStartRead; /** endRead marks the last character in the buffer, that has been read from input */ private int zzEndRead; /** number of newlines encountered up to the start of the matched text */ private int yyline; /** the number of characters up to the start of the matched text */ private int yychar; /** * the number of characters from the last newline up to the start of the * matched text */ private int yycolumn; /** * zzAtBOL == true <=> the scanner is currently at the beginning of a line */ private boolean zzAtBOL = true; /** zzAtEOF == true <=> the scanner is at the EOF */ private boolean zzAtEOF; /** denotes if the user-EOF-code has already been executed */ private boolean zzEOFDone; /** the stack of open (nested) input streams to read from */ private java.util.Stack zzStreams = new java.util.Stack(); /** * inner class used to store info for nested * input streams */ private static final class ZzFlexStreamInfo { java.io.Reader zzReader; int zzEndRead; int zzStartRead; int zzCurrentPos; int zzMarkedPos; int yyline; int yycolumn; char [] zzBuffer; boolean zzAtEOF; boolean zzEOFDone; /** sets all values stored in this class */ ZzFlexStreamInfo(java.io.Reader zzReader, int zzEndRead, int zzStartRead, int zzCurrentPos, int zzMarkedPos, char [] zzBuffer, boolean zzAtEOF, int yyline, int yycolumn) { this.zzReader = zzReader; this.zzEndRead = zzEndRead; this.zzStartRead = zzStartRead; this.zzCurrentPos = zzCurrentPos; this.zzMarkedPos = zzMarkedPos; this.zzBuffer = zzBuffer; this.zzAtEOF = zzAtEOF; this.zzEOFDone = zzEOFDone; this.yyline = yyline; this.yycolumn = yycolumn; } } --- user class code /** * Creates a new scanner * There is also a java.io.InputStream version of this constructor. * * @param in the java.io.Reader to read input from. */ --- constructor declaration /** * Refills the input buffer. * * @return false, iff there was new input. * * @exception java.io.IOException if any I/O-Error occurs */ private boolean zzRefill() throws java.io.IOException { /* first: make room (if you can) */ if (zzStartRead > 0) { System.arraycopy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead-zzStartRead); /* translate stored positions */ zzEndRead-= zzStartRead; zzCurrentPos-= zzStartRead; zzMarkedPos-= zzStartRead; zzStartRead = 0; } /* is the buffer big enough? */ if (zzCurrentPos >= zzBuffer.length) { /* if not: blow it up */ char newBuffer[] = new char[zzCurrentPos*2]; System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); zzBuffer = newBuffer; } /* finally: fill the buffer with new input */ int numRead = zzReader.read(zzBuffer, zzEndRead, zzBuffer.length-zzEndRead); if (numRead > 0) { zzEndRead+= numRead; return false; } // unlikely but not impossible: read 0 characters, but not at end of stream if (numRead == 0) { int c = zzReader.read(); if (c == -1) { return true; } else { zzBuffer[zzEndRead++] = (char) c; return false; } } // numRead < 0) return true; } /** * Closes the input stream. */ public final void yyclose() throws java.io.IOException { zzAtEOF = true; /* indicate end of file */ zzEndRead = zzStartRead; /* invalidate buffer */ if (zzReader != null) zzReader.close(); } /** * Stores the current input stream on a stack, and * reads from a new stream. Lexical state, line, * char, and column counting remain untouched. * * The current input stream can be restored with * yypopstream (usually in an <> action). * * @param reader the new input stream to read from * * @see #yypopStream() */ public final void yypushStream(java.io.Reader reader) { zzStreams.push( new ZzFlexStreamInfo(zzReader, zzEndRead, zzStartRead, zzCurrentPos, zzMarkedPos, zzBuffer, zzAtEOF, yyline, yycolumn) ); zzAtEOF = false; zzBuffer = new char[ZZ_BUFFERSIZE]; zzReader = reader; zzEndRead = zzStartRead = 0; zzCurrentPos = zzMarkedPos = 0; yyline = yycolumn = 0; } /** * Closes the current input stream and continues to * read from the one on top of the stream stack. * * @throws java.util.EmptyStackException * if there is no further stream to read from. * * @throws java.io.IOException * if there was an error in closing the stream. * * @see #yypushStream(java.io.Reader) */ public final void yypopStream() throws java.io.IOException { zzReader.close(); ZzFlexStreamInfo s = (ZzFlexStreamInfo) zzStreams.pop(); zzBuffer = s.zzBuffer; zzReader = s.zzReader; zzEndRead = s.zzEndRead; zzStartRead = s.zzStartRead; zzCurrentPos = s.zzCurrentPos; zzMarkedPos = s.zzMarkedPos ; zzAtEOF = s.zzAtEOF; zzEOFDone = s.zzEOFDone; yyline = s.yyline; yycolumn = s.yycolumn; } /** * Returns true iff there are still streams left * to read from on the stream stack. */ public final boolean yymoreStreams() { return !zzStreams.isEmpty(); } /** * Resets the scanner to read from a new input stream. * Does not close the old reader. * * All internal variables are reset, the old input stream * cannot be reused (internal buffer is discarded and lost). * Lexical state is set to ZZ_INITIAL. * * @param reader the new input stream * * @see #yypushStream(java.io.Reader) * @see #yypopStream() */ public final void yyreset(java.io.Reader reader) { zzReader = reader; zzAtBOL = true; zzAtEOF = false; zzEOFDone = false; zzEndRead = zzStartRead = 0; zzCurrentPos = zzMarkedPos = 0; yyline = yychar = yycolumn = 0; zzLexicalState = YYINITIAL; } /** * Returns the current lexical state. */ public final int yystate() { return zzLexicalState; } /** * Enters a new lexical state * * @param newState the new lexical state */ public final void yybegin(int newState) { zzLexicalState = newState; } /** * Returns the text matched by the current regular expression. */ public final String yytext() { return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); } /** * Returns the character at position pos from the * matched text. * * It is equivalent to yytext().charAt(pos), but faster * * @param pos the position of the character to fetch. * A value from 0 to yylength()-1. * * @return the character at position pos */ public final char yycharat(int pos) { return zzBuffer[zzStartRead+pos]; } /** * Returns the length of the matched text region. */ public final int yylength() { return zzMarkedPos-zzStartRead; } /** * Reports an error that occured while scanning. * * In a wellformed scanner (no or only correct usage of * yypushback(int) and a match-all fallback rule) this method * will only be called with things that "Can't Possibly Happen". * If this method is called, something is seriously wrong * (e.g. a JFlex bug producing a faulty scanner etc.). * * Usual syntax/scanner level error handling should be done * in error fallback rules. * * @param errorCode the code of the errormessage to display */ --- zzScanError declaration String message; try { message = ZZ_ERROR_MSG[errorCode]; } catch (ArrayIndexOutOfBoundsException e) { message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; } --- throws clause } /** * Pushes the specified amount of characters back into the input stream. * * They will be read again by then next call of the scanning method * * @param number the number of characters to be read again. * This number must not be greater than yylength()! */ --- yypushback decl (contains zzScanError exception) if ( number > yylength() ) zzScanError(ZZ_PUSHBACK_2BIG); zzMarkedPos -= number; } --- zzDoEOF /** * Resumes scanning until the next regular expression is matched, * the end of input is encountered or an I/O-Error occurs. * * @return the next token * @exception java.io.IOException if any I/O-Error occurs */ --- yylex declaration int zzInput; int zzAction; --- local declarations while (true) { // cached fields: int zzCurrentPosL; int zzMarkedPosL = zzMarkedPos; int zzEndReadL = zzEndRead; char [] zzBufferL = zzBuffer; char [] zzCMapL = ZZ_CMAP; --- start admin (line, char, col count) zzAction = -1; zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; --- start admin (lexstate etc) zzForAction: { while (true) { --- next input, line, col, char count, next transition, isFinal action zzAction = zzState; zzMarkedPosL = zzCurrentPosL; --- line count update } } } // store back cached position zzMarkedPos = zzMarkedPosL; --- char count update --- actions default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; --- eofvalue } else { --- no match } } } } --- main }