From 916d6d5c6f6c9d14c4c9a636582671c81447f54a Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Wed, 15 Dec 1999 19:37:58 +0000 Subject: mods for doxygen-0.49-991106 --- INSTALL | 30 +- README | 4 +- VERSION | 2 +- doc/Doxyfile | 55 +- doc/autolink.doc | 4 +- doc/commands.doc | 67 +- doc/config.doc | 87 +- doc/doxygen_usage.doc | 12 +- doc/doxysearch_usage.doc | 8 +- doc/doxytag_usage.doc | 8 +- doc/features.doc | 23 +- doc/history.doc | 21 +- doc/htmlcmds.doc | 2 +- doc/index.doc | 4 +- doc/installdox_usage.doc | 2 +- doc/language.doc | 61 +- doc/starting.doc | 86 +- doc/trouble.doc | 7 +- examples/Makefile.in | 6 +- examples/define.h | 3 +- examples/group.cfg | 6 + examples/group.cpp | 47 + examples/group/html/annotated.html | 23 + examples/group/html/class_c1.html | 25 + examples/group/html/class_c2.html | 25 + examples/group/html/class_c3.html | 25 + examples/group/html/class_c4.html | 25 + examples/group/html/class_c5.html | 25 + examples/group/html/class_c6.html | 27 + examples/group/html/doxygen.css | 11 + examples/group/html/doxygen.gif | Bin 0 -> 3536 bytes examples/group/html/files.html | 22 + examples/group/html/group.cpp.html | 28 + examples/group/html/group_group1.html | 22 + examples/group/html/group_group2.html | 22 + examples/group/html/group_group3.html | 25 + examples/group/html/index.html | 17 + examples/group/html/modules.html | 25 + examples/group/html/null.gif | Bin 0 -> 43 bytes html/form-0.gif | Bin 0 -> 278 bytes html/form-1.gif | Bin 0 -> 224 bytes html/form-2.gif | Bin 0 -> 276 bytes html/form-3.gif | Bin 0 -> 290 bytes html/form-4.gif | Bin 0 -> 648 bytes html/form-5.gif | Bin 0 -> 2100 bytes src/Makefile.in | 2 + src/ce_lex.cpp | 1800 ++++ src/ce_parse.cpp | 1152 +++ src/ce_parse.h | 35 + src/classdef.cpp | 46 +- src/classdef.h | 42 +- src/code.cpp | 3534 +++++++ src/code.h | 3 +- src/code.l | 380 +- src/config.cpp | 3977 ++++++++ src/config.h | 133 +- src/config.l | 173 +- src/declinfo.cpp | 1967 ++++ src/defargs.cpp | 2099 ++++ src/definition.cpp | 107 +- src/definition.h | 21 +- src/diagram.cpp | 26 +- src/doxygen.cpp | 755 +- src/doxygen.h | 3 + src/doxytag.cpp | 2760 ++++++ src/doxytag.l | 4 +- src/entry.cpp | 6 +- src/entry.h | 4 +- src/example.h | 7 +- src/filedef.cpp | 95 +- src/filedef.h | 49 +- src/filename.cpp | 9 +- src/filename.h | 6 +- src/formula.cpp | 10 +- src/htmlgen.cpp | 76 +- src/htmlgen.h | 21 +- src/htmlhelp.h | 2 +- src/index.cpp | 144 +- src/index.h | 2 +- src/instdox.cpp | 4 +- src/latexgen.cpp | 53 +- src/latexgen.h | 19 +- src/mangen.cpp | 9 +- src/mangen.h | 11 + src/memberdef.cpp | 95 +- src/memberdef.h | 34 +- src/membergroup.cpp | 1 + src/membergroup.h | 7 + src/memberlist.cpp | 2 + src/namespacedef.cpp | 11 + src/namespacedef.h | 4 + src/outputgen.h | 13 +- src/outputlist.h | 21 + src/pre.cpp | 4468 +++++++++ src/pre.h | 4 +- src/pre.l | 13 +- src/scanner.cpp | 16522 ++++++++++++++++++++++++++++++++ src/scanner.h | 2 +- src/scanner.l | 373 +- src/tag.cpp | 1964 ++++ src/tag.l | 4 +- src/translator.h | 22 +- src/translator_cz.h | 263 +- src/translator_fr.h | 4 +- src/util.cpp | 89 +- src/util.h | 25 +- 106 files changed, 43467 insertions(+), 912 deletions(-) create mode 100644 examples/group.cfg create mode 100644 examples/group.cpp create mode 100644 examples/group/html/annotated.html create mode 100644 examples/group/html/class_c1.html create mode 100644 examples/group/html/class_c2.html create mode 100644 examples/group/html/class_c3.html create mode 100644 examples/group/html/class_c4.html create mode 100644 examples/group/html/class_c5.html create mode 100644 examples/group/html/class_c6.html create mode 100644 examples/group/html/doxygen.css create mode 100644 examples/group/html/doxygen.gif create mode 100644 examples/group/html/files.html create mode 100644 examples/group/html/group.cpp.html create mode 100644 examples/group/html/group_group1.html create mode 100644 examples/group/html/group_group2.html create mode 100644 examples/group/html/group_group3.html create mode 100644 examples/group/html/index.html create mode 100644 examples/group/html/modules.html create mode 100644 examples/group/html/null.gif create mode 100644 html/form-0.gif create mode 100644 html/form-1.gif create mode 100644 html/form-2.gif create mode 100644 html/form-3.gif create mode 100644 html/form-4.gif create mode 100644 html/form-5.gif create mode 100644 src/ce_lex.cpp create mode 100644 src/ce_parse.cpp create mode 100644 src/ce_parse.h create mode 100644 src/code.cpp create mode 100644 src/config.cpp create mode 100644 src/declinfo.cpp create mode 100644 src/defargs.cpp create mode 100644 src/doxytag.cpp create mode 100644 src/pre.cpp create mode 100644 src/scanner.cpp create mode 100644 src/tag.cpp diff --git a/INSTALL b/INSTALL index 9f4d753..fd93939 100644 --- a/INSTALL +++ b/INSTALL @@ -1,4 +1,4 @@ -DOXYGEN Version 0.49-991003 +DOXYGEN Version 0.49-991106 CONTENTS -------- @@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX: 1. Unpack the archive, unless you already have: - gunzip doxygen-0.49-991003.src.tar.gz # uncompress the archive - tar xf doxygen-0.49-991003.src.tar # unpack it + gunzip doxygen-0.49-991106.src.tar.gz # uncompress the archive + tar xf doxygen-0.49-991106.src.tar # unpack it 2. Run the configure script: @@ -86,7 +86,7 @@ You will need to install the windows/dos versions of following tools: location where bison.simple and bison.hairy are located. - Qt-1.xx (Qt-2.xx should also work, but I didn't test it for Windows) (Hint: only the tools section is required, so you can use the free - X-windows version as well!) + X-windows version (use Qt-1.44) as well!) You can get it at http://www.troll.no - Microsoft Visual C++ (I only tested with version 5.0). Use the vcvars32.bat to set the environment variables @@ -138,6 +138,26 @@ QT RELATED PROBLEMS: - Qt-2.01 contains a bug that makes some special characters appear as question marks (?) in the HTML output. + Bernhard Ristow provided a fix for this: + + % in QT-2.0.1 is a bug in the member function + % QTextStream &QTextStream::operator<<( char c ). + % + % If the character is negative the cast to int in + % ts_putc( c ) produces an invalid char as unsigned + % short (e.g. char c = -4 -> unsigned short: 65532). + % This produces a strange output. + % If we modify the function into: + % + % QTextStream &QTextStream::operator<<( char c ) + % { + % CHECK_STREAM_PRECOND + % unsigned char uc = (unsigned char) c; + % ts_putc( uc ); + % return *this; + % } + % it works correctly. + HTML RELATED PROBLEMS: - the indent continuously increases. This seems to be a problem that can be observed with Netscape 4.01. @@ -214,4 +234,4 @@ The latest version of doxygen can be obtained at Enjoy, -Dimitri van Heesch (03 October 1999) +Dimitri van Heesch (06 November 1999) diff --git a/README b/README index 5f0b489..2098a3e 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 0.49-991003 +DOXYGEN Version 0.49-991106 Please read INSTALL for compilation instructions. @@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at Enjoy, -Dimitri van Heesch (03 October 1999) +Dimitri van Heesch (06 November 1999) diff --git a/VERSION b/VERSION index 9709962..e60d5b9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.49-991003 +0.49-991106 diff --git a/doc/Doxyfile b/doc/Doxyfile index c7f9138..3c3e114 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -11,35 +11,36 @@ # # All output generated with Doxygen is not covered by this license. -PROJECT_NAME = -OUTPUT_DIRECTORY = .. -HTML_HEADER = -HTML_FOOTER = -QUIET = NO -WARNINGS = YES -DISABLE_INDEX = YES -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -GENERATE_MAN = NO -GENERATE_LATEX = YES -GENERATE_HTML = YES +PROJECT_NAME = +OUTPUT_DIRECTORY = .. +HTML_HEADER = +HTML_FOOTER = +QUIET = NO +WARNINGS = YES +DISABLE_INDEX = YES +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +GENERATE_MAN = NO +GENERATE_LATEX = YES +GENERATE_HTML = YES +GENERATE_HTMLHELP = YES ENABLE_PREPROCESSING = NO -INPUT = index.doc install.doc starting.doc faq.doc trouble.doc \ +INPUT = index.doc install.doc starting.doc faq.doc trouble.doc \ history.doc features.doc \ doxygen_usage.doc doxytag_usage.doc doxysearch_usage.doc \ installdox_usage.doc output.doc autolink.doc \ config.doc commands.doc htmlcmds.doc language.doc -FILE_PATTERNS = *.cpp *.h *.doc -EXAMPLE_PATH = ../examples -RECURSIVE = NO -TAGFILES = -ALLEXTERNALS = NO -PERL_PATH = /usr/local/bin/perl -SEARCHENGINE = NO -CGI_NAME = search.cgi -CGI_URL = -DOC_URL = -DOC_ABSPATH = -BIN_ABSPATH = /usr/local/bin/ -EXT_DOC_PATHS = -PDF_HYPERLINKS = YES +FILE_PATTERNS = *.cpp *.h *.doc +EXAMPLE_PATH = ../examples +RECURSIVE = NO +TAGFILES = +ALLEXTERNALS = NO +PERL_PATH = /usr/local/bin/perl +SEARCHENGINE = NO +CGI_NAME = search.cgi +CGI_URL = +DOC_URL = +DOC_ABSPATH = +BIN_ABSPATH = /usr/local/bin/ +EXT_DOC_PATHS = +PDF_HYPERLINKS = YES diff --git a/doc/autolink.doc b/doc/autolink.doc index 900d819..2f0e04c 100644 --- a/doc/autolink.doc +++ b/doc/autolink.doc @@ -58,9 +58,9 @@ where n>0. - \par Notice 1: + \par Note 1: The patterns above should not contain spaces, tabs or newlines. - \par Notice 2: + \par Note 2: For JavaDoc compatibility a \c # may be used instead of a \c :: in the patterns above. diff --git a/doc/commands.doc b/doc/commands.doc index d391c2c..34853af 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -176,6 +176,17 @@ Doxygen. Unrecognized commands are treated as normal text. group of classes, files or namespaces. This can be used to categorize classes, files or namespaces, and document those categories. + + The \ argument should an single word identifier. + + \par Example: + \verbinclude group.cpp + + \htmlonly + Click here + for the corresponding HTML documentation that is generated by Doxygen. + \endhtmlonly + \sa section \ref cmdingroup "\\ingroup"
@@ -197,7 +208,7 @@ Doxygen. Unrecognized commands are treated as normal text. If a comment block is located directly in front of an enum declaration, the \\enum comment may be omitted. - \par Notice: + \par Note: The type of an anonymous enum cannot be documented, but the values of an anonymous enum can. @@ -274,11 +285,12 @@ Doxygen. Unrecognized commands are treated as normal text. \sa section \ref cmdvar "\\var" and \ref cmdtypedef "\\typedef".
-\subsection cmdingroup \ingroup +\subsection cmdingroup \ingroup ( [ ]) \addindex \ingroup If the \\ingroup command is placed in a comment block of a - class, file or namespace, then it will be added to the group. + class, file or namespace, then it will be added to the group or + groups identified by \. \sa section \ref cmddefgroup "\\defgroup". @@ -345,10 +357,10 @@ Doxygen. Unrecognized commands are treated as normal text. Any other documentation that is inside the documentation block will by appended after the generated message. - \par Notice 1: + \par Note 1: You are responsible that there is indeed an earlier documented member that is overloaded by this one. - \par Notice 2: + \par Note 2: The \\overload command does not work inside a one-line comment. \par Example: \verbinclude examples/overload.cpp @@ -374,7 +386,7 @@ Doxygen. Unrecognized commands are treated as normal text. for the corresponding HTML documentation that is generated by Doxygen. \endhtmlonly - \par notice: + \par Note: The \ argument consists of a combination of letters and number digits. If you wish to use upper case letters (e.g. \c MYPAGE1), or mixed case letters (e.g. \c MyPage1) in the \ argument, you @@ -693,7 +705,7 @@ Doxygen. Unrecognized commands are treated as normal text. See section \ref autolink "\\autolink" for more information on automatically generated links and valid link-objects. - \b Notice: + \b Note: Keep in mind that links are only meaningful in HTML text; in \f$\mbox{\LaTeX}\f$ text, the link text is just written to the output. @@ -843,7 +855,7 @@ Doxygen. Unrecognized commands are treated as normal text. the example, is set to the start of the line following the line that is written (or to the end of the example if the pattern could not be found). - \par Notice: + \par Note: The command: \verbatim\skipline pattern\endverbatim is equivalent to: @@ -921,7 +933,7 @@ Doxygen. Unrecognized commands are treated as normal text.
No other types of alignment are supported. - \par Notice: + \par Note: For nested lists, HTML commands should be used.
@@ -1021,11 +1033,11 @@ Doxygen. Unrecognized commands are treated as normal text. endhtmlonly command. This command can be used to include HTML code that is too complex - for Doxygen (i.e. images, applets, java-scripts, and HTML tags that + for Doxygen (i.e. applets, java-scripts, and HTML tags that require attributes). You can use the \\latexonly and \\endlatexonly pair to provide a proper \f$\mbox{\LaTeX}\f$ alternative. - \b Notice: + \b Note: environment variables (like \$(HOME) ) are resolved inside a HTML-only block. @@ -1043,12 +1055,13 @@ Doxygen. Unrecognized commands are treated as normal text. The first argument specifies the output format. Currently, the following values are supported: \c html and \c latex. - The second argument specifies the path and file name of the image. - If a relative path is used, this will be relative to the directory to - which the output of the particular format is written. - For the html format you may also - specify an URL. If the name contains spaces you'll have to put - quotes (") around it. + The second argument specifies the file name of the image. + Doxygen will look for files in the paths (or files) that you specified + after the \ref cfg_image_path "IMAGE_PATH" tag and filter those files through the patterns + you specified after the \ref cfg_image_patterns "IMAGE_PATTERNS" tag. + If the image is found it + will be copied to the correct output directory. + If the image name contains spaces you'll have to put quotes (") around it. The third argument can be used to specify the width or height of the image. This is only useful for \f$\mbox{\LaTeX}\f$ output @@ -1057,19 +1070,28 @@ Doxygen. Unrecognized commands are treated as normal text. size specifier in \f$\mbox{\LaTeX}\f$ (for example 10cm or 6in). + Here is example of a comment block: + \verbatim /*! Here is a snapshot of my new application: - * \image html ../images/application.jpg - * \image latex ../images/application.eps width=10cm + * \image html application.jpg + * \image latex application.eps width=10cm */ \endverbatim + And this is an example of how the configuration file may look: + +\verbatim + IMAGE_PATH = my_image_dir + IMAGE_PATTERNS = *.eps *.gif *.jpg +\endverbatim + \warning The image format for HTML is limited to what your browser supports. For \f$\mbox{\LaTeX}\f$ the image format must be an encapsulated postscipt (eps).

- Doxygen does not check if an image exists or if it is in - the correct format. So \e you have to make sure this is the case! + Doxygen does not check if the image is in the correct format. + So \e you have to make sure this is the case!
\subsection cmdlatexonly \latexonly @@ -1084,7 +1106,7 @@ Doxygen. Unrecognized commands are treated as normal text. use the \\htmlonly and \\endhtmlonly pair to provide a proper HTML alternative. - \b Notice: + \b Note: environment variables (like \$(HOME) ) are resolved inside a \f$\mbox{\LaTeX}\f$-only block. @@ -1209,7 +1231,6 @@ browser generator. Do \e not use these commands in your own documentation.
  • \\functionindex
  • \\header
  • \\headerfilelist -
  • \\ingroup
  • \\inherit
  • \\l
  • \\postheader diff --git a/doc/config.doc b/doc/config.doc index 66eb694..f46964b 100644 --- a/doc/config.doc +++ b/doc/config.doc @@ -58,12 +58,14 @@ followed by the descriptions of the tags grouped by category.
  • \refitem cfg_cgi_name CGI_NAME
  • \refitem cfg_cgi_url CGI_URL
  • \refitem cfg_class_diagrams CLASS_DIAGRAMS +
  • \refitem cfg_cols_in_alpha_index COLS_IN_ALPHA_INDEX
  • \refitem cfg_compact_latex COMPACT_LATEX
  • \refitem cfg_disable_index DISABLE_INDEX
  • \refitem cfg_doc_abspath DOC_ABSPATH
  • \refitem cfg_doc_url DOC_URL
  • \refitem cfg_enable_preprocessing ENABLE_PREPROCESSING
  • \refitem cfg_example_path EXAMPLE_PATH +
  • \refitem cfg_example_patterns EXAMPLE_PATTERNS
  • \refitem cfg_exclude EXCLUDE
  • \refitem cfg_exclude_patterns EXCLUDE_PATTERNS
  • \refitem cfg_expand_only_predef EXPAND_ONLY_PREDEF @@ -84,6 +86,9 @@ followed by the descriptions of the tags grouped by category.
  • \refitem cfg_html_footer HTML_FOOTER
  • \refitem cfg_html_header HTML_HEADER
  • \refitem cfg_html_output HTML_OUTPUT +
  • \refitem cfg_html_stylesheet HTML_STYLESHEET +
  • \refitem cfg_image_path IMAGE_PATH +
  • \refitem cfg_image_patterns IMAGE_PATTERNS
  • \refitem cfg_include_path INCLUDE_PATH
  • \refitem cfg_inherit_docs INHERIT_DOCS
  • \refitem cfg_inline_info INLINE_INFO @@ -190,7 +195,8 @@ followed by the descriptions of the tags grouped by category. If the \c EXTRACT_ALL tag is set to \c YES all classes and functions will be included in the documentation, even if no documentation was available. - \b Notice: This will also disable the warnings about undocumented members + \par Note: + This will also disable the warnings about undocumented members that are normally produced when \c WARNINGS is set to \c YES \anchor cfg_extract_private @@ -238,7 +244,7 @@ followed by the descriptions of the tags grouped by category. prepend the brief description of a member or function before the detailed description - \par Notice: + \par Note: If both \c HIDE_UNDOC_MEMBERS and \c BRIEF_MEMBER_DESC are set to \c NO, the brief descriptions will be completely suppressed. @@ -290,7 +296,7 @@ followed by the descriptions of the tags grouped by category. \anchor cfg_javadoc_autobrief
    \c JAVADOC_AUTOBRIEF
    - \addinex JAVADOC_AUTOBRIEF + \addindex JAVADOC_AUTOBRIEF If the \c JAVADOC_NO_AUTOBRIEF is set to \c YES (the default) then Doxygen will interpret the first line (until the first dot) of a JavaDoc-style comment as the brief description. If set to NO, the Javadoc-style will @@ -304,7 +310,7 @@ followed by the descriptions of the tags grouped by category. reimplements. \anchor cfg_inline_info -
    INLINE_INFO
    +
    \c INLINE_INFO
    If the \c INLINE_INFO tag is set to \c YES (the default) then a tag [inline] is inserted in the documentation for inline members. @@ -321,7 +327,8 @@ followed by the descriptions of the tags grouped by category. \c myfile.cpp or directories like \c /usr/src/myproject. Separate the files or directories with spaces.
    - \b Notice: This tag (and only this tag) is \e required. + \b Note: + This tag (and only this tag) is \e required. \anchor cfg_file_patterns
    \c FILE_PATTERNS
    @@ -360,6 +367,29 @@ followed by the descriptions of the tags grouped by category. directories that contain example code fragments that are included (see the \\include command in section \ref cmdinclude "\\include"). +\anchor cfg_example_patterns +
    \c EXAMPLE_PATTERNS
    + \addindex EXAMPLE_PATTERNS + If the value of the \c EXAMPLE_PATH tag contains directories, you can use the + \c EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp + and *.h) to filter out the source-files in the directories. If left + blank all files are included. + +\anchor cfg_image_path +
    \c IMAGE_PATH
    + \addindex IMAGE_PATH + The \c IMAGE_PATH tag can be used to specify one or more files or + directories that contain images that are to be included in the + documentation (see the \ref cmdimage "\image" command). + +\anchor cfg_image_patterns +
    \c IMAGE_PATTERNS
    + \addindex IMAGE_PATTERNS + If the value of the \c IMAGE_PATH tag contains directories, you can use the + \c IMAGE_PATTERNS tag to specify one or more wildcard pattern (like *.gif + and *.eps) to filter out the image files in the directories. If left + blank all files are included. + \anchor cfg_input_filter
    \c INPUT_FILTER
    \addindex INPUT_FILTER @@ -410,9 +440,11 @@ followed by the descriptions of the tags grouped by category. standard header. The following commands have a special meaning inside the header: - \$title, \$datetime, \$date. + \$title, \$datetime, \$date, + \$doxygenversion. Doxygen will replace them by respectively - the title of the page, the current date and time, or only the current date. + the title of the page, the current date and time, only the current date, + or the version number of doxygen. \anchor cfg_html_footer
    \c HTML_FOOTER
    @@ -431,6 +463,28 @@ followed by the descriptions of the tags grouped by category. Doxygen will replace them by respectively the title of the page, the current date and time, or only the current date. +\anchor cfg_html_stylesheet +
    \c HTML_STYLESHEET
    + \addindex HTML_STYLESHEET + The \c HTML_STYLESHEET tag can be used to specify a user defined cascading + style sheet that is used by each HTML page. It can be used to + fine-tune the look of the HTML output. If the tag is left blank doxygen + will generate a default style sheet. Here is the default style sheet + that doxygen normally generates: + +\verbatim +H1 { text-align: center } +A.el { text-decoration: none; font-weight: bold } +DL.el { margin-left: -1cm } +DIV.fragment { width: 100%; border: none; background-color: #eeeeee } +DIV.in { margin-left: 16 } +DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 } +A.gl:link { color: #ffffff } +A.gl:visited { color: #ffffff } +A.gl { text-decoration: none; font-weight: bold; background-color: #ff8080 } +TD.md { background-color: #f2f2ff } +\endverbatim + \anchor cfg_html_align_members
    \c HTML_ALIGN_MEMBERS
    @@ -438,14 +492,14 @@ If the \c HTML_ALIGN_MEMBERS tag is set to \c YES, the members of classes, files or namespaces will be aligned in HTML using tables. If set to NO a bullet list will be used. -\par Notice +Note: Setting this tag to NO will become obsolete in the future, since I only intent to support and test the aligned representation. \anchor cfg_generate_htmlhelp
    \c GENERATE_HTMLHELP
    -If the \c GENERATE_HTMLHELP tag is set to \c YES, +If the \c GENERATE_HTMLHELP tag is set to \c YES then doxygen generates three additional HTML index files: \c index.hhp, \c index.hhc, and \c index.hhk. The \c index.hhp is a project file that can be read by @@ -472,6 +526,13 @@ If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index of all compounds will be generated. Enable this if the project contains a lot of classes, structs, unions or interfaces. +\anchor cfg_cols_in_alpha_index +
    \c COLS_IN_ALPHA_INDEX
    + +If the alphabetical index is enabled +(see \c ALPHABETICAL_INDEX) then the \c COLS_IN_ALPHA_INDEX tag can be +used to specify the number of columns in which this list will be split (can be a number in the range [1..20]) + \subsection latex_output LaTeX related options @@ -515,7 +576,7 @@ a lot of classes, structs, unions or interfaces. \anchor cfg_extra_packages
    \c EXTRA_PACKAGES
    \addindex EXTRA_PACKAGES - The EXTRA_PACKAGES tag can be used to specify one or more \f$\mbox{\LaTeX}\f$ + The \c EXTRA_PACKAGES tag can be used to specify one or more \f$\mbox{\LaTeX}\f$ package names that should be included in the \f$\mbox{\LaTeX}\f$ output. To get the times font for instance you can specify \verbatim @@ -555,7 +616,7 @@ EXTRA_PACKAGES = times \pagenumbering{arabic} \endverbatim - \par Notice: + \par Note: Only use a user defined header if you know what you are doing! @@ -581,7 +642,7 @@ EXTRA_PACKAGES = times \anchor cfg_man_extension
    \c MAN_EXTENSION
    \addindex MAX_EXTENSION - The MAN_EXTENSION tag determines the extension that is added to + The \c MAN_EXTENSION tag determines the extension that is added to the generated man pages (default is the subroutine's section .3) @@ -643,7 +704,7 @@ EXTRA_PACKAGES = times See section \ref doxytag_usage for more information about the usage of tag files. - \par Notice: + \par Note: Each tag file most have a unique name and if a tag file is not located in the directory in which doxygen is run, you must also specify the path to the tagfile here. diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc index b9f98b3..ff6f117 100644 --- a/doc/doxygen_usage.doc +++ b/doc/doxygen_usage.doc @@ -41,9 +41,15 @@ doxygen \endverbatim -The \c -s option is optional and can be used suppress the description that -doxygen normally generates for each tag. Try to use this option if you send -me configuration files! +Note:
    +
      +
    • If you do not want the description for each item in the configuration + file then you can use the optional \c -s option. + Try to use this option if you send me a configuration file as part of + a bug report! +
    • To make doxygen read/write to standard input/output instead of from/to + a file, use \c - for the file name. +
    If you also want to use the search engine, you should look at section \ref doxysearch_usage. diff --git a/doc/doxysearch_usage.doc b/doc/doxysearch_usage.doc index e3b1657..6024d2a 100644 --- a/doc/doxysearch_usage.doc +++ b/doc/doxysearch_usage.doc @@ -80,7 +80,7 @@ follow these steps:
  • \c search.gif: this is the image that is used for the search button. - \par Notice: + \par Note: On the Windows platform Unix shell scripts cannot be used. In fact the HTTP daemon that I tried (apache for Windows) only recognized .cgi files that were renamed @@ -106,9 +106,11 @@ follow these steps:
  • Run installdox to replace any dummy links in the documentation with real links. - Notice: When using a search engine this step is required + \par Note: + When using a search engine this step is required even if no tag files are used. If tag files are used you must specify the correct options. + @@ -128,7 +130,7 @@ This can be done by carefully following these steps: Apart from the file search.idx two other files will be generated: search.gif and search.cgi - \par Notice: + \par Note: Doxytag requires quite a large amount of memory to generate the search index (about 30 Mb on my Linux box)! The resulting index file requires about 3 Mb space on your disk. diff --git a/doc/doxytag_usage.doc b/doc/doxytag_usage.doc index fb966fd..cbccce8 100644 --- a/doc/doxytag_usage.doc +++ b/doc/doxytag_usage.doc @@ -28,7 +28,7 @@ It has two functions: documented in external documentation. Doxytag extracts this information directly from the HTML files. This has the advantage that you do not need to have the sources from which the documentation was extracted. - If you do have the sources you can also let \c doxygen generate the + If you \e do have the sources it is better to let \c doxygen generate the tag file by putting the name of the tag file after \c GENERATE_TAGFILE in the configuration file.
  • @@ -55,7 +55,7 @@ In both cases the input of doxytag consists of a set of HTML files. Then the documentation does not need to be regenerated by \c doxygen, only \c installdox has to be run. -\par Notice: +\par Note: Because the HTML files are expected to have a certain structure, only HTML files generated with doxygen or with Qt's class browser generator can be used. Doxytag only reads the HTML files, @@ -87,7 +87,7 @@ doxytag -t example.tag example/html installdox script that doxygen generates (See \ref installdox_usage for more information). - Notice that this is actually a feature because if you (or someone else) + Note that this is actually a feature because if you (or someone else) moves the external documentation to a different directory or URL you can simply run the script again and all links in the HTML files will be updated. @@ -109,7 +109,7 @@ A typical example to use doxytag to generate a search index is: doxytag -s search.idx \endverbatim -\par Notice: +\par Note: In the current version of doxygen, the search index must be called \c search.idx. diff --git a/doc/features.doc b/doc/features.doc index 7159124..aa3a33a 100644 --- a/doc/features.doc +++ b/doc/features.doc @@ -22,9 +22,13 @@
  • Requires very little overhead from the writer of the documentation. Plain text will do, but for more fancy or structured output HTML tags and/or some of doxygen's special commands can be used. -
  • Outputs documentation in on-line format (HTML and man page) and off-line - format (LaTeX) simulatiously (any one can be disabled if desired). - Both formats are optimized for ease of reading. +
  • Outputs documentation in on-line format (HTML and UNIX man page) and + off-line format (\f$\mbox{\LaTeX}\f$) simultaniously + (any one can be disabled if desired). Both formats are optimized for + ease of reading.
    + Furthermore, compressed HTML can be generated from HTML output using + Microsoft's HTML help workshop (Windows only) and PDF can be generated + from the \f$\mbox{\LaTeX}\f$ output.
  • Allows documentation of files, namespaces, classes, structs, unions, templates, variables, functions, typedefs, enums and defines.
  • Includes a full C preprocessor to allow proper parsing of conditional @@ -33,7 +37,7 @@ the Qt specific signal and slots sections. Extraction of private class members is optional.
  • Automatically generates of class diagrams in HTML (as clickable - image maps) and Latex (as encapsulated postscript). + image maps) and \f$\mbox{\LaTeX}\f$ (as encapsulated postscript images).
  • JavaDoc (1.1) and Qt-Doc compatible.
  • References to base/super classes and inherited/overridden members are generated automatically. @@ -46,7 +50,8 @@ of a member function or class. Most documentation systems (such as Javadoc) only support the former, others (such as Qt) only the latter.
  • You can type normal HTML tags in your documentation. Doxygen will convert - them to their equivalent Latex and man-page counterparts automatically. + them to their equivalent \f$\mbox{\LaTeX}\f$ and man-page + counterparts automatically.
  • Allows references to documentation generated for other projects (or another part of the same project) in a location independent way.
  • Allows inclusion of source code examples that are automatically @@ -54,12 +59,12 @@
  • Inclusion of undocumented classes is also supported, allowing to quickly learn the structure and interfaces of a (large) piece of code without looking into the implementation details. -
  • All options are read from an easy to edit and documented configuration - file. +
  • Allows automatic cross-referencing of (documented) entities with their + definition in the source code. +
  • All options are read from an easy to edit and documented + configuration file.
  • Documentation and search engine can be transferred to another location or machine without regenerating the documentation. -
  • Doxygen can generate index and project files that can - be converted into compressed HTML by MicroSoft's HTML help workshop.
  • Can cope with large projects easily. diff --git a/doc/history.doc b/doc/history.doc index 3571bd6..ff29e7c 100644 --- a/doc/history.doc +++ b/doc/history.doc @@ -22,8 +22,6 @@
  • Add support for grouping members, and document then as a group.
  • Support for K&R-style function arguments.
  • More ouput formats: suggested are info format and RTF format. -
  • Reintroduction of the multi-column class list (and file list) to quickly - select a class or file
  • Split long lists in an index to a set of smaller lists.
  • Add a nice graphical front-end for creating and modifying the configuration file (it should be flexible enough to quickly add new options). @@ -34,15 +32,18 @@ not yet listed here, please let me know. -

    Features scheduled for version 0.5

    +

    Features scheduled for version 1.0

      -
    • Proper support for namespaces. -
    • Include LaTeX style formulas in LaTeX and HTML output (in HTML as a gif). -
    • Proper support for template classes, members, functions and specializations. -
    • Multi-lingual support. -
    • Generation of class diagrams (clickable image maps in HTML, eps images in - postscript). -
    • Add generator for man pages format. +
    • Include LaTeX style formulas in LaTeX and HTML output (in HTML as a gif). +
    • Multi-lingual support: currently supported languages are: English, + Dutch, French, German, Italian, Swedish, Czech, Japanese. +
    • Generation of class diagrams (clickable image maps in HTML, eps images + in postscript). +
    • Output generator for the man page format. +
    • Proper support for template classes, members, functions and specializations. +
    • Proper support for namespaces. +
    • Reintroduction of the multi-column class list (and file list) to quickly + select a class or file

    Version 0.4

    diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc index 7a35200..38b1459 100644 --- a/doc/htmlcmds.doc +++ b/doc/htmlcmds.doc @@ -16,7 +16,7 @@ /*! \page htmlcmds HTML Commands Here is a list of all HTML commands that may be used inside the -documentation. Notice that all attributes of a HTML tag are ignored +documentation. Note that all attributes of a HTML tag are ignored (the HREF and NAME attributes for the A tag are the only exception).
      diff --git a/doc/index.doc b/doc/index.doc index dc12600..5684f6c 100644 --- a/doc/index.doc +++ b/doc/index.doc @@ -180,8 +180,10 @@ Matthias Baas, Walter Mueller, William van Dieten, Joshua Jensen, -Patrick Aberts, +Patrick Alberts, Jacques Tremblay, +John Sturton, +Moshe Kruger, and many others for suggestions, patches and bug reports.
    */ diff --git a/doc/installdox_usage.doc b/doc/installdox_usage.doc index d22e4a7..11f8710 100644 --- a/doc/installdox_usage.doc +++ b/doc/installdox_usage.doc @@ -40,7 +40,7 @@ The following options are available: that is used by doxygen. The location \ can be an absolute path or a URL. - \par Notice: + \par Note: Each must be unique and should only be the name of the file, not including the path. diff --git a/doc/language.doc b/doc/language.doc index 2440a08..96afee0 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -35,7 +35,8 @@ Here is a list of the languages and their current maintainers: Language Maintainer - Contact address + Contact address + (remove the NOSPAM.) German @@ -44,8 +45,8 @@ Here is a list of the languages and their current maintainers: Jens Breitenstein -
    - Jens.Breitenstein@tlc.de + + Jens.Breitenstein@NOSPAM.tlc.de @@ -56,8 +57,8 @@ Here is a list of the languages and their current maintainers: Christophe Bordeux - - bordeux@lig.di.epfl.ch + + bordeux@NOSPAM.lig.di.epfl.ch @@ -69,10 +70,10 @@ Here is a list of the languages and their current maintainers: XeT Erixon - - sahag96@nts.mh.se
    - - xet@hem.passagen.se + + sahag96@NOSPAM.nts.mh.se
    + + xet@NOSPAM.hem.passagen.se @@ -83,8 +84,8 @@ Here is a list of the languages and their current maintainers: Vlastimil Havran - - havran@fel.cvut.cz + + havran@NOSPAM.fel.cvut.cz @@ -95,8 +96,8 @@ Here is a list of the languages and their current maintainers: Ionutz Borcoman - - borco@borco-ei.eng.hokudai.ac.jp + + borco@NOSPAM.borco-ei.eng.hokudai.ac.jp @@ -107,8 +108,8 @@ Here is a list of the languages and their current maintainers: Piotr Piatkowski - - kompas@ceti.com.pl + + kompas@NOSPAM.ceti.com.pl @@ -120,10 +121,10 @@ Here is a list of the languages and their current maintainers: Alessandro Falappa - - aaf23@cam.ac.uk
    - - a.falappa@flashnet.it + + aaf23@NOSPAM.cam.ac.uk
    + + a.falappa@NOSPAM.flashnet.it @@ -134,8 +135,8 @@ Here is a list of the languages and their current maintainers: Kenji Nagamatsu - - naga@joyful.club.ne.jp + + naga@NOSPAM.joyful.club.ne.jp @@ -146,8 +147,8 @@ Here is a list of the languages and their current maintainers: Francisco Oltra Thennet - - foltra@puc.cl + + foltra@NOSPAM.puc.cl @@ -158,8 +159,8 @@ Here is a list of the languages and their current maintainers: Olli Korhonen - - Olli.Korhonen@ccc.fi + + Olli.Korhonen@NOSPAM.ccc.fi @@ -170,8 +171,8 @@ Here is a list of the languages and their current maintainers: Vladimir Vodolazkiy - - voldemarus@geocities.com + + voldemarus@NOSPAM.geocities.com @@ -183,8 +184,8 @@ Here is a list of the languages and their current maintainers: Dimitri van Heesch - - dimitri@stack.nl + + dimitri@NOSPAM.stack.nl @@ -201,7 +202,7 @@ Here is a list of the languages and their current maintainers: \hline French & Christophe Bordeux & {\tt bordeux@lig.di.epfl.ch} \\ \hline - Swedish & Samuel Hägglund & {\tt sahag96@nts.mh.se} \\ + Swedish & Samuel H\"agglund & {\tt sahag96@nts.mh.se} \\ & XeT Erixon & {\tt xet@hem.passagen.se} \\ \hline Czech & Vlastimil Havran & {\tt havran@fel.cvut.cz} \\ diff --git a/doc/starting.doc b/doc/starting.doc index e89f717..293f6b2 100644 --- a/doc/starting.doc +++ b/doc/starting.doc @@ -20,7 +20,7 @@ generates the documentation. See section \ref doxygen_usage for more detailed usage information. The executable \c doxytag is only needed if you want to generate references -to external documentation (i.e. documentation that was generated by Doxygen) +to external documentation (i.e. documentation that was generated by doxygen) for which you do not have the sources or to create a search index for the search engine. See section \ref doxytag_usage for more detailed usage information. @@ -35,7 +35,7 @@ Each project should get its own configuration file. A project can consist of a single source file, but can also be an entire source tree that is recursively scanned. -To simplify the creation of a configuration file, Doxygen can create a +To simplify the creation of a configuration file, doxygen can create a template configuration file for you. To do this call \c doxygen with the \c -g option: @@ -44,8 +44,10 @@ doxygen -g \endverbatim where \ is the name of the configuration file. If you omit the file name, a file named \c Doxyfile will be created. If a file with the -name \ already exists, Doxygen will rename it to +name \ already exists, doxygen will rename it to \.bak before generating the configuration template. +If you use - as the file name then doxygen will try to read +the configuration file from standard input (stdin). The configuration file has a format that is similar to that of a (simple) Makefile. It contains of a number of assignments (tags) of the form: @@ -53,7 +55,8 @@ Makefile. It contains of a number of assignments (tags) of the form: TAGNAME = VALUE or
    TAGNAME = VALUE1 VALUE2 ...
    -You can probably leave the values of most tags to their default value. +You can probably leave the values of most tags in a generated template +configuration file to their default value. The \c INPUT tag is the only tag for which you are required to provide a value. See section \ref config for more details about the configuration file. @@ -62,20 +65,25 @@ you can add the names of the files after the \c INPUT tag. If you have a larger project consisting of a source directory or tree this may become tiresome. In this case you should put the root directory or directories after the \c INPUT tag, and add one or more file -patterns to the \c FILE_PATTERN tag. Only files that match one of the +patterns to the \c FILE_PATTERN tag (for instance *.cpp *.h). +Only files that match one of the patterns will be parsed (if the patterns are omitted all files will be parsed). For recursive parsing of a source tree you must set -the \c RECURSIVE tag to \c YES. To further finetune the list of files +the \c RECURSIVE tag to \c YES. To further fine-tune the list of files that is parsed the \c EXCLUDE and \c EXCLUDE_PATTERNS tags can be used. -If you start using Doxygen for an existing project (thus without any -documentation that Doxygen is aware of), you can still get an idea of +If you start using doxygen for an existing project (thus without any +documentation that doxygen is aware of), you can still get an idea of what the documented result would be. To do so, you must set the \c EXTRACT_ALL -tag in the configuration file to \c YES. Then, Doxygen will pretend +tag in the configuration file to \c YES. Then, doxygen will pretend everything in your sources is documented. Please note that warnings of undocumented members will not be generated as long as \c EXTRACT_ALL is set to \c YES. +To analyse an existing piece of software it is useful to cross-reference +a (documented) entity with its definition in the source files. Doxygen will +generate such cross-references if you set the SOURCE_BROWSER tag to YES. + \subsection step2 Step 2: Running doxygen To generate the documentation you can now enter: @@ -100,24 +108,28 @@ exist, \c doxygen will try to create it for you. The generated HTML documentation can be viewed by pointing a HTML browser to the \c index.html file in the \c html directory. For the best results a browser that supports cascading style sheets (CSS) should be used -(I'm currently using Netscape 4.0 to test the generated output). +(I'm currently using Netscape 4.61 to test the generated output). \addindex LaTeX The generated \f$\mbox{\LaTeX}\f$ documentation must first be compiled by -a \f$\mbox{\LaTeX}\f$ compiler. (I use teTeX distribution version 0.4 +a \f$\mbox{\LaTeX}\f$ compiler. (I use teTeX distribution version 0.9 that contains \f$\mbox{\TeX}\f$ version 3.14159). To simplify the process of compiling the generated documentation, \c doxygen writes a \c Makefile into the \c latex directory. By typing \c make in the \c latex directory the dvi file \c refman.dvi -will be generated. This file can then be viewed using \c xdvi or +will be generated (provided that you have a make tool called +make ofcourse). This file can then be viewed using \c xdvi or converted into a postscript file \c refman.ps by typing make ps -(this requires \c dvips ). The Postscript file can be send to a postscript +(this requires \c dvips ). Conversion to PDF is also possible; just type +make pdf. The Postscript file can be send to a postscript printer. If you do not have a postscript printer, you can try to use ghostscript to convert postscript into something your printer understands. +To get the best results for PDF output you should set the +\c PDF_HYPERLINKS tag to \c YES. The generated man pages can be viewed using the \c man program. You do need -to make sure the man directory is in the man path (see the MANPATH -environment variable). Notice that there are some limitations to the +to make sure the man directory is in the man path (see the \c MANPATH +environment variable). Note that there are some limitations to the capabilities of the man page format, so some information (like class diagrams, cross references and formulas) will be lost. @@ -125,7 +137,7 @@ capabilities of the man page format, so some information Although documenting the source is presented as step 3, in a new project this should ofcourse be step 1. Here I assume -you already have some code and you want Doxygen to generate a nice document +you already have some code and you want doxygen to generate a nice document describing the API and maybe the internals as well. If the \c EXTRACT_ALL option is set to \c NO in the configuration file @@ -141,7 +153,7 @@ these? For members, classes and namespaces there are basicly two options:
  • Place a special documentation block somewhere else (another file or another location) \e and put a structural command in the documentation block. A structural command links a documentation block - to a certain object that can be documented (e.g. a member, class, + to a certain entity that can be documented (e.g. a member, class, namespace or file). See section \ref structuralcommands to learn more about structural commands. @@ -170,7 +182,7 @@ During parsing the following steps take place: \subsection specialblock Special documentation blocks -The following types of special documentation blocks are supported by Doxygen: +The following types of special documentation blocks are supported by doxygen:
    • The Qt style, where special documentation blocks look like: \verbatim @@ -196,14 +208,14 @@ Here is an example of a documented piece of C++ code using the Qt style: \verbinclude qtstyle.cpp \htmlonly Click here - for the corresponding HTML documentation that is generated by Doxygen. + for the corresponding HTML documentation that is generated by doxygen. \endhtmlonly The one-line comments should contain a brief description, whereas the multi-line comment blocks contain a more detailed description. The brief descriptions are included in the member overview of a class, namespace or file and are printed using a small italic font -(this description can be omitted by setting \c BRIEF_STDMETHOD_DESC to \c NO in +(this description can be omitted by setting \c BRIEF_MEMBER_DESC to \c NO in the config file). By default the brief descriptions are also the first sentence of the detailed description (this can be changed by setting the \c REPEAT_BRIEF tag to \c NO). @@ -215,15 +227,15 @@ style: \verbinclude jdstyle.cpp \htmlonly Click here - for the corresponding HTML documentation that is generated by Doxygen. + for the corresponding HTML documentation that is generated by doxygen. \endhtmlonly -Notice that the first sentence of the documentation (until the .) +Note that the first sentence of the documentation (until the .) is treated as a brief description, whereas the documentation block as a whole forms the detailed description. The brief description is required for the JavaDoc style. -Unlike most other documentation systems, Doxygen also allows you to put +Unlike most other documentation systems, doxygen also allows you to put the documentation of members (including global functions) in front of the \e definition. This way the documentation can be placed in the source file instead of the header file. This keeps the header file compact, and allows the @@ -248,7 +260,7 @@ Structural commands (like all other commands) start with a backslash (\\) followed by a command name and one or more parameters. For instance, if you want to document the class \c Test in the example above, you could have also put the following documentation block somewhere -in the input that is read by Doxygen: +in the input that is read by doxygen: \verbatim /*! \class Test \brief A test class. @@ -271,7 +283,7 @@ Other structural commands are:
    • \c \namespace to document a namespace.
    See section \ref commands for detailed information about these and other -commands. Notice that the documentation block belonging to a file +commands. Note that the documentation block belonging to a file should always contain a structural command. To document a member of a C++ class, you must also document the class @@ -285,10 +297,10 @@ using structural commands: \verbinclude structcmd.h \htmlonly Click here - for the corresponding HTML documentation that is generated by Doxygen. + for the corresponding HTML documentation that is generated by doxygen. \endhtmlonly -\par Notice: +\par Note: Because each comment block in the example above contains a structural command, all the comment blocks could be moved to another location or input file (the source file for instance), without affecting the generated @@ -300,7 +312,7 @@ using structural commands: If you want to document the members of a file, struct, union, class, or enum and you want to put the documentation for these members inside the compound, it is sometimes desired to place the documentation block after the member -instead of before. For this purpose Doxygen has the following +instead of before. For this purpose doxygen has the following additional comment blocks: \verbatim /*!< ... */ @@ -318,7 +330,7 @@ and \verbatim ///< ... \endverbatim -Notice that these blocks have the same structure and meaning as the +Note that these blocks have the same structure and meaning as the special comment blocks above only the \< indicates that the member is located in front of the block instead of after the block. @@ -326,7 +338,7 @@ Here is an example of a the use of these comment blocks: \verbinclude afterdoc.h \htmlonly Click here - for the corresponding HTML documentation that is generated by Doxygen. + for the corresponding HTML documentation that is generated by doxygen. \endhtmlonly \warning These blocks can only be used to document \e members. @@ -343,11 +355,11 @@ in the HTML documentation, you will also need to have the following tools installed
    • \c latex: the \f$\mbox{\LaTeX}\f$ compiler, needed to parse the formulas. - To test I have used the teTeX 0.4 distribution. + To test I have used the teTeX 0.9 distribution.
    • \c dvips: a tool to convert dvi files to postscript files - I have used version 5.58f from Radical Eye software for testing. + I have used version 5.86 from Radical Eye software for testing.
    • \c gs: the ghostscript interpreter for converting postscript files - to bitmaps. I have used Aladdin Ghostscript 5.01 for testing. + to bitmaps. I have used Aladdin Ghostscript 5.10 for testing.
    There are two ways to include formulas in the documentation. @@ -392,7 +404,7 @@ There are two ways to include formulas in the documentation. Formulas should be valid commands in \f$\mbox{\LaTeX}\f$'s math-mode. -\warning Currently, Doxygen is not very fault tolerant in recovering +\warning Currently, doxygen is not very fault tolerant in recovering from typos in formulas. It may have to be necessary to remove the file formula.repository that is written in the html directory to a rid of an incorrect formula @@ -442,7 +454,7 @@ after preprocessing becomes: static const char * version = "1.xx"; \endverbatim -Notice that doxygen will now expand \e all macro definitions +Note that doxygen will now expand \e all macro definitions (recursively if needed). This is often too much. Therefore, doxygen also allows you to expand only those defines that you explicitly specify. For this you have to set the \c EXPAND_ONLY_PREDEF tag to \c YES @@ -500,11 +512,11 @@ class IUnknown }; \endverbatim -Notice that the \c PREDEFINED tag accepts function like macro definitions +Note that the \c PREDEFINED tag accepts function like macro definitions (like \c DECLARE_INTERFACE), normal macro substitutions (like \c PURE and \c THIS) and plain defines (like \c __cplusplus). -Notice also that preprocessor definitions that are normally defined +Note also that preprocessor definitions that are normally defined automatically by the preprocessor (like \c __cplusplus), have to be defined by hand with doxygen's parser (this is done because these defines are often platform/compiler specific). diff --git a/doc/trouble.doc b/doc/trouble.doc index f02914b..a9aaf99 100644 --- a/doc/trouble.doc +++ b/doc/trouble.doc @@ -24,8 +24,8 @@ properly. If you find such a piece, please send it to me, so I can improve doxygen's parsing capabilities. Try to make the piece of code you send as small as possible, to help me narrow down the search. -
  • Using declarations and directives are not yet. They are - simply ignored. +
  • Using declarations are not yet supported. They are simply ignored. + Using directives are supported however.
  • Doxygen does not work properly if there are multiple classes, structs or unions with the same name in your code. It should not crash however, rather it should ignore all of the classes with the same name except one. @@ -42,7 +42,8 @@ \verbatim const int (a); \endverbatim - is also seen as a function declaration, because only the syntax is analysed, + is also seen as a function declaration with name + int, because only the syntax is analysed, not the semantics. If the redundant braces can be detected, as in \verbatim int *(a[20]); diff --git a/examples/Makefile.in b/examples/Makefile.in index 5bff80e..89d4e12 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -18,7 +18,8 @@ all: class/html/index.html \ restypedef/html/index.html \ afterdoc/html/index.html \ template/html/index.html \ - tag/html/index.html + tag/html/index.html \ + group/html/index.html clean: rm -rf class define enum file func page relates author \ @@ -86,3 +87,6 @@ afterdoc/html/index.html: afterdoc.h afterdoc.cfg template/html/index.html: templ.cpp templ.cfg $(DOXYGEN)/bin/doxygen templ.cfg + +group/html/index.html: group.cpp group.cfg + $(DOXYGEN)/bin/doxygen group.cfg diff --git a/examples/define.h b/examples/define.h index 9a8e4d0..393010e 100644 --- a/examples/define.h +++ b/examples/define.h @@ -4,8 +4,7 @@ This is to test the documentation of defines. */ -/*! \def ABS(x) +/*! The define ABS computes the absolute value of its argument \a x. */ - #define ABS(x) (((x)>0)?(x):-(x)) diff --git a/examples/group.cfg b/examples/group.cfg new file mode 100644 index 0000000..6f75c75 --- /dev/null +++ b/examples/group.cfg @@ -0,0 +1,6 @@ +PROJECT_NAME = "Grouping" +OUTPUT_DIRECTORY = group +GENERATE_LATEX = NO +GENERATE_MAN = NO +INPUT = group.cpp +QUIET = YES diff --git a/examples/group.cpp b/examples/group.cpp new file mode 100644 index 0000000..7bd3255 --- /dev/null +++ b/examples/group.cpp @@ -0,0 +1,47 @@ +/*! \defgroup group1 The First Group + * This is the first group + */ + +/*! \defgroup group2 The Second Group + * This is the second group + */ + +/*! \defgroup group3 The Third Group + * This is the third group + */ + +/*! \ingroup group1 + * \brief class C1 in group 1 + */ +class C1 {}; + +/*! \ingroup group1 + * \brief class C2 in group 1 + */ +class C2 {}; + +/*! \ingroup group2 + * \brief class C3 in group 2 + */ +class C3 {}; + +/*! \ingroup group2 + * \brief class C4 in group 2 + */ +class C4 {}; + +/*! \ingroup group3 + * \brief class C5 in \link group3 the third group\endlink. + */ +class C5 {}; + +/*! \ingroup group1 group2 group3 + * \brief class C6 in all groups + * \sa \link group1 The first group\endlink, group2, group3 + */ +class C6 {}; + +/*! \file + * \ingroup group3 + * \brief this file in group 3 + */ diff --git a/examples/group/html/annotated.html b/examples/group/html/annotated.html new file mode 100644 index 0000000..8d5b40d --- /dev/null +++ b/examples/group/html/annotated.html @@ -0,0 +1,23 @@ + + +Annotated Index + + + +
    +Main Page   Modules   Compound List   File List  
    +

    Grouping Compound List

    Here are the classes, structs, unions and interfaces with brief descriptions:
      +
    • C1 (Class C1 in group 1) +
    • C2 (Class C2 in group 1) +
    • C3 (Class C3 in group 2) +
    • C4 (Class C4 in group 2) +
    • C5 (Class C5 in the third group) +
    • C6 (Class C6 in all groups) +
    +
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/class_c1.html b/examples/group/html/class_c1.html new file mode 100644 index 0000000..9287ad7 --- /dev/null +++ b/examples/group/html/class_c1.html @@ -0,0 +1,25 @@ + + +C1 Class Reference + + + +
    +Main Page   Modules   Compound List   File List  
    +

    C1 Class Reference

    class C1 in group 1. +More... +

    + +
    +


    Detailed Description

    +class C1 in group 1. +

    +


    The documentation for this class was generated from the following file: +
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/class_c2.html b/examples/group/html/class_c2.html new file mode 100644 index 0000000..fc32d12 --- /dev/null +++ b/examples/group/html/class_c2.html @@ -0,0 +1,25 @@ + + +C2 Class Reference + + + +
    +Main Page   Modules   Compound List   File List  
    +

    C2 Class Reference

    class C2 in group 1. +More... +

    + +
    +


    Detailed Description

    +class C2 in group 1. +

    +


    The documentation for this class was generated from the following file: +
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/class_c3.html b/examples/group/html/class_c3.html new file mode 100644 index 0000000..7b31b0f --- /dev/null +++ b/examples/group/html/class_c3.html @@ -0,0 +1,25 @@ + + +C3 Class Reference + + + +
    +Main Page   Modules   Compound List   File List  
    +

    C3 Class Reference

    class C3 in group 2. +More... +

    + +
    +


    Detailed Description

    +class C3 in group 2. +

    +


    The documentation for this class was generated from the following file: +
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/class_c4.html b/examples/group/html/class_c4.html new file mode 100644 index 0000000..11521fe --- /dev/null +++ b/examples/group/html/class_c4.html @@ -0,0 +1,25 @@ + + +C4 Class Reference + + + +
    +Main Page   Modules   Compound List   File List  
    +

    C4 Class Reference

    class C4 in group 2. +More... +

    + +
    +


    Detailed Description

    +class C4 in group 2. +

    +


    The documentation for this class was generated from the following file: +
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/class_c5.html b/examples/group/html/class_c5.html new file mode 100644 index 0000000..28f0349 --- /dev/null +++ b/examples/group/html/class_c5.html @@ -0,0 +1,25 @@ + + +C5 Class Reference + + + +
    +Main Page   Modules   Compound List   File List  
    +

    C5 Class Reference

    class C5 in the third group. +More... +

    + +
    +


    Detailed Description

    +class C5 in the third group. +

    +


    The documentation for this class was generated from the following file: +
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/class_c6.html b/examples/group/html/class_c6.html new file mode 100644 index 0000000..5dec333 --- /dev/null +++ b/examples/group/html/class_c6.html @@ -0,0 +1,27 @@ + + +C6 Class Reference + + + +
    +Main Page   Modules   Compound List   File List  
    +

    C6 Class Reference

    class C6 in all groups. +More... +

    + +
    +


    Detailed Description

    +class C6 in all groups. +

    +

    +See also:
    + The first group, The Second Group, The Third Group

    The documentation for this class was generated from the following file: +
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/doxygen.css b/examples/group/html/doxygen.css new file mode 100644 index 0000000..e1dee1c --- /dev/null +++ b/examples/group/html/doxygen.css @@ -0,0 +1,11 @@ +H1 { text-align: center } +A.el { text-decoration: none; font-weight: bold } +DL.el { margin-left: -1cm } +DIV.fragment { width: 100%; border: none; background-color: #eeeeee } +DIV.in { margin-left: 16 } +DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 } +A.gl:link { color: #ffffff } +A.gl:visited { color: #ffffff } +A.gl { text-decoration: none; font-weight: bold; background-color: #ff8080 } +TD.md { background-color: #f2f2ff } + diff --git a/examples/group/html/doxygen.gif b/examples/group/html/doxygen.gif new file mode 100644 index 0000000..30ebbca Binary files /dev/null and b/examples/group/html/doxygen.gif differ diff --git a/examples/group/html/files.html b/examples/group/html/files.html new file mode 100644 index 0000000..bb2af36 --- /dev/null +++ b/examples/group/html/files.html @@ -0,0 +1,22 @@ + + +File Index + + + +
    +Main Page   Modules   Compound List   File List  
    +

    Grouping File List

    +

    +Here is a list of all documented files with brief descriptions: +

    +

    +
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/group.cpp.html b/examples/group/html/group.cpp.html new file mode 100644 index 0000000..0a01ced --- /dev/null +++ b/examples/group/html/group.cpp.html @@ -0,0 +1,28 @@ + + +group.cpp File Reference + + + +
    +Main Page   Modules   Compound List   File List  
    +

    group.cpp File Reference

    this file in group 3. +More... +

    + + + + + + + + +

    Compounds

    class  C1
    class  C2
    class  C3
    class  C4
    class  C5
    class  C6
    +


    Detailed Description

    +this file in group 3.
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/group_group1.html b/examples/group/html/group_group1.html new file mode 100644 index 0000000..ecd94bc --- /dev/null +++ b/examples/group/html/group_group1.html @@ -0,0 +1,22 @@ + + +The First Group + + + +
    +Main Page   Modules   Compound List   File List  
    +

    The First Group


    Compounds

    + +

    Detailed Description

    +This is the first group
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/group_group2.html b/examples/group/html/group_group2.html new file mode 100644 index 0000000..572a764 --- /dev/null +++ b/examples/group/html/group_group2.html @@ -0,0 +1,22 @@ + + +The Second Group + + + +
    +Main Page   Modules   Compound List   File List  
    +

    The Second Group


    Compounds

    + +

    Detailed Description

    +This is the second group
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/group_group3.html b/examples/group/html/group_group3.html new file mode 100644 index 0000000..5bc6455 --- /dev/null +++ b/examples/group/html/group_group3.html @@ -0,0 +1,25 @@ + + +The Third Group + + + +
    +Main Page   Modules   Compound List   File List  
    +

    The Third Group


    Files

    + +

    Compounds

    + +

    Detailed Description

    +This is the third group
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/index.html b/examples/group/html/index.html new file mode 100644 index 0000000..45ba0d3 --- /dev/null +++ b/examples/group/html/index.html @@ -0,0 +1,17 @@ + + +Main Index + + + +
    +Main Page   Modules   Compound List   File List  
    +

    Grouping Documentation

    +

    +


    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/modules.html b/examples/group/html/modules.html new file mode 100644 index 0000000..9a4d7bf --- /dev/null +++ b/examples/group/html/modules.html @@ -0,0 +1,25 @@ + + +Module Index + + + +
    +Main Page   Modules   Compound List   File List  
    +

    Grouping Modules

    Here is a list of all modules: +
    +
    The First Group
    +

    +

    The Second Group
    +

    +

    The Third Group
    +

    + +

    +
    Generated at Fri Nov 5 20:43:30 1999 for Grouping by + +doxygen 0.49-990728 written by Dimitri van Heesch, + © 1997-1999
    + + diff --git a/examples/group/html/null.gif b/examples/group/html/null.gif new file mode 100644 index 0000000..1d11fa9 Binary files /dev/null and b/examples/group/html/null.gif differ diff --git a/html/form-0.gif b/html/form-0.gif new file mode 100644 index 0000000..ac07035 Binary files /dev/null and b/html/form-0.gif differ diff --git a/html/form-1.gif b/html/form-1.gif new file mode 100644 index 0000000..b2eb6a7 Binary files /dev/null and b/html/form-1.gif differ diff --git a/html/form-2.gif b/html/form-2.gif new file mode 100644 index 0000000..6bf3208 Binary files /dev/null and b/html/form-2.gif differ diff --git a/html/form-3.gif b/html/form-3.gif new file mode 100644 index 0000000..64b86e8 Binary files /dev/null and b/html/form-3.gif differ diff --git a/html/form-4.gif b/html/form-4.gif new file mode 100644 index 0000000..7f798ec Binary files /dev/null and b/html/form-4.gif differ diff --git a/html/form-5.gif b/html/form-5.gif new file mode 100644 index 0000000..a0a73e4 Binary files /dev/null and b/html/form-5.gif differ diff --git a/src/Makefile.in b/src/Makefile.in index 66ff412..8f4c352 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -36,6 +36,8 @@ clean: $(MAKE) -f Makefile.doxygen clean $(MAKE) -f Makefile.doxytag clean $(MAKE) -f Makefile.doxysearch clean + +distclean: clean -$(RM) scanner.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \ ce_parse.cpp ce_parse.h doxytag.cpp tag.cpp \ declinfo.cpp defargs.cpp diff --git a/src/ce_lex.cpp b/src/ce_lex.cpp new file mode 100644 index 0000000..7e250ef --- /dev/null +++ b/src/ce_lex.cpp @@ -0,0 +1,1800 @@ +#define yy_create_buffer cppExpYY_create_buffer +#define yy_delete_buffer cppExpYY_delete_buffer +#define yy_scan_buffer cppExpYY_scan_buffer +#define yy_scan_string cppExpYY_scan_string +#define yy_scan_bytes cppExpYY_scan_bytes +#define yy_flex_debug cppExpYY_flex_debug +#define yy_init_buffer cppExpYY_init_buffer +#define yy_flush_buffer cppExpYY_flush_buffer +#define yy_load_buffer_state cppExpYY_load_buffer_state +#define yy_switch_to_buffer cppExpYY_switch_to_buffer +#define yyin cppExpYYin +#define yyleng cppExpYYleng +#define yylex cppExpYYlex +#define yyout cppExpYYout +#define yyrestart cppExpYYrestart +#define yytext cppExpYYtext +#define yywrap cppExpYYwrap + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 33 +#define YY_END_OF_BUFFER 34 +static yyconst short int yy_accept[62] = + { 0, + 0, 0, 34, 31, 32, 22, 20, 7, 31, 23, + 24, 18, 16, 17, 31, 19, 26, 27, 2, 10, + 31, 11, 1, 6, 5, 21, 8, 4, 0, 0, + 29, 29, 26, 0, 0, 26, 0, 27, 27, 14, + 12, 9, 13, 15, 3, 25, 0, 0, 0, 0, + 29, 29, 0, 30, 28, 0, 0, 29, 30, 28, + 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 5, 1, 1, 6, 7, 8, 9, + 10, 11, 12, 1, 13, 14, 15, 16, 17, 17, + 17, 17, 17, 17, 17, 18, 18, 19, 1, 20, + 21, 22, 23, 1, 24, 24, 24, 24, 25, 26, + 1, 1, 1, 1, 1, 27, 1, 1, 1, 1, + 1, 1, 1, 1, 28, 1, 1, 29, 1, 1, + 1, 30, 1, 31, 1, 1, 32, 32, 24, 24, + + 25, 33, 1, 1, 1, 1, 1, 27, 1, 5, + 1, 1, 1, 5, 1, 5, 28, 5, 1, 34, + 1, 1, 1, 35, 1, 36, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[37] = + { 0, + 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, + 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, + 1, 3, 3, 1, 1, 1 + } ; + +static yyconst short int yy_base[65] = + { 0, + 0, 0, 130, 163, 163, 88, 163, 92, 65, 163, + 163, 163, 163, 163, 21, 163, 26, 47, 163, 25, + 57, 26, 163, 163, 38, 163, 163, 163, 41, 71, + 90, 40, 33, 52, 68, 55, 0, 0, 63, 163, + 163, 163, 163, 163, 163, 163, 51, 94, 0, 80, + 163, 0, 102, 108, 86, 44, 111, 126, 163, 94, + 163, 159, 47, 38 + } ; + +static yyconst short int yy_def[65] = + { 0, + 61, 1, 61, 61, 61, 61, 61, 61, 62, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 62, 61, + 61, 31, 17, 61, 61, 61, 63, 18, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 64, 61, + 61, 32, 61, 61, 63, 64, 61, 61, 61, 61, + 0, 61, 61, 61 + } ; + +static yyconst short int yy_nxt[200] = + { 0, + 4, 5, 4, 6, 4, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, + 21, 22, 23, 4, 4, 4, 4, 4, 4, 4, + 24, 4, 4, 4, 25, 26, 31, 31, 31, 32, + 56, 33, 33, 34, 40, 41, 43, 44, 46, 55, + 35, 46, 36, 36, 37, 52, 52, 52, 46, 37, + 32, 61, 38, 38, 38, 32, 61, 34, 34, 34, + 61, 35, 45, 39, 39, 47, 35, 42, 47, 53, + 53, 36, 36, 54, 54, 54, 48, 48, 48, 39, + 39, 57, 57, 47, 30, 58, 58, 58, 28, 49, + + 47, 46, 47, 47, 49, 31, 31, 31, 27, 48, + 48, 48, 60, 60, 50, 51, 51, 54, 54, 54, + 60, 60, 51, 54, 54, 54, 58, 58, 58, 61, + 61, 61, 61, 59, 59, 61, 61, 61, 61, 61, + 59, 58, 58, 58, 61, 61, 61, 61, 61, 61, + 61, 51, 51, 61, 61, 61, 61, 61, 51, 29, + 61, 29, 3, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61 + + } ; + +static yyconst short int yy_chk[200] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 15, 15, 15, 17, + 64, 17, 17, 17, 20, 20, 22, 22, 29, 63, + 17, 56, 17, 17, 17, 32, 32, 32, 47, 17, + 18, 33, 18, 18, 18, 34, 33, 34, 34, 34, + 29, 18, 25, 18, 18, 30, 34, 21, 30, 35, + 35, 36, 36, 35, 35, 35, 30, 30, 30, 39, + 39, 50, 50, 30, 9, 50, 50, 50, 8, 30, + + 30, 48, 30, 30, 30, 31, 31, 31, 6, 48, + 48, 48, 55, 55, 31, 31, 31, 53, 53, 53, + 60, 60, 31, 54, 54, 54, 57, 57, 57, 3, + 0, 0, 0, 54, 54, 0, 0, 0, 0, 0, + 54, 58, 58, 58, 0, 0, 0, 0, 0, 0, + 0, 58, 58, 0, 0, 0, 0, 0, 58, 62, + 0, 62, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61 + + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "constexp.l" +#define INITIAL 0 +/****************************************************************************** + * + * $Id$ + * + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +#line 19 "constexp.l" + +#include "constexp.h" +#include "cppvalue.h" +#include "ce_parse.h" // generated header file + +#define YY_NO_UNPUT +#define YY_NEVER_INTERACTIVE 1 + +QCString strToken; + +static const char *inputString; +static int inputPosition; +CPPValue resultValue; + +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 49 "constexp.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 62 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 163 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 51 "constexp.l" +{ return TOK_QUESTIONMARK; } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 52 "constexp.l" +{ return TOK_COLON; } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 53 "constexp.l" +{ return TOK_OR; } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 54 "constexp.l" +{ return TOK_AND; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 55 "constexp.l" +{ return TOK_BITWISEOR; } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 56 "constexp.l" +{ return TOK_BITWISEXOR; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 57 "constexp.l" +{ return TOK_AMPERSAND; } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 58 "constexp.l" +{ return TOK_NOTEQUAL; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 59 "constexp.l" +{ return TOK_EQUAL; } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 60 "constexp.l" +{ return TOK_LESSTHAN; } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 61 "constexp.l" +{ return TOK_GREATERTHAN; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 62 "constexp.l" +{ return TOK_LESSTHANOREQUALTO; } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 63 "constexp.l" +{ return TOK_GREATERTHANOREQUALTO; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 64 "constexp.l" +{ return TOK_SHIFTLEFT; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 65 "constexp.l" +{ return TOK_SHIFTRIGHT; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 66 "constexp.l" +{ return TOK_PLUS; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 67 "constexp.l" +{ return TOK_MINUS; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 68 "constexp.l" +{ return TOK_STAR; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 69 "constexp.l" +{ return TOK_DIVIDE; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 70 "constexp.l" +{ return TOK_MOD; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 71 "constexp.l" +{ return TOK_TILDE; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 72 "constexp.l" +{ return TOK_NOT; } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 73 "constexp.l" +{ return TOK_LPAREN; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 74 "constexp.l" +{ return TOK_RPAREN; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 75 "constexp.l" +{ + strToken=yytext; + return TOK_CHARACTER; + } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 79 "constexp.l" +{ strToken=yytext; + return TOK_OCTALINT; + } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 82 "constexp.l" +{ strToken=yytext; + return TOK_DECIMALINT; + } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 85 "constexp.l" +{ strToken=yytext; return TOK_HEXADECIMALINT; } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 86 "constexp.l" +{ + strToken=yytext; return TOK_FLOAT; + } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 89 "constexp.l" +{ + strToken=yytext; return TOK_FLOAT; + } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 92 "constexp.l" + + YY_BREAK +case 32: +YY_RULE_SETUP +#line 93 "constexp.l" + + YY_BREAK +case 33: +YY_RULE_SETUP +#line 95 "constexp.l" +ECHO; + YY_BREAK +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 62 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 62 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 61); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 95 "constexp.l" + + +bool parseCppExpression(const QCString &s) +{ + //printf("Expression: `%s'\n",s.data()); + inputString = s; + inputPosition = 0; + cppExpYYrestart( cppExpYYin ); + cppExpYYparse(); + //printf("Result: %ld\n",(long)resultValue); + return (long)resultValue!=0; +} + +extern "C" { + int cppExpYYwrap() { return 1; } +} diff --git a/src/ce_parse.cpp b/src/ce_parse.cpp new file mode 100644 index 0000000..a494670 --- /dev/null +++ b/src/ce_parse.cpp @@ -0,0 +1,1152 @@ + +/* A Bison parser, made from constexp.y + by GNU Bison version 1.25 + */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define yyparse cppExpYYparse +#define yylex cppExpYYlex +#define yyerror cppExpYYerror +#define yylval cppExpYYlval +#define yychar cppExpYYchar +#define yydebug cppExpYYdebug +#define yynerrs cppExpYYnerrs +#define TOK_QUESTIONMARK 258 +#define TOK_COLON 259 +#define TOK_OR 260 +#define TOK_AND 261 +#define TOK_BITWISEOR 262 +#define TOK_BITWISEXOR 263 +#define TOK_AMPERSAND 264 +#define TOK_NOTEQUAL 265 +#define TOK_EQUAL 266 +#define TOK_LESSTHAN 267 +#define TOK_GREATERTHAN 268 +#define TOK_LESSTHANOREQUALTO 269 +#define TOK_GREATERTHANOREQUALTO 270 +#define TOK_SHIFTLEFT 271 +#define TOK_SHIFTRIGHT 272 +#define TOK_PLUS 273 +#define TOK_MINUS 274 +#define TOK_STAR 275 +#define TOK_DIVIDE 276 +#define TOK_MOD 277 +#define TOK_TILDE 278 +#define TOK_NOT 279 +#define TOK_LPAREN 280 +#define TOK_RPAREN 281 +#define TOK_OCTALINT 282 +#define TOK_DECIMALINT 283 +#define TOK_HEXADECIMALINT 284 +#define TOK_CHARACTER 285 +#define TOK_FLOAT 286 + + + +#include "cppvalue.h" +#include "constexp.h" + +#if defined(_MSC_VER) +#define MSDOS +#endif + +#define YYSTYPE CPPValue + +#include +#include + +int cppExpYYerror(const char *s) +{ + printf("ERROR: %s\n",s); + return 0; +} + +int cppExpYYlex(); + +#ifndef YYSTYPE +#define YYSTYPE int +#endif +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 73 +#define YYFLAG -32768 +#define YYNTBASE 32 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 286 ? yytranslate[x] : 47) + +static const char yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31 +}; + +#if YYDEBUG != 0 +static const short yyprhs[] = { 0, + 0, 2, 4, 10, 12, 16, 18, 22, 24, 28, + 30, 34, 36, 40, 42, 46, 50, 52, 56, 60, + 64, 68, 70, 74, 78, 80, 84, 88, 90, 94, + 98, 102, 104, 107, 110, 113, 116, 118, 122, 124, + 126, 128, 130 +}; + +static const short yyrhs[] = { 33, + 0, 34, 0, 34, 3, 34, 4, 34, 0, 35, + 0, 34, 5, 35, 0, 36, 0, 35, 6, 36, + 0, 37, 0, 36, 7, 37, 0, 38, 0, 37, + 8, 38, 0, 39, 0, 38, 9, 39, 0, 40, + 0, 39, 11, 40, 0, 39, 10, 40, 0, 41, + 0, 40, 12, 41, 0, 40, 13, 41, 0, 40, + 14, 41, 0, 40, 15, 41, 0, 42, 0, 41, + 16, 42, 0, 41, 17, 42, 0, 43, 0, 42, + 18, 43, 0, 42, 19, 43, 0, 44, 0, 43, + 20, 44, 0, 43, 21, 44, 0, 43, 22, 44, + 0, 45, 0, 18, 44, 0, 19, 44, 0, 23, + 44, 0, 24, 44, 0, 46, 0, 25, 33, 26, + 0, 27, 0, 28, 0, 29, 0, 30, 0, 31, + 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short yyrline[] = { 0, + 74, 78, 80, 89, 91, 97, 99, 105, 107, 114, + 116, 122, 124, 130, 132, 136, 142, 144, 148, 152, + 157, 164, 166, 170, 176, 178, 189, 202, 204, 215, + 228, 236, 238, 240, 247, 251, 257, 259, 263, 265, + 267, 269, 271 +}; +#endif + + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const yytname[] = { "$","error","$undefined.","TOK_QUESTIONMARK", +"TOK_COLON","TOK_OR","TOK_AND","TOK_BITWISEOR","TOK_BITWISEXOR","TOK_AMPERSAND", +"TOK_NOTEQUAL","TOK_EQUAL","TOK_LESSTHAN","TOK_GREATERTHAN","TOK_LESSTHANOREQUALTO", +"TOK_GREATERTHANOREQUALTO","TOK_SHIFTLEFT","TOK_SHIFTRIGHT","TOK_PLUS","TOK_MINUS", +"TOK_STAR","TOK_DIVIDE","TOK_MOD","TOK_TILDE","TOK_NOT","TOK_LPAREN","TOK_RPAREN", +"TOK_OCTALINT","TOK_DECIMALINT","TOK_HEXADECIMALINT","TOK_CHARACTER","TOK_FLOAT", +"start","constant_expression","logical_or_expression","logical_and_expression", +"inclusive_or_expression","exclusive_or_expression","and_expression","equality_expression", +"relational_expression","shift_expression","additive_expression","multiplicative_expression", +"unary_expression","primary_expression","constant", NULL +}; +#endif + +static const short yyr1[] = { 0, + 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, + 37, 38, 38, 39, 39, 39, 40, 40, 40, 40, + 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, + 43, 44, 44, 44, 44, 44, 45, 45, 46, 46, + 46, 46, 46 +}; + +static const short yyr2[] = { 0, + 1, 1, 5, 1, 3, 1, 3, 1, 3, 1, + 3, 1, 3, 1, 3, 3, 1, 3, 3, 3, + 3, 1, 3, 3, 1, 3, 3, 1, 3, 3, + 3, 1, 2, 2, 2, 2, 1, 3, 1, 1, + 1, 1, 1 +}; + +static const short yydefact[] = { 0, + 0, 0, 0, 0, 0, 39, 40, 41, 42, 43, + 1, 2, 4, 6, 8, 10, 12, 14, 17, 22, + 25, 28, 32, 37, 33, 34, 35, 36, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, + 5, 7, 9, 11, 13, 16, 15, 18, 19, 20, + 21, 23, 24, 26, 27, 29, 30, 31, 0, 3, + 0, 0, 0 +}; + +static const short yydefgoto[] = { 71, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24 +}; + +static const short yypact[] = { -13, + -13, -13, -13, -13, -13,-32768,-32768,-32768,-32768,-32768, +-32768, 4, 2, 20, 27, 31, 21, 7, 17, 18, + 8,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 24, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13,-32768, 34, + 2, 20, 27, 31, 21, 7, 7, 17, 17, 17, + 17, 18, 18, 8, 8,-32768,-32768,-32768, -13, 39, + 13, 51,-32768 +}; + +static const short yypgoto[] = {-32768, + 47, -26, 25, 23, 26, 28, 22, 5, -15, 6, + 9, -1,-32768,-32768 +}; + + +#define YYLAST 62 + + +static const short yytable[] = { 25, + 26, 27, 28, 50, 1, 2, 30, 32, 31, 3, + 4, 5, 72, 6, 7, 8, 9, 10, 38, 39, + 40, 41, 58, 59, 60, 61, 33, 46, 47, 48, + 36, 37, 42, 43, 34, 44, 45, 69, 31, 35, + 56, 57, 70, 31, 66, 67, 68, 62, 63, 49, + 73, 29, 64, 65, 52, 51, 55, 0, 53, 0, + 0, 54 +}; + +static const short yycheck[] = { 1, + 2, 3, 4, 30, 18, 19, 3, 6, 5, 23, + 24, 25, 0, 27, 28, 29, 30, 31, 12, 13, + 14, 15, 38, 39, 40, 41, 7, 20, 21, 22, + 10, 11, 16, 17, 8, 18, 19, 4, 5, 9, + 36, 37, 69, 5, 46, 47, 48, 42, 43, 26, + 0, 5, 44, 45, 32, 31, 35, -1, 33, -1, + -1, 34 +}; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ + + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + 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, 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. + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef alloca +#ifdef __GNUC__ +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) +#include +#else /* not sparc */ +#if defined (MSDOS) && !defined (__TURBOC__) +#include +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +#include + #pragma alloca +#else /* not MSDOS, __TURBOC__, or _AIX */ +#ifdef __hpux +#ifdef __cplusplus +extern "C" { +void *alloca (unsigned int); +}; +#else /* not __cplusplus */ +void *alloca (); +#endif /* not __cplusplus */ +#endif /* __hpux */ +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc. */ +#endif /* not GNU C. */ +#endif /* alloca not defined. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT return(0) +#define YYABORT return(1) +#define YYERROR goto yyerrlab1 +/* Like YYERROR except do call yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto yyerrlab +#define YYRECOVERING() (!!yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { yychar = (token), yylval = (value); \ + yychar1 = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval, &yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX yylex(&yylval, YYLEX_PARAM) +#else +#define YYLEX yylex(&yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int yychar; /* the lookahead symbol */ +YYSTYPE yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +#ifndef YYPARSE_RETURN_TYPE +#define YYPARSE_RETURN_TYPE int +#endif + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +YYPARSE_RETURN_TYPE yyparse (void); +#endif + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (to, from, count) + char *to; + char *from; + int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__yy_memcpy (char *to, char *from, int count) +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + + + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ + +YYPARSE_RETURN_TYPE +yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int yystate; + register int yyn; + register short *yyssp; + register YYSTYPE *yyvsp; + int yyerrstatus; /* number of tokens to shift before error messages enabled */ + int yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *yyss = yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#else +#define YYPOPSTACK (yyvsp--, yyssp--) +#endif + + int yystacksize = YYINITDEPTH; + +#ifdef YYPURE + int yychar; + YYSTYPE yylval; + int yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE yylloc; +#endif +#endif + + YYSTYPE yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int yylen; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss - 1; + yyvsp = yyvs; +#ifdef YYLSP_NEEDED + yylsp = yyls; +#endif + +/* Push a new state, which is found in yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +yynewstate: + + *++yyssp = yystate; + + if (yyssp >= yyss + yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = yyssp - yyss + 1; + +#ifdef yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yyls1, size * sizeof (*yylsp), + &yystacksize); +#else + yyoverflow("parser stack overflow", + &yyss1, size * sizeof (*yyssp), + &yyvs1, size * sizeof (*yyvsp), + &yystacksize); +#endif + + yyss = yyss1; yyvs = yyvs1; +#ifdef YYLSP_NEEDED + yyls = yyls1; +#endif +#else /* no yyoverflow */ + /* Extend the stack our own way. */ + if (yystacksize >= YYMAXDEPTH) + { + yyerror("parser stack overflow"); + return 2; + } + yystacksize *= 2; + if (yystacksize > YYMAXDEPTH) + yystacksize = YYMAXDEPTH; + yyss = (short *) alloca (yystacksize * sizeof (*yyssp)); + __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp)); + yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp)); + __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp)); +#ifdef YYLSP_NEEDED + yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp)); + __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp)); +#endif +#endif /* no yyoverflow */ + + yyssp = yyss + size - 1; + yyvsp = yyvs + size - 1; +#ifdef YYLSP_NEEDED + yylsp = yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Stack size increased to %d\n", yystacksize); +#endif + + if (yyssp >= yyss + yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Entering state %d\n", yystate); +#endif + + goto yybackup; + yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Reading a token: "); +#endif + yychar = YYLEX; + } + + /* Convert token to internal form (in yychar1) for indexing tables with */ + + if (yychar <= 0) /* This means end of input. */ + { + yychar1 = 0; + yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + yychar1 = YYTRANSLATE(yychar); + +#if YYDEBUG != 0 + if (yydebug) + { + fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, yychar, yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + yyn += yychar1; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + goto yydefault; + + yyn = yytable[yyn]; + + /* yyn is what to do for this token type in this state. + Negative => reduce, -yyn is rule number. + Positive => shift, yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrlab; + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (yyerrstatus) yyerrstatus--; + + yystate = yyn; + goto yynewstate; + +/* Do the default action for the current state. */ +yydefault: + + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + +/* Do a reduction. yyn is the number of a rule to reduce with. */ +yyreduce: + yylen = yyr2[yyn]; + if (yylen > 0) + yyval = yyvsp[1-yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", yytname[yyrhs[i]]); + fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + } +#endif + + + switch (yyn) { + +case 1: +{ resultValue = yyvsp[0]; return 0; ; + break;} +case 2: +{ yyval = yyvsp[0]; ; + break;} +case 3: +{ + bool c = (yyvsp[-4].isInt() ? ((long)yyvsp[-4] != 0) : ((double)yyvsp[-4] != 0.0)); + yyval = c ? yyvsp[-2] : yyvsp[0]; + ; + break;} +case 4: +{ yyval = yyvsp[0]; ; + break;} +case 5: +{ + yyval = CPPValue( (long)((long)yyvsp[-2] || (long)yyvsp[0]) ); + ; + break;} +case 6: +{ yyval = yyvsp[0]; ; + break;} +case 7: +{ + yyval = CPPValue( (long)((long)yyvsp[-2] && (long)yyvsp[0]) ); + ; + break;} +case 8: +{ yyval = yyvsp[0]; ; + break;} +case 9: +{ + yyval = CPPValue( (long)yyvsp[-2] | (long)yyvsp[0] ); + ; + break;} +case 10: +{ yyval = yyvsp[0]; ; + break;} +case 11: +{ + yyval = CPPValue( (long)yyvsp[-2] ^ (long)yyvsp[0] ); + ; + break;} +case 12: +{ yyval = yyvsp[0]; ; + break;} +case 13: +{ + yyval = CPPValue( (long)yyvsp[-2] & (long)yyvsp[0] ); + ; + break;} +case 14: +{ yyval = yyvsp[0]; ; + break;} +case 15: +{ + yyval = CPPValue( (long)((double)yyvsp[-2] == (double)yyvsp[0]) ); + ; + break;} +case 16: +{ + yyval = CPPValue( (long)((double)yyvsp[-2] != (double)yyvsp[0]) ); + ; + break;} +case 17: +{ yyval = yyvsp[0]; ; + break;} +case 18: +{ + yyval = CPPValue( (long)((double)yyvsp[-2] < (double)yyvsp[0]) ); + ; + break;} +case 19: +{ + yyval = CPPValue( (long)((double)yyvsp[-2] > (double)yyvsp[0]) ); + ; + break;} +case 20: +{ + yyval = CPPValue( (long)((double)yyvsp[-2] <= (double)yyvsp[0]) ); + ; + break;} +case 21: +{ + yyval = CPPValue( (long)((double)yyvsp[-2] >= (double)yyvsp[0]) ); + ; + break;} +case 22: +{ yyval = yyvsp[0]; ; + break;} +case 23: +{ + yyval = CPPValue( (long)yyvsp[-2] << (long)yyvsp[0] ); + ; + break;} +case 24: +{ + yyval = CPPValue( (long)yyvsp[-2] >> (long)yyvsp[0] ); + ; + break;} +case 25: +{ yyval = yyvsp[0]; ; + break;} +case 26: +{ + if (!yyvsp[-2].isInt() || !yyvsp[0].isInt()) + { + yyval = CPPValue( (double)yyvsp[-2] + (double)yyvsp[0] ); + } + else + { + yyval = CPPValue( (long)yyvsp[-2] + (long)yyvsp[0] ); + } + ; + break;} +case 27: +{ + if (!yyvsp[-2].isInt() || !yyvsp[0].isInt()) + { + yyval = CPPValue( (double)yyvsp[-2] - (double)yyvsp[0] ); + } + else + { + yyval = CPPValue( (long)yyvsp[-2] - (long)yyvsp[0] ); + } + ; + break;} +case 28: +{ yyval = yyvsp[0]; ; + break;} +case 29: +{ + if (!yyvsp[-2].isInt() || !yyvsp[0].isInt()) + { + yyval = CPPValue( (double)yyvsp[-2] * (double)yyvsp[0] ); + } + else + { + yyval = CPPValue( (long)yyvsp[-2] * (long)yyvsp[0] ); + } + ; + break;} +case 30: +{ + if (!yyvsp[-2].isInt() || !yyvsp[0].isInt()) + { + yyval = CPPValue( (double)yyvsp[-2] / (double)yyvsp[0] ); + } + else + { + long value = yyvsp[0]; + if (value==0) value=1; + yyval = CPPValue( (long)yyvsp[-2] / value ); + } + ; + break;} +case 31: +{ + long value = yyvsp[0]; + if (value==0) value=1; + yyval = CPPValue( (long)yyvsp[-2] % value ); + ; + break;} +case 32: +{ yyval = yyvsp[0]; ; + break;} +case 33: +{ yyval = yyvsp[-1]; ; + break;} +case 34: +{ + if (yyvsp[0].isInt()) + yyval = CPPValue(-(long)yyvsp[0]); + else + yyval = CPPValue(-(double)yyvsp[0]); + ; + break;} +case 35: +{ + yyval = CPPValue(~(long)yyvsp[0]); + ; + break;} +case 36: +{ + yyval = CPPValue((long)!(long)yyvsp[0]); + ; + break;} +case 37: +{ yyval = yyvsp[0]; ; + break;} +case 38: +{ yyval = yyvsp[-1]; ; + break;} +case 39: +{ yyval = parseOctal(); ; + break;} +case 40: +{ yyval = parseDecimal(); ; + break;} +case 41: +{ yyval = parseHexadecimal(); ; + break;} +case 42: +{ yyval = parseCharacter(); ; + break;} +case 43: +{ yyval = parseFloat(); ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ + + + yyvsp -= yylen; + yyssp -= yylen; +#ifdef YYLSP_NEEDED + yylsp -= yylen; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++yyvsp = yyval; + +#ifdef YYLSP_NEEDED + yylsp++; + if (yylen == 0) + { + yylsp->first_line = yylloc.first_line; + yylsp->first_column = yylloc.first_column; + yylsp->last_line = (yylsp-1)->last_line; + yylsp->last_column = (yylsp-1)->last_column; + yylsp->text = 0; + } + else + { + yylsp->last_line = (yylsp+yylen-1)->last_line; + yylsp->last_column = (yylsp+yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTBASE] + *yyssp; + if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTBASE]; + + goto yynewstate; + +yyerrlab: /* here on detecting error */ + + if (! yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++yynerrs; + +#ifdef YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (yyn > YYFLAG && yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + size += strlen(yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (yyn < 0 ? -yyn : 0); + x < (sizeof(yytname) / sizeof(char *)); x++) + if (yycheck[x + yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, yytname[x]); + strcat(msg, "'"); + count++; + } + } + yyerror(msg); + free(msg); + } + else + yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror("parse error"); + } + + goto yyerrlab1; +yyerrlab1: /* here on error raised explicitly by an action */ + + if (yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); +#endif + + yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto yyerrhandle; + +yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (yyn) goto yydefault; +#endif + +yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (yyssp == yyss) YYABORT; + yyvsp--; + yystate = *--yyssp; +#ifdef YYLSP_NEEDED + yylsp--; +#endif + +#if YYDEBUG != 0 + if (yydebug) + { + short *ssp1 = yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +yyerrhandle: + + yyn = yypact[yystate]; + if (yyn == YYFLAG) + goto yyerrdefault; + + yyn += YYTERROR; + if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) + goto yyerrdefault; + + yyn = yytable[yyn]; + if (yyn < 0) + { + if (yyn == YYFLAG) + goto yyerrpop; + yyn = -yyn; + goto yyreduce; + } + else if (yyn == 0) + goto yyerrpop; + + if (yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++yyvsp = yylval; +#ifdef YYLSP_NEEDED + *++yylsp = yylloc; +#endif + + yystate = yyn; + goto yynewstate; +} + diff --git a/src/ce_parse.h b/src/ce_parse.h new file mode 100644 index 0000000..913f9ce --- /dev/null +++ b/src/ce_parse.h @@ -0,0 +1,35 @@ +#ifndef YYSTYPE +#define YYSTYPE int +#endif +#define TOK_QUESTIONMARK 258 +#define TOK_COLON 259 +#define TOK_OR 260 +#define TOK_AND 261 +#define TOK_BITWISEOR 262 +#define TOK_BITWISEXOR 263 +#define TOK_AMPERSAND 264 +#define TOK_NOTEQUAL 265 +#define TOK_EQUAL 266 +#define TOK_LESSTHAN 267 +#define TOK_GREATERTHAN 268 +#define TOK_LESSTHANOREQUALTO 269 +#define TOK_GREATERTHANOREQUALTO 270 +#define TOK_SHIFTLEFT 271 +#define TOK_SHIFTRIGHT 272 +#define TOK_PLUS 273 +#define TOK_MINUS 274 +#define TOK_STAR 275 +#define TOK_DIVIDE 276 +#define TOK_MOD 277 +#define TOK_TILDE 278 +#define TOK_NOT 279 +#define TOK_LPAREN 280 +#define TOK_RPAREN 281 +#define TOK_OCTALINT 282 +#define TOK_DECIMALINT 283 +#define TOK_HEXADECIMALINT 284 +#define TOK_CHARACTER 285 +#define TOK_FLOAT 286 + + +extern YYSTYPE cppExpYYlval; diff --git a/src/classdef.cpp b/src/classdef.cpp index 457a06b..4db552e 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -29,6 +29,8 @@ #include "diagram.h" #include "language.h" #include "htmlhelp.h" +#include "example.h" +#include "outputlist.h" static QCString stripExtension(const char *fName) { @@ -73,6 +75,7 @@ ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fN tempArgs=0; prot=Public; nspace=0; + fileDef=0; } // destroy the class definition @@ -262,19 +265,12 @@ void ClassDef::writeDocumentation(OutputList &ol) if (incName.isNull()) nm=incFile->name(); ol.startTypewriter(); ol.docify("#include <"); - ol.disable(OutputGenerator::Man); - if (Config::verbatimHeaderFlag) - { - ol.writeObjectLink(0,fileName+"-include",0,nm); - } - else - { - ol.docify(nm); - } - ol.enable(OutputGenerator::Man); - ol.disableAllBut(OutputGenerator::Man); + ol.disable(OutputGenerator::Html); ol.docify(nm); ol.enableAll(); + ol.disableAllBut(OutputGenerator::Html); + ol.writeObjectLink(0,fileName+"-include",0,nm); + ol.enableAll(); ol.docify(">"); ol.endTypewriter(); ol.newParagraph(); @@ -420,7 +416,10 @@ void ClassDef::writeDocumentation(OutputList &ol) // write detailed description bool exampleFlag=hasExamples(); - if (!briefDescription().isEmpty() || !documentation().isEmpty() || exampleFlag) + if (!briefDescription().isEmpty() || + !documentation().isEmpty() || + (bodyLine!=-1 && bodyDef) || + exampleFlag) { ol.writeRuler(); bool latexOn = ol.isEnabled(OutputGenerator::Latex); @@ -495,6 +494,7 @@ void ClassDef::writeDocumentation(OutputList &ol) //ol.endDescItem(); ol.endDescList(); } + writeSourceRef(ol); } pubMembers.countDocMembers(); @@ -841,7 +841,7 @@ void ClassDef::writeIncludeFile(OutputList &ol) parseText(ol,n); endTitle(ol,0,0); parseText(ol,theTranslator->trVerbatimText(incFile->name())); - ol.writeRuler(); + //ol.writeRuler(); ol.startCodeFragment(); parseCode(ol,n,fileToString(incFile->absFilePath()),FALSE,0); ol.endCodeFragment(); @@ -1034,3 +1034,23 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md) friends.writePlainDeclarations(ol,this,0,0); related.writePlainDeclarations(ol,this,0,0); } + +/*! a link to this class is possible within this project */ +bool ClassDef::isLinkableInProject() +{ + return !name().isEmpty() && name().find('@')==-1 && + (prot!=Private || Config::extractPrivateFlag) && + hasDocumentation() && !isReference(); +} + +/*! the class is visible in a class diagram, or class hierarchy */ +bool ClassDef::isVisibleInHierarchy() +{ return // show all classes or a superclass is visible + (Config::allExtFlag || hasNonReferenceSuperClass()) && + // and not an annonymous compound + name().find('@')==-1 && + // and not privately inherited + (prot!=Private || Config::extractPrivateFlag) && + // documented or show anyway or documentation is external + (hasDocumentation() || !Config::hideClassFlag || isReference()); +} diff --git a/src/classdef.h b/src/classdef.h index afdcffb..890cc4a 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -17,18 +17,13 @@ #ifndef CLASSDEF_H #define CLASSDEF_H -//#include #include "qtbc.h" -#include #include #include #include -#include "membername.h" -#include "memberlist.h" -#include "memberdef.h" -#include "example.h" #include "entry.h" +#include "memberlist.h" #include "definition.h" typedef QDict MemberDict; @@ -40,6 +35,9 @@ class MemberInfoList; class MemberInfoDict; class NamespaceDef; class MemberDef; +class ExampleList; +class MemberNameInfoList; +class MemberNameInfoDict; class ClassDef : public Definition { @@ -50,13 +48,10 @@ class ClassDef : public Definition Union=Entry::UNION_SEC, Interface=Entry::INTERFACE_SEC }; - ClassDef(const char *name,CompoundType ct,const char *ref=0,const char *fName=0); ~ClassDef(); - //QCString classFile() const { return fileName; } QCString getOutputFileBase() const { return fileName; } CompoundType compoundType() const { return compType; } - //const char *memberListFileName() const { return memListFileName; } void insertBaseClass(ClassDef *,Protection p,Specifier s,const char *t=0); BaseClassList *baseClasses() { return inherits; } void insertSuperClass(ClassDef *,Protection p,Specifier s,const char *t=0); @@ -66,8 +61,6 @@ class ClassDef : public Definition void setIncludeName(const char *n_) { incName=n_; } MemberNameInfoList *memberNameInfoList() { return allMemberNameInfoList; } MemberNameInfoDict *memberNameInfoDict() { return allMemberNameInfoDict; } - //bool isReference() { return !reference.isNull(); } - //const char *getReference() const { return reference; } void insertMember(const MemberDef *); void insertUsedFile(const char *); void computeAnchors(); @@ -83,14 +76,7 @@ class ClassDef : public Definition //void writeExample(OutputList &ol); void setProtection(Protection p) { prot=p; } Protection protection() const { return prot; } - /*! a link to this class is possible within this project */ - bool isLinkableInProject() - { //int i = name().findRev("::"); - //if (i==-1) i=0; else i+=2; - return !name().isEmpty() && name().find('@')==-1 && - (prot!=Private || Config::extractPrivateFlag) && - hasDocumentation() && !isReference(); - } + bool isLinkableInProject(); /*! a link to this class is possible (either within this project, * or as a cross-reference to another project */ @@ -100,16 +86,7 @@ class ClassDef : public Definition } bool hasNonReferenceSuperClass(); /*! the class is visible in a class diagram, or class hierarchy */ - bool isVisibleInHierarchy() - { return // show all classes or a superclass is visible - (Config::allExtFlag || hasNonReferenceSuperClass()) && - // and not an annonymous compound - name().find('@')==-1 && - // and not privately inherited - (prot!=Private || Config::extractPrivateFlag) && - // documented or show anyway or documentation is external - (hasDocumentation() || !Config::hideClassFlag || isReference()); - } + bool isVisibleInHierarchy(); // template argument functions ArgumentList *templateArguments() const { return tempArgs; } @@ -117,16 +94,15 @@ class ClassDef : public Definition //QCString getTemplateNameString(); void setNamespace(NamespaceDef *nd) { nspace = nd; } NamespaceDef *getNamespace() { return nspace; } + void setFileDef(FileDef *fd) { fileDef=fd; } + FileDef *getFileDef() const { return fileDef; } bool visited; private: - //QCString name; // name of the class QCString fileName; // HTML containing the class docs - //QCString doc; // general class documentation FileDef *incFile; // header file to refer to QCString incName; // alternative include file name - //QCString brief; // brief class discription QCString memListFileName; BaseClassList *inherits; BaseClassList *inheritedBy; @@ -147,11 +123,11 @@ class ClassDef : public Definition MemberNameInfoDict *allMemberNameInfoDict; ArgumentList *tempArgs; QStrList files; - //QCString reference; ExampleList *exampleList; ExampleDict *exampleDict; CompoundType compType; Protection prot; + FileDef *fileDef; }; diff --git a/src/code.cpp b/src/code.cpp new file mode 100644 index 0000000..c71b3f6 --- /dev/null +++ b/src/code.cpp @@ -0,0 +1,3534 @@ +#define yy_create_buffer codeYY_create_buffer +#define yy_delete_buffer codeYY_delete_buffer +#define yy_scan_buffer codeYY_scan_buffer +#define yy_scan_string codeYY_scan_string +#define yy_scan_bytes codeYY_scan_bytes +#define yy_flex_debug codeYY_flex_debug +#define yy_init_buffer codeYY_init_buffer +#define yy_flush_buffer codeYY_flush_buffer +#define yy_load_buffer_state codeYY_load_buffer_state +#define yy_switch_to_buffer codeYY_switch_to_buffer +#define yyin codeYYin +#define yyleng codeYYleng +#define yylex codeYYlex +#define yyout codeYYout +#define yyrestart codeYYrestart +#define yytext codeYYtext + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define YY_USES_REJECT + +#define yywrap() 1 +#define YY_SKIP_YYWRAP +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 76 +#define YY_END_OF_BUFFER 77 +static yyconst short int yy_acclist[760] = + { 0, + 31, 31, 77, 75, 76, 66, 74, 76, 1, 75, + 76, 75, 76, 75, 76, 75, 76, 31, 75, 76, + 31, 66, 74, 76, 1, 31, 75, 76, 33, 75, + 76, 31, 75, 76, 75, 76, 31, 75, 76, 31, + 75, 76, 6, 75, 76, 8, 66, 74, 76, 1, + 6, 75, 76, 6, 75, 76, 6, 75, 76, 6, + 75, 76, 6, 75, 76, 56, 75, 76, 56, 75, + 76, 1, 56, 75, 76, 75, 76, 75, 76, 56, + 75, 76, 75, 76, 75, 76, 58, 66, 74, 76, + 1, 75, 76, 75, 76, 75, 76, 75, 76, 62, + + 65, 75, 76, 64, 66, 74, 76, 1, 62, 65, + 75, 76, 65, 75, 76, 62, 65, 75, 76, 62, + 65, 75, 76, 62, 65, 75, 76, 75, 76, 66, + 74, 76, 1, 75, 76, 30, 75, 76, 75, 76, + 40, 75, 76, 75, 76, 37, 75, 76, 41, 75, + 76, 35, 75, 76, 8220, 75, 76,16412,16413, 8220, + 75, 76,16412,16413, 8220, 75, 76,16412,16413, 8220, + 75, 76,16412,16413, 8220, 75, 76,16412,16413, 8220, + 75, 76,16412,16413, 8220, 75, 76,16412,16413, 8220, + 75, 76,16412,16413, 8220, 75, 76,16412,16413, 8220, + + 75, 76,16412,16413, 8220, 75, 76,16412,16413, 8220, + 75, 76,16412,16413, 8220, 75, 76,16412,16413, 8220, + 75, 76,16412,16413, 8220, 75, 76,16412,16413, 10, + 75, 76, 11, 75, 76, 75, 76, 75, 76, 5, + 75, 76, 44, 75, 76, 45, 75, 76, 43, 75, + 76, 42, 75, 76,16436, 39, 75, 76, 39, 75, + 76, 66, 74, 76, 1, 39, 75, 76, 30, 39, + 75, 76, 39, 75, 76, 39, 75, 76, 75, 76, + 16422, 39, 75, 76, 39, 75, 76, 39, 75, 76, + 42, 75, 76,16437,16438, 50, 75, 76, 49, 75, + + 76, 75, 76, 66, 74, 76, 13, 75, 76, 15, + 75, 76, 12, 75, 76, 14, 75, 76, 16, 75, + 76, 75, 76, 75, 76, 25, 75, 76, 22, 75, + 76, 21, 75, 76, 21, 75, 76, 21, 75, 76, + 75, 76, 23, 75, 76, 24, 75, 76, 75, 76, + 16388, 72, 73, 72, 73, 31, 31, 31, 31, 32, + 72, 31, 32, 73, 34, 31, 31, 31, 32, 72, + 31, 32, 73, 9, 73, 7, 9, 73, 56, 56, + 57, 55, 73, 56, 55, 73, 58, 72, 73, 72, + 73, 62, 61, 63, 72, 62, 63, 73, 62, 62, + + 63, 72, 62, 63, 73, 37, 41, 8220, 8220, 8221, + 8220,16412,16413, 8220,16412,16413, 8220,16412,16413, 8220, + 16412,16413, 8220,16412,16413, 8220,16412,16413, 8220,16412, + 16413, 8220,16412,16413, 27, 8220,16412,16413, 8220,16412, + 16413, 8220,16412,16413, 8220,16412,16413, 8220,16412,16413, + 8220,16412,16413, 8220,16412,16413, 8220,16412,16413, 8220, + 16412,16413, 8220,16412,16413, 8220,16412,16413, 8220,16412, + 16413, 8220,16412,16413, 8220,16412,16413, 5, 48, 46, + 47, 51, 8244, 42,16436, 42, 8230,16422,16422, 8245, + 8246, 42,16437,16438, 50, 15, 16, 13, 15, 14, + + 16, 21, 21, 21, 21, 8196,16388, 31, 31, 31, + 31, 31, 31, 31, 31, 60, 62, 62, 62, 36, + 8220,16412,16413, 8220,16412,16413, 8220,16412,16413, 8220, + 16412,16413, 8220,16412,16413, 8220,16412,16413, 8220,16412, + 16413, 8220,16412,16413, 8220,16412,16413, 27, 8220, 27, + 8220, 26, 8221, 8220,16412,16413, 8220,16412,16413, 8220, + 16412,16413, 8220,16412,16413, 8220,16412,16413, 8220,16412, + 16413, 8220,16412,16413, 8220,16412,16413, 8220,16412,16413, + 8220,16412,16413, 8220, 8220, 8220,16412,16413,16422,16422, + 21, 21, 21, 21,16388, 71, 68, 70, 71, 67, + + 68, 31, 31, 31, 71, 31, 31, 68, 31, 31, + 31, 70, 71, 31, 31, 67, 68, 71, 58, 71, + 58, 68, 70, 71, 58, 70, 71, 58, 67, 68, + 60, 62, 62, 62, 8220,16412,16413, 8220,16412,16413, + 8220,16412,16413, 8220,16412,16413, 8220,16412,16413, 8220, + 16412,16413, 26, 8220,16412,16413, 8220,16412,16413, 8220, + 16412,16413, 8220,16412,16413, 8220,16412,16413, 8220,16412, + 16413, 8220,16412,16413, 21, 21, 21, 21, 69, 66, + 70, 67, 31, 69, 31, 31, 66, 31, 70, 31, + 31, 67, 70, 58, 70, 58, 67, 62, 8220,16412, + + 16413, 8220,16412,16413, 8220,16412,16413, 8220,16412,16413, + 8220,16412,16413, 8220,16412,16413, 8220,16412,16413, 8220, + 16412,16413, 21, 21, 21, 21, 31, 31, 3, 8220, + 3, 8220, 8220,16412,16413, 8220,16412,16413, 8220,16412, + 16413, 21, 21, 18, 21, 21, 59, 8220,16412,16413, + 20, 21, 21, 17, 21, 21, 19, 21, 2 + } ; + +static yyconst short int yy_accept[446] = + { 0, + 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 4, 6, 9, 12, 14, 16, 18, + 21, 25, 29, 32, 35, 37, 40, 43, 46, 50, + 54, 57, 60, 63, 66, 69, 72, 76, 78, 80, + 83, 85, 87, 91, 94, 96, 98, 100, 104, 108, + 113, 116, 120, 124, 128, 130, 133, 136, 139, 141, + 144, 146, 149, 152, 155, 160, 165, 170, 175, 180, + 185, 190, 195, 200, 205, 210, 215, 220, 225, 230, + + 233, 236, 238, 240, 243, 246, 249, 252, 256, 259, + 262, 265, 269, 273, 276, 279, 282, 285, 288, 291, + 296, 299, 302, 304, 307, 310, 313, 316, 319, 322, + 324, 326, 329, 332, 335, 338, 341, 343, 346, 349, + 352, 352, 352, 353, 354, 354, 354, 355, 356, 357, + 358, 359, 362, 365, 366, 367, 368, 371, 374, 376, + 377, 379, 380, 381, 381, 382, 384, 385, 387, 387, + 388, 389, 390, 390, 390, 391, 392, 393, 394, 396, + 399, 400, 401, 403, 406, 406, 406, 406, 406, 407, + 408, 408, 409, 410, 411, 414, 417, 420, 423, 426, + + 429, 432, 435, 439, 442, 445, 448, 451, 454, 457, + 460, 463, 466, 469, 472, 475, 475, 478, 478, 479, + 479, 479, 480, 481, 482, 483, 483, 484, 486, 487, + 487, 487, 487, 487, 487, 488, 489, 489, 490, 490, + 490, 491, 491, 492, 495, 496, 496, 496, 497, 498, + 498, 499, 500, 501, 502, 502, 502, 503, 504, 505, + 506, 506, 507, 508, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 516, 516, 516, 516, 516, 516, 516, 517, 518, + 519, 520, 521, 521, 524, 524, 527, 530, 533, 536, + + 539, 542, 545, 548, 550, 552, 554, 557, 560, 563, + 566, 569, 572, 575, 578, 581, 584, 585, 586, 589, + 589, 589, 590, 590, 590, 591, 592, 593, 594, 595, + 596, 596, 596, 597, 597, 598, 598, 598, 600, 600, + 602, 603, 604, 606, 607, 609, 610, 611, 614, 615, + 618, 619, 621, 621, 623, 623, 623, 625, 628, 628, + 631, 631, 632, 632, 633, 634, 635, 638, 641, 644, + 647, 650, 653, 654, 657, 660, 663, 666, 669, 672, + 675, 675, 676, 677, 678, 679, 680, 680, 681, 682, + 682, 683, 685, 686, 688, 690, 691, 693, 694, 696, + + 696, 698, 698, 699, 702, 705, 708, 711, 714, 717, + 720, 723, 723, 724, 725, 726, 727, 727, 727, 728, + 729, 729, 731, 733, 736, 739, 742, 742, 743, 744, + 746, 747, 748, 751, 751, 753, 754, 756, 756, 757, + 757, 759, 759, 760, 760 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 5, 6, 7, 1, 1, 8, 9, 10, + 11, 12, 1, 13, 14, 15, 16, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 18, 19, 20, + 21, 22, 1, 1, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 21, 24, 1, 1, 23, 1, 25, 26, 27, 28, + + 29, 30, 31, 32, 33, 23, 34, 35, 36, 37, + 38, 39, 23, 40, 41, 42, 43, 44, 45, 23, + 46, 23, 47, 1, 48, 49, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[50] = + { 0, + 1, 2, 3, 4, 1, 5, 1, 1, 1, 6, + 1, 7, 1, 8, 9, 10, 11, 12, 1, 1, + 1, 13, 14, 15, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 1, 1, 16 + } ; + +static yyconst short int yy_base[499] = + { 0, + 0, 3, 5, 11, 20, 29, 35, 38, 45, 53, + 55, 60, 62, 71, 87, 18, 136, 10, 185, 44, + 229, 66, 275, 68, 324, 234, 373, 235, 420, 423, + 445, 237, 1494, 2018, 428, 2018, 6, 493, 65, 0, + 494, 0, 2018, 67, 0, 495, 226, 2018, 496, 2018, + 228, 1490, 497, 229, 0, 426, 0, 1476, 231, 502, + 417, 1487, 499, 1482, 504, 503, 505, 0, 520, 0, + 1466, 419, 521, 425, 522, 525, 528, 2018, 0, 2018, + 1457, 2018, 1459, 1457, 545, 548, 513, 532, 531, 536, + 501, 521, 535, 539, 552, 542, 556, 549, 562, 2018, + + 2018, 531, 604, 1472, 2018, 598, 2018, 600, 2018, 621, + 624, 628, 2018, 597, 1455, 631, 634, 648, 631, 653, + 0, 2018, 651, 656, 636, 83, 2018, 0, 1470, 659, + 498, 2018, 2018, 0, 206, 1438, 663, 2018, 2018, 654, + 596, 666, 668, 676, 681, 672, 681, 680, 0, 685, + 678, 690, 684, 2018, 689, 687, 699, 702, 703, 2018, + 704, 0, 617, 1454, 2018, 707, 712, 710, 1466, 2018, + 722, 726, 714, 729, 732, 733, 0, 500, 728, 734, + 741, 735, 741, 743, 752, 1450, 758, 1454, 2018, 1443, + 761, 765, 769, 2018, 391, 741, 747, 737, 750, 756, + + 757, 766, 801, 765, 772, 775, 778, 783, 787, 796, + 800, 804, 793, 805, 816, 849, 852, 861, 1457, 1425, + 864, 2018, 2018, 2018, 2018, 1435, 2018, 860, 0, 869, + 1437, 882, 886, 889, 2018, 892, 910, 0, 913, 918, + 2018, 1416, 2018, 924, 0, 858, 906, 719, 1424, 934, + 823, 783, 0, 1420, 938, 711, 0, 868, 1371, 1354, + 928, 2018, 937, 0, 790, 853, 0, 1387, 913, 941, + 0, 1371, 943, 942, 954, 958, 957, 958, 965, 962, + 964, 1367, 985, 988, 980, 1357, 878, 992, 40, 968, + 802, 2018, 996, 779, 999, 968, 980, 981, 985, 908, + + 974, 988, 989, 1031, 1034, 2018, 1010, 1005, 984, 999, + 1013, 1016, 1020, 1021, 1027, 1031, 1073, 920, 1075, 1221, + 1077, 1084, 1087, 977, 1082, 1213, 1213, 1219, 1211, 1087, + 0, 1248, 2018, 1220, 2018, 0, 1218, 2018, 1213, 2018, + 1092, 1093, 0, 1094, 0, 1095, 1107, 0, 1109, 0, + 1211, 2018, 1187, 2018, 1057, 1172, 1146, 2018, 1127, 2018, + 1118, 1120, 1112, 1102, 1125, 1126, 1098, 1103, 1084, 1107, + 1102, 1110, 2018, 1114, 1115, 1120, 1119, 1131, 1128, 1137, + 1079, 1057, 1042, 1034, 1004, 2018, 1017, 1165, 2018, 1016, + 2018, 0, 1167, 1166, 0, 1173, 0, 1004, 2018, 969, + + 2018, 1172, 1180, 1183, 1152, 1153, 1158, 1161, 1164, 1168, + 1174, 910, 877, 876, 870, 831, 1206, 736, 1211, 641, + 0, 1226, 1216, 1169, 1190, 1205, 578, 575, 519, 0, + 503, 2018, 1196, 220, 0, 51, 0, 1, 0, 1236, + 0, 1239, 2018, 2018, 1259, 1275, 1291, 1307, 1323, 1339, + 1355, 1371, 1387, 1403, 1419, 1435, 1450, 1463, 1472, 1485, + 1498, 1511, 1229, 1236, 1238, 1521, 1534, 1549, 1553, 1566, + 1581, 1587, 1601, 1617, 1633, 1649, 1665, 1681, 1697, 1713, + 1729, 1745, 1761, 1777, 1793, 1809, 1825, 1841, 1857, 1873, + 1889, 1905, 1921, 1937, 1953, 1969, 1985, 2001 + + } ; + +static yyconst short int yy_def[499] = + { 0, + 445, 445, 446, 446, 447, 447, 448, 448, 449, 449, + 450, 450, 445, 445, 444, 15, 444, 17, 444, 19, + 17, 21, 444, 23, 444, 25, 444, 27, 445, 445, + 444, 31, 444, 444, 444, 444, 444, 444, 444, 451, + 451, 451, 444, 451, 452, 451, 451, 444, 444, 444, + 444, 444, 444, 444, 453, 453, 453, 444, 444, 453, + 444, 454, 444, 454, 454, 454, 454, 455, 444, 455, + 444, 455, 455, 455, 444, 444, 444, 444, 456, 444, + 444, 444, 444, 444, 457, 457, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 444, + + 444, 458, 444, 444, 444, 444, 444, 459, 444, 444, + 444, 444, 444, 444, 444, 460, 461, 444, 444, 462, + 463, 444, 444, 444, 444, 444, 444, 464, 444, 444, + 444, 444, 444, 465, 465, 465, 444, 444, 444, 466, + 444, 444, 444, 444, 444, 444, 444, 444, 451, 451, + 451, 451, 451, 444, 451, 451, 451, 451, 444, 444, + 444, 453, 453, 444, 444, 444, 453, 444, 454, 444, + 454, 454, 454, 454, 454, 454, 455, 444, 444, 455, + 455, 455, 444, 455, 444, 444, 444, 444, 444, 444, + 467, 444, 444, 444, 86, 86, 86, 86, 86, 86, + + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 458, 468, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 459, 469, 444, + 444, 444, 470, 444, 444, 460, 461, 471, 444, 444, + 444, 444, 444, 462, 463, 444, 444, 444, 444, 444, + 444, 444, 464, 444, 444, 444, 465, 465, 465, 465, + 444, 444, 466, 472, 444, 444, 473, 474, 444, 444, + 475, 476, 451, 451, 477, 478, 451, 451, 479, 480, + 481, 482, 454, 454, 483, 484, 444, 444, 485, 455, + 486, 444, 467, 86, 458, 86, 86, 86, 86, 86, + + 86, 86, 86, 444, 444, 444, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 444, 444, 468, 444, + 470, 460, 461, 444, 471, 465, 465, 465, 465, 472, + 487, 488, 444, 474, 444, 489, 490, 444, 476, 444, + 491, 492, 451, 478, 451, 493, 494, 451, 480, 451, + 454, 444, 482, 444, 495, 496, 454, 444, 484, 444, + 444, 444, 444, 485, 497, 486, 86, 86, 86, 86, + 86, 86, 444, 86, 86, 86, 86, 86, 86, 86, + 444, 465, 465, 465, 465, 444, 488, 444, 444, 490, + 444, 451, 492, 451, 451, 494, 451, 454, 444, 496, + + 444, 444, 497, 86, 86, 86, 86, 86, 86, 86, + 86, 444, 465, 465, 465, 465, 444, 444, 451, 451, + 498, 444, 444, 86, 86, 86, 444, 465, 465, 465, + 465, 444, 86, 444, 465, 465, 465, 444, 465, 444, + 465, 444, 444, 0, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444 + + } ; + +static yyconst short int yy_nxt[2068] = + { 0, + 444, 324, 35, 36, 38, 35, 36, 41, 42, 235, + 43, 38, 46, 41, 42, 37, 43, 143, 39, 103, + 44, 144, 49, 50, 104, 39, 47, 441, 45, 440, + 53, 49, 50, 39, 45, 51, 56, 35, 57, 60, + 35, 57, 335, 52, 54, 118, 58, 63, 64, 58, + 59, 334, 52, 61, 66, 63, 64, 69, 70, 119, + 65, 73, 69, 70, 35, 36, 71, 38, 67, 38, + 72, 71, 38, 35, 36, 74, 147, 37, 152, 439, + 148, 39, 153, 39, 252, 252, 39, 34, 75, 76, + 77, 34, 78, 34, 34, 79, 34, 34, 34, 80, + + 81, 82, 37, 83, 84, 80, 34, 80, 34, 85, + 34, 86, 87, 88, 89, 90, 91, 92, 85, 93, + 85, 85, 85, 94, 85, 85, 95, 96, 97, 98, + 85, 99, 85, 100, 101, 102, 34, 34, 35, 36, + 34, 78, 34, 34, 34, 105, 106, 34, 107, 34, + 34, 37, 34, 34, 34, 34, 34, 34, 108, 34, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 108, 34, 34, 34, 109, 110, 111, 112, 109, + 113, 109, 109, 109, 34, 109, 109, 109, 109, 109, + + 114, 34, 115, 109, 109, 109, 109, 116, 109, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 109, 109, 117, 34, 130, 137, 157, 38, 143, + 147, 158, 143, 159, 161, 258, 166, 438, 259, 39, + 39, 120, 39, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 34, 34, 35, 36, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 37, 34, 34, 34, 34, 34, 34, 121, 34, 121, + + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 122, 34, 34, 34, 123, 124, 36, 34, 34, + 34, 125, 34, 34, 34, 125, 34, 34, 34, 37, + 34, 126, 127, 34, 34, 34, 128, 34, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 129, 34, 34, 34, 131, 35, 36, 34, 34, 34, + 34, 34, 34, 34, 34, 132, 34, 34, 37, 34, + 34, 34, 133, 34, 34, 134, 34, 134, 134, 134, + + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 135, 134, 134, 134, 134, 136, 134, 134, 129, + 34, 34, 35, 36, 38, 35, 36, 163, 147, 141, + 179, 195, 168, 195, 180, 37, 183, 164, 39, 138, + 184, 139, 138, 142, 139, 34, 34, 35, 36, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 140, + 37, 140, 34, 34, 34, 34, 34, 140, 34, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, + 140, 34, 34, 34, 145, 150, 155, 141, 145, 256, + + 141, 287, 288, 167, 173, 170, 170, 170, 146, 151, + 156, 142, 146, 164, 142, 171, 175, 146, 174, 172, + 176, 141, 181, 185, 185, 185, 187, 185, 185, 185, + 185, 185, 216, 216, 216, 142, 182, 437, 205, 186, + 142, 195, 186, 195, 249, 186, 192, 193, 185, 192, + 193, 185, 198, 195, 194, 195, 199, 194, 206, 202, + 436, 195, 186, 195, 203, 186, 200, 207, 203, 201, + 204, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 208, 195, 195, 209, 195, 214, 210, 211, 196, 195, + 197, 195, 195, 215, 195, 212, 195, 141, 195, 221, + + 221, 213, 195, 435, 195, 218, 185, 185, 143, 225, + 219, 142, 144, 226, 227, 222, 223, 229, 163, 146, + 434, 186, 230, 230, 230, 232, 230, 230, 164, 230, + 230, 230, 234, 230, 230, 237, 237, 237, 231, 142, + 235, 231, 147, 251, 224, 231, 148, 251, 231, 239, + 230, 230, 246, 247, 240, 240, 274, 250, 247, 262, + 255, 247, 241, 146, 261, 231, 242, 243, 248, 264, + 229, 142, 267, 248, 146, 262, 248, 265, 146, 267, + 268, 266, 145, 269, 272, 271, 150, 270, 276, 273, + 155, 268, 271, 274, 275, 272, 146, 249, 277, 276, + + 151, 275, 278, 279, 156, 249, 280, 268, 272, 249, + 279, 268, 256, 167, 272, 173, 170, 280, 268, 272, + 252, 252, 268, 164, 170, 272, 281, 146, 170, 174, + 282, 170, 267, 281, 170, 170, 285, 286, 289, 267, + 283, 282, 181, 285, 284, 271, 269, 291, 286, 289, + 290, 266, 271, 185, 185, 185, 182, 249, 291, 187, + 185, 185, 293, 293, 293, 297, 192, 193, 185, 186, + 193, 193, 185, 142, 194, 186, 203, 195, 186, 195, + 300, 195, 186, 195, 252, 252, 186, 195, 296, 195, + 298, 299, 195, 301, 331, 302, 195, 195, 195, 195, + + 303, 331, 304, 305, 340, 307, 195, 195, 195, 295, + 306, 203, 195, 339, 195, 195, 308, 195, 195, 195, + 195, 195, 203, 195, 309, 195, 310, 195, 311, 195, + 251, 314, 312, 195, 251, 195, 195, 315, 195, 313, + 195, 195, 195, 195, 195, 195, 195, 195, 316, 203, + 216, 216, 216, 317, 318, 431, 195, 332, 195, 246, + 247, 194, 218, 185, 185, 221, 221, 219, 332, 225, + 230, 230, 230, 226, 227, 248, 146, 229, 186, 287, + 288, 222, 223, 232, 230, 230, 231, 321, 321, 321, + 234, 230, 230, 234, 230, 230, 430, 142, 235, 231, + + 326, 235, 429, 231, 249, 327, 231, 247, 247, 231, + 224, 237, 237, 237, 239, 230, 230, 336, 428, 240, + 240, 318, 318, 248, 336, 240, 240, 241, 146, 261, + 231, 242, 243, 241, 323, 250, 247, 242, 243, 255, + 247, 229, 262, 146, 427, 337, 342, 341, 369, 142, + 195, 248, 264, 146, 341, 248, 337, 342, 262, 333, + 345, 346, 347, 334, 350, 149, 352, 339, 346, 149, + 338, 401, 365, 347, 249, 169, 149, 333, 324, 169, + 149, 334, 358, 365, 249, 339, 235, 170, 338, 355, + 170, 169, 356, 361, 362, 169, 355, 293, 293, 293, + + 216, 216, 216, 356, 367, 203, 170, 363, 195, 203, + 195, 368, 371, 186, 195, 370, 195, 372, 391, 388, + 195, 195, 195, 195, 195, 195, 374, 195, 195, 195, + 195, 195, 304, 305, 185, 305, 305, 185, 203, 195, + 306, 375, 203, 373, 295, 195, 416, 195, 186, 378, + 195, 186, 195, 195, 376, 195, 203, 377, 195, 399, + 195, 195, 195, 195, 379, 380, 415, 195, 169, 195, + 414, 195, 169, 195, 317, 318, 317, 318, 321, 321, + 321, 413, 194, 324, 194, 234, 230, 230, 237, 237, + 237, 235, 262, 235, 231, 394, 345, 386, 387, 334, + + 389, 231, 264, 149, 335, 412, 149, 149, 262, 397, + 149, 350, 390, 334, 339, 386, 387, 334, 389, 361, + 362, 361, 362, 402, 404, 323, 195, 391, 340, 360, + 390, 203, 339, 363, 203, 363, 390, 339, 195, 405, + 195, 409, 195, 195, 406, 195, 410, 195, 170, 195, + 195, 407, 195, 408, 195, 195, 195, 195, 411, 195, + 195, 195, 195, 203, 404, 203, 417, 419, 195, 394, + 195, 195, 387, 195, 401, 397, 421, 195, 390, 195, + 418, 420, 391, 421, 422, 423, 203, 425, 424, 354, + 387, 390, 195, 195, 195, 195, 390, 203, 195, 203, + + 195, 195, 426, 195, 195, 404, 195, 417, 195, 195, + 195, 433, 419, 170, 195, 340, 195, 423, 423, 185, + 391, 418, 335, 195, 203, 195, 420, 422, 423, 185, + 195, 203, 195, 186, 203, 194, 195, 442, 195, 245, + 442, 443, 245, 186, 443, 195, 253, 195, 257, 253, + 388, 257, 385, 384, 383, 443, 382, 381, 443, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 48, 48, 48, 48, 48, 48, 48, 48, 48, + + 48, 48, 48, 48, 48, 48, 48, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 149, 149, 149, 149, 360, + 149, 149, 149, 149, 149, 149, 149, 149, 149, 354, + 149, 154, 154, 340, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 154, 154, 162, 162, 335, + 162, 162, 162, 329, 162, 162, 328, 162, 162, 162, + + 162, 162, 162, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 169, 169, 169, 177, + 177, 254, 177, 177, 177, 254, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 188, 188, 243, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 195, 195, 195, 233, 195, 227, 320, 220, 190, + 195, 195, 292, 195, 217, 217, 217, 191, 170, 165, + 260, 254, 233, 220, 191, 190, 217, 228, 189, 228, + 228, 178, 228, 228, 170, 228, 236, 236, 236, 170, + 236, 165, 160, 444, 444, 236, 236, 444, 236, 238, + + 238, 238, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 238, 244, 244, 444, 444, 244, 444, 244, 244, + 444, 244, 244, 444, 244, 263, 444, 444, 444, 263, + 263, 263, 444, 263, 263, 294, 294, 294, 444, 444, + 444, 444, 444, 444, 444, 294, 444, 294, 444, 294, + 319, 319, 444, 444, 319, 444, 444, 444, 444, 319, + 444, 444, 319, 229, 229, 444, 229, 322, 322, 322, + 444, 444, 444, 444, 444, 444, 444, 322, 444, 322, + 444, 322, 325, 444, 444, 444, 325, 444, 444, 444, + 444, 325, 444, 444, 325, 330, 444, 330, 444, 444, + + 330, 333, 333, 333, 333, 333, 333, 444, 333, 333, + 444, 333, 333, 333, 333, 333, 333, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 338, 338, 338, 338, 338, 338, 444, + 338, 338, 444, 338, 338, 338, 338, 338, 338, 339, + 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 344, 344, 344, 344, 344, 344, 344, 344, 344, + 344, 344, 344, 344, 344, 344, 344, 348, 348, 348, + + 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, + 348, 348, 348, 349, 349, 349, 349, 349, 349, 349, + 349, 349, 349, 349, 349, 349, 349, 349, 349, 351, + 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, + 351, 351, 351, 351, 351, 353, 353, 353, 353, 353, + 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, + 353, 357, 357, 357, 357, 357, 357, 357, 357, 357, + 357, 357, 357, 357, 357, 357, 357, 359, 359, 359, + 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, + 359, 359, 359, 364, 364, 364, 364, 364, 364, 364, + + 364, 364, 364, 364, 364, 364, 364, 364, 364, 366, + 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, + 366, 366, 366, 366, 366, 386, 386, 386, 386, 386, + 386, 444, 386, 386, 444, 386, 386, 386, 386, 386, + 386, 387, 387, 387, 387, 387, 387, 387, 387, 387, + 387, 387, 387, 387, 387, 387, 387, 389, 389, 389, + 389, 389, 389, 444, 389, 389, 444, 389, 389, 389, + 389, 389, 389, 390, 390, 390, 390, 390, 390, 390, + 390, 390, 390, 390, 390, 390, 390, 390, 390, 392, + 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, + + 392, 392, 392, 392, 392, 393, 393, 393, 393, 393, + 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, + 393, 395, 395, 395, 395, 395, 395, 395, 395, 395, + 395, 395, 395, 395, 395, 395, 395, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, + 396, 396, 396, 398, 398, 398, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 398, 398, 400, + 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, + 400, 400, 400, 400, 400, 403, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, + + 403, 432, 432, 432, 432, 432, 432, 444, 432, 432, + 444, 432, 432, 432, 432, 432, 432, 33, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444 + } ; + +static yyconst short int yy_chk[2068] = + { 0, + 0, 238, 1, 1, 2, 2, 2, 3, 3, 238, + 3, 18, 4, 4, 4, 1, 4, 37, 2, 16, + 3, 37, 5, 5, 16, 18, 4, 439, 3, 438, + 6, 6, 6, 16, 4, 5, 7, 7, 7, 8, + 8, 8, 289, 5, 6, 20, 7, 9, 9, 8, + 7, 289, 6, 8, 10, 10, 10, 11, 11, 20, + 9, 12, 12, 12, 13, 13, 11, 22, 10, 24, + 11, 12, 14, 14, 14, 12, 39, 13, 44, 436, + 39, 22, 44, 24, 126, 126, 14, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 21, 26, 28, 47, 32, 51, + 54, 47, 59, 51, 54, 135, 59, 434, 135, 26, + 28, 21, 32, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 29, 29, 30, 30, 30, 56, 61, 35, + 72, 195, 61, 195, 72, 29, 74, 56, 30, 29, + 74, 29, 30, 35, 30, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 38, 41, 46, 49, 53, 131, + + 63, 178, 178, 60, 66, 66, 65, 67, 38, 41, + 46, 49, 53, 60, 63, 65, 67, 60, 66, 65, + 67, 69, 73, 75, 75, 75, 76, 76, 76, 77, + 77, 77, 102, 102, 102, 69, 73, 431, 91, 75, + 76, 91, 76, 91, 131, 77, 85, 85, 85, 86, + 86, 86, 87, 87, 85, 87, 88, 86, 92, 89, + 429, 92, 85, 92, 93, 86, 88, 94, 89, 88, + 90, 89, 88, 89, 88, 93, 90, 93, 90, 94, + 95, 94, 96, 96, 96, 98, 96, 97, 86, 98, + 86, 98, 95, 99, 95, 97, 97, 141, 97, 106, + + 106, 97, 99, 428, 99, 103, 103, 103, 114, 108, + 103, 141, 114, 108, 108, 106, 106, 108, 163, 103, + 427, 103, 110, 110, 110, 111, 111, 111, 163, 112, + 112, 112, 116, 116, 116, 117, 117, 117, 110, 111, + 116, 111, 119, 125, 106, 112, 119, 125, 116, 118, + 118, 118, 123, 123, 120, 120, 420, 124, 124, 140, + 130, 130, 120, 118, 137, 118, 120, 120, 123, 140, + 120, 124, 143, 124, 130, 140, 130, 142, 137, 143, + 144, 142, 145, 146, 148, 147, 150, 146, 153, 151, + 155, 144, 147, 151, 152, 148, 145, 123, 156, 153, + + 150, 152, 156, 157, 155, 130, 158, 159, 161, 137, + 157, 166, 256, 167, 168, 173, 173, 158, 159, 161, + 248, 248, 166, 167, 171, 168, 171, 167, 172, 173, + 172, 174, 179, 171, 175, 176, 175, 176, 180, 179, + 174, 172, 181, 175, 174, 183, 182, 184, 176, 180, + 182, 418, 183, 185, 185, 185, 181, 256, 184, 187, + 187, 187, 191, 191, 191, 198, 192, 192, 192, 185, + 193, 193, 193, 187, 192, 187, 196, 198, 191, 198, + 200, 196, 192, 196, 252, 252, 193, 197, 197, 197, + 199, 199, 199, 201, 265, 202, 200, 201, 200, 201, + + 202, 265, 203, 203, 291, 204, 202, 204, 202, 191, + 203, 205, 205, 291, 205, 206, 206, 206, 207, 294, + 207, 294, 207, 208, 208, 208, 209, 209, 210, 209, + 251, 213, 211, 213, 251, 213, 210, 214, 210, 211, + 211, 203, 211, 203, 212, 214, 212, 214, 215, 212, + 216, 216, 216, 217, 217, 416, 215, 266, 215, 246, + 246, 217, 218, 218, 218, 221, 221, 218, 266, 228, + 230, 230, 230, 228, 228, 246, 218, 228, 218, 287, + 287, 221, 221, 232, 232, 232, 230, 233, 233, 233, + 234, 234, 234, 236, 236, 236, 415, 232, 234, 232, + + 258, 236, 414, 233, 246, 258, 234, 247, 247, 236, + 221, 237, 237, 237, 239, 239, 239, 269, 413, 240, + 240, 318, 318, 247, 269, 244, 244, 240, 239, 261, + 239, 240, 240, 244, 233, 250, 250, 244, 244, 255, + 255, 244, 263, 261, 412, 270, 274, 273, 300, 250, + 300, 250, 263, 255, 273, 255, 270, 274, 263, 275, + 276, 277, 278, 276, 280, 275, 281, 280, 277, 275, + 279, 400, 290, 278, 261, 281, 279, 275, 324, 281, + 279, 276, 285, 290, 255, 280, 324, 283, 279, 283, + 284, 285, 284, 288, 288, 285, 283, 293, 293, 293, + + 295, 295, 295, 284, 297, 296, 398, 288, 296, 298, + 296, 299, 302, 293, 301, 301, 301, 303, 390, 387, + 297, 298, 297, 298, 309, 299, 309, 299, 302, 303, + 302, 303, 304, 304, 304, 305, 305, 305, 307, 310, + 304, 310, 308, 305, 293, 308, 385, 308, 304, 314, + 307, 305, 307, 311, 311, 311, 312, 313, 312, 355, + 313, 314, 313, 314, 315, 316, 384, 315, 355, 315, + 383, 316, 355, 316, 317, 317, 319, 319, 321, 321, + 321, 382, 317, 325, 319, 322, 322, 322, 323, 323, + 323, 325, 330, 322, 321, 342, 344, 341, 342, 344, + + 346, 322, 330, 341, 364, 381, 346, 341, 330, 347, + 346, 349, 347, 364, 349, 341, 342, 344, 346, 361, + 361, 362, 362, 363, 369, 321, 369, 365, 366, 359, + 347, 367, 349, 361, 368, 362, 365, 366, 367, 370, + 367, 375, 371, 368, 371, 368, 376, 370, 357, 370, + 372, 372, 372, 374, 374, 375, 374, 375, 378, 377, + 376, 377, 376, 377, 379, 380, 388, 394, 379, 393, + 379, 378, 393, 378, 356, 396, 402, 380, 396, 380, + 388, 394, 403, 402, 404, 404, 407, 406, 405, 353, + 393, 403, 405, 406, 405, 406, 396, 408, 407, 410, + + 407, 408, 411, 408, 409, 409, 409, 417, 410, 424, + 410, 424, 419, 351, 411, 339, 411, 423, 423, 423, + 337, 417, 334, 404, 433, 404, 419, 422, 422, 422, + 425, 425, 425, 423, 426, 422, 433, 440, 433, 463, + 442, 440, 463, 422, 442, 426, 464, 426, 465, 464, + 332, 465, 329, 328, 327, 440, 326, 320, 442, 445, + 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, + 445, 445, 445, 445, 445, 446, 446, 446, 446, 446, + 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, + 446, 447, 447, 447, 447, 447, 447, 447, 447, 447, + + 447, 447, 447, 447, 447, 447, 447, 448, 448, 448, + 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, + 448, 448, 448, 449, 449, 449, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 450, + 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, + 450, 450, 450, 450, 450, 451, 451, 451, 451, 286, + 451, 451, 451, 451, 451, 451, 451, 451, 451, 282, + 451, 452, 452, 272, 452, 452, 452, 452, 452, 452, + 452, 452, 452, 452, 452, 452, 452, 453, 453, 268, + 453, 453, 453, 260, 453, 453, 259, 453, 453, 453, + + 453, 453, 453, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 455, + 455, 254, 455, 455, 455, 249, 455, 455, 455, 455, + 455, 455, 455, 455, 455, 456, 456, 242, 456, 456, + 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, + 456, 457, 457, 457, 231, 457, 226, 220, 219, 190, + 457, 457, 188, 457, 458, 458, 458, 186, 169, 164, + 136, 129, 115, 104, 84, 83, 458, 459, 81, 459, + 459, 71, 459, 459, 64, 459, 460, 460, 460, 62, + 460, 58, 52, 33, 0, 460, 460, 0, 460, 461, + + 461, 461, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 461, 462, 462, 0, 0, 462, 0, 462, 462, + 0, 462, 462, 0, 462, 466, 0, 0, 0, 466, + 466, 466, 0, 466, 466, 467, 467, 467, 0, 0, + 0, 0, 0, 0, 0, 467, 0, 467, 0, 467, + 468, 468, 0, 0, 468, 0, 0, 0, 0, 468, + 0, 0, 468, 469, 469, 0, 469, 470, 470, 470, + 0, 0, 0, 0, 0, 0, 0, 470, 0, 470, + 0, 470, 471, 0, 0, 0, 471, 0, 0, 0, + 0, 471, 0, 0, 471, 472, 0, 472, 0, 0, + + 472, 473, 473, 473, 473, 473, 473, 0, 473, 473, + 0, 473, 473, 473, 473, 473, 473, 474, 474, 474, + 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, + 474, 474, 474, 475, 475, 475, 475, 475, 475, 0, + 475, 475, 0, 475, 475, 475, 475, 475, 475, 476, + 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, + 476, 476, 476, 476, 476, 477, 477, 477, 477, 477, + 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, + 477, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 479, 479, 479, + + 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, + 479, 479, 479, 480, 480, 480, 480, 480, 480, 480, + 480, 480, 480, 480, 480, 480, 480, 480, 480, 481, + 481, 481, 481, 481, 481, 481, 481, 481, 481, 481, + 481, 481, 481, 481, 481, 482, 482, 482, 482, 482, + 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, + 482, 483, 483, 483, 483, 483, 483, 483, 483, 483, + 483, 483, 483, 483, 483, 483, 483, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 485, 485, 485, 485, 485, 485, 485, + + 485, 485, 485, 485, 485, 485, 485, 485, 485, 486, + 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, + 486, 486, 486, 486, 486, 487, 487, 487, 487, 487, + 487, 0, 487, 487, 0, 487, 487, 487, 487, 487, + 487, 488, 488, 488, 488, 488, 488, 488, 488, 488, + 488, 488, 488, 488, 488, 488, 488, 489, 489, 489, + 489, 489, 489, 0, 489, 489, 0, 489, 489, 489, + 489, 489, 489, 490, 490, 490, 490, 490, 490, 490, + 490, 490, 490, 490, 490, 490, 490, 490, 490, 491, + 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, + + 491, 491, 491, 491, 491, 492, 492, 492, 492, 492, + 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, + 492, 493, 493, 493, 493, 493, 493, 493, 493, 493, + 493, 493, 493, 493, 493, 493, 493, 494, 494, 494, + 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, + 494, 494, 494, 495, 495, 495, 495, 495, 495, 495, + 495, 495, 495, 495, 495, 495, 495, 495, 495, 496, + 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, + 496, 496, 496, 496, 496, 497, 497, 497, 497, 497, + 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, + + 497, 498, 498, 498, 498, 498, 498, 0, 498, 498, + 0, 498, 498, 498, 498, 498, 498, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 444, 444, 444, 444 + } ; + +static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; +static char *yy_full_match; +static int yy_lp; +static int yy_looking_for_trail_begin = 0; +static int yy_full_lp; +static int *yy_full_state; +#define YY_TRAILING_MASK 0x2000 +#define YY_TRAILING_HEAD_MASK 0x4000 +#define REJECT \ +{ \ +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ +yy_cp = yy_full_match; /* restore poss. backed-over text */ \ +yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \ +yy_state_ptr = yy_full_state; /* restore orig. state */ \ +yy_current_state = *yy_state_ptr; /* restore curr. state */ \ +++yy_lp; \ +goto find_rule; \ +} +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "code.l" +#define INITIAL 0 +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +#line 18 "code.l" + +/* + * includes + */ +#include +#include +#include +#include +#include + +#include "qtbc.h" +#include "scanner.h" +#include "entry.h" +#include "doxygen.h" +#include "message.h" +#include "outputlist.h" +#include "util.h" + +#define YY_NO_UNPUT +#define YY_NEVER_INTERACTIVE 1 + +class CodeClassDef +{ + public: + CodeClassDef() {} + CodeClassDef(const CodeClassDef &d) + { + name = d.name; + bases = d.bases; + } + ~CodeClassDef() {} + + QCString name; + QStrList bases; +}; + +class CodeVarDef +{ + public: + CodeVarDef() {} + CodeVarDef(const CodeVarDef &d) + { + name = d.name; + type = d.type; + classScope = d.classScope; + } + ~CodeVarDef() {} + + QCString name; + QCString type; + QCString classScope; +}; + +typedef QList CodeClassList; +typedef QDict CodeClassDict; +typedef QList CodeVarList; + +static CodeClassList codeClassList; +static CodeClassDict codeClassDict(17); +static CodeVarList codeVarList; +static CodeVarList codeParmList; + +/* ----------------------------------------------------------------- + * + * statics + */ + +static const char * inputString; //!< the code fragment as text +static int inputPosition; //!< read offset during parsing +static int inputLines; //!< number of line in the code fragment +static int yyLineNr; //!< current line number +static int lastCContext; +static int lastSpecialCContext; +static int lastStringContext; +static int bracketCount = 0; +static int curlyCount = 0; +static int sharpCount = 0; +static QCString type; +static QCString name; +static QCString args; +static QCString parmType; +static QCString parmName; +static bool inClass; +static QCString classScope; +static OutputList *code; +static CodeClassDef ccd; +static CodeVarDef cvd; +static bool exampleBlock; +static QCString exampleName; +static QCString exampleFile; +static int anchorCount; +static FileDef *sourceFileDef; +static QCString lastVariable; + +static void addType() +{ + if (name=="const") { name.resize(0); return; } + if (type.length()) type += ' ' ; + type += name ; + name.resize(0) ; + if (type.length()) type += ' ' ; + type += args ; + args.resize(0) ; +} + +static void addParmType() +{ + if (parmName=="const") { parmName.resize(0); return; } + if (parmType.length()) parmType += ' ' ; + parmType += parmName ; + parmName.resize(0) ; +} + +static void setClassScope(const QCString &name) +{ + QCString n=name; + n=n.simplifyWhiteSpace(); + int index; + if ((index=n.find("::"))!=-1) + classScope=n.left(index); + else + classScope.resize(0); + //printf("--->New class scope `%s'\n",classScope.data()); +} + +static void addVariable() +{ + cvd.name=name.copy().simplifyWhiteSpace(); + cvd.type=type.copy().simplifyWhiteSpace(); + if (type.length()==0) + return; + else if ((getClass(cvd.type)) || (codeClassDict[cvd.type])) + { + cvd.classScope=classScope; + codeVarList.append(new CodeVarDef(cvd)); // add it to a list + } +} + +static void addParameter() +{ + cvd.name=parmName.copy().simplifyWhiteSpace(); + cvd.type=parmType.copy().simplifyWhiteSpace(); + if (cvd.type.length()==0) + return; + else if ((getClass(cvd.type)) || (codeClassDict[cvd.type])) + { + cvd.classScope=classScope; + codeParmList.append(new CodeVarDef(cvd)); // add it to a list + } +} + +static void generateClassLink(OutputList &ol,const char *clName) +{ + QCString className=clName; + if (className.length()==0) return; + ClassDef *cd; + if ((cd=getClass(className)) && cd->isLinkable()) + { + if (exampleBlock) + { + QCString anchor; + anchor.sprintf("_a%d",anchorCount); + //printf("addExampleClass(%s,%s,%s)\n",anchor.data(),exampleName.data(), + // exampleFile.data()); + if (cd->addExample(anchor,exampleName,exampleFile)) + { + bool latexOn = ol.isEnabled(OutputGenerator::Latex); + if (latexOn) ol.disable(OutputGenerator::Latex); + ol.writeAnchor(anchor); + if (latexOn) ol.enable(OutputGenerator::Latex); + anchorCount++; + } + } + ol.writeCodeLink(cd->getReference(),cd->getOutputFileBase(),0,className); + } + else + { + ol.codify(clName); + } +} + +static bool getLink(const char *className, + const char *memberName,OutputList &result, + const char *text=0) +{ + MemberDef *md; + ClassDef *cd; + FileDef *fd; + NamespaceDef *nd; + QCString m=memberName; + QCString c=className; + //printf("Trying `%s'::`%s'\n",c.data(),m.data()); + if (getDefs(c,m,"()",md,cd,fd,nd) && md->isLinkable()) + { + //printf("Found!\n"); + if (exampleBlock) + { + QCString anchor; + anchor.sprintf("a%d",anchorCount); + //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),exampleName.data(), + // exampleFile.data()); + if (md->addExample(anchor,exampleName,exampleFile)) + { + bool latexEnabled = result.isEnabled(OutputGenerator::Latex); + if (latexEnabled) result.disable(OutputGenerator::Latex); + result.writeAnchor(anchor); + if (latexEnabled) result.enable(OutputGenerator::Latex); + anchorCount++; + } + } + Definition *d=0; + if (cd) d=cd; else if (cd) d=nd; else d=fd; + + if (d) + { + //printf("d->getOutputBase()=`%s' name=`%s'\n",d->getOutputFileBase().data(),md->name().data()); + result.writeCodeLink(d->getReference(),d->getOutputFileBase(), + md->anchor(),text ? text : memberName); + return TRUE; + } + } + return FALSE; +} + +static ClassDef *stripClassName(const char *s) +{ + QCString tmp=s; + QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*"); + int p=0,i,l; + while ((i=re.match(tmp,p,&l))!=-1) + { + ClassDef *cd=getClass(tmp.mid(i,l)); + if (cd) return cd; + p=i+l; + } + return 0; +} + +static void generateMemberLink(OutputList &ol,const char *varName, + const char *memName) +{ + //printf("generateMemberLink(object=%s,mem=%s) classScope=%s\n", + // varName,memName,classScope.data()); + CodeVarDef *cvd=codeParmList.last(); + while (cvd && cvd->name!=varName) cvd=codeParmList.prev(); + if (!cvd) + { + cvd=codeVarList.last(); + while (cvd && cvd->name!=varName) cvd=codeVarList.prev(); + } + if (cvd) // variable found + { + //printf("variable found type=%s!\n",cvd->type.data()); + CodeClassDef *ccd=codeClassDict[cvd->type]; + if (ccd) + { + //printf("Class found!\n"); + OutputList result(&ol); + if (getLink(ccd->name,memName,result)) + { + //printf("Found result!\n"); + ol+=result; + return; + } + char *s=ccd->bases.first(); + while (s) + { + OutputList result(&ol); + if (getLink(s,memName,result)) + { + //printf("Found result!\n"); + ol+=result; + return; + } + s=ccd->bases.next(); + } + } + else + { + OutputList result(&ol); + if (getLink(cvd->type,memName,result)) + { + ol+=result; + } + else + { + ol.codify(memName); + } + return; + } + } + else + { + ClassDef *vcd = getClass(classScope); + if (vcd) + { + //printf("Found class for variable `%s'\n",varName); + MemberName *vmn=memberNameDict[varName]; + if (vmn) + { + MemberNameIterator vmni(*vmn); + MemberDef *vmd; + for (;(vmd=vmni.current());++vmni) + { + if (vmd->isVariable() && vmd->memberClass()==vcd) + { + //printf("Found variable type=%s\n",vmd->typeString()); + ClassDef *mcd=stripClassName(vmd->typeString()); + if (mcd) + { + MemberName *mmn=memberNameDict[memName]; + if (mmn) + { + MemberNameIterator mmni(*mmn); + MemberDef *mmd; + for (;(mmd=mmni.current());++mmni) + { + if (mmd->memberClass()==mcd) + { + ol.writeCodeLink(mcd->getReference(),mcd->getOutputFileBase(), + mmd->anchor(),memName); + return; + } + } + } + } + } + } + } + } + } + ol.codify(memName); + return; +} + +static void generateFunctionLink(OutputList &ol,const char *funcName) +{ + OutputList result(&ol); + CodeClassDef *ccd=0; + QCString locScope=classScope.copy(); + QCString locFunc=funcName; + int i=locFunc.findRev("::"); + if (i>0) + { + locScope=locFunc.left(i); + locFunc=locFunc.right(locFunc.length()-i-2); + } + //printf("generateFunctionLink(%s) classScope=%s\n",locFunc.data(),locScope.data()); + if (locScope.length()>0 && (ccd=codeClassDict[locScope])) + { + //printf("using classScope %s\n",classScope.data()); + char *s=ccd->bases.first(); + while (s) + { + if (getLink(s,locFunc,result,funcName)) + { + ol+=result; + return; + } + s=ccd->bases.next(); + } + } + if (getLink(locScope,locFunc,result,funcName)) + { + ol+=result; + } + else + { + ol.codify(funcName); + } + return; +} + +/*! counts the number of lines in the input */ +static int countLines() +{ + const char *p=inputString; + char c; + int count=1; + while ((c=*p++)) if (c=='\n') count++; + return count; +} + +static void startCodeLine() +{ + if (sourceFileDef) + { + QCString lineNumber,lineAnchor; + lineNumber.sprintf("%05d ",yyLineNr); + lineAnchor.sprintf("l%05d",yyLineNr); + //MemberDef *md = sourceFileDef->getSourceDefinition(yyLineNr); + //Definition *d=0; + //if (md) + //{ + // d=md->memberClass(); + // if (!d) d=md->getFileDef(); + //} + //if (md && d) + Definition *d = sourceFileDef->getSourceDefinition(yyLineNr); + QCString anchor = sourceFileDef->getSourceAnchor(yyLineNr); + if (d && d->isLinkableInProject()) + { + code->startCodeAnchor(lineAnchor); + code->writeCodeLink(d->getReference(),d->getOutputFileBase(), + anchor,lineNumber); + code->endCodeAnchor(); + } + else + { + code->codify(lineNumber); + } + } + code->startCodeLine(); +} + +static void codifyLines(char *text) +{ + char *p=text,*sp=p; + char c; + bool done=FALSE; + while (!done) + { + sp=p; + while ((c=*p++) && c!='\n'); + if (c=='\n') + { + yyLineNr++; + *(p-1)='\0'; + code->codify(sp); + code->endCodeLine(); + if (yyLineNrcodify(sp); + done=TRUE; + } + } +} + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +#define SkipString 1 + +#define SkipCPP 2 + +#define SkipComment 3 + +#define SkipCxxComment 4 + +#define RemoveSpecialCComment 5 + +#define StripSpecialCComment 6 + +#define Body 7 + +#define FuncCall 8 + +#define MemberCall 9 + +#define MemberCall2 10 + +#define SkipInits 11 + +#define ClassName 12 + +#define Bases 13 + +#define SkipSharp 14 + +#define ReadInclude 15 + + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + yy_current_buffer->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 502 "code.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 445 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 2018 ); + +yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + if ( yy_act & YY_TRAILING_HEAD_MASK || + yy_looking_for_trail_begin ) + { + if ( yy_act == yy_looking_for_trail_begin ) + { + yy_looking_for_trail_begin = 0; + yy_act &= ~YY_TRAILING_HEAD_MASK; + break; + } + } + else if ( yy_act & YY_TRAILING_MASK ) + { + yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK; + yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK; + } + else + { + yy_full_match = yy_cp; + yy_full_state = yy_state_ptr; + yy_full_lp = yy_lp; + break; + } + ++yy_lp; + goto find_rule; + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +YY_RULE_SETUP +#line 504 "code.l" + + YY_BREAK +case 2: +YY_RULE_SETUP +#line 505 "code.l" +{ + code->codify(yytext); + BEGIN( ReadInclude ); + } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 509 "code.l" +{ + codifyLines(yytext); + //code->codify(yytext); + BEGIN( ClassName ); + } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 514 "code.l" +{ + //FileInfo *f; + bool ambig; + FileDef *fd; + if ((fd=findFileDef(&inputNameDict,yytext,ambig)) && + fd->isLinkable()) + { + code->writeCodeLink(fd->getReference(),fd->getOutputFileBase(),0,yytext); + } + else + { + code->codify(yytext); + } + char c=yyinput(); + QCString text; + text+=c; + code->codify(text); + BEGIN( Body ); + } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 533 "code.l" +{ + code->codify(yytext); + BEGIN( SkipCPP ) ; + } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 537 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 540 "code.l" +{ + codifyLines(yytext); + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 543 "code.l" +{ + codifyLines(yytext); + BEGIN( Body ) ; + } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 547 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 550 "code.l" +{ + code->codify(yytext); + curlyCount++; + type.resize(0); name.resize(0); + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 555 "code.l" +{ + code->codify(yytext); + inClass=FALSE; + if (--curlyCount<=0) + { + classScope.resize(0); + codeParmList.clear(); + } + } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 564 "code.l" +{ + code->codify(yytext); + BEGIN( Body ); + } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 568 "code.l" +{ + addType(); + code->codify(yytext); + } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 572 "code.l" +{ + ccd.name=yytext; + addType(); + generateClassLink(*code,yytext); + } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 577 "code.l" +{ + codifyLines(yytext); + BEGIN( Bases ); + } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 581 "code.l" +{ + code->codify(yytext); + curlyCount++; + inClass=TRUE; + if (ccd.name.length()>0) + { + classScope=ccd.name.copy(); + CodeClassDef *cd=new CodeClassDef(ccd); + codeClassList.append(cd); + codeClassDict.insert(cd->name,cd); + } + BEGIN( Body ); + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 594 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 597 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 600 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 603 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 606 "code.l" +{ + //printf("%s:addBase(%s)\n",ccd.name.data(),yytext); + ccd.bases.inSort(yytext); + generateClassLink(*code,yytext); + } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 611 "code.l" +{ + code->codify(yytext); + sharpCount=1; + BEGIN ( SkipSharp ); + } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 616 "code.l" +{ + code->codify(yytext); + ++sharpCount; + } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 620 "code.l" +{ + code->codify(yytext); + if (--sharpCount<=0) + BEGIN ( Bases ); + } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 625 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 26: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 630 "code.l" +{ + codifyLines(yytext); + name.resize(0);type.resize(0); + } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 634 "code.l" +{ + codifyLines(yytext); + name.resize(0);type.resize(0); + } + YY_BREAK +/* +([a-z_A-Z~][a-z_A-Z0-9]*)/([ \t]*) { + generateClassLink(*code,yytext); + addType(); + name+=yytext; + } + */ +case 28: +YY_RULE_SETUP +#line 645 "code.l" +{ + generateClassLink(*code,yytext); + //codifyLines(yytext); + addType(); + name+=yytext; + } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 651 "code.l" +{ + addType(); + //if (type.length()==0) + QCString tmp=yytext; + generateFunctionLink(*code,yytext); + //else + // code->codify(yytext); + bracketCount=1; + args.resize(0); + name+=yytext; + BEGIN( FuncCall ); + } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 663 "code.l" +{ + code->codify(yytext); + lastStringContext=YY_START; + BEGIN( SkipString ); + } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 668 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 671 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 674 "code.l" +{ + code->codify(yytext); + BEGIN( lastStringContext ); + } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 678 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 681 "code.l" +{ + code->codify(yytext); + name.resize(0);type.resize(0); + } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 685 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 688 "code.l" +{ + code->codify(yytext); + BEGIN( MemberCall ); + } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 692 "code.l" +{ + if (name.length()>0) + generateMemberLink(*code,name,yytext); + else + code->codify(yytext); + name.resize(0);type.resize(0); + bracketCount=0; + BEGIN(FuncCall); + } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 701 "code.l" +{ + code->codify(yytext); + type.resize(0); + name.resize(0); + BEGIN(Body); + } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 707 "code.l" +{ + code->codify(yytext); + if (type.length()>0) + addVariable(); + name.resize(0); + if (*yytext!=',') type.resize(0); + args.resize(0); + } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 715 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 718 "code.l" +{ + addParmType(); + parmName=yytext; + generateClassLink(*code,yytext); + } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 723 "code.l" +{ + code->codify(yytext); + addParameter(); + parmType.resize(0);parmName.resize(0); + } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 728 "code.l" +{ + code->codify(yytext); + bracketCount++; + } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 732 "code.l" +{ + code->codify(yytext); + if (--bracketCount<=0) + name.resize(0);args.resize(0); + parmType.resize(0);parmName.resize(0); + BEGIN( Body ); + } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 739 "code.l" +{ + codifyLines(yytext); + bracketCount=0; + if (!inClass && type.length()>0) + addVariable(); + name.resize(0);type.resize(0); + parmType.resize(0);parmName.resize(0); + BEGIN( Body ); + } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 748 "code.l" +{ + addParameter(); + parmType.resize(0);parmName.resize(0); + if (name.length()>0) setClassScope(name); + codifyLines(yytext); + curlyCount++; + type.resize(0); name.resize(0); + BEGIN( Body ); + } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 757 "code.l" +{ + addParameter(); + parmType.resize(0);parmName.resize(0); + if (name.length()>0) setClassScope(name); + codifyLines(yytext); + type.resize(0); name.resize(0); + BEGIN( SkipInits ); + } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 765 "code.l" +{ + code->codify(yytext); + curlyCount++; + BEGIN( Body ); + } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 770 "code.l" +{ + generateClassLink(*code,yytext); + } + YY_BREAK +case 51: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 773 "code.l" +{ + generateFunctionLink(*code,yytext); + } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 776 "code.l" +{ + code->codify(yytext); + args=yytext; + BEGIN( MemberCall2 ); + } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 781 "code.l" +{ + if (args.length()>0) + generateMemberLink(*code,args,yytext); + else + code->codify(yytext); + args.resize(0); + BEGIN( FuncCall ); + } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 789 "code.l" +{ + code->codify(yytext); + args=yytext; + } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 793 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 796 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 799 "code.l" +{ + code->codify(yytext); + BEGIN( lastCContext ) ; + } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 803 "code.l" +{ + codifyLines(yytext); + BEGIN( lastCContext ) ; + } + YY_BREAK +case 59: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 807 "code.l" +{ + yyLineNr+=QCString(yytext).contains('\n'); + } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 810 "code.l" +{ + yyLineNr+=QCString(yytext).contains('\n'); + code->endCodeLine(); + if (yyLineNr"//" +[ \t]*"* /" { + BEGIN( lastDContext ) ; + } +[ \t]*"* /"[ \t\n]*"\n"/"/ *" { + //code->codify("\n"); + //QCString lineText=yytext; + //yyLineNr+=lineText.contains('\n'); + BEGIN( lastDContext ) ; + } +. +\n { + codifyLines(yytext); + } +.* /\n { + codifyLines(yytext); + BEGIN( lastDContext ) ; + } +. +\n { + codifyLines(yytext); + } + */ +case 66: +YY_RULE_SETUP +#line 850 "code.l" +{ // remove special one-line comment + yyLineNr+=((QCString)yytext).contains('\n'); + code->endCodeLine(); + if (yyLineNrendCodeLine(); + if (yyLineNrcodify(yytext); + lastCContext = YY_START ; + BEGIN( SkipComment ) ; + } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 888 "code.l" +{ + code->codify(yytext); + lastCContext = YY_START ; + BEGIN( SkipCxxComment ) ; + } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 893 "code.l" +{ + codifyLines(yytext); + } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 896 "code.l" +{ + code->codify(yytext); + } + YY_BREAK +/* +<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines + //QCString sepLine=yytext; + //code->codify("\n\n"); + //yyLineNr+=sepLine.contains('\n'); + //char sepLine[3]="\n\n"; + codifyLines(yytext); + } + */ +case 76: +YY_RULE_SETUP +#line 909 "code.l" +ECHO; + YY_BREAK + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(SkipString): + case YY_STATE_EOF(SkipCPP): + case YY_STATE_EOF(SkipComment): + case YY_STATE_EOF(SkipCxxComment): + case YY_STATE_EOF(RemoveSpecialCComment): + case YY_STATE_EOF(StripSpecialCComment): + case YY_STATE_EOF(Body): + case YY_STATE_EOF(FuncCall): + case YY_STATE_EOF(MemberCall): + case YY_STATE_EOF(MemberCall2): + case YY_STATE_EOF(SkipInits): + case YY_STATE_EOF(ClassName): + case YY_STATE_EOF(Bases): + case YY_STATE_EOF(SkipSharp): + case YY_STATE_EOF(ReadInclude): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 445 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 445 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 444); + if ( ! yy_is_jam ) + *yy_state_ptr++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + yy_current_buffer->yy_at_bol = (c == '\n'); + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 909 "code.l" + + +/*@ ---------------------------------------------------------------------------- + */ + +void initParseCodeContext() +{ + codeClassList.setAutoDelete(TRUE); + codeVarList.setAutoDelete(TRUE); + codeParmList.setAutoDelete(TRUE); + codeClassDict.clear(); + codeClassList.clear(); + codeVarList.clear(); + codeParmList.clear(); + ccd.bases.clear(); + anchorCount = 0; +} + +void parseCode(OutputList &ol,const char *className,const QCString &s, + bool exBlock, const char *exName,FileDef *fd) +{ + code = new OutputList(&ol); + if (s.length()==0) return; + inputString = s; + inputPosition = 0; + inputLines = countLines(); + yyLineNr = 1; + curlyCount = 0; + bracketCount = 0; + sharpCount = 0; + classScope = className; + exampleBlock = exBlock; + exampleName = exName; + sourceFileDef = fd; + exampleFile = convertSlashes(exampleName,TRUE)+"-example"; + startCodeLine(); + type.resize(0); + name.resize(0); + args.resize(0); + parmName.resize(0); + parmType.resize(0); + codeYYrestart( codeYYin ); + BEGIN( Body ); + codeYYlex(); + //if (yyLineNr<=inputLines) code->endCodeLine(); + ol+=*code; + delete code; + return; +} + +extern "C" { // some bogus code to keep the compiler happy +// int codeYYwrap() { return 1 ; } + void codeYYdummy() { yy_flex_realloc(0,0); } +} diff --git a/src/code.h b/src/code.h index bf67df6..78257be 100644 --- a/src/code.h +++ b/src/code.h @@ -21,8 +21,9 @@ #include class OutputList; +class FileDef; extern void parseCode(OutputList &,const char *,const QCString &, - bool ,const char *); + bool ,const char *,FileDef *fd=0); extern void initParseCodeContext(); #endif diff --git a/src/code.l b/src/code.l index 2a60f6c..7536a0e 100644 --- a/src/code.l +++ b/src/code.l @@ -23,6 +23,7 @@ #include #include #include +#include #include "qtbc.h" #include "scanner.h" @@ -69,7 +70,7 @@ class CodeVarDef typedef QList CodeClassList; typedef QDict CodeClassDict; -typedef QList CodeVarList; +typedef QList CodeVarList; static CodeClassList codeClassList; static CodeClassDict codeClassDict(17); @@ -81,29 +82,32 @@ static CodeVarList codeParmList; * statics */ -static const char * inputString; -static int inputPosition; +static const char * inputString; //!< the code fragment as text +static int inputPosition; //!< read offset during parsing +static int inputLines; //!< number of line in the code fragment +static int yyLineNr; //!< current line number static int lastCContext; -static int lastDContext; +static int lastSpecialCContext; static int lastStringContext; static int bracketCount = 0; static int curlyCount = 0; static int sharpCount = 0; -static int yyLineNr = 0; -static QCString type; -static QCString name; -static QCString args; -static QCString parmType; -static QCString parmName; +static QCString type; +static QCString name; +static QCString args; +static QCString parmType; +static QCString parmName; static bool inClass; -static QCString classScope; +static QCString classScope; static OutputList *code; static CodeClassDef ccd; static CodeVarDef cvd; static bool exampleBlock; -static QCString exampleName; -static QCString exampleFile; +static QCString exampleName; +static QCString exampleFile; static int anchorCount; +static FileDef *sourceFileDef; +static QCString lastVariable; static void addType() { @@ -193,7 +197,8 @@ static void generateClassLink(OutputList &ol,const char *clName) } static bool getLink(const char *className, - const char *memberName,OutputList &result) + const char *memberName,OutputList &result, + const char *text=0) { MemberDef *md; ClassDef *cd; @@ -227,34 +232,27 @@ static bool getLink(const char *className, { //printf("d->getOutputBase()=`%s' name=`%s'\n",d->getOutputFileBase().data(),md->name().data()); result.writeCodeLink(d->getReference(),d->getOutputFileBase(), - md->anchor(),memberName); + md->anchor(),text ? text : memberName); return TRUE; - } - -// if (cd) -// { -// result.writeCodeLink(cd->getReference(),cd->getOutputFileBase(), -// md->anchor(),memberName); -// return TRUE; -// } -// else if (nd) -// { -// result.writeCodeLink(nd->getReference(),nd->getOutputFileBase(), -// md->anchor(),memberName); -// return TRUE; -// } -// else if (fd) -// { -// result.writeCodeLink(fd->getReference(),fd->getOutputFileBase(), -// md->anchor(),memberName); -// return TRUE; -// } } - return FALSE; } +static ClassDef *stripClassName(const char *s) +{ + QCString tmp=s; + QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*"); + int p=0,i,l; + while ((i=re.match(tmp,p,&l))!=-1) + { + ClassDef *cd=getClass(tmp.mid(i,l)); + if (cd) return cd; + p=i+l; + } + return 0; +} + static void generateMemberLink(OutputList &ol,const char *varName, const char *memName) { @@ -269,15 +267,25 @@ static void generateMemberLink(OutputList &ol,const char *varName, } if (cvd) // variable found { + //printf("variable found type=%s!\n",cvd->type.data()); CodeClassDef *ccd=codeClassDict[cvd->type]; if (ccd) { + //printf("Class found!\n"); + OutputList result(&ol); + if (getLink(ccd->name,memName,result)) + { + //printf("Found result!\n"); + ol+=result; + return; + } char *s=ccd->bases.first(); while (s) { OutputList result(&ol); if (getLink(s,memName,result)) { + //printf("Found result!\n"); ol+=result; return; } @@ -298,22 +306,70 @@ static void generateMemberLink(OutputList &ol,const char *varName, return; } } + else + { + ClassDef *vcd = getClass(classScope); + if (vcd) + { + //printf("Found class for variable `%s'\n",varName); + MemberName *vmn=memberNameDict[varName]; + if (vmn) + { + MemberNameIterator vmni(*vmn); + MemberDef *vmd; + for (;(vmd=vmni.current());++vmni) + { + if (vmd->isVariable() && vmd->memberClass()==vcd) + { + //printf("Found variable type=%s\n",vmd->typeString()); + ClassDef *mcd=stripClassName(vmd->typeString()); + if (mcd) + { + MemberName *mmn=memberNameDict[memName]; + if (mmn) + { + MemberNameIterator mmni(*mmn); + MemberDef *mmd; + for (;(mmd=mmni.current());++mmni) + { + if (mmd->memberClass()==mcd) + { + ol.writeCodeLink(mcd->getReference(),mcd->getOutputFileBase(), + mmd->anchor(),memName); + return; + } + } + } + } + } + } + } + } + } ol.codify(memName); return; } static void generateFunctionLink(OutputList &ol,const char *funcName) { - //printf("generateFunctionLink(%s) classScope=%s\n",funcName,classScope.data()); OutputList result(&ol); CodeClassDef *ccd=0; - if (classScope.length()>0 && (ccd=codeClassDict[classScope])) + QCString locScope=classScope.copy(); + QCString locFunc=funcName; + int i=locFunc.findRev("::"); + if (i>0) + { + locScope=locFunc.left(i); + locFunc=locFunc.right(locFunc.length()-i-2); + } + //printf("generateFunctionLink(%s) classScope=%s\n",locFunc.data(),locScope.data()); + if (locScope.length()>0 && (ccd=codeClassDict[locScope])) { //printf("using classScope %s\n",classScope.data()); char *s=ccd->bases.first(); while (s) { - if (getLink(s,funcName,result)) + if (getLink(s,locFunc,result,funcName)) { ol+=result; return; @@ -321,7 +377,7 @@ static void generateFunctionLink(OutputList &ol,const char *funcName) s=ccd->bases.next(); } } - if (getLink(classScope,funcName,result)) + if (getLink(locScope,locFunc,result,funcName)) { ol+=result; } @@ -332,6 +388,76 @@ static void generateFunctionLink(OutputList &ol,const char *funcName) return; } +/*! counts the number of lines in the input */ +static int countLines() +{ + const char *p=inputString; + char c; + int count=1; + while ((c=*p++)) if (c=='\n') count++; + return count; +} + +static void startCodeLine() +{ + if (sourceFileDef) + { + QCString lineNumber,lineAnchor; + lineNumber.sprintf("%05d ",yyLineNr); + lineAnchor.sprintf("l%05d",yyLineNr); + //MemberDef *md = sourceFileDef->getSourceDefinition(yyLineNr); + //Definition *d=0; + //if (md) + //{ + // d=md->memberClass(); + // if (!d) d=md->getFileDef(); + //} + //if (md && d) + Definition *d = sourceFileDef->getSourceDefinition(yyLineNr); + QCString anchor = sourceFileDef->getSourceAnchor(yyLineNr); + if (d && d->isLinkableInProject()) + { + code->startCodeAnchor(lineAnchor); + code->writeCodeLink(d->getReference(),d->getOutputFileBase(), + anchor,lineNumber); + code->endCodeAnchor(); + } + else + { + code->codify(lineNumber); + } + } + code->startCodeLine(); +} + +static void codifyLines(char *text) +{ + char *p=text,*sp=p; + char c; + bool done=FALSE; + while (!done) + { + sp=p; + while ((c=*p++) && c!='\n'); + if (c=='\n') + { + yyLineNr++; + *(p-1)='\0'; + code->codify(sp); + code->endCodeLine(); + if (yyLineNrcodify(sp); + done=TRUE; + } + } +} + /* ----------------------------------------------------------------- */ #undef YY_INPUT @@ -350,16 +476,19 @@ static int yyread(char *buf,int max_size) %} +B [ \t] +BN [ \t\n\r] ID [a-z_A-Z][a-z_A-Z0-9]* +SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) %option noyywrap %x SkipString %x SkipCPP %x SkipComment -%x SkipSpecialComment %x SkipCxxComment -%x SkipSpecialCxxComment +%x RemoveSpecialCComment +%x StripSpecialCComment %x Body %x FuncCall %x MemberCall @@ -373,12 +502,13 @@ ID [a-z_A-Z][a-z_A-Z0-9]* %% <*>\x0d -^([ \t]*"#include"[ \t]*)("<"|"\"") { +^([ \t]*"#"[ \t]"include"[ \t]*)("<"|"\"") { code->codify(yytext); BEGIN( ReadInclude ); } ("class"|"struct"|"union")[ \t\n]+ { - code->codify(yytext); + codifyLines(yytext); + //code->codify(yytext); BEGIN( ClassName ); } [a-z_A-Z0-9.]+(("/"[a-z_A-Z0-9.]+)*)/(">"|"\"") { @@ -408,12 +538,10 @@ ID [a-z_A-Z][a-z_A-Z0-9]* code->codify(yytext); } \\\n { - code->codify(yytext); - yyLineNr++ ; + codifyLines(yytext); } \n { - yyLineNr++ ; - code->codify(yytext); + codifyLines(yytext); BEGIN( Body ) ; } "//" { @@ -447,7 +575,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* generateClassLink(*code,yytext); } [ \t\n]*":"[ \t\n]* { - code->codify(yytext); + codifyLines(yytext); BEGIN( Bases ); } [ \t]*"{"[ \t]* { @@ -500,29 +628,33 @@ ID [a-z_A-Z][a-z_A-Z0-9]* ("asm"|"auto"|"break"|"case"|"catch"|"continue"|"default"|"delete"|"do"|"else"|"for"|"goto"|"if"|"new"|"return"|"switch"|"this"|"throw"|"try"|"typedef"|"while")([ \t\n]*)/"(" { - code->codify(yytext); + codifyLines(yytext); name.resize(0);type.resize(0); } ("asm"|"auto"|"break"|"case"|"catch"|"continue"|"default"|"delete"|"do"|"else"|"for"|"goto"|"if"|"new"|"return"|"switch"|"this"|"throw"|"try"|"typedef"|"while")([ \t\n]*) { - code->codify(yytext); + codifyLines(yytext); name.resize(0);type.resize(0); } + /* ([a-z_A-Z~][a-z_A-Z0-9]*)/([ \t]*) { generateClassLink(*code,yytext); addType(); name+=yytext; } -[a-z_A-Z~]([a-z_A-Z0-9]*[ \t\n]*"::")+[ \t\n]*[~a-z_A-Z][a-z_A-Z0-9]*[ \t\n]* { - code->codify(yytext); + */ +{SCOPENAME}/[ \t\n]* { + generateClassLink(*code,yytext); + //codifyLines(yytext); addType(); name+=yytext; } -([a-z_A-Z~][a-z_A-Z0-9:]*)/([ \t]*"(") { +{SCOPENAME}/{B}*"(" { addType(); - if (type.length()==0) - generateFunctionLink(*code,yytext); - else - code->codify(yytext); + //if (type.length()==0) + QCString tmp=yytext; + generateFunctionLink(*code,yytext); + //else + // code->codify(yytext); bracketCount=1; args.resize(0); name+=yytext; @@ -536,11 +668,14 @@ ID [a-z_A-Z][a-z_A-Z0-9]* [^\"\\]* { code->codify(yytext); } +"//"|"/*" { + code->codify(yytext); + } \" { code->codify(yytext); BEGIN( lastStringContext ); } -\\\" { +\\. { code->codify(yytext); } ":" { @@ -554,7 +689,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* code->codify(yytext); BEGIN( MemberCall ); } -([a-z_A-Z~][a-z_A-Z0-9]*)/([ \t\n]*"(") { +{SCOPENAME}/{B}*"(" { if (name.length()>0) generateMemberLink(*code,name,yytext); else @@ -563,7 +698,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* bracketCount=0; BEGIN(FuncCall); } -[^a-z_A-Z0-9(] { +[^a-z_A-Z0-9(\n] { code->codify(yytext); type.resize(0); name.resize(0); @@ -602,7 +737,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* BEGIN( Body ); } ")"[ \t\n]*";" { - code->codify(yytext); + codifyLines(yytext); bracketCount=0; if (!inClass && type.length()>0) addVariable(); @@ -614,7 +749,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* addParameter(); parmType.resize(0);parmName.resize(0); if (name.length()>0) setClassScope(name); - code->codify(yytext); + codifyLines(yytext); curlyCount++; type.resize(0); name.resize(0); BEGIN( Body ); @@ -623,7 +758,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* addParameter(); parmType.resize(0);parmName.resize(0); if (name.length()>0) setClassScope(name); - code->codify(yytext); + codifyLines(yytext); type.resize(0); name.resize(0); BEGIN( SkipInits ); } @@ -658,67 +793,118 @@ ID [a-z_A-Z][a-z_A-Z0-9]* "//" { code->codify(yytext); } +[^*/\n]+ { + code->codify(yytext); + } [ \t]*"*/" { code->codify(yytext); BEGIN( lastCContext ) ; } .*\n { - code->codify(yytext); - yyLineNr++ ; + codifyLines(yytext); BEGIN( lastCContext ) ; } -"//" - /*! -[ \t]*"* /"[ \t]* /"\n" { - BEGIN( lastDContext ) ; +"*/"{B}*\n({B}*\n)*{B}*"/*"[*!]/[^/*] { + yyLineNr+=QCString(yytext).contains('\n'); + } +"*/"{B}*\n({B}*\n)* { + yyLineNr+=QCString(yytext).contains('\n'); + code->endCodeLine(); + if (yyLineNr[ \t]*"*/" { +"*/" { + BEGIN(lastSpecialCContext); + } +[^*\n]+ +"//"|"/*" +\n { yyLineNr++; } +. + /* +"//" +[ \t]*"* /" { BEGIN( lastDContext ) ; } -[ \t]*"*/"[ \t\n]*"\n"/"/*" { +[ \t]*"* /"[ \t\n]*"\n"/"/ *" { //code->codify("\n"); - QCString lineText=yytext; - yyLineNr+=lineText.contains('\n'); + //QCString lineText=yytext; + //yyLineNr+=lineText.contains('\n'); BEGIN( lastDContext ) ; } . -\n { yyLineNr++; } -.*/\n { - yyLineNr++ ; +\n { + codifyLines(yytext); + } +.* /\n { + codifyLines(yytext); BEGIN( lastDContext ) ; } . -\n { yyLineNr++; } -<*>[ \t]*"/*!"|"/**" { - lastDContext = YY_START ; - BEGIN( SkipSpecialComment ); +\n { + codifyLines(yytext); + } + */ +<*>\n({B}*"//"[!/][^\n]*\n)* { // remove special one-line comment + yyLineNr+=((QCString)yytext).contains('\n'); + code->endCodeLine(); + if (yyLineNr^{B}*"//"[!/][^\n]*\n { // remove special one-line comment + yyLineNr++; + code->endCodeLine(); + if (yyLineNr"//"[!/][^\n]*\n { // strip special one-line comment + char c[2]; c[0]='\n'; c[1]=0; + codifyLines(c); + } +<*>\n{B}*"/*"[!*]/[^/*] { + lastSpecialCContext = YY_START; + yyLineNr++; + BEGIN(RemoveSpecialCComment); + } +<*>^{B}*"/*"[!*]/[^/*] { // special C comment block at a new line + lastSpecialCContext = YY_START; + BEGIN(RemoveSpecialCComment); + } +<*>"/*"[!*]/[^/*] { // special C comment block half way a line + lastSpecialCContext = YY_START; + BEGIN(RemoveSpecialCComment); } <*>"/*" { code->codify(yytext); lastCContext = YY_START ; BEGIN( SkipComment ) ; } -<*>[ \t]*"//!" { - lastDContext = YY_START ; - BEGIN( SkipSpecialCxxComment ); - } <*>"//" { code->codify(yytext); lastCContext = YY_START ; BEGIN( SkipCxxComment ) ; } +<*>\n { + codifyLines(yytext); + } <*>. { code->codify(yytext); } -<*>\n { - code->codify(yytext); - } + /* <*>([ \t\n]*"\n"){2,} { // combine multiple blank lines - QCString sepLine=yytext; - code->codify("\n\n"); - yyLineNr+=sepLine.contains('\n'); + //QCString sepLine=yytext; + //code->codify("\n\n"); + //yyLineNr+=sepLine.contains('\n'); + //char sepLine[3]="\n\n"; + codifyLines(yytext); } + */ %% @@ -739,20 +925,23 @@ void initParseCodeContext() } void parseCode(OutputList &ol,const char *className,const QCString &s, - bool e, const char *exName) + bool exBlock, const char *exName,FileDef *fd) { code = new OutputList(&ol); if (s.length()==0) return; inputString = s; inputPosition = 0; - yyLineNr = 0; + inputLines = countLines(); + yyLineNr = 1; curlyCount = 0; bracketCount = 0; sharpCount = 0; classScope = className; - exampleBlock = e; + exampleBlock = exBlock; exampleName = exName; + sourceFileDef = fd; exampleFile = convertSlashes(exampleName,TRUE)+"-example"; + startCodeLine(); type.resize(0); name.resize(0); args.resize(0); @@ -761,6 +950,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s, codeYYrestart( codeYYin ); BEGIN( Body ); codeYYlex(); + //if (yyLineNr<=inputLines) code->endCodeLine(); ol+=*code; delete code; return; diff --git a/src/config.cpp b/src/config.cpp new file mode 100644 index 0000000..0ec0b50 --- /dev/null +++ b/src/config.cpp @@ -0,0 +1,3977 @@ +#define yy_create_buffer configYY_create_buffer +#define yy_delete_buffer configYY_delete_buffer +#define yy_scan_buffer configYY_scan_buffer +#define yy_scan_string configYY_scan_string +#define yy_scan_bytes configYY_scan_bytes +#define yy_flex_debug configYY_flex_debug +#define yy_init_buffer configYY_init_buffer +#define yy_flush_buffer configYY_flush_buffer +#define yy_load_buffer_state configYY_load_buffer_state +#define yy_switch_to_buffer configYY_switch_to_buffer +#define yyin configYYin +#define yyleng configYYleng +#define yylex configYYlex +#define yyout configYYout +#define yyrestart configYYrestart +#define yytext configYYtext + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define yywrap() 1 +#define YY_SKIP_YYWRAP +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 92 +#define YY_END_OF_BUFFER 93 +static yyconst short int yy_accept[929] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 93, 90, 91, 90, + 90, 2, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 87, 90, 78, 75, 79, 2, 90, + 78, 78, 85, 86, 77, 76, 86, 86, 84, 82, + 82, 84, 84, 84, 90, 0, 89, 0, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + + 74, 74, 74, 0, 88, 78, 80, 78, 85, 86, + 77, 86, 83, 81, 0, 0, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 78, 86, 1, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 1, 1, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + + 74, 74, 74, 74, 0, 29, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 0, + 40, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 0, 13, 74, 74, 74, + + 74, 74, 0, 14, 74, 74, 0, 30, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 0, 12, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + + 74, 74, 74, 74, 74, 74, 0, 23, 0, 35, + 74, 0, 41, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 0, 17, 74, 74, 74, 0, 42, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + + 74, 74, 74, 74, 74, 0, 28, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 0, 7, + 74, 74, 0, 20, 74, 0, 37, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 0, 15, + 74, 74, 74, 74, 74, 74, 0, 16, 74, 74, + 74, 74, 74, 0, 45, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 0, 10, 0, + 9, 0, 6, 74, 74, 74, 74, 0, 73, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 0, 43, 74, + + 74, 74, 74, 74, 74, 74, 74, 74, 0, 27, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 0, 50, 74, 74, 74, 74, 74, 74, 0, 26, + 0, 72, 0, 19, 74, 74, 0, 11, 0, 8, + 74, 74, 74, 74, 74, 0, 3, 74, 0, 62, + 0, 44, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 0, 61, 0, 47, 74, 74, 74, 74, + 74, 74, 0, 36, 0, 31, 74, 0, 49, 74, + 74, 74, 74, 74, 74, 74, 74, 0, 63, 74, + 74, 0, 22, 74, 74, 74, 74, 74, 74, 74, + + 74, 74, 74, 74, 74, 0, 60, 74, 74, 74, + 74, 74, 74, 0, 38, 74, 74, 0, 48, 74, + 74, 74, 74, 74, 0, 34, 74, 74, 74, 74, + 0, 71, 0, 4, 74, 0, 67, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 0, 46, + 0, 59, 74, 74, 74, 74, 74, 0, 24, 74, + 0, 52, 74, 0, 21, 0, 53, 0, 39, 74, + 74, 74, 74, 0, 64, 74, 74, 0, 33, 0, + 32, 74, 74, 0, 18, 74, 74, 74, 74, 0, + 5, 0, 65, 74, 74, 0, 54, 74, 74, 74, + + 0, 69, 74, 74, 74, 0, 68, 0, 70, 74, + 74, 74, 0, 58, 0, 57, 0, 56, 0, 66, + 0, 55, 0, 25, 74, 0, 51, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 5, 6, 7, 1, 1, 1, 8, + 9, 1, 1, 1, 1, 1, 1, 10, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 1, 1, 1, + 12, 1, 1, 1, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 1, 39, 1, 1, 40, 1, 41, 41, 41, 42, + + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 43, + 41, 41, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[45] = + { 0, + 1, 2, 2, 2, 2, 3, 2, 1, 4, 5, + 5, 1, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 1, 5, + 6, 6, 6, 1 + } ; + +static yyconst short int yy_base[940] = + { 0, + 0, 1, 45, 0, 87, 88, 131, 174, 218, 262, + 305, 348, 100, 101, 392, 436, 1227, 1228, 1228, 3, + 1183, 1228, 0, 1201, 0, 0, 1, 0, 2, 1207, + 10, 7, 1210, 1209, 1208, 1187, 79, 1186, 1201, 83, + 1204, 1199, 1202, 1228, 6, 0, 1228, 1228, 0, 1206, + 12, 1170, 0, 0, 1210, 1228, 95, 1168, 1228, 1228, + 1228, 1202, 109, 1166, 1199, 114, 1228, 1197, 0, 95, + 1180, 1184, 1173, 1182, 1189, 13, 1170, 1185, 1186, 128, + 1174, 1173, 1170, 1179, 1169, 1180, 127, 1158, 1159, 3, + 1158, 1161, 1170, 1157, 131, 1165, 134, 1172, 1151, 1153, + + 6, 1152, 1151, 118, 1228, 0, 1228, 1170, 0, 0, + 1177, 1168, 1228, 1228, 1168, 1134, 1158, 1154, 1160, 1132, + 1154, 1153, 1129, 1137, 1136, 1138, 1152, 1124, 1149, 1137, + 1137, 1147, 123, 1142, 1134, 1140, 1139, 1131, 1135, 1129, + 1135, 1130, 1117, 1132, 1135, 1130, 1116, 1105, 1116, 1126, + 1102, 1117, 1124, 1117, 1121, 1104, 1119, 1105, 1104, 1112, + 1092, 1113, 1116, 1103, 1086, 1085, 1228, 1090, 1112, 1087, + 1110, 1104, 1081, 8, 1089, 1079, 1105, 1103, 133, 1092, + 1087, 1081, 1087, 1099, 1095, 1070, 1069, 1078, 1067, 1066, + 1088, 1071, 1073, 1076, 1069, 1070, 1083, 1062, 1070, 137, + + 1063, 1065, 1074, 1053, 1075, 1074, 1058, 1059, 1075, 1072, + 1071, 1057, 1053, 1062, 1069, 1060, 0, 0, 1048, 1065, + 1047, 1063, 1036, 1044, 1061, 1043, 1032, 1050, 1055, 1045, + 1054, 1037, 1049, 1041, 1048, 1047, 110, 1035, 1033, 1032, + 1046, 1025, 169, 1017, 1040, 1034, 1037, 155, 1027, 1025, + 1011, 1010, 1013, 1015, 1015, 1006, 1008, 1016, 1025, 1027, + 0, 1010, 1008, 1019, 1021, 997, 1015, 1011, 1002, 1007, + 1015, 1014, 990, 998, 1003, 1010, 1001, 1001, 1008, 997, + 990, 1004, 989, 995, 978, 1000, 999, 975, 982, 985, + 997, 998, 997, 977, 982, 983, 979, 988, 971, 971, + + 974, 984, 968, 959, 159, 1228, 980, 984, 981, 74, + 978, 962, 961, 952, 959, 962, 976, 967, 955, 171, + 1228, 965, 945, 112, 944, 965, 944, 964, 959, 960, + 948, 945, 960, 947, 957, 947, 955, 172, 950, 930, + 929, 928, 939, 186, 938, 925, 191, 937, 923, 949, + 921, 928, 927, 941, 941, 935, 928, 941, 921, 915, + 938, 910, 909, 927, 926, 922, 905, 927, 910, 906, + 924, 912, 170, 902, 921, 905, 910, 895, 900, 919, + 906, 910, 916, 899, 911, 896, 901, 894, 898, 902, + 905, 908, 895, 888, 189, 190, 1228, 905, 904, 892, + + 894, 901, 195, 1228, 883, 884, 197, 1228, 883, 884, + 177, 894, 880, 875, 886, 865, 877, 884, 870, 885, + 872, 875, 866, 869, 880, 869, 870, 853, 879, 878, + 858, 861, 862, 854, 865, 872, 856, 853, 862, 864, + 854, 862, 848, 858, 850, 845, 847, 202, 204, 833, + 230, 859, 856, 838, 837, 854, 850, 231, 1228, 847, + 841, 851, 837, 830, 844, 847, 846, 834, 833, 826, + 832, 841, 836, 812, 214, 836, 824, 832, 831, 814, + 829, 215, 832, 817, 825, 810, 825, 807, 823, 810, + 824, 805, 803, 804, 807, 815, 807, 238, 814, 152, + + 239, 808, 807, 812, 799, 800, 242, 1228, 243, 1228, + 804, 247, 1228, 799, 809, 808, 800, 802, 778, 787, + 788, 783, 798, 793, 784, 779, 778, 772, 784, 786, + 793, 773, 774, 777, 770, 788, 787, 786, 758, 757, + 766, 765, 762, 762, 273, 775, 759, 775, 762, 771, + 760, 754, 768, 751, 757, 761, 274, 764, 761, 275, + 758, 276, 1228, 277, 753, 752, 278, 1228, 759, 749, + 750, 738, 732, 754, 739, 745, 747, 279, 737, 740, + 752, 744, 746, 745, 280, 731, 216, 728, 719, 281, + 724, 738, 736, 729, 741, 728, 720, 725, 731, 269, + + 724, 293, 301, 302, 728, 313, 1228, 717, 726, 714, + 314, 714, 728, 715, 711, 708, 708, 711, 315, 1228, + 722, 703, 316, 1228, 709, 317, 1228, 717, 719, 708, + 708, 686, 642, 15, 80, 318, 62, 100, 319, 1228, + 88, 155, 144, 159, 172, 174, 320, 1228, 184, 321, + 195, 198, 189, 322, 1228, 224, 235, 222, 225, 235, + 237, 279, 333, 279, 274, 282, 283, 334, 1228, 335, + 1228, 336, 1228, 322, 314, 354, 355, 356, 1228, 357, + 310, 328, 358, 359, 322, 336, 331, 351, 342, 370, + 356, 372, 373, 360, 360, 365, 363, 378, 1228, 360, + + 366, 370, 363, 358, 351, 400, 401, 390, 404, 1228, + 377, 378, 379, 378, 380, 412, 413, 400, 444, 382, + 417, 1228, 399, 408, 397, 398, 409, 396, 445, 1228, + 447, 1228, 448, 1228, 449, 398, 450, 1228, 451, 1228, + 403, 453, 405, 414, 403, 456, 1228, 405, 464, 1228, + 465, 1228, 437, 439, 438, 454, 446, 457, 457, 461, + 477, 460, 480, 1228, 481, 1228, 467, 459, 460, 470, + 471, 488, 489, 1228, 492, 1228, 464, 494, 1228, 480, + 496, 475, 471, 489, 491, 475, 507, 508, 1228, 490, + 486, 511, 1228, 484, 498, 514, 515, 487, 519, 502, + + 494, 509, 488, 498, 499, 530, 1228, 507, 503, 504, + 505, 521, 536, 537, 1228, 538, 517, 541, 1228, 527, + 514, 529, 530, 549, 550, 1228, 537, 553, 519, 555, + 556, 1228, 557, 1228, 558, 561, 1228, 562, 535, 554, + 541, 560, 574, 561, 547, 577, 578, 564, 580, 1228, + 581, 1228, 556, 583, 570, 558, 561, 592, 1228, 578, + 595, 1228, 596, 597, 1228, 598, 1228, 599, 1228, 600, + 567, 588, 604, 611, 1228, 597, 594, 615, 1228, 616, + 1228, 601, 618, 619, 1228, 591, 593, 594, 624, 627, + 1228, 630, 1228, 631, 619, 633, 1228, 601, 612, 638, + + 639, 1228, 642, 644, 645, 646, 1228, 647, 1228, 650, + 651, 636, 658, 1228, 659, 1228, 662, 1228, 663, 1228, + 664, 1228, 665, 1228, 666, 667, 1228, 1228, 679, 685, + 691, 697, 703, 709, 711, 717, 666, 723, 726 + } ; + +static yyconst short int yy_def[940] = + { 0, + 929, 929, 928, 3, 929, 929, 930, 930, 931, 931, + 932, 932, 933, 933, 934, 934, 928, 928, 928, 928, + 928, 928, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 928, 928, 936, 928, 928, 936, 928, + 936, 936, 937, 938, 928, 928, 938, 938, 928, 928, + 928, 928, 928, 928, 939, 928, 928, 928, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + + 935, 935, 935, 928, 928, 936, 928, 936, 937, 938, + 928, 938, 928, 928, 939, 928, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 936, 938, 928, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 936, 938, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + + 935, 935, 935, 935, 928, 928, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 928, + 928, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 928, 928, 935, 935, 935, + + 935, 935, 928, 928, 935, 935, 928, 928, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 928, 928, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + + 935, 935, 935, 935, 935, 935, 928, 928, 928, 928, + 935, 928, 928, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 928, 928, 935, 935, 935, 928, 928, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + + 935, 935, 935, 935, 935, 928, 928, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 928, 928, + 935, 935, 928, 928, 935, 928, 928, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 928, 928, + 935, 935, 935, 935, 935, 935, 928, 928, 935, 935, + 935, 935, 935, 928, 928, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 928, 928, 928, + 928, 928, 928, 935, 935, 935, 935, 928, 928, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 928, 928, 935, + + 935, 935, 935, 935, 935, 935, 935, 935, 928, 928, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 928, 928, 935, 935, 935, 935, 935, 935, 928, 928, + 928, 928, 928, 928, 935, 935, 928, 928, 928, 928, + 935, 935, 935, 935, 935, 928, 928, 935, 928, 928, + 928, 928, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 928, 928, 928, 928, 935, 935, 935, 935, + 935, 935, 928, 928, 928, 928, 935, 928, 928, 935, + 935, 935, 935, 935, 935, 935, 935, 928, 928, 935, + 935, 928, 928, 935, 935, 935, 935, 935, 935, 935, + + 935, 935, 935, 935, 935, 928, 928, 935, 935, 935, + 935, 935, 935, 928, 928, 935, 935, 928, 928, 935, + 935, 935, 935, 935, 928, 928, 935, 935, 935, 935, + 928, 928, 928, 928, 935, 928, 928, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 928, 928, + 928, 928, 935, 935, 935, 935, 935, 928, 928, 935, + 928, 928, 935, 928, 928, 928, 928, 928, 928, 935, + 935, 935, 935, 928, 928, 935, 935, 928, 928, 928, + 928, 935, 935, 928, 928, 935, 935, 935, 935, 928, + 928, 928, 928, 935, 935, 928, 928, 935, 935, 935, + + 928, 928, 935, 935, 935, 928, 928, 928, 928, 935, + 935, 935, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 928, 928, 928, 935, 928, 928, 0, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928 + } ; + +static yyconst short int yy_nxt[1273] = + { 0, + 928, 320, 19, 19, 66, 67, 66, 104, 105, 104, + 928, 321, 73, 66, 67, 66, 928, 147, 74, 161, + 71, 77, 81, 75, 162, 79, 76, 78, 148, 72, + 84, 86, 87, 225, 82, 80, 125, 126, 20, 20, + 226, 85, 696, 21, 21, 18, 18, 19, 18, 18, + 22, 18, 18, 18, 23, 23, 18, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 23, 34, 35, + 23, 36, 37, 38, 39, 40, 41, 23, 42, 43, + 23, 23, 23, 20, 23, 23, 23, 23, 21, 44, + 44, 92, 697, 368, 93, 94, 66, 67, 66, 98, + + 369, 700, 60, 60, 61, 61, 62, 62, 95, 99, + 66, 67, 66, 113, 100, 66, 67, 66, 117, 104, + 105, 104, 118, 701, 289, 45, 45, 702, 381, 119, + 21, 21, 18, 47, 18, 48, 49, 50, 63, 63, + 130, 140, 131, 64, 64, 231, 141, 153, 156, 290, + 142, 382, 184, 253, 143, 132, 305, 154, 144, 133, + 305, 157, 185, 254, 565, 232, 306, 703, 704, 51, + 306, 705, 320, 396, 52, 18, 47, 18, 48, 49, + 50, 296, 321, 397, 566, 435, 297, 403, 298, 469, + 458, 396, 407, 436, 307, 299, 403, 404, 407, 300, + + 459, 397, 408, 507, 470, 509, 404, 706, 408, 707, + 708, 711, 51, 508, 712, 510, 713, 52, 18, 18, + 47, 18, 18, 22, 18, 18, 18, 18, 18, 18, + 409, 512, 458, 535, 545, 650, 714, 536, 537, 562, + 567, 513, 459, 507, 509, 538, 546, 651, 512, 563, + 568, 715, 716, 508, 510, 717, 20, 18, 513, 718, + 719, 21, 18, 18, 47, 18, 18, 22, 18, 18, + 18, 18, 18, 18, 606, 619, 623, 562, 626, 567, + 639, 647, 654, 665, 607, 620, 624, 563, 627, 568, + 640, 648, 655, 666, 668, 720, 723, 724, 725, 726, + + 20, 18, 670, 672, 669, 21, 55, 56, 18, 48, + 22, 50, 671, 673, 606, 678, 619, 623, 626, 698, + 639, 647, 709, 654, 607, 679, 620, 624, 627, 699, + 640, 648, 710, 655, 721, 668, 670, 672, 727, 728, + 735, 736, 741, 57, 722, 669, 671, 673, 58, 55, + 56, 18, 48, 22, 50, 729, 731, 678, 733, 737, + 739, 742, 743, 744, 745, 730, 732, 679, 734, 738, + 740, 746, 748, 749, 751, 753, 754, 755, 756, 698, + 757, 747, 758, 750, 752, 759, 57, 760, 761, 699, + 762, 58, 18, 18, 19, 18, 18, 18, 18, 18, + + 18, 763, 765, 18, 767, 709, 768, 769, 770, 771, + 772, 764, 766, 773, 775, 710, 777, 781, 721, 782, + 783, 784, 785, 774, 776, 786, 787, 790, 722, 791, + 20, 794, 795, 796, 797, 21, 18, 18, 19, 18, + 18, 18, 18, 18, 18, 778, 729, 18, 731, 733, + 788, 737, 739, 798, 792, 779, 730, 746, 732, 734, + 789, 738, 740, 780, 793, 749, 751, 747, 799, 800, + 801, 802, 803, 804, 20, 750, 752, 805, 806, 21, + 808, 763, 765, 809, 810, 811, 812, 813, 807, 814, + 773, 764, 766, 775, 816, 778, 817, 818, 820, 815, + + 774, 821, 822, 776, 823, 779, 824, 819, 825, 788, + 827, 828, 792, 829, 830, 831, 833, 835, 826, 789, + 836, 838, 793, 839, 840, 832, 834, 841, 842, 843, + 837, 806, 844, 845, 846, 847, 848, 849, 814, 851, + 853, 807, 818, 854, 855, 856, 857, 850, 815, 852, + 858, 825, 819, 860, 861, 863, 864, 831, 833, 866, + 859, 826, 836, 868, 862, 870, 865, 832, 834, 867, + 871, 872, 837, 869, 873, 874, 876, 877, 878, 880, + 882, 849, 851, 883, 884, 875, 886, 887, 879, 881, + 888, 850, 852, 858, 885, 889, 861, 890, 864, 866, + + 868, 892, 894, 859, 895, 896, 862, 891, 865, 867, + 869, 893, 874, 898, 899, 897, 878, 880, 900, 901, + 884, 903, 875, 904, 905, 906, 879, 881, 890, 902, + 885, 892, 908, 910, 896, 907, 911, 912, 891, 913, + 901, 893, 909, 915, 897, 917, 919, 906, 908, 914, + 902, 921, 923, 916, 925, 918, 920, 907, 909, 913, + 915, 922, 924, 917, 919, 921, 923, 926, 926, 914, + 916, 109, 695, 918, 920, 922, 924, 927, 927, 18, + 18, 18, 18, 18, 18, 46, 46, 46, 46, 46, + 46, 53, 53, 53, 53, 53, 53, 54, 54, 54, + + 54, 54, 54, 59, 59, 59, 59, 59, 59, 65, + 65, 65, 65, 65, 65, 69, 69, 106, 694, 106, + 106, 106, 106, 110, 693, 692, 110, 110, 110, 115, + 115, 115, 691, 690, 689, 688, 687, 686, 685, 684, + 683, 682, 681, 680, 677, 676, 675, 674, 667, 664, + 663, 662, 661, 660, 659, 658, 657, 656, 653, 652, + 649, 646, 645, 644, 643, 642, 641, 638, 637, 636, + 635, 634, 633, 632, 631, 630, 629, 628, 625, 622, + 621, 618, 617, 616, 615, 614, 613, 612, 611, 610, + 609, 608, 605, 604, 603, 602, 601, 600, 599, 598, + + 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, + 587, 586, 585, 584, 583, 582, 581, 580, 579, 578, + 577, 576, 575, 574, 573, 572, 571, 570, 569, 564, + 561, 560, 559, 558, 557, 556, 555, 554, 553, 552, + 551, 550, 549, 548, 547, 544, 543, 542, 541, 540, + 539, 534, 533, 532, 531, 530, 529, 528, 527, 526, + 525, 524, 523, 522, 521, 520, 519, 518, 517, 516, + 515, 514, 511, 506, 505, 504, 503, 502, 501, 500, + 499, 498, 497, 496, 495, 494, 493, 492, 491, 490, + 489, 488, 487, 486, 485, 484, 483, 482, 481, 480, + + 479, 478, 477, 476, 475, 474, 473, 472, 471, 468, + 467, 466, 465, 464, 463, 462, 461, 460, 457, 456, + 455, 454, 453, 452, 451, 450, 449, 448, 447, 446, + 445, 444, 443, 442, 441, 440, 439, 438, 437, 434, + 433, 432, 431, 430, 429, 428, 427, 426, 425, 424, + 423, 422, 421, 420, 419, 418, 417, 416, 415, 414, + 413, 412, 411, 410, 406, 405, 402, 401, 400, 399, + 398, 395, 394, 393, 392, 391, 390, 389, 388, 387, + 386, 385, 384, 383, 380, 379, 378, 377, 376, 375, + 374, 373, 372, 371, 370, 367, 366, 365, 364, 363, + + 362, 361, 360, 359, 358, 357, 356, 355, 354, 353, + 352, 351, 350, 349, 348, 347, 346, 345, 344, 343, + 342, 341, 340, 339, 338, 337, 336, 335, 334, 333, + 332, 331, 330, 329, 328, 327, 326, 325, 324, 323, + 322, 319, 318, 317, 316, 315, 314, 313, 312, 311, + 310, 309, 308, 304, 303, 302, 301, 295, 294, 293, + 292, 291, 288, 287, 286, 285, 284, 283, 282, 281, + 280, 279, 278, 277, 276, 275, 274, 273, 272, 271, + 270, 269, 268, 267, 266, 265, 264, 263, 262, 261, + 260, 259, 258, 257, 256, 255, 252, 251, 250, 249, + + 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, + 238, 237, 236, 235, 234, 233, 230, 229, 228, 227, + 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, + 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, + 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, + 194, 193, 192, 191, 190, 189, 188, 187, 186, 183, + 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, + 172, 171, 170, 169, 168, 167, 114, 166, 111, 165, + 164, 163, 160, 159, 158, 155, 152, 151, 150, 149, + 146, 145, 139, 138, 137, 136, 135, 134, 129, 128, + + 127, 124, 123, 122, 121, 120, 116, 114, 68, 107, + 112, 111, 108, 107, 103, 102, 101, 97, 96, 91, + 90, 89, 88, 83, 70, 68, 928, 17, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 928 + } ; + +static yyconst short int yy_chk[1273] = + { 0, + 0, 261, 1, 2, 20, 20, 20, 45, 45, 45, + 0, 261, 26, 51, 51, 51, 0, 90, 26, 101, + 25, 27, 29, 26, 101, 28, 26, 27, 90, 25, + 31, 32, 32, 174, 29, 28, 76, 76, 1, 2, + 174, 31, 634, 1, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, + 6, 37, 635, 310, 37, 37, 57, 57, 57, 40, + + 310, 637, 13, 14, 13, 14, 13, 14, 37, 40, + 63, 63, 63, 63, 40, 66, 66, 66, 70, 104, + 104, 104, 70, 638, 237, 5, 6, 641, 324, 70, + 5, 6, 7, 7, 7, 7, 7, 7, 13, 14, + 80, 87, 80, 13, 14, 179, 87, 95, 97, 237, + 87, 324, 133, 200, 87, 80, 248, 95, 87, 80, + 305, 97, 133, 200, 500, 179, 248, 642, 643, 7, + 305, 644, 320, 338, 7, 8, 8, 8, 8, 8, + 8, 243, 320, 338, 500, 373, 243, 344, 243, 411, + 395, 396, 347, 373, 248, 243, 403, 344, 407, 243, + + 395, 396, 347, 448, 411, 449, 403, 645, 407, 646, + 649, 651, 8, 448, 652, 449, 653, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 347, 451, 458, 475, 482, 587, 656, 475, 475, 498, + 501, 451, 458, 507, 509, 475, 482, 587, 512, 498, + 501, 657, 658, 507, 509, 659, 9, 9, 512, 660, + 661, 9, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 545, 557, 560, 562, 564, 567, + 578, 585, 590, 600, 545, 557, 560, 562, 564, 567, + 578, 585, 590, 600, 602, 662, 664, 665, 666, 667, + + 10, 10, 603, 604, 602, 10, 11, 11, 11, 11, + 11, 11, 603, 604, 606, 611, 619, 623, 626, 636, + 639, 647, 650, 654, 606, 611, 619, 623, 626, 636, + 639, 647, 650, 654, 663, 668, 670, 672, 674, 675, + 681, 682, 685, 11, 663, 668, 670, 672, 11, 12, + 12, 12, 12, 12, 12, 676, 677, 678, 680, 683, + 684, 686, 687, 688, 689, 676, 677, 678, 680, 683, + 684, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 700, 690, 701, 692, 693, 702, 12, 703, 704, 698, + 705, 12, 15, 15, 15, 15, 15, 15, 15, 15, + + 15, 706, 707, 15, 708, 709, 711, 712, 713, 714, + 715, 706, 707, 716, 717, 709, 718, 720, 721, 723, + 724, 725, 726, 716, 717, 727, 728, 736, 721, 741, + 15, 743, 744, 745, 748, 15, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 719, 729, 16, 731, 733, + 735, 737, 739, 753, 742, 719, 729, 746, 731, 733, + 735, 737, 739, 719, 742, 749, 751, 746, 754, 755, + 756, 757, 758, 759, 16, 749, 751, 760, 761, 16, + 762, 763, 765, 767, 768, 769, 770, 771, 761, 772, + 773, 763, 765, 775, 777, 778, 780, 781, 782, 772, + + 773, 783, 784, 775, 785, 778, 786, 781, 787, 788, + 790, 791, 792, 794, 795, 796, 797, 798, 787, 788, + 799, 800, 792, 801, 802, 796, 797, 803, 804, 805, + 799, 806, 808, 809, 810, 811, 812, 813, 814, 816, + 817, 806, 818, 820, 821, 822, 823, 813, 814, 816, + 824, 825, 818, 827, 828, 829, 830, 831, 833, 835, + 824, 825, 836, 838, 828, 839, 830, 831, 833, 835, + 840, 841, 836, 838, 842, 843, 844, 845, 846, 847, + 848, 849, 851, 853, 854, 843, 855, 856, 846, 847, + 857, 849, 851, 858, 854, 860, 861, 863, 864, 866, + + 868, 870, 871, 858, 872, 873, 861, 863, 864, 866, + 868, 870, 874, 876, 877, 873, 878, 880, 882, 883, + 884, 886, 874, 887, 888, 889, 878, 880, 890, 883, + 884, 892, 894, 895, 896, 889, 898, 899, 890, 900, + 901, 892, 894, 903, 896, 904, 905, 906, 908, 900, + 901, 910, 911, 903, 912, 904, 905, 906, 908, 913, + 915, 910, 911, 917, 919, 921, 923, 925, 926, 913, + 915, 937, 633, 917, 919, 921, 923, 925, 926, 929, + 929, 929, 929, 929, 929, 930, 930, 930, 930, 930, + 930, 931, 931, 931, 931, 931, 931, 932, 932, 932, + + 932, 932, 932, 933, 933, 933, 933, 933, 933, 934, + 934, 934, 934, 934, 934, 935, 935, 936, 632, 936, + 936, 936, 936, 938, 631, 630, 938, 938, 938, 939, + 939, 939, 629, 628, 625, 622, 621, 618, 617, 616, + 615, 614, 613, 612, 610, 609, 608, 605, 601, 599, + 598, 597, 596, 595, 594, 593, 592, 591, 589, 588, + 586, 584, 583, 582, 581, 580, 579, 577, 576, 575, + 574, 573, 572, 571, 570, 569, 566, 565, 561, 559, + 558, 556, 555, 554, 553, 552, 551, 550, 549, 548, + 547, 546, 544, 543, 542, 541, 540, 539, 538, 537, + + 536, 535, 534, 533, 532, 531, 530, 529, 528, 527, + 526, 525, 524, 523, 522, 521, 520, 519, 518, 517, + 516, 515, 514, 511, 506, 505, 504, 503, 502, 499, + 497, 496, 495, 494, 493, 492, 491, 490, 489, 488, + 487, 486, 485, 484, 483, 481, 480, 479, 478, 477, + 476, 474, 473, 472, 471, 470, 469, 468, 467, 466, + 465, 464, 463, 462, 461, 460, 457, 456, 455, 454, + 453, 452, 450, 447, 446, 445, 444, 443, 442, 441, + 440, 439, 438, 437, 436, 435, 434, 433, 432, 431, + 430, 429, 428, 427, 426, 425, 424, 423, 422, 421, + + 420, 419, 418, 417, 416, 415, 414, 413, 412, 410, + 409, 406, 405, 402, 401, 400, 399, 398, 394, 393, + 392, 391, 390, 389, 388, 387, 386, 385, 384, 383, + 382, 381, 380, 379, 378, 377, 376, 375, 374, 372, + 371, 370, 369, 368, 367, 366, 365, 364, 363, 362, + 361, 360, 359, 358, 357, 356, 355, 354, 353, 352, + 351, 350, 349, 348, 346, 345, 343, 342, 341, 340, + 339, 337, 336, 335, 334, 333, 332, 331, 330, 329, + 328, 327, 326, 325, 323, 322, 319, 318, 317, 316, + 315, 314, 313, 312, 311, 309, 308, 307, 304, 303, + + 302, 301, 300, 299, 298, 297, 296, 295, 294, 293, + 292, 291, 290, 289, 288, 287, 286, 285, 284, 283, + 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, + 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, + 262, 260, 259, 258, 257, 256, 255, 254, 253, 252, + 251, 250, 249, 247, 246, 245, 244, 242, 241, 240, + 239, 238, 236, 235, 234, 233, 232, 231, 230, 229, + 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, + 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, + 206, 205, 204, 203, 202, 201, 199, 198, 197, 196, + + 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, + 185, 184, 183, 182, 181, 180, 178, 177, 176, 175, + 173, 172, 171, 170, 169, 168, 166, 165, 164, 163, + 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, + 152, 151, 150, 149, 148, 147, 146, 145, 144, 143, + 142, 141, 140, 139, 138, 137, 136, 135, 134, 132, + 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, + 121, 120, 119, 118, 117, 116, 115, 112, 111, 108, + 103, 102, 100, 99, 98, 96, 94, 93, 92, 91, + 89, 88, 86, 85, 84, 83, 82, 81, 79, 78, + + 77, 75, 74, 73, 72, 71, 68, 65, 64, 62, + 58, 55, 52, 50, 43, 42, 41, 39, 38, 36, + 35, 34, 33, 30, 24, 21, 17, 928, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 928, 928, 928, 928, 928, 928, 928, 928, 928, + 928, 928 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "config.l" +#define INITIAL 0 +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +#line 18 "config.l" + +/* + * includes + */ +#include +#include +#include +#include + +#include +#include +#include + +#include "config.h" +#include "version.h" + +#ifdef DOXYWIZARD +#include +void err(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} +void warn(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} +#else +#include "doxygen.h" +#include "message.h" +#include "pre.h" +#include "version.h" +#include "language.h" +#endif + +#define YY_NEVER_INTERACTIVE 1 + +/* ----------------------------------------------------------------- + * + * exported variables + */ + + +QCString Config::projectName; +QCString Config::projectNumber; +QCString Config::outputDir; +QCString Config::htmlOutputDir; +QCString Config::latexOutputDir; +QCString Config::manOutputDir; +QCString Config::outputLanguage; +QCString Config::headerFile; +QCString Config::latexHeaderFile; +QCString Config::footerFile; +QCString Config::cgiName; +QCString Config::cgiURL; +QCString Config::docURL; +QCString Config::binAbsPath; +QCString Config::docAbsPath; +QCString Config::perlPath; +QCString Config::genTagFile; +QCString Config::inputFilter; +QCString Config::paperType; +QCString Config::manExtension; +QCString Config::htmlStyleSheet; +QStrList Config::includePath; +QStrList Config::examplePath; +QStrList Config::imagePath; +QStrList Config::inputSources; +QStrList Config::excludeSources; +QStrList Config::filePatternList; +QStrList Config::excludePatternList; +QStrList Config::examplePatternList; +QStrList Config::imagePatternList; +QStrList Config::tagFileList; +QStrList Config::extDocPathList; +QStrList Config::predefined; +QStrList Config::extraPackageList; +QStrList Config::stripFromPath; +bool Config::quietFlag = FALSE; +bool Config::recursiveFlag = FALSE; +bool Config::allExtFlag = FALSE; +bool Config::searchEngineFlag = FALSE; +bool Config::extractAllFlag = FALSE; +bool Config::extractPrivateFlag = FALSE; +bool Config::noIndexFlag = FALSE; +bool Config::hideMemberFlag = FALSE; +bool Config::hideClassFlag = FALSE; +bool Config::macroExpansionFlag = FALSE; +bool Config::onlyPredefinedFlag = FALSE; +bool Config::fullPathNameFlag = FALSE; +bool Config::compactLatexFlag = FALSE; +bool Config::internalDocsFlag = FALSE; +bool Config::caseSensitiveNames = FALSE; +bool Config::sourceBrowseFlag = FALSE; +bool Config::htmlHelpFlag = FALSE; +bool Config::alphaIndexFlag = FALSE; +bool Config::pdfHyperFlag = FALSE; +bool Config::alwaysDetailsFlag = FALSE; +bool Config::autoBriefFlag = TRUE; +bool Config::warningFlag = TRUE; +bool Config::generateHtml = TRUE; +bool Config::generateLatex = TRUE; +bool Config::generateMan = TRUE; +bool Config::preprocessingFlag = TRUE; +bool Config::briefMemDescFlag = TRUE; +bool Config::searchIncludeFlag = TRUE; +bool Config::classDiagramFlag = TRUE; +bool Config::repeatBriefFlag = TRUE; +bool Config::verbatimHeaderFlag = TRUE; +bool Config::htmlAlignMemberFlag = TRUE; +bool Config::inheritDocsFlag = TRUE; +bool Config::inlineInfoFlag = TRUE; +int Config::tabSize = 8; +int Config::colsInAlphaIndex = 5; + +/* ----------------------------------------------------------------- + * + * static variables + */ + +static const char * inputString; +static int inputPosition; +static int yyLineNr; +static QCString tmpString; +static QCString * s=0; +static bool * b=0; +static QStrList * l=0; +static int lastState; +static int lastEnvState; +static QCString elemStr; +static QCString tabSizeString; +static QCString colsInAlphaIndexString; + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +#define Start 1 + +#define SkipComment 2 + +#define GetString 3 + +#define GetBool 4 + +#define GetStrList 5 + +#define GetQuotedString 6 + +#define GetEnvVar 7 + + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 184 "config.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 929 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 1228 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 186 "config.l" + + YY_BREAK +case 2: +YY_RULE_SETUP +#line 187 "config.l" +{ BEGIN(SkipComment); } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 188 "config.l" +{ BEGIN(GetString); s=&Config::projectName; } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 189 "config.l" +{ BEGIN(GetString); s=&Config::projectNumber; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 190 "config.l" +{ BEGIN(GetString); s=&Config::outputDir; } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 191 "config.l" +{ BEGIN(GetString); s=&Config::htmlOutputDir; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 192 "config.l" +{ BEGIN(GetString); s=&Config::manOutputDir; } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 193 "config.l" +{ BEGIN(GetString); s=&Config::latexOutputDir; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 194 "config.l" +{ BEGIN(GetString); s=&Config::headerFile; } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 195 "config.l" +{ BEGIN(GetString); s=&Config::footerFile; } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 196 "config.l" +{ BEGIN(GetString); s=&Config::latexHeaderFile; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 197 "config.l" +{ BEGIN(GetString); s=&Config::cgiName; } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 198 "config.l" +{ BEGIN(GetString); s=&Config::cgiURL; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 199 "config.l" +{ BEGIN(GetString); s=&Config::docURL; } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 200 "config.l" +{ BEGIN(GetString); s=&Config::binAbsPath; } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 201 "config.l" +{ BEGIN(GetString); s=&Config::docAbsPath; } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 202 "config.l" +{ BEGIN(GetString); s=&Config::perlPath; } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 203 "config.l" +{ BEGIN(GetString); s=&Config::genTagFile; } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 204 "config.l" +{ BEGIN(GetString); s=&Config::inputFilter; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 205 "config.l" +{ BEGIN(GetString); s=&Config::paperType; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 206 "config.l" +{ BEGIN(GetString); s=&Config::outputLanguage; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 207 "config.l" +{ BEGIN(GetString); s=&Config::manExtension; } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 208 "config.l" +{ BEGIN(GetString); s=&tabSizeString; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 209 "config.l" +{ BEGIN(GetString); s=&Config::htmlStyleSheet; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 210 "config.l" +{ BEGIN(GetString); s=&colsInAlphaIndexString; } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 211 "config.l" +{ BEGIN(GetStrList); l=&Config::includePath; elemStr=""; } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 212 "config.l" +{ BEGIN(GetStrList); l=&Config::examplePath; elemStr=""; } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 213 "config.l" +{ BEGIN(GetStrList); l=&Config::imagePath; elemStr=""; } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 214 "config.l" +{ BEGIN(GetStrList); l=&Config::inputSources; elemStr=""; } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 215 "config.l" +{ BEGIN(GetStrList); l=&Config::excludeSources; elemStr=""; } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 216 "config.l" +{ BEGIN(GetStrList); l=&Config::filePatternList; elemStr=""; } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 217 "config.l" +{ BEGIN(GetStrList); l=&Config::excludePatternList; elemStr=""; } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 218 "config.l" +{ BEGIN(GetStrList); l=&Config::examplePatternList; elemStr=""; } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 219 "config.l" +{ BEGIN(GetStrList); l=&Config::imagePatternList; elemStr=""; } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 220 "config.l" +{ BEGIN(GetStrList); l=&Config::tagFileList; elemStr=""; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 221 "config.l" +{ BEGIN(GetStrList); l=&Config::extDocPathList; elemStr=""; } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 222 "config.l" +{ BEGIN(GetStrList); l=&Config::predefined; elemStr=""; } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 223 "config.l" +{ BEGIN(GetStrList); l=&Config::extraPackageList; elemStr=""; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 224 "config.l" +{ BEGIN(GetStrList); l=&Config::stripFromPath; elemStr=""; } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 225 "config.l" +{ BEGIN(GetBool); b=&Config::quietFlag; } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 226 "config.l" +{ BEGIN(GetBool); b=&Config::warningFlag; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 227 "config.l" +{ BEGIN(GetBool); b=&Config::recursiveFlag; } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 228 "config.l" +{ BEGIN(GetBool); b=&Config::allExtFlag; } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 229 "config.l" +{ BEGIN(GetBool); b=&Config::searchEngineFlag; } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 230 "config.l" +{ BEGIN(GetBool); b=&Config::extractAllFlag; } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 231 "config.l" +{ BEGIN(GetBool); b=&Config::extractPrivateFlag; } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 232 "config.l" +{ BEGIN(GetBool); b=&Config::noIndexFlag; } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 233 "config.l" +{ BEGIN(GetBool); b=&Config::generateLatex; } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 234 "config.l" +{ BEGIN(GetBool); b=&Config::generateHtml; } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 235 "config.l" +{ BEGIN(GetBool); b=&Config::generateMan; } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 236 "config.l" +{ BEGIN(GetBool); b=&Config::preprocessingFlag; } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 237 "config.l" +{ BEGIN(GetBool); b=&Config::macroExpansionFlag; } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 238 "config.l" +{ BEGIN(GetBool); b=&Config::searchIncludeFlag; } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 239 "config.l" +{ BEGIN(GetBool); b=&Config::briefMemDescFlag; } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 240 "config.l" +{ BEGIN(GetBool); b=&Config::alwaysDetailsFlag; } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 241 "config.l" +{ BEGIN(GetBool); b=&Config::hideMemberFlag; } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 242 "config.l" +{ BEGIN(GetBool); b=&Config::hideClassFlag; } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 243 "config.l" +{ BEGIN(GetBool); b=&Config::onlyPredefinedFlag; } + YY_BREAK +case 59: +YY_RULE_SETUP +#line 244 "config.l" +{ BEGIN(GetBool); b=&Config::fullPathNameFlag; } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 245 "config.l" +{ BEGIN(GetBool); b=&Config::classDiagramFlag; } + YY_BREAK +case 61: +YY_RULE_SETUP +#line 246 "config.l" +{ BEGIN(GetBool); b=&Config::compactLatexFlag; } + YY_BREAK +case 62: +YY_RULE_SETUP +#line 247 "config.l" +{ BEGIN(GetBool); b=&Config::repeatBriefFlag; } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 248 "config.l" +{ BEGIN(GetBool); b=&Config::internalDocsFlag; } + YY_BREAK +case 64: +YY_RULE_SETUP +#line 249 "config.l" +{ BEGIN(GetBool); b=&Config::caseSensitiveNames; } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 250 "config.l" +{ BEGIN(GetBool); b=&Config::verbatimHeaderFlag; } + YY_BREAK +case 66: +YY_RULE_SETUP +#line 251 "config.l" +{ BEGIN(GetBool); b=&Config::htmlAlignMemberFlag; } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 252 "config.l" +{ BEGIN(GetBool); b=&Config::sourceBrowseFlag; } + YY_BREAK +case 68: +YY_RULE_SETUP +#line 253 "config.l" +{ BEGIN(GetBool); b=&Config::autoBriefFlag; } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 254 "config.l" +{ BEGIN(GetBool); b=&Config::htmlHelpFlag; } + YY_BREAK +case 70: +YY_RULE_SETUP +#line 255 "config.l" +{ BEGIN(GetBool); b=&Config::alphaIndexFlag; } + YY_BREAK +case 71: +YY_RULE_SETUP +#line 256 "config.l" +{ BEGIN(GetBool); b=&Config::pdfHyperFlag; } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 257 "config.l" +{ BEGIN(GetBool); b=&Config::inheritDocsFlag; } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 258 "config.l" +{ BEGIN(GetBool); b=&Config::inlineInfoFlag; } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 259 "config.l" +{ err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 260 "config.l" +{ yyLineNr++; BEGIN(Start); } + YY_BREAK +case 76: +YY_RULE_SETUP +#line 261 "config.l" +{ + yyLineNr++; + if (elemStr.length()>0) + { + //printf("elemStr1=`%s'\n",elemStr.data()); + l->append(elemStr); + } + BEGIN(Start); + } + YY_BREAK +case 77: +YY_RULE_SETUP +#line 270 "config.l" +{ + if (elemStr.length()>0) + { + //printf("elemStr2=`%s'\n",elemStr.data()); + l->append(elemStr); + } + elemStr.resize(0); + } + YY_BREAK +case 78: +YY_RULE_SETUP +#line 278 "config.l" +{ (*s)+=yytext; } + YY_BREAK +case 79: +YY_RULE_SETUP +#line 279 "config.l" +{ lastState=YY_START; + BEGIN(GetQuotedString); + tmpString.resize(0); + } + YY_BREAK +case 80: +YY_RULE_SETUP +#line 283 "config.l" +{ + //printf(">> Enter env\n"); + lastEnvState=YY_START; + BEGIN(GetEnvVar); + } + YY_BREAK +case 81: +YY_RULE_SETUP +#line 288 "config.l" +{ + yytext[yyleng-1]='\0'; + const char *env=getenv(yytext); + int i; + int l=strlen(env); + //printf("env name=`%s' text=`%s'\n",yytext,env); + for (i=l-1;i>=0;i--) unput(env[i]); + BEGIN(lastEnvState); + } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 297 "config.l" +{ + //printf("Quoted String = `%s'\n",tmpString.data()); + if (lastState==GetString) + (*s)+=tmpString; + else + elemStr+=tmpString; + if (*yytext=='\n') + { + err("Warning: Missing end quote (\") on line %d\n",yyLineNr); + yyLineNr++; + } + BEGIN(lastState); + } + YY_BREAK +case 83: +YY_RULE_SETUP +#line 310 "config.l" +{ + tmpString+='"'; + } + YY_BREAK +case 84: +YY_RULE_SETUP +#line 313 "config.l" +{ tmpString+=*yytext; } + YY_BREAK +case 85: +YY_RULE_SETUP +#line 314 "config.l" +{ + QCString bs=yytext; + bs=bs.upper(); + if (bs=="YES") + *b=TRUE; + else if (bs=="NO") + *b=FALSE; + else + { + *b=FALSE; + warn("Warning: Invalid value `%s' for " + "boolean tag in line %d; use YES or NO\n", + bs.data(),yyLineNr); + } + } + YY_BREAK +case 86: +YY_RULE_SETUP +#line 329 "config.l" +{ + elemStr+=yytext; + } + YY_BREAK +case 87: +YY_RULE_SETUP +#line 332 "config.l" +{ yyLineNr++; BEGIN(Start); } + YY_BREAK +case 88: +YY_RULE_SETUP +#line 333 "config.l" +{ yyLineNr++; BEGIN(Start); } + YY_BREAK +case 89: +YY_RULE_SETUP +#line 334 "config.l" +{ yyLineNr++; } + YY_BREAK +case 90: +YY_RULE_SETUP +#line 335 "config.l" + + YY_BREAK +case 91: +YY_RULE_SETUP +#line 336 "config.l" +{ yyLineNr++ ; } + YY_BREAK +case 92: +YY_RULE_SETUP +#line 338 "config.l" +ECHO; + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(Start): +case YY_STATE_EOF(SkipComment): +case YY_STATE_EOF(GetString): +case YY_STATE_EOF(GetBool): +case YY_STATE_EOF(GetStrList): +case YY_STATE_EOF(GetQuotedString): +case YY_STATE_EOF(GetEnvVar): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 44); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 929 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 44; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 929 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 928); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 338 "config.l" + + +/*@ ---------------------------------------------------------------------------- + */ + + +void dumpConfig() +{ + printf("projectName=`%s'\n",Config::projectName.data()); + printf("outputDir=`%s'\n", Config::outputDir.data()); + printf("headerFile=`%s'\n", Config::headerFile.data()); + printf("footerFile=`%s'\n", Config::footerFile.data()); + char *ip=Config::includePath.first(); + while (ip) + { + printf("includePath=`%s'\n",ip); + ip=Config::includePath.next(); + } + printf("quiet=`%d'\n", Config::quietFlag); + printf("warnings=`%d'\n", Config::warningFlag); + char *is=Config::inputSources.first(); + while (is) + { + printf("inputSources=`%s'\n",is); + is=Config::inputSources.next(); + } + char *fp=Config::filePatternList.first(); + while (fp) + { + printf("filePattern=`%s'\n",fp); + fp=Config::filePatternList.next(); + } + printf("recusive=`%d'\n",Config::recursiveFlag); + printf("inputFilter=`%s'\n",Config::inputFilter.data()); + char *tf=Config::tagFileList.first(); + while (tf) + { + printf("tagFile=`%s'\n",tf); + tf=Config::tagFileList.next(); + } + printf("allExternals=`%d'\n",Config::allExtFlag); + printf("searchEngine=`%d'\n",Config::searchEngineFlag); + printf("cgiName=`%s'\n",Config::cgiName.data()); + printf("cgiURL=`%s'\n",Config::cgiURL.data()); + printf("docURL=`%s'\n",Config::docURL.data()); + printf("binAbsPath=`%s'\n",Config::binAbsPath.data()); + char *ed=Config::extDocPathList.first(); + while (ed) + { + printf("binAbsPathFile=`%s'\n",ed); + ed=Config::extDocPathList.next(); + } +} + +void Config::init() +{ + Config::projectName.resize(0); + Config::projectNumber.resize(0); + Config::outputDir.resize(0); + Config::htmlOutputDir = "html"; + Config::latexOutputDir ="latex"; + Config::manOutputDir ="man"; + Config::outputLanguage = "English"; + Config::headerFile.resize(0); + Config::latexHeaderFile.resize(0); + Config::footerFile.resize(0); + Config::cgiName = "search.cgi"; + Config::cgiURL.resize(0); + Config::docURL.resize(0); + Config::binAbsPath = "/usr/local/bin/"; + Config::docAbsPath.resize(0); + Config::perlPath = "/usr/bin/perl"; + Config::genTagFile.resize(0); + Config::inputFilter.resize(0); + Config::paperType = "a4wide"; + Config::manExtension = ".3"; + Config::htmlStyleSheet.resize(0); + Config::includePath.clear(); + Config::examplePath.clear(); + Config::imagePath.clear(); + Config::inputSources.clear(); + Config::excludeSources.clear(); + Config::filePatternList.clear(); + Config::examplePatternList.clear(); + Config::imagePatternList.clear(); + Config::excludePatternList.clear(); + Config::tagFileList.clear(); + Config::extDocPathList.clear(); + Config::predefined.clear(); + Config::extraPackageList.clear(); + Config::stripFromPath.clear(); + Config::tabSize=8; + Config::colsInAlphaIndex=5; + Config::quietFlag = FALSE; + Config::recursiveFlag = FALSE; + Config::allExtFlag = FALSE; + Config::searchEngineFlag = FALSE; + Config::extractAllFlag = FALSE; + Config::extractPrivateFlag = FALSE; + Config::noIndexFlag = FALSE; + Config::hideMemberFlag = FALSE; + Config::hideClassFlag = FALSE; + Config::macroExpansionFlag = FALSE; + Config::onlyPredefinedFlag = FALSE; + Config::fullPathNameFlag = FALSE; + Config::compactLatexFlag = FALSE; + Config::internalDocsFlag = FALSE; + Config::caseSensitiveNames = FALSE; + Config::sourceBrowseFlag = FALSE; + Config::htmlHelpFlag = FALSE; + Config::alphaIndexFlag = FALSE; + Config::pdfHyperFlag = FALSE; + Config::alwaysDetailsFlag = FALSE; + Config::warningFlag = TRUE; + Config::generateHtml = TRUE; + Config::generateLatex = TRUE; + Config::generateMan = TRUE; + Config::preprocessingFlag = TRUE; + Config::briefMemDescFlag = TRUE; + Config::searchIncludeFlag = TRUE; + Config::classDiagramFlag = TRUE; + Config::repeatBriefFlag = TRUE; + Config::verbatimHeaderFlag = TRUE; + Config::htmlAlignMemberFlag = TRUE; + Config::autoBriefFlag = TRUE; + Config::inheritDocsFlag = TRUE; + Config::inlineInfoFlag = TRUE; +} + +void writeTemplateConfig(QFile *f,bool sl) +{ + QTextStream t(f); +#ifdef DOXYWIZARD + t << "# Doxygen configuration generated by Doxywizard version " << versionString << endl; +#else + t << "# Doxyfile " << versionString << endl << endl; +#endif + if (!sl) + { + t << "# This file describes the settings to be used by doxygen for a project\n"; + t << "#\n"; + t << "# All text after a hash (#) is considered a comment and will be ignored\n"; + t << "# The format is:\n"; + t << "# TAG = value [value, ...]\n"; + t << "# Values that contain spaces should be placed between quotes (\" \")\n"; + t << "\n"; + } + t << "#---------------------------------------------------------------------------\n"; + t << "# General configuration options\n"; + t << "#---------------------------------------------------------------------------\n"; + if (!sl) + { + t << "\n"; + t << "# The PROJECT_NAME tag is a single word (or a sequence of word surrounded\n"; + t << "# by quotes) that should identify the project. \n"; + t << "\n"; + } + t << "PROJECT_NAME =\n"; + if (!sl) + { + t << "\n"; + t << "# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n" ; + t << "# This could be handy for archiving the generated documentation or \n"; + t << "# if some version control system is used.\n"; + t << "\n"; + } + t << "PROJECT_NUMBER =\n"; + if (!sl) + { + t << "\n"; + t << "# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n"; + t << "# base path where the generated documentation will be put. \n"; + t << "# If a relative path is entered, it will be relative to the location \n"; + t << "# where doxygen was started. If left blank the current directory will be used.\n"; + t << "\n"; + } + t << "OUTPUT_DIRECTORY =\n"; + if (!sl) + { + t << "\n"; + t << "# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n"; + t << "# documentation generated by doxygen is written. Doxygen will use this\n"; + t << "# information to generate all constant output in the proper language.\n"; + t << "# The default language is English, other supported languages are: \n"; + t << "# Dutch, French, Italian, Czech, Swedish, German and Japanese\n"; + t << "\n"; + } + t << "OUTPUT_LANGUAGE = English\n"; + if (!sl) + { + t << "\n"; + t << "# The QUIET tag can be used to turn on/off the messages that are generated\n"; + t << "# by doxygen. Possible values are YES and NO. If left blank NO is used.\n"; + t << "\n"; + } + t << "QUIET = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The WARNINGS tag can be used to turn on/off the warning messages that are\n"; + t << "# generated by doxygen. Possible values are YES and NO. If left blank\n"; + t << "# NO is used.\n"; + t << "\n"; + } + t << "WARNINGS = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The DISABLE_INDEX tag can be used to turn on/off the condensed index at\n"; + t << "# top of each HTML page. The value NO (the default) enables the index and\n"; + t << "# the value YES disables it.\n"; + t << "\n"; + } + t << "DISABLE_INDEX = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the EXTRACT_ALL tag is set to YES all classes and functions will be\n"; + t << "# included in the documentation, even if no documentation was available.\n"; + t << "\n"; + } + t << "EXTRACT_ALL = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n"; + t << "# will be included in the documentation.\n"; + t << "\n"; + } + t << "EXTRACT_PRIVATE = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n"; + t << "# undocumented members inside documented classes or files.\n"; + t << "\n"; + } + t << "HIDE_UNDOC_MEMBERS = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the HIDE_UNDOC_CLASSESS tag is set to YES, Doxygen will hide all\n"; + t << "# undocumented classes.\n"; + t << "\n"; + } + t << "HIDE_UNDOC_CLASSES = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n"; + t << "# include brief member descriptions after the members that are listed in \n"; + t << "# the file and class documentation (similar to JavaDoc).\n"; + t << "# Set to NO to disable this.\n"; + t << "\n"; + } + t << "BRIEF_MEMBER_DESC = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n"; + t << "# the brief description of a member or function before the detailed description.\n"; + t << "# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n"; + t << "# brief descriptions will be completely suppressed.\n"; + t << "\n"; + } + t << "REPEAT_BRIEF = YES\n"; + if (!sl) + { + t <<"\n"; + t << "# If the ALWAYS_DETAILS_SEC and REPEAT_BRIEF tags are both set to YES then\n"; + t << "# Doxygen will generate a detailed section even if there is only a brief\n"; + t << "# description.\n"; + t <<"\n"; + } + t << "ALWAYS_DETAILED_SEC = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n"; + t << "# path before files name in the file list and in the header files. If set\n" ; + t << "# to NO the shortest path that makes the file name unique will be used.\n"; + t << "\n"; + } + t << "FULL_PATH_NAMES = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n"; + t << "# can be used to strip a user defined part of the path. Stripping is\n" ; + t << "# only done if one of the specified strings matches the left-hand part of\n"; + t << "# the path.\n"; + t << "\n"; + } + t << "STRIP_FROM_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# The INTERNAL_DOCS tag determines if documentation\n"; + t << "# that is typed after a \\internal command is included. If the tag is set \n"; + t << "# to NO (the default) then the documentation will be excluded.\n"; + t << "# Set it to YES to include the internal documentation.\n"; + t << "\n"; + } + t << "INTERNAL_DOCS = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n"; + t << "# generate a class diagram (in Html and LaTeX) for classes with base or\n"; + t << "# super classes. Setting the tag to NO turns the diagrams off.\n"; + t << "\n"; + } + t << "CLASS_DIAGRAMS = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the SOURCE_BROWSER tag is set to YES than the body of a member or\n"; + t << "# function will be appended as a block of code to the documentation of.\n"; + t << "# that member or function.\n"; + t << "\n"; + } + t << "SOURCE_BROWSER = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the CASE_SENSE_NAMES tag is set to NO (the default) then Doxygen\n"; + t << "# will only generate file names in lower case letters. If set to\n"; + t << "# YES upper case letters are also allowed. This is useful if you have\n"; + t << "# classes or files whose names only differ in case and if your file system\n"; + t << "# supports case sensitive file names.\n"; + t << "\n"; + } + t << "CASE_SENSE_NAMES = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n"; + t << "# will generate a verbatim copy of the header file for each class for\n"; + t << "# which an include is specified. Set to NO to disable this.\n"; + t << "\n"; + } + t << "VERBATIM_HEADERS = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen\n"; + t << "# will interpret the first line (until the first dot) of a JavaDoc-style\n"; + t << "# comment as the brief description. If set to NO, the Javadoc-style will\n"; + t << "# behave just like the Qt-style comments.\n"; + t << "\n"; + } + t << "JAVADOC_AUTOBRIEF = YES\n"; + if (!sl) + { + t << "\n"; + t << "# if the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n"; + t << "# member inherits the documentation from any documented member that it\n"; + t << "# reimplements.\n"; + t << "\n"; + } + t << "INHERIT_DOCS = YES\n"; + if (!sl) + { + t << "\n"; + t << "# if the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n"; + t << "# is inserted in the documentation for inline members.\n"; + t << "\n"; + } + t << "INLINE_INFO = YES\n"; + if (!sl) + { + t << "\n"; + t << "# the TAB_SIZE tag can be used to set the number of spaces in a tab\n"; + t << "# Doxygen uses this value to replace tabs by spaces in code fragments.\n"; + t << "\n"; + } + t << "TAB_SIZE = 8\n"; + if (!sl) + { + t << "\n"; + } + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the input files\n"; + t << "#---------------------------------------------------------------------------\n"; + if (!sl) + { + t << "\n"; + t << "# The INPUT tag can be used to specify the files and/or directories that contain \n"; + t << "# documented source files. You may enter file names like \"myfile.cpp\" or \n"; + t << "# directories like \"/usr/src/myproject\". Separate the files or directories \n"; + t << "# with spaces.\n"; + t << "\n"; + } + t << "INPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# If the value of the INPUT tag contains directories, you can use the \n"; + t << "# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"; + t << "# and *.h) to filter out the source-files in the directories. If left \n"; + t << "# blank all files are included.\n"; + t << "\n"; + } + t << "FILE_PATTERNS =\n"; + if (!sl) + { + t << "\n"; + t << "# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n"; + t << "# should be searched for input files as well. Possible values are YES and NO.\n"; + t << "# If left blank NO is used.\n"; + t << "\n"; + } + t << "RECURSIVE = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The EXCLUDE tag can be used to specify files and/or directories that should\n"; + t << "# excluded from the INPUT source files. This way you can easily exclude a \n"; + t << "# subdirectory from a directory tree whose root is specified with the INPUT tag.\n"; + t << "\n"; + } + t << "EXCLUDE =\n"; + if (!sl) + { + t << "\n"; + t << "# If the value of the INPUT tag contains directories, you can use the\n"; + t << "# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n"; + t << "# certain files from those directories.\n"; + t << "\n"; + } + t << "EXCLUDE_PATTERNS =\n"; + if (!sl) + { + t << "\n"; + t << "# The EXAMPLE_PATH tag can be used to specify one or more files or \n"; + t << "# directories that contain example code fragments that are included (see \n"; + t << "# the \\include command).\n"; + t << "\n"; + } + t << "EXAMPLE_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n"; + t << "# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"; + t << "# and *.h) to filter out the source-files in the directories. If left \n"; + t << "# blank all files are included.\n"; + t << "\n"; + } + t << "EXAMPLE_PATTERNS =\n"; + + if (!sl) + { + t << "\n"; + t << "# The IMAGE_PATH tag can be used to specify one or more files or \n"; + t << "# directories that contain image that are included in the documentation (see \n"; + t << "# the \\image command).\n"; + t << "\n"; + } + t << "IMAGE_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# If the value of the IMAGE_PATH tag contains directories, you can use the\n"; + t << "# IMAGE_PATTERNS tag to specify one or more wildcard pattern (like *.gif \n"; + t << "# and *.eps) to filter out the image files in the directories. If left \n"; + t << "# blank all files are included.\n"; + t << "\n"; + } + t << "IMAGE_PATTERNS =\n"; + if (!sl) + { + t << "\n"; + t << "# The INPUT_FILTER tag can be used to specify a program that doxygen should\n"; + t << "# invoke to filter for each input file. Doxygen will invoke the filter program \n"; + t << "# by executing (via popen()) the command , where \n"; + t << "# is the value of the INPUT_FILTER tag, and is the name of an\n"; + t << "# input file. Doxygen will then use the output that the filter program writes\n"; + t << "# to standard output.\n"; + t << "\n"; + } + t << "INPUT_FILTER =\n"; + if (!sl) + { + t << "\n"; + } + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the HTML output\n"; + t << "#---------------------------------------------------------------------------\n"; + if (!sl) + { + t << "\n"; + t << "# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n"; + t << "# generate HTML output\n"; + t << "\n"; + } + t << "GENERATE_HTML = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n"; + t << "# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"; + t << "# put in front of it. If left blank `html' will be used as the default path.\n"; + t << "\n"; + } + t << "HTML_OUTPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_HEADER tag can be used to specify a personal HTML header for \n"; + t << "# each generated HTML page. If it is left blank doxygen will generate a \n"; + t << "# standard header.\n"; + t << "\n"; + } + t << "HTML_HEADER =\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_FOOTER tag can be used to specify a personal HTML footer for \n"; + t << "# each generated HTML page. If it is left blank doxygen will generate a \n"; + t << "# standard footer.\n"; + t << "\n"; + } + t << "HTML_FOOTER =\n"; + if (!sl) + { + t << "\n"; + t << "# The HTML_STYLESHEET tag can be used to specify a user defined cascading\n"; + t << "# style sheet that is used by each HTML page. It can be used to \n"; + t << "# fine-tune the look of the HTML output. If the tag is left blank doxygen\n"; + t << "# will generate a default style sheet\n"; + t << "\n"; + } + t << "HTML_STYLESHEET =\n"; + if (!sl) + { + t << "\n"; + t << "# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,\n"; + t << "# files or namespaces will be aligned in HTML using tables. If set to\n"; + t << "# NO a bullet list will be used.\n"; + t << "\n"; + } + t << "HTML_ALIGN_MEMBERS = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n"; + t << "# will be generated that can be used as input for tools like the\n"; + t << "# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)\n"; + t << "# of the generated HTML documentation.\n"; + t << "\n"; + } + t << "GENERATE_HTMLHELP = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n"; + t << "# of all compounds will be generated. Enable this if the project\n"; + t << "# contains a lot of classes, structs, unions or interfaces.\n"; + t << "\n"; + } + t << "ALPHABETICAL_INDEX = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n"; + t << "# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n"; + t << "# in which this list will be split (can be a number in the range [1..20])\n"; + t << "\n"; + } + t << "COLS_IN_ALPHA_INDEX = 5\n"; + if (!sl) + { + t << "\n"; + } + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the LaTeX output\n"; + t << "#---------------------------------------------------------------------------\n"; + if (!sl) + { + t << "\n"; + t << "# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n"; + t << "# generate Latex output.\n"; + t << "\n"; + } + t << "GENERATE_LATEX = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n"; + t << "# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"; + t << "# put in front of it. If left blank `latex' will be used as the default path.\n"; + t << "\n"; + } + t << "LATEX_OUTPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n"; + t << "# LaTeX documents. This may be useful for small projects and may help to\n"; + t << "# save some trees in general.\n"; + t << "\n"; + } + t << "COMPACT_LATEX = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The PAPER_TYPE tag can be used to set the paper type that is used\n"; + t << "# by the printer. Possible values are: a4, a4wide, letter, legal and \n"; + t << "# executive. If left blank a4wide will be used.\n"; + t << "\n"; + } + t << "PAPER_TYPE = a4wide\n"; + if (!sl) + { + t << "\n"; + t << "# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n"; + t << "# packages that should be included in the LaTeX output.\n"; + t << "\n"; + } + t << "EXTRA_PACKAGES =\n"; + if (!sl) + { + t << "\n"; + t << "# The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n"; + t << "# the generated latex document. The header should contain everything until\n"; + t << "# the first chapter. If it is left blank doxygen will generate a \n"; + t << "# standard header. Notice: only use this tag if you know what you are doing!\n"; + t << "\n"; + } + t << "LATEX_HEADER =\n"; + if (!sl) + { + t << "\n"; + t << "# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n"; + t << "# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n"; + t << "# contain links (just like the HTML output) instead of page references\n"; + t << "# This makes the output suitable for online browsing using a pdf viewer.\n"; + t << "\n"; + } + t << "PDF_HYPERLINKS = NO\n"; + if (!sl) + { + t << "\n"; + } + t << "#---------------------------------------------------------------------------\n"; + t << "# configuration options related to the man page output\n"; + t << "#---------------------------------------------------------------------------\n"; + if (!sl) + { + t << "\n"; + t << "# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n"; + t << "# generate man pages\n"; + t << "\n"; + } + t << "GENERATE_MAN = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n"; + t << "# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n"; + t << "# put in front of it. If left blank `man' will be used as the default path.\n"; + t << "\n"; + } + t << "MAN_OUTPUT =\n"; + if (!sl) + { + t << "\n"; + t << "# The MAN_EXTENSION tag determines the extension that is added to\n"; + t << "# the generated man pages (default is the subroutine's section .3)\n"; + t << "\n"; + } + t << "MAN_EXTENSION = .3\n"; + + if (!sl) + { + t << "\n"; + } + t << "#---------------------------------------------------------------------------\n"; + t << "# Configuration options related to the preprocessor \n"; + t << "#---------------------------------------------------------------------------\n"; + if (!sl) + { + t << "\n"; + t << "# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n"; + t << "# evaluate all C-preprocessor directives found in the sources and include\n"; + t << "# files.\n"; + t << "\n"; + } + t << "ENABLE_PREPROCESSING = YES\n"; + if (!sl) + { + t << "\n"; + t << "# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n"; + t << "# names in the source code. If set to NO (the default) only conditional \n"; + t << "# compilation will be performed.\n"; + t << "\n"; + } + t << "MACRO_EXPANSION = NO\n"; + if (!sl) + { + t << "\n"; + t << "# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n"; + t << "# in the INCLUDE_PATH (see below) will be search if a #include is found.\n"; + t << "\n"; + } + t << "SEARCH_INCLUDES = YES\n"; + if (!sl) + { + t << "\n"; + t << "# The INCLUDE_PATH tag can be used to specify one or more directories that\n"; + t << "# contain include files that are not input files but should be processed by\n"; + t << "# the preprocessor.\n" ; + t << "\n"; + } + t << "INCLUDE_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# The PREDEFINED tag can be used to specify one or more macro names that\n"; + t << "# are defined before the preprocessor is started (similar to the -D option of\n"; + t << "# gcc). The argument of the tag is a list of macros of the form: name\n"; + t << "# or name=definition (no spaces). If the definition and the = are \n"; + t << "# omitted =1 is assumed.\n"; + t << "\n"; + } + t << "PREDEFINED =\n"; + if (!sl) + { + t << "\n"; + t << "# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n"; + t << "# then the macro expansion is limited to the macros specified with the\n"; + t << "# PREDEFINED tag.\n"; + t << "\n"; + } + t << "EXPAND_ONLY_PREDEF = NO\n"; + if (!sl) + { + t << "\n"; + } + t << "#---------------------------------------------------------------------------\n"; + t << "# Configuration options related to external references \n"; + t << "#---------------------------------------------------------------------------\n"; + if (!sl) + { + t << "\n"; + t << "# The TAGFILES tag can be used to specify one or more tagfiles. \n"; + t << "\n"; + } + t << "TAGFILES =\n"; + if (!sl) + { + t << "\n"; + t << "# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n"; + t << "# a tag file that is based on the input files it reads.\n"; + t << "\n"; + } + t << "GENERATE_TAGFILE =\n"; + if (!sl) + { + t << "\n"; + t << "# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n"; + t << "# in the class index. If set to NO only the inherited external classes\n"; + t << "# will be listed.\n"; + t << "\n"; + } + t << "ALLEXTERNALS = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The PERL_PATH should be the absolute path and name of the perl script\n"; + t << "# interpreter (i.e. the result of `which perl').\n"; + t << "\n"; + } + t << "PERL_PATH = /usr/bin/perl\n"; + if (!sl) + { + t << "\n"; + } + t << "#---------------------------------------------------------------------------\n"; + t << "# Configuration options related to the search engine \n"; + t << "#---------------------------------------------------------------------------\n"; + if (!sl) + { + t << "\n"; + t << "# The SEARCHENGINE tag specifies whether or not a search engine should be \n"; + t << "# used. If set to NO the values of all tags below this one will be ignored.\n"; + t << "\n"; + } + t << "SEARCHENGINE = NO\n"; + if (!sl) + { + t << "\n"; + t << "# The CGI_NAME tag should be the name of the CGI script that\n"; + t << "# starts the search engine (doxysearch) with the correct parameters.\n"; + t << "# A script with this name will be generated by doxygen.\n"; + t << "\n"; + } + t << "CGI_NAME = search.cgi\n"; + if (!sl) + { + t << "\n"; + t << "# The CGI_URL tag should be the absolute URL to the directory where the\n"; + t << "# cgi binaries are located. See the documentation of your http daemon for \n"; + t << "# details.\n"; + t << "\n"; + } + t << "CGI_URL =\n"; + if (!sl) + { + t << "\n"; + t << "# The DOC_URL tag should be the absolute URL to the directory where the\n"; + t << "# documentation is located. If left blank the absolute path to the \n"; + t << "# documentation, with file:// prepended to it, will be used.\n"; + t << "\n"; + } + t << "DOC_URL =\n"; + if (!sl) + { + t << "\n"; + t << "# The DOC_ABSPATH tag should be the absolute path to the directory where the\n"; + t << "# documentation is located. If left blank the directory on the local machine\n"; + t << "# will be used.\n"; + t << "\n"; + } + t << "DOC_ABSPATH =\n"; + if (!sl) + { + t << "\n"; + t << "# The BIN_ABSPATH tag must point to the directory where the doxysearch binary\n"; + t << "# is installed.\n"; + t << "\n"; + } + t << "BIN_ABSPATH = /usr/local/bin/\n"; + if (!sl) + { + t << "\n"; + t << "# The EXT_DOC_PATHS tag can be used to specify one or more paths to \n"; + t << "# documentation generated for other projects. This allows doxysearch to search\n"; + t << "# the documentation for these projects as well.\n"; + t << "\n"; + } + t << "EXT_DOC_PATHS =\n"; +} + +void checkConfig() +{ + //if (projectName.length()>0) + //{ + // projectName[0]=toupper(projectName[0]); + //} + + if (tabSizeString.isEmpty()) + { + Config::tabSize=8; + } + else + { + bool ok; + int ts = tabSizeString.toInt(&ok); + if (!ok || ts<1 || ts>16) + { + warn("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n"); + ts=8; + } + Config::tabSize = ts; + } + + if (colsInAlphaIndexString.isEmpty()) + { + Config::colsInAlphaIndex=5; + } + else + { + bool ok; + int cols = colsInAlphaIndexString.toInt(&ok); + if (!ok || cols<1 || cols>20) + { + warn("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n" + "Using the default of 5 columns!\n"); + cols = 5; + } + Config::colsInAlphaIndex=cols; + } + + // set default man page extension if non is given by the user + if (Config::manExtension.isEmpty()) + { + Config::manExtension=".3"; + } + + Config::paperType = Config::paperType.lower().stripWhiteSpace(); + if (Config::paperType.isEmpty()) + { + Config::paperType = "a4wide"; + } + if (Config::paperType!="a4" && Config::paperType!="a4wide" && Config::paperType!="letter" && + Config::paperType!="legal" && Config::paperType!="executive") + { + err("Error: Unknown page type specified"); + } + + Config::outputLanguage=Config::outputLanguage.stripWhiteSpace(); + if (Config::outputLanguage.isEmpty()) + { + Config::outputLanguage = "English"; +#ifndef DOXYWIZARD + setTranslator("English"); +#endif + } + else + { +#ifndef DOXYWIZARD + if (!setTranslator(Config::outputLanguage)) + { + err("Error: Output language %s not supported! Using English instead.\n", + Config::outputLanguage.data()); + } +#endif + } + + // Test to see if output directory is valid + if (Config::outputDir.isEmpty()) + Config::outputDir=QDir::currentDirPath(); + else + { + QDir dir(Config::outputDir); + if (!dir.exists()) + { + dir.setPath(QDir::currentDirPath()); + if (!dir.mkdir(Config::outputDir)) + { + err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not " + "exist and cannot be created\n",Config::outputDir.data()); + exit(1); + } + else if (!Config::quietFlag) + { + err("Notice: Output directory `%s' does not exist. " + "I have created it for you.\n", Config::outputDir.data()); + } + dir.cd(Config::outputDir); + } + Config::outputDir=dir.absPath(); + } + + if (Config::htmlOutputDir.isEmpty() && Config::generateHtml) + { + Config::htmlOutputDir=Config::outputDir+"/html"; + } + else if (Config::htmlOutputDir && Config::htmlOutputDir[0]!='/') + { + Config::htmlOutputDir.prepend(Config::outputDir+'/'); + } + QDir htmlDir(Config::htmlOutputDir); + if (!htmlDir.exists() && !htmlDir.mkdir(Config::htmlOutputDir)) + { + err("Could not create output directory %s\n",Config::htmlOutputDir.data()); + exit(1); + } + + if (Config::latexOutputDir.isEmpty() && Config::generateLatex) + { + Config::latexOutputDir=Config::outputDir+"/latex"; + } + else if (Config::latexOutputDir && Config::latexOutputDir[0]!='/') + { + Config::latexOutputDir.prepend(Config::outputDir+'/'); + } + QDir latexDir(Config::latexOutputDir); + if (!latexDir.exists() && !latexDir.mkdir(Config::latexOutputDir)) + { + err("Could not create output directory %s\n",Config::latexOutputDir.data()); + exit(1); + } + + if (Config::manOutputDir.isEmpty() && Config::generateMan) + { + Config::manOutputDir=Config::outputDir+"/man"; + } + else if (Config::manOutputDir && Config::manOutputDir[0]!='/') + { + Config::manOutputDir.prepend(Config::outputDir+'/'); + } + QDir manDir(Config::manOutputDir); + if (!manDir.exists() && !manDir.mkdir(Config::manOutputDir)) + { + err("Could not create output directory %s\n",Config::manOutputDir.data()); + exit(1); + } + + // Test to see if HTML header is valid + if (Config::headerFile.length()>0) + { + QFileInfo fi(Config::headerFile); + if (!fi.exists()) + { + err("Error: tag HTML_HEADER: header file `%s' " + "does not exist\n",Config::headerFile.data()); + exit(1); + } + } + // Test to see if HTML footer is valid + if (Config::footerFile.length()>0) + { + QFileInfo fi(Config::footerFile); + if (!fi.exists()) + { + err("Error: tag HTML_FOOTER: footer file `%s' " + "does not exist\n",Config::footerFile.data()); + exit(1); + } + } + // Test to see if LaTeX header is valid + if (Config::latexHeaderFile.length()>0) + { + QFileInfo fi(Config::latexHeaderFile); + if (!fi.exists()) + { + err("Error: tag LATEX_HEADER: header file `%s' " + "does not exist\n",Config::latexHeaderFile.data()); + exit(1); + } + } + // check include path + char *s=Config::includePath.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) err("Warning: tag INCLUDE_PATH: include path `%s' " + "does not exist\n",s); +#ifndef DOXYWIZARD + addSearchDir(fi.absFilePath()); +#endif + s=Config::includePath.next(); + } + // check input + if (Config::inputSources.count()==0) + { + err("Error: tag INPUT: no input files specified after the INPUT tag.\n"); + exit(1); + } + else + { + s=Config::inputSources.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) + { + err("Error: tag INPUT: input source `%s' does not exist\n",s); + exit(1); + } + s=Config::inputSources.next(); + } + } + + // add default pattern if needed + if (Config::filePatternList.count()==0) + { + Config::filePatternList.append("*"); + } + + // add default pattern if needed + if (Config::examplePatternList.count()==0) + { + Config::examplePatternList.append("*"); + } + + // add default pattern if needed + if (Config::imagePatternList.count()==0) + { + Config::imagePatternList.append("*"); + } + + // more checks needed if and only if the search engine is enabled. + if (Config::searchEngineFlag) + { + // check cgi name + if (Config::cgiName.length()==0) + { + err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n"); + exit(1); + } + // check cgi URL + if (Config::cgiURL.length()==0) + { + err("Error: tag CGI_URL: no URL to cgi directory specified.\n"); + exit(1); + } + else if (Config::cgiURL.left(7)!="http://") + { + err("Error: tag CGI_URL: URL to cgi directory is invalid (must " + "start with http://).\n"); + exit(1); + } + // check documentation URL + if (Config::docURL.length()==0) + { + Config::docURL = Config::outputDir.copy().prepend("file://").append("html"); + } + else if (Config::docURL.left(7)!="http://" && Config::docURL.left(7)!="file://") + { + err("Error: tag DOC_URL: URL to documentation is invalid or " + "not absolute.\n"); + exit(1); + } + // check absolute documentation path + if (Config::docAbsPath.length()==0) + { + Config::docAbsPath = Config::outputDir+"/html"; + } + else if (Config::docAbsPath[0]!='/' && Config::docAbsPath[1]!=':') + { + err("Error: tag DOC_ABSPATH: path is not absolute!\n"); + exit(1); + } + // check path to doxysearch + if (Config::binAbsPath.length()==0) + { + err("Error: tag BIN_ABSPATH: no absolute path to doxysearch " + "specified.\n"); + exit(1); + } + else if (Config::binAbsPath[0]!='/' && Config::binAbsPath[1]!=':') + { + err("Error: tag BIN_ABSPATH: path is not absolute!\n"); + exit(1); + } + + // check perl path + bool found=FALSE; + if (Config::perlPath.length()==0) + { + QFileInfo fi; + fi.setFile("/usr/bin/perl"); + if (fi.exists()) + { + Config::perlPath="/usr/bin/perl"; + found=TRUE; + } + else + { + fi.setFile("/usr/local/bin/perl"); + if (fi.exists()) + { + Config::perlPath="/usr/local/bin/perl"; + found=TRUE; + } + } + } + if (!found) + { + QFileInfo fi(Config::perlPath); + if (!fi.exists()) + { + warn("Warning: tag PERL_PATH: perl interpreter not found at default or" + "user specified (%s) location\n", + Config::perlPath.data()); + } + } + } +} + +void parseConfig(const QCString &s) +{ + inputString = s; + inputPosition = 0; + yyLineNr = 1; + configYYrestart( configYYin ); + BEGIN( Start ); + configYYlex(); +} + +//extern "C" { // some bogus code to keep the compiler happy +// int configYYwrap() { return 1 ; } +//} diff --git a/src/config.h b/src/config.h index 2bc8ce5..a7bdba9 100644 --- a/src/config.h +++ b/src/config.h @@ -31,70 +31,77 @@ struct Config { static void init(); - static QCString projectName; // the name of the project - static QCString projectNumber; // the number of the project - static QCString outputDir; // the global output directory - static QCString htmlOutputDir; // the directory to put the HTML files - static QCString latexOutputDir; // the directory to put the Latex files - static QCString manOutputDir; // the directory to put the man pages - static QCString outputLanguage; // the output language - static QCString headerFile; // the name of the personal HTML header - static QCString latexHeaderFile; // the name of the personal LaTeX header - static QCString footerFile; // the name of the personal HTML footer - static QCString cgiName; // the name of the CGI binary - static QCString cgiURL; // the absolute URL to the CGI binary - static QCString docURL; // the absolute URL to the documentation - static QCString binAbsPath; // the absolute path to the doxysearch - static QCString docAbsPath; // the absolute path to the documentation - static QCString perlPath; // the absolute path to perl - static QCString genTagFile; // the tag file to generate - static QCString inputFilter; // a filter command that is applied to input files - static QCString paperType; // the page type to generate docs for - static QCString manExtension; // extension the man page files - static QStrList includePath; // list of include paths - static QStrList examplePath; // list of example paths - static QStrList inputSources; // list of input files - static QStrList excludeSources; // list of files to exclude from the input - static QStrList filePatternList; // list of file patterns - static QStrList excludePatternList; // list of patterns to exclude from input - static QStrList tagFileList; // list of tag files - static QStrList extDocPathList; // list of external doc. directories. - static QStrList predefined; // list of predefined macro names. - static QStrList extraPackageList; // list of extra LaTeX packages. - static QStrList stripFromPath; // list of candidates to strip from the file path - static bool quietFlag; // generate progress messages flag - static bool warningFlag; // generate warnings flag - static bool recursiveFlag; // scan directories recursively - static bool allExtFlag; // include all external classes flag - static bool searchEngineFlag; // generate search engine flag - static bool extractAllFlag; // gererate docs for all classes flag - static bool extractPrivateFlag; // generate docs for private members flag - static bool noIndexFlag; // generate condensed index flag - static bool generateHtml; // generate HTML output - static bool generateLatex; // generate Latex output - static bool generateMan; // generate Man pages - static bool preprocessingFlag; // enable preprocessing - static bool briefMemDescFlag; // enable `inline' brief member descr. - static bool hideMemberFlag; // hide undocumented members. - static bool hideClassFlag; // hide undocumented members. - static bool searchIncludeFlag; // search for included files - static bool macroExpansionFlag; // expand macros in the source. - static bool onlyPredefinedFlag; // expand only predefined macros - static bool fullPathNameFlag; // using full path name in output - static bool classDiagramFlag; // enable the generation of class diagrams. - static bool compactLatexFlag; // generate compact LaTeX documentation. - static bool repeatBriefFlag; // repeat brief descriptions. - static bool internalDocsFlag; // determines what happens to internal docs. - static bool caseSensitiveNames; // determines if output can be mixed case. - static bool verbatimHeaderFlag; // enable/disable generation of verb headers. + static QCString projectName; // the name of the project + static QCString projectNumber; // the number of the project + static QCString outputDir; // the global output directory + static QCString htmlOutputDir; // the directory to put the HTML files + static QCString latexOutputDir; // the directory to put the Latex files + static QCString manOutputDir; // the directory to put the man pages + static QCString outputLanguage; // the output language + static QCString headerFile; // the name of the personal HTML header + static QCString latexHeaderFile; // the name of the personal LaTeX header + static QCString footerFile; // the name of the personal HTML footer + static QCString cgiName; // the name of the CGI binary + static QCString cgiURL; // the absolute URL to the CGI binary + static QCString docURL; // the absolute URL to the documentation + static QCString binAbsPath; // the absolute path to the doxysearch + static QCString docAbsPath; // the absolute path to the documentation + static QCString perlPath; // the absolute path to perl + static QCString genTagFile; // the tag file to generate + static QCString inputFilter; // a filter command that is applied to input files + static QCString paperType; // the page type to generate docs for + static QCString manExtension; // extension the man page files + static QCString htmlStyleSheet; // user defined cascading style sheet + static QStrList includePath; // list of include paths + static QStrList examplePath; // list of example paths + static QStrList imagePath; // list of image paths + static QStrList inputSources; // list of input files + static QStrList excludeSources; // list of files to exclude from the input + static QStrList filePatternList; // list of file patterns + static QStrList excludePatternList; // list of patterns to exclude from input + static QStrList examplePatternList; // list of example patterns + static QStrList imagePatternList; // list of image paths + static QStrList tagFileList; // list of tag files + static QStrList extDocPathList; // list of external doc. directories. + static QStrList predefined; // list of predefined macro names. + static QStrList extraPackageList; // list of extra LaTeX packages. + static QStrList stripFromPath; // list of candidates to strip from the file path + static bool quietFlag; // generate progress messages flag + static bool warningFlag; // generate warnings flag + static bool recursiveFlag; // scan directories recursively + static bool allExtFlag; // include all external classes flag + static bool searchEngineFlag; // generate search engine flag + static bool extractAllFlag; // gererate docs for all classes flag + static bool extractPrivateFlag; // generate docs for private members flag + static bool noIndexFlag; // generate condensed index flag + static bool generateHtml; // generate HTML output + static bool generateLatex; // generate Latex output + static bool generateMan; // generate Man pages + static bool preprocessingFlag; // enable preprocessing + static bool briefMemDescFlag; // enable `inline' brief member descr. + static bool hideMemberFlag; // hide undocumented members. + static bool hideClassFlag; // hide undocumented members. + static bool searchIncludeFlag; // search for included files + static bool macroExpansionFlag; // expand macros in the source. + static bool onlyPredefinedFlag; // expand only predefined macros + static bool fullPathNameFlag; // using full path name in output + static bool classDiagramFlag; // enable the generation of class diagrams. + static bool compactLatexFlag; // generate compact LaTeX documentation. + static bool repeatBriefFlag; // repeat brief descriptions. + static bool internalDocsFlag; // determines what happens to internal docs. + static bool caseSensitiveNames; // determines if output can be mixed case. + static bool verbatimHeaderFlag; // enable/disable generation of verb headers. static bool htmlAlignMemberFlag; // align members in HTML using tables. - static bool includeSourceFlag; // include source code in documentation. - static bool autoBriefFlag; // javadoc comments behaves as Qt comments. - static bool htmlHelpFlag; // should html help files be generated? - static bool alphaIndexFlag; // should an alphabetical index be generated? - static bool pdfHyperFlag; // generate latex prepared creating hyperlinked pdfs. - static bool inheritDocsFlag; // inheritance of documentation enabled? - static bool inlineInfoFlag; // show info about inline members? + static bool sourceBrowseFlag; // include source code in documentation. + static bool autoBriefFlag; // javadoc comments behaves as Qt comments. + static bool htmlHelpFlag; // should html help files be generated? + static bool alphaIndexFlag; // should an alphabetical index be generated? + static bool pdfHyperFlag; // generate latex prepared creating hyperlinked pdfs. + static bool inheritDocsFlag; // inheritance of documentation enabled? + static bool inlineInfoFlag; // show info about inline members? + static bool alwaysDetailsFlag; // show details description even if there is only a brief description? + static int tabSize; // number of spaces in a tab + static int colsInAlphaIndex; // number of columns in the alphabetical index }; #endif diff --git a/src/config.l b/src/config.l index 1e420c2..0d90ea1 100644 --- a/src/config.l +++ b/src/config.l @@ -24,9 +24,9 @@ #include #include -#include +#include #include -#include +#include #include "config.h" #include "version.h" @@ -83,12 +83,16 @@ QCString Config::genTagFile; QCString Config::inputFilter; QCString Config::paperType; QCString Config::manExtension; +QCString Config::htmlStyleSheet; QStrList Config::includePath; QStrList Config::examplePath; +QStrList Config::imagePath; QStrList Config::inputSources; QStrList Config::excludeSources; QStrList Config::filePatternList; QStrList Config::excludePatternList; +QStrList Config::examplePatternList; +QStrList Config::imagePatternList; QStrList Config::tagFileList; QStrList Config::extDocPathList; QStrList Config::predefined; @@ -109,10 +113,11 @@ bool Config::fullPathNameFlag = FALSE; bool Config::compactLatexFlag = FALSE; bool Config::internalDocsFlag = FALSE; bool Config::caseSensitiveNames = FALSE; -bool Config::includeSourceFlag = FALSE; +bool Config::sourceBrowseFlag = FALSE; bool Config::htmlHelpFlag = FALSE; bool Config::alphaIndexFlag = FALSE; bool Config::pdfHyperFlag = FALSE; +bool Config::alwaysDetailsFlag = FALSE; bool Config::autoBriefFlag = TRUE; bool Config::warningFlag = TRUE; bool Config::generateHtml = TRUE; @@ -127,6 +132,8 @@ bool Config::verbatimHeaderFlag = TRUE; bool Config::htmlAlignMemberFlag = TRUE; bool Config::inheritDocsFlag = TRUE; bool Config::inlineInfoFlag = TRUE; +int Config::tabSize = 8; +int Config::colsInAlphaIndex = 5; /* ----------------------------------------------------------------- * @@ -136,13 +143,15 @@ bool Config::inlineInfoFlag = TRUE; static const char * inputString; static int inputPosition; static int yyLineNr; -static QCString tmpString; -static QCString * s=0; +static QCString tmpString; +static QCString * s=0; static bool * b=0; static QStrList * l=0; static int lastState; static int lastEnvState; -static QCString elemStr; +static QCString elemStr; +static QCString tabSizeString; +static QCString colsInAlphaIndexString; /* ----------------------------------------------------------------- */ @@ -196,12 +205,18 @@ static int yyread(char *buf,int max_size) "PAPER_TYPE"[ \t]*"=" { BEGIN(GetString); s=&Config::paperType; } "OUTPUT_LANGUAGE"[ \t]*"=" { BEGIN(GetString); s=&Config::outputLanguage; } "MAN_EXTENSION"[ \t]*"=" { BEGIN(GetString); s=&Config::manExtension; } +"TAB_SIZE"[ \t]*"=" { BEGIN(GetString); s=&tabSizeString; } +"HTML_STYLESHEET"[ \t]*"=" { BEGIN(GetString); s=&Config::htmlStyleSheet; } +"COLS_IN_ALPHA_INDEX"[ \t]*"=" { BEGIN(GetString); s=&colsInAlphaIndexString; } "INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&Config::includePath; elemStr=""; } "EXAMPLE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&Config::examplePath; elemStr=""; } +"IMAGE_PATH"[ \t]*"=" { BEGIN(GetStrList); l=&Config::imagePath; elemStr=""; } "INPUT"[ \t]*"=" { BEGIN(GetStrList); l=&Config::inputSources; elemStr=""; } "EXCLUDE"[ \t]*"=" { BEGIN(GetStrList); l=&Config::excludeSources; elemStr=""; } "FILE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::filePatternList; elemStr=""; } "EXCLUDE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::excludePatternList; elemStr=""; } +"EXAMPLE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::examplePatternList; elemStr=""; } +"IMAGE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::imagePatternList; elemStr=""; } "TAGFILES"[ \t]*"=" { BEGIN(GetStrList); l=&Config::tagFileList; elemStr=""; } "EXT_DOC_PATHS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::extDocPathList; elemStr=""; } "PREDEFINED"[ \t]*"=" { BEGIN(GetStrList); l=&Config::predefined; elemStr=""; } @@ -222,6 +237,7 @@ static int yyread(char *buf,int max_size) "MACRO_EXPANSION"[ \t]*"=" { BEGIN(GetBool); b=&Config::macroExpansionFlag; } "SEARCH_INCLUDES"[ \t]*"=" { BEGIN(GetBool); b=&Config::searchIncludeFlag; } "BRIEF_MEMBER_DESC"[ \t]*"=" { BEGIN(GetBool); b=&Config::briefMemDescFlag; } +"ALWAYS_DETAILED_SEC"[ \t]*"=" { BEGIN(GetBool); b=&Config::alwaysDetailsFlag; } "HIDE_UNDOC_MEMBERS"[ \t]*"=" { BEGIN(GetBool); b=&Config::hideMemberFlag; } "HIDE_UNDOC_CLASSES"[ \t]*"=" { BEGIN(GetBool); b=&Config::hideClassFlag; } "EXPAND_ONLY_PREDEF"[ \t]*"=" { BEGIN(GetBool); b=&Config::onlyPredefinedFlag; } @@ -233,7 +249,7 @@ static int yyread(char *buf,int max_size) "CASE_SENSE_NAMES"[ \t]*"=" { BEGIN(GetBool); b=&Config::caseSensitiveNames; } "VERBATIM_HEADERS"[ \t]*"=" { BEGIN(GetBool); b=&Config::verbatimHeaderFlag; } "HTML_ALIGN_MEMBERS"[ \t]*"=" { BEGIN(GetBool); b=&Config::htmlAlignMemberFlag; } -"SOURCE_BROWSER"[ \t]*"=" { BEGIN(GetBool); b=&Config::includeSourceFlag; } +"SOURCE_BROWSER"[ \t]*"=" { BEGIN(GetBool); b=&Config::sourceBrowseFlag; } "JAVADOC_AUTOBRIEF"[ \t]*"=" { BEGIN(GetBool); b=&Config::autoBriefFlag; } "GENERATE_HTMLHELP"[ \t]*"=" { BEGIN(GetBool); b=&Config::htmlHelpFlag; } "ALPHABETICAL_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::alphaIndexFlag; } @@ -395,17 +411,23 @@ void Config::init() Config::inputFilter.resize(0); Config::paperType = "a4wide"; Config::manExtension = ".3"; + Config::htmlStyleSheet.resize(0); Config::includePath.clear(); Config::examplePath.clear(); + Config::imagePath.clear(); Config::inputSources.clear(); Config::excludeSources.clear(); Config::filePatternList.clear(); + Config::examplePatternList.clear(); + Config::imagePatternList.clear(); Config::excludePatternList.clear(); Config::tagFileList.clear(); Config::extDocPathList.clear(); Config::predefined.clear(); Config::extraPackageList.clear(); Config::stripFromPath.clear(); + Config::tabSize=8; + Config::colsInAlphaIndex=5; Config::quietFlag = FALSE; Config::recursiveFlag = FALSE; Config::allExtFlag = FALSE; @@ -421,10 +443,11 @@ void Config::init() Config::compactLatexFlag = FALSE; Config::internalDocsFlag = FALSE; Config::caseSensitiveNames = FALSE; - Config::includeSourceFlag = FALSE; + Config::sourceBrowseFlag = FALSE; Config::htmlHelpFlag = FALSE; Config::alphaIndexFlag = FALSE; Config::pdfHyperFlag = FALSE; + Config::alwaysDetailsFlag = FALSE; Config::warningFlag = TRUE; Config::generateHtml = TRUE; Config::generateLatex = TRUE; @@ -571,16 +594,6 @@ void writeTemplateConfig(QFile *f,bool sl) if (!sl) { t << "\n"; - t << "# The INTERNAL_DOCS tag determines if documentation\n"; - t << "# that is typed after a \\internal command is included. If the tag is set \n"; - t << "# to NO (the default) then the documentation will be excluded.\n"; - t << "# Set it to YES to include the internal documentation.\n"; - t << "\n"; - } - t << "INTERNAL_DOCS = NO\n"; - if (!sl) - { - t << "\n"; t << "# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n"; t << "# the brief description of a member or function before the detailed description.\n"; t << "# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n"; @@ -590,8 +603,17 @@ void writeTemplateConfig(QFile *f,bool sl) t << "REPEAT_BRIEF = YES\n"; if (!sl) { + t <<"\n"; + t << "# If the ALWAYS_DETAILS_SEC and REPEAT_BRIEF tags are both set to YES then\n"; + t << "# Doxygen will generate a detailed section even if there is only a brief\n"; + t << "# description.\n"; + t <<"\n"; + } + t << "ALWAYS_DETAILED_SEC = NO\n"; + if (!sl) + { t << "\n"; - t << "# If the FULL_PATH_NAMES tag is set to YES Doxygen will prepend the full\n"; + t << "# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n"; t << "# path before files name in the file list and in the header files. If set\n" ; t << "# to NO the shortest path that makes the file name unique will be used.\n"; t << "\n"; @@ -610,6 +632,16 @@ void writeTemplateConfig(QFile *f,bool sl) if (!sl) { t << "\n"; + t << "# The INTERNAL_DOCS tag determines if documentation\n"; + t << "# that is typed after a \\internal command is included. If the tag is set \n"; + t << "# to NO (the default) then the documentation will be excluded.\n"; + t << "# Set it to YES to include the internal documentation.\n"; + t << "\n"; + } + t << "INTERNAL_DOCS = NO\n"; + if (!sl) + { + t << "\n"; t << "# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n"; t << "# generate a class diagram (in Html and LaTeX) for classes with base or\n"; t << "# super classes. Setting the tag to NO turns the diagrams off.\n"; @@ -675,6 +707,14 @@ void writeTemplateConfig(QFile *f,bool sl) if (!sl) { t << "\n"; + t << "# the TAB_SIZE tag can be used to set the number of spaces in a tab\n"; + t << "# Doxygen uses this value to replace tabs by spaces in code fragments.\n"; + t << "\n"; + } + t << "TAB_SIZE = 8\n"; + if (!sl) + { + t << "\n"; } t << "#---------------------------------------------------------------------------\n"; t << "# configuration options related to the input files\n"; @@ -738,6 +778,36 @@ void writeTemplateConfig(QFile *f,bool sl) if (!sl) { t << "\n"; + t << "# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n"; + t << "# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"; + t << "# and *.h) to filter out the source-files in the directories. If left \n"; + t << "# blank all files are included.\n"; + t << "\n"; + } + t << "EXAMPLE_PATTERNS =\n"; + + if (!sl) + { + t << "\n"; + t << "# The IMAGE_PATH tag can be used to specify one or more files or \n"; + t << "# directories that contain image that are included in the documentation (see \n"; + t << "# the \\image command).\n"; + t << "\n"; + } + t << "IMAGE_PATH =\n"; + if (!sl) + { + t << "\n"; + t << "# If the value of the IMAGE_PATH tag contains directories, you can use the\n"; + t << "# IMAGE_PATTERNS tag to specify one or more wildcard pattern (like *.gif \n"; + t << "# and *.eps) to filter out the image files in the directories. If left \n"; + t << "# blank all files are included.\n"; + t << "\n"; + } + t << "IMAGE_PATTERNS =\n"; + if (!sl) + { + t << "\n"; t << "# The INPUT_FILTER tag can be used to specify a program that doxygen should\n"; t << "# invoke to filter for each input file. Doxygen will invoke the filter program \n"; t << "# by executing (via popen()) the command , where \n"; @@ -792,6 +862,16 @@ void writeTemplateConfig(QFile *f,bool sl) if (!sl) { t << "\n"; + t << "# The HTML_STYLESHEET tag can be used to specify a user defined cascading\n"; + t << "# style sheet that is used by each HTML page. It can be used to \n"; + t << "# fine-tune the look of the HTML output. If the tag is left blank doxygen\n"; + t << "# will generate a default style sheet\n"; + t << "\n"; + } + t << "HTML_STYLESHEET =\n"; + if (!sl) + { + t << "\n"; t << "# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,\n"; t << "# files or namespaces will be aligned in HTML using tables. If set to\n"; t << "# NO a bullet list will be used.\n"; @@ -820,6 +900,15 @@ void writeTemplateConfig(QFile *f,bool sl) if (!sl) { t << "\n"; + t << "# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n"; + t << "# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n"; + t << "# in which this list will be split (can be a number in the range [1..20])\n"; + t << "\n"; + } + t << "COLS_IN_ALPHA_INDEX = 5\n"; + if (!sl) + { + t << "\n"; } t << "#---------------------------------------------------------------------------\n"; t << "# configuration options related to the LaTeX output\n"; @@ -1097,6 +1186,39 @@ void checkConfig() //{ // projectName[0]=toupper(projectName[0]); //} + + if (tabSizeString.isEmpty()) + { + Config::tabSize=8; + } + else + { + bool ok; + int ts = tabSizeString.toInt(&ok); + if (!ok || ts<1 || ts>16) + { + warn("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n"); + ts=8; + } + Config::tabSize = ts; + } + + if (colsInAlphaIndexString.isEmpty()) + { + Config::colsInAlphaIndex=5; + } + else + { + bool ok; + int cols = colsInAlphaIndexString.toInt(&ok); + if (!ok || cols<1 || cols>20) + { + warn("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n" + "Using the default of 5 columns!\n"); + cols = 5; + } + Config::colsInAlphaIndex=cols; + } // set default man page extension if non is given by the user if (Config::manExtension.isEmpty()) @@ -1269,11 +1391,24 @@ void checkConfig() s=Config::inputSources.next(); } } + // add default pattern if needed if (Config::filePatternList.count()==0) { Config::filePatternList.append("*"); } + + // add default pattern if needed + if (Config::examplePatternList.count()==0) + { + Config::examplePatternList.append("*"); + } + + // add default pattern if needed + if (Config::imagePatternList.count()==0) + { + Config::imagePatternList.append("*"); + } // more checks needed if and only if the search engine is enabled. if (Config::searchEngineFlag) diff --git a/src/declinfo.cpp b/src/declinfo.cpp new file mode 100644 index 0000000..4a0a604 --- /dev/null +++ b/src/declinfo.cpp @@ -0,0 +1,1967 @@ +#define yy_create_buffer declinfoYY_create_buffer +#define yy_delete_buffer declinfoYY_delete_buffer +#define yy_scan_buffer declinfoYY_scan_buffer +#define yy_scan_string declinfoYY_scan_string +#define yy_scan_bytes declinfoYY_scan_bytes +#define yy_flex_debug declinfoYY_flex_debug +#define yy_init_buffer declinfoYY_init_buffer +#define yy_flush_buffer declinfoYY_flush_buffer +#define yy_load_buffer_state declinfoYY_load_buffer_state +#define yy_switch_to_buffer declinfoYY_switch_to_buffer +#define yyin declinfoYYin +#define yyleng declinfoYYleng +#define yylex declinfoYYlex +#define yyout declinfoYYout +#define yyrestart declinfoYYrestart +#define yytext declinfoYYtext + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define yywrap() 1 +#define YY_SKIP_YYWRAP +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 21 +#define YY_END_OF_BUFFER 22 +static yyconst short int yy_accept[89] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 20, 21, 5, 4, 8, 7, 20, 10, 2, + 9, 2, 20, 13, 11, 12, 18, 18, 20, 20, + 21, 16, 20, 19, 5, 8, 7, 0, 10, 9, + 4, 0, 6, 3, 2, 2, 0, 2, 0, 0, + 0, 16, 0, 0, 16, 0, 0, 0, 3, 2, + 0, 0, 15, 0, 0, 2, 0, 0, 2, 0, + 0, 14, 2, 0, 17, 2, 1, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 4, 1, 5, + 6, 7, 1, 1, 1, 1, 1, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 9, 1, 10, + 1, 11, 1, 1, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 13, 1, 1, 1, 12, 1, 14, 12, 12, 12, + + 15, 12, 12, 16, 12, 12, 12, 12, 12, 12, + 17, 18, 12, 19, 12, 20, 12, 12, 21, 12, + 12, 12, 1, 1, 1, 22, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[23] = + { 0, + 1, 2, 1, 1, 1, 1, 1, 3, 1, 1, + 1, 4, 1, 4, 4, 4, 4, 4, 4, 4, + 4, 1 + } ; + +static yyconst short int yy_base[97] = + { 0, + 164, 163, 0, 0, 20, 22, 21, 23, 42, 51, + 162, 161, 160, 159, 158, 157, 156, 155, 154, 153, + 155, 168, 168, 60, 30, 33, 168, 145, 168, 0, + 168, 135, 150, 168, 168, 168, 168, 130, 53, 62, + 66, 36, 75, 168, 0, 44, 168, 111, 168, 168, + 32, 72, 168, 112, 0, 93, 105, 0, 75, 73, + 79, 168, 88, 86, 95, 98, 100, 101, 85, 63, + 42, 107, 168, 39, 111, 35, 27, 55, 9, 90, + 113, 168, 11, 117, 168, 8, 0, 168, 122, 126, + 130, 134, 138, 140, 143, 147 + + } ; + +static yyconst short int yy_def[97] = + { 0, + 89, 89, 88, 3, 90, 90, 91, 91, 92, 92, + 89, 89, 89, 89, 89, 89, 89, 89, 93, 93, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 94, + 88, 94, 95, 88, 88, 88, 88, 88, 96, 96, + 96, 88, 96, 88, 24, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 94, 94, 95, 94, 88, 96, + 96, 88, 96, 96, 88, 88, 88, 96, 88, 94, + 88, 88, 88, 88, 96, 94, 88, 88, 94, 88, + 88, 88, 94, 88, 88, 94, 94, 0, 88, 88, + 88, 88, 88, 88, 88, 88 + + } ; + +static yyconst short int yy_nxt[191] = + { 0, + 22, 24, 23, 25, 26, 27, 25, 22, 28, 29, + 22, 30, 31, 30, 30, 30, 32, 30, 30, 30, + 30, 33, 23, 23, 23, 23, 87, 86, 83, 35, + 36, 35, 36, 51, 52, 51, 51, 66, 51, 53, + 38, 67, 38, 40, 41, 52, 42, 80, 79, 78, + 53, 43, 40, 41, 61, 42, 81, 62, 77, 82, + 43, 45, 63, 64, 46, 47, 65, 61, 48, 49, + 62, 63, 50, 52, 61, 63, 61, 62, 53, 62, + 61, 76, 63, 62, 63, 68, 69, 64, 63, 61, + 65, 84, 62, 71, 85, 63, 66, 63, 68, 66, + + 67, 72, 75, 67, 73, 62, 57, 70, 72, 74, + 63, 73, 75, 69, 81, 62, 74, 82, 84, 54, + 63, 85, 22, 22, 22, 22, 34, 34, 34, 34, + 37, 37, 37, 37, 39, 39, 39, 39, 44, 44, + 44, 44, 55, 55, 58, 59, 58, 60, 60, 60, + 60, 57, 56, 54, 88, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 21, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88 + } ; + +static yyconst short int yy_chk[191] = + { 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 5, 7, 6, 8, 86, 83, 79, 5, + 5, 6, 6, 25, 26, 51, 25, 42, 51, 26, + 7, 42, 8, 9, 9, 46, 9, 77, 76, 74, + 46, 9, 10, 10, 39, 10, 78, 39, 71, 78, + 10, 24, 39, 40, 24, 24, 40, 41, 24, 24, + 41, 40, 24, 52, 60, 41, 43, 60, 52, 43, + 61, 70, 60, 61, 43, 43, 69, 64, 61, 63, + 64, 80, 63, 59, 80, 64, 65, 63, 63, 66, + + 65, 67, 68, 66, 67, 68, 57, 56, 72, 67, + 68, 72, 75, 54, 81, 75, 72, 81, 84, 48, + 75, 84, 89, 89, 89, 89, 90, 90, 90, 90, + 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, + 93, 93, 94, 94, 95, 38, 95, 96, 96, 96, + 96, 33, 32, 28, 21, 20, 19, 18, 17, 16, + 15, 14, 13, 12, 11, 2, 1, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "declinfo.l" +#define INITIAL 0 +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +#line 18 "declinfo.l" + +/* + * includes + */ +#include +#include +#include +#include + +#include "declinfo.h" +#include "util.h" + + +#define YY_NO_UNPUT + +/* ----------------------------------------------------------------- + * + * statics + */ + +static const char * inputString; +static int inputPosition; +static QCString scope; +static QCString className; +static QCString classTempList; +static QCString funcTempList; +static QCString type; +static QCString name; +static QCString args; +static QCString tmpType; +static int sharpCount; +static bool classTempListFound; +static bool funcTempListFound; +static QCString exceptionString; + +static void addType() +{ + //printf("addType() type=`%s' scope=`%s' name=`%s'\n", + // type.data(),scope.data(),name.data()); + if (name.isEmpty() && scope.isEmpty()) return; + if (!type.isNull()) type+=' '; + if (!scope.isEmpty()) type+=scope+"::"; + type+=name; + scope.resize(0); + name.resize(0); +} + +static void addTypeName() +{ + //printf("addTypeName() type=`%s' scope=`%s' name=`%s'\n", + // type.data(),scope.data(),name.data()); + if (name.isEmpty()) return; + if (!type.isNull()) type+=' '; + type+=name; + name.resize(0); +} + +#define YY_NEVER_INTERACTIVE 1 + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +#define Start 1 + +#define Template 2 + +#define ReadArgs 3 + +#define Operator 4 + +#define FuncPtr 5 + +#define EndTemplate 6 + +#define StripTempArgs 7 + +#define SkipSharp 8 + +#define ReadExceptions 9 + + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 110 "declinfo.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 89 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 168 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 112 "declinfo.l" +{ // operator rule must be before {ID} rule + name += yytext; + BEGIN(Operator); + } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 116 "declinfo.l" +{ + addTypeName(); + name += yytext; + } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 120 "declinfo.l" +{ // found a scope specifier + if (!scope.isEmpty()) + { + scope+="::"+name; // add name to scope + } + else + { + scope = name.copy(); // scope becomes name + } + name.resize(0); + } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 131 "declinfo.l" +{ + addType(); + type+=yytext; + } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 135 "declinfo.l" +{ + addType(); + } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 138 "declinfo.l" +{ + addType(); + type+="(*"; + } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 142 "declinfo.l" +{ + type+=")"; + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 145 "declinfo.l" +{ // TODO: function pointers + args+="("; + BEGIN(ReadArgs); + } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 149 "declinfo.l" +{ + args+="["; + BEGIN(ReadArgs); + } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 153 "declinfo.l" +{ + name+="<"; + sharpCount=0; + BEGIN(Template); + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 158 "declinfo.l" +{ + name+="<"; + sharpCount++; + } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 162 "declinfo.l" +{ + name+=">"; + if (sharpCount) + --sharpCount; + else + { + BEGIN(Start); + } + } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 171 "declinfo.l" +{ + name+=*yytext; + } + YY_BREAK +case 14: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 174 "declinfo.l" +{ + name+="() <>"; + BEGIN(ReadArgs); + } + YY_BREAK +case 15: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 178 "declinfo.l" +{ + name+="()"; + BEGIN(ReadArgs); + } + YY_BREAK +case 16: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 182 "declinfo.l" +{ + name+=yytext; + BEGIN(ReadArgs); + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 186 "declinfo.l" +{ + exceptionString="throw("; + BEGIN(ReadExceptions); + } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 190 "declinfo.l" +{ + args+=*yytext; + } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 193 "declinfo.l" +{ + exceptionString+=*yytext; + } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 196 "declinfo.l" + + YY_BREAK +case 21: +YY_RULE_SETUP +#line 198 "declinfo.l" +ECHO; + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(Start): +case YY_STATE_EOF(Template): +case YY_STATE_EOF(ReadArgs): +case YY_STATE_EOF(Operator): +case YY_STATE_EOF(FuncPtr): +case YY_STATE_EOF(EndTemplate): +case YY_STATE_EOF(StripTempArgs): +case YY_STATE_EOF(SkipSharp): +case YY_STATE_EOF(ReadExceptions): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 89 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 89 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 88); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 198 "declinfo.l" + + +/*@ ---------------------------------------------------------------------------- + */ + +void parseFuncDecl(const QCString &decl,QCString &cl,QCString &ctl,QCString &t, + QCString &n,QCString &a,QCString &ftl,QCString &exc) +{ + inputString = decl; + //printf("Input=`%s'\n",inputString); + if (inputString==0) return; + inputPosition = 0; + classTempListFound = FALSE; + funcTempListFound = FALSE; + scope.resize(0); + className.resize(0); + classTempList.resize(0); + funcTempList.resize(0); + name.resize(0); + type.resize(0); + args.resize(0); + exceptionString.resize(0); + // first we try to find the type, scope, name and arguments + declinfoYYrestart( declinfoYYin ); + BEGIN( Start ); + declinfoYYlex(); + + cl=scope.copy(); + //printf("scope=`%s'\n",scope.data()); + int il=0,ir=0; + if ((il=cl.find('<'))!=-1 && (ir=cl.findRev('>'))!=-1) // split up scope and template arguments + { + ctl=removeRedundantWhiteSpace(cl.mid(il,ir-il+1)); + cl=cl.left(il)+cl.right(cl.length()-ir-1); + } + //printf("cl=`%s' ctl=`%s'\n",cl.data(),ctl.data()); + n=removeRedundantWhiteSpace(name); + if ((il=n.find('<'))!=-1 && (ir=n.findRev('>'))!=-1) + // TODO: handle cases like where n="operator<< " + { + ftl=removeRedundantWhiteSpace(n.right(n.length()-il)); + n=n.left(il); + } + + //ctl=classTempList.copy(); + //ftl=funcTempList.copy(); + t=removeRedundantWhiteSpace(type); + a=removeRedundantWhiteSpace(args); + exc=removeRedundantWhiteSpace(exceptionString); + + if (t.length()>0 && t.at(t.length()-1)==')') + { + a.prepend(")"); + t=t.left(t.length()-1); + } + //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n", + // t.data(),cl.data(),n.data(),a.data()); + + return; + + +} + +//extern "C" { // some bogus code to keep the compiler happy +// int declinfoYYwrap() { return 1 ; } +// void declinfoYYdummy() { yy_flex_realloc(0,0); } +//} + +#if 0 +void dumpDecl(const char *s) +{ + QCString className; + QCString classTNames; + QCString type; + QCString name; + QCString args; + QCString funcTNames; + printf("-----------------------------------------\n"); + parseFuncDecl(s,className,classTNames,type,name,args,funcTNames); + printf("type=`%s' class=`%s' classTempl=`%s' name=`%s' " + "funcTemplateNames=`%s' args=`%s'\n", + type.data(),className.data(),classTNames.data(), + name.data(),funcTNames.data(),args.data() + ); +} + +// some test code +int main() +{ + dumpDecl("A < T > :: Value * A < T > :: getValue < S > ( const A < T > & a )"); + dumpDecl("const A::Value* A::getValue(const A&a)"); + dumpDecl("func()"); + dumpDecl("friend void bla<>()"); + dumpDecl("name< T > :: operator () (int bla)"); + dumpDecl("name< T > :: operator << (int bla)"); + dumpDecl("name< T > :: operator << <> (int bla)"); + dumpDecl("className::func()"); + dumpDecl("void ( * Name < T > :: bla ) ( int, char * )"); +} +#endif diff --git a/src/defargs.cpp b/src/defargs.cpp new file mode 100644 index 0000000..d6f12d6 --- /dev/null +++ b/src/defargs.cpp @@ -0,0 +1,2099 @@ +#define yy_create_buffer defargsYY_create_buffer +#define yy_delete_buffer defargsYY_delete_buffer +#define yy_scan_buffer defargsYY_scan_buffer +#define yy_scan_string defargsYY_scan_string +#define yy_scan_bytes defargsYY_scan_bytes +#define yy_flex_debug defargsYY_flex_debug +#define yy_init_buffer defargsYY_init_buffer +#define yy_flush_buffer defargsYY_flush_buffer +#define yy_load_buffer_state defargsYY_load_buffer_state +#define yy_switch_to_buffer defargsYY_switch_to_buffer +#define yyin defargsYYin +#define yyleng defargsYYleng +#define yylex defargsYYlex +#define yyout defargsYYout +#define yyrestart defargsYYrestart +#define yytext defargsYYtext + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define YY_USES_REJECT + +#define yywrap() 1 +#define YY_SKIP_YYWRAP +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 32 +#define YY_END_OF_BUFFER 33 +static yyconst short int yy_acclist[132] = + { 0, + 2, 2, 33, 31, 32, 32, 1, 31, 32, 25, + 31, 32, 20, 25, 31, 32, 25, 31, 32, 27, + 31, 32, 13, 27, 31, 32, 14, 27, 31, 32, + 26, 27, 31, 32, 15, 27, 31, 32, 16, 27, + 31, 32, 18, 27, 31, 32, 17, 27, 31, 32, + 24, 31, 32, 2, 24, 31, 32, 12, 24, 31, + 32, 22, 24, 31, 32, 12, 24, 31, 32, 21, + 24, 31, 32, 23, 24, 31, 32, 24, 31, 32, + 7, 25, 31, 32, 25, 31, 32, 12, 25, 31, + 32, 22, 25, 31, 32, 11, 24, 31, 32, 9, + + 23, 24, 31, 32, 31, 32, 31, 32, 31, 32, + 19, 26, 2,16392, 23, 3, 10, 9, 23, 30, + 16392, 8200, 6, 6, 8200, 5, 4, 5, 4, 28, + 29 + } ; + +static yyconst short int yy_accept[100] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, + 3, 3, 3, 4, 6, 7, 10, 13, 17, 20, + 23, 27, 31, 35, 39, 43, 47, 51, 54, 58, + 62, 66, 70, 74, 78, 81, 85, 88, 92, 96, + 100, 105, 107, 109, 111, 112, 113, 114, 114, 114, + 115, 116, 116, 117, 117, 117, 117, 118, 120, 120, + 121, 121, 121, 121, 121, 121, 122, 123, 124, 124, + 125, 125, 125, 125, 125, 126, 127, 129, 129, 129, + 129, 130, 130, 131, 131, 131, 131, 132, 132 + + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 4, 1, 1, 1, 5, 6, 7, + 8, 5, 1, 9, 1, 1, 1, 10, 11, 11, + 11, 11, 11, 11, 11, 12, 12, 13, 1, 14, + 15, 16, 1, 1, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 18, 19, 20, 1, 17, 1, 21, 17, 22, 17, + + 23, 17, 17, 17, 24, 17, 17, 25, 17, 26, + 27, 17, 17, 17, 28, 29, 17, 30, 17, 17, + 17, 17, 31, 1, 32, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[33] = + { 0, + 1, 1, 2, 1, 1, 1, 1, 3, 1, 4, + 4, 4, 3, 1, 1, 1, 4, 1, 1, 1, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1 + } ; + +static yyconst short int yy_base[109] = + { 0, + 166, 165, 0, 1, 2, 6, 25, 0, 0, 0, + 51, 77, 55, 61, 109, 0, 139, 0, 170, 0, + 57, 58, 167, 292, 292, 292, 292, 292, 0, 292, + 292, 292, 0, 292, 292, 292, 292, 292, 164, 11, + 292, 292, 292, 0, 145, 292, 145, 292, 292, 10, + 0, 9, 136, 135, 292, 0, 159, 62, 69, 201, + 0, 140, 292, 153, 12, 74, 292, 0, 68, 292, + 132, 132, 64, 143, 92, 149, 231, 292, 146, 145, + 89, 122, 128, 96, 0, 292, 292, 96, 115, 79, + 292, 98, 292, 79, 71, 67, 292, 292, 263, 267, + + 271, 85, 275, 20, 279, 283, 16, 287 + } ; + +static yyconst short int yy_def[109] = + { 0, + 99, 99, 99, 99, 100, 100, 98, 7, 7, 7, + 7, 7, 7, 7, 98, 15, 100, 17, 98, 19, + 99, 99, 98, 98, 98, 98, 98, 98, 101, 98, + 98, 98, 102, 98, 98, 98, 98, 98, 98, 103, + 98, 98, 98, 104, 105, 98, 106, 98, 98, 98, + 107, 98, 98, 98, 98, 102, 98, 103, 103, 103, + 104, 105, 98, 98, 108, 98, 98, 107, 98, 98, + 98, 98, 103, 98, 103, 60, 98, 98, 98, 98, + 98, 98, 98, 103, 77, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 0, 98, 98, + + 98, 98, 98, 98, 98, 98, 98, 98 + } ; + +static yyconst short int yy_nxt[325] = + { 0, + 98, 98, 25, 25, 25, 28, 26, 26, 25, 28, + 69, 66, 59, 26, 26, 60, 67, 80, 70, 68, + 29, 81, 81, 61, 29, 30, 30, 25, 30, 30, + 30, 31, 32, 30, 30, 30, 30, 30, 30, 30, + 30, 33, 30, 30, 30, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 30, 30, 30, 30, 25, + 25, 30, 30, 73, 34, 73, 35, 30, 30, 69, + 75, 52, 52, 60, 74, 66, 74, 70, 53, 53, + 67, 74, 36, 30, 30, 37, 54, 54, 56, 97, + 34, 37, 35, 75, 87, 96, 60, 59, 88, 88, + + 60, 91, 95, 91, 74, 92, 92, 94, 36, 38, + 39, 25, 38, 38, 38, 40, 41, 41, 38, 38, + 38, 38, 42, 43, 41, 44, 45, 38, 38, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 42, + 38, 25, 46, 93, 47, 48, 49, 49, 90, 89, + 86, 86, 48, 58, 49, 84, 83, 82, 78, 63, + 57, 72, 71, 65, 63, 57, 98, 25, 25, 48, + 38, 38, 25, 38, 38, 38, 38, 50, 38, 38, + 38, 38, 38, 38, 38, 38, 51, 38, 38, 38, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + + 38, 38, 76, 98, 98, 60, 98, 98, 98, 98, + 98, 98, 98, 74, 98, 98, 98, 77, 98, 98, + 98, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 58, 73, 58, 58, 58, 58, 58, 98, 58, + 85, 85, 85, 74, 58, 58, 58, 85, 58, 58, + 58, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 58, 58, 24, 24, 24, 24, 27, 27, 27, + 27, 55, 98, 55, 55, 58, 58, 98, 58, 62, + 62, 62, 62, 64, 98, 64, 64, 79, 98, 79, + 79, 23, 98, 98, 98, 98, 98, 98, 98, 98, + + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98 + } ; + +static yyconst short int yy_chk[325] = + { 0, + 0, 0, 3, 4, 5, 5, 3, 4, 6, 6, + 52, 50, 40, 3, 4, 40, 50, 65, 52, 107, + 5, 65, 65, 104, 6, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 11, 11, 21, + 22, 13, 13, 58, 11, 73, 11, 14, 14, 69, + 59, 21, 22, 59, 58, 66, 73, 69, 21, 22, + 66, 59, 11, 12, 12, 13, 21, 22, 102, 96, + 12, 14, 12, 75, 81, 95, 75, 84, 81, 81, + + 84, 88, 94, 92, 75, 88, 88, 90, 12, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 17, 17, 89, 17, 17, 17, 17, 83, 82, + 80, 79, 17, 76, 17, 74, 72, 71, 64, 62, + 57, 54, 53, 47, 45, 39, 23, 2, 1, 17, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + + 19, 19, 60, 0, 0, 60, 0, 0, 0, 0, + 0, 0, 0, 60, 0, 0, 0, 60, 0, 0, + 0, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 77, 77, 77, 77, 77, 77, 77, 0, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 99, 99, 99, 99, 100, 100, 100, + 100, 101, 0, 101, 101, 103, 103, 0, 103, 105, + 105, 105, 105, 106, 0, 106, 106, 108, 0, 108, + 108, 98, 98, 98, 98, 98, 98, 98, 98, 98, + + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98 + } ; + +static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; +static char *yy_full_match; +static int yy_lp; +static int yy_looking_for_trail_begin = 0; +static int yy_full_lp; +static int *yy_full_state; +#define YY_TRAILING_MASK 0x2000 +#define YY_TRAILING_HEAD_MASK 0x4000 +#define REJECT \ +{ \ +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ +yy_cp = yy_full_match; /* restore poss. backed-over text */ \ +yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \ +yy_state_ptr = yy_full_state; /* restore orig. state */ \ +yy_current_state = *yy_state_ptr; /* restore curr. state */ \ +++yy_lp; \ +goto find_rule; \ +} +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "defargs.l" +#define INITIAL 0 +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +#line 18 "defargs.l" + +/* + * includes + */ +#include "qtbc.h" +#include +#include +#include +#include +#include + +#include "defargs.h" +#include "entry.h" +#include "util.h" + +#define YY_NO_UNPUT +#define YY_NEVER_INTERACTIVE 1 + +/* ----------------------------------------------------------------- + * + * statics + */ + +static const char *inputString; +static int inputPosition; +static ArgumentList *argList; +static QCString *copyArgValue; +static QCString curArgTypeName; +static QCString curArgDefValue; +static QCString curArgName; +static QCString curArgAttrib; +static int argRoundCount; +static int argSharpCount; +static int argCurlyCount; +static int readArgContext; + + + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +#define Start 1 + +#define CopyArgString 2 + +#define CopyArgRound 3 + +#define CopyArgRound2 4 + +#define CopyArgSharp 5 + +#define CopyArgCurly 6 + +#define ReadFuncArgType 7 + +#define ReadFuncArgDef 8 + +#define ReadFuncArgPtr 9 + +#define FuncQual 10 + + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 91 "defargs.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 99 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 292 ); + +yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + if ( yy_act & YY_TRAILING_HEAD_MASK || + yy_looking_for_trail_begin ) + { + if ( yy_act == yy_looking_for_trail_begin ) + { + yy_looking_for_trail_begin = 0; + yy_act &= ~YY_TRAILING_HEAD_MASK; + break; + } + } + else if ( yy_act & YY_TRAILING_MASK ) + { + yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK; + yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK; + } + else + { + yy_full_match = yy_cp; + yy_full_state = yy_state_ptr; + yy_full_lp = yy_lp; + break; + } + ++yy_lp; + goto find_rule; + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +YY_RULE_SETUP +#line 93 "defargs.l" +{ BEGIN(ReadFuncArgType); } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 95 "defargs.l" +{ + curArgTypeName+=" "; + } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 98 "defargs.l" +{ + if (curArgTypeName.stripWhiteSpace().isEmpty()) + curArgAttrib=yytext; + else + curArgTypeName+=yytext; + } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 104 "defargs.l" +{ curArgDefValue+=yytext; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 105 "defargs.l" +{ curArgDefValue+=yytext; } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 106 "defargs.l" +{ curArgDefValue+=yytext; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 107 "defargs.l" +{ + curArgDefValue+=*yytext; + BEGIN( CopyArgString ); + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 111 "defargs.l" +{ + // function pointer as argument + curArgTypeName+=yytext; + //curArgTypeName=curArgTypeName.simplifyWhiteSpace(); + BEGIN( ReadFuncArgPtr ); + } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 117 "defargs.l" +{ + curArgName=yytext; + } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 120 "defargs.l" +{ + curArgTypeName+=yytext; + //curArgTypeName=curArgTypeName.simplifyWhiteSpace(); + readArgContext = ReadFuncArgType; + copyArgValue=&curArgTypeName; + argRoundCount=0; + BEGIN( CopyArgRound2 ); + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 128 "defargs.l" +{ // redundant braces detected / remove them + int i=curArgTypeName.findRev('('),l=curArgTypeName.length(); + if (i!=-1) + curArgTypeName=curArgTypeName.left(i)+ + curArgTypeName.right(l-i-1); + curArgTypeName+=curArgName; + BEGIN( ReadFuncArgType ); + } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 136 "defargs.l" +{ + if (YY_START==ReadFuncArgType) + { + curArgTypeName+=*yytext; + copyArgValue=&curArgTypeName; + } + else // YY_START==ReadFuncArgDef + { + curArgDefValue+=*yytext; + copyArgValue=&curArgDefValue; + } + readArgContext = YY_START; + if (*yytext=='(') + { + argRoundCount=0; + BEGIN( CopyArgRound ); + } + else if (*yytext=='{') + { + argCurlyCount=0; + BEGIN( CopyArgCurly ); + } + else // yytext=='<' + { + argSharpCount=0; + BEGIN( CopyArgSharp ); + } + } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 164 "defargs.l" +{ + argRoundCount++; + *copyArgValue += *yytext; + } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 168 "defargs.l" +{ + *copyArgValue += *yytext; + if (argRoundCount>0) + { + argRoundCount--; + } + else + { + if (YY_START==CopyArgRound2) + { + *copyArgValue+=" "+curArgName; + } + BEGIN( readArgContext ); + } + } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 183 "defargs.l" +{ + argSharpCount++; + *copyArgValue += *yytext; + } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 187 "defargs.l" +{ + *copyArgValue += *yytext; + if (argSharpCount>0) argSharpCount--; + else BEGIN( readArgContext ); + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 192 "defargs.l" +{ + argCurlyCount++; + *copyArgValue += *yytext; + } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 196 "defargs.l" +{ + *copyArgValue += *yytext; + if (argCurlyCount>0) argCurlyCount--; + else BEGIN( readArgContext ); + } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 201 "defargs.l" +{ + curArgDefValue+=yytext; + } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 204 "defargs.l" +{ + curArgDefValue+=*yytext; + BEGIN( ReadFuncArgDef ); + } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 208 "defargs.l" +{ + BEGIN( ReadFuncArgDef ); + } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 211 "defargs.l" +{ + curArgTypeName=removeRedundantWhiteSpace( + curArgTypeName.simplifyWhiteSpace()); + curArgDefValue=curArgDefValue.stripWhiteSpace(); + int l=curArgTypeName.length(); + if (l>0) + { + int i=l-1; + while (i>=0 && + ( + isspace(curArgTypeName.at(i)) || + isId(curArgTypeName.at(i)) + ) + ) i--; + Argument *a = new Argument; + a->attrib = curArgAttrib.copy(); + if (i>=0 && curArgTypeName.at(i)!=':') + { // type contains a name + a->type = curArgTypeName.left(i+1).stripWhiteSpace(); + a->name = curArgTypeName.right(curArgTypeName.length()-i-1); + } + else // assume only the type was specified, try to determine name later + { + a->type = curArgTypeName.stripWhiteSpace(); + } + a->defval = curArgDefValue.copy(); + //printf("----> Adding argument `%s' `%s' `%s'\n",a->type.data(),a->name.data(),a->defval.data()); + argList->append(a); + } + curArgAttrib.resize(0); + curArgTypeName.resize(0); + curArgDefValue.resize(0); + if (*yytext==')') + { + BEGIN(FuncQual); + //printf(">>> end of argument list\n"); + } + else + { + BEGIN( ReadFuncArgType ); + } + } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 253 "defargs.l" +{ + QCString name=yytext; //resolveDefines(yytext); + //printf("resolveName `%s'->`%s'\n",yytext,name.data()); + curArgTypeName+=name; + } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 258 "defargs.l" +{ + curArgTypeName+=*yytext; + } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 261 "defargs.l" +{ + curArgDefValue+=*yytext; + } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 264 "defargs.l" +{ + QCString name=yytext; //resolveDefines(yytext); + *copyArgValue+=name; + } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 268 "defargs.l" +{ + *copyArgValue += *yytext; + } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 271 "defargs.l" +{ + argList->constSpecifier=TRUE; + } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 274 "defargs.l" +{ + argList->volatileSpecifier=TRUE; + } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 277 "defargs.l" +{ + argList->pureSpecifier=TRUE; + } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 280 "defargs.l" + + YY_BREAK +case 32: +YY_RULE_SETUP +#line 282 "defargs.l" +ECHO; + YY_BREAK + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(Start): + case YY_STATE_EOF(CopyArgString): + case YY_STATE_EOF(CopyArgRound): + case YY_STATE_EOF(CopyArgRound2): + case YY_STATE_EOF(CopyArgSharp): + case YY_STATE_EOF(CopyArgCurly): + case YY_STATE_EOF(ReadFuncArgType): + case YY_STATE_EOF(ReadFuncArgDef): + case YY_STATE_EOF(ReadFuncArgPtr): + case YY_STATE_EOF(FuncQual): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 99 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 99 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 98); + if ( ! yy_is_jam ) + *yy_state_ptr++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 282 "defargs.l" + + +/* ---------------------------------------------------------------------------- + */ + +// converts an argument string into a list of Arguments. +// an Argument consists of a type, an optional name, and an optional +// default initializer. + +void stringToArgumentList(const char *argsString,ArgumentList* &al) +{ + //if (al==0) al=new ArgumentList; // allocate new list if needed. + if (al==0) return; + if (!argsString) return; + inputString = argsString; + inputPosition = 0; + curArgTypeName.resize(0); + curArgDefValue.resize(0); + curArgName.resize(0); + argList = al; + defargsYYrestart( defargsYYin ); + BEGIN( Start ); + defargsYYlex(); +} + +extern "C" { // some bogus code to keep the compiler happy +// int defargsYYwrap() { return 1 ; } + void defargsYYdummy() { yy_flex_realloc(0,0); } +} diff --git a/src/definition.cpp b/src/definition.cpp index 59c9ac9..7428941 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -16,12 +16,17 @@ #include "qtbc.h" #include +#include "config.h" #include "definition.h" #include "doxygen.h" +#include "language.h" +#include "message.h" +#include "outputlist.h" +#include "scanner.h" Definition::Definition(const char *name,const char *b,const char *d) { - n=name; brief=b; doc=d; sectionList=0; + n=name; brief=b; doc=d; sectionList=0, bodyLine=-1, bodyDef=0; } Definition::~Definition() @@ -87,3 +92,103 @@ void Definition::setBriefDescription(const char *b) } } } + +/*! Write a reference to the source code defining this definition */ +void Definition::writeSourceRef(OutputList &ol) +{ + //printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef); + if (Config::sourceBrowseFlag && bodyLine!=-1 && bodyDef) + { + ol.newParagraph(); + + QCString refText = theTranslator->trDefinedAtLineInSourceFile(); + int lineMarkerPos = refText.find("@0"); + int fileMarkerPos = refText.find("@1"); + if (lineMarkerPos!=-1 && fileMarkerPos!=-1) // should always pass this. + { + QString lineStr,anchorStr; + lineStr.sprintf("%d",bodyLine); + anchorStr.sprintf("l%05d",bodyLine); + if (lineMarkerPossourceName(), + anchorStr,lineStr); + ol.enableAll(); + ol.disable(OutputGenerator::Html); + // write normal text (Latex/Man only) + ol.docify(lineStr); + ol.enableAll(); + + // write text between markers + parseText(ol,refText.mid(lineMarkerPos+2, + fileMarkerPos-lineMarkerPos-2)); + + ol.disableAllBut(OutputGenerator::Html); + // write file link (HTML only) + ol.writeObjectLink(0,bodyDef->sourceName(), + 0,bodyDef->name()); + ol.enableAll(); + ol.disable(OutputGenerator::Html); + // write normal text (Latex/Man only) + ol.docify(bodyDef->name()); + ol.enableAll(); + + // write text right from file marker + parseText(ol,refText.right( + refText.length()-fileMarkerPos-2)); + } + else // file marker before line marker + { + // write text left from file marker + parseText(ol,refText.left(fileMarkerPos)); + ol.disableAllBut(OutputGenerator::Html); + // write file link (HTML only) + ol.writeObjectLink(0,bodyDef->sourceName(), + 0,bodyDef->name()); + ol.enableAll(); + ol.disable(OutputGenerator::Html); + // write normal text (Latex/Man only) + ol.docify(bodyDef->name()); + ol.enableAll(); + + // write text between markers + parseText(ol,refText.mid(fileMarkerPos+2, + lineMarkerPos-fileMarkerPos-2)); + + ol.disableAllBut(OutputGenerator::Html); + // write line link (HTML only) + ol.writeObjectLink(0,bodyDef->sourceName(), + anchorStr,lineStr); + ol.enableAll(); + ol.disable(OutputGenerator::Html); + // write normal text (Latex/Man only) + ol.docify(lineStr); + ol.enableAll(); + + // write text right from linePos marker + parseText(ol,refText.right( + refText.length()-lineMarkerPos-2)); + } + } + else + { + err("Error: translation error: invalid markers in trDefinedInSourceFile()\n"); + } + } +} + +bool Definition::hasDocumentation() +{ + return !doc.isNull() || // has detailed docs + !brief.isNull() || // has brief description + (Config::sourceBrowseFlag && + bodyLine!=-1 && + bodyDef + ) || // has a source reference + Config::extractAllFlag; // extract everything +} + diff --git a/src/definition.h b/src/definition.h index 87b3c18..dac9d79 100644 --- a/src/definition.h +++ b/src/definition.h @@ -19,8 +19,10 @@ #include "qtbc.h" #include -#include "config.h" -#include "section.h" + +class FileDef; +class OutputList; +class SectionList; /*! The common base class of all definitions. */ class Definition @@ -36,6 +38,8 @@ class Definition * definition. */ virtual QCString getOutputFileBase() const = 0; + /*! Returns the name of the source listing of this file. */ + QCString sourceName() const { return getOutputFileBase()+"-source"; } /*! returns the detailed description of this definition */ QCString documentation() const { return doc; } /*! returns the brief description of this definition */ @@ -52,9 +56,7 @@ class Definition */ void setBriefDescription(const char *b); /*! returns TRUE iff the definition is documented */ - virtual bool hasDocumentation() - { return !doc.isNull() || !brief.isNull() || Config::extractAllFlag; } - + virtual bool hasDocumentation(); virtual bool isLinkableInProject() = 0; virtual bool isLinkable() = 0; @@ -75,6 +77,15 @@ class Definition */ void addSectionsToDefinition(QList *anchorList); + void setBodyLine(int bl) { bodyLine=bl; } + void setBodyDef(FileDef *fd) { bodyDef=fd; } + int getBodyLine() const { return bodyLine; } + FileDef *getBodyDef() { return bodyDef; } + void writeSourceRef(OutputList &ol); + + protected: + int bodyLine; // line number of the definition + FileDef *bodyDef; // file definition containing the function body private: QCString n; // name of the definition QCString brief; // brief description diff --git a/src/diagram.cpp b/src/diagram.cpp index d25b334..4cbd7cb 100644 --- a/src/diagram.cpp +++ b/src/diagram.cpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include "diagram.h" @@ -155,7 +155,7 @@ static void writeMapArea(QTextStream &t,ClassDef *cd,int x,int y,int w,int h) t << "href=\"" << cd->getOutputFileBase() << ".html\" "; t << "ALT=\"" << cd->name(); t << "\" shape=\"rect\" coords=\"" << x << "," << y << ","; - t << x+w << "," << y+h << "\">" << endl; + t << (x+w) << "," << (y+h) << "\">" << endl; } } //----------------------------------------------------------------------------- @@ -620,13 +620,13 @@ void TreeDiagram::drawConnectors(QTextStream &t,Image *image, t << protToString(di->protection()) << endl; if (doBase) { - t << "1 " << di->xPos()/(float)gridWidth << " " - << di->yPos()/(float)gridHeight+superRows-1 << " in\n"; + t << "1 " << (di->xPos()/(float)gridWidth) << " " + << (di->yPos()/(float)gridHeight+superRows-1) << " in\n"; } else { - t << "0 " << di->xPos()/(float)gridWidth << " " - << (float)superRows-0.25-di->yPos()/(float)gridHeight + t << "0 " << (di->xPos()/(float)gridWidth) << " " + << ((float)superRows-0.25-di->yPos()/(float)gridHeight) << " in\n"; } } @@ -740,7 +740,7 @@ void TreeDiagram::drawConnectors(QTextStream &t,Image *image, } else { - t << xf << " " << ysf + 0.25 << " " << yf << " vedge\n"; + t << xf << " " << (ysf + 0.25) << " " << yf << " vedge\n"; } } } @@ -787,12 +787,12 @@ void TreeDiagram::drawConnectors(QTextStream &t,Image *image, if (doBase) { t << "1 " << di->xPos()/(float)gridWidth << " " - << di->yPos()/(float)gridHeight+superRows-1 << " in\n"; + << (di->yPos()/(float)gridHeight+superRows-1) << " in\n"; } else { t << "0 " << di->xPos()/(float)gridWidth << " " - << (float)superRows-0.25-di->yPos()/(float)gridHeight + << ((float)superRows-0.25-di->yPos()/(float)gridHeight) << " in\n"; } } @@ -827,12 +827,12 @@ void TreeDiagram::drawConnectors(QTextStream &t,Image *image, if (doBase) { t << "0 " << di->xPos()/(float)gridWidth << " " - << di->yPos()/(float)gridHeight+superRows-1 << " out\n"; + << (di->yPos()/(float)gridHeight+superRows-1) << " out\n"; } else { t << "1 " << di->xPos()/(float)gridWidth << " " - << (float)superRows-1.75-di->yPos()/(float)gridHeight + << ((float)superRows-1.75-di->yPos()/(float)gridHeight) << " out\n"; } } @@ -863,14 +863,14 @@ void TreeDiagram::drawConnectors(QTextStream &t,Image *image, { t << first->xPos()/(float)gridWidth << " " << last->xPos()/(float)gridWidth << " " - << first->yPos()/(float)gridHeight+superRows-1 + << (first->yPos()/(float)gridHeight+superRows-1) << " conn\n"; } else { t << first->xPos()/(float)gridWidth << " " << last->xPos()/(float)gridWidth << " " - << (float)superRows-first->yPos()/(float)gridHeight + << ((float)superRows-first->yPos()/(float)gridHeight) << " conn\n"; } } diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 9c0a97b..8f09abb 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -16,7 +16,7 @@ */ #include "qtbc.h" -#include +#include #include #include #include @@ -50,7 +50,7 @@ #include "htmlhelp.h" #include "defargs.h" -#if defined(_MSC_VER) +#if defined(_MSC_VER) || defined(__BORLANDC__) #define popen _popen #endif @@ -81,6 +81,7 @@ FileNameDict inputNameDict(1009); // dictionary of sections StringDict excludeNameDict(1009); // dictionary of sections FileNameDict includeNameDict(1009); // dictionary of include names FileNameDict exampleNameDict(1009); // dictionary of examples +FileNameDict imageNameDict(257); // dictionary of images FileDict includeDict(1009); // dictionary of include files DefineDict defineDict(10007); // dictionary of all defines StringDict typedefDict(1009); // dictionary of all typedefs @@ -114,6 +115,7 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl, bool over_load); const char idMask[] = "[A-Za-z_][A-Za-z_0-9]*"; +QCString spaces; //---------------------------------------------------------------------- // Returns the standard string that is generated when the \overload @@ -149,7 +151,7 @@ void buildGroupList(Entry *root) gd->setBriefDescription(root->brief); gd->setDocumentation(root->doc); gd->addSectionsToDefinition(root->anchors); - groupList.inSort(gd); + groupList.append(gd); groupDict.insert(root->name,gd); } } @@ -232,11 +234,12 @@ void buildFileList(Entry *root) } else { + const char *fn = root->fileName.data(); warn("Warning: the name `%s' supplied as " "the second argument in the \\file statement in file " "%s at line %d ", root->name.data(), - root->fileName.data(), + fn ? fn : "???", root->startLine); if (ambig) // name is ambigious { @@ -409,28 +412,46 @@ void buildClassList(Entry *root) //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data()); cd->setTemplateArguments(root->tArgList); } - if (root->doc.length()>0 || root->brief.length()>0) // block contains docs + if (!root->doc.isEmpty() || !root->brief.isEmpty() || + (root->bodyLine!=-1 && Config::sourceBrowseFlag) + ) + // block contains something that ends up in the docs { - if (cd->documentation()) // class already documented + if (!root->doc.isEmpty() && !cd->documentation().isEmpty()) { - warn("Warning: class %s already documented\n" - " skipping documentation in file %s at line %d\n", + warn("Warning: class %s already has a detailed description\n" + " skipping the one in file %s at line %d\n", fullName.data(),root->fileName.data(),root->startLine); } - else // class not documented, use docs in block + else if (!root->doc.isEmpty()) { cd->setDocumentation(root->doc); + } + if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty()) + { + warn("Warning: class %s already has a brief description\n" + " skipping the one in file %s at line %d\n", + fullName.data(),root->fileName.data(),root->startLine); + } + else if (!root->brief.isEmpty()) + { cd->setBriefDescription(root->brief); - cd->addSectionsToDefinition(root->anchors); - cd->setName(fullName); // change name to match docs } + if (root->bodyLine!=-1 && cd->getBodyLine()==-1) + { + cd->setBodyLine(root->bodyLine); + cd->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig)); + } + cd->addSectionsToDefinition(root->anchors); + cd->setName(fullName); // change name to match docs } - if (cd->includeFile()==0) + if (cd->includeFile()==0 && + (!root->doc.isEmpty() || !root->brief.isEmpty()) + ) { - addIncludeFile(cd, - findFileDef(&inputNameDict,root->fileName,ambig), - root - ); + FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig); + cd->setFileDef(fd); + addIncludeFile(cd,fd,root); } addNamespace(root,cd); } @@ -456,6 +477,10 @@ void buildClassList(Entry *root) cd->setTemplateArguments(root->tArgList); cd->setProtection(root->protection); cd->addSectionsToDefinition(root->anchors); + // file definition containing the class cd + FileDef *ifd=findFileDef(&inputNameDict,root->fileName,ambig); + cd->setBodyLine(root->bodyLine); + cd->setBodyDef(ifd); QListIterator sli(*root->groups); QCString *s; @@ -471,10 +496,10 @@ void buildClassList(Entry *root) bool found=addNamespace(root,cd); - // file definition containing the class cd - FileDef *ifd=findFileDef(&inputNameDict,root->fileName,ambig); - addIncludeFile(cd,ifd,root); + cd->setFileDef(ifd); + if (!root->doc.isEmpty() || !root->brief.isEmpty()) + addIncludeFile(cd,ifd,root); // if the class is not in a namespace then we insert // it in the file definition @@ -594,6 +619,78 @@ void buildNamespaceList(Entry *root) } } +void findUsingDirectives(Entry *root) +{ + if (root->section==Entry::USINGDIR_SEC) + { + //printf("Found using directive %s at line %d of %s\n", + // root->name.data(),root->startLine,root->fileName.data()); + bool ambig; + if (!root->name.isEmpty()) + { + NamespaceDef *usingNd = 0; + NamespaceDef *nd = 0; + FileDef *fd = findFileDef(&inputNameDict,root->fileName,ambig); + QCString nsName; + + // see if the using statement was found inside a namespace or inside + // the global file scope. + if (root->parent->section == Entry::NAMESPACE_SEC) + { + nsName=root->parent->name.copy(); + if (!nsName.isEmpty()) + { + nd = namespaceDict[nsName]; + } + } + + // find the scope in which the `using' namespace is defined by prepending + // the possible scopes in which the using statement was found, starting + // with the most inner scope and going to the most outer scope (i.e. + // file scope). + int scopeOffset = nsName.length(); + do + { + QCString scope=scopeOffset>0 ? + nsName.left(scopeOffset)+"::" : QCString(); + //printf("Trying with scope=`%s'\n",scope.data()); + usingNd = namespaceDict[scope+root->name]; + if (scopeOffset==0) + { + scopeOffset=-1; + } + else if ((scopeOffset=nsName.findRev("::",scopeOffset-1))==-1) + { + scopeOffset=0; + } + } while (scopeOffset>=0 && usingNd==0); + + //printf("%s -> %p\n",root->name.data(),usingNd); + + // add the namespace the correct scope + if (usingNd) + { + if (nd) + { + //printf("Inside namespace %s\n",nd->name().data()); + nd->addUsingDirective(usingNd); + } + else if (fd) + { + //printf("Inside file %s\n",fd->name().data()); + fd->addUsingDirective(usingNd); + } + } + } + } + EntryListIterator eli(*root->sublist); + Entry *e; + for (;(e=eli.current());++eli) + { + findUsingDirectives(e); + } +} + //---------------------------------------------------------------------- static MemberDef *addVariableToClass(Entry *root,ClassDef *cd, @@ -665,6 +762,9 @@ static MemberDef *addVariableToClass(Entry *root,ClassDef *cd, md->setFromAnnonymousScope(fromAnnScope); md->setFromAnnonymousMember(fromAnnMemb); md->setIndentDepth(indentDepth); + md->setBodyLine(root->bodyLine); + bool ambig; + md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig)); // add the member to the global list if (mn) @@ -715,6 +815,10 @@ static MemberDef *addVariableToFile(Entry *root,MemberDef::MemberType mtype, md->setFromAnnonymousScope(fromAnnScope); md->setFromAnnonymousMember(fromAnnMemb); md->setIndentDepth(indentDepth); + md->setBodyLine(root->bodyLine); + bool ambig; + FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig); + md->setBodyDef(fd); // see if the function is inside a namespace NamespaceDef *nd = 0; @@ -730,11 +834,7 @@ static MemberDef *addVariableToFile(Entry *root,MemberDef::MemberType mtype, else { // find file definition - FileDef *fd=0; - bool ambig; - if (root->fileName.length()>0 && - (fd=findFileDef(&inputNameDict,root->fileName,ambig)) - ) + if (fd) { fd->insertMember(md); md->setFileDef(fd); @@ -810,10 +910,11 @@ void buildVarList(Entry *root) { Debug::print(Debug::Variables,0, "VARIABLE_SEC: \n" - " type=`%s' name=`%s' args=`%s'\n", + " type=`%s' name=`%s' args=`%s' bodyLine=`%d'\n", root->type.data(), root->name.data(), - root->args.data() + root->args.data(), + root->bodyLine ); //printf("root->parent->name=%s\n",root->parent->name.data()); @@ -978,13 +1079,15 @@ void buildMemberList(Entry *root) { Debug::print(Debug::Functions,0, "FUNCTION_SEC:\n" - " `%s' `%s'::`%s' `%s' relates=`%s' file=`%s' #targs=%d #mtargs=%d mGrpId=%d\n", + " `%s' `%s'::`%s' `%s' relates=`%s' file=`%s' line=`%d' bodyLine=`%d' #targs=%d #mtargs=%d mGrpId=%d\n", root->type.data(), root->parent->name.data(), root->name.data(), root->args.data(), root->relates.data(), root->fileName.data(), + root->startLine, + root->bodyLine, root->tArgList ? (int)root->tArgList->count() : -1, root->mtArgList ? (int)root->mtArgList->count() : -1, root->mGrpId @@ -1053,9 +1156,12 @@ void buildMemberList(Entry *root) md->setDefLine(root->startLine); md->setDocumentation(root->doc); md->setBriefDescription(root->brief); - md->setBody(root->body); + //md->setBody(root->body); + md->setBodyLine(root->bodyLine); md->setGroupId(root->mGrpId); md->setInline(root->inLine); + bool ambig; + md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig)); //md->setScopeTemplateArguments(root->tArgList); md->addSectionsToDefinition(root->anchors); QCString def; @@ -1167,7 +1273,6 @@ void buildMemberList(Entry *root) { if (md->getFileDef() && md->getFileDef()->absFilePath()==root->fileName && - /*matchArguments(md->argsString(),root->args)*/ matchArguments(md->argumentList(),root->argList) ) { @@ -1182,6 +1287,12 @@ void buildMemberList(Entry *root) { md->setBriefDescription(root->brief); } + if (md->getBodyLine()==-1 && root->bodyLine!=-1) + { + md->setBodyLine(root->bodyLine); + bool ambig; + md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig)); + } md->addSectionsToDefinition(root->anchors); } md=mn->next(); @@ -1189,8 +1300,8 @@ void buildMemberList(Entry *root) } if (!found) /* global function is unique with respect to the file */ { - //printf("New function type=`%s' name=`%s' args=`%s'\n", - // root->type.data(),root->name.data(),root->args.data()); + //printf("New function type=`%s' name=`%s' args=`%s' bodyLine=%d\n", + // root->type.data(),root->name.data(),root->args.data(),root->bodyLine); // new global function QCString name=removeRedundantWhiteSpace(root->name); @@ -1202,7 +1313,11 @@ void buildMemberList(Entry *root) md->setDocumentation(root->doc); md->setBriefDescription(root->brief); md->setPrototype(root->proto); - md->setBody(root->body); + //md->setBody(root->body); + md->setBodyLine(root->bodyLine); + bool ambig; + FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig); + md->setBodyDef(fd); md->addSectionsToDefinition(root->anchors); md->setGroupId(root->mGrpId); md->setInline(root->inLine); @@ -1257,11 +1372,12 @@ void buildMemberList(Entry *root) else { // find file definition - FileDef *fd=0; - bool ambig; - if (root->fileName.length()>0 && - (fd=findFileDef(&inputNameDict,root->fileName,ambig)) - ) + //FileDef *fd=0; + //bool ambig; + //if (root->fileName.length()>0 && + // (fd=findFileDef(&inputNameDict,root->fileName,ambig)) + // ) + if (fd) { // add member to the file fd->insertMember(md); @@ -1341,7 +1457,6 @@ void findFriends() ) // if the member is related and the arguments match then the // function is actually a friend. { - //printf("Found friend function\n"); mergeArguments(mmd->argumentList(),fmd->argumentList()); if (fmd->documentation()) mmd->setDocumentation(fmd->documentation()); @@ -1351,6 +1466,10 @@ void findFriends() mmd->setBriefDescription(fmd->briefDescription()); else if (mmd->briefDescription() && !fmd->briefDescription()) fmd->setBriefDescription(mmd->briefDescription()); + if (mmd->getBodyLine()==-1 && fmd->getBodyLine()!=-1) + mmd->setBodyLine(fmd->getBodyLine()); + else if (mmd->getBodyLine()!=-1 && fmd->getBodyLine()==-1) + fmd->setBodyLine(mmd->getBodyLine()); } } } @@ -1399,6 +1518,16 @@ void transferFunctionDocumentation() { mdef->setDocumentation(mdec->documentation()); } + if (mdec->getBodyLine()!=-1 && mdef->getBodyLine()==-1) + { + mdef->setBodyLine(mdec->getBodyLine()); + mdef->setBodyDef(mdec->getFileDef()); + } + else if (mdef->getBodyLine()!=-1 && mdec->getBodyLine()==-1) + { + mdec->setBodyLine(mdef->getBodyLine()); + mdec->setBodyDef(mdef->getFileDef()); + } } } } @@ -1451,7 +1580,7 @@ void computeClassRelations(Entry *root) QCString cName=removeRedundantWhiteSpace(scopePrefix+bi->name); //printf("Base class %s\n",cName.data()); ClassDef *baseClass=getClass(cName); - if (baseClass) // base class is documented + if (baseClass && cName!=cd->name()) // base class is documented { //printf("Adding!\n"); // add base class to this class @@ -1486,7 +1615,7 @@ void computeClassRelations(Entry *root) // ); int i; QCString templSpec; - if (!baseClass && (i=baseClassName.find('<'))!=-1) + if (baseClass==0 && (i=baseClassName.find('<'))!=-1) // base class has template specifiers { // TODO: here we should try to find the correct template specialization @@ -1495,42 +1624,64 @@ void computeClassRelations(Entry *root) baseClass=getClass(baseClassName); templSpec=bi->name.right(bi->name.length()-i); } - if (baseClass) // base class is documented + + bool found=baseClass!=0; + NamespaceDef *nd=cd->getNamespace(); + if (!found) + { + FileDef *fd=cd->getFileDef(); + if (fd) + { + // look for the using statement in this file in which the + // class was found + NamespaceList *nl = fd->getUsedNamespaces(); + if (nl) // try to prepend any of the using namespace scopes. + { + NamespaceListIterator nli(*nl); + NamespaceDef *nd; + for (nli.toFirst() ; (nd=nli.current()) && !found ; ++nli) + { + found = (baseClass=getClass(nd->name()+"::"+baseClassName)); + } + } + } + if (!found && nd) // class is inside a namespace + { + NamespaceList *nl = nd->getUsedNamespaces(); + found = (baseClass=getClass(nd->name()+"::"+baseClassName)); + if (nl) // try to prepend any of the using namespace scopes. + { + NamespaceListIterator nli(*nl); + NamespaceDef *nd; + for (nli.toFirst() ; (nd=nli.current()) && !found ; ++nli) + { + found = (baseClass=getClass(nd->name()+"::"+baseClassName)); + } + } + } + } + if (found) { // add base class to this class cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec); // add this class as super class to the base class baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec); } - else // base class not documented + else { - NamespaceDef *nd=cd->getNamespace(); - //printf("Found undocumented base class `%s' namespace scope=`%s'\n", - // bi->name.data(),nd ? nd->name().data() : ""); - if (nd && (baseClass=getClass(nd->name()+"::"+baseClassName))) - // class is defined inside namespace - { - // add base class to this class - cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec); - // add this class as super class to the base class - baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec); - } - else // undocumented base class - { - //printf(">>> Undocumented base class = %s\n",bi->name.data()); - baseClass=new ClassDef(baseClassName,ClassDef::Class); - // add base class to this class - cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec); - // add this class as super class to the base class - baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec); - // the undocumented base was found in this file - baseClass->insertUsedFile(root->fileName); - // add class to the list - classList.inSort(baseClass); - //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); - //classDict.insert(resolveDefines(bi->name),baseClass); - classDict.insert(bi->name,baseClass); - } + //printf(">>> Undocumented base class = %s\n",bi->name.data()); + baseClass=new ClassDef(baseClassName,ClassDef::Class); + // add base class to this class + cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec); + // add this class as super class to the base class + baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec); + // the undocumented base was found in this file + baseClass->insertUsedFile(root->fileName); + // add class to the list + classList.inSort(baseClass); + //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); + //classDict.insert(resolveDefines(bi->name),baseClass); + classDict.insert(bi->name,baseClass); } bi=baseList->next(); } @@ -1655,9 +1806,16 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl, md->setBriefDescription(root->brief); } - if (md->bodyCode().isEmpty() && !root->body.isEmpty()) /* no body yet */ + //if (md->bodyCode().isEmpty() && !root->body.isEmpty()) /* no body yet */ + //{ + // md->setBody(root->body); + //} + if (md->getBodyLine()==-1 && root->bodyLine!=-1) { - md->setBody(root->body); + md->setBodyLine(root->bodyLine); + bool ambig; + FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig); + md->setBodyDef(fd); } } md->setDefFile(root->fileName); @@ -1684,34 +1842,105 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl, } //---------------------------------------------------------------------- + +static QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ) +{ + QCString result=scope.copy(); + if (!templ.isEmpty() && scope.find('<')==-1) + { + int si,pi=0; + while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) + && !getClass(scope.left(si))) + { //printf("Tried `%s'\n",(scope.left(si)+templ).data()); + pi=si+2; + } + if (si==-1) // not nested => append template specifier + { + result+=templ; + } + else // nested => insert template specifier before after first class name + { + result=scope.left(si) + templ + scope.right(scope.length()-si); + } + } + //printf("insertTemplateSpecifierInScope(`%s',`%s')=%s\n", + // scope.data(),templ.data(),result.data()); + return result; +} + +//---------------------------------------------------------------------- +// find a class definition given the scope name and (optionally) a +// template list specifier + +static ClassDef *findClassDefinition(const char *scopeName,const char *classTempList) +{ + ClassDef *tcd=0; + if (classTempList) // try to find the correct specialization + { + tcd=getClass( + insertTemplateSpecifierInScope( + scopeName, + classTempList + ) + ); // try specialization + } + if (tcd==0) + { + tcd=getClass(scopeName); // try general class + } + return tcd; +} + + +//---------------------------------------------------------------------- // Adds the documentation contained in `root' to a global function // with name `name' and argument list `args' (for overloading) and // function declaration `decl' to the corresponding member definition. -bool findUnrelatedFunction(Entry *root, +static bool findUnrelatedFunction(Entry *root, const QCString &namespaceName, const char *name, + const char *tempArg, const char *, const char *decl) { - MemberName *mn=0; QCString n=name; + if (n.length()==0) return FALSE; if (n.find("::")!=-1) return FALSE; // skip undefined class members - //printf("findUnrelatedFunction(%s)\n",name); - if (n.length()>0 && (mn=functionNameDict[n])) // function name defined + //printf("findUnrelatedFunction(namespace=%s,name=%s,tempArg=%s,decl=%s)\n", + // namespaceName.data(),name,tempArg,decl); + MemberName *mn=functionNameDict[n+tempArg]; // look in function dictionary + if (mn==0) + { + mn=functionNameDict[n]; // try with template arguments + } + if (mn) // function name defined { - int count=0; + //int count=0; MemberDef *md=mn->first(); + bool found=FALSE; while (md) { + bool ambig; NamespaceDef *nd=md->getNamespace(); - QCString nsName = nd ? nd->name().data() : ""; - if (namespaceName.length()==0 || - nsName==namespaceName) + //printf("Namespace %s\n",nd ? nd->name().data() : ""); + FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig); + //printf("File %s\n",fd ? fd->name().data() : ""); + NamespaceList *nl = fd ? fd->getUsedNamespaces() : 0; + //printf("NamespaceList %p\n",nl); + bool viaUsingDirective = nl && nd && nl->find(nd)!=-1; + + if ((namespaceName.length()==0 && nd==0) || // not in a namespace + (nd && nd->name()==namespaceName) || // or in the same namespace + viaUsingDirective // member in `using' namespace + ) { + //printf("Adding docs `%s' to member `%s' in namespace `%s'\n", + // root->doc.data(),md->name().data(),namespaceName.data()); //printf("Searching for match between %s and %s\n", // argListToString(md->argumentList()).data(), // argListToString(root->argList).data()); + QCString nsName = nd ? nd->name().data() : ""; bool matching= /*matchArguments(md->argsString(),args);*/ (md->argumentList()==0 && root->argList->count()==0) || @@ -1720,33 +1949,17 @@ bool findUnrelatedFunction(Entry *root, { //printf("Match found\n"); addMemberDocs(root,md,decl,FALSE); - count++; + found=TRUE; } } md=mn->next(); } - if (count==0) // more than one match (each member will get the same docs)! + if (!found) // no match { - warn("Warning: no matching members found for \n%s\n" + warn("Warning: no matching member found for \n%s\n" "in file %s at line %d\n", decl,root->fileName.data(),root->startLine); } -#if 0 - else if (count>1) // no match! - { - warn("Warning: multiple matching members for\n%s\n",decl); - if (mn->count()>0) // there is a member with that name - { - warn("Possible candidates are:\n"); - MemberDef *md=mn->first(); - while (md) // list all possible members with the same name - { - warn(" %s%s\n",md->name(),md->argsString()); - md=mn->next(); - } - } - } -#endif } else // got docs for an undefined member! { @@ -1841,31 +2054,6 @@ void substituteTemplateArgNames(ArgumentList *src, } -QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ) -{ - QCString result=scope.copy(); - if (!templ.isEmpty() && scope.find('<')==-1) - { - int si,pi=0; - while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) - && !getClass(scope.left(si))) - { //printf("Tried `%s'\n",(scope.left(si)+templ).data()); - pi=si+2; - } - if (si==-1) // not nested => append template specifier - { - result+=templ; - } - else // nested => insert template specifier before after first class name - { - result=scope.left(si) + templ + scope.right(scope.length()-si); - } - } - //printf("insertTemplateSpecifierInScope(`%s',`%s')=%s\n", - // scope.data(),templ.data(),result.data()); - return result; -} - //---------------------------------------------------------------------- // This function tries to find a member (in a documented class/file/namespace) // that corresponds to the function declaration given in `funcDecl'. @@ -1888,11 +2076,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, root->tArgList,tempArgListToString(root->tArgList).data(), root->scopeSpec.data(),root->memberSpec.data(),root->inLine ); - if (Config::includeSourceFlag && !root->body.isEmpty()) - { - //printf("Function: %s\n-----------------\n%s\n------------------\n", - //root->name.data(),root->body.data()); - } + //if (Config::includeSourceFlag && !root->body.isEmpty()) + //{ + // //printf("Function: %s\n-----------------\n%s\n------------------\n", + // //root->name.data(),root->body.data()); + //} QCString scopeName; QCString className; @@ -2181,19 +2369,35 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ClassDef *cd=md->memberClass(); //printf("Member %s (member scopeName=%s) (this scopeName=%s) classTempList=%s\n",md->name().data(),cd->name().data(),scopeName.data(),classTempList.data()); ClassDef *tcd=0; - if (classTempList.length()>0) // try to find the correct specialization - { - tcd=getClass( - insertTemplateSpecifierInScope( - scopeName, - classTempList - ) - ); // try specialization - } + + tcd = findClassDefinition(scopeName,classTempList); + if (tcd==0) { - tcd=getClass(scopeName); // try general class + bool ambig; + NamespaceDef *nd = 0; + FileDef *fd = 0; + NamespaceList *nl = 0; + if (namespaceName.length()>0 && (nd=namespaceDict[namespaceName])) + { + nl=nd->getUsedNamespaces(); + } + else if ((fd=findFileDef(&inputNameDict,root->fileName,ambig))) + { + nl=fd->getUsedNamespaces(); + } + if (nl) + { + NamespaceListIterator nli(*nl); + NamespaceDef *nd; + for (;(nd=nli.current()) && tcd==0;++nli) + { + //printf("Trying with scope=%s\n",nd->name().data()); + tcd = findClassDefinition(nd->name()+"::"+scopeName,classTempList); + } + } } + if (cd && tcd==cd) // member's classes match { Debug::print(Debug::FindMembers,0, @@ -2375,7 +2579,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, md->setDefLine(root->startLine); md->setPrototype(root->proto); md->addSectionsToDefinition(root->anchors); - md->setBody(root->body); + //md->setBody(root->body); + md->setBodyLine(root->bodyLine); + bool ambig; + FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig); + md->setBodyDef(fd); md->setInline(root->inLine); mn->inSort(md); cd->insertMember(md); @@ -2384,7 +2592,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, } else // unrelated function with the same name as a member { - if (!findUnrelatedFunction(root,namespaceName,funcName+funcTempList,funcArgs,funcDecl)) + if (!findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl)) { warn("Warning: Cannot determine class for function\n%s\n" "in file %s at line %d\n",fullFuncDecl.data(), @@ -2416,9 +2624,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, } if (!newMember && rmd) // member already exists as rmd -> add docs { + //printf("addMemberDocs for related member %s\n",root->name.data()); addMemberDocs(root,rmd,funcDecl,overloaded); } } + if (newMember) // need to create a new member { MemberDef::MemberType mtype; @@ -2433,16 +2643,55 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, MemberDef *md=new MemberDef(funcType,funcName,funcArgs,exceptions, root->protection,root->virt,root->stat,TRUE, mtype,root->tArgList,root->argList); - //printf("Related member name=`%s' decl=`%s'\n",funcName.data(),funcDecl.data()); + //printf("Related member name=`%s' decl=`%s' bodyLine=`%d'\n", + // funcName.data(),funcDecl.data(),root->bodyLine); + + // try to find the matching line number of the body from the + // global function list + bool found=FALSE; + if (root->bodyLine==-1) + { + MemberName *rmn=functionNameDict[funcName]; + if (rmn) + { + MemberDef *rmd=rmn->first(); + while (rmd && !found) // see if we got another member with matching arguments + { + // check for matching argument lists + if (matchArguments(rmd->argumentList(), + root->argList, + className, + namespaceName) + ) + { + found=TRUE; + } + if (!found) rmd=rmn->next(); + } + if (rmd) // member found -> copy line number info + { + md->setBodyLine(rmd->getBodyLine()); + md->setBodyDef(rmd->getBodyDef()); + } + } + } + if (!found) // line number could not be found or is available in this + // entry + { + md->setBodyLine(root->bodyLine); + bool ambig; + FileDef *fd=findFileDef(&inputNameDict,root->fileName,ambig); + md->setBodyDef(fd); + } + md->setMemberClass(cd); + md->setInline(root->inLine); md->setDefinition(funcDecl); - md->setDocumentation(root->doc); - md->setBriefDescription(root->brief); md->setDefFile(root->fileName); md->setDefLine(root->startLine); md->setPrototype(root->proto); - md->setBody(root->body); - md->setInline(root->inLine); + md->setDocumentation(root->doc); + md->setBriefDescription(root->brief); md->addSectionsToDefinition(root->anchors); mn->inSort(md); cd->insertMember(md); @@ -2464,7 +2713,7 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, else // unrelated not overloaded member found { if (className.length()==0 && - !findUnrelatedFunction(root,namespaceName,funcName+funcTempList,funcArgs,funcDecl)) + !findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl)) { warn("Warning: class for member %s (file %s at line %d) cannot " "be found\n", funcName.data(),root->fileName.data(), @@ -2526,7 +2775,7 @@ void findMemberDocumentation(Entry *root) else if (root->section==Entry::FUNCTION_SEC && (!root->doc.isEmpty() || !root->brief.isEmpty() || - !root->body.isEmpty() || root->mGrpId!=-1 /*|| Config::extractAllFlag*/ + root->bodyLine!=-1 || root->mGrpId!=-1 /*|| Config::extractAllFlag*/ || root->inLine ) ) @@ -2656,6 +2905,10 @@ void findEnums(Entry *root) if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd); md->setDefFile(root->fileName); md->setDefLine(root->startLine); + md->setBodyLine(root->bodyLine); + bool ambig; + md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig)); + //printf("Enum definition at line %d of %s\n",root->bodyLine,root->fileName.data()); md->addSectionsToDefinition(root->anchors); if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') { @@ -3163,6 +3416,90 @@ void generateFileDocs() } //---------------------------------------------------------------------------- + +void generateSources() +{ + if (Config::sourceBrowseFlag) + { + writeSourceIndex(*outputList); + + if (inputNameList.count()>0) + { + FileName *fn=inputNameList.first(); + while (fn) + { + FileDef *fd=fn->first(); + while (fd) + { + msg("Generating source listing for file %s...\n",fd->name().data()); + fd->writeSource(*outputList); + fd=fn->next(); + } + fn=inputNameList.next(); + } + } + } +} + +void addSourceReferences() +{ + ClassListIterator cli(classList); + ClassDef *cd=0; + for (cli.toFirst();(cd=cli.current());++cli) + { + FileDef *fd=cd->getBodyDef(); + if (fd && cd->isLinkableInProject() && cd->getBodyLine()!=-1) + { + fd->addSourceRef(cd->getBodyLine(),cd,0); + } + } + MemberNameListIterator mnli(memberNameList); + MemberName *mn=0; + for (mnli.toFirst();(mn=mnli.current());++mnli) + { + MemberNameIterator mni(*mn); + MemberDef *md=0; + for (mni.toFirst();(md=mni.current());++mni) + { + ClassDef *cd=md->memberClass(); + FileDef *fd=md->getBodyDef(); + if (fd && cd && cd->isLinkableInProject() && md->getBodyLine()!=-1 && + md->isLinkableInProject()) + { + //printf("Found member `%s' in file `%s' at line `%d'\n", + // md->name().data(),fd->name().data(),md->getBodyLine()); + Definition *d=cd; + if (d==0) d=md->getNamespace(); + if (d==0) d=md->getFileDef(); + fd->addSourceRef(md->getBodyLine(),d,md->anchor()); + } + } + } + MemberNameListIterator fnli(functionNameList); + for (fnli.toFirst();(mn=fnli.current());++fnli) + { + MemberNameIterator mni(*mn); + MemberDef *md=0; + for (mni.toFirst();(md=mni.current());++mni) + { + NamespaceDef *nd=md->getNamespace(); + FileDef *fd=md->getBodyDef(); + if (md->getBodyLine()!=-1 && md->isLinkableInProject() && + (nd && nd->isLinkableInProject()) || + (fd && fd->isLinkableInProject()) + ) + { + //printf("Found member `%s' in file `%s' at line `%d'\n", + // md->name().data(),fd->name().data(),md->getBodyLine()); + Definition *d=md->getFileDef(); + if (d==0) d=md->getNamespace(); + fd->addSourceRef(md->getBodyLine(),d,md->anchor()); + } + } + } +} + +//---------------------------------------------------------------------------- // generate the documentation of all classes void generateClassDocs() @@ -3281,13 +3618,18 @@ void findDefineDocumentation(Entry *root) md->setDocumentation(root->doc); if (md->briefDescription().isEmpty()) md->setBriefDescription(root->brief); + md->setBodyLine(root->bodyLine); + bool ambig; + md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig)); md->addSectionsToDefinition(root->anchors); } md=mn->next(); } } - else if (count>1 && (root->doc.length()>0 || root->brief.length()>0)) + else if (count>1 && + (root->doc.length()>0 || root->brief.length()>0 || root->bodyLine!=-1)) // multiple defines don't know where to add docs + // but maybe they are in different files together with their documentation { md=mn->first(); while (md) @@ -3302,6 +3644,9 @@ void findDefineDocumentation(Entry *root) md->setDocumentation(root->doc); if (md->briefDescription().isEmpty()) md->setBriefDescription(root->brief); + md->setBodyLine(root->bodyLine); + bool ambig; + md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig)); md->addSectionsToDefinition(root->anchors); } } @@ -3398,6 +3743,7 @@ void findMainPage(Entry *root) //printf("Found main page! \n======\n%s\n=======\n",root->doc.data()); mainPage = new PageInfo("index", root->doc, root->args.stripWhiteSpace()); + setFileNameForSections(root->anchors,"index"); } else { @@ -3533,7 +3879,9 @@ void generateExampleDocs() msg("Generating docs for example %s...\n",pi->name.data()); QCString n=convertSlashes(pi->name,TRUE)+"-example"; startFile(*outputList,n,"Example Documentation"); - //outputList->writeTitle(pi->name,pi->name); + startTitle(*outputList,n); + outputList->docify(pi->name); + endTitle(*outputList,n,0); parseExample(*outputList,pi->doc+"\n\\include "+pi->name,pi->name); endFile(*outputList); pi=exampleList.next(); @@ -3740,25 +4088,39 @@ void generateSearchIndex() void generateConfigFile(const char *configFile,bool shortList) { - QFileInfo fi(configFile); - QFile f(configFile); - - if (fi.exists()) // create a backup + QFile f; + bool fileOpened=FALSE; + bool writeToStdout=(configFile[0]=='-' && configFile[1]==0); + if (writeToStdout) // write to stdout { - QDir dir=fi.dir(); - dir.rename(fi.fileName(),fi.fileName()+".bak"); - } - if (f.open(IO_WriteOnly)) + fileOpened = f.open(IO_WriteOnly,stdout); + } + else // write to file + { + QFileInfo fi(configFile); + if (fi.exists()) // create a backup + { + QDir dir=fi.dir(); + dir.rename(fi.fileName(),fi.fileName()+".bak"); + } + f.setName(configFile); + fileOpened = f.open(IO_WriteOnly); + } + + if (fileOpened) { writeTemplateConfig(&f,shortList); f.close(); - msg("\n\nConfiguration file `%s' created.\n\n",configFile); - msg("Now edit the configuration file and enter\n\n"); - if (strcmp(configFile,"Doxyfile") || strcmp(configFile,"doxyfile")) - msg(" doxygen %s\n\n",configFile); - else - msg(" doxygen\n\n"); - msg("to generate the documentation for your project\n\n"); + if (!writeToStdout) + { + msg("\n\nConfiguration file `%s' created.\n\n",configFile); + msg("Now edit the configuration file and enter\n\n"); + if (strcmp(configFile,"Doxyfile") || strcmp(configFile,"doxyfile")) + msg(" doxygen %s\n\n",configFile); + else + msg(" doxygen\n\n"); + msg("to generate the documentation for your project\n\n"); + } } else { @@ -3869,6 +4231,37 @@ void copyAndFilterFile(const char *fileName,BufStr &dest) } //---------------------------------------------------------------------------- +void copyStyleSheet() +{ + if (!Config::htmlStyleSheet.isEmpty()) + { + QFile cssf(Config::htmlStyleSheet); + if (cssf.open(IO_ReadOnly)) + { + QCString destFileName = Config::htmlOutputDir+"/"+Config::htmlStyleSheet; + QFile df(destFileName); + if (df.open(IO_WriteOnly)) + { + char *buffer = new char[cssf.size()]; + cssf.readBlock(buffer,cssf.size()); + df.writeBlock(buffer,cssf.size()); + df.flush(); + delete buffer; + } + else + { + warn("Warning: could not write to style sheet %s\n",destFileName.data()); + } + } + else + { + warn("Warning: could not open user specified style sheet %s\n",Config::htmlStyleSheet.data()); + Config::htmlStyleSheet.resize(0); // revert to the default + } + } +} + +//---------------------------------------------------------------------------- // Reads a file to a string. // The name of the file is written in front of the file's contents and // between 0x06 markers @@ -3970,7 +4363,7 @@ int readDir(QFileInfo *fi, } else { - fn = new FileName(name); + fn = new FileName(cfi->absFilePath(),name); fn->append(fd); if (fnList) fnList->inSort(fn); fnDict->insert(name,fn); @@ -4071,7 +4464,7 @@ int readFileOrDirectory(const char *s, } else { - fn = new FileName(name); + fn = new FileName(fi.absFilePath(),name); fn->append(fd); if (fnList) fnList->inSort(fn); fnDict->insert(name,fn); @@ -4133,10 +4526,12 @@ void usage(const char *name) msg("You can use doxygen in two ways:\n\n"); msg("1) Use doxygen to generate a template configuration file:\n"); msg(" %s [-s] -g [configName]\n\n",name); - msg(" if -s is specified the comments in the config file will be omitted.\n\n"); + msg(" If -s is specified the comments in the config file will be omitted.\n"); + msg(" If - is used for configName doxygen will write to standard output.\n\n"); msg("2) Use doxygen to generate documentation using an existing "); msg("configuration file:\n"); msg(" %s [configName]\n\n",name); + msg(" If - is used for configName doxygen will read from standard input.\n\n"); msg("If configName is omitted `Doxyfile' will be used as a default.\n\n"); exit(1); } @@ -4172,7 +4567,9 @@ int main(int argc,char **argv) const char *debugLabel; bool genConfig=FALSE; bool shortList=FALSE; - while (optindadd(new HtmlGenerator); HtmlGenerator::init(); if (Config::htmlHelpFlag) HtmlHelp::getInstance()->initialize(); + copyStyleSheet(); } if (Config::generateLatex) { @@ -4271,11 +4670,20 @@ int main(int argc,char **argv) s=Config::examplePath.first(); while (s) { - readFileOrDirectory(s,0,&exampleNameDict,0,&Config::filePatternList, - &Config::excludePatternList,0,0); + readFileOrDirectory(s,0,&exampleNameDict,0,&Config::examplePatternList, + 0,0,0); s=Config::examplePath.next(); } + msg("Searching for images...\n"); + s=Config::imagePath.first(); + while (s) + { + readFileOrDirectory(s,0,&imageNameDict,0,&Config::imagePatternList, + 0,0,0); + s=Config::imagePath.next(); + } + msg("Searching for files to exclude\n"); s=Config::excludeSources.first(); while (s) @@ -4361,6 +4769,7 @@ int main(int argc,char **argv) msg("Building namespace list...\n"); buildNamespaceList(root); + findUsingDirectives(root); msg("Building group list...\n"); buildGroupList(root); @@ -4431,6 +4840,9 @@ int main(int argc,char **argv) msg("Determining member group documentation...\n"); computeMemberGroupDocumentation(); + + msg("Adding source references...\n"); + addSourceReferences(); //unrelatedFunctionsUsed=hasUnrelatedFunctions(); @@ -4472,6 +4884,9 @@ int main(int argc,char **argv) msg("Generating file documentation...\n"); generateFileDocs(); + msg("Generating source listings...\n"); + generateSources(); + msg("Generating class documentation...\n"); generateClassDocs(); diff --git a/src/doxygen.h b/src/doxygen.h index d22d55a..c2b5e85 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -105,9 +105,11 @@ extern FileNameList inputNameList; extern FileNameDict includeNameDict; extern FileNameDict exampleNameDict; extern FileNameDict inputNameDict; +extern FileNameDict imageNameDict; extern FileList includeFiles; extern StringDict typedefDict; extern GroupList groupList; +extern GroupDict groupDict; extern NamespaceList namespaceList; extern NamespaceDict namespaceDict; extern FormulaList formulaList; @@ -125,5 +127,6 @@ extern int documentedGroups; extern int documentedNamespaces; extern int documentedNamespaceMembers; extern int documentedIncludeFiles; +extern QCString spaces; #endif diff --git a/src/doxytag.cpp b/src/doxytag.cpp new file mode 100644 index 0000000..34c0f18 --- /dev/null +++ b/src/doxytag.cpp @@ -0,0 +1,2760 @@ +#define yy_create_buffer tagYY_create_buffer +#define yy_delete_buffer tagYY_delete_buffer +#define yy_scan_buffer tagYY_scan_buffer +#define yy_scan_string tagYY_scan_string +#define yy_scan_bytes tagYY_scan_bytes +#define yy_flex_debug tagYY_flex_debug +#define yy_init_buffer tagYY_init_buffer +#define yy_flush_buffer tagYY_flush_buffer +#define yy_load_buffer_state tagYY_load_buffer_state +#define yy_switch_to_buffer tagYY_switch_to_buffer +#define yyin tagYYin +#define yyleng tagYYleng +#define yylex tagYYlex +#define yyout tagYYout +#define yyrestart tagYYrestart +#define yytext tagYYtext +#define yywrap tagYYwrap + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 51 +#define YY_END_OF_BUFFER 52 +static yyconst short int yy_accept[334] = + { 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, 0, 0, 0, 0, 0, + 0, 0, 52, 49, 50, 49, 8, 10, 8, 10, + 49, 29, 28, 27, 27, 27, 24, 30, 49, 32, + 40, 40, 34, 34, 39, 49, 49, 20, 49, 21, + 49, 18, 18, 18, 49, 46, 45, 46, 45, 14, + 47, 48, 13, 12, 12, 49, 0, 0, 0, 10, + 0, 0, 10, 0, 28, 27, 27, 27, 24, 30, + + 0, 0, 40, 40, 0, 0, 0, 0, 0, 21, + 0, 0, 18, 18, 18, 18, 0, 0, 0, 0, + 14, 48, 13, 12, 0, 9, 0, 0, 0, 0, + 0, 10, 0, 27, 27, 31, 0, 40, 0, 0, + 0, 37, 0, 0, 0, 18, 0, 0, 0, 0, + 0, 0, 0, 0, 3, 0, 1, 10, 0, 0, + 27, 27, 0, 40, 36, 35, 0, 0, 0, 0, + 18, 41, 0, 44, 43, 0, 0, 6, 0, 0, + 10, 0, 0, 27, 0, 0, 40, 0, 19, 0, + 0, 18, 42, 0, 0, 0, 0, 10, 0, 0, + + 0, 0, 0, 40, 38, 0, 16, 18, 11, 0, + 0, 0, 10, 0, 0, 0, 0, 0, 40, 0, + 18, 0, 0, 0, 10, 0, 0, 0, 0, 33, + 0, 18, 7, 0, 0, 4, 0, 23, 0, 0, + 0, 0, 17, 0, 0, 17, 17, 17, 18, 18, + 17, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 17, 0, 18, 18, 17, 0, 0, + 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, + 18, 0, 0, 0, 0, 0, 0, 0, 17, 17, + 0, 18, 0, 0, 0, 0, 0, 0, 17, 0, + + 17, 0, 17, 17, 18, 0, 0, 0, 0, 26, + 0, 0, 17, 0, 0, 17, 0, 0, 0, 25, + 0, 0, 0, 0, 5, 0, 0, 2, 0, 0, + 0, 22, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 5, 6, 7, 1, 5, 8, 1, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 17, + 19, 17, 17, 17, 17, 17, 17, 20, 21, 22, + 23, 24, 1, 25, 26, 26, 27, 26, 26, 28, + 26, 26, 29, 26, 26, 26, 26, 26, 26, 26, + 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, + 9, 1, 10, 5, 31, 1, 32, 33, 34, 35, + + 36, 37, 38, 39, 40, 26, 26, 41, 42, 43, + 44, 45, 26, 46, 47, 48, 26, 26, 49, 50, + 51, 26, 1, 52, 1, 53, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[54] = + { 0, + 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, + 1, 3, 1, 3, 3, 2, 4, 4, 4, 5, + 1, 6, 2, 1, 2, 7, 7, 7, 7, 7, + 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 1, 8 + } ; + +static yyconst short int yy_base[356] = + { 0, + 980, 979, 0, 32, 52, 53, 75, 128, 181, 0, + 234, 287, 55, 56, 340, 0, 393, 0, 446, 0, + 497, 0, 65, 67, 550, 0, 54, 61, 603, 656, + 68, 70, 98, 99, 709, 0, 762, 0, 815, 0, + 90, 91, 981, 1136, 1136, 0, 71, 0, 78, 937, + 946, 1136, 0, 0, 935, 934, 0, 0, 71, 1136, + 0, 925, 1136, 28, 1136, 933, 932, 1136, 935, 0, + 101, 71, 101, 0, 950, 1136, 1136, 123, 1136, 0, + 1136, 0, 0, 0, 0, 949, 943, 959, 915, 0, + 90, 920, 920, 954, 0, 0, 925, 915, 0, 0, + + 931, 905, 0, 916, 903, 902, 908, 899, 943, 0, + 911, 923, 103, 113, 0, 123, 912, 901, 893, 892, + 0, 0, 0, 0, 894, 1136, 895, 901, 118, 932, + 910, 889, 126, 875, 882, 1136, 871, 870, 894, 893, + 877, 1136, 0, 868, 893, 124, 884, 862, 885, 884, + 858, 871, 877, 867, 1136, 864, 1136, 850, 854, 848, + 846, 888, 838, 845, 1136, 1136, 826, 849, 820, 675, + 216, 1136, 685, 1136, 1136, 669, 662, 1136, 662, 661, + 661, 667, 662, 693, 666, 652, 646, 657, 1136, 641, + 667, 125, 1136, 666, 653, 648, 655, 638, 638, 645, + + 646, 638, 635, 626, 1136, 620, 1136, 118, 1136, 630, + 614, 604, 603, 602, 625, 610, 607, 616, 593, 606, + 208, 631, 593, 588, 630, 609, 624, 586, 586, 0, + 583, 867, 1136, 597, 595, 1136, 611, 1136, 579, 502, + 524, 919, 252, 233, 619, 631, 1136, 965, 232, 263, + 874, 512, 539, 508, 497, 506, 535, 877, 503, 502, + 495, 488, 487, 119, 496, 226, 228, 0, 497, 494, + 489, 493, 485, 1136, 486, 477, 480, 503, 502, 474, + 269, 478, 475, 511, 473, 481, 478, 491, 103, 255, + 489, 270, 456, 497, 497, 304, 301, 286, 294, 295, + + 298, 291, 307, 320, 283, 293, 304, 287, 289, 1136, + 288, 269, 312, 236, 235, 271, 234, 0, 227, 1136, + 209, 228, 225, 155, 1136, 139, 129, 1136, 106, 117, + 108, 1136, 1136, 1018, 1026, 1034, 1042, 1050, 1058, 65, + 1063, 1068, 1072, 1077, 1081, 1085, 1089, 1094, 1100, 1105, + 58, 1109, 1117, 1124, 1128 + } ; + +static yyconst short int yy_def[356] = + { 0, + 334, 334, 333, 3, 334, 334, 335, 335, 333, 9, + 336, 336, 334, 334, 333, 15, 333, 17, 333, 19, + 334, 21, 334, 334, 333, 25, 334, 334, 337, 337, + 334, 334, 338, 338, 333, 35, 333, 37, 333, 39, + 339, 339, 333, 333, 333, 340, 333, 341, 333, 341, + 333, 333, 342, 343, 343, 343, 344, 345, 333, 333, + 346, 346, 333, 333, 333, 333, 333, 333, 333, 347, + 333, 348, 348, 349, 333, 333, 333, 333, 333, 350, + 333, 351, 352, 353, 353, 333, 340, 333, 333, 341, + 333, 333, 341, 333, 342, 343, 343, 343, 344, 345, + + 333, 333, 346, 346, 333, 333, 333, 333, 333, 347, + 333, 333, 348, 348, 349, 348, 333, 333, 333, 333, + 350, 351, 352, 353, 333, 333, 333, 333, 333, 333, + 333, 341, 333, 343, 343, 333, 333, 346, 333, 333, + 333, 333, 354, 333, 333, 348, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 341, 333, 333, + 343, 343, 333, 346, 333, 333, 333, 354, 333, 333, + 348, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 341, 333, 333, 343, 333, 333, 346, 333, 333, 333, + 333, 348, 333, 333, 333, 333, 333, 341, 333, 333, + + 333, 333, 333, 346, 333, 333, 333, 348, 333, 333, + 333, 333, 341, 333, 333, 333, 333, 333, 346, 333, + 348, 333, 333, 333, 341, 333, 333, 333, 333, 346, + 333, 348, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 348, 333, 348, 348, 348, + 349, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 348, 333, 348, 348, 349, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 348, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 348, 333, 333, 333, 333, 333, 333, 333, 333, + + 333, 333, 333, 333, 348, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 355, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 0, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333 + } ; + +static yyconst short int yy_nxt[1190] = + { 0, + 44, 44, 45, 44, 44, 44, 44, 46, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 47, 44, 44, 44, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 44, 44, 49, 45, 45, 45, 45, 45, 71, + 50, 52, 52, 45, 122, 105, 71, 68, 106, 68, + 45, 87, 45, 51, 51, 44, 44, 45, 44, 44, + 44, 52, 44, 44, 44, 44, 69, 44, 69, 75, + 44, 75, 85, 85, 44, 44, 44, 44, 44, 44, + + 77, 77, 88, 101, 111, 78, 78, 129, 130, 88, + 300, 86, 86, 332, 114, 89, 91, 102, 92, 79, + 79, 154, 89, 115, 112, 301, 44, 44, 44, 44, + 45, 44, 44, 44, 52, 44, 44, 44, 44, 331, + 44, 155, 330, 44, 114, 116, 114, 44, 44, 44, + 44, 44, 44, 115, 118, 115, 114, 116, 146, 159, + 119, 221, 114, 120, 160, 115, 114, 114, 114, 171, + 115, 115, 208, 313, 329, 115, 115, 115, 328, 44, + 44, 44, 44, 45, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 54, 54, 54, + + 44, 44, 44, 44, 44, 44, 54, 55, 56, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 44, 44, 44, 44, 45, 44, 44, 44, + 44, 44, 44, 44, 44, 303, 44, 192, 301, 44, + 327, 114, 116, 232, 44, 44, 44, 44, 44, 114, + 115, 247, 302, 247, 261, 247, 281, 266, 115, 114, + 262, 114, 326, 263, 247, 114, 264, 303, 115, 324, + 115, 316, 323, 322, 115, 44, 44, 44, 44, 45, + 44, 44, 44, 44, 44, 44, 44, 44, 267, 44, + + 321, 312, 44, 247, 292, 300, 114, 44, 44, 44, + 44, 44, 114, 114, 302, 115, 313, 305, 264, 312, + 301, 115, 115, 247, 320, 319, 114, 318, 317, 303, + 316, 315, 314, 311, 313, 115, 310, 309, 44, 44, + 44, 44, 45, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 58, 58, 58, 44, + 44, 44, 44, 44, 44, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 44, 44, 44, 44, 45, 44, 44, 44, 44, + + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 59, 44, 44, 44, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 44, 60, 44, 44, 45, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 61, 61, 61, 44, 44, 44, 44, 44, + 44, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, + 61, 61, 61, 61, 61, 61, 61, 44, 44, 45, + + 308, 63, 307, 306, 64, 63, 63, 63, 63, 304, + 63, 299, 63, 298, 297, 296, 295, 294, 65, 63, + 293, 291, 290, 289, 288, 247, 287, 286, 285, 284, + 283, 66, 282, 280, 279, 278, 277, 276, 275, 67, + 274, 273, 272, 271, 270, 269, 257, 256, 63, 63, + 44, 44, 45, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 70, 70, 70, 44, + 44, 44, 44, 44, 44, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + + 70, 44, 44, 44, 44, 45, 44, 44, 44, 44, + 44, 44, 44, 44, 255, 44, 254, 253, 44, 252, + 241, 240, 239, 44, 44, 44, 44, 44, 247, 238, + 247, 237, 247, 236, 235, 234, 233, 231, 230, 136, + 247, 247, 264, 229, 264, 228, 73, 227, 226, 225, + 224, 223, 222, 247, 44, 74, 44, 44, 45, 44, + 44, 44, 44, 44, 44, 44, 44, 220, 44, 219, + 247, 44, 218, 217, 114, 216, 44, 44, 44, 44, + 44, 215, 247, 115, 214, 213, 212, 211, 210, 209, + 207, 206, 205, 204, 203, 202, 201, 200, 199, 73, + + 198, 197, 196, 195, 194, 193, 191, 44, 74, 44, + 44, 45, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 80, 80, 80, 44, 44, + 44, 44, 44, 44, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 44, 44, 44, 44, 45, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 81, 44, 82, 82, 82, + 82, 82, 44, 82, 82, 82, 82, 82, 82, 82, + + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 44, 44, 44, 44, 45, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 83, 83, 83, 83, 44, 44, 44, 44, 44, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 44, 83, 242, 190, + 242, 243, 189, 188, 244, 245, 187, 243, 246, 247, + 248, 186, 243, 247, 265, 268, 247, 268, 247, 243, + 247, 185, 184, 183, 182, 181, 247, 180, 179, 247, + + 178, 249, 177, 176, 175, 174, 173, 172, 170, 250, + 114, 169, 167, 166, 165, 164, 163, 162, 243, 251, + 242, 161, 242, 243, 158, 247, 244, 245, 247, 243, + 243, 247, 258, 157, 243, 156, 153, 152, 151, 150, + 149, 243, 148, 147, 145, 144, 143, 142, 141, 140, + 139, 138, 137, 259, 136, 135, 134, 133, 132, 131, + 128, 260, 127, 126, 125, 117, 109, 108, 107, 104, + 243, 243, 265, 98, 247, 97, 264, 94, 264, 93, + 333, 45, 45, 333, 333, 333, 333, 247, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + + 333, 333, 333, 333, 333, 333, 333, 333, 114, 333, + 333, 333, 333, 333, 333, 333, 247, 115, 44, 44, + 44, 44, 44, 44, 44, 44, 53, 53, 53, 53, + 53, 53, 53, 53, 57, 57, 57, 57, 57, 57, + 57, 57, 72, 72, 72, 72, 72, 72, 72, 72, + 76, 76, 76, 76, 76, 76, 76, 76, 84, 84, + 84, 84, 84, 84, 84, 84, 90, 333, 333, 90, + 95, 95, 333, 333, 95, 96, 333, 333, 96, 99, + 99, 99, 333, 99, 100, 333, 333, 100, 103, 333, + 333, 103, 110, 333, 333, 110, 113, 113, 113, 333, + + 113, 113, 115, 115, 115, 333, 115, 115, 121, 333, + 333, 121, 123, 123, 333, 123, 123, 124, 124, 124, + 124, 124, 333, 124, 124, 168, 168, 168, 168, 333, + 168, 325, 333, 333, 325, 43, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333 + } ; + +static yyconst short int yy_chk[1190] = + { 0, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 4, 5, 6, 27, 13, 14, 27, + 4, 13, 14, 28, 351, 64, 28, 23, 64, 24, + 31, 340, 32, 5, 6, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 23, 7, 24, 31, + 7, 32, 41, 42, 7, 7, 7, 7, 7, 7, + + 33, 34, 47, 59, 71, 33, 34, 91, 91, 49, + 289, 41, 42, 331, 72, 47, 49, 59, 49, 33, + 34, 129, 49, 72, 71, 289, 7, 7, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 330, + 8, 129, 329, 8, 73, 73, 113, 8, 8, 8, + 8, 8, 8, 73, 78, 113, 114, 114, 116, 133, + 78, 208, 264, 78, 133, 114, 116, 146, 192, 146, + 208, 264, 192, 327, 326, 116, 146, 192, 324, 8, + 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 323, 11, 171, 322, 11, + 321, 221, 221, 221, 11, 11, 11, 11, 11, 171, + 221, 243, 290, 243, 244, 243, 266, 249, 171, 266, + 244, 267, 319, 244, 243, 249, 267, 290, 266, 317, + 267, 316, 315, 314, 249, 11, 11, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 250, 12, + + 312, 299, 12, 243, 281, 301, 250, 12, 12, 12, + 12, 12, 281, 292, 303, 250, 299, 292, 305, 313, + 301, 281, 292, 311, 309, 308, 305, 307, 306, 303, + 304, 302, 300, 298, 313, 305, 297, 296, 12, 12, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 17, 17, 17, 17, 17, 17, 17, + + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 21, + + 295, 21, 294, 293, 21, 21, 21, 21, 21, 291, + 21, 288, 21, 287, 286, 285, 284, 283, 21, 21, + 282, 280, 279, 278, 277, 276, 275, 273, 272, 271, + 270, 21, 269, 265, 263, 262, 261, 260, 259, 21, + 257, 256, 255, 254, 253, 252, 241, 240, 21, 21, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + + 25, 25, 25, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 239, 29, 237, 235, 29, 234, + 231, 229, 228, 29, 29, 29, 29, 29, 245, 227, + 245, 226, 245, 225, 224, 223, 222, 220, 219, 218, + 246, 245, 246, 217, 246, 216, 29, 215, 214, 213, + 212, 211, 210, 246, 29, 29, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 206, 30, 204, + 245, 30, 203, 202, 246, 201, 30, 30, 30, 30, + 30, 200, 246, 246, 199, 198, 197, 196, 195, 194, + 191, 190, 188, 187, 186, 185, 184, 183, 182, 30, + + 181, 180, 179, 177, 176, 173, 170, 30, 30, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 232, 169, + 232, 232, 168, 167, 232, 232, 164, 232, 232, 232, + 232, 163, 232, 251, 258, 251, 258, 251, 258, 232, + 258, 162, 161, 160, 159, 158, 251, 156, 154, 258, + + 153, 232, 152, 151, 150, 149, 148, 147, 145, 232, + 232, 144, 141, 140, 139, 138, 137, 135, 232, 232, + 242, 134, 242, 242, 132, 251, 242, 242, 258, 242, + 242, 242, 242, 131, 242, 130, 128, 127, 125, 120, + 119, 242, 118, 117, 112, 111, 109, 108, 107, 106, + 105, 104, 102, 242, 101, 98, 97, 94, 93, 92, + 89, 242, 88, 87, 86, 75, 69, 67, 66, 62, + 242, 242, 248, 56, 248, 55, 248, 51, 248, 50, + 43, 2, 1, 0, 0, 0, 0, 248, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 248, 0, + 0, 0, 0, 0, 0, 0, 248, 248, 334, 334, + 334, 334, 334, 334, 334, 334, 335, 335, 335, 335, + 335, 335, 335, 335, 336, 336, 336, 336, 336, 336, + 336, 336, 337, 337, 337, 337, 337, 337, 337, 337, + 338, 338, 338, 338, 338, 338, 338, 338, 339, 339, + 339, 339, 339, 339, 339, 339, 341, 0, 0, 341, + 342, 342, 0, 0, 342, 343, 0, 0, 343, 344, + 344, 344, 0, 344, 345, 0, 0, 345, 346, 0, + 0, 346, 347, 0, 0, 347, 348, 348, 348, 0, + + 348, 348, 349, 349, 349, 0, 349, 349, 350, 0, + 0, 350, 352, 352, 0, 352, 352, 353, 353, 353, + 353, 353, 0, 353, 353, 354, 354, 354, 354, 0, + 354, 355, 0, 0, 355, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, + 333, 333, 333, 333, 333, 333, 333, 333, 333 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "doxytag.l" +#define INITIAL 0 +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +#line 18 "doxytag.l" +/* + * includes + */ +#include +#include +#include +#include + +#include "qtbc.h" +#include +#include +#include +#include +#include +#include + +#include "version.h" +#include "suffixtree.h" +#include "searchindex.h" +#include "logos.h" + +struct MemberDef +{ + QCString name; + QCString anchor; + QCString args; +}; + +struct ClassDef +{ + QCString name; + QStrList bases; + QCString fileName; + bool isFile; + QList memberList; +}; + +QList classList; +QDict classDict(1009); +QList fileList; +QDict fileDict(1009); + +static bool genTag; +static bool genIndex; + +static QStrList bases; +static QCString inputString; +static int inputPosition; +static QCString yyFileName; +static int yyLineNr; +static QCString classFile; +static QCString memberRef; +static QCString memberName; +static QCString memberArgs; +static QCString className; +//static bool newClass; +static QCString docBaseLink; +static QCString docAnchor; +static QCString docRefName; +static bool nameBug; +static SearchIndex searchIndex; + +#define YY_NEVER_INTERACTIVE 1 + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +static void addClass(const char *clName) +{ + if (classDict[clName]==0) + { + ClassDef *cd=new ClassDef; + cd->name=clName; + cd->fileName=yyFileName; + cd->isFile=FALSE; + classList.append(cd); + classDict.insert(clName,cd); + } +} + +static void addFile(const char *fName) +{ + if (classDict[fName]==0) + { + ClassDef *fd=new ClassDef; + fd->name=fName; + fd->fileName=yyFileName; + fd->isFile=TRUE; + classList.append(fd); + classDict.insert(fName,fd); + } +} + +static void addBases(const char *clName) +{ + ClassDef *cd=0; + if (clName && (cd=classDict[clName])) cd->bases=bases; +} + +static void addMember(const char *memName,const char *memRef,const char *memArgs) +{ + ClassDef *cd=classList.last(); + MemberDef *md; + md=new MemberDef; + md->name=memName; + md->anchor=memRef; + md->args=memArgs; + cd->memberList.append(md); +} + +static void addReference() +{ + //printf("addReference() key: %s ref:%s\n", + // docRefName.data(),(docBaseLink+"#"+docAnchor).data()); + if (genIndex && docRefName.length()>0 && docBaseLink.length()>0) + { + if (docAnchor.length()==0) + searchIndex.addReference(docRefName,docBaseLink); + else + searchIndex.addReference(docRefName,docBaseLink+"#"+docAnchor); + searchIndex.addWord(docRefName,docRefName,TRUE); + } +} + +QCString unhtmlify(const char *str) +{ + QCString result; + const char *p=str; + char c; + while ((c=*p)!='\0') + { + if (c!='&') { result+=c; p++; } + else + { + if (strncmp(p,"&",5)==0) { result+='&'; p+=5; } + else if (strncmp(p,"<",4)==0) { result+='<'; p+=4; } + else if (strncmp(p,">",4)==0) { result+='>'; p+=4; } + else /* should not happen */ { result+='&'; p++; } + } + } + return result; +} + +#define Start 1 + +#define SearchClassFile 2 + +#define ReadClassFile 3 + +#define CheckClassName 4 + +#define ReadClassName 5 + +#define SearchMemberRef 6 + +#define ReadMemberRef 7 + +#define SearchMemberName 8 + +#define ReadMemberName 9 + +#define ReadOperator 10 + +#define SearchBaseClasses 11 + +#define ReadBaseClass 12 + +#define SearchRefName 13 + +#define ReadRefName 14 + +#define SearchArgs 15 + +#define ReadArgs 16 + +#define SearchWords 17 + +#define SkipHTMLTag 18 + +#define CheckConstructor 19 + +#define SkipPreformated 20 + + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + yy_current_buffer->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 197 "doxytag.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 334 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 1136 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 199 "doxytag.l" +{ + BEGIN( SearchClassFile ); + } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 202 "doxytag.l" +{ // Qt variant + BEGIN( ReadClassName ); + } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 205 "doxytag.l" +{ // Doxygen variant + BEGIN( ReadClassName ); + } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 208 "doxytag.l" +{ + //printf("Inherits found\n"); + BEGIN( SearchBaseClasses ); + } + YY_BREAK +case 5: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 15; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 212 "doxytag.l" +{ // needed due to inconsistency in the Qt docs + BEGIN( CheckConstructor ); + } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 215 "doxytag.l" +{ + BEGIN( SkipPreformated ); + } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 218 "doxytag.l" +{ + BEGIN( SearchWords ); + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 221 "doxytag.l" +{ + BEGIN( SkipHTMLTag ); + } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 224 "doxytag.l" + + YY_BREAK +case 10: +YY_RULE_SETUP +#line 225 "doxytag.l" +{ + //printf("tag: %s#%s ref: %s word: `%s'\n", + // docBaseLink.data(),docAnchor.data(), + // docRefName.data(),yytext); + if (genIndex && docRefName.length()>0 && yyleng>2) + searchIndex.addWord(docRefName, + yytext,FALSE + ); + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 234 "doxytag.l" +{ + BEGIN( Start ); + } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 237 "doxytag.l" + + YY_BREAK +case 13: +YY_RULE_SETUP +#line 238 "doxytag.l" +{ + QCString s=yytext; + if (s.find("::")!=-1) + { + docRefName=yytext; + addReference(); + nameBug=TRUE; + } + else + { + nameBug=FALSE; + } + BEGIN( Start ); + } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 252 "doxytag.l" +{ + docAnchor = yytext; + if (docAnchor=="details" || + docAnchor=="_details") + { + docRefName=className.copy(); + addReference(); + BEGIN( Start ); + } + else + { + BEGIN( SearchRefName ); + } + } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 266 "doxytag.l" +{ + BEGIN( ReadRefName ); + } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 269 "doxytag.l" +{ + if (nameBug) + BEGIN( Start ); + else + BEGIN( ReadRefName ); + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 276 "doxytag.l" +{ // hmm, looks impressive :-) + docRefName=unhtmlify(yytext); + addReference(); + BEGIN( Start ); + } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 281 "doxytag.l" +{ + //printf("ReadRef=%s\n",yytext); + docRefName=yytext; + addReference(); + BEGIN( Start ); + } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 287 "doxytag.l" +{ + //printf("Search %s\n",yytext); + BEGIN( ReadBaseClass ); + } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 291 "doxytag.l" +{ + addBases(className); + BEGIN( Start ); + } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 295 "doxytag.l" +{ + bases.append(yytext); + BEGIN( SearchBaseClasses ); + } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 299 "doxytag.l" +{ + BEGIN( ReadClassFile ); + } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 302 "doxytag.l" +{ + BEGIN( ReadClassFile ); + } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 305 "doxytag.l" +{ + className=yytext; + BEGIN( CheckClassName); + } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 309 "doxytag.l" +{ + //printf("className=%s\n",className.data()); + addClass(className); + BEGIN( Start ); + } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 314 "doxytag.l" +{ + //printf("className=%s\n",className.data()); + addFile(className); + BEGIN( Start ); + } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 319 "doxytag.l" +{ // not a class file + className.resize(0); + BEGIN( Start ); + } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 323 "doxytag.l" +{ + classFile=yytext; + BEGIN( SearchMemberRef ); + } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 327 "doxytag.l" +{ + if (YY_START==ReadClassFile) + { + classFile=yyFileName; + } + BEGIN( ReadMemberRef ); + } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 334 "doxytag.l" +{ + memberRef=yytext; + BEGIN( SearchMemberName ); + } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 338 "doxytag.l" +{ // is for qt-1.44, is for qt-2.00 + BEGIN( ReadMemberName ); + } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 341 "doxytag.l" +{ + unput(*yytext); + BEGIN( ReadMemberName ); + } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 345 "doxytag.l" +{ + memberName="operator"; + BEGIN( ReadOperator ); + } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 349 "doxytag.l" +{ memberName+=*yytext; } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 350 "doxytag.l" +{ memberName+="<"; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 351 "doxytag.l" +{ memberName+=">"; } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 352 "doxytag.l" +{ memberName+=" new"; } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 353 "doxytag.l" +{ memberName+=" delete"; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 354 "doxytag.l" +{ BEGIN( SearchArgs ); } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 355 "doxytag.l" +{ + memberName=yytext; + BEGIN( SearchArgs ); + } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 359 "doxytag.l" +{ + //printf("SearchArg className=%s memberName=%s\n",className.data(),memberName.data()); + if (className.length()>0 && memberName.length()>0) + BEGIN( ReadArgs ); + else + BEGIN( Start ); + } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 366 "doxytag.l" +{ memberArgs+="&"; } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 367 "doxytag.l" +{ memberArgs+="<"; } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 368 "doxytag.l" +{ memberArgs+=">"; } + YY_BREAK +/* +[{}] { // handle enums + memberArgs.resize(0); + addMember(memberName,memberRef,memberArgs); + if (*yytext=='}') + BEGIN( Start ); + else + BEGIN( SearchClassFile ); + } + */ +case 45: +YY_RULE_SETUP +#line 379 "doxytag.l" +{ + //printf("adding member %s\n",memberName.data()); + memberArgs=memberArgs.stripWhiteSpace(); + //if (newClass) + //{ + // newClass=FALSE; + // addClass(className); + //} + addMember(memberName,memberRef,memberArgs); + memberArgs.resize(0); + if (*yytext=='<') + BEGIN( SkipHTMLTag); + else + BEGIN( Start ); + } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 394 "doxytag.l" +{ memberArgs+=(*yytext)&0x7f; } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 395 "doxytag.l" +{ BEGIN( Start ); } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 396 "doxytag.l" + + YY_BREAK +case 49: +YY_RULE_SETUP +#line 397 "doxytag.l" + + YY_BREAK +case 50: +YY_RULE_SETUP +#line 398 "doxytag.l" +{ yyLineNr++; + if (YY_START!=SkipHTMLTag) BEGIN( Start ); + } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 402 "doxytag.l" +ECHO; + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(Start): +case YY_STATE_EOF(SearchClassFile): +case YY_STATE_EOF(ReadClassFile): +case YY_STATE_EOF(CheckClassName): +case YY_STATE_EOF(ReadClassName): +case YY_STATE_EOF(SearchMemberRef): +case YY_STATE_EOF(ReadMemberRef): +case YY_STATE_EOF(SearchMemberName): +case YY_STATE_EOF(ReadMemberName): +case YY_STATE_EOF(ReadOperator): +case YY_STATE_EOF(SearchBaseClasses): +case YY_STATE_EOF(ReadBaseClass): +case YY_STATE_EOF(SearchRefName): +case YY_STATE_EOF(ReadRefName): +case YY_STATE_EOF(SearchArgs): +case YY_STATE_EOF(ReadArgs): +case YY_STATE_EOF(SearchWords): +case YY_STATE_EOF(SkipHTMLTag): +case YY_STATE_EOF(CheckConstructor): +case YY_STATE_EOF(SkipPreformated): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 334 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 334 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 333); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + yy_current_buffer->yy_at_bol = (c == '\n'); + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 402 "doxytag.l" + + +/*@ ---------------------------------------------------------------------------- + */ + + +void parse(QCString &s) +{ + bases.clear(); + nameBug = FALSE; + //newClass = TRUE; + inputString = s; + inputPosition = 0; + yyLineNr = 0; + tagYYrestart( tagYYin ); + BEGIN( Start ); + tagYYlex(); + //printf("Number of lines scanned: %d\n",yyLineNr); +} + +void parseFile(QFileInfo &fi) +{ + fprintf(stderr,"Parsing file %s...\n",fi.fileName().data()); + QFile f(fi.absFilePath()); + if (f.open(IO_ReadOnly)) + { + yyFileName = fi.fileName(); + className.resize(0); + memberName.resize(0); + //printf("Parsing file %s...\n",fi.fileName().data()); + QCString input(fi.size()+1); + docBaseLink=fi.fileName(); + docRefName=fi.fileName().copy(); + searchIndex.addReference(docRefName,docBaseLink); + searchIndex.addWord(docRefName,docRefName,TRUE); + f.readBlock(input.data(),fi.size()); + input.at(fi.size())='\0'; + parse(input); + } + else + { + fprintf(stderr,"Warning: Cannot open file %s\n",fi.fileName().data()); + } +} + +void parseFileOrDir(const char *fileName) +{ + QFileInfo fi(fileName); + if (fi.exists()) + { + if (fi.isFile()) + { + parseFile(fi); + } + else if (fi.isDir()) + { + QDir dir(fileName); + dir.setFilter( QDir::Files ); + dir.setNameFilter( "*.html" ); + const QFileInfoList *list = dir.entryInfoList(); + QFileInfoListIterator it( *list ); + QFileInfo *cfi; + for ( it.toFirst() ; (cfi=it.current()) ; ++it) + { + if (cfi->isFile()) + { + parseFile(*cfi); + } + } + } + } + else + { + fprintf(stderr,"Warning: File %s does not exist\n",fileName); + } +} + +void usage(const char *name) +{ + fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-1999\n\n", + versionString); + fprintf(stderr," Generates a tag file and/or a search index for a set of HTML files\n\n"); + fprintf(stderr,"Usage: %s [-t tag_file] [-s index_file] [ html_file [html_file...] ]\n",name); + fprintf(stderr,"Options:\n"); + fprintf(stderr," -t Generate tag file .\n"); + fprintf(stderr," -s Generate search index .\n\n"); + fprintf(stderr,"If no HTML files are given all files in the current dir that\n" + "have a .html extension are parsed.\n\n"); + exit(1); +} + +const char *getArg(int argc,char **argv,int &optind,const char c) +{ + char *s=0; + if (strlen(&argv[optind][2])>0) + s=&argv[optind][2]; + else if (optind+10; + genIndex = indexName.length()>0; + + if (!genTag && !genIndex) + { + fprintf(stderr,"Nothing to do !\n\n"); + usage(argv[0]); + } + + int i; + if (optind>=argc) + { + parseFileOrDir("."); + } + else + { + for (i=optind;iError: $DOXYSEARCH not found. Check cgi script!\"" << endl + << "fi" << endl; + f.close(); + } + else + { + fprintf(stderr,"Error: could not open file %s for writing\n",(dir+"/search.cgi").data()); + } + } + } + } + if (genTag) + { + QFile f(tagName); + if (f.open(IO_WriteOnly)) + { + QTextStream t(&f); + ClassDef *cd=classList.first(); + while (cd) + { + if (cd->isFile) t << "&"; else t << ">"; + t << cd->name << ":"; + char *base=cd->bases.first(); + while (base) + { + t << base << "?"; + base=cd->bases.next(); + } + if (!cd->isFile) t << " \"" << cd->fileName << "\""; + t << endl; + MemberDef *md=cd->memberList.first(); + while (md) + { + t << md->name << " " << md->anchor << " \"" << md->args << "\"" << endl; + md=cd->memberList.next(); + } + cd=classList.next(); + } + } + else + { + fprintf(stderr,"Error: Could not write tag file %s\n",tagName.data()); + } + } + return 0; +} + +extern "C" { +int tagYYwrap() { return 1 ; } +}; diff --git a/src/doxytag.l b/src/doxytag.l index e56abed..b43466d 100644 --- a/src/doxytag.l +++ b/src/doxytag.l @@ -25,10 +25,10 @@ #include "qtbc.h" #include -#include +#include #include #include -#include +#include #include #include "version.h" diff --git a/src/entry.cpp b/src/entry.cpp index e66e584..5563fcf 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -65,6 +65,7 @@ Entry::Entry(const Entry &e) fileName = e.fileName.copy(); startLine = e.startLine; mGrpId = e.mGrpId; + bodyLine = e.bodyLine; inLine = e.inLine; sublist = new QList; sublist->setAutoDelete(TRUE); @@ -191,7 +192,7 @@ void Entry::reset() args.resize(0); exception.resize(0); program.resize(0); - body.resize(0); + //body.resize(0); includeFile.resize(0); includeName.resize(0); doc.resize(0); @@ -201,6 +202,7 @@ void Entry::reset() fileName.resize(0); scopeSpec.resize(0); memberSpec.resize(0); + bodyLine = -1; mGrpId = -1; section = EMPTY_SEC; sig = FALSE; @@ -228,7 +230,7 @@ int Entry::getSize() size+=args.length()+1; size+=exception.length()+1; size+=program.length()+1; - size+=body.length()+1; + //size+=body.length()+1; size+=includeFile.length()+1; size+=includeName.length()+1; size+=doc.length()+1; diff --git a/src/entry.h b/src/entry.h index faf54bb..a6899c5 100644 --- a/src/entry.h +++ b/src/entry.h @@ -108,6 +108,7 @@ class Entry INTERFACE_SEC = 0x04000000, INTERFACEDOC_SEC = 0x08000000, MAINPAGEDOC_SEC = 0x10000000, + USINGDIR_SEC = 0x20000000, COMPOUND_MASK = CLASS_SEC | STRUCT_SEC | UNION_SEC | INTERFACE_SEC, COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC | INTERFACEDOC_SEC, SCOPE_MASK = COMPOUND_MASK | NAMESPACE_SEC, @@ -140,7 +141,8 @@ class Entry QCString scopeSpec; // template specialization of the scope QCString memberSpec; // template specialization of the member QCString program; // the program text - QCString body; // the function body + //QCString body; // the function body + int bodyLine; // line number of the definition in the source QCString includeFile; // include file (2 arg of \class, must be unique) QCString includeName; // include name (3 arg of \class) QCString doc; // documentation block (partly parsed) diff --git a/src/example.h b/src/example.h index b43733f..0c3fcb2 100644 --- a/src/example.h +++ b/src/example.h @@ -18,6 +18,7 @@ #define EXAMPLE_H #include "qtbc.h" +#include class ClassDef; class MemberName; @@ -40,6 +41,10 @@ class ExampleList : public QList } }; -typedef QDict ExampleDict; +class ExampleDict : public QDict +{ + public: + ExampleDict(int size=17) : QDict(size) {} +}; #endif diff --git a/src/filedef.cpp b/src/filedef.cpp index d4caa71..a941e71 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -26,6 +26,7 @@ #include "namespacedef.h" #include "util.h" #include "language.h" +#include "outputlist.h" /*! create a new file definition, where \a p is the file path, \a the file name, and \a ref is an HTML anchor name if the @@ -45,6 +46,9 @@ FileDef::FileDef(const char *p,const char *nm,const char *ref) defineList = new DefineList; namespaceList = new NamespaceList; namespaceDict = new NamespaceDict(7); + srcDefDict = 0; + srcAnchorDict = 0; + usingList = 0; } /*! destroy the file definition */ @@ -56,6 +60,9 @@ FileDef::~FileDef() delete defineList; delete namespaceList; delete namespaceDict; + delete srcDefDict; + delete srcAnchorDict; + delete usingList; } /*! Compute the HTML anchor names for all members in the class */ @@ -195,7 +202,7 @@ void FileDef::writeDocumentation(OutputList &ol) //doc=doc.stripWhiteSpace(); //int bl=brief.length(); //int dl=doc.length(); - if (!briefDescription().isEmpty() || !documentation().isEmpty()) + if (!briefDescription().isEmpty() || !documentation().isEmpty() || bodyLine!=-1) { ol.writeRuler(); bool latexOn = ol.isEnabled(OutputGenerator::Latex); @@ -208,6 +215,9 @@ void FileDef::writeDocumentation(OutputList &ol) if (!briefDescription().isEmpty()) { ol+=briefOutput; + } + if (!briefDescription().isEmpty() && !documentation().isEmpty()) + { ol.newParagraph(); } if (!documentation().isEmpty()) @@ -215,7 +225,21 @@ void FileDef::writeDocumentation(OutputList &ol) //if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?') // doc+='.'; parseDoc(ol,0,0,documentation()+"\n"); + } + //printf("Writing source ref for file %s\n",name().data()); + if (Config::sourceBrowseFlag) + { ol.newParagraph(); + QCString refText = theTranslator->trDefinedInSourceFile(); + int fileMarkerPos = refText.find("@0"); + if (fileMarkerPos!=-1) // should always pass this. + { + parseText(ol,refText.left(fileMarkerPos)); //text left from marker 1 + ol.writeObjectLink(0,sourceName(), + 0,name()); + parseText(ol,refText.right( + refText.length()-fileMarkerPos-2)); // text right from marker 2 + } } } @@ -294,6 +318,23 @@ void FileDef::writeDocumentation(OutputList &ol) endFile(ol); } +/*! Write a source listing of this file to the output */ +void FileDef::writeSource(OutputList &ol) +{ + ol.disableAllBut(OutputGenerator::Html); + startFile(ol,sourceName(),name()+" Source File"); + startTitle(ol,0); + parseText(ol,name()); + endTitle(ol,0,0); + //parseText(ol,theTranslator->trVerbatimText(incFile->name())); + //ol.writeRuler(); + ol.startCodeFragment(); + parseCode(ol,name(),fileToString(absFilePath()),FALSE,0,this); + ol.endCodeFragment(); + endFile(ol); + ol.enableAll(); +} + /*! Adds member definition \a md to the list of all members of this file */ void FileDef::insertMember(MemberDef *md) { @@ -316,6 +357,53 @@ void FileDef::insertNamespace(NamespaceDef *nd) } } +void FileDef::addSourceRef(int line,Definition *d,const char *anchor) +{ + if (d) + { + if (srcDefDict==0) srcDefDict = new QIntDict(257); + if (srcAnchorDict==0) + { + srcAnchorDict = new QIntDict(257); + srcAnchorDict->setAutoDelete(TRUE); + } + srcDefDict->insert(line,d); + srcAnchorDict->insert(line,new QCString(anchor)); + //printf("Adding member %s with anchor %s at line %d to file %s\n", + // d->name().data(),anchor,line,name().data()); + } +} + +Definition *FileDef::getSourceDefinition(int lineNr) +{ + Definition *result=0; + if (srcDefDict) + { + result = srcDefDict->find(lineNr); + } + return result; +} + +QCString FileDef::getSourceAnchor(int lineNr) +{ + QCString result; + if (srcAnchorDict) + { + QCString *pstr = srcAnchorDict->find(lineNr); + if (pstr) result=*pstr; + } + return result; +} + +void FileDef::addUsingDirective(NamespaceDef *nd) +{ + if (usingList==0) + { + usingList = new NamespaceList; + } + usingList->append(nd); +} + //----------------------------------------------------------------------------- /*! Creates a file list. */ @@ -333,7 +421,9 @@ int FileList::compareItems(GCI item1, GCI item2) { FileDef *c1=(FileDef *)item1; FileDef *c2=(FileDef *)item2; - return strcmp(c1->name(),c2->name()); + return Config::fullPathNameFlag ? + strcmp(c1->absFilePath(),c2->absFilePath()) : + strcmp(c1->name(),c2->name()); } /*! Create a file list iterator. */ @@ -341,3 +431,4 @@ FileListIterator::FileListIterator(const FileList &cllist) : QListIterator(cllist) { } + diff --git a/src/filedef.h b/src/filedef.h index 6f39be2..993a26e 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -19,14 +19,15 @@ #include "index.h" #include +#include #include "config.h" #include "definition.h" class MemberList; class FileList; class ClassList; -class MemberDef; class ClassDef; +class MemberDef; class OutputList; class DefineList; class NamespaceDef; @@ -62,8 +63,6 @@ class FileDef : public Definition return Definition::name(); } - /*! Returns nameString with all slashes replaced by underscores. */ - //const char *diskName() const { return diskname; } QCString getOutputFileBase() const { return diskname; } /*! Returns the absolute path including the file name. */ @@ -72,39 +71,16 @@ class FileDef : public Definition /*! Returns the name of the verbatim copy of this file (if any). */ const char *includeName() const { return incName; } - /*! Returns the documentation that was available for this file. */ - //const char *documentation() const { return doc; } - - /*! Returns the brief description that was given for this file. */ - //const char *briefDescription() const { return brief; } - + void addSourceRef(int line,Definition *d,const char *anchor); + Definition *getSourceDefinition(int lineNr); + QCString getSourceAnchor(int lineNr); + /*! Sets the name of the include file to \a n. */ void setIncludeName(const char *n_) { incName=n_; } - /*! Sets the name of the include file to \a n. */ - //void setBriefDescription(const char *b) { brief=b; } - - /*! Sets the documentaton of this file to \a d. */ - //void setDocumentation(const char *d) { doc=d; } - /*! Returns the absolute path of this file. */ QCString getPath() const { return path; } - /*! Returns true iff any documentation for this file is found. */ - //bool hasDocumentation() - // { return extractAllFlag || !doc.isNull() || !brief.isNull(); } - - /*! Returns true iff this file was externally defined - (i.e. read from a tag file) */ - //bool isReference() { return !reference.isNull(); } - - /*! Returns the reference name of the external file, if any or 0 - if the file is not defined. */ - //const char *getReference() { return reference; } - - //void setFileType(FileType ft) { ftype = ft; } - //FileType fileType() const { return ftype; } - bool isLinkableInProject() { return hasDocumentation() && !isReference(); @@ -115,31 +91,32 @@ class FileDef : public Definition return isLinkableInProject() || isReference(); } - void writeDocumentation(OutputList &ol); + void writeSource(OutputList &ol); friend void generatedFileNames(); void insertMember(MemberDef *fd); void insertClass(ClassDef *cd); void insertNamespace(NamespaceDef *nd); void computeAnchors(); + void addUsingDirective(NamespaceDef *nd); + NamespaceList *getUsedNamespaces() const { return usingList; } + private: MemberList *memList; ClassList *classList; FileList *includeList; NamespaceDict *namespaceDict; NamespaceList *namespaceList; + NamespaceList *usingList; DefineList *defineList; - //QCString n; - //QCString doc; - //QCString brief; - //QCString reference; QCString path; QCString filepath; QCString diskname; QCString filename; QCString incName; - //FileType ftype; + QIntDict *srcDefDict; + QIntDict *srcAnchorDict; }; /*! \class FileList filedef.h diff --git a/src/filename.cpp b/src/filename.cpp index a345969..cc5021c 100644 --- a/src/filename.cpp +++ b/src/filename.cpp @@ -17,8 +17,9 @@ #include "filename.h" #include "util.h" -FileName::FileName(const char *n) : QList() +FileName::FileName(const char *fn,const char *n) : FileList() { + fName=fn; name=n; } @@ -124,7 +125,11 @@ int FileNameList::compareItems(GCI item1, GCI item2) { FileName *f1=(FileName *)item1; FileName *f2=(FileName *)item2; - return stricmp(f1->fileName(),f2->fileName()); + //printf("FileNameList::compareItems `%s'<->`%s'\n", + // f1->fileName(),f2->fileName()); + return Config::fullPathNameFlag ? + stricmp(f1->fullName(),f2->fullName()) : + stricmp(f1->fileName(),f2->fileName()); } FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) : diff --git a/src/filename.h b/src/filename.h index a7deffe..6167842 100644 --- a/src/filename.h +++ b/src/filename.h @@ -21,17 +21,19 @@ #include #include "filedef.h" -class FileName : public QList +class FileName : public FileList { public: - FileName(const char *name); + FileName(const char *fn,const char *name); ~FileName(); const char *fileName() const { return name; } + const char *fullName() const { return fName; } void generateDiskNames(); int compareItems(GCI item1,GCI item2); private: QCString name; + QCString fName; }; class FileNameIterator : public QListIterator diff --git a/src/formula.cpp b/src/formula.cpp index 68e74f8..978307d 100644 --- a/src/formula.cpp +++ b/src/formula.cpp @@ -19,8 +19,8 @@ #include "qtbc.h" #include -#include -#include +#include +#include #include #include "formula.h" @@ -131,9 +131,9 @@ void FormulaList::generateBitmaps(const char *path) t << "1 1 1 setrgbcolor" << endl; // anti-alias to white background t << "newpath" << endl; t << "-1 -1 moveto" << endl; - t << x2-x1+2 << " -1 lineto" << endl; - t << x2-x1+2 << " " << y2-y1+2 << " lineto" << endl; - t << "-1 " << y2-y1+2 << " lineto" <0) header=fileToString(Config::headerFile); if (Config::footerFile.length()>0) footer=fileToString(Config::footerFile); dir=Config::htmlOutputDir; + col=0; } HtmlGenerator::~HtmlGenerator() @@ -44,6 +46,7 @@ HtmlGenerator::~HtmlGenerator() void HtmlGenerator::append(const OutputGenerator *g) { t << g->getContents(); + col+=((HtmlGenerator *)g)->col; } void HtmlGenerator::init() @@ -75,19 +78,29 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external) t << "doxygen=\"_doc:\" href=\"/"; else t << "href=\""; - t << "doxygen.css\" rel=\"stylesheet\" type=\"text/css\">\n" + if (Config::htmlStyleSheet.isEmpty()) + t << "doxygen.css"; + else + t << Config::htmlStyleSheet; + t << "\" rel=\"stylesheet\" type=\"text/css\">\n" "\n"; } else { t << substitute( - substitute( - substitute(header,"$title",lastTitle), - "$datetime",dateToString(TRUE) + substitute( + substitute( + substitute(header,"$title",lastTitle), + "$datetime",dateToString(TRUE) + ), + "$date",dateToString(FALSE) ), - "$date",dateToString(FALSE) + "$doxygenversion",versionString ); + } + t << "" << endl; } void HtmlGenerator::startQuickIndexItem(const char *s,const char *l) @@ -121,8 +134,8 @@ void HtmlGenerator::writeFooter(int part,bool external) case 1: if (footer.length()==0) { - t << " "; - t << ""; + t << endl << "\"doxygen\"  "; + t << "doxygen.gif\" alt=\"doxygen\" " + << "align=center border=0 " << endl << + "width=118 height=53> " << versionString <<" "; } break; default: if (footer.length()==0) - t << " Dimitri van Heesch, © " + t << " Dimitri van Heesch,\n © " "1997-1999\n\n\n"; break; @@ -164,7 +178,6 @@ void HtmlGenerator::writeStyleInfo(int part) if (part==0) { startPlainFile("doxygen.css"); - //<< "H1 { border-width: thin; border: solid; text-align: center }" << endl t << "H1 { text-align: center }" << endl; t << "A.el { text-decoration: none; font-weight: bold }" << endl; t << "DL.el { margin-left: -1cm }" << endl; @@ -359,7 +372,46 @@ void HtmlGenerator::docify(const char *str) void HtmlGenerator::codify(const char *str) { - docify(str); + //docify(str); + //static char spaces[]=" "; + if (str) + { + const char *p=str; + char c; + int spacesToNextTabStop; + while (*p) + { + c=*p++; + switch(c) + { + case '\t': spacesToNextTabStop = + Config::tabSize - (col%Config::tabSize); + t << spaces.left(spacesToNextTabStop); + col+=spacesToNextTabStop; + break; + case '\n': t << '\n'; col=0; + break; + case '<': t << "<"; col++; + break; + case '>': t << ">"; col++; + break; + case '&': t << "&"; col++; + break; + case '\\': + if (*p=='<') + { t << "<"; p++; } + else if (*p=='>') + { t << ">"; p++; } + else + t << "\\"; + col++; + break; + default: t << c; + col++; + break; + } + } + } } void HtmlGenerator::writeChar(char c) diff --git a/src/htmlgen.h b/src/htmlgen.h index 01d8903..a639156 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -77,7 +77,7 @@ class HtmlGenerator : public OutputGenerator const char *anchor,const char *name); void writeCodeLink(const char *ref,const char *f, const char *anchor,const char *name) - { writeObjectLink(ref,f,anchor,name); } + { writeObjectLink(ref,f,anchor,name); col+=strlen(name); } void startTextLink(const char *file,const char *anchor); void endTextLink(); void writeHtmlLink(const char *url,const char *text); @@ -107,7 +107,9 @@ class HtmlGenerator : public OutputGenerator void writeAnchor(const char *name) { t << ""; } void startCodeFragment() { t << "
    "; }
    -    void endCodeFragment()   { t << "
    "; } + void endCodeFragment() { t << ""; } + void startCodeLine() { col=0; } + void endCodeLine() { codify("\n"); } void writeBoldString(const char *text) { t << ""; docify(text); t << ""; } void startEmphasis() { t << ""; } @@ -127,6 +129,8 @@ class HtmlGenerator : public OutputGenerator void startDoxyAnchor(const char *fName,const char *clName, const char *anchor,const char *name); void endDoxyAnchor(); + void startCodeAnchor(const char *label) { t << ""; } + void endCodeAnchor() { t << ""; } void writeLatexSpacing() {} //void writeLatexLabel(const char *,const char *) {} void writeStartAnnoItem(const char *type,const char *file, @@ -181,6 +185,18 @@ class HtmlGenerator : public OutputGenerator void writeNonBreakableSpace() { t << "   "; } void writeImage(const char *,const char *,const char *); + void startDescTable() + { t << "" << endl; } + void endDescTable() + { t << "
    " << endl; } + void startDescTableTitle() + { t << ""; } + void endDescTableTitle() + { t << endl << " "; } + void startDescTableData() + { t << "" << endl; } + void endDescTableData() + { t << "" << endl; } //static void docifyStatic(QTextStream &t,const char *str); private: @@ -193,6 +209,7 @@ class HtmlGenerator : public OutputGenerator HtmlGenerator(const HtmlGenerator &g); static HtmlHelp *htmlHelp; + int col; }; #endif diff --git a/src/htmlhelp.h b/src/htmlhelp.h index 5856f3c..d1d402e 100644 --- a/src/htmlhelp.h +++ b/src/htmlhelp.h @@ -21,7 +21,7 @@ #define HTMLHELP_H #include "qtbc.h" -#include +#include class QFile; class HtmlHelpIndex; diff --git a/src/index.cpp b/src/index.cpp index 2df55a1..53da64e 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -14,11 +14,12 @@ * */ -#include -#include -#include #include +#include +#include +#include + #include "message.h" #include "index.h" #include "doxygen.h" @@ -391,6 +392,68 @@ void writeFileIndex(OutputList &ol) } //---------------------------------------------------------------------------- + +void writeSourceIndex(OutputList &ol) +{ + ol.disableAllBut(OutputGenerator::Html); + startFile(ol,"sources","Source Index"); + startTitle(ol,0); + QCString title = Config::projectName+" "+theTranslator->trSources(); + parseText(ol,title); + endTitle(ol,0,0); + HtmlHelp *htmlHelp = 0; + bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag; + if (hasHtmlHelp) + { + htmlHelp = HtmlHelp::getInstance(); + htmlHelp->addContentsItem(title,"sources"); + htmlHelp->incContentsDepth(); + } + //ol.newParagraph(); + //parseText(ol,theTranslator->trFileListDescription(Config::extractAllFlag)); + //ol.newParagraph(); + + //ol.startIndexList(); + bool started=FALSE; + FileName *fn=inputNameList.first(); + while (fn) + { + FileDef *fd=fn->first(); + while (fd) + { + if (!started) + { + started=TRUE; + ol.startItemList(); + } + ol.writeListItem(); + QCString path; + if (Config::fullPathNameFlag) + { + path=stripFromPath(fd->getPath().copy()); + } + if (!path.isEmpty()) ol.docify(path); + ol.writeObjectLink(0,fd->sourceName(),0,fd->name()); + ol.writeString("\n"); + if (Config::generateHtml && Config::htmlHelpFlag) + { + HtmlHelp::getInstance()->addContentsItem( + fd->name(),fd->sourceName()); + } + fd=fn->next(); + } + fn=inputNameList.next(); + } + if (started) ol.endItemList(); + if (hasHtmlHelp) + { + htmlHelp->decContentsDepth(); + } + endFile(ol); + ol.enable(OutputGenerator::Man); +} + +//---------------------------------------------------------------------------- int countNamespaces() { int count=0; @@ -559,7 +622,7 @@ void writeAlphabeticalClassList(OutputList &ol) } // the number of columns in the table - const int columns = 5; + const int columns = Config::colsInAlphaIndex; int i,j; int totalItems = headerItems + annotatedClasses; // number of items in the table @@ -1052,23 +1115,27 @@ int countIncludeFiles() FileDef *fd=includeFiles.first(); while (fd) { - if (fd->isLinkableInProject()) - { + //if (fd->isLinkableInProject()) + //{ count++; - } + //} fd=includeFiles.next(); } return count; } +//---------------------------------------------------------------------------- + void writeHeaderFileList(OutputList &ol) { bool started=FALSE; FileDef *fd=includeFiles.first(); while (fd) { + /* if (fd->isLinkableInProject()) { + */ if (!started) { started=TRUE; @@ -1088,7 +1155,9 @@ void writeHeaderFileList(OutputList &ol) HtmlHelp::getInstance()->addContentsItem( fd->name(),fd->includeName()); } + /* } + */ fd=includeFiles.next(); } if (started) ol.endItemList(); @@ -1305,7 +1374,12 @@ void writeIndex(OutputList &ol) // write HTML index ol.disable(OutputGenerator::Man); ol.disable(OutputGenerator::Latex); - ol.startFile("index","Main Index",FALSE); + + if (!mainPage || mainPage->title.isEmpty()) + ol.startFile("index","Main Index",FALSE); + else + ol.startFile("index",mainPage->title,FALSE); + if (!Config::noIndexFlag) writeQuickLinks(ol,TRUE); ol.startTitleHead(0); if (mainPage && !mainPage->title.isEmpty()) @@ -1338,29 +1412,32 @@ void writeIndex(OutputList &ol) ol.enable(OutputGenerator::Latex); ol.startFile("refman",0,FALSE); ol.startIndexSection(isTitlePageStart); - parseText(ol,projPrefix+theTranslator->trReferenceManual()); - if (!Config::projectNumber.isEmpty()) - { - ol.startProjectNumber(); - parseDoc(ol,0,0,Config::projectNumber); - ol.endProjectNumber(); - } - ol.endIndexSection(isTitlePageStart); - ol.startIndexSection(isTitlePageAuthor); - parseText(ol,theTranslator->trGeneratedBy()); - ol.endIndexSection(isTitlePageAuthor); - if (mainPage) + if (Config::latexHeaderFile.isEmpty()) { - ol.startIndexSection(isMainPage); - if (!mainPage->title.isEmpty()) + parseText(ol,projPrefix+theTranslator->trReferenceManual()); + if (!Config::projectNumber.isEmpty()) { - parseDoc(ol,0,0,mainPage->title); + ol.startProjectNumber(); + parseDoc(ol,0,0,Config::projectNumber); + ol.endProjectNumber(); } - else + ol.endIndexSection(isTitlePageStart); + ol.startIndexSection(isTitlePageAuthor); + parseText(ol,theTranslator->trGeneratedBy()); + ol.endIndexSection(isTitlePageAuthor); + if (mainPage) { - parseText(ol,projPrefix+theTranslator->trMainPage()); + ol.startIndexSection(isMainPage); + if (!mainPage->title.isEmpty()) + { + parseDoc(ol,0,0,mainPage->title); + } + else + { + parseText(ol,projPrefix+theTranslator->trMainPage()); + } + ol.endIndexSection(isMainPage); } - ol.endIndexSection(isMainPage); } if (documentedGroups>0) { @@ -1431,6 +1508,21 @@ void writeIndex(OutputList &ol) ol.endIndexSection(isEndIndex); endFile(ol); + if (mainPage) + { + ol.disable(OutputGenerator::Man); + startFile(ol,mainPage->name,mainPage->title); + SectionInfo *si=0; + if (mainPage->title.length()>0 && mainPage->name.length()>0 && + (si=sectionDict[mainPage->name])!=0) + { + ol.writeSection(si->label,si->title,FALSE); + } + parseDoc(ol,0,0,mainPage->doc); + endFile(ol); + ol.enable(OutputGenerator::Man); + } + // restore generator state if (manEnabled) ol.enable(OutputGenerator::Man); else ol.disable(OutputGenerator::Man); diff --git a/src/index.h b/src/index.h index a3b3816..a604052 100644 --- a/src/index.h +++ b/src/index.h @@ -19,7 +19,6 @@ #include "qtbc.h" #include -//#include enum IndexSections { @@ -47,6 +46,7 @@ void writeHierarchicalIndex(OutputList &ol); void writeAlphabeticalIndex(OutputList &ol); void writeClassHierarchy(OutputList &ol); void writeFileIndex(OutputList &ol); +void writeSourceIndex(OutputList &ol); void writeAnnotatedIndex(OutputList &ol); void writeAnnotatedClassList(OutputList &ol); void writeMemberIndex(OutputList &ol); diff --git a/src/instdox.cpp b/src/instdox.cpp index 4faa2e6..f4e6de6 100644 --- a/src/instdox.cpp +++ b/src/instdox.cpp @@ -19,8 +19,8 @@ #include "qtbc.h" #include -#include -#include +#include +#include #include "instdox.h" #include "doxygen.h" diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 9ac5cac..80af53d 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -25,6 +25,7 @@ #include "util.h" #include "diagram.h" #include "language.h" +#include "version.h" static QCString filterTitle(const char *s) { @@ -63,8 +64,7 @@ static QCString filterTitle(const char *s) //} -LatexGenerator::LatexGenerator() - : OutputGenerator() +LatexGenerator::LatexGenerator() : OutputGenerator() { dir=Config::latexOutputDir; col=0; @@ -191,7 +191,7 @@ void LatexGenerator::startIndexSection(IndexSections is) } if (!theTranslator->latexBabelPackage().isEmpty()) { - t << "\\usepackage{" << theTranslator->latexBabelPackage() << "}\n"; + t << "\\usepackage[" << theTranslator->latexBabelPackage() << "]{babel}\n"; } const char *s=Config::extraPackageList.first(); while (s) @@ -203,7 +203,10 @@ void LatexGenerator::startIndexSection(IndexSections is) "\\setcounter{tocdepth}{1}\n" "\\setlength{\\footrulewidth}{0.4pt}\n" "\\begin{document}\n" - "\\title{"; + "\\begin{titlepage}\n" + "\\vspace*{7cm}\n" + "\\begin{center}\n" + "{\\Large "; //docify(projectName); //t << " Reference Manual"; //if (!projectNumber.isEmpty()) @@ -221,7 +224,9 @@ void LatexGenerator::startIndexSection(IndexSections is) case isTitlePageAuthor: if (Config::latexHeaderFile.isEmpty()) { - t << "}\n\\author{"; + t << "}\\\\" << endl + << "\\vspace*{1cm}" << endl + << "{\\large "; } break; case isMainPage: @@ -347,11 +352,13 @@ void LatexGenerator::endIndexSection(IndexSections is) case isTitlePageAuthor: if (Config::latexHeaderFile.isEmpty()) { - t << " Doxygen}\n" - "\\date{" << dateToString(TRUE) << "}\n" - "\\maketitle\n" - "\\pagenumbering{roman}\n"; + t << " Doxygen " << versionString << "}\\\\" << endl + << "\\vspace*{0.5cm}" << endl + << "{\\small " << dateToString(TRUE) << "}\\\\" << endl + << "\\end{center}" << endl + << "\\end{titlepage}" << endl; if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n"; + t << "\\pagenumbering{roman}\n"; t << "\\tableofcontents\n"; if (!Config::compactLatexFlag) t << "\\clearemptydoublepage\n"; t << "\\pagenumbering{arabic}\n"; @@ -681,6 +688,25 @@ void LatexGenerator::writeEndAnnoItem(const char *name) // t << "}"; //} +void LatexGenerator::startTextLink(const char *f,const char *anchor) +{ + if (Config::pdfHyperFlag) + { + t << "\\hyperlink{"; + if (f) t << f; + if (anchor) t << "_" << anchor; + t << "}{"; + } +} + +void LatexGenerator::endTextLink() +{ + if (Config::pdfHyperFlag) + { + t << "}"; + } +} + void LatexGenerator::writeObjectLink(const char *ref, const char *f, const char *anchor, const char *text) { @@ -739,10 +765,10 @@ void LatexGenerator::endTitleHead(const char *fileName,const char *name) << name << "@{"; docify(name); t << "}}" << endl; - if (Config::pdfHyperFlag && fileName) - { - t << "}" << endl; - } + } + if (Config::pdfHyperFlag && fileName) + { + t << "}" << endl; } } @@ -1040,6 +1066,7 @@ void LatexGenerator::codify(const char *str) c=*p++; switch(c) { + case 0x0c: break; // remove ^L case '\t': t << &spaces[col&7]; col+=8-(col&7); break; case '\n': t << '\n'; col=0; break; default: t << c; col++; break; diff --git a/src/latexgen.h b/src/latexgen.h index e736491..26ab209 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -73,8 +73,8 @@ class LatexGenerator : public OutputGenerator const char *anchor,const char *text); void writeCodeLink(const char *ref, const char *file, const char *anchor,const char *text); - void startTextLink(const char *,const char *) {} - void endTextLink() {} + void startTextLink(const char *,const char *); + void endTextLink(); void writeHtmlLink(const char *,const char *); void startTypewriter() { t << "{\\tt "; } void endTypewriter() { t << "}"; } @@ -100,6 +100,8 @@ class LatexGenerator : public OutputGenerator void writeAnchor(const char *name) { t << "\\label{" << name << "}" << endl; } void startCodeFragment() { t << "\\small\\begin{verbatim}"; } void endCodeFragment() { t << "\\end{verbatim}\\normalsize " << endl; } + void startCodeLine() { col=0; } + void endCodeLine() { t << endl; } void writeBoldString(const char *text) { t << "{\\bf "; docify(text); t << "}"; } void startEmphasis() { t << "{\\em "; } @@ -115,6 +117,8 @@ class LatexGenerator : public OutputGenerator void endMemberDoc() { t << "}"; } void startDoxyAnchor(const char *,const char *,const char *,const char *); void endDoxyAnchor(); + void startCodeAnchor(const char *) {} + void endCodeAnchor() {} void writeChar(char c); void writeLatexSpacing() { t << "\\hspace{0.3cm}"; } //void writeLatexLabel(const char *scope,const char *anchor); @@ -183,6 +187,17 @@ class LatexGenerator : public OutputGenerator void writeNonBreakableSpace(); void writeImage(const char *,const char *,const char *); + void startDescTable() + { t << "\\begin{description}" << endl; } + void endDescTable() + { t << "\\end{description}" << endl; } + void startDescTableTitle() + { t << "\\item[" << endl; } + void endDescTableTitle() + { t << "]"; } + void startDescTableData() {} + void endDescTableData() {} + //static void docifyStatic(QTextStream &t,const char *str); private: diff --git a/src/mangen.cpp b/src/mangen.cpp index ec2b8ce..ee86282 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -202,17 +202,22 @@ void ManGenerator::docify(const char *str) void ManGenerator::codify(const char *str) { - static char spaces[]=" "; + //static char spaces[]=" "; if (str) { const char *p=str; char c; + int spacesToNextTabStop; while (*p) { c=*p++; switch(c) { - case '\t': t << &spaces[col&7]; col+=8-(col&7); break; + case '\t': spacesToNextTabStop = + Config::tabSize - (col%Config::tabSize); + t << spaces.left(spacesToNextTabStop); + col+=spacesToNextTabStop; + break; case '\n': t << "\n.br\n"; firstCol=TRUE; col=0; break; case '\\': t << "\\\\"; col++; break; default: t << c; firstCol=FALSE; col++; break; diff --git a/src/mangen.h b/src/mangen.h index ad512e4..72022d7 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -98,6 +98,8 @@ class ManGenerator : public OutputGenerator void writeAnchor(const char *) {} void startCodeFragment(); void endCodeFragment(); + void startCodeLine() {} + void endCodeLine() { t << endl; } void writeBoldString(const char *text) { t << "\\fB"; docify(text); t << "\\fR"; firstCol=FALSE; } void startEmphasis() { t << "\\fI"; firstCol=FALSE; } @@ -115,6 +117,8 @@ class ManGenerator : public OutputGenerator void startDoxyAnchor(const char *,const char *, const char *,const char *) {} void endDoxyAnchor() {} + void startCodeAnchor(const char *) {} + void endCodeAnchor() {} void writeLatexSpacing() {} //void writeLatexLabel(const char *,const char *) {} void writeStartAnnoItem(const char *type,const char *file, @@ -172,6 +176,13 @@ class ManGenerator : public OutputGenerator void writeNonBreakableSpace() { t << " "; } void writeImage(const char *,const char *,const char *) {} + void startDescTable() {} + void endDescTable() {} + void startDescTableTitle() { writeListItem(); startBold(); } + void endDescTableTitle() { endBold(); } + void startDescTableData() { } + void endDescTableData() {} + private: bool firstCol; bool paragraph; diff --git a/src/memberdef.cpp b/src/memberdef.cpp index ec70870..811cee8 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -23,6 +23,10 @@ #include "message.h" #include "htmlhelp.h" #include "language.h" +#include "outputlist.h" +#include "example.h" +#include "membergroup.h" +#include "scanner.h" //----------------------------------------------------------------------------- @@ -435,6 +439,7 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *cd,NamespaceDef *nd, anchor(),name()); } + void MemberDef::writeDeclaration(OutputList &ol,ClassDef *cd,NamespaceDef *nd,FileDef *fd, int prevGroupId,bool inGroup) { @@ -735,12 +740,12 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco bool hasDocs = detailsAreVisible(); if ( (memberType()==m && // filter member type - (Config::extractAllFlag || hasDocs) && - groupId()==-1 - ) || /* member is part of an annonymous scope that is the type of - * another member in the list. - */ - (!hasDocs && !briefDescription().isEmpty() && annUsed) + (Config::extractAllFlag || hasDocs) && + groupId()==-1 // not in a group + ) || /* member is part of an annonymous scope that is the type of + * another member in the list. + */ + (!hasDocs && !briefDescription().isEmpty() && annUsed) ) { //printf("************* Writing docs for member %s\n",name().data()); @@ -927,9 +932,9 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco ol.newParagraph(); if (!briefDescription().isEmpty() && - (Config::repeatBriefFlag || - (!Config::briefMemDescFlag && documentation().isEmpty()) - ) || !annMemb + (Config::repeatBriefFlag + /* || (!Config::briefMemDescFlag && documentation().isEmpty())*/ + ) /* || !annMemb */ ) { parseDoc(ol,scopeName,name(),briefDescription()); @@ -939,12 +944,12 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco { parseDoc(ol,scopeName,name(),documentation()+"\n"); } - if (!bodyCode().isEmpty()) - { - ol.startCodeFragment(); - parseCode(ol,scopeName,bodyCode(),FALSE,0); - ol.endCodeFragment(); - } + //if (!bodyCode().isEmpty()) + //{ + // ol.startCodeFragment(); + // parseCode(ol,scopeName,bodyCode(),FALSE,0); + // ol.endCodeFragment(); + //} if (isEnumerate()) { @@ -959,13 +964,16 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco { if (first) { - ol.newParagraph(); + //ol.newParagraph(); + ol.startDescList(); ol.startBold(); parseText(ol,theTranslator->trEnumerationValues()); - //ol.writeBoldString("Enumeration values:"); ol.docify(":"); ol.endBold(); - ol.startItemList(); + ol.endDescTitle(); + ol.writeDescItem(); + //ol.startItemList(); + ol.startDescTable(); } ol.addToIndex(fmd->name(),cname); ol.addToIndex(cname,fmd->name()); @@ -973,32 +981,47 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco { HtmlHelp::getInstance()->addIndexItem(cname,fmd->name(),cfname,fmd->anchor()); } - ol.writeListItem(); + //ol.writeListItem(); + ol.startDescTableTitle(); ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name()); first=FALSE; - ol.startBold(); + ol.startEmphasis(); ol.docify(fmd->name()); - ol.endBold(); + ol.endEmphasis(); + ol.disableAllBut(OutputGenerator::Man); + ol.writeString(" "); + ol.enableAll(); + ol.endDescTableTitle(); ol.endDoxyAnchor(); - ol.newParagraph(); + //ol.newParagraph(); + ol.startDescTableData(); if (!fmd->briefDescription().isEmpty()) { parseDoc(ol,scopeName,fmd->name(),fmd->briefDescription()); + //ol.newParagraph(); + } + if (!fmd->briefDescription().isEmpty() && + !fmd->documentation().isEmpty()) + { ol.newParagraph(); } if (!fmd->documentation().isEmpty()) { parseDoc(ol,scopeName,fmd->name(),fmd->documentation()+"\n"); } - ol.disable(OutputGenerator::Man); - ol.newParagraph(); - ol.enable(OutputGenerator::Man); + ol.endDescTableData(); } fmd=fmdl->next(); } } - if (!first) { ol.endItemList(); ol.writeChar('\n'); } + if (!first) + { + //ol.endItemList(); + ol.endDescTable(); + ol.endDescList(); + ol.writeChar('\n'); + } } MemberDef *bmd=reimplements(); @@ -1128,7 +1151,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco index=newIndex+matchLen; } parseText(ol,reimplInLine.right(reimplInLine.length()-index)); - } } // write the list of examples that use this member @@ -1145,6 +1167,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,const char *sco //ol.endDescItem(); ol.endDescList(); } + // write reference to the source + writeSourceRef(ol); ol.endIndent(); // enable LaTeX again //if (Config::extractAllFlag && !hasDocs) ol.enable(OutputGenerator::Latex); @@ -1186,3 +1210,20 @@ bool MemberDef::isLinkable() { return isLinkableInProject() || isReference(); } + +bool MemberDef::detailsAreVisible() const +{ + return !documentation().isEmpty() || // has detailed docs + (Config::sourceBrowseFlag && bodyLine!=-1 && bodyDef) || // has reference to sources + (mtype==Enumeration && docEnumValues) || // has enum values + (mtype==EnumValue && !briefDescription().isEmpty()) || // is doc enum value + (!briefDescription().isEmpty() && + (!Config::briefMemDescFlag || Config::alwaysDetailsFlag) && + Config::repeatBriefFlag // has brief description inside detailed area + ); +} + +void MemberDef::setEnumDecl(OutputList &ed) +{ + enumDeclList=new OutputList(&ed); +} diff --git a/src/memberdef.h b/src/memberdef.h index 8570f1f..5c91a59 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -22,15 +22,16 @@ #include #include "entry.h" -#include "example.h" -#include "config.h" -#include "outputlist.h" #include "definition.h" -#include "scanner.h" class FileDef; -class MemberList; +class ClassDef; class NamespaceDef; +class MemberList; +class MemberGroup; +class ExampleList; +class ExampleDict; +class OutputList; class MemberDef : public Definition @@ -71,7 +72,7 @@ class MemberDef : public Definition const char *argsString() const { return args; } const char *excpString() const { return exception; } const char *anchor() const { return anc; } - QCString bodyCode() const { return body; } + //QCString bodyCode() const { return body; } ClassDef *memberClass() { return classDef; } Protection protection() const { return prot; } Specifier virtualness() const { return virt; } @@ -84,7 +85,7 @@ class MemberDef : public Definition void setFileDec(FileDef *fd) { fileDec=fd; } void setAnchor(const char *a) { anc=a; } void setProtection(Protection p) { prot=p; } - void setBody(const QCString &b) { body=b; } + //void setBody(const QCString &b) { body=b; } void setInline(bool in) { inLine=in; } FileDef *getFileDef() { return fileDef; } FileDef *getFileDec() { return fileDec; } @@ -93,19 +94,12 @@ class MemberDef : public Definition bool isStatic() const { return stat; } bool isInline() const { return inLine; } bool hasDocumentation() // overrides hasDocumentation in definition.h - { return Definition::hasDocumentation() || !body.isEmpty(); } + { return Definition::hasDocumentation(); } bool isLinkableInProject(); bool isLinkable(); - bool detailsAreVisible() const - { return !documentation().isEmpty() || !body.isEmpty() || - (mtype==Enumeration && docEnumValues) || - (mtype==EnumValue && !briefDescription().isEmpty()) || - (!briefDescription().isEmpty() && - !Config::briefMemDescFlag && Config::repeatBriefFlag); - } - + bool detailsAreVisible() const; // relation to other members void setReimplements(MemberDef *md) { redefines=md; } void insertReimplementedBy(MemberDef *md); @@ -116,7 +110,7 @@ class MemberDef : public Definition void insertEnumField(MemberDef *md); void setEnumScope(MemberDef *md) { enumScope=md; } MemberDef *getEnumScope() const { return enumScope; } - void setEnumDecl(OutputList &ed) { enumDeclList=new OutputList(&ed); } + void setEnumDecl(OutputList &ed); void setEnumUsed() { eUsed=TRUE; } bool enumUsed() const { return eUsed; } OutputList *enumDecl() const { return enumDeclList; } @@ -202,13 +196,13 @@ class MemberDef : public Definition QCString type; // return type QCString args; // function arguments/variable array specifiers QCString exception; // exceptions that can be thrown - QCString body; // function body code + //QCString body; // function body code QCString decl; // member declaration in class QCString declFile; // file where the declaration was found - int declLine; // line where the declaration was found + int declLine; // line where the declaration was found QCString def; // member definition in code (fully qualified name) QCString defFile; // file where the definition was found - int defLine; // line where the definition was found + int defLine; // line where the definition was found QCString anc; // HTML anchor name Specifier virt; // normal/virtual/pure virtual Protection prot; // protection type [Public/Protected/Private] diff --git a/src/membergroup.cpp b/src/membergroup.cpp index 2ed41fb..9b79347 100644 --- a/src/membergroup.cpp +++ b/src/membergroup.cpp @@ -23,6 +23,7 @@ #include "namespacedef.h" #include "filedef.h" #include "language.h" +#include "scanner.h" static QCString idToName(int id) { diff --git a/src/membergroup.h b/src/membergroup.h index 1db04df..ea8f7f8 100644 --- a/src/membergroup.h +++ b/src/membergroup.h @@ -19,6 +19,7 @@ #include "qtbc.h" #include +#include #include "definition.h" @@ -59,4 +60,10 @@ class MemberGroupListIterator : public QListIterator QListIterator(l) {} }; +class MemberGroupDict : public QIntDict +{ + public: + MemberGroupDict(int size) : QIntDict(size) {} +}; + #endif diff --git a/src/memberlist.cpp b/src/memberlist.cpp index bdca206..2fdcb95 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -21,6 +21,8 @@ #include "util.h" #include "language.h" #include "doxygen.h" +#include "outputlist.h" +#include "scanner.h" MemberList::MemberList() : QList() { diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 19ed1c4..09efaf1 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -30,6 +30,7 @@ NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name) fileName="namespace_"+nameToFile(name); classList = new ClassList; memList = new MemberList; + usingList = 0; setReference(ref); } @@ -37,6 +38,7 @@ NamespaceDef::~NamespaceDef() { delete classList; delete memList; + delete usingList; } void NamespaceDef::insertUsedFile(const char *f) @@ -240,3 +242,12 @@ int NamespaceDef::countMembers() memList->countDocMembers(); return memList->totalCount()+classList->count(); } + +void NamespaceDef::addUsingDirective(NamespaceDef *nd) +{ + if (usingList==0) + { + usingList = new NamespaceList; + } + usingList->append(nd); +} diff --git a/src/namespacedef.h b/src/namespacedef.h index b34c65b..cf661b5 100644 --- a/src/namespacedef.h +++ b/src/namespacedef.h @@ -27,6 +27,7 @@ class OutputList; class ClassList; class MemberList; class MemberDef; +class NamespaceList; class NamespaceDef : public Definition { @@ -41,6 +42,8 @@ class NamespaceDef : public Definition void insertMember(MemberDef *md); void computeAnchors(); int countMembers(); + void addUsingDirective(NamespaceDef *nd); + NamespaceList *getUsedNamespaces() const { return usingList; } //const char *getReference() { return reference; } //bool isVisible() //{ @@ -71,6 +74,7 @@ class NamespaceDef : public Definition QStrList files; ClassList *classList; MemberList *memList; + NamespaceList *usingList; }; class NamespaceList : public QList diff --git a/src/outputgen.h b/src/outputgen.h index 8ff6a92..40285a9 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -18,7 +18,7 @@ #define OUTPUTGEN_H #include "qtbc.h" -#include +#include #include #include #include "index.h" @@ -105,6 +105,8 @@ class OutputGenerator virtual void writeAnchor(const char *name) = 0; virtual void startCodeFragment() = 0; virtual void endCodeFragment() = 0; + virtual void startCodeLine() = 0; + virtual void endCodeLine() = 0; virtual void writeBoldString(const char *text) = 0; virtual void startEmphasis() = 0; virtual void endEmphasis() = 0; @@ -115,6 +117,8 @@ class OutputGenerator virtual void startDoxyAnchor(const char *fileName,const char *clName, const char *anchor,const char *name) = 0; virtual void endDoxyAnchor() = 0; + virtual void startCodeAnchor(const char *label) = 0; + virtual void endCodeAnchor() = 0; virtual void writeLatexSpacing() = 0; //virtual void writeLatexLabel(const char *clName,const char *anchor) = 0; virtual void writeStartAnnoItem(const char *type,const char *file, @@ -177,6 +181,13 @@ class OutputGenerator virtual void writeNonBreakableSpace() = 0; virtual void writeImage(const char *,const char *,const char *) = 0; + virtual void startDescTable() = 0; + virtual void endDescTable() = 0; + virtual void startDescTableTitle() = 0; + virtual void endDescTableTitle() = 0; + virtual void startDescTableData() = 0; + virtual void endDescTableData() = 0; + void clear() { b.close(); a.resize(0); b.setBuffer(a); b.open(IO_WriteOnly); t.setDevice(&b); } void startPlainFile(const char *name); diff --git a/src/outputlist.h b/src/outputlist.h index 8e57ed6..86ceae3 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -169,6 +169,10 @@ class OutputList { forall(&OutputGenerator::startCodeFragment); } void endCodeFragment() { forall(&OutputGenerator::endCodeFragment); } + void startCodeLine() + { forall(&OutputGenerator::startCodeLine); } + void endCodeLine() + { forall(&OutputGenerator::endCodeLine); } void writeBoldString(const char *text) { forall(&OutputGenerator::writeBoldString,text); } void startEmphasis() @@ -187,6 +191,10 @@ class OutputList { forall(&OutputGenerator::startDoxyAnchor,fn,cn,anchor,name); } void endDoxyAnchor() { forall(&OutputGenerator::endDoxyAnchor); } + void startCodeAnchor(const char *label) + { forall(&OutputGenerator::startCodeAnchor,label); } + void endCodeAnchor() + { forall(&OutputGenerator::endCodeAnchor); } void writeLatexSpacing() { forall(&OutputGenerator::writeLatexSpacing); } //void writeLatexLabel(const char *scope,const char *anchor) @@ -308,6 +316,19 @@ class OutputList void writeImage(const char *n,const char *w,const char *h) { forall(&OutputGenerator::writeImage,n,w,h); } + void startDescTable() + { forall(&OutputGenerator::startDescTable); } + void endDescTable() + { forall(&OutputGenerator::endDescTable); } + void startDescTableTitle() + { forall(&OutputGenerator::startDescTableTitle); } + void endDescTableTitle() + { forall(&OutputGenerator::endDescTableTitle); } + void startDescTableData() + { forall(&OutputGenerator::startDescTableData); } + void endDescTableData() + { forall(&OutputGenerator::endDescTableData); } + private: void debug(); void clear(); diff --git a/src/pre.cpp b/src/pre.cpp new file mode 100644 index 0000000..b29e73f --- /dev/null +++ b/src/pre.cpp @@ -0,0 +1,4468 @@ +#define yy_create_buffer preYY_create_buffer +#define yy_delete_buffer preYY_delete_buffer +#define yy_scan_buffer preYY_scan_buffer +#define yy_scan_string preYY_scan_string +#define yy_scan_bytes preYY_scan_bytes +#define yy_flex_debug preYY_flex_debug +#define yy_init_buffer preYY_init_buffer +#define yy_flush_buffer preYY_flush_buffer +#define yy_load_buffer_state preYY_load_buffer_state +#define yy_switch_to_buffer preYY_switch_to_buffer +#define yyin preYYin +#define yyleng preYYleng +#define yylex preYYlex +#define yyout preYYout +#define yyrestart preYYrestart +#define yytext preYYtext + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define YY_USES_REJECT + +#define yywrap() 1 +#define YY_SKIP_YYWRAP +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 118 +#define YY_END_OF_BUFFER 119 +static yyconst short int yy_acclist[768] = + { 0, + 101, 101, 119, 117, 118, 1, 117, 118, 116, 118, + 3, 117, 118, 117, 118, 2, 117, 118, 5, 117, + 118, 1, 5, 117, 118, 5, 117, 118, 5, 116, + 118, 3, 5, 117, 118, 4, 117, 118, 5, 117, + 118, 2, 5, 117, 118, 36, 117, 118, 1, 36, + 117, 118, 33, 116, 118, 3, 36, 117, 118, 36, + 117, 118, 34, 36, 117, 118, 34, 36, 117, 118, + 34, 36, 117, 118, 34, 36, 117, 118, 34, 36, + 117, 118, 2, 36, 117, 118, 58, 117, 118, 1, + 58, 117, 118, 56, 116, 118, 3, 58, 117, 118, + + 58, 117, 118, 57, 58, 117, 118, 57, 58, 117, + 118, 57, 58, 117, 118, 2, 58, 117, 118, 59, + 60, 117, 118, 1, 59, 60, 117, 118, 63, 116, + 118, 3, 59, 60, 117, 118, 60, 117, 118, 2, + 59, 60, 117, 118, 8, 117, 118, 1, 8, 117, + 118, 9, 116, 118, 3, 8, 117, 118, 8, 117, + 118, 7, 8, 117, 118,16390, 2, 8, 117, 118, + 117, 118, 1, 117, 118, 3, 117, 118, 117, 118, + 2, 117, 118, 65, 117, 118, 8260, 117, 118,16452, + 16453, 117, 118, 71, 117, 118, 72, 117, 118, 70, + + 117, 118, 73, 117, 118, 113, 117, 118, 1, 113, + 117, 118, 101, 113, 117, 118, 100, 116, 118, 3, + 113, 117, 118, 104, 113, 117, 118, 97, 113, 117, + 118, 105, 113, 117, 118, 113, 117, 118, 103, 113, + 117, 118, 98, 113, 117, 118, 113, 117, 118, 2, + 113, 117, 118, 51, 117, 118, 1, 51, 117, 118, + 3, 51, 117, 118, 51, 117, 118, 2, 51, 117, + 118, 50, 51, 117, 118, 1, 50, 51, 117, 118, + 50, 51, 117, 118, 50, 116, 118, 3, 50, 51, + 117, 118, 49, 51, 117, 118, 50, 51, 117, 118, + + 2, 50, 51, 117, 118, 79, 81, 117, 118, 1, + 79, 81, 117, 118, 80, 116, 118, 3, 79, 81, + 117, 118, 81, 117, 118, 79, 81, 117, 118, 2, + 79, 81, 117, 118, 91, 92, 117, 118, 1, 91, + 92, 117, 118, 88, 116, 118, 3, 91, 92, 117, + 118, 91, 92, 117, 118, 2, 91, 92, 117, 118, + 85, 87, 117, 118, 1, 85, 87, 117, 118, 86, + 116, 118, 3, 85, 87, 117, 118, 87, 117, 118, + 85, 87, 117, 118, 2, 85, 87, 117, 118, 95, + 96, 117, 118, 1, 95, 96, 117, 118, 3, 95, + + 96, 117, 118, 95, 96, 117, 118, 2, 95, 96, + 117, 118, 41, 117, 118, 1, 41, 117, 118, 42, + 116, 118, 3, 41, 117, 118, 41, 117, 118, 41, + 117, 118, 41, 117, 118, 2, 41, 117, 118, 48, + 117, 118, 1, 48, 117, 118, 46, 116, 118, 3, + 48, 117, 118, 48, 117, 118, 44, 48, 117, 118, + 48, 117, 118, 2, 48, 117, 118, 47, 48, 117, + 118, 45, 48, 117, 118, 111, 117, 118, 1, 111, + 117, 118, 3, 111, 117, 118, 108, 111, 117, 118, + 111, 117, 118, 111, 117, 118, 2, 111, 117, 118, + + 112, 117, 118, 1, 112, 117, 118, 3, 112, 117, + 118, 110, 112, 117, 118, 112, 117, 118, 112, 117, + 118, 2, 112, 117, 118, 37, 117, 118, 35, 117, + 118, 1, 35, 117, 118, 3, 35, 117, 118, 35, + 117, 118, 2, 35, 117, 118, 15, 117, 118, 1, + 15, 117, 118, 13, 116, 118, 3, 15, 117, 118, + 12, 15, 117, 118, 10, 15, 117, 118, 11, 15, + 117, 118, 15, 117, 118, 14, 15, 117, 118, 2, + 15, 117, 118, 19, 117, 118, 1, 19, 117, 118, + 3, 19, 117, 118, 17, 19, 117, 118, 19, 117, + + 118, 19, 117, 118, 2, 19, 117, 118, 114, 115, + 5, 5, 4, 34, 34, 34, 34, 34, 34, 34, + 62, 114, 61, 115, 57, 57, 57, 57, 59, 8198, + 7,16390, 66, 114, 115, 64, 65, 8260, 8261, 67, + 8260,16452,16453, 72, 71, 72, 70, 73, 101, 102, + 74, 114, 75, 115, 98, 99, 50, 50, 49, 79, + 76, 78, 114, 77, 79, 115, 91, 89, 91, 114, + 90, 91, 115, 85, 82, 84, 114, 83, 85, 115, + 95, 93, 95, 114, 94, 95, 115, 38, 44, 43, + 45, 107, 114, 106, 115, 109, 37, 18, 114, 18, + + 115, 16, 34, 34, 34, 34, 27, 34, 34, 34, + 34, 57, 57, 57, 52, 57, 57, 102, 34, 34, + 34, 34, 34, 34, 34, 34, 57, 53, 57, 57, + 57, 73, 34, 28, 31, 29, 34, 34, 34, 34, + 34, 54, 55, 57, 57, 34, 32, 24, 23, 34, + 34, 30, 22, 26, 25, 34,16404,16404, 21, 8212, + 34, 40, 39, 8212, 8212, 34, 8212 + } ; + +static yyconst short int yy_accept[364] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 4, 6, 9, 11, 14, + 16, 19, 22, 26, 29, 32, 36, 39, 42, 46, + 49, 53, 56, 60, 63, 67, 71, 75, 79, 83, + 87, 90, 94, 97, 101, 104, 108, 112, 116, 120, + 124, 129, 132, 137, 140, 145, 148, 152, 155, 159, + + 162, 167, 171, 173, 176, 179, 181, 184, 187, 192, + 194, 197, 200, 203, 206, 209, 213, 217, 220, 224, + 228, 232, 236, 239, 243, 247, 250, 254, 257, 261, + 265, 268, 272, 276, 281, 285, 288, 293, 297, 301, + 306, 310, 315, 318, 323, 326, 330, 335, 339, 344, + 347, 352, 356, 361, 365, 370, 373, 378, 381, 385, + 390, 394, 399, 404, 408, 413, 416, 420, 423, 427, + 430, 433, 436, 440, 443, 447, 450, 454, 457, 461, + 464, 468, 472, 476, 479, 483, 487, 491, 494, 497, + 501, 504, 508, 512, 516, 519, 522, 526, 529, 532, + + 536, 540, 543, 547, 550, 554, 557, 561, 565, 569, + 573, 576, 580, 584, 587, 591, 595, 599, 602, 605, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 623, 625, 626, 627, 628, 629, 630, + 630, 631, 633, 633, 634, 635, 636, 636, 637, 638, + 639, 640, 641, 644, 644, 645, 646, 647, 648, 648, + 649, 650, 650, 651, 653, 655, 656, 657, 658, 659, + 660, 661, 662, 664, 667, 668, 671, 674, 675, 676, + 678, 681, 682, 685, 688, 689, 689, 690, 691, 692, + 694, 696, 697, 698, 700, 702, 703, 704, 705, 706, + + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 718, 719, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 730, 731, 732, 733, 733, 734, + 736, 737, 738, 739, 740, 741, 742, 743, 745, 746, + 746, 747, 748, 749, 750, 751, 752, 753, 753, 754, + 755, 756, 758, 758, 759, 760, 762, 763, 764, 765, + 767, 768, 768 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 2, 1, 1, 3, 4, + 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 6, 7, 1, 1, 1, 8, 9, + 10, 11, 1, 12, 1, 13, 14, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 1, 1, 16, + 1, 17, 1, 18, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 1, 20, 1, 1, 19, 1, 19, 19, 21, 22, + + 23, 24, 19, 19, 25, 19, 19, 26, 19, 27, + 19, 19, 19, 19, 28, 19, 29, 19, 19, 19, + 19, 19, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[31] = + { 0, + 1, 1, 2, 3, 4, 5, 1, 1, 6, 1, + 7, 1, 8, 9, 10, 5, 1, 1, 11, 1, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 1 + } ; + +static yyconst short int yy_base[404] = + { 0, + 0, 29, 58, 87, 117, 0, 147, 0, 176, 205, + 235, 0, 264, 293, 322, 0, 334, 0, 361, 0, + 390, 0, 419, 448, 477, 506, 535, 564, 593, 622, + 651, 680, 709, 738, 767, 796, 825, 854, 884, 0, + 905, 0, 933, 962, 991, 1020, 1032, 0, 1060, 1089, + 1118, 1147, 1176, 1205, 374, 1633, 1633, 1633, 1633, 1, + 1633, 1633, 1633, 0, 1633, 1633, 1633, 2, 1633, 1633, + 1633, 1633, 1633, 6, 0, 349, 0, 1, 342, 1633, + 1633, 1633, 1633, 1633, 7, 0, 9, 344, 1633, 0, + 0, 1633, 0, 8, 0, 1633, 1633, 1633, 1633, 18, + + 35, 1633, 31, 35, 36, 40, 39, 46, 61, 58, + 364, 363, 362, 341, 1633, 1633, 3, 1633, 1633, 1633, + 335, 1633, 36, 1633, 0, 336, 1633, 1633, 1633, 1633, + 55, 1633, 1633, 1633, 64, 1633, 1633, 1633, 62, 1633, + 0, 0, 1633, 0, 325, 63, 0, 0, 0, 1633, + 0, 64, 0, 0, 0, 1633, 0, 324, 68, 0, + 0, 0, 0, 69, 0, 1633, 1633, 1633, 1633, 70, + 333, 312, 1633, 1633, 1633, 1633, 1633, 82, 0, 330, + 1633, 1633, 0, 1633, 1633, 1633, 1633, 84, 0, 1633, + 1633, 1633, 1633, 1633, 86, 0, 1633, 0, 1633, 1633, + + 1633, 88, 1633, 1633, 1633, 1633, 1633, 1633, 1633, 1633, + 92, 1633, 1633, 1633, 1633, 1633, 1633, 93, 327, 1633, + 1633, 1633, 1633, 102, 1633, 0, 308, 83, 309, 176, + 309, 307, 1633, 1633, 0, 85, 306, 186, 0, 179, + 1633, 188, 188, 1633, 194, 195, 193, 1633, 211, 5, + 1633, 1633, 212, 214, 322, 319, 318, 317, 306, 305, + 109, 310, 313, 1633, 1633, 0, 1633, 1633, 215, 1633, + 0, 1633, 1633, 0, 0, 0, 0, 0, 1633, 1633, + 0, 0, 0, 0, 1633, 291, 0, 1633, 0, 1633, + 1633, 1633, 0, 1633, 1633, 1633, 289, 289, 289, 286, + + 1633, 286, 286, 280, 282, 280, 280, 277, 1633, 278, + 278, 283, 290, 267, 264, 220, 1221, 266, 263, 263, + 254, 206, 222, 0, 180, 175, 1633, 160, 163, 1633, + 1633, 1236, 223, 91, 92, 84, 1633, 0, 224, 63, + 82, 1633, 225, 1633, 264, 35, 21, 1, 8, 268, + 1633, 269, 271, 273, 1633, 0, 279, 1633, 0, 0, + 0, 1633, 1265, 1276, 1287, 1298, 1309, 1320, 1331, 1342, + 1353, 1364, 1375, 1386, 1397, 1408, 1419, 1430, 1441, 1443, + 1445, 1456, 1466, 1477, 1487, 1497, 1501, 1503, 1514, 1525, + 1536, 1547, 1558, 1560, 1562, 1573, 1575, 1586, 1597, 1607, + + 1617, 1619, 1621 + } ; + +static yyconst short int yy_def[404] = + { 0, + 363, 363, 363, 364, 362, 5, 362, 7, 365, 365, + 362, 11, 366, 366, 363, 15, 15, 17, 17, 19, + 362, 21, 367, 368, 363, 363, 363, 363, 369, 369, + 370, 370, 371, 371, 372, 372, 373, 373, 362, 39, + 39, 41, 374, 374, 375, 375, 17, 47, 376, 376, + 377, 377, 378, 378, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 379, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 380, 380, 380, 380, 380, 362, + 362, 362, 362, 362, 362, 381, 381, 381, 362, 382, + 382, 362, 382, 362, 382, 362, 362, 362, 362, 362, + + 383, 362, 384, 384, 384, 384, 384, 385, 386, 362, + 362, 362, 362, 387, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 388, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 389, 362, 362, 362, 362, 362, + 390, 390, 362, 390, 362, 390, 390, 391, 391, 362, + 391, 391, 391, 392, 392, 362, 392, 362, 392, 392, + 393, 393, 393, 393, 393, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 394, 362, + 362, 362, 395, 362, 362, 362, 362, 362, 396, 362, + 362, 362, 362, 362, 362, 396, 362, 397, 362, 362, + + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 379, 362, 380, 380, 380, 380, 380, + 380, 380, 362, 362, 381, 381, 381, 381, 382, 362, + 362, 383, 384, 362, 384, 384, 362, 362, 385, 362, + 362, 362, 386, 362, 362, 362, 362, 362, 362, 387, + 362, 362, 362, 362, 362, 388, 362, 362, 389, 362, + 390, 362, 362, 390, 391, 391, 391, 392, 362, 362, + 392, 393, 393, 393, 362, 362, 394, 362, 395, 362, + 362, 362, 397, 362, 362, 362, 380, 380, 380, 380, + + 362, 380, 380, 380, 380, 381, 381, 381, 362, 381, + 381, 362, 362, 362, 380, 380, 398, 380, 380, 380, + 380, 380, 381, 381, 381, 381, 362, 362, 380, 362, + 362, 399, 380, 380, 380, 380, 362, 381, 381, 362, + 380, 362, 362, 362, 380, 380, 362, 362, 362, 362, + 362, 400, 362, 401, 362, 402, 362, 362, 403, 402, + 403, 0, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + + 362, 362, 362 + } ; + +static yyconst short int yy_nxt[1664] = + { 0, + 362, 57, 224, 58, 59, 261, 225, 250, 251, 262, + 349, 221, 221, 60, 222, 222, 221, 233, 233, 222, + 234, 234, 353, 347, 230, 228, 229, 231, 221, 61, + 57, 222, 58, 59, 236, 237, 244, 240, 240, 240, + 244, 244, 60, 241, 244, 244, 264, 244, 247, 265, + 245, 244, 244, 246, 248, 244, 244, 352, 61, 57, + 254, 58, 59, 250, 251, 233, 269, 255, 234, 252, + 270, 60, 233, 273, 276, 234, 274, 277, 280, 283, + 221, 281, 284, 222, 349, 348, 347, 61, 63, 64, + 65, 66, 221, 67, 290, 222, 221, 291, 221, 222, + + 68, 222, 221, 294, 224, 222, 295, 298, 225, 306, + 299, 261, 307, 346, 345, 262, 69, 70, 71, 70, + 72, 73, 70, 70, 70, 70, 70, 70, 70, 70, + 74, 70, 70, 70, 70, 75, 70, 75, 76, 77, + 75, 78, 75, 75, 75, 79, 80, 81, 82, 81, + 83, 84, 81, 81, 81, 81, 81, 81, 81, 81, + 85, 81, 81, 81, 81, 86, 81, 86, 86, 87, + 86, 88, 86, 86, 86, 86, 89, 91, 301, 92, + 93, 240, 240, 240, 301, 341, 340, 241, 309, 94, + 240, 240, 240, 244, 309, 247, 241, 302, 339, 244, + + 244, 248, 303, 338, 244, 95, 91, 310, 92, 93, + 244, 244, 311, 247, 250, 251, 254, 269, 94, 248, + 252, 270, 330, 255, 337, 343, 309, 343, 330, 336, + 337, 344, 309, 344, 95, 96, 97, 96, 98, 99, + 96, 96, 96, 96, 96, 96, 96, 96, 100, 96, + 96, 96, 96, 101, 96, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 102, 104, 350, 58, 105, 56, + 350, 354, 351, 357, 355, 354, 351, 106, 355, 358, + 56, 357, 335, 226, 355, 334, 333, 358, 355, 332, + 329, 328, 313, 107, 104, 327, 58, 105, 56, 310, + + 326, 325, 324, 323, 322, 321, 106, 320, 319, 56, + 318, 317, 316, 315, 314, 313, 263, 259, 312, 258, + 257, 256, 107, 57, 257, 58, 59, 308, 305, 304, + 300, 297, 296, 288, 286, 60, 285, 279, 272, 267, + 108, 263, 108, 108, 108, 108, 108, 108, 108, 108, + 108, 61, 109, 259, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 110, 258, 257, 256, 238, 232, 111, + 112, 227, 113, 362, 362, 362, 362, 362, 362, 114, + 362, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 115, 115, + + 115, 115, 115, 123, 115, 115, 115, 124, 125, 126, + 125, 125, 125, 125, 125, 125, 125, 125, 125, 127, + 129, 362, 58, 130, 362, 362, 362, 362, 362, 362, + 362, 362, 131, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 132, 134, + 135, 136, 137, 362, 138, 362, 362, 362, 362, 362, + 362, 139, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 140, 57, 362, + 58, 59, 362, 362, 362, 362, 362, 362, 362, 362, + 60, 362, 362, 362, 362, 362, 362, 362, 362, 362, + + 362, 362, 362, 362, 362, 362, 61, 57, 362, 58, + 59, 362, 362, 362, 362, 362, 362, 362, 362, 60, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 61, 57, 362, 58, 59, + 362, 362, 362, 362, 362, 362, 362, 362, 60, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 61, 57, 362, 58, 59, 362, + 362, 362, 362, 362, 362, 362, 362, 60, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 61, 142, 362, 143, 144, 362, 362, + + 362, 362, 362, 145, 362, 362, 146, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 147, 142, 362, 143, 144, 362, 362, 362, + 362, 362, 145, 362, 362, 146, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 147, 149, 362, 150, 151, 362, 362, 362, 362, + 362, 362, 362, 362, 152, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 153, 149, 362, 150, 151, 362, 362, 362, 362, 362, + 362, 362, 362, 152, 362, 362, 362, 362, 362, 362, + + 362, 362, 362, 362, 362, 362, 362, 362, 362, 153, + 155, 362, 156, 157, 362, 362, 362, 362, 362, 158, + 362, 362, 159, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 160, 155, + 362, 156, 157, 362, 362, 362, 362, 362, 158, 362, + 362, 159, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 160, 162, 362, + 150, 163, 362, 362, 362, 362, 362, 362, 362, 362, + 164, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 165, 162, 362, 150, + + 163, 362, 362, 362, 362, 362, 362, 362, 362, 164, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 165, 167, 362, 168, 169, + 362, 362, 362, 362, 362, 362, 362, 362, 170, 362, + 362, 362, 362, 362, 171, 362, 172, 362, 362, 362, + 362, 362, 362, 362, 173, 167, 362, 168, 169, 362, + 362, 362, 362, 362, 362, 362, 362, 170, 362, 362, + 362, 362, 362, 171, 362, 172, 362, 362, 362, 362, + 362, 362, 362, 173, 174, 175, 174, 176, 177, 174, + 174, 174, 174, 174, 174, 174, 174, 178, 174, 174, + + 174, 174, 179, 180, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 181, 182, 362, 362, 362, 362, 362, + 362, 362, 362, 183, 362, 183, 183, 183, 183, 183, + 183, 183, 183, 183, 185, 362, 58, 186, 187, 362, + 362, 362, 362, 362, 362, 362, 188, 362, 362, 362, + 362, 362, 189, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 190, 185, 362, 58, 186, 187, 362, 362, + 362, 362, 362, 362, 362, 188, 362, 362, 362, 362, + 362, 189, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 190, 192, 362, 58, 193, 362, 362, 194, 362, + + 362, 362, 362, 362, 195, 362, 362, 362, 362, 362, + 196, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 197, 192, 362, 58, 193, 362, 362, 194, 362, 362, + 362, 362, 362, 195, 362, 362, 362, 362, 362, 196, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 197, + 198, 362, 198, 198, 198, 198, 198, 198, 198, 198, + 198, 200, 362, 72, 201, 362, 362, 362, 362, 362, + 362, 362, 362, 202, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 203, + 200, 362, 72, 201, 362, 362, 362, 362, 362, 362, + + 362, 362, 202, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 203, 205, + 362, 206, 207, 208, 362, 362, 209, 210, 362, 362, + 362, 211, 362, 362, 362, 212, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 213, 205, 362, + 206, 207, 208, 362, 362, 209, 210, 362, 362, 362, + 211, 362, 362, 362, 212, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 213, 215, 362, 58, + 216, 217, 362, 362, 362, 362, 362, 362, 362, 218, + 362, 362, 362, 362, 362, 219, 362, 362, 362, 362, + + 362, 362, 362, 362, 362, 220, 215, 362, 58, 216, + 217, 362, 362, 362, 362, 362, 362, 362, 218, 362, + 362, 362, 362, 362, 219, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 220, 226, 362, 362, 362, 226, + 362, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 362, 362, 362, 226, 362, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 103, 103, + + 103, 103, 103, 103, 103, 103, 103, 103, 103, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 184, 184, 184, 184, + 184, 184, 184, 184, 184, 184, 184, 191, 191, 191, + + 191, 191, 191, 191, 191, 191, 191, 191, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 223, 223, 223, 223, 223, 223, 223, 223, 223, + 223, 223, 226, 226, 235, 235, 239, 239, 362, 239, + 239, 239, 239, 239, 362, 239, 239, 242, 242, 242, + 362, 242, 362, 362, 362, 242, 242, 243, 243, 362, + 243, 243, 243, 243, 243, 243, 243, 243, 249, 362, + 362, 362, 249, 362, 362, 362, 249, 249, 253, 253, + + 362, 362, 253, 362, 362, 362, 253, 253, 260, 362, + 260, 260, 266, 266, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 271, 271, 362, 271, 271, + 271, 362, 271, 271, 271, 271, 275, 275, 362, 275, + 275, 275, 275, 275, 275, 275, 275, 278, 278, 362, + 278, 278, 278, 362, 278, 278, 278, 278, 282, 282, + 362, 282, 282, 282, 282, 282, 282, 282, 282, 287, + 287, 289, 289, 292, 292, 362, 292, 292, 292, 292, + 292, 292, 292, 292, 293, 293, 331, 331, 331, 331, + 331, 331, 331, 331, 331, 331, 331, 342, 342, 342, + + 342, 342, 342, 342, 342, 342, 342, 342, 356, 362, + 362, 356, 362, 362, 362, 362, 356, 356, 359, 362, + 362, 359, 362, 362, 362, 362, 362, 359, 360, 360, + 361, 361, 55, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362 + } ; + +static yyconst short int yy_chk[1664] = + { 0, + 0, 1, 64, 1, 1, 117, 64, 250, 250, 117, + 349, 60, 68, 1, 60, 68, 74, 85, 94, 74, + 85, 94, 348, 347, 78, 77, 77, 78, 100, 1, + 2, 100, 2, 2, 87, 87, 103, 101, 101, 101, + 104, 105, 2, 101, 107, 106, 123, 103, 108, 123, + 106, 104, 105, 106, 108, 107, 106, 346, 2, 3, + 110, 3, 3, 109, 109, 131, 135, 110, 131, 109, + 135, 3, 139, 146, 152, 139, 146, 152, 159, 164, + 170, 159, 164, 170, 341, 340, 336, 3, 4, 4, + 4, 4, 178, 4, 188, 178, 195, 188, 202, 195, + + 4, 202, 211, 218, 224, 211, 218, 228, 224, 236, + 228, 261, 236, 335, 334, 261, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 9, 230, 9, + 9, 240, 240, 240, 230, 329, 328, 240, 238, 9, + 242, 242, 242, 243, 238, 247, 242, 230, 326, 245, + + 246, 247, 230, 325, 243, 9, 10, 238, 10, 10, + 245, 246, 238, 249, 253, 253, 254, 269, 10, 249, + 253, 269, 316, 254, 323, 333, 339, 343, 316, 322, + 323, 333, 339, 343, 10, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 13, 345, 13, 13, 13, + 350, 352, 345, 353, 352, 354, 350, 13, 354, 353, + 13, 357, 321, 352, 352, 320, 319, 357, 354, 318, + 315, 314, 313, 13, 14, 312, 14, 14, 14, 311, + + 310, 308, 307, 306, 305, 304, 14, 303, 302, 14, + 300, 299, 298, 297, 286, 263, 262, 260, 259, 258, + 257, 256, 14, 15, 255, 15, 15, 237, 232, 231, + 229, 227, 219, 180, 172, 15, 171, 158, 145, 126, + 15, 121, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 17, 114, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 19, 113, 112, 111, 88, 79, 19, + 19, 76, 19, 55, 0, 0, 0, 0, 0, 19, + 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 23, 0, 23, 23, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, + 24, 24, 24, 0, 24, 0, 0, 0, 0, 0, + 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 25, 0, + 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 25, 26, 0, 26, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 27, 0, 27, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 27, 28, 0, 28, 28, 0, + 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 28, 29, 0, 29, 29, 0, 0, + + 0, 0, 0, 29, 0, 0, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 30, 0, 30, 30, 0, 0, 0, + 0, 0, 30, 0, 0, 30, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 31, 0, 31, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 32, 0, 32, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, + 33, 0, 33, 33, 0, 0, 0, 0, 0, 33, + 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, + 0, 34, 34, 0, 0, 0, 0, 0, 34, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 35, 0, + 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, + 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 35, 36, 0, 36, + + 36, 0, 0, 0, 0, 0, 0, 0, 0, 36, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 36, 37, 0, 37, 37, + 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, + 0, 0, 0, 0, 37, 0, 37, 0, 0, 0, + 0, 0, 0, 0, 37, 38, 0, 38, 38, 0, + 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, + 0, 0, 0, 38, 0, 38, 0, 0, 0, 0, + 0, 0, 0, 38, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 41, 0, 0, 0, 0, 0, + 0, 0, 0, 41, 0, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 43, 0, 43, 43, 43, 0, + 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, + 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 43, 44, 0, 44, 44, 44, 0, 0, + 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, + 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 44, 45, 0, 45, 45, 0, 0, 45, 0, + + 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, + 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45, 46, 0, 46, 46, 0, 0, 46, 0, 0, + 0, 0, 0, 46, 0, 0, 0, 0, 0, 46, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, + 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 49, 0, 49, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, + 50, 0, 50, 50, 0, 0, 0, 0, 0, 0, + + 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, + 0, 51, 51, 51, 0, 0, 51, 51, 0, 0, + 0, 51, 0, 0, 0, 51, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 51, 52, 0, + 52, 52, 52, 0, 0, 52, 52, 0, 0, 0, + 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 0, 53, + 53, 53, 0, 0, 0, 0, 0, 0, 0, 53, + 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 53, 54, 0, 54, 54, + 54, 0, 0, 0, 0, 0, 0, 0, 54, 0, + 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 54, 317, 0, 0, 0, 317, + 0, 317, 317, 317, 317, 317, 317, 317, 317, 317, + 332, 0, 0, 0, 332, 0, 332, 332, 332, 332, + 332, 332, 332, 332, 332, 363, 363, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 364, 364, 364, 364, + 364, 364, 364, 364, 364, 364, 364, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 366, 366, + + 366, 366, 366, 366, 366, 366, 366, 366, 366, 367, + 367, 367, 367, 367, 367, 367, 367, 367, 367, 367, + 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, + 368, 369, 369, 369, 369, 369, 369, 369, 369, 369, + 369, 369, 370, 370, 370, 370, 370, 370, 370, 370, + 370, 370, 370, 371, 371, 371, 371, 371, 371, 371, + 371, 371, 371, 371, 372, 372, 372, 372, 372, 372, + 372, 372, 372, 372, 372, 373, 373, 373, 373, 373, + 373, 373, 373, 373, 373, 373, 374, 374, 374, 374, + 374, 374, 374, 374, 374, 374, 374, 375, 375, 375, + + 375, 375, 375, 375, 375, 375, 375, 375, 376, 376, + 376, 376, 376, 376, 376, 376, 376, 376, 376, 377, + 377, 377, 377, 377, 377, 377, 377, 377, 377, 377, + 378, 378, 378, 378, 378, 378, 378, 378, 378, 378, + 378, 379, 379, 379, 379, 379, 379, 379, 379, 379, + 379, 379, 380, 380, 381, 381, 382, 382, 0, 382, + 382, 382, 382, 382, 0, 382, 382, 383, 383, 383, + 0, 383, 0, 0, 0, 383, 383, 384, 384, 0, + 384, 384, 384, 384, 384, 384, 384, 384, 385, 0, + 0, 0, 385, 0, 0, 0, 385, 385, 386, 386, + + 0, 0, 386, 0, 0, 0, 386, 386, 387, 0, + 387, 387, 388, 388, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 390, 390, 0, 390, 390, + 390, 0, 390, 390, 390, 390, 391, 391, 0, 391, + 391, 391, 391, 391, 391, 391, 391, 392, 392, 0, + 392, 392, 392, 0, 392, 392, 392, 392, 393, 393, + 0, 393, 393, 393, 393, 393, 393, 393, 393, 394, + 394, 395, 395, 396, 396, 0, 396, 396, 396, 396, + 396, 396, 396, 396, 397, 397, 398, 398, 398, 398, + 398, 398, 398, 398, 398, 398, 398, 399, 399, 399, + + 399, 399, 399, 399, 399, 399, 399, 399, 400, 0, + 0, 400, 0, 0, 0, 0, 400, 400, 401, 0, + 0, 401, 0, 0, 0, 0, 0, 401, 402, 402, + 403, 403, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362 + } ; + +static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; +static char *yy_full_match; +static int yy_lp; +static int yy_looking_for_trail_begin = 0; +static int yy_full_lp; +static int *yy_full_state; +#define YY_TRAILING_MASK 0x2000 +#define YY_TRAILING_HEAD_MASK 0x4000 +#define REJECT \ +{ \ +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ +yy_cp = yy_full_match; /* restore poss. backed-over text */ \ +yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \ +yy_state_ptr = yy_full_state; /* restore orig. state */ \ +yy_current_state = *yy_state_ptr; /* restore curr. state */ \ +++yy_lp; \ +goto find_rule; \ +} +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "pre.l" +#define INITIAL 0 +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +#line 18 "pre.l" + +/* + * includes + */ + +#include +#include +#include +#include + +#include "qtbc.h" +#include +#include +#include +#include +#include +#include +#include + +#include "constexp.h" +#include "define.h" +#include "doxygen.h" +#include "message.h" +#include "util.h" +#include "defargs.h" + +#if defined(_MSC_VER) || defined(__BORLANDC__) +#define popen _popen +#define pclose _pclose +#endif + +#define YY_NEVER_INTERACTIVE 1 + +#define DUMP_OUTPUT 0 // set this to one to see what the preprocessor + // produces. +#define SHOW_INCLUDES 0 // set this to one to list all parsed include files + +struct FileState +{ + int lineNr; + FILE *filePtr; + YY_BUFFER_STATE bufState; + QCString fileName; +}; + +/* ----------------------------------------------------------------- + * + * statics + */ + +static int yyLineNr = 1; +static QCString yyFileName; +static int ifcount = 0; +static QStrList *pathList = 0; +static QStack includeStack; +static QDict *argDict; +static int defArgs = -1; +static QCString defName; +static QCString defText; +static QCString defArgsStr; +static bool defVarArgs; +static int level; +static int lastCContext; +static int lastCPPContext; +static QArray levelGuard; +static QCString guardExpr; +static BufStr *outputBuf; +static int roundCount; +static bool quoteArg; +static DefineDict *fileDefineDict; +static DefineDict *expandedDict; +static int findDefArgContext; + +static QCString lastGuardName; + + +static void incrLevel() +{ + level++; + levelGuard.resize(level); + levelGuard[level-1]=FALSE; + //printf("%s line %d: incrLevel %d\n",yyFileName.data(),yyLineNr,level); +} + +static void decrLevel() +{ + //printf("%s line %d: decrLevel %d\n",yyFileName.data(),yyLineNr,level); + if (level > 0) + { + level--; + levelGuard.resize(level); + } + else + { + err("Error: More #endif's than #if's found.\n"); + } +} + +static bool otherCaseDone() +{ + return levelGuard[level-1]; +} + +static void setCaseDone(bool value) +{ + levelGuard[level-1]=value; +} + +static Define *isDefined(const char *name) +{ + if (name) + { + Define *def; + //if ((def=fileDefineCache->findDefine(yyFileName,name)) && !def->undef) + // return def; + if ((def=fileDefineDict->find(name)) && !def->undef) return def; + } + return 0; +} + +static FILE *findFile(const char *fileName) +{ + if (pathList==0) + { + return 0; + } + char *s=pathList->first(); + while (s) + { + QCString absName=(QCString)s+"/"+fileName; + QFileInfo fi(absName); + if (fi.exists()) + { + FILE *f; + if (!Config::inputFilter.isEmpty()) + { + QCString cmd = Config::inputFilter+" "+absName; + f=popen(cmd,"r"); + if (!f) warn("Warning: could not execute filter %s\n",cmd.data()); + } + else + { + f=fopen(absName,"r"); + if (!f) warn("Warning: could not open file %s for reading\n",absName.data()); + } + if (f) + { + yyFileName=absName; + yyLineNr=1; + return f; + } + } + s=pathList->next(); + } + return 0; +} + + +static int getNextChar(const QCString &expr,QCString *rest,uint &pos); +static int getCurrentChar(const QCString &expr,QCString *rest,uint pos); +static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c); +static void expandExpression(QCString &expr,QCString *rest,int pos); + +static QCString stringize(const QCString &s) +{ + QCString result; + uint i=0; + bool inString=FALSE; + bool inChar=FALSE; + char c,pc; + while (i`%s'\n",s.data(),result.data()); + return result; +} + +/*! Execute all ## operators in expr. + * If the macro name before or after the operator contains a no-rescan + * marker (@-) then this is removed (before the concatenated macro name + * may be expanded again. + */ +static void processConcatOperators(QCString &expr) +{ + QRegExp r("[ \\t\\n]*##[ \\t\\n]*"); + int l,n,i=0; + while ((n=r.match(expr,i,&l))!=-1) + { + if (n+l+1<(int)expr.length() && expr.at(n+l)=='@' && expr.at(n+l+1)=='-') + { + // remove no-rescan marker after ID + l+=2; + } + // remove the ## operator and the surrounding whitespace + expr=expr.left(n)+expr.right(expr.length()-n-l); + int k=n-1; + while (k>=0 && isId(expr.at(k))) k--; + if (k>0 && expr.at(k)=='-' && expr.at(k-1)=='@') + { + // remove no-rescan marker before ID + expr=expr.left(k-1)+expr.right(expr.length()-k-1); + n-=2; + } + i=n+l; + } +} + +/*! replaces the function macro \a def whose argument list starts at + * \a pos in expression \a expr. + * Notice that this routine may scan beyond the \a expr string if needed. + * The characters from the input file will be read. + * The replacement string will be returned in \a result and the + * length of the (unexpanded) argument list is stored in \a len. + */ +static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int &len,const Define *def,QCString &result) +{ + //printf("replaceFunctionMacro(expr=%s,rest=%s,pos=%d,def=%s) level=%d\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),level); + //bool replaced=FALSE; + uint j=pos; + len=0; + result.resize(0); + int cc; + while ((cc=getCurrentChar(expr,rest,j))!=EOF && cc==' ') + { + len++; + getNextChar(expr,rest,j); + } + if (cc!='(') + { + unputChar(expr,rest,j,' '); + return FALSE; + } + getNextChar(expr,rest,j); // eat the `(' character + + //while (j argTable; // list of arguments + argTable.setAutoDelete(TRUE); + QCString arg; + int argCount=0; + bool done=FALSE; + + // FASE 1: read the macro arguments + if (def->nargs==0) + { + while ((cc=getNextChar(expr,rest,j))!=EOF) + { + char c = (char)cc; + if (c==')') break; + } + } + else + { + while (!done && (argCountnargs || def->varArgs) && + ((cc=getNextChar(expr,rest,j))!=EOF) + ) + { + char c=(char)cc; + if (c=='(') // argument is a function => search for matching ) + { + int level=1; + arg+=c; + char term='\0'; + while ((cc=getNextChar(expr,rest,j))!=EOF) + { + char c=(char)cc; + if (c=='\'' || c=='\"') // skip ('s and )'s inside strings + { + if (term!='\0') + { + if (c==term && expr.at(j-2)!='\\') term='\0'; + } + else + { + term=c; + } + } + if (term=='\0' && c==')') + { + level--; + arg+=c; + if (level==0) break; + } + else if (term=='\0' && c=='(') + { + level++; + arg+=c; + } + else + arg+=c; + } + } + else if (c==')' || c==',') // last or next argument found + { + if (c==',' && argCount==def->nargs-1 && def->varArgs) + { + arg=arg.stripWhiteSpace(); + arg+=','; + } + else + { + QCString argKey; + argKey.sprintf("@%d",argCount++); // key name + arg=arg.stripWhiteSpace(); + // add argument to the lookup table + argTable.insert(argKey, new QCString(arg)); + arg.resize(0); + if (c==')') // end of the argument list + { + done=TRUE; + } + } + } + else if (c=='\"') // append literal strings + { + arg+=c; + char pc=c; + bool found=FALSE; + while (!found && (cc=getNextChar(expr,rest,j))!=EOF) + { + found = pc!='\\' && cc=='"'; + c=(char)cc; + pc=c; + arg+=c; + } + } + else if (c=='\'') // append literal characters + { + arg+=c; + char pc=c; + bool found=FALSE; + while (!found && (cc=getNextChar(expr,rest,j))!=EOF) + { + found = pc!='\\' && cc=='\''; + c=(char)cc; + pc=c; + arg+=c; + } + } + else // append other characters + { + arg+=c; + } + } + } + + // FASE 2: apply the macro function + if (argCount==def->nargs || + (argCount>def->nargs && def->varArgs)) // matching parameters lists + { + uint k=0; + // substitution of all formal arguments + QCString resExpr; + const QCString d=def->definition.stripWhiteSpace(); + bool inString=FALSE; + while (k copy it (is unescaped later) + { + k+=2; + resExpr+="@@"; // we unescape these later + } + else if (d.at(k+1)=='-') // no-rescan marker + { + k+=2; + resExpr+="@-"; + } + else // argument marker => read the argument number + { + QCString key="@"; + QCString *subst=0; + bool hash=FALSE; + int l=k-1; + // search for ## backward + if (l>=0 && d.at(l)=='"') l--; + while (l>=0 && d.at(l)==' ') l--; + if (l>0 && d.at(l)=='#' && d.at(l-1)=='#') hash=TRUE; + k++; + // scan the number + while (k='0' && d.at(k)<='9') key+=d.at(k++); + if (!hash) + { + // search for ## forward + l=k; + if (l<(int)d.length() && d.at(l)=='"') l++; + while (l<(int)d.length() && d.at(l)==' ') l++; + if (l<(int)d.length()-1 && d.at(l)=='#' && d.at(l+1)=='#') hash=TRUE; + } + //printf("request key %s result %s\n",key.data(),args[key]->data()); + if (key.length()>1 && (subst=argTable[key])) + { + QCString substArg=*subst; + // only if no ## operator is before or after the argument + // marker we do macro expansion. + if (!hash) expandExpression(substArg,0,0); + if (inString) + { + //printf("`%s'=stringize(`%s')\n",stringize(*subst).data(),subst->data()); + + // if the marker is inside a string (because a # was put + // before the macro name) we must escape " and \ characters + resExpr+=stringize(substArg); + } + else + { + resExpr+=substArg; + } + } + } + } + else // no marker, just copy + { + if (!inString && d.at(k)=='\"') + { + inString=TRUE; // entering a literal string + } + else if (inString && d.at(k)=='\"' && d.at(k-1)!='\\') + { + inString=FALSE; // leaving a literal string + } + resExpr+=d.at(k++); + } + } + len=j-pos; + result=resExpr; + //printf("result after substitution `%s' expr=`%s'\n", + // result.data(),expr.mid(pos,len).data()); + return TRUE; + } + else + { + return FALSE; + } +} + + +/*! returns the next identifier in string \a expr by starting at position \a p. + * The position of the identifier is returned (or -1 if nothing is found) + * and \a l is its length. Any quoted strings are skipping during the search. + */ +static int getNextId(const QCString &expr,int p,int *l) +{ + int n; + while (p<(int)expr.length()) + { + char c=expr.at(p++); + if (isalpha(c) || c=='_') // read id + { + n=p-1; + while (p<(int)expr.length() && isId(expr.at(p)) + ) p++; + *l=p-n; + return n; + } + else if (c=='"') // skip string + { + char pc=c; + if (p<(int)expr.length()) c=expr.at(p); + while (p<(int)expr.length() && (c!='"' || pc=='\\')) + { + pc=c; + c=expr.at(p); + p++; + } + } + } + return -1; +} + +/*! preforms recursive macro expansion on the string \a expr + * starting at position \a pos. + * May read additional characters from the input while re-scanning! + * If \a expandAll is \c TRUE then all macros in the expression are + * expanded, otherwise only the first is expanded. + */ +static void expandExpression(QCString &expr,QCString *rest,int pos) +{ + //printf("expandExpression(%s,%s)\n",expr.data(),rest ? rest->data() : 0); + QCString macroName; + QCString expMacro; + int i=pos,l,p,len; + while ((p=getNextId(expr,i,&l))!=-1) // search for an macro name + { + bool replaced=FALSE; + macroName=expr.mid(p,l); + //printf("macroName %s found\n",macroName.data()); + if (p<2 || !(expr.at(p-2)=='@' && expr.at(p-1)=='-')) // no-rescan marker? + { + if (expandedDict->find(macroName)==0) // expand macro + { + Define *def=isDefined(macroName); + //printf("name is not an expanded macro def=%s\n",def ? def->name.data() : 0); + if (def && def->nargs==-1) // simple macro + { + // substitute the definition of the macro + expMacro=def->definition.stripWhiteSpace(); + replaced=TRUE; + len=l; + //printf("simple macro expansion=`%s'->`%s'\n",macroName.data(),expMacro.data()); + } + else if (def && def->nargs>=0) // function macro + { + replaced=replaceFunctionMacro(expr,rest,p+l,len,def,expMacro); + len+=l; + } + + if (replaced) // expand the macro and rescan the expression + { + + //printf("replacing `%s'->`%s'\n",expr.mid(p,len).data(),expMacro.data()); + QCString resultExpr=expMacro; + QCString restExpr=expr.right(expr.length()-len-p); + processConcatOperators(resultExpr); + if (!def->nonRecursive) + { + expandedDict->insert(macroName,def); + expandExpression(resultExpr,&restExpr,0); + expandedDict->remove(macroName); + } + expr=expr.left(p)+resultExpr+restExpr; + i=p; + //printf("new expression: %s\n",expr.data()); + } + else // move to the next macro name + { + //printf("moving to the next macro old=%d new=%d\n",i,p+l); + i=p+l; + } + } + else // move to the next macro name + { + expr=expr.left(p)+"@-"+expr.right(expr.length()-p); + //printf("macro already expanded, moving to the next macro expr=%s\n",expr.data()); + i=p+l+2; + //i=p+l; + } + } + else // no re-scan marker found, skip the macro name + { + //printf("skipping marked macro\n"); + i=p+l; + } + } +} + +/*! replaces all occurrences of @@ in \a s by @ + * All identifiers found are replaced by 0L + * \par assumption: + * \a s only contains pairs of @@'s. + */ +QCString removeIdsAndMarkers(const char *s) +{ + //printf("removeIdsAndMarkers(%s)\n",s); + const char *p=s; + char c; + bool inNum=FALSE; + QCString result; + if (p) + { + while ((c=*p)) + { + if (c=='@') // replace @@ with @ + { + if (*(p+1)=='@') + { + result+=c; + } + p+=2; + } + else if (isdigit(c)) + { + result+=c; + p++; + inNum=TRUE; + } + else if ((isalpha(c) || c=='_') && !inNum) // replace identifier with 0L + { + result+="0L"; + p++; + while ((c=*p) && isId(c)) p++; + } + else + { + result+=c; + char lc=tolower(c); + if (lc!='l' && lc!='u') inNum=FALSE; + p++; + } + } + } + return result; +} + +/*! replaces all occurrences of @@ in \a s by @ + * \par assumption: + * \a s only contains pairs of @@'s + */ +QCString removeMarkers(const char *s) +{ + const char *p=s; + char c; + QCString result; + if (p) + { + while ((c=*p)) + { + if (c=='@') // replace @@ with @ + { + if (*(p+1)=='@') + { + result+=c; + } + p+=2; + } + else + { + result+=c; + p++; + } + } + } + return result; +} + +/*! compute the value of the expression in string \a expr. + * If needed the function may read additional characters from the input. + */ + +bool computeExpression(const QCString &expr) +{ + QCString e=expr; + expandExpression(e,0,0); + e = removeIdsAndMarkers(e); + if (e.length()==0) return FALSE; + return parseCppExpression(e); +} + +/*! expands the macro definition in \a name + * If needed the function may read additional characters from the input + */ + +QCString expandMacro(const QCString &name) +{ + QCString n=name; + expandExpression(n,0,0); + n=removeMarkers(n); + //printf("expandMacro `%s'->`%s'\n",name.data(),n.data()); + return n; +} + +Define *newDefine() +{ + Define *def=new Define; + def->name = defName; + def->definition = defText.stripWhiteSpace(); + def->nargs = defArgs; + def->fileName = yyFileName; + def->lineNr = yyLineNr; + def->varArgs = defVarArgs; + return def; +} + +void addDefine() +{ + bool ambig; + FileDef *fd=findFileDef(&inputNameDict,yyFileName,ambig); + MemberDef *md=new MemberDef("#define",defName,defArgsStr,0, + Public,Normal,FALSE,FALSE,MemberDef::Define,0,0); + ArgumentList *argList = new ArgumentList; + stringToArgumentList(defArgsStr,argList); + md->setArgumentList(argList); + md->setDefFile(yyFileName); + md->setDefLine(yyLineNr); + md->setFileDef(fd); + md->setDefinition("#define "+defName); + + MemberName *mn=functionNameDict[defName]; + if (mn==0) + { + mn = new MemberName(defName); + functionNameList.inSort(mn); + functionNameDict.insert(defName,mn); + } + mn->append(md); + if (fd) fd->insertMember(md); + + Define *d; + if ((d=defineDict[defName])==0) defineDict.insert(defName,newDefine()); + +} + +static void outputChar(char c) +{ + if (includeStack.isEmpty()) outputBuf->addChar(c); +} + +static void outputArray(const char *a,int len) +{ + if (includeStack.isEmpty()) outputBuf->addArray(a,len); +} + +static void readIncludeFile(const QCString &inc) +{ + if (!Config::searchIncludeFlag) return; // do not read include files + uint i=0; + // find the start of the include file name + while (is) // valid include file name found + { + QCString incFileName=inc.mid(s,i-s).stripWhiteSpace(); + + FILE *f; + QCString oldFileName=yyFileName.copy(); + if ((f=findFile(incFileName))) // see if the include file can be found + { +#if SHOW_INCLUDES + for (i=0;ibufState=YY_CURRENT_BUFFER; + fs->lineNr=yyLineNr; + fs->fileName=oldFileName; + fs->filePtr=f; + // push the state on the stack + includeStack.push(fs); + // set the scanner to the include file + preYYin=f; + yy_switch_to_buffer(yy_create_buffer(preYYin, YY_BUF_SIZE)); + } + else + { +#if SHOW_INCLUDES + msg("#include %s: not found! skipping...\n",incFileName.data()); + //printf("Error: include file %s not found\n",yytext); +#endif + } + } +} + +/* ----------------------------------------------------------------- */ + +#define Start 1 + +#define Command 2 + +#define SkipCommand 3 + +#define SkipLine 4 + +#define CopyLine 5 + +#define Include 6 + +#define IncludeID 7 + +#define DefName 8 + +#define DefineArg 9 + +#define DefineText 10 + +#define SkipCPPBlock 11 + +#define Ifdef 12 + +#define Ifndef 13 + +#define SkipCComment 14 + +#define SkipCPPComment 15 + +#define RemoveCComment 16 + +#define RemoveCPPComment 17 + +#define Guard 18 + +#define DefinedExpr1 19 + +#define DefinedExpr2 20 + +#define SkipDoubleQuote 21 + +#define SkipSingleQuote 22 + +#define UndefName 23 + +#define IgnoreLine 24 + +#define FindDefineArgs 25 + +#define ReadString 26 + + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + yy_current_buffer->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 864 "pre.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 363 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 1633 ); + +yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + if ( yy_act & YY_TRAILING_HEAD_MASK || + yy_looking_for_trail_begin ) + { + if ( yy_act == yy_looking_for_trail_begin ) + { + yy_looking_for_trail_begin = 0; + yy_act &= ~YY_TRAILING_HEAD_MASK; + break; + } + } + else if ( yy_act & YY_TRAILING_MASK ) + { + yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK; + yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK; + } + else + { + yy_full_match = yy_cp; + yy_full_state = yy_state_ptr; + yy_full_lp = yy_lp; + break; + } + ++yy_lp; + goto find_rule; + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +YY_RULE_SETUP +#line 866 "pre.l" + + YY_BREAK +case 2: +YY_RULE_SETUP +#line 867 "pre.l" + + YY_BREAK +case 3: +YY_RULE_SETUP +#line 868 "pre.l" + + YY_BREAK +/* +^{B}*([^ \t#\n\/][^\n]*)?"\n" { + //printf("%s line %d: %s",yyFileName.data(),yyLineNr,yytext); + if (includeStack.isEmpty()) + { + //preprocessedFile+=yytext; + //char *s=yytext,c; + //if (s) while ((c=*s++)) *dataPtr++=c; + outputBuf->addArray(yytext,yyleng); + } + yyLineNr++; + } + */ +case 4: +YY_RULE_SETUP +#line 882 "pre.l" +{ BEGIN(Command); } + YY_BREAK +case 5: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 883 "pre.l" +{ + outputArray(yytext,yyleng); + BEGIN(CopyLine); + } + YY_BREAK +/* +[^\n/]+ { + outputArray(yytext,yyleng); + } + */ +case 6: +YY_RULE_SETUP +#line 892 "pre.l" +{ + Define *def=0; + //printf("Search for define %s\n",yytext); + if (includeStack.isEmpty() && + Config::macroExpansionFlag && + /* (expandDefine=fileDefineCache->findDefine(yyFileName,yytext)) */ + (def=fileDefineDict->find(yytext)) && + (!Config::onlyPredefinedFlag || def->isPredefined) + ) + { + //printf("Found it!\n"); + roundCount=0; + defArgsStr=yytext; + if (def->nargs==-1) // no function macro + { + QCString result = expandMacro(defArgsStr); + //printf("result=`%s'\n",result.data()); + outputArray(result,result.length()); + } + else // zero or more arguments + { + findDefArgContext = CopyLine; + BEGIN(FindDefineArgs); + } + } + else + { + outputArray(yytext,yyleng); + } + } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 922 "pre.l" +{ + Define *def=0; + //printf("Search for define %s\n",yytext); + if (includeStack.isEmpty() && + Config::macroExpansionFlag && + (def=fileDefineDict->find(yytext)) && + def->nargs==-1 && + (!Config::onlyPredefinedFlag || def->isPredefined) + ) + { + //printf("Found it!\n"); + QCString name=yytext; + QCString result=expandMacro(name); + //printf("result=`%s'\n",result.data()); + outputArray(result,result.length()); + } + else + { + outputArray(yytext,yyleng); + } + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 943 "pre.l" +{ + outputChar(*yytext); + } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 946 "pre.l" +{ + outputChar('\n'); + BEGIN(Start); + yyLineNr++; + } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 951 "pre.l" +{ + defArgsStr+='('; + roundCount++; + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 955 "pre.l" +{ + defArgsStr+=')'; + roundCount--; + if (roundCount==0) + { + //printf("defArgsStr=`%s'\n",defArgsStr.data()); + QCString result=expandMacro(defArgsStr); + if (findDefArgContext==CopyLine) + { + outputArray(result,result.length()); + BEGIN(findDefArgContext); + } + else // findDefArgContext==IncludeID + { + readIncludeFile(result); + BEGIN(Start); + } + } + } + YY_BREAK +/* +")"{B}*"(" { + defArgsStr+=yytext; + } + */ +case 12: +YY_RULE_SETUP +#line 979 "pre.l" +{ + defArgsStr+=*yytext; + BEGIN(ReadString); + } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 983 "pre.l" +{ + yyLineNr++; + outputChar('\n'); + } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 987 "pre.l" +{ + defArgsStr+="@@"; + } + YY_BREAK +case 15: +YY_RULE_SETUP +#line 990 "pre.l" +{ + defArgsStr+=*yytext; + } + YY_BREAK +case 16: +YY_RULE_SETUP +#line 993 "pre.l" +{ + defArgsStr+=yytext; + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 996 "pre.l" +{ + defArgsStr+=*yytext; + BEGIN(FindDefineArgs); + } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 1000 "pre.l" +{ + defArgsStr+=yytext; + } + YY_BREAK +case 19: +YY_RULE_SETUP +#line 1003 "pre.l" +{ + defArgsStr+=*yytext; + } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 1006 "pre.l" +{ + if (Config::macroExpansionFlag) + BEGIN(IncludeID); + } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 1010 "pre.l" +{ + BEGIN(Include); + } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 1013 "pre.l" +{ + //printf("!!!DefName\n"); + BEGIN(DefName); + } + YY_BREAK +case 23: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 5; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1017 "pre.l" +{ + incrLevel(); + guardExpr.resize(0); + BEGIN(DefinedExpr2); + } + YY_BREAK +case 24: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 5; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1022 "pre.l" +{ + //printf("Pre.l: ifdef\n"); + incrLevel(); + guardExpr.resize(0); + BEGIN(DefinedExpr1); + } + YY_BREAK +case 25: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 6; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1028 "pre.l" +{ + incrLevel(); + guardExpr="! "; + BEGIN(DefinedExpr2); + } + YY_BREAK +case 26: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 6; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1033 "pre.l" +{ + incrLevel(); + guardExpr="! "; + BEGIN(DefinedExpr1); + } + YY_BREAK +case 27: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 2; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1038 "pre.l" +{ + incrLevel(); + guardExpr.resize(0); + BEGIN(Guard); + } + YY_BREAK +case 28: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 4; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1043 "pre.l" +{ + if (!otherCaseDone()) + { + guardExpr.resize(0); + BEGIN(Guard); + } + else + { + ifcount=0; + BEGIN(SkipCPPBlock); + } + } + YY_BREAK +case 29: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 4; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1055 "pre.l" +{ + //printf("else levelGuard[%d]=%d\n",level-1,levelGuard[level-1]); + if (otherCaseDone()) + { + ifcount=0; + BEGIN(SkipCPPBlock); + } + else + { + setCaseDone(TRUE); + //levelGuard[level-1]=TRUE; + } + } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 1068 "pre.l" +{ + BEGIN(UndefName); + } + YY_BREAK +case 31: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 4; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1071 "pre.l" +{ + if (!otherCaseDone()) + { + guardExpr.resize(0); + BEGIN(Guard); + } + } + YY_BREAK +case 32: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 5; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1078 "pre.l" +{ + //printf("Pre.l: #endif\n"); + decrLevel(); + } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 1082 "pre.l" +{ + outputChar('\n'); + BEGIN(Start); + yyLineNr++; + } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 1087 "pre.l" +{ // unknown directive + BEGIN(IgnoreLine); + } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 1090 "pre.l" + + YY_BREAK +case 36: +YY_RULE_SETUP +#line 1091 "pre.l" + + YY_BREAK +case 37: +YY_RULE_SETUP +#line 1092 "pre.l" +{ + Define *def; + if ((def=isDefined(yytext))) + { + //printf("undefining %s\n",yytext); + def->undef=TRUE; + } + BEGIN(Start); + } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 1101 "pre.l" +{ + outputChar('\n'); + guardExpr+=' '; + yyLineNr++; + } + YY_BREAK +case 39: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 7; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1106 "pre.l" +{ + BEGIN(DefinedExpr2); + } + YY_BREAK +case 40: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 7; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1109 "pre.l" +{ + BEGIN(DefinedExpr1); + } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 1112 "pre.l" +{ guardExpr+=*yytext; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 1113 "pre.l" +{ + outputChar('\n'); + yyLineNr++; + //printf("Guard: `%s'\n", + // guardExpr.data()); + bool guard=computeExpression(guardExpr); + setCaseDone(guard); + //printf("if levelGuard[%d]=%d\n",level-1,levelGuard[level-1]); + if (guard) + { + BEGIN(Start); + } + else + { + ifcount=0; + BEGIN(SkipCPPBlock); + } + } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 1131 "pre.l" +{ yyLineNr++; outputChar('\n'); } + YY_BREAK +case 44: +YY_RULE_SETUP +#line 1132 "pre.l" +{ + if (isDefined(yytext)) + guardExpr+=" 1L "; + else + guardExpr+=" 0L "; + lastGuardName=yytext; + BEGIN(Guard); + } + YY_BREAK +case 45: +YY_RULE_SETUP +#line 1140 "pre.l" +{ + if (isDefined(yytext)) + guardExpr+=" 1L "; + else + guardExpr+=" 0L "; + lastGuardName.resize(0); + } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 1147 "pre.l" +{ // should not happen, handle anyway + ifcount=0; + BEGIN(SkipCPPBlock); + } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 1151 "pre.l" +{ + BEGIN(Guard); + } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 1154 "pre.l" + + YY_BREAK +case 49: +YY_RULE_SETUP +#line 1155 "pre.l" +{ BEGIN(SkipCommand); } + YY_BREAK +case 50: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1156 "pre.l" +{ BEGIN(SkipLine); } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 1157 "pre.l" + + YY_BREAK +case 52: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1158 "pre.l" +{ + incrLevel(); + ifcount++; + //printf("#if... depth=%d\n",ifcount); + } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 1163 "pre.l" +{ + //printf("Else! ifcount=%d otherCaseDone=%d\n",ifcount,otherCaseDone()); + if (ifcount==0 && !otherCaseDone()) + { + setCaseDone(TRUE); + //outputChar('\n'); + BEGIN(Start); + } + } + YY_BREAK +case 54: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 4; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1172 "pre.l" +{ + if (ifcount==0) + { + if (!otherCaseDone()) + { + guardExpr.resize(0); + lastGuardName.resize(0); + BEGIN(Guard); + } + else + { + BEGIN(SkipCPPBlock); + } + } + } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 1187 "pre.l" +{ + decrLevel(); + if (--ifcount<0) + { + //outputChar('\n'); + BEGIN(Start); + } + } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 1195 "pre.l" +{ + outputChar('\n'); + yyLineNr++; + BEGIN(SkipCPPBlock); + } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 1200 "pre.l" +{ // unknown directive + BEGIN(SkipLine); + } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 1203 "pre.l" + + YY_BREAK +case 59: +YY_RULE_SETUP +#line 1204 "pre.l" + + YY_BREAK +case 60: +YY_RULE_SETUP +#line 1205 "pre.l" + + YY_BREAK +case 61: +YY_RULE_SETUP +#line 1206 "pre.l" +{ + lastCPPContext=YY_START; + BEGIN(RemoveCPPComment); + } + YY_BREAK +case 62: +YY_RULE_SETUP +#line 1210 "pre.l" +{ + lastCContext=YY_START; + BEGIN(RemoveCComment); + } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 1214 "pre.l" +{ + outputChar('\n'); + yyLineNr++; + BEGIN(SkipCPPBlock); + } + YY_BREAK +case 64: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1219 "pre.l" +{ + roundCount=0; + defArgsStr=yytext; + findDefArgContext = IncludeID; + BEGIN(FindDefineArgs); + } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 1225 "pre.l" +{ + readIncludeFile(expandMacro(yytext)); + BEGIN(Start); + } + YY_BREAK +case 66: +YY_RULE_SETUP +#line 1229 "pre.l" +{ + QCString incName=yytext; + //int l=incName.length(); + //QCString incFileName=incName.left(l-1); + //if (fileDefineCache->fileCached(incFileName)) + //{ + // printf("file already cached!\n"); + // fileDefineCache->merge(incFileName,yyFileName); + //} + //else if ((f=findFile(incFileName))) + readIncludeFile(incName); + + BEGIN(Start); + } + YY_BREAK +case 67: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1243 "pre.l" +{ + //printf("Define() `%s'\n",yytext); + argDict = new QDict(31); + argDict->setAutoDelete(TRUE); + defArgs = 0; + defArgsStr.resize(0); + defText.resize(0); + defName = yytext; + defVarArgs = FALSE; + BEGIN(DefineArg); + } + YY_BREAK +case 68: +YY_RULE_SETUP +#line 1254 "pre.l" +{ + //printf("Define `%s'\n",yytext); + argDict = 0; + defArgs = -1; + defArgsStr.resize(0); + defText.resize(0); + defName = yytext; + defVarArgs = FALSE; + QCString tmp=(QCString)"#define "+defName+defArgsStr; + outputArray(tmp.data(),tmp.length()); + quoteArg=FALSE; + BEGIN(DefineText); + } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 1267 "pre.l" +{ + argDict = 0; + defArgs = -1; + defName = yytext; + defArgsStr.resize(0); + defText.resize(0); + defVarArgs = FALSE; + if ( defName!=lastGuardName ) + { // define may appear in the output + QCString tmp=(QCString)"#define "+defName+defArgsStr; + outputArray(tmp.data(),tmp.length()); + quoteArg=FALSE; + BEGIN(DefineText); + } + else // define is a guard => hide + { + //printf("Found a guard %s\n",yytext); + Define *def=0; + //if (includeStack.isEmpty()) + //{ + // addDefine(); + //} + if (/*!Config::onlyPredefinedFlag &&*/ (def=fileDefineDict->find(defName))==0) + { + fileDefineDict->insert(defName,newDefine()); + } + else if (def)// name already exists + { + if (def->undef) // undefined name + { + def->undef = FALSE; + def->name = defName; + def->definition = defText.stripWhiteSpace(); + def->nargs = defArgs; + def->fileName = yyFileName; + def->lineNr = yyLineNr; + } + else + { + //printf("Error: define %s is defined more than once!\n",defName.data()); + } + } + //outputChar('\n'); + lastGuardName.resize(0); + BEGIN(Start); + } + } + YY_BREAK +case 70: +YY_RULE_SETUP +#line 1314 "pre.l" +{ defArgsStr+=yytext; } + YY_BREAK +case 71: +YY_RULE_SETUP +#line 1315 "pre.l" +{ defArgsStr+=yytext; } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 1316 "pre.l" +{ + defArgsStr+=yytext; + QCString tmp=(QCString)"#define "+defName+defArgsStr; + outputArray(tmp.data(),tmp.length()); + quoteArg=FALSE; + BEGIN(DefineText); + } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 1323 "pre.l" +{ + //printf("Define addArg(%s)\n",yytext); + QCString argName=yytext; + defVarArgs = yytext[yyleng-1]=='.'; + if (defVarArgs) // strip ellipsis + argName=argName.left(argName.length()-3); + defArgsStr+=yytext; + argDict->insert(argName,new int(defArgs)); + defArgs++; + } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 1333 "pre.l" +{ + outputChar('/');outputChar('*'); + defText+=' '; + lastCContext=YY_START; + BEGIN(SkipCComment); + } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 1339 "pre.l" +{ + outputChar('/');outputChar('/'); + lastCPPContext=YY_START; + BEGIN(SkipCPPComment); + } + YY_BREAK +case 76: +YY_RULE_SETUP +#line 1344 "pre.l" +{ + outputChar('*');outputChar('/'); + BEGIN(lastCContext); + } + YY_BREAK +case 77: +YY_RULE_SETUP +#line 1348 "pre.l" +{ + outputChar('/');outputChar('/'); + } + YY_BREAK +case 78: +YY_RULE_SETUP +#line 1351 "pre.l" +{ + outputChar('/');outputChar('*'); + } + YY_BREAK +case 79: +YY_RULE_SETUP +#line 1354 "pre.l" +{ + outputArray(yytext,yyleng); + } + YY_BREAK +case 80: +YY_RULE_SETUP +#line 1357 "pre.l" +{ + yyLineNr++; + outputChar('\n'); + } + YY_BREAK +case 81: +YY_RULE_SETUP +#line 1361 "pre.l" +{ + outputChar(*yytext); + } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 1364 "pre.l" +{ BEGIN(lastCContext); } + YY_BREAK +case 83: +YY_RULE_SETUP +#line 1365 "pre.l" + + YY_BREAK +case 84: +YY_RULE_SETUP +#line 1366 "pre.l" + + YY_BREAK +case 85: +YY_RULE_SETUP +#line 1367 "pre.l" + + YY_BREAK +case 86: +YY_RULE_SETUP +#line 1368 "pre.l" +{ yyLineNr++; outputChar('\n'); } + YY_BREAK +case 87: +YY_RULE_SETUP +#line 1369 "pre.l" + + YY_BREAK +case 88: +YY_RULE_SETUP +#line 1370 "pre.l" +{ + unput(*yytext); + BEGIN(lastCPPContext); + } + YY_BREAK +case 89: +YY_RULE_SETUP +#line 1374 "pre.l" +{ + outputChar('/');outputChar('*'); + } + YY_BREAK +case 90: +YY_RULE_SETUP +#line 1377 "pre.l" +{ + outputChar('/');outputChar('/'); + } + YY_BREAK +case 91: +YY_RULE_SETUP +#line 1380 "pre.l" +{ + outputArray(yytext,yyleng); + } + YY_BREAK +case 92: +YY_RULE_SETUP +#line 1383 "pre.l" +{ + outputChar(*yytext); + } + YY_BREAK +case 93: +YY_RULE_SETUP +#line 1386 "pre.l" + + YY_BREAK +case 94: +YY_RULE_SETUP +#line 1387 "pre.l" + + YY_BREAK +case 95: +YY_RULE_SETUP +#line 1388 "pre.l" + + YY_BREAK +case 96: +YY_RULE_SETUP +#line 1389 "pre.l" + + YY_BREAK +case 97: +YY_RULE_SETUP +#line 1390 "pre.l" +{ + quoteArg=TRUE; + } + YY_BREAK +case 98: +YY_RULE_SETUP +#line 1393 "pre.l" +{ + if (quoteArg) + { + defText+="\""; + } + if (defArgs>0) + { + int *n; + if ((n=(*argDict)[yytext])) + { + if (!quoteArg) defText+=' '; + defText+='@'; + QCString numStr; + numStr.setNum(*n); + defText+=numStr; + if (!quoteArg) defText+=' '; + } + else + { + defText+=yytext; + } + } + else + { + defText+=yytext; + } + if (quoteArg) + { + defText+="\""; + } + quoteArg=FALSE; + } + YY_BREAK +case 99: +YY_RULE_SETUP +#line 1425 "pre.l" +{ + outputChar('\n'); + defText += ' '; yyLineNr++; + } + YY_BREAK +case 100: +YY_RULE_SETUP +#line 1429 "pre.l" +{ + outputChar('\n'); + Define *def=0; + //printf("Define name=`%s' text=`%s'\n",defName.data(),defText.data()); + if (includeStack.isEmpty()) + { + addDefine(); + } + if (/*!Config::onlyPredefinedFlag &&*/ (def=fileDefineDict->find(defName))==0) + { + fileDefineDict->insert(defName,newDefine()); + } + else if (def)// name already exists + { + //printf("define found\n"); + if (def->undef) // undefined name + { + def->undef = FALSE; + def->name = defName; + def->definition = defText.stripWhiteSpace(); + def->nargs = defArgs; + def->fileName = yyFileName; + def->lineNr = yyLineNr; + } + else + { + //printf("Error: define %s is defined more than once!\n",defName.data()); + } + } + delete argDict; + yyLineNr++; + lastGuardName.resize(0); + BEGIN(Start); + } + YY_BREAK +case 101: +YY_RULE_SETUP +#line 1463 "pre.l" +{ defText += ' '; } + YY_BREAK +case 102: +YY_RULE_SETUP +#line 1464 "pre.l" +{ defText += "##"; } + YY_BREAK +case 103: +YY_RULE_SETUP +#line 1465 "pre.l" +{ defText += "@@"; } + YY_BREAK +case 104: +YY_RULE_SETUP +#line 1466 "pre.l" +{ defText += *yytext; + BEGIN(SkipDoubleQuote); + } + YY_BREAK +case 105: +YY_RULE_SETUP +#line 1469 "pre.l" +{ defText += *yytext; + BEGIN(SkipSingleQuote); + } + YY_BREAK +case 106: +YY_RULE_SETUP +#line 1472 "pre.l" +{ defText += yytext; } + YY_BREAK +case 107: +YY_RULE_SETUP +#line 1473 "pre.l" +{ defText += yytext; } + YY_BREAK +case 108: +YY_RULE_SETUP +#line 1474 "pre.l" +{ + defText += *yytext; + BEGIN(DefineText); + } + YY_BREAK +case 109: +YY_RULE_SETUP +#line 1478 "pre.l" +{ + defText += yytext; + } + YY_BREAK +case 110: +YY_RULE_SETUP +#line 1481 "pre.l" +{ + defText += *yytext; + BEGIN(DefineText); + } + YY_BREAK +case 111: +YY_RULE_SETUP +#line 1485 "pre.l" +{ defText += *yytext; } + YY_BREAK +case 112: +YY_RULE_SETUP +#line 1486 "pre.l" +{ defText += *yytext; } + YY_BREAK +case 113: +YY_RULE_SETUP +#line 1487 "pre.l" +{ defText += *yytext; } + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(Start): +case YY_STATE_EOF(Command): +case YY_STATE_EOF(SkipCommand): +case YY_STATE_EOF(SkipLine): +case YY_STATE_EOF(CopyLine): +case YY_STATE_EOF(Include): +case YY_STATE_EOF(IncludeID): +case YY_STATE_EOF(DefName): +case YY_STATE_EOF(DefineArg): +case YY_STATE_EOF(DefineText): +case YY_STATE_EOF(SkipCPPBlock): +case YY_STATE_EOF(Ifdef): +case YY_STATE_EOF(Ifndef): +case YY_STATE_EOF(SkipCComment): +case YY_STATE_EOF(SkipCPPComment): +case YY_STATE_EOF(RemoveCComment): +case YY_STATE_EOF(RemoveCPPComment): +case YY_STATE_EOF(Guard): +case YY_STATE_EOF(DefinedExpr1): +case YY_STATE_EOF(DefinedExpr2): +case YY_STATE_EOF(SkipDoubleQuote): +case YY_STATE_EOF(SkipSingleQuote): +case YY_STATE_EOF(UndefName): +case YY_STATE_EOF(IgnoreLine): +case YY_STATE_EOF(FindDefineArgs): +case YY_STATE_EOF(ReadString): +#line 1488 "pre.l" +{ + //printf("End of include file\n"); + //printf("Include stack depth=%d\n",includeStack.count()); + if (includeStack.isEmpty()) + { + //printf("Terminating scanner!\n"); + yyterminate(); + } + else + { + FileState *fs=includeStack.pop(); + //fileDefineCache->merge(yyFileName,fs->fileName); + if (Config::inputFilter.isEmpty()) + fclose(fs->filePtr); + else + pclose(fs->filePtr); + YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER; + yy_switch_to_buffer( fs->bufState ); + yy_delete_buffer( oldBuf ); + yyLineNr=fs->lineNr; + yyFileName=fs->fileName.copy(); + //printf("######## FileName %s\n",yyFileName.data()); + delete fs; + } + } + YY_BREAK +case 114: +YY_RULE_SETUP +#line 1513 "pre.l" +{ + outputChar('/');outputChar('*'); + lastCContext=YY_START; + BEGIN(SkipCComment); + } + YY_BREAK +case 115: +YY_RULE_SETUP +#line 1518 "pre.l" +{ + outputChar('/');outputChar('/'); + lastCPPContext=YY_START; + BEGIN(SkipCPPComment); + } + YY_BREAK +case 116: +YY_RULE_SETUP +#line 1523 "pre.l" +{ + outputChar('\n'); + yyLineNr++; + } + YY_BREAK +case 117: +YY_RULE_SETUP +#line 1527 "pre.l" +{ + outputChar(*yytext); + } + YY_BREAK +case 118: +YY_RULE_SETUP +#line 1531 "pre.l" +ECHO; + YY_BREAK + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 30); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 363 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 30; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 363 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 362); + if ( ! yy_is_jam ) + *yy_state_ptr++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + yy_current_buffer->yy_at_bol = (c == '\n'); + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 1531 "pre.l" + + +/*@ ---------------------------------------------------------------------------- + */ + +static int getNextChar(const QCString &expr,QCString *rest,uint &pos) +{ + //printf("getNextChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos); + if (poslength()>0) + { + int cc=rest->at(0); + *rest=rest->right(rest->length()-1); + //printf("%c=rest\n",cc); + return cc; + } + else + { + int cc=yyinput(); + //printf("%c=yyinput()\n",cc); + return cc; + } +} + +static int getCurrentChar(const QCString &expr,QCString *rest,uint pos) +{ + //printf("getCurrentChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos); + if (poslength()>0) + { + int cc=rest->at(0); + //printf("%c=rest\n",cc); + return cc; + } + else + { + int cc=yyinput();unput(cc); + //printf("%c=yyinput()\n",cc); + return cc; + } +} + +static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c) +{ + //printf("unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c); + if (posprepend(cs); + } + else + { + unput(c); + } + //printf("result: unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c); +} + +void addSearchDir(const char *dir) +{ + QFileInfo fi(dir); + if (fi.isDir()) pathList->append(fi.absFilePath()); +} + +void initPreprocessor() +{ + pathList = new QStrList; + addSearchDir("."); + //defineNameList.setAutoDelete(TRUE); + //defineNameList.clear(); + defineDict.clear(); + //fileDefineCache = new DefineCache(1009); + expandedDict = new DefineDict(17); + fileDefineDict = new DefineDict(1009); +} + +void cleanupPreprocessor() +{ + //delete fileDefineCache; + delete fileDefineDict; + delete expandedDict; + delete pathList; +} + + +void preprocessFile(const char *fileName,BufStr &output) +{ +#if DUMP_OUTPUT + uint orgOffset=output.curPos(); +#endif + + outputBuf=&output; + includeStack.setAutoDelete(TRUE); + includeStack.clear(); + fileDefineDict->setAutoDelete(TRUE); + fileDefineDict->clear(); + expandedDict->setAutoDelete(FALSE); + expandedDict->clear(); + + // add predefined macros + char *defStr = Config::predefined.first(); + while (defStr) + { + QCString ds = defStr; + int i_equals=ds.find('='); + int i_obrace=ds.find('('); + int i_cbrace=ds.find(')'); + bool nonRecursive = i_equals>0 && ds.at(i_equals-1)==':'; + + if (i_obrace==0) continue; // no define name + + if (i_obrace argDict(17); + argDict.setAutoDelete(TRUE); + int i=i_obrace+1,p,l,count=0; + // gather the formal arguments in a dictionary + while (ii) definition+=tmp.mid(i,p-i); + int *argIndex; + if ((argIndex=argDict[tmp.mid(p,l)])!=0) + { + QCString marker; + marker.sprintf(" @%d ",*argIndex); + definition+=marker; + } + else + { + definition+=tmp.mid(p,l); + } + i=p+l; + } + if (i<(int)tmp.length()) definition+=tmp.mid(i,tmp.length()-i); + + // add define definition to the dictionary of defines for this file + Define *def = new Define; + def->name = ds.left(i_obrace); + def->definition = definition; + def->nargs = count; + def->isPredefined = TRUE; + def->nonRecursive = nonRecursive; + fileDefineDict->insert(def->name,def); + + //printf("#define `%s' `%s' #nargs=%d\n", + // def->name.data(),def->definition.data(),def->nargs); + } + else if ((i_obrace==-1 || i_obrace>i_equals) && + (i_cbrace==-1 || i_cbrace>i_equals) && + ds.length()>0 && (int)ds.length()>i_equals + ) // predefined non-function macro definition + { + Define *def = new Define; + if (i_equals==-1) // simple define without argument + { + def->name = ds; + def->definition = "1"; // substitute occurrences by 1 (true) + } + else // simple define with argument + { + int ine=i_equals - (nonRecursive ? 1 : 0); + def->name = ds.left(ine); + def->definition = ds.right(ds.length()-i_equals-1); + } + def->nargs = -1; + def->isPredefined = TRUE; + def->nonRecursive = nonRecursive; + fileDefineDict->insert(def->name,def); + + //printf("#define `%s' `%s' #nargs=%d\n", + // def->name.data(),def->definition.data(),def->nargs); + } + + defStr=Config::predefined.next(); + } + + if (Config::inputFilter.isEmpty()) + { + preYYin = fopen(fileName,"r"); + if (!preYYin) + { + err("Error: could not open file %s\n",fileName); + return; + } + } + else + { + QCString cmd = Config::inputFilter+" "+fileName; + preYYin = popen(cmd,"r"); + if (!preYYin) + { + err("Error: could not execute filter %s\n",cmd.data()); + return; + } + } + yyLineNr = 1; + level = 0; + ifcount = 0; + yyFileName = fileName; + BEGIN( Start ); + + lastGuardName.resize(0); + guardExpr.resize(0); + + preYYlex(); + if (Config::inputFilter.isEmpty()) + fclose(preYYin); + else + pclose(preYYin); + +#if DUMP_OUTPUT + char *orgPos=output.data()+orgOffset; + char *newPos=output.data()+output.curPos(); + printf("Resulting size: %d bytes\n",newPos-orgPos); + int line=1; + printf("---------\n00001 "); + while (orgPos -#include +//#include + +class BufStr; void initPreprocessor(); void addSearchDir(const char *dir); diff --git a/src/pre.l b/src/pre.l index f8b6c18..6fe9a42 100644 --- a/src/pre.l +++ b/src/pre.l @@ -32,14 +32,16 @@ #include #include #include +#include #include "constexp.h" #include "define.h" #include "doxygen.h" #include "message.h" #include "util.h" +#include "defargs.h" -#if defined(_MSC_VER) +#if defined(_MSC_VER) || defined(__BORLANDC__) #define popen _popen #define pclose _pclose #endif @@ -743,10 +745,13 @@ void addDefine() FileDef *fd=findFileDef(&inputNameDict,yyFileName,ambig); MemberDef *md=new MemberDef("#define",defName,defArgsStr,0, Public,Normal,FALSE,FALSE,MemberDef::Define,0,0); + ArgumentList *argList = new ArgumentList; + stringToArgumentList(defArgsStr,argList); + md->setArgumentList(argList); md->setDefFile(yyFileName); md->setDefLine(yyLineNr); md->setFileDef(fd); - md->setDefinition("#define "+defName+defArgsStr); + md->setDefinition("#define "+defName); MemberName *mn=functionNameDict[defName]; if (mn==0) @@ -1301,7 +1306,7 @@ BN [ \t\r\n] //printf("Error: define %s is defined more than once!\n",defName.data()); } } - outputChar('\n'); + //outputChar('\n'); lastGuardName.resize(0); BEGIN(Start); } @@ -1464,6 +1469,8 @@ BN [ \t\r\n] \' { defText += *yytext; BEGIN(SkipSingleQuote); } +"//" { defText += yytext; } +"/*" { defText += yytext; } \" { defText += *yytext; BEGIN(DefineText); diff --git a/src/scanner.cpp b/src/scanner.cpp new file mode 100644 index 0000000..ba01a3e --- /dev/null +++ b/src/scanner.cpp @@ -0,0 +1,16522 @@ +#define yy_create_buffer scanYY_create_buffer +#define yy_delete_buffer scanYY_delete_buffer +#define yy_scan_buffer scanYY_scan_buffer +#define yy_scan_string scanYY_scan_string +#define yy_scan_bytes scanYY_scan_bytes +#define yy_flex_debug scanYY_flex_debug +#define yy_init_buffer scanYY_init_buffer +#define yy_flush_buffer scanYY_flush_buffer +#define yy_load_buffer_state scanYY_load_buffer_state +#define yy_switch_to_buffer scanYY_switch_to_buffer +#define yyin scanYYin +#define yyleng scanYYleng +#define yylex scanYYlex +#define yyout scanYYout +#define yyrestart scanYYrestart +#define yytext scanYYtext + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define YY_USES_REJECT + +#define yywrap() 1 +#define YY_SKIP_YYWRAP +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 595 +#define YY_END_OF_BUFFER 596 +static yyconst short int yy_acclist[3409] = + { 0, + 294, 294,16918,16919,16920, 464, 464, 491, 491, 205, + 205, 185, 185, 334, 334, 334, 334, 596, 589, 595, + 589, 595, 590, 595, 2, 589, 595, 589, 595, 270, + 589, 595, 269, 589, 595, 269, 589, 595, 2, 269, + 589, 595, 268, 269, 589, 595, 269, 589, 595, 274, + 589, 595, 274, 589, 595, 274, 589, 595, 271, 590, + 595, 2, 274, 589, 595, 273, 274, 589, 595, 274, + 589, 595, 274, 589, 595, 589, 595, 590, 595, 2, + 589, 595, 589, 595, 391, 589, 595, 392, 589, 595, + 397, 589, 595, 589, 595, 589, 595, 396, 589, 595, + + 394, 589, 595, 395, 589, 595, 405, 589, 595, 393, + 589, 595, 589, 595, 590, 595, 2, 589, 595, 415, + 589, 595, 589, 595, 406, 589, 595, 404, 589, 595, + 416, 589, 595, 403, 589, 595, 403, 589, 595, 402, + 403, 589, 595, 402, 590, 595, 2, 402, 403, 589, + 595, 403, 589, 595, 403, 589, 595, 403, 589, 595, + 222, 589, 595, 589, 595, 214, 589, 595, 223, 589, + 595, 223, 589, 595, 213, 589, 595, 231, 589, 595, + 231, 590, 595, 2, 231, 589, 595, 262, 589, 595, + 275, 589, 595, 330, 589, 595, 280, 589, 595, 589, + + 595, 280, 589, 595, 280, 589, 595, 285, 589, 595, + 279, 589, 595, 261, 589, 595, 281, 589, 595, 261, + 589, 595, 261, 589, 595, 261, 589, 595, 261, 589, + 595, 261, 589, 595, 261, 589, 595, 261, 589, 595, + 261, 589, 595, 261, 589, 595, 261, 589, 595, 428, + 589, 595, 589, 595, 589, 595, 590, 595, 2, 589, + 595, 589, 595, 261, 589, 595, 589, 595, 589, 595, + 590, 595, 2, 589, 595, 292, 589, 595, 589, 595, + 291, 589, 595, 290, 589, 595, 293, 589, 595, 589, + 595, 366, 589, 595, 365, 589, 595, 367, 589, 595, + + 367, 589, 595, 359, 589, 595, 359, 589, 595, 358, + 359, 589, 595, 358, 590, 595, 2, 358, 359, 589, + 595, 351, 359, 589, 595, 352, 359, 589, 595, 357, + 359, 589, 595, 359, 589, 595, 364, 589, 595, 364, + 589, 595, 2, 364, 589, 595, 362, 364, 589, 595, + 363, 364, 589, 595, 364, 589, 595, 358, 359, 589, + 595, 358, 590, 595, 2, 358, 359, 589, 595, 359, + 589, 595, 353, 359, 589, 595, 359, 589, 595, 359, + 589, 595, 359, 589, 595, 359, 589, 595, 359, 589, + 595, 245, 589, 595, 245, 589, 595, 245, 590, 595, + + 2, 245, 589, 595, 247, 589, 595, 245, 589, 595, + 245, 589, 595, 284, 589, 595, 284, 589, 595, 2, + 284, 589, 595, 284, 589, 595, 283, 284, 589, 595, + 282, 284, 589, 595, 294, 312, 589, 595, 294, 312, + 589, 595, 294, 311, 312, 589, 595, 311, 590, 595, + 2, 311, 312, 589, 595, 312, 589, 595, 312, 589, + 595, 312, 589, 595, 302, 312, 589, 595, 303, 312, + 589, 595, 251, 589, 595, 589, 595, 589, 595, 590, + 595, 2, 589, 595, 589, 595, 252, 589, 595, 589, + 595, 589, 595, 459, 590, 595, 2, 589, 595, 589, + + 595, 458, 589, 595, 589, 595, 379, 385, 589, 595, + 379, 385, 589, 595, 378, 590, 595, 2, 379, 385, + 589, 595, 376, 379, 385, 589, 595, 379, 385, 589, + 595, 379, 385, 589, 595, 379, 385, 589, 595, 369, + 379, 385, 589, 595, 370, 379, 385, 589, 595, 379, + 385, 589, 595, 377, 379, 385, 589, 595, 380, 590, + 595, 379, 385, 589, 595, 379, 385, 589, 595, 372, + 589, 595, 390, 589, 595, 390, 589, 595, 389, 590, + 595, 2, 390, 589, 595, 387, 390, 589, 595, 390, + 589, 595, 390, 589, 595, 390, 589, 595, 385, 589, + + 595, 385, 589, 595, 2, 385, 589, 595, 385, 589, + 595, 385, 589, 595, 368, 385, 589, 595, 264, 589, + 595, 264, 589, 595, 266, 590, 595, 2, 264, 589, + 595, 264, 589, 595, 264, 589, 595, 588, 589, 595, + 588, 589, 595, 588, 589, 595, 2, 588, 589, 595, + 589, 595, 588, 589, 595, 589, 595, 589, 595, 587, + 590, 595, 2, 589, 595, 589, 595, 217, 589, 595, + 218, 589, 595, 215, 589, 595, 216, 589, 595, 501, + 503, 589, 595, 501, 503, 589, 595, 503, 589, 595, + 502, 590, 595, 2, 501, 503, 589, 595, 503, 589, + + 595, 503, 589, 595, 501, 503, 589, 595, 501, 503, + 589, 595, 503, 589, 595, 503, 589, 595, 499, 503, + 589, 595, 503, 589, 595, 289, 589, 595, 289, 589, + 595, 288, 289, 589, 595, 288, 590, 595, 2, 288, + 289, 589, 595, 289, 589, 595, 287, 289, 589, 595, + 286, 289, 589, 595, 411, 589, 595, 412, 589, 595, + 413, 589, 595, 414, 589, 595, 304, 589, 595, 420, + 422, 589, 595, 420, 422, 589, 595, 417, 420, 422, + 589, 595, 417, 590, 595, 2, 417, 420, 422, 589, + 595, 422, 589, 595, 420, 422, 589, 595, 558, 589, + + 595, 558, 589, 595, 558, 589, 595, 560, 590, 595, + 2, 558, 589, 595, 558, 589, 595, 558, 589, 595, + 557, 558, 589, 595, 558, 589, 595, 558, 589, 595, + 558, 589, 595, 558, 589, 595, 558, 589, 595, 558, + 589, 595, 434, 589, 595, 434, 589, 595, 434, 589, + 595, 435, 590, 595, 2, 434, 589, 595, 434, 589, + 595, 434, 589, 595, 434, 589, 595, 434, 589, 595, + 432, 434, 589, 595, 434, 589, 595, 434, 589, 595, + 431, 435, 590, 595, 2, 434, 589, 595, 434, 589, + 595, 434, 589, 595, 510, 589, 595, 510, 589, 595, + + 509, 510, 589, 595, 508, 590, 595, 2, 510, 589, + 595, 510, 589, 595, 510, 589, 595, 509, 510, 589, + 595, 510, 589, 595, 510, 589, 595, 510, 589, 595, + 509, 510, 589, 595, 510, 589, 595, 510, 589, 595, + 559, 589, 595, 559, 589, 595, 559, 589, 595, 562, + 590, 595, 2, 559, 589, 595, 559, 589, 595, 559, + 589, 595, 559, 589, 595, 559, 589, 595, 559, 589, + 595, 563, 590, 595, 2, 559, 589, 595, 559, 589, + 595, 589, 595, 461, 590, 595, 2, 589, 595, 589, + 595, 589, 595, 460, 589, 595, 589, 595, 589, 595, + + 467, 590, 595, 2, 589, 595, 589, 595, 466, 589, + 595, 466, 589, 595, 589, 595, 469, 590, 595, 2, + 589, 595, 589, 595, 468, 589, 595, 468, 589, 595, + 555, 589, 595, 555, 589, 595, 542, 590, 595, 2, + 555, 589, 595, 544, 555, 589, 595, 555, 589, 595, + 555, 589, 595, 555, 589, 595, 589, 595, 590, 595, + 2, 589, 595, 547, 589, 595, 589, 595, 546, 589, + 595, 589, 595, 555, 589, 595, 556, 590, 595, 555, + 589, 595, 555, 589, 595, 555, 589, 595, 555, 589, + 595, 548, 555, 589, 595, 554, 589, 595, 554, 589, + + 595, 2, 554, 589, 595, 553, 554, 589, 595, 554, + 589, 595, 539, 589, 595, 457, 589, 595, 537, 589, + 595, 537, 589, 595, 537, 589, 595, 532, 590, 595, + 2, 537, 589, 595, 537, 589, 595, 537, 589, 595, + 537, 589, 595, 537, 589, 595, 537, 589, 595,16918, + 16919,16920, 531, 532, 590, 595, 2, 537, 589, 595, + 537, 589, 595,16918,16919,16920, 537, 589, 595, 537, + 589, 595, 537, 589, 595, 443, 589, 595, 443, 589, + 595, 443, 589, 595, 441, 590, 595, 2, 443, 589, + 595, 443, 589, 595, 443, 589, 595, 541, 589, 595, + + 541, 589, 595, 2, 541, 589, 595, 540, 541, 589, + 595, 541, 589, 595, 541, 589, 595, 463, 590, 595, + 462, 589, 595, 464, 589, 595, 464, 589, 595, 465, + 590, 595, 2, 464, 589, 595, 464, 589, 595, 526, + 590, 595, 525, 589, 595, 589, 595, 589, 595, 482, + 590, 595, 2, 589, 595, 589, 595, 580, 589, 595, + 580, 589, 595, 579, 590, 595, 2, 580, 589, 595, + 580, 589, 595, 580, 589, 595, 580, 589, 595, 580, + 589, 595, 580, 589, 595, 570, 589, 595, 570, 589, + 595, 569, 590, 595, 2, 570, 589, 595, 570, 589, + + 595, 570, 589, 595, 570, 589, 595, 570, 589, 595, + 570, 589, 595, 570, 589, 595,16955, 566, 589, 595, + 566, 589, 595, 565, 590, 595, 2, 566, 589, 595, + 566, 589, 595, 566, 589, 595, 509, 510, 589, 595, + 510, 589, 595, 510, 589, 595, 510, 589, 595, 510, + 589, 595, 509, 510, 589, 595, 510, 589, 595, 522, + 589, 595, 522, 589, 595, 521, 590, 595, 2, 522, + 589, 595, 522, 589, 595, 589, 595, 473, 590, 595, + 589, 595, 472, 589, 595, 472, 589, 595, 589, 595, + 589, 595, 474, 590, 595, 2, 589, 595, 589, 595, + + 471, 590, 595, 589, 595, 470, 589, 595, 470, 589, + 595, 510, 589, 595, 589, 595, 455, 589, 595, 455, + 589, 595, 476, 590, 595, 475, 589, 595, 315, 589, + 595, 315, 589, 595, 315, 589, 595, 590, 595, 2, + 315, 589, 595, 315, 589, 595, 315, 589, 595, 314, + 315, 589, 595, 315, 589, 595, 318, 589, 595, 319, + 589, 595, 320, 359, 589, 595, 321, 359, 589, 595, + 324, 589, 595, 324, 589, 595, 2, 324, 589, 595, + 324, 589, 595, 324, 589, 595, 329, 589, 595, 329, + 589, 595, 328, 329, 589, 595, 328, 590, 595, 2, + + 328, 329, 589, 595, 325, 329, 589, 595, 326, 329, + 589, 595, 327, 329, 589, 595, 329, 589, 595, 589, + 595, 590, 595, 2, 589, 595, 589, 595, 306, 589, + 595, 306, 589, 595, 307, 589, 595, 305, 589, 595, + 309, 589, 595, 310, 589, 595, 308, 589, 595, 491, + 495, 589, 595, 491, 495, 589, 595, 495, 589, 595, + 494, 590, 595, 2, 491, 495, 589, 595, 495, 589, + 595, 491, 495, 589, 595, 495, 589, 595, 495, 589, + 595, 212, 589, 595, 212, 589, 595, 2, 212, 589, + 595, 212, 589, 595, 212, 589, 595, 211, 212, 589, + + 595, 211, 590, 595, 2, 211, 212, 589, 595, 212, + 589, 595, 212, 589, 595, 212, 589, 595, 212, 589, + 595, 212, 589, 595, 212, 589, 595, 212, 589, 595, + 212, 589, 595, 87, 212, 589, 595, 212, 589, 595, + 87, 212, 589, 595, 212, 589, 595, 589, 595, 62, + 589, 595, 589, 595, 590, 595, 2, 589, 595, 589, + 595, 63, 589, 595, 589, 595, 18, 589, 595, 18, + 589, 595, 2, 18, 589, 595, 18, 589, 595, 18, + 589, 595, 18, 589, 595, 18, 589, 595, 18, 589, + 595, 197, 212, 589, 595, 197, 212, 589, 595, 209, + + 590, 595, 197, 212, 589, 595, 198, 212, 589, 595, + 198, 212, 589, 595, 198, 212, 589, 595, 199, 212, + 589, 595, 199, 212, 589, 595, 199, 212, 589, 595, + 205, 206, 589, 595, 205, 206, 589, 595, 205, 206, + 589, 595, 204, 590, 595, 2, 205, 206, 589, 595, + 206, 589, 595, 206, 589, 595, 205, 206, 589, 595, + 206, 589, 595, 38, 589, 595, 38, 589, 595, 589, + 595, 39, 589, 595, 39, 589, 595, 40, 590, 595, + 2, 39, 589, 595, 39, 589, 595, 39, 589, 595, + 37, 589, 595, 589, 595, 200, 589, 595, 200, 589, + + 595, 589, 595, 201, 589, 595, 201, 589, 595, 187, + 589, 595, 589, 595, 589, 595, 181, 589, 595, 181, + 589, 595, 183, 589, 595, 183, 589, 595, 184, 589, + 595, 185, 589, 595, 185, 589, 595, 185, 590, 595, + 2, 185, 589, 595, 185, 589, 595, 186, 589, 595, + 530, 590, 595, 529, 589, 595, 106, 589, 595, 106, + 589, 595, 106, 589, 595, 104, 589, 595, 104, 589, + 595, 104, 589, 595, 105, 589, 595, 105, 589, 595, + 105, 589, 595, 107, 589, 595, 107, 589, 595, 107, + 589, 595, 112, 589, 595, 112, 589, 595, 111, 590, + + 595, 2, 112, 589, 595, 112, 589, 595, 112, 589, + 595, 589, 595, 589, 595, 50, 589, 595, 50, 590, + 595, 2, 50, 589, 595, 589, 595, 68, 589, 595, + 16453, 33, 589, 595, 33, 589, 595, 31, 32, 590, + 595, 2, 33, 589, 595, 33, 589, 595, 33, 589, + 595, 33, 589, 595, 33, 589, 595, 589, 595, 28, + 589, 595, 28, 589, 595, 47, 589, 595, 47, 589, + 595, 2, 47, 589, 595, 47, 589, 595, 589, 595, + 590, 595, 2, 589, 595, 589, 595, 43, 589, 595, + 589, 595, 589, 595, 589, 595, 2, 589, 595, 589, + + 595, 70, 589, 595, 72, 589, 595, 589, 595, 589, + 595, 73, 590, 595, 2, 589, 595, 589, 595, 83, + 590, 595, 82, 589, 595, 82, 589, 595, 82, 589, + 595, 589, 595, 77, 589, 595, 77, 589, 595, 589, + 595, 78, 589, 595, 78, 589, 595, 79, 590, 595, + 589, 595, 589, 595, 505, 589, 595, 589, 595, 589, + 595, 506, 590, 595, 2, 589, 595, 507, 589, 595, + 589, 595, 260, 589, 595, 260, 589, 595, 2, 260, + 589, 595, 260, 589, 595, 256, 260, 589, 595, 257, + 260, 589, 595, 332, 350, 589, 595, 332, 350, 589, + + 595, 349, 590, 595, 2, 332, 350, 589, 595, 345, + 350, 589, 595, 350, 589, 595, 332, 350, 589, 595, + 350, 589, 595, 333, 350, 589, 595, 333, 350, 589, + 595, 2, 333, 350, 589, 595, 335, 350, 589, 595, + 350, 589, 595, 340, 350, 589, 595, 341, 350, 589, + 595, 350, 589, 595, 350, 589, 595, 2, 350, 589, + 595, 342, 350, 589, 595, 343, 350, 589, 595, 331, + 350, 589, 595, 331, 350, 589, 595, 334, 350, 589, + 595, 334, 349, 590, 595, 2, 334, 350, 589, 595, + 336, 350, 589, 595, 337, 350, 589, 595, 338, 350, + + 589, 595, 339, 350, 589, 595, 410, 589, 595, 410, + 589, 595, 409, 410, 589, 595, 409, 590, 595, 2, + 409, 410, 589, 595, 410, 589, 595, 407, 410, 589, + 595, 408, 410, 589, 595, 5, 589, 595, 5, 589, + 595, 2, 5, 589, 595, 5, 589, 595, 5, 589, + 595, 518, 589, 595, 518, 589, 595, 2, 518, 589, + 595, 518, 589, 595, 518, 589, 595, 518, 589, 595, + 518, 589, 595, 518, 589, 595, 518, 589, 595, 504, + 589, 595, 1, 592, 594, 267, 270, 592, 594, 272, + 397, 392, 397, 392, 393, 404, 416, 404, 416, 231, + + 231, 262, 275, 313, 592, 594, 261, 254, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 255, 261, 592, 594, 290, + 358, 357, 357, 358, 356, 246, 294, 294, 1, 294, + 294, 311, 311, 296, 297, 592, 295, 594, 252, 252, + 458, 458, 383, 382, 592, 384, 594, 377, 382, 592, + 384, 594, 381, 388, 388, 592, 388, 594, 386, 266, + 266, 265, 588, 588, 1, 588, 588, 593, 591, 592, + 588, 591, 594, 587, 1, 587, 592, 594, 501, 501, + 1, 501, 519, 500, 594, 501, 499, 499, 498, 500, + + 594, 288, 304, 420, 420, 1, 420, 417, 420, 417, + 421, 418, 592, 419, 420, 594, 583, 586, 592, 512, + 594, 557, 585, 585, 511, 512, 594, 584, 436, 431, + 433, 585, 433, 585, 431, 433, 585, 433, 585, 509, + 509, 509, 511, 512, 594, 582, 460, 460, 467, 466, + 466, 594, 469, 468, 468, 594, 545, 546, 546, 551, + 538, 539, 457,16918,16919,16920, 531,16918,16919,16920, + 585,16918,16919,16920, 531, 585, 585, 585,16918,16919, + 16920, 585, 585, 594,16918,16919,16920, 441, 442, 462, + 464, 464, 1, 464, 464, 592, 464, 594, 525, 482, + + 1, 482, 592, 594, 581, 577, 592, 577, 594, 578, + 578, 572, 573, 567, 592, 567, 594,16955, 568, 568, + 564, 592, 564, 594, 509, 509, 472, 472, 594, 474, + 1, 474, 592, 594, 470, 470, 594, 455, 455, 594, + 475, 475, 314, 314, 317, 316, 322, 323, 328, 327, + 327, 305, 305, 491, 491, 1, 491, 493, 592, 493, + 594, 491, 492, 493, 594, 211, 211, 211, 211, 210, + 211, 87, 196, 208, 592, 207, 594, 169, 87, 87, + 194, 193, 195, 192, 190, 191, 189, 188, 87, 62, + 62, 63, 63, 17, 17, 592, 17, 594, 197, 197, + + 1, 197, 197, 208, 592, 197, 207, 594, 198, 198, + 1, 198, 198, 208, 592, 198, 207, 594, 199, 199, + 1, 199, 199, 208, 592, 199, 207, 594, 205, 205, + 1, 205, 205, 205, 203, 592, 202, 594, 205, 38, + 38, 594, 37, 200, 200, 594, 201, 201, 594, 181, + 181, 594, 183, 183, 594, 185, 185, 1, 185, 185, + 592, 185, 594, 529, 106, 106, 1, 106, 106, 592, + 106, 594, 104, 104, 1, 104, 104, 592, 104, 594, + 105, 105, 1, 105, 105, 592, 105, 594, 107, 107, + 1, 107, 107, 592, 107, 594, 50, 50, 1, 50, + + 50, 592, 594, 68,16453, 31, 1, 31, 32, 32, + 592, 32, 594, 28, 28, 594, 47, 47, 1, 47, + 47, 592, 47, 594, 43, 43, 71, 1, 71, 592, + 594, 72, 73, 1, 73, 592, 594, 82, 82, 82, + 77, 77, 594, 78, 78, 594, 505, 506, 1, 506, + 594, 258, 332, 332, 1, 332, 332, 592, 332, 594, + 344, 333, 333, 1, 333, 331, 331, 1, 331, 334, + 409, 594, 504, 392, 392, 221, 221, 313, 423, 425, + 261, 253, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + + 261, 261, 261, 423, 425, 356, 244, 301, 301, 297, + 298, 295, 252, 252, 458, 458, 375, 375, 384, 384, + 384, 381, 265, 501, 498, 1, 421, 438, 514, 515, + 511, 437, 511, 460, 460, 466, 468, 546, 546, 551, + 16918,16919,16920,16918,16919,16920,16918,16919,16920,16918, + 16919,16920, 8727, 8763, 568, 568, 568, 472, 470, 455, + 475, 475, 475, 314, 314, 305, 491, 210, 211, 210, + 211, 87, 87, 90, 87, 170, 166, 172, 94, 95, + 96, 93, 97, 87, 87, 63, 63, 205, 200, 201, + 8261, 28, 43, 43, 82, 82, 77, 78, 259, 348, + + 348, 4, 516, 517, 278, 220, 219, 220, 424, 426, + 426, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 278, + 424, 278, 426, 300, 299, 300, 374, 373, 374, 384, + 501, 438, 513, 437, 561, 533, 8727, 475, 475, 491, + 210, 211, 13, 87, 87, 3, 168, 171, 167, 173, + 165, 163, 159, 161, 156, 174, 176, 178, 158, 152, + 148, 146, 144, 154, 150, 86, 87, 66, 57, 87, + 205, 75, 82, 82, 347, 346, 347, 219, 277, 276, + 261, 243, 261, 261, 261, 261, 261, 261, 261, 261, + + 261, 261, 261, 261, 261, 261, 261, 261, 261, 354, + 299, 373, 384, 423, 384, 371, 501, 489, 439, 444, + 453, 451, 549, 475, 475, 491, 87, 164, 160, 162, + 157, 175, 177, 179, 153, 149, 147, 145, 155, 151, + 133, 137, 138, 140, 142, 135, 48, 52, 84, 49, + 42, 87, 61, 84, 87, 205, 182, 180, 76, 82, + 346, 399, 243, 240, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 242, 249, + 261, 354, 360, 384, 424, 497, 501, 447, 488, 444, + 453, 451, 527, 448, 549, 552, 462, 576, 491, 8, + + 6, 7, 87, 134, 139, 141, 143, 136, 129, 131, + 125, 127, 124, 84, 84, 54, 102, 36, 100, 87, + 61, 61, 61, 87, 92, 205, 182, 182, 180, 180, + 108, 401, 398, 240, 242, 263, 233, 235, 261, 238, + 261, 261, 261, 228, 261, 261, 232, 241, 261, 261, + 261, 261, 361, 501, 447, 449, 448, 487, 437, 429, + 430, 8727, 8728, 520, 491, 11, 87, 130, 132, 126, + 128, 121, 122, 119, 74, 58, 103, 87, 61, 90, + 61, 46, 35, 87, 205, 109, 80, 233, 235, 238, + 228, 232, 241, 261, 261, 230, 261, 261, 228, 261, + + 224, 261, 261, 234, 355, 496, 501, 496, 483, 454, + 480, 456, 449, 437, 550, 8726, 8727, 523, 491, 9, + 10, 12, 87, 123, 120, 117, 115, 55, 56, 59, + 87, 26, 25, 67, 87, 205, 41, 81, 80, 400, + 230, 224, 234, 261, 261, 230, 261, 261, 261, 224, + 8440, 254,16632, 236, 355, 445, 454, 524, 575, 452, + 440, 456, 528, 574, 550, 478, 477, 491, 87, 118, + 116, 85, 44, 98, 53, 51, 87, 85, 85, 44, + 44, 87, 87, 91, 205, 91, 81, 80, 236, 427, + 239, 237, 261, 229, 261, 261, 8440, 253, 250, 445, + + 450, 452, 446, 440, 485, 543, 491, 87, 113, 45, + 14, 34, 101, 29, 87, 65, 14, 14, 29, 29, + 87, 87, 89, 110, 81, 239, 237, 229, 427, 427, + 261, 229, 261, 261, 481, 450, 446, 484, 486, 486, + 491, 87, 114, 60, 16, 87, 16, 16, 64, 89, + 87, 87, 86, 89, 87, 89, 87, 87, 261, 261, + 225, 479, 491, 87, 87, 87, 20, 88, 87, 225, + 227, 261, 225, 490, 491, 490, 99, 27, 87, 87, + 15, 30, 30, 31, 30, 227, 227, 261, 87, 87, + 19, 226, 21, 87, 87, 226, 226, 22, 24, 87, + + 87, 87, 87, 87, 87, 87, 23, 87 + } ; + +static yyconst short int yy_accept[3758] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, + 6, 7, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 9, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 11, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + + 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 15, 16, 17, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, + 21, 23, 25, 28, 30, 33, 36, 39, 43, 47, + 50, 53, 56, 59, 62, 66, 70, 73, 76, 78, + + 80, 83, 85, 88, 91, 94, 96, 98, 101, 104, + 107, 110, 113, 115, 117, 120, 123, 125, 128, 131, + 134, 137, 140, 144, 147, 152, 155, 158, 161, 164, + 166, 169, 172, 175, 178, 181, 184, 188, 191, 194, + 197, 200, 202, 205, 208, 211, 214, 217, 220, 223, + 226, 229, 232, 235, 238, 241, 244, 247, 250, 253, + 255, 257, 259, 262, 264, 267, 269, 271, 273, 276, + 279, 281, 284, 287, 290, 292, 295, 298, 301, 304, + 307, 310, 314, 317, 322, 326, 330, 334, 337, 340, + 343, 347, 351, 355, 358, 362, 365, 370, 373, 377, + + 380, 383, 386, 389, 392, 395, 398, 401, 405, 408, + 411, 414, 417, 420, 424, 427, 431, 435, 439, 443, + 448, 451, 456, 459, 462, 465, 469, 473, 476, 478, + 480, 482, 485, 487, 490, 492, 494, 497, 500, 502, + 505, 507, 511, 515, 518, 523, 528, 532, 536, 540, + 545, 550, 554, 559, 562, 566, 570, 573, 576, 579, + 582, 586, 590, 593, 596, 599, 602, 605, 609, 612, + 615, 619, 622, 625, 628, 632, 635, 638, 641, 644, + 647, 651, 653, 656, 658, 660, 663, 666, 668, 671, + 674, 677, 680, 684, 688, 691, 694, 699, 702, 705, + + 709, 713, 716, 719, 723, 726, 729, 732, 736, 739, + 744, 747, 751, 755, 758, 761, 764, 767, 770, 774, + 778, 783, 786, 792, 795, 799, 802, 805, 808, 811, + 815, 818, 821, 825, 828, 831, 834, 837, 840, 843, + 846, 849, 852, 855, 859, 862, 865, 868, 871, 875, + 878, 881, 885, 889, 892, 895, 898, 901, 905, 908, + 912, 915, 918, 922, 925, 928, 931, 935, 938, 941, + 944, 947, 950, 953, 957, 960, 963, 966, 969, 972, + 975, 979, 982, 984, 987, 990, 992, 994, 997, 999, + 1001, 1004, 1007, 1009, 1012, 1015, 1017, 1020, 1023, 1025, + + 1028, 1031, 1034, 1037, 1040, 1044, 1048, 1051, 1054, 1057, + 1059, 1061, 1064, 1067, 1069, 1072, 1074, 1077, 1080, 1083, + 1086, 1089, 1092, 1096, 1099, 1102, 1106, 1110, 1113, 1116, + 1119, 1122, 1125, 1128, 1131, 1135, 1138, 1141, 1144, 1147, + 1153, 1157, 1161, 1167, 1170, 1173, 1176, 1179, 1182, 1185, + 1188, 1192, 1195, 1198, 1201, 1204, 1208, 1212, 1215, 1218, + 1221, 1224, 1227, 1230, 1233, 1237, 1240, 1243, 1246, 1248, + 1250, 1253, 1256, 1258, 1261, 1264, 1267, 1271, 1274, 1277, + 1280, 1283, 1286, 1289, 1292, 1295, 1299, 1302, 1305, 1308, + 1311, 1314, 1318, 1321, 1324, 1327, 1331, 1334, 1337, 1341, + + 1344, 1347, 1350, 1353, 1357, 1360, 1363, 1366, 1369, 1373, + 1376, 1378, 1381, 1383, 1386, 1389, 1391, 1393, 1396, 1399, + 1401, 1404, 1406, 1409, 1412, 1415, 1417, 1420, 1423, 1426, + 1429, 1432, 1435, 1438, 1440, 1444, 1447, 1450, 1454, 1457, + 1460, 1463, 1467, 1471, 1474, 1477, 1481, 1484, 1487, 1490, + 1493, 1497, 1500, 1505, 1509, 1513, 1517, 1520, 1522, 1524, + 1527, 1529, 1532, 1535, 1538, 1541, 1544, 1547, 1550, 1554, + 1558, 1561, 1564, 1569, 1572, 1576, 1579, 1582, 1585, 1588, + 1592, 1595, 1598, 1602, 1605, 1610, 1613, 1616, 1619, 1622, + 1625, 1628, 1631, 1634, 1638, 1641, 1645, 1648, 1650, 1653, + + 1655, 1657, 1660, 1662, 1665, 1667, 1670, 1673, 1677, 1680, + 1683, 1686, 1689, 1692, 1696, 1700, 1703, 1707, 1711, 1715, + 1719, 1723, 1727, 1731, 1735, 1739, 1743, 1746, 1751, 1754, + 1757, 1761, 1764, 1767, 1770, 1772, 1775, 1778, 1781, 1785, + 1788, 1791, 1794, 1796, 1799, 1802, 1804, 1807, 1810, 1813, + 1815, 1817, 1820, 1823, 1826, 1829, 1832, 1835, 1838, 1841, + 1845, 1848, 1851, 1854, 1857, 1860, 1863, 1866, 1869, 1872, + 1875, 1878, 1881, 1884, 1887, 1890, 1893, 1896, 1899, 1902, + 1906, 1909, 1912, 1914, 1916, 1919, 1922, 1926, 1928, 1932, + 1935, 1938, 1942, 1946, 1949, 1952, 1955, 1958, 1960, 1963, + + 1966, 1969, 1972, 1976, 1979, 1981, 1983, 1986, 1988, 1991, + 1993, 1995, 1997, 2000, 2002, 2005, 2008, 2010, 2012, 2015, + 2018, 2020, 2023, 2026, 2029, 2032, 2034, 2037, 2040, 2042, + 2045, 2048, 2051, 2053, 2055, 2058, 2060, 2062, 2065, 2068, + 2071, 2073, 2076, 2079, 2083, 2086, 2090, 2094, 2098, 2102, + 2105, 2110, 2114, 2117, 2121, 2124, 2128, 2132, 2137, 2141, + 2144, 2148, 2152, 2155, 2158, 2162, 2166, 2170, 2174, 2178, + 2182, 2186, 2191, 2195, 2199, 2203, 2207, 2210, 2213, 2217, + 2220, 2225, 2228, 2232, 2236, 2239, 2242, 2246, 2249, 2252, + 2255, 2258, 2262, 2265, 2268, 2271, 2274, 2277, 2280, 2283, + + 2283, 2284, 2285, 2286, 2287, 2288, 2288, 2288, 2289, 2290, + 2291, 2291, 2291, 2291, 2292, 2292, 2293, 2294, 2294, 2295, + 2295, 2296, 2296, 2296, 2297, 2298, 2298, 2298, 2299, 2299, + 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, + 2301, 2302, 2303, 2303, 2303, 2303, 2303, 2303, 2303, 2303, + 2303, 2303, 2303, 2303, 2303, 2303, 2304, 2305, 2305, 2306, + 2307, 2307, 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, + 2315, 2316, 2317, 2318, 2319, 2320, 2321, 2322, 2323, 2324, + 2324, 2325, 2325, 2325, 2325, 2325, 2326, 2327, 2327, 2328, + 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2335, 2335, 2335, + + 2335, 2335, 2335, 2336, 2336, 2336, 2336, 2336, 2336, 2336, + 2337, 2338, 2339, 2341, 2343, 2344, 2344, 2345, 2345, 2345, + 2347, 2349, 2349, 2349, 2349, 2349, 2350, 2350, 2351, 2351, + 2351, 2351, 2352, 2352, 2353, 2353, 2353, 2354, 2356, 2358, + 2358, 2358, 2358, 2359, 2361, 2363, 2364, 2364, 2365, 2367, + 2369, 2370, 2371, 2372, 2372, 2373, 2373, 2374, 2375, 2377, + 2378, 2378, 2379, 2381, 2384, 2384, 2385, 2385, 2386, 2387, + 2388, 2389, 2390, 2391, 2393, 2393, 2393, 2394, 2396, 2396, + 2397, 2397, 2397, 2398, 2399, 2402, 2403, 2404, 2405, 2405, + 2406, 2408, 2408, 2410, 2411, 2411, 2412, 2414, 2417, 2417, + + 2417, 2417, 2418, 2420, 2422, 2423, 2423, 2423, 2423, 2423, + 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, + 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, 2423, + 2424, 2425, 2428, 2428, 2428, 2429, 2430, 2430, 2430, 2430, + 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, 2430, + 2430, 2431, 2431, 2431, 2433, 2435, 2438, 2440, 2441, 2442, + 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, 2442, + 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, 2443, + 2443, 2446, 2446, 2446, 2447, 2447, 2448, 2448, 2449, 2449, + 2450, 2450, 2451, 2453, 2453, 2454, 2454, 2455, 2457, 2457, + + 2458, 2458, 2458, 2458, 2458, 2459, 2459, 2460, 2460, 2460, + 2460, 2460, 2460, 2461, 2461, 2461, 2461, 2462, 2463, 2464, + 2464, 2467, 2468, 2468, 2471, 2471, 2471, 2471, 2475, 2477, + 2478, 2482, 2483, 2484, 2488, 2488, 2488, 2488, 2488, 2488, + 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2488, 2489, 2489, + 2490, 2490, 2491, 2492, 2493, 2495, 2497, 2499, 2500, 2500, + 2501, 2501, 2502, 2503, 2504, 2505, 2506, 2508, 2510, 2510, + 2510, 2510, 2510, 2511, 2512, 2513, 2514, 2516, 2518, 2518, + 2519, 2520, 2521, 2523, 2525, 2526, 2526, 2526, 2526, 2527, + 2527, 2527, 2528, 2530, 2530, 2531, 2531, 2532, 2533, 2534, + + 2535, 2535, 2536, 2538, 2538, 2539, 2541, 2541, 2542, 2542, + 2543, 2543, 2543, 2543, 2544, 2544, 2545, 2545, 2546, 2547, + 2547, 2548, 2549, 2550, 2551, 2552, 2552, 2552, 2553, 2554, + 2554, 2555, 2556, 2558, 2560, 2562, 2563, 2563, 2566, 2566, + 2566, 2566, 2566, 2566, 2566, 2567, 2568, 2569, 2570, 2572, + 2573, 2573, 2573, 2574, 2574, 2574, 2576, 2578, 2578, 2578, + 2578, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, + 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, + 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, + 2579, 2579, 2579, 2580, 2580, 2581, 2582, 2583, 2584, 2585, + + 2586, 2587, 2588, 2589, 2589, 2589, 2589, 2589, 2589, 2589, + 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2589, 2590, + 2590, 2591, 2592, 2592, 2592, 2592, 2593, 2593, 2594, 2595, + 2597, 2599, 2599, 2599, 2600, 2601, 2603, 2606, 2609, 2610, + 2611, 2613, 2616, 2619, 2620, 2621, 2623, 2626, 2629, 2630, + 2631, 2633, 2634, 2634, 2635, 2635, 2637, 2639, 2639, 2640, + 2640, 2641, 2643, 2643, 2644, 2644, 2645, 2647, 2647, 2648, + 2650, 2650, 2650, 2651, 2653, 2654, 2656, 2657, 2658, 2660, + 2662, 2664, 2665, 2666, 2667, 2669, 2671, 2673, 2674, 2675, + 2677, 2679, 2681, 2682, 2683, 2685, 2687, 2689, 2690, 2691, + + 2693, 2695, 2697, 2697, 2697, 2697, 2697, 2698, 2699, 2699, + 2700, 2701, 2702, 2703, 2704, 2704, 2706, 2706, 2707, 2707, + 2708, 2709, 2710, 2712, 2714, 2714, 2714, 2714, 2715, 2717, + 2718, 2719, 2721, 2723, 2725, 2725, 2725, 2725, 2726, 2726, + 2727, 2727, 2728, 2728, 2729, 2730, 2731, 2732, 2733, 2733, + 2734, 2734, 2735, 2736, 2737, 2738, 2739, 2740, 2741, 2741, + 2742, 2744, 2744, 2745, 2747, 2747, 2747, 2748, 2748, 2749, + 2749, 2750, 2751, 2752, 2752, 2753, 2753, 2754, 2755, 2757, + 2759, 2761, 2762, 2763, 2764, 2766, 2766, 2766, 2767, 2768, + 2770, 2771, 2772, 2772, 2772, 2772, 2772, 2773, 2773, 2774, + + 2774, 2774, 2774, 2774, 2775, 2775, 2776, 2776, 2776, 2776, + 2776, 2776, 2776, 2777, 2777, 2778, 2778, 2778, 2778, 2778, + 2778, 2778, 2778, 2778, 2778, 2778, 2778, 2778, 2778, 2778, + 2778, 2778, 2778, 2778, 2778, 2779, 2779, 2779, 2779, 2780, + 2780, 2780, 2781, 2781, 2781, 2782, 2782, 2783, 2784, 2785, + 2786, 2787, 2788, 2789, 2790, 2791, 2792, 2793, 2794, 2795, + 2796, 2797, 2798, 2799, 2800, 2801, 2801, 2802, 2802, 2803, + 2803, 2803, 2804, 2805, 2805, 2806, 2806, 2807, 2807, 2807, + 2807, 2807, 2807, 2808, 2809, 2809, 2810, 2810, 2811, 2812, + 2812, 2813, 2813, 2813, 2814, 2814, 2815, 2815, 2816, 2816, + + 2817, 2818, 2818, 2819, 2819, 2820, 2821, 2822, 2822, 2822, + 2823, 2824, 2824, 2825, 2825, 2825, 2826, 2826, 2827, 2828, + 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, 2828, + 2828, 2828, 2828, 2829, 2829, 2829, 2829, 2829, 2829, 2829, + 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, 2829, + 2829, 2829, 2830, 2831, 2832, 2832, 2832, 2832, 2832, 2832, + 2832, 2832, 2832, 2832, 2833, 2833, 2833, 2833, 2833, 2833, + 2833, 2833, 2833, 2833, 2833, 2833, 2834, 2834, 2835, 2835, + 2836, 2837, 2838, 2838, 2838, 2839, 2839, 2840, 2841, 2841, + 2841, 2841, 2841, 2844, 2847, 2850, 2853, 2853, 2853, 2853, + + 2853, 2853, 2853, 2853, 2853, 2854, 2854, 2854, 2854, 2854, + 2854, 2854, 2854, 2854, 2854, 2855, 2856, 2857, 2858, 2858, + 2858, 2858, 2858, 2858, 2859, 2860, 2861, 2862, 2863, 2864, + 2864, 2865, 2865, 2866, 2866, 2867, 2868, 2868, 2868, 2868, + 2868, 2868, 2868, 2868, 2868, 2870, 2872, 2873, 2873, 2874, + 2874, 2875, 2875, 2876, 2876, 2876, 2876, 2876, 2876, 2876, + 2876, 2876, 2876, 2876, 2876, 2876, 2876, 2876, 2876, 2876, + 2876, 2876, 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877, + 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2877, 2878, + 2878, 2878, 2878, 2878, 2878, 2878, 2878, 2879, 2879, 2879, + + 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2880, 2880, + 2880, 2880, 2881, 2881, 2882, 2882, 2882, 2882, 2883, 2883, + 2883, 2883, 2883, 2883, 2884, 2884, 2884, 2884, 2884, 2884, + 2884, 2884, 2884, 2884, 2884, 2885, 2885, 2885, 2885, 2885, + 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, + 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2885, + 2885, 2885, 2885, 2885, 2885, 2885, 2885, 2886, 2886, 2887, + 2887, 2888, 2888, 2888, 2888, 2889, 2889, 2889, 2890, 2891, + 2891, 2891, 2891, 2891, 2891, 2892, 2892, 2892, 2893, 2893, + 2894, 2894, 2895, 2896, 2897, 2898, 2899, 2899, 2899, 2900, + + 2901, 2901, 2902, 2902, 2902, 2903, 2904, 2904, 2905, 2906, + 2906, 2906, 2906, 2906, 2906, 2907, 2909, 2909, 2909, 2909, + 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, + 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2909, 2910, 2910, + 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, + 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, + 2932, 2934, 2934, 2934, 2934, 2934, 2935, 2937, 2937, 2937, + 2938, 2940, 2940, 2941, 2941, 2941, 2942, 2942, 2942, 2942, + 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2943, + 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2943, 2943, + + 2943, 2943, 2943, 2943, 2944, 2944, 2944, 2944, 2944, 2944, + 2944, 2944, 2944, 2945, 2945, 2945, 2945, 2945, 2945, 2945, + 2945, 2946, 2946, 2946, 2946, 2946, 2946, 2946, 2947, 2947, + 2947, 2947, 2947, 2947, 2947, 2948, 2948, 2948, 2948, 2948, + 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2949, + 2950, 2951, 2951, 2951, 2951, 2951, 2951, 2951, 2951, 2951, + 2953, 2953, 2954, 2955, 2956, 2957, 2957, 2958, 2958, 2959, + 2959, 2959, 2959, 2959, 2959, 2959, 2959, 2959, 2959, 2959, + 2959, 2959, 2959, 2959, 2960, 2960, 2960, 2960, 2960, 2961, + 2961, 2961, 2961, 2961, 2961, 2961, 2961, 2961, 2961, 2961, + + 2961, 2961, 2961, 2961, 2962, 2962, 2962, 2962, 2963, 2963, + 2963, 2964, 2964, 2965, 2965, 2966, 2966, 2966, 2967, 2967, + 2968, 2968, 2969, 2969, 2969, 2970, 2970, 2970, 2970, 2970, + 2970, 2971, 2971, 2971, 2971, 2972, 2972, 2972, 2972, 2972, + 2972, 2972, 2972, 2972, 2972, 2973, 2973, 2974, 2974, 2975, + 2975, 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976, + 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2976, + 2976, 2976, 2976, 2976, 2976, 2976, 2976, 2977, 2978, 2978, + 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, + 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, 2978, + + 2978, 2978, 2978, 2978, 2979, 2979, 2979, 2979, 2980, 2980, + 2980, 2980, 2980, 2980, 2981, 2981, 2981, 2981, 2982, 2982, + 2982, 2982, 2982, 2982, 2982, 2982, 2982, 2982, 2984, 2985, + 2985, 2985, 2986, 2988, 2988, 2988, 2988, 2988, 2988, 2989, + 2989, 2990, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, + 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, 2991, + 2991, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, + 3000, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, + 3010, 3011, 3011, 3011, 3011, 3012, 3012, 3012, 3013, 3013, + 3015, 3016, 3017, 3017, 3018, 3018, 3018, 3018, 3019, 3019, + + 3019, 3019, 3020, 3020, 3020, 3021, 3021, 3022, 3022, 3022, + 3022, 3022, 3022, 3022, 3023, 3023, 3023, 3023, 3023, 3023, + 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, + 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3024, + 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024, + 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024, 3024, + 3024, 3024, 3024, 3024, 3025, 3026, 3027, 3027, 3027, 3027, + 3027, 3027, 3027, 3027, 3027, 3028, 3028, 3028, 3028, 3028, + 3028, 3028, 3028, 3028, 3029, 3029, 3029, 3030, 3030, 3031, + 3031, 3032, 3032, 3032, 3033, 3033, 3034, 3034, 3035, 3035, + + 3035, 3035, 3035, 3036, 3036, 3036, 3037, 3037, 3037, 3037, + 3037, 3037, 3037, 3037, 3037, 3037, 3038, 3038, 3039, 3039, + 3040, 3040, 3041, 3041, 3041, 3041, 3041, 3041, 3041, 3041, + 3041, 3041, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, + 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, 3042, + 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3043, 3044, + 3044, 3044, 3044, 3045, 3045, 3046, 3046, 3046, 3046, 3046, + 3046, 3046, 3046, 3046, 3046, 3046, 3047, 3047, 3048, 3048, + 3049, 3049, 3050, 3050, 3050, 3050, 3050, 3050, 3050, 3050, + 3050, 3050, 3050, 3050, 3050, 3051, 3051, 3052, 3052, 3052, + + 3052, 3052, 3052, 3052, 3052, 3052, 3053, 3053, 3053, 3053, + 3053, 3053, 3054, 3054, 3055, 3055, 3055, 3055, 3055, 3055, + 3055, 3055, 3055, 3055, 3055, 3055, 3055, 3055, 3055, 3055, + 3055, 3055, 3055, 3055, 3055, 3055, 3055, 3055, 3055, 3055, + 3055, 3055, 3055, 3055, 3056, 3056, 3056, 3056, 3057, 3057, + 3057, 3057, 3058, 3058, 3059, 3059, 3059, 3059, 3059, 3059, + 3061, 3061, 3061, 3062, 3062, 3062, 3062, 3063, 3063, 3063, + 3064, 3064, 3064, 3064, 3064, 3064, 3064, 3064, 3064, 3064, + 3064, 3064, 3064, 3064, 3064, 3064, 3064, 3065, 3066, 3067, + 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, 3076, 3077, + + 3078, 3079, 3080, 3081, 3082, 3083, 3083, 3083, 3084, 3084, + 3084, 3086, 3086, 3087, 3088, 3088, 3088, 3088, 3088, 3088, + 3089, 3090, 3090, 3090, 3091, 3091, 3092, 3092, 3092, 3092, + 3092, 3092, 3092, 3093, 3093, 3094, 3094, 3094, 3095, 3095, + 3095, 3095, 3095, 3095, 3095, 3095, 3095, 3095, 3095, 3095, + 3095, 3095, 3095, 3095, 3095, 3096, 3096, 3097, 3097, 3097, + 3097, 3097, 3097, 3097, 3097, 3097, 3097, 3097, 3098, 3099, + 3099, 3099, 3099, 3099, 3099, 3099, 3100, 3100, 3100, 3100, + 3100, 3100, 3101, 3102, 3103, 3104, 3104, 3104, 3104, 3104, + 3104, 3104, 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105, + + 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105, 3105, + 3105, 3105, 3105, 3106, 3106, 3106, 3106, 3107, 3107, 3108, + 3108, 3108, 3108, 3108, 3108, 3108, 3108, 3108, 3108, 3108, + 3109, 3109, 3110, 3110, 3110, 3111, 3111, 3111, 3111, 3112, + 3112, 3113, 3113, 3113, 3113, 3113, 3114, 3114, 3114, 3114, + 3114, 3114, 3114, 3114, 3114, 3114, 3114, 3114, 3114, 3114, + 3114, 3115, 3116, 3116, 3117, 3117, 3117, 3117, 3117, 3117, + 3117, 3117, 3117, 3117, 3118, 3119, 3119, 3119, 3119, 3119, + 3120, 3120, 3120, 3120, 3120, 3120, 3120, 3121, 3121, 3121, + 3121, 3121, 3122, 3123, 3124, 3124, 3124, 3124, 3124, 3124, + + 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, + 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, 3124, + 3124, 3124, 3124, 3125, 3125, 3125, 3125, 3126, 3127, 3127, + 3127, 3128, 3129, 3130, 3131, 3132, 3132, 3132, 3132, 3132, + 3132, 3132, 3132, 3133, 3133, 3134, 3135, 3135, 3135, 3135, + 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3135, + 3136, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, + 3144, 3145, 3146, 3147, 3148, 3149, 3150, 3151, 3152, 3153, + 3153, 3154, 3154, 3154, 3154, 3154, 3155, 3155, 3155, 3155, + 3156, 3156, 3156, 3156, 3156, 3156, 3156, 3156, 3156, 3156, + + 3156, 3156, 3157, 3157, 3158, 3158, 3159, 3159, 3159, 3159, + 3159, 3160, 3161, 3161, 3161, 3162, 3162, 3162, 3162, 3162, + 3162, 3162, 3162, 3163, 3164, 3164, 3164, 3165, 3165, 3165, + 3165, 3165, 3166, 3166, 3166, 3167, 3167, 3167, 3168, 3168, + 3169, 3169, 3169, 3170, 3170, 3170, 3170, 3171, 3171, 3172, + 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, + 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, 3172, + 3172, 3172, 3173, 3173, 3173, 3173, 3173, 3174, 3174, 3174, + 3175, 3175, 3175, 3175, 3175, 3175, 3175, 3175, 3176, 3176, + 3176, 3176, 3177, 3177, 3177, 3177, 3177, 3178, 3178, 3178, + + 3178, 3178, 3179, 3179, 3179, 3179, 3179, 3181, 3182, 3182, + 3182, 3182, 3182, 3182, 3182, 3183, 3183, 3183, 3183, 3183, + 3183, 3183, 3183, 3183, 3184, 3184, 3184, 3184, 3184, 3184, + 3184, 3184, 3184, 3184, 3185, 3185, 3185, 3185, 3185, 3186, + 3186, 3186, 3186, 3187, 3187, 3187, 3187, 3187, 3187, 3188, + 3188, 3189, 3190, 3190, 3191, 3191, 3191, 3191, 3191, 3192, + 3192, 3192, 3193, 3194, 3194, 3194, 3194, 3194, 3195, 3196, + 3196, 3197, 3198, 3199, 3200, 3201, 3201, 3202, 3203, 3203, + 3204, 3205, 3206, 3206, 3208, 3209, 3210, 3210, 3210, 3211, + 3211, 3211, 3211, 3211, 3212, 3212, 3212, 3213, 3214, 3214, + + 3214, 3214, 3214, 3214, 3215, 3215, 3215, 3215, 3216, 3216, + 3217, 3217, 3218, 3218, 3218, 3218, 3219, 3220, 3220, 3221, + 3222, 3223, 3224, 3224, 3224, 3224, 3224, 3224, 3224, 3224, + 3224, 3224, 3224, 3224, 3225, 3225, 3225, 3226, 3226, 3227, + 3227, 3227, 3227, 3227, 3227, 3227, 3228, 3228, 3228, 3228, + 3229, 3229, 3229, 3229, 3229, 3229, 3229, 3229, 3229, 3230, + 3231, 3231, 3231, 3231, 3231, 3231, 3232, 3232, 3232, 3232, + 3232, 3233, 3233, 3233, 3233, 3233, 3233, 3234, 3234, 3234, + 3234, 3234, 3234, 3234, 3235, 3235, 3235, 3235, 3235, 3235, + 3235, 3236, 3236, 3236, 3237, 3237, 3238, 3238, 3238, 3238, + + 3238, 3239, 3239, 3240, 3241, 3241, 3241, 3241, 3242, 3242, + 3242, 3242, 3242, 3243, 3243, 3243, 3244, 3244, 3245, 3246, + 3247, 3248, 3249, 3250, 3251, 3251, 3254, 3254, 3254, 3255, + 3256, 3256, 3257, 3257, 3258, 3259, 3259, 3260, 3261, 3261, + 3262, 3263, 3263, 3263, 3263, 3263, 3264, 3265, 3265, 3265, + 3266, 3266, 3267, 3267, 3267, 3268, 3269, 3269, 3270, 3270, + 3271, 3271, 3271, 3271, 3271, 3272, 3272, 3272, 3272, 3272, + 3272, 3272, 3272, 3272, 3272, 3273, 3274, 3274, 3274, 3275, + 3275, 3275, 3275, 3275, 3275, 3276, 3277, 3278, 3278, 3278, + 3278, 3278, 3278, 3279, 3280, 3281, 3282, 3282, 3282, 3282, + + 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282, 3282, + 3282, 3282, 3283, 3283, 3284, 3284, 3284, 3284, 3286, 3287, + 3287, 3287, 3287, 3287, 3288, 3289, 3289, 3289, 3289, 3289, + 3289, 3290, 3291, 3291, 3292, 3293, 3294, 3294, 3295, 3296, + 3297, 3299, 3299, 3300, 3301, 3301, 3302, 3303, 3304, 3305, + 3306, 3306, 3306, 3306, 3307, 3307, 3308, 3308, 3309, 3309, + 3309, 3309, 3309, 3309, 3309, 3310, 3311, 3311, 3311, 3312, + 3313, 3313, 3314, 3315, 3315, 3316, 3317, 3317, 3317, 3317, + 3317, 3317, 3317, 3317, 3318, 3319, 3319, 3319, 3319, 3320, + 3321, 3321, 3321, 3322, 3322, 3324, 3324, 3324, 3324, 3324, + + 3325, 3325, 3325, 3326, 3327, 3328, 3328, 3328, 3329, 3329, + 3329, 3330, 3331, 3331, 3332, 3333, 3334, 3335, 3336, 3337, + 3338, 3339, 3340, 3341, 3341, 3342, 3342, 3343, 3343, 3344, + 3344, 3344, 3344, 3345, 3346, 3346, 3347, 3347, 3347, 3347, + 3347, 3347, 3348, 3349, 3349, 3350, 3350, 3350, 3350, 3351, + 3352, 3352, 3353, 3355, 3355, 3357, 3358, 3359, 3359, 3359, + 3359, 3359, 3359, 3359, 3359, 3360, 3361, 3361, 3362, 3363, + 3364, 3364, 3365, 3365, 3365, 3365, 3365, 3366, 3367, 3367, + 3367, 3367, 3367, 3367, 3368, 3368, 3368, 3368, 3369, 3370, + 3370, 3370, 3370, 3370, 3370, 3370, 3370, 3371, 3371, 3372, + + 3373, 3374, 3376, 3377, 3378, 3379, 3379, 3379, 3379, 3379, + 3380, 3381, 3382, 3382, 3383, 3385, 3386, 3386, 3387, 3387, + 3388, 3389, 3389, 3389, 3389, 3389, 3390, 3391, 3392, 3392, + 3392, 3393, 3393, 3393, 3394, 3394, 3395, 3396, 3396, 3397, + 3398, 3398, 3399, 3400, 3401, 3402, 3402, 3403, 3404, 3404, + 3405, 3406, 3406, 3407, 3408, 3409, 3409 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 2, 1, 1, 3, 4, + 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 25, 25, 25, 26, 27, 27, 28, 29, 30, + 31, 32, 1, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, + 43, 49, 50, 51, 52, 53, 43, 54, 55, 43, + 56, 57, 58, 1, 43, 1, 59, 60, 61, 62, + + 63, 64, 65, 66, 67, 43, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 43, 83, 1, 84, 85, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[86] = + { 0, + 1, 1, 2, 3, 4, 2, 1, 5, 6, 1, + 1, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 17, 17, 17, 17, 17, 18, 1, 19, + 1, 20, 21, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 23, 24, 25, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 26, 27, 28 + } ; + +static yyconst short int yy_base[4465] = + { 0, + 0, 4, 25, 0, 109, 113, 117, 137, 127, 131, + 194, 0, 279, 0, 364, 0, 448, 453, 458, 476, + 559, 0, 644, 0, 729, 0, 151, 157, 813, 819, + 162, 496, 504, 529, 901, 983, 841, 847, 491, 833, + 861, 907, 854, 895, 1066, 0, 1151, 0, 933, 1235, + 874, 948, 938, 953, 992, 1245, 1253, 1260, 977, 997, + 518, 533, 1022, 1280, 1027, 1031, 1266, 1273, 1293, 1301, + 1307, 1342, 1349, 1363, 1357, 1381, 1386, 1401, 1422, 0, + 1506, 1512, 1533, 1618, 1553, 1638, 1703, 1788, 1723, 1808, + 1566, 1573, 1873, 0, 1958, 2043, 2128, 2213, 1591, 1665, + + 2298, 0, 2001, 2006, 1577, 1651, 1678, 1736, 2383, 0, + 2468, 0, 2088, 2148, 1760, 1821, 1834, 1978, 2553, 0, + 1748, 1826, 2638, 0, 1830, 1996, 2175, 2233, 2722, 2728, + 2735, 2748, 2805, 461, 2066, 2077, 2890, 2975, 2019, 2098, + 3060, 3145, 2161, 2166, 114, 2770, 3230, 3315, 2171, 2246, + 3400, 0, 3485, 0, 2258, 2272, 2826, 2850, 2762, 2855, + 2910, 2935, 3570, 0, 2940, 2996, 3080, 3105, 2846, 2905, + 3655, 0, 3740, 3825, 3910, 0, 3163, 3190, 3248, 3275, + 2930, 3007, 3016, 3036, 3093, 3100, 3335, 3760, 2254, 2950, + 3995, 4079, 3845, 4010, 4163, 4248, 4333, 4418, 4503, 4588, + + 3022, 3030, 4028, 4112, 4673, 4758, 4843, 4927, 3167, 3178, + 5011, 0, 3268, 3348, 3355, 3375, 3773, 3780, 3800, 3858, + 4015, 4099, 3865, 3870, 5096, 0, 4183, 4206, 5181, 5266, + 3115, 3120, 5351, 0, 3205, 3290, 3362, 3787, 5436, 0, + 3200, 3263, 5521, 0, 5606, 5691, 5776, 5861, 4120, 4125, + 5946, 0, 3370, 3883, 4033, 4037, 4213, 4266, 4295, 4380, + 4042, 4280, 4365, 4450, 4307, 4464, 4535, 4549, 4608, 4620, + 4138, 4270, 4351, 4355, 4436, 4440, 6031, 0,19171,28760, + 19168,28760,28760, 1,19154,28760,19165,28760,28760, 2, + 28760,19164, 1036, 1321, 2754,28760, 3,19160, 967, 1742, + + 2119,19135,28760, 3049, 4, 8, 462,28760,28760,28760, + 28760, 0, 882, 1326, 1520,28760,19134,28760, 4522, 143, + 28760,19159,28760,28760,28760, 163, 95,19093,28760,19102, + 28760, 4220, 4627,28760, 6114, 4541, 4579, 467, 4,19142, + 4692, 165,19129, 4704,28760,28760, 4631,28760, 4711, 4662, + 4747, 4791, 4778, 4806, 4799, 4883, 4890, 4718,28760, 184, + 4795, 4864, 4874,19128, 4919, 552, 4900, 4947, 4966, 4970, + 467,28760, 0,28760, 470,28760,28760,28760, 4974,28760, + 19153, 826, 1286, 1596,28760,28760, 1414, 530,28760,19152, + 28760,28760,28760, 532, 5225, 5230, 5254, 804,28760, 4732, + + 19081,19093,19081,19072,28760,19141,28760,28760, 1685, 877, + 19110,28760,19138,28760, 898,28760,28760, 0, 5242, 1526, + 1768, 1779,19131,19081, 902,28760,28760,28760,19078, 5212, + 5217, 5221,19108, 5307, 1853, 5313, 5625, 5637,19106, 5641, + 1857,28760,19131,28760,28760,28760,19075,19110, 905,28760, + 5645, 930,28760,28760, 935, 122,28760,28760,19128,28760, + 28760,28760,19108, 947, 0,28760,19126,28760,19106, 994, + 28760,28760,19111,19080, 146, 1030, 187, 0, 526, 854, + 0,18967, 1040,18956, 511,28760,18921, 1043,28760,28760, + 28760,28760, 0, 5654, 878,28760, 0,18896, 1238,18891, + + 18841,18840, 1003, 1251, 1272,28760,18770, 1863, 2025, 2030, + 1317,28760,28760,28760,28760,28760,28760, 0,18748, 1378, + 2194, 2107, 2278, 1318, 1355,28760,18734, 2200,28760,28760, + 18687, 1376, 0, 64, 6135, 4339, 5287, 1551, 1564,28760, + 18702, 2959,28760,28760,18682, 2111, 1576, 844, 6156, 4424, + 5710,28760, 2784, 5724, 1588,28760,18700, 4090,28760,28760, + 18678, 1590, 459, 919, 4927, 5691, 5795, 1592, 1636,28760, + 18696, 3221, 5732, 5809, 1644, 1594, 1620, 4636, 1657,28760, + 28760, 1733, 5680, 5814, 5818,18676,18668, 5850, 2790, 2869, + 28760, 2874, 0, 0, 1827, 2878,28760, 3041, 0, 0, + + 1965,28760,18693,28760,28760, 1257,18673, 1976,18620, 5880, + 5892, 5896,28760,18664, 5900, 3124, 4374,28760, 1736,18619, + 18624,18617,28760,28760,18686,28760,28760, 1997,18669, 0, + 28760,18680, 2249,28760,28760,18660, 1999, 985, 762, 6122, + 28760, 3128, 6129, 2044, 5863, 6094,28760,18678, 2768,28760, + 28760,18658, 2146,28760,18675,28760,28760,18655, 2167,28760, + 18655, 0, 973,28760, 0, 2169,28760, 0,18669, 1019, + 28760,18668, 2264,28760,18669,28760,28760,18649, 2173, 813, + 2954, 2186,28760,18667,28760,28760,18647, 3211, 2188,18600, + 3284, 2720,28760,18664,28760,28760, 2730,18598, 6143, 2749, + + 4025, 4584, 6180, 6242, 2781,28760,18662,28760,28760, 2783, + 18642,28760, 0, 0, 2943,18658, 1051,28760,18657, 3119, + 28760, 0, 0, 2947, 844, 0, 0, 2951,28760, 6261, + 28760,18654, 5906, 6160, 6248, 2978,18627, 6265, 3298,28760, + 6276,28760,28760,28760,18652,28760, 6292, 2981,28760,18649, + 3889, 4226, 5201,28760,28760, 3384, 3165, 3806, 5832, 6297, + 6311, 5910, 6325,28760,18594,28760,28760,28760, 0, 6316, + 28760,28760, 0, 3169,18586,18585, 3177,28760,18645,28760, + 6342, 3291, 3810, 4145, 4232,18561,18631, 0,18624, 3832, + 165, 6418, 6439, 6511, 6588, 6660,18558,18634, 0, 6329, + + 6335, 6339,18613, 6344, 4320,28760,18638,28760,18621,18613, + 3868,18570,18569, 0, 4569,28760, 3880, 0, 5334, 3882, + 0, 5674, 3884, 0, 5742, 6349, 6365, 6470, 3988,18610, + 18566,18565, 0, 4002,18564,28760,18623,28760,28760, 4013, + 18561, 0, 0, 0, 4024, 0, 0, 4043,28760, 885, + 1301, 0, 4045, 0, 4049,28760, 0, 522, 0, 0, + 4097,28760,28760, 0, 0, 6356, 4105, 0, 6424, 4118, + 0, 6429, 4139, 0, 6438, 4181,28760,18621,28760,28760, + 4182, 1699, 4486, 6443, 4827, 4904, 4911, 6537, 501,18618, + 3253,28760,18617, 832, 4185, 944,18557, 0, 0, 4191, + + 0, 1061, 0, 4193, 6387, 6518, 6544,18591, 6551, 4995, + 532, 1406, 1238, 4371,28760, 0,18614, 1394,28760,18613, + 4286,28760, 0, 2018, 1696, 0, 0, 4212, 0, 0, + 4298,28760,18553,18548, 0,18610, 2104,28760,18609,18563, + 4386,28760,18554,28760, 4388,28760, 6556, 0, 6565,28760, + 0,28760,28760, 4390, 0, 0, 6572, 0,28760,18472, + 28760,28760, 4443,18526,28760,28760,28760, 0, 6611, 5248, + 5342, 5668,28760,28760,28760,28760,28760,18494, 6560, 6585, + 6598, 4444,28760,28760,28760,18493,28760,18466, 4478,28760, + 18475,28760, 4635,18410, 4819,18457, 4637,18408, 0,18466, + + 28760,28760,28760,28760,18453, 6606, 4711, 1405, 940,28760, + 6625, 6630,18437, 1314, 6634, 6667, 1371, 6638, 0, 3136, + 0, 6686, 6693, 6697, 1691, 6701, 6706, 6710,18435, 1972, + 4673,18402,18386,18447, 6717, 6743, 4726, 6747, 4728, 6782, + 6751, 4602,18431,18389, 912,18386,18384,18396, 1988, 1787, + 18372,18382,18385, 5620,18384, 1572, 6755, 6769, 2070, 4986, + 6777, 6789, 6795,18414, 6808, 6803, 6836, 6865, 6869, 6873, + 6879, 6884, 6917, 6922, 6932, 6950, 6960, 6964, 6968, 6717, + 6824, 6912,18414, 6980, 7000, 7006,28760, 7010, 7014, 2081, + 6271, 0, 7034, 7042, 7050, 7054, 7058,18369,18381,18373, + + 18366, 7064, 7068,18366,18369,18360,18365, 7072, 7078,28760, + 0, 7086, 0, 7092, 7097,18425,28760,18419, 7095, 7106, + 0,18361, 7119,18398, 7131, 7135, 7139, 0, 7145,18397, + 7149, 7161, 7175, 0,18411, 7161,28760, 2254, 4961, 7187, + 4844, 2286,28760,28760, 0,18418, 1275,28760,28760,28760, + 28760,18417,18415, 1295,18414, 1515, 0, 4103, 0, 3379, + 18397,28760,28760, 0,18412,28760, 1660,18411,18412,18409, + 18408, 0, 7193, 0, 3874,18390,28760,28760, 1767,18339, + 18338, 4270, 4869,18392, 5753, 7197, 0,18391, 4939, 4471, + 18390, 5829, 7201, 7207,18389,18388, 4988,18383, 6138, 7190, + + 1500,28760,28760,28760, 0, 2099,18327, 2219,18333, 1914, + 2658,18323, 1937,18334,18313,18332,18327, 773,18307,18317, + 2719, 5678, 2683,18312, 6779,18309, 7215,18369,18363,28760, + 18367, 5823, 6404,18302,28760,28760, 1174,18299, 2780, 2159, + 1708,18314,18309, 6183, 2783,18312, 3204, 2723, 4501, 7222, + 28760, 7236, 7270,28760, 7241,28760, 7277, 7281, 5273, 1777, + 4595,18298,18298,18297,18302,18300,18302, 2145,18293, 7282, + 5182, 7165,18291, 5837, 7286,18341,18286,18292, 7296,18334, + 28760, 7305,18326,28760, 7315, 7319, 7331, 0, 7345,28760, + 18345, 0, 0, 7351,28760,18343, 0, 0, 6288, 6371, + + 18287, 7355,18321, 7359, 7363, 7367, 0, 7371, 2863,18275, + 18274, 5915, 2924,18274,18269,18274,28760,18328, 0, 2954, + 7376,28760, 7390, 7401,18320, 7351, 7376, 7442,28760, 7456, + 7460, 7410, 7435, 7476,18262,18261,18279,18256, 1955,18277, + 18272, 3159,18267,18270, 3037, 2786, 6396,28760,18307,28760, + 18259,18304, 0, 1694, 0, 0, 0, 0,18319,28760, + 2191,18318,18319,18316,18315,28760,28760,28760,18243,18246, + 6380,18300,28760,18299,28760,28760,28760,28760, 6405,18298, + 7500, 7515,28760,28760, 6510, 2211, 2684,18222, 7310, 2979, + 18273, 0, 0,18276,28760, 3046,18275,18274,18271,18270, + + 18265, 0, 0,18264, 0, 0, 7519, 7531,18242, 7538, + 7523,18241, 7564, 7568, 7572, 0, 7576,28760,28760, 7580, + 28760,28760, 7594, 7598, 7610, 7614, 7619,18212,18211,18201, + 0, 7585, 0,28760,28760,18185,18184,28760, 6833, 6358, + 18177, 1960,18179,18172, 7633, 7640, 7647, 7651, 7655, 7653, + 0, 0, 0,18226, 4698,28760,18222, 7722,18222, 7774, + 28760, 7662, 6420, 7646, 2873, 3117, 7649, 6955, 3145, 6273, + 3265, 6198, 7644, 7654, 3730, 4118, 7696, 7714, 7722, 2977, + 7749,18144, 2816, 7764,18155,18150, 5175,18140,18147,18139, + 18112,18181, 7845, 1493, 7922,28760,28760,28760,28760,28760, + + 28760,28760,18175, 7889, 7777, 7893, 7326, 7758, 3277, 4068, + 3323, 7902, 3748, 3236, 5705, 2085, 4466, 3760,18113,18112, + 18106, 0, 7800,18085, 7872, 7876, 7781, 0,28760,28760, + 28760,18041,18038, 0, 7796, 0, 0, 0, 0, 7881, + 0, 0, 0, 0, 7912, 0, 0, 0, 0, 7899, + 0, 7920, 7967,18045,18044,28760,28760, 4244,18035,18008, + 0, 0,17965, 0,18022, 0, 0,18021, 0, 0, + 4457, 4453, 0, 0, 0, 0, 0, 2733, 0, 0, + 0, 0, 0, 7978, 0, 0, 0, 0, 7983, 0, + 0, 0, 0, 7988, 0, 0, 0, 0, 7993, 0, + + 0, 0,17961,17957,17952, 7785, 7885, 7929, 7999, 8005, + 8010, 8015, 8022, 8026, 6304, 4065,17991,28760, 5630,17956, + 17942,17937,17935,17859, 4006,17780,17841, 0, 0, 0, + 4325, 0, 0, 0, 8030,17820, 8034, 8038, 8042, 0, + 4406,28760, 5319, 4572,17845, 4809, 4816, 0,17837,28760, + 4379,17812,17812,17806,17804, 0, 4874, 4077,17799, 0, + 0,17798, 0, 0,17733,17713, 0,17769,28760, 5925, + 17653,17654,17648, 8046,28760,17623, 0, 8051, 0, 0, + 0,28760, 0, 8063, 0,17633, 8057, 0, 8083, 0, + 8089, 8096, 5656,17635, 7324,17622, 6589,17526, 0, 3890, + + 3073,17550, 8106, 8110, 8117, 0,17550, 8121,17498,17499, + 17501,17468,28760,17530,17495, 8117, 4515, 3844, 4561, 4713, + 17317,17297,17297, 4489,17258,17249, 5216,17258,17199, 4653, + 17190,17195,17133,17143, 8141, 8145, 8149,17178,28760, 0, + 6118,28760,17151, 8155, 8159, 8163,28760, 8175, 8189, 8193, + 8203, 8208, 8222, 8238, 8257, 8269, 8274, 8278, 8285, 8289, + 8317, 8322, 8326, 8335, 8354, 8365, 8369, 8306, 8373, 8242, + 8383, 8404,17117,17116,17115, 4762, 8411,17068,17067,17068, + 17080, 8415,28760,28760,17120,17118, 8413, 8419,28760, 8437, + 0,17067, 8441, 8445, 8449, 0, 8453, 8457, 8461, 0, + + 28760,17115,17114, 8464, 0, 6219,17108, 4855, 4786,17118, + 17117, 4319,17059,17054, 6721,17097, 6362,17087, 6761,17009, + 3212,17005,17013,17011, 5733,17008,17009,17000,16973, 4820, + 16971,16953, 5002, 3023,16954,16939,16943,16940,16936,16929, + 16925,16880,16869,16820,16811,16810,16759, 5793,16767,16767, + 16702,28760,28760, 6818, 6841,16684,16695,16648, 4767,16662, + 3723, 5167, 4814,28760,16656,16645,16638,16630,16637,16630, + 16636,16623, 3297, 4831,16577,28760, 8488, 8492, 8496, 0, + 28760,28760,16558, 8500, 8504, 8508, 0, 5649,16556,16551, + 16555, 6177, 8518, 8536, 8541, 8549,16530,16541,16519,16532, + + 16526, 4253,16498,16479,28760,16468,16457,16450,16448,16455, + 16444,16448,16413, 8555,28760,28760, 8573,16472, 4323,16367, + 16366,16361, 5758,28760,28760,28760, 8583, 8591, 8598, 8604, + 8624, 8630, 0,16366,16362,16331,16329,16302,16150,16131, + 16131,16126,16122,16116, 8634, 8638, 8636,16135, 8656,16146, + 6524, 7284, 8733,16138, 6764, 8643, 7186, 8648, 5757, 5860, + 8147, 6927, 6080, 4884, 6134, 8645, 8646, 8714, 6312, 6345, + 7018,28760, 6427, 7124, 6440, 6467, 7409, 6536, 7422, 7468, + 7481, 5584, 7701, 7842, 7934, 6659, 8100, 8198,28760, 6738, + 6742, 8226, 5683, 6782, 8524, 8530,28760, 6842, 6870, 6502, + + 8532, 6889, 8663, 8668, 8670, 8690, 6687, 8650,16093,16089, + 16076, 8700,16082, 8723,16043,16011,16016, 8727,16017,16017, + 15922,15877, 5656, 8731,15824,15808,15701, 4551,15705,15673, + 15629,15625,15618,15670,28760, 8802, 441, 6111, 5745, 3229, + 5868, 4002, 5189, 3322, 4877, 5698, 2101, 5272, 4001, 852, + 4629, 5242, 6586, 5821, 6871, 6288, 4892, 1747, 5605, 8407, + 8763, 4222, 6796, 6430, 1964, 6418, 8879, 8775, 8781, 8740, + 0,15609,15580, 6773,15553,15552,15520,28760,28760, 6968, + 7003,15510,15504,15486,28760, 1681,15498,28760, 8792, 8807, + 8796, 0, 7035, 7051,28760,28760,15484,15440,28760,28760, + + 15465,15463, 8818,15443,28760,28760, 6973,28760,28760, 8801, + 15413,15398,15381,15369,28760,28760, 8823,15415,15414,15357, + 15362,15359,13081,13084,13053,13046,13029,13024,13024,13015, + 13007,12877,12869,12859,12845,12716, 8847,28760,12754,28760, + 5703, 8851, 8861, 8867, 8880, 8909, 8913, 8917, 8927, 8955, + 8962, 8966, 8970, 8974, 9002, 9006, 9010, 9017, 9045,28760, + 28760,12692,12635,12605,12607,28760,28760, 9030, 40,28760, + 28760, 9061, 5725, 152, 7094, 424, 755, 925, 953, 8708, + 1255, 1265, 1310, 7110, 1334, 1545, 1575, 1770, 6134, 1795, + 1914, 2170, 2175, 2201, 2653, 2717, 2870, 2872, 2888, 2932, + + 2943, 3027, 3108,28760, 3116, 3209, 3272, 3331, 3704, 3724, + 3794, 4052, 4079, 5122, 4086, 6076, 4119, 4150, 4196, 4287, + 28760, 4350, 4403, 4419, 4450, 4465, 8985,28760, 4550, 4636, + 4648, 4774, 4906, 4933, 5149, 5264, 5166, 5218, 5243, 5265, + 5262, 5591, 5598, 7150, 5590, 5592, 5726, 7095, 8811, 9085, + 5716, 5725, 5769, 5782, 5822, 5818, 5820, 5853, 5863, 9054, + 6574,28760, 9115, 9192,28760, 9038,28760, 9060,28760, 7233, + 7225, 7339, 9061, 7332, 9066, 9073, 9093, 7113, 9094, 9098, + 9112, 7408, 9113,28760, 9114, 7409, 9125, 9144,28760, 7453, + 7473, 7181, 8890, 7572, 9145, 9146, 9150, 9152, 7257, 6097, + + 9156, 6940, 9157,28760, 7339, 7570, 9158,28760, 9162, 9163, + 28760, 9164,28760, 9196,28760, 7596, 9201,28760, 9202,28760, + 9218,28760, 7695, 9219,28760, 6098, 9220, 9224, 7460, 9226, + 28760, 7701, 7544, 9232,28760, 6116, 9233, 9234, 7696, 7704, + 9238, 9239, 7773, 9240,28760, 9251,28760, 9256,28760, 9257, + 28760, 9270, 6093, 9275, 6102, 9281, 6126, 6158, 6147, 6514, + 6175, 6188, 6196, 6193, 6209, 6261, 6597, 6672, 6729, 6248, + 6431, 9287, 6312, 6328, 6668, 6347,28760, 9349, 6798, 6836, + 6551, 9291, 7212, 9302, 6880, 6899, 6876, 6979, 7156, 7029, + 7368, 7281, 6656, 7239, 6971, 6817, 7355, 7195, 7476, 7530, + + 7891, 9295, 7200, 7162, 7614, 6957, 7532, 9313, 7217, 7085, + 7332, 8304, 7841, 9426, 6385, 6403, 7794, 6533, 6633, 6697, + 9320, 9324, 6739, 6731, 6753, 7047, 6753, 0, 7712, 6840, + 6842,28760,28760, 9318, 6864, 6932, 6968, 7034,28760, 7115, + 28760,28760, 7084, 9329, 7086, 7164, 7253, 7273, 7308, 7327, + 7345, 7352, 7362, 7356, 7379, 7478, 7386, 7390, 7417, 9333, + 7842, 9356, 9377, 9384, 9393, 9397, 9414, 9454, 9459, 9463, + 9467, 9475, 9495, 9503, 9509, 9513, 9542, 9547, 9554, 9558, + 9342, 7425, 9425, 7463,28760, 7532, 7473,28760, 7535, 0, + 8052,28760, 9347, 7555, 7556, 7566, 9361,28760, 7568, 7571, + + 0, 7753, 7573, 7599, 7769, 7596, 7857, 7598, 7596, 7609, + 7608, 7616, 7624, 7952, 7629, 7653, 7675, 7711, 7706, 7736, + 7733, 7754, 7785, 7846, 7847, 7848, 7864, 7853, 7868, 7888, + 7909, 7897, 7908, 7909, 7914, 7931, 7947, 7946, 8051, 8251, + 7994, 8031, 9405, 7997, 7999, 8012, 8018, 8030, 8037, 8042, + 8059, 8051, 8062, 8064, 8069, 8066, 8072, 8062, 8137, 8089, + 8111, 8099, 8146, 9586, 9599, 8119, 8121, 8109, 8127, 8123, + 8154, 8189, 8191, 8193, 9606, 8192, 9523, 8202, 9563, 8182, + 8256, 8367, 9568,28760, 9575, 9613,28760, 9632,28760, 9633, + 28760, 8473, 9634,28760, 9638,28760, 9640,28760, 8488, 8203, + + 9644, 9645,28760, 8265, 9646,28760, 8207, 9650, 9651, 8522, + 8600, 9652, 9656, 8644, 9657,28760, 9665,28760, 9684,28760, + 9689,28760, 9690, 9695, 8217, 9696, 8701, 9697, 8221, 9701, + 9702,28760, 8223, 9703, 8235, 9707, 8237, 9708, 9709, 8244, + 9714, 8254, 9720, 8264, 9739, 9741, 8266, 9745, 9747,28760, + 8267, 8271, 9751, 9752, 8707, 8273, 9753, 9757,28760, 8764, + 8791, 9758,28760, 9759,28760, 8831, 8282, 9763, 8303, 9764, + 8305, 9769, 8316, 9775, 9791,28760, 8280, 9593, 8281, 9799, + 9805, 9809, 9813, 8288, 8289, 8299, 8308, 8311, 8329, 8315, + 8319, 8315, 9821, 9825, 8394, 8332, 8469, 8335, 8336, 8353, + + 9829, 8359, 8409, 8365, 8366, 9890, 8458, 8459, 8460, 8499, + 9833, 9975, 8592, 9837, 9841, 8497, 8564, 8528, 8862, 8462, + 8561, 8495, 8699, 8637, 8812, 8814, 8718, 8757, 9845, 9863, + 8529, 8858, 8698, 8838, 8920, 8860, 8889, 8914, 9867, 8926, + 9254, 8932, 8936,10052, 8393, 8504, 9849, 8492, 8511, 8523, + 9871, 9885, 9891, 9920, 9926, 8598, 8617, 8886, 8638, 0, + 8630, 9407,28760, 8695, 8707, 8694,28760, 8703, 9934, 9938, + 8711, 8725, 8728, 8731, 8788, 8791, 8815, 8865, 8859, 8883, + 8876, 8899, 8928, 9945, 8938, 8938, 9964, 9968, 9996,10006, + 10010,10024,10040,10082,10086,10090,10094,10102,10122,10130, + + 10135,10139,10143,10150, 9951,10171,10178,28760, 8950, 8965, + 0, 9853,28760, 8964, 8965, 8953, 8999, 9876, 8958, 9036, + 28760, 8974, 8986, 9059, 9009, 9100, 9002, 9031, 9035, 9041, + 9048, 9050, 9168, 9064,28760, 9056, 9091, 9177, 9096, 0, + 9116, 9117, 9106, 9108, 9122, 9116, 9122, 9297, 9120, 9126, + 9306, 9131, 9132, 9138, 9388,10036,28760, 9162, 9172, 9171, + 9175, 9184, 9190, 9198, 9955, 9196, 9198,28760,28760, 9204, + 9250, 9227, 9243, 9247, 9378, 9239, 9245, 9289, 9327, 9302, + 9322,28760,28760,28760,10184,10015, 9458,10016, 9360,10017, + 10050,28760, 9363,10158, 9372,10183, 9377,10185,10194, 9383, + + 10198, 9392,10210, 9394,10217,10218, 9400,10219, 9468, 9401, + 10225,10226,28760, 9496, 9496,10230,28760,10231,28760, 9516, + 9404,10232, 9442,10238, 9443,10240, 9444,10242,10249,28760, + 10250,28760, 9445,10262,28760, 9454,10270,10272,28760,10274, + 28760, 9456,10280,10281,10282,28760, 9557, 9458,10286,10287, + 9602, 9460,10292, 9470,10293,10294, 9472,10302, 9460, 9455, + 9959,10317,10324,10332, 9461, 9472, 9467, 9472, 9502, 9857, + 9521, 9514, 9515,10336,28760,10340, 9517, 9535, 9592,10344, + 9602,10348, 9596, 9603, 9603, 9609,10346, 9674, 9699, 9665, + 9705, 0,10431,10516, 9666, 9723, 9711, 9800, 9717, 9661, + + 10353, 9834, 9844, 9729, 9900, 9838, 9864, 9907,10378, 9858, + 10021,10382, 9710, 9926,10012, 9983, 9866,10386,10042, 9946, + 10043,10031,10593, 9648, 9691,10390,28760, 9714, 9730, 9722, + 10353,28760,10404,28760,10410, 9731,10414, 9817, 9724,10394, + 10398,10447,28760, 9743,28760,10451,10472,10476, 9763,10480, + 9821, 9842, 9857,10492, 9869,10487,10496, 9888, 9955,10500, + 9966,28760,10505,10535,10547,10551,10581,10600,10619,10628, + 10555,10632,10640,10649,10668,10680,10684,10688,10716,10720, + 28760, 9974, 9996,10032,10420,10004,10038,10040,10304,10421, + 10033,10041,10054,10048,10064,10072,10086,10462,10098,10109, + + 10178,10561,10106,10563,10105,28760,10102,10124,10128,10137, + 10126,10585,10132,10149,10586,10141,10168,10164,10196,10193, + 10188,10207,10191,10590,10200,10214,28760,10220,10224,10233, + 10277,10251,10255,10287,28760,10288,10302,10731,10663,28760, + 10522,10696,28760,10300,10697,10703,28760,10730,28760,10369, + 10301,10735,10736,10586,10330,10744,10332,10746,10757,10362, + 10758,10363,10763,10767,10367,10768,10379,10769,10396,10776, + 10777,28760,10403,10778,10592,10782,28760,10788,10790,28760, + 10385,10799,10397,10396,10398,10421,10425,10724,10444,10453, + 10471,10820,10824,10828,10832,10472,10836,10495,10509,10505, + + 10513,10896,10578,10655,10620,10840,10981,11066,10560,10844, + 10687,10791,10637,10562,10843,10639,10868,10717,10792,10793, + 10660,10797,10643,28760,10872,10876,10880,10661,10787,10795, + 10757,10831,10833,11143,10521,10585,10635,10903,10652,10654, + 10697,10716,10922,10883,10732,10905,10934,10942,10997,10735, + 10967,10971,10737,11001,10758,11024,10758,11028,11037,10788, + 11042,11054,11085,11102,10796,11106,10825,11110,11114,11125, + 11130,11175,11179,11142,11183,11187,11191,11217,11221,11226, + 11230,11234,10800, 0,28760,10887,10816,10813,10891,10927, + 10834,10830,10838,10928,10842,10845,10935,10936,10842,10847, + + 10848,10872,10877,28760,10944,10880,11012,11047,10879,28760, + 10894,28760,11048,10911,10975,28760,10921,10926,28760,28760, + 28760,11239,10966,11240,11268,10976,11270,10984,11272,10993, + 11274,10989,11280,28760,11282,11284,28760,11286,28760,11003, + 11288,11057,11012,11290,11302,28760,11017,11304,10974,11322, + 10993, 0, 0,10991,11001,11326,11016,11023,11334,11338, + 11030,11032,11034,11342,11346,11344,11117, 0,11112,11136, + 28760,11105,11429,11514,11134,11101,28760,11141,11237,11370, + 11107,11190,11249,11119,11196,11232,11289,11248,11374,11378, + 11599,11069,11062,11684, 0,28760,11096,11297,11145,11382, + + 11390,11351, 0,28760,11149,11151,11460,11419,11173,11188, + 11198,11448,11464,11476,11468,11486,11378,11545,11552,11490, + 11703,11715,11719,11494,11556,11247,11210,11226,11560,11498, + 11502,11386,11240,11394,11472,11252,28760,11535,11258,11571, + 11573, 0,11253,11575,11262,11586,28760,11590,11588,11723, + 11264,11724,11283,11356,28760,11285,11310,11730,11729,28760, + 11359,11359,11731,11745,28760,11367,11756,11379,11767,11768, + 11386,11773,11777,11341,28760,28760,11349, 0,11781,11789, + 11344,11798, 0,11349,11805,11813,11811,11837,11451,11491, + 11520,11489,11436,11769,11457,11793,11752,11745,11548,11896, + + 11841,11716,11786, 0,11849,11981,11744,11469,12066,11836, + 12151,12236,12321, 0,11399,11439,11497, 0,28760,11867, + 11844,11506,11821, 0, 0,11871,11875,11513,11927,11510, + 11881,11885,11693,11931,11935,11939,11943,12001,12017,12339, + 28760,11636,11889,11853, 0,11857,11859,11916,11917,28760, + 0,11954,12012,28760,11657,11671,11679,12348,11718,12022, + 12027,11728,12028,12029,28760,28760,11704,11971,28760,28760, + 0,12037,28760,11716,12425,28760,11825,11988,11958,12135, + 12169,11847,12136,11838,12148,12510,12150,11862,11862,12157, + 12159,11935,12595,11936,11942,12029,12680,11889,11891,12047, + + 12187,11899, 0,12189,12197,11893,12355,12207,11903,11948, + 12360,28760,12018,12381,12212,12386,12391,28760,12052,12184, + 28760, 0,12216,12217,11966,11976,12461,12375,28760,12016, + 12395,11993,12223,28760,11999,12765,12319,12166,12168,12178, + 12348,12043,12402,12457,28760,12066,12336,12056,28760, 0, + 12312, 0,28760,12069,28760,12182,12368,12122,12137,12342, + 12138,12148,12158,12462,12468,12475,12529,12544,12397,12850, + 0,12218,12201,12422,12432,12488,12311,12324,12373,12436, + 12550,12406,12335,28760,12557,12935,12332,28760,12366, 0, + 12266,13020, 0,12585,12331,12869,12503,12881,12885,13039, + + 12570, 0,28760,12575,28760,12475,12398,12420,12482,12337, + 12462,28760, 0,12409,28760,28760,12889,12579,12348,12895, + 12899,12524,12857,12920,12876,12392,12862,28760,13051,13055, + 13059,13026,13068,28760,13086,12424,13033,13093,13108,13113, + 12525,28760,28760,12445,13052,13050,12487,13054,13055,12493, + 0,13130,12494,28760,12557,28760,13150,13178,13206,13234, + 13262,13290,13318,13346,13374,13402,13430,13458,13486,13514, + 13542,13570,13598,13626,13654,13682,13710,13738,13766,13794, + 13822,13850,13878,13906,13934,13962,13990,14018,14046,14074, + 14102,14130,14158,14186,14214,14242,14270,14298,14326,14354, + + 14382,14410,14438,14466,14494,14522,14550,14578,14606,14634, + 14662,14690,14718,14746,14774,14802,14830,14858,14886,14914, + 14942,14970,14998,15026,15054,15082,15110,15138,15166,15194, + 15222,15250,15278,15306,15334,15362,15390,13085,15417,13078, + 12893,15438,15463,15485,12908,15512,15421,15533,15424,13103, + 15555,15583,15611,15639,15666,15427,15687,15434,15709,15737, + 15765,15793,15821,15849,15877,15905,13105,15933,15961,15989, + 13106,16017,16045,16072,16095,15448,16117,16134,16158,16175, + 16198,15451,13121,13120,13124,16220,16248,13123,16276,16304, + 16332,16360,16388,16405,16429,16457,16485,16502,16526,16543, + + 16566,16587,15455,16608,15446,16630,16658,12890,15457,16675, + 16694,16722,15466,16749,15516,16771,16799,16827,16855,16883, + 16911,16939,16967,16990,17010,17032,17049,17073,17090,17103, + 17120,17148,17176,13127,17204,17232,17260,17288,17316,17344, + 17372,17400,17428,17456,15522,17484,17512,17540,17557,17581, + 17609,17636,15519,17658,17686,15510,17714,17742,15511,17770, + 17787,17811,17828,15523,17852,17880,17908,17936,17964,17992, + 18020,18048,18076,18104,18132,18160,15525,15537,18187,18214, + 15670,15526,15536,18235,18260,18282,18309,18330,18357,15673, + 18378,18399,18426,15676,18447,15664,18469,18497,18525,18553, + + 18581,18608,18635,16073,15665,18656,18683,16078,15677,18705, + 18733,18761,18789,18817,18845,18873,18901,18929,15679,18957, + 18985,19013,19041,15680,19069,19097,19124,19147,19174,16082, + 15686,19196,19213,19237,19254,19277,19304,16088,15690,15871, + 16084,16092,19326,19354,16086,19382,19410,19438,19466,19494, + 19522,16192,19550,19567,19591,19619,19647,19664,19688,19705, + 19728,19749,19770,19797,16560,16094,19818,16188,16549,19840, + 19868,19891,12564,12565,16190,19908,19921,19934,19961,19978, + 20006,16201,20033,20060,16573,16098,20082,20110,20138,20166, + 20194,20222,20250,20278,20301,20321,20343,20360,20384,20401, + + 20414,20431,20459,20487,16191,20515,20543,20571,20599,20627, + 20655,20683,20711,20739,20767,20795,16570,20823,20851,20879, + 20896,20920,20948,20975,21002,16576,16564,21024,21052,16577, + 21080,21108,16586,21136,21153,21177,21194,16580,21218,21246, + 21274,21302,21330,21358,21386,21414,21442,16596,21469,21496, + 16624,16599,16692,21517,21539,21567,21594,21621,16752,21642, + 21663,21690,17007,21711,21733,21760,21787,17013,16600,21808, + 21835,17107,16603,21857,21885,21913,21941,21968,21995,18190, + 16607,22016,22043,18197,16685,22065,22093,22120,22141,22162, + 22189,18200,16698,16740,22211,22234,12906,22251,22270,22298, + + 22326,22354,22381,22392,22409,22428,22455,22482,18204,16741, + 22504,22532,22559,22586,18221,16742,17009,18225,22607,22628, + 22650,22678,22706,22733,22754,22776,12892,22799,22827,22855, + 22883,22911,22939,22967,22995,23023,23051,23079,23107,23135, + 23163,23191,23219,23247,23275,23303,23331,23359,23387,23415, + 23432,23451,23479,23507,17627,23534,23555,23577,23605,23633, + 23661,23689,23717,23744,23766,23789,23817,23845,23873,23901, + 23929,23957,23985,24013,24041,24069,24097,24125,24153,24181, + 24209,24237,24265,24293,24321,24349,24377,24405,24433,24461, + 24489,24517,24545,24573,24601,24629,24657,24685,24713,24741, + + 24769,24797,24825,24853,24876,24893,24917,24940,24968,24996, + 17633,25023,25045,25073,25101,25129,25157,25185,25208,25236, + 25264,25292,25320,25348,25376,25404,25432,25460,25488,25516, + 25544,25572,25600,25628,25656,25684,25712,25740,25768,25796, + 25824,25852,25880,25908,25936,25964,25992,26020,26043,26060, + 26084,26112,26140,26163,26191,26219,26247,26274,26296,26324, + 26352,26375,26403,26431,26459,26487,26515,26543,26571,26599, + 26627,26655,26683,26711,26739,26767,26795,26823,26851,26874, + 26891,26915,26938,26966,26994,27022,18218,27049,27071,27099, + 27127,27150,27178,27206,27234,27262,27290,27318,27346,27374, + + 27402,27430,27458,27486,27514,27537,27554,12577,27578,27606, + 27634,18243,15460,16751,27661,27683,27711,27739,27762,27790, + 27818,27846,27874,27902,27930,27958,27986,28009,18227,28026, + 12593,28050,28077,28099,28127,28155,16100,16753,16941,28182, + 28204,28232,28260,28288,28311,28339,28367,28395,28423,28446, + 18231,28463,28476,18249,28499,28520,28542,28570,28598,28625, + 28647,28675,28703,28731 + } ; + +static yyconst short int yy_def[4465] = + { 0, + 3757, 3757, 3756, 3, 3758, 3758, 3759, 3759, 3757, 3757, + 3756, 11, 3756, 13, 3756, 15, 3760, 3760, 3757, 3757, + 3756, 21, 3756, 23, 3756, 25, 3757, 3757, 3757, 3757, + 3761, 3761, 3762, 3762, 3761, 3761, 3763, 3763, 3764, 3764, + 3765, 3765, 3757, 3757, 3756, 45, 3756, 47, 3766, 3766, + 3766, 3766, 3757, 3757, 3767, 3767, 3768, 3768, 3769, 3769, + 3757, 3757, 3770, 3770, 3771, 3771, 3757, 3757, 3757, 3757, + 3772, 3772, 3773, 3773, 3757, 3757, 3757, 3757, 3756, 79, + 3774, 3774, 3775, 3775, 3776, 3776, 3777, 3777, 3778, 3778, + 3778, 3778, 3756, 93, 3779, 3779, 3780, 3780, 3781, 3781, + + 3756, 101, 3781, 3781, 3757, 3757, 3782, 3782, 3756, 109, + 3756, 111, 3783, 3783, 3784, 3784, 3785, 3785, 3756, 119, + 3786, 3786, 3756, 123, 3787, 3787, 3788, 3788, 3789, 3789, + 3790, 3790, 3777, 133, 3791, 3791, 3792, 3792, 3793, 3793, + 3794, 3794, 3757, 3757, 133, 133, 3795, 3795, 3757, 3757, + 3756, 151, 3756, 153, 3757, 3757, 3796, 3796, 3797, 3797, + 3798, 3798, 3756, 163, 3757, 3757, 3799, 3799, 3800, 3800, + 3756, 171, 3801, 3801, 3756, 175, 3802, 3802, 3802, 3802, + 3803, 3803, 3804, 3804, 3805, 3805, 3806, 3806, 3757, 3757, + 3807, 3807, 3808, 3808, 3809, 3809, 3810, 3810, 3811, 3811, + + 3757, 3757, 3757, 3757, 3812, 3812, 3813, 3813, 3814, 3814, + 3756, 211, 3815, 3815, 3816, 3816, 3817, 3817, 3818, 3818, + 3819, 3819, 3820, 3820, 3756, 225, 3821, 3821, 3822, 3822, + 3823, 3823, 3756, 233, 3824, 3824, 3757, 3757, 3756, 239, + 3825, 3825, 3756, 243, 3826, 3826, 3827, 3827, 3757, 3757, + 3756, 251, 3828, 3828, 3757, 3757, 3829, 3829, 3830, 3830, + 3831, 3831, 3832, 3832, 3833, 3833, 3832, 3832, 3834, 3834, + 3835, 3835, 3836, 3836, 3836, 3836, 3756, 277, 3756, 3756, + 3837, 3756, 3756, 3756, 3838, 3756, 3837, 3756, 3756, 3756, + 3756, 3837, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3839, 3756, 3840, 3756, 3756, 3756, 3756, + 3756, 3841, 3842, 3842, 3842, 3756, 3756, 3756, 3843, 3756, + 3756, 3837, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3844, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3845, + 3756, 3756, 3756, 3756, 3756, 3756, 3846, 3756, 3846, 3846, + 3846, 3846, 3846, 3846, 3846, 3846, 3846, 3846, 3756, 3847, + 3756, 3756, 3756, 3756, 3848, 3849, 3756, 3756, 3756, 3756, + 3756, 3756, 3850, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3837, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3837, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3837, 3756, 3756, 3756, 3756, + 3756, 3756, 3837, 3756, 3756, 3756, 3756, 3851, 3852, 3851, + 3756, 3756, 3853, 3854, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3855, 3856, 3756, 3756, 3756, 3756, 3857, + 3858, 3756, 3837, 3756, 3756, 3756, 3859, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3837, 3756, + 3756, 3756, 3756, 3756, 3860, 3756, 3837, 3756, 3756, 3756, + 3756, 3756, 3837, 3756, 3756, 3756, 3756, 3861, 3862, 3861, + 3861, 3756, 3861, 3863, 3864, 3756, 3863, 3863, 3756, 3756, + 3756, 3756, 3865, 3866, 3756, 3756, 3865, 3756, 3756, 3865, + + 3865, 3756, 3756, 3756, 3756, 3756, 3837, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3867, 3868, 3869, + 3868, 3756, 3868, 3870, 3868, 3756, 3837, 3756, 3756, 3756, + 3756, 3756, 3871, 3756, 3756, 535, 3756, 3872, 3756, 3756, + 3837, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 549, + 3756, 3756, 3756, 3873, 3756, 3756, 3837, 3874, 3756, 3756, + 3756, 3756, 3874, 3756, 3756, 3756, 3874, 3872, 3756, 3756, + 3837, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3875, 3876, 3756, + 3756, 3756, 3877, 3878, 3878, 3756, 3756, 3756, 3879, 3880, + + 3880, 3756, 3837, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3881, 3882, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3837, 3756, 3756, 3756, 3883, 3884, + 3756, 3837, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3872, 3756, 3756, 3756, 3756, 3837, 3756, 3756, + 3756, 3756, 3756, 3756, 3837, 3756, 3756, 3756, 3756, 3756, + 3885, 3886, 3887, 3756, 3886, 3886, 3756, 3888, 3889, 3890, + 3756, 3889, 3889, 3756, 3837, 3756, 3756, 3756, 3756, 3756, + 3756, 3891, 3756, 3837, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3892, 3756, 3837, 3756, 3756, 3756, 3756, 3874, 3756, + + 3756, 3756, 3756, 3874, 3756, 3756, 3837, 3756, 3756, 3756, + 3756, 3756, 3893, 3894, 3894, 3895, 3896, 3756, 3895, 3895, + 3756, 3897, 3898, 3898, 3756, 3899, 3900, 3900, 3756, 3901, + 3756, 3837, 3756, 3756, 3756, 3756, 3756, 3902, 3903, 3756, + 3756, 3756, 3756, 3756, 3837, 3756, 3756, 3756, 3756, 3837, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3904, 3904, 3904, + 3904, 3756, 3756, 3756, 3905, 3756, 3756, 3756, 3906, 3907, + 3756, 3756, 3906, 3756, 3906, 3756, 3756, 3756, 3837, 3756, + 3756, 3756, 3756, 3756, 3756, 3908, 3756, 3909, 3910, 3910, + 3910, 3756, 3756, 3911, 3910, 3911, 3908, 3912, 3913, 3756, + + 3756, 3756, 3756, 3914, 3915, 3756, 3837, 3756, 3756, 3756, + 3756, 3756, 3756, 3916, 3917, 3756, 3916, 3918, 3919, 3918, + 3920, 3921, 3920, 3922, 3923, 3922, 3756, 3922, 3756, 3756, + 3922, 3756, 3924, 3924, 3756, 3756, 3837, 3756, 3756, 3756, + 3756, 3925, 3926, 3927, 3927, 3928, 3929, 3929, 3756, 3756, + 3756, 3930, 3930, 3931, 3931, 3756, 3932, 3933, 3932, 3932, + 3932, 3756, 3756, 3934, 3935, 3936, 3935, 3937, 3938, 3937, + 3939, 3940, 3939, 3941, 3942, 3941, 3756, 3837, 3756, 3756, + 3756, 3756, 3943, 3944, 3943, 3756, 3943, 3943, 3945, 3946, + 3947, 3756, 3946, 3946, 3946, 3946, 3756, 3948, 3949, 3949, + + 3950, 3951, 3950, 3950, 3756, 3756, 3756, 3756, 3952, 3953, + 3954, 3955, 3954, 3954, 3756, 3956, 3957, 3958, 3756, 3957, + 3957, 3756, 3959, 3959, 3959, 3960, 3961, 3961, 3962, 3963, + 3963, 3756, 3756, 3756, 3964, 3965, 3966, 3756, 3965, 3756, + 3965, 3756, 3967, 3756, 3756, 3756, 3756, 3968, 3969, 3756, + 3968, 3756, 3756, 3968, 3970, 3971, 3972, 3971, 3756, 3973, + 3756, 3756, 3756, 3967, 3756, 3756, 3756, 3974, 3975, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3967, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3967, 3756, 3756, 3756, 3756, + 3967, 3756, 3756, 3756, 3756, 3976, 3756, 3756, 3977, 3967, + + 3756, 3756, 3756, 3756, 3978, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3979, 3980, 3756, 3981, 3982, 3756, + 3983, 3984, 3984, 3985, 3756, 3984, 3756, 3985, 3756, 3756, + 3756, 3756, 3756, 3756, 3986, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3987, 3756, 3756, + 3988, 3756, 3989, 3756, 3989, 3989, 3989, 3989, 3989, 3989, + 3989, 3989, 3989, 3989, 3989, 3989, 3989, 3989, 3989, 3990, + 3991, 3756, 3756, 3992, 3756, 3993, 3756, 3994, 3995, 3756, + 3756, 3996, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3997, 3998, 3997, 3997, 3756, 3999, 3756, 3756, 4000, 3756, + 4001, 3756, 3756, 3756, 4002, 4003, 4004, 4005, 3756, 3756, + 4006, 4007, 4008, 4009, 3756, 4010, 3756, 3756, 4011, 3756, + 3756, 3756, 3756, 3756, 4011, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 4012, 4013, 4012, 4012, + 3756, 3756, 3756, 4012, 4014, 3756, 4015, 4014, 4016, 4014, + 4014, 4017, 4018, 4017, 3756, 3756, 3756, 3756, 3756, 4017, + 3756, 3756, 3756, 3756, 3756, 3756, 4019, 4020, 4021, 4022, + 4020, 4023, 4020, 3756, 4021, 4021, 4021, 4020, 3756, 3756, + + 1200, 3756, 3756, 3756, 4024, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4025, 3756, 3756, + 4025, 3756, 3756, 1200, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 4026, 3756, 3756, 3756, 4026, 4027, 4027, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4027, + 4025, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 4028, 4029, 4030, 4031, 3756, 3756, + 4032, 4033, 4033, 3756, 3756, 4034, 4035, 4035, 3756, 3756, + + 3756, 3756, 3756, 4036, 4037, 4038, 4039, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4040, 4041, 3756, + 3756, 3756, 3756, 4025, 3756, 3756, 3756, 3756, 3756, 3756, + 4025, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 4042, 4043, 4044, 4043, 4043, 4043, 4045, 4046, 3756, + 4047, 4046, 4048, 4046, 4046, 3756, 3756, 3756, 3756, 3756, + 3756, 4049, 3756, 4049, 3756, 3756, 3756, 3756, 3756, 4050, + 3756, 4051, 3756, 3756, 4052, 3756, 3756, 3756, 4052, 3756, + 4053, 4054, 4054, 4055, 3756, 4056, 4055, 4048, 4055, 4055, + + 4057, 4058, 4058, 4059, 4060, 4060, 3756, 4061, 3756, 4062, + 3756, 3756, 4063, 4064, 4065, 4066, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 4067, 4067, 4068, 4068, 4069, + 4070, 4071, 4070, 3756, 3756, 4070, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4072, + 4073, 4074, 4075, 4076, 4077, 3756, 4076, 4078, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 4073, 4079, 4080, 4076, 4080, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 4076, 4076, 4076, 4076, 4076, 4076, 4076, 4076, + 4076, 4076, 4076, 4076, 4076, 4076, 4076, 4076, 1495, 4081, + 4081, 4082, 3756, 3756, 4083, 4084, 4085, 4086, 3756, 3756, + 3756, 3756, 3756, 4087, 4088, 4087, 4087, 4087, 4089, 4090, + 4089, 4089, 4089, 4091, 4092, 4091, 4091, 4091, 4093, 4094, + 4093, 4093, 3756, 4093, 3756, 3756, 3756, 3756, 4093, 3756, + 4095, 4095, 3756, 4096, 4097, 4098, 4098, 4099, 4100, 4100, + 3756, 3756, 4101, 4101, 4102, 4102, 4103, 4104, 4103, 4103, + 4103, 4105, 4106, 4107, 4106, 4106, 4106, 4108, 4109, 4108, + 4108, 4108, 4110, 4111, 4110, 4110, 4110, 4112, 4113, 4112, + + 4112, 4112, 3756, 3756, 3756, 4114, 4114, 3756, 4115, 4114, + 4115, 4116, 4114, 4114, 3756, 4117, 4118, 3756, 4119, 4118, + 4116, 4118, 4118, 4118, 4118, 3756, 4120, 4121, 4121, 4122, + 4123, 4122, 4122, 4122, 3756, 3756, 4124, 4125, 4126, 4127, + 4128, 3756, 4129, 4128, 4116, 4128, 4128, 4130, 4131, 3756, + 4132, 4131, 4116, 4131, 4131, 4133, 4133, 4133, 4134, 4135, + 4135, 4136, 4137, 4137, 3756, 3756, 4138, 4139, 3756, 4140, + 4139, 4116, 4139, 3756, 3756, 3756, 4141, 4142, 4141, 4141, + 4141, 3756, 4143, 4144, 4143, 3756, 4145, 4146, 4147, 4146, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4148, 3756, + + 3756, 3756, 4149, 4150, 4151, 4152, 3756, 4153, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 4154, 3756, 3756, 4155, + 3756, 3756, 4156, 4157, 4158, 4159, 3756, 4158, 4158, 4158, + 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158, 4158, + 4158, 4158, 4158, 4158, 4158, 3756, 4160, 4161, 4162, 4163, + 3756, 4164, 3756, 4155, 3756, 4156, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 4165, 3756, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, + + 3756, 3756, 3756, 3756, 4174, 4174, 4174, 3756, 3756, 3756, + 3756, 3756, 4175, 3756, 3756, 3756, 4176, 4177, 4176, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 4178, 4179, 4180, 4181, + 3756, 3756, 3756, 4182, 4183, 4184, 4185, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 4186, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4187, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 4188, 4189, 4189, 4190, + 4191, 4192, 4193, 4194, 3756, 4195, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 4196, 3756, 4196, 4197, + 4198, 4198, 4199, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 4200, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4201, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 4202, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 4203, 3756, 4204, 4205, 4205, 4205, 4205, + 4205, 4205, 4205, 4205, 4205, 4205, 4205, 4205, 4205, 4205, + 4205, 4205, 4205, 4205, 4205, 4205, 4205, 4205, 4205, 4205, + 4205, 4205, 4205, 4205, 4205, 4205, 4206, 4207, 4208, 4209, + 4210, 3756, 3756, 3756, 4211, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 4212, 3756, 3756, 4213, 4214, + 4215, 4216, 4217, 4217, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4218, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 4219, 3756, 3756, 3756, + 3756, 4220, 4220, 4220, 4220, 4220, 4220, 4220, 4220, 4220, + 4220, 4220, 4220, 4220, 4220, 4220, 4220, 4220, 4220, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 4221, 3756, 3756, 4222, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 4223, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4224, 4225, + 4226, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 4227, 3756, 4228, 4228, 3756, 4229, 3756, 4230, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 4231, 3756, 3756, 3756, 3756, 4232, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4233, + + 4233, 3756, 4234, 3756, 3756, 3756, 4235, 3756, 3756, 4236, + 3756, 4237, 3756, 4238, 3756, 3756, 4239, 3756, 4240, 3756, + 4241, 3756, 3756, 4242, 3756, 4243, 4243, 3756, 3756, 4244, + 3756, 3756, 3756, 4245, 3756, 4246, 4246, 3756, 3756, 3756, + 3756, 3756, 3756, 4247, 3756, 4248, 3756, 4249, 3756, 4250, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4228, 4251, 4251, + 4251, 4251, 4251, 4251, 4251, 4251, 4251, 4251, 4251, 4251, + 4251, 4251, 4251, 4251, 4251, 4251, 4251, 4251, 4251, 4251, + + 4251, 4251, 4251, 4251, 4251, 4251, 4251, 3756, 4251, 4251, + 4251, 4251, 4251, 4252, 3756, 3756, 3756, 4253, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 4254, 3756, 4255, 4255, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4256, + 3756, 4257, 3756, 4257, 4257, 4257, 4257, 4257, 4257, 4257, + 4257, 4257, 4257, 4257, 4257, 4257, 4257, 4257, 4257, 4257, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4258, + 4259, 3756, 3756, 4260, 3756, 3756, 4261, 3756, 3756, 3756, + + 4262, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 4263, 4263, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 4264, 4264, 4265, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 4266, 4267, 4267, 4268, 4268, 3756, + 3756, 3756, 4269, 3756, 3756, 4270, 3756, 4271, 3756, 4272, + 3756, 3756, 4273, 3756, 4274, 3756, 4275, 3756, 3756, 4276, + + 4276, 4277, 3756, 3756, 4278, 3756, 4279, 4279, 3756, 3756, + 3756, 3756, 3756, 3756, 4280, 3756, 4281, 3756, 4282, 3756, + 4283, 3756, 3756, 3756, 4284, 4284, 3756, 3756, 4285, 4285, + 4286, 3756, 4287, 4287, 4288, 4288, 4289, 4289, 3756, 4290, + 4290, 4291, 4291, 4292, 4292, 3756, 4293, 4293, 4294, 3756, + 3756, 4295, 4295, 3756, 3756, 4296, 4296, 4297, 3756, 3756, + 3756, 4298, 3756, 4299, 3756, 3756, 4300, 4300, 4301, 4301, + 4302, 4302, 4303, 4303, 4304, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 4305, 4306, 4306, 4306, 4306, + 4306, 4307, 4306, 4306, 4306, 4306, 4306, 4306, 4306, 4306, + 4306, 4306, 4306, 4306, 4306, 4306, 4306, 4306, 4306, 4306, + 4306, 4306, 4306, 4306, 4306, 4306, 4306, 4306, 4306, 4306, + 4306, 4306, 4306, 4308, 3756, 3756, 3756, 4309, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4310, 3756, 4311, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4312, 4312, 4312, + 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, + + 4312, 3756, 3756, 4312, 3756, 3756, 3756, 3756, 3756, 3756, + 4313, 4314, 3756, 4315, 3756, 3756, 4316, 4316, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4317, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 4318, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 4319, 3756, 3756, 3756, 4320, 4320, + 4321, 3756, 4322, 4322, 4323, 4323, 4324, 4324, 3756, 4325, + + 4325, 4326, 4326, 4327, 4327, 3756, 4328, 4328, 3756, 4329, + 4329, 4330, 3756, 3756, 3756, 4331, 3756, 4332, 3756, 3756, + 4333, 4333, 4334, 4334, 4335, 4335, 4336, 4336, 4337, 3756, + 4338, 3756, 3756, 4339, 3756, 4340, 4340, 4341, 3756, 4342, + 3756, 4343, 4343, 3756, 4344, 3756, 3756, 4345, 4345, 3756, + 3756, 4346, 4346, 4347, 4347, 3756, 4348, 4348, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 4349, 4350, 4350, 4350, + 4350, 4351, 4352, 4353, 4350, 4350, 4350, 4350, 4350, 4350, + + 3756, 4350, 4350, 4350, 4350, 4350, 4350, 4350, 4350, 4350, + 4350, 4350, 4350, 4350, 4350, 4350, 4350, 4350, 4350, 4350, + 4350, 4350, 4354, 3756, 3756, 4355, 3756, 4356, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4357, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 4358, 3756, 4358, 4358, 4358, 3756, + 3756, 4358, 4358, 3756, 3756, 4358, 4358, 4358, 4358, 3756, + 3756, 3756, 3756, 4359, 4359, 4360, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 4361, 3756, 3756, 3756, 3756, 3756, 4362, 4363, 3756, + 3756, 4364, 3756, 4365, 4365, 4366, 3756, 4367, 3756, 3756, + 4368, 4368, 3756, 3756, 4369, 4369, 4370, 4370, 3756, 4371, + 4371, 4372, 4372, 3756, 4373, 4373, 4374, 4374, 4375, 4375, + 4376, 3756, 4377, 4377, 3756, 4378, 3756, 3756, 4379, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 4380, 4381, 4381, 4381, 4381, 4382, 4382, 4381, 4381, + 4381, 4381, 4381, 4381, 3756, 4381, 4381, 4381, 4381, 4381, + 4381, 4381, 4381, 3756, 4381, 4381, 4381, 4381, 4381, 4381, + 4381, 4381, 4381, 4383, 3756, 3756, 4384, 4384, 4385, 3756, + 3756, 3756, 3756, 4386, 3756, 3756, 3756, 3756, 4387, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4388, 4388, 3756, + 3756, 4388, 4388, 3756, 4388, 3756, 3756, 4388, 3756, 4388, + 3756, 3756, 3756, 4389, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 4390, 3756, 4391, 3756, 3756, 3756, + 3756, 4392, 4393, 4393, 3756, 4394, 4394, 4395, 4395, 4396, + 4396, 3756, 4397, 3756, 3756, 4398, 3756, 4399, 3756, 4400, + 4400, 3756, 4401, 4401, 4402, 3756, 4403, 4403, 3756, 3756, + 3756, 4404, 4405, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 4406, 4407, 4408, 4407, 4407, + 3756, 4407, 4407, 4407, 4407, 4407, 3756, 4407, 4407, 4407, + 4407, 4407, 4407, 4407, 4407, 4407, 4407, 4407, 4407, 4407, + 3756, 3756, 3756, 4409, 4410, 3756, 3756, 4411, 3756, 3756, + + 4412, 4413, 4414, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 4415, 4415, 3756, + 4415, 4415, 4415, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 4416, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 4417, 3756, 4418, 3756, 4419, 4420, 3756, + 3756, 4421, 4421, 4422, 3756, 4423, 4423, 4424, 4424, 3756, + 4425, 4425, 3756, 3756, 3756, 3756, 3756, 4426, 3756, 3756, + 3756, 3756, 4427, 3756, 3756, 3756, 4428, 4407, 4429, 4407, + 4407, 4407, 4407, 4430, 4407, 4430, 4407, 4407, 4407, 4407, + + 4407, 4407, 4407, 4431, 4407, 4407, 4407, 4432, 3756, 4433, + 4434, 3756, 4434, 3512, 3509, 3756, 3756, 4435, 3756, 3756, + 4436, 3756, 4437, 4438, 4439, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 4440, 3756, 3756, 4440, 4440, + 3756, 3756, 3756, 3756, 4441, 3756, 3756, 3756, 3756, 3756, + 4442, 4443, 3756, 3756, 3756, 4444, 3756, 4445, 4446, 4446, + 3756, 4447, 4447, 4448, 3756, 3756, 3756, 3756, 3756, 3756, + 4449, 3756, 3756, 3756, 4450, 3756, 4451, 4452, 4452, 4452, + 4452, 4452, 4452, 4452, 4453, 4452, 4452, 4454, 4452, 4453, + 4452, 4455, 3756, 4456, 3756, 4456, 3756, 3756, 3756, 3756, + + 4457, 3756, 4438, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 4440, 3756, 4440, 4440, 3756, 3756, 3756, + 3756, 4443, 4443, 3756, 4444, 3756, 4445, 4458, 3756, 4448, + 4448, 3756, 3756, 3756, 3756, 3756, 4452, 4452, 4452, 4452, + 4452, 4452, 4453, 4452, 3756, 4454, 4452, 4455, 3756, 3593, + 4459, 3593, 3756, 4460, 3756, 3636, 3636, 3756, 3756, 4457, + 3756, 3756, 3756, 3756, 4440, 4440, 3756, 3756, 3756, 4444, + 4461, 3593, 4458, 4458, 3756, 3756, 3636, 3636, 4452, 4452, + 4452, 4452, 4452, 3756, 4452, 3756, 4460, 3756, 3636, 4462, + 3756, 4457, 4463, 3756, 3756, 3756, 3756, 3756, 3756, 4440, + + 3756, 4444, 3756, 3756, 3756, 4452, 4452, 4452, 4452, 3593, + 3636, 3756, 4464, 4457, 3756, 3756, 3756, 3756, 3756, 3756, + 4440, 4452, 4452, 4452, 4452, 3593, 3636, 3756, 3756, 3756, + 3756, 4452, 4452, 3756, 4452, 3593, 3636, 3756, 3756, 3756, + 4452, 3756, 3756, 3593, 3636, 4452, 3593, 3636, 4452, 3593, + 3636, 4452, 3593, 3756, 3593, 0, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756 + } ; + +static yyconst short int yy_nxt[28846] = + { 0, + 3756, 281, 3756, 282, 283, 281, 1017, 282, 283, 1017, + 1018, 1018, 1018, 1018, 3756, 1056, 1002, 1002, 1008, 1056, + 284, 1003, 1003, 1009, 284, 280, 281, 280, 282, 283, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 284, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + 280, 280, 280, 285, 285, 285, 285, 285, 285, 285, + 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, + + 285, 285, 285, 285, 285, 285, 285, 280, 280, 280, + 287, 1206, 282, 288, 287, 2487, 282, 288, 292, 293, + 294, 295, 293, 289, 296, 1146, 1147, 289, 281, 290, + 282, 283, 281, 290, 282, 283, 1206, 297, 292, 293, + 294, 295, 293, 556, 296, 1030, 556, 284, 1030, 1153, + 1154, 284, 281, 367, 368, 369, 367, 297, 281, 367, + 368, 369, 367, 381, 382, 383, 384, 382, 374, 1031, + 725, 375, 1032, 298, 374, 385, 386, 375, 1002, 387, + 1059, 2492, 388, 1003, 1455, 1060, 1080, 1080, 1080, 1080, + 1155, 1156, 1458, 298, 280, 281, 299, 300, 301, 299, + + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 284, 280, 280, 280, 280, 280, + 280, 302, 303, 280, 280, 280, 280, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 280, + 280, 280, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 305, 280, 306, 280, + 281, 307, 282, 283, 307, 280, 280, 280, 280, 280, + 308, 280, 309, 280, 308, 280, 280, 280, 280, 284, + + 280, 280, 280, 280, 280, 280, 310, 308, 311, 308, + 280, 280, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 309, 280, 280, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 312, 312, 312, 312, 312, 312, 312, 312, 312, + 312, 305, 280, 280, 280, 281, 313, 314, 315, 313, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 316, 280, 280, 284, 280, 280, 280, 280, 280, + 280, 317, 303, 318, 280, 280, 280, 319, 319, 319, + + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 280, + 280, 280, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 320, 280, 280, 322, + 323, 324, 325, 323, 322, 323, 324, 325, 323, 281, + 1455, 282, 283, 704, 1020, 329, 704, 1020, 326, 1054, + 330, 331, 1054, 326, 3756, 332, 568, 281, 284, 282, + 283, 705, 1090, 329, 2494, 1008, 333, 1091, 330, 331, + 1009, 3756, 413, 332, 282, 414, 284, 381, 382, 383, + + 384, 382, 2379, 1615, 333, 390, 1615, 282, 391, 385, + 386, 415, 1168, 387, 1169, 3756, 388, 392, 393, 281, + 327, 282, 283, 1579, 394, 327, 328, 1159, 1055, 1000, + 390, 328, 282, 391, 281, 1642, 282, 283, 284, 1642, + 334, 1000, 392, 393, 1014, 1002, 416, 1002, 417, 394, + 1003, 1000, 1003, 284, 1088, 1088, 1088, 1088, 334, 280, + 281, 335, 336, 337, 335, 280, 280, 338, 280, 280, + 339, 280, 340, 280, 339, 280, 341, 280, 280, 342, + 280, 280, 280, 280, 280, 280, 343, 344, 345, 346, + 280, 280, 347, 347, 347, 347, 347, 347, 347, 347, + + 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, + 347, 347, 347, 347, 348, 280, 280, 347, 347, 349, + 347, 350, 347, 347, 347, 351, 347, 347, 352, 353, + 347, 354, 347, 347, 355, 356, 357, 358, 347, 347, + 347, 359, 280, 360, 280, 281, 361, 362, 363, 361, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 284, 280, 280, 280, 280, 280, + 280, 364, 280, 280, 280, 280, 280, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 280, + + 280, 280, 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, + 365, 365, 365, 365, 365, 365, 280, 280, 366, 280, + 281, 367, 368, 369, 367, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 370, 280, 280, 371, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 372, + 280, 280, 373, 373, 373, 373, 373, 373, 373, 373, + 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, + 373, 373, 373, 373, 280, 280, 280, 373, 373, 373, + 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, + + 373, 373, 373, 373, 373, 373, 373, 373, 373, 373, + 373, 280, 280, 280, 281, 2495, 282, 283, 1278, 1059, + 281, 376, 282, 283, 1060, 1268, 377, 376, 1093, 1093, + 1093, 1093, 377, 284, 413, 1618, 282, 414, 1841, 284, + 378, 379, 406, 1094, 407, 408, 378, 379, 406, 1842, + 407, 408, 1622, 415, 409, 281, 1160, 282, 283, 1160, + 409, 410, 419, 420, 421, 422, 420, 410, 423, 1161, + 411, 1455, 1369, 424, 284, 443, 411, 454, 445, 1370, + 1175, 425, 428, 1175, 1022, 1023, 1023, 1022, 416, 448, + 417, 1206, 1059, 1176, 455, 378, 281, 1060, 282, 283, + + 1278, 378, 381, 395, 396, 397, 395, 1268, 419, 420, + 421, 422, 420, 1002, 423, 284, 1206, 1120, 1003, 424, + 1138, 398, 1121, 428, 429, 1139, 2393, 425, 399, 399, + 456, 400, 1142, 1571, 443, 1142, 444, 445, 1143, 281, + 446, 282, 283, 426, 427, 447, 1702, 1618, 448, 443, + 1144, 454, 445, 449, 281, 1145, 282, 283, 284, 1571, + 1702, 401, 1149, 448, 1025, 429, 1206, 1150, 455, 1011, + 1012, 1012, 1011, 284, 1355, 402, 1000, 403, 473, 404, + 474, 475, 1722, 399, 381, 395, 396, 397, 395, 426, + 427, 1206, 1723, 459, 1013, 460, 461, 476, 473, 462, + + 474, 475, 2186, 398, 456, 1182, 1625, 463, 1182, 1144, + 399, 399, 464, 400, 1145, 450, 451, 476, 1183, 1320, + 1362, 457, 1363, 479, 480, 282, 481, 480, 485, 2496, + 486, 487, 485, 477, 486, 487, 457, 482, 1006, 1006, + 1006, 1006, 483, 401, 1320, 1002, 1166, 488, 465, 1014, + 1003, 488, 1397, 477, 1398, 1163, 1007, 402, 1170, 403, + 1164, 404, 1632, 1171, 1000, 399, 280, 281, 430, 431, + 432, 430, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 284, 280, 280, 280, + 280, 280, 280, 433, 280, 280, 280, 280, 280, 434, + + 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, + 434, 280, 280, 280, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, 280, 280, + 435, 280, 281, 436, 437, 438, 436, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 284, 280, 280, 280, 280, 280, 280, 439, 280, + 280, 280, 280, 280, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, + + 440, 440, 440, 440, 440, 440, 280, 280, 280, 440, + 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, + 440, 440, 440, 280, 280, 441, 443, 452, 444, 445, + 452, 1642, 446, 453, 1826, 1642, 459, 447, 460, 461, + 448, 1856, 462, 1002, 467, 449, 444, 468, 1178, 1299, + 463, 467, 1299, 444, 468, 464, 1184, 281, 469, 282, + 283, 1177, 1300, 470, 281, 469, 282, 283, 1146, 1147, + 470, 479, 480, 282, 481, 480, 284, 1002, 1093, 1093, + 1093, 1093, 1185, 284, 281, 482, 282, 283, 1153, 1154, + + 483, 465, 281, 1094, 282, 283, 491, 492, 494, 495, + 496, 497, 495, 284, 491, 492, 1017, 450, 451, 1017, + 2499, 284, 498, 1006, 1006, 1006, 1006, 499, 1023, 1023, + 1023, 1023, 1002, 1189, 1572, 471, 500, 1003, 1196, 501, + 2500, 1007, 471, 494, 503, 496, 497, 503, 489, 490, + 507, 508, 509, 510, 508, 489, 490, 504, 281, 1572, + 282, 283, 505, 502, 507, 508, 509, 510, 508, 511, + 1197, 500, 2501, 1017, 501, 1198, 1017, 284, 512, 1191, + 513, 1000, 281, 511, 282, 283, 514, 281, 515, 282, + 283, 1203, 512, 1192, 513, 1652, 1204, 1653, 502, 516, + + 517, 284, 281, 2504, 282, 283, 284, 1644, 3756, 1645, + 514, 1702, 515, 1645, 516, 517, 1095, 1095, 1095, 1095, + 1702, 284, 280, 281, 280, 282, 283, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 284, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 280, 280, 280, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, + + 518, 518, 518, 518, 280, 280, 280, 520, 521, 522, + 523, 521, 1455, 520, 521, 522, 523, 521, 1155, 1156, + 2036, 524, 1023, 1023, 1023, 1023, 525, 524, 1114, 1115, + 1115, 1114, 525, 526, 527, 528, 529, 530, 528, 526, + 526, 526, 526, 526, 526, 526, 526, 526, 531, 526, + 526, 526, 526, 532, 541, 542, 543, 544, 542, 1224, + 526, 526, 534, 526, 526, 535, 1231, 571, 545, 580, + 581, 1202, 546, 547, 571, 1226, 580, 581, 281, 1203, + 618, 283, 548, 1056, 1232, 549, 582, 1056, 526, 536, + 526, 1002, 603, 582, 604, 605, 1204, 284, 1093, 1093, + + 1093, 1093, 3756, 1002, 606, 1203, 607, 1231, 1232, 550, + 1204, 608, 1177, 1094, 2505, 526, 526, 526, 526, 527, + 537, 529, 530, 537, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 538, 526, 526, 526, 526, 539, 541, + 551, 552, 553, 551, 2506, 526, 526, 534, 526, 526, + 535, 1203, 281, 554, 618, 283, 1232, 546, 555, 1203, + 1277, 1168, 609, 1169, 1204, 1215, 603, 548, 604, 605, + 549, 284, 1203, 526, 536, 526, 1278, 1281, 606, 625, + 607, 282, 626, 1268, 1618, 608, 1277, 1108, 1108, 1108, + 1108, 1215, 627, 1030, 550, 1355, 1030, 1000, 628, 1109, + + 526, 526, 526, 556, 557, 558, 559, 560, 558, 556, + 556, 556, 556, 556, 556, 556, 556, 556, 561, 556, + 556, 556, 556, 562, 571, 572, 573, 574, 572, 1658, + 556, 556, 564, 556, 556, 565, 609, 625, 1312, 282, + 626, 1312, 2426, 575, 1012, 1012, 1012, 1012, 1203, 663, + 627, 664, 665, 1003, 1658, 576, 628, 1313, 556, 566, + 556, 648, 649, 650, 651, 649, 1455, 1603, 666, 1013, + 1115, 1115, 1115, 1115, 1604, 652, 1605, 1860, 1861, 577, + 653, 1115, 1115, 1115, 1115, 556, 556, 556, 556, 557, + 567, 559, 560, 567, 556, 556, 556, 556, 556, 556, + + 556, 556, 556, 568, 556, 556, 556, 556, 569, 571, + 578, 573, 574, 578, 1812, 556, 556, 564, 556, 556, + 565, 2402, 648, 649, 650, 651, 649, 663, 579, 664, + 665, 670, 2507, 671, 672, 655, 652, 282, 656, 1812, + 576, 653, 1002, 556, 566, 556, 666, 1293, 657, 658, + 673, 1217, 1266, 1729, 659, 1127, 1127, 1127, 1127, 1133, + 1133, 1133, 1133, 1730, 577, 1186, 1186, 1186, 1186, 2508, + 556, 556, 556, 280, 281, 583, 584, 585, 583, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 586, 280, + 280, 280, 280, 284, 280, 280, 280, 280, 280, 280, + + 587, 280, 280, 280, 280, 280, 588, 588, 588, 588, + 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, + 588, 588, 588, 588, 588, 588, 588, 588, 280, 280, + 280, 588, 588, 588, 588, 588, 588, 588, 588, 588, + 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, + 588, 588, 588, 588, 588, 280, 280, 589, 280, 281, + 590, 591, 592, 590, 280, 593, 280, 280, 280, 280, + 280, 280, 280, 280, 1030, 280, 2509, 1030, 595, 655, + 1002, 282, 656, 1455, 1830, 1298, 280, 280, 280, 280, + 280, 1002, 657, 658, 1831, 1835, 1003, 670, 659, 671, + + 672, 1836, 603, 617, 618, 605, 617, 603, 617, 618, + 605, 617, 1002, 280, 1002, 280, 673, 1003, 1938, 1003, + 717, 608, 718, 719, 1901, 1902, 608, 1186, 1186, 1186, + 1186, 619, 1186, 1186, 1186, 1186, 619, 1942, 2412, 720, + 280, 280, 280, 280, 281, 590, 591, 592, 590, 280, + 593, 280, 280, 280, 280, 280, 280, 280, 280, 1002, + 280, 620, 1727, 595, 1334, 1728, 620, 707, 1657, 708, + 709, 280, 280, 280, 280, 280, 1739, 621, 707, 622, + 708, 709, 621, 623, 622, 1740, 710, 1773, 623, 632, + 633, 634, 635, 633, 1657, 711, 1774, 710, 280, 717, + + 280, 718, 719, 636, 1455, 1671, 711, 1672, 637, 1194, + 1194, 1194, 1194, 1236, 1236, 1236, 1236, 638, 720, 1000, + 1455, 1012, 1012, 1012, 1012, 280, 280, 280, 280, 281, + 596, 597, 598, 596, 280, 599, 280, 280, 280, 280, + 280, 280, 280, 280, 639, 280, 1013, 1825, 601, 632, + 640, 641, 642, 640, 1852, 2064, 280, 280, 280, 280, + 280, 1002, 281, 643, 282, 283, 1003, 281, 644, 282, + 283, 2390, 281, 1825, 282, 283, 675, 638, 676, 677, + 645, 284, 1002, 280, 1356, 280, 284, 1003, 1367, 1357, + 678, 284, 1362, 1368, 1363, 679, 1193, 1194, 1193, 1193, + + 1853, 1374, 1199, 1377, 646, 1199, 1366, 680, 1378, 1189, + 280, 280, 280, 280, 281, 596, 597, 598, 596, 280, + 599, 280, 280, 280, 280, 280, 280, 280, 280, 1830, + 280, 680, 1200, 601, 675, 681, 676, 677, 681, 1859, + 2510, 280, 280, 280, 280, 280, 2511, 281, 682, 282, + 283, 1175, 1919, 679, 1175, 281, 1201, 282, 283, 281, + 1739, 282, 283, 2512, 1176, 680, 284, 1360, 280, 1740, + 280, 740, 741, 281, 284, 282, 283, 1919, 284, 1364, + 1193, 1194, 1193, 1193, 1365, 740, 741, 1827, 1142, 680, + 1828, 1142, 284, 1189, 1143, 280, 280, 280, 280, 281, + + 610, 611, 612, 610, 280, 280, 280, 280, 280, 280, + 280, 280, 613, 280, 280, 280, 280, 280, 284, 280, + 280, 280, 280, 280, 280, 614, 280, 280, 280, 280, + 280, 615, 615, 615, 615, 615, 615, 615, 615, 615, + 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, + 615, 615, 615, 280, 280, 280, 615, 615, 615, 615, + 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, + 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, + 280, 280, 616, 280, 281, 280, 282, 283, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 586, 280, + + 280, 280, 280, 284, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 629, 629, 629, 629, + 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, + 629, 629, 629, 629, 629, 629, 629, 629, 280, 280, + 280, 629, 629, 629, 629, 629, 629, 629, 629, 629, + 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, + 629, 629, 629, 629, 629, 280, 280, 280, 280, 281, + 280, 282, 283, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 586, 280, 280, 280, 280, 284, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + + 280, 630, 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 280, 280, 280, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, + 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, + 280, 280, 280, 280, 281, 280, 660, 283, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 586, 280, + 280, 280, 280, 284, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 661, 661, 661, 661, + 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, + + 661, 661, 661, 661, 661, 661, 661, 661, 280, 280, + 280, 661, 661, 661, 661, 661, 661, 661, 661, 661, + 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, + 661, 661, 661, 661, 661, 280, 280, 280, 280, 281, + 280, 667, 283, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 586, 280, 280, 280, 280, 284, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 668, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 668, 668, 280, 280, 280, 668, 668, 668, 668, + + 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, + 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, + 280, 280, 280, 684, 1832, 685, 686, 2513, 1833, 684, + 691, 685, 686, 691, 1579, 1382, 694, 687, 695, 696, + 1375, 688, 689, 692, 1850, 1383, 1920, 688, 689, 694, + 1384, 695, 696, 1826, 690, 697, 1006, 1006, 1006, 1006, + 690, 1921, 1000, 745, 1002, 282, 746, 698, 697, 1204, + 1347, 1348, 704, 1347, 1007, 704, 747, 1845, 690, 2514, + 698, 1846, 748, 1349, 690, 568, 1252, 1251, 1252, 1252, + 705, 698, 1287, 1287, 1287, 1287, 1002, 1869, 1002, 556, + + 1857, 1232, 556, 1003, 698, 556, 557, 699, 559, 560, + 699, 556, 556, 556, 556, 556, 556, 556, 556, 556, + 561, 556, 556, 556, 556, 700, 725, 381, 382, 383, + 384, 382, 556, 556, 701, 556, 556, 702, 1858, 742, + 743, 1845, 1829, 387, 1905, 1867, 388, 779, 1906, 282, + 780, 381, 382, 383, 384, 382, 745, 781, 282, 746, + 556, 703, 556, 742, 743, 1312, 782, 387, 1312, 747, + 388, 1289, 1290, 1289, 1289, 748, 1289, 1290, 1289, 1289, + 1294, 1295, 1294, 1294, 1313, 2022, 2023, 556, 556, 556, + 280, 281, 280, 712, 283, 280, 280, 713, 280, 280, + + 280, 280, 280, 280, 280, 586, 779, 280, 282, 780, + 715, 750, 751, 752, 753, 751, 781, 1981, 280, 280, + 280, 280, 280, 754, 755, 782, 1888, 756, 2515, 1888, + 757, 815, 778, 816, 780, 778, 750, 751, 752, 753, + 751, 281, 1981, 282, 283, 280, 2516, 280, 754, 755, + 817, 281, 756, 282, 283, 757, 1371, 766, 1002, 1371, + 284, 1233, 1002, 1393, 1233, 2517, 1002, 1403, 767, 1372, + 284, 1406, 280, 280, 280, 280, 281, 280, 712, 283, + 280, 280, 713, 280, 280, 280, 280, 280, 280, 280, + 586, 1234, 280, 1002, 2518, 715, 1002, 281, 1003, 282, + + 283, 1003, 1892, 280, 280, 280, 280, 280, 815, 778, + 816, 780, 778, 766, 2519, 1234, 284, 819, 778, 816, + 780, 778, 768, 281, 767, 282, 283, 817, 1892, 1923, + 280, 281, 280, 282, 283, 2016, 820, 819, 778, 816, + 780, 778, 284, 1294, 1295, 1294, 1294, 1397, 2017, 1398, + 284, 1012, 1012, 1012, 1012, 1923, 820, 280, 280, 280, + 280, 281, 280, 721, 283, 280, 280, 722, 280, 280, + 280, 280, 280, 280, 280, 586, 1013, 280, 768, 1702, + 724, 770, 771, 772, 773, 771, 2520, 2190, 280, 280, + 280, 280, 280, 1702, 822, 778, 816, 780, 778, 2191, + + 774, 822, 778, 816, 780, 778, 770, 771, 772, 773, + 771, 1910, 775, 823, 1898, 280, 902, 280, 282, 903, + 823, 902, 1395, 282, 903, 777, 1306, 1306, 1306, 1306, + 1323, 1322, 1323, 1323, 1399, 904, 776, 775, 1020, 1400, + 904, 1020, 280, 280, 280, 280, 281, 280, 721, 283, + 280, 280, 722, 280, 280, 280, 280, 280, 280, 280, + 586, 776, 280, 1982, 807, 724, 282, 808, 858, 2521, + 859, 860, 809, 280, 280, 280, 280, 280, 810, 858, + 1002, 859, 860, 811, 1434, 1003, 1992, 861, 1982, 1435, + 2522, 807, 1434, 282, 808, 812, 862, 1438, 861, 809, + + 280, 918, 280, 919, 920, 810, 912, 862, 282, 913, + 811, 1992, 280, 1376, 1376, 1376, 1376, 1905, 1014, 812, + 921, 1906, 812, 1272, 1907, 914, 1272, 280, 280, 280, + 280, 281, 280, 282, 283, 280, 280, 726, 280, 280, + 280, 280, 280, 280, 280, 586, 812, 280, 1455, 807, + 728, 282, 808, 1273, 1620, 1455, 1621, 809, 280, 280, + 280, 280, 280, 810, 918, 1850, 919, 920, 811, 866, + 280, 282, 283, 280, 1826, 2523, 807, 1273, 282, 808, + 813, 1856, 2178, 921, 809, 280, 1379, 280, 867, 1379, + 810, 912, 1831, 282, 913, 811, 1455, 280, 2060, 1380, + + 1415, 1415, 1415, 1415, 813, 2383, 1002, 813, 1995, 1000, + 914, 1003, 280, 280, 280, 280, 281, 280, 282, 283, + 280, 280, 726, 280, 280, 280, 280, 280, 280, 280, + 586, 813, 280, 1995, 2524, 728, 825, 826, 827, 828, + 826, 1455, 1455, 280, 280, 280, 280, 280, 2050, 866, + 280, 282, 283, 280, 2051, 829, 869, 280, 282, 283, + 280, 2190, 2220, 281, 830, 282, 283, 831, 867, 915, + 280, 937, 280, 938, 939, 870, 869, 280, 282, 283, + 280, 1160, 284, 2387, 1160, 940, 1425, 1425, 1425, 1425, + 941, 832, 2054, 2055, 1161, 870, 2525, 280, 280, 280, + + 280, 281, 280, 729, 283, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 586, 280, 280, 280, 280, + 284, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 280, 280, 280, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 280, 280, 280, 731, 732, 733, 734, 735, + 733, 731, 731, 731, 731, 731, 731, 731, 731, 731, + + 731, 731, 731, 731, 731, 736, 731, 731, 731, 731, + 731, 731, 737, 731, 731, 731, 731, 731, 738, 738, + 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, + 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, + 731, 731, 731, 738, 738, 738, 738, 738, 738, 738, + 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, + 738, 738, 738, 738, 738, 738, 738, 731, 731, 739, + 280, 281, 758, 759, 760, 758, 280, 280, 280, 280, + 280, 761, 280, 280, 280, 761, 280, 762, 280, 280, + 342, 280, 280, 280, 280, 280, 280, 280, 763, 280, + + 764, 280, 280, 765, 765, 765, 765, 765, 765, 765, + 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, + 765, 765, 765, 765, 765, 280, 280, 280, 765, 765, + 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, + 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, + 765, 765, 280, 280, 280, 778, 779, 783, 784, 785, + 783, 778, 778, 786, 787, 788, 781, 778, 778, 778, + 778, 789, 778, 789, 789, 790, 789, 789, 789, 789, + 789, 789, 791, 778, 792, 778, 778, 793, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 778, 795, 778, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 796, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 778, 778, 797, + 280, 281, 280, 282, 283, 280, 280, 798, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 284, 825, 826, 827, 828, 826, 1864, 1455, 280, 280, + 280, 280, 280, 2006, 872, 280, 282, 283, 280, 1455, + 829, 872, 280, 282, 283, 280, 2526, 2190, 281, 830, + 282, 283, 831, 873, 915, 280, 280, 280, 2006, 2212, + + 873, 875, 280, 282, 283, 280, 2058, 284, 1426, 1426, + 1426, 1426, 1445, 1446, 1447, 1445, 832, 1427, 2066, 2059, + 876, 1427, 280, 280, 280, 280, 281, 280, 282, 283, + 280, 280, 798, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 284, 837, 1456, 838, 839, + 2118, 1455, 1457, 280, 280, 280, 280, 280, 2527, 875, + 280, 282, 283, 280, 2118, 840, 884, 885, 886, 887, + 885, 884, 885, 886, 887, 885, 1175, 841, 876, 1175, + 280, 280, 280, 1530, 937, 888, 938, 939, 1531, 1176, + 888, 1423, 1423, 1423, 1423, 1537, 1702, 1542, 940, 1547, + + 1538, 841, 1543, 941, 1548, 1702, 1424, 280, 280, 280, + 280, 281, 800, 801, 802, 800, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 284, 280, 280, 280, 280, 280, 280, 803, 280, 280, + 280, 280, 280, 804, 804, 804, 804, 804, 804, 804, + 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, + 804, 804, 804, 804, 804, 280, 280, 280, 804, 804, + 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, + 804, 804, 804, 804, 804, 804, 804, 804, 804, 804, + 804, 804, 280, 280, 805, 280, 281, 280, 282, 283, + + 280, 280, 280, 1556, 280, 280, 280, 280, 1557, 1618, + 280, 837, 280, 838, 839, 834, 878, 1002, 879, 880, + 1455, 1455, 1562, 280, 280, 280, 280, 835, 1002, 281, + 840, 282, 283, 1003, 281, 881, 282, 283, 281, 1002, + 282, 283, 841, 957, 1567, 950, 958, 882, 284, 959, + 280, 835, 280, 284, 960, 961, 962, 284, 1002, 849, + 1002, 2392, 963, 1570, 1002, 1574, 841, 1615, 850, 1576, + 1615, 882, 1206, 851, 2385, 1386, 2086, 280, 280, 280, + 281, 280, 282, 283, 280, 280, 280, 1455, 280, 280, + 280, 280, 1258, 850, 280, 1258, 280, 1206, 851, 834, + + 878, 1386, 879, 880, 1159, 1176, 1000, 280, 280, 280, + 280, 835, 1580, 281, 2528, 282, 283, 1581, 1000, 881, + 1586, 281, 1260, 932, 283, 1587, 281, 2094, 932, 283, + 2052, 882, 284, 1591, 280, 835, 280, 2529, 1592, 986, + 284, 282, 987, 849, 2053, 284, 1261, 1448, 1449, 1447, + 1448, 2007, 850, 2094, 1596, 882, 988, 851, 989, 1597, + 2532, 280, 280, 280, 281, 280, 282, 283, 280, 280, + 280, 280, 280, 280, 280, 280, 2007, 850, 280, 280, + 280, 280, 851, 284, 891, 933, 892, 893, 1618, 2534, + 933, 280, 280, 280, 280, 280, 1601, 1002, 894, 934, + + 1623, 1602, 1003, 895, 934, 1624, 1002, 891, 1633, 892, + 893, 1629, 2535, 1634, 943, 896, 282, 944, 280, 280, + 280, 894, 1036, 1036, 1036, 1036, 895, 1002, 1423, 1423, + 1423, 1423, 1661, 945, 1447, 1447, 1447, 1447, 896, 897, + 1037, 1455, 946, 1424, 947, 280, 280, 280, 280, 281, + 280, 282, 283, 280, 280, 280, 280, 280, 280, 280, + 280, 2220, 897, 280, 280, 280, 280, 943, 284, 282, + 944, 986, 1182, 282, 987, 1182, 280, 280, 280, 280, + 280, 957, 2409, 950, 958, 1183, 945, 959, 988, 1650, + 989, 2074, 960, 961, 962, 946, 949, 947, 950, 951, + + 963, 1654, 952, 280, 280, 280, 1655, 953, 969, 970, + 971, 972, 970, 1002, 959, 954, 2074, 2233, 1664, 960, + 973, 974, 1527, 1527, 1527, 1527, 1632, 963, 1000, 2234, + 280, 280, 280, 280, 281, 280, 282, 283, 280, 280, + 843, 280, 280, 280, 280, 280, 280, 280, 280, 2536, + 280, 955, 991, 845, 282, 992, 991, 995, 282, 992, + 995, 280, 280, 280, 280, 280, 964, 2175, 950, 965, + 996, 993, 959, 2244, 1642, 997, 1308, 960, 1642, 1308, + 1652, 949, 1653, 950, 951, 963, 1646, 952, 280, 1669, + 280, 1647, 953, 2175, 966, 1222, 967, 1223, 1224, 2244, + + 954, 1002, 1225, 1002, 1309, 1680, 1673, 994, 1003, 1642, + 1681, 994, 2537, 1642, 1226, 280, 280, 280, 280, 281, + 280, 282, 283, 280, 280, 843, 280, 280, 280, 280, + 280, 280, 280, 280, 1310, 280, 955, 991, 845, 282, + 992, 991, 995, 282, 992, 995, 280, 280, 280, 280, + 280, 964, 1311, 950, 965, 996, 993, 959, 1002, 1002, + 997, 2538, 960, 1003, 1003, 969, 970, 971, 972, 970, + 963, 959, 1191, 280, 1000, 280, 960, 973, 974, 966, + 1222, 967, 1247, 1248, 963, 1455, 1192, 1225, 1607, 1608, + 1607, 1607, 998, 1002, 2080, 2539, 998, 2081, 1003, 1249, + + 280, 280, 280, 280, 281, 280, 282, 283, 280, 280, + 846, 280, 280, 280, 280, 280, 280, 280, 280, 2080, + 280, 2118, 2081, 848, 1027, 1027, 1027, 1027, 2065, 2540, + 2118, 280, 280, 280, 280, 280, 964, 970, 971, 972, + 970, 2541, 959, 1041, 1041, 1041, 1041, 960, 973, 1029, + 964, 970, 971, 972, 970, 963, 959, 2123, 280, 1864, + 280, 960, 973, 1865, 975, 2124, 976, 2119, 1043, 963, + 1536, 1000, 1000, 1000, 1000, 1642, 2119, 1842, 975, 1642, + 976, 1041, 1041, 1041, 1041, 280, 280, 280, 280, 281, + 280, 282, 283, 280, 280, 846, 280, 280, 280, 280, + + 280, 280, 280, 280, 1054, 280, 1043, 1054, 848, 978, + 979, 980, 981, 979, 2369, 2544, 280, 280, 280, 280, + 280, 978, 979, 980, 981, 979, 2370, 2371, 982, 1038, + 1038, 1038, 1038, 1062, 1062, 1062, 1062, 983, 1279, 984, + 982, 1279, 1207, 280, 1262, 280, 1263, 1039, 1455, 983, + 1002, 984, 1002, 1265, 1224, 1003, 1280, 1697, 1043, 1387, + 1064, 1870, 1267, 1055, 1062, 1062, 1062, 1062, 1273, 1217, + 280, 280, 280, 280, 281, 280, 282, 283, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 1043, + 280, 1064, 1273, 853, 1036, 1036, 1036, 1036, 1905, 2394, + + 280, 280, 280, 280, 849, 280, 1038, 1038, 1038, 1038, + 2545, 2131, 1037, 1062, 1062, 1062, 1062, 1952, 1454, 2119, + 1062, 1062, 1062, 1062, 1039, 1454, 1700, 2132, 280, 280, + 280, 1701, 1066, 2119, 1102, 1102, 1102, 1102, 1043, 1709, + 1064, 1717, 1067, 1719, 1710, 1043, 1718, 1064, 1720, 1062, + 1062, 1062, 1062, 1103, 1454, 280, 280, 280, 280, 281, + 280, 282, 283, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 1043, 280, 1064, 2141, 853, 1065, + 1062, 1062, 1062, 1062, 1079, 280, 280, 280, 280, 849, + 280, 2161, 2174, 1062, 1062, 1062, 1062, 1082, 1082, 1082, + + 1082, 1062, 1062, 1062, 1062, 1043, 2174, 1064, 1062, 1062, + 1062, 1062, 1642, 280, 280, 280, 1642, 1068, 1043, 1642, + 1064, 1695, 1083, 1642, 1695, 2187, 1043, 2210, 1064, 1607, + 1608, 1607, 1607, 1043, 1228, 1064, 1070, 2221, 2546, 1696, + 280, 280, 280, 280, 281, 280, 282, 283, 280, 280, + 280, 2221, 280, 280, 280, 280, 280, 280, 280, 1808, + 280, 2174, 1069, 855, 1809, 1073, 1082, 1082, 1082, 1082, + 2174, 280, 280, 280, 856, 1074, 1082, 1082, 1082, 1082, + 1071, 2185, 2197, 1072, 1184, 1062, 1062, 1062, 1062, 1177, + 2214, 1083, 1062, 1062, 1062, 1062, 1455, 2186, 280, 280, + + 280, 1083, 1006, 1006, 1006, 1006, 1608, 1608, 1608, 1608, + 1043, 1455, 1064, 1607, 1608, 1607, 1607, 1043, 2093, 1064, + 1007, 1085, 1085, 1085, 1085, 280, 280, 280, 281, 280, + 282, 283, 280, 280, 280, 2286, 280, 280, 280, 280, + 280, 280, 280, 2093, 280, 1075, 1083, 855, 1087, 1006, + 1006, 1006, 1006, 2388, 1189, 280, 280, 280, 856, 1196, + 1077, 2286, 2401, 1806, 1076, 1078, 1806, 1007, 1006, 1006, + 1006, 1006, 1036, 1036, 1036, 1036, 1038, 1038, 1038, 1038, + 2547, 1807, 280, 280, 280, 1207, 1007, 1262, 1741, 1263, + 1037, 1741, 1742, 1264, 1039, 2548, 1265, 1639, 1639, 1639, + + 1639, 1217, 1266, 1189, 2189, 1267, 1743, 2189, 1196, 280, + 280, 280, 281, 280, 863, 283, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 284, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 280, 280, 280, 864, + 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 280, 280, 280, 280, 281, 280, 282, + + 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 284, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 889, + 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, + 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, + 889, 280, 280, 280, 889, 889, 889, 889, 889, 889, + 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, + 889, 889, 889, 889, 889, 889, 889, 889, 280, 280, + 280, 280, 281, 280, 282, 283, 280, 280, 898, 280, + 280, 280, 280, 280, 280, 280, 280, 1231, 280, 2530, + + 2531, 900, 1177, 1423, 1423, 1423, 1423, 2549, 1455, 280, + 280, 280, 280, 280, 1123, 1123, 1123, 1123, 1424, 1123, + 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1096, 1096, 1096, + 1096, 2196, 1096, 1096, 1096, 1096, 280, 2029, 280, 1124, + 2552, 2213, 2030, 1113, 1124, 1000, 1000, 2386, 1124, 1000, + 1691, 1691, 1691, 1691, 1000, 1097, 1096, 1096, 1096, 1096, + 1097, 1455, 1000, 280, 280, 280, 280, 281, 280, 282, + 283, 280, 280, 898, 280, 280, 280, 280, 280, 280, + 280, 280, 2127, 280, 1097, 1098, 900, 2128, 3756, 1227, + 1098, 1455, 1227, 2553, 280, 280, 280, 280, 280, 1099, + + 2395, 1100, 1228, 1101, 1099, 3756, 1100, 1229, 1101, 1123, + 1123, 1123, 1123, 2554, 1098, 1129, 1129, 1129, 1129, 1200, + 1644, 280, 1645, 280, 1000, 1000, 1645, 2555, 1099, 3756, + 1100, 2556, 1101, 2391, 1124, 1541, 1000, 1000, 1000, 1000, + 1130, 2550, 2551, 1201, 1691, 1691, 1691, 1691, 280, 280, + 280, 280, 281, 905, 906, 907, 905, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 284, 280, 280, 280, 280, 280, 280, 908, 280, + 280, 280, 280, 280, 909, 909, 909, 909, 909, 909, + 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, + + 909, 909, 909, 909, 909, 909, 280, 280, 280, 909, + 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, + 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, + 909, 909, 909, 280, 280, 910, 280, 281, 280, 282, + 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 284, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 916, + 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, + 916, 280, 280, 280, 916, 916, 916, 916, 916, 916, + + 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 916, 280, 280, + 280, 280, 281, 280, 922, 283, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 923, + 923, 284, 923, 923, 923, 923, 923, 923, 280, 280, + 280, 280, 280, 280, 923, 923, 923, 923, 923, 923, + 923, 924, 923, 923, 925, 923, 923, 923, 923, 923, + 923, 923, 923, 923, 923, 923, 280, 280, 280, 923, + 923, 923, 923, 923, 923, 923, 924, 923, 923, 925, + 923, 923, 923, 923, 923, 923, 923, 923, 923, 923, + + 923, 923, 923, 280, 280, 280, 280, 281, 280, 922, + 283, 280, 280, 926, 280, 280, 280, 280, 280, 280, + 280, 280, 1054, 280, 1455, 1054, 928, 1129, 1129, 1129, + 1129, 1620, 2316, 1621, 280, 280, 280, 280, 280, 1129, + 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1140, 1140, 1140, + 1140, 1888, 1130, 2557, 1888, 1174, 1000, 1000, 2316, 1000, + 2558, 280, 2104, 280, 1130, 1141, 2560, 2561, 1130, 1000, + 1691, 1691, 1691, 1691, 1000, 1546, 1000, 1000, 1000, 1000, + 2403, 1055, 1282, 1282, 1282, 1282, 1000, 2105, 280, 280, + 280, 280, 281, 280, 922, 283, 280, 280, 926, 280, + + 280, 280, 280, 280, 280, 280, 280, 1283, 280, 1739, + 1000, 928, 1250, 1251, 1252, 1250, 2364, 1455, 1740, 280, + 280, 280, 280, 280, 1455, 1253, 1255, 1256, 1255, 1255, + 1229, 2490, 2365, 2332, 1274, 1275, 1275, 1274, 1847, 1257, + 2491, 1848, 1234, 1551, 1235, 1000, 280, 1222, 280, 1223, + 1224, 1262, 1276, 1263, 1268, 1815, 1849, 1269, 1815, 2332, + 1265, 2389, 1000, 2061, 1455, 1217, 1234, 2062, 1816, 1267, + 2180, 1000, 2063, 280, 280, 280, 280, 281, 280, 922, + 283, 280, 280, 929, 280, 280, 280, 280, 280, 280, + 280, 280, 2562, 280, 2566, 2180, 931, 1270, 1000, 2248, + + 1270, 2277, 2204, 2567, 280, 280, 280, 280, 280, 2382, + 1271, 1274, 1275, 1275, 1274, 1229, 1282, 1282, 1282, 1282, + 1282, 1282, 1282, 1282, 2248, 1855, 2277, 1260, 1855, 1276, + 1818, 280, 1000, 280, 1426, 1426, 1426, 1426, 1228, 1274, + 1455, 1283, 1274, 1427, 1192, 1283, 2568, 1427, 2204, 1819, + 2204, 1261, 1282, 1282, 1282, 1282, 2569, 1276, 280, 280, + 280, 280, 281, 280, 922, 283, 280, 280, 929, 280, + 280, 280, 280, 280, 280, 280, 280, 1283, 280, 2397, + 2570, 931, 1302, 1302, 1302, 1302, 2571, 1455, 2572, 280, + 280, 280, 280, 280, 1302, 1302, 1302, 1302, 1302, 1302, + + 1302, 1302, 1302, 1302, 1302, 1302, 2278, 1303, 1411, 1411, + 1411, 1411, 1036, 1036, 1036, 1036, 280, 1312, 280, 1303, + 1312, 1335, 1336, 1303, 1337, 1338, 1671, 1303, 1672, 1339, + 1037, 2278, 2384, 1412, 2573, 1340, 1313, 1341, 1342, 2574, + 1000, 1343, 1344, 280, 280, 280, 280, 281, 280, 282, + 283, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 284, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + + 935, 280, 280, 280, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 935, 935, 935, 935, 935, 935, 280, 280, + 280, 280, 281, 280, 282, 283, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 284, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 999, 999, 999, 999, 999, 999, + 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, + 999, 999, 999, 999, 999, 999, 280, 280, 280, 999, + 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, + + 999, 999, 999, 999, 999, 999, 999, 999, 999, 999, + 999, 999, 999, 280, 280, 280, 1040, 1041, 1041, 1040, + 1741, 2285, 1042, 1741, 1321, 1322, 1323, 1321, 1972, 1989, + 1455, 1328, 1329, 1330, 1328, 2520, 2189, 1324, 2139, 2189, + 1199, 1043, 1325, 1199, 1331, 1385, 2285, 1997, 1385, 1177, + 1278, 2533, 1335, 1345, 1326, 1337, 1338, 1268, 1176, 2677, + 1339, 1332, 1411, 1411, 1411, 1411, 1340, 2679, 1341, 1346, + 1200, 2380, 1343, 1344, 1044, 3756, 1045, 2287, 1327, 2227, + 1046, 2381, 2227, 1047, 1048, 1333, 1049, 1412, 2682, 1050, + 1051, 1052, 1053, 1207, 1201, 1208, 1209, 1210, 1211, 3756, + + 1996, 1212, 2287, 1996, 1213, 1214, 1215, 1216, 2228, 1217, + 1218, 1219, 1220, 1221, 1237, 1238, 1208, 1239, 1240, 1211, + 2683, 1806, 1241, 2684, 1806, 1213, 1214, 1215, 1242, 1997, + 1243, 1244, 1219, 1220, 1245, 1246, 1222, 2687, 1223, 1807, + 1262, 1864, 1263, 1268, 1389, 1865, 1998, 1389, 1866, 1265, + 1411, 1411, 1411, 1411, 1388, 1387, 2688, 1271, 1267, 1842, + 2689, 2690, 1229, 1407, 1407, 1407, 1407, 1411, 1411, 1411, + 1411, 2691, 1998, 1741, 3756, 1412, 1741, 1775, 1417, 1417, + 1417, 1417, 1408, 1408, 1408, 1408, 1408, 1408, 1409, 1418, + 1299, 1776, 1412, 1299, 1420, 1420, 1420, 1420, 3756, 1426, + + 1426, 1426, 1426, 1300, 1419, 1421, 1615, 1455, 1427, 1615, + 1993, 2085, 1427, 1426, 1426, 1426, 1426, 1433, 1000, 1000, + 1422, 1000, 1427, 2692, 1994, 2698, 1427, 1038, 1038, 1038, + 1038, 1523, 1523, 1523, 1523, 1993, 1000, 1523, 1523, 1523, + 1523, 1523, 1523, 1523, 1523, 1039, 1523, 1523, 1523, 1523, + 1994, 1552, 1553, 1552, 1552, 2298, 1524, 1585, 1000, 1000, + 1000, 1000, 1524, 1818, 2400, 1000, 1524, 1553, 1553, 1553, + 1553, 1524, 1000, 1299, 1422, 1439, 1299, 1192, 2299, 1440, + 2298, 1554, 1371, 1440, 2701, 1371, 1300, 1441, 1439, 1635, + 1635, 1635, 1635, 1440, 2702, 1372, 1442, 1555, 1347, 1348, + + 1439, 1347, 1443, 2299, 1440, 1555, 1233, 1379, 1440, 1233, + 1379, 1349, 1441, 1439, 1636, 1444, 1938, 2705, 1939, 1440, + 1380, 1555, 1940, 1442, 1459, 1590, 1000, 1000, 1000, 1000, + 1595, 1000, 1000, 1000, 1000, 1942, 1234, 1455, 1460, 1600, + 1000, 1000, 1000, 1000, 1610, 1611, 1612, 1611, 1611, 1455, + 2745, 1461, 1462, 1463, 1464, 1465, 1466, 1975, 1467, 1468, + 1234, 1469, 1470, 2302, 1471, 1472, 1976, 1473, 1474, 1475, + 1476, 2746, 1552, 1553, 1552, 1552, 1461, 1462, 1463, 1464, + 1465, 1466, 1975, 1467, 1468, 2305, 1469, 1470, 2302, 1471, + 1472, 1976, 2413, 1473, 1474, 1475, 1476, 1477, 1478, 1479, + + 1480, 1481, 1554, 2306, 1482, 1483, 2411, 1484, 2699, 2700, + 2305, 1485, 1385, 1486, 1487, 1385, 1488, 1489, 1490, 1491, + 1635, 1635, 1635, 1635, 1492, 1176, 1555, 1454, 2306, 1454, + 1455, 1454, 1493, 1493, 1493, 1493, 1493, 1493, 1494, 1607, + 1608, 1607, 1607, 1952, 1454, 1636, 1635, 1635, 1635, 1635, + 2340, 1454, 1613, 1635, 1635, 1635, 1635, 1614, 1674, 1674, + 1674, 1674, 1692, 1692, 1692, 1692, 1679, 1454, 1000, 1675, + 1455, 1636, 1000, 1685, 2685, 1000, 2340, 1000, 1636, 1000, + 1454, 2309, 2686, 1676, 1000, 1000, 1000, 1692, 1692, 1692, + 1692, 1855, 1000, 2748, 1855, 1451, 1496, 1497, 1498, 1499, + + 1692, 1692, 1692, 1692, 1228, 1455, 2309, 1455, 1006, 1006, + 1006, 1006, 1690, 1000, 1000, 1000, 1000, 1500, 1000, 1501, + 1502, 1000, 2709, 1000, 1000, 1000, 1007, 1011, 1012, 1012, + 1011, 1000, 1012, 1012, 1012, 1012, 1703, 1703, 1703, 1703, + 1018, 1018, 1018, 1018, 1503, 2575, 1504, 1505, 1506, 1507, + 1508, 1509, 1013, 1510, 1511, 2396, 1512, 1013, 1451, 2693, + 1513, 1013, 1514, 1515, 2694, 1516, 1517, 1518, 1491, 1012, + 1012, 1012, 1012, 1492, 2695, 1455, 1454, 2695, 1454, 1455, + 1454, 1493, 1493, 1493, 1493, 1493, 1493, 1494, 1022, 1023, + 1023, 1022, 2323, 2749, 1013, 1023, 1023, 1023, 1023, 1027, + + 1027, 1027, 1027, 1023, 1023, 1023, 1023, 1014, 1027, 1027, + 1027, 1027, 1027, 1027, 1027, 1027, 1454, 2323, 1705, 1080, + 1080, 1080, 1080, 1815, 1029, 2721, 1815, 2703, 1707, 1715, + 2696, 2697, 1519, 1029, 2697, 2352, 1816, 1029, 1716, 1716, + 1716, 1716, 1716, 2704, 1451, 1036, 1036, 1036, 1036, 1038, + 1038, 1038, 1038, 1041, 1041, 1041, 1041, 1735, 1735, 1735, + 1735, 2352, 1818, 1037, 1000, 2750, 2266, 1039, 1025, 2266, + 1057, 1736, 1736, 1736, 1736, 3756, 1192, 2328, 1043, 1744, + 1744, 1744, 1744, 3756, 1040, 1041, 1041, 1040, 1852, 2329, + 1042, 1062, 1062, 1062, 1062, 2267, 1738, 1062, 1062, 1062, + + 1062, 2755, 2328, 2756, 1043, 1062, 1062, 1062, 1062, 1043, + 1062, 1062, 1062, 1062, 2329, 1455, 1043, 1455, 1064, 2757, + 1855, 2417, 1043, 1855, 1064, 2333, 1766, 1766, 1766, 1766, + 1043, 2759, 1064, 1228, 1853, 1043, 1455, 1064, 1062, 1062, + 1062, 1062, 1044, 1855, 1045, 1832, 1855, 2417, 1046, 1833, + 2333, 1047, 1048, 1064, 1049, 1455, 1228, 1050, 1051, 1052, + 1053, 1746, 2410, 1043, 2707, 1064, 1748, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 2338, + 1749, 1062, 1062, 1062, 1062, 2724, 1062, 1062, 1062, 1062, + 1455, 1938, 1043, 1939, 1064, 1455, 1043, 1940, 1064, 1455, + + 1043, 2708, 1064, 2339, 2338, 2761, 1043, 2762, 1064, 1941, + 1942, 1043, 1750, 1064, 1082, 1082, 1082, 1082, 1455, 1062, + 1062, 1062, 1062, 2343, 1062, 1062, 1062, 1062, 2339, 2283, + 1753, 2398, 2283, 1751, 1062, 1062, 1062, 1062, 2714, 1083, + 2765, 1752, 1754, 1757, 1043, 1755, 1064, 2399, 2343, 1043, + 1756, 1064, 1062, 1062, 1062, 1062, 2712, 1988, 2284, 1043, + 1988, 1064, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 2713, 1855, 1455, 1043, 1855, 1064, + 1759, 1758, 1768, 1768, 1768, 1768, 1989, 1043, 1228, 1064, + 1455, 1043, 2766, 1064, 2624, 1043, 1760, 1064, 1455, 1990, + + 1991, 1761, 1085, 1085, 1085, 1085, 2421, 1083, 1085, 1085, + 1085, 1085, 1088, 1088, 1088, 1088, 1771, 1771, 1771, 1771, + 2301, 2624, 1762, 2301, 1990, 1991, 1763, 1083, 2767, 1087, + 1764, 2421, 2723, 1083, 2735, 1087, 1093, 1093, 1093, 1093, + 2422, 2715, 1765, 1087, 1095, 1095, 1095, 1095, 1455, 1972, + 1618, 1094, 1095, 1095, 1095, 1095, 1096, 1096, 1096, 1096, + 1102, 1102, 1102, 1102, 1770, 2422, 1102, 1102, 1102, 1102, + 1777, 1777, 1777, 1777, 1108, 1108, 1108, 1108, 2428, 1103, + 1782, 1782, 1782, 1782, 1097, 1103, 1109, 1113, 2429, 1000, + 1000, 1783, 2768, 1000, 1114, 1115, 1115, 1114, 1000, 1115, + + 1115, 1115, 1115, 2428, 1455, 2717, 1000, 1786, 1788, 1789, + 1790, 1788, 2502, 2429, 1098, 2502, 1787, 1787, 1787, 1787, + 1787, 1123, 1123, 1123, 1123, 2758, 2303, 2439, 1099, 2303, + 1100, 2493, 1101, 1793, 1793, 1793, 1793, 1123, 1123, 1123, + 1123, 1127, 1127, 1127, 1127, 2563, 1124, 1129, 1129, 1129, + 1129, 1797, 1797, 1797, 1797, 2304, 2493, 2739, 1124, 2769, + 2771, 2592, 1124, 1129, 1129, 1129, 1129, 1272, 1000, 1000, + 1272, 2563, 1130, 1803, 2503, 1455, 1130, 1133, 1133, 1133, + 1133, 1455, 1804, 1804, 1804, 1804, 1804, 2592, 1130, 1140, + 1140, 1140, 1140, 2559, 1174, 1000, 1000, 1273, 1000, 1186, + + 1186, 1186, 1186, 1193, 1194, 1193, 1193, 1141, 1000, 1194, + 1194, 1194, 1194, 1000, 1455, 1795, 1189, 1227, 2559, 1455, + 1227, 1273, 2716, 2271, 1250, 1251, 1252, 1250, 2733, 2611, + 1228, 1455, 2272, 1799, 2772, 1229, 1455, 1253, 1252, 1251, + 1252, 1252, 1229, 1252, 1251, 1252, 1252, 1200, 2271, 1000, + 1820, 1209, 1821, 1211, 1234, 2611, 1822, 2272, 1455, 1823, + 1214, 1215, 1216, 2726, 1217, 1218, 1219, 1220, 1824, 2580, + 2581, 1201, 1255, 1256, 1255, 1255, 2732, 2710, 1234, 1255, + 1256, 1255, 1255, 1258, 1270, 1257, 1258, 1270, 1274, 1275, + 1275, 1274, 1257, 2738, 2580, 2581, 1176, 1271, 1279, 2722, + + 1455, 1279, 1229, 1952, 1454, 2623, 1276, 1282, 1282, 1282, + 1282, 1454, 1389, 1260, 1260, 1389, 1280, 1877, 1877, 1877, + 1877, 1282, 1282, 1282, 1282, 1271, 1695, 2773, 1273, 1695, + 1229, 2623, 1283, 1287, 1287, 1287, 1287, 1261, 1261, 1228, + 1454, 2774, 1283, 2720, 1696, 1455, 1283, 1289, 1290, 1289, + 1289, 1455, 1273, 1294, 1295, 1294, 1294, 1302, 1302, 1302, + 1302, 1884, 1884, 1884, 1884, 1302, 1302, 1302, 1302, 1306, + 1306, 1306, 1306, 1308, 1455, 2582, 1308, 2585, 1321, 1322, + 1323, 1321, 1303, 2775, 2045, 2776, 1303, 1455, 2046, 2627, + 1303, 1324, 1323, 1322, 1323, 1323, 1325, 2047, 2740, 1879, + + 2582, 1309, 2585, 1328, 1329, 1330, 1328, 2777, 1326, 1335, + 1336, 2307, 1337, 1338, 2307, 2627, 1331, 1339, 2778, 2725, + 2779, 1177, 2780, 1340, 2310, 1341, 1342, 2310, 2718, 1343, + 1344, 1310, 1327, 1332, 1335, 1345, 2719, 1337, 1338, 2781, + 2308, 2599, 1339, 1886, 1894, 1322, 1323, 1894, 1340, 1311, + 1341, 1346, 2604, 2311, 1343, 1344, 2784, 1333, 1323, 1322, + 1323, 1323, 1328, 1329, 1330, 1328, 2599, 2785, 1335, 1336, + 2312, 1337, 1338, 2312, 1326, 1331, 1339, 2604, 1895, 1322, + 1323, 1895, 1340, 2314, 1341, 1342, 2314, 2786, 1343, 1344, + 2609, 1896, 1332, 1335, 1345, 1455, 1337, 1338, 1327, 2313, + + 2806, 1339, 1914, 1915, 1914, 1914, 2610, 1340, 1326, 1341, + 1346, 2651, 2315, 1343, 1344, 2609, 1333, 1917, 1915, 1917, + 1917, 1407, 1407, 1407, 1407, 1411, 1411, 1411, 1411, 2809, + 1918, 2610, 1327, 1407, 1407, 1407, 1407, 2651, 2727, 2782, + 1407, 1407, 1407, 1407, 2485, 2810, 1409, 2488, 2783, 1455, + 1412, 1455, 1408, 1408, 1408, 1408, 1408, 1408, 1409, 1928, + 1928, 1928, 1928, 1928, 1928, 1409, 1930, 1930, 1930, 1930, + 1411, 1411, 1411, 1411, 1415, 1415, 1415, 1415, 1417, 1417, + 1417, 1417, 1420, 1420, 1420, 1420, 1433, 1000, 1000, 1418, + 1000, 1412, 2728, 1421, 2655, 1412, 1423, 1423, 1423, 1423, + + 1425, 1425, 1425, 1425, 1419, 1000, 2614, 2628, 1422, 2736, + 2737, 1424, 1425, 1425, 1425, 1425, 1426, 1426, 1426, 1426, + 2655, 1426, 1426, 1426, 1426, 1427, 2814, 2815, 2816, 1427, + 1427, 2614, 2628, 1455, 1427, 1445, 1446, 1447, 1445, 2819, + 2639, 1000, 1448, 1449, 1447, 1448, 2820, 2822, 1932, 1447, + 1447, 1447, 1447, 1448, 1449, 1447, 1448, 1945, 1946, 1447, + 1945, 1491, 1422, 2823, 1971, 2639, 1492, 1971, 2825, 2827, + 2828, 1983, 1984, 1985, 1947, 1947, 1947, 1947, 1947, 1947, + 1948, 2829, 1977, 2734, 1978, 2830, 1986, 2002, 1999, 1979, + 2003, 2831, 2832, 1972, 2000, 2001, 1980, 1987, 2008, 2008, + + 2008, 2008, 2004, 2317, 2005, 2834, 2317, 1977, 1973, 1978, + 1974, 1986, 2002, 1999, 1979, 2003, 2012, 2012, 2012, 2012, + 2000, 2001, 1980, 1987, 2014, 2014, 2014, 2014, 2004, 2835, + 2005, 2646, 2318, 1973, 2654, 2836, 1974, 1451, 1454, 2660, + 1454, 1455, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, + 2661, 2018, 2018, 2018, 2018, 2502, 2646, 2009, 2502, 2654, + 2018, 2018, 2018, 2018, 2660, 2760, 2024, 2024, 2024, 2024, + 2010, 2824, 2837, 2011, 2824, 2661, 2838, 1455, 1454, 2012, + 2012, 2012, 2012, 1527, 1527, 1527, 1527, 1607, 1608, 1607, + 1607, 2013, 2760, 2015, 2839, 2840, 1455, 1536, 1000, 1000, + + 1000, 1000, 1523, 1523, 1523, 1523, 1451, 1955, 1956, 1957, + 1958, 1959, 1960, 2841, 1961, 1962, 2666, 1963, 1964, 2019, + 1965, 1966, 2025, 1967, 1968, 1969, 1970, 1524, 2048, 2020, + 2026, 2747, 1955, 1956, 1957, 1958, 1959, 1960, 2049, 1961, + 1962, 2666, 1963, 1964, 2319, 1965, 1966, 2319, 1739, 1967, + 1968, 1969, 1970, 1491, 2041, 2842, 2747, 1740, 1492, 2826, + 1455, 1454, 2826, 1454, 1455, 1454, 1493, 1493, 1493, 1493, + 1493, 1493, 1494, 2320, 2068, 2068, 2068, 2068, 1523, 1523, + 1523, 1523, 1541, 1000, 1000, 1000, 1000, 1607, 1608, 1607, + 1607, 2008, 2008, 2008, 2008, 2014, 2014, 2014, 2014, 1524, + + 1551, 1454, 1000, 1524, 2024, 2024, 2024, 2024, 1455, 2835, + 1455, 2743, 1455, 1546, 1000, 1000, 1000, 1000, 2843, 1000, + 2844, 1455, 1552, 1553, 1552, 1552, 1864, 2845, 1000, 1451, + 1491, 1608, 1608, 1608, 1608, 1492, 2321, 1864, 1454, 2321, + 1454, 1455, 1454, 1493, 1493, 1493, 1493, 1493, 1493, 1494, + 2037, 2042, 1554, 2729, 2833, 1000, 2070, 2833, 2730, 2038, + 2056, 2043, 2846, 2039, 2044, 2322, 2040, 2847, 2057, 1553, + 1553, 1553, 1553, 2848, 2849, 2850, 1555, 2851, 1454, 1585, + 1000, 1000, 1000, 1000, 1590, 1000, 1000, 1000, 1000, 1595, + 1000, 1000, 1000, 1000, 1600, 1000, 1000, 1000, 1000, 1555, + + 1610, 1611, 1612, 1611, 1611, 2852, 1451, 1607, 1608, 1607, + 1607, 1610, 1611, 1612, 1611, 1611, 1001, 1612, 1612, 1612, + 1612, 2853, 2854, 1555, 1607, 1608, 1607, 1607, 1607, 1608, + 1607, 1607, 1635, 1635, 1635, 1635, 2089, 2089, 2089, 2089, + 1635, 1635, 1635, 1635, 1639, 1639, 1639, 1639, 1674, 1674, + 1674, 1674, 1679, 2855, 1000, 2138, 2855, 1636, 1000, 1675, + 2858, 1636, 2228, 1000, 1685, 1636, 1000, 1805, 2859, 2102, + 1000, 2860, 1805, 1676, 1905, 1000, 1000, 1000, 2103, 2103, + 2103, 2103, 2103, 1000, 1690, 1000, 1000, 1000, 1000, 2861, + 1000, 1691, 1691, 1691, 1691, 1000, 1000, 1000, 1692, 1692, + + 1692, 1692, 2324, 1000, 2862, 2324, 1905, 1000, 1703, 1703, + 1703, 1703, 1012, 1012, 1012, 1012, 2863, 2864, 2091, 1018, + 1018, 1018, 1018, 2110, 2110, 2110, 2110, 2865, 2866, 2116, + 2867, 2325, 2865, 1013, 2868, 2869, 2870, 1013, 2117, 2117, + 2117, 2117, 2117, 1735, 1735, 1735, 1735, 1736, 1736, 1736, + 1736, 1736, 1736, 1736, 1736, 2872, 1057, 1744, 1744, 1744, + 1744, 1062, 1062, 1062, 1062, 1080, 1080, 1080, 1080, 2279, + 2280, 2281, 1738, 2873, 2871, 2874, 1738, 1062, 1062, 1062, + 1062, 2876, 1043, 2877, 2282, 2878, 1043, 2879, 1064, 2875, + 1705, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 2871, + + 2327, 2880, 1043, 2327, 1064, 1062, 1062, 1062, 1062, 2282, + 1062, 1062, 1062, 1062, 2875, 2881, 1043, 2882, 1064, 2883, + 1043, 2884, 1064, 2267, 1062, 1062, 1062, 1062, 2330, 1989, + 1043, 2330, 1064, 2269, 2284, 1043, 2886, 1064, 2289, 1746, + 1062, 1062, 1062, 1062, 1088, 1088, 1088, 1088, 2304, 1043, + 2142, 1064, 2308, 2856, 2311, 2144, 2856, 2331, 2143, 1062, + 1062, 1062, 1062, 2886, 2857, 1043, 2313, 1064, 2315, 2145, + 2146, 1062, 1062, 1062, 1062, 2318, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1043, 2320, 1064, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 2322, 1043, 2325, 1064, 2147, + + 2148, 1043, 2331, 1064, 2335, 1043, 2887, 1064, 1768, 1768, + 1768, 1768, 1043, 2345, 1064, 2909, 1043, 2944, 1064, 1062, + 1062, 1062, 1062, 1455, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 2887, 1083, 2347, 2149, 2349, 1062, 1062, 1062, + 1062, 2909, 2151, 2944, 1043, 2150, 1064, 2351, 2152, 1043, + 2959, 1064, 2960, 1043, 2965, 1064, 1062, 1062, 1062, 1062, + 2966, 2153, 1043, 2741, 1064, 2967, 2154, 1766, 1766, 1766, + 1766, 1766, 1766, 1766, 1766, 1085, 1085, 1085, 1085, 2742, + 2968, 1043, 2969, 1064, 2156, 1771, 1771, 1771, 1771, 2155, + 1770, 2970, 2971, 2972, 1064, 2973, 2695, 2157, 1064, 2695, + + 1083, 2976, 1087, 2977, 2888, 2158, 1771, 1771, 1771, 1771, + 2978, 2979, 1087, 1777, 1777, 1777, 1777, 1782, 1782, 1782, + 1782, 1788, 1789, 1790, 1788, 2167, 1455, 2982, 1783, 2888, + 2159, 2985, 2986, 1087, 2168, 2168, 2168, 2168, 2168, 1790, + 1789, 1790, 1790, 1793, 1793, 1793, 1793, 1123, 1123, 1123, + 1123, 1127, 1127, 1127, 1127, 1797, 1797, 1797, 1797, 1129, + 1129, 1129, 1129, 1133, 1133, 1133, 1133, 2983, 1124, 3024, + 2404, 2697, 1124, 2405, 2697, 2984, 2171, 1455, 1455, 1455, + 1130, 1455, 2406, 2407, 1130, 2172, 2172, 2172, 2172, 2172, + 1877, 1877, 1877, 1877, 1282, 1282, 1282, 1282, 1287, 1287, + + 1287, 1287, 1884, 1884, 1884, 1884, 1302, 1302, 1302, 1302, + 1306, 1306, 1306, 1306, 1455, 1283, 1455, 2899, 1455, 1283, + 1895, 1322, 1323, 1895, 2906, 1795, 2334, 1303, 2988, 2334, + 2989, 1303, 2337, 1896, 3000, 2337, 2990, 1799, 1894, 1322, + 1323, 1894, 2899, 1895, 1322, 1323, 1895, 1455, 1455, 2906, + 1326, 1328, 1329, 1330, 1328, 2335, 1896, 1914, 1915, 1914, + 1914, 1997, 3025, 3028, 1331, 2914, 2341, 2996, 1326, 3001, + 2991, 3002, 1879, 1326, 1327, 1914, 1915, 1914, 1914, 2342, + 1455, 1332, 3029, 1455, 1886, 2249, 2249, 2249, 2249, 3030, + 2914, 2341, 1327, 1407, 1407, 1407, 1407, 1327, 3009, 2998, + + 1407, 1407, 1407, 1407, 2342, 1333, 1930, 1930, 1930, 1930, + 1409, 1455, 1928, 1928, 1928, 1928, 1928, 1928, 1409, 1928, + 1928, 1928, 1928, 1928, 1928, 1409, 1411, 1411, 1411, 1411, + 2997, 1412, 1415, 1415, 1415, 1415, 1945, 1946, 1447, 1945, + 2260, 1946, 1447, 2260, 1491, 2268, 2915, 2288, 2268, 1492, + 2288, 1412, 2008, 2008, 2008, 2008, 1455, 1947, 1947, 1947, + 1947, 1947, 1947, 1948, 1491, 2344, 3036, 2995, 2344, 1492, + 2346, 2915, 2348, 2346, 2269, 2348, 2289, 1947, 1947, 1947, + 1947, 1947, 1947, 1948, 2273, 3037, 2274, 2920, 1932, 2270, + 2291, 2275, 2350, 2290, 2345, 2350, 2292, 2293, 2276, 2347, + + 3039, 2349, 2012, 2012, 2012, 2012, 3040, 2763, 3004, 2273, + 2497, 2274, 2920, 2497, 2270, 2291, 2275, 1455, 1455, 2290, + 1451, 2351, 2292, 2293, 2276, 2014, 2014, 2014, 2014, 2018, + 2018, 2018, 2018, 2024, 2024, 2024, 2024, 1455, 2933, 2498, + 1451, 1491, 1527, 1527, 1527, 1527, 1492, 2294, 2947, 1454, + 2295, 1454, 1455, 1454, 2263, 2263, 2263, 2263, 2263, 2263, + 1494, 3003, 2296, 2933, 2297, 2408, 2408, 2408, 2408, 3043, + 3044, 3045, 2294, 2947, 3011, 2295, 1455, 2068, 2068, 2068, + 2068, 3047, 1455, 1523, 1523, 1523, 1523, 3048, 2296, 1454, + 2297, 3049, 3007, 3050, 2089, 2089, 2089, 2089, 1639, 1639, + + 1639, 1639, 1524, 2110, 2110, 2110, 2110, 2950, 1524, 1635, + 1635, 1635, 1635, 2249, 2249, 2249, 2249, 1451, 1454, 1636, + 1454, 1455, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, + 2433, 1455, 2950, 1455, 1636, 2439, 2951, 3008, 1409, 2434, + 2434, 2434, 2434, 2434, 2440, 2440, 2440, 2440, 2440, 2460, + 2460, 2460, 2460, 1062, 1062, 1062, 1062, 1455, 1454, 2070, + 3051, 2951, 1057, 2463, 2463, 2463, 2463, 3052, 2956, 1062, + 1062, 1062, 1062, 2378, 3005, 3053, 2091, 1455, 1043, 1455, + 1064, 1455, 1062, 1062, 1062, 1062, 1451, 1491, 1043, 1618, + 1064, 3006, 1492, 2956, 1043, 1454, 1064, 1454, 1455, 1454, + + 1493, 1493, 1493, 1493, 1493, 1493, 1494, 1043, 1455, 1064, + 3012, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 3010, 2612, 3054, 2462, 3055, 2999, 1062, + 1062, 1062, 1062, 1455, 3014, 1454, 1043, 2613, 1064, 1455, + 1043, 2464, 1064, 3056, 1043, 1455, 1064, 3015, 3038, 2612, + 2465, 1455, 3057, 2414, 1043, 1455, 1064, 1062, 1062, 1062, + 1062, 3058, 2613, 1451, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 3016, 2467, 1043, 2466, 1064, 2469, 3059, 2543, 3013, 1043, + 2543, 1064, 2468, 1043, 3018, 1064, 3061, 1043, 3021, 1064, + + 3062, 1043, 3022, 1064, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 2228, 2470, 3082, 1062, + 1062, 1062, 1062, 3083, 2472, 3086, 3087, 3088, 2471, 1043, + 2498, 1064, 3089, 1043, 2474, 1064, 2473, 1043, 3090, 1064, + 2577, 3090, 2485, 2577, 1043, 3091, 1064, 1062, 1062, 1062, + 1062, 2486, 2486, 2486, 2486, 2486, 2260, 1946, 1447, 2260, + 3092, 2824, 2579, 2583, 2824, 2579, 2583, 2476, 2586, 2267, + 2475, 2586, 1043, 2488, 1064, 2588, 2477, 3093, 2588, 3094, + 2478, 2479, 2489, 2489, 2489, 2489, 2489, 1407, 1407, 1407, + 1407, 2269, 2584, 3097, 3095, 2590, 2593, 2587, 2590, 2593, + + 2595, 3096, 2826, 2595, 2589, 2826, 2564, 2564, 2564, 2564, + 2564, 2564, 1409, 3098, 2597, 2601, 2602, 2597, 2601, 2602, + 3099, 3100, 2480, 1491, 2591, 2594, 3101, 2605, 1492, 2596, + 2605, 1454, 3102, 1454, 1455, 1454, 2263, 2263, 2263, 2263, + 2263, 2263, 1494, 2598, 2284, 2603, 2608, 2615, 2617, 2608, + 2615, 2617, 2619, 3103, 2621, 2619, 2606, 2621, 2301, 2626, + 2630, 2301, 2626, 2630, 2631, 2634, 2636, 2631, 2634, 2636, + 2833, 1454, 3105, 2833, 3107, 2289, 2616, 2618, 3108, 3104, + 1864, 2620, 3104, 2622, 3109, 3095, 3111, 1972, 2304, 2308, + 1864, 3113, 3110, 2632, 2311, 2313, 3114, 3116, 2638, 1451, + + 1491, 2638, 3117, 2641, 2643, 1492, 2641, 2643, 1454, 3118, + 1454, 1455, 1454, 2263, 2263, 2263, 2263, 2263, 2263, 1494, + 2645, 2648, 2327, 2645, 2648, 2327, 2649, 2315, 2653, 2649, + 3119, 2653, 2318, 2320, 2657, 2337, 2658, 2657, 2337, 2658, + 2662, 2664, 2668, 2662, 2664, 2668, 1905, 3120, 1454, 2322, + 2325, 1989, 3121, 2670, 3122, 2650, 2670, 2331, 2672, 2674, + 3123, 2672, 2674, 2335, 1997, 2659, 1905, 3125, 3126, 2663, + 2665, 2345, 2675, 1455, 3096, 2675, 1451, 2678, 2678, 2678, + 2678, 3127, 2347, 2680, 2680, 2680, 2680, 2349, 2351, 2408, + 2408, 2408, 2408, 2678, 2678, 2678, 2678, 2695, 3128, 3112, + + 2695, 2676, 3112, 3129, 2680, 2680, 2680, 2680, 3115, 3130, + 1455, 3115, 3019, 3132, 1455, 2408, 2408, 2408, 2408, 3133, + 3020, 1455, 2751, 2751, 2751, 2751, 2753, 2753, 2753, 2753, + 2763, 2770, 2770, 2770, 2770, 2460, 2460, 2460, 2460, 2764, + 2764, 2764, 2764, 2764, 2805, 2805, 2805, 2805, 1057, 2812, + 2752, 3134, 2812, 2731, 2754, 3135, 2681, 1491, 2787, 2787, + 2787, 2787, 1492, 2818, 3136, 1454, 2818, 1454, 1455, 1454, + 2263, 2263, 2263, 2263, 2263, 2263, 1494, 2711, 2813, 2463, + 2463, 2463, 2463, 1043, 3137, 1064, 1062, 1062, 1062, 1062, + 2855, 2584, 2498, 2855, 2587, 1062, 1062, 1062, 1062, 1062, + + 1062, 1062, 1062, 2589, 1043, 1454, 1064, 2543, 2591, 3041, + 2543, 1043, 3041, 1064, 2594, 3131, 1062, 1062, 1062, 1062, + 1043, 2706, 1064, 2596, 1043, 2598, 1064, 2807, 2807, 2807, + 2807, 2603, 2606, 1451, 1491, 2616, 2228, 3042, 2808, 1492, + 3131, 1043, 1454, 1064, 1454, 1455, 1454, 1493, 1493, 1493, + 1493, 1493, 1493, 1494, 2788, 2789, 1062, 1062, 1062, 1062, + 2790, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1062, 1062, 1062, 2618, 2620, 2622, 2791, 1062, 1062, 1062, + 1062, 1043, 1454, 1064, 2744, 2632, 1043, 2650, 1064, 2659, + 1043, 2663, 1064, 3164, 1043, 3141, 1064, 1062, 1062, 1062, + + 1062, 2665, 1043, 2676, 1064, 1062, 1062, 1062, 1062, 3150, + 1451, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 3164, + 3141, 3181, 1043, 2794, 1064, 2577, 2792, 2795, 2577, 3182, + 1043, 3183, 1064, 3184, 3150, 2793, 1043, 3185, 1064, 3153, + 1043, 3154, 1064, 2796, 1062, 1062, 1062, 1062, 3186, 2802, + 2802, 2802, 2802, 3159, 2267, 2797, 2803, 2803, 2803, 2803, + 1062, 1062, 1062, 1062, 3153, 2579, 3154, 2799, 2579, 1043, + 2890, 1064, 3187, 2890, 1043, 2800, 1064, 2891, 3159, 2798, + 2891, 1043, 3189, 1064, 3190, 1043, 3191, 1064, 1407, 1407, + 1407, 1407, 3175, 3193, 2269, 2678, 2678, 2678, 2678, 2584, + + 2801, 1407, 1407, 1407, 1407, 3194, 2892, 2564, 2564, 2564, + 2564, 2564, 2564, 1409, 1491, 2894, 2804, 3175, 2894, 1492, + 2564, 2564, 2564, 2564, 2564, 2564, 1409, 1947, 1947, 1947, + 1947, 1947, 1947, 1948, 2896, 2898, 2901, 2896, 2898, 2901, + 2903, 3178, 2905, 2903, 2587, 2905, 2601, 2908, 2911, 2601, + 2908, 2911, 2608, 2912, 2916, 2608, 2912, 2916, 2918, 2922, + 3195, 2918, 2922, 2589, 2591, 2594, 3178, 2924, 3196, 2596, + 2924, 2598, 3198, 3199, 3200, 2284, 2603, 2606, 2885, 3201, + 1455, 2289, 2913, 2917, 1455, 1455, 2926, 2919, 2616, 2926, + 1451, 2928, 2929, 1455, 2928, 2929, 2618, 2931, 2626, 2934, + + 2931, 2626, 2934, 2630, 2937, 2634, 2630, 2937, 2634, 2636, + 2638, 2938, 2636, 2638, 2938, 2620, 2641, 3235, 1455, 2641, + 2622, 2930, 2643, 3205, 1455, 2643, 2932, 2304, 2935, 1455, + 1455, 3209, 2308, 2632, 2311, 3203, 1455, 3214, 2313, 2315, + 2939, 2645, 1455, 2940, 2645, 2318, 2940, 2648, 1455, 2943, + 2648, 2320, 2943, 2653, 2945, 2657, 2653, 2945, 2657, 2949, + 2953, 2955, 2949, 2953, 2955, 2668, 2670, 3236, 2668, 2670, + 2322, 2672, 2941, 3204, 2672, 3239, 2325, 2674, 2650, 3206, + 2674, 3211, 2331, 2946, 2335, 3210, 3225, 3213, 2659, 2663, + 2665, 3240, 3241, 2958, 2345, 2347, 2958, 3242, 3245, 3218, + + 2349, 2680, 2680, 2680, 2680, 3250, 2351, 2680, 2680, 2680, + 2680, 2961, 2962, 2963, 2961, 2964, 2964, 2964, 2964, 1455, + 1618, 3253, 2676, 2974, 2974, 2974, 2974, 2975, 2975, 2975, + 2975, 2980, 2980, 2980, 2980, 2680, 2680, 2680, 2680, 2961, + 2962, 2963, 2961, 2964, 2964, 2964, 2964, 2974, 2974, 2974, + 2974, 3026, 1455, 1455, 3026, 3085, 1455, 1455, 3085, 3188, + 1455, 3212, 3188, 1455, 1455, 2975, 2975, 2975, 2975, 2980, + 2980, 2980, 2980, 2751, 2751, 2751, 2751, 1455, 2818, 3255, + 3027, 2818, 1455, 1455, 2813, 1455, 1455, 3031, 3031, 3031, + 3031, 3244, 3032, 2753, 2753, 2753, 2753, 2981, 1491, 3219, + + 3216, 2752, 3188, 1492, 3256, 3188, 1454, 2498, 1454, 1455, + 1454, 2263, 2263, 2263, 2263, 2263, 2263, 1494, 3217, 1455, + 3222, 2754, 3033, 3033, 3033, 3033, 1455, 3034, 3035, 3035, + 3035, 3035, 3229, 3257, 3220, 3017, 3046, 3046, 3046, 3046, + 2770, 2770, 2770, 2770, 3261, 1455, 1454, 3060, 3060, 3060, + 3060, 3264, 2987, 2805, 2805, 2805, 2805, 3124, 3124, 3124, + 3124, 2961, 2962, 2963, 2961, 1455, 2787, 2787, 2787, 2787, + 3063, 3063, 3063, 3063, 1451, 2992, 2992, 2992, 3221, 2992, + 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, + 2992, 1043, 2992, 1064, 2994, 1043, 3226, 1064, 3064, 3064, + + 3064, 3064, 1455, 2992, 2992, 2992, 2992, 2992, 1062, 1062, + 1062, 1062, 3066, 3066, 3066, 3066, 3231, 3139, 3142, 2890, + 3139, 3142, 2890, 1043, 3265, 1064, 1062, 1062, 1062, 1062, + 2992, 1455, 2992, 1043, 3266, 1064, 3282, 1043, 2856, 1064, + 1455, 2856, 1062, 1062, 1062, 1062, 3140, 3143, 2584, 2857, + 1455, 1043, 3145, 1064, 3228, 3145, 3283, 2992, 2992, 2992, + 1491, 1455, 1455, 2813, 3065, 1492, 3284, 1043, 1454, 1064, + 1454, 1455, 1454, 1493, 1493, 1493, 1493, 1493, 1493, 1494, + 3227, 2892, 3067, 3223, 1062, 1062, 1062, 1062, 3070, 3070, + 3070, 3070, 1062, 1062, 1062, 1062, 3074, 3074, 3074, 3074, + + 3285, 3233, 3068, 3095, 3075, 3075, 3075, 3075, 1454, 1043, + 3287, 1064, 3288, 3071, 3232, 1064, 3289, 1043, 3230, 1064, + 3290, 1043, 3291, 1064, 1062, 1062, 1062, 1062, 3023, 1043, + 3292, 1064, 1062, 1062, 1062, 1062, 1451, 1062, 1062, 1062, + 1062, 2802, 2802, 2802, 2802, 2803, 2803, 2803, 2803, 1043, + 3293, 1064, 1062, 1062, 1062, 1062, 3295, 1043, 3069, 1064, + 2894, 3072, 1043, 2894, 1064, 3073, 1043, 3296, 1064, 1833, + 1043, 3299, 1064, 3080, 3080, 3080, 3080, 1043, 3300, 1064, + 2807, 2807, 2807, 2807, 3081, 2896, 3301, 2898, 2896, 2587, + 2898, 2808, 1491, 3077, 3302, 3303, 3146, 1492, 3076, 3146, + + 2901, 3304, 1864, 2901, 3078, 1947, 1947, 1947, 1947, 1947, + 1947, 1948, 2903, 1864, 2589, 2903, 2591, 3305, 3079, 2905, + 3148, 2908, 2905, 3148, 2908, 3147, 3306, 2911, 3152, 2594, + 2911, 3152, 3156, 3158, 2922, 3156, 3158, 2922, 3307, 3297, + 2924, 2596, 2926, 2924, 2928, 2926, 3138, 2928, 2598, 3149, + 2603, 3161, 3163, 3297, 3161, 3163, 2606, 2913, 3308, 3309, + 3310, 2917, 2919, 2616, 3166, 3311, 3312, 3166, 1451, 2618, + 1905, 2620, 2937, 2622, 3168, 2937, 3170, 3168, 1905, 3170, + 2930, 2932, 2943, 3171, 3174, 2943, 3171, 3174, 2949, 3176, + 3313, 2949, 3176, 2935, 2953, 2955, 3179, 2953, 2955, 3179, + + 3314, 2632, 3315, 2939, 2958, 2941, 3286, 2958, 3316, 3286, + 3317, 2650, 3172, 2946, 3318, 3319, 3320, 2659, 3177, 2963, + 2962, 2963, 2963, 2663, 2665, 3180, 2963, 2962, 2963, 2963, + 3321, 2892, 2913, 2676, 2964, 2964, 2964, 2964, 2974, 2974, + 2974, 2974, 3192, 3192, 3192, 3192, 2980, 2980, 2980, 2980, + 3197, 3197, 3197, 3197, 1491, 3031, 3031, 3031, 3031, 1492, + 3032, 2917, 1454, 2919, 1454, 1455, 1454, 2263, 2263, 2263, + 2263, 2263, 2263, 1494, 3215, 3215, 3215, 3215, 3215, 3215, + 3192, 3192, 3192, 3192, 3224, 3224, 3224, 3224, 3197, 3197, + 3197, 3197, 3238, 2930, 2932, 3238, 3246, 1455, 2935, 3246, + + 3041, 1455, 1454, 3041, 3332, 1455, 3033, 3033, 3033, 3033, + 2939, 3034, 3035, 3035, 3035, 3035, 3243, 3243, 3243, 3243, + 3202, 3027, 3085, 3090, 3247, 3085, 3090, 2941, 3042, 3332, + 1451, 2992, 2992, 2992, 2946, 2992, 2992, 2992, 2992, 2992, + 2992, 2992, 2992, 2992, 2992, 2992, 2992, 3349, 2992, 3248, + 2994, 2813, 3248, 3046, 3046, 3046, 3046, 3351, 3352, 2992, + 2992, 2992, 2992, 2992, 3294, 3353, 3249, 3294, 3249, 3249, + 3249, 3249, 3249, 3249, 3251, 3251, 3251, 3251, 3252, 3252, + 3252, 3252, 3254, 3254, 3254, 3254, 2992, 3354, 2992, 3262, + 3262, 3262, 3262, 3355, 3258, 3258, 3258, 3258, 3263, 3263, + + 3263, 3263, 3060, 3060, 3060, 3060, 3356, 3063, 3063, 3063, + 3063, 3357, 3267, 2992, 2992, 2992, 2992, 2992, 2992, 3259, + 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, + 2992, 2992, 1043, 2992, 1064, 3208, 2993, 3064, 3064, 3064, + 3064, 3358, 3361, 2993, 2992, 2992, 2992, 2992, 2992, 1062, + 1062, 1062, 1062, 3066, 3066, 3066, 3066, 3274, 3274, 3274, + 3274, 3362, 1043, 3298, 1064, 3104, 3298, 3260, 3104, 3363, + 3325, 2992, 2993, 2992, 1043, 3364, 1064, 3365, 1043, 1455, + 1064, 1455, 1061, 1062, 1062, 1062, 1062, 3112, 3115, 3392, + 3112, 3115, 3124, 3124, 3124, 3124, 3325, 1455, 2992, 2992, + + 2992, 1491, 3270, 3270, 3270, 3270, 1492, 3268, 1043, 1454, + 1064, 1454, 1455, 1454, 1493, 1493, 1493, 1493, 1493, 1493, + 1494, 1062, 1062, 1062, 1062, 3335, 3370, 3271, 3375, 1064, + 3070, 3070, 3070, 3070, 1062, 1062, 1062, 1062, 3342, 1455, + 3367, 3269, 3276, 3276, 3276, 3276, 1043, 3393, 1064, 1454, + 3335, 3074, 3074, 3074, 3074, 3071, 1455, 1064, 1455, 1043, + 3368, 1064, 1455, 3342, 3234, 3324, 3027, 3277, 3324, 1064, + 3075, 3075, 3075, 3075, 1455, 3272, 1043, 1451, 1064, 1455, + 1455, 3273, 1062, 1062, 1062, 1062, 3279, 3279, 3279, 3279, + 1062, 1062, 1062, 1062, 3140, 1043, 3369, 1064, 3327, 3145, + + 3275, 3327, 3145, 3260, 3374, 3329, 1455, 1043, 3329, 1064, + 3376, 1043, 3384, 1064, 3394, 1043, 3395, 1064, 3281, 3281, + 3281, 3281, 3080, 3080, 3080, 3080, 3188, 3143, 2892, 3188, + 3382, 3385, 3331, 3081, 3147, 3331, 1455, 3152, 3333, 1491, + 3152, 3333, 3278, 1043, 1492, 1064, 3156, 3372, 3158, 3156, + 3280, 3158, 1947, 1947, 1947, 1947, 1947, 1947, 1948, 3336, + 3161, 3149, 3336, 3161, 3396, 3163, 2913, 3334, 3163, 3338, + 3166, 3168, 3338, 3166, 3168, 2917, 1455, 2919, 3170, 3341, + 3174, 3170, 3341, 3174, 3344, 3379, 3397, 3344, 3337, 2930, + 3345, 3399, 3348, 3345, 2932, 3348, 3404, 3405, 3339, 2935, + + 2939, 3350, 3350, 3350, 3350, 3322, 1455, 2941, 3172, 2946, + 1455, 1455, 1455, 3177, 1455, 1451, 1455, 3388, 3406, 3346, + 3410, 3180, 3192, 3192, 3192, 3192, 3359, 3359, 3359, 3359, + 3359, 3359, 3359, 3359, 3360, 3360, 3360, 3360, 3197, 3197, + 3197, 3197, 3350, 3350, 3350, 3350, 3371, 3371, 3371, 3371, + 1455, 3381, 1455, 3373, 3380, 3383, 3411, 3386, 3415, 1455, + 3417, 3387, 3431, 1455, 3215, 3215, 3215, 3215, 3215, 3215, + 3377, 3377, 3377, 3377, 3359, 3359, 3359, 3359, 3359, 3359, + 3359, 3359, 3360, 3360, 3360, 3360, 1618, 1455, 3432, 3286, + 3433, 1455, 3286, 3434, 3436, 1455, 3434, 3390, 3437, 1455, + + 3438, 3389, 3439, 3193, 1491, 3238, 3440, 3246, 3238, 1492, + 3246, 3442, 1454, 3443, 1454, 1455, 1454, 2263, 2263, 2263, + 2263, 2263, 2263, 1494, 3243, 3243, 3243, 3243, 3444, 3435, + 3294, 3378, 3435, 3294, 3027, 3247, 3400, 3441, 3298, 3400, + 3441, 3298, 3398, 3445, 3248, 1864, 3446, 3248, 3447, 3446, + 3451, 3225, 1454, 3401, 3366, 3401, 3401, 3401, 3401, 3401, + 3401, 3249, 1905, 3249, 3249, 3249, 3249, 3249, 3249, 3251, + 3251, 3251, 3251, 3252, 3252, 3252, 3252, 3453, 3455, 3456, + 1451, 2992, 2992, 2992, 3457, 2992, 2992, 2992, 2992, 2992, + 2992, 2992, 2992, 2992, 2992, 2992, 2992, 3140, 2992, 3402, + + 3208, 2993, 3402, 3254, 3254, 3254, 3254, 3143, 2993, 2992, + 2992, 2992, 2992, 2992, 3448, 3147, 3249, 3448, 3249, 3249, + 3249, 3249, 3249, 3249, 3149, 3449, 3407, 3407, 3407, 3407, + 3258, 3258, 3258, 3258, 3172, 3461, 2992, 2993, 2992, 3274, + 3274, 3274, 3274, 3177, 3412, 3412, 3412, 3412, 3180, 3450, + 3452, 3408, 3450, 3452, 3473, 3259, 3262, 3262, 3262, 3262, + 3461, 3474, 3477, 2992, 2992, 2992, 2992, 2992, 2992, 3413, + 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, + 2992, 2992, 3478, 2992, 3480, 3208, 2993, 3263, 3263, 3263, + 3263, 3481, 3482, 2993, 2992, 2992, 2992, 2992, 2992, 3409, + + 3470, 3483, 3484, 3260, 3414, 3414, 3414, 3414, 3416, 3416, + 3416, 3416, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, + 1455, 2992, 2993, 2992, 1455, 3470, 1455, 3270, 3270, 3270, + 3270, 1455, 3420, 3420, 3420, 3420, 1455, 1043, 1455, 1064, + 3516, 1043, 3517, 1064, 3274, 3274, 3274, 3274, 2992, 2992, + 2992, 1491, 3271, 1455, 1064, 1455, 1492, 1061, 3520, 1454, + 1455, 1454, 1455, 1454, 1493, 1493, 1493, 1493, 1493, 1493, + 1494, 3498, 3418, 3492, 3490, 3501, 3419, 1062, 1062, 1062, + 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 1062, 3276, + 3276, 3276, 3276, 3424, 3424, 3424, 3424, 3488, 3491, 1454, + + 3409, 3504, 1043, 3522, 1064, 3497, 1043, 3499, 1064, 1455, + 1043, 3526, 1064, 3527, 3277, 1455, 1064, 3391, 1061, 3425, + 3425, 3425, 3425, 3279, 3279, 3279, 3279, 1451, 3429, 3429, + 3429, 3429, 3281, 3281, 3281, 3281, 3430, 3430, 3430, 3430, + 3422, 3528, 3324, 3421, 1043, 3324, 3426, 1491, 1043, 3529, + 1064, 1455, 1492, 1043, 3423, 1064, 1455, 1043, 3502, 1064, + 1947, 1947, 1947, 1947, 1947, 1947, 1948, 1455, 1455, 3530, + 3459, 3140, 3327, 3459, 3329, 3327, 3331, 3329, 3541, 3331, + 1722, 1044, 3463, 3427, 3464, 3463, 3467, 3464, 3469, 3467, + 3341, 3469, 3344, 3341, 3505, 3344, 3428, 3458, 1052, 3460, + + 1618, 3143, 3542, 3147, 3472, 3149, 3348, 3472, 1455, 3348, + 3503, 3334, 3545, 3465, 3546, 3337, 3507, 3339, 3500, 3172, + 3548, 3177, 3551, 1451, 3350, 3350, 3350, 3350, 3479, 3479, + 3479, 3479, 1864, 3346, 1905, 3180, 3359, 3359, 3359, 3359, + 3360, 3360, 3360, 3360, 3485, 3485, 3485, 3485, 3486, 3486, + 3486, 3486, 1491, 3402, 3555, 3521, 3402, 1492, 3506, 3455, + 1454, 3556, 1454, 1455, 1454, 2263, 2263, 2263, 2263, 2263, + 2263, 1494, 3479, 3479, 3479, 3479, 3485, 3485, 3485, 3485, + 3486, 3486, 3486, 3486, 3400, 3532, 3557, 3400, 3544, 1455, + 3334, 3544, 3523, 1455, 3533, 3523, 3434, 1455, 3337, 3434, + + 1454, 3401, 3561, 3401, 3401, 3401, 3401, 3401, 3401, 3401, + 3339, 3401, 3401, 3401, 3401, 3401, 3401, 3346, 3567, 3568, + 3487, 3420, 3420, 3420, 3420, 3571, 3574, 3561, 1451, 3475, + 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475, + 3475, 3475, 3475, 3475, 3475, 3493, 3475, 3493, 3494, 3493, + 3412, 3412, 3412, 3412, 3576, 1455, 3493, 3475, 3475, 3475, + 3475, 3475, 3407, 3407, 3407, 3407, 3424, 3424, 3424, 3424, + 3531, 3531, 3531, 3531, 3435, 3413, 1455, 3435, 3414, 3414, + 3414, 3414, 3592, 3508, 3475, 3493, 3475, 3408, 3416, 3416, + 3416, 3416, 3420, 3420, 3420, 3420, 3424, 3424, 3424, 3424, + + 3430, 3430, 3430, 3430, 3543, 3543, 3543, 3543, 1455, 3598, + 1455, 3475, 3475, 3475, 3476, 3476, 3476, 3476, 3476, 3476, + 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, + 3495, 3476, 3495, 3496, 3495, 3409, 1044, 3547, 3427, 1455, + 3547, 3495, 3476, 3476, 3476, 3476, 3476, 3534, 3534, 3534, + 3534, 3428, 3578, 1052, 3535, 3535, 3535, 3535, 3425, 3425, + 3425, 3425, 3429, 3429, 3429, 3429, 3580, 1455, 3599, 3476, + 3495, 3476, 1043, 3549, 1064, 3441, 3549, 3552, 3441, 1043, + 3552, 1064, 3602, 1043, 3606, 3426, 3610, 1043, 3446, 1064, + 3553, 3446, 3448, 3553, 3579, 3448, 3476, 3476, 3476, 3508, + + 3508, 3508, 3554, 3449, 3508, 3508, 3508, 3509, 3508, 3508, + 3508, 3508, 3510, 3508, 3508, 3511, 3583, 3511, 1455, 3511, + 3512, 3512, 3512, 3512, 3512, 3512, 3513, 3508, 3508, 3508, + 3508, 3508, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, + 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, + 3514, 3514, 3514, 3514, 3508, 3511, 3508, 3514, 3514, 3514, + 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, + 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, + 3514, 3508, 3508, 3515, 3518, 3518, 3518, 3519, 3518, 3518, + 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3518, + + 3518, 3518, 3518, 3518, 3519, 1062, 1062, 1062, 1062, 3613, + 2132, 3518, 3518, 3519, 3518, 3518, 3518, 3537, 3537, 3537, + 3537, 1062, 1062, 1062, 1062, 3450, 3452, 3624, 3450, 3452, + 1043, 3560, 1064, 3463, 3560, 1455, 3463, 3625, 1491, 3518, + 3519, 3518, 3538, 1492, 1064, 3626, 1043, 3563, 1064, 3460, + 3563, 1947, 1947, 1947, 1947, 1947, 1947, 1948, 3467, 3465, + 3460, 3467, 3334, 1455, 1455, 3632, 3518, 3518, 3518, 3469, + 3564, 1455, 3469, 3564, 3536, 3472, 3465, 3635, 3472, 3566, + 3566, 3566, 3566, 3479, 3479, 3479, 3479, 3337, 1952, 1454, + 3539, 3570, 3570, 3570, 3570, 3540, 1454, 3586, 3339, 3565, + + 3572, 3572, 3572, 3572, 3346, 1455, 3558, 3485, 3485, 3485, + 3485, 3582, 1952, 1454, 1451, 3486, 3486, 3486, 3486, 1491, + 1454, 3591, 3581, 3523, 1492, 1454, 3523, 1454, 3576, 1454, + 1455, 1454, 2263, 2263, 2263, 2263, 2263, 2263, 1494, 3566, + 3566, 3566, 3566, 3570, 3570, 3570, 3570, 1618, 3587, 1454, + 3595, 3572, 3572, 3572, 3572, 3544, 1455, 1455, 3544, 3619, + 1455, 3547, 3619, 2034, 3547, 3645, 1455, 1454, 1455, 3600, + 3600, 3600, 3600, 3604, 3604, 3604, 3604, 3605, 3605, 3605, + 3605, 1455, 3575, 3531, 3531, 3531, 3531, 3611, 3611, 3611, + 3611, 3543, 3543, 3543, 3543, 1451, 3569, 3569, 3569, 3569, + + 3569, 3569, 3569, 3569, 3569, 3569, 3569, 3569, 3569, 3569, + 3569, 3569, 3584, 3569, 3584, 3585, 3584, 3640, 3620, 3549, + 3601, 3620, 3549, 3584, 3569, 3569, 3569, 3569, 3569, 3607, + 3607, 3607, 3607, 3534, 3534, 3534, 3534, 3535, 3535, 3535, + 3535, 1062, 1062, 1062, 1062, 3537, 3537, 3537, 3537, 3649, + 3653, 3569, 3584, 3569, 3608, 3654, 3623, 3658, 1043, 3623, + 1064, 3659, 1043, 2034, 1064, 3661, 1043, 3612, 1064, 3662, + 3538, 3663, 1064, 3633, 3633, 3633, 3633, 1455, 3569, 3569, + 3569, 3573, 3573, 3573, 3573, 3573, 3573, 3573, 3573, 3573, + 3573, 3573, 3573, 3573, 3573, 3573, 3573, 3589, 3573, 3589, + + 3590, 3589, 3609, 3615, 3615, 3615, 3615, 1455, 3589, 3573, + 3573, 3573, 3573, 3573, 3553, 3614, 3638, 3553, 3609, 1062, + 1062, 1062, 1062, 3664, 3560, 3532, 3554, 3560, 1061, 3628, + 3563, 3631, 3628, 3563, 3631, 3670, 3573, 3589, 3573, 3572, + 3572, 3572, 3572, 3655, 1043, 3671, 1064, 3565, 3637, 3600, + 3600, 3600, 3600, 3460, 3619, 3675, 2034, 3619, 3629, 3465, + 3565, 3676, 1455, 3573, 3573, 3573, 3508, 3508, 3508, 3645, + 3649, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3592, + 3508, 3508, 3508, 3688, 3508, 3616, 3508, 3508, 3508, 3508, + 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3593, + + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3508, 3508, 3508, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3508, 3508, + 3515, 3508, 3508, 3508, 1455, 1455, 3508, 3508, 3508, 3508, + 3508, 3508, 3508, 3508, 3592, 3508, 3508, 1952, 1454, 1455, + 1455, 3633, 3633, 3633, 3633, 1454, 1952, 1454, 1455, 3508, + 3508, 3508, 3508, 3508, 1454, 1455, 3620, 1455, 1455, 3620, + 1618, 3604, 3604, 3604, 3604, 3596, 3639, 1455, 3641, 3605, + + 3605, 3605, 3605, 3690, 1454, 3691, 3508, 3693, 3508, 3615, + 3615, 3615, 3615, 1454, 3615, 3615, 3615, 3615, 3623, 3669, + 3647, 3623, 3669, 3694, 3644, 3633, 3633, 3633, 3633, 3695, + 3681, 3510, 3629, 3508, 3508, 3508, 3508, 3508, 3508, 3682, + 3680, 3508, 3508, 3508, 3509, 3508, 3508, 3508, 3508, 3596, + 3508, 3508, 3511, 3660, 3511, 1455, 3511, 3512, 3512, 3512, + 3512, 3512, 3512, 3513, 3508, 3508, 3508, 3508, 3508, 3514, + 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, + 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, + 3514, 3508, 3511, 3508, 3514, 3514, 3514, 3514, 3514, 3514, + + 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, + 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3508, 3508, + 3515, 3508, 3508, 3508, 3596, 3592, 3508, 3508, 3508, 3508, + 3508, 3508, 3508, 3508, 3592, 3508, 3508, 3596, 1455, 3686, + 1455, 1062, 1062, 1062, 1062, 1618, 3688, 3713, 3597, 3508, + 3508, 3508, 3508, 3508, 1455, 1455, 1491, 3607, 3607, 3607, + 3607, 1492, 3611, 3611, 3611, 3611, 1043, 1455, 1064, 1947, + 1947, 1947, 1947, 1947, 1947, 1948, 3508, 3674, 3508, 3596, + 3674, 3596, 3608, 1062, 1062, 1062, 1062, 3679, 1062, 1062, + 1062, 1062, 1455, 3667, 3667, 3667, 3667, 3631, 3685, 3669, + + 3631, 3709, 3669, 3508, 3508, 3508, 3629, 3719, 1043, 3726, + 1064, 3692, 1618, 1043, 3617, 1064, 3683, 1455, 3668, 3627, + 1064, 1952, 1454, 3729, 3674, 1455, 3565, 3674, 3711, 1454, + 3609, 3706, 1451, 1491, 3704, 3704, 3704, 3704, 1492, 1455, + 3689, 1454, 3612, 1454, 1455, 1454, 2263, 2263, 2263, 2263, + 2263, 2263, 1494, 3629, 3736, 1455, 3665, 3666, 1454, 3684, + 3684, 3684, 3684, 3723, 3696, 3696, 3696, 3696, 3708, 1491, + 3698, 3698, 3698, 3698, 1492, 3596, 1455, 1062, 1062, 1062, + 1062, 1454, 1947, 1947, 1947, 1947, 1947, 1947, 1948, 3697, + 3705, 3705, 3705, 3705, 1455, 3699, 3707, 1064, 3744, 3636, + + 3724, 1455, 1043, 3747, 1064, 3701, 3701, 3701, 3701, 1451, + 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, + 3634, 3634, 3634, 3634, 3634, 3634, 3642, 3634, 3642, 3643, + 3642, 3667, 3667, 3667, 3667, 3672, 3727, 3642, 3634, 3634, + 3634, 3634, 3634, 1455, 1455, 1451, 3701, 3701, 3701, 3701, + 3722, 3700, 3704, 3704, 3704, 3704, 3668, 3725, 1064, 3705, + 3705, 3705, 3705, 3750, 3753, 3634, 3642, 3634, 3755, 1455, + 3510, 1061, 3701, 3701, 3701, 3701, 1455, 3704, 3704, 3704, + 3704, 3720, 3720, 3720, 3720, 1450, 1950, 3717, 3717, 3717, + 3717, 3746, 3634, 3634, 3634, 3508, 3508, 3508, 3489, 3732, + + 3508, 3508, 3508, 3509, 3508, 3508, 3508, 3508, 3596, 3508, + 3508, 3508, 3718, 3508, 3588, 3508, 3650, 3650, 3650, 3650, + 3650, 3650, 3651, 3508, 3508, 3508, 3508, 3508, 3652, 3652, + 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, + 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, + 3508, 3508, 3508, 3652, 3652, 3652, 3652, 3652, 3652, 3652, + 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3652, + 3652, 3652, 3652, 3652, 3652, 3652, 3652, 3508, 3508, 3515, + 3508, 3508, 3508, 2484, 2483, 3508, 3508, 3508, 3508, 3508, + 3508, 3508, 3508, 3592, 3508, 3508, 3511, 2482, 3511, 1455, + + 3511, 3511, 3511, 3511, 3511, 3511, 3511, 3511, 3508, 3508, + 3508, 3508, 3508, 3656, 3656, 3656, 3656, 3656, 3656, 3656, + 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, + 3656, 3656, 3656, 3656, 3656, 3508, 3511, 3508, 3656, 3656, + 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, + 3656, 3657, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, + 3656, 3656, 3508, 3508, 3515, 3508, 3508, 3508, 2481, 2461, + 3508, 3508, 3508, 3509, 3508, 3508, 3508, 3508, 3510, 3508, + 3508, 3511, 2459, 3511, 1455, 3511, 3677, 3677, 3677, 3677, + 3677, 3677, 3513, 3508, 3508, 3508, 3508, 3508, 3678, 3678, + + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3508, 3511, 3508, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3678, + 3678, 3678, 3678, 3678, 3678, 3678, 3678, 3508, 3508, 3515, + 3702, 3702, 3703, 3703, 3702, 3703, 3702, 3702, 3702, 3702, + 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, 3702, + 3703, 3696, 3696, 3696, 3696, 3596, 1455, 3702, 3702, 3702, + 3702, 3702, 3702, 3698, 3698, 3698, 3698, 3720, 3720, 3720, + 3720, 3717, 3717, 3717, 3717, 1455, 3697, 3720, 3720, 3720, + + 3720, 3730, 3730, 3730, 3730, 3702, 3703, 3702, 3699, 1021, + 1064, 1450, 1061, 1450, 1021, 1950, 3718, 1450, 1058, 1450, + 3737, 2458, 3734, 3734, 3734, 3734, 3731, 1950, 1064, 1058, + 2457, 2456, 3702, 3702, 3702, 3508, 3508, 3508, 3733, 1455, + 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3592, 3508, + 3508, 3508, 3735, 3508, 2455, 3508, 3508, 3508, 3508, 3508, + 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3508, 3508, 3508, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + + 3593, 3593, 3593, 3593, 3593, 3593, 3710, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3508, 3508, 3515, + 3714, 3714, 3714, 3715, 3714, 3714, 3714, 3714, 3714, 3714, + 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714, 3714, + 3714, 1062, 1062, 1062, 1062, 1455, 3596, 3714, 3714, 3714, + 3714, 3714, 3714, 3738, 3738, 3738, 3738, 3730, 3730, 3730, + 3730, 3740, 3740, 3740, 3740, 3596, 1043, 3596, 1064, 1455, + 3742, 3742, 3742, 3742, 1455, 3714, 3716, 3714, 3739, 1019, + 1019, 1019, 3731, 2454, 1064, 2453, 1061, 1455, 3743, 3743, + 3743, 3743, 2452, 1005, 3741, 3738, 3738, 3738, 3738, 1019, + + 2451, 1005, 3714, 3714, 3714, 1455, 1005, 2450, 2449, 3745, + 3740, 3740, 3740, 3740, 3721, 3740, 3740, 3740, 3740, 1092, + 3739, 1187, 1205, 3748, 1092, 3749, 1187, 1205, 3751, 1318, + 2448, 3752, 3754, 3754, 3754, 3754, 1319, 1318, 1352, 1358, + 1352, 1319, 1318, 1582, 1358, 1352, 2447, 2446, 1582, 1455, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, + + 286, 286, 286, 286, 286, 286, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 291, 291, 291, 291, 321, 321, 321, 321, 321, 321, + 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, + 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, + 321, 321, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + + 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 389, 389, 389, 389, 405, 405, + 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, + 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, + 405, 405, 405, 405, 405, 405, 412, 412, 412, 412, + 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 412, 412, 412, 412, 412, 412, 412, 412, + 412, 412, 412, 412, 418, 418, 418, 418, 418, 418, + 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, + 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, + + 418, 418, 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 466, 466, + 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, + 466, 466, 466, 466, 466, 466, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, + + 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, + 472, 472, 472, 472, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, + 478, 478, 484, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, + 484, 484, 484, 484, 484, 484, 484, 484, 484, 484, + 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, + 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, + 493, 493, 493, 493, 493, 493, 493, 493, 506, 506, + + 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, + 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, + 506, 506, 506, 506, 506, 506, 519, 519, 519, 519, + 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, + 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, + 519, 519, 519, 519, 533, 533, 533, 533, 533, 533, + 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + 533, 533, 540, 540, 540, 540, 540, 540, 540, 540, + 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, + + 540, 540, 540, 540, 540, 540, 540, 540, 540, 540, + 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, + 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, + 563, 563, 563, 563, 563, 563, 563, 563, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, + 570, 570, 570, 570, 570, 570, 594, 594, 594, 594, + 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, + 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, + 594, 594, 594, 594, 600, 600, 600, 600, 600, 600, + + 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, + 600, 600, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, + 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, + 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, + 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, + 624, 624, 624, 624, 624, 624, 624, 624, 631, 631, + 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, + 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, + + 631, 631, 631, 631, 631, 631, 647, 647, 647, 647, + 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, + 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, + 647, 647, 647, 647, 654, 654, 654, 654, 654, 654, + 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, + 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, + 654, 654, 662, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, + 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, + + 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, + 669, 669, 669, 669, 669, 669, 669, 669, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 674, 674, 683, 683, 683, 683, + 683, 683, 683, 683, 683, 683, 683, 683, 683, 683, + 683, 683, 683, 683, 683, 683, 683, 683, 683, 683, + 683, 683, 683, 683, 693, 693, 693, 693, 693, 693, + 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, + 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, + + 693, 693, 706, 706, 706, 706, 706, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, + 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, + 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, + 714, 714, 714, 714, 714, 714, 714, 714, 716, 716, + 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, + 716, 716, 716, 716, 716, 716, 723, 723, 723, 723, + 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, + + 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, + 723, 723, 723, 723, 727, 727, 727, 727, 727, 727, + 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, + 727, 727, 727, 727, 727, 727, 727, 727, 727, 727, + 727, 727, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, + 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, + 744, 744, 744, 744, 744, 744, 744, 744, 744, 744, + 744, 744, 744, 744, 744, 744, 744, 744, 749, 749, + + 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, + 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, + 749, 749, 749, 749, 749, 749, 769, 769, 769, 769, + 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, + 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, + 769, 769, 769, 769, 778, 778, 778, 778, 778, 778, + 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, + 778, 778, 778, 778, 778, 778, 778, 778, 778, 778, + 778, 778, 799, 799, 799, 799, 799, 799, 799, 799, + 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, + + 799, 799, 799, 799, 799, 799, 799, 799, 799, 799, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 806, 806, + 806, 806, 806, 806, 806, 806, 806, 806, 814, 814, + 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 814, 814, 818, 818, 818, 818, + 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, + 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, + 818, 818, 818, 818, 821, 821, 821, 821, 821, 821, + + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 824, 824, 824, 824, 824, 824, 824, 824, + 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, + 824, 824, 824, 824, 824, 824, 824, 824, 824, 824, + 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, + 833, 833, 833, 833, 833, 833, 833, 833, 833, 833, + 833, 833, 833, 833, 833, 833, 833, 833, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + 836, 836, 836, 836, 836, 836, 836, 836, 836, 836, + + 836, 836, 836, 836, 836, 836, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 844, 844, 844, 844, 844, 844, + 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, + 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, + 844, 844, 847, 847, 847, 847, 847, 847, 847, 847, + 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, + 847, 847, 847, 847, 847, 847, 847, 847, 847, 847, + 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, + + 852, 852, 852, 852, 852, 852, 852, 852, 852, 852, + 852, 852, 852, 852, 852, 852, 852, 852, 854, 854, + 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, + 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, + 854, 854, 854, 854, 854, 854, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 865, 865, 865, 865, 865, 865, + 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, + 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, + + 865, 865, 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, + 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, + 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, 871, 871, + 871, 871, 871, 871, 871, 871, 871, 871, 874, 874, + 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, + 874, 874, 874, 874, 874, 874, 874, 874, 874, 874, + 874, 874, 874, 874, 874, 874, 877, 877, 877, 877, + 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, + + 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, + 877, 877, 877, 877, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 890, 890, 890, 890, 890, 890, 890, 890, + 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, + 890, 890, 890, 890, 890, 890, 890, 890, 890, 890, + 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, + 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, + 899, 899, 899, 899, 899, 899, 899, 899, 901, 901, + + 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, + 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, + 901, 901, 901, 901, 901, 901, 911, 911, 911, 911, + 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, + 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, + 911, 911, 911, 911, 917, 917, 917, 917, 917, 917, + 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, + 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, + 917, 917, 927, 927, 927, 927, 927, 927, 927, 927, + 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, + + 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, + 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, + 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, + 930, 930, 930, 930, 930, 930, 930, 930, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 936, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 942, 942, 942, 942, 942, 942, + 942, 942, 942, 942, 948, 948, 948, 948, 948, 948, + + 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 948, 948, 948, 948, 948, 948, 948, 948, + 948, 948, 956, 956, 956, 956, 956, 956, 956, 956, + 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, + 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, + 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, + 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, + 953, 953, 953, 953, 953, 953, 953, 953, 968, 968, + 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, + 968, 968, 968, 968, 968, 968, 968, 968, 968, 968, + + 968, 968, 968, 968, 968, 968, 977, 977, 977, 977, + 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, + 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, + 977, 977, 977, 977, 985, 985, 985, 985, 985, 985, + 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, + 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, + 985, 985, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1016, 1016, + 1016, 2445, 1081, 1081, 1081, 1089, 1089, 1089, 1128, 1128, + 1128, 2444, 2443, 1016, 1016, 1134, 1134, 1134, 1016, 1024, + 1024, 1024, 1081, 2442, 2441, 1089, 2438, 2437, 1128, 1288, + 1288, 1288, 1307, 1307, 1307, 1134, 1416, 1416, 1416, 1024, + 2436, 3403, 1429, 1024, 1028, 1028, 1028, 1429, 1429, 1288, + 1453, 2435, 1307, 1453, 2105, 2432, 1416, 2432, 1453, 1028, + 1028, 3403, 1522, 1522, 1028, 1034, 1034, 1522, 1034, 1034, + 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, + + 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, 1034, + 1034, 1034, 1034, 1063, 1063, 1063, 2431, 1528, 1528, 1528, + 1640, 1640, 1640, 1616, 1656, 1656, 1648, 1656, 1063, 1063, + 1063, 1648, 1656, 1063, 1086, 1086, 1086, 1528, 1616, 1667, + 1640, 1699, 1706, 1616, 1667, 1005, 1699, 1706, 2430, 1086, + 1086, 1086, 1021, 1005, 1086, 1111, 1111, 1021, 1005, 2427, + 1111, 1111, 2425, 1111, 1111, 1111, 1111, 1111, 1111, 1111, + 2424, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1111, + 2423, 2420, 1111, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + + 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + 1112, 1116, 1116, 2419, 2418, 1116, 1116, 1116, 1116, 1116, + 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, + 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1118, + 1118, 2416, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, + 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, + 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1126, 1126, 1126, + 2415, 1019, 1019, 1019, 1081, 1081, 1081, 1089, 1089, 1089, + 1092, 1796, 1126, 1126, 2377, 1092, 1796, 1126, 1132, 1132, + 1132, 1019, 2376, 1800, 1081, 1187, 1205, 1089, 1800, 2375, + + 1187, 1205, 1880, 1132, 1132, 2374, 1887, 1880, 1132, 1135, + 1135, 1887, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, + 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, + 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1151, 1151, 2373, + 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, + 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, + 1151, 1151, 1151, 1151, 1151, 1157, 1157, 2372, 1157, 1157, + 1157, 1157, 1157, 1157, 1157, 2368, 1157, 1157, 1157, 1157, + 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, 1157, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + + 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, + 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, + 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1172, 2367, 1318, + 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1318, 1172, 1172, + 1172, 1172, 1318, 1172, 1172, 1172, 1172, 1172, 1172, 1172, + + 2366, 1172, 1172, 1172, 1172, 1173, 1173, 1173, 1173, 1173, + 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, + 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, + 1173, 1173, 1173, 1188, 1188, 2363, 1188, 1188, 1188, 1188, + 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, + 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, + 1188, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, + 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, + 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1195, + 1195, 2362, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1254, 1254, 1254, 1254, 1254, + 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + 1254, 1254, 1254, 1259, 1128, 1128, 1128, 2361, 2360, 1134, + 1134, 1134, 1259, 1288, 1288, 1288, 2359, 2358, 1259, 1307, + 1307, 1307, 1259, 1259, 1128, 1259, 1286, 1286, 1286, 1134, + + 1319, 3524, 1358, 1288, 2357, 1319, 1352, 1358, 1352, 1307, + 1933, 1286, 1286, 1352, 2071, 1933, 1286, 1291, 1291, 2071, + 1291, 3524, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1292, 2356, 1292, 1292, 1292, + 1292, 1292, 2355, 2354, 2353, 1292, 2265, 1292, 1296, 1296, + 2262, 1296, 2261, 1296, 1296, 1296, 1296, 1296, 1296, 1296, + 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, + 1296, 1296, 1296, 1296, 1296, 1296, 1297, 2259, 1297, 1297, + 1297, 1297, 1297, 1259, 2258, 2257, 1297, 2256, 1297, 1305, + + 1305, 1305, 1259, 1453, 1429, 2255, 1453, 1582, 1259, 1429, + 1429, 1453, 1582, 1259, 1305, 1305, 2254, 1522, 1522, 1305, + 1353, 1353, 1522, 1353, 1353, 1353, 1353, 1353, 1353, 1353, + 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, + 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1354, 1354, + 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, + 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, + 1354, 1354, 1354, 1354, 1354, 1354, 1359, 1359, 1359, 1359, + 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, + 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, + + 1359, 1359, 1359, 1359, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, + 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, + 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, + 1381, 1381, 2253, 1381, 1381, 1381, 1381, 1381, 1381, 1381, + 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, + 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1391, 1391, + 2252, 1391, 2251, 1391, 1391, 1391, 1391, 1391, 1391, 1391, + + 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, + 1391, 1391, 1391, 1391, 1391, 1391, 1392, 1430, 1392, 1392, + 1392, 1392, 1392, 1935, 2247, 2246, 1392, 2245, 1392, 1394, + 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, + 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, + 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1396, 1396, 1396, + 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, + 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, + 1396, 1396, 1396, 1396, 1396, 1401, 1401, 1918, 1401, 2243, + 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, + + 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, + 1401, 1401, 1401, 1402, 2242, 1402, 1402, 1402, 1402, 1402, + 2241, 2240, 2239, 1402, 2238, 1402, 1404, 1404, 2237, 1404, + 1905, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, + 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, + 1404, 1404, 1404, 1404, 1405, 2236, 1405, 1405, 1405, 1405, + 1405, 1416, 1416, 1416, 1405, 1934, 1405, 1410, 1410, 1410, + 1934, 1616, 2235, 1934, 1528, 1528, 1528, 1640, 1640, 1640, + 2092, 1416, 1410, 1410, 2232, 2092, 1616, 1410, 1414, 1414, + 1414, 1616, 2231, 1648, 1528, 2230, 1667, 1640, 1648, 1656, + + 1656, 1667, 1656, 1414, 1414, 1905, 2229, 1656, 1414, 1428, + 1428, 1428, 1699, 2226, 1428, 1706, 1796, 1699, 1428, 1800, + 1706, 1796, 2225, 1880, 1800, 1019, 1019, 1019, 1880, 1428, + 1431, 2224, 2223, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 1019, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 2222, 1431, 1431, 1431, 1431, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1454, 2190, 1454, 1454, + 1454, 1454, 1454, 1024, 1024, 1024, 1454, 2185, 1454, 1495, + + 2219, 1887, 1495, 2218, 2217, 1495, 1887, 1495, 1495, 1495, + 1495, 1495, 2216, 1024, 1933, 1495, 2215, 1495, 1864, 1933, + 2211, 1495, 1520, 1520, 2209, 1520, 1520, 1520, 1520, 1520, + 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, + 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, + 1526, 1526, 1526, 1081, 1081, 1081, 1934, 2071, 2092, 1864, + 2208, 1934, 2071, 2092, 1934, 1526, 1526, 3525, 2207, 3603, + 1526, 1534, 3525, 1081, 3603, 1534, 1534, 1534, 1534, 1534, + 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, + 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1535, + + 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, + 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, + 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1539, 2206, 2205, + 2203, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1540, 1540, 1540, 1540, 1540, + 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, + 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, + 1540, 1540, 1540, 1544, 2202, 1833, 2201, 1544, 1544, 1544, + 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, + + 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, + 1544, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1549, + 1549, 2200, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + 1549, 1549, 1549, 1549, 2199, 1549, 1549, 3525, 1549, 1549, + 1549, 1549, 3525, 1549, 1549, 1549, 1549, 1550, 1550, 1550, + 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, + 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, + 1550, 1550, 1550, 1550, 1550, 1561, 2198, 2197, 1561, 1561, + + 2196, 1561, 2195, 1561, 1561, 1561, 1561, 1561, 1089, 1089, + 1089, 1561, 2194, 2193, 1128, 1128, 1128, 1561, 1564, 1564, + 2192, 2188, 1656, 1656, 1564, 1656, 1564, 1564, 1089, 2187, + 1656, 1564, 1565, 1565, 1128, 1565, 2184, 1565, 1565, 1565, + 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, + 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, + 1566, 2183, 1566, 1566, 1566, 1566, 1566, 2182, 2181, 1845, + 1566, 1835, 1566, 1568, 1568, 2179, 1568, 1827, 1568, 1568, + 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, + 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, + + 1568, 1569, 1189, 1569, 1569, 1569, 1569, 1569, 1134, 1134, + 1134, 1569, 1816, 1569, 1573, 2177, 1573, 1573, 1573, 1573, + 2176, 1811, 1810, 2173, 1573, 1575, 2170, 2170, 1134, 2169, + 2166, 1575, 2166, 1575, 1575, 1575, 1575, 1575, 2165, 2164, + 1575, 1575, 2163, 2162, 2109, 2160, 2109, 1575, 1577, 1577, + 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, + 1577, 1577, 1577, 1577, 1577, 1577, 2141, 1577, 1577, 1577, + 1577, 1577, 1577, 1577, 1577, 1577, 1578, 1578, 1578, 1578, + 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, + 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, + + 1578, 1578, 1578, 1578, 1583, 2137, 2136, 2135, 1583, 1583, + 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, + 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, + 1583, 1583, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, + 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, + 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, + 1588, 2134, 2133, 2130, 1588, 1588, 1588, 1588, 1588, 1588, + 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, + 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1589, 1589, + 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, + + 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, + 1589, 1589, 1589, 1589, 1589, 1589, 1593, 2129, 2126, 2125, + 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, + 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, + 1593, 1593, 1593, 1593, 1594, 1594, 1594, 1594, 1594, 1594, + 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, + 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, + 1594, 1594, 1598, 2122, 2121, 2120, 1598, 1598, 1598, 1598, + 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, + 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, + + 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, + 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, + 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1606, 1606, + 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, + 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, + 1606, 1606, 1606, 1606, 1606, 1606, 1609, 1609, 1609, 1609, + 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, + 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, + 1609, 1609, 1609, 1609, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 2115, 1617, 1617, + 1617, 1617, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, + 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, + 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, + 1627, 1627, 2115, 1627, 2114, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1628, 2113, + 1628, 1628, 1628, 1628, 1628, 2112, 2111, 1026, 1628, 2109, + 1628, 1630, 1630, 2108, 1630, 1630, 1630, 1630, 1630, 1630, + 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, + + 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1631, + 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, + 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, + 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1638, 1638, 1638, + 1656, 1656, 2107, 1656, 2106, 2100, 1656, 1656, 1656, 1656, + 2099, 1669, 1638, 1638, 1656, 1001, 1669, 1638, 1641, 1641, + 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, + 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, + 1641, 1641, 1641, 1641, 1641, 1641, 1643, 1643, 1643, 1643, + 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, + + 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, + 1643, 1643, 1643, 1643, 1649, 1649, 1649, 1649, 1649, 1649, + 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, + 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, + 1649, 1649, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, + 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, + 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, + 1659, 1659, 1669, 1659, 2098, 1659, 1659, 1659, 1659, 1659, + 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, + 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1660, 2097, + + 1660, 1660, 1660, 1660, 1660, 2096, 2095, 1650, 1660, 1650, + 1660, 1662, 1662, 1001, 1662, 1650, 1662, 1662, 1662, 1662, + 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, + 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1663, + 1650, 1663, 1663, 1663, 1663, 1663, 1001, 1637, 2088, 1663, + 2087, 1663, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, + 1668, 1668, 1618, 1668, 1668, 1668, 1668, 1668, 1668, 1668, + 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, + 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, + 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, + + 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1677, 1677, 1618, 1677, + 1618, 1677, 1677, 1001, 1677, 1677, 1677, 1677, 1677, 1677, + 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1618, + 1677, 1677, 1677, 1677, 1678, 1678, 1678, 1678, 1678, 1678, + 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, + 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, + 1678, 1678, 1682, 1682, 1618, 1682, 1682, 1682, 1682, 1682, + + 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, + 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, 1682, + 1683, 1683, 2084, 1683, 2083, 1683, 1683, 2082, 2079, 2078, + 1683, 1683, 1683, 1683, 1683, 2077, 1683, 1683, 1683, 1683, + 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1684, 1684, + 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, + 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, + 1684, 1684, 1684, 1684, 1684, 1684, 1686, 1686, 2076, 1686, + 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, + 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, 1686, + + 1686, 1686, 1686, 1686, 1688, 2075, 1560, 1559, 2073, 1688, + 1688, 2072, 1525, 1521, 1688, 1688, 1688, 1688, 1688, 1521, + 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, + 1688, 1688, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, + 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, + 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 2067, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1704, 1704, + 1704, 1288, 1288, 1288, 1455, 2035, 1451, 2033, 1307, 1307, + + 1307, 1416, 1416, 1416, 1704, 1528, 1528, 1528, 1704, 2032, + 2031, 1288, 2028, 2027, 1704, 1016, 1016, 1016, 1307, 3403, + 2021, 1416, 1640, 1640, 1640, 1528, 1024, 1024, 1024, 3577, + 1016, 1016, 3403, 3577, 3403, 1016, 1024, 1024, 1024, 3403, + 1954, 1455, 1640, 3577, 3524, 1455, 1024, 3577, 3577, 1944, + 1943, 3646, 3577, 1941, 1937, 1936, 1024, 3524, 1935, 3524, + 1024, 1028, 1028, 1028, 3524, 3646, 1430, 1430, 1413, 1927, + 3646, 1926, 1925, 1395, 1395, 1001, 1028, 1028, 1395, 1395, + 1924, 1028, 1714, 1714, 1922, 1714, 1714, 1714, 1714, 1714, + 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, + + 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, 1714, + 1737, 1737, 1737, 1382, 1374, 1374, 1913, 1912, 1360, 1360, + 1001, 1360, 1360, 1351, 1911, 1737, 1737, 1350, 1909, 1908, + 1737, 1745, 1745, 1745, 1904, 1903, 1900, 1899, 1898, 1897, + 1893, 1317, 1891, 1890, 1889, 1316, 1314, 1745, 1304, 1883, + 1882, 1745, 1881, 1285, 1876, 1848, 1875, 1745, 1063, 1063, + 1063, 1874, 1215, 1873, 1846, 1841, 1836, 1872, 1871, 1828, + 1868, 1863, 1862, 1063, 1063, 1063, 1857, 1226, 1063, 1767, + 1767, 1767, 1231, 1854, 1231, 1842, 1851, 1844, 1843, 1840, + 1839, 1838, 1837, 1834, 1767, 1829, 1767, 1826, 1189, 1767, + + 1769, 1769, 1769, 1189, 1189, 1189, 1189, 1184, 1814, 1813, + 1177, 1166, 1166, 1001, 1166, 1166, 1769, 1162, 1811, 1152, + 1769, 1152, 1810, 1801, 1131, 1125, 1769, 1086, 1086, 1086, + 1792, 1784, 1117, 1781, 1780, 1779, 1778, 1107, 1106, 1105, + 1104, 1084, 1086, 1086, 1086, 1747, 1734, 1086, 1772, 1772, + 1772, 1733, 1732, 1731, 1726, 1725, 1724, 1721, 1061, 1713, + 1712, 1711, 1708, 1772, 1015, 1772, 1004, 1001, 1772, 1111, + 1111, 1698, 1231, 1694, 1111, 1111, 1001, 1111, 1111, 1111, + 1111, 1111, 1111, 1111, 1693, 1111, 1111, 1111, 1111, 1111, + 1111, 1111, 1111, 1111, 1001, 1001, 1111, 1112, 1112, 1112, + + 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + 1112, 1112, 1112, 1112, 1112, 1116, 1116, 1001, 1687, 1116, + 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, + 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, + 1116, 1116, 1116, 1785, 1785, 1001, 1785, 1785, 1785, 1785, + 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, + 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, 1785, + 1785, 1791, 1791, 1284, 1791, 1791, 1791, 1791, 1791, 1791, + 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, + + 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1794, + 1794, 1794, 1669, 1669, 1666, 1665, 1650, 1650, 1637, 1626, + 1618, 1618, 1001, 1563, 1001, 1794, 1563, 1560, 1559, 1794, + 1558, 1533, 1532, 1529, 1452, 1794, 1126, 1126, 1126, 1001, + 1525, 1521, 3756, 1455, 1452, 1451, 1001, 1437, 1436, 1430, + 1001, 1126, 1126, 1001, 1413, 1001, 1126, 1798, 1798, 1798, + 1395, 1395, 1390, 1001, 1277, 1001, 1277, 1375, 1001, 1366, + 1001, 1360, 1360, 1798, 1351, 1284, 1001, 1798, 1350, 1001, + 1177, 1001, 1317, 1798, 1132, 1132, 1132, 1001, 1316, 1315, + 1314, 1304, 1301, 1284, 1001, 1285, 1284, 1001, 1177, 1132, + + 1132, 1001, 1235, 1001, 1132, 1802, 1802, 1202, 1802, 1802, + 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, + 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, 1802, + 1802, 1802, 1802, 1805, 1805, 1001, 1805, 1805, 1805, 1805, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + 1805, 1157, 1157, 1189, 1157, 1157, 1157, 1157, 1157, 1157, + 1157, 1001, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1158, + 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + + 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1165, 1165, 1165, + 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, + 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, + 1165, 1165, 1165, 1165, 1165, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, 1167, + 1167, 1167, 1167, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + + 1000, 1172, 1181, 1180, 1172, 1172, 1172, 1172, 1172, 1172, + 1172, 1179, 1172, 1172, 1172, 1172, 1177, 1172, 1172, 1172, + 1172, 1172, 1172, 1172, 1166, 1172, 1172, 1172, 1172, 1173, + 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, + 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1173, + 1173, 1173, 1173, 1173, 1173, 1173, 1173, 1188, 1188, 1166, + 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, + 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, 1188, + 1188, 1188, 1188, 1188, 1188, 1195, 1195, 1162, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1190, 1190, 1190, 1190, 1190, 1190, 1190, + 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, + 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, + 1190, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, + 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, + 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1152, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1254, 1254, 1254, + + 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + 1254, 1254, 1001, 1254, 1254, 1254, 1254, 1254, 1254, 1254, + 1254, 1254, 1254, 1254, 1254, 1259, 1137, 1001, 1148, 1001, + 1137, 1136, 1001, 1131, 1259, 1125, 1122, 1119, 1117, 1001, + 1259, 1110, 1001, 1107, 1259, 1259, 1106, 1259, 1878, 1878, + 1878, 1105, 1104, 1001, 1001, 1084, 1061, 1057, 1035, 1033, + 1001, 1026, 1015, 1010, 1878, 1001, 1001, 1004, 1878, 1001, + 3756, 3756, 3756, 3756, 1878, 1286, 1286, 1286, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 1286, 1286, 3756, 3756, 3756, 1286, 1291, 1291, 3756, 1291, + + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1292, 3756, 1292, 1292, 1292, 1292, + 1292, 3756, 3756, 3756, 1292, 3756, 1292, 1296, 1296, 3756, + 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, + 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, 1296, + 1296, 1296, 1296, 1296, 1296, 1297, 3756, 1297, 1297, 1297, + 1297, 1297, 3756, 3756, 3756, 1297, 3756, 1297, 1885, 1885, + 1885, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 1885, 3756, 3756, 3756, 1885, 3756, + + 3756, 3756, 3756, 3756, 1885, 1305, 1305, 1305, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 1305, 1305, 3756, 3756, 3756, 1305, 1353, 1353, 3756, 1353, + 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, + 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, 1353, + 1353, 1353, 1353, 1353, 1354, 1354, 1354, 1354, 1354, 1354, + 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, + 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, 1354, + 1354, 1354, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, + 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, + + 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1373, 1373, 1373, 1373, + 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, + 1373, 3756, 1373, 1373, 1373, 1373, 1373, 1373, 1373, 1373, + 1373, 1373, 1373, 1373, 1381, 1381, 3756, 1381, 1381, 1381, + + 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 3756, + 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, 1381, + 1381, 1381, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, + 1916, 1916, 1916, 1916, 1916, 1916, 1916, 3756, 1916, 1916, + 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, + 1391, 1391, 3756, 1391, 1391, 1391, 1391, 1391, 1391, 1391, + 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, + 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1391, 1392, 3756, + 1392, 1392, 1392, 1392, 1392, 3756, 3756, 3756, 1392, 3756, + 1392, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, + + 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, + 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1394, 1396, + 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, + 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1396, + 1396, 1396, 1396, 1396, 1396, 1396, 1396, 1401, 1401, 3756, + 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, + 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, + 1401, 1401, 1401, 1401, 1401, 1402, 3756, 1402, 1402, 1402, + 1402, 1402, 3756, 3756, 3756, 1402, 3756, 1402, 1404, 1404, + 3756, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, + + 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, 1404, + 1404, 1404, 1404, 1404, 1404, 1404, 1405, 3756, 1405, 1405, + 1405, 1405, 1405, 3756, 3756, 3756, 1405, 3756, 1405, 1410, + 1410, 1410, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 1410, 1410, 3756, 3756, 3756, 1410, + 1929, 1929, 1929, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 1929, 1929, 3756, 3756, 3756, + 1929, 1931, 1931, 1931, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1931, 3756, 3756, + 3756, 1931, 3756, 3756, 3756, 3756, 3756, 1931, 1414, 1414, + + 1414, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 1414, 1414, 3756, 3756, 3756, 1414, 1428, + 1428, 1428, 3756, 3756, 1428, 3756, 3756, 3756, 1428, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1428, + 1431, 3756, 3756, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 3756, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 3756, 1431, 1431, 1431, 1431, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1949, 3756, 3756, 1949, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1949, 1949, 3756, + 3756, 3756, 1949, 3756, 3756, 3756, 3756, 3756, 1949, 1454, + 3756, 1454, 1454, 1454, 1454, 1454, 3756, 3756, 3756, 1454, + 3756, 1454, 1951, 3756, 1951, 1951, 1951, 1951, 1951, 3756, + 3756, 3756, 1951, 3756, 1951, 1953, 3756, 1953, 1953, 1953, + 1953, 1953, 3756, 3756, 3756, 1953, 3756, 1953, 3756, 3756, + 3756, 1953, 2034, 3756, 3756, 3756, 3756, 2034, 3756, 3756, + 2034, 2034, 3756, 2034, 3756, 3756, 3756, 3756, 2034, 2034, + 2034, 3756, 2034, 1495, 3756, 3756, 1495, 3756, 3756, 1495, + 3756, 1495, 1495, 1495, 1495, 1495, 3756, 3756, 3756, 1495, + + 3756, 1495, 3756, 3756, 3756, 1495, 1520, 1520, 3756, 1520, + 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, + 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, 1520, + 1520, 1520, 1520, 1520, 2069, 2069, 2069, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 2069, 3756, 3756, 3756, 2069, 3756, 3756, 3756, 3756, 3756, + 2069, 1526, 1526, 1526, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 1526, 1526, 3756, 3756, + 3756, 1526, 1534, 3756, 3756, 3756, 1534, 1534, 1534, 1534, + 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, + + 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, + 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, + 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, + 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1539, 3756, + 3756, 3756, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1540, 1540, 1540, 1540, + 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, + 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, 1540, + 1540, 1540, 1540, 1540, 1544, 3756, 3756, 3756, 1544, 1544, + + 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, + 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, 1544, + 1544, 1544, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, 1545, + 1549, 1549, 3756, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + 1549, 1549, 1549, 1549, 1549, 3756, 1549, 1549, 3756, 1549, + 1549, 1549, 1549, 3756, 1549, 1549, 1549, 1549, 1550, 1550, + 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, + 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, 1550, + + 1550, 1550, 1550, 1550, 1550, 1550, 1561, 3756, 3756, 1561, + 1561, 3756, 1561, 3756, 1561, 1561, 1561, 1561, 1561, 3756, + 3756, 3756, 1561, 3756, 3756, 3756, 3756, 3756, 1561, 1564, + 1564, 3756, 3756, 3756, 3756, 1564, 3756, 1564, 1564, 3756, + 3756, 3756, 1564, 1565, 1565, 3756, 1565, 1565, 1565, 1565, + 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, + 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, 1565, + 1565, 1566, 3756, 1566, 1566, 1566, 1566, 1566, 3756, 3756, + 3756, 1566, 3756, 1566, 1568, 1568, 3756, 1568, 1568, 1568, + 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, + + 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, + 1568, 1568, 1569, 3756, 1569, 1569, 1569, 1569, 1569, 3756, + 3756, 3756, 1569, 3756, 1569, 1573, 3756, 1573, 1573, 1573, + 1573, 3756, 3756, 3756, 3756, 1573, 1575, 3756, 3756, 3756, + 3756, 3756, 1575, 3756, 1575, 1575, 1575, 1575, 1575, 3756, + 3756, 1575, 1575, 3756, 3756, 3756, 3756, 3756, 1575, 1577, + 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1577, + 1577, 1577, 1577, 1577, 1577, 1577, 1577, 3756, 1577, 1577, + 1577, 1577, 1577, 1577, 1577, 1577, 1577, 1578, 1578, 1578, + 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, + + 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, 1578, + 1578, 1578, 1578, 1578, 1578, 1583, 3756, 3756, 3756, 1583, + 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, + 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, 1583, + 1583, 1583, 1583, 1584, 1584, 1584, 1584, 1584, 1584, 1584, + 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, + 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, + 1584, 1588, 3756, 3756, 3756, 1588, 1588, 1588, 1588, 1588, + 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, + 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1588, 1589, + + 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, + 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1589, + 1589, 1589, 1589, 1589, 1589, 1589, 1589, 1593, 3756, 3756, + 3756, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, + 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, 1593, + 1593, 1593, 1593, 1593, 1593, 1594, 1594, 1594, 1594, 1594, + 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, + 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, + 1594, 1594, 1594, 1598, 3756, 3756, 3756, 1598, 1598, 1598, + 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, + + 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, + 1598, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, + 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, + 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1599, 1606, + 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, + 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1606, + 1606, 1606, 1606, 1606, 1606, 1606, 1606, 1609, 1609, 1609, + 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, + 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, 1609, + 1609, 1609, 1609, 1609, 1609, 1000, 1000, 1000, 1000, 1000, + + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 3756, 1617, 1617, 1617, + 1617, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, + 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, + 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1619, 1627, + 1627, 3756, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1627, + + 1627, 1627, 1627, 1627, 1627, 1627, 1627, 1628, 3756, 1628, + 1628, 1628, 1628, 1628, 3756, 3756, 3756, 1628, 3756, 1628, + 1630, 1630, 3756, 1630, 1630, 1630, 1630, 1630, 1630, 1630, + 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, + 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1630, 1631, 1631, + 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, + 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, 1631, + 1631, 1631, 1631, 1631, 1631, 1631, 2090, 2090, 2090, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 2090, 3756, 3756, 3756, 2090, 3756, 3756, 3756, + + 3756, 3756, 2090, 1638, 1638, 1638, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1638, 1638, + 3756, 3756, 3756, 1638, 1641, 1641, 1641, 1641, 1641, 1641, + 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, + 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, + 1641, 1641, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, + 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, + 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, + 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, + 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, + + 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1651, 1651, + 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, + 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, + 1651, 1651, 1651, 1651, 1651, 1651, 1659, 1659, 3756, 1659, + 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, + 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, + 1659, 1659, 1659, 1659, 1660, 3756, 1660, 1660, 1660, 1660, + 1660, 3756, 3756, 3756, 1660, 3756, 1660, 1662, 1662, 3756, + 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, + 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, + + 1662, 1662, 1662, 1662, 1662, 1663, 3756, 1663, 1663, 1663, + 1663, 1663, 3756, 3756, 3756, 1663, 3756, 1663, 1668, 1668, + 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 3756, 1668, + 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, 1668, + 1668, 1668, 1668, 1668, 1668, 1668, 1670, 1670, 1670, 1670, + 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, + 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, 1670, + 1670, 1670, 1670, 1670, 1677, 1677, 3756, 1677, 3756, 1677, + 1677, 3756, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, + 1677, 1677, 1677, 1677, 1677, 1677, 1677, 3756, 1677, 1677, + + 1677, 1677, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, + 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, + 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, 1678, + 1683, 1683, 3756, 1683, 3756, 1683, 1683, 3756, 3756, 3756, + 1683, 1683, 1683, 1683, 1683, 3756, 1683, 1683, 1683, 1683, + 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1684, 1684, + 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, + 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, 1684, + 1684, 1684, 1684, 1684, 1684, 1684, 2101, 2101, 3756, 2101, + 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, + + 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, 2101, + 2101, 2101, 2101, 2101, 1688, 3756, 3756, 3756, 3756, 1688, + 1688, 3756, 3756, 3756, 1688, 1688, 1688, 1688, 1688, 3756, + 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, 1688, + 1688, 1688, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, + 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, + 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, 1689, + 1704, 1704, 1704, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 1704, 3756, 3756, 3756, + 1704, 3756, 3756, 3756, 3756, 3756, 1704, 1016, 1016, 1016, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 1016, 1016, 3756, 3756, 3756, 1016, 1737, 1737, + 1737, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 1737, 1737, 3756, 3756, 3756, 1737, 2138, + 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2138, 3756, + 2138, 2138, 2138, 2138, 3756, 2138, 2138, 2138, 2138, 2138, + 2138, 2138, 2138, 2138, 2138, 2138, 2138, 2140, 2140, 2140, + 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, 2140, + 2140, 2140, 3756, 2140, 2140, 2140, 2140, 2140, 2140, 2140, + 2140, 2140, 2140, 2140, 2140, 1745, 1745, 1745, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 1745, 3756, 3756, 3756, 1745, 3756, 3756, 3756, 3756, + 3756, 1745, 1063, 1063, 1063, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1063, 1063, 1063, + 3756, 3756, 1063, 1767, 1767, 1767, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1767, 3756, + 1767, 3756, 3756, 1767, 1769, 1769, 1769, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 1769, 3756, 3756, 3756, 1769, 3756, 3756, 3756, 3756, 3756, + 1769, 1086, 1086, 1086, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 1086, 1086, 1086, 3756, + 3756, 1086, 1772, 1772, 1772, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1772, 3756, 1772, + 3756, 3756, 1772, 1791, 1791, 3756, 1791, 1791, 1791, 1791, + 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, + 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, + 1791, 1794, 1794, 1794, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1794, 3756, 3756, + 3756, 1794, 3756, 3756, 3756, 3756, 3756, 1794, 1126, 1126, + 1126, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 1126, 1126, 3756, 3756, 3756, 1126, 1798, + 1798, 1798, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 1798, 3756, 3756, 3756, 1798, + 3756, 3756, 3756, 3756, 3756, 1798, 1132, 1132, 1132, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 1132, 1132, 3756, 3756, 3756, 1132, 1805, 1805, 3756, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + 1805, 1805, 1805, 1805, 1805, 1172, 3756, 3756, 1172, 1172, + 1172, 1172, 1172, 1172, 1172, 3756, 1172, 1172, 1172, 1172, + + 3756, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 3756, 1172, + 1172, 1172, 1172, 1817, 1817, 1817, 1817, 1817, 1817, 1817, + 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, + 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, 1817, + 1817, 1195, 1195, 3756, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, + 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1878, + 1878, 1878, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 1878, 3756, 3756, 3756, 1878, + 3756, 3756, 3756, 3756, 3756, 1878, 1286, 1286, 1286, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 1286, 1286, 3756, 3756, 3756, 1286, 1885, 1885, 1885, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 1885, 3756, 3756, 3756, 1885, 3756, 3756, + 3756, 3756, 3756, 1885, 1305, 1305, 1305, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1305, + 1305, 3756, 3756, 3756, 1305, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 3756, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1916, 1916, 3756, 1916, 1916, 1916, 1916, + + 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 3756, 1916, + 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, 1916, + 1916, 2250, 2250, 2250, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 2250, 3756, 3756, + 3756, 2250, 1929, 1929, 1929, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1929, 1929, 3756, + 3756, 3756, 1929, 1931, 1931, 1931, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1931, + 3756, 3756, 3756, 1931, 3756, 3756, 3756, 3756, 3756, 1931, + 1414, 1414, 1414, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 1414, 1414, 3756, 3756, 3756, + 1414, 1431, 3756, 3756, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 1431, 3756, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 3756, 1431, 1431, 1431, 1431, 1949, + 3756, 3756, 1949, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 1949, 1949, 3756, 3756, 3756, 1949, 3756, 3756, 3756, 3756, + 3756, 1949, 1951, 3756, 1951, 1951, 1951, 1951, 1951, 3756, + 3756, 3756, 1951, 3756, 1951, 2264, 3756, 3756, 2264, 3756, + 3756, 2264, 3756, 2264, 2264, 2264, 2264, 2264, 3756, 3756, + 3756, 2264, 3756, 2264, 3756, 3756, 3756, 2264, 2300, 2300, + + 3756, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, + 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, + 2300, 2300, 2300, 2300, 2300, 2300, 2326, 2326, 3756, 2326, + 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, + 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, + 2326, 2326, 2326, 2326, 2336, 2336, 3756, 2336, 2336, 2336, + 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, + 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, + 2336, 2336, 2034, 3756, 3756, 3756, 3756, 2034, 3756, 3756, + 2034, 2034, 3756, 2034, 3756, 3756, 3756, 3756, 2034, 2034, + + 2034, 3756, 2034, 1953, 3756, 1953, 1953, 1953, 1953, 1953, + 3756, 3756, 3756, 1953, 3756, 1953, 3756, 3756, 3756, 1953, + 1454, 3756, 1454, 1454, 1454, 1454, 1454, 3756, 3756, 3756, + 1454, 3756, 1454, 1495, 3756, 3756, 1495, 3756, 3756, 1495, + 3756, 1495, 1495, 1495, 1495, 1495, 3756, 3756, 3756, 1495, + 3756, 1495, 3756, 3756, 3756, 1495, 2069, 2069, 2069, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 2069, 3756, 3756, 3756, 2069, 3756, 3756, 3756, + 3756, 3756, 2069, 1526, 1526, 1526, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1526, 1526, + + 3756, 3756, 3756, 1526, 1549, 1549, 3756, 1549, 1549, 1549, + 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 3756, + 1549, 1549, 3756, 1549, 1549, 1549, 1549, 3756, 1549, 1549, + 1549, 1549, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 3756, 1617, 1617, 1617, 1617, + 2090, 2090, 2090, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 2090, 3756, 3756, 3756, + 2090, 3756, 3756, 3756, 3756, 3756, 2090, 1638, 1638, 1638, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 1638, 1638, 3756, 3756, 3756, 1638, 1058, 1058, + 1058, 3756, 3756, 3756, 3756, 3756, 3756, 1058, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1058, 1063, + 1063, 1063, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 1063, 1063, 1063, 3756, 3756, 1063, + 1805, 1805, 3756, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1172, 3756, + 3756, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 3756, 1172, + 1172, 1172, 1172, 3756, 1172, 1172, 1172, 1172, 1172, 1172, + + 1172, 3756, 1172, 1172, 1172, 1172, 2542, 2542, 3756, 2542, + 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, + 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, + 2542, 2542, 2542, 2542, 2250, 2250, 2250, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 2250, 3756, 3756, 3756, 2250, 2565, 2565, 2565, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 2565, 2565, 3756, 3756, 3756, 2565, 1431, 3756, 3756, 1431, + 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 3756, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 3756, + + 1431, 1431, 1431, 1431, 2264, 3756, 3756, 2264, 3756, 3756, + 2264, 3756, 2264, 2264, 2264, 2264, 2264, 3756, 3756, 3756, + 2264, 3756, 2264, 3756, 3756, 3756, 2264, 2576, 2576, 3756, + 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, + 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, + 2576, 2576, 2576, 2576, 2576, 2578, 2578, 3756, 2578, 2578, + 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, + 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, + 2578, 2578, 2578, 2600, 2600, 3756, 2600, 2600, 2600, 2600, + 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, + + 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, + 2600, 2607, 2607, 3756, 2607, 2607, 2607, 2607, 2607, 2607, + 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, + 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2300, + 2300, 3756, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, + 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2300, + 2300, 2300, 2300, 2300, 2300, 2300, 2300, 2625, 2625, 3756, + 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, + 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, + 2625, 2625, 2625, 2625, 2625, 2629, 2629, 3756, 2629, 2629, + + 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, + 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, + 2629, 2629, 2629, 2633, 2633, 3756, 2633, 2633, 2633, 2633, + 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, + 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, + 2633, 2635, 2635, 3756, 2635, 2635, 2635, 2635, 2635, 2635, + 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, + 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2637, + 2637, 3756, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, + 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, + + 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2640, 2640, 3756, + 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, + 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, + 2640, 2640, 2640, 2640, 2640, 2642, 2642, 3756, 2642, 2642, + 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, + 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, + 2642, 2642, 2642, 2644, 2644, 3756, 2644, 2644, 2644, 2644, + 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, + 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, + 2644, 2647, 2647, 3756, 2647, 2647, 2647, 2647, 2647, 2647, + + 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, + 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2326, + 2326, 3756, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, + 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2326, + 2326, 2326, 2326, 2326, 2326, 2326, 2326, 2652, 2652, 3756, + 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, + 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, + 2652, 2652, 2652, 2652, 2652, 2656, 2656, 3756, 2656, 2656, + 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, + 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, + + 2656, 2656, 2656, 2336, 2336, 3756, 2336, 2336, 2336, 2336, + 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, + 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, 2336, + 2336, 2667, 2667, 3756, 2667, 2667, 2667, 2667, 2667, 2667, + 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, + 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2669, + 2669, 3756, 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2669, + 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2669, + 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2671, 2671, 3756, + 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, + + 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, + 2671, 2671, 2671, 2671, 2671, 2673, 2673, 3756, 2673, 2673, + 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, + 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, + 2673, 2673, 2673, 1454, 3756, 1454, 1454, 1454, 1454, 1454, + 3756, 3756, 3756, 1454, 3756, 1454, 1495, 3756, 3756, 1495, + 3756, 3756, 1495, 3756, 1495, 1495, 1495, 1495, 1495, 3756, + 3756, 3756, 1495, 3756, 1495, 3756, 3756, 3756, 1495, 1549, + 1549, 3756, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + 1549, 1549, 1549, 1549, 3756, 1549, 1549, 3756, 1549, 1549, + + 1549, 1549, 3756, 1549, 1549, 1549, 1549, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 3756, 1617, 1617, 1617, 1617, 1058, 1058, 1058, 3756, 3756, + 3756, 3756, 3756, 3756, 1058, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 1058, 1063, 1063, 1063, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 1063, 1063, 1063, 3756, 3756, 1063, 1805, 1805, 3756, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + + 1805, 1805, 1805, 1805, 1805, 2811, 2811, 2811, 2811, 2811, + 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, + 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, 2811, + 2811, 2811, 2811, 1172, 3756, 3756, 1172, 1172, 1172, 1172, + 1172, 1172, 1172, 3756, 1172, 1172, 1172, 1172, 3756, 1172, + 1172, 1172, 1172, 1172, 1172, 1172, 3756, 1172, 1172, 1172, + 1172, 2817, 2817, 3756, 2817, 2817, 2817, 2817, 2817, 2817, + 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, + 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2821, + 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821, 2821, + + 2821, 2821, 2821, 2821, 2821, 3756, 2821, 2821, 2821, 2821, + 3756, 2821, 2821, 2821, 2821, 2821, 2821, 2542, 2542, 3756, + 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, + 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, 2542, + 2542, 2542, 2542, 2542, 2542, 2565, 2565, 2565, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 2565, 2565, 3756, 3756, 3756, 2565, 1431, 3756, 3756, 1431, + 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 3756, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 3756, + 1431, 1431, 1431, 1431, 1949, 3756, 3756, 1949, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 1949, 1949, 3756, 3756, 3756, + 1949, 3756, 3756, 3756, 3756, 3756, 1949, 2576, 2576, 3756, + 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, + 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 2576, + 2576, 2576, 2576, 2576, 2576, 2578, 2578, 3756, 2578, 2578, + 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, + 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, 2578, + 2578, 2578, 2578, 2889, 2889, 3756, 2889, 2889, 2889, 2889, + 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, + 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, + + 2889, 2893, 2893, 3756, 2893, 2893, 2893, 2893, 2893, 2893, + 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, + 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2895, + 2895, 3756, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, + 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, + 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2897, 2897, 3756, + 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, + 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, + 2897, 2897, 2897, 2897, 2897, 2900, 2900, 3756, 2900, 2900, + 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, + + 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, + 2900, 2900, 2900, 2902, 2902, 3756, 2902, 2902, 2902, 2902, + 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, + 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, + 2902, 2904, 2904, 3756, 2904, 2904, 2904, 2904, 2904, 2904, + 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, + 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2600, + 2600, 3756, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, + 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2600, + 2600, 2600, 2600, 2600, 2600, 2600, 2600, 2907, 2907, 3756, + + 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, + 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, + 2907, 2907, 2907, 2907, 2907, 2910, 2910, 3756, 2910, 2910, + 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, + 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, + 2910, 2910, 2910, 2607, 2607, 3756, 2607, 2607, 2607, 2607, + 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, + 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, 2607, + 2607, 2921, 2921, 3756, 2921, 2921, 2921, 2921, 2921, 2921, + 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, + + 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2923, + 2923, 3756, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, + 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, + 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2925, 2925, 3756, + 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, + 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, + 2925, 2925, 2925, 2925, 2925, 2927, 2927, 3756, 2927, 2927, + 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, + 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, + 2927, 2927, 2927, 2625, 2625, 3756, 2625, 2625, 2625, 2625, + + 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, + 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, 2625, + 2625, 2629, 2629, 3756, 2629, 2629, 2629, 2629, 2629, 2629, + 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, + 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2629, 2936, + 2936, 3756, 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, + 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, + 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2633, 2633, 3756, + 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, + 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, + + 2633, 2633, 2633, 2633, 2633, 2635, 2635, 3756, 2635, 2635, + 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, + 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, 2635, + 2635, 2635, 2635, 2637, 2637, 3756, 2637, 2637, 2637, 2637, + 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, + 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, 2637, + 2637, 2640, 2640, 3756, 2640, 2640, 2640, 2640, 2640, 2640, + 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, + 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2640, 2642, + 2642, 3756, 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, + + 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2642, + 2642, 2642, 2642, 2642, 2642, 2642, 2642, 2644, 2644, 3756, + 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, + 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, + 2644, 2644, 2644, 2644, 2644, 2647, 2647, 3756, 2647, 2647, + 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, + 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, + 2647, 2647, 2647, 2942, 2942, 3756, 2942, 2942, 2942, 2942, + 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, + 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, + + 2942, 2652, 2652, 3756, 2652, 2652, 2652, 2652, 2652, 2652, + 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, + 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2652, 2656, + 2656, 3756, 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, + 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2656, + 2656, 2656, 2656, 2656, 2656, 2656, 2656, 2948, 2948, 3756, + 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, + 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, + 2948, 2948, 2948, 2948, 2948, 2952, 2952, 3756, 2952, 2952, + 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, + + 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, + 2952, 2952, 2952, 2954, 2954, 3756, 2954, 2954, 2954, 2954, + 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, + 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, + 2954, 2667, 2667, 3756, 2667, 2667, 2667, 2667, 2667, 2667, + 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, + 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2667, 2669, + 2669, 3756, 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2669, + 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2669, + 2669, 2669, 2669, 2669, 2669, 2669, 2669, 2671, 2671, 3756, + + 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, + 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, 2671, + 2671, 2671, 2671, 2671, 2671, 2673, 2673, 3756, 2673, 2673, + 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, + 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, 2673, + 2673, 2673, 2673, 2957, 2957, 3756, 2957, 2957, 2957, 2957, + 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, + 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, + 2957, 2264, 3756, 3756, 2264, 3756, 3756, 2264, 3756, 2264, + 2264, 2264, 2264, 2264, 3756, 3756, 3756, 2264, 3756, 2264, + + 3756, 3756, 3756, 2264, 1454, 3756, 1454, 1454, 1454, 1454, + 1454, 3756, 3756, 3756, 1454, 3756, 1454, 2993, 2993, 3756, + 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, + 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, + 2993, 2993, 2993, 2993, 2993, 1495, 3756, 3756, 1495, 3756, + 3756, 1495, 3756, 1495, 1495, 1495, 1495, 1495, 3756, 3756, + 3756, 1495, 3756, 1495, 3756, 3756, 3756, 1495, 1549, 1549, + 3756, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + 1549, 1549, 1549, 3756, 1549, 1549, 3756, 1549, 1549, 1549, + 1549, 3756, 1549, 1549, 1549, 1549, 1617, 1617, 1617, 1617, + + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 3756, + 1617, 1617, 1617, 1617, 1063, 1063, 1063, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1063, + 1063, 1063, 3756, 3756, 1063, 1805, 1805, 3756, 1805, 1805, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, 1805, + 1805, 1805, 1805, 3084, 3084, 3756, 3084, 3084, 3084, 3084, + 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, + 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, + + 3084, 1172, 3756, 3756, 1172, 1172, 1172, 1172, 1172, 1172, + 1172, 3756, 1172, 1172, 1172, 1172, 3756, 1172, 1172, 1172, + 1172, 1172, 1172, 1172, 3756, 1172, 1172, 1172, 1172, 2817, + 2817, 3756, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, + 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, 2817, + 2817, 2817, 2817, 2817, 2817, 2817, 2817, 3106, 3106, 3106, + 3106, 3106, 3106, 3106, 3106, 3106, 3106, 3106, 3106, 3106, + 3106, 3106, 3106, 3756, 3106, 3106, 3106, 3106, 3756, 3106, + 3106, 3106, 3106, 3106, 3106, 1431, 3756, 3756, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + + 3756, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 3756, 1431, + 1431, 1431, 1431, 1949, 3756, 3756, 1949, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 1949, 1949, 3756, 3756, 3756, 1949, + 3756, 3756, 3756, 3756, 3756, 1949, 2889, 2889, 3756, 2889, + 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, + 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, 2889, + 2889, 2889, 2889, 2889, 3144, 3144, 3756, 3144, 3144, 3144, + 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, + 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, + 3144, 3144, 2893, 2893, 3756, 2893, 2893, 2893, 2893, 2893, + + 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, + 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, 2893, + 2895, 2895, 3756, 2895, 2895, 2895, 2895, 2895, 2895, 2895, + 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, + 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2895, 2897, 2897, + 3756, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, + 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, + 2897, 2897, 2897, 2897, 2897, 2897, 2900, 2900, 3756, 2900, + 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, + 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, 2900, + + 2900, 2900, 2900, 2900, 2902, 2902, 3756, 2902, 2902, 2902, + 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, + 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, 2902, + 2902, 2902, 2904, 2904, 3756, 2904, 2904, 2904, 2904, 2904, + 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, + 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, + 2907, 2907, 3756, 2907, 2907, 2907, 2907, 2907, 2907, 2907, + 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, + 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2907, 2910, 2910, + 3756, 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, + + 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, 2910, + 2910, 2910, 2910, 2910, 2910, 2910, 3151, 3151, 3756, 3151, + 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, + 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, + 3151, 3151, 3151, 3151, 3155, 3155, 3756, 3155, 3155, 3155, + 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, + 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, + 3155, 3155, 3157, 3157, 3756, 3157, 3157, 3157, 3157, 3157, + 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, + 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, + + 2921, 2921, 3756, 2921, 2921, 2921, 2921, 2921, 2921, 2921, + 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, + 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2921, 2923, 2923, + 3756, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, + 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, 2923, + 2923, 2923, 2923, 2923, 2923, 2923, 2925, 2925, 3756, 2925, + 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, + 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, 2925, + 2925, 2925, 2925, 2925, 2927, 2927, 3756, 2927, 2927, 2927, + 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, + + 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, + 2927, 2927, 3160, 3160, 3756, 3160, 3160, 3160, 3160, 3160, + 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, + 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, + 3162, 3162, 3756, 3162, 3162, 3162, 3162, 3162, 3162, 3162, + 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, + 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3165, 3165, + 3756, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, + 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, + 3165, 3165, 3165, 3165, 3165, 3165, 2936, 2936, 3756, 2936, + + 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, + 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, 2936, + 2936, 2936, 2936, 2936, 3167, 3167, 3756, 3167, 3167, 3167, + 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, + 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, + 3167, 3167, 3169, 3169, 3756, 3169, 3169, 3169, 3169, 3169, + 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, + 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, + 2942, 2942, 3756, 2942, 2942, 2942, 2942, 2942, 2942, 2942, + 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, + + 2942, 2942, 2942, 2942, 2942, 2942, 2942, 2942, 3173, 3173, + 3756, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, + 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, + 3173, 3173, 3173, 3173, 3173, 3173, 2948, 2948, 3756, 2948, + 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, + 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, 2948, + 2948, 2948, 2948, 2948, 2952, 2952, 3756, 2952, 2952, 2952, + 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, + 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, 2952, + 2952, 2952, 2954, 2954, 3756, 2954, 2954, 2954, 2954, 2954, + + 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, + 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, 2954, + 2957, 2957, 3756, 2957, 2957, 2957, 2957, 2957, 2957, 2957, + 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, + 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2957, 2264, 3756, + 3756, 2264, 3756, 3756, 2264, 3756, 2264, 2264, 2264, 2264, + 2264, 3756, 3756, 3756, 2264, 3756, 2264, 3756, 3756, 3756, + 2264, 1454, 3756, 1454, 1454, 1454, 1454, 1454, 3756, 3756, + 3756, 1454, 3756, 1454, 2992, 2992, 3756, 2992, 2992, 2992, + 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, + + 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, 2992, + 2992, 2992, 2993, 2993, 3756, 2993, 2993, 2993, 2993, 2993, + 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, + 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, 2993, + 3207, 3207, 3756, 3207, 3207, 3207, 3207, 3207, 3207, 3207, + 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, + 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, 1495, 3756, + 3756, 1495, 3756, 3756, 1495, 3756, 1495, 1495, 1495, 1495, + 1495, 3756, 3756, 3756, 1495, 3756, 1495, 3756, 3756, 3756, + 1495, 3237, 3237, 3756, 3237, 3237, 3237, 3237, 3237, 3237, + + 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, + 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, 1549, + 1549, 3756, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + 1549, 1549, 1549, 1549, 3756, 1549, 1549, 3756, 1549, 1549, + 1549, 1549, 3756, 1549, 1549, 1549, 1549, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 3756, 1617, 1617, 1617, 1617, 1063, 1063, 1063, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 1063, 1063, 1063, 3756, 3756, 1063, 3084, 3084, 3756, 3084, + + 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, + 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, 3084, + 3084, 3084, 3084, 3084, 1172, 3756, 3756, 1172, 1172, 1172, + 1172, 1172, 1172, 1172, 3756, 1172, 1172, 1172, 1172, 3756, + 1172, 1172, 1172, 1172, 1172, 1172, 1172, 3756, 1172, 1172, + 1172, 1172, 1431, 3756, 3756, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 1431, 1431, 3756, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 3756, 1431, 1431, 1431, 1431, + 1949, 3756, 3756, 1949, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 1949, 1949, 3756, 3756, 3756, 1949, 3756, 3756, 3756, + + 3756, 3756, 1949, 3323, 3323, 3756, 3323, 3323, 3323, 3323, + 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, + 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, + 3323, 3326, 3326, 3756, 3326, 3326, 3326, 3326, 3326, 3326, + 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, + 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3144, + 3144, 3756, 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, + 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3144, + 3144, 3144, 3144, 3144, 3144, 3144, 3144, 3328, 3328, 3756, + 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, + + 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, + 3328, 3328, 3328, 3328, 3328, 3330, 3330, 3756, 3330, 3330, + 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, + 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, + 3330, 3330, 3330, 3151, 3151, 3756, 3151, 3151, 3151, 3151, + 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, + 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, 3151, + 3151, 3155, 3155, 3756, 3155, 3155, 3155, 3155, 3155, 3155, + 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, + 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3155, 3157, + + 3157, 3756, 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, + 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3157, + 3157, 3157, 3157, 3157, 3157, 3157, 3157, 3160, 3160, 3756, + 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, + 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, + 3160, 3160, 3160, 3160, 3160, 3162, 3162, 3756, 3162, 3162, + 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, + 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, 3162, + 3162, 3162, 3162, 3165, 3165, 3756, 3165, 3165, 3165, 3165, + 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, + + 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, 3165, + 3165, 3167, 3167, 3756, 3167, 3167, 3167, 3167, 3167, 3167, + 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, + 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3167, 3169, + 3169, 3756, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, + 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3169, + 3169, 3169, 3169, 3169, 3169, 3169, 3169, 3340, 3340, 3756, + 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, + 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, + 3340, 3340, 3340, 3340, 3340, 3173, 3173, 3756, 3173, 3173, + + 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, + 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, 3173, + 3173, 3173, 3173, 3343, 3343, 3756, 3343, 3343, 3343, 3343, + 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, + 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, + 3343, 3347, 3347, 3756, 3347, 3347, 3347, 3347, 3347, 3347, + 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, + 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 2264, + 3756, 3756, 2264, 3756, 3756, 2264, 3756, 2264, 2264, 2264, + 2264, 2264, 3756, 3756, 3756, 2264, 3756, 2264, 3756, 3756, + + 3756, 2264, 1454, 3756, 1454, 1454, 1454, 1454, 1454, 3756, + 3756, 3756, 1454, 3756, 1454, 3207, 3207, 3756, 3207, 3207, + 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, + 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3207, + 3207, 3207, 3207, 1495, 3756, 3756, 1495, 3756, 3756, 1495, + 3756, 1495, 1495, 1495, 1495, 1495, 3756, 3756, 3756, 1495, + 3756, 1495, 3756, 3756, 3756, 1495, 3237, 3237, 3756, 3237, + 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, + 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, 3237, + 3237, 3237, 3237, 3237, 1549, 1549, 3756, 1549, 1549, 1549, + + 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 3756, + 1549, 1549, 3756, 1549, 1549, 1549, 1549, 3756, 1549, 1549, + 1549, 1549, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 3756, 1617, 1617, 1617, 1617, + 1063, 1063, 1063, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 1063, 1063, 1063, 3756, 3756, + 1063, 1172, 3756, 3756, 1172, 1172, 1172, 1172, 1172, 1172, + 1172, 3756, 1172, 1172, 1172, 1172, 3756, 1172, 1172, 1172, + 1172, 1172, 1172, 1172, 3756, 1172, 1172, 1172, 1172, 3454, + + 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, + 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, + 3454, 3454, 3454, 3454, 3454, 3454, 3454, 1431, 3756, 3756, + 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 3756, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 3756, 1431, 1431, 1431, 1431, 1949, 3756, 3756, 1949, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 1949, 1949, 3756, 3756, + 3756, 1949, 3756, 3756, 3756, 3756, 3756, 1949, 3323, 3323, + 3756, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, + 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, 3323, + + 3323, 3323, 3323, 3323, 3323, 3323, 3326, 3326, 3756, 3326, + 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, + 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, 3326, + 3326, 3326, 3326, 3326, 3328, 3328, 3756, 3328, 3328, 3328, + 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, + 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, 3328, + 3328, 3328, 3330, 3330, 3756, 3330, 3330, 3330, 3330, 3330, + 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, + 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, 3330, + 3462, 3462, 3756, 3462, 3462, 3462, 3462, 3462, 3462, 3462, + + 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, + 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3466, 3466, + 3756, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, + 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, + 3466, 3466, 3466, 3466, 3466, 3466, 3468, 3468, 3756, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3340, 3340, 3756, 3340, 3340, 3340, + 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, + 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, 3340, + + 3340, 3340, 3343, 3343, 3756, 3343, 3343, 3343, 3343, 3343, + 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, + 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, 3343, + 3471, 3471, 3756, 3471, 3471, 3471, 3471, 3471, 3471, 3471, + 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, + 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3347, 3347, + 3756, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, + 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, + 3347, 3347, 3347, 3347, 3347, 3347, 3475, 3475, 3475, 3475, + 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475, + + 3475, 3475, 3756, 3475, 3475, 3475, 3475, 3756, 3475, 3475, + 3475, 3475, 3475, 3475, 3476, 3476, 3476, 3476, 3476, 3476, + 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, + 3756, 3476, 3476, 3476, 3476, 3756, 3476, 3476, 3476, 3476, + 3476, 3476, 2264, 3756, 3756, 2264, 3756, 3756, 2264, 3756, + 2264, 2264, 2264, 2264, 2264, 3756, 3756, 3756, 2264, 3756, + 2264, 3756, 3756, 3756, 2264, 1454, 3756, 1454, 1454, 1454, + 1454, 1454, 3756, 3756, 3756, 1454, 3756, 1454, 1549, 1549, + 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + + 1549, 1549, 1549, 1549, 1549, 1549, 3519, 3519, 3519, 3519, + 3519, 3519, 3519, 3519, 3519, 3519, 3519, 3519, 3519, 3519, + 3519, 3519, 3756, 3519, 3519, 3519, 3519, 3756, 3519, 3519, + 3519, 3519, 3519, 3519, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 3756, 1617, 1617, + 1617, 1617, 1063, 1063, 1063, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1063, 1063, 1063, + 3756, 3756, 1063, 3550, 3550, 3550, 3550, 3550, 3550, 3550, + 3550, 3550, 3550, 3550, 3550, 3550, 3550, 3550, 3550, 3756, + + 3550, 3550, 3550, 3550, 3756, 3550, 3550, 3550, 3550, 3550, + 3550, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, + 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, + 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 3454, 1431, + 3756, 3756, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 3756, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 3756, 1431, 1431, 1431, 1431, 1949, 3756, 3756, + 1949, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1949, 1949, + 3756, 3756, 3756, 1949, 3756, 3756, 3756, 3756, 3756, 1949, + 3559, 3559, 3756, 3559, 3559, 3559, 3559, 3559, 3559, 3559, + + 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3559, + 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3462, 3462, + 3756, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, + 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, + 3462, 3462, 3462, 3462, 3462, 3462, 3562, 3562, 3756, 3562, + 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, + 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, + 3562, 3562, 3562, 3562, 3466, 3466, 3756, 3466, 3466, 3466, + 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, + 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, + + 3466, 3466, 3468, 3468, 3756, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3471, 3471, 3756, 3471, 3471, 3471, 3471, 3471, 3471, 3471, + 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, + 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3569, 3569, + 3569, 3569, 3569, 3569, 3569, 3569, 3569, 3569, 3569, 3569, + 3569, 3569, 3569, 3569, 3756, 3569, 3569, 3569, 3569, 3756, + 3569, 3569, 3569, 3569, 3569, 3569, 3573, 3573, 3573, 3573, + 3573, 3573, 3573, 3573, 3573, 3573, 3573, 3573, 3573, 3573, + + 3573, 3573, 3756, 3573, 3573, 3573, 3573, 3756, 3573, 3573, + 3573, 3573, 3573, 3573, 2264, 3756, 3756, 2264, 3756, 3756, + 2264, 3756, 2264, 2264, 2264, 2264, 2264, 3756, 3756, 3756, + 2264, 3756, 2264, 3756, 3756, 3756, 2264, 1951, 3756, 1951, + 1951, 1951, 1951, 1951, 3756, 3756, 3756, 1951, 3756, 1951, + 3508, 3508, 3756, 3756, 3508, 3508, 3508, 3508, 3508, 3508, + 3508, 3508, 3756, 3508, 3756, 3508, 3508, 3508, 3508, 3508, + 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3594, 3756, + 3756, 3756, 3756, 3594, 3756, 3756, 3594, 3594, 3756, 3594, + 3756, 3756, 3756, 3756, 3594, 3594, 3594, 3756, 3594, 3511, + + 3511, 3756, 3756, 3511, 3511, 3511, 3511, 3511, 3511, 3511, + 3511, 3756, 3511, 3511, 3511, 3511, 3511, 3511, 3511, 3511, + 3511, 3511, 3511, 3511, 3511, 3511, 3511, 1549, 1549, 3756, + 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, 1549, + 1549, 1549, 3756, 1549, 1549, 3756, 1549, 1549, 1549, 1549, + 3756, 1549, 1549, 1549, 1549, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 3756, 1617, + 1617, 1617, 1617, 1063, 1063, 1063, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1063, 1063, + + 1063, 3756, 3756, 1063, 3618, 3618, 3618, 3618, 3618, 3618, + 3618, 3618, 3618, 3618, 3618, 3618, 3618, 3618, 3618, 3618, + 3756, 3618, 3618, 3618, 3618, 3756, 3618, 3618, 3618, 3618, + 3618, 3618, 3621, 3621, 3621, 3621, 3621, 3621, 3621, 3621, + 3621, 3621, 3621, 3621, 3621, 3621, 3621, 3621, 3756, 3621, + 3621, 3621, 3621, 3756, 3621, 3621, 3621, 3621, 3621, 3621, + 3622, 3622, 3756, 3622, 3622, 3622, 3622, 3622, 3622, 3622, + 3622, 3622, 3622, 3622, 3622, 3622, 3622, 3622, 3622, 3622, + 3622, 3622, 3622, 3622, 3622, 3622, 3622, 3622, 1431, 3756, + 3756, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + + 1431, 1431, 1431, 3756, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 3756, 1431, 1431, 1431, 1431, 1949, 3756, 3756, 1949, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 1949, 1949, 3756, + 3756, 3756, 1949, 3756, 3756, 3756, 3756, 3756, 1949, 3559, + 3559, 3756, 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3559, + 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3559, + 3559, 3559, 3559, 3559, 3559, 3559, 3559, 3562, 3562, 3756, + 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, + 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, 3562, + 3562, 3562, 3562, 3562, 3562, 3630, 3630, 3756, 3630, 3630, + + 3630, 3630, 3630, 3630, 3630, 3630, 3630, 3630, 3630, 3630, + 3630, 3630, 3630, 3630, 3630, 3630, 3630, 3630, 3630, 3630, + 3630, 3630, 3630, 3634, 3634, 3634, 3634, 3634, 3634, 3634, + 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3634, 3756, + 3634, 3634, 3634, 3634, 3756, 3634, 3634, 3634, 3634, 3634, + 3634, 2264, 3756, 3756, 2264, 3756, 3756, 2264, 3756, 2264, + 2264, 2264, 2264, 2264, 3756, 3756, 3756, 2264, 3756, 2264, + 3756, 3756, 3756, 2264, 1454, 3756, 1454, 1454, 1454, 1454, + 1454, 3756, 3756, 3756, 1454, 3756, 1454, 1951, 3756, 1951, + 1951, 1951, 1951, 1951, 3756, 3756, 3756, 1951, 3756, 1951, + + 3648, 3756, 3756, 3756, 3756, 3648, 3756, 3756, 3648, 3648, + 3756, 3648, 3756, 3756, 3756, 3756, 3756, 3648, 3648, 3756, + 3648, 3594, 3756, 3756, 3756, 3756, 3594, 3756, 3756, 3594, + 3594, 3756, 3594, 3756, 3756, 3756, 3756, 3594, 3594, 3594, + 3756, 3594, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, 1617, + 1617, 1617, 1617, 1617, 1617, 3756, 1617, 1617, 1617, 1617, + 3673, 3673, 3756, 3673, 3673, 3673, 3673, 3673, 3673, 3673, + 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3673, + 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3673, 3508, 3508, + + 3756, 3756, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, + 3756, 3508, 3756, 3508, 3508, 3508, 3508, 3508, 3508, 3508, + 3508, 3508, 3508, 3508, 3508, 3508, 3687, 3756, 3756, 3756, + 3756, 3687, 3756, 3756, 3687, 3687, 3756, 3687, 3756, 3756, + 3756, 3756, 3756, 3687, 3687, 3756, 3687, 3703, 3703, 3703, + 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, 3703, + 3703, 3703, 3703, 3756, 3703, 3703, 3703, 3703, 3756, 3703, + 3703, 3703, 3703, 3703, 3703, 3712, 3712, 3712, 3712, 3712, + 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, 3712, + 3712, 3756, 3712, 3712, 3712, 3712, 3756, 3712, 3712, 3712, + + 3712, 3712, 3712, 3716, 3716, 3716, 3716, 3716, 3716, 3716, + 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3716, 3756, + 3716, 3716, 3716, 3716, 3756, 3716, 3716, 3716, 3716, 3716, + 3716, 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3728, + 3728, 3728, 3728, 3728, 3728, 3728, 3728, 3756, 3728, 3728, + 3728, 3728, 3756, 3728, 3728, 3728, 3728, 3728, 3728, 279, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756 + } ; + +static yyconst short int yy_chk[28846] = + { 0, + 0, 1, 0, 1, 1, 2, 305, 2, 2, 305, + 306, 306, 306, 306, 0, 339, 284, 290, 297, 339, + 1, 284, 290, 297, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 5, 534, 5, 5, 6, 2169, 6, 6, 7, 7, + 7, 7, 7, 5, 7, 456, 456, 6, 9, 5, + 9, 9, 10, 6, 10, 10, 534, 7, 8, 8, + 8, 8, 8, 145, 8, 320, 145, 9, 320, 475, + 475, 10, 27, 27, 27, 27, 27, 8, 28, 28, + 28, 28, 28, 31, 31, 31, 31, 31, 27, 327, + 145, 27, 327, 7, 28, 31, 31, 28, 326, 31, + 342, 2174, 31, 326, 791, 342, 360, 360, 360, 360, + 477, 477, 791, 8, 11, 11, 11, 11, 11, 11, + + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 17, + 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, + 2037, 19, 19, 134, 307, 19, 134, 307, 17, 338, + 19, 19, 338, 18, 563, 19, 134, 20, 19, 20, + 20, 134, 371, 20, 2176, 375, 19, 371, 20, 20, + 375, 563, 39, 20, 39, 39, 20, 32, 32, 32, + + 32, 32, 2037, 889, 20, 33, 889, 33, 33, 32, + 32, 39, 485, 32, 485, 563, 32, 33, 33, 61, + 17, 61, 61, 858, 33, 18, 17, 479, 338, 479, + 34, 18, 34, 34, 62, 911, 62, 62, 61, 911, + 19, 479, 34, 34, 307, 388, 39, 394, 39, 34, + 388, 858, 394, 62, 366, 366, 366, 366, 20, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 29, 2177, 29, 29, 639, 398, + 30, 29, 30, 30, 398, 639, 29, 30, 382, 382, + 382, 382, 30, 29, 40, 894, 40, 40, 1218, 30, + 29, 29, 37, 382, 37, 37, 30, 30, 38, 1218, + 38, 38, 894, 40, 37, 43, 480, 43, 43, 480, + 38, 37, 41, 41, 41, 41, 41, 38, 41, 480, + 37, 2050, 680, 41, 43, 51, 38, 51, 51, 680, + 495, 41, 43, 495, 313, 313, 313, 313, 40, 51, + 40, 548, 410, 495, 51, 29, 44, 410, 44, 44, + + 725, 30, 35, 35, 35, 35, 35, 725, 42, 42, + 42, 42, 42, 415, 42, 44, 548, 425, 415, 42, + 449, 35, 425, 44, 43, 449, 2050, 42, 35, 35, + 51, 35, 452, 850, 49, 452, 49, 49, 452, 53, + 49, 53, 53, 41, 41, 49, 1009, 896, 49, 52, + 455, 52, 52, 49, 54, 455, 54, 54, 53, 850, + 1009, 35, 464, 52, 313, 44, 564, 464, 52, 299, + 299, 299, 299, 54, 663, 35, 663, 35, 59, 35, + 59, 59, 1045, 35, 36, 36, 36, 36, 36, 42, + 42, 564, 1045, 55, 299, 55, 55, 59, 60, 55, + + 60, 60, 2178, 36, 52, 503, 896, 55, 503, 470, + 36, 36, 55, 36, 470, 49, 49, 60, 503, 638, + 670, 53, 670, 63, 63, 63, 63, 63, 65, 2179, + 65, 65, 66, 59, 66, 66, 54, 63, 293, 293, + 293, 293, 63, 36, 638, 476, 488, 65, 55, 299, + 476, 66, 717, 60, 717, 483, 293, 36, 488, 36, + 483, 36, 902, 488, 902, 36, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 50, 50, 50, 50, + 50, 913, 50, 50, 1237, 913, 56, 50, 56, 56, + 50, 1237, 56, 499, 57, 50, 57, 57, 499, 606, + 56, 58, 606, 58, 58, 56, 504, 67, 57, 67, + 67, 504, 606, 57, 68, 58, 68, 68, 1147, 1147, + 58, 64, 64, 64, 64, 64, 67, 505, 383, 383, + 383, 383, 505, 68, 69, 64, 69, 69, 1154, 1154, + + 64, 56, 70, 383, 70, 70, 69, 69, 71, 71, + 71, 71, 71, 69, 70, 70, 1014, 50, 50, 1014, + 2181, 70, 71, 294, 294, 294, 294, 71, 314, 314, + 314, 314, 511, 524, 851, 57, 71, 511, 524, 71, + 2182, 294, 58, 72, 72, 72, 72, 72, 67, 67, + 73, 73, 73, 73, 73, 68, 68, 72, 75, 851, + 75, 75, 72, 71, 74, 74, 74, 74, 74, 73, + 525, 72, 2183, 1017, 72, 525, 1017, 75, 73, 520, + 73, 520, 76, 74, 76, 76, 75, 77, 75, 77, + 77, 532, 74, 520, 74, 918, 532, 918, 72, 77, + + 77, 76, 78, 2185, 78, 78, 77, 912, 314, 912, + 76, 1008, 76, 912, 78, 78, 387, 387, 387, 387, + 1008, 78, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, + + 79, 79, 79, 79, 79, 79, 79, 81, 81, 81, + 81, 81, 1494, 82, 82, 82, 82, 82, 1156, 1156, + 1494, 81, 315, 315, 315, 315, 81, 82, 420, 420, + 420, 420, 82, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 85, 85, 85, 85, 85, 1201, + 83, 83, 83, 83, 83, 83, 538, 91, 85, 91, + 91, 538, 85, 85, 92, 1201, 92, 92, 105, 539, + 105, 105, 85, 1056, 539, 85, 91, 1056, 83, 83, + 83, 547, 99, 92, 99, 99, 547, 105, 384, 384, + + 384, 384, 315, 555, 99, 562, 99, 568, 555, 85, + 562, 99, 568, 384, 2186, 83, 83, 83, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 86, + 86, 86, 86, 86, 2187, 84, 84, 84, 84, 84, + 84, 569, 106, 86, 106, 106, 569, 86, 86, 575, + 576, 1167, 99, 1167, 575, 576, 100, 86, 100, 100, + 86, 106, 579, 84, 84, 84, 577, 579, 100, 107, + 100, 107, 107, 577, 2086, 100, 577, 409, 409, 409, + 409, 577, 107, 1025, 86, 1354, 1025, 1354, 107, 409, + + 84, 84, 84, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 89, 89, 89, 89, 89, 925, + 87, 87, 87, 87, 87, 87, 100, 108, 619, 108, + 108, 619, 2086, 89, 300, 300, 300, 300, 582, 121, + 108, 121, 121, 582, 925, 89, 108, 619, 87, 87, + 87, 115, 115, 115, 115, 115, 2058, 882, 121, 300, + 421, 421, 421, 421, 882, 115, 882, 1241, 1241, 89, + 115, 422, 422, 422, 422, 87, 87, 87, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + + 88, 88, 88, 88, 88, 88, 88, 88, 88, 90, + 90, 90, 90, 90, 1179, 88, 88, 88, 88, 88, + 88, 2058, 116, 116, 116, 116, 116, 122, 90, 122, + 122, 125, 2188, 125, 125, 117, 116, 117, 117, 1179, + 90, 116, 595, 88, 88, 88, 122, 595, 117, 117, + 125, 1260, 1260, 1050, 117, 435, 435, 435, 435, 441, + 441, 441, 441, 1050, 90, 508, 508, 508, 508, 2190, + 88, 88, 88, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 93, 93, 93, 93, 93, 93, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 1030, 95, 2191, 1030, 95, 118, + 601, 118, 118, 2065, 1210, 601, 95, 95, 95, 95, + 95, 608, 118, 118, 1210, 1213, 608, 126, 118, 126, + + 126, 1213, 103, 103, 103, 103, 103, 104, 104, 104, + 104, 104, 628, 95, 637, 95, 126, 628, 1442, 637, + 139, 103, 139, 139, 1339, 1339, 104, 509, 509, 509, + 509, 103, 510, 510, 510, 510, 104, 1442, 2065, 139, + 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 644, + 96, 103, 1049, 96, 644, 1049, 104, 135, 924, 135, + 135, 96, 96, 96, 96, 96, 1059, 103, 136, 103, + 136, 136, 104, 103, 104, 1059, 135, 1090, 104, 113, + 113, 113, 113, 113, 924, 135, 1090, 136, 96, 140, + + 96, 140, 140, 113, 1516, 937, 136, 937, 113, 522, + 522, 522, 522, 546, 546, 546, 546, 113, 140, 937, + 2047, 301, 301, 301, 301, 96, 96, 96, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 113, 97, 301, 1206, 97, 114, + 114, 114, 114, 114, 1268, 1516, 97, 97, 97, 97, + 97, 653, 143, 114, 143, 143, 653, 144, 114, 144, + 144, 2047, 149, 1206, 149, 149, 127, 114, 127, 127, + 114, 143, 659, 97, 666, 97, 144, 659, 679, 666, + 127, 149, 1361, 679, 1361, 127, 521, 521, 521, 521, + + 1268, 682, 528, 689, 114, 528, 682, 127, 689, 521, + 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 1240, + 98, 127, 528, 98, 128, 128, 128, 128, 128, 1240, + 2192, 98, 98, 98, 98, 98, 2193, 150, 128, 150, + 150, 633, 1386, 128, 633, 189, 528, 189, 189, 155, + 1138, 155, 155, 2194, 633, 128, 150, 673, 98, 1138, + 98, 155, 155, 156, 189, 156, 156, 1386, 155, 673, + 523, 523, 523, 523, 673, 156, 156, 1208, 1142, 128, + 1208, 1142, 156, 523, 1142, 98, 98, 98, 101, 101, + + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, + 109, 109, 109, 109, 109, 109, 109, 109, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, + 111, 111, 111, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 129, 1211, 129, 129, 2195, 1211, 130, + 130, 130, 130, 130, 1578, 692, 131, 129, 131, 131, + 692, 129, 129, 130, 1223, 697, 1387, 130, 130, 132, + 697, 132, 132, 1223, 129, 131, 295, 295, 295, 295, + 130, 1387, 1578, 159, 700, 159, 159, 131, 132, 700, + 649, 649, 146, 649, 295, 146, 159, 1221, 129, 2196, + 132, 1221, 159, 649, 130, 146, 553, 553, 553, 553, + 146, 131, 589, 589, 589, 589, 705, 1248, 710, 146, + + 1248, 705, 146, 710, 132, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 146, 157, 157, 157, + 157, 157, 133, 133, 133, 133, 133, 133, 1239, 157, + 157, 1245, 1239, 157, 1346, 1245, 157, 169, 1346, 169, + 169, 158, 158, 158, 158, 158, 160, 169, 160, 160, + 133, 133, 133, 158, 158, 1309, 169, 158, 1309, 160, + 158, 590, 590, 590, 590, 160, 592, 592, 592, 592, + 596, 596, 596, 596, 1309, 1483, 1483, 133, 133, 133, + 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, + + 137, 137, 137, 137, 137, 137, 170, 137, 170, 170, + 137, 161, 161, 161, 161, 161, 170, 1465, 137, 137, + 137, 137, 137, 161, 161, 170, 1313, 161, 2197, 1313, + 161, 181, 181, 181, 181, 181, 162, 162, 162, 162, + 162, 165, 1465, 165, 165, 137, 2198, 137, 162, 162, + 181, 190, 162, 190, 190, 162, 681, 165, 715, 681, + 165, 542, 724, 715, 542, 2199, 728, 724, 165, 681, + 190, 728, 137, 137, 137, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 542, 138, 736, 2200, 138, 748, 166, 736, 166, + + 166, 748, 1320, 138, 138, 138, 138, 138, 182, 182, + 182, 182, 182, 166, 2201, 542, 166, 183, 183, 183, + 183, 183, 165, 201, 166, 201, 201, 182, 1320, 1390, + 138, 202, 138, 202, 202, 1480, 183, 184, 184, 184, + 184, 184, 201, 598, 598, 598, 598, 1396, 1480, 1396, + 202, 304, 304, 304, 304, 1390, 184, 138, 138, 138, + 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 141, 141, 141, 141, 141, 141, 304, 141, 166, 1701, + 141, 167, 167, 167, 167, 167, 2202, 1834, 141, 141, + 141, 141, 141, 1701, 185, 185, 185, 185, 185, 1834, + + 167, 186, 186, 186, 186, 186, 168, 168, 168, 168, + 168, 1345, 167, 185, 1345, 141, 231, 141, 231, 231, + 186, 232, 720, 232, 232, 168, 616, 616, 616, 616, + 642, 642, 642, 642, 720, 231, 167, 168, 1020, 720, + 232, 1020, 141, 141, 141, 142, 142, 142, 142, 142, + 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, + 142, 168, 142, 1466, 177, 142, 177, 177, 209, 2203, + 209, 209, 177, 142, 142, 142, 142, 142, 177, 210, + 757, 210, 210, 177, 774, 757, 1469, 209, 1466, 774, + 2205, 178, 777, 178, 178, 177, 209, 777, 210, 178, + + 142, 241, 142, 241, 241, 178, 235, 210, 235, 235, + 178, 1469, 235, 688, 688, 688, 688, 1342, 1020, 177, + 241, 1342, 178, 572, 1342, 235, 572, 142, 142, 142, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 178, 147, 2040, 179, + 147, 179, 179, 572, 891, 1514, 891, 179, 147, 147, + 147, 147, 147, 179, 242, 1247, 242, 242, 179, 213, + 213, 213, 213, 213, 1247, 2206, 180, 572, 180, 180, + 179, 1247, 1821, 242, 180, 147, 691, 147, 213, 691, + 180, 236, 1821, 236, 236, 180, 1509, 236, 1514, 691, + + 739, 739, 739, 739, 179, 2040, 782, 180, 1471, 891, + 236, 782, 147, 147, 147, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 180, 148, 1471, 2207, 148, 187, 187, 187, 187, + 187, 2044, 1511, 148, 148, 148, 148, 148, 1509, 214, + 214, 214, 214, 214, 1509, 187, 215, 215, 215, 215, + 215, 1873, 1873, 237, 187, 237, 237, 187, 214, 237, + 148, 253, 148, 253, 253, 215, 216, 216, 216, 216, + 216, 1160, 237, 2044, 1160, 253, 756, 756, 756, 756, + 253, 187, 1511, 1511, 1160, 216, 2208, 148, 148, 148, + + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 188, 188, 188, 188, 188, 2209, 1513, 173, 173, + 173, 173, 173, 1475, 217, 217, 217, 217, 217, 1518, + 188, 218, 218, 218, 218, 218, 2210, 1861, 238, 188, + 238, 238, 188, 217, 238, 173, 173, 173, 1475, 1861, + + 218, 219, 219, 219, 219, 219, 1513, 238, 758, 758, + 758, 758, 783, 783, 783, 783, 188, 758, 1518, 1513, + 219, 758, 173, 173, 173, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 193, 790, 193, 193, + 1718, 790, 790, 174, 174, 174, 174, 174, 2211, 220, + 220, 220, 220, 220, 1718, 193, 223, 223, 223, 223, + 223, 224, 224, 224, 224, 224, 1175, 193, 220, 1175, + 174, 174, 174, 811, 254, 223, 254, 254, 811, 1175, + 224, 751, 751, 751, 751, 817, 1700, 820, 254, 823, + + 817, 193, 820, 254, 823, 1700, 751, 174, 174, 174, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 191, 191, 191, 191, 191, + + 191, 191, 191, 829, 191, 191, 191, 191, 829, 1625, + 191, 194, 191, 194, 194, 191, 221, 834, 221, 221, + 2049, 2042, 834, 191, 191, 191, 191, 191, 840, 203, + 194, 203, 203, 840, 255, 221, 255, 255, 256, 845, + 256, 256, 194, 261, 845, 261, 261, 221, 203, 261, + 191, 191, 191, 255, 261, 261, 261, 256, 848, 203, + 853, 2049, 261, 848, 855, 853, 194, 1616, 203, 855, + 1616, 221, 701, 203, 2042, 701, 1625, 191, 191, 192, + 192, 192, 192, 192, 192, 192, 192, 1510, 192, 192, + 192, 192, 558, 203, 192, 558, 192, 701, 203, 192, + + 222, 701, 222, 222, 1158, 558, 1158, 192, 192, 192, + 192, 192, 861, 204, 2212, 204, 204, 861, 1158, 222, + 867, 249, 558, 249, 249, 867, 250, 1658, 250, 250, + 1510, 222, 204, 870, 192, 192, 192, 2213, 870, 271, + 249, 271, 271, 204, 1510, 250, 558, 784, 784, 784, + 784, 1476, 204, 1658, 873, 222, 271, 204, 271, 873, + 2215, 192, 192, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 1476, 204, 195, 195, + 195, 195, 204, 195, 227, 249, 227, 227, 895, 2217, + 250, 195, 195, 195, 195, 195, 876, 881, 227, 249, + + 895, 876, 881, 227, 250, 895, 900, 228, 904, 228, + 228, 900, 2218, 904, 257, 227, 257, 257, 195, 195, + 195, 228, 332, 332, 332, 332, 228, 928, 752, 752, + 752, 752, 928, 257, 785, 785, 785, 785, 228, 227, + 332, 2062, 257, 752, 257, 195, 195, 195, 196, 196, + 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, + 196, 2219, 228, 196, 196, 196, 196, 258, 196, 258, + 258, 272, 1182, 272, 272, 1182, 196, 196, 196, 196, + 196, 262, 2062, 262, 262, 1182, 258, 262, 272, 921, + 272, 1558, 262, 262, 262, 258, 259, 258, 259, 259, + + 262, 921, 259, 196, 196, 196, 921, 259, 265, 265, + 265, 265, 265, 931, 265, 259, 1558, 1902, 931, 265, + 265, 265, 805, 805, 805, 805, 1631, 265, 1631, 1902, + 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 2220, + 197, 259, 273, 197, 273, 273, 274, 274, 274, 274, + 274, 197, 197, 197, 197, 197, 263, 1812, 263, 263, + 274, 273, 263, 1919, 914, 274, 617, 263, 914, 617, + 1651, 260, 1651, 260, 260, 263, 914, 260, 197, 941, + 197, 914, 260, 1812, 263, 536, 263, 536, 536, 1919, + + 260, 941, 536, 945, 617, 954, 941, 273, 945, 1641, + 954, 274, 2222, 1641, 536, 197, 197, 197, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 198, 617, 198, 260, 275, 198, 275, + 275, 276, 276, 276, 276, 276, 198, 198, 198, 198, + 198, 264, 617, 264, 264, 276, 275, 264, 963, 982, + 276, 2223, 264, 963, 982, 266, 266, 266, 266, 266, + 264, 266, 1190, 198, 1190, 198, 266, 266, 266, 264, + 550, 264, 550, 550, 266, 1517, 1190, 550, 883, 883, + 883, 883, 275, 989, 1571, 2224, 276, 1572, 989, 550, + + 198, 198, 198, 199, 199, 199, 199, 199, 199, 199, + 199, 199, 199, 199, 199, 199, 199, 199, 199, 1571, + 199, 1717, 1572, 199, 319, 319, 319, 319, 1517, 2225, + 1717, 199, 199, 199, 199, 199, 267, 267, 267, 267, + 267, 2226, 267, 336, 336, 336, 336, 267, 267, 319, + 268, 268, 268, 268, 268, 267, 268, 1724, 199, 1249, + 199, 268, 268, 1249, 267, 1724, 267, 1719, 336, 268, + 815, 815, 815, 815, 815, 1644, 1719, 1249, 268, 1644, + 268, 337, 337, 337, 337, 199, 199, 199, 200, 200, + 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, + + 200, 200, 200, 200, 1042, 200, 337, 1042, 200, 269, + 269, 269, 269, 269, 2028, 2229, 200, 200, 200, 200, + 200, 270, 270, 270, 270, 270, 2028, 2028, 269, 333, + 333, 333, 333, 347, 347, 347, 347, 269, 578, 269, + 270, 578, 702, 200, 702, 200, 702, 333, 2051, 270, + 993, 270, 997, 702, 1261, 993, 578, 997, 347, 702, + 347, 1261, 702, 1042, 350, 350, 350, 350, 578, 1261, + 200, 200, 200, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 205, 205, 205, 205, 205, 350, + 205, 350, 578, 205, 341, 341, 341, 341, 2230, 2051, + + 205, 205, 205, 205, 205, 205, 344, 344, 344, 344, + 2231, 1730, 341, 349, 349, 349, 349, 1455, 1455, 1720, + 358, 358, 358, 358, 344, 1455, 1007, 1730, 205, 205, + 205, 1007, 350, 1720, 400, 400, 400, 400, 349, 1031, + 349, 1037, 350, 1039, 1031, 358, 1037, 358, 1039, 351, + 351, 351, 351, 400, 1455, 205, 205, 205, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 351, 206, 351, 1776, 206, 349, + 353, 353, 353, 353, 358, 206, 206, 206, 206, 206, + 206, 1776, 1809, 352, 352, 352, 352, 361, 361, 361, + + 361, 355, 355, 355, 355, 353, 1809, 353, 354, 354, + 354, 354, 1646, 206, 206, 206, 1646, 351, 352, 1647, + 352, 995, 361, 1647, 995, 1859, 355, 1859, 355, 885, + 885, 885, 885, 354, 995, 354, 353, 1874, 2232, 995, + 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, + 207, 1874, 207, 207, 207, 207, 207, 207, 207, 1141, + 207, 1808, 352, 207, 1141, 355, 362, 362, 362, 362, + 1808, 207, 207, 207, 207, 355, 363, 363, 363, 363, + 354, 1830, 1863, 354, 1183, 356, 356, 356, 356, 1183, + 1863, 362, 357, 357, 357, 357, 2045, 1830, 207, 207, + + 207, 363, 367, 367, 367, 367, 886, 886, 886, 886, + 356, 2057, 356, 887, 887, 887, 887, 357, 1657, 357, + 367, 365, 365, 365, 365, 207, 207, 208, 208, 208, + 208, 208, 208, 208, 208, 1964, 208, 208, 208, 208, + 208, 208, 208, 1657, 208, 356, 365, 208, 365, 368, + 368, 368, 368, 2045, 1189, 208, 208, 208, 208, 1189, + 357, 1964, 2057, 1139, 356, 357, 1139, 368, 369, 369, + 369, 369, 370, 370, 370, 370, 379, 379, 379, 379, + 2233, 1139, 208, 208, 208, 565, 369, 565, 1060, 565, + 370, 1060, 1060, 565, 379, 2234, 565, 910, 910, 910, + + 910, 565, 565, 1197, 1833, 565, 1060, 1833, 1197, 208, + 208, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 225, 225, 225, 225, + + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 1271, 229, 2214, + + 2214, 229, 1271, 753, 753, 753, 753, 2235, 2043, 229, + 229, 229, 229, 229, 430, 430, 430, 430, 753, 431, + 431, 431, 431, 432, 432, 432, 432, 395, 395, 395, + 395, 1862, 396, 396, 396, 396, 229, 1487, 229, 430, + 2237, 1862, 1487, 419, 431, 419, 419, 2043, 432, 419, + 970, 970, 970, 970, 419, 395, 397, 397, 397, 397, + 396, 2052, 419, 229, 229, 229, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 1727, 230, 397, 395, 230, 1727, 1259, 537, + 396, 2048, 537, 2238, 230, 230, 230, 230, 230, 395, + + 2052, 395, 537, 395, 396, 1259, 396, 537, 396, 434, + 434, 434, 434, 2239, 397, 436, 436, 436, 436, 537, + 1643, 230, 1643, 230, 419, 419, 1643, 2240, 397, 1259, + 397, 2241, 397, 2048, 434, 819, 819, 819, 819, 819, + 436, 2236, 2236, 537, 971, 971, 971, 971, 230, 230, + 230, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, + 233, 233, 233, 233, 233, 233, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, + + 243, 243, 243, 243, 243, 243, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 1054, 245, 2059, 1054, 245, 437, 437, 437, + 437, 1619, 1982, 1619, 245, 245, 245, 245, 245, 438, + 438, 438, 438, 440, 440, 440, 440, 451, 451, 451, + 451, 1888, 437, 2242, 1888, 494, 494, 494, 1982, 494, + 2243, 245, 1693, 245, 438, 451, 2245, 2246, 440, 494, + 972, 972, 972, 972, 494, 822, 822, 822, 822, 822, + 2059, 1054, 583, 583, 583, 583, 1619, 1693, 245, 245, + 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, + + 246, 246, 246, 246, 246, 246, 246, 583, 246, 2141, + 494, 246, 551, 551, 551, 551, 2023, 2046, 2141, 246, + 246, 246, 246, 246, 1515, 551, 554, 554, 554, 554, + 551, 2173, 2023, 1993, 573, 573, 573, 573, 1222, 554, + 2173, 1222, 551, 825, 554, 825, 246, 566, 246, 566, + 566, 566, 573, 566, 566, 1185, 1222, 566, 1185, 1993, + 566, 2046, 825, 1515, 2039, 566, 551, 1515, 1185, 566, + 1825, 825, 1515, 246, 246, 246, 247, 247, 247, 247, + 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, + 247, 247, 2247, 247, 2251, 1825, 247, 567, 825, 1923, + + 567, 1959, 1848, 2252, 247, 247, 247, 247, 247, 2039, + 567, 574, 574, 574, 574, 567, 584, 584, 584, 584, + 585, 585, 585, 585, 1923, 1232, 1959, 567, 1232, 574, + 1192, 247, 1192, 247, 759, 759, 759, 759, 1232, 1274, + 2054, 584, 1274, 759, 1192, 585, 2253, 759, 1848, 1192, + 1848, 567, 588, 588, 588, 588, 2254, 1274, 247, 247, + 247, 248, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 248, 588, 248, 2054, + 2255, 248, 610, 610, 610, 610, 2256, 2041, 2257, 248, + 248, 248, 248, 248, 611, 611, 611, 611, 612, 612, + + 612, 612, 615, 615, 615, 615, 1960, 610, 733, 733, + 733, 733, 762, 762, 762, 762, 248, 1312, 248, 611, + 1312, 645, 645, 612, 645, 645, 1670, 615, 1670, 645, + 762, 1960, 2041, 733, 2258, 645, 1312, 645, 645, 2259, + 1670, 645, 645, 248, 248, 248, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, + 277, 277, 277, 277, 277, 277, 335, 335, 335, 335, + 1741, 1963, 335, 1741, 640, 640, 640, 640, 2300, 2326, + 2038, 643, 643, 643, 643, 2216, 2189, 640, 1741, 2189, + 1199, 335, 640, 1199, 643, 699, 1963, 2336, 699, 643, + 646, 2216, 646, 646, 640, 646, 646, 646, 699, 2353, + 646, 643, 734, 734, 734, 734, 646, 2355, 646, 646, + 1199, 2038, 646, 646, 335, 699, 335, 1965, 640, 1892, + 335, 2038, 1892, 335, 335, 643, 335, 734, 2357, 335, + 335, 335, 335, 535, 1199, 535, 535, 535, 535, 699, + + 1472, 535, 1965, 1472, 535, 535, 535, 535, 1892, 535, + 535, 535, 535, 535, 549, 549, 549, 549, 549, 549, + 2358, 1806, 549, 2359, 1806, 549, 549, 549, 549, 1472, + 549, 549, 549, 549, 549, 549, 703, 2361, 703, 1806, + 703, 1244, 703, 703, 704, 1244, 1472, 704, 1244, 703, + 735, 735, 735, 735, 703, 703, 2362, 704, 703, 1244, + 2363, 2364, 704, 730, 730, 730, 730, 738, 738, 738, + 738, 2365, 1472, 1091, 704, 735, 1091, 1091, 741, 741, + 741, 741, 730, 730, 730, 730, 730, 730, 730, 741, + 1299, 1091, 738, 1299, 747, 747, 747, 747, 704, 760, + + 760, 760, 760, 1299, 741, 747, 1615, 2056, 760, 1615, + 1470, 1615, 760, 761, 761, 761, 761, 770, 770, 770, + 747, 770, 761, 2366, 1470, 2370, 761, 763, 763, 763, + 763, 800, 800, 800, 800, 1470, 770, 801, 801, 801, + 801, 802, 802, 802, 802, 763, 804, 804, 804, 804, + 1470, 826, 826, 826, 826, 1969, 800, 866, 866, 866, + 866, 866, 801, 1817, 2056, 1817, 802, 827, 827, 827, + 827, 804, 770, 1300, 747, 781, 1300, 1817, 1970, 781, + 1969, 826, 1371, 781, 2373, 1371, 1300, 781, 781, 905, + 905, 905, 905, 781, 2374, 1371, 781, 827, 1347, 1347, + + 781, 1347, 781, 1970, 781, 826, 1233, 1379, 781, 1233, + 1379, 1347, 781, 781, 905, 781, 1440, 2376, 1440, 781, + 1379, 827, 1440, 781, 792, 869, 869, 869, 869, 869, + 872, 872, 872, 872, 872, 1440, 1233, 2066, 792, 875, + 875, 875, 875, 875, 884, 884, 884, 884, 884, 2064, + 2415, 792, 792, 792, 792, 792, 792, 1463, 792, 792, + 1233, 792, 792, 1973, 792, 792, 1463, 792, 792, 792, + 792, 2416, 828, 828, 828, 828, 792, 792, 792, 792, + 792, 792, 1463, 792, 792, 1975, 792, 792, 1973, 792, + 792, 1463, 2066, 792, 792, 792, 792, 793, 793, 793, + + 793, 793, 828, 1976, 793, 793, 2064, 793, 2371, 2371, + 1975, 793, 1385, 793, 793, 1385, 793, 793, 793, 794, + 906, 906, 906, 906, 794, 1385, 828, 794, 1976, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 888, + 888, 888, 888, 1951, 1951, 906, 907, 907, 907, 907, + 2000, 1951, 888, 909, 909, 909, 909, 888, 947, 947, + 947, 947, 979, 979, 979, 979, 949, 794, 949, 947, + 2381, 907, 949, 957, 2360, 957, 2000, 949, 909, 957, + 1951, 1978, 2360, 947, 957, 957, 957, 980, 980, 980, + 980, 1697, 957, 2418, 1697, 794, 795, 795, 795, 795, + + 981, 981, 981, 981, 1697, 2053, 1978, 795, 1006, 1006, + 1006, 1006, 969, 969, 969, 969, 969, 795, 969, 795, + 795, 949, 2381, 969, 969, 969, 1006, 1011, 1011, 1011, + 1011, 969, 1012, 1012, 1012, 1012, 1015, 1015, 1015, 1015, + 1018, 1018, 1018, 1018, 795, 2261, 795, 795, 795, 795, + 795, 795, 1011, 795, 795, 2053, 795, 1012, 2261, 2367, + 795, 1015, 795, 795, 2367, 795, 795, 795, 796, 1016, + 1016, 1016, 1016, 796, 2368, 2393, 796, 2368, 796, 796, + 796, 796, 796, 796, 796, 796, 796, 796, 1022, 1022, + 1022, 1022, 1986, 2419, 1016, 1023, 1023, 1023, 1023, 1024, + + 1024, 1024, 1024, 1026, 1026, 1026, 1026, 1011, 1027, 1027, + 1027, 1027, 1028, 1028, 1028, 1028, 796, 1986, 1015, 1080, + 1080, 1080, 1080, 1815, 1024, 2393, 1815, 2375, 1026, 1035, + 2368, 2369, 796, 1027, 2369, 2007, 1815, 1028, 1035, 1035, + 1035, 1035, 1035, 2375, 796, 1036, 1036, 1036, 1036, 1038, + 1038, 1038, 1038, 1041, 1041, 1041, 1041, 1057, 1057, 1057, + 1057, 2007, 1819, 1036, 1819, 2420, 1955, 1038, 1022, 1955, + 1057, 1058, 1058, 1058, 1058, 1023, 1819, 1990, 1041, 1061, + 1061, 1061, 1061, 1026, 1040, 1040, 1040, 1040, 1225, 1991, + 1040, 1062, 1062, 1062, 1062, 1955, 1058, 1063, 1063, 1063, + + 1063, 2423, 1990, 2424, 1061, 1066, 1066, 1066, 1066, 1040, + 1065, 1065, 1065, 1065, 1991, 2063, 1062, 2379, 1062, 2425, + 1854, 2074, 1063, 1854, 1063, 1994, 1081, 1081, 1081, 1081, + 1066, 2427, 1066, 1854, 1225, 1065, 2396, 1065, 1067, 1067, + 1067, 1067, 1040, 1855, 1040, 1225, 1855, 2074, 1040, 1225, + 1994, 1040, 1040, 1081, 1040, 2380, 1855, 1040, 1040, 1040, + 1040, 1061, 2063, 1067, 2379, 1067, 1065, 1068, 1068, 1068, + 1068, 1069, 1069, 1069, 1069, 1070, 1070, 1070, 1070, 1998, + 1066, 1071, 1071, 1071, 1071, 2396, 1072, 1072, 1072, 1072, + 2055, 1439, 1068, 1439, 1068, 2387, 1069, 1439, 1069, 2385, + + 1070, 2380, 1070, 1999, 1998, 2430, 1071, 2431, 1071, 1439, + 1439, 1072, 1067, 1072, 1082, 1082, 1082, 1082, 2386, 1073, + 1073, 1073, 1073, 2002, 1074, 1074, 1074, 1074, 1999, 1962, + 1069, 2055, 1962, 1068, 1075, 1075, 1075, 1075, 2387, 1082, + 2435, 1068, 1070, 1072, 1073, 1071, 1073, 2055, 2002, 1074, + 1071, 1074, 1076, 1076, 1076, 1076, 2385, 1468, 1962, 1075, + 1468, 1075, 1077, 1077, 1077, 1077, 1078, 1078, 1078, 1078, + 1079, 1079, 1079, 1079, 2386, 2107, 2406, 1076, 2107, 1076, + 1074, 1073, 1084, 1084, 1084, 1084, 1468, 1077, 2107, 1077, + 2395, 1078, 2436, 1078, 2302, 1079, 1074, 1079, 2388, 1468, + + 1468, 1075, 1085, 1085, 1085, 1085, 2080, 1084, 1086, 1086, + 1086, 1086, 1088, 1088, 1088, 1088, 1089, 1089, 1089, 1089, + 1971, 2302, 1076, 1971, 1468, 1468, 1077, 1085, 2437, 1085, + 1078, 2080, 2395, 1086, 2406, 1086, 1093, 1093, 1093, 1093, + 2081, 2388, 1079, 1089, 1094, 1094, 1094, 1094, 2390, 1971, + 2426, 1093, 1095, 1095, 1095, 1095, 1096, 1096, 1096, 1096, + 1097, 1097, 1097, 1097, 1084, 2081, 1102, 1102, 1102, 1102, + 1103, 1103, 1103, 1103, 1108, 1108, 1108, 1108, 2093, 1097, + 1109, 1109, 1109, 1109, 1096, 1102, 1108, 1112, 2094, 1112, + 1112, 1109, 2438, 1112, 1114, 1114, 1114, 1114, 1112, 1115, + + 1115, 1115, 1115, 2093, 2410, 2390, 1112, 1119, 1120, 1120, + 1120, 1120, 2184, 2094, 1096, 2184, 1119, 1119, 1119, 1119, + 1119, 1123, 1123, 1123, 1123, 2426, 1974, 2440, 1096, 1974, + 1096, 2175, 1096, 1125, 1125, 1125, 1125, 1126, 1126, 1126, + 1126, 1127, 1127, 1127, 1127, 2248, 1123, 1129, 1129, 1129, + 1129, 1131, 1131, 1131, 1131, 1974, 2175, 2410, 1125, 2443, + 2445, 2278, 1126, 1132, 1132, 1132, 1132, 1272, 1112, 1112, + 1272, 2248, 1129, 1136, 2184, 2389, 1131, 1133, 1133, 1133, + 1133, 2404, 1136, 1136, 1136, 1136, 1136, 2278, 1132, 1140, + 1140, 1140, 1140, 2244, 1173, 1173, 1173, 1272, 1173, 1186, + + 1186, 1186, 1186, 1193, 1193, 1193, 1193, 1140, 1173, 1194, + 1194, 1194, 1194, 1173, 2398, 1125, 1193, 1227, 2244, 2403, + 1227, 1272, 2389, 1957, 1250, 1250, 1250, 1250, 2404, 2292, + 1227, 2383, 1957, 1131, 2446, 1227, 2409, 1250, 1252, 1252, + 1252, 1252, 1250, 1255, 1255, 1255, 1255, 1227, 1957, 1173, + 1200, 1200, 1200, 1200, 1250, 2292, 1200, 1957, 2394, 1200, + 1200, 1200, 1200, 2398, 1200, 1200, 1200, 1200, 1200, 2270, + 2271, 1227, 1253, 1253, 1253, 1253, 2403, 2383, 1250, 1257, + 1257, 1257, 1257, 1258, 1270, 1253, 1258, 1270, 1275, 1275, + 1275, 1275, 1257, 2409, 2270, 2271, 1258, 1270, 1279, 2394, + + 2392, 1279, 1270, 1952, 1952, 2299, 1275, 1282, 1282, 1282, + 1282, 1952, 1389, 1258, 1270, 1389, 1279, 1285, 1285, 1285, + 1285, 1286, 1286, 1286, 1286, 1389, 1695, 2447, 1279, 1695, + 1389, 2299, 1282, 1287, 1287, 1287, 1287, 1258, 1270, 1695, + 1952, 2448, 1285, 2392, 1695, 1507, 1286, 1289, 1289, 1289, + 1289, 2411, 1279, 1294, 1294, 1294, 1294, 1302, 1302, 1302, + 1302, 1304, 1304, 1304, 1304, 1305, 1305, 1305, 1305, 1306, + 1306, 1306, 1306, 1308, 2397, 2272, 1308, 2274, 1321, 1321, + 1321, 1321, 1302, 2449, 1507, 2450, 1304, 2391, 1507, 2305, + 1305, 1321, 1323, 1323, 1323, 1323, 1321, 1507, 2411, 1285, + + 2272, 1308, 2274, 1324, 1324, 1324, 1324, 2451, 1321, 1326, + 1326, 1977, 1326, 1326, 1977, 2305, 1324, 1326, 2452, 2397, + 2453, 1324, 2454, 1326, 1979, 1326, 1326, 1979, 2391, 1326, + 1326, 1308, 1321, 1324, 1327, 1327, 2391, 1327, 1327, 2455, + 1977, 2282, 1327, 1304, 1328, 1328, 1328, 1328, 1327, 1308, + 1327, 1327, 2286, 1979, 1327, 1327, 2457, 1324, 1330, 1330, + 1330, 1330, 1331, 1331, 1331, 1331, 2282, 2458, 1332, 1332, + 1980, 1332, 1332, 1980, 1328, 1331, 1332, 2286, 1334, 1334, + 1334, 1334, 1332, 1981, 1332, 1332, 1981, 2459, 1332, 1332, + 2290, 1334, 1331, 1333, 1333, 2399, 1333, 1333, 1328, 1980, + + 2482, 1333, 1381, 1381, 1381, 1381, 2291, 1333, 1334, 1333, + 1333, 2329, 1981, 1333, 1333, 2290, 1331, 1382, 1382, 1382, + 1382, 1407, 1407, 1407, 1407, 1411, 1411, 1411, 1411, 2484, + 1382, 2291, 1334, 1408, 1408, 1408, 1408, 2329, 2399, 2456, + 1410, 1410, 1410, 1410, 2486, 2487, 1407, 2489, 2456, 2400, + 1411, 2407, 1408, 1408, 1408, 1408, 1408, 1408, 1408, 1410, + 1410, 1410, 1410, 1410, 1410, 1410, 1413, 1413, 1413, 1413, + 1414, 1414, 1414, 1414, 1415, 1415, 1415, 1415, 1417, 1417, + 1417, 1417, 1420, 1420, 1420, 1420, 1432, 1432, 1432, 1417, + 1432, 1413, 2400, 1420, 2333, 1414, 1423, 1423, 1423, 1423, + + 1424, 1424, 1424, 1424, 1417, 1432, 2294, 2306, 1420, 2407, + 2407, 1423, 1425, 1425, 1425, 1425, 1426, 1426, 1426, 1426, + 2333, 1427, 1427, 1427, 1427, 1426, 2494, 2495, 2496, 1426, + 1427, 2294, 2306, 2405, 1427, 1445, 1445, 1445, 1445, 2499, + 2316, 1432, 1446, 1446, 1446, 1446, 2500, 2503, 1413, 1447, + 1447, 1447, 1447, 1448, 1448, 1448, 1448, 1449, 1449, 1449, + 1449, 1450, 1420, 2504, 1462, 2316, 1450, 1462, 2506, 2508, + 2509, 1467, 1467, 1467, 1450, 1450, 1450, 1450, 1450, 1450, + 1450, 2510, 1464, 2405, 1464, 2511, 1467, 1474, 1473, 1464, + 1474, 2512, 2513, 1462, 1473, 1473, 1464, 1467, 1477, 1477, + + 1477, 1477, 1474, 1983, 1474, 2515, 1983, 1464, 1462, 1464, + 1462, 1467, 1474, 1473, 1464, 1474, 1478, 1478, 1478, 1478, + 1473, 1473, 1464, 1467, 1479, 1479, 1479, 1479, 1474, 2516, + 1474, 2323, 1983, 1462, 2332, 2517, 1462, 1450, 1458, 2339, + 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, 1458, + 2340, 1481, 1481, 1481, 1481, 2502, 2323, 1477, 2502, 2332, + 1508, 1508, 1508, 1508, 2339, 2429, 1484, 1484, 1484, 1484, + 1477, 2505, 2518, 1477, 2505, 2340, 2519, 1508, 1458, 1505, + 1505, 1505, 1505, 1527, 1527, 1527, 1527, 1606, 1606, 1606, + 1606, 1478, 2429, 1479, 2520, 2521, 1505, 1535, 1535, 1535, + + 1535, 1535, 1523, 1523, 1523, 1523, 1458, 1460, 1460, 1460, + 1460, 1460, 1460, 2522, 1460, 1460, 2343, 1460, 1460, 1481, + 1460, 1460, 1484, 1460, 1460, 1460, 1460, 1523, 1508, 1481, + 1484, 2417, 1460, 1460, 1460, 1460, 1460, 1460, 1508, 1460, + 1460, 2343, 1460, 1460, 1984, 1460, 1460, 1984, 2461, 1460, + 1460, 1460, 1460, 1493, 1505, 2523, 2417, 2461, 1493, 2507, + 2413, 1493, 2507, 1493, 1493, 1493, 1493, 1493, 1493, 1493, + 1493, 1493, 1493, 1984, 1525, 1525, 1525, 1525, 1526, 1526, + 1526, 1526, 1540, 1540, 1540, 1540, 1540, 1607, 1607, 1607, + 1607, 1504, 1504, 1504, 1504, 1506, 1506, 1506, 1506, 1525, + + 1550, 1493, 1550, 1526, 1512, 1512, 1512, 1512, 1504, 2524, + 2401, 2413, 1506, 1545, 1545, 1545, 1545, 1545, 2525, 1550, + 2526, 1512, 1552, 1552, 1552, 1552, 2527, 2528, 1550, 1493, + 1495, 1608, 1608, 1608, 1608, 1495, 1985, 2529, 1495, 1985, + 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, 1495, + 1504, 1506, 1552, 2401, 2514, 1550, 1525, 2514, 2401, 1504, + 1512, 1506, 2530, 1504, 1506, 1985, 1504, 2531, 1512, 1553, + 1553, 1553, 1553, 2532, 2533, 2534, 1552, 2535, 1495, 1584, + 1584, 1584, 1584, 1584, 1589, 1589, 1589, 1589, 1589, 1594, + 1594, 1594, 1594, 1594, 1599, 1599, 1599, 1599, 1599, 1553, + + 1609, 1609, 1609, 1609, 1609, 2536, 1495, 1610, 1610, 1610, + 1610, 1611, 1611, 1611, 1611, 1611, 1612, 1612, 1612, 1612, + 1612, 2537, 2538, 1553, 1613, 1613, 1613, 1613, 1614, 1614, + 1614, 1614, 1635, 1635, 1635, 1635, 1637, 1637, 1637, 1637, + 1638, 1638, 1638, 1638, 1639, 1639, 1639, 1639, 1674, 1674, + 1674, 1674, 1678, 2539, 1678, 2491, 2539, 1635, 1678, 1674, + 2541, 1637, 2542, 1678, 1684, 1638, 1684, 2491, 2544, 1687, + 1684, 2545, 2491, 1674, 2546, 1684, 1684, 1684, 1687, 1687, + 1687, 1687, 1687, 1684, 1689, 1689, 1689, 1689, 1689, 2547, + 1689, 1691, 1691, 1691, 1691, 1689, 1689, 1689, 1692, 1692, + + 1692, 1692, 1987, 1689, 2548, 1987, 2549, 1678, 1703, 1703, + 1703, 1703, 1704, 1704, 1704, 1704, 2550, 2551, 1637, 1705, + 1705, 1705, 1705, 1708, 1708, 1708, 1708, 2552, 2553, 1716, + 2554, 1987, 2555, 1703, 2556, 2557, 2558, 1704, 1716, 1716, + 1716, 1716, 1716, 1735, 1735, 1735, 1735, 1736, 1736, 1736, + 1736, 1737, 1737, 1737, 1737, 2560, 1735, 1744, 1744, 1744, + 1744, 1745, 1745, 1745, 1745, 1746, 1746, 1746, 1746, 1961, + 1961, 1961, 1736, 2561, 2559, 2562, 1737, 1748, 1748, 1748, + 1748, 2566, 1744, 2567, 1961, 2568, 1745, 2569, 1745, 2563, + 1703, 1749, 1749, 1749, 1749, 1750, 1750, 1750, 1750, 2559, + + 1988, 2570, 1748, 1988, 1748, 1751, 1751, 1751, 1751, 1961, + 1752, 1752, 1752, 1752, 2563, 2571, 1749, 2572, 1749, 2573, + 1750, 2574, 1750, 2576, 1753, 1753, 1753, 1753, 1992, 1988, + 1751, 1992, 1751, 2578, 2600, 1752, 2580, 1752, 2607, 1744, + 1754, 1754, 1754, 1754, 1770, 1770, 1770, 1770, 2625, 1753, + 1748, 1753, 2629, 2540, 2633, 1750, 2540, 1992, 1749, 1755, + 1755, 1755, 1755, 2580, 2540, 1754, 2635, 1754, 2637, 1751, + 1752, 1756, 1756, 1756, 1756, 2640, 1757, 1757, 1757, 1757, + 1758, 1758, 1758, 1758, 1755, 2642, 1755, 1759, 1759, 1759, + 1759, 1760, 1760, 1760, 1760, 2644, 1756, 2647, 1756, 1753, + + 1754, 1757, 2652, 1757, 2656, 1758, 2581, 1758, 1768, 1768, + 1768, 1768, 1759, 2667, 1759, 2604, 1760, 2651, 1760, 1761, + 1761, 1761, 1761, 2412, 1762, 1762, 1762, 1762, 1763, 1763, + 1763, 1763, 2581, 1768, 2669, 1755, 2671, 1764, 1764, 1764, + 1764, 2604, 1757, 2651, 1761, 1756, 1761, 2673, 1758, 1762, + 2677, 1762, 2679, 1763, 2684, 1763, 1765, 1765, 1765, 1765, + 2685, 1759, 1764, 2412, 1764, 2686, 1760, 1766, 1766, 1766, + 1766, 1767, 1767, 1767, 1767, 1769, 1769, 1769, 1769, 2412, + 2687, 1765, 2688, 1765, 1762, 1771, 1771, 1771, 1771, 1761, + 1768, 2689, 2690, 2691, 1766, 2692, 2695, 1763, 1767, 2695, + + 1769, 2696, 1769, 2698, 2582, 1764, 1772, 1772, 1772, 1772, + 2699, 2700, 1771, 1777, 1777, 1777, 1777, 1782, 1782, 1782, + 1782, 1788, 1788, 1788, 1788, 1787, 2060, 2702, 1782, 2582, + 1765, 2704, 2705, 1772, 1787, 1787, 1787, 1787, 1787, 1790, + 1790, 1790, 1790, 1793, 1793, 1793, 1793, 1794, 1794, 1794, + 1794, 1795, 1795, 1795, 1795, 1797, 1797, 1797, 1797, 1798, + 1798, 1798, 1798, 1799, 1799, 1799, 1799, 2703, 1793, 2745, + 2060, 2697, 1794, 2060, 2697, 2703, 1804, 2707, 2708, 2709, + 1797, 2720, 2060, 2060, 1798, 1804, 1804, 1804, 1804, 1804, + 1877, 1877, 1877, 1877, 1878, 1878, 1878, 1878, 1879, 1879, + + 1879, 1879, 1884, 1884, 1884, 1884, 1885, 1885, 1885, 1885, + 1886, 1886, 1886, 1886, 2722, 1877, 2716, 2592, 2710, 1878, + 1893, 1893, 1893, 1893, 2599, 1793, 1995, 1884, 2707, 1995, + 2708, 1885, 1996, 1893, 2720, 1996, 2709, 1797, 1894, 1894, + 1894, 1894, 2592, 1895, 1895, 1895, 1895, 2718, 2731, 2599, + 1893, 1896, 1896, 1896, 1896, 1995, 1895, 1914, 1914, 1914, + 1914, 1996, 2746, 2748, 1896, 2610, 2001, 2716, 1894, 2721, + 2710, 2722, 1877, 1895, 1893, 1917, 1917, 1917, 1917, 2001, + 2721, 1896, 2749, 2717, 1884, 1927, 1927, 1927, 1927, 2750, + 2610, 2001, 1894, 1928, 1928, 1928, 1928, 1895, 2731, 2718, + + 1929, 1929, 1929, 1929, 2001, 1896, 1930, 1930, 1930, 1930, + 1927, 2713, 1928, 1928, 1928, 1928, 1928, 1928, 1928, 1929, + 1929, 1929, 1929, 1929, 1929, 1929, 1931, 1931, 1931, 1931, + 2717, 1930, 1932, 1932, 1932, 1932, 1945, 1945, 1945, 1945, + 1946, 1946, 1946, 1946, 1947, 1956, 2611, 1966, 1956, 1947, + 1966, 1931, 2008, 2008, 2008, 2008, 2724, 1947, 1947, 1947, + 1947, 1947, 1947, 1947, 1949, 2003, 2756, 2713, 2003, 1949, + 2004, 2611, 2005, 2004, 1956, 2005, 1966, 1949, 1949, 1949, + 1949, 1949, 1949, 1949, 1958, 2757, 1958, 2614, 1930, 1956, + 1967, 1958, 2006, 1966, 2003, 2006, 1967, 1967, 1958, 2004, + + 2759, 2005, 2012, 2012, 2012, 2012, 2761, 2764, 2724, 1958, + 2180, 1958, 2614, 2180, 1956, 1967, 1958, 2733, 2723, 1966, + 1947, 2006, 1967, 1967, 1958, 2014, 2014, 2014, 2014, 2018, + 2018, 2018, 2018, 2024, 2024, 2024, 2024, 2727, 2627, 2180, + 1949, 1953, 2070, 2070, 2070, 2070, 1953, 1968, 2655, 1953, + 1968, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, 1953, + 1953, 2723, 1968, 2627, 1968, 2061, 2061, 2061, 2061, 2765, + 2766, 2768, 1968, 2655, 2733, 1968, 2728, 2068, 2068, 2068, + 2068, 2771, 2061, 2069, 2069, 2069, 2069, 2772, 1968, 1953, + 1968, 2773, 2727, 2774, 2089, 2089, 2089, 2089, 2091, 2091, + + 2091, 2091, 2068, 2110, 2110, 2110, 2110, 2660, 2069, 2090, + 2090, 2090, 2090, 2249, 2249, 2249, 2249, 1953, 2036, 2089, + 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, 2036, + 2103, 2725, 2660, 2726, 2090, 2117, 2661, 2728, 2249, 2103, + 2103, 2103, 2103, 2103, 2117, 2117, 2117, 2117, 2117, 2137, + 2137, 2137, 2137, 2142, 2142, 2142, 2142, 2734, 2036, 2068, + 2775, 2661, 2137, 2143, 2143, 2143, 2143, 2776, 2666, 2144, + 2144, 2144, 2144, 2036, 2725, 2777, 2089, 2732, 2142, 2736, + 2142, 2719, 2145, 2145, 2145, 2145, 2036, 2067, 2143, 2758, + 2143, 2726, 2067, 2666, 2144, 2067, 2144, 2067, 2067, 2067, + + 2067, 2067, 2067, 2067, 2067, 2067, 2067, 2145, 2737, 2145, + 2734, 2146, 2146, 2146, 2146, 2147, 2147, 2147, 2147, 2148, + 2148, 2148, 2148, 2732, 2293, 2778, 2142, 2779, 2719, 2149, + 2149, 2149, 2149, 2738, 2736, 2067, 2146, 2293, 2146, 2735, + 2147, 2144, 2147, 2780, 2148, 2740, 2148, 2737, 2758, 2293, + 2145, 2742, 2781, 2067, 2149, 2743, 2149, 2150, 2150, 2150, + 2150, 2782, 2293, 2067, 2151, 2151, 2151, 2151, 2152, 2152, + 2152, 2152, 2153, 2153, 2153, 2153, 2154, 2154, 2154, 2154, + 2738, 2147, 2150, 2146, 2150, 2149, 2783, 2227, 2735, 2151, + 2227, 2151, 2148, 2152, 2740, 2152, 2785, 2153, 2742, 2153, + + 2786, 2154, 2743, 2154, 2155, 2155, 2155, 2155, 2156, 2156, + 2156, 2156, 2157, 2157, 2157, 2157, 2227, 2150, 2809, 2158, + 2158, 2158, 2158, 2810, 2152, 2814, 2815, 2816, 2151, 2155, + 2817, 2155, 2819, 2156, 2154, 2156, 2153, 2157, 2820, 2157, + 2266, 2820, 2168, 2266, 2158, 2822, 2158, 2159, 2159, 2159, + 2159, 2168, 2168, 2168, 2168, 2168, 2260, 2260, 2260, 2260, + 2823, 2824, 2268, 2273, 2824, 2268, 2273, 2156, 2275, 2266, + 2155, 2275, 2159, 2172, 2159, 2276, 2156, 2825, 2276, 2827, + 2157, 2158, 2172, 2172, 2172, 2172, 2172, 2250, 2250, 2250, + 2250, 2268, 2273, 2829, 2828, 2277, 2279, 2275, 2277, 2279, + + 2280, 2828, 2826, 2280, 2276, 2826, 2250, 2250, 2250, 2250, + 2250, 2250, 2250, 2830, 2281, 2283, 2285, 2281, 2283, 2285, + 2831, 2832, 2159, 2263, 2277, 2279, 2834, 2287, 2263, 2280, + 2287, 2263, 2836, 2263, 2263, 2263, 2263, 2263, 2263, 2263, + 2263, 2263, 2263, 2281, 2283, 2285, 2288, 2295, 2296, 2288, + 2295, 2296, 2297, 2837, 2298, 2297, 2287, 2298, 2301, 2303, + 2307, 2301, 2303, 2307, 2309, 2310, 2312, 2309, 2310, 2312, + 2833, 2263, 2839, 2833, 2841, 2288, 2295, 2296, 2842, 2838, + 2843, 2297, 2838, 2298, 2844, 2845, 2846, 2301, 2303, 2307, + 2847, 2849, 2845, 2309, 2310, 2312, 2850, 2852, 2314, 2263, + + 2264, 2314, 2853, 2317, 2319, 2264, 2317, 2319, 2264, 2854, + 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, + 2321, 2324, 2327, 2321, 2324, 2327, 2328, 2314, 2330, 2328, + 2858, 2330, 2317, 2319, 2334, 2337, 2338, 2334, 2337, 2338, + 2341, 2342, 2344, 2341, 2342, 2344, 2859, 2860, 2264, 2321, + 2324, 2327, 2861, 2346, 2862, 2328, 2346, 2330, 2348, 2350, + 2863, 2348, 2350, 2334, 2337, 2338, 2864, 2866, 2867, 2341, + 2342, 2344, 2352, 2741, 2870, 2352, 2264, 2354, 2354, 2354, + 2354, 2871, 2346, 2356, 2356, 2356, 2356, 2348, 2350, 2372, + 2372, 2372, 2372, 2382, 2382, 2382, 2382, 2402, 2872, 2848, + + 2402, 2352, 2848, 2873, 2384, 2384, 2384, 2384, 2851, 2874, + 2382, 2851, 2741, 2876, 2402, 2408, 2408, 2408, 2408, 2877, + 2741, 2384, 2421, 2421, 2421, 2421, 2422, 2422, 2422, 2422, + 2434, 2444, 2444, 2444, 2444, 2460, 2460, 2460, 2460, 2434, + 2434, 2434, 2434, 2434, 2481, 2481, 2481, 2481, 2460, 2493, + 2421, 2878, 2493, 2402, 2422, 2879, 2356, 2378, 2462, 2462, + 2462, 2462, 2378, 2497, 2880, 2378, 2497, 2378, 2378, 2378, + 2378, 2378, 2378, 2378, 2378, 2378, 2378, 2384, 2493, 2463, + 2463, 2463, 2463, 2462, 2881, 2462, 2464, 2464, 2464, 2464, + 2855, 2889, 2497, 2855, 2893, 2465, 2465, 2465, 2465, 2466, + + 2466, 2466, 2466, 2895, 2463, 2378, 2463, 2543, 2897, 2762, + 2543, 2464, 2762, 2464, 2900, 2875, 2467, 2467, 2467, 2467, + 2465, 2378, 2465, 2902, 2466, 2904, 2466, 2483, 2483, 2483, + 2483, 2907, 2910, 2378, 2414, 2921, 2543, 2762, 2483, 2414, + 2875, 2467, 2414, 2467, 2414, 2414, 2414, 2414, 2414, 2414, + 2414, 2414, 2414, 2414, 2464, 2465, 2468, 2468, 2468, 2468, + 2466, 2469, 2469, 2469, 2469, 2470, 2470, 2470, 2470, 2471, + 2471, 2471, 2471, 2923, 2925, 2927, 2467, 2472, 2472, 2472, + 2472, 2468, 2414, 2468, 2414, 2936, 2469, 2942, 2469, 2948, + 2470, 2952, 2470, 2933, 2471, 2887, 2471, 2473, 2473, 2473, + + 2473, 2954, 2472, 2957, 2472, 2474, 2474, 2474, 2474, 2909, + 2414, 2475, 2475, 2475, 2475, 2476, 2476, 2476, 2476, 2933, + 2887, 2959, 2473, 2470, 2473, 2577, 2468, 2471, 2577, 2960, + 2474, 2965, 2474, 2966, 2909, 2469, 2475, 2967, 2475, 2914, + 2476, 2915, 2476, 2472, 2477, 2477, 2477, 2477, 2968, 2478, + 2478, 2478, 2478, 2920, 2577, 2473, 2479, 2479, 2479, 2479, + 2480, 2480, 2480, 2480, 2914, 2579, 2915, 2475, 2579, 2477, + 2583, 2477, 2969, 2583, 2478, 2476, 2478, 2585, 2920, 2474, + 2585, 2479, 2971, 2479, 2972, 2480, 2973, 2480, 2564, 2564, + 2564, 2564, 2947, 2977, 2579, 2678, 2678, 2678, 2678, 2583, + + 2477, 2565, 2565, 2565, 2565, 2978, 2585, 2564, 2564, 2564, + 2564, 2564, 2564, 2564, 2575, 2586, 2480, 2947, 2586, 2575, + 2565, 2565, 2565, 2565, 2565, 2565, 2565, 2575, 2575, 2575, + 2575, 2575, 2575, 2575, 2588, 2590, 2593, 2588, 2590, 2593, + 2595, 2951, 2597, 2595, 2586, 2597, 2601, 2602, 2605, 2601, + 2602, 2605, 2608, 2609, 2612, 2608, 2609, 2612, 2613, 2615, + 2979, 2613, 2615, 2588, 2590, 2593, 2951, 2617, 2981, 2595, + 2617, 2597, 2983, 2984, 2985, 2601, 2602, 2605, 2575, 2986, + 3000, 2608, 2609, 2612, 2990, 2995, 2619, 2613, 2615, 2619, + 2575, 2621, 2623, 2988, 2621, 2623, 2617, 2624, 2626, 2628, + + 2624, 2626, 2628, 2630, 2631, 2634, 2630, 2631, 2634, 2636, + 2638, 2639, 2636, 2638, 2639, 2619, 2641, 3024, 2989, 2641, + 2621, 2623, 2643, 2990, 2991, 2643, 2624, 2626, 2628, 3013, + 2997, 2995, 2630, 2631, 2634, 2988, 2999, 3000, 2636, 2638, + 2639, 2645, 2996, 2646, 2645, 2641, 2646, 2648, 3004, 2649, + 2648, 2643, 2649, 2653, 2654, 2657, 2653, 2654, 2657, 2658, + 2662, 2664, 2658, 2662, 2664, 2668, 2670, 3025, 2668, 2670, + 2645, 2672, 2646, 2989, 2672, 3028, 2648, 2674, 2649, 2991, + 2674, 2997, 2653, 2654, 2657, 2996, 3013, 2999, 2658, 2662, + 2664, 3029, 3030, 2675, 2668, 2670, 2675, 3036, 3039, 3004, + + 2672, 2680, 2680, 2680, 2680, 3044, 2674, 2681, 2681, 2681, + 2681, 2682, 2682, 2682, 2682, 2683, 2683, 2683, 2683, 2998, + 3038, 3049, 2675, 2693, 2693, 2693, 2693, 2694, 2694, 2694, + 2694, 2701, 2701, 2701, 2701, 2711, 2711, 2711, 2711, 2714, + 2714, 2714, 2714, 2715, 2715, 2715, 2715, 2729, 2729, 2729, + 2729, 2747, 2711, 3002, 2747, 2812, 2714, 3006, 2812, 2970, + 2715, 2998, 2970, 3003, 2729, 2730, 2730, 2730, 2730, 2739, + 2739, 2739, 2739, 2751, 2751, 2751, 2751, 3010, 2818, 3051, + 2747, 2818, 2730, 3007, 2812, 3017, 2739, 2752, 2752, 2752, + 2752, 3038, 2752, 2753, 2753, 2753, 2753, 2701, 2706, 3006, + + 3002, 2751, 3005, 2706, 3052, 3005, 2706, 2818, 2706, 2706, + 2706, 2706, 2706, 2706, 2706, 2706, 2706, 2706, 3003, 3005, + 3010, 2753, 2754, 2754, 2754, 2754, 3008, 2754, 2755, 2755, + 2755, 2755, 3017, 3053, 3007, 2739, 2769, 2769, 2769, 2769, + 2770, 2770, 2770, 2770, 3055, 3014, 2706, 2784, 2784, 2784, + 2784, 3058, 2706, 2805, 2805, 2805, 2805, 2865, 2865, 2865, + 2865, 2961, 2961, 2961, 2961, 3020, 2787, 2787, 2787, 2787, + 2788, 2788, 2788, 2788, 2706, 2712, 2712, 2712, 3008, 2712, + 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, 2712, + 2712, 2787, 2712, 2787, 2712, 2788, 3014, 2788, 2789, 2789, + + 2789, 2789, 3016, 2712, 2712, 2712, 2712, 2712, 2790, 2790, + 2790, 2790, 2791, 2791, 2791, 2791, 3020, 2886, 2888, 2890, + 2886, 2888, 2890, 2789, 3059, 2789, 2792, 2792, 2792, 2792, + 2712, 3015, 2712, 2790, 3061, 2790, 3082, 2791, 2856, 2791, + 3011, 2856, 2793, 2793, 2793, 2793, 2886, 2888, 2890, 2856, + 3022, 2792, 2891, 2792, 3016, 2891, 3083, 2712, 2712, 2712, + 2744, 3019, 3021, 3084, 2790, 2744, 3086, 2793, 2744, 2793, + 2744, 2744, 2744, 2744, 2744, 2744, 2744, 2744, 2744, 2744, + 3015, 2891, 2792, 3011, 2794, 2794, 2794, 2794, 2795, 2795, + 2795, 2795, 2796, 2796, 2796, 2796, 2797, 2797, 2797, 2797, + + 3087, 3022, 2793, 3088, 2798, 2798, 2798, 2798, 2744, 2794, + 3091, 2794, 3092, 2795, 3021, 2795, 3093, 2796, 3019, 2796, + 3094, 2797, 3095, 2797, 2799, 2799, 2799, 2799, 2744, 2798, + 3096, 2798, 2800, 2800, 2800, 2800, 2744, 2801, 2801, 2801, + 2801, 2802, 2802, 2802, 2802, 2803, 2803, 2803, 2803, 2799, + 3097, 2799, 2804, 2804, 2804, 2804, 3099, 2800, 2794, 2800, + 2894, 2795, 2801, 2894, 2801, 2796, 2802, 3100, 2802, 3103, + 2803, 3105, 2803, 2806, 2806, 2806, 2806, 2804, 3107, 2804, + 2807, 2807, 2807, 2807, 2806, 2896, 3108, 2898, 2896, 2894, + 2898, 2807, 2885, 2800, 3109, 3110, 2899, 2885, 2799, 2899, + + 2901, 3111, 3113, 2901, 2801, 2885, 2885, 2885, 2885, 2885, + 2885, 2885, 2903, 3114, 2896, 2903, 2898, 3116, 2804, 2905, + 2906, 2908, 2905, 2906, 2908, 2899, 3117, 2911, 2912, 2901, + 2911, 2912, 2916, 2918, 2922, 2916, 2918, 2922, 3118, 3101, + 2924, 2903, 2926, 2924, 2928, 2926, 2885, 2928, 2905, 2906, + 2908, 2929, 2931, 3101, 2929, 2931, 2911, 2912, 3119, 3120, + 3121, 2916, 2918, 2922, 2934, 3122, 3123, 2934, 2885, 2924, + 3125, 2926, 2937, 2928, 2938, 2937, 2940, 2938, 3126, 2940, + 2929, 2931, 2943, 2944, 2945, 2943, 2944, 2945, 2949, 2950, + 3128, 2949, 2950, 2934, 2953, 2955, 2956, 2953, 2955, 2956, + + 3129, 2937, 3130, 2938, 2958, 2940, 3089, 2958, 3131, 3089, + 3132, 2943, 2944, 2945, 3133, 3134, 3136, 2949, 2950, 2962, + 2962, 2962, 2962, 2953, 2955, 2956, 2963, 2963, 2963, 2963, + 3137, 3144, 3151, 2958, 2964, 2964, 2964, 2964, 2974, 2974, + 2974, 2974, 2976, 2976, 2976, 2976, 2980, 2980, 2980, 2980, + 2982, 2982, 2982, 2982, 2987, 3031, 3031, 3031, 3031, 2987, + 3031, 3155, 2987, 3157, 2987, 2987, 2987, 2987, 2987, 2987, + 2987, 2987, 2987, 2987, 3001, 3001, 3001, 3001, 3001, 3001, + 3009, 3009, 3009, 3009, 3012, 3012, 3012, 3012, 3018, 3018, + 3018, 3018, 3026, 3160, 3162, 3026, 3040, 3009, 3165, 3040, + + 3041, 3012, 2987, 3041, 3150, 3018, 3033, 3033, 3033, 3033, + 3167, 3033, 3035, 3035, 3035, 3035, 3037, 3037, 3037, 3037, + 2987, 3026, 3085, 3090, 3040, 3085, 3090, 3169, 3041, 3150, + 2987, 2993, 2993, 2993, 3173, 2993, 2993, 2993, 2993, 2993, + 2993, 2993, 2993, 2993, 2993, 2993, 2993, 3181, 2993, 3042, + 2993, 3085, 3042, 3046, 3046, 3046, 3046, 3183, 3184, 2993, + 2993, 2993, 2993, 2993, 3098, 3185, 3042, 3098, 3042, 3042, + 3042, 3042, 3042, 3042, 3047, 3047, 3047, 3047, 3048, 3048, + 3048, 3048, 3050, 3050, 3050, 3050, 2993, 3186, 2993, 3056, + 3056, 3056, 3056, 3187, 3054, 3054, 3054, 3054, 3057, 3057, + + 3057, 3057, 3060, 3060, 3060, 3060, 3189, 3063, 3063, 3063, + 3063, 3190, 3063, 2993, 2993, 2993, 2994, 2994, 2994, 3054, + 2994, 2994, 2994, 2994, 2994, 2994, 2994, 2994, 2994, 2994, + 2994, 2994, 3063, 2994, 3063, 2994, 2994, 3064, 3064, 3064, + 3064, 3191, 3196, 2994, 2994, 2994, 2994, 2994, 2994, 3065, + 3065, 3065, 3065, 3066, 3066, 3066, 3066, 3071, 3071, 3071, + 3071, 3198, 3064, 3102, 3064, 3104, 3102, 3054, 3104, 3199, + 3141, 2994, 2994, 2994, 3065, 3200, 3065, 3201, 3066, 3209, + 3066, 3214, 3071, 3067, 3067, 3067, 3067, 3112, 3115, 3235, + 3112, 3115, 3124, 3124, 3124, 3124, 3141, 3203, 2994, 2994, + + 2994, 3023, 3068, 3068, 3068, 3068, 3023, 3065, 3067, 3023, + 3067, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, 3023, + 3023, 3069, 3069, 3069, 3069, 3154, 3209, 3068, 3214, 3068, + 3070, 3070, 3070, 3070, 3072, 3072, 3072, 3072, 3175, 3205, + 3203, 3067, 3073, 3073, 3073, 3073, 3069, 3236, 3069, 3023, + 3154, 3074, 3074, 3074, 3074, 3070, 3213, 3070, 3216, 3072, + 3204, 3072, 3223, 3175, 3023, 3139, 3237, 3073, 3139, 3073, + 3075, 3075, 3075, 3075, 3204, 3068, 3074, 3023, 3074, 3221, + 3228, 3069, 3076, 3076, 3076, 3076, 3077, 3077, 3077, 3077, + 3078, 3078, 3078, 3078, 3139, 3075, 3205, 3075, 3142, 3145, + + 3072, 3142, 3145, 3070, 3213, 3146, 3211, 3076, 3146, 3076, + 3216, 3077, 3223, 3077, 3239, 3078, 3240, 3078, 3079, 3079, + 3079, 3079, 3080, 3080, 3080, 3080, 3188, 3142, 3145, 3188, + 3221, 3228, 3148, 3080, 3146, 3148, 3218, 3152, 3153, 3138, + 3152, 3153, 3076, 3079, 3138, 3079, 3156, 3211, 3158, 3156, + 3078, 3158, 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3159, + 3161, 3148, 3159, 3161, 3241, 3163, 3152, 3153, 3163, 3164, + 3166, 3168, 3164, 3166, 3168, 3156, 3231, 3158, 3170, 3171, + 3174, 3170, 3171, 3174, 3176, 3218, 3242, 3176, 3159, 3161, + 3178, 3245, 3179, 3178, 3163, 3179, 3250, 3253, 3164, 3166, + + 3168, 3182, 3182, 3182, 3182, 3138, 3229, 3170, 3171, 3174, + 3212, 3219, 3220, 3176, 3230, 3138, 3222, 3231, 3255, 3178, + 3257, 3179, 3192, 3192, 3192, 3192, 3193, 3193, 3193, 3193, + 3194, 3194, 3194, 3194, 3195, 3195, 3195, 3195, 3197, 3197, + 3197, 3197, 3206, 3206, 3206, 3206, 3210, 3210, 3210, 3210, + 3232, 3220, 3233, 3212, 3219, 3222, 3260, 3229, 3265, 3206, + 3267, 3230, 3283, 3210, 3215, 3215, 3215, 3215, 3215, 3215, + 3217, 3217, 3217, 3217, 3225, 3225, 3225, 3225, 3226, 3226, + 3226, 3226, 3227, 3227, 3227, 3227, 3244, 3217, 3287, 3286, + 3288, 3225, 3286, 3289, 3291, 3226, 3289, 3233, 3292, 3227, + + 3293, 3232, 3295, 3194, 3202, 3238, 3296, 3246, 3238, 3202, + 3246, 3299, 3202, 3300, 3202, 3202, 3202, 3202, 3202, 3202, + 3202, 3202, 3202, 3202, 3243, 3243, 3243, 3243, 3301, 3290, + 3294, 3217, 3290, 3294, 3238, 3246, 3247, 3297, 3298, 3247, + 3297, 3298, 3244, 3302, 3248, 3303, 3305, 3248, 3306, 3305, + 3309, 3226, 3202, 3247, 3202, 3247, 3247, 3247, 3247, 3247, + 3247, 3248, 3311, 3248, 3248, 3248, 3248, 3248, 3248, 3251, + 3251, 3251, 3251, 3252, 3252, 3252, 3252, 3314, 3315, 3317, + 3202, 3207, 3207, 3207, 3318, 3207, 3207, 3207, 3207, 3207, + 3207, 3207, 3207, 3207, 3207, 3207, 3207, 3323, 3207, 3249, + + 3207, 3207, 3249, 3254, 3254, 3254, 3254, 3326, 3207, 3207, + 3207, 3207, 3207, 3207, 3307, 3328, 3249, 3307, 3249, 3249, + 3249, 3249, 3249, 3249, 3330, 3307, 3256, 3256, 3256, 3256, + 3258, 3258, 3258, 3258, 3340, 3332, 3207, 3207, 3207, 3259, + 3259, 3259, 3259, 3343, 3261, 3261, 3261, 3261, 3347, 3308, + 3313, 3256, 3308, 3313, 3349, 3258, 3262, 3262, 3262, 3262, + 3332, 3351, 3354, 3207, 3207, 3207, 3208, 3208, 3208, 3261, + 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, + 3208, 3208, 3355, 3208, 3357, 3208, 3208, 3263, 3263, 3263, + 3263, 3358, 3361, 3208, 3208, 3208, 3208, 3208, 3208, 3256, + + 3342, 3362, 3363, 3258, 3264, 3264, 3264, 3264, 3266, 3266, + 3266, 3266, 3268, 3268, 3268, 3268, 3269, 3269, 3269, 3269, + 3376, 3208, 3208, 3208, 3372, 3342, 3381, 3270, 3270, 3270, + 3270, 3369, 3271, 3271, 3271, 3271, 3367, 3268, 3384, 3268, + 3392, 3269, 3393, 3269, 3274, 3274, 3274, 3274, 3208, 3208, + 3208, 3234, 3270, 3375, 3270, 3370, 3234, 3271, 3397, 3234, + 3378, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, 3234, + 3234, 3376, 3268, 3372, 3369, 3381, 3269, 3272, 3272, 3272, + 3272, 3273, 3273, 3273, 3273, 3275, 3275, 3275, 3275, 3276, + 3276, 3276, 3276, 3277, 3277, 3277, 3277, 3367, 3370, 3234, + + 3270, 3385, 3272, 3399, 3272, 3375, 3273, 3378, 3273, 3382, + 3275, 3405, 3275, 3406, 3276, 3385, 3276, 3234, 3277, 3278, + 3278, 3278, 3278, 3279, 3279, 3279, 3279, 3234, 3280, 3280, + 3280, 3280, 3281, 3281, 3281, 3281, 3282, 3282, 3282, 3282, + 3273, 3409, 3324, 3272, 3278, 3324, 3278, 3322, 3279, 3410, + 3279, 3386, 3322, 3280, 3275, 3280, 3379, 3281, 3382, 3281, + 3322, 3322, 3322, 3322, 3322, 3322, 3322, 3388, 3383, 3411, + 3325, 3324, 3327, 3325, 3329, 3327, 3331, 3329, 3426, 3331, + 3427, 3279, 3333, 3279, 3335, 3333, 3336, 3335, 3338, 3336, + 3341, 3338, 3344, 3341, 3386, 3344, 3279, 3322, 3279, 3325, + + 3398, 3327, 3428, 3329, 3345, 3331, 3348, 3345, 3387, 3348, + 3383, 3333, 3433, 3335, 3436, 3336, 3388, 3338, 3379, 3341, + 3439, 3344, 3443, 3322, 3350, 3350, 3350, 3350, 3356, 3356, + 3356, 3356, 3445, 3345, 3451, 3348, 3359, 3359, 3359, 3359, + 3360, 3360, 3360, 3360, 3364, 3364, 3364, 3364, 3365, 3365, + 3365, 3365, 3366, 3402, 3453, 3398, 3402, 3366, 3387, 3454, + 3366, 3456, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, + 3366, 3366, 3380, 3380, 3380, 3380, 3389, 3389, 3389, 3389, + 3390, 3390, 3390, 3390, 3400, 3417, 3457, 3400, 3432, 3380, + 3462, 3432, 3401, 3389, 3417, 3401, 3434, 3390, 3466, 3434, + + 3366, 3400, 3461, 3400, 3400, 3400, 3400, 3400, 3400, 3401, + 3468, 3401, 3401, 3401, 3401, 3401, 3401, 3471, 3474, 3477, + 3366, 3408, 3408, 3408, 3408, 3481, 3484, 3461, 3366, 3373, + 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, + 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, 3373, + 3412, 3412, 3412, 3412, 3489, 3493, 3373, 3373, 3373, 3373, + 3373, 3373, 3407, 3407, 3407, 3407, 3413, 3413, 3413, 3413, + 3415, 3415, 3415, 3415, 3435, 3412, 3495, 3435, 3414, 3414, + 3414, 3414, 3508, 3515, 3373, 3373, 3373, 3407, 3416, 3416, + 3416, 3416, 3420, 3420, 3420, 3420, 3424, 3424, 3424, 3424, + + 3430, 3430, 3430, 3430, 3431, 3431, 3431, 3431, 3492, 3516, + 3490, 3373, 3373, 3373, 3374, 3374, 3374, 3374, 3374, 3374, + 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, 3374, + 3374, 3374, 3374, 3374, 3374, 3407, 3414, 3438, 3414, 3491, + 3438, 3374, 3374, 3374, 3374, 3374, 3374, 3418, 3418, 3418, + 3418, 3414, 3490, 3414, 3419, 3419, 3419, 3419, 3425, 3425, + 3425, 3425, 3429, 3429, 3429, 3429, 3492, 3499, 3517, 3374, + 3374, 3374, 3418, 3440, 3418, 3441, 3440, 3444, 3441, 3419, + 3444, 3419, 3522, 3425, 3528, 3425, 3530, 3429, 3446, 3429, + 3449, 3446, 3448, 3449, 3491, 3448, 3374, 3374, 3374, 3391, + + 3391, 3391, 3449, 3448, 3391, 3391, 3391, 3391, 3391, 3391, + 3391, 3391, 3391, 3391, 3391, 3391, 3499, 3391, 3391, 3391, + 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, + 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, + 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, + 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, + 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, + 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, 3391, + 3391, 3391, 3391, 3391, 3394, 3394, 3394, 3394, 3394, 3394, + 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, 3394, + + 3394, 3394, 3394, 3394, 3394, 3421, 3421, 3421, 3421, 3533, + 3542, 3394, 3394, 3394, 3394, 3394, 3394, 3422, 3422, 3422, + 3422, 3423, 3423, 3423, 3423, 3450, 3452, 3555, 3450, 3452, + 3421, 3459, 3421, 3463, 3459, 3502, 3463, 3556, 3458, 3394, + 3394, 3394, 3422, 3458, 3422, 3557, 3423, 3464, 3423, 3559, + 3464, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3467, 3562, + 3459, 3467, 3463, 3507, 3498, 3567, 3394, 3394, 3394, 3469, + 3470, 3497, 3469, 3470, 3421, 3472, 3464, 3574, 3472, 3473, + 3473, 3473, 3473, 3479, 3479, 3479, 3479, 3467, 3494, 3494, + 3422, 3480, 3480, 3480, 3480, 3423, 3494, 3502, 3469, 3470, + + 3482, 3482, 3482, 3482, 3472, 3503, 3458, 3485, 3485, 3485, + 3485, 3498, 3496, 3496, 3458, 3486, 3486, 3486, 3486, 3487, + 3496, 3507, 3497, 3523, 3487, 3494, 3523, 3487, 3577, 3487, + 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3488, + 3488, 3488, 3488, 3501, 3501, 3501, 3501, 3521, 3503, 3496, + 3510, 3505, 3505, 3505, 3505, 3544, 3488, 3584, 3544, 3546, + 3501, 3547, 3546, 3510, 3547, 3588, 3582, 3487, 3505, 3520, + 3520, 3520, 3520, 3526, 3526, 3526, 3526, 3527, 3527, 3527, + 3527, 3589, 3487, 3531, 3531, 3531, 3531, 3532, 3532, 3532, + 3532, 3543, 3543, 3543, 3543, 3487, 3500, 3500, 3500, 3500, + + 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, + 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3582, 3548, 3549, + 3521, 3548, 3549, 3500, 3500, 3500, 3500, 3500, 3500, 3529, + 3529, 3529, 3529, 3534, 3534, 3534, 3534, 3535, 3535, 3535, + 3535, 3536, 3536, 3536, 3536, 3537, 3537, 3537, 3537, 3592, + 3594, 3500, 3500, 3500, 3529, 3595, 3552, 3598, 3534, 3552, + 3534, 3599, 3535, 3594, 3535, 3602, 3536, 3532, 3536, 3606, + 3537, 3609, 3537, 3568, 3568, 3568, 3568, 3579, 3500, 3500, + 3500, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, + 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, + + 3506, 3506, 3529, 3538, 3538, 3538, 3538, 3578, 3506, 3506, + 3506, 3506, 3506, 3506, 3553, 3536, 3579, 3553, 3537, 3539, + 3539, 3539, 3539, 3610, 3560, 3613, 3553, 3560, 3538, 3561, + 3563, 3564, 3561, 3563, 3564, 3625, 3506, 3506, 3506, 3572, + 3572, 3572, 3572, 3596, 3539, 3626, 3539, 3630, 3578, 3600, + 3600, 3600, 3600, 3560, 3619, 3632, 3596, 3619, 3561, 3563, + 3564, 3635, 3642, 3506, 3506, 3506, 3509, 3509, 3509, 3646, + 3648, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, + 3509, 3509, 3509, 3654, 3509, 3539, 3509, 3509, 3509, 3509, + 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, + + 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, + 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, + 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, + 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, + 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3509, + 3509, 3511, 3511, 3511, 3580, 3583, 3511, 3511, 3511, 3511, + 3511, 3511, 3511, 3511, 3511, 3511, 3511, 3585, 3585, 3587, + 3511, 3581, 3581, 3581, 3581, 3585, 3590, 3590, 3591, 3511, + 3511, 3511, 3511, 3511, 3590, 3638, 3620, 3639, 3581, 3620, + 3601, 3604, 3604, 3604, 3604, 3656, 3580, 3640, 3583, 3605, + + 3605, 3605, 3605, 3658, 3585, 3659, 3511, 3661, 3511, 3608, + 3608, 3608, 3608, 3590, 3615, 3615, 3615, 3615, 3623, 3624, + 3591, 3623, 3624, 3662, 3587, 3633, 3633, 3633, 3633, 3663, + 3639, 3672, 3673, 3511, 3511, 3511, 3512, 3512, 3512, 3640, + 3638, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, + 3512, 3512, 3512, 3601, 3512, 3512, 3512, 3512, 3512, 3512, + 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, + 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, + 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, + 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, + + 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, + 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, + 3512, 3513, 3513, 3513, 3677, 3651, 3513, 3513, 3513, 3513, + 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3678, 3637, 3651, + 3513, 3540, 3540, 3540, 3540, 3660, 3687, 3691, 3513, 3513, + 3513, 3513, 3513, 3513, 3683, 3647, 3558, 3607, 3607, 3607, + 3607, 3558, 3611, 3611, 3611, 3611, 3540, 3641, 3540, 3558, + 3558, 3558, 3558, 3558, 3558, 3558, 3513, 3628, 3513, 3689, + 3628, 3657, 3607, 3614, 3614, 3614, 3614, 3637, 3616, 3616, + 3616, 3616, 3679, 3617, 3617, 3617, 3617, 3631, 3647, 3669, + + 3631, 3683, 3669, 3513, 3513, 3513, 3628, 3695, 3614, 3710, + 3614, 3660, 3714, 3616, 3540, 3616, 3641, 3707, 3617, 3558, + 3617, 3643, 3643, 3719, 3674, 3682, 3631, 3674, 3689, 3643, + 3607, 3679, 3558, 3575, 3675, 3675, 3675, 3675, 3575, 3708, + 3657, 3575, 3611, 3575, 3575, 3575, 3575, 3575, 3575, 3575, + 3575, 3575, 3575, 3674, 3726, 3680, 3614, 3616, 3643, 3644, + 3644, 3644, 3644, 3707, 3664, 3664, 3664, 3664, 3682, 3627, + 3665, 3665, 3665, 3665, 3627, 3711, 3644, 3666, 3666, 3666, + 3666, 3575, 3627, 3627, 3627, 3627, 3627, 3627, 3627, 3664, + 3676, 3676, 3676, 3676, 3706, 3665, 3680, 3665, 3736, 3575, + + 3708, 3709, 3666, 3744, 3666, 3697, 3697, 3697, 3697, 3575, + 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586, + 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586, + 3586, 3667, 3667, 3667, 3667, 3627, 3711, 3586, 3586, 3586, + 3586, 3586, 3586, 3722, 3741, 3627, 3668, 3668, 3668, 3668, + 3706, 3666, 3681, 3681, 3681, 3681, 3667, 3709, 3667, 3685, + 3685, 3685, 3685, 3747, 3750, 3586, 3586, 3586, 3753, 3681, + 3755, 3668, 3701, 3701, 3701, 3701, 3685, 3704, 3704, 3704, + 3704, 3718, 3718, 3718, 3718, 4073, 4074, 3694, 3694, 3694, + 3694, 3741, 3586, 3586, 3586, 3593, 3593, 3593, 4408, 3722, + + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3694, 3593, 4431, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, 3593, + 3597, 3597, 3597, 2165, 2164, 3597, 3597, 3597, 3597, 3597, + 3597, 3597, 3597, 3597, 3597, 3597, 3597, 2163, 3597, 3597, + + 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, + 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, + 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, + 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, + 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, + 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, 3597, + 3597, 3597, 3597, 3597, 3597, 3636, 3636, 3636, 2162, 2139, + 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, + 3636, 3636, 2136, 3636, 3636, 3636, 3636, 3636, 3636, 3636, + 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, + + 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, + 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, + 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, + 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, + 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, 3636, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, + 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, 3670, + 3670, 3696, 3696, 3696, 3696, 3727, 3723, 3670, 3670, 3670, + 3670, 3670, 3670, 3698, 3698, 3698, 3698, 3699, 3699, 3699, + 3699, 3717, 3717, 3717, 3717, 3725, 3696, 3720, 3720, 3720, + + 3720, 3721, 3721, 3721, 3721, 3670, 3670, 3670, 3698, 3841, + 3698, 3908, 3699, 4227, 3841, 4197, 3717, 3908, 3845, 4227, + 3727, 2135, 3724, 3724, 3724, 3724, 3721, 4197, 3721, 3845, + 2134, 2133, 3670, 3670, 3670, 3686, 3686, 3686, 3723, 3724, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3725, 3686, 2132, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, 3686, + 3692, 3692, 3692, 3692, 3692, 3692, 3692, 3692, 3692, 3692, + 3692, 3692, 3692, 3692, 3692, 3692, 3692, 3692, 3692, 3692, + 3692, 3700, 3700, 3700, 3700, 3732, 3737, 3692, 3692, 3692, + 3692, 3692, 3692, 3729, 3729, 3729, 3729, 3730, 3730, 3730, + 3730, 3731, 3731, 3731, 3731, 3745, 3700, 3748, 3700, 3746, + 3733, 3733, 3733, 3733, 3749, 3692, 3692, 3692, 3729, 3840, + 3840, 3840, 3730, 2131, 3730, 2130, 3731, 3733, 3735, 3735, + 3735, 3735, 2129, 3838, 3732, 3738, 3738, 3738, 3738, 3840, + + 2128, 3838, 3692, 3692, 3692, 3735, 3838, 2127, 2126, 3737, + 3739, 3739, 3739, 3739, 3700, 3740, 3740, 3740, 3740, 3850, + 3738, 3867, 3871, 3745, 3850, 3746, 3867, 3871, 3748, 3883, + 2125, 3749, 3752, 3752, 3752, 3752, 3884, 3883, 3885, 3888, + 3885, 3884, 3883, 3934, 3888, 3885, 2124, 2123, 3934, 3752, + 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, + 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, + 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3757, 3758, 3758, + 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, + 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, 3758, + + 3758, 3758, 3758, 3758, 3758, 3758, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3760, 3760, 3760, 3760, 3760, 3760, + 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760, + 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760, 3760, + 3760, 3760, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, + 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, + 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, + 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, + + 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, + 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3762, 3763, 3763, + 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, + 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, 3763, + 3763, 3763, 3763, 3763, 3763, 3763, 3764, 3764, 3764, 3764, + 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, + 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, + 3764, 3764, 3764, 3764, 3765, 3765, 3765, 3765, 3765, 3765, + 3765, 3765, 3765, 3765, 3765, 3765, 3765, 3765, 3765, 3765, + 3765, 3765, 3765, 3765, 3765, 3765, 3765, 3765, 3765, 3765, + + 3765, 3765, 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766, + 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766, + 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766, 3766, + 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767, + 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767, + 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3767, 3768, 3768, + 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768, + 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768, 3768, + 3768, 3768, 3768, 3768, 3768, 3768, 3769, 3769, 3769, 3769, + 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, + + 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, 3769, + 3769, 3769, 3769, 3769, 3770, 3770, 3770, 3770, 3770, 3770, + 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, + 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, 3770, + 3770, 3770, 3771, 3771, 3771, 3771, 3771, 3771, 3771, 3771, + 3771, 3771, 3771, 3771, 3771, 3771, 3771, 3771, 3771, 3771, + 3771, 3771, 3771, 3771, 3771, 3771, 3771, 3771, 3771, 3771, + 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, + 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, + 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3773, 3773, + + 3773, 3773, 3773, 3773, 3773, 3773, 3773, 3773, 3773, 3773, + 3773, 3773, 3773, 3773, 3773, 3773, 3773, 3773, 3773, 3773, + 3773, 3773, 3773, 3773, 3773, 3773, 3774, 3774, 3774, 3774, + 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3774, + 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3774, 3774, + 3774, 3774, 3774, 3774, 3775, 3775, 3775, 3775, 3775, 3775, + 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, + 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, 3775, + 3775, 3775, 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, + 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, + + 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, 3776, + 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777, + 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777, + 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3777, 3778, 3778, + 3778, 3778, 3778, 3778, 3778, 3778, 3778, 3778, 3778, 3778, + 3778, 3778, 3778, 3778, 3778, 3778, 3778, 3778, 3778, 3778, + 3778, 3778, 3778, 3778, 3778, 3778, 3779, 3779, 3779, 3779, + 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779, + 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779, 3779, + 3779, 3779, 3779, 3779, 3780, 3780, 3780, 3780, 3780, 3780, + + 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, + 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, + 3780, 3780, 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, + 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, + 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, + 3782, 3782, 3782, 3782, 3782, 3782, 3782, 3782, 3782, 3782, + 3782, 3782, 3782, 3782, 3782, 3782, 3782, 3782, 3782, 3782, + 3782, 3782, 3782, 3782, 3782, 3782, 3782, 3782, 3783, 3783, + 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, + 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, 3783, + + 3783, 3783, 3783, 3783, 3783, 3783, 3784, 3784, 3784, 3784, + 3784, 3784, 3784, 3784, 3784, 3784, 3784, 3784, 3784, 3784, + 3784, 3784, 3784, 3784, 3784, 3784, 3784, 3784, 3784, 3784, + 3784, 3784, 3784, 3784, 3785, 3785, 3785, 3785, 3785, 3785, + 3785, 3785, 3785, 3785, 3785, 3785, 3785, 3785, 3785, 3785, + 3785, 3785, 3785, 3785, 3785, 3785, 3785, 3785, 3785, 3785, + 3785, 3785, 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786, + 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786, + 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786, 3786, + 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3787, + + 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3787, + 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3787, 3788, 3788, + 3788, 3788, 3788, 3788, 3788, 3788, 3788, 3788, 3788, 3788, + 3788, 3788, 3788, 3788, 3788, 3788, 3788, 3788, 3788, 3788, + 3788, 3788, 3788, 3788, 3788, 3788, 3789, 3789, 3789, 3789, + 3789, 3789, 3789, 3789, 3789, 3789, 3789, 3789, 3789, 3789, + 3789, 3789, 3789, 3789, 3789, 3789, 3789, 3789, 3789, 3789, + 3789, 3789, 3789, 3789, 3790, 3790, 3790, 3790, 3790, 3790, + 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, + 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, 3790, + + 3790, 3790, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, + 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, + 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, 3791, + 3792, 3792, 3792, 3792, 3792, 3792, 3792, 3792, 3792, 3792, + 3792, 3792, 3792, 3792, 3792, 3792, 3792, 3792, 3792, 3792, + 3792, 3792, 3792, 3792, 3792, 3792, 3792, 3792, 3793, 3793, + 3793, 3793, 3793, 3793, 3793, 3793, 3793, 3793, 3793, 3793, + 3793, 3793, 3793, 3793, 3793, 3793, 3793, 3793, 3793, 3793, + 3793, 3793, 3793, 3793, 3793, 3793, 3794, 3794, 3794, 3794, + 3794, 3794, 3794, 3794, 3794, 3794, 3794, 3794, 3794, 3794, + + 3794, 3794, 3794, 3794, 3794, 3794, 3794, 3794, 3794, 3794, + 3794, 3794, 3794, 3794, 3795, 3795, 3795, 3795, 3795, 3795, + 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, + 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, 3795, + 3795, 3795, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, + 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, + 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, + 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, + 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, + 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3798, 3798, + + 3798, 3798, 3798, 3798, 3798, 3798, 3798, 3798, 3798, 3798, + 3798, 3798, 3798, 3798, 3798, 3798, 3798, 3798, 3798, 3798, + 3798, 3798, 3798, 3798, 3798, 3798, 3799, 3799, 3799, 3799, + 3799, 3799, 3799, 3799, 3799, 3799, 3799, 3799, 3799, 3799, + 3799, 3799, 3799, 3799, 3799, 3799, 3799, 3799, 3799, 3799, + 3799, 3799, 3799, 3799, 3800, 3800, 3800, 3800, 3800, 3800, + 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, + 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, 3800, + 3800, 3800, 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801, + 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801, + + 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801, 3801, + 3802, 3802, 3802, 3802, 3802, 3802, 3802, 3802, 3802, 3802, + 3802, 3802, 3802, 3802, 3802, 3802, 3802, 3802, 3802, 3802, + 3802, 3802, 3802, 3802, 3802, 3802, 3802, 3802, 3803, 3803, + 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, + 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, + 3803, 3803, 3803, 3803, 3803, 3803, 3804, 3804, 3804, 3804, + 3804, 3804, 3804, 3804, 3804, 3804, 3804, 3804, 3804, 3804, + 3804, 3804, 3804, 3804, 3804, 3804, 3804, 3804, 3804, 3804, + 3804, 3804, 3804, 3804, 3805, 3805, 3805, 3805, 3805, 3805, + + 3805, 3805, 3805, 3805, 3805, 3805, 3805, 3805, 3805, 3805, + 3805, 3805, 3805, 3805, 3805, 3805, 3805, 3805, 3805, 3805, + 3805, 3805, 3806, 3806, 3806, 3806, 3806, 3806, 3806, 3806, + 3806, 3806, 3806, 3806, 3806, 3806, 3806, 3806, 3806, 3806, + 3806, 3806, 3806, 3806, 3806, 3806, 3806, 3806, 3806, 3806, + 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, + 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, + 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3807, 3808, 3808, + 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, + 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, 3808, + + 3808, 3808, 3808, 3808, 3808, 3808, 3809, 3809, 3809, 3809, + 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, + 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, 3809, + 3809, 3809, 3809, 3809, 3810, 3810, 3810, 3810, 3810, 3810, + 3810, 3810, 3810, 3810, 3810, 3810, 3810, 3810, 3810, 3810, + 3810, 3810, 3810, 3810, 3810, 3810, 3810, 3810, 3810, 3810, + 3810, 3810, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, + 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, + 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, 3811, + 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, + + 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, + 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3813, 3813, + 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, + 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, 3813, + 3813, 3813, 3813, 3813, 3813, 3813, 3814, 3814, 3814, 3814, + 3814, 3814, 3814, 3814, 3814, 3814, 3814, 3814, 3814, 3814, + 3814, 3814, 3814, 3814, 3814, 3814, 3814, 3814, 3814, 3814, + 3814, 3814, 3814, 3814, 3815, 3815, 3815, 3815, 3815, 3815, + 3815, 3815, 3815, 3815, 3815, 3815, 3815, 3815, 3815, 3815, + 3815, 3815, 3815, 3815, 3815, 3815, 3815, 3815, 3815, 3815, + + 3815, 3815, 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816, + 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816, + 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816, 3816, + 3817, 3817, 3817, 3817, 3817, 3817, 3817, 3817, 3817, 3817, + 3817, 3817, 3817, 3817, 3817, 3817, 3817, 3817, 3817, 3817, + 3817, 3817, 3817, 3817, 3817, 3817, 3817, 3817, 3818, 3818, + 3818, 3818, 3818, 3818, 3818, 3818, 3818, 3818, 3818, 3818, + 3818, 3818, 3818, 3818, 3818, 3818, 3818, 3818, 3818, 3818, + 3818, 3818, 3818, 3818, 3818, 3818, 3819, 3819, 3819, 3819, + 3819, 3819, 3819, 3819, 3819, 3819, 3819, 3819, 3819, 3819, + + 3819, 3819, 3819, 3819, 3819, 3819, 3819, 3819, 3819, 3819, + 3819, 3819, 3819, 3819, 3820, 3820, 3820, 3820, 3820, 3820, + 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, + 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, + 3820, 3820, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, + 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, + 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, + 3822, 3822, 3822, 3822, 3822, 3822, 3822, 3822, 3822, 3822, + 3822, 3822, 3822, 3822, 3822, 3822, 3822, 3822, 3822, 3822, + 3822, 3822, 3822, 3822, 3822, 3822, 3822, 3822, 3823, 3823, + + 3823, 3823, 3823, 3823, 3823, 3823, 3823, 3823, 3823, 3823, + 3823, 3823, 3823, 3823, 3823, 3823, 3823, 3823, 3823, 3823, + 3823, 3823, 3823, 3823, 3823, 3823, 3824, 3824, 3824, 3824, + 3824, 3824, 3824, 3824, 3824, 3824, 3824, 3824, 3824, 3824, + 3824, 3824, 3824, 3824, 3824, 3824, 3824, 3824, 3824, 3824, + 3824, 3824, 3824, 3824, 3825, 3825, 3825, 3825, 3825, 3825, + 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, + 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, 3825, + 3825, 3825, 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3826, + 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3826, + + 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3826, 3826, + 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827, + 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827, + 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3827, 3828, 3828, + 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, + 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, + 3828, 3828, 3828, 3828, 3828, 3828, 3829, 3829, 3829, 3829, + 3829, 3829, 3829, 3829, 3829, 3829, 3829, 3829, 3829, 3829, + 3829, 3829, 3829, 3829, 3829, 3829, 3829, 3829, 3829, 3829, + 3829, 3829, 3829, 3829, 3830, 3830, 3830, 3830, 3830, 3830, + + 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, + 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, 3830, + 3830, 3830, 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831, + 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831, + 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831, 3831, + 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832, + 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832, + 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3832, 3833, 3833, + 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, + 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, + + 3833, 3833, 3833, 3833, 3833, 3833, 3834, 3834, 3834, 3834, + 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3834, + 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3834, 3834, + 3834, 3834, 3834, 3834, 3835, 3835, 3835, 3835, 3835, 3835, + 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, + 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, 3835, + 3835, 3835, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, + 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, + 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, 3836, + 3837, 3837, 3837, 3837, 3837, 3837, 3837, 3837, 3837, 3837, + + 3837, 3837, 3837, 3837, 3837, 3837, 3837, 3837, 3837, 3837, + 3837, 3837, 3837, 3837, 3837, 3837, 3837, 3837, 3839, 3839, + 3839, 2122, 3847, 3847, 3847, 3849, 3849, 3849, 3856, 3856, + 3856, 2121, 2120, 3839, 3839, 3858, 3858, 3858, 3839, 3842, + 3842, 3842, 3847, 2119, 2118, 3849, 2114, 2113, 3856, 3876, + 3876, 3876, 3882, 3882, 3882, 3858, 3903, 3903, 3903, 3842, + 2112, 4413, 3905, 3842, 3843, 3843, 3843, 3905, 3905, 3876, + 3909, 2111, 3882, 3909, 2104, 2102, 3903, 2101, 3909, 3843, + 3843, 4413, 3913, 3913, 3843, 3844, 3844, 3913, 3844, 3844, + 3844, 3844, 3844, 3844, 3844, 3844, 3844, 3844, 3844, 3844, + + 3844, 3844, 3844, 3844, 3844, 3844, 3844, 3844, 3844, 3844, + 3844, 3844, 3844, 3846, 3846, 3846, 2098, 3915, 3915, 3915, + 3953, 3953, 3953, 3945, 3959, 3959, 3956, 3959, 3846, 3846, + 3846, 3956, 3959, 3846, 3848, 3848, 3848, 3915, 3945, 3964, + 3953, 3977, 3982, 3945, 3964, 3978, 3977, 3982, 2097, 3848, + 3848, 3848, 3983, 3978, 3848, 3851, 3851, 3983, 3978, 2087, + 3851, 3851, 2084, 3851, 3851, 3851, 3851, 3851, 3851, 3851, + 2083, 3851, 3851, 3851, 3851, 3851, 3851, 3851, 3851, 3851, + 2082, 2077, 3851, 3852, 3852, 3852, 3852, 3852, 3852, 3852, + 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852, + + 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852, 3852, + 3852, 3853, 3853, 2076, 2075, 3853, 3853, 3853, 3853, 3853, + 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853, + 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3853, 3854, + 3854, 2073, 3854, 3854, 3854, 3854, 3854, 3854, 3854, 3854, + 3854, 3854, 3854, 3854, 3854, 3854, 3854, 3854, 3854, 3854, + 3854, 3854, 3854, 3854, 3854, 3854, 3854, 3855, 3855, 3855, + 2072, 3981, 3981, 3981, 3990, 3990, 3990, 3994, 3994, 3994, + 3996, 4005, 3855, 3855, 2034, 3996, 4005, 3855, 3857, 3857, + 3857, 3981, 2033, 4009, 3990, 4019, 4024, 3994, 4009, 2032, + + 4019, 4024, 4031, 3857, 3857, 2031, 4039, 4031, 3857, 3859, + 3859, 4039, 3859, 3859, 3859, 3859, 3859, 3859, 3859, 3859, + 3859, 3859, 3859, 3859, 3859, 3859, 3859, 3859, 3859, 3859, + 3859, 3859, 3859, 3859, 3859, 3859, 3859, 3860, 3860, 2030, + 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, + 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, 3860, + 3860, 3860, 3860, 3860, 3860, 3861, 3861, 2029, 3861, 3861, + 3861, 3861, 3861, 3861, 3861, 2027, 3861, 3861, 3861, 3861, + 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, + 3861, 3861, 3861, 3862, 3862, 3862, 3862, 3862, 3862, 3862, + + 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3862, + 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3862, 3862, + 3862, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, + 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, + 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3864, + 3864, 3864, 3864, 3864, 3864, 3864, 3864, 3864, 3864, 3864, + 3864, 3864, 3864, 3864, 3864, 3864, 3864, 3864, 3864, 3864, + 3864, 3864, 3864, 3864, 3864, 3864, 3864, 3865, 2026, 4040, + 3865, 3865, 3865, 3865, 3865, 3865, 3865, 4040, 3865, 3865, + 3865, 3865, 4040, 3865, 3865, 3865, 3865, 3865, 3865, 3865, + + 2025, 3865, 3865, 3865, 3865, 3866, 3866, 3866, 3866, 3866, + 3866, 3866, 3866, 3866, 3866, 3866, 3866, 3866, 3866, 3866, + 3866, 3866, 3866, 3866, 3866, 3866, 3866, 3866, 3866, 3866, + 3866, 3866, 3866, 3868, 3868, 2022, 3868, 3868, 3868, 3868, + 3868, 3868, 3868, 3868, 3868, 3868, 3868, 3868, 3868, 3868, + 3868, 3868, 3868, 3868, 3868, 3868, 3868, 3868, 3868, 3868, + 3868, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, + 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, + 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3869, 3870, + 3870, 2021, 3870, 3870, 3870, 3870, 3870, 3870, 3870, 3870, + + 3870, 3870, 3870, 3870, 3870, 3870, 3870, 3870, 3870, 3870, + 3870, 3870, 3870, 3870, 3870, 3870, 3870, 3872, 3872, 3872, + 3872, 3872, 3872, 3872, 3872, 3872, 3872, 3872, 3872, 3872, + 3872, 3872, 3872, 3872, 3872, 3872, 3872, 3872, 3872, 3872, + 3872, 3872, 3872, 3872, 3872, 3873, 3873, 3873, 3873, 3873, + 3873, 3873, 3873, 3873, 3873, 3873, 3873, 3873, 3873, 3873, + 3873, 3873, 3873, 3873, 3873, 3873, 3873, 3873, 3873, 3873, + 3873, 3873, 3873, 3874, 4004, 4004, 4004, 2020, 2019, 4008, + 4008, 4008, 3874, 4030, 4030, 4030, 2017, 2016, 3874, 4038, + 4038, 4038, 3874, 3874, 4004, 3874, 3875, 3875, 3875, 4008, + + 4041, 4437, 4045, 4030, 2015, 4041, 4042, 4045, 4042, 4038, + 4066, 3875, 3875, 4042, 4086, 4066, 3875, 3877, 3877, 4086, + 3877, 4437, 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877, + 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877, + 3877, 3877, 3877, 3877, 3877, 3878, 2013, 3878, 3878, 3878, + 3878, 3878, 2011, 2010, 2009, 3878, 1954, 3878, 3879, 3879, + 1950, 3879, 1948, 3879, 3879, 3879, 3879, 3879, 3879, 3879, + 3879, 3879, 3879, 3879, 3879, 3879, 3879, 3879, 3879, 3879, + 3879, 3879, 3879, 3879, 3879, 3879, 3880, 1944, 3880, 3880, + 3880, 3880, 3880, 4052, 1943, 1942, 3880, 1941, 3880, 3881, + + 3881, 3881, 4052, 4075, 4068, 1940, 4075, 4105, 4052, 4068, + 4068, 4075, 4105, 4052, 3881, 3881, 1939, 4082, 4082, 3881, + 3886, 3886, 4082, 3886, 3886, 3886, 3886, 3886, 3886, 3886, + 3886, 3886, 3886, 3886, 3886, 3886, 3886, 3886, 3886, 3886, + 3886, 3886, 3886, 3886, 3886, 3886, 3886, 3886, 3887, 3887, + 3887, 3887, 3887, 3887, 3887, 3887, 3887, 3887, 3887, 3887, + 3887, 3887, 3887, 3887, 3887, 3887, 3887, 3887, 3887, 3887, + 3887, 3887, 3887, 3887, 3887, 3887, 3889, 3889, 3889, 3889, + 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, + 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, 3889, + + 3889, 3889, 3889, 3889, 3890, 3890, 3890, 3890, 3890, 3890, + 3890, 3890, 3890, 3890, 3890, 3890, 3890, 3890, 3890, 3890, + 3890, 3890, 3890, 3890, 3890, 3890, 3890, 3890, 3890, 3890, + 3890, 3890, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, + 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, + 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, 3891, + 3892, 3892, 1938, 3892, 3892, 3892, 3892, 3892, 3892, 3892, + 3892, 3892, 3892, 3892, 3892, 3892, 3892, 3892, 3892, 3892, + 3892, 3892, 3892, 3892, 3892, 3892, 3892, 3892, 3893, 3893, + 1937, 3893, 1936, 3893, 3893, 3893, 3893, 3893, 3893, 3893, + + 3893, 3893, 3893, 3893, 3893, 3893, 3893, 3893, 3893, 3893, + 3893, 3893, 3893, 3893, 3893, 3893, 3894, 1935, 3894, 3894, + 3894, 3894, 3894, 1934, 1922, 1921, 3894, 1920, 3894, 3895, + 3895, 3895, 3895, 3895, 3895, 3895, 3895, 3895, 3895, 3895, + 3895, 3895, 3895, 3895, 3895, 3895, 3895, 3895, 3895, 3895, + 3895, 3895, 3895, 3895, 3895, 3895, 3895, 3896, 3896, 3896, + 3896, 3896, 3896, 3896, 3896, 3896, 3896, 3896, 3896, 3896, + 3896, 3896, 3896, 3896, 3896, 3896, 3896, 3896, 3896, 3896, + 3896, 3896, 3896, 3896, 3896, 3897, 3897, 1918, 3897, 1913, + 3897, 3897, 3897, 3897, 3897, 3897, 3897, 3897, 3897, 3897, + + 3897, 3897, 3897, 3897, 3897, 3897, 3897, 3897, 3897, 3897, + 3897, 3897, 3897, 3898, 1912, 3898, 3898, 3898, 3898, 3898, + 1911, 1910, 1909, 3898, 1908, 3898, 3899, 3899, 1907, 3899, + 1906, 3899, 3899, 3899, 3899, 3899, 3899, 3899, 3899, 3899, + 3899, 3899, 3899, 3899, 3899, 3899, 3899, 3899, 3899, 3899, + 3899, 3899, 3899, 3899, 3900, 1904, 3900, 3900, 3900, 3900, + 3900, 4065, 4065, 4065, 3900, 4069, 3900, 3901, 3901, 3901, + 4069, 4117, 1903, 4069, 4085, 4085, 4085, 4126, 4126, 4126, + 4127, 4065, 3901, 3901, 1901, 4127, 4117, 3901, 3902, 3902, + 3902, 4117, 1900, 4130, 4085, 1899, 4138, 4126, 4130, 4133, + + 4133, 4138, 4133, 3902, 3902, 1898, 1897, 4133, 3902, 3904, + 3904, 3904, 4148, 1891, 3904, 4152, 4169, 4148, 3904, 4173, + 4152, 4169, 1890, 4181, 4173, 4151, 4151, 4151, 4181, 3904, + 3906, 1889, 1883, 3906, 3906, 3906, 3906, 3906, 3906, 3906, + 3906, 3906, 3906, 3906, 3906, 4151, 3906, 3906, 3906, 3906, + 3906, 3906, 3906, 1875, 3906, 3906, 3906, 3906, 3907, 3907, + 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, + 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, + 3907, 3907, 3907, 3907, 3907, 3907, 3910, 1872, 3910, 3910, + 3910, 3910, 3910, 4153, 4153, 4153, 3910, 1871, 3910, 3911, + + 1870, 4185, 3911, 1869, 1868, 3911, 4185, 3911, 3911, 3911, + 3911, 3911, 1867, 4153, 4193, 3911, 1866, 3911, 1865, 4193, + 1860, 3911, 3912, 3912, 1858, 3912, 3912, 3912, 3912, 3912, + 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, + 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, + 3914, 3914, 3914, 4159, 4159, 4159, 4194, 4210, 4216, 1857, + 1856, 4194, 4210, 4216, 4194, 3914, 3914, 4414, 1851, 4438, + 3914, 3916, 4414, 4159, 4438, 3916, 3916, 3916, 3916, 3916, + 3916, 3916, 3916, 3916, 3916, 3916, 3916, 3916, 3916, 3916, + 3916, 3916, 3916, 3916, 3916, 3916, 3916, 3916, 3916, 3917, + + 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3917, + 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3917, + 3917, 3917, 3917, 3917, 3917, 3917, 3917, 3918, 1850, 1849, + 1847, 3918, 3918, 3918, 3918, 3918, 3918, 3918, 3918, 3918, + 3918, 3918, 3918, 3918, 3918, 3918, 3918, 3918, 3918, 3918, + 3918, 3918, 3918, 3918, 3918, 3919, 3919, 3919, 3919, 3919, + 3919, 3919, 3919, 3919, 3919, 3919, 3919, 3919, 3919, 3919, + 3919, 3919, 3919, 3919, 3919, 3919, 3919, 3919, 3919, 3919, + 3919, 3919, 3919, 3920, 1846, 1845, 1844, 3920, 3920, 3920, + 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, + + 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, + 3920, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, + 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, + 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3922, + 3922, 1843, 3922, 3922, 3922, 3922, 3922, 3922, 3922, 3922, + 3922, 3922, 3922, 3922, 1842, 3922, 3922, 4439, 3922, 3922, + 3922, 3922, 4439, 3922, 3922, 3922, 3922, 3923, 3923, 3923, + 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923, + 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3923, + 3923, 3923, 3923, 3923, 3923, 3924, 1841, 1840, 3924, 3924, + + 1839, 3924, 1838, 3924, 3924, 3924, 3924, 3924, 4163, 4163, + 4163, 3924, 1837, 1836, 4168, 4168, 4168, 3924, 3925, 3925, + 1835, 1832, 4217, 4217, 3925, 4217, 3925, 3925, 4163, 1831, + 4217, 3925, 3926, 3926, 4168, 3926, 1829, 3926, 3926, 3926, + 3926, 3926, 3926, 3926, 3926, 3926, 3926, 3926, 3926, 3926, + 3926, 3926, 3926, 3926, 3926, 3926, 3926, 3926, 3926, 3926, + 3927, 1828, 3927, 3927, 3927, 3927, 3927, 1827, 1826, 1824, + 3927, 1823, 3927, 3928, 3928, 1822, 3928, 1820, 3928, 3928, + 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, + 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, 3928, + + 3928, 3929, 1818, 3929, 3929, 3929, 3929, 3929, 4172, 4172, + 4172, 3929, 1816, 3929, 3930, 1814, 3930, 3930, 3930, 3930, + 1813, 1811, 1810, 1807, 3930, 3931, 1803, 1802, 4172, 1792, + 1786, 3931, 1785, 3931, 3931, 3931, 3931, 3931, 1781, 1780, + 3931, 3931, 1779, 1778, 1775, 1774, 1773, 3931, 3932, 3932, + 3932, 3932, 3932, 3932, 3932, 3932, 3932, 3932, 3932, 3932, + 3932, 3932, 3932, 3932, 3932, 3932, 1743, 3932, 3932, 3932, + 3932, 3932, 3932, 3932, 3932, 3932, 3933, 3933, 3933, 3933, + 3933, 3933, 3933, 3933, 3933, 3933, 3933, 3933, 3933, 3933, + 3933, 3933, 3933, 3933, 3933, 3933, 3933, 3933, 3933, 3933, + + 3933, 3933, 3933, 3933, 3935, 1738, 1734, 1733, 3935, 3935, + 3935, 3935, 3935, 3935, 3935, 3935, 3935, 3935, 3935, 3935, + 3935, 3935, 3935, 3935, 3935, 3935, 3935, 3935, 3935, 3935, + 3935, 3935, 3936, 3936, 3936, 3936, 3936, 3936, 3936, 3936, + 3936, 3936, 3936, 3936, 3936, 3936, 3936, 3936, 3936, 3936, + 3936, 3936, 3936, 3936, 3936, 3936, 3936, 3936, 3936, 3936, + 3937, 1732, 1731, 1729, 3937, 3937, 3937, 3937, 3937, 3937, + 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937, + 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3937, 3938, 3938, + 3938, 3938, 3938, 3938, 3938, 3938, 3938, 3938, 3938, 3938, + + 3938, 3938, 3938, 3938, 3938, 3938, 3938, 3938, 3938, 3938, + 3938, 3938, 3938, 3938, 3938, 3938, 3939, 1728, 1726, 1725, + 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, + 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, + 3939, 3939, 3939, 3939, 3940, 3940, 3940, 3940, 3940, 3940, + 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940, + 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940, + 3940, 3940, 3941, 1723, 1722, 1721, 3941, 3941, 3941, 3941, + 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, + 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, + + 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, + 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, + 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3943, 3943, + 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, + 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, + 3943, 3943, 3943, 3943, 3943, 3943, 3944, 3944, 3944, 3944, + 3944, 3944, 3944, 3944, 3944, 3944, 3944, 3944, 3944, 3944, + 3944, 3944, 3944, 3944, 3944, 3944, 3944, 3944, 3944, 3944, + 3944, 3944, 3944, 3944, 3946, 3946, 3946, 3946, 3946, 3946, + 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946, 3946, + + 3946, 3946, 3946, 3946, 3946, 3946, 3946, 1715, 3946, 3946, + 3946, 3946, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, + 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, + 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, 3947, + 3948, 3948, 1714, 3948, 1712, 3948, 3948, 3948, 3948, 3948, + 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948, + 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3948, 3949, 1711, + 3949, 3949, 3949, 3949, 3949, 1710, 1709, 1707, 3949, 1702, + 3949, 3950, 3950, 1698, 3950, 3950, 3950, 3950, 3950, 3950, + 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3950, + + 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3951, + 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, + 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, + 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3952, 3952, 3952, + 4255, 4255, 1696, 4255, 1694, 1686, 4311, 4311, 4255, 4311, + 1676, 1673, 3952, 3952, 4311, 1672, 1671, 3952, 3954, 3954, + 3954, 3954, 3954, 3954, 3954, 3954, 3954, 3954, 3954, 3954, + 3954, 3954, 3954, 3954, 3954, 3954, 3954, 3954, 3954, 3954, + 3954, 3954, 3954, 3954, 3954, 3954, 3955, 3955, 3955, 3955, + 3955, 3955, 3955, 3955, 3955, 3955, 3955, 3955, 3955, 3955, + + 3955, 3955, 3955, 3955, 3955, 3955, 3955, 3955, 3955, 3955, + 3955, 3955, 3955, 3955, 3957, 3957, 3957, 3957, 3957, 3957, + 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, + 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, + 3957, 3957, 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958, + 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958, + 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958, 3958, + 3960, 3960, 1668, 3960, 1666, 3960, 3960, 3960, 3960, 3960, + 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, + 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3961, 1665, + + 3961, 3961, 3961, 3961, 3961, 1662, 1659, 1655, 3961, 1654, + 3961, 3962, 3962, 1653, 3962, 1652, 3962, 3962, 3962, 3962, + 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962, + 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3963, + 1649, 3963, 3963, 3963, 3963, 3963, 1645, 1636, 1627, 3963, + 1626, 3963, 3965, 3965, 3965, 3965, 3965, 3965, 3965, 3965, + 3965, 3965, 1624, 3965, 3965, 3965, 3965, 3965, 3965, 3965, + 3965, 3965, 3965, 3965, 3965, 3965, 3965, 3965, 3965, 3965, + 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, + 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, + + 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3966, 3967, 3967, + 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, + 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, + 3967, 3967, 3967, 3967, 3967, 3967, 3968, 3968, 1623, 3968, + 1622, 3968, 3968, 1621, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, 3968, 1620, + 3968, 3968, 3968, 3968, 3969, 3969, 3969, 3969, 3969, 3969, + 3969, 3969, 3969, 3969, 3969, 3969, 3969, 3969, 3969, 3969, + 3969, 3969, 3969, 3969, 3969, 3969, 3969, 3969, 3969, 3969, + 3969, 3969, 3970, 3970, 1617, 3970, 3970, 3970, 3970, 3970, + + 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970, + 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970, + 3971, 3971, 1605, 3971, 1604, 3971, 3971, 1603, 1568, 1565, + 3971, 3971, 3971, 3971, 3971, 1563, 3971, 3971, 3971, 3971, + 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3972, 3972, + 3972, 3972, 3972, 3972, 3972, 3972, 3972, 3972, 3972, 3972, + 3972, 3972, 3972, 3972, 3972, 3972, 3972, 3972, 3972, 3972, + 3972, 3972, 3972, 3972, 3972, 3972, 3973, 3973, 1560, 3973, + 3973, 3973, 3973, 3973, 3973, 3973, 3973, 3973, 3973, 3973, + 3973, 3973, 3973, 3973, 3973, 3973, 3973, 3973, 3973, 3973, + + 3973, 3973, 3973, 3973, 3974, 1559, 1555, 1554, 1533, 3974, + 3974, 1532, 1524, 1521, 3974, 3974, 3974, 3974, 3974, 1520, + 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974, 3974, + 3974, 3974, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, + 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, + 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, 3975, + 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3976, + 3976, 3976, 3976, 3976, 3976, 1519, 3976, 3976, 3976, 3976, + 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3976, 3979, 3979, + 3979, 4180, 4180, 4180, 1503, 1492, 1491, 1490, 4184, 4184, + + 4184, 4192, 4192, 4192, 3979, 4209, 4209, 4209, 3979, 1489, + 1488, 4180, 1486, 1485, 3979, 3980, 3980, 3980, 4184, 4387, + 1482, 4192, 4215, 4215, 4215, 4209, 4218, 4218, 4218, 4429, + 3980, 3980, 4387, 4451, 4387, 3980, 3984, 3984, 3984, 4387, + 1459, 1457, 4215, 4429, 4412, 1454, 4218, 4451, 4429, 1444, + 1443, 4454, 4451, 1441, 1437, 1436, 3984, 4412, 1430, 4412, + 3984, 3985, 3985, 3985, 4412, 4454, 1429, 1428, 1412, 1409, + 4454, 1404, 1401, 1400, 1399, 1398, 3985, 3985, 1397, 1394, + 1391, 3985, 3986, 3986, 1388, 3986, 3986, 3986, 3986, 3986, + 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986, + + 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986, 3986, + 3987, 3987, 3987, 1380, 1374, 1372, 1370, 1369, 1365, 1364, + 1363, 1362, 1359, 1352, 1351, 3987, 3987, 1349, 1344, 1343, + 3987, 3988, 3988, 3988, 1341, 1340, 1338, 1337, 1336, 1335, + 1325, 1318, 1316, 1315, 1314, 1311, 1310, 3988, 1303, 1301, + 1296, 3988, 1291, 1283, 1280, 1278, 1277, 3988, 3989, 3989, + 3989, 1276, 1273, 1269, 1267, 1266, 1265, 1264, 1263, 1262, + 1246, 1243, 1242, 3989, 3989, 3989, 1238, 1234, 3989, 3991, + 3991, 3991, 1231, 1229, 1228, 1226, 1224, 1220, 1219, 1217, + 1216, 1215, 1214, 1212, 3991, 1209, 3991, 1207, 1198, 3991, + + 3992, 3992, 3992, 1196, 1195, 1191, 1188, 1184, 1181, 1180, + 1176, 1171, 1170, 1169, 1168, 1165, 3992, 1161, 1155, 1153, + 3992, 1152, 1146, 1135, 1130, 1124, 3992, 3993, 3993, 3993, + 1122, 1118, 1116, 1107, 1106, 1105, 1104, 1101, 1100, 1099, + 1098, 1083, 3993, 3993, 3993, 1064, 1055, 3993, 3995, 3995, + 3995, 1053, 1052, 1051, 1048, 1047, 1046, 1044, 1043, 1034, + 1033, 1032, 1029, 3995, 1013, 3995, 1005, 1000, 3995, 3997, + 3997, 998, 996, 994, 3997, 3997, 991, 3997, 3997, 3997, + 3997, 3997, 3997, 3997, 988, 3997, 3997, 3997, 3997, 3997, + 3997, 3997, 3997, 3997, 986, 978, 3997, 3998, 3998, 3998, + + 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, + 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, 3998, + 3998, 3998, 3998, 3998, 3998, 3999, 3999, 964, 960, 3999, + 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, + 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, 3999, + 3999, 3999, 3999, 4000, 4000, 943, 4000, 4000, 4000, 4000, + 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, + 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, + 4000, 4001, 4001, 940, 4001, 4001, 4001, 4001, 4001, 4001, + 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, + + 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4001, 4002, + 4002, 4002, 939, 936, 934, 933, 920, 917, 908, 897, + 893, 890, 878, 841, 837, 4002, 835, 832, 831, 4002, + 830, 813, 812, 810, 809, 4002, 4003, 4003, 4003, 807, + 803, 798, 797, 789, 787, 786, 779, 776, 775, 765, + 750, 4003, 4003, 745, 737, 732, 4003, 4006, 4006, 4006, + 719, 716, 711, 707, 698, 694, 690, 687, 684, 678, + 675, 672, 669, 4006, 661, 658, 655, 4006, 652, 648, + 636, 632, 629, 4006, 4007, 4007, 4007, 625, 622, 621, + 620, 614, 609, 607, 603, 587, 586, 571, 561, 4007, + + 4007, 557, 545, 541, 4007, 4010, 4010, 531, 4010, 4010, + 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, + 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, 4010, + 4010, 4010, 4010, 4011, 4011, 527, 4011, 4011, 4011, 4011, + 4011, 4011, 4011, 4011, 4011, 4011, 4011, 4011, 4011, 4011, + 4011, 4011, 4011, 4011, 4011, 4011, 4011, 4011, 4011, 4011, + 4011, 4012, 4012, 519, 4012, 4012, 4012, 4012, 4012, 4012, + 4012, 507, 4012, 4012, 4012, 4012, 4012, 4012, 4012, 4012, + 4012, 4012, 4012, 4012, 4012, 4012, 4012, 4012, 4012, 4013, + 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, + + 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4013, + 4013, 4013, 4013, 4013, 4013, 4013, 4013, 4014, 4014, 4014, + 4014, 4014, 4014, 4014, 4014, 4014, 4014, 4014, 4014, 4014, + 4014, 4014, 4014, 4014, 4014, 4014, 4014, 4014, 4014, 4014, + 4014, 4014, 4014, 4014, 4014, 4015, 4015, 4015, 4015, 4015, + 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, + 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, 4015, + 4015, 4015, 4015, 4016, 4016, 4016, 4016, 4016, 4016, 4016, + 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, + 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, 4016, + + 4016, 4017, 502, 501, 4017, 4017, 4017, 4017, 4017, 4017, + 4017, 500, 4017, 4017, 4017, 4017, 498, 4017, 4017, 4017, + 4017, 4017, 4017, 4017, 487, 4017, 4017, 4017, 4017, 4018, + 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, + 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4018, + 4018, 4018, 4018, 4018, 4018, 4018, 4018, 4020, 4020, 484, + 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020, + 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020, 4020, + 4020, 4020, 4020, 4020, 4020, 4021, 4021, 482, 4021, 4021, + 4021, 4021, 4021, 4021, 4021, 4021, 4021, 4021, 4021, 4021, + + 4021, 4021, 4021, 4021, 4021, 4021, 4021, 4021, 4021, 4021, + 4021, 4021, 4021, 4022, 4022, 4022, 4022, 4022, 4022, 4022, + 4022, 4022, 4022, 4022, 4022, 4022, 4022, 4022, 4022, 4022, + 4022, 4022, 4022, 4022, 4022, 4022, 4022, 4022, 4022, 4022, + 4022, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, + 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, + 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4023, 4025, + 4025, 4025, 4025, 4025, 4025, 4025, 4025, 4025, 4025, 4025, + 4025, 4025, 4025, 4025, 474, 4025, 4025, 4025, 4025, 4025, + 4025, 4025, 4025, 4025, 4025, 4025, 4025, 4026, 4026, 4026, + + 4026, 4026, 4026, 4026, 4026, 4026, 4026, 4026, 4026, 4026, + 4026, 4026, 473, 4026, 4026, 4026, 4026, 4026, 4026, 4026, + 4026, 4026, 4026, 4026, 4026, 4027, 469, 467, 463, 459, + 448, 447, 443, 439, 4027, 433, 429, 424, 423, 413, + 4027, 411, 406, 404, 4027, 4027, 403, 4027, 4028, 4028, + 4028, 402, 401, 390, 381, 364, 343, 340, 330, 328, + 322, 317, 302, 298, 4028, 292, 287, 285, 4028, 281, + 279, 0, 0, 0, 4028, 4029, 4029, 4029, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4029, 4029, 0, 0, 0, 4029, 4032, 4032, 0, 4032, + + 4032, 4032, 4032, 4032, 4032, 4032, 4032, 4032, 4032, 4032, + 4032, 4032, 4032, 4032, 4032, 4032, 4032, 4032, 4032, 4032, + 4032, 4032, 4032, 4032, 4033, 0, 4033, 4033, 4033, 4033, + 4033, 0, 0, 0, 4033, 0, 4033, 4034, 4034, 0, + 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, + 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, 4034, + 4034, 4034, 4034, 4034, 4034, 4035, 0, 4035, 4035, 4035, + 4035, 4035, 0, 0, 0, 4035, 0, 4035, 4036, 4036, + 4036, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4036, 0, 0, 0, 4036, 0, + + 0, 0, 0, 0, 4036, 4037, 4037, 4037, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4037, 4037, 0, 0, 0, 4037, 4043, 4043, 0, 4043, + 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4043, + 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4043, + 4043, 4043, 4043, 4043, 4044, 4044, 4044, 4044, 4044, 4044, + 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4044, + 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4044, 4044, + 4044, 4044, 4046, 4046, 4046, 4046, 4046, 4046, 4046, 4046, + 4046, 4046, 4046, 4046, 4046, 4046, 4046, 4046, 4046, 4046, + + 4046, 4046, 4046, 4046, 4046, 4046, 4046, 4046, 4046, 4046, + 4047, 4047, 4047, 4047, 4047, 4047, 4047, 4047, 4047, 4047, + 4047, 4047, 4047, 4047, 4047, 4047, 4047, 4047, 4047, 4047, + 4047, 4047, 4047, 4047, 4047, 4047, 4047, 4047, 4048, 4048, + 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048, + 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048, 4048, + 4048, 4048, 4048, 4048, 4048, 4048, 4049, 4049, 4049, 4049, + 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, + 4049, 0, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, + 4049, 4049, 4049, 4049, 4050, 4050, 0, 4050, 4050, 4050, + + 4050, 4050, 4050, 4050, 4050, 4050, 4050, 4050, 4050, 0, + 4050, 4050, 4050, 4050, 4050, 4050, 4050, 4050, 4050, 4050, + 4050, 4050, 4051, 4051, 4051, 4051, 4051, 4051, 4051, 4051, + 4051, 4051, 4051, 4051, 4051, 4051, 4051, 0, 4051, 4051, + 4051, 4051, 4051, 4051, 4051, 4051, 4051, 4051, 4051, 4051, + 4053, 4053, 0, 4053, 4053, 4053, 4053, 4053, 4053, 4053, + 4053, 4053, 4053, 4053, 4053, 4053, 4053, 4053, 4053, 4053, + 4053, 4053, 4053, 4053, 4053, 4053, 4053, 4053, 4054, 0, + 4054, 4054, 4054, 4054, 4054, 0, 0, 0, 4054, 0, + 4054, 4055, 4055, 4055, 4055, 4055, 4055, 4055, 4055, 4055, + + 4055, 4055, 4055, 4055, 4055, 4055, 4055, 4055, 4055, 4055, + 4055, 4055, 4055, 4055, 4055, 4055, 4055, 4055, 4055, 4056, + 4056, 4056, 4056, 4056, 4056, 4056, 4056, 4056, 4056, 4056, + 4056, 4056, 4056, 4056, 4056, 4056, 4056, 4056, 4056, 4056, + 4056, 4056, 4056, 4056, 4056, 4056, 4056, 4057, 4057, 0, + 4057, 4057, 4057, 4057, 4057, 4057, 4057, 4057, 4057, 4057, + 4057, 4057, 4057, 4057, 4057, 4057, 4057, 4057, 4057, 4057, + 4057, 4057, 4057, 4057, 4057, 4058, 0, 4058, 4058, 4058, + 4058, 4058, 0, 0, 0, 4058, 0, 4058, 4059, 4059, + 0, 4059, 4059, 4059, 4059, 4059, 4059, 4059, 4059, 4059, + + 4059, 4059, 4059, 4059, 4059, 4059, 4059, 4059, 4059, 4059, + 4059, 4059, 4059, 4059, 4059, 4059, 4060, 0, 4060, 4060, + 4060, 4060, 4060, 0, 0, 0, 4060, 0, 4060, 4061, + 4061, 4061, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4061, 4061, 0, 0, 0, 4061, + 4062, 4062, 4062, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4062, 4062, 0, 0, 0, + 4062, 4063, 4063, 4063, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4063, 0, 0, + 0, 4063, 0, 0, 0, 0, 0, 4063, 4064, 4064, + + 4064, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4064, 4064, 0, 0, 0, 4064, 4067, + 4067, 4067, 0, 0, 4067, 0, 0, 0, 4067, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4067, + 4070, 0, 0, 4070, 4070, 4070, 4070, 4070, 4070, 4070, + 4070, 4070, 4070, 4070, 4070, 0, 4070, 4070, 4070, 4070, + 4070, 4070, 4070, 0, 4070, 4070, 4070, 4070, 4071, 4071, + 4071, 4071, 4071, 4071, 4071, 4071, 4071, 4071, 4071, 4071, + 4071, 4071, 4071, 4071, 4071, 4071, 4071, 4071, 4071, 4071, + 4071, 4071, 4071, 4071, 4071, 4071, 4072, 0, 0, 4072, + + 0, 0, 0, 0, 0, 0, 0, 4072, 4072, 0, + 0, 0, 4072, 0, 0, 0, 0, 0, 4072, 4076, + 0, 4076, 4076, 4076, 4076, 4076, 0, 0, 0, 4076, + 0, 4076, 4077, 0, 4077, 4077, 4077, 4077, 4077, 0, + 0, 0, 4077, 0, 4077, 4078, 0, 4078, 4078, 4078, + 4078, 4078, 0, 0, 0, 4078, 0, 4078, 0, 0, + 0, 4078, 4079, 0, 0, 0, 0, 4079, 0, 0, + 4079, 4079, 0, 4079, 0, 0, 0, 0, 4079, 4079, + 4079, 0, 4079, 4080, 0, 0, 4080, 0, 0, 4080, + 0, 4080, 4080, 4080, 4080, 4080, 0, 0, 0, 4080, + + 0, 4080, 0, 0, 0, 4080, 4081, 4081, 0, 4081, + 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, + 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, 4081, + 4081, 4081, 4081, 4081, 4083, 4083, 4083, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4083, 0, 0, 0, 4083, 0, 0, 0, 0, 0, + 4083, 4084, 4084, 4084, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4084, 4084, 0, 0, + 0, 4084, 4087, 0, 0, 0, 4087, 4087, 4087, 4087, + 4087, 4087, 4087, 4087, 4087, 4087, 4087, 4087, 4087, 4087, + + 4087, 4087, 4087, 4087, 4087, 4087, 4087, 4087, 4087, 4087, + 4088, 4088, 4088, 4088, 4088, 4088, 4088, 4088, 4088, 4088, + 4088, 4088, 4088, 4088, 4088, 4088, 4088, 4088, 4088, 4088, + 4088, 4088, 4088, 4088, 4088, 4088, 4088, 4088, 4089, 0, + 0, 0, 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4089, + 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4089, + 4089, 4089, 4089, 4089, 4089, 4089, 4090, 4090, 4090, 4090, + 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, + 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, 4090, + 4090, 4090, 4090, 4090, 4091, 0, 0, 0, 4091, 4091, + + 4091, 4091, 4091, 4091, 4091, 4091, 4091, 4091, 4091, 4091, + 4091, 4091, 4091, 4091, 4091, 4091, 4091, 4091, 4091, 4091, + 4091, 4091, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, + 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, + 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, + 4093, 4093, 0, 4093, 4093, 4093, 4093, 4093, 4093, 4093, + 4093, 4093, 4093, 4093, 4093, 0, 4093, 4093, 0, 4093, + 4093, 4093, 4093, 0, 4093, 4093, 4093, 4093, 4094, 4094, + 4094, 4094, 4094, 4094, 4094, 4094, 4094, 4094, 4094, 4094, + 4094, 4094, 4094, 4094, 4094, 4094, 4094, 4094, 4094, 4094, + + 4094, 4094, 4094, 4094, 4094, 4094, 4095, 0, 0, 4095, + 4095, 0, 4095, 0, 4095, 4095, 4095, 4095, 4095, 0, + 0, 0, 4095, 0, 0, 0, 0, 0, 4095, 4096, + 4096, 0, 0, 0, 0, 4096, 0, 4096, 4096, 0, + 0, 0, 4096, 4097, 4097, 0, 4097, 4097, 4097, 4097, + 4097, 4097, 4097, 4097, 4097, 4097, 4097, 4097, 4097, 4097, + 4097, 4097, 4097, 4097, 4097, 4097, 4097, 4097, 4097, 4097, + 4097, 4098, 0, 4098, 4098, 4098, 4098, 4098, 0, 0, + 0, 4098, 0, 4098, 4099, 4099, 0, 4099, 4099, 4099, + 4099, 4099, 4099, 4099, 4099, 4099, 4099, 4099, 4099, 4099, + + 4099, 4099, 4099, 4099, 4099, 4099, 4099, 4099, 4099, 4099, + 4099, 4099, 4100, 0, 4100, 4100, 4100, 4100, 4100, 0, + 0, 0, 4100, 0, 4100, 4101, 0, 4101, 4101, 4101, + 4101, 0, 0, 0, 0, 4101, 4102, 0, 0, 0, + 0, 0, 4102, 0, 4102, 4102, 4102, 4102, 4102, 0, + 0, 4102, 4102, 0, 0, 0, 0, 0, 4102, 4103, + 4103, 4103, 4103, 4103, 4103, 4103, 4103, 4103, 4103, 4103, + 4103, 4103, 4103, 4103, 4103, 4103, 4103, 0, 4103, 4103, + 4103, 4103, 4103, 4103, 4103, 4103, 4103, 4104, 4104, 4104, + 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, + + 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, 4104, + 4104, 4104, 4104, 4104, 4104, 4106, 0, 0, 0, 4106, + 4106, 4106, 4106, 4106, 4106, 4106, 4106, 4106, 4106, 4106, + 4106, 4106, 4106, 4106, 4106, 4106, 4106, 4106, 4106, 4106, + 4106, 4106, 4106, 4107, 4107, 4107, 4107, 4107, 4107, 4107, + 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, + 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107, + 4107, 4108, 0, 0, 0, 4108, 4108, 4108, 4108, 4108, + 4108, 4108, 4108, 4108, 4108, 4108, 4108, 4108, 4108, 4108, + 4108, 4108, 4108, 4108, 4108, 4108, 4108, 4108, 4108, 4109, + + 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4109, + 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4109, + 4109, 4109, 4109, 4109, 4109, 4109, 4109, 4110, 0, 0, + 0, 4110, 4110, 4110, 4110, 4110, 4110, 4110, 4110, 4110, + 4110, 4110, 4110, 4110, 4110, 4110, 4110, 4110, 4110, 4110, + 4110, 4110, 4110, 4110, 4110, 4111, 4111, 4111, 4111, 4111, + 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, + 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, 4111, + 4111, 4111, 4111, 4112, 0, 0, 0, 4112, 4112, 4112, + 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, + + 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, 4112, + 4112, 4113, 4113, 4113, 4113, 4113, 4113, 4113, 4113, 4113, + 4113, 4113, 4113, 4113, 4113, 4113, 4113, 4113, 4113, 4113, + 4113, 4113, 4113, 4113, 4113, 4113, 4113, 4113, 4113, 4114, + 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4114, + 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4114, + 4114, 4114, 4114, 4114, 4114, 4114, 4114, 4115, 4115, 4115, + 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, + 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, 4115, + 4115, 4115, 4115, 4115, 4115, 4116, 4116, 4116, 4116, 4116, + + 4116, 4116, 4116, 4116, 4116, 4116, 4116, 4116, 4116, 4116, + 4116, 4116, 4116, 4116, 4116, 4116, 4116, 4116, 4116, 4116, + 4116, 4116, 4116, 4118, 4118, 4118, 4118, 4118, 4118, 4118, + 4118, 4118, 4118, 4118, 4118, 4118, 4118, 4118, 4118, 4118, + 4118, 4118, 4118, 4118, 4118, 4118, 0, 4118, 4118, 4118, + 4118, 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119, + 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119, + 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4119, 4120, + 4120, 0, 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, + 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4120, + + 4120, 4120, 4120, 4120, 4120, 4120, 4120, 4121, 0, 4121, + 4121, 4121, 4121, 4121, 0, 0, 0, 4121, 0, 4121, + 4122, 4122, 0, 4122, 4122, 4122, 4122, 4122, 4122, 4122, + 4122, 4122, 4122, 4122, 4122, 4122, 4122, 4122, 4122, 4122, + 4122, 4122, 4122, 4122, 4122, 4122, 4122, 4122, 4123, 4123, + 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, + 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, 4123, + 4123, 4123, 4123, 4123, 4123, 4123, 4124, 4124, 4124, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4124, 0, 0, 0, 4124, 0, 0, 0, + + 0, 0, 4124, 4125, 4125, 4125, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4125, 4125, + 0, 0, 0, 4125, 4128, 4128, 4128, 4128, 4128, 4128, + 4128, 4128, 4128, 4128, 4128, 4128, 4128, 4128, 4128, 4128, + 4128, 4128, 4128, 4128, 4128, 4128, 4128, 4128, 4128, 4128, + 4128, 4128, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, + 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, + 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, 4129, + 4131, 4131, 4131, 4131, 4131, 4131, 4131, 4131, 4131, 4131, + 4131, 4131, 4131, 4131, 4131, 4131, 4131, 4131, 4131, 4131, + + 4131, 4131, 4131, 4131, 4131, 4131, 4131, 4131, 4132, 4132, + 4132, 4132, 4132, 4132, 4132, 4132, 4132, 4132, 4132, 4132, + 4132, 4132, 4132, 4132, 4132, 4132, 4132, 4132, 4132, 4132, + 4132, 4132, 4132, 4132, 4132, 4132, 4134, 4134, 0, 4134, + 4134, 4134, 4134, 4134, 4134, 4134, 4134, 4134, 4134, 4134, + 4134, 4134, 4134, 4134, 4134, 4134, 4134, 4134, 4134, 4134, + 4134, 4134, 4134, 4134, 4135, 0, 4135, 4135, 4135, 4135, + 4135, 0, 0, 0, 4135, 0, 4135, 4136, 4136, 0, + 4136, 4136, 4136, 4136, 4136, 4136, 4136, 4136, 4136, 4136, + 4136, 4136, 4136, 4136, 4136, 4136, 4136, 4136, 4136, 4136, + + 4136, 4136, 4136, 4136, 4136, 4137, 0, 4137, 4137, 4137, + 4137, 4137, 0, 0, 0, 4137, 0, 4137, 4139, 4139, + 4139, 4139, 4139, 4139, 4139, 4139, 4139, 4139, 0, 4139, + 4139, 4139, 4139, 4139, 4139, 4139, 4139, 4139, 4139, 4139, + 4139, 4139, 4139, 4139, 4139, 4139, 4140, 4140, 4140, 4140, + 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, + 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, 4140, + 4140, 4140, 4140, 4140, 4141, 4141, 0, 4141, 0, 4141, + 4141, 0, 4141, 4141, 4141, 4141, 4141, 4141, 4141, 4141, + 4141, 4141, 4141, 4141, 4141, 4141, 4141, 0, 4141, 4141, + + 4141, 4141, 4142, 4142, 4142, 4142, 4142, 4142, 4142, 4142, + 4142, 4142, 4142, 4142, 4142, 4142, 4142, 4142, 4142, 4142, + 4142, 4142, 4142, 4142, 4142, 4142, 4142, 4142, 4142, 4142, + 4143, 4143, 0, 4143, 0, 4143, 4143, 0, 0, 0, + 4143, 4143, 4143, 4143, 4143, 0, 4143, 4143, 4143, 4143, + 4143, 4143, 4143, 4143, 4143, 4143, 4143, 4143, 4144, 4144, + 4144, 4144, 4144, 4144, 4144, 4144, 4144, 4144, 4144, 4144, + 4144, 4144, 4144, 4144, 4144, 4144, 4144, 4144, 4144, 4144, + 4144, 4144, 4144, 4144, 4144, 4144, 4145, 4145, 0, 4145, + 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, + + 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, 4145, + 4145, 4145, 4145, 4145, 4146, 0, 0, 0, 0, 4146, + 4146, 0, 0, 0, 4146, 4146, 4146, 4146, 4146, 0, + 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146, 4146, + 4146, 4146, 4147, 4147, 4147, 4147, 4147, 4147, 4147, 4147, + 4147, 4147, 4147, 4147, 4147, 4147, 4147, 4147, 4147, 4147, + 4147, 4147, 4147, 4147, 4147, 4147, 4147, 4147, 4147, 4147, + 4149, 4149, 4149, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4149, 0, 0, 0, + 4149, 0, 0, 0, 0, 0, 4149, 4150, 4150, 4150, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4150, 4150, 0, 0, 0, 4150, 4154, 4154, + 4154, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4154, 4154, 0, 0, 0, 4154, 4155, + 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4155, 0, + 4155, 4155, 4155, 4155, 0, 4155, 4155, 4155, 4155, 4155, + 4155, 4155, 4155, 4155, 4155, 4155, 4155, 4156, 4156, 4156, + 4156, 4156, 4156, 4156, 4156, 4156, 4156, 4156, 4156, 4156, + 4156, 4156, 0, 4156, 4156, 4156, 4156, 4156, 4156, 4156, + 4156, 4156, 4156, 4156, 4156, 4157, 4157, 4157, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4157, 0, 0, 0, 4157, 0, 0, 0, 0, + 0, 4157, 4158, 4158, 4158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4158, 4158, 4158, + 0, 0, 4158, 4160, 4160, 4160, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4160, 0, + 4160, 0, 0, 4160, 4161, 4161, 4161, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4161, 0, 0, 0, 4161, 0, 0, 0, 0, 0, + 4161, 4162, 4162, 4162, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 4162, 4162, 4162, 0, + 0, 4162, 4164, 4164, 4164, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4164, 0, 4164, + 0, 0, 4164, 4165, 4165, 0, 4165, 4165, 4165, 4165, + 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165, + 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165, 4165, + 4165, 4166, 4166, 4166, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4166, 0, 0, + 0, 4166, 0, 0, 0, 0, 0, 4166, 4167, 4167, + 4167, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 4167, 4167, 0, 0, 0, 4167, 4170, + 4170, 4170, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4170, 0, 0, 0, 4170, + 0, 0, 0, 0, 0, 4170, 4171, 4171, 4171, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4171, 4171, 0, 0, 0, 4171, 4174, 4174, 0, + 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174, + 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174, 4174, + 4174, 4174, 4174, 4174, 4174, 4175, 0, 0, 4175, 4175, + 4175, 4175, 4175, 4175, 4175, 0, 4175, 4175, 4175, 4175, + + 0, 4175, 4175, 4175, 4175, 4175, 4175, 4175, 0, 4175, + 4175, 4175, 4175, 4176, 4176, 4176, 4176, 4176, 4176, 4176, + 4176, 4176, 4176, 4176, 4176, 4176, 4176, 4176, 4176, 4176, + 4176, 4176, 4176, 4176, 4176, 4176, 4176, 4176, 4176, 4176, + 4176, 4177, 4177, 0, 4177, 4177, 4177, 4177, 4177, 4177, + 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, + 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4178, + 4178, 4178, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4178, 0, 0, 0, 4178, + 0, 0, 0, 0, 0, 4178, 4179, 4179, 4179, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4179, 4179, 0, 0, 0, 4179, 4182, 4182, 4182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4182, 0, 0, 0, 4182, 0, 0, + 0, 0, 0, 4182, 4183, 4183, 4183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4183, + 4183, 0, 0, 0, 4183, 4186, 4186, 4186, 4186, 4186, + 4186, 4186, 4186, 4186, 4186, 4186, 4186, 4186, 4186, 4186, + 0, 4186, 4186, 4186, 4186, 4186, 4186, 4186, 4186, 4186, + 4186, 4186, 4186, 4187, 4187, 0, 4187, 4187, 4187, 4187, + + 4187, 4187, 4187, 4187, 4187, 4187, 4187, 4187, 0, 4187, + 4187, 4187, 4187, 4187, 4187, 4187, 4187, 4187, 4187, 4187, + 4187, 4188, 4188, 4188, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4188, 0, 0, + 0, 4188, 4189, 4189, 4189, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4189, 4189, 0, + 0, 0, 4189, 4190, 4190, 4190, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4190, + 0, 0, 0, 4190, 0, 0, 0, 0, 0, 4190, + 4191, 4191, 4191, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 4191, 4191, 0, 0, 0, + 4191, 4195, 0, 0, 4195, 4195, 4195, 4195, 4195, 4195, + 4195, 4195, 4195, 4195, 4195, 4195, 0, 4195, 4195, 4195, + 4195, 4195, 4195, 4195, 0, 4195, 4195, 4195, 4195, 4196, + 0, 0, 4196, 0, 0, 0, 0, 0, 0, 0, + 4196, 4196, 0, 0, 0, 4196, 0, 0, 0, 0, + 0, 4196, 4198, 0, 4198, 4198, 4198, 4198, 4198, 0, + 0, 0, 4198, 0, 4198, 4199, 0, 0, 4199, 0, + 0, 4199, 0, 4199, 4199, 4199, 4199, 4199, 0, 0, + 0, 4199, 0, 4199, 0, 0, 0, 4199, 4200, 4200, + + 0, 4200, 4200, 4200, 4200, 4200, 4200, 4200, 4200, 4200, + 4200, 4200, 4200, 4200, 4200, 4200, 4200, 4200, 4200, 4200, + 4200, 4200, 4200, 4200, 4200, 4200, 4201, 4201, 0, 4201, + 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, + 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, + 4201, 4201, 4201, 4201, 4202, 4202, 0, 4202, 4202, 4202, + 4202, 4202, 4202, 4202, 4202, 4202, 4202, 4202, 4202, 4202, + 4202, 4202, 4202, 4202, 4202, 4202, 4202, 4202, 4202, 4202, + 4202, 4202, 4203, 0, 0, 0, 0, 4203, 0, 0, + 4203, 4203, 0, 4203, 0, 0, 0, 0, 4203, 4203, + + 4203, 0, 4203, 4204, 0, 4204, 4204, 4204, 4204, 4204, + 0, 0, 0, 4204, 0, 4204, 0, 0, 0, 4204, + 4205, 0, 4205, 4205, 4205, 4205, 4205, 0, 0, 0, + 4205, 0, 4205, 4206, 0, 0, 4206, 0, 0, 4206, + 0, 4206, 4206, 4206, 4206, 4206, 0, 0, 0, 4206, + 0, 4206, 0, 0, 0, 4206, 4207, 4207, 4207, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4207, 0, 0, 0, 4207, 0, 0, 0, + 0, 0, 4207, 4208, 4208, 4208, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4208, 4208, + + 0, 0, 0, 4208, 4211, 4211, 0, 4211, 4211, 4211, + 4211, 4211, 4211, 4211, 4211, 4211, 4211, 4211, 4211, 0, + 4211, 4211, 0, 4211, 4211, 4211, 4211, 0, 4211, 4211, + 4211, 4211, 4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212, + 4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212, + 4212, 4212, 4212, 4212, 4212, 0, 4212, 4212, 4212, 4212, + 4213, 4213, 4213, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4213, 0, 0, 0, + 4213, 0, 0, 0, 0, 0, 4213, 4214, 4214, 4214, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 4214, 4214, 0, 0, 0, 4214, 4219, 4219, + 4219, 0, 0, 0, 0, 0, 0, 4219, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4219, 4220, + 4220, 4220, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4220, 4220, 4220, 0, 0, 4220, + 4221, 4221, 0, 4221, 4221, 4221, 4221, 4221, 4221, 4221, + 4221, 4221, 4221, 4221, 4221, 4221, 4221, 4221, 4221, 4221, + 4221, 4221, 4221, 4221, 4221, 4221, 4221, 4221, 4222, 0, + 0, 4222, 4222, 4222, 4222, 4222, 4222, 4222, 0, 4222, + 4222, 4222, 4222, 0, 4222, 4222, 4222, 4222, 4222, 4222, + + 4222, 0, 4222, 4222, 4222, 4222, 4223, 4223, 0, 4223, + 4223, 4223, 4223, 4223, 4223, 4223, 4223, 4223, 4223, 4223, + 4223, 4223, 4223, 4223, 4223, 4223, 4223, 4223, 4223, 4223, + 4223, 4223, 4223, 4223, 4224, 4224, 4224, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4224, 0, 0, 0, 4224, 4225, 4225, 4225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4225, 4225, 0, 0, 0, 4225, 4226, 0, 0, 4226, + 4226, 4226, 4226, 4226, 4226, 4226, 4226, 4226, 4226, 4226, + 4226, 0, 4226, 4226, 4226, 4226, 4226, 4226, 4226, 0, + + 4226, 4226, 4226, 4226, 4228, 0, 0, 4228, 0, 0, + 4228, 0, 4228, 4228, 4228, 4228, 4228, 0, 0, 0, + 4228, 0, 4228, 0, 0, 0, 4228, 4229, 4229, 0, + 4229, 4229, 4229, 4229, 4229, 4229, 4229, 4229, 4229, 4229, + 4229, 4229, 4229, 4229, 4229, 4229, 4229, 4229, 4229, 4229, + 4229, 4229, 4229, 4229, 4229, 4230, 4230, 0, 4230, 4230, + 4230, 4230, 4230, 4230, 4230, 4230, 4230, 4230, 4230, 4230, + 4230, 4230, 4230, 4230, 4230, 4230, 4230, 4230, 4230, 4230, + 4230, 4230, 4230, 4231, 4231, 0, 4231, 4231, 4231, 4231, + 4231, 4231, 4231, 4231, 4231, 4231, 4231, 4231, 4231, 4231, + + 4231, 4231, 4231, 4231, 4231, 4231, 4231, 4231, 4231, 4231, + 4231, 4232, 4232, 0, 4232, 4232, 4232, 4232, 4232, 4232, + 4232, 4232, 4232, 4232, 4232, 4232, 4232, 4232, 4232, 4232, + 4232, 4232, 4232, 4232, 4232, 4232, 4232, 4232, 4232, 4233, + 4233, 0, 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4233, + 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4233, + 4233, 4233, 4233, 4233, 4233, 4233, 4233, 4234, 4234, 0, + 4234, 4234, 4234, 4234, 4234, 4234, 4234, 4234, 4234, 4234, + 4234, 4234, 4234, 4234, 4234, 4234, 4234, 4234, 4234, 4234, + 4234, 4234, 4234, 4234, 4234, 4235, 4235, 0, 4235, 4235, + + 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235, + 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235, 4235, + 4235, 4235, 4235, 4236, 4236, 0, 4236, 4236, 4236, 4236, + 4236, 4236, 4236, 4236, 4236, 4236, 4236, 4236, 4236, 4236, + 4236, 4236, 4236, 4236, 4236, 4236, 4236, 4236, 4236, 4236, + 4236, 4237, 4237, 0, 4237, 4237, 4237, 4237, 4237, 4237, + 4237, 4237, 4237, 4237, 4237, 4237, 4237, 4237, 4237, 4237, + 4237, 4237, 4237, 4237, 4237, 4237, 4237, 4237, 4237, 4238, + 4238, 0, 4238, 4238, 4238, 4238, 4238, 4238, 4238, 4238, + 4238, 4238, 4238, 4238, 4238, 4238, 4238, 4238, 4238, 4238, + + 4238, 4238, 4238, 4238, 4238, 4238, 4238, 4239, 4239, 0, + 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4239, + 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4239, 4239, + 4239, 4239, 4239, 4239, 4239, 4240, 4240, 0, 4240, 4240, + 4240, 4240, 4240, 4240, 4240, 4240, 4240, 4240, 4240, 4240, + 4240, 4240, 4240, 4240, 4240, 4240, 4240, 4240, 4240, 4240, + 4240, 4240, 4240, 4241, 4241, 0, 4241, 4241, 4241, 4241, + 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, + 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, 4241, + 4241, 4242, 4242, 0, 4242, 4242, 4242, 4242, 4242, 4242, + + 4242, 4242, 4242, 4242, 4242, 4242, 4242, 4242, 4242, 4242, + 4242, 4242, 4242, 4242, 4242, 4242, 4242, 4242, 4242, 4243, + 4243, 0, 4243, 4243, 4243, 4243, 4243, 4243, 4243, 4243, + 4243, 4243, 4243, 4243, 4243, 4243, 4243, 4243, 4243, 4243, + 4243, 4243, 4243, 4243, 4243, 4243, 4243, 4244, 4244, 0, + 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, + 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, 4244, + 4244, 4244, 4244, 4244, 4244, 4245, 4245, 0, 4245, 4245, + 4245, 4245, 4245, 4245, 4245, 4245, 4245, 4245, 4245, 4245, + 4245, 4245, 4245, 4245, 4245, 4245, 4245, 4245, 4245, 4245, + + 4245, 4245, 4245, 4246, 4246, 0, 4246, 4246, 4246, 4246, + 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, + 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, 4246, + 4246, 4247, 4247, 0, 4247, 4247, 4247, 4247, 4247, 4247, + 4247, 4247, 4247, 4247, 4247, 4247, 4247, 4247, 4247, 4247, + 4247, 4247, 4247, 4247, 4247, 4247, 4247, 4247, 4247, 4248, + 4248, 0, 4248, 4248, 4248, 4248, 4248, 4248, 4248, 4248, + 4248, 4248, 4248, 4248, 4248, 4248, 4248, 4248, 4248, 4248, + 4248, 4248, 4248, 4248, 4248, 4248, 4248, 4249, 4249, 0, + 4249, 4249, 4249, 4249, 4249, 4249, 4249, 4249, 4249, 4249, + + 4249, 4249, 4249, 4249, 4249, 4249, 4249, 4249, 4249, 4249, + 4249, 4249, 4249, 4249, 4249, 4250, 4250, 0, 4250, 4250, + 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250, + 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250, 4250, + 4250, 4250, 4250, 4251, 0, 4251, 4251, 4251, 4251, 4251, + 0, 0, 0, 4251, 0, 4251, 4252, 0, 0, 4252, + 0, 0, 4252, 0, 4252, 4252, 4252, 4252, 4252, 0, + 0, 0, 4252, 0, 4252, 0, 0, 0, 4252, 4253, + 4253, 0, 4253, 4253, 4253, 4253, 4253, 4253, 4253, 4253, + 4253, 4253, 4253, 4253, 0, 4253, 4253, 0, 4253, 4253, + + 4253, 4253, 0, 4253, 4253, 4253, 4253, 4254, 4254, 4254, + 4254, 4254, 4254, 4254, 4254, 4254, 4254, 4254, 4254, 4254, + 4254, 4254, 4254, 4254, 4254, 4254, 4254, 4254, 4254, 4254, + 0, 4254, 4254, 4254, 4254, 4256, 4256, 4256, 0, 0, + 0, 0, 0, 0, 4256, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4256, 4257, 4257, 4257, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4257, 4257, 4257, 0, 0, 4257, 4258, 4258, 0, + 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, + 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, 4258, + + 4258, 4258, 4258, 4258, 4258, 4259, 4259, 4259, 4259, 4259, + 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, + 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, 4259, + 4259, 4259, 4259, 4260, 0, 0, 4260, 4260, 4260, 4260, + 4260, 4260, 4260, 0, 4260, 4260, 4260, 4260, 0, 4260, + 4260, 4260, 4260, 4260, 4260, 4260, 0, 4260, 4260, 4260, + 4260, 4261, 4261, 0, 4261, 4261, 4261, 4261, 4261, 4261, + 4261, 4261, 4261, 4261, 4261, 4261, 4261, 4261, 4261, 4261, + 4261, 4261, 4261, 4261, 4261, 4261, 4261, 4261, 4261, 4262, + 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, 4262, + + 4262, 4262, 4262, 4262, 4262, 0, 4262, 4262, 4262, 4262, + 0, 4262, 4262, 4262, 4262, 4262, 4262, 4263, 4263, 0, + 4263, 4263, 4263, 4263, 4263, 4263, 4263, 4263, 4263, 4263, + 4263, 4263, 4263, 4263, 4263, 4263, 4263, 4263, 4263, 4263, + 4263, 4263, 4263, 4263, 4263, 4264, 4264, 4264, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4264, 4264, 0, 0, 0, 4264, 4265, 0, 0, 4265, + 4265, 4265, 4265, 4265, 4265, 4265, 4265, 4265, 4265, 4265, + 4265, 0, 4265, 4265, 4265, 4265, 4265, 4265, 4265, 0, + 4265, 4265, 4265, 4265, 4266, 0, 0, 4266, 0, 0, + + 0, 0, 0, 0, 0, 4266, 4266, 0, 0, 0, + 4266, 0, 0, 0, 0, 0, 4266, 4267, 4267, 0, + 4267, 4267, 4267, 4267, 4267, 4267, 4267, 4267, 4267, 4267, + 4267, 4267, 4267, 4267, 4267, 4267, 4267, 4267, 4267, 4267, + 4267, 4267, 4267, 4267, 4267, 4268, 4268, 0, 4268, 4268, + 4268, 4268, 4268, 4268, 4268, 4268, 4268, 4268, 4268, 4268, + 4268, 4268, 4268, 4268, 4268, 4268, 4268, 4268, 4268, 4268, + 4268, 4268, 4268, 4269, 4269, 0, 4269, 4269, 4269, 4269, + 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, + 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, 4269, + + 4269, 4270, 4270, 0, 4270, 4270, 4270, 4270, 4270, 4270, + 4270, 4270, 4270, 4270, 4270, 4270, 4270, 4270, 4270, 4270, + 4270, 4270, 4270, 4270, 4270, 4270, 4270, 4270, 4270, 4271, + 4271, 0, 4271, 4271, 4271, 4271, 4271, 4271, 4271, 4271, + 4271, 4271, 4271, 4271, 4271, 4271, 4271, 4271, 4271, 4271, + 4271, 4271, 4271, 4271, 4271, 4271, 4271, 4272, 4272, 0, + 4272, 4272, 4272, 4272, 4272, 4272, 4272, 4272, 4272, 4272, + 4272, 4272, 4272, 4272, 4272, 4272, 4272, 4272, 4272, 4272, + 4272, 4272, 4272, 4272, 4272, 4273, 4273, 0, 4273, 4273, + 4273, 4273, 4273, 4273, 4273, 4273, 4273, 4273, 4273, 4273, + + 4273, 4273, 4273, 4273, 4273, 4273, 4273, 4273, 4273, 4273, + 4273, 4273, 4273, 4274, 4274, 0, 4274, 4274, 4274, 4274, + 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4274, + 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4274, 4274, + 4274, 4275, 4275, 0, 4275, 4275, 4275, 4275, 4275, 4275, + 4275, 4275, 4275, 4275, 4275, 4275, 4275, 4275, 4275, 4275, + 4275, 4275, 4275, 4275, 4275, 4275, 4275, 4275, 4275, 4276, + 4276, 0, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, + 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4276, + 4276, 4276, 4276, 4276, 4276, 4276, 4276, 4277, 4277, 0, + + 4277, 4277, 4277, 4277, 4277, 4277, 4277, 4277, 4277, 4277, + 4277, 4277, 4277, 4277, 4277, 4277, 4277, 4277, 4277, 4277, + 4277, 4277, 4277, 4277, 4277, 4278, 4278, 0, 4278, 4278, + 4278, 4278, 4278, 4278, 4278, 4278, 4278, 4278, 4278, 4278, + 4278, 4278, 4278, 4278, 4278, 4278, 4278, 4278, 4278, 4278, + 4278, 4278, 4278, 4279, 4279, 0, 4279, 4279, 4279, 4279, + 4279, 4279, 4279, 4279, 4279, 4279, 4279, 4279, 4279, 4279, + 4279, 4279, 4279, 4279, 4279, 4279, 4279, 4279, 4279, 4279, + 4279, 4280, 4280, 0, 4280, 4280, 4280, 4280, 4280, 4280, + 4280, 4280, 4280, 4280, 4280, 4280, 4280, 4280, 4280, 4280, + + 4280, 4280, 4280, 4280, 4280, 4280, 4280, 4280, 4280, 4281, + 4281, 0, 4281, 4281, 4281, 4281, 4281, 4281, 4281, 4281, + 4281, 4281, 4281, 4281, 4281, 4281, 4281, 4281, 4281, 4281, + 4281, 4281, 4281, 4281, 4281, 4281, 4281, 4282, 4282, 0, + 4282, 4282, 4282, 4282, 4282, 4282, 4282, 4282, 4282, 4282, + 4282, 4282, 4282, 4282, 4282, 4282, 4282, 4282, 4282, 4282, + 4282, 4282, 4282, 4282, 4282, 4283, 4283, 0, 4283, 4283, + 4283, 4283, 4283, 4283, 4283, 4283, 4283, 4283, 4283, 4283, + 4283, 4283, 4283, 4283, 4283, 4283, 4283, 4283, 4283, 4283, + 4283, 4283, 4283, 4284, 4284, 0, 4284, 4284, 4284, 4284, + + 4284, 4284, 4284, 4284, 4284, 4284, 4284, 4284, 4284, 4284, + 4284, 4284, 4284, 4284, 4284, 4284, 4284, 4284, 4284, 4284, + 4284, 4285, 4285, 0, 4285, 4285, 4285, 4285, 4285, 4285, + 4285, 4285, 4285, 4285, 4285, 4285, 4285, 4285, 4285, 4285, + 4285, 4285, 4285, 4285, 4285, 4285, 4285, 4285, 4285, 4286, + 4286, 0, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, + 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4286, + 4286, 4286, 4286, 4286, 4286, 4286, 4286, 4287, 4287, 0, + 4287, 4287, 4287, 4287, 4287, 4287, 4287, 4287, 4287, 4287, + 4287, 4287, 4287, 4287, 4287, 4287, 4287, 4287, 4287, 4287, + + 4287, 4287, 4287, 4287, 4287, 4288, 4288, 0, 4288, 4288, + 4288, 4288, 4288, 4288, 4288, 4288, 4288, 4288, 4288, 4288, + 4288, 4288, 4288, 4288, 4288, 4288, 4288, 4288, 4288, 4288, + 4288, 4288, 4288, 4289, 4289, 0, 4289, 4289, 4289, 4289, + 4289, 4289, 4289, 4289, 4289, 4289, 4289, 4289, 4289, 4289, + 4289, 4289, 4289, 4289, 4289, 4289, 4289, 4289, 4289, 4289, + 4289, 4290, 4290, 0, 4290, 4290, 4290, 4290, 4290, 4290, + 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4290, + 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4290, 4291, + 4291, 0, 4291, 4291, 4291, 4291, 4291, 4291, 4291, 4291, + + 4291, 4291, 4291, 4291, 4291, 4291, 4291, 4291, 4291, 4291, + 4291, 4291, 4291, 4291, 4291, 4291, 4291, 4292, 4292, 0, + 4292, 4292, 4292, 4292, 4292, 4292, 4292, 4292, 4292, 4292, + 4292, 4292, 4292, 4292, 4292, 4292, 4292, 4292, 4292, 4292, + 4292, 4292, 4292, 4292, 4292, 4293, 4293, 0, 4293, 4293, + 4293, 4293, 4293, 4293, 4293, 4293, 4293, 4293, 4293, 4293, + 4293, 4293, 4293, 4293, 4293, 4293, 4293, 4293, 4293, 4293, + 4293, 4293, 4293, 4294, 4294, 0, 4294, 4294, 4294, 4294, + 4294, 4294, 4294, 4294, 4294, 4294, 4294, 4294, 4294, 4294, + 4294, 4294, 4294, 4294, 4294, 4294, 4294, 4294, 4294, 4294, + + 4294, 4295, 4295, 0, 4295, 4295, 4295, 4295, 4295, 4295, + 4295, 4295, 4295, 4295, 4295, 4295, 4295, 4295, 4295, 4295, + 4295, 4295, 4295, 4295, 4295, 4295, 4295, 4295, 4295, 4296, + 4296, 0, 4296, 4296, 4296, 4296, 4296, 4296, 4296, 4296, + 4296, 4296, 4296, 4296, 4296, 4296, 4296, 4296, 4296, 4296, + 4296, 4296, 4296, 4296, 4296, 4296, 4296, 4297, 4297, 0, + 4297, 4297, 4297, 4297, 4297, 4297, 4297, 4297, 4297, 4297, + 4297, 4297, 4297, 4297, 4297, 4297, 4297, 4297, 4297, 4297, + 4297, 4297, 4297, 4297, 4297, 4298, 4298, 0, 4298, 4298, + 4298, 4298, 4298, 4298, 4298, 4298, 4298, 4298, 4298, 4298, + + 4298, 4298, 4298, 4298, 4298, 4298, 4298, 4298, 4298, 4298, + 4298, 4298, 4298, 4299, 4299, 0, 4299, 4299, 4299, 4299, + 4299, 4299, 4299, 4299, 4299, 4299, 4299, 4299, 4299, 4299, + 4299, 4299, 4299, 4299, 4299, 4299, 4299, 4299, 4299, 4299, + 4299, 4300, 4300, 0, 4300, 4300, 4300, 4300, 4300, 4300, + 4300, 4300, 4300, 4300, 4300, 4300, 4300, 4300, 4300, 4300, + 4300, 4300, 4300, 4300, 4300, 4300, 4300, 4300, 4300, 4301, + 4301, 0, 4301, 4301, 4301, 4301, 4301, 4301, 4301, 4301, + 4301, 4301, 4301, 4301, 4301, 4301, 4301, 4301, 4301, 4301, + 4301, 4301, 4301, 4301, 4301, 4301, 4301, 4302, 4302, 0, + + 4302, 4302, 4302, 4302, 4302, 4302, 4302, 4302, 4302, 4302, + 4302, 4302, 4302, 4302, 4302, 4302, 4302, 4302, 4302, 4302, + 4302, 4302, 4302, 4302, 4302, 4303, 4303, 0, 4303, 4303, + 4303, 4303, 4303, 4303, 4303, 4303, 4303, 4303, 4303, 4303, + 4303, 4303, 4303, 4303, 4303, 4303, 4303, 4303, 4303, 4303, + 4303, 4303, 4303, 4304, 4304, 0, 4304, 4304, 4304, 4304, + 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, + 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, 4304, + 4304, 4305, 0, 0, 4305, 0, 0, 4305, 0, 4305, + 4305, 4305, 4305, 4305, 0, 0, 0, 4305, 0, 4305, + + 0, 0, 0, 4305, 4306, 0, 4306, 4306, 4306, 4306, + 4306, 0, 0, 0, 4306, 0, 4306, 4307, 4307, 0, + 4307, 4307, 4307, 4307, 4307, 4307, 4307, 4307, 4307, 4307, + 4307, 4307, 4307, 4307, 4307, 4307, 4307, 4307, 4307, 4307, + 4307, 4307, 4307, 4307, 4307, 4308, 0, 0, 4308, 0, + 0, 4308, 0, 4308, 4308, 4308, 4308, 4308, 0, 0, + 0, 4308, 0, 4308, 0, 0, 0, 4308, 4309, 4309, + 0, 4309, 4309, 4309, 4309, 4309, 4309, 4309, 4309, 4309, + 4309, 4309, 4309, 0, 4309, 4309, 0, 4309, 4309, 4309, + 4309, 0, 4309, 4309, 4309, 4309, 4310, 4310, 4310, 4310, + + 4310, 4310, 4310, 4310, 4310, 4310, 4310, 4310, 4310, 4310, + 4310, 4310, 4310, 4310, 4310, 4310, 4310, 4310, 4310, 0, + 4310, 4310, 4310, 4310, 4312, 4312, 4312, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4312, + 4312, 4312, 0, 0, 4312, 4313, 4313, 0, 4313, 4313, + 4313, 4313, 4313, 4313, 4313, 4313, 4313, 4313, 4313, 4313, + 4313, 4313, 4313, 4313, 4313, 4313, 4313, 4313, 4313, 4313, + 4313, 4313, 4313, 4314, 4314, 0, 4314, 4314, 4314, 4314, + 4314, 4314, 4314, 4314, 4314, 4314, 4314, 4314, 4314, 4314, + 4314, 4314, 4314, 4314, 4314, 4314, 4314, 4314, 4314, 4314, + + 4314, 4315, 0, 0, 4315, 4315, 4315, 4315, 4315, 4315, + 4315, 0, 4315, 4315, 4315, 4315, 0, 4315, 4315, 4315, + 4315, 4315, 4315, 4315, 0, 4315, 4315, 4315, 4315, 4316, + 4316, 0, 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316, + 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4316, + 4316, 4316, 4316, 4316, 4316, 4316, 4316, 4317, 4317, 4317, + 4317, 4317, 4317, 4317, 4317, 4317, 4317, 4317, 4317, 4317, + 4317, 4317, 4317, 0, 4317, 4317, 4317, 4317, 0, 4317, + 4317, 4317, 4317, 4317, 4317, 4318, 0, 0, 4318, 4318, + 4318, 4318, 4318, 4318, 4318, 4318, 4318, 4318, 4318, 4318, + + 0, 4318, 4318, 4318, 4318, 4318, 4318, 4318, 0, 4318, + 4318, 4318, 4318, 4319, 0, 0, 4319, 0, 0, 0, + 0, 0, 0, 0, 4319, 4319, 0, 0, 0, 4319, + 0, 0, 0, 0, 0, 4319, 4320, 4320, 0, 4320, + 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, + 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, 4320, + 4320, 4320, 4320, 4320, 4321, 4321, 0, 4321, 4321, 4321, + 4321, 4321, 4321, 4321, 4321, 4321, 4321, 4321, 4321, 4321, + 4321, 4321, 4321, 4321, 4321, 4321, 4321, 4321, 4321, 4321, + 4321, 4321, 4322, 4322, 0, 4322, 4322, 4322, 4322, 4322, + + 4322, 4322, 4322, 4322, 4322, 4322, 4322, 4322, 4322, 4322, + 4322, 4322, 4322, 4322, 4322, 4322, 4322, 4322, 4322, 4322, + 4323, 4323, 0, 4323, 4323, 4323, 4323, 4323, 4323, 4323, + 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, + 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4324, 4324, + 0, 4324, 4324, 4324, 4324, 4324, 4324, 4324, 4324, 4324, + 4324, 4324, 4324, 4324, 4324, 4324, 4324, 4324, 4324, 4324, + 4324, 4324, 4324, 4324, 4324, 4324, 4325, 4325, 0, 4325, + 4325, 4325, 4325, 4325, 4325, 4325, 4325, 4325, 4325, 4325, + 4325, 4325, 4325, 4325, 4325, 4325, 4325, 4325, 4325, 4325, + + 4325, 4325, 4325, 4325, 4326, 4326, 0, 4326, 4326, 4326, + 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, + 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, 4326, + 4326, 4326, 4327, 4327, 0, 4327, 4327, 4327, 4327, 4327, + 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, + 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, + 4328, 4328, 0, 4328, 4328, 4328, 4328, 4328, 4328, 4328, + 4328, 4328, 4328, 4328, 4328, 4328, 4328, 4328, 4328, 4328, + 4328, 4328, 4328, 4328, 4328, 4328, 4328, 4328, 4329, 4329, + 0, 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4330, 4330, 0, 4330, + 4330, 4330, 4330, 4330, 4330, 4330, 4330, 4330, 4330, 4330, + 4330, 4330, 4330, 4330, 4330, 4330, 4330, 4330, 4330, 4330, + 4330, 4330, 4330, 4330, 4331, 4331, 0, 4331, 4331, 4331, + 4331, 4331, 4331, 4331, 4331, 4331, 4331, 4331, 4331, 4331, + 4331, 4331, 4331, 4331, 4331, 4331, 4331, 4331, 4331, 4331, + 4331, 4331, 4332, 4332, 0, 4332, 4332, 4332, 4332, 4332, + 4332, 4332, 4332, 4332, 4332, 4332, 4332, 4332, 4332, 4332, + 4332, 4332, 4332, 4332, 4332, 4332, 4332, 4332, 4332, 4332, + + 4333, 4333, 0, 4333, 4333, 4333, 4333, 4333, 4333, 4333, + 4333, 4333, 4333, 4333, 4333, 4333, 4333, 4333, 4333, 4333, + 4333, 4333, 4333, 4333, 4333, 4333, 4333, 4333, 4334, 4334, + 0, 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, + 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, 4334, + 4334, 4334, 4334, 4334, 4334, 4334, 4335, 4335, 0, 4335, + 4335, 4335, 4335, 4335, 4335, 4335, 4335, 4335, 4335, 4335, + 4335, 4335, 4335, 4335, 4335, 4335, 4335, 4335, 4335, 4335, + 4335, 4335, 4335, 4335, 4336, 4336, 0, 4336, 4336, 4336, + 4336, 4336, 4336, 4336, 4336, 4336, 4336, 4336, 4336, 4336, + + 4336, 4336, 4336, 4336, 4336, 4336, 4336, 4336, 4336, 4336, + 4336, 4336, 4337, 4337, 0, 4337, 4337, 4337, 4337, 4337, + 4337, 4337, 4337, 4337, 4337, 4337, 4337, 4337, 4337, 4337, + 4337, 4337, 4337, 4337, 4337, 4337, 4337, 4337, 4337, 4337, + 4338, 4338, 0, 4338, 4338, 4338, 4338, 4338, 4338, 4338, + 4338, 4338, 4338, 4338, 4338, 4338, 4338, 4338, 4338, 4338, + 4338, 4338, 4338, 4338, 4338, 4338, 4338, 4338, 4339, 4339, + 0, 4339, 4339, 4339, 4339, 4339, 4339, 4339, 4339, 4339, + 4339, 4339, 4339, 4339, 4339, 4339, 4339, 4339, 4339, 4339, + 4339, 4339, 4339, 4339, 4339, 4339, 4340, 4340, 0, 4340, + + 4340, 4340, 4340, 4340, 4340, 4340, 4340, 4340, 4340, 4340, + 4340, 4340, 4340, 4340, 4340, 4340, 4340, 4340, 4340, 4340, + 4340, 4340, 4340, 4340, 4341, 4341, 0, 4341, 4341, 4341, + 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341, + 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341, 4341, + 4341, 4341, 4342, 4342, 0, 4342, 4342, 4342, 4342, 4342, + 4342, 4342, 4342, 4342, 4342, 4342, 4342, 4342, 4342, 4342, + 4342, 4342, 4342, 4342, 4342, 4342, 4342, 4342, 4342, 4342, + 4343, 4343, 0, 4343, 4343, 4343, 4343, 4343, 4343, 4343, + 4343, 4343, 4343, 4343, 4343, 4343, 4343, 4343, 4343, 4343, + + 4343, 4343, 4343, 4343, 4343, 4343, 4343, 4343, 4344, 4344, + 0, 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4344, + 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4344, 4344, + 4344, 4344, 4344, 4344, 4344, 4344, 4345, 4345, 0, 4345, + 4345, 4345, 4345, 4345, 4345, 4345, 4345, 4345, 4345, 4345, + 4345, 4345, 4345, 4345, 4345, 4345, 4345, 4345, 4345, 4345, + 4345, 4345, 4345, 4345, 4346, 4346, 0, 4346, 4346, 4346, + 4346, 4346, 4346, 4346, 4346, 4346, 4346, 4346, 4346, 4346, + 4346, 4346, 4346, 4346, 4346, 4346, 4346, 4346, 4346, 4346, + 4346, 4346, 4347, 4347, 0, 4347, 4347, 4347, 4347, 4347, + + 4347, 4347, 4347, 4347, 4347, 4347, 4347, 4347, 4347, 4347, + 4347, 4347, 4347, 4347, 4347, 4347, 4347, 4347, 4347, 4347, + 4348, 4348, 0, 4348, 4348, 4348, 4348, 4348, 4348, 4348, + 4348, 4348, 4348, 4348, 4348, 4348, 4348, 4348, 4348, 4348, + 4348, 4348, 4348, 4348, 4348, 4348, 4348, 4348, 4349, 0, + 0, 4349, 0, 0, 4349, 0, 4349, 4349, 4349, 4349, + 4349, 0, 0, 0, 4349, 0, 4349, 0, 0, 0, + 4349, 4350, 0, 4350, 4350, 4350, 4350, 4350, 0, 0, + 0, 4350, 0, 4350, 4351, 4351, 0, 4351, 4351, 4351, + 4351, 4351, 4351, 4351, 4351, 4351, 4351, 4351, 4351, 4351, + + 4351, 4351, 4351, 4351, 4351, 4351, 4351, 4351, 4351, 4351, + 4351, 4351, 4352, 4352, 0, 4352, 4352, 4352, 4352, 4352, + 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, + 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, 4352, + 4353, 4353, 0, 4353, 4353, 4353, 4353, 4353, 4353, 4353, + 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, + 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4353, 4354, 0, + 0, 4354, 0, 0, 4354, 0, 4354, 4354, 4354, 4354, + 4354, 0, 0, 0, 4354, 0, 4354, 0, 0, 0, + 4354, 4355, 4355, 0, 4355, 4355, 4355, 4355, 4355, 4355, + + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, + 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4355, 4356, + 4356, 0, 4356, 4356, 4356, 4356, 4356, 4356, 4356, 4356, + 4356, 4356, 4356, 4356, 0, 4356, 4356, 0, 4356, 4356, + 4356, 4356, 0, 4356, 4356, 4356, 4356, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, + 0, 4357, 4357, 4357, 4357, 4358, 4358, 4358, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4358, 4358, 4358, 0, 0, 4358, 4359, 4359, 0, 4359, + + 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4359, + 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4359, 4359, + 4359, 4359, 4359, 4359, 4360, 0, 0, 4360, 4360, 4360, + 4360, 4360, 4360, 4360, 0, 4360, 4360, 4360, 4360, 0, + 4360, 4360, 4360, 4360, 4360, 4360, 4360, 0, 4360, 4360, + 4360, 4360, 4361, 0, 0, 4361, 4361, 4361, 4361, 4361, + 4361, 4361, 4361, 4361, 4361, 4361, 4361, 0, 4361, 4361, + 4361, 4361, 4361, 4361, 4361, 0, 4361, 4361, 4361, 4361, + 4362, 0, 0, 4362, 0, 0, 0, 0, 0, 0, + 0, 4362, 4362, 0, 0, 0, 4362, 0, 0, 0, + + 0, 0, 4362, 4363, 4363, 0, 4363, 4363, 4363, 4363, + 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, + 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, 4363, + 4363, 4364, 4364, 0, 4364, 4364, 4364, 4364, 4364, 4364, + 4364, 4364, 4364, 4364, 4364, 4364, 4364, 4364, 4364, 4364, + 4364, 4364, 4364, 4364, 4364, 4364, 4364, 4364, 4364, 4365, + 4365, 0, 4365, 4365, 4365, 4365, 4365, 4365, 4365, 4365, + 4365, 4365, 4365, 4365, 4365, 4365, 4365, 4365, 4365, 4365, + 4365, 4365, 4365, 4365, 4365, 4365, 4365, 4366, 4366, 0, + 4366, 4366, 4366, 4366, 4366, 4366, 4366, 4366, 4366, 4366, + + 4366, 4366, 4366, 4366, 4366, 4366, 4366, 4366, 4366, 4366, + 4366, 4366, 4366, 4366, 4366, 4367, 4367, 0, 4367, 4367, + 4367, 4367, 4367, 4367, 4367, 4367, 4367, 4367, 4367, 4367, + 4367, 4367, 4367, 4367, 4367, 4367, 4367, 4367, 4367, 4367, + 4367, 4367, 4367, 4368, 4368, 0, 4368, 4368, 4368, 4368, + 4368, 4368, 4368, 4368, 4368, 4368, 4368, 4368, 4368, 4368, + 4368, 4368, 4368, 4368, 4368, 4368, 4368, 4368, 4368, 4368, + 4368, 4369, 4369, 0, 4369, 4369, 4369, 4369, 4369, 4369, + 4369, 4369, 4369, 4369, 4369, 4369, 4369, 4369, 4369, 4369, + 4369, 4369, 4369, 4369, 4369, 4369, 4369, 4369, 4369, 4370, + + 4370, 0, 4370, 4370, 4370, 4370, 4370, 4370, 4370, 4370, + 4370, 4370, 4370, 4370, 4370, 4370, 4370, 4370, 4370, 4370, + 4370, 4370, 4370, 4370, 4370, 4370, 4370, 4371, 4371, 0, + 4371, 4371, 4371, 4371, 4371, 4371, 4371, 4371, 4371, 4371, + 4371, 4371, 4371, 4371, 4371, 4371, 4371, 4371, 4371, 4371, + 4371, 4371, 4371, 4371, 4371, 4372, 4372, 0, 4372, 4372, + 4372, 4372, 4372, 4372, 4372, 4372, 4372, 4372, 4372, 4372, + 4372, 4372, 4372, 4372, 4372, 4372, 4372, 4372, 4372, 4372, + 4372, 4372, 4372, 4373, 4373, 0, 4373, 4373, 4373, 4373, + 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, + + 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, 4373, + 4373, 4374, 4374, 0, 4374, 4374, 4374, 4374, 4374, 4374, + 4374, 4374, 4374, 4374, 4374, 4374, 4374, 4374, 4374, 4374, + 4374, 4374, 4374, 4374, 4374, 4374, 4374, 4374, 4374, 4375, + 4375, 0, 4375, 4375, 4375, 4375, 4375, 4375, 4375, 4375, + 4375, 4375, 4375, 4375, 4375, 4375, 4375, 4375, 4375, 4375, + 4375, 4375, 4375, 4375, 4375, 4375, 4375, 4376, 4376, 0, + 4376, 4376, 4376, 4376, 4376, 4376, 4376, 4376, 4376, 4376, + 4376, 4376, 4376, 4376, 4376, 4376, 4376, 4376, 4376, 4376, + 4376, 4376, 4376, 4376, 4376, 4377, 4377, 0, 4377, 4377, + + 4377, 4377, 4377, 4377, 4377, 4377, 4377, 4377, 4377, 4377, + 4377, 4377, 4377, 4377, 4377, 4377, 4377, 4377, 4377, 4377, + 4377, 4377, 4377, 4378, 4378, 0, 4378, 4378, 4378, 4378, + 4378, 4378, 4378, 4378, 4378, 4378, 4378, 4378, 4378, 4378, + 4378, 4378, 4378, 4378, 4378, 4378, 4378, 4378, 4378, 4378, + 4378, 4379, 4379, 0, 4379, 4379, 4379, 4379, 4379, 4379, + 4379, 4379, 4379, 4379, 4379, 4379, 4379, 4379, 4379, 4379, + 4379, 4379, 4379, 4379, 4379, 4379, 4379, 4379, 4379, 4380, + 0, 0, 4380, 0, 0, 4380, 0, 4380, 4380, 4380, + 4380, 4380, 0, 0, 0, 4380, 0, 4380, 0, 0, + + 0, 4380, 4381, 0, 4381, 4381, 4381, 4381, 4381, 0, + 0, 0, 4381, 0, 4381, 4382, 4382, 0, 4382, 4382, + 4382, 4382, 4382, 4382, 4382, 4382, 4382, 4382, 4382, 4382, + 4382, 4382, 4382, 4382, 4382, 4382, 4382, 4382, 4382, 4382, + 4382, 4382, 4382, 4383, 0, 0, 4383, 0, 0, 4383, + 0, 4383, 4383, 4383, 4383, 4383, 0, 0, 0, 4383, + 0, 4383, 0, 0, 0, 4383, 4384, 4384, 0, 4384, + 4384, 4384, 4384, 4384, 4384, 4384, 4384, 4384, 4384, 4384, + 4384, 4384, 4384, 4384, 4384, 4384, 4384, 4384, 4384, 4384, + 4384, 4384, 4384, 4384, 4385, 4385, 0, 4385, 4385, 4385, + + 4385, 4385, 4385, 4385, 4385, 4385, 4385, 4385, 4385, 0, + 4385, 4385, 0, 4385, 4385, 4385, 4385, 0, 4385, 4385, + 4385, 4385, 4386, 4386, 4386, 4386, 4386, 4386, 4386, 4386, + 4386, 4386, 4386, 4386, 4386, 4386, 4386, 4386, 4386, 4386, + 4386, 4386, 4386, 4386, 4386, 0, 4386, 4386, 4386, 4386, + 4388, 4388, 4388, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4388, 4388, 4388, 0, 0, + 4388, 4389, 0, 0, 4389, 4389, 4389, 4389, 4389, 4389, + 4389, 0, 4389, 4389, 4389, 4389, 0, 4389, 4389, 4389, + 4389, 4389, 4389, 4389, 0, 4389, 4389, 4389, 4389, 4390, + + 4390, 4390, 4390, 4390, 4390, 4390, 4390, 4390, 4390, 4390, + 4390, 4390, 4390, 4390, 4390, 4390, 4390, 4390, 4390, 4390, + 4390, 4390, 4390, 4390, 4390, 4390, 4390, 4391, 0, 0, + 4391, 4391, 4391, 4391, 4391, 4391, 4391, 4391, 4391, 4391, + 4391, 4391, 0, 4391, 4391, 4391, 4391, 4391, 4391, 4391, + 0, 4391, 4391, 4391, 4391, 4392, 0, 0, 4392, 0, + 0, 0, 0, 0, 0, 0, 4392, 4392, 0, 0, + 0, 4392, 0, 0, 0, 0, 0, 4392, 4393, 4393, + 0, 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4393, + 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4393, 4393, + + 4393, 4393, 4393, 4393, 4393, 4393, 4394, 4394, 0, 4394, + 4394, 4394, 4394, 4394, 4394, 4394, 4394, 4394, 4394, 4394, + 4394, 4394, 4394, 4394, 4394, 4394, 4394, 4394, 4394, 4394, + 4394, 4394, 4394, 4394, 4395, 4395, 0, 4395, 4395, 4395, + 4395, 4395, 4395, 4395, 4395, 4395, 4395, 4395, 4395, 4395, + 4395, 4395, 4395, 4395, 4395, 4395, 4395, 4395, 4395, 4395, + 4395, 4395, 4396, 4396, 0, 4396, 4396, 4396, 4396, 4396, + 4396, 4396, 4396, 4396, 4396, 4396, 4396, 4396, 4396, 4396, + 4396, 4396, 4396, 4396, 4396, 4396, 4396, 4396, 4396, 4396, + 4397, 4397, 0, 4397, 4397, 4397, 4397, 4397, 4397, 4397, + + 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, + 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4397, 4398, 4398, + 0, 4398, 4398, 4398, 4398, 4398, 4398, 4398, 4398, 4398, + 4398, 4398, 4398, 4398, 4398, 4398, 4398, 4398, 4398, 4398, + 4398, 4398, 4398, 4398, 4398, 4398, 4399, 4399, 0, 4399, + 4399, 4399, 4399, 4399, 4399, 4399, 4399, 4399, 4399, 4399, + 4399, 4399, 4399, 4399, 4399, 4399, 4399, 4399, 4399, 4399, + 4399, 4399, 4399, 4399, 4400, 4400, 0, 4400, 4400, 4400, + 4400, 4400, 4400, 4400, 4400, 4400, 4400, 4400, 4400, 4400, + 4400, 4400, 4400, 4400, 4400, 4400, 4400, 4400, 4400, 4400, + + 4400, 4400, 4401, 4401, 0, 4401, 4401, 4401, 4401, 4401, + 4401, 4401, 4401, 4401, 4401, 4401, 4401, 4401, 4401, 4401, + 4401, 4401, 4401, 4401, 4401, 4401, 4401, 4401, 4401, 4401, + 4402, 4402, 0, 4402, 4402, 4402, 4402, 4402, 4402, 4402, + 4402, 4402, 4402, 4402, 4402, 4402, 4402, 4402, 4402, 4402, + 4402, 4402, 4402, 4402, 4402, 4402, 4402, 4402, 4403, 4403, + 0, 4403, 4403, 4403, 4403, 4403, 4403, 4403, 4403, 4403, + 4403, 4403, 4403, 4403, 4403, 4403, 4403, 4403, 4403, 4403, + 4403, 4403, 4403, 4403, 4403, 4403, 4404, 4404, 4404, 4404, + 4404, 4404, 4404, 4404, 4404, 4404, 4404, 4404, 4404, 4404, + + 4404, 4404, 0, 4404, 4404, 4404, 4404, 0, 4404, 4404, + 4404, 4404, 4404, 4404, 4405, 4405, 4405, 4405, 4405, 4405, + 4405, 4405, 4405, 4405, 4405, 4405, 4405, 4405, 4405, 4405, + 0, 4405, 4405, 4405, 4405, 0, 4405, 4405, 4405, 4405, + 4405, 4405, 4406, 0, 0, 4406, 0, 0, 4406, 0, + 4406, 4406, 4406, 4406, 4406, 0, 0, 0, 4406, 0, + 4406, 0, 0, 0, 4406, 4407, 0, 4407, 4407, 4407, + 4407, 4407, 0, 0, 0, 4407, 0, 4407, 4409, 4409, + 4409, 4409, 4409, 4409, 4409, 4409, 4409, 4409, 4409, 4409, + 4409, 4409, 4409, 4409, 4409, 4409, 4409, 4409, 4409, 4409, + + 4409, 4409, 4409, 4409, 4409, 4409, 4410, 4410, 4410, 4410, + 4410, 4410, 4410, 4410, 4410, 4410, 4410, 4410, 4410, 4410, + 4410, 4410, 0, 4410, 4410, 4410, 4410, 0, 4410, 4410, + 4410, 4410, 4410, 4410, 4411, 4411, 4411, 4411, 4411, 4411, + 4411, 4411, 4411, 4411, 4411, 4411, 4411, 4411, 4411, 4411, + 4411, 4411, 4411, 4411, 4411, 4411, 4411, 0, 4411, 4411, + 4411, 4411, 4415, 4415, 4415, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4415, 4415, 4415, + 0, 0, 4415, 4416, 4416, 4416, 4416, 4416, 4416, 4416, + 4416, 4416, 4416, 4416, 4416, 4416, 4416, 4416, 4416, 0, + + 4416, 4416, 4416, 4416, 0, 4416, 4416, 4416, 4416, 4416, + 4416, 4417, 4417, 4417, 4417, 4417, 4417, 4417, 4417, 4417, + 4417, 4417, 4417, 4417, 4417, 4417, 4417, 4417, 4417, 4417, + 4417, 4417, 4417, 4417, 4417, 4417, 4417, 4417, 4417, 4418, + 0, 0, 4418, 4418, 4418, 4418, 4418, 4418, 4418, 4418, + 4418, 4418, 4418, 4418, 0, 4418, 4418, 4418, 4418, 4418, + 4418, 4418, 0, 4418, 4418, 4418, 4418, 4419, 0, 0, + 4419, 0, 0, 0, 0, 0, 0, 0, 4419, 4419, + 0, 0, 0, 4419, 0, 0, 0, 0, 0, 4419, + 4420, 4420, 0, 4420, 4420, 4420, 4420, 4420, 4420, 4420, + + 4420, 4420, 4420, 4420, 4420, 4420, 4420, 4420, 4420, 4420, + 4420, 4420, 4420, 4420, 4420, 4420, 4420, 4420, 4421, 4421, + 0, 4421, 4421, 4421, 4421, 4421, 4421, 4421, 4421, 4421, + 4421, 4421, 4421, 4421, 4421, 4421, 4421, 4421, 4421, 4421, + 4421, 4421, 4421, 4421, 4421, 4421, 4422, 4422, 0, 4422, + 4422, 4422, 4422, 4422, 4422, 4422, 4422, 4422, 4422, 4422, + 4422, 4422, 4422, 4422, 4422, 4422, 4422, 4422, 4422, 4422, + 4422, 4422, 4422, 4422, 4423, 4423, 0, 4423, 4423, 4423, + 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, + 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, 4423, + + 4423, 4423, 4424, 4424, 0, 4424, 4424, 4424, 4424, 4424, + 4424, 4424, 4424, 4424, 4424, 4424, 4424, 4424, 4424, 4424, + 4424, 4424, 4424, 4424, 4424, 4424, 4424, 4424, 4424, 4424, + 4425, 4425, 0, 4425, 4425, 4425, 4425, 4425, 4425, 4425, + 4425, 4425, 4425, 4425, 4425, 4425, 4425, 4425, 4425, 4425, + 4425, 4425, 4425, 4425, 4425, 4425, 4425, 4425, 4426, 4426, + 4426, 4426, 4426, 4426, 4426, 4426, 4426, 4426, 4426, 4426, + 4426, 4426, 4426, 4426, 0, 4426, 4426, 4426, 4426, 0, + 4426, 4426, 4426, 4426, 4426, 4426, 4427, 4427, 4427, 4427, + 4427, 4427, 4427, 4427, 4427, 4427, 4427, 4427, 4427, 4427, + + 4427, 4427, 0, 4427, 4427, 4427, 4427, 0, 4427, 4427, + 4427, 4427, 4427, 4427, 4428, 0, 0, 4428, 0, 0, + 4428, 0, 4428, 4428, 4428, 4428, 4428, 0, 0, 0, + 4428, 0, 4428, 0, 0, 0, 4428, 4430, 0, 4430, + 4430, 4430, 4430, 4430, 0, 0, 0, 4430, 0, 4430, + 4432, 4432, 0, 0, 4432, 4432, 4432, 4432, 4432, 4432, + 4432, 4432, 0, 4432, 0, 4432, 4432, 4432, 4432, 4432, + 4432, 4432, 4432, 4432, 4432, 4432, 4432, 4432, 4433, 0, + 0, 0, 0, 4433, 0, 0, 4433, 4433, 0, 4433, + 0, 0, 0, 0, 4433, 4433, 4433, 0, 4433, 4434, + + 4434, 0, 0, 4434, 4434, 4434, 4434, 4434, 4434, 4434, + 4434, 0, 4434, 4434, 4434, 4434, 4434, 4434, 4434, 4434, + 4434, 4434, 4434, 4434, 4434, 4434, 4434, 4435, 4435, 0, + 4435, 4435, 4435, 4435, 4435, 4435, 4435, 4435, 4435, 4435, + 4435, 4435, 0, 4435, 4435, 0, 4435, 4435, 4435, 4435, + 0, 4435, 4435, 4435, 4435, 4436, 4436, 4436, 4436, 4436, + 4436, 4436, 4436, 4436, 4436, 4436, 4436, 4436, 4436, 4436, + 4436, 4436, 4436, 4436, 4436, 4436, 4436, 4436, 0, 4436, + 4436, 4436, 4436, 4440, 4440, 4440, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4440, 4440, + + 4440, 0, 0, 4440, 4441, 4441, 4441, 4441, 4441, 4441, + 4441, 4441, 4441, 4441, 4441, 4441, 4441, 4441, 4441, 4441, + 0, 4441, 4441, 4441, 4441, 0, 4441, 4441, 4441, 4441, + 4441, 4441, 4442, 4442, 4442, 4442, 4442, 4442, 4442, 4442, + 4442, 4442, 4442, 4442, 4442, 4442, 4442, 4442, 0, 4442, + 4442, 4442, 4442, 0, 4442, 4442, 4442, 4442, 4442, 4442, + 4443, 4443, 0, 4443, 4443, 4443, 4443, 4443, 4443, 4443, + 4443, 4443, 4443, 4443, 4443, 4443, 4443, 4443, 4443, 4443, + 4443, 4443, 4443, 4443, 4443, 4443, 4443, 4443, 4444, 0, + 0, 4444, 4444, 4444, 4444, 4444, 4444, 4444, 4444, 4444, + + 4444, 4444, 4444, 0, 4444, 4444, 4444, 4444, 4444, 4444, + 4444, 0, 4444, 4444, 4444, 4444, 4445, 0, 0, 4445, + 0, 0, 0, 0, 0, 0, 0, 4445, 4445, 0, + 0, 0, 4445, 0, 0, 0, 0, 0, 4445, 4446, + 4446, 0, 4446, 4446, 4446, 4446, 4446, 4446, 4446, 4446, + 4446, 4446, 4446, 4446, 4446, 4446, 4446, 4446, 4446, 4446, + 4446, 4446, 4446, 4446, 4446, 4446, 4446, 4447, 4447, 0, + 4447, 4447, 4447, 4447, 4447, 4447, 4447, 4447, 4447, 4447, + 4447, 4447, 4447, 4447, 4447, 4447, 4447, 4447, 4447, 4447, + 4447, 4447, 4447, 4447, 4447, 4448, 4448, 0, 4448, 4448, + + 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, + 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, 4448, + 4448, 4448, 4448, 4449, 4449, 4449, 4449, 4449, 4449, 4449, + 4449, 4449, 4449, 4449, 4449, 4449, 4449, 4449, 4449, 0, + 4449, 4449, 4449, 4449, 0, 4449, 4449, 4449, 4449, 4449, + 4449, 4450, 0, 0, 4450, 0, 0, 4450, 0, 4450, + 4450, 4450, 4450, 4450, 0, 0, 0, 4450, 0, 4450, + 0, 0, 0, 4450, 4452, 0, 4452, 4452, 4452, 4452, + 4452, 0, 0, 0, 4452, 0, 4452, 4453, 0, 4453, + 4453, 4453, 4453, 4453, 0, 0, 0, 4453, 0, 4453, + + 4455, 0, 0, 0, 0, 4455, 0, 0, 4455, 4455, + 0, 4455, 0, 0, 0, 0, 0, 4455, 4455, 0, + 4455, 4456, 0, 0, 0, 0, 4456, 0, 0, 4456, + 4456, 0, 4456, 0, 0, 0, 0, 4456, 4456, 4456, + 0, 4456, 4457, 4457, 4457, 4457, 4457, 4457, 4457, 4457, + 4457, 4457, 4457, 4457, 4457, 4457, 4457, 4457, 4457, 4457, + 4457, 4457, 4457, 4457, 4457, 0, 4457, 4457, 4457, 4457, + 4458, 4458, 0, 4458, 4458, 4458, 4458, 4458, 4458, 4458, + 4458, 4458, 4458, 4458, 4458, 4458, 4458, 4458, 4458, 4458, + 4458, 4458, 4458, 4458, 4458, 4458, 4458, 4458, 4459, 4459, + + 0, 0, 4459, 4459, 4459, 4459, 4459, 4459, 4459, 4459, + 0, 4459, 0, 4459, 4459, 4459, 4459, 4459, 4459, 4459, + 4459, 4459, 4459, 4459, 4459, 4459, 4460, 0, 0, 0, + 0, 4460, 0, 0, 4460, 4460, 0, 4460, 0, 0, + 0, 0, 0, 4460, 4460, 0, 4460, 4461, 4461, 4461, + 4461, 4461, 4461, 4461, 4461, 4461, 4461, 4461, 4461, 4461, + 4461, 4461, 4461, 0, 4461, 4461, 4461, 4461, 0, 4461, + 4461, 4461, 4461, 4461, 4461, 4462, 4462, 4462, 4462, 4462, + 4462, 4462, 4462, 4462, 4462, 4462, 4462, 4462, 4462, 4462, + 4462, 0, 4462, 4462, 4462, 4462, 0, 4462, 4462, 4462, + + 4462, 4462, 4462, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 0, + 4463, 4463, 4463, 4463, 0, 4463, 4463, 4463, 4463, 4463, + 4463, 4464, 4464, 4464, 4464, 4464, 4464, 4464, 4464, 4464, + 4464, 4464, 4464, 4464, 4464, 4464, 4464, 0, 4464, 4464, + 4464, 4464, 0, 4464, 4464, 4464, 4464, 4464, 4464, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, 3756, + 3756, 3756, 3756, 3756, 3756 + } ; + +static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr; +static char *yy_full_match; +static int yy_lp; +static int yy_looking_for_trail_begin = 0; +static int yy_full_lp; +static int *yy_full_state; +#define YY_TRAILING_MASK 0x2000 +#define YY_TRAILING_HEAD_MASK 0x4000 +#define REJECT \ +{ \ +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \ +yy_cp = yy_full_match; /* restore poss. backed-over text */ \ +yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \ +yy_state_ptr = yy_full_state; /* restore orig. state */ \ +yy_current_state = *yy_state_ptr; /* restore curr. state */ \ +++yy_lp; \ +goto find_rule; \ +} +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "scanner.l" +#define INITIAL 0 +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +#line 18 "scanner.l" + +/* + * includes + */ +#include +#include +#include +#include +#include + +#include "qtbc.h" +#include +#include +#include + +#include "scanner.h" +#include "entry.h" +#include "doxygen.h" +#include "message.h" +#include "config.h" +#include "util.h" +#include "index.h" +#include "defargs.h" +#include "language.h" +#include "outputlist.h" + +#ifndef WIN32 +#include +#endif + +#define YY_NEVER_INTERACTIVE 1 + + +MemberGroupDict memberGroupDict(1009); // dictionary of the member groups heading + +/* ----------------------------------------------------------------- + * + * statics + */ +static bool insideArgumentList; +static QCString className; +static QCString memberName; +static QCString refName; +static OutputList * outDoc; +static QCString code; +static QCString linkRef; +static QCString linkText; +static QCString codeBlock; +static const char * inputString; +static int inputPosition; +static int lastContext; +static int lastCContext; +static int lastDocContext; +static int lastDocRelContext; +static int lastCPPContext; +static int lastSkipSharpContext; +static int lastSkipRoundContext; +static int lastBriefContext; +static int lastVerbState; +static int lastStringContext; +static int lastCurlyContext; +static int lastCodeState; +static int lastAfterDocContext; +static int lastGroupContext; +static int lastMemberGroupContext; +static int lastFormulaContext; +static int lastAnchorContext; +static int nextDefContext; +static int overloadContext; +static Protection protection; +static Protection baseProt; +static int bracketCount = 0 ; +static int sharpCount = 0 ; +static int roundCount = 0 ; +static int ifCount = 0 ; +static Entry* current_root = 0 ; +static Entry* global_root = 0 ; +static Entry* current = 0 ; +static Entry* previous = 0 ; +static Entry* tempEntry = 0 ; +static int yyLineNr = 0 ; +static int anonCount = 0 ; +static char yyFileName[2048] ; +static int lastMemberGroupLine; +static bool sig; +static bool slot; +static bool gstat; +static bool removeSlashes; +static Specifier virt; +static Specifier baseVirt; +static bool exampleDoc; +static QCString exampleName; +static QCString htmlUrl,htmlText; +static QCString currentIncludeFile; +static QCString msType,msName,msArgs; +static int memberGroupId = -1; +static int includeFileOffset = 0; +static int includeFileLength = 0; +static bool firstLine; +static bool isTypedef; +static bool inParamBlock; +static bool inRetValBlock; +static bool inExceptionBlock; +static bool inSeeBlock; +static bool inReturnBlock; +static bool inAuthorBlock; +static bool inVersionBlock; +static bool inDateBlock; +static bool inBugBlock; +static bool inWarningBlock; +static bool inParBlock; +static bool firstSeeArg; +static bool javaDocSee; +static char afterDocTerminator; +static int tmpDocType; +static QCString sectionLabel; +static QCString sectionTitle; +static SectionInfo::SectionType + sectionType; +static QCString funcPtrType; +static QCString templateStr; +static QCString baseName; +static QCString *specName; +static QCString formulaText; +static QCString sectionRef; + +// state variable for reading the argument list of a function +static int argRoundCount; +static int argSharpCount; +static int currentArgumentContext; +static int lastCopyArgStringContext; +static int lastCopyArgContext; +static QCString *copyArgString; + +static ArgumentList *currentArgumentList; +static QCString *currentTemplateSpec; +static QCString curImageName; + +//----------------------------------------------------------------------------- + +static void initParser() +{ + insideArgumentList=FALSE; + className.resize(0); + memberName.resize(0); + refName.resize(0); + code.resize(0); + linkRef.resize(0); + linkText.resize(0); + codeBlock.resize(0); + htmlUrl.resize(0); + htmlText.resize(0); + currentIncludeFile.resize(0); + sectionLabel.resize(0); + sectionTitle.resize(0); + baseName.resize(0); + formulaText.resize(0); + protection = Public; + baseProt = Public; + bracketCount = 0; + sharpCount = 0; + roundCount = 0; + ifCount = 0; + memberGroupId = -1; + sig = FALSE; + slot = FALSE; + gstat = FALSE; + virt = Normal; + baseVirt = Normal; + includeFileOffset = 0; + includeFileLength = 0; + firstLine = TRUE; + isTypedef = FALSE; + inParamBlock = FALSE; + inRetValBlock = FALSE; + inExceptionBlock = FALSE; + inSeeBlock = FALSE; + inReturnBlock = FALSE; + inAuthorBlock = FALSE; + inVersionBlock = FALSE; + inDateBlock = FALSE; + inBugBlock = FALSE; + inWarningBlock = FALSE; + inParBlock = FALSE; + firstSeeArg = FALSE; + javaDocSee = FALSE; +} + +//----------------------------------------------------------------------------- + +void scanString(const char *s); + +//----------------------------------------------------------------------------- + +class TableElem +{ + public: + TableElem(int r,int c); + ~TableElem(); + int getRow() { return row; } + int getCol() { return col; } + OutputList *outputList() { return ol; } + + private: + OutputList *ol; + int row; + int col; +}; + +TableElem::TableElem(int r,int c) +{ + //printf("TableElem::TableElem(%d,%d)\n",r,c); + ol=new OutputList(outDoc); + outDoc=ol; + row=r; + col=c; +} + +TableElem::~TableElem() +{ + //printf("TableElem::~TableElem(%d,%d)\n",row,col); + delete ol; +} + +class Table +{ + public: + Table(); + ~Table(); + void newRow(); + void newElem(); + + private: + OutputList *parentDoc; + QList *elemList; + int curRow; + int curCol; + int rows; + int cols; +}; + +Table::Table() +{ + parentDoc=outDoc; + elemList=new QList; + elemList->setAutoDelete(TRUE); + curRow=curCol=rows=cols=0; +} + +Table::~Table() +{ + //printf("Table::~Table()\n"); + // use elemList & cols & rows + if (cols>0 && rows>0) + { + parentDoc->startTable(cols); + TableElem *e=elemList->first(); + while (e) + { + if (e->getRow()>0) + { + if (e->getCol()==0) + { + if (e->getRow()>1) parentDoc->endTableRow(); + parentDoc->nextTableRow(); + } + else + { + parentDoc->nextTableColumn(); + } + *parentDoc+=*e->outputList(); + parentDoc->endTableColumn(); + } + e=elemList->next(); + } + parentDoc->endTable(); + } + delete elemList; + outDoc=parentDoc; +} + +void Table::newRow() +{ + //printf("Table::newRow()\n"); + curRow++; + if (curRow>rows) rows=curRow; + curCol=0; +} + +void Table::newElem() +{ + //printf("Table::newElem(%d,%d)\n",curRow,curCol); + TableElem *te = new TableElem(curRow,curCol); + elemList->append(te); + + curCol++; + if (curCol>cols) cols=curCol; +} + +static QStack tableStack; +static Table *curTable; + +static void startTable() +{ + //printf("startTable()\n"); + curTable=new Table; + tableStack.push(curTable); +} + +static void endTable() +{ + //printf("endTable()\n"); + delete tableStack.pop(); // the destructor adds the table to the stream! + curTable=tableStack.top(); +} + +//----------------------------------------------------------------------------- + +static void lineCount() +{ + for( const char* c = yytext ; *c ; ++c ) + yyLineNr += (*c == '\n') ; +} + +static void endArgumentList() +{ + if (insideArgumentList) + { + insideArgumentList=FALSE; + outDoc->endItemList(); + } +} + +static void addType( Entry* current ) +{ + if( current->type.length() ) + current->type += ' ' ; + current->type += current->name ; + current->name.resize(0) ; + if( current->type.length() ) + current->type += ' ' ; + current->type += current->args ; + current->args.resize(0) ; + current->argList->clear(); +} + +static void includeFile(OutputList &ol,const char *fileName,bool quiet) +{ + //FileInfo *f; + bool ambig; + FileDef *fd; + if ((fd=findFileDef(&exampleNameDict,fileName,ambig))) + { + currentIncludeFile=fileToString(fd->absFilePath()); + includeFileOffset=0; + includeFileLength=currentIncludeFile.length(); + OutputList codeFrag(&ol); + parseCode(codeFrag,0,currentIncludeFile,exampleDoc,exampleName); + if (!quiet) + { + ol.startCodeFragment(); + ol+=codeFrag; + ol.endCodeFragment(); + } + } + else if (ambig) + { + warn("Include file name %s is ambigious.\n",fileName); + warn("Possible candidates:\n"); + //includeFileList.writeMatches(fileName); + showFileDefMatches(&exampleNameDict,fileName); + } + else + { + warn("Warning: example file %s is not found. ",fileName); + warn("Check your EXAMPLE_PATH\n"); + } +} + +static void verbIncludeFile(OutputList &ol,const char *name) +{ + //FileInfo *f; + bool ambig; + FileDef *fd; + if ((fd=findFileDef(&exampleNameDict,name,ambig))) + { + ol.startCodeFragment(); + ol.codify(fileToString(fd->absFilePath())); + ol.endCodeFragment(); + } + else if (ambig) + { + warn("Include file name %s is ambigious.\n",name); + warn("Possible candidates:\n"); + showFileDefMatches(&exampleNameDict,name); + } + else + { + warn("Warning: example file %s is not found. ",name); + warn("Check your EXAMPLE_PATH\n"); + } +} + + +static QCString stripQuotes(const char *s) +{ + QCString name; + if (s==0 || *s==0) return name; + name=s; + if (name.at(0)=='"' && name.at(name.length()-1)=='"') + { + name=name.mid(1,name.length()-2); + } + return name; +} + +static QCString stripKnownExtensions(const char *text) +{ + QCString result=text; + if (result.right(4)==".tex") result=result.left(result.length()-4); + else if (result.right(5)==".html") result=result.left(result.length()-5); + //printf("%s stripKnowExtensions(%s)\n",result.data(),text); + return result; +} + +static void skipLine(OutputList &ol,const char *key) +{ + bool found=FALSE; + while (!found) + { + QCString s; + char c; + while ( includeFileOffset0 || + includeFileOffset==includeFileLength) found=TRUE; + } + if (s.find(key)!=-1) + { + ol.writeString(" "); + parseCode(ol,className,s,exampleDoc,exampleName); + ol.writeString("\n"); + } +} + +static void showUntil(OutputList &ol,const char *key) +{ + bool found=FALSE; + while (!found) + { + QCString s; + char c; + while ( includeFileOffset0) + { + ol.writeString(" "); + parseCode(ol,className,s,exampleDoc,exampleName); + ol.writeString("\n"); + if (s.find(key)!=-1) found=TRUE; + } + if (includeFileOffset==includeFileLength) found=TRUE; + } +} + +static int newMemberGroupId() +{ + static int curGroupId=0; + return curGroupId++; +} + +static void newDocState(); + + +//----------------------------------------------------------------- + +static bool inBlock() +{ + return inParamBlock || inRetValBlock || inSeeBlock || inReturnBlock || inAuthorBlock || + inVersionBlock || inDateBlock || inWarningBlock || inBugBlock || + inParBlock || inExceptionBlock; +} + +static void endBlock() +{ + if (inParamBlock || inRetValBlock) + { + outDoc->endDescTableData(); + outDoc->endDescTable(); + } + outDoc->endDescList(); + inParamBlock=inRetValBlock=inSeeBlock=inReturnBlock=inAuthorBlock= + inVersionBlock=inDateBlock=inBugBlock=inWarningBlock= + inParBlock=inExceptionBlock=FALSE; +} + +static void addSection() +{ + //printf("New section pageName=%s label=%s title=%s\n", + // current->name.data(),sectionLabel.data(),sectionTitle.data()); + if (sectionLabel.isEmpty()) return; + if (sectionDict[sectionLabel]==0) + { + SectionInfo *si=new SectionInfo(sectionLabel,sectionTitle,sectionType); + //printf("Adding section addr=%p label=`%s' sectionTitle=`%s' fileName=%s\n",si,sectionLabel.data(),sectionTitle.data(),si->fileName.data()); + sectionDict.insert(sectionLabel,si); + current->anchors->append(new QCString(sectionLabel)); + } + else + { + warn("Warning: Duplicate label %s found!\n",sectionLabel.data()); + } +} + +// Adds a formula text to the list/dictionary of formulas if it was +// not already added. Returns the label of the formula. +static QCString addFormula() +{ + QCString formLabel; + QCString fText=formulaText.simplifyWhiteSpace(); + Formula *f=0; + if ((f=formulaDict[fText])==0) + { + f = new Formula(fText); + formulaList.append(f); + formulaDict.insert(fText,f); + formLabel.sprintf("\\form#%d",f->getId()); + formulaNameDict.insert(formLabel,f); + } + else + { + formLabel.sprintf("\\form#%d",f->getId()); + } + return formLabel; +} + +static bool nameIsOperator(QCString &name) +{ + return name.right(8)=="operator" && + (name.length()==8 || !isId(name.at(name.length()-9))); +} + +static void checkDocs() +{ + if ((current->brief.length()>2 && + current->brief.at(0)=='<' && current->brief.at(1)==' ') || + (current->doc.length()>2 && + current->doc.at(0)=='<' && current->doc.at(1)==' ') + ) + { + warn("Warning: Found lonely '<' symbol at the start of the documentation " + "at line %d of %s\n",yyLineNr,yyFileName); + + } +} + +static bool curLatexState; +static bool curManState; +static bool curHtmlState; + +static void storeOutputListState() +{ + curLatexState = outDoc->isEnabled(OutputGenerator::Latex); + curHtmlState = outDoc->isEnabled(OutputGenerator::Html); + curManState = outDoc->isEnabled(OutputGenerator::Man); +} + +static void restoreOutputListState() +{ + if (curLatexState) + outDoc->enable(OutputGenerator::Latex); + else + outDoc->disable(OutputGenerator::Latex); + if (curHtmlState) + outDoc->enable(OutputGenerator::Html); + else + outDoc->disable(OutputGenerator::Html); + if (curManState) + outDoc->enable(OutputGenerator::Man); + else + outDoc->disable(OutputGenerator::Man); +} + +enum ImageTypes +{ + IT_Html, + IT_Latex +}; + +// search for an image in the imageNameDict and if found +// copies the image to the output directory (which is the +// html directory if type==0 or the latex directory if type==1) +static QCString findAndCopyImage(const char *fileName,ImageTypes type) +{ + QCString result; + bool ambig; + FileDef *fd; + if ((fd=findFileDef(&imageNameDict,fileName,ambig))) + { + QFile inImage(fd->absFilePath()); + if (inImage.open(IO_ReadOnly)) + { + result = fileName; + int i; + if ((i=result.findRev('/'))!=-1 || (i=result.findRev('\\'))!=-1) + { + result.right(result.length()-i-1); + } + QCString outputDir; + switch(type) + { + case IT_Html: + outputDir = Config::htmlOutputDir; + break; + case IT_Latex: + outputDir = Config::latexOutputDir; + break; + } + QCString outputFile = outputDir+"/"+result; + QFile outImage(outputFile); + if (outImage.open(IO_WriteOnly)) // copy the image + { + char *buffer = new char[inImage.size()]; + inImage.readBlock(buffer,inImage.size()); + outImage.writeBlock(buffer,inImage.size()); + outImage.flush(); + delete buffer; + } + else + { + warn("Warning: could not write output image %s\n",outputFile.data()); + } + } + else + { + warn("Warning: could not open image %s\n",fileName); + } + } + else if (ambig) + { + warn("Warning: image file name %s is ambigious.\n",fileName); + warn("Possible candidates:\n"); + //includeFileList.writeMatches(fileName); + showFileDefMatches(&imageNameDict,fileName); + } + else + { + warn("Warning: image file %s is not found. ",fileName); + warn("Check your IMAGE_PATH\n"); + } + return result; +} + +/* ----------------------------------------------------------------- */ + +//static void addToBody(const char *text); +//static void addToBodyCond(const char *text); +/* ----------------------------------------------------------------- */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + //printf("%d (%c)\n",*buf,*buf); + c++; buf++; + } + return c; +} + +//ATTR ((({BN}+[^\>]+)/">")?) +#define Define 1 + +#define DefineArg 2 + +#define DefineEnd 3 + +#define Include 4 + +#define ClassName 5 + +#define ClassVar 6 + +#define Bases 7 + +#define BasesProt 8 + +#define NextSemi 9 + +#define FindMembers 10 + +#define FindMemberName 11 + +#define FindFields 12 + +#define FindFieldArg 13 + +#define Function 14 + +#define FuncRound 15 + +#define ExcpRound 16 + +#define FuncQual 17 + +#define Operator 18 + +#define Array 19 + +#define Curly 20 + +#define Using 21 + +#define UsingDirective 22 + +#define NameSpaceDocArg1 23 + +#define SkipCurly 24 + +#define SkipCurlyCpp 25 + +#define SkipCurlyEndDoc 26 + +#define SkipString 27 + +#define SkipInits 28 + +#define SkipCPP 29 + +#define SkipCPPBlock 30 + +#define SkipComment 31 + +#define SkipCxxComment 32 + +#define SkipCurlyBlock 33 + +#define SkipRoundBlock 34 + +#define SkipCode 35 + +#define Sharp 36 + +#define SkipSharp 37 + +#define SkipRound 38 + +#define TypedefName 39 + +#define Comment 40 + +#define Doc 41 + +#define JavaDoc 42 + +#define ClassDoc 43 + +#define LineDoc 44 + +#define DefLineDoc 45 + +#define ClassDocArg1 46 + +#define ClassDocArg2 47 + +#define ClassDocArg3 48 + +#define ClassDocFunc 49 + +#define ClassDocFuncPtr 50 + +#define ClassDocFuncQual 51 + +#define ClassDocFuncSkipLine 52 + +#define ClassDocFuncExc 53 + +#define ClassDocDefine 54 + +#define ClassDocRelates 55 + +#define ClassDocBrief 56 + +#define ClassDocOverload 57 + +#define ClassDefineArgs 58 + +#define GroupDocArg1 59 + +#define GroupDocArg2 60 + +#define GroupName 61 + +#define GroupHeader 62 + +#define AfterDoc 63 + +#define AfterDocBrief 64 + +#define AfterDocLine 65 + +#define PageDoc 66 + +#define PageDocTitle 67 + +#define PageDocArg1 68 + +#define PageDocArg2 69 + +#define FileDocArg1 70 + +#define FileDocArg2 71 + +#define ExampleDoc 72 + +#define ExampleDocArg1 73 + +#define EnumDoc 74 + +#define EnumDocArg1 75 + +#define FuncPtr 76 + +#define EndFuncPtr 77 + +#define FuncFunc 78 + +#define FuncFuncEnd 79 + +#define FuncFuncType 80 + +#define MemberSpec 81 + +#define MemberSpecSkip 82 + +#define SkipVerbatim 83 + +#define Text 84 + +#define DocScan 85 + +#define DocParam 86 + +#define DocException 87 + +#define DocHtmlScan 88 + +#define DocLatexScan 89 + +#define DocEmphasis 90 + +#define DocBold 91 + +#define DocCode 92 + +#define DocCodeBlock 93 + +#define DocInternal 94 + +#define DocLink 95 + +#define DocLinkText 96 + +#define DocSkipWord 97 + +#define DocInclude 98 + +#define DocDontInclude 99 + +#define DocDescItem 100 + +#define DocHtmlLink 101 + +#define DocHtmlAnchor 102 + +#define DocHtmlHref1 103 + +#define DocHtmlHref2 104 + +#define DocBaseClass 105 + +#define DocSkiplineKey 106 + +#define DocSkipKey 107 + +#define DocLineKey 108 + +#define DocUntilKey 109 + +#define DocKeyEnd 110 + +#define DocPar 111 + +#define DocRefName 112 + +#define DocVerbatim 113 + +#define DocVerbInc 114 + +#define DocIndexWord 115 + +#define DocRef 116 + +#define DocRefArg 117 + +#define DocRefArgStart 118 + +#define DocRefItem 119 + +#define DocRefItemName 120 + +#define DocImage 121 + +#define DocHtmlImageName 122 + +#define DocLatexImageName 123 + +#define DocLatexImageWidth 124 + +#define SectionLabel 125 + +#define SectionTitle 126 + +#define SkipTemplate 127 + +#define EndTemplate 128 + +#define CopyArgString 129 + +#define CopyArgRound 130 + +#define CopyArgSharp 131 + +#define ReadFuncArgType 132 + +#define ReadTempArgs 133 + +#define Specialization 134 + +#define DocSkipHtmlComment 135 + +#define ReadFormulaShort 136 + +#define ReadFormulaLong 137 + +#define AnchorLabel 138 + + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + yy_current_buffer->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 933 "scanner.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 3757 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 28760 ); + +yy_find_action: + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; +find_rule: /* we branch to this label when backing up */ + for ( ; ; ) /* until we find what rule we matched */ + { + if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ) + { + yy_act = yy_acclist[yy_lp]; + if ( yy_act & YY_TRAILING_HEAD_MASK || + yy_looking_for_trail_begin ) + { + if ( yy_act == yy_looking_for_trail_begin ) + { + yy_looking_for_trail_begin = 0; + yy_act &= ~YY_TRAILING_HEAD_MASK; + break; + } + } + else if ( yy_act & YY_TRAILING_MASK ) + { + yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK; + yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK; + } + else + { + yy_full_match = yy_cp; + yy_full_state = yy_state_ptr; + yy_full_lp = yy_lp; + break; + } + ++yy_lp; + goto find_rule; + } + --yy_cp; + yy_current_state = *--yy_state_ptr; + yy_lp = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +YY_RULE_SETUP +#line 935 "scanner.l" +{ // new file + if (memberGroupId!=-1) + { + warn("Warning: Missing \\endmgroup in file %s\n",yyFileName); + memberGroupId=-1; + } + yyLineNr= 0 ; // there is always an extra newline at the start of the file + int i; + for( i = 0 ; yytext[i+1] != 6 ; i++ ) + yyFileName[i] = yytext[i+1] ; + yyFileName[i] = 0 ; + msg("Parsing file %s...\n",yyFileName); + current_root = global_root ; + initParser(); + current->reset(); + int sec=guessSection(yyFileName); + if (sec) + { + current->name = yyFileName; + current->name = current->name; + current->section = sec; + current_root->addSubEntry(current); + current = new Entry; + } + BEGIN( FindMembers ); + } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 961 "scanner.l" + + YY_BREAK +/* +^{BL} { + if (insideArgumentList) + { + insideArgumentList=FALSE; + outDoc->endItemList(); + } + else + { + outDoc->newParagraph(); + } + if (inBlock()) endBlock(); + } + */ +case 3: +YY_RULE_SETUP +#line 976 "scanner.l" +{ BEGIN(DocSkipHtmlComment); } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 977 "scanner.l" +{ BEGIN(DocScan); } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 978 "scanner.l" + + YY_BREAK +case 6: +YY_RULE_SETUP +#line 979 "scanner.l" +{ outDoc->writeCopyright(); } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 980 "scanner.l" +{ outDoc->writeQuote(); } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 981 "scanner.l" +{ outDoc->writeUmlaut(yytext[1]); } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 982 "scanner.l" +{ outDoc->writeAcute(yytext[1]); } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 983 "scanner.l" +{ outDoc->writeGrave(yytext[1]); } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 984 "scanner.l" +{ outDoc->writeCirc(yytext[1]); } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 985 "scanner.l" +{ outDoc->writeTilde(yytext[1]); } + YY_BREAK +case 13: +YY_RULE_SETUP +#line 986 "scanner.l" +{ + QCString envvar=&yytext[2]; + envvar=envvar.left(envvar.length()-1); + outDoc->docify(getenv(envvar)); + } + YY_BREAK +case 14: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 991 "scanner.l" +{ + outDoc->disableAllBut(OutputGenerator::Html); + BEGIN(DocHtmlScan); + } + YY_BREAK +case 15: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 995 "scanner.l" +{ + outDoc->enableAll(); + BEGIN(DocScan); + } + YY_BREAK +case 16: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 999 "scanner.l" +{ + outDoc->disableAllBut(OutputGenerator::Latex); + BEGIN(DocLatexScan); + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 1003 "scanner.l" +{ + outDoc->writeString(yytext); + } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 1006 "scanner.l" +{ + char c[2]; + c[0]=*yytext;c[1]='\0'; + outDoc->writeString(c); + } + YY_BREAK +case 19: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1011 "scanner.l" +{ + outDoc->enableAll(); + BEGIN(DocScan); + } + YY_BREAK +case 20: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 11; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1015 "scanner.l" + + YY_BREAK +case 21: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 14; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1016 "scanner.l" +{ writeMemberList(*outDoc); } + YY_BREAK +case 22: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 15; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1017 "scanner.l" +{ writeClassHierarchy(*outDoc); } + YY_BREAK +case 23: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 19; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1018 "scanner.l" +{ writeAnnotatedClassList(*outDoc); } + YY_BREAK +case 24: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 15; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1019 "scanner.l" +{ /*TODO: fix this writeHeaderFileList(*outDoc); */ } + YY_BREAK +case 25: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 7; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1020 "scanner.l" +{ BEGIN( DocSkipWord ); } + YY_BREAK +case 26: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 7; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1021 "scanner.l" +{ BEGIN( DocSkipWord ); } + YY_BREAK +case 27: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1022 "scanner.l" +{ BEGIN( DocVerbInc ); } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 1023 "scanner.l" +{ + verbIncludeFile(*outDoc,stripQuotes(yytext)); + BEGIN( DocScan ); + } + YY_BREAK +case 29: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1027 "scanner.l" +{ + outDoc->startCodeFragment(); + BEGIN(DocVerbatim); + } + YY_BREAK +case 30: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1031 "scanner.l" +{ + outDoc->endCodeFragment(); + BEGIN(DocScan); + } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 1035 "scanner.l" +{ + //printf("docifying: %s\n",yytext); + outDoc->codify(yytext); + } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 1039 "scanner.l" +{ + outDoc->codify(yytext); + } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 1042 "scanner.l" +{ + //printf("char %c\n",*yytext); + char c[2];c[0]=*yytext;c[1]='\0'; + outDoc->codify(c); + } + YY_BREAK +case 34: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1047 "scanner.l" +{ + if (!Config::internalDocsFlag) + { + outDoc->newParagraph(); + scanString(theTranslator->trForInternalUseOnly()+"\n"); + //outDoc->writeString("For internal use only.\n"); + BEGIN( DocInternal ); + } + } + YY_BREAK +case 35: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 6; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1056 "scanner.l" +{ + outDoc->newParagraph(); + scanString(theTranslator->trReimplementedForInternalReasons()+"\n"); + } + YY_BREAK +case 36: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1060 "scanner.l" +{ BEGIN( DocLink ); } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 1061 "scanner.l" +{ BEGIN( DocScan ); } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 1062 "scanner.l" +{ + linkRef = stripKnownExtensions(yytext); + linkText = ""; + BEGIN( DocLinkText ); + } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 1067 "scanner.l" +{ linkText += *yytext; } + YY_BREAK +case 40: +YY_RULE_SETUP +#line 1068 "scanner.l" +{ linkText += " "; } + YY_BREAK +case 41: +YY_RULE_SETUP +#line 1069 "scanner.l" +{ // <- needed for things like \endlink. + //printf("GenerateLink className=`%s' linkRef=`%s' linkText=`%s'\n", + // className.data(),linkRef.data(),linkText.data()); + generateLink(*outDoc,className,linkRef,inSeeBlock,linkText); + BEGIN( DocScan ); + } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 1075 "scanner.l" +{ + BEGIN(DocRef); + } + YY_BREAK +case 43: +YY_RULE_SETUP +#line 1078 "scanner.l" +{ + generateLink(*outDoc,className,yytext,TRUE,0); + BEGIN( DocScan ); + } + YY_BREAK +case 44: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1082 "scanner.l" +{ warn("Warning: \\endlink without \\link " + "in documentation of %s\n", refName.data()); + } + YY_BREAK +case 45: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1085 "scanner.l" +{ + BEGIN(DocIndexWord); + } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 1088 "scanner.l" +{ + Formula *formula=formulaNameDict[yytext]; + if (formula) + { + QCString formName; + formName.sprintf("form-%d.gif",formula->getId()); + outDoc->writeFormula(formName,formula->getFormulaText()); + } + } + YY_BREAK +case 47: +YY_RULE_SETUP +#line 1097 "scanner.l" +{ + //printf("Adding %s to index\n",yytext); + outDoc->addToIndex(yytext,0); + BEGIN(DocScan); + } + YY_BREAK +case 48: +YY_RULE_SETUP +#line 1102 "scanner.l" +{ + if (insideArgumentList) + { + outDoc->writeListItem(); + } + else + { + outDoc->startItemList(); + outDoc->writeListItem(); + insideArgumentList=TRUE; + } + } + YY_BREAK +case 49: +YY_RULE_SETUP +#line 1114 "scanner.l" +{ + BEGIN(DocPar); + } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 1117 "scanner.l" +{ + endArgumentList(); + if (inBlock()) endBlock(); + inParBlock=TRUE; + outDoc->startDescList(); + outDoc->startBold(); + outDoc->docify(((QCString)yytext).stripWhiteSpace()); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + BEGIN(DocScan); + } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 1129 "scanner.l" +{ + endArgumentList(); + if (!inWarningBlock) + { + if (inBlock()) endBlock(); + inWarningBlock=TRUE; + outDoc->startDescList(); + //outDoc->writeBoldString("Warning: "); + outDoc->startBold(); + scanString(theTranslator->trWarning()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + } + else + { + outDoc->writeDescItem(); + } + } + YY_BREAK +case 52: +YY_RULE_SETUP +#line 1148 "scanner.l" +{ + endArgumentList(); + if (!inBugBlock) + { + if (inBlock()) endBlock(); + inBugBlock=TRUE; + outDoc->startDescList(); + //outDoc->writeBoldString("Bugs and limitations: "); + outDoc->startBold(); + scanString(theTranslator->trBugsAndLimitations()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + } + else + { + outDoc->writeDescItem(); + } + } + YY_BREAK +case 53: +YY_RULE_SETUP +#line 1167 "scanner.l" +{ + endArgumentList(); + if (!inVersionBlock) + { + if (inBlock()) endBlock(); + inVersionBlock=TRUE; + outDoc->startDescList(); + //outDoc->writeBoldString("Version: "); + outDoc->startBold(); + scanString(theTranslator->trVersion()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + } + else + { + outDoc->writeDescItem(); + } + } + YY_BREAK +case 54: +YY_RULE_SETUP +#line 1186 "scanner.l" +{ + endArgumentList(); + if (!inDateBlock) + { + if (inBlock()) endBlock(); + inDateBlock=TRUE; + outDoc->startDescList(); + //outDoc->writeBoldString("Date: "); + outDoc->startBold(); + scanString(theTranslator->trDate()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + } + else + { + outDoc->writeDescItem(); + } + } + YY_BREAK +case 55: +YY_RULE_SETUP +#line 1205 "scanner.l" +{ + endArgumentList(); + if (!inAuthorBlock) + { + if (inBlock()) endBlock(); + inAuthorBlock=TRUE; + outDoc->startDescList(); + //outDoc->writeBoldString("Author(s): "); + outDoc->startBold(); + scanString(theTranslator->trAuthors()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + } + else + { + outDoc->docify(", "); + } + } + YY_BREAK +case 56: +YY_RULE_SETUP +#line 1224 "scanner.l" +{ + endArgumentList(); + if (!inReturnBlock) + { + if (inBlock()) endBlock(); + inReturnBlock=TRUE; + outDoc->startDescList(); + //outDoc->writeBoldString("Returns: "); + outDoc->startBold(); + scanString(theTranslator->trReturns()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + } + } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 1239 "scanner.l" +{ + endArgumentList(); + if (!inSeeBlock) + { + if (inBlock()) endBlock(); + inSeeBlock=TRUE; + //firstSeeArg=TRUE; + //javaDocSee=!strcmp(yytext,"@see"); + outDoc->startDescList(); + //outDoc->writeBoldString("See also: "); + outDoc->startBold(); + scanString(theTranslator->trSeeAlso()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + } + else + { + outDoc->docify(", "); + } + } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 1260 "scanner.l" +{ + endArgumentList(); + if (!inParamBlock) + { + if (inBlock()) endBlock(); + inParamBlock=TRUE; + outDoc->startDescList(); + outDoc->startBold(); + scanString(theTranslator->trParameters()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + outDoc->startDescTable(); + } + else + { + outDoc->endDescTableData(); + } + BEGIN(DocParam); + } + YY_BREAK +case 59: +YY_RULE_SETUP +#line 1280 "scanner.l" +{ + endArgumentList(); + if (!inRetValBlock) + { + if (inBlock()) endBlock(); + inRetValBlock=TRUE; + outDoc->startDescList(); + outDoc->startBold(); + scanString(theTranslator->trReturnValues()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + outDoc->writeDescItem(); + outDoc->startDescTable(); + } + else + { + outDoc->endDescTableData(); + } + BEGIN(DocParam); + } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 1300 "scanner.l" +{ + endArgumentList(); + if (!inExceptionBlock) + { + if (inBlock()) endBlock(); + inExceptionBlock=TRUE; + outDoc->startDescList(); + //outDoc->writeBoldString("Exceptions: "); + outDoc->startBold(); + scanString(theTranslator->trExceptions()+": "); + outDoc->endBold(); + outDoc->endDescTitle(); + } + BEGIN(DocException); + } + YY_BREAK +case 61: +YY_RULE_SETUP +#line 1315 "scanner.l" + + YY_BREAK +case 62: +YY_RULE_SETUP +#line 1316 "scanner.l" +{ + outDoc->startDescTableTitle(); + outDoc->startEmphasis(); + outDoc->docify(yytext); + outDoc->endEmphasis(); + outDoc->endDescTableTitle(); + outDoc->startDescTableData(); + BEGIN(DocScan); + } + YY_BREAK +case 63: +YY_RULE_SETUP +#line 1325 "scanner.l" +{ + outDoc->writeDescItem(); + outDoc->startEmphasis(); + outDoc->docify(yytext); + outDoc->endEmphasis(); + outDoc->docify(" - "); + BEGIN(DocScan); + } + YY_BREAK +case 64: +YY_RULE_SETUP +#line 1333 "scanner.l" +{ + QCString secName=&yytext[9]; // skip "\section " + secName=secName.left(secName.length()-1); // remove \n + //printf("SectionName %s found\n",secName.data()); + SectionInfo *sec; + if ((sec=sectionDict[secName])) + { + //printf("Title %s\n",sec->title.data()); + outDoc->writeSection(sec->label,sec->title, + sec->type==SectionInfo::Subsection); + } + } + YY_BREAK +case 65: +YY_RULE_SETUP +#line 1345 "scanner.l" +{ + QCString secName=&yytext[8]; + secName=secName.left(secName.length()-1); + SectionInfo *sec; + if ((sec=sectionDict[secName])) + { + outDoc->writeAnchor(sec->label); + } + } + YY_BREAK +case 66: +YY_RULE_SETUP +#line 1354 "scanner.l" +{ + BEGIN(DocRefName); + } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 1357 "scanner.l" +{ + BEGIN(DocRefItem); + } + YY_BREAK +case 68: +YY_RULE_SETUP +#line 1360 "scanner.l" +{ + QCString ref=yytext; + SectionInfo *sec; + if ((sec=sectionDict[ref])) + { + QCString text; + if (sec->title.isEmpty()) + text=sec->label; + else + text=sec->title; + if (sec->type==SectionInfo::Anchor) + { + outDoc->writeSectionRefAnchor(sec->fileName,sec->label,text); + } + else + { + //printf(" ref sec=%p sec->fileName=%s\n",sec,sec->fileName.data()); + outDoc->writeSectionRef(sec->fileName,sec->label,text); + } + } + else + { + warn("Warning: reference to unknown section %s!\n",yytext); + outDoc->writeBoldString("unknown reference!"); + } + BEGIN(DocScan); + } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 1387 "scanner.l" +{ + sectionRef=yytext; + BEGIN(DocRefArgStart); + } + YY_BREAK +case 70: +YY_RULE_SETUP +#line 1391 "scanner.l" +{ + BEGIN(DocRefArg); + } + YY_BREAK +case 71: +YY_RULE_SETUP +#line 1394 "scanner.l" +{ + yytext[yyleng-1]='\0'; + QCString text=substitute(yytext,"\\\\","\\"); + SectionInfo *sec; + if ((sec=sectionDict[sectionRef])) + { + if (sec->type==SectionInfo::Anchor) + { + outDoc->writeSectionRefAnchor(sec->fileName,sec->label,text); + } + else + { + outDoc->writeSectionRef(sec->fileName,sec->label,text); + } + } + else + { + warn("Warning: reference to unknown section %s!\n",sectionRef.data()); + outDoc->writeBoldString("unknown reference!"); + } + BEGIN(DocScan); + } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 1416 "scanner.l" +{ + sectionRef=yytext; + BEGIN(DocRefItemName); + } + YY_BREAK +case 73: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1420 "scanner.l" +{ + SectionInfo *sec; + if ((sec=sectionDict[sectionRef])) + { + outDoc->writeSectionRefItem(sec->fileName,sec->label,yytext); + } + else + { + warn("Warning: reference to unknown section %s!\n",sectionRef.data()); + outDoc->writeBoldString("unknown reference!"); + } + BEGIN(DocScan); + } + YY_BREAK +case 74: +YY_RULE_SETUP +#line 1433 "scanner.l" +{ + BEGIN(DocImage); + } + YY_BREAK +case 75: +YY_RULE_SETUP +#line 1436 "scanner.l" +{ + BEGIN(DocHtmlImageName); + } + YY_BREAK +case 76: +YY_RULE_SETUP +#line 1439 "scanner.l" +{ + BEGIN(DocLatexImageName); + } + YY_BREAK +case 77: +YY_RULE_SETUP +#line 1442 "scanner.l" +{ + curImageName = findAndCopyImage(yytext,IT_Html); + if (!curImageName.isEmpty()) + { + storeOutputListState(); + outDoc->disableAllBut(OutputGenerator::Html); + outDoc->writeImage(curImageName,0,0); + restoreOutputListState(); + } + BEGIN(DocScan); + } + YY_BREAK +case 78: +YY_RULE_SETUP +#line 1453 "scanner.l" +{ + curImageName = findAndCopyImage(yytext,IT_Latex); + if (curImageName.isEmpty()) + BEGIN(DocScan); + else + BEGIN(DocLatexImageWidth); + } + YY_BREAK +case 79: +YY_RULE_SETUP +#line 1460 "scanner.l" +{ // no width specified + storeOutputListState(); + outDoc->disableAllBut(OutputGenerator::Latex); + outDoc->writeImage(curImageName,0,0); + restoreOutputListState(); + BEGIN(DocScan); + } + YY_BREAK +case 80: +YY_RULE_SETUP +#line 1467 "scanner.l" +{ + storeOutputListState(); + outDoc->disableAllBut(OutputGenerator::Latex); + outDoc->writeImage(curImageName,yytext,0); + restoreOutputListState(); + BEGIN(DocScan); + } + YY_BREAK +case 81: +YY_RULE_SETUP +#line 1474 "scanner.l" +{ + storeOutputListState(); + outDoc->disableAllBut(OutputGenerator::Latex); + outDoc->writeImage(curImageName,0,yytext); + restoreOutputListState(); + BEGIN(DocScan); + } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 1481 "scanner.l" +{ + warn("Warning: %s is an unsupported output format for \\image\n",yytext); + } + YY_BREAK +case 83: +YY_RULE_SETUP +#line 1484 "scanner.l" +{ + warn("Warning: invalid \\image command found!\n"); + outDoc->enableAll(); + BEGIN(DocScan); + } + YY_BREAK +case 84: +YY_RULE_SETUP +#line 1489 "scanner.l" +{ + outDoc->startCodeFragment(); + codeBlock.resize(0); + BEGIN( DocCodeBlock ); + } + YY_BREAK +case 85: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 1494 "scanner.l" +{ + warn("Warning: \\endcode without
     or \\code "
    +    					       "in the documentation of %s\n",refName.data()); 
    +					}
    +	YY_BREAK
    +case 86:
    +YY_RULE_SETUP
    +#line 1498 "scanner.l"
    +{
    +  					  generateRef(*outDoc,className,yytext,inSeeBlock);
    +  					}
    +	YY_BREAK
    +case 87:
    +YY_RULE_SETUP
    +#line 1501 "scanner.l"
    +{ 
    +					  generateRef(*outDoc,className,yytext,inSeeBlock);
    +					} 
    +	YY_BREAK
    +case 88:
    +YY_RULE_SETUP
    +#line 1504 "scanner.l"
    +{ 
    +				          QCString oName=yytext;
    +					  generateRef(*outDoc,className,
    +					              removeRedundantWhiteSpace(oName),inSeeBlock);
    +					}
    +	YY_BREAK
    +case 89:
    +YY_RULE_SETUP
    +#line 1509 "scanner.l"
    +{ 
    +    					  QCString oName=yytext;
    +					  generateRef(*outDoc,className,
    +					              removeRedundantWhiteSpace(oName),inSeeBlock);
    +					}
    +	YY_BREAK
    +case 90:
    +YY_RULE_SETUP
    +#line 1514 "scanner.l"
    +{
    +					  generateFileRef(*outDoc,yytext);
    +					}
    +	YY_BREAK
    +case 91:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 1517 "scanner.l"
    +{ // needed to match things like \endcode. (note the dot)
    +				          parseCode(*outDoc,className,codeBlock,exampleDoc,exampleName);
    +					  //printf("Code block\n-------------\n%s\n--------------\n",codeBlock.data());
    +					  outDoc->endCodeFragment();
    +					  BEGIN( DocScan ); 
    +					}
    +	YY_BREAK
    +case 92:
    +YY_RULE_SETUP
    +#line 1523 "scanner.l"
    +{ 
    +				          parseCode(*outDoc,className,codeBlock,exampleDoc,exampleName);
    +					  //printf("Code block\n-------------\n%s\n--------------\n",codeBlock.data());
    +					  outDoc->endCodeFragment();
    +					  BEGIN( DocScan ); 
    +					}
    +	YY_BREAK
    +case 93:
    +YY_RULE_SETUP
    +#line 1529 "scanner.l"
    +{ BEGIN( DocEmphasis ); }
    +	YY_BREAK
    +case 94:
    +YY_RULE_SETUP
    +#line 1530 "scanner.l"
    +{ BEGIN( DocEmphasis ); }
    +	YY_BREAK
    +case 95:
    +YY_RULE_SETUP
    +#line 1531 "scanner.l"
    +{ BEGIN( DocBold ); }
    +	YY_BREAK
    +case 96:
    +YY_RULE_SETUP
    +#line 1532 "scanner.l"
    +{ BEGIN( DocCode ); }
    +	YY_BREAK
    +case 97:
    +YY_RULE_SETUP
    +#line 1533 "scanner.l"
    +
    +	YY_BREAK
    +case 98:
    +YY_RULE_SETUP
    +#line 1534 "scanner.l"
    +{ BEGIN( DocInclude ); }
    +	YY_BREAK
    +case 99:
    +YY_RULE_SETUP
    +#line 1535 "scanner.l"
    +{ BEGIN( DocDontInclude ); }
    +	YY_BREAK
    +case 100:
    +YY_RULE_SETUP
    +#line 1536 "scanner.l"
    +{ BEGIN( DocSkipKey ); }	
    +	YY_BREAK
    +case 101:
    +YY_RULE_SETUP
    +#line 1537 "scanner.l"
    +{ BEGIN( DocSkiplineKey ); firstLine=TRUE; }
    +	YY_BREAK
    +case 102:
    +YY_RULE_SETUP
    +#line 1538 "scanner.l"
    +{ BEGIN( DocLineKey ); firstLine=TRUE; }
    +	YY_BREAK
    +case 103:
    +YY_RULE_SETUP
    +#line 1539 "scanner.l"
    +{ BEGIN( DocUntilKey ); firstLine=TRUE; }
    +	YY_BREAK
    +case 104:
    +YY_RULE_SETUP
    +#line 1540 "scanner.l"
    +{ 
    +  					  if (includeFileLength>0) 
    +					    skipUntil(yytext); 
    +  					  BEGIN( DocScan );
    +					}
    +	YY_BREAK
    +case 105:
    +YY_RULE_SETUP
    +#line 1545 "scanner.l"
    +{ 
    +  					  if (includeFileLength>0) 
    +					  {
    +					    if (firstLine) outDoc->startCodeFragment();
    +					    firstLine=FALSE;
    +					    showLine(*outDoc,yytext); 
    +					    BEGIN( DocKeyEnd );
    +					  }
    +					  else
    +					  {
    +  					    BEGIN( DocScan );
    +					  }
    +					}
    +	YY_BREAK
    +case 106:
    +YY_RULE_SETUP
    +#line 1558 "scanner.l"
    +{ 
    +  					  if (includeFileLength>0) 
    +					  {
    +					    if (firstLine) outDoc->startCodeFragment();
    +					    firstLine=FALSE;
    +					    skipLine(*outDoc,yytext); 
    +					    BEGIN( DocKeyEnd );
    +					  }
    +					  else
    +					  {
    +  					    BEGIN( DocScan );
    +					  }
    +					}
    +	YY_BREAK
    +case 107:
    +YY_RULE_SETUP
    +#line 1571 "scanner.l"
    +{ 
    +  					  if (includeFileLength>0) 
    +					  {
    +					    if (firstLine) outDoc->startCodeFragment();
    +					    firstLine=FALSE;
    +					    showUntil(*outDoc,yytext); 
    +					    BEGIN( DocKeyEnd );
    +					  }
    +					  else
    +					  {
    +  					    BEGIN( DocScan );
    +					  }
    +					}
    +	YY_BREAK
    +case 108:
    +YY_RULE_SETUP
    +#line 1584 "scanner.l"
    +{ BEGIN(DocLineKey); }
    +	YY_BREAK
    +case 109:
    +YY_RULE_SETUP
    +#line 1585 "scanner.l"
    +{ BEGIN(DocUntilKey); }
    +	YY_BREAK
    +case 110:
    +YY_RULE_SETUP
    +#line 1586 "scanner.l"
    +{ BEGIN(DocSkiplineKey); }
    +	YY_BREAK
    +case 111:
    +YY_RULE_SETUP
    +#line 1587 "scanner.l"
    +
    +	YY_BREAK
    +case YY_STATE_EOF(DocKeyEnd):
    +#line 1588 "scanner.l"
    +{
    +  					  if (!firstLine) outDoc->endCodeFragment();
    +					  yyterminate();
    +  					}
    +	YY_BREAK
    +case 112:
    +YY_RULE_SETUP
    +#line 1592 "scanner.l"
    +{
    +  					  unput(*yytext);
    +  					  if (!firstLine) outDoc->endCodeFragment();
    +					  BEGIN( DocScan );
    +  					}
    +	YY_BREAK
    +case 113:
    +YY_RULE_SETUP
    +#line 1597 "scanner.l"
    +
    +	YY_BREAK
    +case 114:
    +YY_RULE_SETUP
    +#line 1598 "scanner.l"
    +
    +	YY_BREAK
    +case 115:
    +YY_RULE_SETUP
    +#line 1599 "scanner.l"
    +{ outDoc->startBold(); }
    +	YY_BREAK
    +case 116:
    +YY_RULE_SETUP
    +#line 1600 "scanner.l"
    +{ outDoc->endBold(); }
    +	YY_BREAK
    +case 117:
    +YY_RULE_SETUP
    +#line 1601 "scanner.l"
    +{ outDoc->startCenter(); }
    +	YY_BREAK
    +case 118:
    +YY_RULE_SETUP
    +#line 1602 "scanner.l"
    +{ outDoc->endCenter(); }
    +	YY_BREAK
    +case 119:
    +YY_RULE_SETUP
    +#line 1603 "scanner.l"
    +{ 
    +  					  startTable();
    +  					  /*outDoc->startTable();*/ }
    +	YY_BREAK
    +case 120:
    +YY_RULE_SETUP
    +#line 1606 "scanner.l"
    +{
    + 					  endTable(); 
    +  					  /*outDoc->endTable();*/ 
    +					}
    +	YY_BREAK
    +case 121:
    +YY_RULE_SETUP
    +#line 1610 "scanner.l"
    +
    +	YY_BREAK
    +case 122:
    +YY_RULE_SETUP
    +#line 1611 "scanner.l"
    +{ outDoc->startSmall(); }
    +	YY_BREAK
    +case 123:
    +YY_RULE_SETUP
    +#line 1612 "scanner.l"
    +{ outDoc->endSmall(); }
    +	YY_BREAK
    +case 124:
    +YY_RULE_SETUP
    +#line 1613 "scanner.l"
    +
    +	YY_BREAK
    +case 125:
    +YY_RULE_SETUP
    +#line 1614 "scanner.l"
    +
    +	YY_BREAK
    +case 126:
    +YY_RULE_SETUP
    +#line 1615 "scanner.l"
    +
    +	YY_BREAK
    +case 127:
    +YY_RULE_SETUP
    +#line 1616 "scanner.l"
    +
    +	YY_BREAK
    +case 128:
    +YY_RULE_SETUP
    +#line 1617 "scanner.l"
    +
    +	YY_BREAK
    +case 129:
    +YY_RULE_SETUP
    +#line 1618 "scanner.l"
    +
    +	YY_BREAK
    +case 130:
    +YY_RULE_SETUP
    +#line 1619 "scanner.l"
    +
    +	YY_BREAK
    +case 131:
    +YY_RULE_SETUP
    +#line 1620 "scanner.l"
    +{ outDoc->startTypewriter(); }
    +	YY_BREAK
    +case 132:
    +YY_RULE_SETUP
    +#line 1621 "scanner.l"
    +{ outDoc->endTypewriter(); }
    +	YY_BREAK
    +case 133:
    +YY_RULE_SETUP
    +#line 1622 "scanner.l"
    +{ outDoc->startTypewriter(); }
    +	YY_BREAK
    +case 134:
    +YY_RULE_SETUP
    +#line 1623 "scanner.l"
    +{ outDoc->endTypewriter(); }
    +	YY_BREAK
    +case 135:
    +YY_RULE_SETUP
    +#line 1624 "scanner.l"
    +{ outDoc->startEmphasis(); }
    +	YY_BREAK
    +case 136:
    +YY_RULE_SETUP
    +#line 1625 "scanner.l"
    +{ outDoc->endEmphasis(); }
    +	YY_BREAK
    +case 137:
    +YY_RULE_SETUP
    +#line 1626 "scanner.l"
    +{ 
    +                                          storeOutputListState();
    +                                          outDoc->disableAllBut(OutputGenerator::Html);
    +					  outDoc->writeString(yytext); 
    +                                          restoreOutputListState();
    +					}
    +	YY_BREAK
    +case 138:
    +YY_RULE_SETUP
    +#line 1632 "scanner.l"
    +{ 
    +  					  outDoc->startCodeFragment();
    +  					  codeBlock.resize(0);
    +					  BEGIN( DocCodeBlock ); 
    +					}
    +	YY_BREAK
    +case 139:
    +YY_RULE_SETUP
    +#line 1637 "scanner.l"
    +{ 
    +  					  warn("Warning: 
    without
     or \\code"
    +    					         "in the documentation of %s\n",refName.data()); 
    +					}
    +	YY_BREAK
    +case 140:
    +YY_RULE_SETUP
    +#line 1641 "scanner.l"
    +{ outDoc->startSubscript(); }
    +	YY_BREAK
    +case 141:
    +YY_RULE_SETUP
    +#line 1642 "scanner.l"
    +{ outDoc->endSubscript(); }
    +	YY_BREAK
    +case 142:
    +YY_RULE_SETUP
    +#line 1643 "scanner.l"
    +{ outDoc->startSuperscript(); }
    +	YY_BREAK
    +case 143:
    +YY_RULE_SETUP
    +#line 1644 "scanner.l"
    +{ outDoc->endSuperscript(); }
    +	YY_BREAK
    +case 144:
    +YY_RULE_SETUP
    +#line 1645 "scanner.l"
    +{ if (curTable) curTable->newRow(); }
    +	YY_BREAK
    +case 145:
    +YY_RULE_SETUP
    +#line 1646 "scanner.l"
    +
    +	YY_BREAK
    +case 146:
    +YY_RULE_SETUP
    +#line 1647 "scanner.l"
    +{ if (curTable) curTable->newElem(); }
    +	YY_BREAK
    +case 147:
    +YY_RULE_SETUP
    +#line 1648 "scanner.l"
    +
    +	YY_BREAK
    +case 148:
    +YY_RULE_SETUP
    +#line 1649 "scanner.l"
    +{ outDoc->startEnumList(); }
    +	YY_BREAK
    +case 149:
    +YY_RULE_SETUP
    +#line 1650 "scanner.l"
    +{ outDoc->endEnumList(); }
    +	YY_BREAK
    +case 150:
    +YY_RULE_SETUP
    +#line 1651 "scanner.l"
    +{ outDoc->startItemList(); }
    +	YY_BREAK
    +case 151:
    +YY_RULE_SETUP
    +#line 1652 "scanner.l"
    +{ outDoc->endItemList(); }
    +	YY_BREAK
    +case 152:
    +YY_RULE_SETUP
    +#line 1653 "scanner.l"
    +{ outDoc->writeListItem(); }
    +	YY_BREAK
    +case 153:
    +YY_RULE_SETUP
    +#line 1654 "scanner.l"
    +
    +	YY_BREAK
    +case 154:
    +YY_RULE_SETUP
    +#line 1655 "scanner.l"
    +{ outDoc->startTypewriter(); }
    +	YY_BREAK
    +case 155:
    +YY_RULE_SETUP
    +#line 1656 "scanner.l"
    +{ outDoc->endTypewriter(); }
    +	YY_BREAK
    +case 156:
    +YY_RULE_SETUP
    +#line 1657 "scanner.l"
    +{ outDoc->startEmphasis(); }
    +	YY_BREAK
    +case 157:
    +YY_RULE_SETUP
    +#line 1658 "scanner.l"
    +{ outDoc->endEmphasis(); }
    +	YY_BREAK
    +case 158:
    +YY_RULE_SETUP
    +#line 1659 "scanner.l"
    +{ outDoc->writeRuler(); }
    +	YY_BREAK
    +case 159:
    +YY_RULE_SETUP
    +#line 1660 "scanner.l"
    +{ outDoc->startDescription(); }
    +	YY_BREAK
    +case 160:
    +YY_RULE_SETUP
    +#line 1661 "scanner.l"
    +{ outDoc->endDescription(); }
    +	YY_BREAK
    +case 161:
    +YY_RULE_SETUP
    +#line 1662 "scanner.l"
    +{ outDoc->startDescItem(); }
    +	YY_BREAK
    +case 162:
    +YY_RULE_SETUP
    +#line 1663 "scanner.l"
    +
    +	YY_BREAK
    +case 163:
    +YY_RULE_SETUP
    +#line 1664 "scanner.l"
    +{ outDoc->endDescItem(); }
    +	YY_BREAK
    +case 164:
    +YY_RULE_SETUP
    +#line 1665 "scanner.l"
    +
    +	YY_BREAK
    +case 165:
    +YY_RULE_SETUP
    +#line 1666 "scanner.l"
    +{ outDoc->lineBreak(); }
    +	YY_BREAK
    +case 166:
    +YY_RULE_SETUP
    +#line 1667 "scanner.l"
    +{ outDoc->startEmphasis(); }
    +	YY_BREAK
    +case 167:
    +YY_RULE_SETUP
    +#line 1668 "scanner.l"
    +{ outDoc->endEmphasis(); }
    +	YY_BREAK
    +case 168:
    +YY_RULE_SETUP
    +#line 1669 "scanner.l"
    +
    +	YY_BREAK
    +case 169:
    +YY_RULE_SETUP
    +#line 1670 "scanner.l"
    +{ BEGIN(DocHtmlLink); }
    +	YY_BREAK
    +case 170:
    +YY_RULE_SETUP
    +#line 1671 "scanner.l"
    +{ outDoc->startBold(); }
    +	YY_BREAK
    +case 171:
    +YY_RULE_SETUP
    +#line 1672 "scanner.l"
    +{ outDoc->endBold(); }
    +	YY_BREAK
    +case 172:
    +YY_RULE_SETUP
    +#line 1673 "scanner.l"
    +{ 
    +  					  if (inBlock()) endBlock();
    +  					  outDoc->newParagraph(); }
    +	YY_BREAK
    +case 173:
    +YY_RULE_SETUP
    +#line 1676 "scanner.l"
    +
    +	YY_BREAK
    +case 174:
    +YY_RULE_SETUP
    +#line 1677 "scanner.l"
    +{ outDoc->startTitle(); }
    +	YY_BREAK
    +case 175:
    +YY_RULE_SETUP
    +#line 1678 "scanner.l"
    +{ outDoc->endTitle(); }
    +	YY_BREAK
    +case 176:
    +YY_RULE_SETUP
    +#line 1679 "scanner.l"
    +{ outDoc->startSubsection(); }
    +	YY_BREAK
    +case 177:
    +YY_RULE_SETUP
    +#line 1680 "scanner.l"
    +{ outDoc->endSubsection(); }
    +	YY_BREAK
    +case 178:
    +YY_RULE_SETUP
    +#line 1681 "scanner.l"
    +{ outDoc->startSubsubsection(); }
    +	YY_BREAK
    +case 179:
    +YY_RULE_SETUP
    +#line 1682 "scanner.l"
    +{ outDoc->endSubsubsection(); }
    +	YY_BREAK
    +case 180:
    +YY_RULE_SETUP
    +#line 1683 "scanner.l"
    +{ BEGIN(DocHtmlAnchor); }
    +	YY_BREAK
    +case 181:
    +YY_RULE_SETUP
    +#line 1684 "scanner.l"
    +{ outDoc->writeAnchor(yytext); } 
    +	YY_BREAK
    +case 182:
    +YY_RULE_SETUP
    +#line 1685 "scanner.l"
    +{ 
    +  					  htmlUrl.resize(0);
    +					  htmlText.resize(0);
    +  					  BEGIN(DocHtmlHref1); }
    +	YY_BREAK
    +case 183:
    +YY_RULE_SETUP
    +#line 1689 "scanner.l"
    +{ 
    +  					  htmlUrl=yytext; 
    +					}
    +	YY_BREAK
    +case 184:
    +YY_RULE_SETUP
    +#line 1692 "scanner.l"
    +{ BEGIN(DocHtmlHref2); }
    +	YY_BREAK
    +case 185:
    +YY_RULE_SETUP
    +#line 1693 "scanner.l"
    +{ htmlText+=yytext; }
    +	YY_BREAK
    +/*
    +\n			{ htmlText+='\n'; }
    +  */
    +case 186:
    +YY_RULE_SETUP
    +#line 1697 "scanner.l"
    +{ 
    +  					  outDoc->writeHtmlLink(htmlUrl,htmlText);
    +  					  unput(*yytext); 
    +					  BEGIN(DocScan); 
    +					}
    +	YY_BREAK
    +case 187:
    +YY_RULE_SETUP
    +#line 1702 "scanner.l"
    +{ BEGIN(DocScan); }
    +	YY_BREAK
    +case 188:
    +YY_RULE_SETUP
    +#line 1704 "scanner.l"
    +{
    +  					  outDoc->docify("\\");
    +  					}
    +	YY_BREAK
    +case 189:
    +YY_RULE_SETUP
    +#line 1707 "scanner.l"
    +{
    +  					  outDoc->docify("@");
    +  					}
    +	YY_BREAK
    +case 190:
    +YY_RULE_SETUP
    +#line 1710 "scanner.l"
    +{ 
    +					  outDoc->docify("<");
    +					}
    +	YY_BREAK
    +case 191:
    +YY_RULE_SETUP
    +#line 1713 "scanner.l"
    +{ 
    +  					  outDoc->docify(">");
    +					}
    +	YY_BREAK
    +case 192:
    +YY_RULE_SETUP
    +#line 1716 "scanner.l"
    +{ 
    +  					  outDoc->docify("&");
    +					}
    +	YY_BREAK
    +case 193:
    +YY_RULE_SETUP
    +#line 1719 "scanner.l"
    +{
    +  					  outDoc->docify("$");
    +  					}
    +	YY_BREAK
    +case 194:
    +YY_RULE_SETUP
    +#line 1722 "scanner.l"
    +{
    +  					  outDoc->docify("#");
    +  					}
    +	YY_BREAK
    +case 195:
    +YY_RULE_SETUP
    +#line 1725 "scanner.l"
    +{
    +  					  outDoc->docify("%");
    +  					}
    +	YY_BREAK
    +case 196:
    +YY_RULE_SETUP
    +#line 1728 "scanner.l"
    +{
    +  					  outDoc->docify(yytext+1);
    +  					}
    +	YY_BREAK
    +case 197:
    +YY_RULE_SETUP
    +#line 1731 "scanner.l"
    +{ 
    +  					  outDoc->startEmphasis();
    +  					  generateRef(*outDoc,className,yytext,inSeeBlock);
    +					  outDoc->endEmphasis();
    +					  BEGIN( DocScan );
    +					  //addToIndex(yytext);
    +					}
    +	YY_BREAK
    +case 198:
    +YY_RULE_SETUP
    +#line 1738 "scanner.l"
    +{
    +  					  outDoc->startBold();
    +  					  generateRef(*outDoc,className,yytext,inSeeBlock);
    +					  outDoc->endBold();
    +					  BEGIN( DocScan );
    +  					}
    +	YY_BREAK
    +case 199:
    +YY_RULE_SETUP
    +#line 1744 "scanner.l"
    +{ 
    +					  outDoc->startTypewriter();
    +  					  generateRef(*outDoc,className,yytext,inSeeBlock);
    +					  outDoc->endTypewriter();
    +					  BEGIN( DocScan );
    +					}
    +	YY_BREAK
    +case 200:
    +YY_RULE_SETUP
    +#line 1750 "scanner.l"
    +{
    +					  includeFile(*outDoc,stripQuotes(yytext),FALSE); 
    +					  BEGIN( DocScan );
    +  					}
    +	YY_BREAK
    +case 201:
    +YY_RULE_SETUP
    +#line 1754 "scanner.l"
    +{
    +  					  includeFile(*outDoc,stripQuotes(yytext),TRUE);
    +					  BEGIN( DocScan );
    +  					}
    +	YY_BREAK
    +case 202:
    +YY_RULE_SETUP
    +#line 1758 "scanner.l"
    +{ codeBlock += yytext; }
    +	YY_BREAK
    +case 203:
    +YY_RULE_SETUP
    +#line 1759 "scanner.l"
    +{ codeBlock += yytext; }
    +	YY_BREAK
    +case 204:
    +YY_RULE_SETUP
    +#line 1760 "scanner.l"
    +{ codeBlock += '\n'; }
    +	YY_BREAK
    +case 205:
    +YY_RULE_SETUP
    +#line 1761 "scanner.l"
    +{ codeBlock += yytext; }
    +	YY_BREAK
    +case 206:
    +YY_RULE_SETUP
    +#line 1762 "scanner.l"
    +{ codeBlock += *yytext; }
    +	YY_BREAK
    +case 207:
    +YY_RULE_SETUP
    +#line 1763 "scanner.l"
    +{ 
    +					  outDoc->docify(yytext);
    +					}
    +	YY_BREAK
    +case 208:
    +YY_RULE_SETUP
    +#line 1766 "scanner.l"
    +{ 
    +  					  outDoc->docify(yytext);
    +					}
    +	YY_BREAK
    +case 209:
    +YY_RULE_SETUP
    +#line 1769 "scanner.l"
    +{ outDoc->writeChar('\n'); }
    +	YY_BREAK
    +case 210:
    +YY_RULE_SETUP
    +#line 1770 "scanner.l"
    +{ 
    +  					  if (insideArgumentList)
    +					  {
    +					    insideArgumentList=FALSE;
    +					    outDoc->endItemList();
    +					  }
    +					  else
    +					  {
    +					    outDoc->newParagraph(); 
    +					  }
    +					  if (inBlock()) endBlock();
    +					}
    +	YY_BREAK
    +case 211:
    +YY_RULE_SETUP
    +#line 1782 "scanner.l"
    +{ 
    +  					  outDoc->writeChar(' '); 
    +					}
    +	YY_BREAK
    +case 212:
    +YY_RULE_SETUP
    +#line 1785 "scanner.l"
    +{ 
    +					  outDoc->writeChar(*yytext);
    +					}
    +	YY_BREAK
    +case 213:
    +YY_RULE_SETUP
    +#line 1788 "scanner.l"
    +{
    +  					  bracketCount=0;
    +  					  BEGIN(SkipCurlyBlock); 
    +					}
    +	YY_BREAK
    +case 214:
    +YY_RULE_SETUP
    +#line 1792 "scanner.l"
    +{
    +  				 	  roundCount=0;
    +  					  BEGIN(SkipRoundBlock);
    +  					}
    +	YY_BREAK
    +case 215:
    +YY_RULE_SETUP
    +#line 1796 "scanner.l"
    +{
    +					  ++roundCount;
    +  					}
    +	YY_BREAK
    +case 216:
    +YY_RULE_SETUP
    +#line 1799 "scanner.l"
    +{
    +  					  if (roundCount )
    +					    --roundCount ;
    +					  else
    +					    BEGIN( NextSemi ) ;
    +  					}
    +	YY_BREAK
    +case 217:
    +YY_RULE_SETUP
    +#line 1805 "scanner.l"
    +{
    +  					  ++bracketCount ; 
    +					}
    +	YY_BREAK
    +case 218:
    +YY_RULE_SETUP
    +#line 1808 "scanner.l"
    +{ 
    +  				          if( bracketCount )
    +					    --bracketCount ;
    +					  else
    +					    BEGIN( NextSemi ) ;
    +					}
    +	YY_BREAK
    +case 219:
    +YY_RULE_SETUP
    +#line 1814 "scanner.l"
    +
    +	YY_BREAK
    +case 220:
    +YY_RULE_SETUP
    +#line 1815 "scanner.l"
    +
    +	YY_BREAK
    +case 221:
    +YY_RULE_SETUP
    +#line 1816 "scanner.l"
    +
    +	YY_BREAK
    +case 222:
    +YY_RULE_SETUP
    +#line 1817 "scanner.l"
    +{
    +  					  lastStringContext=NextSemi;
    +					  BEGIN(SkipString);
    +  					}
    +	YY_BREAK
    +case 223:
    +YY_RULE_SETUP
    +#line 1821 "scanner.l"
    +{ 
    +  					  unput(*yytext);
    +  					  BEGIN( FindMembers ) ; 
    +					}
    +	YY_BREAK
    +case 224:
    +YY_RULE_SETUP
    +#line 1825 "scanner.l"
    +{ current->sig = sig = TRUE;
    +					  current->slot = slot = FALSE;
    +					  current->protection = protection = Public ;
    +					  current->type.resize(0); 
    +					  current->name.resize(0); 
    +					  current->args.resize(0);
    +					  current->argList->clear();
    +					  lineCount() ;
    +					}
    +	YY_BREAK
    +case 225:
    +YY_RULE_SETUP
    +#line 1835 "scanner.l"
    +{
    +					  current->protection = protection = Public ;
    +					  current->slot = slot = TRUE;
    +					  current->sig = sig = FALSE;
    +					  current->type.resize(0); 
    +					  current->name.resize(0); 
    +					  current->args.resize(0);
    +					  current->argList->clear();
    +					  lineCount();
    +					}
    +	YY_BREAK
    +case 226:
    +YY_RULE_SETUP
    +#line 1846 "scanner.l"
    +{
    +					  current->protection = protection = Protected ;
    +					  current->slot = slot = TRUE;
    +					  current->sig = sig = FALSE;
    +					  current->type.resize(0); 
    +					  current->name.resize(0); 
    +					  current->args.resize(0);
    +					  current->argList->clear();
    +					  lineCount();
    +					}
    +	YY_BREAK
    +case 227:
    +YY_RULE_SETUP
    +#line 1857 "scanner.l"
    +{
    +					  current->protection = protection = Private ;
    +					  current->slot = slot = TRUE;
    +					  current->sig = sig = FALSE;
    +					  current->type.resize(0); 
    +					  current->name.resize(0); 
    +					  current->args.resize(0);
    +					  current->argList->clear();
    +					  lineCount();
    +					}
    +	YY_BREAK
    +case 228:
    +YY_RULE_SETUP
    +#line 1868 "scanner.l"
    +{ 
    +					  current->protection = protection = Public ;
    +					  current->slot = slot = FALSE;
    +					  current->sig = sig = FALSE;
    +					  current->type.resize(0); 
    +					  current->name.resize(0); 
    +					  current->args.resize(0);
    +					  current->argList->clear();
    +					  lineCount() ;
    +					}
    +	YY_BREAK
    +case 229:
    +YY_RULE_SETUP
    +#line 1878 "scanner.l"
    +{ 
    +  					  current->protection = protection = Protected ;
    +					  current->slot = slot = FALSE;
    +					  current->sig = sig = FALSE;
    +					  current->type.resize(0); 
    +					  current->name.resize(0); 
    +					  current->args.resize(0);
    +					  current->argList->clear();
    +					  lineCount() ;
    +					}
    +	YY_BREAK
    +case 230:
    +YY_RULE_SETUP
    +#line 1888 "scanner.l"
    +{ 
    +  					  current->protection = protection = Private ;
    +					  current->slot = slot = FALSE;
    +					  current->sig = sig = FALSE;
    +					  current->type.resize(0); 
    +					  current->name.resize(0); 
    +					  current->args.resize(0);
    +					  current->argList->clear();
    +					  lineCount() ;
    +					}
    +	YY_BREAK
    +case 231:
    +YY_RULE_SETUP
    +#line 1898 "scanner.l"
    +{
    +  					  lineCount();
    +  					}
    +	YY_BREAK
    +case 232:
    +YY_RULE_SETUP
    +#line 1901 "scanner.l"
    +{ //current->type += " static ";
    +  					  current->stat = TRUE;
    +					  lineCount();
    +					}
    +	YY_BREAK
    +case 233:
    +YY_RULE_SETUP
    +#line 1905 "scanner.l"
    +{
    +  					  current->stat = FALSE;
    +					  lineCount();
    +  					}
    +	YY_BREAK
    +case 234:
    +YY_RULE_SETUP
    +#line 1909 "scanner.l"
    +{ current->type += " virtual ";
    +					  current->virt = Virtual;
    +					  lineCount();
    +					}
    +	YY_BREAK
    +case 235:
    +YY_RULE_SETUP
    +#line 1913 "scanner.l"
    +{ current->inLine = TRUE;
    +                                          lineCount(); 
    +                                        }
    +	YY_BREAK
    +case 236:
    +YY_RULE_SETUP
    +#line 1916 "scanner.l"
    +{ lineCount(); }
    +	YY_BREAK
    +case 237:
    +YY_RULE_SETUP
    +#line 1917 "scanner.l"
    +{ 
    +  					  isTypedef=FALSE;
    +					  current->section = Entry::NAMESPACE_SEC;
    +					  current->type = "namespace" ;
    +					  current->fileName  = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  current->bodyLine  = yyLineNr;
    +					  lineCount();
    +  					  BEGIN( ClassName ); 
    +					}
    +	YY_BREAK
    +case 238:
    +YY_RULE_SETUP
    +#line 1927 "scanner.l"
    +{ 
    +  					  isTypedef=FALSE;
    +					  current->section = Entry::NAMESPACE_SEC;
    +					  current->type = "module" ;
    +					  current->fileName  = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  current->bodyLine  = yyLineNr;
    +					  lineCount();
    +  					  BEGIN( ClassName ); 
    +					}
    +	YY_BREAK
    +case 239:
    +YY_RULE_SETUP
    +#line 1937 "scanner.l"
    +{
    +  					  isTypedef=FALSE;
    +					  current->section = Entry::INTERFACE_SEC;
    +					  addType( current ) ;
    +					  current->type += " interface" ;
    +					  current->fileName  = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  current->bodyLine  = yyLineNr;
    +					  lineCount();
    +					  BEGIN( ClassName );
    +  					}
    +	YY_BREAK
    +case 240:
    +YY_RULE_SETUP
    +#line 1948 "scanner.l"
    +{ 
    +					  isTypedef=((QCString)yytext).find("typedef")!=-1;
    +  					  current->section = Entry::CLASS_SEC;
    +					  addType( current ) ;
    +					  current->type += " class" ;
    +					  current->fileName  = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  current->bodyLine  = yyLineNr;
    +					  lineCount() ;
    +					  BEGIN( ClassName ) ;
    +					}
    +	YY_BREAK
    +case 241:
    +YY_RULE_SETUP
    +#line 1959 "scanner.l"
    +{ 
    +					  isTypedef=((QCString)yytext).find("typedef")!=-1;
    +  					  current->section = Entry::STRUCT_SEC ;
    +					  addType( current ) ;
    +					  current->type += " struct" ;
    +					  current->fileName  = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  current->bodyLine  = yyLineNr;
    +					  lineCount() ;
    +					  BEGIN( ClassName ) ;
    +					}
    +	YY_BREAK
    +case 242:
    +YY_RULE_SETUP
    +#line 1970 "scanner.l"
    +{ 
    +					  isTypedef=((QCString)yytext).find("typedef")!=-1;
    +  					  current->section = Entry::UNION_SEC ;
    +					  addType( current ) ;
    +					  current->type += " union" ;
    +					  current->fileName  = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  current->bodyLine  = yyLineNr;
    +					  lineCount() ;
    +					  BEGIN( ClassName ) ;
    +					}
    +	YY_BREAK
    +case 243:
    +YY_RULE_SETUP
    +#line 1981 "scanner.l"
    +{ 
    +					  isTypedef=((QCString)yytext).find("typedef")!=-1;
    +  					  current->section = Entry::ENUM_SEC ;
    +					  addType( current ) ;
    +					  current->type += " enum" ;
    +					  current->fileName  = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  current->bodyLine  = yyLineNr;
    +					  lineCount() ;
    +					  BEGIN( ClassName ) ;
    +					}
    +	YY_BREAK
    +case 244:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 1992 "scanner.l"
    +{
    +  					  lineCount();
    +    					  current->name += yytext ;
    +					  current->name = current->name.simplifyWhiteSpace();
    +					  BEGIN( FindMembers ) ;
    +  					}
    +	YY_BREAK
    +case 245:
    +YY_RULE_SETUP
    +#line 1998 "scanner.l"
    +{ 
    +    					  current->name += *yytext ;
    +					}
    +	YY_BREAK
    +case 246:
    +YY_RULE_SETUP
    +#line 2001 "scanner.l"
    +{ /* skip guided templ specifiers */ }
    +	YY_BREAK
    +case 247:
    +YY_RULE_SETUP
    +#line 2002 "scanner.l"
    +{
    +					  current->name = current->name.simplifyWhiteSpace();
    +					  unput(*yytext);
    +					  BEGIN( FindMembers ) ;
    +					}
    +	YY_BREAK
    +case 248:
    +YY_RULE_SETUP
    +#line 2007 "scanner.l"
    +{ 
    +  					  lineCount();
    +					  // class template specifier already found => member template specifier
    +					  // already inside class => member template specifier
    +					  if (current->tArgList || (current_root->section&Entry::COMPOUND_MASK))
    +					  {
    +					    //printf("-------> member template\n");
    +					    if (current->mtArgList)
    +					    {
    +					      current->mtArgList->clear();
    +                                            }
    +					    else
    +					    {
    +					      current->mtArgList = new ArgumentList;
    +					      current->mtArgList->setAutoDelete(TRUE);
    +					    }
    +					    currentArgumentList = current->mtArgList;
    +					  }
    +					  else // class template specifier
    +					  {
    +					    //printf("-------> class template\n");
    +					    if (current->tArgList)
    +					    {
    +					      current->tArgList->clear();
    +                                            }
    +					    else
    +					    {
    +					      current->tArgList = new ArgumentList;
    +					      current->tArgList->setAutoDelete(TRUE);
    +					    }
    +					    currentArgumentList = current->tArgList;
    +					  }
    +					  templateStr="<";
    +					  copyArgString=&templateStr;
    +					  currentArgumentContext = FindMembers;
    +					  //printf("Start template list\n");
    +					  BEGIN( ReadTempArgs );
    +  					}
    +	YY_BREAK
    +case 249:
    +YY_RULE_SETUP
    +#line 2045 "scanner.l"
    +{ 
    +					  current->startLine=yyLineNr; 
    +                                          lineCount(); 
    +                                          BEGIN(Using); 
    +                                        }
    +	YY_BREAK
    +case 250:
    +YY_RULE_SETUP
    +#line 2050 "scanner.l"
    +{ lineCount(); BEGIN(UsingDirective); }
    +	YY_BREAK
    +case 251:
    +YY_RULE_SETUP
    +#line 2051 "scanner.l"
    +{ BEGIN(FindMembers); }
    +	YY_BREAK
    +case 252:
    +YY_RULE_SETUP
    +#line 2052 "scanner.l"
    +{ current->name=yytext;
    +                                          current->fileName = yyFileName; 
    +  					  current->section=Entry::USINGDIR_SEC;
    +					  printf("Found using directive %s\n",yytext);
    +					  current_root->addSubEntry(current);
    +					  current             = new Entry ;
    +					  current->protection = protection ;
    +				          current->sig        = sig;
    +					  current->virt       = virt;
    +					  current->stat       = gstat;
    +					  current->slot       = slot;
    +					  BEGIN(Using);
    +  					}
    +	YY_BREAK
    +case 253:
    +YY_RULE_SETUP
    +#line 2065 "scanner.l"
    +{ // guided template decl
    +					  QCString n=yytext;
    +					  addType( current );
    +					  current->name=n.left(n.length()-2);
    +					}
    +	YY_BREAK
    +case 254:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 2070 "scanner.l"
    +{
    +  					  sharpCount=0;
    +					  lineCount();
    +					  addType( current );
    +  					  current->name=yytext;
    +					  current->name=current->name.stripWhiteSpace();
    +					  current->scopeSpec.resize(0);
    +					  currentTemplateSpec = ¤t->scopeSpec;
    +					  if (nameIsOperator(current->name))
    +					    BEGIN( Operator );
    +					  else
    +					    BEGIN( EndTemplate );
    +					}
    +	YY_BREAK
    +case 255:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 2083 "scanner.l"
    +{
    +  					  sharpCount=0;
    +					  lineCount();
    +  					  current->name+=((QCString)yytext).stripWhiteSpace();
    +					  current->memberSpec.resize(0);
    +					  currentTemplateSpec = ¤t->memberSpec;
    +					  if (nameIsOperator(current->name))
    +					    BEGIN( Operator );
    +					  else
    +					    BEGIN( EndTemplate );
    +  					}
    +	YY_BREAK
    +/*
    +"<"			{
    +					  sharpCount++; 
    +  					}
    +">"			{
    +  					  if (--sharpCount<=0)
    +					  {
    +					    BEGIN(FindMembers);
    +					  }
    +  					}
    +.
    +  */
    +case 256:
    +YY_RULE_SETUP
    +#line 2107 "scanner.l"
    +{ 
    +  					  current->name+='<';
    +  					  *currentTemplateSpec+='<'; 
    +					  sharpCount++; 
    +					}
    +	YY_BREAK
    +case 257:
    +YY_RULE_SETUP
    +#line 2112 "scanner.l"
    +{
    +  					  current->name+='>';
    +					  *currentTemplateSpec+='>';
    +					  if (--sharpCount<=0)
    +					  {  
    +					    //printf("Found %s\n",current->name.data());
    +					    BEGIN(FindMembers);
    +					  }
    +					}
    +	YY_BREAK
    +case 258:
    +YY_RULE_SETUP
    +#line 2121 "scanner.l"
    +{ 
    +  					  lineCount();
    +  					  current->name+='>';
    +					  *currentTemplateSpec+='>';
    +					  if (--sharpCount<=0)
    +					  {
    +					    current->args = "(";
    +					    currentArgumentContext = FuncQual;
    +					    copyArgString=¤t->args;
    +					    //printf("Found %s\n",current->name.data());
    +					    BEGIN( ReadFuncArgType ) ;
    +					  }
    +					}
    +	YY_BREAK
    +case 259:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 2;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 2134 "scanner.l"
    +{
    +  					  lineCount();
    +  					  current->name+='>';
    +  					  *currentTemplateSpec+='>';
    +					  if (--sharpCount<=0)
    +					  {
    +					    BEGIN(FindMemberName);
    +					  }
    +  					}
    +	YY_BREAK
    +case 260:
    +YY_RULE_SETUP
    +#line 2143 "scanner.l"
    +{ 
    +  					  current->name+=*yytext;
    +  					  *currentTemplateSpec+=*yytext; 
    +					}
    +	YY_BREAK
    +case 261:
    +YY_RULE_SETUP
    +#line 2147 "scanner.l"
    +{ 
    +					  lineCount();
    +					  if (YY_START==FindMembers)
    +					  {
    +					    addType( current ) ;
    +					    current->name  = yytext;
    +					  }
    +					  else
    +					  {
    +					    current->name += yytext;
    +					  }
    +				          QCString tmp=yytext;
    +					  if (nameIsOperator(tmp)) 
    +					    BEGIN( Operator );
    +					  else
    +					    BEGIN(FindMembers);
    +					}
    +	YY_BREAK
    +case 262:
    +YY_RULE_SETUP
    +#line 2164 "scanner.l"
    +{ lastCPPContext = YY_START; 
    +					  BEGIN( SkipCPP ) ; 
    +					}
    +	YY_BREAK
    +case 263:
    +YY_RULE_SETUP
    +#line 2167 "scanner.l"
    +{
    +  					  current->bodyLine = yyLineNr;
    +  					  BEGIN( Define );
    +  					}
    +	YY_BREAK
    +case 264:
    +YY_RULE_SETUP
    +#line 2171 "scanner.l"
    +
    +	YY_BREAK
    +case 265:
    +YY_RULE_SETUP
    +#line 2172 "scanner.l"
    +{ yyLineNr++ ; }
    +	YY_BREAK
    +case 266:
    +YY_RULE_SETUP
    +#line 2173 "scanner.l"
    +{ yyLineNr++ ;
    +					  BEGIN( lastCPPContext) ;
    +					}
    +	YY_BREAK
    +case 267:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 2176 "scanner.l"
    +{
    +  					  current->bodyLine = yyLineNr;
    +  					  current->name = yytext;
    +					  BEGIN( DefineArg );
    +  					}
    +	YY_BREAK
    +case 268:
    +YY_RULE_SETUP
    +#line 2181 "scanner.l"
    +{
    +  					  //printf("Define with args\n");
    +  					  current->args += ')';
    +  					  BEGIN( DefineEnd );
    +  					}
    +	YY_BREAK
    +case 269:
    +YY_RULE_SETUP
    +#line 2186 "scanner.l"
    +{
    +  					  current->args += *yytext;
    +  					}
    +	YY_BREAK
    +case 270:
    +YY_RULE_SETUP
    +#line 2189 "scanner.l"
    +{
    +  					  //printf("Define `%s' without args\n",yytext);
    +  					  current->bodyLine = yyLineNr;
    +  					  current->name = yytext;
    +					  BEGIN(DefineEnd);
    +  					}
    +	YY_BREAK
    +case 271:
    +YY_RULE_SETUP
    +#line 2195 "scanner.l"
    +{
    +  					  //printf("End define\n");
    +					  yyLineNr++;
    +					  current->fileName   = yyFileName;
    +					  current->startLine  = yyLineNr;
    +					  current->type.resize(0);
    +  					  current->args       = current->args.simplifyWhiteSpace();
    +  					  current->name       = current->name.stripWhiteSpace();
    +					  current->section    = Entry::DEFINE_SEC;
    +					  current_root->addSubEntry(current);
    +					  current             = new Entry ;
    +					  current->protection = protection ;
    +				          current->sig        = sig;
    +					  current->virt       = virt;
    +					  current->stat       = gstat;
    +					  current->slot       = slot;
    +					  BEGIN(FindMembers);
    +  					}
    +	YY_BREAK
    +case 272:
    +YY_RULE_SETUP
    +#line 2213 "scanner.l"
    +{
    +  					  yyLineNr++;
    +  					}
    +	YY_BREAK
    +case 273:
    +YY_RULE_SETUP
    +#line 2216 "scanner.l"
    +{
    +					  lastStringContext=DefineEnd;
    +					  BEGIN(SkipString);
    +  					}
    +	YY_BREAK
    +case 274:
    +YY_RULE_SETUP
    +#line 2220 "scanner.l"
    +
    +	YY_BREAK
    +case 275:
    +YY_RULE_SETUP
    +#line 2222 "scanner.l"
    +{ current->name += yytext ; }
    +	YY_BREAK
    +case 276:
    +YY_RULE_SETUP
    +#line 2223 "scanner.l"
    +{
    +  					  lineCount();
    +					  if (current->bodyLine==-1)
    +					    current->bodyLine=yyLineNr;
    +					  lastAfterDocContext = YY_START;
    +					  afterDocTerminator = ';';
    +					  if (yytext[yyleng-3]=='/')
    +					  {
    +					    current->brief.resize(0);
    +					    BEGIN(AfterDocLine);
    +					  }
    +					  else if (yytext[yyleng-2]=='*' && Config::autoBriefFlag)
    +					  {
    +					    current->brief.resize(0);
    +					    BEGIN(AfterDocBrief);
    +					  }
    +					  else
    +					  {
    +					    current->doc.resize(0);
    +					    BEGIN(AfterDoc);
    +					  }
    +  					}
    +	YY_BREAK
    +case 277:
    +YY_RULE_SETUP
    +#line 2245 "scanner.l"
    +{
    +  					  lineCount();
    +					  lastAfterDocContext = YY_START;
    +					  afterDocTerminator = ',';
    +					  if (yytext[yyleng-3]=='/')
    +					  {
    +					    current->brief.resize(0);
    +					    BEGIN(AfterDocLine);
    +					  }
    +					  else if (yytext[yyleng-2]=='*' && Config::autoBriefFlag)
    +					  {
    +					    current->brief.resize(0);
    +					    BEGIN(AfterDocBrief);
    +					  }
    +					  else
    +					  {
    +					    current->doc.resize(0);
    +					    BEGIN(AfterDoc);
    +					  }
    +  					}
    +	YY_BREAK
    +case 278:
    +YY_RULE_SETUP
    +#line 2265 "scanner.l"
    +{
    +  					  lineCount();
    +					  lastAfterDocContext = YY_START;
    +					  if (YY_START==DefineEnd)
    +					    afterDocTerminator = '\n';
    +					  else
    +					    afterDocTerminator = 0;
    +					  if (yytext[yyleng-3]=='/')
    +					  {
    +					    current->brief.resize(0);
    +					    BEGIN(AfterDocLine);
    +					  }
    +					  else if (yytext[yyleng-2]=='*' && Config::autoBriefFlag)
    +					  {
    +					    current->brief.resize(0);
    +					    BEGIN(AfterDocBrief);
    +					  }
    +					  else
    +					  {
    +					    current->doc.resize(0);
    +					    BEGIN(AfterDoc);
    +					  }
    +  					}
    +	YY_BREAK
    +case 279:
    +YY_RULE_SETUP
    +#line 2288 "scanner.l"
    +{
    +  					  current->bodyLine=yyLineNr;
    +  					  BEGIN(NextSemi);
    +  					}
    +	YY_BREAK
    +case 280:
    +YY_RULE_SETUP
    +#line 2292 "scanner.l"
    +{ 
    +  					  QCString oldType = current->type.copy();
    +					  QCString oldDocs = current->doc.copy();
    +  					  if ( *yytext != ':')
    +					  {
    +					    if (current->bodyLine==-1)
    +					      current->bodyLine = yyLineNr;
    +					    current->type=current->type.simplifyWhiteSpace();
    +					    current->args=current->args.simplifyWhiteSpace();
    +					    current->name=current->name.stripWhiteSpace();
    +					    current->section = Entry::VARIABLE_SEC ;
    +					    current->fileName = yyFileName;
    +					    current->startLine = yyLineNr;
    +					    current_root->addSubEntry( current ) ;
    +					    current = new Entry ;
    +					    // variable found 
    +					    current->section = Entry::EMPTY_SEC ;
    +					    current->protection = protection;
    +					    current->slot = slot = FALSE;
    +					    current->sig = sig = FALSE;
    +					    current->virt = Normal; 
    +					    current->stat = gstat;
    +					  }
    +					  // skip expression or bitfield if needed
    +					  if ( *yytext == ':') 
    +					  {
    +					    BEGIN( NextSemi );
    +					  }
    +					  else 
    +					  {
    +					    if ( *yytext == ',' )
    +					    {
    +					      int i=oldType.length(); 
    +					      while (i>0 && (oldType[i-1]=='*' || oldType[i-1]==' ')) i--;
    +					      current->type = oldType.left(i);
    +					      current->doc  = oldDocs;
    +					    }
    +					    BEGIN( FindMembers ) ;
    +					  }
    +					}
    +	YY_BREAK
    +case 281:
    +YY_RULE_SETUP
    +#line 2333 "scanner.l"
    +{ current->args += yytext ;
    +					  sharpCount=1;
    +					  BEGIN( Array ) ;
    +					}
    +	YY_BREAK
    +case 282:
    +YY_RULE_SETUP
    +#line 2337 "scanner.l"
    +{ current->args += *yytext ;
    +					  if (--sharpCount<=0)
    +	                                     BEGIN( FindMembers ) ;
    +					}
    +	YY_BREAK
    +case 283:
    +YY_RULE_SETUP
    +#line 2341 "scanner.l"
    +{ current->args += *yytext ;
    +					  sharpCount++;	
    +					}
    +	YY_BREAK
    +case 284:
    +YY_RULE_SETUP
    +#line 2344 "scanner.l"
    +{ current->args += *yytext ; }
    +	YY_BREAK
    +case 285:
    +YY_RULE_SETUP
    +#line 2346 "scanner.l"
    +{ addType( current ) ;
    +					  current->type += yytext ;
    +					  BEGIN( Sharp ) ;
    +					}
    +	YY_BREAK
    +case 286:
    +YY_RULE_SETUP
    +#line 2350 "scanner.l"
    +{ current->type += *yytext ;
    +					  if (--sharpCount<=0)
    +	                                     BEGIN( FindMembers ) ;
    +					}
    +	YY_BREAK
    +case 287:
    +YY_RULE_SETUP
    +#line 2354 "scanner.l"
    +{ current->type += *yytext ;
    +					  sharpCount++;	
    +					}
    +	YY_BREAK
    +case 288:
    +YY_RULE_SETUP
    +#line 2357 "scanner.l"
    +{
    +  					  lineCount();
    +					}
    +	YY_BREAK
    +case 289:
    +YY_RULE_SETUP
    +#line 2360 "scanner.l"
    +{ current->type += *yytext ; }
    +	YY_BREAK
    +case 290:
    +YY_RULE_SETUP
    +#line 2361 "scanner.l"
    +{
    +  					  current->name = yytext;
    +					}
    +	YY_BREAK
    +case 291:
    +YY_RULE_SETUP
    +#line 2364 "scanner.l"
    +{
    +  					  BEGIN(FindFieldArg);
    +  					}
    +	YY_BREAK
    +case 292:
    +YY_RULE_SETUP
    +#line 2367 "scanner.l"
    +{
    +					  //printf("adding `%s' `%s' `%s' to enum `%s'\n",
    +					  //     current->type.data(), current->name.data(),
    +					  //     current->args.data(), current_root->name.data());
    +					  current->fileName   = yyFileName;
    +					  current->startLine  = yyLineNr;
    +					  current->type       = "@"; // enum marker
    +  					  current->args       = current->args.simplifyWhiteSpace();
    +  					  current->name       = current->name.stripWhiteSpace();
    +					  current->section    = Entry::VARIABLE_SEC;
    +					  // add to the scope of the enum
    +					  current_root->addSubEntry(current);
    +					  current             = new Entry(*current);
    +					  // add to the scope surrounding the enum (copy!)
    +					  current_root->parent->addSubEntry(current);
    +					  current             = new Entry ;
    +					  current->protection = protection ;
    +				          current->sig        = sig;
    +					  current->virt       = virt;
    +					  current->stat       = gstat;
    +					  current->slot       = slot;
    +  					}
    +	YY_BREAK
    +case 293:
    +YY_RULE_SETUP
    +#line 2389 "scanner.l"
    +{ unput(*yytext); BEGIN(FindFields); }
    +	YY_BREAK
    +case 294:
    +YY_RULE_SETUP
    +#line 2390 "scanner.l"
    +{ current->program += yytext ; }
    +	YY_BREAK
    +case 295:
    +YY_RULE_SETUP
    +#line 2391 "scanner.l"
    +{ current->program += yytext ; }
    +	YY_BREAK
    +case 296:
    +YY_RULE_SETUP
    +#line 2392 "scanner.l"
    +{ current->program += yytext ; }
    +	YY_BREAK
    +case 297:
    +YY_RULE_SETUP
    +#line 2393 "scanner.l"
    +{ current->program += yytext ;
    +					  lastContext = Curly ;
    +					  BEGIN( Comment ) ;
    +					}
    +	YY_BREAK
    +case 298:
    +YY_RULE_SETUP
    +#line 2397 "scanner.l"
    +{ current->program += yytext ;
    +					  ++yyLineNr ;
    +					  lastContext = Curly ;
    +					  BEGIN( Comment ) ;
    +					}
    +	YY_BREAK
    +case 299:
    +YY_RULE_SETUP
    +#line 2402 "scanner.l"
    +{ current->program += yytext; }
    +	YY_BREAK
    +case 300:
    +YY_RULE_SETUP
    +#line 2403 "scanner.l"
    +{ current->program += yytext; }
    +	YY_BREAK
    +case 301:
    +YY_RULE_SETUP
    +#line 2404 "scanner.l"
    +{ current->program += yytext; }
    +	YY_BREAK
    +case 302:
    +YY_RULE_SETUP
    +#line 2405 "scanner.l"
    +{ current->program += yytext ;
    +					  ++bracketCount ;
    +					}
    +	YY_BREAK
    +case 303:
    +YY_RULE_SETUP
    +#line 2408 "scanner.l"
    +{ if ( bracketCount )
    +					  {
    +					    current->program += yytext ;
    +					    --bracketCount ;
    +					  }
    +					  else
    +					  {
    +					    QCString &cn = current->name;
    +					    //QCString rn = stripAnnonymousScope(current_root->name);
    +					    QCString rn = current_root->name.copy();
    +					    //printf("cn=`%s' rn=`%s'\n",cn.data(),rn.data());
    +					    if (!cn.isEmpty() && !rn.isEmpty() && 
    +					      (current_root->section & Entry::SCOPE_MASK))
    +					    {
    +					      cn.prepend(rn+"::");
    +					    }
    +					    if (isTypedef && cn.isEmpty())
    +					    {
    +					      //printf("Typedef Name\n");
    +					      BEGIN( TypedefName );
    +					    }
    +					    else
    +					    {
    +					      if (current->section == Entry::ENUM_SEC)
    +					      {
    +					        current->program+=','; // add field terminator
    +					      }
    +					      // add compound definition to the tree
    +  					      current->args = current->args.simplifyWhiteSpace();
    +  					      current->type = current->type.simplifyWhiteSpace();
    +  					      current->name = current->name.stripWhiteSpace();
    +					      //printf("adding `%s' `%s' `%s' brief=%s\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data());
    +					      current_root->addSubEntry( current ) ;
    +					      current = new Entry(*current);
    +					      if (current->section==Entry::NAMESPACE_SEC || 
    +						  current->section==Entry::INTERFACE_SEC
    +						 )
    +					      { // namespaces and interfaces ends with a closing bracket without semicolon
    +						current->reset();
    +						current->protection = protection ;
    +						current->sig = sig;
    +						current->virt = virt;
    +						current->stat = gstat;
    +						current->slot = slot;
    +						BEGIN( FindMembers ) ;
    +					      }
    +					      else
    +						BEGIN( MemberSpec ) ;
    +					    }
    +					  }
    +					}
    +	YY_BREAK
    +case 304:
    +YY_RULE_SETUP
    +#line 2459 "scanner.l"
    +{
    +  					  if (current->section == Entry::ENUM_SEC)
    +					  {
    +					    current->program+=","; // add field terminator
    +					  }
    +  				          current->name=yytext;
    +					  if (current_root->section & Entry::SCOPE_MASK)
    +					  {
    +					    current->name.prepend(current_root->name+"::");
    +					  }
    +  					  current->args = current->args.simplifyWhiteSpace();
    +  					  current->type = current->type.simplifyWhiteSpace();
    +					  //printf("Adding compound %s %s %s\n",current->type.data(),current->name.data(),current->args.data());
    +					  current_root->addSubEntry( current ) ;
    +					  current = new Entry;
    +					  current->protection = protection ;
    +					  current->sig = sig;
    +					  current->virt = virt;
    +					  current->stat = gstat;
    +					  current->slot = slot;
    +  					  BEGIN(MemberSpecSkip); 
    +  					}
    +	YY_BREAK
    +case 305:
    +YY_RULE_SETUP
    +#line 2481 "scanner.l"
    +{ // the [] part could be improved.
    +  					  lineCount();
    +  					  int i=0,l=yyleng,j;
    +					  while (iname.isEmpty())
    +					   /* && (current->section & Entry::COMPOUND_MASK)) */
    +					  { 
    +					    // see if the compound does not have a name or is inside another
    +					    // annonymous compound. If so we insert a 
    +					    // special `annonymous' variable.
    +					    Entry *p=current_root;
    +					    while (p)
    +					    {
    +					      // only look for class scopes, not namespace scopes
    +					      if (p->section & Entry::COMPOUND_MASK)
    +					      {
    +						//printf("Trying scope `%s'\n",p->name.data());
    +						int i=p->name.findRev("::");
    +						int pi = (i==-1) ? 0 : i+2;
    +						if (p->name.at(pi)=='@')
    +						{
    +						  // annonymous compound inside -> insert dummy variable name
    +						  //printf("Adding annonymous variable for scope %s\n",p->name.data());
    +						  msName.sprintf("@%d",anonCount++); 
    +						  break;
    +						}
    +					      }
    +					      p=p->parent;
    +					    }
    +					  }
    +					  if (!msName.isEmpty())
    +					  {
    +  					    Entry *varEntry=new Entry;
    +					    varEntry->protection = current->protection ;
    +					    varEntry->sig = current->sig;
    +					    varEntry->virt = current->virt;
    +					    varEntry->stat = current->stat;
    +					    varEntry->slot = current->slot;
    +					    varEntry->section = Entry::VARIABLE_SEC;
    +					    varEntry->name = msName.stripWhiteSpace();
    +					    varEntry->type = current->type.simplifyWhiteSpace()+" ";
    +					    varEntry->args = msArgs; //current->args.simplifyWhiteSpace();
    +					    //if (current->name.length()>0 && current->name[0]!='@' && 
    +					    //    current->parent->section & Entry::COMPOUND_MASK)
    +					    //  varEntry->type+=current->parent->name+"::";
    +					    if (isTypedef)
    +					      varEntry->type.prepend("typedef ");
    +					    varEntry->type+=current->name+msType;
    +					    varEntry->fileName = yyFileName;
    +					    varEntry->startLine = yyLineNr;
    +					    varEntry->doc = current->doc.copy();
    +					    varEntry->brief = current->brief.copy();
    +					    //printf("Add: type=`%s',name=`%s',args=`%s'\n",
    +					    //      varEntry->type.data(),varEntry->name.data(),varEntry->args.data());
    +					    current_root->addSubEntry(varEntry);
    +					  }
    +					  if (*yytext==';')
    +					  {
    +					    msType.resize(0);
    +					    msName.resize(0);
    +					    msArgs.resize(0);
    +					    isTypedef=FALSE;
    +					    current->reset();
    +					    current->protection = protection ;
    +					    current->sig = sig;
    +					    current->virt = virt;
    +					    current->stat = gstat;
    +					    current->slot = slot;
    +					    BEGIN( FindMembers );
    +					  }
    +  					}					
    +	YY_BREAK
    +case 307:
    +YY_RULE_SETUP
    +#line 2563 "scanner.l"
    +{ BEGIN(MemberSpecSkip); }
    +	YY_BREAK
    +case 308:
    +YY_RULE_SETUP
    +#line 2564 "scanner.l"
    +{
    +  					  bracketCount=0;
    +					  lastCurlyContext = MemberSpecSkip;
    +					  previous = current;
    +  					  BEGIN(SkipCurly);
    +  					}
    +	YY_BREAK
    +case 309:
    +YY_RULE_SETUP
    +#line 2570 "scanner.l"
    +{ BEGIN(MemberSpec); }
    +	YY_BREAK
    +case 310:
    +YY_RULE_SETUP
    +#line 2571 "scanner.l"
    +{ unput(';'); BEGIN(MemberSpec); }
    +	YY_BREAK
    +case 311:
    +YY_RULE_SETUP
    +#line 2572 "scanner.l"
    +{ current->program += yytext ;
    +					  lineCount() ;
    +					}
    +	YY_BREAK
    +case 312:
    +YY_RULE_SETUP
    +#line 2575 "scanner.l"
    +{ current->program += yytext ; }
    +	YY_BREAK
    +case 313:
    +YY_RULE_SETUP
    +#line 2577 "scanner.l"
    +{
    +  					  current->bodyLine = yyLineNr;
    +  					  lineCount();
    +  					  addType(current);
    +					  funcPtrType=yytext;
    +					  //current->type += yytext;
    +					  BEGIN( FuncPtr );
    +  					}
    +	YY_BREAK
    +case 314:
    +YY_RULE_SETUP
    +#line 2585 "scanner.l"
    +{
    +  					  current->name = yytext;
    +					  BEGIN( EndFuncPtr );
    +  					}
    +	YY_BREAK
    +case 315:
    +YY_RULE_SETUP
    +#line 2589 "scanner.l"
    +{
    +  					  //printf("Error: FuncPtr `%c' unexpected at line %d of %s\n",*yytext,yyLineNr,yyFileName);
    +  					}
    +	YY_BREAK
    +case 316:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 2592 "scanner.l"
    +{ // a variable with extra braces
    + 					  lineCount();
    +					  current->type+=funcPtrType.data()+1;
    +  					  BEGIN(FindMembers);
    +  					}
    +	YY_BREAK
    +case 317:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 2597 "scanner.l"
    +{ // a variable function
    +  					  lineCount();
    +					  current->type+=funcPtrType+")";
    +					  BEGIN(FindMembers);
    +  					}
    +	YY_BREAK
    +case 318:
    +YY_RULE_SETUP
    +#line 2602 "scanner.l"
    +{ // a function returning a function
    +  					  current->args += *yytext ;
    +					  bracketCount=0;
    +					  BEGIN( FuncFunc );
    +  					}
    +	YY_BREAK
    +case 319:
    +YY_RULE_SETUP
    +#line 2607 "scanner.l"
    +{
    +  					  BEGIN(FindMembers);
    +  					}
    +	YY_BREAK
    +case 320:
    +YY_RULE_SETUP
    +#line 2610 "scanner.l"
    +{
    +  					  current->args += *yytext ;
    +  					  ++bracketCount;
    +					}
    +	YY_BREAK
    +case 321:
    +YY_RULE_SETUP
    +#line 2614 "scanner.l"
    +{
    +  					  current->args += *yytext ;
    +  					  if ( bracketCount )
    +					    --bracketCount;
    +					  else
    +					  {
    +					    BEGIN(FuncFuncEnd);
    +					  }
    +  					}
    +	YY_BREAK
    +case 322:
    +YY_RULE_SETUP
    +#line 2623 "scanner.l"
    +{
    +  					  lineCount();
    +					  current->type+=funcPtrType+")(";
    +					  BEGIN(FuncFuncType);
    +  					}
    +	YY_BREAK
    +case 323:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 2628 "scanner.l"
    +{
    +  					  lineCount();
    +					  current->type+=funcPtrType.data()+1;
    +  					  BEGIN(Function);
    +  					}
    +	YY_BREAK
    +case 324:
    +YY_RULE_SETUP
    +#line 2633 "scanner.l"
    +{
    +  					  current->args += *yytext;
    +  					}
    +	YY_BREAK
    +case 325:
    +YY_RULE_SETUP
    +#line 2636 "scanner.l"
    +{
    +  					  current->type += *yytext;
    +					  bracketCount++;
    +  					}
    +	YY_BREAK
    +case 326:
    +YY_RULE_SETUP
    +#line 2640 "scanner.l"
    +{
    +  					  current->type += *yytext;
    +  					  if (bracketCount)
    +					    --bracketCount;
    +					  else
    +					    BEGIN(Function);
    +					}
    +	YY_BREAK
    +case 327:
    +YY_RULE_SETUP
    +#line 2647 "scanner.l"
    +{ lineCount() ; current->type += ", " ; }
    +	YY_BREAK
    +case 328:
    +YY_RULE_SETUP
    +#line 2648 "scanner.l"
    +{ lineCount() ; current->type += ' ' ; }
    +	YY_BREAK
    +case 329:
    +YY_RULE_SETUP
    +#line 2649 "scanner.l"
    +{
    +  					  current->type += *yytext;
    +  					}
    +	YY_BREAK
    +case 330:
    +YY_RULE_SETUP
    +#line 2652 "scanner.l"
    +{ current->args = yytext;
    +  					  current->bodyLine = yyLineNr;
    +					  currentArgumentContext = FuncQual;
    +					  copyArgString=¤t->args;
    +					  BEGIN( ReadFuncArgType ) ;
    +					  //printf(">>> Read function arguments!\n");
    +					}
    +	YY_BREAK
    +/*
    +"("{BN}*("void"{BN}*)?")"	{
    +  					  lineCount();
    +  					  current->args = "()"; 
    +  					  BEGIN( FuncQual );
    +  					}
    +  */
    +/*- Function argument reading rules ---------------------------------------*/
    +case 331:
    +YY_RULE_SETUP
    +#line 2669 "scanner.l"
    +{ *copyArgString+=yytext; }
    +	YY_BREAK
    +case 332:
    +YY_RULE_SETUP
    +#line 2670 "scanner.l"
    +{ *copyArgString+=yytext; }
    +	YY_BREAK
    +case 333:
    +YY_RULE_SETUP
    +#line 2671 "scanner.l"
    +{ *copyArgString+=yytext; }
    +	YY_BREAK
    +case 334:
    +YY_RULE_SETUP
    +#line 2672 "scanner.l"
    +{
    +  					  *copyArgString+=" ";
    +  					  lineCount();
    +  					}
    +	YY_BREAK
    +case 335:
    +YY_RULE_SETUP
    +#line 2676 "scanner.l"
    +{
    +  					  *copyArgString+=*yytext;
    +					  lastCopyArgStringContext = YY_START;
    +  					  BEGIN( CopyArgString );
    +  					}
    +	YY_BREAK
    +case 336:
    +YY_RULE_SETUP
    +#line 2681 "scanner.l"
    +{
    +  					  *copyArgString+=*yytext;
    +  					  argRoundCount=0; 
    +					  lastCopyArgContext = YY_START;
    +					  BEGIN( CopyArgRound ); 
    +  					}
    +	YY_BREAK
    +case 337:
    +YY_RULE_SETUP
    +#line 2687 "scanner.l"
    +{ 
    +  					  *copyArgString+=*yytext;
    +					  stringToArgumentList(*copyArgString,current->argList);
    +					  BEGIN( currentArgumentContext );
    +					}
    +	YY_BREAK
    +case 338:
    +YY_RULE_SETUP
    +#line 2692 "scanner.l"
    +{
    +					  *copyArgString+=*yytext;
    +					  argSharpCount=0;
    +					  BEGIN( CopyArgSharp );
    +					}
    +	YY_BREAK
    +case 339:
    +YY_RULE_SETUP
    +#line 2697 "scanner.l"
    +{
    +					  *copyArgString+=*yytext;
    +					  //printf("end template list %s\n",copyArgString->data());
    +					  stringToArgumentList(*copyArgString,currentArgumentList);
    +					  BEGIN( currentArgumentContext );
    +					}
    +	YY_BREAK
    +case 340:
    +YY_RULE_SETUP
    +#line 2703 "scanner.l"
    +{
    +  					  argRoundCount++;
    +					  *copyArgString+=*yytext;
    +  					}
    +	YY_BREAK
    +case 341:
    +YY_RULE_SETUP
    +#line 2707 "scanner.l"
    +{
    +					  *copyArgString+=*yytext;
    +					  if (argRoundCount>0) 
    +					    argRoundCount--;
    +					  else 
    +					    BEGIN( lastCopyArgContext );
    +  					}
    +	YY_BREAK
    +case 342:
    +YY_RULE_SETUP
    +#line 2714 "scanner.l"
    +{
    +  					  argSharpCount++;
    +					  *copyArgString+=*yytext;
    +  					}
    +	YY_BREAK
    +case 343:
    +YY_RULE_SETUP
    +#line 2718 "scanner.l"
    +{
    +  					  *copyArgString+=*yytext;
    +					  if (argRoundCount>0)
    +					    argRoundCount--;
    +					  else
    +					    BEGIN( ReadTempArgs );
    +  					}
    +	YY_BREAK
    +case 344:
    +YY_RULE_SETUP
    +#line 2725 "scanner.l"
    +{
    +  					  *copyArgString+=yytext;
    +  					}
    +	YY_BREAK
    +case 345:
    +YY_RULE_SETUP
    +#line 2728 "scanner.l"
    +{
    +  					  *copyArgString+=*yytext;
    +					  BEGIN( lastCopyArgStringContext );
    +  					}
    +	YY_BREAK
    +case 346:
    +YY_RULE_SETUP
    +#line 2732 "scanner.l"
    +{ *copyArgString+=yytext; }
    +	YY_BREAK
    +case 347:
    +YY_RULE_SETUP
    +#line 2733 "scanner.l"
    +{ *copyArgString+=yytext; }
    +	YY_BREAK
    +case 348:
    +YY_RULE_SETUP
    +#line 2734 "scanner.l"
    +{ *copyArgString+=yytext; }
    +	YY_BREAK
    +case 349:
    +YY_RULE_SETUP
    +#line 2735 "scanner.l"
    +{ yyLineNr++; *copyArgString+=*yytext; }
    +	YY_BREAK
    +case 350:
    +YY_RULE_SETUP
    +#line 2736 "scanner.l"
    +{ *copyArgString+=*yytext; }
    +	YY_BREAK
    +/*------------------------------------------------------------------------*/
    +case 351:
    +YY_RULE_SETUP
    +#line 2743 "scanner.l"
    +{ current->args += *yytext ;
    +					  ++bracketCount ;
    +					}
    +	YY_BREAK
    +case 352:
    +YY_RULE_SETUP
    +#line 2746 "scanner.l"
    +{ current->args += *yytext ; 
    +					  if ( bracketCount )
    +					    --bracketCount ;
    +				          else
    +					    BEGIN( FuncQual ) ;
    +					}
    +	YY_BREAK
    +/*
    +"#"				{ lastCPPContext = YY_START;
    +  					  BEGIN(SkipCPP);
    +					}
    +  */
    +case 353:
    +YY_RULE_SETUP
    +#line 2757 "scanner.l"
    +{ unput(*yytext); BEGIN( Function ); }
    +	YY_BREAK
    +case 354:
    +YY_RULE_SETUP
    +#line 2758 "scanner.l"
    +{ 
    +  					  lineCount() ; 
    +  					  current->args += " const "; 
    +					  current->argList->constSpecifier=TRUE;
    +					}
    +	YY_BREAK
    +case 355:
    +YY_RULE_SETUP
    +#line 2763 "scanner.l"
    +{ 
    +  					  lineCount() ; 
    +  					  current->args += " volatile "; 
    +					  current->argList->volatileSpecifier=TRUE;
    +					}
    +	YY_BREAK
    +case 356:
    +YY_RULE_SETUP
    +#line 2768 "scanner.l"
    +{ 
    +  					  lineCount() ; 
    +					  current->args += " = 0"; 
    +					  current->virt = Pure; 
    +					  current->argList->pureSpecifier=TRUE;
    +					}
    +	YY_BREAK
    +case 357:
    +YY_RULE_SETUP
    +#line 2774 "scanner.l"
    +{ 
    +  					  lineCount() ; 
    +					  current->args += ", " ; 
    +					}
    +	YY_BREAK
    +case 358:
    +YY_RULE_SETUP
    +#line 2778 "scanner.l"
    +{ 
    +  					  lineCount() ; 
    +					  current->args += ' ' ; 
    +					}
    +	YY_BREAK
    +case 359:
    +YY_RULE_SETUP
    +#line 2782 "scanner.l"
    +{ current->args += *yytext; }
    +	YY_BREAK
    +case 360:
    +YY_RULE_SETUP
    +#line 2783 "scanner.l"
    +{ 
    +  					  current->exception = " throw(" ;
    +					  lineCount() ;
    +					  BEGIN( ExcpRound ) ;
    +					}
    +	YY_BREAK
    +case 361:
    +YY_RULE_SETUP
    +#line 2788 "scanner.l"
    +{
    +  					  current->exception = " raises(" ;
    +					  lineCount() ;
    +					  BEGIN( ExcpRound ) ;
    +  					}
    +	YY_BREAK
    +case 362:
    +YY_RULE_SETUP
    +#line 2793 "scanner.l"
    +{ current->exception += *yytext ;
    +					  ++bracketCount ;
    +					}
    +	YY_BREAK
    +case 363:
    +YY_RULE_SETUP
    +#line 2796 "scanner.l"
    +{ current->exception += *yytext ; 
    +					  if ( bracketCount )
    +					    --bracketCount ;
    +				          else
    +					    BEGIN( FuncQual ) ;
    +					}
    +	YY_BREAK
    +case 364:
    +YY_RULE_SETUP
    +#line 2802 "scanner.l"
    +{
    +  					  current->exception += yytext;
    +  					}
    +	YY_BREAK
    +case 365:
    +YY_RULE_SETUP
    +#line 2805 "scanner.l"
    +{ current->type += current->name ;
    +					  current->name  = current->args ;
    +					  current->args  = yytext ;
    +					  BEGIN( FuncRound ) ;
    +					}
    +	YY_BREAK
    +case 366:
    +YY_RULE_SETUP
    +#line 2810 "scanner.l"
    +{ lastCPPContext = YY_START;
    +  					  BEGIN(SkipCPP);
    +					}	
    +	YY_BREAK
    +case 367:
    +YY_RULE_SETUP
    +#line 2813 "scanner.l"
    +{ 
    +					  current->name=current->name.simplifyWhiteSpace();
    +  					  current->type=current->type.simplifyWhiteSpace();
    +  					  current->args=current->args.simplifyWhiteSpace();
    +					  QCString &cn=current->name;
    +					  QCString &rn=current_root->name;
    +					  //printf("current_root->name=`%s'\n",rn.data());
    +  					  //printf("Function: `%s' `%s' `%s'\n",current->type.data(),cn.data(),current->args.data());
    +					  int i;
    +					  if ((i=cn.findRev("::"))!=-1) // name contains scope
    +					  {
    +					    if (cn.left(i)==rn.right(i)) // scope name is redundant
    +					    {
    +                                              cn=cn.right(cn.length()-i-2); // strip scope
    +					      //printf("new name=`%s'\n",cn.data());
    +					    }
    +					  }
    +					  //if (cname.left(current_root->name.length()+2)==current_root->name+"::") 
    +					  //{ // strip redundant scope
    +					  //  current->name=current->name.right(current->name.length()-current_root->name.length()-2);
    +					  //  printf("new name=`%s'\n",current->name.data());
    +					  //}
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  if (*yytext!=';' || (current_root->section&Entry::SCOPE_MASK) )
    +					  {
    +					    int tempArg=current->name.find('<');
    +					    QCString tempName;
    +					    if (tempArg==-1) 
    +					      tempName=current->name;
    +					    else
    +					      tempName=current->name.left(tempArg);
    +					    if (current->type.isNull() && tempName.find("operator")==-1 && 
    +						(tempName.find('*')!=-1 || tempName.find('&')!=-1))
    +					    {
    +					      //printf("Scanner.l: found in class variable: `%s' `%s' `%s'\n",
    +					      //   current->type.data(),current->name.data(),current->args.data());
    +					      current->section = Entry::VARIABLE_SEC ;
    +					    }
    +					    else	      
    +					    {
    +					      //printf("Scanner.l: found in class function: `%s' `%s' `%s'\n",
    +					      //   current->type.data(),current->name.data(),current->args.data());
    +					      current->section = Entry::FUNCTION_SEC ;
    +					    }
    +					  }
    +					  else // a global function prototype or function variable
    +					  {
    +					    //printf("Scanner.l: prototype? type=`%s' name=`%s' args=`%s'\n",current->type.data(),current->name.data(),current->args.data());
    +					    QRegExp re("([^)]*)");
    +					    if (!current->type.isNull() && 
    +						(current->type.find(re,0)!=-1 || current->type.left(8)=="typedef "))
    +					    {
    +					      //printf("Scanner.l: found function variable!\n");
    +					      current->section = Entry::VARIABLE_SEC;
    +					    }
    +					    else
    +					    {
    +					      //printf("Scanner.l: found prototype\n");
    +  					      current->section = Entry::FUNCTION_SEC;
    +					      current->proto = TRUE;
    +					    }
    +					  }
    +					  //printf("Adding entry `%s' inLine`%d' bodyLine=`%d'\n",
    +					  //    current->name.data(),current->inLine,current->bodyLine);
    +					  previous = current;
    +					  current_root->addSubEntry(current);
    +					  current = new Entry ;
    +					  current->protection = protection;
    +				          current->sig = sig;
    +					  current->virt = virt;
    +					  current->stat = gstat;
    +					  current->slot = slot;
    +					  current->mGrpId = memberGroupId;
    +					  lastCurlyContext = FindMembers;
    +					  if( *yytext == '{' )
    +					  {
    +					    if (current_root->section & Entry::COMPOUND_MASK)
    +					      previous->inLine = TRUE;
    +					    //addToBody(yytext);
    +					    BEGIN( SkipCurly ) ;
    +					  }
    +					  else if( *yytext == ':' )
    +					  {
    +					    //addToBody(yytext);
    +					    BEGIN( SkipInits ) ;
    +					  }
    +					  else
    +					  {
    +					    if (previous->section!=Entry::VARIABLE_SEC)
    +					      previous->bodyLine=-1; // a function/member declaration
    +					    BEGIN( FindMembers ) ;
    +					  }
    +					}
    +	YY_BREAK
    +case 368:
    +YY_RULE_SETUP
    +#line 2908 "scanner.l"
    +{ 
    +  				          //addToBody(yytext);
    +  				          lastCurlyContext = FindMembers;
    +  					  BEGIN( SkipCurly ) ; 
    +					}
    +	YY_BREAK
    +case 369:
    +YY_RULE_SETUP
    +#line 2913 "scanner.l"
    +{ 
    +  				          //addToBody(yytext);
    +  					  ++bracketCount ; 
    +					}
    +	YY_BREAK
    +case 370:
    +YY_RULE_SETUP
    +#line 2917 "scanner.l"
    +{ 
    +  				          //addToBody(yytext);
    +  					  if( bracketCount )
    +					    --bracketCount ;
    +					  else
    +					    BEGIN( lastCurlyContext ) ;
    +					}
    +	YY_BREAK
    +case 371:
    +YY_RULE_SETUP
    +#line 2924 "scanner.l"
    +{ 
    +  					  if ( bracketCount )
    +					  {
    +					    //addToBody(yytext);
    +					    --bracketCount ;
    +					  }
    +					  else
    +					  {
    +					    lineCount();
    +					    tempEntry = current; // temporarily switch to the previous entry
    +					    current = previous;
    +					    current->doc.resize(0);
    +					    current->brief.resize(0);
    +					    lastAfterDocContext = SkipCurlyEndDoc;
    +					    afterDocTerminator = '}';
    +					    if (yytext[yyleng-3]=='/')
    +					      BEGIN(AfterDocLine);
    +					    else if (yytext[yyleng-2]=='*' && Config::autoBriefFlag)
    +					      BEGIN(AfterDocBrief);
    +					    else
    +					      BEGIN(AfterDoc);
    +					  }
    +					}
    +	YY_BREAK
    +case 372:
    +YY_RULE_SETUP
    +#line 2947 "scanner.l"
    +{
    +  				          //addToBody("}");
    +					  current = tempEntry;
    +  					  BEGIN( lastCurlyContext );
    +  					}
    +	YY_BREAK
    +case 373:
    +YY_RULE_SETUP
    +#line 2952 "scanner.l"
    +{
    +  				          //addToBody(yytext);
    +  					}
    +	YY_BREAK
    +case 374:
    +YY_RULE_SETUP
    +#line 2955 "scanner.l"
    +{
    +  				          //addToBody(yytext);
    +  					}
    +	YY_BREAK
    +case 375:
    +YY_RULE_SETUP
    +#line 2958 "scanner.l"
    +{
    +  				          //addToBody(yytext);
    +  					}
    +	YY_BREAK
    +case 376:
    +YY_RULE_SETUP
    +#line 2961 "scanner.l"
    +{ 
    +  				          //addToBody(yytext);
    +  					  lastStringContext=SkipCurly;
    +  				          BEGIN( SkipString ); 
    +					}
    +	YY_BREAK
    +case 377:
    +YY_RULE_SETUP
    +#line 2966 "scanner.l"
    +{ 
    +  				          //addToBody(yytext);
    +  					  BEGIN( SkipCurlyCpp ); 
    +					}
    +	YY_BREAK
    +case 378:
    +YY_RULE_SETUP
    +#line 2970 "scanner.l"
    +{
    +  					  yyLineNr++;
    +  				          //addToBody(yytext);
    +  					}
    +	YY_BREAK
    +case 379:
    +YY_RULE_SETUP
    +#line 2974 "scanner.l"
    +{
    +  				          //addToBody(yytext);
    +  					}
    +	YY_BREAK
    +case 380:
    +YY_RULE_SETUP
    +#line 2977 "scanner.l"
    +{ 
    +  				          //addToBody(yytext);
    +  					  yyLineNr++; 
    +  					  lastCurlyContext = FindMembers;
    +  					  BEGIN( SkipCurly ); 
    +					}
    +	YY_BREAK
    +case 381:
    +YY_RULE_SETUP
    +#line 2983 "scanner.l"
    +{ 
    +  				          //addToBody(yytext);
    +  					  yyLineNr++; 
    +					}
    +	YY_BREAK
    +case 382:
    +YY_RULE_SETUP
    +#line 2987 "scanner.l"
    +{
    +  				          //addToBody(yytext);
    +  					}
    +	YY_BREAK
    +case 383:
    +YY_RULE_SETUP
    +#line 2990 "scanner.l"
    +{
    +  				          //addToBody(yytext);
    +  					}
    +	YY_BREAK
    +case 384:
    +YY_RULE_SETUP
    +#line 2993 "scanner.l"
    +{
    +  				          //addToBody(yytext);
    +  					}
    +	YY_BREAK
    +case 385:
    +YY_RULE_SETUP
    +#line 2996 "scanner.l"
    +{
    +  				          //addToBody(yytext);
    +  					}
    +	YY_BREAK
    +case 386:
    +YY_RULE_SETUP
    +#line 2999 "scanner.l"
    +{
    +  				          //addToBodyCond(yytext);
    +  					}
    +	YY_BREAK
    +case 387:
    +YY_RULE_SETUP
    +#line 3002 "scanner.l"
    +{ 
    +  				          //addToBodyCond(yytext);
    +  					  BEGIN( lastStringContext ); 
    +					}
    +	YY_BREAK
    +case 388:
    +YY_RULE_SETUP
    +#line 3006 "scanner.l"
    +{
    +  				          //addToBodyCond(yytext);
    +  					}
    +	YY_BREAK
    +case 389:
    +YY_RULE_SETUP
    +#line 3009 "scanner.l"
    +{
    +  					  yyLineNr++;
    +  				          //addToBodyCond(yytext);
    +  					}
    +	YY_BREAK
    +case 390:
    +YY_RULE_SETUP
    +#line 3013 "scanner.l"
    +{
    +  				          //addToBodyCond(yytext);
    +  					}
    +	YY_BREAK
    +case 391:
    +YY_RULE_SETUP
    +#line 3016 "scanner.l"
    +{ 
    +					  current->section = Entry::EMPTY_SEC ;
    +					  current->type.resize(0) ;
    +					  current->name.resize(0) ;
    +					  current->args.resize(0) ;
    +					  current->argList->clear();
    +					  BEGIN( FindMembers ) ;
    +					}
    +	YY_BREAK
    +case 392:
    +YY_RULE_SETUP
    +#line 3024 "scanner.l"
    +{ 
    +					  current->name = yytext ;
    +					  lineCount();
    +					  BEGIN( ClassVar );
    +					}
    +	YY_BREAK
    +/*
    +{ID}/{BN}*"{"			{ // we probably got some M$ extension
    +  					  current->name = yytext ;
    +  					}
    +{ID}/{BN}*":"			{ // we probably got some M$ extension
    +  					  current->name = yytext ;
    +  					}
    +  */
    +case 393:
    +YY_RULE_SETUP
    +#line 3037 "scanner.l"
    +{
    +					  if (isTypedef)
    +					  {
    +					    typedefDict.insert(yytext,new QCString(current->name));
    +					    current->type.prepend("typedef ");
    +					  }
    +  					  current->type += ' ' ;
    +					  current->type += current->name ;
    +					  current->name = yytext ;
    +					  //BEGIN( FindMembers );
    +  					}
    +	YY_BREAK
    +case 394:
    +YY_RULE_SETUP
    +#line 3048 "scanner.l"
    +{
    +                                          // probably a function anyway
    +                                          unput('(');
    +					  BEGIN( FindMembers );
    +					}
    +	YY_BREAK
    +case 395:
    +YY_RULE_SETUP
    +#line 3053 "scanner.l"
    +{ 
    +  					  current->type.resize(0);
    +					  if (current->section == Entry::INTERFACE_SEC)
    +					    baseProt=Public;
    +					  else  
    +					    baseProt=Private;
    +                                          baseVirt=Normal;
    +					  baseName.resize(0);
    +					  BEGIN( BasesProt ) ;
    +					}
    +	YY_BREAK
    +case 396:
    +YY_RULE_SETUP
    +#line 3063 "scanner.l"
    +{
    +    					  unput(*yytext);
    +					  BEGIN( FindMembers );
    +    					}
    +	YY_BREAK
    +case 397:
    +YY_RULE_SETUP
    +#line 3067 "scanner.l"
    +{ current->fileName = yyFileName ;
    +					  current->startLine = yyLineNr ;
    +					  current->name = removeRedundantWhiteSpace(current->name);
    +					  if (current->name.length()==0 && !isTypedef) // anonymous compound
    +					    current->name.sprintf("@%d",anonCount++);
    +					  BEGIN( Curly ) ;
    +					}
    +	YY_BREAK
    +case 398:
    +YY_RULE_SETUP
    +#line 3074 "scanner.l"
    +{ baseVirt = Virtual; }
    +	YY_BREAK
    +case 399:
    +YY_RULE_SETUP
    +#line 3075 "scanner.l"
    +{ baseProt = Public; }
    +	YY_BREAK
    +case 400:
    +YY_RULE_SETUP
    +#line 3076 "scanner.l"
    +{ baseProt = Protected; }
    +	YY_BREAK
    +case 401:
    +YY_RULE_SETUP
    +#line 3077 "scanner.l"
    +{ baseProt = Private; }
    +	YY_BREAK
    +case 402:
    +YY_RULE_SETUP
    +#line 3078 "scanner.l"
    +{}
    +	YY_BREAK
    +case 403:
    +YY_RULE_SETUP
    +#line 3079 "scanner.l"
    +{ unput(*yytext); BEGIN(Bases); }
    +	YY_BREAK
    +case 404:
    +YY_RULE_SETUP
    +#line 3080 "scanner.l"
    +{ 
    +  					  //current->extends->append(
    +					  //  new BaseInfo(yytext,baseProt,baseVirt)
    +					  //) ;
    +  					  if (*yytext != ':')
    +  					    baseName += yytext;
    +					  else
    +					    baseName += (yytext+2);
    +					  current->args += ' ';
    +					  if (*yytext != ':')
    +					    current->args += yytext;
    +					  else
    +					    current->args += (yytext+2);
    +					}
    +	YY_BREAK
    +case 405:
    +YY_RULE_SETUP
    +#line 3094 "scanner.l"
    +{ current->name += *yytext;
    +  					  sharpCount=1; 
    +					  lastSkipSharpContext = YY_START;
    +					  specName = ¤t->name;
    +					  BEGIN ( Specialization );
    +					}
    +	YY_BREAK
    +case 406:
    +YY_RULE_SETUP
    +#line 3100 "scanner.l"
    +{ baseName += *yytext;
    +  					  sharpCount=1; 
    +					  lastSkipSharpContext = YY_START;
    +					  specName = &baseName;
    +					  BEGIN ( Specialization );
    +					}
    +	YY_BREAK
    +case 407:
    +YY_RULE_SETUP
    +#line 3106 "scanner.l"
    +{ *specName += *yytext;
    +  					  sharpCount++;
    +  					}
    +	YY_BREAK
    +case 408:
    +YY_RULE_SETUP
    +#line 3109 "scanner.l"
    +{
    +  					  *specName += *yytext;
    +  					  if (--sharpCount<=0)
    +					    BEGIN(lastSkipSharpContext);
    +  					}
    +	YY_BREAK
    +case 409:
    +YY_RULE_SETUP
    +#line 3114 "scanner.l"
    +{ lineCount(); *specName +=' '; }
    +	YY_BREAK
    +case 410:
    +YY_RULE_SETUP
    +#line 3115 "scanner.l"
    +{
    +  					  *specName += *yytext;
    +  					}
    +	YY_BREAK
    +case 411:
    +YY_RULE_SETUP
    +#line 3118 "scanner.l"
    +{ ++sharpCount; }
    +	YY_BREAK
    +case 412:
    +YY_RULE_SETUP
    +#line 3119 "scanner.l"
    +{ if (--sharpCount<=0)
    +					    BEGIN ( lastSkipSharpContext );
    +					}
    +	YY_BREAK
    +case 413:
    +YY_RULE_SETUP
    +#line 3122 "scanner.l"
    +{ ++roundCount; }
    +	YY_BREAK
    +case 414:
    +YY_RULE_SETUP
    +#line 3123 "scanner.l"
    +{ if (--roundCount<=0)
    +					    BEGIN ( lastSkipRoundContext );
    +					}
    +	YY_BREAK
    +case 415:
    +YY_RULE_SETUP
    +#line 3126 "scanner.l"
    +{ current->args += ',' ; 
    +					  current->name = removeRedundantWhiteSpace(current->name);
    +  					  if (baseName.length()>0)
    +  					    current->extends->append(
    +					      new BaseInfo(baseName,baseProt,baseVirt)
    +					    );
    +					  baseProt=Private;
    +					  baseVirt=Normal;
    +					  baseName.resize(0);
    +					  BEGIN(BasesProt);
    +					}
    +	YY_BREAK
    +case 416:
    +YY_RULE_SETUP
    +#line 3137 "scanner.l"
    +{ current->fileName = yyFileName ;
    +					  current->startLine = yyLineNr ;
    +					  current->name = removeRedundantWhiteSpace(current->name);
    +  					  if (baseName.length()>0)
    +  					    current->extends->append(
    +					      new BaseInfo(baseName,baseProt,baseVirt)
    +					    );
    +					  BEGIN( Curly ) ;
    +					}
    +	YY_BREAK
    +case 417:
    +YY_RULE_SETUP
    +#line 3146 "scanner.l"
    +{ current->program += yytext ;
    +					  lineCount() ;
    +					}
    +	YY_BREAK
    +case 418:
    +YY_RULE_SETUP
    +#line 3149 "scanner.l"
    +{ current->program += yytext ; } 
    +	YY_BREAK
    +case 419:
    +YY_RULE_SETUP
    +#line 3150 "scanner.l"
    +{ current->program += yytext ; }
    +	YY_BREAK
    +case 420:
    +YY_RULE_SETUP
    +#line 3151 "scanner.l"
    +{ current->program += yytext ; }
    +	YY_BREAK
    +case 421:
    +YY_RULE_SETUP
    +#line 3152 "scanner.l"
    +{ current->program += yytext ;
    +					  BEGIN( Curly ) ;
    +					}
    +	YY_BREAK
    +case 422:
    +YY_RULE_SETUP
    +#line 3155 "scanner.l"
    +{ current->program += *yytext ; }
    +	YY_BREAK
    +case 423:
    +YY_RULE_SETUP
    +#line 3157 "scanner.l"
    +{ 
    +  					  //printf("Start doc block at %d\n",yyLineNr);
    +					  removeSlashes=(yytext[1]=='/');
    +					  tmpDocType=-1;
    +					  if (YY_START==Curly)
    +					    current->doc+="\n\n";
    +					  else
    +  					    current->doc.resize(0);
    +					  lastDocContext = YY_START;
    +					  if (current_root->section & Entry::SCOPE_MASK)
    +					    current->inside = current_root->name+"::";
    +					  BEGIN( Doc );
    +					}
    +	YY_BREAK
    +case 424:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3170 "scanner.l"
    +{
    +  					  removeSlashes=(yytext[1]=='/');
    +					  lastDocContext = YY_START;
    +					  if (current_root->section & Entry::SCOPE_MASK)
    +					    current->inside = current_root->name+"::";
    +					  if (!Config::autoBriefFlag) // use the Qt style
    +					  {
    +					    tmpDocType=-1;
    +					    if (YY_START==Curly)
    +					      current->doc+="\n\n";
    +					    else
    +  					      current->doc.resize(0);
    +					    BEGIN( Doc );
    +					  }
    +					  else // Use the javadoc style
    +					  {
    +					    if (YY_START==Curly)
    +					    {
    +					      tmpDocType=-1;
    +					      current->doc+="\n\n";
    +					      lastDocContext = Curly;
    +					      BEGIN( Doc );
    +					    }
    +					    else
    +					    {  
    +					      tmpDocType=Doc;
    +					      current->doc.resize(0);
    +					      current->brief.resize(0);
    +					      BEGIN( JavaDoc );
    +					    }
    +					  }
    +  					}
    +	YY_BREAK
    +case 425:
    +YY_RULE_SETUP
    +#line 3202 "scanner.l"
    +{ 
    +  					  current->brief.resize(0);
    +					  tmpDocType=-1;
    +					  lastDocContext = YY_START;
    +					  if (current_root->section & Entry::SCOPE_MASK)
    +					    current->inside = current_root->name+"::";
    +					  BEGIN( LineDoc );
    +					}
    +	YY_BREAK
    +case 426:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp = yy_bp + 3;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3210 "scanner.l"
    +{ 
    +  					  current->brief.resize(0);
    +					  tmpDocType=-1;
    +					  lastDocContext = YY_START;
    +					  if (current_root->section & Entry::SCOPE_MASK)
    +					    current->inside = current_root->name+"::";
    +					  BEGIN( LineDoc );
    +					}
    +	YY_BREAK
    +case 427:
    +YY_RULE_SETUP
    +#line 3218 "scanner.l"
    +
    +	YY_BREAK
    +case 428:
    +YY_RULE_SETUP
    +#line 3219 "scanner.l"
    +{
    +  					  current->type.resize(0);
    +  					  current->name.resize(0);
    +  					  current->args.resize(0);
    +					  current->argList->clear();
    +					  bracketCount=0;
    +					  BEGIN( SkipCurlyBlock );
    +					  	
    +  					}
    +	YY_BREAK
    +case 429:
    +YY_RULE_SETUP
    +#line 3228 "scanner.l"
    +{
    +  					  lastBriefContext=Doc;
    +  					  BEGIN( ClassDocBrief ); 
    +					}
    +	YY_BREAK
    +case 430:
    +YY_RULE_SETUP
    +#line 3232 "scanner.l"
    +{
    +  					  lastBriefContext=tmpDocType;
    +  					  BEGIN( ClassDocBrief ); 
    +					}
    +	YY_BREAK
    +case 431:
    +YY_RULE_SETUP
    +#line 3236 "scanner.l"
    +{
    +					  lineCount();
    +					  if (!current->brief.stripWhiteSpace().isEmpty())
    +					  {
    +					    BEGIN( tmpDocType );
    +					  }
    + 					} 
    +	YY_BREAK
    +case 432:
    +YY_RULE_SETUP
    +#line 3243 "scanner.l"
    +{
    +  					  unput(*yytext);
    +					  BEGIN(Doc);
    +  					}
    +	YY_BREAK
    +case 433:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3247 "scanner.l"
    +{
    +  					  //printf("---> removing %s\n",yytext);
    +  					}
    +	YY_BREAK
    +/*
    +[^\n\@\*\.\\]+			{
    +  					  current->brief+=yytext;
    +  					}
    +  */
    +case 434:
    +YY_RULE_SETUP
    +#line 3255 "scanner.l"
    +{
    +  				          //printf("---> copy %c\n",*yytext);
    +  					  current->brief+=*yytext;
    +  					}
    +	YY_BREAK
    +case 435:
    +YY_RULE_SETUP
    +#line 3259 "scanner.l"
    +{
    +  					  current->brief+=' ';
    +					  lineCount();
    +  					}
    +	YY_BREAK
    +case 436:
    +YY_RULE_SETUP
    +#line 3263 "scanner.l"
    +{
    +  					  lineCount();
    +					  current->brief+=".";
    +					  BEGIN( tmpDocType );
    +					}
    +	YY_BREAK
    +case 437:
    +YY_RULE_SETUP
    +#line 3268 "scanner.l"
    +{ 
    +  					  current->doc+=yytext;
    +					  BEGIN( tmpDocType );
    +  					}
    +	YY_BREAK
    +case 438:
    +YY_RULE_SETUP
    +#line 3272 "scanner.l"
    +{
    +					  current->section = Entry::MEMBERDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +  					  BEGIN( ClassDocFunc ); 
    +					}
    +	YY_BREAK
    +case 439:
    +YY_RULE_SETUP
    +#line 3278 "scanner.l"
    +{
    +  					  nextDefContext = YY_START==LineDoc ? DefLineDoc : ClassDoc;
    +  					  current->section = Entry::DEFINEDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +  					  BEGIN( ClassDocDefine );
    +  					}
    +	YY_BREAK
    +case 440:
    +YY_RULE_SETUP
    +#line 3285 "scanner.l"
    +{ 
    +  					  overloadContext = YY_START;
    +  					  BEGIN( ClassDocOverload ); 
    +					}
    +	YY_BREAK
    +case 441:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3289 "scanner.l"
    +{
    +					  QCString orgDoc = current->doc;
    +					  current->doc = getOverloadDocs();
    +					  current->doc += "\n\n";
    +					  current->doc += orgDoc;
    +  					  BEGIN( overloadContext  );
    +  				        }
    +	YY_BREAK
    +case 442:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 2;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3296 "scanner.l"
    +{
    +					  QCString orgDoc = current->doc;
    +					  current->doc = getOverloadDocs();
    +					  current->doc += "\n\n";
    +					  current->doc += orgDoc;
    +  					  BEGIN( overloadContext );
    +  					}
    +	YY_BREAK
    +case 443:
    +YY_RULE_SETUP
    +#line 3303 "scanner.l"
    +{ unput(*yytext);
    +  					  current->section = Entry::OVERLOADDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( ClassDocFunc ); 
    +					}
    +	YY_BREAK
    +case 444:
    +YY_RULE_SETUP
    +#line 3309 "scanner.l"
    +{
    +  					  current->section = Entry::ENUMDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( EnumDocArg1 );
    +  					}
    +	YY_BREAK
    +case 445:
    +YY_RULE_SETUP
    +#line 3315 "scanner.l"
    +{
    +  					  current->section = Entry::GROUPDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( GroupDocArg1 );
    +  					}
    +	YY_BREAK
    +case 446:
    +YY_RULE_SETUP
    +#line 3321 "scanner.l"
    +{
    +  					  current->section = Entry::NAMESPACEDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +  					  BEGIN( NameSpaceDocArg1 );
    +  					}
    +	YY_BREAK
    +case 447:
    +YY_RULE_SETUP
    +#line 3327 "scanner.l"
    +{
    +  					  current->section = Entry::CLASSDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( ClassDocArg1 ); 
    +					}
    +	YY_BREAK
    +case 448:
    +YY_RULE_SETUP
    +#line 3333 "scanner.l"
    +{
    +  					  current->section = Entry::UNIONDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( ClassDocArg1 ); 
    +					}
    +	YY_BREAK
    +case 449:
    +YY_RULE_SETUP
    +#line 3339 "scanner.l"
    +{
    +  					  current->section = Entry::STRUCTDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( ClassDocArg1 ); 
    +					}
    +	YY_BREAK
    +case 450:
    +YY_RULE_SETUP
    +#line 3345 "scanner.l"
    +{
    +  					  current->section = Entry::INTERFACEDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( ClassDocArg1 ); 
    +					}
    +	YY_BREAK
    +case 451:
    +YY_RULE_SETUP
    +#line 3351 "scanner.l"
    +{
    +  					  current->section = Entry::PAGEDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( PageDocArg1 );
    +  					}
    +	YY_BREAK
    +case 452:
    +YY_RULE_SETUP
    +#line 3357 "scanner.l"
    +{
    +  					  current->section = Entry::MAINPAGEDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( PageDocArg2 );
    +  					}
    +	YY_BREAK
    +case 453:
    +YY_RULE_SETUP
    +#line 3363 "scanner.l"
    +{
    +  					  current->section = Entry::FILEDOC_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    +					  BEGIN( FileDocArg1 );
    +  					}
    +	YY_BREAK
    +case 454:
    +YY_RULE_SETUP
    +#line 3369 "scanner.l"
    +{
    + 					  current->section = Entry::EXAMPLE_SEC;
    +					  current->fileName = yyFileName;
    +					  current->startLine = yyLineNr;
    + 					  BEGIN( ExampleDocArg1 );
    +					}
    +	YY_BREAK
    +case 455:
    +YY_RULE_SETUP
    +#line 3375 "scanner.l"
    +{
    +				          current->name = stripQuotes(yytext);	
    +					  BEGIN( ExampleDoc );
    +					}
    +	YY_BREAK
    +case 456:
    +YY_RULE_SETUP
    +#line 3379 "scanner.l"
    +{ 
    +  					  lastDocRelContext = YY_START;
    +  					  BEGIN( ClassDocRelates ); 
    +					}
    +	YY_BREAK
    +case 457:
    +YY_RULE_SETUP
    +#line 3383 "scanner.l"
    +{ 
    +  					  current->relates = yytext;
    +					  BEGIN( lastDocRelContext );
    +					}
    +	YY_BREAK
    +case 458:
    +YY_RULE_SETUP
    +#line 3387 "scanner.l"
    +{
    +  					  current->name = yytext;
    +					  newDocState();
    +  					}
    +	YY_BREAK
    +case 459:
    +YY_RULE_SETUP
    +#line 3391 "scanner.l"
    +{
    +  					  warn("Warning: missing argument after "
    +					       "\\namespace at line %d of %s.\n",yyLineNr,yyFileName);
    +  					  yyLineNr++;
    +  					}
    +	YY_BREAK
    +case 460:
    +YY_RULE_SETUP
    +#line 3396 "scanner.l"
    +{
    +					  current->name = yytext;
    +					  // prepend outer scope name 
    +					  if (current_root->section & Entry::SCOPE_MASK)
    +					  {
    +					    current->name.prepend(current_root->name+"::");
    +					  }
    +					  BEGIN( ClassDocArg2 );
    +					}
    +	YY_BREAK
    +case 461:
    +YY_RULE_SETUP
    +#line 3405 "scanner.l"
    +{
    +  					  warn("Warning: missing argument after "
    +					       "\\class at line %d of %s.\n",yyLineNr,yyFileName);
    +  					  yyLineNr++;
    +					  
    +  					}
    +	YY_BREAK
    +case 462:
    +YY_RULE_SETUP
    +#line 3411 "scanner.l"
    +{
    +  					  current->name = yytext;
    +					  if (current->name.right(5)==".html") 
    +					    current->name=current->name.left(current->name.length()-5);
    +					  BEGIN(GroupDocArg2);
    +  					}
    +	YY_BREAK
    +case 463:
    +YY_RULE_SETUP
    +#line 3417 "scanner.l"
    +{
    +  					  warn("Warning: missing argument after "
    +					       "\\defgroup at line %d of %s.\n",yyLineNr,yyFileName);
    +					  yyLineNr++;
    +					  BEGIN( Doc );
    +  					}
    +	YY_BREAK
    +case 464:
    +YY_RULE_SETUP
    +#line 3423 "scanner.l"
    +{
    +					  current->type = yytext;
    +					  current->type = current->type.stripWhiteSpace();
    +					  newDocState();
    +  					}
    +	YY_BREAK
    +case 465:
    +YY_RULE_SETUP
    +#line 3428 "scanner.l"
    +{
    + 					  newDocState();
    +  					}
    +	YY_BREAK
    +case 466:
    +YY_RULE_SETUP
    +#line 3431 "scanner.l"
    +{
    +  					  //printf("ClassDocArg2=%s\n",yytext);
    +					  current->includeFile = stripQuotes(yytext);
    +					  BEGIN( ClassDocArg3 );
    +					}
    +	YY_BREAK
    +case 467:
    +YY_RULE_SETUP
    +#line 3436 "scanner.l"
    +{ yyLineNr++; 
    +					  newDocState();
    +					}
    +	YY_BREAK
    +case 468:
    +YY_RULE_SETUP
    +#line 3439 "scanner.l"
    +{
    +  					  //printf("ClassDocArg3=%s\n",yytext);
    + 					  current->includeName = stripQuotes(yytext);
    +  					  newDocState();
    +					}
    +	YY_BREAK
    +case 469:
    +YY_RULE_SETUP
    +#line 3444 "scanner.l"
    +{ yyLineNr++; 
    +  					  newDocState();
    +					}
    +	YY_BREAK
    +case 470:
    +YY_RULE_SETUP
    +#line 3447 "scanner.l"
    +{
    +  					  current->name = stripQuotes(yytext);
    +					  newDocState();
    +  				        }
    +	YY_BREAK
    +case 471:
    +YY_RULE_SETUP
    +#line 3451 "scanner.l"
    +{
    +  					  current->name = yyFileName;
    +  					  yyLineNr++;
    +					  newDocState();
    +  					}
    +	YY_BREAK
    +case 472:
    +YY_RULE_SETUP
    +#line 3456 "scanner.l"
    +{
    +					  current->name = stripQuotes(yytext);
    +					  BEGIN( PageDocArg2 ); 
    +					}
    +	YY_BREAK
    +case 473:
    +YY_RULE_SETUP
    +#line 3460 "scanner.l"
    +{
    +  					  warn("Warning: missing argument after "
    +					       "\\page at line %d of %s.\n",yyLineNr,yyFileName);
    +  					  yyLineNr++;
    +					  BEGIN( Doc );
    +  					}
    +	YY_BREAK
    +case 474:
    +YY_RULE_SETUP
    +#line 3466 "scanner.l"
    +{
    +  				          yyLineNr++;
    +					  current->args = yytext;
    +					  BEGIN( PageDoc );
    +					}
    +	YY_BREAK
    +case 475:
    +YY_RULE_SETUP
    +#line 3471 "scanner.l"
    +{
    +  					  current->name = yytext;
    +					  if (current_root->section & Entry::SCOPE_MASK)
    +					  {
    +					    current->name.prepend(current_root->name+"::");
    +					  }
    +  					  newDocState();
    +  					}
    +	YY_BREAK
    +case 476:
    +YY_RULE_SETUP
    +#line 3479 "scanner.l"
    +{
    +  					  warn("Warning: missing argument after "
    +					       "\\enum at line %d of %s.\n",yyLineNr,yyFileName);
    +  					  yyLineNr++;
    +					  BEGIN( Doc );
    +  					}
    +	YY_BREAK
    +case 477:
    +YY_RULE_SETUP
    +#line 3485 "scanner.l"
    +{
    +  					  current->doc+=yytext;
    +  					}
    +	YY_BREAK
    +case 478:
    +YY_RULE_SETUP
    +#line 3488 "scanner.l"
    +{
    +  					  sectionType=SectionInfo::Section;
    +  					  BEGIN(SectionLabel);
    +  					}
    +	YY_BREAK
    +case 479:
    +YY_RULE_SETUP
    +#line 3492 "scanner.l"
    +{
    +  					  sectionType=SectionInfo::Subsection;
    +  					  BEGIN(SectionLabel);
    +  					}
    +	YY_BREAK
    +case 480:
    +YY_RULE_SETUP
    +#line 3496 "scanner.l"
    +{
    +  					  //printf("--> mgroup found!\n");
    +  					  lastMemberGroupContext = YY_START;
    +					  if (memberGroupId!=-1)
    +					  {
    +  					    warn("Warning: ignoring nested mgroup command "
    +					         "at line %d of %s. Previous command was found at line %d\n",
    +						 yyLineNr,yyFileName,lastMemberGroupLine);
    +					  }
    +					  else
    +					  {
    +					    memberGroupId   = newMemberGroupId();
    +					    current->mGrpId = memberGroupId;
    +					    lastMemberGroupLine = yyLineNr;
    +					  }
    +					  BEGIN(GroupHeader);
    +  					}
    +	YY_BREAK
    +case 481:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3513 "scanner.l"
    +{
    +  					  //printf("--> endmgroup found!\n");
    +  					  memberGroupId = -1;
    +					  current->mGrpId = -1;
    +  					}
    +	YY_BREAK
    +case 482:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3518 "scanner.l"
    +{
    +					  QCString header = ((QCString)yytext).stripWhiteSpace();
    +  					  memberGroupDict.insert(memberGroupId,
    +					                         new MemberGroup(memberGroupId,header)
    +								);
    +  					  BEGIN(lastMemberGroupContext);
    +  					}
    +	YY_BREAK
    +case 483:
    +YY_RULE_SETUP
    +#line 3525 "scanner.l"
    +{
    +  					  lastAnchorContext = YY_START;
    +  					  sectionType=SectionInfo::Anchor;
    +					  BEGIN(AnchorLabel);
    +  					}
    +	YY_BREAK
    +case 484:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp = yy_bp + 10;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3530 "scanner.l"
    +{
    +					  current->doc+="\\\\verbatim";
    +					}
    +	YY_BREAK
    +case 485:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3533 "scanner.l"
    +{
    +					  lastVerbState=YY_START;
    +					  current->doc+="\\verbatim";
    +  					  BEGIN(SkipVerbatim);
    +  					}
    +	YY_BREAK
    +case 486:
    +YY_RULE_SETUP
    +#line 3538 "scanner.l"
    +{
    +  					  current->doc+=yytext;
    +  					}
    +	YY_BREAK
    +case 487:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp = yy_bp + 6;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3541 "scanner.l"
    +{
    +  					  current->doc+="\\\\code";
    +  					}
    +	YY_BREAK
    +case 488:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3544 "scanner.l"
    +{
    +  					  lastCodeState=YY_START;
    +					  current->doc+="\\code";
    +					  BEGIN(SkipCode);
    +					}
    +	YY_BREAK
    +case 489:
    +YY_RULE_SETUP
    +#line 3549 "scanner.l"
    +{
    +  					  lastCodeState=YY_START;
    +					  current->doc+="
    ";
    +					  BEGIN(SkipCode);
    +  					}
    +	YY_BREAK
    +case 490:
    +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
    +yy_c_buf_p = yy_cp -= 1;
    +YY_DO_BEFORE_ACTION; /* set up yytext again */
    +YY_RULE_SETUP
    +#line 3554 "scanner.l"
    +{
    +  					  current->doc+=yytext;
    +  					  BEGIN(lastVerbState);
    +  					}
    +	YY_BREAK
    +case 491:
    +YY_RULE_SETUP
    +#line 3558 "scanner.l"
    +{
    +  					  current->doc+=yytext;
    +  					}
    +	YY_BREAK
    +case 492:
    +YY_RULE_SETUP
    +#line 3561 "scanner.l"
    +{
    +  					  if (!removeSlashes)
    +					    current->doc+=yytext;
    +  					}
    +	YY_BREAK
    +/*
    +^"//"({B}*"*"+)?		{
    +  					  if (!removeSlashes)
    +					    current->doc+=yytext;
    +  					}
    +^{B}*"*"+			
    +  */
    +case 493:
    +YY_RULE_SETUP
    +#line 3572 "scanner.l"
    +{ 
    +  					  current->doc+=yytext; 
    +  					}
    +	YY_BREAK
    +case 494:
    +YY_RULE_SETUP
    +#line 3575 "scanner.l"
    +{
    +  					  yyLineNr++;
    +					  current->doc+=*yytext;
    +  					}
    +	YY_BREAK
    +case 495:
    +YY_RULE_SETUP
    +#line 3579 "scanner.l"
    +{
    +  					  current->doc+=*yytext;
    +  					}
    +	YY_BREAK
    +case 496:
    +YY_RULE_SETUP
    +#line 3582 "scanner.l"
    +{
    +  					  current->doc+="\\endcode";
    +					  BEGIN(lastCodeState);
    +  					}
    +	YY_BREAK
    +case 497:
    +YY_RULE_SETUP
    +#line 3586 "scanner.l"
    +{
    +  					  current->doc+="
    "; + BEGIN(lastCodeState); + } + YY_BREAK +case 498: +YY_RULE_SETUP +#line 3590 "scanner.l" +{ + if (!removeSlashes) + current->doc+=yytext; + } + YY_BREAK +case 499: +YY_RULE_SETUP +#line 3594 "scanner.l" + + YY_BREAK +case 500: +YY_RULE_SETUP +#line 3595 "scanner.l" +{ + current->doc+=yytext; + } + YY_BREAK +case 501: +YY_RULE_SETUP +#line 3598 "scanner.l" +{ + current->doc+=yytext; + } + YY_BREAK +case 502: +YY_RULE_SETUP +#line 3601 "scanner.l" +{ + yyLineNr++; + current->doc+=*yytext; + } + YY_BREAK +case 503: +YY_RULE_SETUP +#line 3605 "scanner.l" +{ + current->doc+=*yytext; + } + YY_BREAK +case 504: +YY_RULE_SETUP +#line 3608 "scanner.l" +{ + sectionLabel=yytext; + addSection(); + current->doc += "\\anchor "+sectionLabel+"\n"; + BEGIN(lastAnchorContext); + } + YY_BREAK +case 505: +YY_RULE_SETUP +#line 3614 "scanner.l" +{ + sectionLabel=yytext; + sectionTitle.resize(0); + BEGIN(SectionTitle); + } + YY_BREAK +case 506: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 3619 "scanner.l" +{ + sectionTitle+=yytext; + sectionTitle=sectionTitle.stripWhiteSpace(); + addSection(); + current->doc += "\\section "+sectionLabel+"\n"; + BEGIN(PageDoc); + } + YY_BREAK +case 507: +YY_RULE_SETUP +#line 3626 "scanner.l" +{ + sectionTitle+=yytext; + } + YY_BREAK +case 508: +YY_RULE_SETUP +#line 3629 "scanner.l" +{ yyLineNr++ ; current->doc+=yytext; } + YY_BREAK +case 509: +YY_RULE_SETUP +#line 3630 "scanner.l" +{ current->doc += yytext; } + YY_BREAK +case 510: +YY_RULE_SETUP +#line 3631 "scanner.l" +{ current->doc += yytext; } + YY_BREAK +case 511: +YY_RULE_SETUP +#line 3632 "scanner.l" + + YY_BREAK +case 512: +YY_RULE_SETUP +#line 3633 "scanner.l" +{ current->doc += yytext; } + YY_BREAK +case 513: +YY_RULE_SETUP +#line 3634 "scanner.l" +{ + current->doc += &yytext[1]; + } + YY_BREAK +case 514: +YY_RULE_SETUP +#line 3637 "scanner.l" +{ + lastFormulaContext = YY_START; + formulaText="$"; + BEGIN(ReadFormulaShort); + } + YY_BREAK +case 515: +YY_RULE_SETUP +#line 3642 "scanner.l" +{ + lastFormulaContext = YY_START; + formulaText="\\["; + BEGIN(ReadFormulaLong); + } + YY_BREAK +case 516: +YY_RULE_SETUP +#line 3647 "scanner.l" +{ + formulaText+="$"; + if (lastFormulaContext==ClassDocBrief || + lastFormulaContext==LineDoc || + lastFormulaContext==JavaDoc + ) + current->brief += addFormula(); + else + current->doc += addFormula(); + BEGIN(lastFormulaContext); + } + YY_BREAK +case 517: +YY_RULE_SETUP +#line 3658 "scanner.l" +{ + formulaText+="\\]"; + if (lastFormulaContext==ClassDocBrief || + lastFormulaContext==LineDoc || + lastFormulaContext==JavaDoc + ) + current->brief += addFormula(); + else + current->doc += addFormula(); + BEGIN(lastFormulaContext); + } + YY_BREAK +case 518: +YY_RULE_SETUP +#line 3669 "scanner.l" +{ formulaText+=*yytext; } + YY_BREAK +case 519: +YY_RULE_SETUP +#line 3670 "scanner.l" +{ + checkDocs(); + if (YY_START==SkipCode) // premature end of code block + { + err("Error: comment block ended inside \\code ... \\endcode block at line %d in %s!\n", + yyLineNr,yyFileName); + current->doc += "\\endcode\n\n"; + BEGIN( lastDocContext ); + } + else if (YY_START==ClassDocBrief && + lastBriefContext==Doc) + { + current->doc += "\n\n"; + BEGIN( lastDocContext ); + } + else + { + current->doc += "\n\n"; + //printf("Add docs for class %s\n",current->name.data()); + current_root->addSubEntry(current); + current = new Entry ; + current->protection = protection ; + current->sig = sig; + current->virt = virt; + current->stat = gstat; + current->slot = slot; + } + BEGIN( FindMembers ); + } + YY_BREAK +case 520: +YY_RULE_SETUP +#line 3699 "scanner.l" +{ + current->args.resize(0); + current->argList->clear(); + BEGIN( PageDocTitle); + } + YY_BREAK +case 521: +YY_RULE_SETUP +#line 3704 "scanner.l" +{ yyLineNr++; current->args+=" "; } + YY_BREAK +case 522: +YY_RULE_SETUP +#line 3705 "scanner.l" +{ current->args+=yytext; } + YY_BREAK +case 523: +YY_RULE_SETUP +#line 3706 "scanner.l" +{ BEGIN( PageDoc ); } + YY_BREAK +case 524: +YY_RULE_SETUP +#line 3707 "scanner.l" +{ + lastGroupContext = YY_START; + lineCount(); + BEGIN( GroupName ); + } + YY_BREAK +case 525: +YY_RULE_SETUP +#line 3712 "scanner.l" +{ + current->groups->append( + new QCString(yytext) + ); + } + YY_BREAK +case 526: +YY_RULE_SETUP +#line 3717 "scanner.l" +{ + yyLineNr++; BEGIN( lastGroupContext ); + } + YY_BREAK +case 527: +YY_RULE_SETUP +#line 3720 "scanner.l" +{ + lastBriefContext=YY_START; + BEGIN( ClassDocBrief ); + } + YY_BREAK +case 528: +YY_RULE_SETUP +#line 3724 "scanner.l" +{ BEGIN( DocBaseClass ); } + YY_BREAK +case 529: +YY_RULE_SETUP +#line 3725 "scanner.l" +{ + //printf("Adding base class %s\n",yytext); + current->extends->append( + new BaseInfo(yytext,Public,Normal) + ); + } + YY_BREAK +case 530: +YY_RULE_SETUP +#line 3731 "scanner.l" +{ yyLineNr++; BEGIN( ClassDoc ); } + YY_BREAK +case 531: +YY_RULE_SETUP +#line 3732 "scanner.l" +{ + current->brief=current->brief.stripWhiteSpace(); + yyLineNr++; + BEGIN( lastBriefContext ); + } + YY_BREAK +case 532: +YY_RULE_SETUP +#line 3737 "scanner.l" +{ yyLineNr++ ; current->brief += " "; } + YY_BREAK +case 533: +YY_RULE_SETUP +#line 3738 "scanner.l" + + YY_BREAK +case 534: +YY_RULE_SETUP +#line 3739 "scanner.l" +{ + current->brief=current->brief.stripWhiteSpace(); + BEGIN( lastBriefContext ); + } + YY_BREAK +case 535: +YY_RULE_SETUP +#line 3743 "scanner.l" +{ + BEGIN( lastBriefContext ); + } + YY_BREAK +/* +{BS}/("\\"|"@")"author" { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")"internal" { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")"version" { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")"date" { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")"param" { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")"exception" { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")"return" { BEGIN( lastBriefContext ); } +{BS}/("\\sa"|"@see") { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")"bug" { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")"warning" { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")"par"{BN}+ { BEGIN( lastBriefContext ); } + */ +case 536: +YY_RULE_SETUP +#line 3759 "scanner.l" +{ + lastBriefContext=YY_START; + BEGIN( ClassDocBrief ); + } + YY_BREAK +case 537: +YY_RULE_SETUP +#line 3763 "scanner.l" +{ current->brief += *yytext; } + YY_BREAK +case 538: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 3764 "scanner.l" +{ + current->name = yytext; + BEGIN( ClassDefineArgs ); + } + YY_BREAK +case 539: +YY_RULE_SETUP +#line 3768 "scanner.l" +{ + current->name = yytext; + if (nextDefContext==ClassDoc) + newDocState(); + else + BEGIN( nextDefContext ); + } + YY_BREAK +case 540: +YY_RULE_SETUP +#line 3775 "scanner.l" +{ + current->args+=")"; + if (nextDefContext==ClassDoc) + newDocState(); + else + BEGIN( nextDefContext ); + } + YY_BREAK +case 541: +YY_RULE_SETUP +#line 3782 "scanner.l" +{ + current->args+= yytext; + } + YY_BREAK +case 542: +YY_RULE_SETUP +#line 3785 "scanner.l" +{ + yyLineNr++; + current->name = current->name.stripWhiteSpace(); + if (current->section == Entry::MEMBERDOC_SEC && current->args.length()==0) + current->section = Entry::VARIABLEDOC_SEC; + newDocState(); + } + YY_BREAK +case 543: +YY_RULE_SETUP +#line 3792 "scanner.l" +{ + current->name+=yytext; + } + YY_BREAK +case 544: +YY_RULE_SETUP +#line 3795 "scanner.l" +{ + current->args+=*yytext; + currentArgumentContext = ClassDocFuncQual; + copyArgString=¤t->args; + BEGIN( ReadFuncArgType ) ; + } + YY_BREAK +case 545: +YY_RULE_SETUP +#line 3801 "scanner.l" +{ + current->name+="(*"; + BEGIN( ClassDocFuncPtr ); + } + YY_BREAK +case 546: +YY_RULE_SETUP +#line 3805 "scanner.l" +{ + current->name+=yytext; + } + YY_BREAK +case 547: +YY_RULE_SETUP +#line 3808 "scanner.l" +{ + current->name+=')'; + BEGIN( ClassDocFunc ); + } + YY_BREAK +case 548: +YY_RULE_SETUP +#line 3812 "scanner.l" +{ + BEGIN( ClassDocFuncSkipLine); + } + YY_BREAK +case 549: +YY_RULE_SETUP +#line 3815 "scanner.l" +{ + current->args += " const "; + current->argList->constSpecifier=TRUE; + } + YY_BREAK +case 550: +YY_RULE_SETUP +#line 3819 "scanner.l" +{ + current->args += " volatile "; + current->argList->volatileSpecifier=TRUE; + } + YY_BREAK +case 551: +YY_RULE_SETUP +#line 3823 "scanner.l" +{ + current->args += " = 0"; + current->virt = Pure; + current->argList->pureSpecifier=TRUE; + } + YY_BREAK +case 552: +YY_RULE_SETUP +#line 3828 "scanner.l" +{ + current->exception = "throw("; + BEGIN(ClassDocFuncExc); + } + YY_BREAK +case 553: +YY_RULE_SETUP +#line 3832 "scanner.l" +{ + current->exception += ')'; + BEGIN(ClassDocFuncQual); + } + YY_BREAK +case 554: +YY_RULE_SETUP +#line 3836 "scanner.l" +{ + current->exception += *yytext; + } + YY_BREAK +case 555: +YY_RULE_SETUP +#line 3839 "scanner.l" +{ + current->name += *yytext; + } + YY_BREAK +case 556: +YY_RULE_SETUP +#line 3842 "scanner.l" +{ + yyLineNr++; + current->name = current->name.stripWhiteSpace(); + newDocState(); + } + YY_BREAK +case 557: +YY_RULE_SETUP +#line 3847 "scanner.l" +{ current->doc += yytext; } + YY_BREAK +case 558: +YY_RULE_SETUP +#line 3848 "scanner.l" +{ current->doc += *yytext; } + YY_BREAK +case 559: +YY_RULE_SETUP +#line 3849 "scanner.l" +{ current->brief += *yytext; } + YY_BREAK +case 560: +YY_RULE_SETUP +#line 3850 "scanner.l" +{ yyLineNr++; current->doc += *yytext; } + YY_BREAK +case 561: +YY_RULE_SETUP +#line 3851 "scanner.l" +{ lineCount(); } + YY_BREAK +case 562: +YY_RULE_SETUP +#line 3852 "scanner.l" +{ + yyLineNr++; + BEGIN( lastDocContext ); + } + YY_BREAK +case 563: +YY_RULE_SETUP +#line 3856 "scanner.l" +{ + yyLineNr++; + unput('/');unput('*'); + BEGIN( ClassDoc ); + } + YY_BREAK +case 564: +YY_RULE_SETUP +#line 3862 "scanner.l" +{ current->brief+=yytext; } + YY_BREAK +case 565: +YY_RULE_SETUP +#line 3863 "scanner.l" +{ + yyLineNr++; + if (afterDocTerminator!=0) + unput(afterDocTerminator); + BEGIN(lastAfterDocContext); + } + YY_BREAK +case 566: +YY_RULE_SETUP +#line 3869 "scanner.l" +{ current->brief+=yytext; } + YY_BREAK +case 567: +YY_RULE_SETUP +#line 3870 "scanner.l" +{ current->brief+=yytext; } + YY_BREAK +case 568: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 3871 "scanner.l" + + YY_BREAK +case 569: +YY_RULE_SETUP +#line 3872 "scanner.l" +{ current->brief+=yytext; yyLineNr++; } + YY_BREAK +case 570: +YY_RULE_SETUP +#line 3873 "scanner.l" +{ current->brief+=*yytext; } + YY_BREAK +case 571: +YY_RULE_SETUP +#line 3874 "scanner.l" +{ yyLineNr++; + if (!current->brief.stripWhiteSpace().isEmpty()) + BEGIN(AfterDoc); + } + YY_BREAK +case 572: +YY_RULE_SETUP +#line 3878 "scanner.l" +{ + if (afterDocTerminator!=0) + unput(afterDocTerminator); + BEGIN(lastAfterDocContext); + } + YY_BREAK +case 573: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp = yy_bp + 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 3883 "scanner.l" +{ BEGIN(AfterDoc); } + YY_BREAK +case 574: +YY_RULE_SETUP +#line 3884 "scanner.l" +{ + current->brief+="\\internal"; + } + YY_BREAK +case 575: +YY_RULE_SETUP +#line 3887 "scanner.l" +{ + current->doc+="\\internal"; + } + YY_BREAK +case 576: +YY_RULE_SETUP +#line 3890 "scanner.l" +{ BEGIN(AfterDocBrief); } + YY_BREAK +case 577: +YY_RULE_SETUP +#line 3891 "scanner.l" +{ current->doc+=yytext; } + YY_BREAK +case 578: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 3892 "scanner.l" + + YY_BREAK +case 579: +YY_RULE_SETUP +#line 3893 "scanner.l" +{ current->doc+=yytext; yyLineNr++; } + YY_BREAK +case 580: +YY_RULE_SETUP +#line 3894 "scanner.l" +{ current->doc+=*yytext; } + YY_BREAK +case 581: +YY_RULE_SETUP +#line 3895 "scanner.l" +{ + if (afterDocTerminator!=0) + unput(afterDocTerminator); + BEGIN(lastAfterDocContext); + } + YY_BREAK +case 582: +YY_RULE_SETUP +#line 3900 "scanner.l" +{ + current->doc += "\n\n"; + err("Warning: unexpected end of " + "documentation block found in " + "file %s at line %d\n",yyFileName,yyLineNr); + BEGIN( lastDocContext ); + } + YY_BREAK +case 583: +YY_RULE_SETUP +#line 3907 "scanner.l" +{ + checkDocs(); + current->doc += "\n\n"; + //printf("End of docs at line %d\n",yyLineNr); + BEGIN( lastDocContext ); + } + YY_BREAK +case 584: +YY_RULE_SETUP +#line 3913 "scanner.l" +{ + unput('/');unput('*'); + BEGIN( tmpDocType ); + } + YY_BREAK +case 585: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 3917 "scanner.l" + + YY_BREAK +case 586: +YY_RULE_SETUP +#line 3918 "scanner.l" +{ current->doc += yytext; } + YY_BREAK +case 587: +YY_RULE_SETUP +#line 3920 "scanner.l" +{ yyLineNr++ ; + BEGIN( lastCContext ) ; + } + YY_BREAK +case 588: +YY_RULE_SETUP +#line 3923 "scanner.l" + + YY_BREAK +case 589: +YY_RULE_SETUP +#line 3924 "scanner.l" + + YY_BREAK +case 590: +YY_RULE_SETUP +#line 3925 "scanner.l" +{ yyLineNr++ ; } + YY_BREAK +case 591: +YY_RULE_SETUP +#line 3926 "scanner.l" + + YY_BREAK +case 592: +YY_RULE_SETUP +#line 3927 "scanner.l" +{ lastCContext = YY_START ; + BEGIN( SkipComment ) ; + } + YY_BREAK +case 593: +YY_RULE_SETUP +#line 3930 "scanner.l" +{ BEGIN( lastCContext ) ; } + YY_BREAK +case 594: +YY_RULE_SETUP +#line 3931 "scanner.l" +{ + lastCContext = YY_START ; + BEGIN( SkipCxxComment ) ; + } + YY_BREAK +case 595: +YY_RULE_SETUP +#line 3935 "scanner.l" +ECHO; + YY_BREAK + case YY_STATE_EOF(INITIAL): + case YY_STATE_EOF(Define): + case YY_STATE_EOF(DefineArg): + case YY_STATE_EOF(DefineEnd): + case YY_STATE_EOF(Include): + case YY_STATE_EOF(ClassName): + case YY_STATE_EOF(ClassVar): + case YY_STATE_EOF(Bases): + case YY_STATE_EOF(BasesProt): + case YY_STATE_EOF(NextSemi): + case YY_STATE_EOF(FindMembers): + case YY_STATE_EOF(FindMemberName): + case YY_STATE_EOF(FindFields): + case YY_STATE_EOF(FindFieldArg): + case YY_STATE_EOF(Function): + case YY_STATE_EOF(FuncRound): + case YY_STATE_EOF(ExcpRound): + case YY_STATE_EOF(FuncQual): + case YY_STATE_EOF(Operator): + case YY_STATE_EOF(Array): + case YY_STATE_EOF(Curly): + case YY_STATE_EOF(Using): + case YY_STATE_EOF(UsingDirective): + case YY_STATE_EOF(NameSpaceDocArg1): + case YY_STATE_EOF(SkipCurly): + case YY_STATE_EOF(SkipCurlyCpp): + case YY_STATE_EOF(SkipCurlyEndDoc): + case YY_STATE_EOF(SkipString): + case YY_STATE_EOF(SkipInits): + case YY_STATE_EOF(SkipCPP): + case YY_STATE_EOF(SkipCPPBlock): + case YY_STATE_EOF(SkipComment): + case YY_STATE_EOF(SkipCxxComment): + case YY_STATE_EOF(SkipCurlyBlock): + case YY_STATE_EOF(SkipRoundBlock): + case YY_STATE_EOF(SkipCode): + case YY_STATE_EOF(Sharp): + case YY_STATE_EOF(SkipSharp): + case YY_STATE_EOF(SkipRound): + case YY_STATE_EOF(TypedefName): + case YY_STATE_EOF(Comment): + case YY_STATE_EOF(Doc): + case YY_STATE_EOF(JavaDoc): + case YY_STATE_EOF(ClassDoc): + case YY_STATE_EOF(LineDoc): + case YY_STATE_EOF(DefLineDoc): + case YY_STATE_EOF(ClassDocArg1): + case YY_STATE_EOF(ClassDocArg2): + case YY_STATE_EOF(ClassDocArg3): + case YY_STATE_EOF(ClassDocFunc): + case YY_STATE_EOF(ClassDocFuncPtr): + case YY_STATE_EOF(ClassDocFuncQual): + case YY_STATE_EOF(ClassDocFuncSkipLine): + case YY_STATE_EOF(ClassDocFuncExc): + case YY_STATE_EOF(ClassDocDefine): + case YY_STATE_EOF(ClassDocRelates): + case YY_STATE_EOF(ClassDocBrief): + case YY_STATE_EOF(ClassDocOverload): + case YY_STATE_EOF(ClassDefineArgs): + case YY_STATE_EOF(GroupDocArg1): + case YY_STATE_EOF(GroupDocArg2): + case YY_STATE_EOF(GroupName): + case YY_STATE_EOF(GroupHeader): + case YY_STATE_EOF(AfterDoc): + case YY_STATE_EOF(AfterDocBrief): + case YY_STATE_EOF(AfterDocLine): + case YY_STATE_EOF(PageDoc): + case YY_STATE_EOF(PageDocTitle): + case YY_STATE_EOF(PageDocArg1): + case YY_STATE_EOF(PageDocArg2): + case YY_STATE_EOF(FileDocArg1): + case YY_STATE_EOF(FileDocArg2): + case YY_STATE_EOF(ExampleDoc): + case YY_STATE_EOF(ExampleDocArg1): + case YY_STATE_EOF(EnumDoc): + case YY_STATE_EOF(EnumDocArg1): + case YY_STATE_EOF(FuncPtr): + case YY_STATE_EOF(EndFuncPtr): + case YY_STATE_EOF(FuncFunc): + case YY_STATE_EOF(FuncFuncEnd): + case YY_STATE_EOF(FuncFuncType): + case YY_STATE_EOF(MemberSpec): + case YY_STATE_EOF(MemberSpecSkip): + case YY_STATE_EOF(SkipVerbatim): + case YY_STATE_EOF(Text): + case YY_STATE_EOF(DocScan): + case YY_STATE_EOF(DocParam): + case YY_STATE_EOF(DocException): + case YY_STATE_EOF(DocHtmlScan): + case YY_STATE_EOF(DocLatexScan): + case YY_STATE_EOF(DocEmphasis): + case YY_STATE_EOF(DocBold): + case YY_STATE_EOF(DocCode): + case YY_STATE_EOF(DocCodeBlock): + case YY_STATE_EOF(DocInternal): + case YY_STATE_EOF(DocLink): + case YY_STATE_EOF(DocLinkText): + case YY_STATE_EOF(DocSkipWord): + case YY_STATE_EOF(DocInclude): + case YY_STATE_EOF(DocDontInclude): + case YY_STATE_EOF(DocDescItem): + case YY_STATE_EOF(DocHtmlLink): + case YY_STATE_EOF(DocHtmlAnchor): + case YY_STATE_EOF(DocHtmlHref1): + case YY_STATE_EOF(DocHtmlHref2): + case YY_STATE_EOF(DocBaseClass): + case YY_STATE_EOF(DocSkiplineKey): + case YY_STATE_EOF(DocSkipKey): + case YY_STATE_EOF(DocLineKey): + case YY_STATE_EOF(DocUntilKey): + case YY_STATE_EOF(DocPar): + case YY_STATE_EOF(DocRefName): + case YY_STATE_EOF(DocVerbatim): + case YY_STATE_EOF(DocVerbInc): + case YY_STATE_EOF(DocIndexWord): + case YY_STATE_EOF(DocRef): + case YY_STATE_EOF(DocRefArg): + case YY_STATE_EOF(DocRefArgStart): + case YY_STATE_EOF(DocRefItem): + case YY_STATE_EOF(DocRefItemName): + case YY_STATE_EOF(DocImage): + case YY_STATE_EOF(DocHtmlImageName): + case YY_STATE_EOF(DocLatexImageName): + case YY_STATE_EOF(DocLatexImageWidth): + case YY_STATE_EOF(SectionLabel): + case YY_STATE_EOF(SectionTitle): + case YY_STATE_EOF(SkipTemplate): + case YY_STATE_EOF(EndTemplate): + case YY_STATE_EOF(CopyArgString): + case YY_STATE_EOF(CopyArgRound): + case YY_STATE_EOF(CopyArgSharp): + case YY_STATE_EOF(ReadFuncArgType): + case YY_STATE_EOF(ReadTempArgs): + case YY_STATE_EOF(Specialization): + case YY_STATE_EOF(DocSkipHtmlComment): + case YY_STATE_EOF(ReadFormulaShort): + case YY_STATE_EOF(ReadFormulaLong): + case YY_STATE_EOF(AnchorLabel): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); + yy_state_ptr = yy_state_buf; + *yy_state_ptr++ = yy_current_state; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 3757 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + *yy_state_ptr++ = yy_current_state; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + + register YY_CHAR yy_c = 1; + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 3757 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 3756); + if ( ! yy_is_jam ) + *yy_state_ptr++ = yy_current_state; + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + yy_current_buffer->yy_at_bol = (c == '\n'); + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 3935 "scanner.l" + + +//---------------------------------------------------------------------------- + +//static void addToBody(const char *text) +//{ +// if (Config::includeSourceFlag) +// previous->body+=text; +//} + +//static void addToBodyCond(const char *text) +//{ +// if (Config::includeSourceFlag && lastStringContext==SkipCurly) +// previous->body+=text; +//} + +//---------------------------------------------------------------------------- + +void scanString(const char *s) +{ + const char *oldInputString = inputString; + int oldInputPosition = inputPosition; + int oldRule = YY_START; + YY_BUFFER_STATE oldBuffer = YY_CURRENT_BUFFER; + yy_switch_to_buffer(yy_create_buffer(scanYYin, YY_BUF_SIZE)); + inputString = s; + inputPosition = 0; + BEGIN( Text ); + scanYYlex(); + yy_delete_buffer(YY_CURRENT_BUFFER); + yy_switch_to_buffer(oldBuffer); + inputString = oldInputString; + inputPosition = oldInputPosition; + BEGIN( oldRule ); +} + +//---------------------------------------------------------------------------- + +static void newDocState() +{ + if (tmpDocType!=-1) + { + tmpDocType=ClassDoc; + BEGIN(JavaDoc); + } + else + { + BEGIN(ClassDoc); + } +} + +//---------------------------------------------------------------------------- + +void parseCompounds(Entry *rt) +{ + //printf("parseCompounds(%s)\n",rt->name.data()); + EntryListIterator eli(*rt->sublist); + Entry *ce; + for (;(ce=eli.current());++eli) + { + if (ce->program.length()>0) + { + //printf("-- %s ---------\n%s\n---------------\n", + // ce->name.data(),ce->program.data()); + // init scanner state + inputString = ce->program; + inputPosition = 0; + scanYYrestart( scanYYin ) ; + if (ce->section==Entry::ENUM_SEC) + BEGIN( FindFields ) ; + else + BEGIN( FindMembers ) ; + current_root = ce ; + strcpy( yyFileName, ce->fileName ) ; + yyLineNr = ce->startLine ; + //printf("---> Inner block starts at line %d\n",yyLineNr); + //current->reset(); + current = new Entry; + // set default protection based on the compound type + if( ce->section==Entry::CLASS_SEC ) // class + current->protection = protection = Private ; + else if (ce->section == Entry::ENUM_SEC ) // enum + current->protection = protection = ce->protection; + else if (ce->name.length()>0 && ce->name.at(0)=='@') // anonymous union + current->protection = protection = ce->protection; + else // named struct, union, or interface + current->protection = protection = Public ; + sig = FALSE; + slot = FALSE; + gstat = FALSE; + virt = Normal; + scanYYlex() ; + delete current; + ce->program.resize(0); + } + parseCompounds(ce); + } +} + +//---------------------------------------------------------------------------- + +void parseMain(Entry *rt) +{ + initParser(); + anonCount = 0; + protection = Public; + sig = FALSE; + slot = FALSE; + gstat = FALSE; + virt = Normal; + current_root = rt; + global_root = rt; + current = new Entry; + inputString = rt->program; + //printf("parseDoc=`%s'\n",inputString); + inputPosition = 0; + ifCount=0; + scanYYrestart( scanYYin ); + BEGIN( FindMembers ); + scanYYlex(); + rt->program.resize(0); + delete current; + parseCompounds(rt); +} + +//---------------------------------------------------------------------------- + +void parseDocument(OutputList &ol,const QCString &docString) +{ + //inParamBlock=inSeeBlock=inReturnBlock=FALSE; + curTable = 0; + outDoc = new OutputList(&ol); + currentIncludeFile.resize(0); + includeFileOffset=0; + includeFileLength=0; + if (!docString) return; + linkRef = ""; + linkText = ""; + inputString = docString; + inputPosition = 0; + scanYYrestart( scanYYin ); + BEGIN( DocScan ); + insideArgumentList = FALSE; + scanYYlex(); + if (insideArgumentList) { insideArgumentList=FALSE; outDoc->endItemList(); } + if (inBlock()) endBlock(); + ol+=*outDoc; + delete outDoc; + return; +} + +//---------------------------------------------------------------------------- + +void parseDoc(OutputList &ol,const char *clName, + const char *memName,const QCString &docString) +{ + initParser(); + initParseCodeContext(); + exampleDoc=FALSE; // do not cross reference with member docs + className=clName; + memberName=memName; + if (memName) + { + refName=className+"::"+memberName; + } + else + { + refName=className; + } + parseDocument(ol,docString); +} + +//---------------------------------------------------------------------------- + +void parseText(OutputList &ol,const QCString &txtString) +{ + inputString = txtString; + outDoc = new OutputList(&ol); + inputPosition = 0; + scanYYrestart( scanYYin ); + BEGIN( Text ); + scanYYlex(); + if (memberGroupId!=-1) + { + warn("Warning: Missing \\endmgroup in file %s\n",yyFileName); + memberGroupId=-1; + } + ol+=*outDoc; + delete outDoc; + return; +} + +//---------------------------------------------------------------------------- + +void parseExample(OutputList &ol,const QCString &docString, + const char *fileName) +{ + initParser(); + initParseCodeContext(); + exampleDoc=TRUE; // cross reference with member docs + exampleName=fileName; + parseDocument(ol,docString); +} + +//---------------------------------------------------------------------------- +extern "C" { // some bogus code to keep the compiler happy + void scannerYYdummy() { yy_flex_realloc(0,0); } +} diff --git a/src/scanner.h b/src/scanner.h index 30894cd..68ec8d5 100644 --- a/src/scanner.h +++ b/src/scanner.h @@ -27,7 +27,7 @@ #include "membergroup.h" class OutputList; -typedef QIntDict MemberGroupDict; +//typedef QIntDict MemberGroupDict; typedef QIntDictIterator MemberGroupDictIterator; extern void parseMain(Entry *); diff --git a/src/scanner.l b/src/scanner.l index 602dcc8..26c0a08 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -39,6 +39,7 @@ #include "index.h" #include "defargs.h" #include "language.h" +#include "outputlist.h" #ifndef WIN32 #include @@ -544,6 +545,11 @@ static bool inBlock() static void endBlock() { + if (inParamBlock || inRetValBlock) + { + outDoc->endDescTableData(); + outDoc->endDescTable(); + } outDoc->endDescList(); inParamBlock=inRetValBlock=inSeeBlock=inReturnBlock=inAuthorBlock= inVersionBlock=inDateBlock=inBugBlock=inWarningBlock= @@ -610,10 +616,107 @@ static void checkDocs() } } +static bool curLatexState; +static bool curManState; +static bool curHtmlState; + +static void storeOutputListState() +{ + curLatexState = outDoc->isEnabled(OutputGenerator::Latex); + curHtmlState = outDoc->isEnabled(OutputGenerator::Html); + curManState = outDoc->isEnabled(OutputGenerator::Man); +} + +static void restoreOutputListState() +{ + if (curLatexState) + outDoc->enable(OutputGenerator::Latex); + else + outDoc->disable(OutputGenerator::Latex); + if (curHtmlState) + outDoc->enable(OutputGenerator::Html); + else + outDoc->disable(OutputGenerator::Html); + if (curManState) + outDoc->enable(OutputGenerator::Man); + else + outDoc->disable(OutputGenerator::Man); +} + +enum ImageTypes +{ + IT_Html, + IT_Latex +}; + +// search for an image in the imageNameDict and if found +// copies the image to the output directory (which is the +// html directory if type==0 or the latex directory if type==1) +static QCString findAndCopyImage(const char *fileName,ImageTypes type) +{ + QCString result; + bool ambig; + FileDef *fd; + if ((fd=findFileDef(&imageNameDict,fileName,ambig))) + { + QFile inImage(fd->absFilePath()); + if (inImage.open(IO_ReadOnly)) + { + result = fileName; + int i; + if ((i=result.findRev('/'))!=-1 || (i=result.findRev('\\'))!=-1) + { + result.right(result.length()-i-1); + } + QCString outputDir; + switch(type) + { + case IT_Html: + outputDir = Config::htmlOutputDir; + break; + case IT_Latex: + outputDir = Config::latexOutputDir; + break; + } + QCString outputFile = outputDir+"/"+result; + QFile outImage(outputFile); + if (outImage.open(IO_WriteOnly)) // copy the image + { + char *buffer = new char[inImage.size()]; + inImage.readBlock(buffer,inImage.size()); + outImage.writeBlock(buffer,inImage.size()); + outImage.flush(); + delete buffer; + } + else + { + warn("Warning: could not write output image %s\n",outputFile.data()); + } + } + else + { + warn("Warning: could not open image %s\n",fileName); + } + } + else if (ambig) + { + warn("Warning: image file name %s is ambigious.\n",fileName); + warn("Possible candidates:\n"); + //includeFileList.writeMatches(fileName); + showFileDefMatches(&imageNameDict,fileName); + } + else + { + warn("Warning: image file %s is not found. ",fileName); + warn("Check your IMAGE_PATH\n"); + } + return result; +} + /* ----------------------------------------------------------------- */ -static void addToBody(const char *text); -static void addToBodyCond(const char *text); +//static void addToBody(const char *text); +//static void addToBodyCond(const char *text); /* ----------------------------------------------------------------- */ #undef YY_INPUT #define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); @@ -709,6 +812,7 @@ VAR [vV][aA][rR] %x Array %x Curly %x Using +%x UsingDirective %x NameSpaceDocArg1 %x SkipCurly %x SkipCurlyCpp @@ -834,7 +938,7 @@ VAR [vV][aA][rR] warn("Warning: Missing \\endmgroup in file %s\n",yyFileName); memberGroupId=-1; } - yyLineNr= 1 ; + yyLineNr= 0 ; // there is always an extra newline at the start of the file int i; for( i = 0 ; yytext[i+1] != 6 ; i++ ) yyFileName[i] = yytext[i+1] ; @@ -962,7 +1066,9 @@ VAR [vV][aA][rR] } . { linkText += *yytext; } "\n" { linkText += " "; } -("\\"|"@")"endlink"/[^a-z_A-Z0-9] { // <- needed for things like \endlink. +("\\"|"@")"endlink" { // <- needed for things like \endlink. + //printf("GenerateLink className=`%s' linkRef=`%s' linkText=`%s'\n", + // className.data(),linkRef.data(),linkText.data()); generateLink(*outDoc,className,linkRef,inSeeBlock,linkText); BEGIN( DocScan ); } @@ -1162,6 +1268,12 @@ VAR [vV][aA][rR] scanString(theTranslator->trParameters()+": "); outDoc->endBold(); outDoc->endDescTitle(); + outDoc->writeDescItem(); + outDoc->startDescTable(); + } + else + { + outDoc->endDescTableData(); } BEGIN(DocParam); } @@ -1176,6 +1288,12 @@ VAR [vV][aA][rR] scanString(theTranslator->trReturnValues()+": "); outDoc->endBold(); outDoc->endDescTitle(); + outDoc->writeDescItem(); + outDoc->startDescTable(); + } + else + { + outDoc->endDescTableData(); } BEGIN(DocParam); } @@ -1195,12 +1313,13 @@ VAR [vV][aA][rR] BEGIN(DocException); } "\\capt".* -[a-z_A-Z0-9:]+ { - outDoc->writeDescItem(); +([a-z_A-Z0-9:]+)|("\"".*"\"") { + outDoc->startDescTableTitle(); outDoc->startEmphasis(); outDoc->docify(yytext); outDoc->endEmphasis(); - outDoc->docify(" - "); + outDoc->endDescTableTitle(); + outDoc->startDescTableData(); BEGIN(DocScan); } {SCOPENAME} { @@ -1320,32 +1439,43 @@ VAR [vV][aA][rR] [lL][aA][tT][eE][xX] { BEGIN(DocLatexImageName); } -{FILE}|{URLMASK} { - outDoc->disableAllBut(OutputGenerator::Html); - outDoc->writeImage(yytext,0,0); - outDoc->enableAll(); +{FILE} { + curImageName = findAndCopyImage(yytext,IT_Html); + if (!curImageName.isEmpty()) + { + storeOutputListState(); + outDoc->disableAllBut(OutputGenerator::Html); + outDoc->writeImage(curImageName,0,0); + restoreOutputListState(); + } BEGIN(DocScan); } {FILE} { - curImageName = yytext; - BEGIN(DocLatexImageWidth); + curImageName = findAndCopyImage(yytext,IT_Latex); + if (curImageName.isEmpty()) + BEGIN(DocScan); + else + BEGIN(DocLatexImageWidth); } \n { // no width specified - outDoc->disableAllBut(OutputGenerator::Html); + storeOutputListState(); + outDoc->disableAllBut(OutputGenerator::Latex); outDoc->writeImage(curImageName,0,0); - outDoc->enableAll(); + restoreOutputListState(); BEGIN(DocScan); } "width"{B}*"="{B}*[0-9\.]+({B}*{ID})? { + storeOutputListState(); outDoc->disableAllBut(OutputGenerator::Latex); outDoc->writeImage(curImageName,yytext,0); - outDoc->enableAll(); + restoreOutputListState(); BEGIN(DocScan); } "height"{B}*"="{B}*[0-9\.]+({B}*{ID})? { + storeOutputListState(); outDoc->disableAllBut(OutputGenerator::Latex); outDoc->writeImage(curImageName,0,yytext); - outDoc->enableAll(); + restoreOutputListState(); BEGIN(DocScan); } [a-z_A-Z0-9\.\-]+ { @@ -1353,11 +1483,10 @@ VAR [vV][aA][rR] } \n { warn("Warning: invalid \\image command found!\n"); - yyLineNr++; outDoc->enableAll(); BEGIN(DocScan); } -("\\"|"@")"code"/{BN}+ { +("\\"|"@")"code"({BN}*"\n"|{B}*) { outDoc->startCodeFragment(); codeBlock.resize(0); BEGIN( DocCodeBlock ); @@ -1494,9 +1623,11 @@ VAR [vV][aA][rR] "" { outDoc->endTypewriter(); } "<"{VAR}{ATTR}">" { outDoc->startEmphasis(); } "" { outDoc->endEmphasis(); } -"<"{IMG}{ATTR}">" { outDoc->disableAllBut(OutputGenerator::Html); +"<"{IMG}{ATTR}">" { + storeOutputListState(); + outDoc->disableAllBut(OutputGenerator::Html); outDoc->writeString(yytext); - outDoc->enableAll(); + restoreOutputListState(); } "<"{PRE}{ATTR}">" { outDoc->startCodeFragment(); @@ -1789,6 +1920,7 @@ VAR [vV][aA][rR] current->type = "namespace" ; current->fileName = yyFileName; current->startLine = yyLineNr; + current->bodyLine = yyLineNr; lineCount(); BEGIN( ClassName ); } @@ -1798,6 +1930,7 @@ VAR [vV][aA][rR] current->type = "module" ; current->fileName = yyFileName; current->startLine = yyLineNr; + current->bodyLine = yyLineNr; lineCount(); BEGIN( ClassName ); } @@ -1808,6 +1941,7 @@ VAR [vV][aA][rR] current->type += " interface" ; current->fileName = yyFileName; current->startLine = yyLineNr; + current->bodyLine = yyLineNr; lineCount(); BEGIN( ClassName ); } @@ -1818,6 +1952,7 @@ VAR [vV][aA][rR] current->type += " class" ; current->fileName = yyFileName; current->startLine = yyLineNr; + current->bodyLine = yyLineNr; lineCount() ; BEGIN( ClassName ) ; } @@ -1828,6 +1963,7 @@ VAR [vV][aA][rR] current->type += " struct" ; current->fileName = yyFileName; current->startLine = yyLineNr; + current->bodyLine = yyLineNr; lineCount() ; BEGIN( ClassName ) ; } @@ -1838,6 +1974,7 @@ VAR [vV][aA][rR] current->type += " union" ; current->fileName = yyFileName; current->startLine = yyLineNr; + current->bodyLine = yyLineNr; lineCount() ; BEGIN( ClassName ) ; } @@ -1848,6 +1985,7 @@ VAR [vV][aA][rR] current->type += " enum" ; current->fileName = yyFileName; current->startLine = yyLineNr; + current->bodyLine = yyLineNr; lineCount() ; BEGIN( ClassName ) ; } @@ -1904,9 +2042,26 @@ VAR [vV][aA][rR] //printf("Start template list\n"); BEGIN( ReadTempArgs ); } - /* for now the using statement is completely ignored */ -"using"{BN}+ { lineCount(); BEGIN(Using); } +"using"{BN}+ { + current->startLine=yyLineNr; + lineCount(); + BEGIN(Using); + } +"namespace"{BN}+ { lineCount(); BEGIN(UsingDirective); } ";" { BEGIN(FindMembers); } +{SCOPENAME} { current->name=yytext; + current->fileName = yyFileName; + current->section=Entry::USINGDIR_SEC; + printf("Found using directive %s\n",yytext); + current_root->addSubEntry(current); + current = new Entry ; + current->protection = protection ; + current->sig = sig; + current->virt = virt; + current->stat = gstat; + current->slot = slot; + BEGIN(Using); + } {SCOPENAME}{BN}*"<>" { // guided template decl QCString n=yytext; addType( current ); @@ -2001,7 +2156,7 @@ VAR [vV][aA][rR] current->name += yytext; } QCString tmp=yytext; - if (tmp.right(8)=="operator") + if (nameIsOperator(tmp)) BEGIN( Operator ); else BEGIN(FindMembers); @@ -2010,6 +2165,7 @@ VAR [vV][aA][rR] BEGIN( SkipCPP ) ; } {B}*"#"{B}*"define" { + current->bodyLine = yyLineNr; BEGIN( Define ); } . @@ -2018,6 +2174,7 @@ VAR [vV][aA][rR] BEGIN( lastCPPContext) ; } {ID}/"(" { + current->bodyLine = yyLineNr; current->name = yytext; BEGIN( DefineArg ); } @@ -2031,11 +2188,13 @@ VAR [vV][aA][rR] } {ID} { //printf("Define `%s' without args\n",yytext); + current->bodyLine = yyLineNr; current->name = yytext; BEGIN(DefineEnd); } \n { //printf("End define\n"); + yyLineNr++; current->fileName = yyFileName; current->startLine = yyLineNr; current->type.resize(0); @@ -2051,12 +2210,20 @@ VAR [vV][aA][rR] current->slot = slot; BEGIN(FindMembers); } -\\\n +\\\n { + yyLineNr++; + } +\" { + lastStringContext=DefineEnd; + BEGIN(SkipString); + } . [*&]+ { current->name += yytext ; } ";"{BN}*("/**"|"//!"|"/*!"|"///")"<" { lineCount(); + if (current->bodyLine==-1) + current->bodyLine=yyLineNr; lastAfterDocContext = YY_START; afterDocTerminator = ';'; if (yytext[yyleng-3]=='/') @@ -2119,6 +2286,7 @@ VAR [vV][aA][rR] } } "=" { + current->bodyLine=yyLineNr; BEGIN(NextSemi); } [:;,] { @@ -2126,21 +2294,23 @@ VAR [vV][aA][rR] QCString oldDocs = current->doc.copy(); if ( *yytext != ':') { - current->type=current->type.simplifyWhiteSpace(); - current->args=current->args.simplifyWhiteSpace(); - current->name=current->name.stripWhiteSpace(); - current->section = Entry::VARIABLE_SEC ; - current->fileName = yyFileName; - current->startLine = yyLineNr; - current_root->addSubEntry( current ) ; - current = new Entry ; - // variable found - current->section = Entry::EMPTY_SEC ; - current->protection = protection; - current->slot = slot = FALSE; - current->sig = sig = FALSE; - current->virt = Normal; - current->stat = gstat; + if (current->bodyLine==-1) + current->bodyLine = yyLineNr; + current->type=current->type.simplifyWhiteSpace(); + current->args=current->args.simplifyWhiteSpace(); + current->name=current->name.stripWhiteSpace(); + current->section = Entry::VARIABLE_SEC ; + current->fileName = yyFileName; + current->startLine = yyLineNr; + current_root->addSubEntry( current ) ; + current = new Entry ; + // variable found + current->section = Entry::EMPTY_SEC ; + current->protection = protection; + current->slot = slot = FALSE; + current->sig = sig = FALSE; + current->virt = Normal; + current->stat = gstat; } // skip expression or bitfield if needed if ( *yytext == ':') @@ -2405,6 +2575,7 @@ VAR [vV][aA][rR] . { current->program += yytext ; } "("({ID}{BN}*"::"{BN}*)*("*"{BN}*)+ { + current->bodyLine = yyLineNr; lineCount(); addType(current); funcPtrType=yytext; @@ -2479,6 +2650,7 @@ VAR [vV][aA][rR] current->type += *yytext; } "(" { current->args = yytext; + current->bodyLine = yyLineNr; currentArgumentContext = FuncQual; copyArgString=¤t->args; BEGIN( ReadFuncArgType ) ; @@ -2701,8 +2873,8 @@ VAR [vV][aA][rR] current->proto = TRUE; } } - //printf("Adding entry `%s' inLine`%d'\n", - // current->name.data(),current->inLine); + //printf("Adding entry `%s' inLine`%d' bodyLine=`%d'\n", + // current->name.data(),current->inLine,current->bodyLine); previous = current; current_root->addSubEntry(current); current = new Entry ; @@ -2717,29 +2889,33 @@ VAR [vV][aA][rR] { if (current_root->section & Entry::COMPOUND_MASK) previous->inLine = TRUE; - addToBody(yytext); + //addToBody(yytext); BEGIN( SkipCurly ) ; } else if( *yytext == ':' ) { - addToBody(yytext); + //addToBody(yytext); BEGIN( SkipInits ) ; } else + { + if (previous->section!=Entry::VARIABLE_SEC) + previous->bodyLine=-1; // a function/member declaration BEGIN( FindMembers ) ; + } } "{" { - addToBody(yytext); + //addToBody(yytext); lastCurlyContext = FindMembers; BEGIN( SkipCurly ) ; } "{" { - addToBody(yytext); + //addToBody(yytext); ++bracketCount ; } "}" { - addToBody(yytext); + //addToBody(yytext); if( bracketCount ) --bracketCount ; else @@ -2748,7 +2924,7 @@ VAR [vV][aA][rR] "}"{BN}*("/*!"|"/**"|"//!"|"///")"<" { if ( bracketCount ) { - addToBody(yytext); + //addToBody(yytext); --bracketCount ; } else @@ -2769,73 +2945,73 @@ VAR [vV][aA][rR] } } "}" { - addToBody("}"); + //addToBody("}"); current = tempEntry; BEGIN( lastCurlyContext ); } "'"\\[0-7]{1,3}"'" { - addToBody(yytext); + //addToBody(yytext); } "'"\\."'" { - addToBody(yytext); + //addToBody(yytext); } "'"."'" { - addToBody(yytext); + //addToBody(yytext); } \" { - addToBody(yytext); + //addToBody(yytext); lastStringContext=SkipCurly; BEGIN( SkipString ); } ^{B}*"#" { - addToBody(yytext); + //addToBody(yytext); BEGIN( SkipCurlyCpp ); } \n { yyLineNr++; - addToBody(yytext); + //addToBody(yytext); } . { - addToBody(yytext); + //addToBody(yytext); } \n { - addToBody(yytext); + //addToBody(yytext); yyLineNr++; lastCurlyContext = FindMembers; BEGIN( SkipCurly ); } \\[\r]*"\n"[\r]* { - addToBody(yytext); + //addToBody(yytext); yyLineNr++; } "/*" { - addToBody(yytext); + //addToBody(yytext); } "*/" { - addToBody(yytext); + //addToBody(yytext); } "//".* { - addToBody(yytext); + //addToBody(yytext); } . { - addToBody(yytext); + //addToBody(yytext); } \\. { - addToBodyCond(yytext); + //addToBodyCond(yytext); } \" { - addToBodyCond(yytext); + //addToBodyCond(yytext); BEGIN( lastStringContext ); } "/*"|"*/"|"//" { - addToBodyCond(yytext); + //addToBodyCond(yytext); } \n { yyLineNr++; - addToBodyCond(yytext); + //addToBodyCond(yytext); } . { - addToBodyCond(yytext); + //addToBodyCond(yytext); } ";" { current->section = Entry::EMPTY_SEC ; @@ -2847,6 +3023,7 @@ VAR [vV][aA][rR] } {SCOPENAME} { current->name = yytext ; + lineCount(); BEGIN( ClassVar ); } /* @@ -2978,6 +3155,7 @@ VAR [vV][aA][rR] . { current->program += *yytext ; } ("//"{B}*)?"/*!" { + //printf("Start doc block at %d\n",yyLineNr); removeSlashes=(yytext[1]=='/'); tmpDocType=-1; if (YY_START==Curly) @@ -3087,9 +3265,9 @@ VAR [vV][aA][rR] current->brief+="."; BEGIN( tmpDocType ); } -("\\"|"@")"internal" { - current->doc+="\\internal"; - BEGIN( tmpDocType ); +("\\"|"@")("image"|"author"|"internal"|"version"|"date"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see") { + current->doc+=yytext; + BEGIN( tmpDocType ); } {B}*("\\"|"@")("fn"|"var"|"typedef"){B}* { current->section = Entry::MEMBERDOC_SEC; @@ -3468,7 +3646,10 @@ VAR [vV][aA][rR] } "\\f$" { formulaText+="$"; - if (lastFormulaContext==ClassDocBrief) + if (lastFormulaContext==ClassDocBrief || + lastFormulaContext==LineDoc || + lastFormulaContext==JavaDoc + ) current->brief += addFormula(); else current->doc += addFormula(); @@ -3476,16 +3657,26 @@ VAR [vV][aA][rR] } "\\f]" { formulaText+="\\]"; - if (lastFormulaContext==ClassDocBrief) + if (lastFormulaContext==ClassDocBrief || + lastFormulaContext==LineDoc || + lastFormulaContext==JavaDoc + ) current->brief += addFormula(); else current->doc += addFormula(); BEGIN(lastFormulaContext); } . { formulaText+=*yytext; } -"*/" { +{B}*"*/" { checkDocs(); - if (YY_START==ClassDocBrief && + if (YY_START==SkipCode) // premature end of code block + { + err("Error: comment block ended inside \\code ... \\endcode block at line %d in %s!\n", + yyLineNr,yyFileName); + current->doc += "\\endcode\n\n"; + BEGIN( lastDocContext ); + } + else if (YY_START==ClassDocBrief && lastBriefContext==Doc) { current->doc += "\n\n"; @@ -3549,7 +3740,10 @@ VAR [vV][aA][rR] current->brief=current->brief.stripWhiteSpace(); BEGIN( lastBriefContext ); } -{BS}/("\\"|"@")"image" { BEGIN( lastBriefContext ); } +{BS}/("\\"|"@")("image"|"author"|"internal"|"version"|"date"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see") { + BEGIN( lastBriefContext ); + } + /* {BS}/("\\"|"@")"author" { BEGIN( lastBriefContext ); } {BS}/("\\"|"@")"internal" { BEGIN( lastBriefContext ); } {BS}/("\\"|"@")"version" { BEGIN( lastBriefContext ); } @@ -3561,6 +3755,7 @@ VAR [vV][aA][rR] {BS}/("\\"|"@")"bug" { BEGIN( lastBriefContext ); } {BS}/("\\"|"@")"warning" { BEGIN( lastBriefContext ); } {BS}/("\\"|"@")"par"{BN}+ { BEGIN( lastBriefContext ); } + */ {BS}/("\\brief"|"@short"){BN}+ { lastBriefContext=YY_START; BEGIN( ClassDocBrief ); @@ -3653,7 +3848,7 @@ VAR [vV][aA][rR] . { current->doc += *yytext; } . { current->brief += *yytext; } \n { yyLineNr++; current->doc += *yytext; } -[\n\r]{B}*"//"[!/] +[\n\r]+{B}*"//"[!/] { lineCount(); } \n { yyLineNr++; BEGIN( lastDocContext ); @@ -3666,6 +3861,7 @@ VAR [vV][aA][rR] "/*"|"//" { current->brief+=yytext; } \n { + yyLineNr++; if (afterDocTerminator!=0) unput(afterDocTerminator); BEGIN(lastAfterDocContext); @@ -3701,7 +3897,7 @@ VAR [vV][aA][rR] unput(afterDocTerminator); BEGIN(lastAfterDocContext); } -"*/" { +"*/" { current->doc += "\n\n"; err("Warning: unexpected end of " "documentation block found in " @@ -3711,6 +3907,7 @@ VAR [vV][aA][rR] "*/" { checkDocs(); current->doc += "\n\n"; + //printf("End of docs at line %d\n",yyLineNr); BEGIN( lastDocContext ); } "*/" { @@ -3723,6 +3920,7 @@ VAR [vV][aA][rR] .*\n { yyLineNr++ ; BEGIN( lastCContext ) ; } +[^\*\n]+ <*>. <*>\n { yyLineNr++ ; } "//"|"/*" @@ -3738,17 +3936,17 @@ VAR [vV][aA][rR] //---------------------------------------------------------------------------- -static void addToBody(const char *text) -{ - if (Config::includeSourceFlag) - previous->body+=text; -} +//static void addToBody(const char *text) +//{ +// if (Config::includeSourceFlag) +// previous->body+=text; +//} -static void addToBodyCond(const char *text) -{ - if (Config::includeSourceFlag && lastStringContext==SkipCurly) - previous->body+=text; -} +//static void addToBodyCond(const char *text) +//{ +// if (Config::includeSourceFlag && lastStringContext==SkipCurly) +// previous->body+=text; +//} //---------------------------------------------------------------------------- @@ -3809,6 +4007,7 @@ void parseCompounds(Entry *rt) current_root = ce ; strcpy( yyFileName, ce->fileName ) ; yyLineNr = ce->startLine ; + //printf("---> Inner block starts at line %d\n",yyLineNr); //current->reset(); current = new Entry; // set default protection based on the compound type diff --git a/src/tag.cpp b/src/tag.cpp new file mode 100644 index 0000000..8496467 --- /dev/null +++ b/src/tag.cpp @@ -0,0 +1,1964 @@ +#define yy_create_buffer tagYY_create_buffer +#define yy_delete_buffer tagYY_delete_buffer +#define yy_scan_buffer tagYY_scan_buffer +#define yy_scan_string tagYY_scan_string +#define yy_scan_bytes tagYY_scan_bytes +#define yy_flex_debug tagYY_flex_debug +#define yy_init_buffer tagYY_init_buffer +#define yy_flush_buffer tagYY_flush_buffer +#define yy_load_buffer_state tagYY_load_buffer_state +#define yy_switch_to_buffer tagYY_switch_to_buffer +#define yyin tagYYin +#define yyleng tagYYleng +#define yylex tagYYlex +#define yyout tagYYout +#define yyrestart tagYYrestart +#define yytext tagYYtext + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header$ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define yywrap() 1 +#define YY_SKIP_YYWRAP +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 20 +#define YY_END_OF_BUFFER 21 +static yyconst short int yy_accept[69] = + { 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, 21, 18, 19, 3, + 2, 1, 18, 5, 6, 7, 18, 8, 18, 18, + 18, 18, 17, 18, 12, 18, 14, 13, 0, 4, + 6, 0, 8, 0, 11, 0, 15, 0, 9, 0, + 10, 0, 16, 0, 13, 0, 0, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 4, 1, 1, 5, 6, 1, 1, + 1, 1, 7, 1, 7, 7, 7, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 9, 1, 1, + 1, 10, 11, 1, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 1, 7, 1, 1, 12, 1, 12, 12, 12, 12, + + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 1, 1, 1, 13, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[14] = + { 0, + 1, 2, 1, 1, 1, 1, 3, 4, 5, 1, + 6, 4, 1 + } ; + +static yyconst short int yy_base[81] = + { 0, + 51, 50, 47, 0, 46, 12, 21, 0, 32, 35, + 38, 41, 38, 43, 48, 53, 59, 0, 64, 69, + 80, 0, 91, 94, 97, 100, 47, 153, 153, 153, + 153, 153, 41, 153, 0, 153, 37, 153, 29, 26, + 23, 22, 153, 19, 153, 24, 23, 153, 23, 153, + 0, 21, 153, 15, 12, 11, 153, 10, 0, 9, + 8, 5, 153, 11, 153, 2, 0, 153, 104, 110, + 116, 122, 0, 128, 131, 133, 136, 138, 140, 146 + } ; + +static yyconst short int yy_def[81] = + { 0, + 69, 69, 69, 69, 69, 69, 69, 7, 69, 69, + 70, 70, 7, 7, 7, 7, 7, 17, 7, 7, + 7, 21, 69, 69, 71, 71, 68, 68, 68, 68, + 68, 68, 72, 68, 73, 68, 74, 68, 75, 76, + 77, 78, 68, 79, 68, 80, 80, 68, 72, 68, + 73, 74, 68, 75, 68, 76, 68, 77, 58, 78, + 68, 79, 68, 80, 68, 75, 78, 0, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 68, 68 + } ; + +static yyconst short int yy_nxt[167] = + { 0, + 68, 29, 68, 51, 30, 31, 68, 68, 68, 32, + 68, 33, 33, 29, 65, 63, 67, 61, 59, 57, + 66, 34, 29, 55, 53, 50, 65, 65, 35, 63, + 61, 59, 35, 29, 57, 36, 29, 55, 36, 29, + 53, 38, 29, 50, 38, 39, 68, 29, 29, 39, + 39, 29, 29, 68, 39, 40, 68, 68, 68, 40, + 40, 68, 68, 68, 40, 41, 41, 41, 68, 68, + 41, 42, 68, 68, 68, 42, 42, 68, 68, 68, + 42, 43, 68, 68, 68, 68, 68, 44, 68, 68, + 68, 44, 29, 68, 45, 29, 68, 45, 47, 68, + + 48, 47, 68, 48, 28, 28, 28, 28, 28, 28, + 37, 37, 37, 37, 37, 37, 46, 46, 46, 46, + 46, 46, 49, 68, 49, 49, 49, 49, 52, 68, + 52, 52, 52, 52, 54, 54, 56, 56, 58, 58, + 58, 60, 60, 62, 68, 62, 64, 64, 64, 64, + 64, 64, 27, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68 + } ; + +static yyconst short int yy_chk[167] = + { 0, + 0, 4, 0, 73, 4, 4, 0, 0, 67, 4, + 66, 4, 4, 6, 64, 62, 61, 60, 58, 56, + 55, 6, 7, 54, 52, 49, 47, 46, 7, 44, + 42, 41, 7, 9, 40, 9, 10, 39, 10, 11, + 37, 11, 12, 33, 12, 13, 27, 5, 3, 13, + 14, 2, 1, 0, 14, 15, 0, 0, 0, 15, + 16, 0, 0, 0, 16, 17, 17, 17, 0, 0, + 17, 19, 0, 0, 0, 19, 20, 0, 0, 0, + 20, 21, 0, 0, 0, 0, 0, 21, 0, 0, + 0, 21, 23, 0, 23, 24, 0, 24, 25, 0, + + 25, 26, 0, 26, 69, 69, 69, 69, 69, 69, + 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, + 71, 71, 72, 0, 72, 72, 72, 72, 74, 0, + 74, 74, 74, 74, 75, 75, 76, 76, 77, 77, + 77, 78, 78, 79, 0, 79, 80, 80, 80, 80, + 80, 80, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "tag.l" +#define INITIAL 0 +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-1999 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ +#line 18 "tag.l" + +/* + * includes + */ +#include + +#include "qtbc.h" +#include + +#include "classdef.h" +#include "filedef.h" +#include "namespacedef.h" +#include "memberdef.h" +#include "doxygen.h" +#include "util.h" +#include "message.h" +#include "defargs.h" + +#define YY_NO_UNPUT +#define YY_NEVER_INTERACTIVE 1 + +static int yyLineNr; +static QCString className; +static QCString fileName; +static QCString namespaceName; +static QCString tagName; +static QCString memberName; +static QCString anchorName; +static QCString argString; +static ClassDef *cd; +static FileDef *fd; +static NamespaceDef *nd; + +static void addClass(const char *name,const char *fileName) +{ + //printf("adding class %s\n",name); + if (name!=0 && strlen(name)>0 && classDict[name]==0) + { + cd = new ClassDef(name,ClassDef::Class,tagName,fileName); + fd = 0; + nd = 0; + classList.inSort(cd); + classDict.insert(className,cd); + } +} + +static void addFile(const char *name) +{ + //printf("adding file %s tagName=`%s'\n",name,tagName.data()); + fd = new FileDef(0,name,tagName); + FileName *mn; + if ((mn=inputNameDict[name])) + { + mn->append(fd); + } + else + { + mn = new FileName(name,name); + mn->append(fd); + inputNameList.inSort(mn); + inputNameDict.insert(name,mn); + } + cd = 0; + nd = 0; + //fileList.inSort(fd); + //fileDict.insert(fileName,fd); +} + +static void addNamespace(const char *name) +{ + if ((nd=namespaceDict[name])==0) + { + // TODO: we assume that each namespace is limited to a single tagfile. + // since namespace are open, this need not to be the case. As a result + // namespace may contain members that are located in + // different namespaces! + nd = new NamespaceDef(name,tagName); + namespaceList.inSort(nd); + namespaceDict.insert(name,nd); + } + cd = 0; + fd = 0; +} + +static void addMember(const char *name,const char *anchor,const char *args) +{ + //printf("adding member `%s' `%s'\n",name,anchor); + if (cd || fd) + { + MemberNameDict *mnd=0; + MemberNameList *mnl=0; + MemberDef *md; + ArgumentList *argList = new ArgumentList; + stringToArgumentList(args,argList); + md=new MemberDef(0,name,args,0,Public,Normal,FALSE,FALSE, + MemberDef::Function,0,argList); + delete argList; + md->setAnchor(anchor); + md->setReference(tagName); + if (cd) // member of a class + { + md->setMemberClass(cd); + cd->insertMember(md); + mnd=&memberNameDict; + mnl=&memberNameList; + } + else if (nd) // member of a namespace + { + md->setNamespace(nd); + nd->insertMember(md); + mnd=&functionNameDict; + mnl=&functionNameList; + } + else // member of a file + { + md->setFileDef(fd); + fd->insertMember(md); + mnd=&functionNameDict; + mnl=&functionNameList; + } + MemberName *mn = 0; + if ((mn=(*mnd)[memberName])) + { + //printf("mn->inSort()\n"); + mn->append(md); + } + else + { + //printf("mn->append()\n"); + mn=new MemberName(memberName); + mn->append(md); + //printf("Adding memberName=%s\n",mn->memberName()); + mnl->inSort(mn); + mnd->insert(memberName,mn); + } + } +} + +/* ----------------------------------------------------------------- + */ + +#define Pass1 1 + +#define Pass2 2 + +#define AnchorName 3 + +#define ArgString1 4 + +#define ArgString2 5 + +#define ClassName1 6 + +#define ClassName2 7 + +#define FileName 8 + +#define NamespaceName 9 + +#define BaseClasses 10 + +#define ClassFile1 11 + +#define ClassFile2 12 + + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + yy_current_buffer->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 180 "tag.l" + + + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 69 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 153 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 182 "tag.l" +{ // start of a class + BEGIN(ClassName1); + } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 185 "tag.l" +{ // start of a file + BEGIN(FileName); + } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 188 "tag.l" +{ // start of a namespace + BEGIN(NamespaceName); + } + YY_BREAK +case 4: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 191 "tag.l" +{ + memberName=yytext; + BEGIN(AnchorName); + } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 195 "tag.l" +{ + BEGIN(ClassName2); + } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 198 "tag.l" +{ + anchorName=yytext; + BEGIN(ArgString1); + } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 202 "tag.l" +{ + BEGIN(ArgString2); + } + YY_BREAK +case 8: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 205 "tag.l" +{ + argString=yytext; + addMember(memberName,anchorName,argString); + BEGIN(Pass1); + } + YY_BREAK +case 9: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 210 "tag.l" +{ + fileName=yytext; + addFile(yytext); + BEGIN(Pass1); + } + YY_BREAK +case 10: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 215 "tag.l" +{ + namespaceName=yytext; + addNamespace(yytext); + BEGIN(Pass1); + } + YY_BREAK +case 11: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 220 "tag.l" +{ + className=yytext; + BEGIN(ClassFile1); + } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 224 "tag.l" +{ + BEGIN(ClassFile2); + } + YY_BREAK +case 13: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 227 "tag.l" +{ + addClass(className,yytext); + BEGIN(Pass1); + } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 231 "tag.l" +{ + yyLineNr++; + BEGIN(Pass1); + } + YY_BREAK +case 15: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 235 "tag.l" +{ + cd=getClass(yytext); + BEGIN(BaseClasses); + } + YY_BREAK +case 16: +*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ +yy_c_buf_p = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 239 "tag.l" +{ + ClassDef *bcd=getClass(yytext); + if (cd && bcd) + { + cd->insertBaseClass(bcd,Public,Normal); + bcd->insertSuperClass(cd,Public,Normal); + } + } + YY_BREAK +case 17: +YY_RULE_SETUP +#line 247 "tag.l" +{ + yyLineNr++; + BEGIN(Pass2); + } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 251 "tag.l" + + YY_BREAK +case 19: +YY_RULE_SETUP +#line 252 "tag.l" +{ yyLineNr++ ; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 254 "tag.l" +ECHO; + YY_BREAK +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(Pass1): +case YY_STATE_EOF(Pass2): +case YY_STATE_EOF(AnchorName): +case YY_STATE_EOF(ArgString1): +case YY_STATE_EOF(ArgString2): +case YY_STATE_EOF(ClassName1): +case YY_STATE_EOF(ClassName2): +case YY_STATE_EOF(FileName): +case YY_STATE_EOF(NamespaceName): +case YY_STATE_EOF(BaseClasses): +case YY_STATE_EOF(ClassFile1): +case YY_STATE_EOF(ClassFile2): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 69 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 69 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 68); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + yy_current_buffer->yy_at_bol = (c == '\n'); + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 254 "tag.l" + + +/*@ ---------------------------------------------------------------------------- + */ + +void parseTagFile(const char *fileName) +{ + FILE *f=fopen(fileName,"r"); + QFileInfo fi(fileName); + if (!f || !fi.exists()); + tagName = fi.fileName(); + tagYYin = f; + + cd=0; + yyLineNr = 1; + tagYYrestart( tagYYin ); + BEGIN(Pass1); + tagYYlex(); + + rewind(f); + cd=0; + yyLineNr = 1; + tagYYrestart( tagYYin ); + BEGIN(Pass2); + tagYYlex(); + + fclose(f); +} + +//extern "C" { // some bogus code to keep the compiler happy +// int tagYYwrap() { return 1 ; } +//} diff --git a/src/tag.l b/src/tag.l index 35b2c5c..ff3dea4 100644 --- a/src/tag.l +++ b/src/tag.l @@ -22,7 +22,7 @@ #include #include "qtbc.h" -#include +#include #include "classdef.h" #include "filedef.h" @@ -72,7 +72,7 @@ static void addFile(const char *name) } else { - mn = new FileName(name); + mn = new FileName(name,name); mn->append(fd); inputNameList.inSort(mn); inputNameDict.insert(name,mn); diff --git a/src/translator.h b/src/translator.h index 6d91eac..d5778d3 100644 --- a/src/translator.h +++ b/src/translator.h @@ -193,8 +193,8 @@ class Translator /*! This is an introduction to the annotated compound list. */ virtual QCString trCompoundListDescription() - { return "Here are the classes, structs and " - "unions with brief descriptions:"; + { return "Here are the classes, structs, " + "unions and interfaces with brief descriptions:"; } /*! This is an introduction to the page with all class members. */ @@ -716,7 +716,23 @@ class Translator */ virtual QCString trPageAbbreviation() { return "p."; } -}; +////////////////////////////////////////////////////////////////////////// +// new since 0.49-991003 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trSources() + { + return "Sources"; + } + virtual QCString trDefinedAtLineInSourceFile() + { + return "Definition at line @0 of file @1."; + } + virtual QCString trDefinedInSourceFile() + { + return "Definition in file @0."; + } +}; #endif diff --git a/src/translator_cz.h b/src/translator_cz.h index a867de8..fd868a1 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -36,23 +36,23 @@ class TranslatorCzech : public Translator QCString trAnd() { return "a"; } QCString trInheritedBy() - { return "Je Potomkem"; } + { return "Je potomkem"; } QCString trRelatedFunctions() - { return "Pribuzne Metody"; } + { return "Pribuzne metody"; } QCString trRelatedSubscript() { return "(Tyto funkce nejsou metody.)"; } QCString trDetailedDescription() - { return "Podrobna Dokumentace"; } + { return "Podrobna dokumentace"; } QCString trMemberTypedefDocumentation() - { return "Dokumentace pro Deklaraci Typu (typedef) ve Tride";} + { return "Dokumentace pro deklaraci typu (typedef) ve tride";} QCString trMemberEnumerationDocumentation() - { return "Dokumentace Vyctovych Typu"; } + { return "Dokumentace vyctovych typu"; } QCString trEnumerationValueDocumentation() - { return "Dokumentace Hodnot Vyctovych Typu"; } + { return "Dokumentace hodnot vyctovych typu"; } QCString trMemberFunctionDocumentation() - { return "Dokumentace Metod"; } + { return "Dokumentace metod"; } QCString trMemberDataDocumentation() - { return "Dokumentace Datovych Slozek Tridy"; } + { return "Dokumentace datovych slozek tridy"; } QCString trGeneratedFrom(const char *s,bool single) { QCString result=(QCString)"Dokumentace pro tento"+s+ @@ -65,15 +65,15 @@ class TranslatorCzech : public Translator QCString trReference() { return "Reference"; } QCString trListOfAllMembers() - { return "Seznam vsech datovych slozek a metod tridy."; } + { return "Seznam vsech datovych polozek a metod tridy."; } QCString trMemberList() { return "Seznam datovych polozek a metod tridy"; } QCString trThisIsTheListOfAllMembers() - { return "Toto je uplny seznam datovych slozek a metod tridy pro"; } + { return "Toto je uplny seznam datovych polozek a metod tridy pro"; } QCString trIncludingInheritedMembers() - { return "zahrnuje vsechny nasledujici zdedene datove slozky a metody."; } + { return "zahrnuje vsechny nasledujici zdedene datove polozky a metody."; } QCString trGeneratedAutomatically(const char *s) - { QCString result="Automaticky vygenerovany pomoci programu Doxygen"; + { QCString result="Automaticky vygenerovany pomoci programu doxygen"; if (s) result+=(QCString)" pro "+s; result+=" ze zdrojoveho souboru."; return result; @@ -115,7 +115,7 @@ class TranslatorCzech : public Translator QCString trFileListDescription(bool extractAll) { QCString result="A toto je seznam vsech "; - if (!extractAll) result+="dokumentovanych "; + if (!extractAll) result+="zdokumentovanych "; result+="souboru s kratkymi popisy:"; return result; } @@ -126,7 +126,7 @@ class TranslatorCzech : public Translator QCString trCompoundMembersDescription(bool extractAll) { QCString result="Zde je seznam vsech "; - if (!extractAll) result+="dokumentovanych "; + if (!extractAll) result+="zdokumentovanych "; result+="clenu tridy (metod a datovych slozek) s odkazy na "; if (extractAll) result+="dokumentaci tridy pro kazdo polozku:"; else result+="tridy, kam patri:"; @@ -159,7 +159,7 @@ class TranslatorCzech : public Translator QCString trModuleIndex() { return "Index modulu"; } QCString trHierarchicalIndex() - { return "Index Hierarchie"; } + { return "Index hierarchie"; } QCString trCompoundIndex() { return "Index objektovych typu"; } QCString trFileIndex() @@ -192,7 +192,7 @@ class TranslatorCzech : public Translator QCString trEnumerationValues() { return "Hodnoty vyctovych typu"; } QCString trReimplementedFrom() - { return "Je znovu implementovan z"; } + { return "Je znovu implementovan podle"; } QCString trReimplementedIn() { return "Je znovu implementovan v"; } QCString trAuthor() @@ -215,14 +215,14 @@ class TranslatorCzech : public Translator { return "Soubory:"; } QCString trGeneratedAt(const char *date,const char *projName) { - QCString result=(QCString)"Gegenerovany v "+date; + QCString result=(QCString)"Generovany dne "+date; if (projName) result+=(QCString)" pro "+projName; result+=(QCString)" "; return result; } QCString trWrittenBy() { - return "napsany "; + return "napsany podle"; } QCString trClassDiagram(const char *clName) { @@ -248,29 +248,242 @@ class TranslatorCzech : public Translator QCString trReturns() { return "ma navratovou hodnotu"; } QCString trSeeAlso() - { return "Podivej se take na"; } + { return "Podrobnosti take tady"; } QCString trParameters() { return "Parametry"; } QCString trExceptions() { return "Vyjimky"; } QCString trGeneratedBy() - { return "Gegenerovan podle"; } + { return "Generovan podle"; } // new since 0.49-990307 - QCString trNamespaces() - { return "Prostory jmen"; } QCString trNamespaceList() { return "Seznam prostoru jmen"; } QCString trNamespaceListDescription(bool extractAll) { - QCString result="Zde jsou vsechny "; - if (!extractAll) result+="dokumentovane "; - result+="prostory jem s kratkymi popisy:"; + QCString result="Zde je seznam vsech "; + if (!extractAll) result+="dokumentovanych "; + result+="prostoru jmen s kratkymi popisy:"; return result; } QCString trFriends() { return "Spratelene tridy, funkce a metody"; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990405 +////////////////////////////////////////////////////////////////////////// + + /*! used in the class documentation as a header before the list of all + * related classes + */ + QCString trRelatedFunctionDocumentation() + { return "Dokumentace pro spratelene funkce a ostatni"; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990425 +////////////////////////////////////////////////////////////////////////// + + /*! used as the title of the HTML page of a class/struct/union */ + QCString trCompoundReference(const char *clName, + ClassDef::CompoundType compType) + { + QCString result=(QCString)clName+" "; + result+=" Reference"; + switch(compType) + { + case ClassDef::Class: result+=" tridy"; break; + case ClassDef::Struct: result+=" struktury"; break; + case ClassDef::Union: result+=" unie"; break; + case ClassDef::Interface: result+=" rozhrani"; break; + } + return result; + } + + /*! used as the title of the HTML page of a file */ + QCString trFileReference(const char *fileName) + { + QCString result=fileName; + result+=" Reference souboru"; + return result; + } + + /*! used as the title of the HTML page of a namespace */ + QCString trNamespaceReference(const char *namespaceName) + { + QCString result=namespaceName; + result+=" Reference prostoru jmen"; + return result; + } + + /*! \mgroup Class sections + * these are for the member sections of a class, struct or union + */ + QCString trPublicMembers() + { return "Verejne metody a datove polozky"; } + QCString trPublicSlots() + { return "Verejne sloty"; } + QCString trSignals() + { return "Signaly"; } + QCString trStaticPublicMembers() + { return "Staticke verejne metody a datove polozky"; } + QCString trProtectedMembers() + { return "Chranene metody a datove polozky"; } + QCString trProtectedSlots() + { return "Chranene sloty"; } + QCString trStaticProtectedMembers() + { return "Staticke chranene metody a datove polozky"; } + QCString trPrivateMembers() + { return "Privatni metody a datove polozky"; } + QCString trPrivateSlots() + { return "Privatni sloty"; } + QCString trStaticPrivateMembers() + { return "Staticke privatni metody a datove polozky"; } + /*! \endmgroup */ + + /*! this function is used to produce a comma-separated list of items. + * use generateMarker(i) to indicate where item i should be put. + */ + QCString trWriteList(int numEntries) + { + QCString result; + int i; + // the inherits list contain `numEntries' classes + for (i=0;i