Merge branch 'master' into print_error
authorAlexis Laferrière <alexis.laf@xymus.net>
Tue, 12 May 2015 12:43:19 +0000 (08:43 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Tue, 12 May 2015 12:43:19 +0000 (08:43 -0400)
247 files changed:
contrib/nitiwiki/Makefile
contrib/nitiwiki/README.md
contrib/nitiwiki/src/nitiwiki.nit
contrib/nitiwiki/src/wiki_base.nit
contrib/nitiwiki/src/wiki_html.nit
contrib/nitiwiki/src/wiki_links.nit [new file with mode: 0644]
contrib/nitiwiki/tests/nitiwiki.args
contrib/nitiwiki/tests/nitiwiki_render.args [deleted file]
contrib/nitiwiki/tests/nitiwiki_status.args [deleted file]
contrib/nitiwiki/tests/res/nitiwiki_render.res [deleted file]
contrib/nitiwiki/tests/res/wiki1_nitiwiki_render.res [new file with mode: 0644]
contrib/nitiwiki/tests/res/wiki1_nitiwiki_status.res [new file with mode: 0644]
contrib/nitiwiki/tests/res/wiki2_nitiwiki_render.res [new file with mode: 0644]
contrib/nitiwiki/tests/res/wiki2_nitiwiki_status.res [moved from contrib/nitiwiki/tests/res/nitiwiki_status.res with 68% similarity]
contrib/nitiwiki/tests/wiki1_nitiwiki_render.args [new file with mode: 0644]
contrib/nitiwiki/tests/wiki1_nitiwiki_status.args [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/assets/css/main.css [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/config.ini [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/pages/contact.md [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/pages/index.md [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/pages/other_page.md [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/pages/sec1/index.md [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/pages/sec2/config.ini [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/pages/sec2/index.md [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/pages/sec2/sub-sec21/index.md [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/pages/sec2/sub-sec22/index.md [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/pages/sec2/sub-sec22/other.md [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/templates/footer.html [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/templates/header.html [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/templates/menu.html [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2/templates/template.html [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2_nitiwiki_render.args [new file with mode: 0644]
contrib/nitiwiki/tests/wiki2_nitiwiki_status.args [new file with mode: 0644]
contrib/nitrpg/src/achievements.nit
contrib/nitrpg/src/reactors.nit
contrib/nitrpg/src/statistics.nit
contrib/refund/.gitignore [new file with mode: 0644]
contrib/refund/Makefile [new file with mode: 0644]
contrib/refund/src/refund.nit [new file with mode: 0644]
contrib/refund/src/refund_base.nit [new file with mode: 0644]
contrib/refund/src/refund_json.nit [new file with mode: 0644]
contrib/refund/tests/Makefile [new file with mode: 0644]
contrib/refund/tests/client_error1.json [new file with mode: 0644]
contrib/refund/tests/client_error2.json [new file with mode: 0644]
contrib/refund/tests/client_error3.json [new file with mode: 0644]
contrib/refund/tests/client_error4.json [new file with mode: 0644]
contrib/refund/tests/contractA1.json [new file with mode: 0644]
contrib/refund/tests/contractA2.json [new file with mode: 0644]
contrib/refund/tests/contractA3.json [new file with mode: 0644]
contrib/refund/tests/contractA4.json [new file with mode: 0644]
contrib/refund/tests/contractA5.json [new file with mode: 0644]
contrib/refund/tests/contractB1.json [new file with mode: 0644]
contrib/refund/tests/contractB2.json [new file with mode: 0644]
contrib/refund/tests/contractB3.json [new file with mode: 0644]
contrib/refund/tests/contractB4.json [new file with mode: 0644]
contrib/refund/tests/contractB5.json [new file with mode: 0644]
contrib/refund/tests/contractC1.json [new file with mode: 0644]
contrib/refund/tests/contractC2.json [new file with mode: 0644]
contrib/refund/tests/contractC3.json [new file with mode: 0644]
contrib/refund/tests/contractD1.json [new file with mode: 0644]
contrib/refund/tests/contractD2.json [new file with mode: 0644]
contrib/refund/tests/contractD3.json [new file with mode: 0644]
contrib/refund/tests/contractD4.json [new file with mode: 0644]
contrib/refund/tests/contractE1.json [new file with mode: 0644]
contrib/refund/tests/contractE2.json [new file with mode: 0644]
contrib/refund/tests/contractE3.json [new file with mode: 0644]
contrib/refund/tests/contractE4.json [new file with mode: 0644]
contrib/refund/tests/contract_error1.json [new file with mode: 0644]
contrib/refund/tests/contract_error2.json [new file with mode: 0644]
contrib/refund/tests/contract_error3.json [new file with mode: 0644]
contrib/refund/tests/contract_error4.json [new file with mode: 0644]
contrib/refund/tests/dossier_error1.json [new file with mode: 0644]
contrib/refund/tests/json_error1.json [new file with mode: 0644]
contrib/refund/tests/json_error2.json [new file with mode: 0644]
contrib/refund/tests/json_error3.json [new file with mode: 0644]
contrib/refund/tests/month_error1.json [new file with mode: 0644]
contrib/refund/tests/month_error2.json [new file with mode: 0644]
contrib/refund/tests/month_error3.json [new file with mode: 0644]
contrib/refund/tests/month_error4.json [new file with mode: 0644]
contrib/refund/tests/recl_date_error1.json [new file with mode: 0644]
contrib/refund/tests/recl_date_error2.json [new file with mode: 0644]
contrib/refund/tests/recl_date_error3.json [new file with mode: 0644]
contrib/refund/tests/recl_date_error4.json [new file with mode: 0644]
contrib/refund/tests/recl_error1.json [new file with mode: 0644]
contrib/refund/tests/recl_error2.json [new file with mode: 0644]
contrib/refund/tests/recl_error3.json [new file with mode: 0644]
contrib/refund/tests/recl_error4.json [new file with mode: 0644]
contrib/refund/tests/recl_fees_error1.json [new file with mode: 0644]
contrib/refund/tests/recl_fees_error2.json [new file with mode: 0644]
contrib/refund/tests/recl_fees_error3.json [new file with mode: 0644]
contrib/refund/tests/recl_fees_error4.json [new file with mode: 0644]
contrib/refund/tests/recl_soin_error1.json [new file with mode: 0644]
contrib/refund/tests/recl_soin_error2.json [new file with mode: 0644]
contrib/refund/tests/recl_soin_error3.json [new file with mode: 0644]
contrib/refund/tests/res/client_error1.res [new file with mode: 0644]
contrib/refund/tests/res/client_error2.res [new file with mode: 0644]
contrib/refund/tests/res/client_error3.res [new file with mode: 0644]
contrib/refund/tests/res/client_error4.res [new file with mode: 0644]
contrib/refund/tests/res/contractA1.res [new file with mode: 0644]
contrib/refund/tests/res/contractA2.res [new file with mode: 0644]
contrib/refund/tests/res/contractA3.res [new file with mode: 0644]
contrib/refund/tests/res/contractA4.res [new file with mode: 0644]
contrib/refund/tests/res/contractA5.res [new file with mode: 0644]
contrib/refund/tests/res/contractB1.res [new file with mode: 0644]
contrib/refund/tests/res/contractB2.res [new file with mode: 0644]
contrib/refund/tests/res/contractB3.res [new file with mode: 0644]
contrib/refund/tests/res/contractB4.res [new file with mode: 0644]
contrib/refund/tests/res/contractB5.res [new file with mode: 0644]
contrib/refund/tests/res/contractC1.res [new file with mode: 0644]
contrib/refund/tests/res/contractC2.res [new file with mode: 0644]
contrib/refund/tests/res/contractC3.res [new file with mode: 0644]
contrib/refund/tests/res/contractD1.res [new file with mode: 0644]
contrib/refund/tests/res/contractD2.res [new file with mode: 0644]
contrib/refund/tests/res/contractD3.res [new file with mode: 0644]
contrib/refund/tests/res/contractD4.res [new file with mode: 0644]
contrib/refund/tests/res/contractE1.res [new file with mode: 0644]
contrib/refund/tests/res/contractE2.res [new file with mode: 0644]
contrib/refund/tests/res/contractE3.res [new file with mode: 0644]
contrib/refund/tests/res/contractE4.res [new file with mode: 0644]
contrib/refund/tests/res/contract_error1.res [new file with mode: 0644]
contrib/refund/tests/res/contract_error2.res [new file with mode: 0644]
contrib/refund/tests/res/contract_error3.res [new file with mode: 0644]
contrib/refund/tests/res/contract_error4.res [new file with mode: 0644]
contrib/refund/tests/res/dossier_error1.res [new file with mode: 0644]
contrib/refund/tests/res/json_error1.res [new file with mode: 0644]
contrib/refund/tests/res/json_error2.res [new file with mode: 0644]
contrib/refund/tests/res/json_error3.res [new file with mode: 0644]
contrib/refund/tests/res/month_error1.res [new file with mode: 0644]
contrib/refund/tests/res/month_error2.res [new file with mode: 0644]
contrib/refund/tests/res/month_error3.res [new file with mode: 0644]
contrib/refund/tests/res/month_error4.res [new file with mode: 0644]
contrib/refund/tests/res/recl_date_error1.res [new file with mode: 0644]
contrib/refund/tests/res/recl_date_error2.res [new file with mode: 0644]
contrib/refund/tests/res/recl_date_error3.res [new file with mode: 0644]
contrib/refund/tests/res/recl_date_error4.res [new file with mode: 0644]
contrib/refund/tests/res/recl_error1.res [new file with mode: 0644]
contrib/refund/tests/res/recl_error2.res [new file with mode: 0644]
contrib/refund/tests/res/recl_error3.res [new file with mode: 0644]
contrib/refund/tests/res/recl_error4.res [new file with mode: 0644]
contrib/refund/tests/res/recl_fees_error1.res [new file with mode: 0644]
contrib/refund/tests/res/recl_fees_error2.res [new file with mode: 0644]
contrib/refund/tests/res/recl_fees_error3.res [new file with mode: 0644]
contrib/refund/tests/res/recl_fees_error4.res [new file with mode: 0644]
contrib/refund/tests/res/recl_soin_error1.res [new file with mode: 0644]
contrib/refund/tests/res/recl_soin_error2.res [new file with mode: 0644]
contrib/refund/tests/res/recl_soin_error3.res [new file with mode: 0644]
contrib/refund/tests/tests.sh [new file with mode: 0755]
examples/calculator/Makefile
examples/calculator/src/calculator_gtk.nit
examples/langannot.nit
examples/languages/en/LC_MESSAGES/langannot.po
examples/languages/fr/LC_MESSAGES/langannot.po
examples/languages/ja/LC_MESSAGES/langannot.po
examples/languages/langannot.pot
examples/mnit_simple/src/test_intent.nit
lib/android/android.nit
lib/android/data_store.nit [moved from lib/android/android_data_store.nit with 97% similarity]
lib/android/intent/intent_api10.nit
lib/android/shared_preferences/shared_preferences_api10.nit
lib/android/toast.nit
lib/android/ui/native_ui.nit [moved from lib/android/ui.nit with 61% similarity]
lib/android/ui/ui.nit [new file with mode: 0644]
lib/android/vibration.nit
lib/bitmap/bitmap.nit [new file with mode: 0644]
lib/bitmap/test_bitmap.nit [new file with mode: 0644]
lib/c.nit
lib/github/api.nit
lib/gtk/v3_4/gdk_enums.nit
lib/gtk/v3_4/gtk_assistant.nit
lib/gtk/v3_4/gtk_core.nit
lib/gtk/v3_4/gtk_dialogs.nit
lib/gtk/v3_4/gtk_widgets_ext.nit
lib/gtk/v3_4/v3_4.nit
lib/gtk/v3_6.nit
lib/gtk/v3_8.nit
lib/json/static.nit
lib/linux/data_store.nit [moved from lib/linux/linux_data_store.nit with 97% similarity]
lib/linux/linux.nit
lib/markdown/markdown.nit
lib/mongodb/mongodb.nit [new file with mode: 0644]
lib/mongodb/native_mongodb.nit [new file with mode: 0644]
lib/standard/string.nit
misc/vim/syntax/nit.vim
src/astbuilder.nit
src/c_tools.nit
src/compiler/compiler_ffi/compiler_ffi.nit [moved from src/compiler/compiler_ffi.nit with 63% similarity]
src/compiler/compiler_ffi/light.nit [new file with mode: 0644]
src/compiler/compiler_ffi/light_only.nit [new file with mode: 0644]
src/ffi/c.nit
src/ffi/extern_classes.nit
src/ffi/ffi.nit
src/ffi/ffi_base.nit
src/ffi/java.nit
src/ffi/light_c.nit [new file with mode: 0644]
src/ffi/light_ffi.nit [new file with mode: 0644]
src/ffi/light_ffi_base.nit [new file with mode: 0644]
src/frontend/i18n_phase.nit
src/modelize/modelize_property.nit
src/nith.nit
src/nitni/nitni_base.nit
src/parser/nit.sablecc3xx
src/parser/parser.nit
src/parser/parser_abs.nit
src/parser/parser_nodes.nit
src/parser/parser_prod.nit
src/parser/tables_nit.c
tests/base_attr_abstract2.nit [new file with mode: 0644]
tests/sav/base_attr_abstract2.res [new file with mode: 0644]
tests/sav/base_formal_subtype.res
tests/sav/base_gen2_alt1.res
tests/sav/base_gen2_alt3.res
tests/sav/base_gen2_alt5.res
tests/sav/base_isa_gen1.res
tests/sav/base_isa_gen2.res
tests/sav/base_isa_gen4.res
tests/sav/base_isa_gen5.res
tests/sav/base_isa_gen8.res
tests/sav/base_isa_nullable1.res
tests/sav/base_isa_nullable2.res
tests/sav/base_isa_vt_gen1.res
tests/sav/error_formal.res
tests/sav/error_needed_method_alt2.res
tests/sav/error_operators.res
tests/sav/error_redef_1alt2_alt1.res
tests/sav/error_redef_1alt2_alt4.res
tests/sav/error_redef_1alt4_alt1.res
tests/sav/error_redef_1alt4_alt4.res
tests/sav/error_type_unk_alt2.res
tests/sav/error_virtual_type2.res
tests/sav/error_virtual_type2_alt1.res
tests/sav/error_virtual_type2_alt2.res
tests/sav/error_virtual_type2_alt3.res
tests/sav/error_virtual_type2_alt4.res
tests/sav/error_virtual_type2_alt5.res
tests/sav/error_virtual_type2_alt6.res
tests/sav/error_virtual_type_alt3.res
tests/sav/nitg-e/base_isa_gen1.res
tests/sav/nitg-e/base_isa_gen4.res
tests/sav/nitg-e/base_isa_gen5.res
tests/sav/nitg-e/base_isa_nullable1.res
tests/sav/nitg-e/base_isa_nullable2.res
tests/sav/nitmetrics_args1.res
tests/sav/nitpretty_args21.res
tests/sav/test_attr_easy.res
tests/sav/test_parser_args1.res
tests/sav/test_parser_args7.res
tests/test_gtk.nit

index 2bff3fc..b2b3fed 100644 (file)
@@ -4,8 +4,7 @@ nitiwiki:
        mkdir -p bin
        ../../bin/nitc src/nitiwiki.nit -o bin/nitiwiki
 
-check: tests
-tests: nitiwiki
+check: nitiwiki
        cd tests; make
 
 doc:
index abe84ad..1c764d4 100644 (file)
@@ -128,6 +128,55 @@ For more details on each option see `WikiConfig`.
 
 To add content in your wiki simply add markdown files (with `.md` extension) into the `pages/` folder.
 
+#### Write content
+
+Nitiwiki only support content written in
+[markdown format](http://daringfireball.net/projects/markdown/).
+
+#### Link wiki articles
+
+In nitiwiki, linking to a section or an article is done using the *wikilinks*.
+
+Wikilinks provide easy linking between pages of the wiki.
+To create a wikilink, just put the name of the page to link to in double brackets.
+For example `[[WikiLink]]`.
+
+If you ever need to write something like `[[WikiLink]]` without creating a wikilink,
+just prefix it with a `\\`, like `\\[[WikiLink]]`.
+
+There are some special linking precedence that come into play when linking between
+sections and sub-sections.
+
+Nitiwiki will chose the first entry that match the given wikilinks in that order:
+1. Looks in the current section
+2. Looks in the current section children recursively
+3. Looks in the current section parents until root
+
+To link to or from a subpage, you can use a regular wikilink that does not
+contain the name of the parent directory of the subpage.
+Nikiwiki descends the directory hierarchy looking for a page that matches your link.
+
+For example, if `FooBar/SubPage` links to `OtherPage`, nikiwiki will first prefer
+pointing the link to `FooBar/SubPage/OtherPage` if it exists, next to
+`FooBar/OtherPage` and finally to `OtherPage` in the root of the wiki.
+
+You can also specify a link that contains a relative section name,
+like `FooBar/OtherPage` to specify what page to link to.
+
+You can also use `/` at the start of a link, to specify exactly which page to link to,
+when there are multiple pages with similar names and the link goes to the wrong page by default.
+For example, linking from `FooBar/SubPage` to `/OtherPage` will link to the `OtherPage`
+in the root of the wiki, even if there is a `FooBar/OtherPage`.
+
+It's also possible to write a wikilink that uses something other than the page
+name as the link text.
+For example `[[Contact|Contact me!]]` links to the `Contact` page, but the link
+will appear like this: `Contact me!`.
+
+You can link to an anchor inside a page, using something like `[[WikiLink#foo]]`.
+
+#### Render the wiki in HTML
+
 Once you have done your changes, use:
 
        nitiwiki --status
index 200f971..803da02 100644 (file)
@@ -157,7 +157,11 @@ if opt_rsync.value then
 end
 
 # --status
-if opt_status.value or args.is_empty then
+if opt_status.value or
+       (not opt_clean.value and
+        not opt_fetch.value and
+        not opt_render.value and
+        not opt_rsync.value) then
        wiki.parse
        wiki.status
 end
index 1527d4c..56cbbcb 100644 (file)
@@ -16,7 +16,6 @@
 module wiki_base
 
 import template::macro
-import markdown
 import opts
 import ini
 
@@ -72,6 +71,9 @@ class Nitiwiki
                end
        end
 
+       # Render output.
+       fun render do end
+
        # Show wiki status.
        fun status do
                print "nitiWiki"
@@ -105,7 +107,7 @@ class Nitiwiki
                end
        end
 
-       # Display msg if `level >= verbose_level`
+       # Display msg if `level <= verbose_level`
        fun message(msg: String, level: Int) do
                if level <= verbose_level then print msg
        end
@@ -163,6 +165,7 @@ class Nitiwiki
        # `path` is used to determine the ancestor sections.
        protected fun new_article(path: String): WikiArticle do
                if entries.has_key(path) then return entries[path].as(WikiArticle)
+               message("Found article `{path}`", 2)
                var article = new WikiArticle.from_source(self, path)
                var section = new_section(path.dirname)
                section.add_child(article)
@@ -447,7 +450,7 @@ class WikiSection
        private fun try_load_config do
                var cfile = wiki.expand_path(wiki.config.root_dir, src_path, wiki.config_filename)
                if not cfile.file_exists then return
-               wiki.message("Custom config for section {name}", 2)
+               wiki.message("Custom config for section {name}", 1)
                config = new SectionConfig(cfile)
        end
 
@@ -512,18 +515,13 @@ class WikiArticle
        # Page content.
        #
        # What you want to be displayed in the page.
-       var content: nullable Writable = null
-
-       # Headlines ids and titles.
-       var headlines = new ArrayMap[String, HeadLine]
+       var content: nullable Writable = null is writable
 
-       # Create a new articleu sing a markdown source file.
+       # Create a new article using a markdown source file.
        init from_source(wiki: Nitiwiki, md_file: String) do
                src_full_path = md_file
                init(wiki, md_file.basename(".md"))
-               var md_proc = new MarkdownProcessor
-               content = md_proc.process(md)
-               headlines = md_proc.emitter.decorator.headlines
+               content = md
        end
 
        redef var src_full_path: nullable String = null
@@ -538,8 +536,8 @@ class WikiArticle
        # Extract the markdown text from `source_file`.
        #
        # REQUIRE: `has_source`.
-       var md: String is lazy do
-               assert has_source
+       var md: nullable String is lazy do
+               if not has_source then return null
                var file = new FileReader.open(src_full_path.to_s)
                var md = file.read_all
                file.close
index 3427016..461e9e5 100644 (file)
 # HTML wiki rendering
 module wiki_html
 
-import wiki_base
+import wiki_links
 
 redef class Nitiwiki
 
        # Render HTML output looking for changes in the markdown sources.
-       fun render do
+       redef fun render do
+               super
                if not root_section.is_dirty and not force_render then return
                var out_dir = expand_path(config.root_dir, config.out_dir)
                out_dir.mkdir
@@ -47,10 +48,6 @@ redef class Nitiwiki
 end
 
 redef class WikiEntry
-
-       # Url to `self` once generated.
-       fun url: String do return wiki.config.root_url.join_path(breadcrumbs.join("/"))
-
        # Get a `<a>` template link to `self`
        fun tpl_link: Writable do
                return "<a href=\"{url}\">{title}</a>"
@@ -103,17 +100,6 @@ redef class WikiSection
                end
        end
 
-       # The index page for this section.
-       #
-       # If no file `index.md` exists for this section,
-       # a summary is generated using contained articles.
-       var index: WikiArticle is lazy do
-               for child in children.values do
-                       if child isa WikiArticle and child.is_index then return child
-               end
-               return new WikiSectionIndex(wiki, "index", self)
-       end
-
        redef fun tpl_link do return index.tpl_link
 
        # Render the section hierarchy as a html tree.
@@ -173,26 +159,13 @@ redef class WikiArticle
                end
        end
 
-       redef fun url do
-               if parent == null then
-                       return wiki.config.root_url.join_path("{name}.html")
-               else
-                       return parent.url.join_path("{name}.html")
-               end
-       end
-
-       # Is `self` an index page?
-       #
-       # Checks if `self.name == "index"`.
-       fun is_index: Bool do return name == "index"
-
        redef fun render do
+               super
                if not is_dirty and not wiki.force_render then return
                wiki.message("Render article {name}", 2)
                var file = out_full_path
                file.dirname.mkdir
                tpl_page.write_to_file file
-               super
        end
 
 
@@ -317,15 +290,7 @@ class WikiSitemap
 end
 
 # A `WikiArticle` that contains the section index tree.
-class WikiSectionIndex
-       super WikiArticle
-
-       # The section described by `self`.
-       var section: WikiSection
-
-       redef fun title do return section.title
-
-       redef fun url do return section.url
+redef class WikiSectionIndex
 
        redef var is_dirty = false
 
diff --git a/contrib/nitiwiki/src/wiki_links.nit b/contrib/nitiwiki/src/wiki_links.nit
new file mode 100644 (file)
index 0000000..bbbfea0
--- /dev/null
@@ -0,0 +1,295 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Wiki internal links handling.
+module wiki_links
+
+import wiki_base
+intrude import markdown
+
+redef class Nitiwiki
+       # Looks up a WikiEntry by its `name`.
+       #
+       # Rules are:
+       # 1. Looks in the current section
+       # 2. Looks in the current section children
+       # 3. Looks in the current section parent
+       # 4. Looks up to wiki root
+       #
+       # Returns `null` if no article can be found.
+       fun lookup_entry_by_name(context: WikiEntry, name: String): nullable WikiEntry do
+               var section = context.parent
+               var res = section.lookup_entry_by_name(name)
+               if res != null then return res
+               while section != null do
+                       if section.name == name then return section
+                       if section.children.has_key(name) then return section.children[name]
+                       section = section.parent
+               end
+               return null
+       end
+
+       # Looks up a WikiEntry by its `title`.
+       #
+       # Rules are:
+       # 1. Looks in the current section
+       # 2. Looks in the current section children
+       # 3. Looks in the current section parent
+       # 4. Looks up to wiki root
+       #
+       # Returns `null` if no article can be found.
+       fun lookup_entry_by_title(context: WikiEntry, title: String): nullable WikiEntry do
+               var section = context.parent
+               var res = section.lookup_entry_by_title(title)
+               if res != null then return res
+               while section != null do
+                       if section.title == title then return section
+                       for child in section.children.values do
+                               if child.title == title then return child
+                       end
+                       section = section.parent
+               end
+               return null
+       end
+
+       # Looks up a WikiEntry by its `path`.
+       #
+       # Path can be relative from `context` like `context/entry`.
+       # Or absolute like `/entry1/entry2`.
+       #
+       # Returns `null` if no article can be found.
+       fun lookup_entry_by_path(context: WikiEntry, path: String): nullable WikiEntry do
+               var entry = context.parent
+               var parts = path.split_with("/")
+               if path.has_prefix("/") then
+                       entry = root_section
+                       if parts.is_empty then return root_section.index
+                       parts.shift
+               end
+               while not parts.is_empty do
+                       var name = parts.shift
+                       if name.is_empty then continue
+                       if not entry.children.has_key(name) then return null
+                       entry = entry.children[name]
+               end
+               return entry
+       end
+end
+
+redef class WikiEntry
+
+       # Url to `self` once generated.
+       fun url: String do return wiki.config.root_url.join_path(breadcrumbs.join("/"))
+
+       redef fun render do
+               super
+               if not is_dirty and not wiki.force_render then return
+       end
+
+       # Search in `self` then `self.children` if an entry has the name `name`.
+       fun lookup_entry_by_name(name: String): nullable WikiEntry do
+               if children.has_key(name) then return children[name]
+               for child in children.values do
+                       var res = child.lookup_entry_by_name(name)
+                       if res != null then return res
+               end
+               return null
+       end
+
+       # Search in `self` then `self.children` if an entry has the title `title`.
+       fun lookup_entry_by_title(title: String): nullable WikiEntry do
+               for child in children.values do
+                       if child.title == title then return child
+               end
+               for child in children.values do
+                       var res = child.lookup_entry_by_title(title)
+                       if res != null then return res
+               end
+               return null
+       end
+end
+
+redef class WikiSection
+
+       # The index page for this section.
+       #
+       # If no file `index.md` exists for this section,
+       # a summary is generated using contained articles.
+       var index: WikiArticle is lazy do
+               for child in children.values do
+                       if child isa WikiArticle and child.is_index then return child
+               end
+               return new WikiSectionIndex(wiki, "index", self)
+       end
+end
+
+redef class WikiArticle
+
+       # Headlines ids and titles.
+       var headlines = new ArrayMap[String, HeadLine]
+
+       # Is `self` an index page?
+       #
+       # Checks if `self.name == "index"`.
+       fun is_index: Bool do return name == "index"
+
+       redef fun url do
+               if parent == null then
+                       return wiki.config.root_url.join_path("{name}.html")
+               else
+                       return parent.url.join_path("{name}.html")
+               end
+       end
+
+       redef fun render do
+               super
+               if not is_dirty and not wiki.force_render or not has_source then return
+               var md_proc = new NitiwikiMdProcessor(wiki, self)
+               content = md_proc.process(md.as(not null))
+               headlines.recover_with(md_proc.emitter.decorator.headlines)
+       end
+end
+
+# A `WikiArticle` that contains the section index tree.
+class WikiSectionIndex
+       super WikiArticle
+
+       # The section described by `self`.
+       var section: WikiSection
+
+       redef fun title do return section.title
+
+       redef fun url do return section.url
+end
+
+# A MarkdownProcessor able to parse wiki links.
+class NitiwikiMdProcessor
+       super MarkdownProcessor
+
+       # Wiki used to resolve links.
+       var wiki: Nitiwiki
+
+       # Article parsed by `self`.
+       #
+       # Used to contextualize links.
+       var context: WikiArticle
+
+       init do
+               emitter = new MarkdownEmitter(self)
+               emitter.decorator = new NitiwikiDecorator(wiki, context)
+       end
+
+       redef fun token_at(text, pos) do
+               var token = super
+               if not token isa TokenLink then return token
+               if pos + 1 < text.length then
+                       var c = text[pos + 1]
+                       if c == '[' then return new TokenWikiLink(pos, c)
+               end
+               return token
+       end
+end
+
+private class NitiwikiDecorator
+       super HTMLDecorator
+
+       # Wiki used to resolve links.
+       var wiki: Nitiwiki
+
+       # Article used to contextualize links.
+       var context: WikiArticle
+
+       fun add_wikilink(v: MarkdownEmitter, link: Text, name, comment: nullable Text) do
+               var wiki = v.processor.as(NitiwikiMdProcessor).wiki
+               var target: nullable WikiEntry = null
+               var anchor: nullable String = null
+               if link.has("#") then
+                       var parts = link.split_with("#")
+                       link = parts.first
+                       anchor = parts.subarray(1, parts.length - 1).join("#")
+               end
+               if link.has("/") then
+                       target = wiki.lookup_entry_by_path(context, link.to_s)
+               else
+                       target = wiki.lookup_entry_by_name(context, link.to_s)
+                       if target == null then
+                               target = wiki.lookup_entry_by_title(context, link.to_s)
+                       end
+               end
+               v.add "<a "
+               if target != null then
+                       if name == null then name = target.title
+                       link = target.url
+               else
+                       wiki.message("Warning: unknown wikilink `{link}` (in {context.src_path.as(not null)})", 0)
+                       v.add "class=\"broken\" "
+               end
+               v.add "href=\""
+               append_value(v, link)
+               if anchor != null then append_value(v, "#{anchor}")
+               v.add "\""
+               if comment != null and not comment.is_empty then
+                       v.add " title=\""
+                       append_value(v, comment)
+                       v.add "\""
+               end
+               v.add ">"
+               if name == null then name = link
+               v.emit_text(name)
+               v.add "</a>"
+       end
+end
+
+# A NitiWiki link token.
+#
+# Something of the form `[[foo]]`.
+#
+# Allowed formats:
+#
+# * `[[Wikilink]]`
+# * `[[Wikilink/Bar]]`
+# * `[[Wikilink#foo]]`
+# * `[[Wikilink/Bar#foo]]`
+# * `[[title|Wikilink]]`
+# * `[[title|Wikilink/Bar]]`
+# * `[[title|Wikilink/Bar#foo]]`
+class TokenWikiLink
+       super TokenLink
+
+       redef fun emit_hyper(v) do
+               v.decorator.as(NitiwikiDecorator).add_wikilink(v, link.as(not null), name, comment)
+       end
+
+       redef fun check_link(v, out, start, token) do
+               var md = v.current_text
+               var pos = start + 2
+               var tmp = new FlatBuffer
+               pos = md.read_md_link_id(tmp, pos)
+               if pos < start then return -1
+               var name = tmp.write_to_string
+               if name.has("|") then
+                       var parts = name.split_once_on("|")
+                       self.name = parts.first
+                       self.link = parts[1]
+               else
+                       self.name = null
+                       self.link = name
+               end
+               pos += 1
+               pos = md.skip_spaces(pos)
+               if pos < start then return -1
+               pos += 1
+               return pos
+       end
+end
diff --git a/contrib/nitiwiki/tests/nitiwiki_render.args b/contrib/nitiwiki/tests/nitiwiki_render.args
deleted file mode 100644 (file)
index 6f7050e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nitiwiki --config wiki1/config.ini --clean --render -v
diff --git a/contrib/nitiwiki/tests/nitiwiki_status.args b/contrib/nitiwiki/tests/nitiwiki_status.args
deleted file mode 100644 (file)
index aa96d13..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nitiwiki --config wiki1/config.ini --clean --status
diff --git a/contrib/nitiwiki/tests/res/nitiwiki_render.res b/contrib/nitiwiki/tests/res/nitiwiki_render.res
deleted file mode 100644 (file)
index 25f17ab..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-Render section out
-Render section out/sec1
-Render section out/sec2
-Render auto-index for section out/sec2
-Render section out/sec2/sub-sec21
-Render section out/sec2/sub-sec22
diff --git a/contrib/nitiwiki/tests/res/wiki1_nitiwiki_render.res b/contrib/nitiwiki/tests/res/wiki1_nitiwiki_render.res
new file mode 100644 (file)
index 0000000..adf25a7
--- /dev/null
@@ -0,0 +1 @@
+Render section out
diff --git a/contrib/nitiwiki/tests/res/wiki1_nitiwiki_status.res b/contrib/nitiwiki/tests/res/wiki1_nitiwiki_status.res
new file mode 100644 (file)
index 0000000..936a764
--- /dev/null
@@ -0,0 +1,10 @@
+nitiWiki
+name: wiki1
+config: wiki1/config.ini
+url: http://localhost/
+
+There is modified files:
+ + pages
+ + /pages/index.md
+
+Use nitiwiki --render to render modified files
diff --git a/contrib/nitiwiki/tests/res/wiki2_nitiwiki_render.res b/contrib/nitiwiki/tests/res/wiki2_nitiwiki_render.res
new file mode 100644 (file)
index 0000000..46cf17c
--- /dev/null
@@ -0,0 +1,20 @@
+Custom config for section sec2
+Render section out
+Warning: unknown wikilink `not found` (in /pages/index.md)
+Warning: unknown wikilink `Not Found` (in /pages/index.md)
+Warning: unknown wikilink `/not/found` (in /pages/index.md)
+Warning: unknown wikilink `not/found` (in /pages/index.md)
+Warning: unknown wikilink `not found` (in /pages/index.md)
+Warning: unknown wikilink `not found` (in /pages/index.md)
+Warning: unknown wikilink `not found` (in /pages/index.md)
+Render section out/sec1
+Render section out/sec2
+Warning: unknown wikilink `not found` (in /pages/sec2/index.md)
+Warning: unknown wikilink `Not Found` (in /pages/sec2/index.md)
+Warning: unknown wikilink `/not/found` (in /pages/sec2/index.md)
+Warning: unknown wikilink `not/found` (in /pages/sec2/index.md)
+Warning: unknown wikilink `not found` (in /pages/sec2/index.md)
+Warning: unknown wikilink `not found` (in /pages/sec2/index.md)
+Warning: unknown wikilink `not found` (in /pages/sec2/index.md)
+Render section out/sec2/sub-sec21
+Render section out/sec2/sub-sec22
@@ -1,17 +1,21 @@
 nitiWiki
-name: wiki1
-config: wiki1/config.ini
+name: wiki2
+config: wiki2/config.ini
 url: http://localhost/
 
 There is modified files:
  + pages
+ + /pages/contact.md
  + /pages/index.md
+ + /pages/other_page.md
  + pages/sec1
  + /pages/sec1/index.md
  + pages/sec2
+ + /pages/sec2/index.md
  + pages/sec2/sub-sec21
  + /pages/sec2/sub-sec21/index.md
  + pages/sec2/sub-sec22
  + /pages/sec2/sub-sec22/index.md
+ + /pages/sec2/sub-sec22/other.md
 
 Use nitiwiki --render to render modified files
diff --git a/contrib/nitiwiki/tests/wiki1_nitiwiki_render.args b/contrib/nitiwiki/tests/wiki1_nitiwiki_render.args
new file mode 100644 (file)
index 0000000..a7633a0
--- /dev/null
@@ -0,0 +1 @@
+../bin/nitiwiki --config wiki1/config.ini --clean --render -v
diff --git a/contrib/nitiwiki/tests/wiki1_nitiwiki_status.args b/contrib/nitiwiki/tests/wiki1_nitiwiki_status.args
new file mode 100644 (file)
index 0000000..d4b6826
--- /dev/null
@@ -0,0 +1 @@
+../bin/nitiwiki --config wiki1/config.ini --clean --status
diff --git a/contrib/nitiwiki/tests/wiki2/assets/css/main.css b/contrib/nitiwiki/tests/wiki2/assets/css/main.css
new file mode 100644 (file)
index 0000000..b3c3af5
--- /dev/null
@@ -0,0 +1,3 @@
+dummy { margin: 0 }
+
+a.broken { font-style: italic; color: red }
diff --git a/contrib/nitiwiki/tests/wiki2/config.ini b/contrib/nitiwiki/tests/wiki2/config.ini
new file mode 100644 (file)
index 0000000..ba285d6
--- /dev/null
@@ -0,0 +1,2 @@
+wiki.name=wiki2
+wiki.root_dir=wiki2
diff --git a/contrib/nitiwiki/tests/wiki2/pages/contact.md b/contrib/nitiwiki/tests/wiki2/pages/contact.md
new file mode 100644 (file)
index 0000000..09f7129
--- /dev/null
@@ -0,0 +1 @@
+# Contact
diff --git a/contrib/nitiwiki/tests/wiki2/pages/index.md b/contrib/nitiwiki/tests/wiki2/pages/index.md
new file mode 100644 (file)
index 0000000..9ad0a4d
--- /dev/null
@@ -0,0 +1,63 @@
+# Test wikilinks
+
+## Link to entries by name
+
+* Link to [[sec1]]
+* Link to [[sec2]]
+* Link to [[contact]]
+* Link to [[other_page]]
+* Link to [[other]]
+* Link to [[not found]]
+
+## Link to entries by title
+
+* Link to [[Sec1]]
+* Link to [[Section 2]]
+* Link to [[Contact]]
+* Link to [[Other Page]]
+* Link to [[Other]]
+* Link to [[Not Found]]
+
+## Link to entries by absolute path
+
+* Link to [[/index]]
+* Link to [[/sec1]]
+* Link to [[/sec1/index]]
+* Link to [[/sec1/]]
+* Link to [[/sec2/sub-sec22]]
+* Link to [[/sec2/sub-sec22/]]
+* Link to [[/sec2/sub-sec22/index]]
+* Link to [[/sec2/sub-sec22/other]]
+* Link to [[/not/found]]
+
+## Link to entries by relative path
+
+* Link to [[sec1]]
+* Link to [[sec1/index]]
+* Link to [[sec1/]]
+* Link to [[sec2/sub-sec22]]
+* Link to [[sec2/sub-sec22/]]
+* Link to [[sec2/sub-sec22/index]]
+* Link to [[sec2/sub-sec22/other]]
+* Link to [[not/found]]
+
+## Link with custom text
+
+* Link to [[1Fooi|Other Page]]
+* Link to [[2 Foo bar|/sec2/sub-sec22/index]]
+* Link to [[3|sec2/sub-sec22/other]]
+* Link to [[foo>bar>bar|other_page]]
+* Link to [[5|not found]]
+
+## Link with anchors
+
+* Link to [[Other Page#Foo]]
+* Link to [[/sec2/sub-sec22/index#2 Foo bar]]
+* Link to [[sec2/sub-sec22/other#3]]
+* Link to [[other_page#4]]
+* Link to [[not found#5_lol]]
+* Link to [[1|Other Page#Foo]]
+* Link to [[2|/sec2/sub-sec22/index#2 Foo bar]]
+* Link to [[3|sec2/sub-sec22/other#3]]
+* Link to [[4|other_page#4foobar#baz]]
+* Link to [[5|not found#5]]
diff --git a/contrib/nitiwiki/tests/wiki2/pages/other_page.md b/contrib/nitiwiki/tests/wiki2/pages/other_page.md
new file mode 100644 (file)
index 0000000..a1ca7d9
--- /dev/null
@@ -0,0 +1 @@
+# Other Page
diff --git a/contrib/nitiwiki/tests/wiki2/pages/sec1/index.md b/contrib/nitiwiki/tests/wiki2/pages/sec1/index.md
new file mode 100644 (file)
index 0000000..7c2fd43
--- /dev/null
@@ -0,0 +1 @@
+# Section 1
diff --git a/contrib/nitiwiki/tests/wiki2/pages/sec2/config.ini b/contrib/nitiwiki/tests/wiki2/pages/sec2/config.ini
new file mode 100644 (file)
index 0000000..dcde4cc
--- /dev/null
@@ -0,0 +1 @@
+section.title=Section 2
diff --git a/contrib/nitiwiki/tests/wiki2/pages/sec2/index.md b/contrib/nitiwiki/tests/wiki2/pages/sec2/index.md
new file mode 100644 (file)
index 0000000..c81eb7d
--- /dev/null
@@ -0,0 +1,58 @@
+# Test wikilinks
+
+## Link to entries by name
+
+* Link to [[sec1]]
+* Link to [[sec2]]
+* Link to [[contact]]
+* Link to [[other_page]]
+* Link to [[not found]]
+
+## Link to entries by title
+
+* Link to [[Sec1]]
+* Link to [[Section 2]]
+* Link to [[Contact]]
+* Link to [[Other Page]]
+* Link to [[Not Found]]
+
+## Link to entries by absolute path
+
+* Link to [[/index]]
+* Link to [[/sec1]]
+* Link to [[/sec1/index]]
+* Link to [[/sec1/]]
+* Link to [[/sec2/sub-sec22]]
+* Link to [[/sec2/sub-sec22/]]
+* Link to [[/sec2/sub-sec22/index]]
+* Link to [[/sec2/sub-sec22/other]]
+* Link to [[/not/found]]
+
+## Link to entries by relative path
+
+* Link to [[sub-sec22]]
+* Link to [[sub-sec22/index]]
+* Link to [[sub-sec22/other]]
+* Link to [[sub-sec22/]]
+* Link to [[not/found]]
+
+## Link with custom text
+
+* Link to [[1Foo|Other Page]]
+* Link to [[2 Foo bar|/sec2/sub-sec22/index]]
+* Link to [[3|sub-sec22/other]]
+* Link to [[4foo>bar>baz|other_page]]
+* Link to [[5|not found]]
+
+## Link with anchors
+
+* Link to [[Other Page#Foo]]
+* Link to [[/sec2/sub-sec22/index#2 Foo bar]]
+* Link to [[sub-sec22/other#3]]
+* Link to [[other_page#4]]
+* Link to [[not found#5_lol]]
+* Link to [[1|Other Page#Foo]]
+* Link to [[2|/sec2/sub-sec22/index#2 Foo bar]]
+* Link to [[3|sub-sec22/other#3]]
+* Link to [[4|other_page#4foobar#baz]]
+* Link to [[5|not found#5]]
diff --git a/contrib/nitiwiki/tests/wiki2/pages/sec2/sub-sec21/index.md b/contrib/nitiwiki/tests/wiki2/pages/sec2/sub-sec21/index.md
new file mode 100644 (file)
index 0000000..4c40d90
--- /dev/null
@@ -0,0 +1 @@
+# Section 2-1
diff --git a/contrib/nitiwiki/tests/wiki2/pages/sec2/sub-sec22/index.md b/contrib/nitiwiki/tests/wiki2/pages/sec2/sub-sec22/index.md
new file mode 100644 (file)
index 0000000..03e06f2
--- /dev/null
@@ -0,0 +1 @@
+# Section 2-2
diff --git a/contrib/nitiwiki/tests/wiki2/pages/sec2/sub-sec22/other.md b/contrib/nitiwiki/tests/wiki2/pages/sec2/sub-sec22/other.md
new file mode 100644 (file)
index 0000000..10a1342
--- /dev/null
@@ -0,0 +1 @@
+# Other page
diff --git a/contrib/nitiwiki/tests/wiki2/templates/footer.html b/contrib/nitiwiki/tests/wiki2/templates/footer.html
new file mode 100644 (file)
index 0000000..7506b39
--- /dev/null
@@ -0,0 +1,10 @@
+<div class="row footer">
+       <div class="container-fluid">
+               <div class="well well-sm">
+                       <p><strong>%TITLE% &copy; %YEAR%</strong></p>
+                       <p class="text-muted"><em>last modification %GEN_TIME%</em></p>
+                       <p class="text-muted">Proudly powered by
+                               <a href="http://nitlanguage.org">nit</a>!</p>
+               </div>
+       </div>
+</div>
diff --git a/contrib/nitiwiki/tests/wiki2/templates/header.html b/contrib/nitiwiki/tests/wiki2/templates/header.html
new file mode 100644 (file)
index 0000000..1cb06bf
--- /dev/null
@@ -0,0 +1,9 @@
+<div class="container-fluid header">
+       <div class="container">
+               <div class="header">
+                       <a href="http://uqam.ca"><img src="%ROOT_URL%/%LOGO%" alt="logo" /></a>
+                       <h2>%SUBTITLE%</h2>
+                       <h1>%TITLE%</h1>
+               </div>
+       </div>
+</div>
diff --git a/contrib/nitiwiki/tests/wiki2/templates/menu.html b/contrib/nitiwiki/tests/wiki2/templates/menu.html
new file mode 100644 (file)
index 0000000..1ff832e
--- /dev/null
@@ -0,0 +1,20 @@
+<nav class="menu" role="navigation">
+       <div class="container">
+               <!-- Brand and toggle get grouped for better mobile display -->
+               <div class="navbar-header">
+                       <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+                               <span class="sr-only">Toggle navigation</span>
+                               <span class="icon-bar"></span>
+                               <span class="icon-bar"></span>
+                               <span class="icon-bar"></span>
+                       </button>
+                       <a class="navbar-brand" href="%ROOT_URL%index.html">%TITLE%</a>
+               </div>
+               <!-- Collect the nav links, forms, and other content for toggling -->
+               <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+                       <ul class="nav navbar-nav">
+                       %MENUS%
+                       </ul>
+               </div><!-- /.navbar-collapse -->
+       </div>
+</nav>
diff --git a/contrib/nitiwiki/tests/wiki2/templates/template.html b/contrib/nitiwiki/tests/wiki2/templates/template.html
new file mode 100644 (file)
index 0000000..6b3b126
--- /dev/null
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html lang="en">
+       <head>
+               <meta charset="utf-8">
+               <meta http-equiv="X-UA-Compatible" content="IE=edge">
+               <meta name="viewport" content="width=device-width, initial-scale=1">
+               <title>%TITLE%</title>
+
+               <link href="%ROOT_URL%/assets/vendors/bootstrap/bootstrap-3.2.0-dist/css/bootstrap.min.css" rel="stylesheet">
+               <link href="%ROOT_URL%/assets/css/main.css" rel="stylesheet">
+
+               <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
+               <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+               <!--[if lt IE 9]>
+               <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+               <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+               <![endif]-->
+       </head>
+       <body>
+               %HEADER%
+               %TOP_MENU%
+               <div class="container">
+                       <div class="row">
+                               %BODY%
+                       </div>
+                       %FOOTER%
+               </div>
+
+               <script src="%ROOT_URL%/vendors/jquery/jquery-1.11.1.min.js"></script>
+               <script src="%ROOT_URL%/vendors/bootstrap/bootstrap-3.2.0-dist/js/bootstrap.min.js"></script>
+       </body>
+</html>
diff --git a/contrib/nitiwiki/tests/wiki2_nitiwiki_render.args b/contrib/nitiwiki/tests/wiki2_nitiwiki_render.args
new file mode 100644 (file)
index 0000000..d4d6ee6
--- /dev/null
@@ -0,0 +1 @@
+../bin/nitiwiki --config wiki2/config.ini --clean --render -v
diff --git a/contrib/nitiwiki/tests/wiki2_nitiwiki_status.args b/contrib/nitiwiki/tests/wiki2_nitiwiki_status.args
new file mode 100644 (file)
index 0000000..d2da70b
--- /dev/null
@@ -0,0 +1 @@
+../bin/nitiwiki --config wiki2/config.ini --clean --status
index 99cc0c2..c799b86 100644 (file)
@@ -490,7 +490,7 @@ class PlayerFirstReview
        redef fun react_event(game, event) do
                if not event isa IssueCommentEvent then return
                # FIXME use a more precise way to locate reviews
-               if event.comment.has_ok_review then
+               if event.comment.is_ack then
                        var player = event.comment.user.player(game)
                        var a = new_achievement(game)
                        player.unlock_achievement(a, event)
index 79a3682..2424d86 100644 (file)
@@ -88,12 +88,9 @@ redef class IssueCommentEvent
 
        # Rewards player for review comments.
        #
-       # Actuallty we look if the comment contains the string `"+1"`.
-       #
        # TODO only give nitcoins if reviewers < 2
        redef fun react_player_event(r, game) do
-               # FIXME use a more precise way to locate reviews
-               if comment.body.has("\\+1\\b".to_re) then
+               if comment.is_ack then
                        react_player_review(r, game)
                end
        end
index e8afccc..b7d3530 100644 (file)
@@ -273,7 +273,7 @@ redef class IssueCommentEvent
                        game.stats.inc("comments")
                        player.stats.inc("comments")
                        # FIXME use a more precise way to locate reviews
-                       if comment.has_ok_review then
+                       if comment.is_ack then
                                game.stats.inc("reviews")
                                player.stats.inc("reviews")
                        end
@@ -282,8 +282,3 @@ redef class IssueCommentEvent
                end
        end
 end
-
-redef class IssueComment
-       # Does this comment contain a "+1"?
-       fun has_ok_review: Bool do return body.has("\\+1\\b".to_re)
-end
diff --git a/contrib/refund/.gitignore b/contrib/refund/.gitignore
new file mode 100644 (file)
index 0000000..f8f6caf
--- /dev/null
@@ -0,0 +1,3 @@
+bin/
+tests/out/
+stats.json
diff --git a/contrib/refund/Makefile b/contrib/refund/Makefile
new file mode 100644 (file)
index 0000000..e3b2579
--- /dev/null
@@ -0,0 +1,29 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+all: refund
+
+refund:
+       mkdir -p bin
+       ../../bin/nitc src/refund.nit -o bin/refund
+
+check: refund
+       cd tests; make
+
+clean:
+       rm -rf bin
+       rm -rf -- .nit_compile 2> /dev/null || true
+       cd tests; make clean
diff --git a/contrib/refund/src/refund.nit b/contrib/refund/src/refund.nit
new file mode 100644 (file)
index 0000000..02e0af1
--- /dev/null
@@ -0,0 +1,132 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Insurance refunds calculation tool.
+#
+# `refund` computes automatically the allowed refund for a reclamation according
+# to an insurrance policy.
+#
+# Usage:
+#
+# ~~~sh
+# > refund (<input_file> <output_file> | [OPTIONS])
+# ~~~
+#
+# Input file:
+#
+# `refund` expects a JSON input file on the form:
+#
+# ~~~json
+# {
+#  "dossier": "A100323",
+#  "mois": "2015-01",
+#  "reclamations": [
+#   {
+#    "soin": 100,
+#    "date": "2015-01-11",
+#    "montant": "234.00$"
+#   }, {
+#    "soin": 200,
+#    "date": "2015-01-13",
+#    "montant": "128.00$"
+#   }, {
+#    "soin": 334,
+#    "date": "2015-01-23",
+#    "montant": "50.00$"
+#   }
+#  ]
+# }
+# ~~~
+#
+# Output file:
+#
+# You have to specify the path where `refund` should output the result file.
+#
+# Results are formatted as JSON:
+#
+# ~~~json
+# {
+#  "client": "100323",
+#  "mois": "2015-01",
+#  "remboursements": [
+#   {
+#    "soin": 100,
+#    "date": "2015-01-11",
+#    "montant": "58.50$"
+#   }, {
+#    "soin": 200,
+#    "date": "2015-01-13",
+#    "montant": "22.50$"
+#   }, {
+#    "soin": 334,
+#    "date": "2015-01-23",
+#    "montant": "0.00$"
+#   }
+#  ]
+# }
+# ~~~
+#
+# Options:
+#
+# `refund` can generate statistics about reclamations and refunds computed.
+#
+# * `-S`: display statistics
+# * `-SR`: reset statistics
+#
+# Error handling:
+#
+# In case of error, a JSON object is generated in place of the output file:
+#
+# ~~~json
+# { "message": "Invalid input data" }
+# ~~~
+module refund
+
+
+import refund_json
+
+# Display usage in console then leave.
+fun usage do
+       print ""
+       print "Usage:"
+       print "refund <input.json> <output.json>"
+       print ""
+       print "options"
+       print " -S\tShow stats in console"
+       print " -RS\tClear stats"
+       exit 1
+end
+
+var proc = new RefundProcessor
+
+if args.length == 1 then
+       var flag = args.first
+       if flag == "-RS" then
+               proc.clear_stats
+               exit 0
+       else if flag == "-S" then
+               proc.show_stats
+               exit 0
+       else
+               print "Error: Unknown flag {flag}."
+               usage
+       end
+else if args.length != 2 then
+       print "Error: Incorrect number of arguments. Got {args.length}, expected 2."
+       usage
+end
+
+proc.process(args[0], args[1])
diff --git a/contrib/refund/src/refund_base.nit b/contrib/refund/src/refund_base.nit
new file mode 100644 (file)
index 0000000..fbd5fee
--- /dev/null
@@ -0,0 +1,421 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Insurance refunds calculation base classes.
+module refund_base
+
+import counter
+
+# `RefundProcessor` manages the calculation of the refunds.
+#
+# See `process`.
+class RefundProcessor
+
+       # Where to generate output file.
+       var output_file: String is noinit, writable
+
+       # Where to save usage statistics.
+       var stats_file = "stats.json"
+
+       # Processes the `input_file` and write the output in `output_file`.
+       #
+       # Steps:
+       #
+       # 1. Parses the input_file and check json validity (see `load_input`).
+       # 2. Instantiates and checks the reclamation sheet against client rules
+       #   (see `ReclamationSheet.from_json`).
+       # 3. Processes refunds (see `proces_refunds`).
+       # 4. Writes the output file (see `write_output`).
+       fun process(input_file, output_file: String) is abstract
+
+       # Refunds allowed for the current reclamation sheet.
+       var current_refunds = new HashMap[Care, Dollar]
+
+       # Computes allowed refunds for a given `Reclamation` found in a `ReclamationSheet`.
+       fun process_refund(sheet: ReclamationSheet, recl: Reclamation): Dollar is abstract
+
+       # Shows stats values in console
+       fun show_stats do print load_stats
+
+       # Loads stats from file as a RefundStats instance.
+       fun load_stats: RefundStats is abstract
+
+       # Saves stats in file.
+       fun save_stats(stats: RefundStats) is abstract
+
+       # Outputs error object then exit.
+       fun die(msg: String) is abstract
+
+       # Clears stats.
+       #
+       # Basically delete the stats file.
+       fun clear_stats do if stats_file.file_exists then stats_file.file_delete
+end
+
+# Stats representation using a `Counter`.
+class RefundStats
+       super Counter[String]
+end
+
+# A `Client` can ask for refunds from the insurance company.
+class Client
+
+       # Client number.
+       var number: String
+
+       redef fun to_s do return "#{number}"
+end
+
+# A `ReclamationSheet` is filled by the `Client` to obtain a `RefundSheet`.
+class ReclamationSheet
+
+       # File used for this refund.
+       var file: ReclFile is writable
+
+       # Month concerned by the refund.
+       var month: ReclMonth is writable
+
+       # Array of reclamations.
+       var recls = new Array[Reclamation] is writable
+
+       redef fun to_s do
+               return "Refund (file: {file}, month: {month}, recls: {recls.length})"
+       end
+end
+
+# A File found in a `ReclamationSheet`.
+#
+# A File points to a `Contract` and a `Client`.
+#
+# Allowed format is: `X12345` where `X` is the contract kind and `12345` is the
+# client number.
+class ReclFile
+
+       # File string id.
+       var id: String is writable
+
+       # Contract instance linked to this file.
+       var contract: Contract is noinit, writable
+
+       # Client instance linked to this file.
+       var client: Client is noinit, writable
+
+       # Returns the contract instance corresponding to `kind`.
+       fun contract_factory(proc: RefundProcessor, kind: String): Contract do
+               if kind == "A" then return new ContractA
+               if kind == "B" then return new ContractB
+               if kind == "C" then return new ContractC
+               if kind == "D" then return new ContractD
+               if kind == "E" then return new ContractE
+               proc.die("Unknown contract {kind}")
+               abort
+       end
+
+       redef fun to_s do return "{contract.kind}{client.number}"
+end
+
+# Month date formatted for contracts.
+#
+# Mainly used to factorize treatments on date calculation.
+class ReclMonth
+
+       # Internal date used to store the month.
+       var date: ReclDate is writable
+
+       # Is `date` in this month?
+       fun has(date: ReclDate): Bool do return self.date.month == date.month
+
+       redef fun to_s do
+               if date.month < 10 then
+                       return "{date.year}-0{date.month}"
+               end
+               return "{date.year}-0{date.month}"
+       end
+end
+
+# The date on which a `Care` occured.
+class ReclDate
+       # Year of the month.
+       var year: Int is writable
+
+       # Month number (`1` is January).
+       var month: Int is writable
+
+       # Day number.
+       var day: Int is writable
+
+       redef fun to_s do
+               var res = new FlatBuffer
+               res.append "{year}-"
+               if month < 10 then
+                       res.append "0{month}-"
+               else
+                       res.append "{month}-"
+               end
+               if day < 10 then
+                       res.append "0{day}"
+               else
+                       res.append day.to_s
+               end
+               return res.write_to_string
+       end
+end
+
+# `RefundRecl` are parts of the `RefundReclamation`.
+class Reclamation
+       # `Care` id concerned by this reclamation.
+       var care_id: Int is writable
+
+       # Date this care was applied.
+       var date: ReclDate is writable
+
+       # Amount of money given by the `Client` in exchange of this care.
+       var fees: Dollar is writable
+
+       redef fun to_s do return "Entry (care: {care_id}, date: {date}, fees: {fees})"
+end
+
+# A `Contract` specifies the refund applicable on care.
+class Contract
+
+       # Kind of the contract (specified by a letter).
+       var kind: String is noinit, writable
+
+       # Covered cares for this kind of contract.
+       var cares = new Array[Care] is writable
+
+       # Adds a care to this contract.
+       fun add_care(care: Care) do cares.add care
+
+       # Gets a `Care` instance by its id.
+       #
+       # Returns `null` if no `Care` found.
+       fun care_by_id(id: Int): nullable Care do
+               for care in cares do
+                       if care.match_id(id) then return care
+               end
+               return null
+       end
+
+       redef fun to_s do return "{kind} ({cares.length} cares)"
+end
+
+# Contracts
+# FIXME move contracts to a JSON configuration file.
+
+private class ContractA
+       super Contract
+
+       init do
+               kind = "A"
+               add_care(new UniqCare.with_vals(0,   25.0, null, null))
+               add_care(new UniqCare.with_vals(100, 35.0, null, 250.0.to_dollar))
+               add_care(new UniqCare.with_vals(150, 0.0,  null, null))
+               add_care(new UniqCare.with_vals(175, 50.0, null, 200.0.to_dollar))
+               add_care(new UniqCare.with_vals(200, 25.0, null, 250.0.to_dollar))
+               add_care(new RangeCare.with_vals([300..399], 0.0, null, null))
+               add_care(new UniqCare.with_vals(400, 0.0,  null, null))
+               add_care(new UniqCare.with_vals(500, 25.0, null, 150.0.to_dollar))
+               add_care(new UniqCare.with_vals(600, 40.0, null, 300.0.to_dollar))
+               add_care(new UniqCare.with_vals(700, 0.0,  null, null))
+       end
+end
+
+private class ContractB
+       super Contract
+
+       init do
+               kind = "B"
+               add_care(new UniqCare.with_vals(0,   50.0, 40.0.to_dollar, null))
+               add_care(new UniqCare.with_vals(100, 50.0, 50.0.to_dollar, 250.0.to_dollar))
+               add_care(new UniqCare.with_vals(150, 0.0,  null, null))
+               add_care(new UniqCare.with_vals(175, 75.0, null, 200.0.to_dollar))
+               add_care(new UniqCare.with_vals(200, 100.0,null, 250.0.to_dollar))
+               add_care(new RangeCare.with_vals([300..399], 50.0, null, null))
+               add_care(new UniqCare.with_vals(400, 0.0,  null, null))
+               add_care(new UniqCare.with_vals(500, 50.0, 50.0.to_dollar, 150.0.to_dollar))
+               add_care(new UniqCare.with_vals(600, 100.0,null, 300.0.to_dollar))
+               add_care(new UniqCare.with_vals(700, 70.0, null, null))
+       end
+end
+
+private class ContractC
+       super Contract
+
+       init do
+               kind = "C"
+               add_care(new UniqCare.with_vals(0,   90.0, null, null))
+               add_care(new UniqCare.with_vals(100, 95.0, null, 250.0.to_dollar))
+               add_care(new UniqCare.with_vals(150, 85.0, null, null))
+               add_care(new UniqCare.with_vals(175, 90.0, null, 200.0.to_dollar))
+               add_care(new UniqCare.with_vals(200, 90.0, null, 250.0.to_dollar))
+               add_care(new RangeCare.with_vals([300..399], 90.0, null, null))
+               add_care(new UniqCare.with_vals(400, 90.0, null, null))
+               add_care(new UniqCare.with_vals(500, 90.0, null, 150.0.to_dollar))
+               add_care(new UniqCare.with_vals(600, 75.0, null, 300.0.to_dollar))
+               add_care(new UniqCare.with_vals(700, 90.0, null, null))
+       end
+end
+
+private class ContractD
+       super Contract
+
+       init do
+               kind = "D"
+               add_care(new UniqCare.with_vals(0,   100.0, 85.0.to_dollar,  null))
+               add_care(new UniqCare.with_vals(100, 100.0, 75.0.to_dollar,  250.0.to_dollar))
+               add_care(new UniqCare.with_vals(150, 100.0, 150.0.to_dollar, null))
+               add_care(new UniqCare.with_vals(175, 95.0,  null,  200.0.to_dollar))
+               add_care(new UniqCare.with_vals(200, 100.0, 100.0.to_dollar, 250.0.to_dollar))
+               add_care(new RangeCare.with_vals([300..399],100.0, null, null))
+               add_care(new UniqCare.with_vals(400, 100.0, 65.0.to_dollar,  null))
+               add_care(new UniqCare.with_vals(500, 100.0, null,  150.0.to_dollar))
+               add_care(new UniqCare.with_vals(600, 100.0, 100.0.to_dollar, 300.0.to_dollar))
+               add_care(new UniqCare.with_vals(700, 100.0, 90.0.to_dollar, null))
+       end
+end
+
+private class ContractE
+       super Contract
+
+       init do
+               kind = "E"
+               add_care(new UniqCare.with_vals(0,   15.0, null, null))
+               add_care(new UniqCare.with_vals(100, 25.0, null, 250.0.to_dollar))
+               add_care(new UniqCare.with_vals(150, 15.0, null, null))
+               add_care(new UniqCare.with_vals(175, 25.0, 20.0.to_dollar, 200.0.to_dollar))
+               add_care(new UniqCare.with_vals(200, 12.0, null, 250.0.to_dollar))
+               add_care(new RangeCare.with_vals([300..399], 60.0, null, null))
+               add_care(new UniqCare.with_vals(400, 25.0, 15.0.to_dollar, null))
+               add_care(new UniqCare.with_vals(500, 30.0, 20.0.to_dollar, 150.0.to_dollar))
+               add_care(new UniqCare.with_vals(600, 15.0, null, 300.0.to_dollar))
+               add_care(new UniqCare.with_vals(700, 22.0, null, null))
+       end
+end
+
+# A `Care` is payed by the `Client` and can raises a `Refund`.
+interface Care
+
+       # Does `id` is acceptable for this care?
+       fun match_id(id: Int): Bool is abstract
+
+       # Percent covered for this kind of care.
+       fun cover: Float is abstract
+
+       # Max amount covered for this kind of care by reclamation.
+       fun max: nullable Dollar is abstract
+
+       # Max amount covered for this kind of care by month.
+       fun month_max: nullable Dollar is abstract
+
+       # Computes the refund for this care.
+       fun process_refund(fees: Dollar): Dollar do
+               var max = self.max
+               var val = ((fees.value.to_f * (cover / 100.0)) / 100.0).to_dollar
+               if max != null and val > max then val = max
+               return val
+       end
+end
+
+# A `UniqCare` refers to one and only one kind of `Care`.
+#
+# For example, the care `Ostéopathie` as the uniq id `200`.
+class UniqCare
+       super Care
+
+       # Care id.
+       var id: Int
+
+       redef fun match_id(id) do return self.id == id
+
+       redef var cover = 0.0
+       redef var max = null
+       redef var month_max = null
+
+       # Inits this `Care` with values.
+       #
+       # * `id`: the `Care` id.
+       # * `cover`: refund percentage covered for this `Care`.
+       # * `max`: max amount refunded for this `Care` in a reclamation sheet.
+       # * `month_max`: max amount refunded by month.
+       init with_vals(id: Int, cover: Float, max, month_max: nullable Dollar) do
+               self.id = id
+               self.cover = cover
+               self.max = max
+               self.month_max = month_max
+       end
+
+       redef fun to_s do return id.to_s
+end
+
+# A `RangeCare` refers to a set of id corresponding to the same `Care`.
+#
+# For example, the care `Soins Dentaires` is refered by the ids 300 to 399.
+class RangeCare
+       super Care
+
+       # Care id range.
+       var id: Range[Int]
+
+       redef fun match_id(id) do return self.id.has(id)
+       redef var cover = 0.0
+       redef var max = null
+       redef var month_max = null
+
+       # Inits this `Care` with values.
+       #
+       # * `id`: the `Care` id.
+       # * `cover`: refund percentage covered for this `Care`.
+       # * `max`: max amount refunded for this `Care` in a reclamation sheet.
+       # * `month_max`: max amount refunded by month.
+       init with_vals(id: Range[Int], cover: Float, max, month_max: nullable Dollar) do
+               self.id = id
+               self.cover = cover
+               self.max = max
+               self.month_max = month_max
+       end
+
+       redef fun to_s do return id.first.to_s
+end
+
+# Used to represent currencies values.
+class Dollar
+       super Comparable
+
+       redef type OTHER: Dollar
+
+       # Amount of cents.
+       var value: Int
+
+       # Inits `self` from a float `value`.
+       init from_float(value: Float) do
+               self.value = (value * 100.0).to_i
+       end
+
+       redef fun to_s do return "{value / 100}.{value % 100}$"
+       redef fun <(o) do return value < o.value
+
+       # Dollars addition.
+       fun +(o: Dollar): Dollar do return new Dollar(value + o.value)
+
+       # Dollars substraction.
+       fun -(o: Dollar): Dollar do return new Dollar(value - o.value)
+end
+
+redef class Float
+       # Returns `self` as a Dollar instance.
+       fun to_dollar: Dollar do return new Dollar.from_float(self)
+end
diff --git a/contrib/refund/src/refund_json.nit b/contrib/refund/src/refund_json.nit
new file mode 100644 (file)
index 0000000..33032b3
--- /dev/null
@@ -0,0 +1,326 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# JSON handling for `refund`.
+module refund_json
+
+import refund_base
+import json::static
+
+redef class RefundProcessor
+
+       redef fun process(input_file, output_file) do
+               self.output_file = output_file
+               var json = load_input(input_file)
+               var sheet = new ReclamationSheet.from_json(self, json)
+               var res = process_refunds(sheet)
+               write_output(res.to_pretty_json, output_file)
+       end
+
+       # Computes allowed refunds for a given `ReclamationSheet`.
+       fun process_refunds(sheet: ReclamationSheet): JsonObject do
+               # update stats
+               var stats = load_stats
+               stats.inc("total_treatments")
+               # compute refunds
+               current_refunds.clear
+               var json = new JsonObject
+               json["dossier"] = sheet.file.to_s
+               json["mois"] = sheet.month.to_s
+               var arr = new JsonArray
+               var sum = 0.0.to_dollar
+               for recl in sheet.recls do
+                       var refund = process_refund(sheet, recl)
+                       var obj = new JsonObject
+                       obj["soin"] = recl.care_id
+                       obj["date"] = recl.date.to_s
+                       obj["montant"] = refund.to_s
+                       arr.add obj
+                       sum += refund
+                       # update stats for care
+                       stats.inc("total_{recl.care_id}")
+               end
+               save_stats(stats)
+               json["remboursements"] = arr
+               json["total"] = sum.to_s
+               return json
+       end
+
+       # Loads the input string and returns its content as a JsonObject.
+       #
+       # Dies if the file cannot be read or does not contain a valid JSONObject.
+       fun load_input(file: String): JsonObject do
+               if not file.file_exists then
+                       die("File `{file}` not found.")
+                       abort
+               end
+               var ptr = new FileReader.open(file)
+               var json = ptr.read_all.parse_json
+               if json isa JsonParseError then
+                       die("Wrong input file ({json.message})")
+                       abort
+               else if not json isa JsonObject then
+                       die("Wrong input type (expected JsonObject got {json.class_name})")
+                       abort
+               end
+               ptr.close
+               return json
+       end
+
+       # Writes `str` in path specified by `file`.
+       #
+       # Used to produce output and stats.
+       fun write_output(str: String, file: String) do
+               var ofs = new FileWriter.open(file)
+               ofs.write(str)
+               ofs.close
+       end
+
+       # UTILS
+
+       # Does `json` contains `key`? Dies otherwise.
+       private fun check_key(json: JsonObject, key: String) do
+               if json.has_key(key) then return
+               die("Malformed input (missing key {key})")
+       end
+
+       # Does `str` match the regex `re`.
+       private fun check_format(str, re: String): Bool do
+               return str.has(re.to_re)
+       end
+
+       redef fun die(msg) do
+               # save error
+               var obj = new JsonObject
+               obj["message"] = msg
+               write_output(obj.to_pretty_json, output_file)
+               # update stats
+               var stats = load_stats
+               stats.inc("total_reject")
+               save_stats(stats)
+               # leave
+               exit 1
+       end
+
+       redef fun show_stats do print load_stats.to_json.to_pretty_json
+
+       redef fun load_stats do
+               # If no stats found, return a new object
+               if not stats_file.file_exists then return new RefundStats
+               # Try to read from file
+               var ifs = new FileReader.open(stats_file)
+               var content = ifs.read_all.parse_json
+               ifs.close
+               # If file is corrupted, return a new object
+               if not content isa JsonObject then return new RefundStats
+               # Return file contained stats
+               return new RefundStats.from_json(content)
+       end
+
+       redef fun save_stats(stats: RefundStats) do
+               write_output(stats.to_json.to_pretty_json, stats_file)
+       end
+end
+
+redef class RefundStats
+
+       # Inits `self` from the content of a JsonObject
+       init from_json(json: JsonObject) do
+               for k, v in json do self[k] = v.as(Int)
+       end
+
+       # Outputs `self` as a JSON string.
+       fun to_json: JsonObject do
+               var obj = new JsonObject
+               for k, v in self do obj[k] = v
+               return obj
+       end
+end
+
+redef class ReclamationSheet
+
+       # Inits `self` from the content of a `JsonObject`.
+       init from_json(proc: RefundProcessor, json: JsonObject) do
+               file = new ReclFile.from_json(proc, json)
+               month = new ReclMonth.from_json(proc, json)
+               recls = parse_recls(proc, json)
+               init(file, month)
+       end
+
+       # Parses and checks the given `json` then returns an array of `Reclamation` instances.
+       private fun parse_recls(proc: RefundProcessor, json: JsonObject): Array[Reclamation] do
+               proc.check_key(json, "reclamations")
+               var res = new Array[Reclamation]
+               var recls = json["reclamations"]
+               if not recls isa JsonArray then
+                       proc.die("Wrong type for `number` (expected JsonArray got {recls.class_name})")
+                       abort
+               end
+               var i = 0
+               for obj in recls do
+                       if not obj isa JsonObject then
+                               proc.die("Wrong type for `reclamations#{i}` " +
+                                       "(expected JsonObject got {obj.class_name})")
+                               abort
+                       end
+                       var recl = new Reclamation.from_json(proc, obj)
+                       if not month.has(recl.date) then
+                               proc.die("Wrong `mois` for `soin` with id `{recl.care_id}`")
+                               abort
+                       end
+                       if file.contract.care_by_id(recl.care_id) == null then
+                               proc.die("Unknown `soin` with id `{recl.care_id}`")
+                               abort
+                       end
+                       res.add recl
+                       i += 1
+               end
+               return res
+       end
+end
+
+redef class ReclFile
+       # Inits `self` from the content of a JsonObject.
+       init from_json(proc: RefundProcessor, json: JsonObject) do
+               proc.check_key(json, "dossier")
+               var id = json["dossier"]
+               if not id isa String then
+                       proc.die("Wrong type for `dossier` (expected String got {id.class_name})")
+                       abort
+               end
+               # Check format
+               parse_contract(proc, id)
+               parse_client(proc, id)
+               init(id)
+       end
+
+       # Tries to parse the contract from `file_id` string.
+       private fun parse_contract(proc: RefundProcessor, file_id: String) do
+               var kind = file_id.first.to_s
+               if not proc.check_format(kind, "^[A-E]\{1\}$") then
+                       proc.die("Wrong contract (expected A, B, C, D or E got {kind})")
+               end
+               contract = contract_factory(proc, kind)
+       end
+
+       # Tries to parse the client number from the `file_id` string.
+       private fun parse_client(proc: RefundProcessor, file_id: String) do
+               var num = file_id.substring_from(1)
+               if not proc.check_format(num, "^[0-9]\{6\}$") then
+                       proc.die("Wrong format for `number` (expected XXXXXX got {num})")
+                       abort
+               end
+               client = new Client(num)
+       end
+end
+
+redef class ReclMonth
+       # Inits `self` from a `JsonObject`.
+       init from_json(proc: RefundProcessor, json: JsonObject) do
+               proc.check_key(json, "mois")
+               var month = json["mois"]
+               if not month isa String then
+                       proc.die("Wrong type for `mois` (expected String got {month.class_name})")
+                       return
+               end
+               if not proc.check_format(month, "^[0-9]\{4\}-[0-9]\{2\}$") then
+                       proc.die("Wrong format for `mois` (expected AAAA-MM got {month})")
+                       return
+               end
+               from_string(proc, month)
+       end
+
+       # Inits `self` from a string representation formatted as `AAAA-MM`.
+       init from_string(proc: RefundProcessor, str: String) do
+               var parts = str.split("-")
+               var year = parts[0].to_i
+               var month = parts[1].to_i
+               if month < 1 or month > 12 then
+                       proc.die("Wrong format for `mois` (expected AAAA-MM got {str})")
+                       return
+               end
+               date = new ReclDate(year, month, 1)
+               init(date)
+       end
+end
+
+redef class ReclDate
+       # Inits `self` from a `JsonObject`.
+       #
+       # Dies if the `json` input is invalid.
+       init from_json(proc: RefundProcessor, json: JsonObject) do
+               proc.check_key(json, "date")
+               var date = json["date"]
+               if not date isa String then
+                       proc.die("Wrong type for `date` (expected String got {date.class_name})")
+                       abort
+               end
+               if not proc.check_format(date, "^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}$") then
+                       proc.die("Wrong format for `date` (expected AAAA-MM-DD got {date})")
+                       abort
+               end
+               from_string(proc, date)
+       end
+
+       # Inits `self` from its string representation formatted as `AAAA-MM`.
+       init from_string(proc: RefundProcessor, str: String) do
+               var parts = str.split("-")
+               year = parts[0].to_i
+               month = parts[1].to_i
+               day = parts[2].to_i
+               if month < 1 or month > 12 or day < 1 or day > 31 then
+                       proc.die("Wrong format for `mois` (expected AAAA-MM got {str})")
+                       abort
+               end
+               init(year, month, day)
+       end
+end
+
+redef class Reclamation
+       # Inits `self` from a `JsonObject`.
+       init from_json(proc: RefundProcessor, json: JsonObject) do
+               care_id = parse_care_id(proc, json)
+               date = new ReclDate.from_json(proc, json)
+               fees = parse_fees(proc, json)
+               init(care_id, date, fees)
+       end
+
+       # Inits `self` from its string representation formatted as `Int`.
+       private fun parse_care_id(proc: RefundProcessor, json: JsonObject): Int do
+               proc.check_key(json, "soin")
+               var id = json["soin"]
+               if not id isa Int then
+                       proc.die("Wrong type for `soin` (expected Int got {id.class_name})")
+                       abort
+               end
+               return id
+       end
+
+       # Inits `self` from its string representation formatted as `0.00$`.
+       private fun parse_fees(proc: RefundProcessor, json: JsonObject): Dollar do
+               proc.check_key(json, "montant")
+               var fees = json["montant"]
+               if not fees isa String then
+                       proc.die("Wrong type for `fees` (expected String got {fees.class_name})")
+                       abort
+               end
+               if not proc.check_format(fees, "^[0-9]+((\\.|\\,)[0-9]+)?\\$$") then
+                       proc.die("Wrong format for `montant` (expected XX.XX$ got {fees})")
+                       abort
+               end
+               return new Dollar.from_float(fees.basename("$").to_f)
+       end
+end
diff --git a/contrib/refund/tests/Makefile b/contrib/refund/tests/Makefile
new file mode 100644 (file)
index 0000000..0dce637
--- /dev/null
@@ -0,0 +1,21 @@
+# Copyright 2013 Alexandre Terrasa <alexandre@moz-code.org>.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+all: tests
+
+tests: clean
+       ./tests.sh
+
+clean:
+       rm -rf out/
diff --git a/contrib/refund/tests/client_error1.json b/contrib/refund/tests/client_error1.json
new file mode 100644 (file)
index 0000000..eef9501
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/client_error2.json b/contrib/refund/tests/client_error2.json
new file mode 100644 (file)
index 0000000..a6011f9
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A1003233",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/client_error3.json b/contrib/refund/tests/client_error3.json
new file mode 100644 (file)
index 0000000..7a2fe14
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A10032A",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/client_error4.json b/contrib/refund/tests/client_error4.json
new file mode 100644 (file)
index 0000000..025d228
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": 1003233,
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractA1.json b/contrib/refund/tests/contractA1.json
new file mode 100644 (file)
index 0000000..21ebb8b
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractA2.json b/contrib/refund/tests/contractA2.json
new file mode 100644 (file)
index 0000000..13373a1
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 0,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        },
+        {
+            "soin": 600,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractA3.json b/contrib/refund/tests/contractA3.json
new file mode 100644 (file)
index 0000000..c119435
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 150,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        },
+        {
+            "soin": 175,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractA4.json b/contrib/refund/tests/contractA4.json
new file mode 100644 (file)
index 0000000..d6d02b4
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 150,
+            "date": "2015-01-11",
+            "montant": "200,00$"
+        },
+        {
+            "soin": 175,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractA5.json b/contrib/refund/tests/contractA5.json
new file mode 100644 (file)
index 0000000..ca6f222
--- /dev/null
@@ -0,0 +1,26 @@
+{
+       "dossier": "A100323",
+       "mois": "2015-01",
+       "reclamations": [
+               {
+                       "soin": 175,
+                       "date": "2015-01-11",
+                       "montant": "130.00$"
+               },
+               {
+                       "soin": 175,
+                       "date": "2015-01-14",
+                       "montant": "130.00$"
+               },
+               {
+                       "soin": 175,
+                       "date": "2015-01-15",
+                       "montant": "130.00$"
+               },
+               {
+                       "soin": 175,
+                       "date": "2015-01-17",
+                       "montant": "130.00$"
+               }
+       ]
+}
diff --git a/contrib/refund/tests/contractB1.json b/contrib/refund/tests/contractB1.json
new file mode 100644 (file)
index 0000000..31afc35
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "B100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "400.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractB2.json b/contrib/refund/tests/contractB2.json
new file mode 100644 (file)
index 0000000..16af82c
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "B100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 200,
+            "date": "2015-01-11",
+            "montant": "69.00$"
+        },
+        {
+            "soin": 400,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 600,
+            "date": "2015-01-23",
+            "montant": "400.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractB3.json b/contrib/refund/tests/contractB3.json
new file mode 100644 (file)
index 0000000..b2df55a
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "dossier": "B100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 150,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        },
+        {
+            "soin": 175,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractB4.json b/contrib/refund/tests/contractB4.json
new file mode 100644 (file)
index 0000000..555766f
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "dossier": "B100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 150,
+            "date": "2015-01-11",
+            "montant": "200,00$"
+        },
+        {
+            "soin": 175,
+            "date": "2015-01-11",
+            "montant": "200,00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractB5.json b/contrib/refund/tests/contractB5.json
new file mode 100644 (file)
index 0000000..0ea3611
--- /dev/null
@@ -0,0 +1,41 @@
+{
+    "dossier": "B100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "400,00$"
+        },
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "400,00$"
+        },
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "400,00$"
+        },
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "400,00$"
+        },
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "400,00$"
+        },
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "400,00$"
+        },
+        {
+            "soin": 600,
+            "date": "2015-01-11",
+            "montant": "1400,00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractC1.json b/contrib/refund/tests/contractC1.json
new file mode 100644 (file)
index 0000000..628f9e6
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "C100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "100.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-13",
+            "montant": "200.00$"
+        },
+        {
+            "soin": 399,
+            "date": "2015-01-23",
+            "montant": "400.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractC2.json b/contrib/refund/tests/contractC2.json
new file mode 100644 (file)
index 0000000..c9f2a9a
--- /dev/null
@@ -0,0 +1,5 @@
+{
+    "dossier": "C100323",
+    "mois": "2015-01",
+    "reclamations": []
+}
diff --git a/contrib/refund/tests/contractC3.json b/contrib/refund/tests/contractC3.json
new file mode 100644 (file)
index 0000000..a502605
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "dossier": "C100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 150,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        },
+        {
+            "soin": 175,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractD1.json b/contrib/refund/tests/contractD1.json
new file mode 100644 (file)
index 0000000..7a47a3f
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "D100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-13",
+            "montant": "900.00$"
+        },
+        {
+            "soin": 600,
+            "date": "2015-01-23",
+            "montant": "100.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractD2.json b/contrib/refund/tests/contractD2.json
new file mode 100644 (file)
index 0000000..c7fb96f
--- /dev/null
@@ -0,0 +1,26 @@
+{
+    "dossier": "D100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 200,
+            "date": "2015-01-11",
+            "montant": "69.00$"
+        },
+        {
+            "soin": 400,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 600,
+            "date": "2015-01-23",
+            "montant": "400.00$"
+        },
+        {
+            "soin": 600,
+            "date": "2015-01-23",
+            "montant": "0.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractD3.json b/contrib/refund/tests/contractD3.json
new file mode 100644 (file)
index 0000000..7580bbf
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "D100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 200,
+            "date": "2015-01-11",
+            "montant": "69.00$"
+        },
+        {
+            "soin": 400,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 600,
+            "date": "2015-01-23",
+            "montant": "400.00$"
+        }
+       ]
+}
diff --git a/contrib/refund/tests/contractD4.json b/contrib/refund/tests/contractD4.json
new file mode 100644 (file)
index 0000000..55e50f5
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "dossier": "D100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 150,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        },
+        {
+            "soin": 175,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractE1.json b/contrib/refund/tests/contractE1.json
new file mode 100644 (file)
index 0000000..91ba4c1
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "E100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-13",
+            "montant": "900.00$"
+        },
+        {
+            "soin": 600,
+            "date": "2015-01-23",
+            "montant": "100.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractE2.json b/contrib/refund/tests/contractE2.json
new file mode 100644 (file)
index 0000000..d805d2b
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "E100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 200,
+            "date": "2015-01-11",
+            "montant": "69.00$"
+        },
+        {
+            "soin": 400,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 600,
+            "date": "2015-01-23",
+            "montant": "400.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contractE3.json b/contrib/refund/tests/contractE3.json
new file mode 100644 (file)
index 0000000..4cfed1b
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "E100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 200,
+            "date": "2015-01-11",
+            "montant": "69.00$"
+        },
+        {
+            "soin": 400,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 500,
+            "date": "2015-01-23",
+            "montant": "400.00$"
+        }
+       ]
+}
diff --git a/contrib/refund/tests/contractE4.json b/contrib/refund/tests/contractE4.json
new file mode 100644 (file)
index 0000000..6c16688
--- /dev/null
@@ -0,0 +1,16 @@
+{
+    "dossier": "E100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 150,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        },
+        {
+            "soin": 175,
+            "date": "2015-01-11",
+            "montant": "200.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contract_error1.json b/contrib/refund/tests/contract_error1.json
new file mode 100644 (file)
index 0000000..feb423f
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contract_error2.json b/contrib/refund/tests/contract_error2.json
new file mode 100644 (file)
index 0000000..4aac886
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "a100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contract_error3.json b/contrib/refund/tests/contract_error3.json
new file mode 100644 (file)
index 0000000..271111c
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "Z100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/contract_error4.json b/contrib/refund/tests/contract_error4.json
new file mode 100644 (file)
index 0000000..30bd236
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "100100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/dossier_error1.json b/contrib/refund/tests/dossier_error1.json
new file mode 100644 (file)
index 0000000..be5cdc3
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/json_error1.json b/contrib/refund/tests/json_error1.json
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/contrib/refund/tests/json_error2.json b/contrib/refund/tests/json_error2.json
new file mode 100644 (file)
index 0000000..fe51488
--- /dev/null
@@ -0,0 +1 @@
+[]
diff --git a/contrib/refund/tests/json_error3.json b/contrib/refund/tests/json_error3.json
new file mode 100644 (file)
index 0000000..98232c6
--- /dev/null
@@ -0,0 +1 @@
+{
diff --git a/contrib/refund/tests/month_error1.json b/contrib/refund/tests/month_error1.json
new file mode 100644 (file)
index 0000000..9f8213e
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "dossier": "A100323",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/month_error2.json b/contrib/refund/tests/month_error2.json
new file mode 100644 (file)
index 0000000..d1f4321
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": 10,
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/month_error3.json b/contrib/refund/tests/month_error3.json
new file mode 100644 (file)
index 0000000..734fc6a
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015/01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/month_error4.json b/contrib/refund/tests/month_error4.json
new file mode 100644 (file)
index 0000000..26faacf
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-23",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_date_error1.json b/contrib/refund/tests/recl_date_error1.json
new file mode 100644 (file)
index 0000000..46654c1
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_date_error2.json b/contrib/refund/tests/recl_date_error2.json
new file mode 100644 (file)
index 0000000..b26aac6
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015/01/11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_date_error3.json b/contrib/refund/tests/recl_date_error3.json
new file mode 100644 (file)
index 0000000..b11c1a9
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-13-32",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_date_error4.json b/contrib/refund/tests/recl_date_error4.json
new file mode 100644 (file)
index 0000000..b40c028
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-02-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_error1.json b/contrib/refund/tests/recl_error1.json
new file mode 100644 (file)
index 0000000..664374e
--- /dev/null
@@ -0,0 +1,4 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01"
+}
diff --git a/contrib/refund/tests/recl_error2.json b/contrib/refund/tests/recl_error2.json
new file mode 100644 (file)
index 0000000..25d29f6
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": {
+        "1": {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        "2": {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        "3": {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    }
+}
diff --git a/contrib/refund/tests/recl_error3.json b/contrib/refund/tests/recl_error3.json
new file mode 100644 (file)
index 0000000..eaeb509
--- /dev/null
@@ -0,0 +1,5 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [1, 2, 3]
+}
diff --git a/contrib/refund/tests/recl_error4.json b/contrib/refund/tests/recl_error4.json
new file mode 100644 (file)
index 0000000..c1218bd
--- /dev/null
@@ -0,0 +1,17 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {},
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_fees_error1.json b/contrib/refund/tests/recl_fees_error1.json
new file mode 100644 (file)
index 0000000..164d3f0
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_fees_error2.json b/contrib/refund/tests/recl_fees_error2.json
new file mode 100644 (file)
index 0000000..8bd0eb5
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "ABCD"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_fees_error3.json b/contrib/refund/tests/recl_fees_error3.json
new file mode 100644 (file)
index 0000000..a51948e
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_fees_error4.json b/contrib/refund/tests/recl_fees_error4.json
new file mode 100644 (file)
index 0000000..baf4d5b
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 100,
+            "date": "2015-01-11",
+            "montant": "234.00"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_soin_error1.json b/contrib/refund/tests/recl_soin_error1.json
new file mode 100644 (file)
index 0000000..35f0425
--- /dev/null
@@ -0,0 +1,20 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_soin_error2.json b/contrib/refund/tests/recl_soin_error2.json
new file mode 100644 (file)
index 0000000..34ffd0b
--- /dev/null
@@ -0,0 +1,21 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": "200",
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        },
+        {
+            "soin": 200,
+            "date": "2015-01-13",
+            "montant": "90.00$"
+        },
+        {
+            "soin": 334,
+            "date": "2015-01-23",
+            "montant": "125.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/recl_soin_error3.json b/contrib/refund/tests/recl_soin_error3.json
new file mode 100644 (file)
index 0000000..acf7c8d
--- /dev/null
@@ -0,0 +1,11 @@
+{
+    "dossier": "A100323",
+    "mois": "2015-01",
+    "reclamations": [
+        {
+            "soin": 900,
+            "date": "2015-01-11",
+            "montant": "234.00$"
+        }
+    ]
+}
diff --git a/contrib/refund/tests/res/client_error1.res b/contrib/refund/tests/res/client_error1.res
new file mode 100644 (file)
index 0000000..379d67e
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `number` (expected XXXXXX got )"
+}
diff --git a/contrib/refund/tests/res/client_error2.res b/contrib/refund/tests/res/client_error2.res
new file mode 100644 (file)
index 0000000..0984ee4
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `number` (expected XXXXXX got 1003233)"
+}
diff --git a/contrib/refund/tests/res/client_error3.res b/contrib/refund/tests/res/client_error3.res
new file mode 100644 (file)
index 0000000..3490290
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `number` (expected XXXXXX got 10032A)"
+}
diff --git a/contrib/refund/tests/res/client_error4.res b/contrib/refund/tests/res/client_error4.res
new file mode 100644 (file)
index 0000000..975c246
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong type for `dossier` (expected String got Int)"
+}
diff --git a/contrib/refund/tests/res/contractA1.res b/contrib/refund/tests/res/contractA1.res
new file mode 100644 (file)
index 0000000..4d0387b
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "A100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "81.89$"
+       }, {
+               "soin": 200,
+               "date": "2015-01-13",
+               "montant": "22.50$"
+       }, {
+               "soin": 334,
+               "date": "2015-01-23",
+               "montant": "0.0$"
+       }],
+       "total": "104.39$"
+}
diff --git a/contrib/refund/tests/res/contractA2.res b/contrib/refund/tests/res/contractA2.res
new file mode 100644 (file)
index 0000000..cb578a2
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "A100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 0,
+               "date": "2015-01-11",
+               "montant": "50.0$"
+       }, {
+               "soin": 334,
+               "date": "2015-01-23",
+               "montant": "0.0$"
+       }, {
+               "soin": 600,
+               "date": "2015-01-13",
+               "montant": "36.0$"
+       }],
+       "total": "86.0$"
+}
diff --git a/contrib/refund/tests/res/contractA3.res b/contrib/refund/tests/res/contractA3.res
new file mode 100644 (file)
index 0000000..5cbc843
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "dossier": "A100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 150,
+               "date": "2015-01-11",
+               "montant": "0.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-11",
+               "montant": "100.0$"
+       }],
+       "total": "100.0$"
+}
diff --git a/contrib/refund/tests/res/contractA4.res b/contrib/refund/tests/res/contractA4.res
new file mode 100644 (file)
index 0000000..5cbc843
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "dossier": "A100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 150,
+               "date": "2015-01-11",
+               "montant": "0.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-11",
+               "montant": "100.0$"
+       }],
+       "total": "100.0$"
+}
diff --git a/contrib/refund/tests/res/contractA5.res b/contrib/refund/tests/res/contractA5.res
new file mode 100644 (file)
index 0000000..d30e4ba
--- /dev/null
@@ -0,0 +1,22 @@
+{
+       "dossier": "A100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 175,
+               "date": "2015-01-11",
+               "montant": "65.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-14",
+               "montant": "65.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-15",
+               "montant": "65.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-17",
+               "montant": "5.0$"
+       }],
+       "total": "200.0$"
+}
diff --git a/contrib/refund/tests/res/contractB1.res b/contrib/refund/tests/res/contractB1.res
new file mode 100644 (file)
index 0000000..39a5161
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "B100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "50.0$"
+       }, {
+               "soin": 200,
+               "date": "2015-01-13",
+               "montant": "90.0$"
+       }, {
+               "soin": 334,
+               "date": "2015-01-23",
+               "montant": "200.0$"
+       }],
+       "total": "340.0$"
+}
diff --git a/contrib/refund/tests/res/contractB2.res b/contrib/refund/tests/res/contractB2.res
new file mode 100644 (file)
index 0000000..559dcfd
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "B100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 200,
+               "date": "2015-01-11",
+               "montant": "69.0$"
+       }, {
+               "soin": 400,
+               "date": "2015-01-13",
+               "montant": "0.0$"
+       }, {
+               "soin": 600,
+               "date": "2015-01-23",
+               "montant": "300.0$"
+       }],
+       "total": "369.0$"
+}
diff --git a/contrib/refund/tests/res/contractB3.res b/contrib/refund/tests/res/contractB3.res
new file mode 100644 (file)
index 0000000..3556ba0
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "dossier": "B100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 150,
+               "date": "2015-01-11",
+               "montant": "0.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-11",
+               "montant": "150.0$"
+       }],
+       "total": "150.0$"
+}
diff --git a/contrib/refund/tests/res/contractB4.res b/contrib/refund/tests/res/contractB4.res
new file mode 100644 (file)
index 0000000..3556ba0
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "dossier": "B100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 150,
+               "date": "2015-01-11",
+               "montant": "0.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-11",
+               "montant": "150.0$"
+       }],
+       "total": "150.0$"
+}
diff --git a/contrib/refund/tests/res/contractB5.res b/contrib/refund/tests/res/contractB5.res
new file mode 100644 (file)
index 0000000..9a31198
--- /dev/null
@@ -0,0 +1,34 @@
+{
+       "dossier": "B100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "50.0$"
+       }, {
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "50.0$"
+       }, {
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "50.0$"
+       }, {
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "50.0$"
+       }, {
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "50.0$"
+       }, {
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "0.0$"
+       }, {
+               "soin": 600,
+               "date": "2015-01-11",
+               "montant": "300.0$"
+       }],
+       "total": "550.0$"
+}
diff --git a/contrib/refund/tests/res/contractC1.res b/contrib/refund/tests/res/contractC1.res
new file mode 100644 (file)
index 0000000..42f11ed
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "C100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "95.0$"
+       }, {
+               "soin": 334,
+               "date": "2015-01-13",
+               "montant": "180.0$"
+       }, {
+               "soin": 399,
+               "date": "2015-01-23",
+               "montant": "360.0$"
+       }],
+       "total": "635.0$"
+}
diff --git a/contrib/refund/tests/res/contractC2.res b/contrib/refund/tests/res/contractC2.res
new file mode 100644 (file)
index 0000000..1f8f2bf
--- /dev/null
@@ -0,0 +1,6 @@
+{
+       "dossier": "C100323",
+       "mois": "2015-01",
+       "remboursements": [],
+       "total": "0.0$"
+}
diff --git a/contrib/refund/tests/res/contractC3.res b/contrib/refund/tests/res/contractC3.res
new file mode 100644 (file)
index 0000000..8c4a0a6
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "dossier": "C100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 150,
+               "date": "2015-01-11",
+               "montant": "170.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-11",
+               "montant": "180.0$"
+       }],
+       "total": "350.0$"
+}
diff --git a/contrib/refund/tests/res/contractD1.res b/contrib/refund/tests/res/contractD1.res
new file mode 100644 (file)
index 0000000..b69ed8c
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "D100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "75.0$"
+       }, {
+               "soin": 334,
+               "date": "2015-01-13",
+               "montant": "900.0$"
+       }, {
+               "soin": 600,
+               "date": "2015-01-23",
+               "montant": "100.0$"
+       }],
+       "total": "1075.0$"
+}
diff --git a/contrib/refund/tests/res/contractD2.res b/contrib/refund/tests/res/contractD2.res
new file mode 100644 (file)
index 0000000..2520f7f
--- /dev/null
@@ -0,0 +1,22 @@
+{
+       "dossier": "D100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 200,
+               "date": "2015-01-11",
+               "montant": "69.0$"
+       }, {
+               "soin": 400,
+               "date": "2015-01-13",
+               "montant": "65.0$"
+       }, {
+               "soin": 600,
+               "date": "2015-01-23",
+               "montant": "100.0$"
+       }, {
+               "soin": 600,
+               "date": "2015-01-23",
+               "montant": "0.0$"
+       }],
+       "total": "234.0$"
+}
diff --git a/contrib/refund/tests/res/contractD3.res b/contrib/refund/tests/res/contractD3.res
new file mode 100644 (file)
index 0000000..2d00ee8
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "D100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 200,
+               "date": "2015-01-11",
+               "montant": "69.0$"
+       }, {
+               "soin": 400,
+               "date": "2015-01-13",
+               "montant": "65.0$"
+       }, {
+               "soin": 600,
+               "date": "2015-01-23",
+               "montant": "100.0$"
+       }],
+       "total": "234.0$"
+}
diff --git a/contrib/refund/tests/res/contractD4.res b/contrib/refund/tests/res/contractD4.res
new file mode 100644 (file)
index 0000000..9f26bfe
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "dossier": "D100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 150,
+               "date": "2015-01-11",
+               "montant": "150.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-11",
+               "montant": "190.0$"
+       }],
+       "total": "340.0$"
+}
diff --git a/contrib/refund/tests/res/contractE1.res b/contrib/refund/tests/res/contractE1.res
new file mode 100644 (file)
index 0000000..2f9d9c3
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "E100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 100,
+               "date": "2015-01-11",
+               "montant": "58.50$"
+       }, {
+               "soin": 334,
+               "date": "2015-01-13",
+               "montant": "540.0$"
+       }, {
+               "soin": 600,
+               "date": "2015-01-23",
+               "montant": "15.0$"
+       }],
+       "total": "613.50$"
+}
diff --git a/contrib/refund/tests/res/contractE2.res b/contrib/refund/tests/res/contractE2.res
new file mode 100644 (file)
index 0000000..5bb6f4d
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "E100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 200,
+               "date": "2015-01-11",
+               "montant": "8.27$"
+       }, {
+               "soin": 400,
+               "date": "2015-01-13",
+               "montant": "15.0$"
+       }, {
+               "soin": 600,
+               "date": "2015-01-23",
+               "montant": "60.0$"
+       }],
+       "total": "83.27$"
+}
diff --git a/contrib/refund/tests/res/contractE3.res b/contrib/refund/tests/res/contractE3.res
new file mode 100644 (file)
index 0000000..f28adb2
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "dossier": "E100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 200,
+               "date": "2015-01-11",
+               "montant": "8.27$"
+       }, {
+               "soin": 400,
+               "date": "2015-01-13",
+               "montant": "15.0$"
+       }, {
+               "soin": 500,
+               "date": "2015-01-23",
+               "montant": "20.0$"
+       }],
+       "total": "43.27$"
+}
diff --git a/contrib/refund/tests/res/contractE4.res b/contrib/refund/tests/res/contractE4.res
new file mode 100644 (file)
index 0000000..961ec12
--- /dev/null
@@ -0,0 +1,14 @@
+{
+       "dossier": "E100323",
+       "mois": "2015-01",
+       "remboursements": [{
+               "soin": 150,
+               "date": "2015-01-11",
+               "montant": "30.0$"
+       }, {
+               "soin": 175,
+               "date": "2015-01-11",
+               "montant": "20.0$"
+       }],
+       "total": "50.0$"
+}
diff --git a/contrib/refund/tests/res/contract_error1.res b/contrib/refund/tests/res/contract_error1.res
new file mode 100644 (file)
index 0000000..dd8b5e7
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong contract (expected A, B, C, D or E got 1)"
+}
diff --git a/contrib/refund/tests/res/contract_error2.res b/contrib/refund/tests/res/contract_error2.res
new file mode 100644 (file)
index 0000000..c6b464a
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong contract (expected A, B, C, D or E got a)"
+}
diff --git a/contrib/refund/tests/res/contract_error3.res b/contrib/refund/tests/res/contract_error3.res
new file mode 100644 (file)
index 0000000..c009811
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong contract (expected A, B, C, D or E got Z)"
+}
diff --git a/contrib/refund/tests/res/contract_error4.res b/contrib/refund/tests/res/contract_error4.res
new file mode 100644 (file)
index 0000000..dd8b5e7
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong contract (expected A, B, C, D or E got 1)"
+}
diff --git a/contrib/refund/tests/res/dossier_error1.res b/contrib/refund/tests/res/dossier_error1.res
new file mode 100644 (file)
index 0000000..8af54e2
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Malformed input (missing key dossier)"
+}
diff --git a/contrib/refund/tests/res/json_error1.res b/contrib/refund/tests/res/json_error1.res
new file mode 100644 (file)
index 0000000..958aa8d
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong input file (Unexpected Eof; is acceptable instead: value)"
+}
diff --git a/contrib/refund/tests/res/json_error2.res b/contrib/refund/tests/res/json_error2.res
new file mode 100644 (file)
index 0000000..9a451f7
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong input type (expected JsonObject got JsonArray)"
+}
diff --git a/contrib/refund/tests/res/json_error3.res b/contrib/refund/tests/res/json_error3.res
new file mode 100644 (file)
index 0000000..d35b982
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong input file (Unexpected Eof; is acceptable instead: members, pair)"
+}
diff --git a/contrib/refund/tests/res/month_error1.res b/contrib/refund/tests/res/month_error1.res
new file mode 100644 (file)
index 0000000..57810ce
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Malformed input (missing key mois)"
+}
diff --git a/contrib/refund/tests/res/month_error2.res b/contrib/refund/tests/res/month_error2.res
new file mode 100644 (file)
index 0000000..16557d6
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong type for `mois` (expected String got Int)"
+}
diff --git a/contrib/refund/tests/res/month_error3.res b/contrib/refund/tests/res/month_error3.res
new file mode 100644 (file)
index 0000000..088b6fe
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `mois` (expected AAAA-MM got 2015\/01)"
+}
diff --git a/contrib/refund/tests/res/month_error4.res b/contrib/refund/tests/res/month_error4.res
new file mode 100644 (file)
index 0000000..a81529d
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `mois` (expected AAAA-MM got 2015-23)"
+}
diff --git a/contrib/refund/tests/res/recl_date_error1.res b/contrib/refund/tests/res/recl_date_error1.res
new file mode 100644 (file)
index 0000000..307401c
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Malformed input (missing key date)"
+}
diff --git a/contrib/refund/tests/res/recl_date_error2.res b/contrib/refund/tests/res/recl_date_error2.res
new file mode 100644 (file)
index 0000000..5fee43f
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `date` (expected AAAA-MM-DD got 2015\/01\/11)"
+}
diff --git a/contrib/refund/tests/res/recl_date_error3.res b/contrib/refund/tests/res/recl_date_error3.res
new file mode 100644 (file)
index 0000000..e8a33ce
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `mois` (expected AAAA-MM got 2015-13-32)"
+}
diff --git a/contrib/refund/tests/res/recl_date_error4.res b/contrib/refund/tests/res/recl_date_error4.res
new file mode 100644 (file)
index 0000000..6e3f2ca
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong `mois` for `soin` with id `100`"
+}
diff --git a/contrib/refund/tests/res/recl_error1.res b/contrib/refund/tests/res/recl_error1.res
new file mode 100644 (file)
index 0000000..c4e34c8
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Malformed input (missing key reclamations)"
+}
diff --git a/contrib/refund/tests/res/recl_error2.res b/contrib/refund/tests/res/recl_error2.res
new file mode 100644 (file)
index 0000000..5716df8
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong type for `number` (expected JsonArray got JsonObject)"
+}
diff --git a/contrib/refund/tests/res/recl_error3.res b/contrib/refund/tests/res/recl_error3.res
new file mode 100644 (file)
index 0000000..e8f5c80
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong type for `reclamations#0` (expected JsonObject got Int)"
+}
diff --git a/contrib/refund/tests/res/recl_error4.res b/contrib/refund/tests/res/recl_error4.res
new file mode 100644 (file)
index 0000000..74de465
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Malformed input (missing key soin)"
+}
diff --git a/contrib/refund/tests/res/recl_fees_error1.res b/contrib/refund/tests/res/recl_fees_error1.res
new file mode 100644 (file)
index 0000000..beebcee
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Malformed input (missing key montant)"
+}
diff --git a/contrib/refund/tests/res/recl_fees_error2.res b/contrib/refund/tests/res/recl_fees_error2.res
new file mode 100644 (file)
index 0000000..09232e5
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `montant` (expected XX.XX$ got ABCD)"
+}
diff --git a/contrib/refund/tests/res/recl_fees_error3.res b/contrib/refund/tests/res/recl_fees_error3.res
new file mode 100644 (file)
index 0000000..1679482
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `montant` (expected XX.XX$ got 234)"
+}
diff --git a/contrib/refund/tests/res/recl_fees_error4.res b/contrib/refund/tests/res/recl_fees_error4.res
new file mode 100644 (file)
index 0000000..1ee1660
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong format for `montant` (expected XX.XX$ got 234.00)"
+}
diff --git a/contrib/refund/tests/res/recl_soin_error1.res b/contrib/refund/tests/res/recl_soin_error1.res
new file mode 100644 (file)
index 0000000..74de465
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Malformed input (missing key soin)"
+}
diff --git a/contrib/refund/tests/res/recl_soin_error2.res b/contrib/refund/tests/res/recl_soin_error2.res
new file mode 100644 (file)
index 0000000..c2a092d
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Wrong type for `soin` (expected Int got FlatString)"
+}
diff --git a/contrib/refund/tests/res/recl_soin_error3.res b/contrib/refund/tests/res/recl_soin_error3.res
new file mode 100644 (file)
index 0000000..3f38e32
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "message": "Unknown `soin` with id `900`"
+}
diff --git a/contrib/refund/tests/tests.sh b/contrib/refund/tests/tests.sh
new file mode 100755 (executable)
index 0000000..9ebf63f
--- /dev/null
@@ -0,0 +1,85 @@
+#!/bin/bash
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Alexandre Terrasa <alexandre@moz-code.org>.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+BIN=../bin
+OUT=out
+RES=res
+
+# Execute test with name $1.
+run_test()
+{
+       local test="$1"
+       $BIN/refund $test.json $OUT/$test.res > $OUT/$test.out 2> $OUT/$test.err
+       diff $OUT/$test.res $RES/$test.res > $OUT/$test.diff 2> /dev/null
+}
+
+# Return
+#  0 if the sav not exists
+#  1 if the file does match
+#  2 if the file does not match
+check_result() {
+       local test="$1"
+
+       if [ ! -r "$RES/$test.res" ]; then
+               return 0
+       elif [ ! -s $OUT/$test.diff ]; then
+               return 1
+       else
+               return 2
+       fi
+}
+
+echo "Testing..."
+echo ""
+
+rm -rf $OUT 2>/dev/null
+mkdir $OUT 2>/dev/null
+
+all=0
+ok=0
+ko=0
+sk=0
+
+for file in `ls *.json`; do
+       ((all++))
+       test="${file%.*}"
+       echo -n "* $test: "
+
+       run_test $test
+       check_result $test
+
+       case "$?" in
+               0)
+                       echo "skip ($test.res not found)"
+                       ((sk++))
+                       continue;;
+               1)
+                       echo "success"
+                       ((ok++))
+                       ;;
+               2)
+                       echo "error (diff $OUT/$test.res $RES/$test.res)"
+                       ((ko++))
+                       ;;
+       esac
+done
+
+# clear tmp stats file.
+rm stats.json
+
+echo ""
+echo "==> success $ok/$all ($ko tests failed, $sk skipped)"
index 6f9a0a3..dd66960 100644 (file)
@@ -1,8 +1,7 @@
 all:
        mkdir -p bin/
 
-       # Compile in global mode to silence warnings on unused GTK deprecated
-       ../../bin/nitc --global --dir bin/ src/calculator_gtk.nit src/calculator_test.nit
+       ../../bin/nitc --dir bin/ src/calculator_gtk.nit src/calculator_test.nit
 
 android:
        mkdir -p bin/ res/
index bd01986..7586230 100644 (file)
@@ -55,10 +55,11 @@ class CalculatorGui
        do
                init_gtk
 
-               win = new GtkWindow(0)
+               win = new GtkWindow(new GtkWindowType.toplevel)
+               win.connect_destroy_signal_to_quit
 
-               container = new GtkGrid(5, 5, true)
-               win.add(container)
+               container = new GtkGrid
+               win.add container
 
                lbl_disp = new GtkLabel("_")
                container.attach(lbl_disp, 0, 0, 5, 1)
index 7d471f6..cd294e1 100644 (file)
@@ -35,3 +35,9 @@ example
 
 of the language annotation capacities
 """
+
+var s = "example"
+
+print "This superstring {s} rocks"
+
+print "This superstring %1 rocks".format(s)
index e4e0d02..a3bd0f7 100644 (file)
@@ -6,4 +6,12 @@ msgstr "This String is a test"
 msgid "Multiline string\n\nexample\n\n\nof the language annotation capacities\n"
 msgstr "Multiline string\n\nexample\n\n\nof the language annotation capacities\n"
 
+#: langannot::langannot 39--9:17
+msgid "example"
+msgstr "example"
+
+#: langannot::langannot 41--7:34, langannot::langannot 43--7:33
+msgid "This superstring %1 rocks"
+msgstr "This superstring %1 rocks"
+
 # Generated file, do not modify
index 78ed2e7..0fbd368 100644 (file)
@@ -6,4 +6,12 @@ msgstr "Cette chaîne de caractères est un test"
 msgid "Multiline string\n\nexample\n\n\nof the language annotation capacities\n"
 msgstr "Example de\n\nchaine multiligne\n\n\navec annotation de localisation\n"
 
+#: langannot::langannot 39--9:17
+msgid "example"
+msgstr "exemple"
+
+#: langannot::langannot 41--7:34, langannot::langannot 43--7:33
+msgid "This superstring %1 rocks"
+msgstr "Cet %1 de superstring est génial"
+
 # Generated file, do not modify
index 1a50944..8cdb8e4 100644 (file)
@@ -6,4 +6,12 @@ msgstr "この文字列はてストです"
 msgid "Multiline string\n\nexample\n\n\nof the language annotation capacities\n"
 msgstr "複数行の文字列\n\nなサンプルプログラム\n\n\n新しい国際化アノテーションとともに\n"
 
+#: langannot::langannot 39--9:17
+msgid "example"
+msgstr "サンプル"
+
+#: langannot::langannot 41--7:34, langannot::langannot 43--7:33
+msgid "This superstring %1 rocks"
+msgstr "このスパ文字列%1は驚くべきです"
+
 # Generated file, do not modify
index f6c2096..9c86286 100644 (file)
@@ -6,4 +6,12 @@ msgstr ""
 msgid "Multiline string\n\nexample\n\n\nof the language annotation capacities\n"
 msgstr ""
 
+#: langannot::langannot 39--9:17
+msgid "example"
+msgstr ""
+
+#: langannot::langannot 41--7:34, langannot::langannot 43--7:33
+msgid "This superstring %1 rocks"
+msgstr ""
+
 # Generated file, do not modify
index 3265258..90af8a2 100644 (file)
@@ -32,14 +32,14 @@ redef class App
 
        fun test_intent
        do
-               intent = new Intent(self)
+               intent = new Intent
                intent.action = intent_action.view.to_s
                intent.data   = "content://contacts/people/"
 
-               intent.launch_activity
+               start_activity intent
                intent.destroy
 
-               intent = new Intent(self)
+               intent = new Intent
                var p1 = new Point(10, 20)
                intent["a_point"] = p1
                var p2 = intent["a_point"]
index d49986b..42f3471 100644 (file)
@@ -24,7 +24,7 @@ import platform
 import native_app_glue
 import dalvik
 private import log
-private import android_data_store
+private import data_store
 
 redef class App
        redef fun init_window
similarity index 97%
rename from lib/android/android_data_store.nit
rename to lib/android/data_store.nit
index 57eb281..989b64c 100644 (file)
@@ -17,7 +17,7 @@
 # Implements `app::data_store` using `shared_preferences`
 #
 # We use the shared preferences named "data_store" to store the data.
-module android_data_store
+module data_store
 
 import app::data_store
 private import shared_preferences
index d2aa796..5f37179 100644 (file)
@@ -18,7 +18,7 @@
 # `android.content.Intent` for the android platform
 module intent_api10
 
-import native_app_glue
+import dalvik
 import android::bundle
 import serialization
 private import json_serialization
@@ -34,6 +34,8 @@ in "Java" `{
 extern class NativeIntent in "Java" `{ android.content.Intent `}
        super JavaObject
 
+       new in "Java" `{ return new Intent(); `}
+
        fun add_category(category: JavaString) in "Java" `{ recv.addCategory(category); `}
        fun add_flags(flags: Int) in "Java" `{ recv.addFlags((int)flags); `}
        fun filter_equals(other: NativeIntent): Bool in "Java" `{
@@ -626,23 +628,7 @@ end
 
 # Services allowing to launch an activity and start/stop services
 class Intent
-       protected var intent: NativeIntent
-       protected var context: NativeActivity
-
-       init (app: App)
-       do
-               self.context = app.native_activity
-               setup
-       end
-
-       private fun set_vars(intent: NativeIntent) do
-               self.intent = intent.new_global_ref
-       end
-
-       private fun setup import context, intent, set_vars in "Java" `{
-               Intent intent = new Intent();
-               Intent_set_vars(recv, intent);
-       `}
+       protected var intent: NativeIntent = (new NativeIntent).new_global_ref is lazy
 
        # The general action to be performed
        #
@@ -1311,14 +1297,6 @@ class Intent
                sys.jni_env.pop_local_frame
                return self
        end
-       # Execute the intent and launch the appropriate application
-       fun launch_activity do context.start_activity(intent)
-
-       # Start a service that will be running until the `stop_service` call
-       fun start_service do context.start_service(intent)
-
-       # Stop service
-       fun stop_service do context.stop_service(intent)
 
        # Deletes intent global reference
        fun destroy do self.intent.delete_global_ref
@@ -1328,9 +1306,9 @@ class Intent
 end
 
 redef extern class NativeActivity
-       fun start_activity(intent: NativeIntent) in "Java" `{ recv.startActivity(intent); `}
-       fun start_service(intent: NativeIntent) in "Java" `{ recv.startService(intent); `}
-       fun stop_service(intent: NativeIntent) in "Java" `{ recv.stopService(intent); `}
+       private fun start_activity(intent: NativeIntent) in "Java" `{ recv.startActivity(intent); `}
+       private fun start_service(intent: NativeIntent) in "Java" `{ recv.startService(intent); `}
+       private fun stop_service(intent: NativeIntent) in "Java" `{ recv.stopService(intent); `}
 end
 
 # Allows user to get values with enum-like syntax : `intent_action.main`
@@ -1349,3 +1327,15 @@ private class StringCopyHashSet
        var collection = new HashSet[String]
        fun add(element: JavaString) do collection.add element.to_s
 end
+
+redef class App
+
+       # Execute the intent and launch the appropriate application
+       fun start_activity(intent: Intent) do native_activity.start_activity(intent.intent)
+
+       # Start a service that will be running until the `stop_service` call
+       fun start_service(intent: Intent) do native_activity.start_service(intent.intent)
+
+       # Stop service
+       fun stop_service(intent: Intent) do native_activity.stop_service(intent.intent)
+end
index 6b6edde..72a634c 100644 (file)
@@ -17,7 +17,7 @@
 # Services to save/load data using `android.content.SharedPreferences` for the android platform
 module shared_preferences_api10
 
-import native_app_glue
+import dalvik
 import serialization
 private import json_serialization
 
index dd8e149..954a380 100644 (file)
@@ -17,7 +17,7 @@
 # Services to display a _toast_, a small popup on Android
 module toast
 
-import native_app_glue
+import dalvik
 
 in "Java" `{
        import android.widget.Toast;
@@ -34,7 +34,7 @@ redef class App
 
        private fun native_toast(message: JavaString, is_long: Bool)
        import native_activity in "Java" `{
-               final android.app.NativeActivity context = App_native_activity(recv);
+               final android.app.Activity context = App_native_activity(recv);
                final CharSequence final_message = message;
                final int duration = is_long? Toast.LENGTH_LONG: Toast.LENGTH_SHORT;
 
similarity index 61%
rename from lib/android/ui.nit
rename to lib/android/ui/native_ui.nit
index 6d0e0f8..bd008c1 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Views and services to use the Android native user interface
-#
-# Events, such as a button click, come from the UI thread and are then
-# passed to the main thread. It is recommended to specialize one of the
-# methods of the main thread to customize the response to a given event.
-#
-# This graph shows the path of a button click:
-# ~~~raw
-#     UI Thread     #   Main thread
-#
-#       User
-#        |
-#        V
-# Button::click_ui --> Button::click
-#                           |
-#                           V
-#                    App::catch_event
-# ~~~
-module ui is min_api_version 14
+# Native services from the `android.view` and `android.widget` namespaces
+module native_ui is min_api_version 14
 
 import nit_activity
-import pthreads::concurrent_collections
 
 in "Java" `{
        import android.app.Activity;
 
        import android.view.Gravity;
-       import android.view.MotionEvent;
+       import android.view.View;
        import android.view.ViewGroup;
        import android.view.ViewGroup.MarginLayoutParams;
 
@@ -55,31 +37,6 @@ in "Java" `{
        import java.util.*;
 `}
 
-# An event from the `app.nit` framework
-interface AppEvent
-       # Reaction to this event
-       fun react do end
-end
-
-# A control click event
-class ClickEvent
-       super AppEvent
-
-       # Sender of this event
-       var sender: Button
-
-       redef fun react do sender.click self
-end
-
-# Receiver of events not handled directly by the sender
-interface EventCatcher
-       fun catch_event(event: AppEvent) do end
-end
-
-redef class App
-       super EventCatcher
-end
-
 redef extern class NativeActivity
 
        # Set the main layout of this activity
@@ -98,107 +55,25 @@ redef extern class NativeActivity
        `}
 end
 
-# An `Object` that raises events
-abstract class Eventful
-       var event_catcher: EventCatcher = app is lazy, writable
-end
-
-#
-## Nity classes and services
-#
-
-# An Android control with text
-abstract class TextView
-       super Finalizable
-       super Eventful
-
-       # Native Java variant to this Nity class
-       type NATIVE: NativeTextView
-
-       # The native Java object encapsulated by `self`
-       var native: NATIVE is noinit
-
-       # Get the text of this view
-       fun text: String
-       do
-               var jstr = native.text
-               var str = jstr.to_s
-               jstr.delete_local_ref
-               return str
-       end
-
-       # Set the text of this view
-       fun text=(value: Text)
-       do
-               var jstr = value.to_s.to_java_string
-               native.text = jstr
-               jstr.delete_local_ref
-       end
-
-       # Get whether this view is enabled or not
-       fun enabled: Bool do return native.enabled
-
-       # Set if this view is enabled
-       fun enabled=(val: Bool) do native.enabled = val
-
-       # Set the size of the text in this view at `dpi`
-       fun text_size=(dpi: Numeric) do native.text_size = dpi.to_f
-
-       private var finalized = false
-       redef fun finalize
-       do
-               if not finalized then
-                       native.delete_global_ref
-                       finalized = true
-               end
-       end
-end
-
-# An Android button
-class Button
-       super TextView
-
-       redef type NATIVE: NativeButton
-
-       init
-       do
-               var native = new NativeButton(app.native_activity, self)
-               self.native = native.new_global_ref
-       end
-
-       # Click event
-       #
-       # By default, this method calls `app.catch_event`. It can be specialized
-       # with custom behavior or the receiver of `catch_event` can be changed
-       # with `event_catcher=`.
-       fun click(event: AppEvent) do event_catcher.catch_event(event)
-
-       private fun click_from_native do click(new ClickEvent(self))
-end
-
-# An Android editable text field
-class EditText
-       super TextView
-
-       redef type NATIVE: NativeEditText
-
-       init
-       do
-               var native = new NativeEditText(app.activities.first.native)
-               self.native = native.new_global_ref
-       end
-end
-
-#
-## Native classes
-#
-
 # A `View` for Android
 extern class NativeView in "Java" `{ android.view.View `}
        super JavaObject
 
        fun minimum_width=(val: Int) in "Java" `{ recv.setMinimumWidth((int)val); `}
        fun minimum_height=(val: Int) in "Java" `{ recv.setMinimumHeight((int)val); `}
+
+       fun enabled: Bool in "Java" `{ return recv.isEnabled(); `}
+       fun enabled=(value: Bool) in "Java" `{
+               final View final_recv = recv;
+               final boolean final_value = value;
+
+               ((Activity)recv.getContext()).runOnUiThread(new Runnable() {
+                       @Override
+                       public void run()  {
+                               final_recv.setEnabled(final_value);
+                       }
+               });
+       `}
 end
 
 # A collection of `NativeView`
@@ -206,6 +81,11 @@ extern class NativeViewGroup in "Java" `{ android.view.ViewGroup `}
        super NativeView
 
        fun add_view(view: NativeView) in "Java" `{ recv.addView(view); `}
+
+       fun add_view_with_weight(view: NativeView, weight: Float)
+       in "Java" `{
+               recv.addView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, (float)weight));
+       `}
 end
 
 # A `NativeViewGroup` organized in a line
@@ -224,11 +104,6 @@ extern class NativeLinearLayout in "Java" `{ android.widget.LinearLayout `}
                        LinearLayout.LayoutParams.WRAP_CONTENT);
                recv.addView(view, params);
        `}
-
-       fun add_view_with_weight(view: NativeView, weight: Float)
-       in "Java" `{
-               recv.addView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, (float)weight));
-       `}
 end
 
 # A `NativeViewGroup` organized as a grid
@@ -278,23 +153,13 @@ extern class NativeTextView in "Java" `{ android.widget.TextView `}
                });
        `}
 
-       fun enabled: Bool in "Java" `{ return recv.isEnabled(); `}
-       fun enabled=(value: Bool) in "Java" `{
-               final TextView final_recv = recv;
-               final boolean final_value = value;
-
-               ((Activity)recv.getContext()).runOnUiThread(new Runnable() {
-                       @Override
-                       public void run()  {
-                               final_recv.setEnabled(final_value);
-                       }
-               });
-       `}
-
        fun gravity_center in "Java" `{
                recv.setGravity(Gravity.CENTER);
        `}
 
+       fun text_size: Float in "Java" `{
+               return recv.getTextSize();
+       `}
        fun text_size=(dpi: Float) in "Java" `{
                recv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_DIP, (float)dpi);
        `}
@@ -323,22 +188,6 @@ extern class NativeButton in "Java" `{ android.widget.Button `}
 
        redef type SELF: NativeButton
 
-       new (context: NativeActivity, sender_object: Object)
-       import Button.click_from_native in "Java" `{
-               final int final_sender_object = sender_object;
-
-               return new Button(context){
-                       @Override
-                       public boolean onTouchEvent(MotionEvent event) {
-                               if(event.getAction() == MotionEvent.ACTION_DOWN) {
-                                       Button_click_from_native(final_sender_object);
-                                       return true;
-                               }
-                               return false;
-                       }
-               };
-       `}
-
        redef fun new_global_ref: SELF import sys, Sys.jni_env `{
                Sys sys = NativeButton_sys(recv);
                JNIEnv *env = Sys_jni_env(sys);
diff --git a/lib/android/ui/ui.nit b/lib/android/ui/ui.nit
new file mode 100644 (file)
index 0000000..a37e572
--- /dev/null
@@ -0,0 +1,154 @@
+# This file is part of NIT (http://www.nitlanguage.org).
+#
+# Copyright 2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Views and services to use the Android native user interface
+module ui
+
+import native_ui
+
+# An event from the `app.nit` framework
+interface AppEvent
+       # Reaction to this event
+       fun react do end
+end
+
+# A control click event
+class ClickEvent
+       super AppEvent
+
+       # Sender of this event
+       var sender: Button
+
+       redef fun react do sender.click self
+end
+
+# Receiver of events not handled directly by the sender
+interface EventCatcher
+       fun catch_event(event: AppEvent) do end
+end
+
+redef class App
+       super EventCatcher
+end
+
+# An `Object` that raises events
+abstract class Eventful
+       var event_catcher: EventCatcher = app is lazy, writable
+end
+
+#
+## Nity classes and services
+#
+
+# An Android control with text
+abstract class TextView
+       super Finalizable
+       super Eventful
+
+       # Native Java variant to this Nity class
+       type NATIVE: NativeTextView
+
+       # The native Java object encapsulated by `self`
+       var native: NATIVE is noinit
+
+       # Get the text of this view
+       fun text: String
+       do
+               var jstr = native.text
+               var str = jstr.to_s
+               jstr.delete_local_ref
+               return str
+       end
+
+       # Set the text of this view
+       fun text=(value: Text)
+       do
+               var jstr = value.to_s.to_java_string
+               native.text = jstr
+               jstr.delete_local_ref
+       end
+
+       # Get whether this view is enabled or not
+       fun enabled: Bool do return native.enabled
+
+       # Set if this view is enabled
+       fun enabled=(val: Bool) do native.enabled = val
+
+       # Set the size of the text in this view at `dpi`
+       fun text_size=(dpi: Numeric) do native.text_size = dpi.to_f
+
+       private var finalized = false
+       redef fun finalize
+       do
+               if not finalized then
+                       native.delete_global_ref
+                       finalized = true
+               end
+       end
+end
+
+# An Android button
+class Button
+       super TextView
+
+       redef type NATIVE: NativeButton
+
+       init
+       do
+               var native = new NativeButton(app.native_activity, self)
+               self.native = native.new_global_ref
+       end
+
+       # Click event
+       #
+       # By default, this method calls `app.catch_event`. It can be specialized
+       # with custom behavior or the receiver of `catch_event` can be changed
+       # with `event_catcher=`.
+       fun click(event: AppEvent) do event_catcher.catch_event(event)
+
+       private fun click_from_native do click(new ClickEvent(self))
+end
+
+# An Android editable text field
+class EditText
+       super TextView
+
+       redef type NATIVE: NativeEditText
+
+       init
+       do
+               var native = new NativeEditText(app.activities.first.native)
+               self.native = native.new_global_ref
+       end
+end
+
+redef class NativeButton
+       new (context: NativeActivity, sender_object: Object)
+       import Button.click_from_native in "Java" `{
+               final int final_sender_object = sender_object;
+
+               return new android.widget.Button(context){
+                       @Override
+                       public boolean onTouchEvent(android.view.MotionEvent event) {
+                               if(event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
+                                       Button_click_from_native(final_sender_object);
+                                       return true;
+                               }
+                               return false;
+                       }
+               };
+       `}
+end
index 79941dc..430e047 100644 (file)
@@ -21,7 +21,7 @@ module vibration is
        android_manifest("""<uses-permission android:name="android.permission.VIBRATE" />""")
 end
 
-import native_app_glue
+import dalvik
 
 # Handle to an Android vibrator
 extern class Vibrator in "Java" `{ android.os.Vibrator `}
diff --git a/lib/bitmap/bitmap.nit b/lib/bitmap/bitmap.nit
new file mode 100644 (file)
index 0000000..0343b8e
--- /dev/null
@@ -0,0 +1,261 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Budi Kurniawan <budi2020@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# The Bitmap class represents a 24-bit bitmap image. An instance can be constructed
+# by calling load or with_size:
+#
+#      new Bitmap.load(path_to_a_bmp_file)
+#      new Bitmap.with_size(400, 300)
+#
+# The width and height attributes contain the image's width and height,
+# respectively.
+#
+# Individual pixels can be manipulated by calling the set_pixel function:
+#
+#      set_pixel(x, y, color)
+#
+# The no-argument grayscale function converts the bitmap to grayscale and is an
+# implementation of this Rossetacode task:
+# http://rosettacode.org/wiki/Grayscale_image
+#
+# Finally, the bitmap can be saved to a file by calling save:
+#
+#      save(path_to_a_file)
+#
+# For information on the bitmap format, see
+# http://en.wikipedia.org/wiki/BMP_file_format
+#
+# A module containing classes for manipulating bitmap images
+module bitmap
+#
+# A class that represents a Bitmap image
+class Bitmap
+       # The file path if this Bitmap is created by loading a bitmap file
+       var file_path: String is noinit
+
+       # The file extension if this Bitmap is created by loading a bitmap file
+       var file_extension: String is noinit
+
+       # The file size if this Bitmap is created by loading a bitmap file
+       var file_size: Int is noinit
+
+       # The image width in pixels
+       var width: Int is noinit
+
+       # The image height in pixels
+       var height: Int is noinit
+
+       # The offset of image data. Typically, 54
+       private var data_offset: Int is noinit
+
+       # The number of bits representing a pixel. Currently only 24-bit bitmaps are supported
+       private var bits_per_pixel: Int is noinit
+
+       # The size of images. For a 24-bit bitmap, this is equal to (3*width*height)
+       private var image_size: Int is noinit
+
+       # 14-byte bitmap header
+       private var bitmap_header: Array[Int] = [66, 77, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0]
+
+       # 40-byte dib header
+       private var dib_header: Array[Int] = [40, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                       0, 0, 1, 0, 24, 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]
+
+       # The image data, each cell contains a pixel.
+       # The first 8 least-significant bits represent the red component,
+       # the next 8 least-significant bits represent the green component,
+       # and the next 8 bit represent the blue component.
+       # The last 8 most-significant bits are not used
+       private var data = new Array[Array[Int]]
+
+       # Constructs a Bitmap object by passing the image's width and height (in pixels)
+       init with_size(width: Int, height: Int)
+       do
+               self.width = width
+               self.height = height
+               self.bits_per_pixel = 24
+               self.data_offset = 54
+               #set width and height
+
+               self.set_value(dib_header, 4, width)
+               self.set_value(dib_header, 8, height)
+               #set file size
+               var file_size = 3 * width * height + 54
+               self.set_value(bitmap_header, 2, file_size)
+
+               #init pixel data
+               self.data = new Array[Array[Int]].with_capacity(height)
+               for x in [0..height[ do
+                       var row = new Array[Int].with_capacity(width)
+                       for y in [0..width[ do
+                               row.add(0x00FFFFFF)
+                       end
+                       self.data[x] = row
+               end
+       end
+
+       # Creates an instance of Bitmap by loading an existing image file
+       init load(path: String)
+       do
+               self.file_path = path
+               var temp = path.file_extension
+               if temp != null then
+                       self.file_extension = temp
+               else
+                       self.file_extension = ""
+               end
+               var fileReader = new FileReader.open(path)
+
+               # =============== Bitmap header ================
+               for x in [0..13] do
+                       bitmap_header[x] = fileReader.read(1)[0].ascii
+               end
+               self.file_size = get_value(bitmap_header.subarray(2, 4))
+               self.data_offset = get_value(bitmap_header.subarray(10, 4))
+
+               # =============== DIB header ================
+               for x in [0..39] do
+                       dib_header[x] = fileReader.read(1)[0].ascii
+               end
+               var dib_size = get_value(dib_header.subarray(0, 4))
+               # only support BITMAPINFOHEADER
+               if dib_size != 40 then
+                       print "This type of bitmap is not supported"
+                       fileReader.close
+                       return
+               end
+
+               self.width = get_value(dib_header.subarray(4, 4))
+               self.height = get_value(dib_header.subarray(8, 4))
+               self.bits_per_pixel = get_value(dib_header.subarray(14, 2))
+               self.image_size = get_value(dib_header.subarray(20, 4))
+
+               if self.bits_per_pixel != 24 then
+                       print "Only full color bitmaps are supported"
+                       fileReader.close
+                       return
+               end
+
+               if self.bits_per_pixel == 24 then
+                       # assert self.image_size + 54 <= self.file_size
+                       # start loading image data, for now assume no padding
+                       for x in [0..self.height[
+                       do
+                               var row = new Array[Int].with_capacity(self.width)
+                               for y in [0..self.width[
+                               do
+                                       var red = fileReader.read(1)[0].ascii * 256 * 256
+                                       var green = fileReader.read(1)[0].ascii * 256
+                                       var blue = fileReader.read(1)[0].ascii
+                                       row.add(red + green + blue)
+                               end
+                               self.data.add(row)
+                       end
+               end
+               fileReader.close
+       end #end of load_from_file method
+
+       # Reads in a series of bytes from the FileReader when loading a Bitmap from a file
+       # FileReader.read(1) is used due to https://github.com/privat/nit/issues/1264
+       private fun read_chars(fr: FileReader, howMany: Int): String
+       do
+               var s = ""
+               for x in [1..howMany]
+               do
+                       s += fr.read(1)
+               end
+               return s
+       end
+
+       # Converts the value contained in two or four bytes into an Int. Since Nit
+       # does not have a byte type, Int is used
+       private fun get_value(array: Array[Int]): Int
+       do
+               var value = 0
+               for x in [0..array.length[ do
+                       value += array[x] * 256.to_f.pow(x.to_f).to_i
+               end
+               return value
+       end
+
+       # Converts the value in an Int to four bytes. Since Nit does not have a byte
+       # type, Int is used.
+       private fun set_value(array: Array[Int], start_index: Int, value: Int)
+       do
+               array[start_index] = value.bin_and(0x000000FF)
+               array[start_index + 1] = value.rshift(8).bin_and(0x000000FF)
+               array[start_index + 2] = value.rshift(16).bin_and(0x000000FF)
+               array[start_index + 3] = value.rshift(24).bin_and(0x000000FF)
+       end
+
+       # Saves the bitmap into a file
+       fun save(path: String)
+       do
+               var fw = new FileWriter.open(path)
+               # Write bitmap header
+               for x in [0..self.bitmap_header.length[ do
+                       fw.write(self.bitmap_header[x].ascii.to_s)
+               end
+               # Write dib header
+               for x in [0..self.dib_header.length[ do
+                       fw.write(self.dib_header[x].ascii.to_s)
+               end
+               # Write color table (if any)
+               # Write data (no padding for now)
+               for x in [0..self.height[ do
+                       var row = self.data[x]
+                       for y in [0..self.width[ do
+                               var pixel = row[y]
+                               var red = pixel.rshift(16)
+                               var green = pixel.bin_and(0x00FF00).rshift(8)
+                               var blue = pixel.bin_and(0x000000FF)
+                               fw.write(red.ascii.to_s)
+                               fw.write(green.ascii.to_s)
+                               fw.write(blue.ascii.to_s)
+                       end
+               end
+               fw.close
+       end #end of save
+
+       # Converts the bitmap to grayscale by manipulating each individual pixel
+       fun grayscale
+       do
+               for x in [0..self.height[ do
+                       var row = self.data[x]
+                       for y in [0..self.width[ do
+                               var pixel = row[y]
+                               var red = pixel.rshift(16)
+                               var green = pixel.bin_and(0x00FF00).rshift(8)
+                               var blue = pixel.bin_and(0x000000FF)
+                               var lum = (0.2126 * red.to_f + 0.7152 * green.to_f + 0.0722 * blue.to_f).to_i
+                               pixel = lum * 256 * 256 + lum * 256 + lum
+                               self.data[x][y] = pixel
+                       end
+               end
+       end
+
+       # Sets an individual pixel, where position (0, 0) represents the top-left pixel.
+       fun set_pixel(x: Int, y: Int, color: Int)
+       do
+               if x >= 0 and y >= 0 and x < self.width and y < self.height then
+                       # Since a bitmap stores its rows of pixels upside-down, y is mapped to
+                       # height - 1 - y to make (0, 0) the top-left pixel
+                       self.data[self.height - 1 - y][x] = color
+               end
+       end
+end #end of class Bitmap
diff --git a/lib/bitmap/test_bitmap.nit b/lib/bitmap/test_bitmap.nit
new file mode 100644 (file)
index 0000000..4475689
--- /dev/null
@@ -0,0 +1,44 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Budi Kurniawan <budi2020@gmail.com>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This file tests the Bitmap class in the bitmap module
+# It has to be called by passing two arguments:
+#
+#   - An input bitmap file
+#   - An output bitmap file
+#
+# It converts the input bitmap to grayscale and save it to the specified
+# output file. In addition, it creates a blank.bmp file in the current directory.
+#
+#
+# A module for testing the classes in the bitmap module
+module test_bitmap is test_suite
+
+import bitmap
+import test_suite
+
+class TestBitmap
+       super TestSuite
+
+       fun test_grayscale do
+               var bitmap = new Bitmap.with_size(400, 300)
+               for y in [0..300] do
+                       for x in [0..200] do bitmap.set_pixel(x, y, 0x0077AAAA)
+               end
+               bitmap.grayscale
+               bitmap.save("./blank.bmp")
+       end
+end
index ae1b875..32bd967 100644 (file)
--- a/lib/c.nit
+++ b/lib/c.nit
@@ -153,6 +153,43 @@ extern class NativeCByteArray `{ unsigned char* `}
        redef fun +(offset) `{ return recv + offset; `}
 end
 
+# Wrapper around an array of `NativeString` in C (`char**`) with length and destroy state.
+class CNativeStringArray
+       super CArray[NativeString]
+
+       redef type NATIVE: NativeCStringArray
+
+       # Initialize a new NativeCStringArray of `size` elements.
+       init(size: Int) is old_style_init do
+               native_array = new NativeCStringArray(size)
+               super size
+       end
+
+       # Build from an `Array[NativeString]`
+       new from(array: Array[NativeString])
+       do
+               var carray = new CNativeStringArray(array.length)
+               for i in array.length.times do
+                       carray[i] = array[i]
+               end
+               return carray
+       end
+end
+
+# An array of `NativeString` in C (`char**`)
+extern class NativeCStringArray `{ char** `}
+       super NativeCArray
+
+       redef type E: NativeString
+
+       # Initialize a new NativeCStringArray of `size` elements.
+       new(size: Int) `{ return calloc(size, sizeof(char*)); `}
+
+       redef fun [](index) `{ return recv[index]; `}
+       redef fun []=(index, val) `{ recv[index] = val; `}
+       redef fun +(offset) `{ return recv + offset; `}
+end
+
 redef class NativeString
        super NativeCArray
        redef type E: Char
index ea516fa..6f7c7d9 100644 (file)
@@ -1016,6 +1016,12 @@ abstract class Comment
 
        # Comment body text.
        fun body: String do return json["body"].to_s
+
+       # Does the comment contain an acknowledgement (+1)
+       fun is_ack: Bool
+       do
+               return body.has("\\+1\\b".to_re) or body.has(":+1:") or body.has(":shipit:")
+       end
 end
 
 # A comment made on a commit.
index 11804ef..0969d86 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-module gdk_enums is pkgconfig("gtk+-3.0")
+module gdk_enums is pkgconfig "gtk+-3.0"
 
 in "C Header" `{
        #include <gtk/gtk.h>
 `}
 
-#enum GdkGravity
-#Defines the reference point of a window and the meaning of coordinates passed to gtk_window_move().
-#@https://developer.gnome.org/gdk3/stable/gdk3-Windows.html#GdkGravity
+# enum GdkGravity
+# Defines the reference point of a window and the meaning of coordinates passed to gtk_window_move().
+# See: https://developer.gnome.org/gdk3/stable/gdk3-Windows.html#GdkGravity
 extern class GdkGravity `{GdkGravity`}
-       #The reference point is at the top left corner.
-       new north_west `{ return GDK_GRAVITY_NORTH_WEST; `} 
+       # The reference point is at the top left corner.
+       new north_west `{ return GDK_GRAVITY_NORTH_WEST; `}
 
-       #The reference point is in the middle of the top edge.  
-       new north `{ return GDK_GRAVITY_NORTH; `}       
+       # The reference point is in the middle of the top edge.
+       new north `{ return GDK_GRAVITY_NORTH; `}
 
-       #The reference point is at the top right corner.        
-       new north_east `{ return GDK_GRAVITY_NORTH_EAST; `} 
+       # The reference point is at the top right corner.
+       new north_east `{ return GDK_GRAVITY_NORTH_EAST; `}
 
-       #The reference point is at the middle of the left edge.
-       new west `{ return GDK_GRAVITY_WEST; `}         
+       # The reference point is at the middle of the left edge.
+       new west `{ return GDK_GRAVITY_WEST; `}
 
-       #The reference point is at the center of the window
-       new center `{ return GDK_GRAVITY_CENTER; `}     
+       # The reference point is at the center of the window
+       new center `{ return GDK_GRAVITY_CENTER; `}
 
-       #The reference point is at the middle of the right edge.
-       new east `{ return GDK_GRAVITY_EAST; `}         
+       # The reference point is at the middle of the right edge.
+       new east `{ return GDK_GRAVITY_EAST; `}
 
-       #The reference point is at the lower left corner.
-       new south_west `{ return GDK_GRAVITY_SOUTH_WEST; `} 
+       # The reference point is at the lower left corner.
+       new south_west `{ return GDK_GRAVITY_SOUTH_WEST; `}
 
-       #The reference point is at the middle of the lower edge.
-       new south `{ return GDK_GRAVITY_SOUTH; `} 
+       # The reference point is at the middle of the lower edge.
+       new south `{ return GDK_GRAVITY_SOUTH; `}
 
-       #The reference point is at the lower right corner.
-       new south_east `{ return GDK_GRAVITY_SOUTH_EAST; `} 
+       # The reference point is at the lower right corner.
+       new south_east `{ return GDK_GRAVITY_SOUTH_EAST; `}
 
-       #The reference point is at the top left corner of the window itself, ignoring window manager decorations.       
-       new static `{ return GDK_GRAVITY_STATIC; `} 
+       # The reference point is at the top left corner of the window itself, ignoring window manager decorations.
+       new static `{ return GDK_GRAVITY_STATIC; `}
 end
 
-#enum GdkGWindowEdge
-#Determines a window edge or corner.
-#@https://developer.gnome.org/gdk3/stable/gdk3-Windows.html#GdkWindowEdge
+# enum GdkGWindowEdge
+# Determines a window edge or corner.
+# See: https://developer.gnome.org/gdk3/stable/gdk3-Windows.html#GdkWindowEdge
 extern class GdkWindowEdge `{GdkWindowEdge`}
-       #The top left corner.
-       new north_west `{ return GDK_WINDOW_EDGE_NORTH_WEST; `} 
+       # The top left corner.
+       new north_west `{ return GDK_WINDOW_EDGE_NORTH_WEST; `}
 
-       #The top edge.  
-       new north `{ return GDK_WINDOW_EDGE_NORTH; `}   
+       # The top edge.
+       new north `{ return GDK_WINDOW_EDGE_NORTH; `}
 
-       #The top right corner.  
-       new north_east `{ return GDK_WINDOW_EDGE_NORTH_EAST; `} 
+       # The top right corner.
+       new north_east `{ return GDK_WINDOW_EDGE_NORTH_EAST; `}
 
-       #The left edge.
-       new west `{ return GDK_WINDOW_EDGE_WEST; `}             
+       # The left edge.
+       new west `{ return GDK_WINDOW_EDGE_WEST; `}
 
-       #The right edge.
-       new east `{ return GDK_WINDOW_EDGE_EAST; `}     
+       # The right edge.
+       new east `{ return GDK_WINDOW_EDGE_EAST; `}
 
-       #The lower left corner.
-       new south_west `{ return GDK_WINDOW_EDGE_SOUTH_WEST; `} 
+       # The lower left corner.
+       new south_west `{ return GDK_WINDOW_EDGE_SOUTH_WEST; `}
 
-       #The lower edge.
-       new south `{ return GDK_WINDOW_EDGE_SOUTH; `} 
+       # The lower edge.
+       new south `{ return GDK_WINDOW_EDGE_SOUTH; `}
 
-       #The lower right corner.
-       new south_east `{ return GDK_WINDOW_EDGE_SOUTH_EAST; `} 
+       # The lower right corner.
+       new south_east `{ return GDK_WINDOW_EDGE_SOUTH_EAST; `}
 end
 
index c36c521..2ceb2f4 100644 (file)
@@ -15,7 +15,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-module gtk_assistant is pkgconfig("gtk+-3.0")
+module gtk_assistant is pkgconfig "gtk+-3.0"
 
 import gtk_core
 
@@ -23,115 +23,115 @@ in "C Header" `{
        #include <gtk/gtk.h>
 `}
 
-#A widget used to guide users through multi-step operations
-#@https://developer.gnome.org/gtk3/stable/GtkAssistant.html
+# A widget used to guide users through multi-step operations
+# See: https://developer.gnome.org/gtk3/stable/GtkAssistant.html
 extern class GtkAssistant `{GtkAssistant *`}
        super GtkWindow
 
-       new is extern `{
-               return (GtkAssistant *)gtk_assistant_new( );
+       new `{
+               return (GtkAssistant *)gtk_assistant_new();
        `}
 
-       fun current_page : Int is extern `{
-               return gtk_assistant_get_current_page ( recv );
+       fun current_page: Int `{
+               return gtk_assistant_get_current_page (recv);
        `}
 
-       fun current_page=( page_num : Int ) is extern `{
-               gtk_assistant_set_current_page( recv, page_num);
+       fun current_page=(page_num: Int) `{
+               gtk_assistant_set_current_page(recv, page_num);
        `}
 
-       fun number_pages : Int is extern `{
-               return gtk_assistant_get_n_pages( recv );
+       fun number_pages: Int `{
+               return gtk_assistant_get_n_pages(recv);
        `}
 
-       fun get_page( page_num : Int ) : GtkWidget is extern `{
-               return gtk_assistant_get_nth_page( recv, page_num );
+       fun get_page(page_num: Int): GtkWidget `{
+               return gtk_assistant_get_nth_page(recv, page_num);
        `}
 
-       fun prepend( page : GtkWidget ) : Int is extern `{
-               return gtk_assistant_prepend_page( recv, page );
+       fun prepend(page: GtkWidget): Int `{
+               return gtk_assistant_prepend_page(recv, page);
        `}
 
-       fun append( page : GtkWidget ) : Int is extern `{
-               return gtk_assistant_append_page( recv, page );
+       fun append(page: GtkWidget): Int `{
+               return gtk_assistant_append_page(recv, page);
        `}
 
-       fun insert( page : GtkWidget, position : Int ) : Int is extern `{
-               return gtk_assistant_insert_page( recv, page, position );
+       fun insert(page: GtkWidget, position: Int): Int `{
+               return gtk_assistant_insert_page(recv, page, position);
        `}
 
-       fun remove( page_num : Int ) is extern `{
-               gtk_assistant_remove_page( recv, page_num );
+       fun remove(page_num: Int) `{
+               gtk_assistant_remove_page(recv, page_num);
        `}
 
-       fun get_page_type( page : GtkWidget ) : GtkAssistantPageType is extern `{
-               return gtk_assistant_get_page_type( recv, page );
+       fun get_page_type(page: GtkWidget): GtkAssistantPageType `{
+               return gtk_assistant_get_page_type(recv, page);
        `}
 
-       fun set_page_type( page : GtkWidget, t : GtkAssistantPageType) is extern `{
-               gtk_assistant_set_page_type( recv, page, t );
+       fun set_page_type(page: GtkWidget, t: GtkAssistantPageType) `{
+               gtk_assistant_set_page_type(recv, page, t);
        `}
 
-       fun get_page_title( page : GtkWidget ) : String import NativeString.to_s `{
-               return NativeString_to_s( (char *)gtk_assistant_get_page_title( recv, page ) );
+       fun get_page_title(page: GtkWidget): String import NativeString.to_s `{
+               return NativeString_to_s((char *)gtk_assistant_get_page_title(recv, page));
        `}
 
-       fun set_page_title( page : GtkWidget, title : String) is extern import String.to_cstring `{
-               gtk_assistant_set_page_title( recv, page, String_to_cstring( title ) );
+       fun set_page_title(page: GtkWidget, title: String) import String.to_cstring `{
+               gtk_assistant_set_page_title(recv, page, String_to_cstring(title));
        `}
 
-       fun set_page_complete( page : GtkWidget, is_complete : Bool ) is extern `{
-               gtk_assistant_set_page_complete( recv, page, is_complete );
+       fun set_page_complete(page: GtkWidget, is_complete: Bool) `{
+               gtk_assistant_set_page_complete(recv, page, is_complete);
        `}
 
-       fun get_page_complete( page : GtkWidget ) : Bool is extern `{
-               return gtk_assistant_get_page_complete( recv, page );
+       fun get_page_complete(page: GtkWidget): Bool `{
+               return gtk_assistant_get_page_complete(recv, page);
        `}
 
-       fun remove_action_widget( child : GtkWidget ) is extern `{
-               gtk_assistant_remove_action_widget( recv, child );
+       fun remove_action_widget(child: GtkWidget) `{
+               gtk_assistant_remove_action_widget(recv, child);
        `}
 
-       fun add_action_widget( child : GtkWidget ) is extern `{
-               gtk_assistant_add_action_widget( recv, child );
+       fun add_action_widget(child: GtkWidget) `{
+               gtk_assistant_add_action_widget(recv, child);
        `}
 
-       fun update_buttons_state is extern `{
-               gtk_assistant_update_buttons_state( recv );
+       fun update_buttons_state `{
+               gtk_assistant_update_buttons_state(recv);
        `}
 
-       fun commit is extern `{
-               gtk_assistant_commit( recv );
+       fun commit `{
+               gtk_assistant_commit(recv);
        `}
 
-       fun next_page is extern `{
-               gtk_assistant_next_page( recv );
+       fun next_page `{
+               gtk_assistant_next_page(recv);
        `}
 
-       fun previous_page is extern `{
-               gtk_assistant_previous_page( recv );
+       fun previous_page `{
+               gtk_assistant_previous_page(recv);
        `}
 end
 
-#enum GtkAssistantPageType
-#An enum for determining the page role inside the GtkAssistant. It's used to handle buttons sensitivity and visibility.
-#@https://developer.gnome.org/gtk3/stable/GtkAssistant.html#GtkAssistantPageType
+# enum GtkAssistantPageType
+# An enum for determining the page role inside the GtkAssistant. It's used to handle buttons sensitivity and visibility.
+# See: https://developer.gnome.org/gtk3/stable/GtkAssistant.html#GtkAssistantPageType
 extern class GtkAssistantPageType `{GtkAssistantPageType`}
-       #The page has regular contents. Both the Back and forward buttons will be shown.
+       # The page has regular contents. Both the Back and forward buttons will be shown.
        new content `{ return GTK_ASSISTANT_PAGE_CONTENT; `}
 
-       #The page contains an introduction to the assistant task. Only the Forward button will be shown if there is a next page.
+       # The page contains an introduction to the assistant task. Only the Forward button will be shown if there is a next page.
        new intro `{ return GTK_ASSISTANT_PAGE_INTRO; `}
 
-       #The page lets the user confirm or deny the changes. The Back and Apply buttons will be shown.
+       # The page lets the user confirm or deny the changes. The Back and Apply buttons will be shown.
        new confirm `{ return GTK_ASSISTANT_PAGE_CONFIRM; `}
 
-       #The page informs the user of the changes done. Only the Close button will be shown.
+       # The page informs the user of the changes done. Only the Close button will be shown.
        new summary `{ return GTK_ASSISTANT_PAGE_SUMMARY; `}
 
-       #Used for tasks that take a long time to complete, blocks the assistant until the page is marked as complete. Only the back button will be shown.
+       # Used for tasks that take a long time to complete, blocks the assistant until the page is marked as complete. Only the back button will be shown.
        new progress `{ return GTK_ASSISTANT_PAGE_PROGRESS; `}
 
-       #Used for when other page types are not appropriate. No buttons will be shown, and the application must add its own buttons through gtk_assistant_add_action_widget().
+       # Used for when other page types are not appropriate. No buttons will be shown, and the application must add its own buttons through gtk_assistant_add_action_widget().
        new custom `{ return GTK_ASSISTANT_PAGE_CUSTOM; `}
 end
index 64b7b49..88842a4 100644 (file)
 # limitations under the License.
 
 # Classes and services to use libGTK widgets
-module gtk_core is pkgconfig("gtk+-3.0")
+module gtk_core is
+       pkgconfig "gtk+-3.0"
+       cflags "-Wno-deprecated-declarations"
+end
 
 import gtk_enums
 import gdk_enums
@@ -26,94 +29,95 @@ in "C Header" `{
 `}
 
 `{
-               /* callback user data */
-               typedef struct {
-                       GtkCallable to_call;
-                       nullable_Object user_data;
-               } NitGtkSignal;
-
-               void nit_gtk_callback_func( GtkWidget *widget,
-                                                       gpointer   callback_data ) {
-                       NitGtkSignal *data;
-                       data = (NitGtkSignal*)callback_data;
-                       GtkCallable_signal( data->to_call, widget, data->user_data );
-               }
+       /* callback user data */
+       typedef struct {
+               GtkCallable to_call;
+               nullable_Object user_data;
+       } NitGtkSignal;
+
+       void nit_gtk_callback_func(GtkWidget *widget, gpointer callback_data) {
+               NitGtkSignal *data;
+               data = (NitGtkSignal*)callback_data;
+               GtkCallable_signal(data->to_call, widget, data->user_data);
+       }
 `}
 
-redef interface Object
-       protected fun init_gtk `{ gtk_init( 0, NULL ); `}
-       protected fun run_gtk `{ gtk_main(); `}
-       protected fun quit_gtk `{ gtk_main_quit(); `}
-end
+# Initialize the GTK system
+fun init_gtk `{ gtk_init(0, NULL); `}
+
+# Hand over control to the GTK event loop
+fun run_gtk `{ gtk_main(); `}
+
+# Quit the GTK event loop and clean up the system
+fun quit_gtk `{ gtk_main_quit(); `}
 
 interface GtkCallable
        # return true to stop event processing, false to let it propagate
-       fun signal( sender : GtkWidget, user_data : nullable Object ) is abstract
+       fun signal(sender: GtkWidget, user_data: nullable Object) is abstract
 end
 
 extern class GdkEvent `{GdkEvent *`}
 end
 
-
-#Base class for all widgets
-#@https://developer.gnome.org/gtk3/stable/GtkWidget.html
+# Base class for all widgets
+# See: https://developer.gnome.org/gtk3/stable/GtkWidget.html
 extern class GtkWidget `{GtkWidget *`}
-       fun show_all is extern `{ gtk_widget_show_all( recv ); `}
+       fun show_all `{ gtk_widget_show_all(recv); `}
 
-       fun signal_connect( signal_name : String, to_call : GtkCallable, user_data : nullable Object ) is extern import String.to_cstring, GtkCallable.signal, Object.as not nullable `{
-               NitGtkSignal *data = malloc( sizeof(NitGtkSignal) );
+       fun signal_connect(signal_name: String, to_call: GtkCallable, user_data: nullable Object) import String.to_cstring, GtkCallable.signal, Object.as not nullable `{
+               NitGtkSignal *data = malloc(sizeof(NitGtkSignal));
 
-               GtkCallable_incr_ref( to_call );
-               Object_incr_ref( user_data );
+               GtkCallable_incr_ref(to_call);
+               Object_incr_ref(user_data);
 
                data->to_call = to_call;
                data->user_data = user_data;
 
                /*Use G_CALLBACK() to cast the callback function to a GCallback*/
-               g_signal_connect( recv,
-                                                       String_to_cstring( signal_name ),
-                                                       G_CALLBACK(nit_gtk_callback_func),
-                                                       data );
+               g_signal_connect(recv,
+                                String_to_cstring(signal_name),
+                                G_CALLBACK(nit_gtk_callback_func),
+                                data);
        `}
 
-       redef fun == ( o ) do return o isa GtkWidget and equal_to_gtk_widget( o )
+       redef fun ==(o) do return o isa GtkWidget and equal_to_gtk_widget(o)
 
-       private fun equal_to_gtk_widget( o : GtkWidget ) : Bool `{
+       private fun equal_to_gtk_widget(o: GtkWidget): Bool `{
                return recv == o;
        `}
 
-       fun request_size( width, height : Int ) `{
-               gtk_widget_set_size_request( recv, width, height );
+       fun request_size(width, height: Int) `{
+               gtk_widget_set_size_request(recv, width, height);
        `}
 
-       fun bg_color=( state : GtkStateType, color : GdkRGBA ) is extern `{
-               gtk_widget_override_background_color( recv, state, color);
+       fun bg_color=(state: GtkStateType, color: GdkRGBA) `{
+               gtk_widget_override_background_color(recv, state, color);
        `}
 
-       #with gtk it's possible to set fg_color to all widget : is it correct? is fg color inherited?
-       #GdkColor color;
-       fun fg_color=( state : GtkStateType, color : GdkRGBA ) is extern `{
-               gtk_widget_override_color( recv, state, color);
+       # with gtk it's possible to set fg_color to all widget: is it correct? is fg color inherited?
+       # GdkColor color;
+       fun fg_color=(state: GtkStateType, color: GdkRGBA) `{
+               gtk_widget_override_color(recv, state, color);
        `}
-       
+
        # Sets the sensitivity of a widget. sensitive -> the user can interact with it.
        # Insensitive -> widget "grayed out" and the user can"t interact with them
-       fun sensitive=(sensitive : Bool) is extern `{
+       fun sensitive=(sensitive: Bool) `{
                gtk_widget_set_sensitive(recv, sensitive);
        `}
-       
+
        # return the sensitivity of the widget
-       fun sensitive: Bool is extern `{
+       fun sensitive: Bool `{
                return gtk_widget_get_sensitive(recv);
        `}
-       
+
        # Set the visibility of the widget
-       fun visible=(visible: Bool) is extern `{
+       fun visible=(visible: Bool) `{
                gtk_widget_set_visible(recv, visible);
        `}
 
        # Get the visibility of the widget only
-       fun visible_self: Bool is extern `{
+       fun visible_self: Bool `{
                return gtk_widget_get_visible(recv);
        `}
 
@@ -129,539 +133,578 @@ extern class GtkWidget `{GtkWidget *`}
        fun hide `{ gtk_widget_hide(recv); `}
 end
 
-#Base class for widgets which contain other widgets
-#@https://developer.gnome.org/gtk3/stable/GtkContainer.html
+# Base class for widgets which contain other widgets
+# See: https://developer.gnome.org/gtk3/stable/GtkContainer.html
 extern class GtkContainer `{GtkContainer *`}
        super GtkWidget
 
        # Add a widget to the container
-       fun add( widget : GtkWidget ) is extern `{
-               gtk_container_add( recv, widget );
+       fun add(widget: GtkWidget) `{
+               gtk_container_add(recv, widget);
        `}
        # Remove the widget from the container
-       fun remove_widget( widget : GtkWidget ) is extern `{
-               gtk_container_remove( recv, widget );
+       fun remove_widget(widget: GtkWidget) `{
+               gtk_container_remove(recv, widget);
        `}
 
        # Get the resize mode of the container
-       fun resize_mode : GtkResizeMode is extern `{
-               return gtk_container_get_resize_mode( recv );
+       fun resize_mode: GtkResizeMode `{
+               return gtk_container_get_resize_mode(recv);
        `}
 
        # Set the resize mode of the container
-       fun resize_mode=( resize_mode: GtkResizeMode ) is extern `{
-               gtk_container_set_resize_mode( recv, resize_mode );
+       fun resize_mode=(resize_mode: GtkResizeMode) `{
+               gtk_container_set_resize_mode(recv, resize_mode);
        `}
 
 end
 
-#A container with just one child
-#@https://developer.gnome.org/gtk3/stable/GtkBin.html
+# A container with just one child
+# See: https://developer.gnome.org/gtk3/stable/GtkBin.html
 extern class GtkBin `{GtkBin *`}
        super GtkContainer
 
-       fun child : GtkWidget is extern `{
-               return gtk_bin_get_child( recv );
+       fun child: GtkWidget `{
+               return gtk_bin_get_child(recv);
        `}
 end
 
-#Toplevel which can contain other widgets
-#@https://developer.gnome.org/gtk3/stable/GtkWindow.html
+# Toplevel which can contain other widgets
+# See: https://developer.gnome.org/gtk3/stable/GtkWindow.html
 extern class GtkWindow `{GtkWindow *`}
        super GtkBin
 
-       new ( flag : Int ) is extern `{
-               GtkWindow *win;
+       new (typ: GtkWindowType) `{
+               return (GtkWindow *)gtk_window_new(typ);
+       `}
 
-               win = GTK_WINDOW(gtk_window_new( flag ));
-               g_signal_connect(win, "destroy", G_CALLBACK(gtk_main_quit), NULL);
-               return win;
+       # Connect the "destroy" signal to `quit_gtk`
+       fun connect_destroy_signal_to_quit `{
+               g_signal_connect(recv, "destroy", G_CALLBACK(gtk_main_quit), NULL);
        `}
 
-       fun title=( title : String ) is extern import String.to_cstring `{
-               gtk_window_set_title( recv, String_to_cstring( title ) );
+       fun title=(title: String) import String.to_cstring `{
+               gtk_window_set_title(recv, String_to_cstring(title));
        `}
 
-       #The "destroy" signal is emitted when a widget is destroyed, either by explicitly calling gtk_widget_destroy() or when the widget is unparented. Top-level GtkWindows are also destroyed when the Close window control button is clicked.
-       fun on_close( to_call : GtkCallable, user_data : nullable Object )
+       # The "destroy" signal is emitted when a widget is destroyed, either by explicitly calling gtk_widget_destroy() or when the widget is unparented. Top-level GtkWindows are also destroyed when the Close window control button is clicked.
+       fun on_close(to_call: GtkCallable, user_data: nullable Object)
        do
-               signal_connect( "destroy", to_call, user_data )
+               signal_connect("destroy", to_call, user_data)
        end
 
-       fun resizable : Bool is extern `{
-               return gtk_window_get_resizable( recv );
+       fun resizable: Bool `{
+               return gtk_window_get_resizable(recv);
        `}
 
-       fun resizable=( is_resizable : Bool) is extern `{
-               return gtk_window_set_resizable( recv, is_resizable );
+       fun resizable=(is_resizable: Bool) `{
+               return gtk_window_set_resizable(recv, is_resizable);
        `}
 
-       #Activates the current focused widget within the window.
-       #returns TRUE if a widget got activated.
-       fun activate_focus : Bool is extern `{
-               return gtk_window_activate_focus( recv );
+       # Activates the current focused widget within the window.
+       # returns TRUE if a widget got activated.
+       fun activate_focus: Bool `{
+               return gtk_window_activate_focus(recv);
        `}
 
-       #Sets a window modal or non-modal. Modal windows prevent interaction with other windows in the same application.
-       fun modal=( is_modal : Bool ) is extern `{
-               gtk_window_set_modal( recv, is_modal );
+       # Sets a window modal or non-modal. Modal windows prevent interaction with other windows in the same application.
+       fun modal=(is_modal: Bool) `{
+               gtk_window_set_modal(recv, is_modal);
        `}
 
-       #Windows can't actually be 0x0 in size, they must be at least 1x1
-       #but passing 0 for width and height is OK, resulting in a 1x1 default size.
-       #params width in pixels, or -1 to unset the default width
-       #params height in pixels, or -1 to unset the default height
-       fun default_size( width : Int, height : Int ) is extern `{
-               gtk_window_set_default_size( recv, width, height );
+       # Windows can't actually be 0x0 in size, they must be at least 1x1
+       # but passing 0 for width and height is OK, resulting in a 1x1 default size.
+       # params width in pixels, or -1 to unset the default width
+       # params height in pixels, or -1 to unset the default height
+       fun default_size(width: Int, height: Int) `{
+               gtk_window_set_default_size(recv, width, height);
        `}
 
-       #Activates the default widget for the window
-       #unless the current focused widget has been configured to receive the default action (see gtk_widget_set_receives_default()), in which case the focused widget is activated.
-       fun activate_default : Bool is extern `{
-               return gtk_window_activate_default( recv );
+       # Activates the default widget for the window
+       # unless the current focused widget has been configured to receive the default action (see gtk_widget_set_receives_default()), in which case the focused widget is activated.
+       fun activate_default: Bool `{
+               return gtk_window_activate_default(recv);
        `}
 
-       fun gravity : GdkGravity is extern `{
-               return gtk_window_get_gravity( recv );
+       fun gravity: GdkGravity `{
+               return gtk_window_get_gravity(recv);
        `}
 
-       fun gravity=( window_grav : GdkGravity ) is extern `{
-               gtk_window_set_gravity( recv, window_grav );
+       fun gravity=(window_grav: GdkGravity) `{
+               gtk_window_set_gravity(recv, window_grav);
        `}
 
-#      fun position : GtkWindowPosition is extern `{
-#              return gtk_window_get_position( recv );
+#      fun position: GtkWindowPosition `{
+#              return gtk_window_get_position(recv);
 #      `}
 #
-#      fun position=( window_pos : GtkWindowPosition ) is extern `{
-#              gtk_window_set_position( recv, window_pos );
+#      fun position=(window_pos: GtkWindowPosition) `{
+#              gtk_window_set_position(recv, window_pos);
 #      `}
 
-       fun active : Bool is extern `{
-               return gtk_window_is_active( recv );
+       fun active: Bool `{
+               return gtk_window_is_active(recv);
        `}
 
-       #Returns whether the input focus is within this GtkWindow. For real toplevel windows, this is identical to gtk_window_is_active(), but for embedded windows, like GtkPlug, the results will differ.
-       fun has_toplevel_focus : Bool is extern `{
-               return gtk_window_has_toplevel_focus( recv );
+       # Returns whether the input focus is within this GtkWindow. For real toplevel windows, this is identical to gtk_window_is_active(), but for embedded windows, like GtkPlug, the results will differ.
+       fun has_toplevel_focus: Bool `{
+               return gtk_window_has_toplevel_focus(recv);
        `}
 
-       fun get_focus : GtkWidget is extern `{
-               return gtk_window_get_focus( recv );
+       fun get_focus: GtkWidget `{
+               return gtk_window_get_focus(recv);
        `}
 
-       fun set_focus( widget : GtkWidget ) is extern `{
-               return gtk_window_set_focus( recv, widget );
+       fun set_focus(widget: GtkWidget) `{
+               return gtk_window_set_focus(recv, widget);
        `}
 
-       fun get_default_widget : GtkWidget is extern `{
-               return gtk_window_get_default_widget( recv );
+       fun get_default_widget: GtkWidget `{
+               return gtk_window_get_default_widget(recv);
        `}
 
-       fun set_default_widget( widget : GtkWidget ) is extern `{
-               return gtk_window_set_default( recv, widget );
+       fun set_default_widget(widget: GtkWidget) `{
+               return gtk_window_set_default(recv, widget);
        `}
 
-       fun maximize is extern `{
-               return gtk_window_maximize( recv );
+       fun maximize `{
+               return gtk_window_maximize(recv);
        `}
 
-       fun unmaximize is extern `{
-               return gtk_window_unmaximize( recv );
+       fun unmaximize `{
+               return gtk_window_unmaximize(recv);
        `}
 
-       fun fullscreen is extern `{
-               return gtk_window_fullscreen( recv );
+       fun fullscreen `{
+               return gtk_window_fullscreen(recv);
        `}
 
-       fun unfullscreen is extern `{
-               return gtk_window_unfullscreen( recv );
+       fun unfullscreen `{
+               return gtk_window_unfullscreen(recv);
        `}
 
-       fun keep_above=( setting : Bool ) is extern `{
-               gtk_window_set_keep_above( recv, setting );
+       fun keep_above=(setting: Bool) `{
+               gtk_window_set_keep_above(recv, setting);
        `}
 
-       fun keep_below=( setting : Bool ) is extern `{
-               gtk_window_set_keep_below( recv, setting );
+       fun keep_below=(setting: Bool) `{
+               gtk_window_set_keep_below(recv, setting);
        `}
 end
 
-#A bin with a decorative frame and optional label
-#https://developer.gnome.org/gtk3/stable/GtkFrame.html
+# A bin with a decorative frame and optional label
+# https://developer.gnome.org/gtk3/stable/GtkFrame.html
 extern class GtkFrame `{GtkFrame *`}
        super GtkBin
 
-       new ( lbl : String ) is extern import String.to_cstring`{
-               return (GtkFrame *)gtk_frame_new( String_to_cstring( lbl ) );
+       new (lbl: String) import String.to_cstring `{
+               return (GtkFrame *)gtk_frame_new(String_to_cstring(lbl));
        `}
 
-       fun frame_label : String is extern`{
-               return NativeString_to_s( (char *)gtk_frame_get_label( recv ) );
+       fun frame_label: String `{
+               return NativeString_to_s((char *)gtk_frame_get_label(recv));
        `}
 
-       fun frame_label=( lbl : String ) is extern import String.to_cstring`{
-               gtk_frame_set_label( recv, String_to_cstring( lbl ) );
+       fun frame_label=(lbl: String) import String.to_cstring `{
+               gtk_frame_set_label(recv, String_to_cstring(lbl));
        `}
 
-       fun label_widget : GtkWidget is extern `{
-               return gtk_frame_get_label_widget( recv );
+       fun label_widget: GtkWidget `{
+               return gtk_frame_get_label_widget(recv);
        `}
 
-       fun label_widget=( widget : GtkWidget ) is extern `{
-               gtk_frame_set_label_widget( recv, widget );
+       fun label_widget=(widget: GtkWidget) `{
+               gtk_frame_set_label_widget(recv, widget);
        `}
 
-       fun shadow_type : GtkShadowType is extern `{
-               return gtk_frame_get_shadow_type( recv );
+       fun shadow_type: GtkShadowType `{
+               return gtk_frame_get_shadow_type(recv);
        `}
 
-       fun shadow_type=( stype : GtkShadowType ) is extern `{
-               gtk_frame_set_shadow_type( recv, stype );
+       fun shadow_type=(stype: GtkShadowType) `{
+               gtk_frame_set_shadow_type(recv, stype);
        `}
 
-       #fun label_align : GtkShadowType is extern `{
-       #`}
-
-       fun label_align=( xalign : Float, yalign : Float ) is extern `{
-               gtk_frame_set_label_align( recv, xalign, yalign );
+       fun label_align=(xalign: Float, yalign: Float) `{
+               gtk_frame_set_label_align(recv, xalign, yalign);
        `}
 end
 
-#Pack widgets in a rows and columns
-#@https://developer.gnome.org/gtk3/3.3/GtkGrid.html
+# Pack widgets in a rows and columns
+# See: https://developer.gnome.org/gtk3/3.3/GtkGrid.html
 extern class GtkGrid `{GtkGrid *`}
        super GtkContainer
 
-       # Create a grid with a fixed number of rows and columns
-       new ( rows : Int, columns : Int, homogeneous : Bool ) `{
-               return (GtkGrid*)gtk_grid_new(); // rows, columns, homogeneous );
+       # Create a new grid
+       new `{
+               return (GtkGrid*)gtk_grid_new();
        `}
 
        # Set a widget child inside the grid at a given position
-       fun attach( child : GtkWidget, left, top, width, height : Int ) `{
-               gtk_grid_attach( recv, child, left, top, width, height );
+       fun attach(child: GtkWidget, left, top, width, height: Int) `{
+               gtk_grid_attach(recv, child, left, top, width, height);
        `}
 
        # Get the child of the Grid at the given position
-       fun get_child_at( left : Int, top : Int ): GtkWidget is extern `{
-               return gtk_grid_get_child_at( recv, left, top );
+       fun get_child_at(left: Int, top: Int): GtkWidget `{
+               return gtk_grid_get_child_at(recv, left, top);
        `}
 
        # Insert a row at the specified position
-       fun insert_row( position :Int ) is extern `{
-               gtk_grid_insert_row( recv, position );
+       fun insert_row(position:Int) `{
+               gtk_grid_insert_row(recv, position);
        `}
 
        # Insert a column at the specified position
-       fun insert_column( position : Int ) is extern `{
-               gtk_grid_insert_column( recv, position );
+       fun insert_column(position: Int) `{
+               gtk_grid_insert_column(recv, position);
+       `}
+end
+
+# A widget that can switch orientation
+extern class GtkOrientable `{GtkOrientable *`}
+       super GtkWidget
+
+       # Get the orientation of this widget
+       fun orientation: GtkOrientation `{
+               return gtk_orientable_get_orientation(recv);
+       `}
+
+       # Set the orientation of this widget
+       fun orientation=(orientation: GtkOrientation) `{
+               gtk_orientable_set_orientation(recv, orientation);
        `}
 end
 
 # A container box
 #
-# @https://developer.gnome.org/gtk3/3.4/GtkBox.html
+# See: https://developer.gnome.org/gtk3/3.4/GtkBox.html
 extern class GtkBox `{ GtkBox * `}
        super GtkContainer
+       super GtkOrientable
+
+       # Create a new `GtkBox` with the given `orientation` and `spacing` between its children
+       new (orientation: GtkOrientation, spacing: Int) `{
+               return (GtkBox *)gtk_box_new(orientation, spacing);
+       `}
+
+       # Give the children of `self` equal space in the box?
+       fun omogeneous: Bool `{ return gtk_box_get_homogeneous(recv); `}
+
+       # Give the children of `self` equal space in the box?
+       fun omogeneous=(omogeneous: Bool) `{
+               gtk_box_set_homogeneous(recv, omogeneous);
+       `}
+
+       # Add `child` and pack it at the start of the box
+       fun pack_start(child: GtkWidget, expand, fill: Bool, padding: Int) `{
+               gtk_box_pack_start(recv, child, expand, fill, padding);
+       `}
+
+       # Add `child` and pack it at the end of the box
+       fun pack_end(child: GtkWidget, expand, fill: Bool, padding: Int) `{
+               gtk_box_pack_end(recv, child, expand, fill, padding);
+       `}
+
+       # Set the way `child` is packed in `self`
+       fun set_child_packing(child: GtkWidget, expand, fill: Bool, padding: Int, packing: GtkPackType) `{
+               gtk_box_set_child_packing(recv, child, expand, fill, padding, packing);
+       `}
 end
 
-#The tree interface used by GtkTreeView
-#@https://developer.gnome.org/gtk3/stable/GtkTreeModel.html
+# The tree interface used by GtkTreeView
+# See: https://developer.gnome.org/gtk3/stable/GtkTreeModel.html
 extern class GtkTreeModel `{GtkTreeModel *`}
 end
 
-#An abstract class for laying out GtkCellRenderers
-#@https://developer.gnome.org/gtk3/stable/GtkCellArea.html
+# An abstract class for laying out GtkCellRenderers
+# See: https://developer.gnome.org/gtk3/stable/GtkCellArea.html
 extern class GtkCellArea `{GtkCellArea *`}
 end
 
-#Base class for widgets with alignments and padding
-#@https://developer.gnome.org/gtk3/3.2/GtkMisc.html
+# Base class for widgets with alignments and padding
+# See: https://developer.gnome.org/gtk3/3.2/GtkMisc.html
 extern class GtkMisc `{GtkMisc *`}
        super GtkWidget
 
-       fun alignment : GtkAlignment is abstract
+       fun alignment: GtkAlignment is abstract
 
-       fun alignment=( x : Float, y : Float ) is extern `{
-               gtk_misc_set_alignment( recv, x, y );
+       fun alignment=(x: Float, y: Float) `{
+               gtk_misc_set_alignment(recv, x, y);
        `}
 
-       fun padding : GtkAlignment is abstract
+       fun padding: GtkAlignment is abstract
 
-       fun padding=( x : Float, y : Float ) is extern `{
-               gtk_misc_set_padding( recv, x, y );
+       fun padding=(x: Float, y: Float) `{
+               gtk_misc_set_padding(recv, x, y);
        `}
 
 end
 
-#A single line text entry field
-#@https://developer.gnome.org/gtk3/3.2/GtkEntry.html
+# A single line text entry field
+# See: https://developer.gnome.org/gtk3/3.2/GtkEntry.html
 extern class GtkEntry `{GtkEntry *`}
        super GtkWidget
 
-       new is extern `{
+       new `{
                 return (GtkEntry *)gtk_entry_new();
        `}
 
-       fun text : String is extern import NativeString.to_s_with_copy `{
-               return NativeString_to_s_with_copy( (char *)gtk_entry_get_text( recv ) );
+       fun text: String import NativeString.to_s_with_copy `{
+               return NativeString_to_s_with_copy((char *)gtk_entry_get_text(recv));
        `}
 
-       fun text=( value : String) is extern import String.to_cstring`{
-               gtk_entry_set_text( recv, String_to_cstring( value ) );
+       fun text=(value: String) import String.to_cstring `{
+               gtk_entry_set_text(recv, String_to_cstring(value));
        `}
 
        # Is the text visible or is it the invisible char (such as '*')?
-       fun visiblility: Bool is extern `{
-               return gtk_entry_get_visibility( recv );
+       fun visiblility: Bool `{
+               return gtk_entry_get_visibility(recv);
        `}
 
        # Set the text visiblility
        # If false, will use the invisible char (such as '*')
-       fun visibility=( is_visible : Bool) is extern `{
-               gtk_entry_set_visibility( recv, is_visible );
+       fun visibility=(is_visible: Bool) `{
+               gtk_entry_set_visibility(recv, is_visible);
        `}
 
-       fun max_length : Int is extern `{
-               return gtk_entry_get_max_length( recv );
+       fun max_length: Int `{
+               return gtk_entry_get_max_length(recv);
        `}
 
-       fun max_length=( max : Int) is extern `{
-               gtk_entry_set_max_length( recv, max );
+       fun max_length=(max: Int) `{
+               gtk_entry_set_max_length(recv, max);
        `}
 end
 
-#Base class for widgets which visualize an adjustment
-#@https://developer.gnome.org/gtk3/3.2/GtkRange.html
+# Base class for widgets which visualize an adjustment
+# See: https://developer.gnome.org/gtk3/3.2/GtkRange.html
 extern class GtkRange `{GtkRange *`}
        super GtkWidget
 
-       #Gets the current position of the fill level indicator.
-       fun fill_level : Float is extern `{
-               return gtk_range_get_fill_level( recv );
+       # Gets the current position of the fill level indicator.
+       fun fill_level: Float `{
+               return gtk_range_get_fill_level(recv);
        `}
 
-       fun fill_level=( level : Float ) is extern `{
-               gtk_range_set_fill_level( recv, level );
+       fun fill_level=(level: Float) `{
+               gtk_range_set_fill_level(recv, level);
        `}
 
-       #Gets whether the range is restricted to the fill level.
-       fun restricted_to_fill_level : Bool is extern `{
-               return gtk_range_get_restrict_to_fill_level( recv );
+       # Gets whether the range is restricted to the fill level.
+       fun restricted_to_fill_level: Bool `{
+               return gtk_range_get_restrict_to_fill_level(recv);
        `}
 
-       fun restricted_to_fill_level=( restricted : Bool ) is extern `{
-               gtk_range_set_restrict_to_fill_level( recv, restricted );
+       fun restricted_to_fill_level=(restricted: Bool) `{
+               gtk_range_set_restrict_to_fill_level(recv, restricted);
        `}
 
-       #Gets whether the range displays the fill level graphically.
-       fun show_fill_level : Bool is extern `{
-               return gtk_range_get_show_fill_level( recv );
+       # Gets whether the range displays the fill level graphically.
+       fun show_fill_level: Bool `{
+               return gtk_range_get_show_fill_level(recv);
        `}
 
-       fun show_fill_level=( is_displayed : Bool ) is extern `{
-               gtk_range_set_show_fill_level( recv, is_displayed );
+       fun show_fill_level=(is_displayed: Bool) `{
+               gtk_range_set_show_fill_level(recv, is_displayed);
        `}
 
-       fun adjustment : GtkAdjustment is extern `{
-               return gtk_range_get_adjustment( recv );
+       fun adjustment: GtkAdjustment `{
+               return gtk_range_get_adjustment(recv);
        `}
 
-       fun adjustment=( value : GtkAdjustment ) is extern `{
-               gtk_range_set_adjustment( recv, value );
+       fun adjustment=(value: GtkAdjustment) `{
+               gtk_range_set_adjustment(recv, value);
        `}
 
-       fun inverted : Bool is extern `{
-               return gtk_range_get_inverted( recv );
+       fun inverted: Bool `{
+               return gtk_range_get_inverted(recv);
        `}
 
-       fun inverted=( setting : Bool ) is extern `{
-               gtk_range_set_inverted( recv, setting );
+       fun inverted=(setting: Bool) `{
+               gtk_range_set_inverted(recv, setting);
        `}
 
-       fun value : Float is extern `{
-               return gtk_range_get_value( recv );
+       fun value: Float `{
+               return gtk_range_get_value(recv);
        `}
 
-       fun value=( val : Float ) is extern `{
-               gtk_range_set_value( recv, val );
+       fun value=(val: Float) `{
+               gtk_range_set_value(recv, val);
        `}
 
-       fun set_increments( step : Float, page : Float ) is extern `{
-               gtk_range_set_increments( recv, step, page );
+       fun set_increments(step: Float, page: Float) `{
+               gtk_range_set_increments(recv, step, page);
        `}
 
-       fun set_range( min : Float, max : Float ) is extern `{
-               gtk_range_set_range( recv, min, max );
+       fun set_range(min: Float, max: Float) `{
+               gtk_range_set_range(recv, min, max);
        `}
 
-       fun round_digits : Int is extern `{
-               return gtk_range_get_round_digits( recv );
+       fun round_digits: Int `{
+               return gtk_range_get_round_digits(recv);
        `}
 
-       fun round_digits=( nb : Int ) is extern `{
-               gtk_range_set_round_digits( recv, nb );
+       fun round_digits=(nb: Int) `{
+               gtk_range_set_round_digits(recv, nb);
        `}
 
-       fun size_fixed : Bool is extern `{
-               return gtk_range_get_slider_size_fixed( recv );
+       fun size_fixed: Bool `{
+               return gtk_range_get_slider_size_fixed(recv);
        `}
 
-       fun size_fixed=( is_fixed : Bool ) is extern `{
-               return gtk_range_set_slider_size_fixed( recv, is_fixed );
+       fun size_fixed=(is_fixed: Bool) `{
+               return gtk_range_set_slider_size_fixed(recv, is_fixed);
        `}
 
-       fun flippable : Bool is extern `{
-               return gtk_range_get_flippable( recv );
+       fun flippable: Bool `{
+               return gtk_range_get_flippable(recv);
        `}
 
-       fun min_size=( is_flippable : Bool ) is extern `{
-               return gtk_range_set_flippable( recv, is_flippable );
+       fun min_size=(is_flippable: Bool) `{
+               return gtk_range_set_flippable(recv, is_flippable);
        `}
 
-       fun min_slider_size : Int is extern `{
-               return gtk_range_get_min_slider_size( recv );
+       fun min_slider_size: Int `{
+               return gtk_range_get_min_slider_size(recv);
        `}
 
-       fun min_slider_size=( size : Int ) is extern `{
-               return gtk_range_set_min_slider_size( recv, size );
+       fun min_slider_size=(size: Int) `{
+               return gtk_range_set_min_slider_size(recv, size);
        `}
 end
 
-#A slider widget for selecting a value from a range
-#@https://developer.gnome.org/gtk3/3.2/GtkScale.html
+# A slider widget for selecting a value from a range
+# See: https://developer.gnome.org/gtk3/3.2/GtkScale.html
 extern class GtkScale `{GtkScale *`}
        super GtkRange
 
-       new ( orientation : GtkOrientation, adjustment : GtkAdjustment ) is extern `{
-               return (GtkScale *)gtk_scale_new( orientation, adjustment );
+       new (orientation: GtkOrientation, adjustment: GtkAdjustment) `{
+               return (GtkScale *)gtk_scale_new(orientation, adjustment);
        `}
 
-       new with_range ( orientation : GtkOrientation, min : Float, max : Float, step : Float ) is extern `{
-               return (GtkScale *)gtk_scale_new_with_range( orientation, min, max, step );
+       new with_range (orientation: GtkOrientation, min: Float, max: Float, step: Float) `{
+               return (GtkScale *)gtk_scale_new_with_range(orientation, min, max, step);
        `}
 
-       fun digits : Int is extern `{
-               return gtk_scale_get_digits( recv );
+       fun digits: Int `{
+               return gtk_scale_get_digits(recv);
        `}
 
-       fun digits=( nb_digits : Int ) is extern `{
-               gtk_scale_set_digits( recv, nb_digits );
+       fun digits=(nb_digits: Int) `{
+               gtk_scale_set_digits(recv, nb_digits);
        `}
 
-       fun draw_value : Bool is extern `{
-               return gtk_scale_get_draw_value( recv );
+       fun draw_value: Bool `{
+               return gtk_scale_get_draw_value(recv);
        `}
 
-       fun draw_value=( is_displayed : Bool ) is extern `{
-               gtk_scale_set_draw_value( recv, is_displayed );
+       fun draw_value=(is_displayed: Bool) `{
+               gtk_scale_set_draw_value(recv, is_displayed);
        `}
 
-       fun value_position : GtkPositionType is extern `{
-               return gtk_scale_get_value_pos( recv );
+       fun value_position: GtkPositionType `{
+               return gtk_scale_get_value_pos(recv);
        `}
 
-       fun value_position=( pos : GtkPositionType ) is extern `{
-               gtk_scale_set_value_pos( recv, pos );
+       fun value_position=(pos: GtkPositionType) `{
+               gtk_scale_set_value_pos(recv, pos);
        `}
 
-       fun has_origin : Bool is extern `{
-               return gtk_scale_get_has_origin( recv );
+       fun has_origin: Bool `{
+               return gtk_scale_get_has_origin(recv);
        `}
 
-       fun has_origin=( orig : Bool ) is extern `{
-               gtk_scale_set_has_origin( recv, orig );
+       fun has_origin=(orig: Bool) `{
+               gtk_scale_set_has_origin(recv, orig);
        `}
 
-       fun add_mark( value : Float, position : GtkPositionType, markup : String ) is extern import String.to_cstring`{
-               gtk_scale_add_mark( recv, value, position, String_to_cstring( markup ) );
+       fun add_mark(value: Float, position: GtkPositionType, markup: String)
+       import String.to_cstring `{
+               gtk_scale_add_mark(recv, value, position, String_to_cstring(markup));
        `}
 
-       #Removes any marks that have been added with gtk_scale_add_mark().
-       fun clear_marks is extern `{
-               gtk_scale_clear_marks( recv );
+       # Removes any marks that have been added with gtk_scale_add_mark().
+       fun clear_marks `{
+               gtk_scale_clear_marks(recv);
        `}
-
-       #get layout
-       #get layout offsets
-
 end
 
-#A scrollbar
-#@https://developer.gnome.org/gtk3/3.2/GtkScrollbar.html
+# A scrollbar
+# See: https://developer.gnome.org/gtk3/3.2/GtkScrollbar.html
 extern class GtkScrollbar `{GtkScrollbar *`}
        super GtkRange
 
-               new ( orientation : GtkOrientation, adjustment : GtkAdjustment ) is extern `{
-               return (GtkScrollbar *)gtk_scrollbar_new( orientation, adjustment );
+               new (orientation: GtkOrientation, adjustment: GtkAdjustment) `{
+               return (GtkScrollbar *)gtk_scrollbar_new(orientation, adjustment);
        `}
 end
 
-#A widget that displays a small to medium amount of text
-#@https://developer.gnome.org/gtk3/3.2/GtkLabel.html
+# A widget that displays a small to medium amount of text
+# See: https://developer.gnome.org/gtk3/3.2/GtkLabel.html
 extern class GtkLabel `{GtkLabel *`}
        super GtkMisc
 
        # Create a GtkLabel with text
-       new ( text : String ) is extern import String.to_cstring `{
-               return (GtkLabel*)gtk_label_new( String_to_cstring( text ) );
+       new (text: String) import String.to_cstring `{
+               return (GtkLabel*)gtk_label_new(String_to_cstring(text));
        `}
 
        # Set the text of the label
-       fun text=( text : String ) import String.to_cstring `{
-               gtk_label_set_text( recv, String_to_cstring( text ) );
+       fun text=(text: String) import String.to_cstring `{
+               gtk_label_set_text(recv, String_to_cstring(text));
        `}
 
        # Returns the text of the label
-       fun text : String import NativeString.to_s `{
-               return NativeString_to_s( (char*)gtk_label_get_text( recv ) );
+       fun text: String import NativeString.to_s `{
+               return NativeString_to_s((char*)gtk_label_get_text(recv));
        `}
 
        # Sets the angle of rotation for the label.
        # An angle of 90 reads from from bottom to top, an angle of 270, from top to bottom.
-       fun angle=( degre : Float ) `{
-               gtk_label_set_angle( recv, degre );
+       fun angle=(degre: Float) `{
+               gtk_label_set_angle(recv, degre);
        `}
 
        # Returns the angle of rotation for the label.
-       fun angle : Float `{
-               return gtk_label_get_angle( recv );
+       fun angle: Float `{
+               return gtk_label_get_angle(recv);
        `}
 
 end
 
-#A widget displaying an image
-#@https://developer.gnome.org/gtk3/3.2/GtkImage.html
+# A widget displaying an image
+# See: https://developer.gnome.org/gtk3/3.2/GtkImage.html
 extern class GtkImage `{GtkImage *`}
        super GtkMisc
 
        # Create a GtkImage
-       new is extern `{
-               return (GtkImage*)gtk_image_new( );
+       new `{
+               return (GtkImage*)gtk_image_new();
        `}
 
        # Create a GtkImage with text
-       new file( filename : String ) is extern import String.to_cstring `{
-               return (GtkImage*)gtk_image_new_from_file( String_to_cstring( filename ) );
+       new file(filename: String) import String.to_cstring `{
+               return (GtkImage*)gtk_image_new_from_file(String_to_cstring(filename));
        `}
 
-       fun pixel_size : Int is extern `{
-               return gtk_image_get_pixel_size( recv );
+       fun pixel_size: Int `{
+               return gtk_image_get_pixel_size(recv);
        `}
 
-       fun pixel_size=( size : Int) is extern `{
-               gtk_image_set_pixel_size( recv, size );
+       fun pixel_size=(size: Int) `{
+               gtk_image_set_pixel_size(recv, size);
        `}
 
-       fun clear is extern `{
-               gtk_image_clear( recv );
+       fun clear `{
+               gtk_image_clear(recv);
        `}
 end
 
-#enum GtkImageType
-#Describes the image data representation used by a GtkImage.
-#@https://developer.gnome.org/gtk3/3.2/GtkImage.html#GtkImageType
+# enum GtkImageType
+# Describes the image data representation used by a GtkImage.
+# See: https://developer.gnome.org/gtk3/3.2/GtkImage.html#GtkImageType
 extern class GtkImageType `{GtkImageType`}
        # There is no image displayed by the widget.
        new empty `{ return GTK_IMAGE_EMPTY; `}
@@ -685,343 +728,330 @@ extern class GtkImageType `{GtkImageType`}
        new gicon `{ return GTK_IMAGE_GICON; `}
 end
 
-#Displays an arrow
-#@https://developer.gnome.org/gtk3/3.2/GtkArrow.html
+# Displays an arrow
+# See: https://developer.gnome.org/gtk3/3.2/GtkArrow.html
 extern class GtkArrow `{GtkArrow *`}
        super GtkMisc
 
-       new ( arrow_type : GtkArrowType, shadow_type : GtkShadowType ) is extern `{
-               return (GtkArrow *)gtk_arrow_new( arrow_type, shadow_type );
+       new (arrow_type: GtkArrowType, shadow_type: GtkShadowType) `{
+               return (GtkArrow *)gtk_arrow_new(arrow_type, shadow_type);
        `}
 
-       fun set( arrow_type : GtkArrowType, shadow_type : GtkShadowType ) is extern `{
-               gtk_arrow_set( recv, arrow_type, shadow_type );
+       fun set(arrow_type: GtkArrowType, shadow_type: GtkShadowType) `{
+               gtk_arrow_set(recv, arrow_type, shadow_type);
        `}
 end
 
-#A widget that emits a signal when clicked on
-#@https://developer.gnome.org/gtk3/stable/GtkButton.html
+# A widget that emits a signal when clicked on
+# See: https://developer.gnome.org/gtk3/stable/GtkButton.html
 extern class GtkButton `{GtkButton *`}
        super GtkBin
 
-       new is extern `{
-               return (GtkButton *)gtk_button_new(  );
+       new `{
+               return (GtkButton *)gtk_button_new();
        `}
 
-       #Create a GtkButton with text
-       new with_label( text : String ) is extern import String.to_cstring `{
-               return (GtkButton *)gtk_button_new_with_label( String_to_cstring( text ) );
+       # Create a GtkButton with text
+       new with_label(text: String) import String.to_cstring `{
+               return (GtkButton *)gtk_button_new_with_label(String_to_cstring(text));
        `}
 
-       new from_stock( stock_id : String ) is extern import String.to_cstring `{
-               return (GtkButton *)gtk_button_new_from_stock( String_to_cstring( stock_id ) );
+       new from_stock(stock_id: String) import String.to_cstring `{
+               return (GtkButton *)gtk_button_new_from_stock(String_to_cstring(stock_id));
        `}
 
-       fun text : String is extern `{
-               return NativeString_to_s( (char *)gtk_button_get_label( recv ) );
+       fun text: String `{
+               return NativeString_to_s((char *)gtk_button_get_label(recv));
        `}
 
-       fun text=( value : String ) is extern import String.to_cstring`{
-               gtk_button_set_label( recv, String_to_cstring( value ) );
+       fun text=(value: String) import String.to_cstring `{
+               gtk_button_set_label(recv, String_to_cstring(value));
        `}
 
-       fun on_click( to_call : GtkCallable, user_data : nullable Object ) do
-                       signal_connect( "clicked", to_call, user_data )
+       fun on_click(to_call: GtkCallable, user_data: nullable Object) do
+                       signal_connect("clicked", to_call, user_data)
        end
 
 end
 
-#A button which pops up a scale
-#@https://developer.gnome.org/gtk3/stable/GtkScaleButton.html
+# A button which pops up a scale
+# See: https://developer.gnome.org/gtk3/stable/GtkScaleButton.html
 extern class GtkScaleButton `{GtkScaleButton *`}
        super GtkButton
 
-       #const gchar **icons
-       new( size: GtkIconSize, min: Float, max: Float, step: Float ) is extern `{
-               return (GtkScaleButton *)gtk_scale_button_new( size, min, max, step, (const char **)0 );
+       # const gchar **icons
+       new(size: GtkIconSize, min: Float, max: Float, step: Float) `{
+               return (GtkScaleButton *)gtk_scale_button_new(size, min, max, step, (const char **)0);
        `}
 end
 
-#Create buttons bound to a URL
-#@https://developer.gnome.org/gtk3/stable/GtkLinkButton.html
+# Create buttons bound to a URL
+# See: https://developer.gnome.org/gtk3/stable/GtkLinkButton.html
 extern class GtkLinkButton `{GtkLinkButton *`}
        super GtkButton
 
-       new( uri: String ) is extern import String.to_cstring `{
-               return (GtkLinkButton *)gtk_link_button_new( String_to_cstring(uri) );
+       new(uri: String) import String.to_cstring `{
+               return (GtkLinkButton *)gtk_link_button_new(String_to_cstring(uri));
        `}
 end
 
-#A container which can hide its child
-#https://developer.gnome.org/gtk3/stable/GtkExpander.html
+# A container which can hide its child
+# https://developer.gnome.org/gtk3/stable/GtkExpander.html
 extern class GtkExpander `{GtkExpander *`}
        super GtkBin
 
-       new( lbl : String) is extern import String.to_cstring`{
-               return (GtkExpander *)gtk_expander_new( String_to_cstring( lbl ) );
+       new(lbl: String) import String.to_cstring `{
+               return (GtkExpander *)gtk_expander_new(String_to_cstring(lbl));
        `}
 
-       new with_mnemonic( lbl : String) is extern import String.to_cstring`{
-               return (GtkExpander *)gtk_expander_new_with_mnemonic(String_to_cstring( lbl ));
+       new with_mnemonic(lbl: String) import String.to_cstring `{
+               return (GtkExpander *)gtk_expander_new_with_mnemonic(String_to_cstring(lbl));
        `}
 
-       fun expanded : Bool is extern `{
-               return gtk_expander_get_expanded( recv );
+       fun expanded: Bool `{
+               return gtk_expander_get_expanded(recv);
        `}
 
-       fun expanded=( is_expanded : Bool ) is extern `{
-               gtk_expander_set_expanded( recv, is_expanded );
+       fun expanded=(is_expanded: Bool) `{
+               gtk_expander_set_expanded(recv, is_expanded);
        `}
 
-       fun spacing : Int is extern `{
-               return gtk_expander_get_spacing( recv );
+       fun spacing: Int `{
+               return gtk_expander_get_spacing(recv);
        `}
 
-       fun spacing=( pixels : Int ) is extern `{
-               gtk_expander_set_spacing( recv, pixels );
+       fun spacing=(pixels: Int) `{
+               gtk_expander_set_spacing(recv, pixels);
        `}
 
-       fun label_text : String is extern `{
-               return NativeString_to_s( (char *)gtk_expander_get_label( recv ) );
+       fun label_text: String `{
+               return NativeString_to_s((char *)gtk_expander_get_label(recv));
        `}
 
-       fun label_text=( lbl : String ) is extern import String.to_cstring`{
-               gtk_expander_set_label( recv, String_to_cstring( lbl ) );
+       fun label_text=(lbl: String) import String.to_cstring `{
+               gtk_expander_set_label(recv, String_to_cstring(lbl));
        `}
 
-       fun use_underline : Bool is extern `{
-               return gtk_expander_get_use_underline( recv );
+       fun use_underline: Bool `{
+               return gtk_expander_get_use_underline(recv);
        `}
 
-       fun use_underline=( used : Bool) is extern `{
-               gtk_expander_set_use_underline( recv, used );
+       fun use_underline=(used: Bool) `{
+               gtk_expander_set_use_underline(recv, used);
        `}
 
-       fun use_markup : Bool is extern `{
-               return gtk_expander_get_use_markup( recv );
+       fun use_markup: Bool `{
+               return gtk_expander_get_use_markup(recv);
        `}
 
-       fun use_markup=( used : Bool) is extern `{
-                gtk_expander_set_use_markup( recv, used );
+       fun use_markup=(used: Bool) `{
+                gtk_expander_set_use_markup(recv, used);
        `}
 
-       fun label_widget : GtkWidget is extern `{
-               return gtk_expander_get_label_widget( recv );
+       fun label_widget: GtkWidget `{
+               return gtk_expander_get_label_widget(recv);
        `}
 
-       fun label_widget=( widget : GtkWidget ) is extern `{
-               gtk_expander_set_label_widget( recv, widget );
+       fun label_widget=(widget: GtkWidget) `{
+               gtk_expander_set_label_widget(recv, widget);
        `}
 
-       fun label_fill : Bool is extern `{
-               return gtk_expander_get_label_fill( recv );
+       fun label_fill: Bool `{
+               return gtk_expander_get_label_fill(recv);
        `}
 
-       fun label_fill=( fill : Bool ) is extern `{
-               gtk_expander_set_label_fill( recv, fill );
+       fun label_fill=(fill: Bool) `{
+               gtk_expander_set_label_fill(recv, fill);
        `}
 
-       fun resize_toplevel : Bool is extern `{
-               return gtk_expander_get_resize_toplevel( recv );
+       fun resize_toplevel: Bool `{
+               return gtk_expander_get_resize_toplevel(recv);
        `}
 
-       fun resize_toplevel=( resize : Bool ) is extern `{
-               gtk_expander_set_resize_toplevel( recv, resize );
+       fun resize_toplevel=(resize: Bool) `{
+               gtk_expander_set_resize_toplevel(recv, resize);
        `}
 
 end
 
-#An abstract class for laying out GtkCellRenderers
-#@https://developer.gnome.org/gtk3/stable/GtkCellArea.html
+# An abstract class for laying out GtkCellRenderers
+# See: https://developer.gnome.org/gtk3/stable/GtkCellArea.html
 extern class GtkComboBox `{GtkComboBox *`}
        super GtkBin
 
-       new is extern `{
-               return (GtkComboBox *)gtk_combo_box_new( );
+       new `{
+               return (GtkComboBox *)gtk_combo_box_new();
        `}
 
-       new with_entry is extern `{
-               return (GtkComboBox *)gtk_combo_box_new_with_entry( );
+       new with_entry `{
+               return (GtkComboBox *)gtk_combo_box_new_with_entry();
        `}
 
-       new with_model( model : GtkTreeModel ) is extern `{
-               return (GtkComboBox *)gtk_combo_box_new_with_model( model );
+       new with_model(model: GtkTreeModel) `{
+               return (GtkComboBox *)gtk_combo_box_new_with_model(model);
        `}
 
-       new with_model_and_entry( model : GtkTreeModel ) is extern `{
-               return (GtkComboBox *)gtk_combo_box_new_with_model_and_entry( model );
+       new with_model_and_entry(model: GtkTreeModel) `{
+               return (GtkComboBox *)gtk_combo_box_new_with_model_and_entry(model);
        `}
 
-       new with_area( area : GtkCellArea ) is extern `{
-               return (GtkComboBox *)gtk_combo_box_new_with_area( area );
+       new with_area(area: GtkCellArea) `{
+               return (GtkComboBox *)gtk_combo_box_new_with_area(area);
        `}
 
-       new with_area_and_entry( area : GtkCellArea ) is extern `{
-               return (GtkComboBox *)gtk_combo_box_new_with_area_and_entry( area );
+       new with_area_and_entry(area: GtkCellArea) `{
+               return (GtkComboBox *)gtk_combo_box_new_with_area_and_entry(area);
        `}
 
-       fun wrap_width : Int is extern `{
-               return gtk_combo_box_get_wrap_width( recv );
+       fun wrap_width: Int `{
+               return gtk_combo_box_get_wrap_width(recv);
        `}
 
-       fun wrap_width=( width : Int ) is extern `{
-               gtk_combo_box_set_wrap_width( recv, width );
+       fun wrap_width=(width: Int) `{
+               gtk_combo_box_set_wrap_width(recv, width);
        `}
 
-       fun row_span_col : Int is extern `{
-               return gtk_combo_box_get_row_span_column( recv );
+       fun row_span_col: Int `{
+               return gtk_combo_box_get_row_span_column(recv);
        `}
 
-       fun row_span_col=( row_span : Int ) is extern `{
-               gtk_combo_box_set_row_span_column( recv, row_span );
+       fun row_span_col=(row_span: Int) `{
+               gtk_combo_box_set_row_span_column(recv, row_span);
        `}
 
-       fun col_span_col : Int is extern `{
-               return gtk_combo_box_get_column_span_column( recv );
+       fun col_span_col: Int `{
+               return gtk_combo_box_get_column_span_column(recv);
        `}
 
-       fun col_span_col=( col_span : Int ) is extern `{
-               gtk_combo_box_set_column_span_column( recv, col_span );
+       fun col_span_col=(col_span: Int) `{
+               gtk_combo_box_set_column_span_column(recv, col_span);
        `}
 
-       fun active_item : Int is extern `{
-               return gtk_combo_box_get_active( recv );
+       fun active_item: Int `{
+               return gtk_combo_box_get_active(recv);
        `}
 
-       fun active_item=( active : Int ) is extern `{
-               gtk_combo_box_set_active( recv, active );
+       fun active_item=(active: Int) `{
+               gtk_combo_box_set_active(recv, active);
        `}
 
-       #fun active_iter : GtkTreeIter is extern `{
-       #`}
-       #
-       #fun active_iter=( active : Bool ) is extern `{
-       #`}
-
-       fun column_id : Int is extern `{
-               return gtk_combo_box_get_id_column( recv );
+       fun column_id: Int `{
+               return gtk_combo_box_get_id_column(recv);
        `}
 
-       fun column_id=( id_column : Int ) is extern `{
-               gtk_combo_box_set_id_column( recv, id_column );
+       fun column_id=(id_column: Int) `{
+               gtk_combo_box_set_id_column(recv, id_column);
        `}
 
-       fun active_id : String is extern `{
-               return NativeString_to_s( (char *)gtk_combo_box_get_active_id( recv ) );
+       fun active_id: String `{
+               return NativeString_to_s((char *)gtk_combo_box_get_active_id(recv));
        `}
 
-       fun active_id=( id_active : String ) is extern import String.to_cstring`{
-               gtk_combo_box_set_active_id( recv, String_to_cstring( id_active ) );
+       fun active_id=(id_active: String) import String.to_cstring `{
+               gtk_combo_box_set_active_id(recv, String_to_cstring(id_active));
        `}
 
-       fun model : GtkTreeModel is extern `{
-               return gtk_combo_box_get_model( recv );
+       fun model: GtkTreeModel `{
+               return gtk_combo_box_get_model(recv);
        `}
 
-       fun model=( model : GtkTreeModel ) is extern `{
-               gtk_combo_box_set_model( recv, model );
+       fun model=(model: GtkTreeModel) `{
+               gtk_combo_box_set_model(recv, model);
        `}
 
-       fun popup is extern `{
-               gtk_combo_box_popup( recv );
+       fun popup `{
+               gtk_combo_box_popup(recv);
        `}
 
-       fun popdown is extern `{
-               gtk_combo_box_popdown( recv );
+       fun popdown `{
+               gtk_combo_box_popdown(recv);
        `}
 
-       fun title : String is extern`{
-               return NativeString_to_s( (char *)gtk_combo_box_get_title( recv ) );
+       fun title: String `{
+               return NativeString_to_s((char *)gtk_combo_box_get_title(recv));
        `}
 
-       fun title=( t : String ) is extern import String.to_cstring `{
-               gtk_combo_box_set_title( recv, String_to_cstring( t ) );
+       fun title=(t: String) import String.to_cstring `{
+               gtk_combo_box_set_title(recv, String_to_cstring(t));
        `}
 
-       fun has_entry : Bool is extern `{
-               return gtk_combo_box_get_has_entry( recv );
+       fun has_entry: Bool `{
+               return gtk_combo_box_get_has_entry(recv);
        `}
 
-       fun with_fixed : Bool is extern `{
-               return gtk_combo_box_get_popup_fixed_width( recv );
+       fun with_fixed: Bool `{
+               return gtk_combo_box_get_popup_fixed_width(recv);
        `}
 
-       fun with_fixed=( fixed : Bool ) is extern `{
-               gtk_combo_box_set_popup_fixed_width( recv, fixed );
+       fun with_fixed=(fixed: Bool) `{
+               gtk_combo_box_set_popup_fixed_width(recv, fixed);
        `}
 end
 
-#Show a spinner animation
-#@https://developer.gnome.org/gtk3/3.2/GtkSpinner.html
+# Show a spinner animation
+# See: https://developer.gnome.org/gtk3/3.2/GtkSpinner.html
 extern class GtkSpinner `{GtkSpinner *`}
        super GtkWidget
 
-       new is extern `{
+       new `{
                 return (GtkSpinner *)gtk_spinner_new();
        `}
 
-       fun start is extern `{
-               return gtk_spinner_start( recv );
+       fun start `{
+               return gtk_spinner_start(recv);
        `}
 
-       fun stop is extern `{
-               return gtk_spinner_stop( recv );
+       fun stop `{
+               return gtk_spinner_stop(recv);
        `}
 end
 
-#A "light switch" style toggle
-#@https://developer.gnome.org/gtk3/3.2/GtkSwitch.html
+# A "light switch" style toggle
+# See: https://developer.gnome.org/gtk3/3.2/GtkSwitch.html
 extern class GtkSwitch `{GtkSwitch *`}
        super GtkWidget
 
-       new is extern `{
+       new `{
                 return (GtkSwitch *)gtk_switch_new();
        `}
 
-       fun active : Bool is extern `{
-               return gtk_switch_get_active( recv );
+       fun active: Bool `{
+               return gtk_switch_get_active(recv);
        `}
 
-       fun active=( is_active : Bool ) is extern `{
-               return gtk_switch_set_active( recv, is_active );
+       fun active=(is_active: Bool) `{
+               return gtk_switch_set_active(recv, is_active);
        `}
 end
 
-
-#A widget which controls the alignment and size of its child
-#https://developer.gnome.org/gtk3/stable/GtkAlignment.html
+# A widget which controls the alignment and size of its child
+# https://developer.gnome.org/gtk3/stable/GtkAlignment.html
 extern class GtkAlignment `{GtkAlignment *`}
        super GtkBin
 
-       new ( xalign : Float, yalign : Float, xscale : Float, yscale : Float ) is extern `{
-               return (GtkAlignment *)gtk_alignment_new( xalign, yalign, xscale, yscale );
+       new (xalign: Float, yalign: Float, xscale: Float, yscale: Float) `{
+               return (GtkAlignment *)gtk_alignment_new(xalign, yalign, xscale, yscale);
        `}
 
-       fun set ( xalign : Float, yalign : Float, xscale : Float, yscale : Float ) is extern `{
-               gtk_alignment_set( recv, xalign, yalign, xscale, yscale );
+       fun set (xalign: Float, yalign: Float, xscale: Float, yscale: Float) `{
+               gtk_alignment_set(recv, xalign, yalign, xscale, yscale);
        `}
 
-       #get_padding
-       #set_padding
 end
 
-#A representation of an adjustable bounded value
-#@https://developer.gnome.org/gtk3/stable/GtkAdjustment.html#GtkAdjustment.description
+# A representation of an adjustable bounded value
+# See: https://developer.gnome.org/gtk3/stable/GtkAdjustment.html#GtkAdjustment.description
 extern class GtkAdjustment `{GtkAdjustment *`}
-
 end
 
 extern class GdkColor `{GdkColor*`}
-       new is extern `{
-               GdkColor * col = malloc(sizeof(GdkColor));
-               /*gdk_color_parse( "red", recv );*/
-               gdk_color_parse( "red", col);
-               return col;
+       new (color_name: String) import String.to_cstring `{
+               GdkColor *color = malloc(sizeof(GdkColor));
+               gdk_color_parse(String_to_cstring(color_name), color);
+               return color;
        `}
 end
 
 extern class GdkRGBA `{GdkRGBA*`}
-       new is extern `{
-       `}
 end
 
index 079eb71..f97ce3a 100644 (file)
@@ -23,299 +23,315 @@ in "C Header" `{
        #include <gtk/gtk.h>
 `}
 
-#Create popup windows
-#@https://developer.gnome.org/gtk3/stable/GtkDialog.html
+# Create popup windows
+# See: https://developer.gnome.org/gtk3/stable/GtkDialog.html
 extern class GtkDialog `{GtkDialog *`}
        super GtkWindow
 
-       new is extern `{
-               return (GtkDialog *)gtk_dialog_new( );
+       new `{
+               return (GtkDialog *)gtk_dialog_new();
        `}
 
-       new with_buttons( title : String, parent : GtkWindow, flags : GtkDialogFlags) is extern import String.to_cstring`{
-               return (GtkDialog *)gtk_dialog_new_with_buttons( String_to_cstring( title ), parent, flags, "", NULL );
+       new with_buttons(title: String, parent: GtkWindow, flags: GtkDialogFlags)
+       import String.to_cstring `{
+               return (GtkDialog *)gtk_dialog_new_with_buttons(
+                       String_to_cstring(title), parent, flags, "", NULL);
        `}
 
-       fun run is extern `{
-               gtk_dialog_run( recv );
+       fun run `{
+               gtk_dialog_run(recv);
        `}
-
 end
 
-#Display information about an application
-#@https://developer.gnome.org/gtk3/stable/GtkAboutDialog.html
+# Display information about an application
+# See: https://developer.gnome.org/gtk3/stable/GtkAboutDialog.html
 extern class GtkAboutDialog `{GtkAboutDialog *`}
        super GtkDialog
 
-       new is extern `{
-               return (GtkAboutDialog *)gtk_about_dialog_new( );
+       new `{
+               return (GtkAboutDialog *)gtk_about_dialog_new();
        `}
 
-       fun program_name : String import NativeString.to_s `{
-               return NativeString_to_s( (char *)gtk_about_dialog_get_program_name( recv ) );
+       fun program_name: String import NativeString.to_s `{
+               return NativeString_to_s((char *)gtk_about_dialog_get_program_name(recv));
        `}
 
-       fun program_name=( name : String ) is extern import String.to_cstring`{
-               gtk_about_dialog_set_program_name( recv, String_to_cstring( name ) );
+       fun program_name=(name: String) import String.to_cstring `{
+               gtk_about_dialog_set_program_name(recv, String_to_cstring(name));
        `}
 
-       fun version : String import NativeString.to_s `{
-               return NativeString_to_s( (char *)gtk_about_dialog_get_version( recv ) );
+       fun version: String import NativeString.to_s `{
+               return NativeString_to_s((char *)gtk_about_dialog_get_version(recv));
        `}
 
-       fun version=( v : String ) is extern import String.to_cstring`{
-               gtk_about_dialog_set_version( recv, String_to_cstring( v ) );
+       fun version=(v: String) import String.to_cstring `{
+               gtk_about_dialog_set_version(recv, String_to_cstring(v));
        `}
 
-       fun copyright : String import NativeString.to_s `{
-               return NativeString_to_s( (char *)gtk_about_dialog_get_copyright( recv ) );
+       fun copyright: String import NativeString.to_s `{
+               return NativeString_to_s((char *)gtk_about_dialog_get_copyright(recv));
        `}
 
-       fun copyright=( c : String ) is extern import String.to_cstring`{
-               gtk_about_dialog_set_copyright( recv, String_to_cstring( c ) );
+       fun copyright=(c: String) import String.to_cstring `{
+               gtk_about_dialog_set_copyright(recv, String_to_cstring(c));
        `}
 
-       fun comments : String import NativeString.to_s `{
-               return NativeString_to_s( (char *)gtk_about_dialog_get_comments( recv ) );
+       fun comments: String import NativeString.to_s `{
+               return NativeString_to_s((char *)gtk_about_dialog_get_comments(recv));
        `}
 
-       fun comments=( com : String ) is extern import String.to_cstring`{
-               gtk_about_dialog_set_comments( recv, String_to_cstring( com ) );
+       fun comments=(com: String) import String.to_cstring `{
+               gtk_about_dialog_set_comments(recv, String_to_cstring(com));
        `}
 
-       fun license : String import NativeString.to_s `{
-               return NativeString_to_s( (char *)gtk_about_dialog_get_license( recv ) );
+       fun license: String import NativeString.to_s `{
+               return NativeString_to_s((char *)gtk_about_dialog_get_license(recv));
        `}
 
-       fun license=( li : String ) is extern import String.to_cstring`{
-               gtk_about_dialog_set_license( recv, String_to_cstring( li ) );
+       fun license=(li: String) import String.to_cstring `{
+               gtk_about_dialog_set_license(recv, String_to_cstring(li));
        `}
 
-       #license_type
+       # license_type
 
-       fun website : String import NativeString.to_s `{
-               return NativeString_to_s( (char *)gtk_about_dialog_get_website( recv ) );
+       fun website: String import NativeString.to_s `{
+               return NativeString_to_s((char *)gtk_about_dialog_get_website(recv));
        `}
 
-       fun website=( link : String ) is extern import String.to_cstring`{
-               gtk_about_dialog_set_website( recv, String_to_cstring( link ) );
+       fun website=(link: String) import String.to_cstring `{
+               gtk_about_dialog_set_website(recv, String_to_cstring(link));
        `}
 
-       fun website_label : String import NativeString.to_s `{
-               return NativeString_to_s( (char *) gtk_about_dialog_get_website_label( recv ) );
+       fun website_label: String import NativeString.to_s `{
+               return NativeString_to_s((char *) gtk_about_dialog_get_website_label(recv));
        `}
 
-       fun website_label=( link_label : String ) is extern import String.to_cstring`{
-               gtk_about_dialog_set_website_label( recv, String_to_cstring( link_label ) );
+       fun website_label=(link_label: String) import String.to_cstring `{
+               gtk_about_dialog_set_website_label(recv, String_to_cstring(link_label));
        `}
 
-       #TODO
-       #fun authors : String is extern`{
-       #               return NativeString_to_s( gtk_about_dialog_get_authors( recv ) );
-       #`}
+       # TODO
+       # fun authors: String`{
+       #               return NativeString_to_s(gtk_about_dialog_get_authors(recv));
+       # `}
 
-       #TODO
-       #fun authors=( authors_list : String ) is extern import String.to_cstring`{
-       #       gtk_about_dialog_set_authors( recv, String_to_cstring( authors_list ) );
-       #`}
+       # TODO
+       # fun authors=(authors_list: String) import String.to_cstring`{
+       #       gtk_about_dialog_set_authors(recv, String_to_cstring(authors_list));
+       # `}
 
-       fun show_about_dialog(parent: GtkWindow, params: String) import String.to_cstring `{
+       fun show_about_dialog(parent: GtkWindow, params: String)
+       import String.to_cstring `{
                gtk_show_about_dialog(parent, String_to_cstring(params), NULL);
        `}
 end
 
-#An application chooser dialog
-#@https://developer.gnome.org/gtk3/stable/GtkAppChooserDialog.html
+# An application chooser dialog
+# See: https://developer.gnome.org/gtk3/stable/GtkAppChooserDialog.html
 extern class GtkAppChooserDialog `{GtkAppChooserDialog *`}
        super GtkDialog
 
-       #TODO - GFile
-       #new ( parent : GtkWindow, flags : GtkDialogFlags, file : GFile ) is extern `{
-       #       return (GtkAppChooserDialog *)gtk_app_chooser_dialog_new( parent, flags, file );
-       #`}
+       # TODO - GFile
+       # new (parent: GtkWindow, flags: GtkDialogFlags, file: GFile) `{
+       #       return (GtkAppChooserDialog *)gtk_app_chooser_dialog_new(parent, flags, file);
+       # `}
 
-       new for_content_type ( parent : GtkWindow, flags : GtkDialogFlags, content_type : String ) is extern  import String.to_cstring `{
-               return (GtkAppChooserDialog *)gtk_app_chooser_dialog_new_for_content_type( parent, flags,                                                                                                                                                                                       String_to_cstring( content_type ) );
+       new for_content_type (parent: GtkWindow, flags: GtkDialogFlags, content_type: String)
+       import String.to_cstring `{
+               return (GtkAppChooserDialog *)gtk_app_chooser_dialog_new_for_content_type(
+                       parent, flags, String_to_cstring(content_type));
        `}
 
-       fun widget : GtkWidget is extern `{ return gtk_app_chooser_dialog_get_widget( recv ); `}
+       fun widget: GtkWidget `{ return gtk_app_chooser_dialog_get_widget(recv); `}
 
-       fun heading : String import NativeString.to_s `{
-               return NativeString_to_s( (char *)gtk_app_chooser_dialog_get_heading( recv ) );
+       fun heading: String import NativeString.to_s `{
+               return NativeString_to_s((char *)gtk_app_chooser_dialog_get_heading(recv));
        `}
 
-       fun heading=( text : String ) is extern import String.to_cstring `{
-               gtk_app_chooser_dialog_set_heading( recv, String_to_cstring( text ) );
+       fun heading=(text: String) import String.to_cstring `{
+               gtk_app_chooser_dialog_set_heading(recv, String_to_cstring(text));
        `}
 
 end
 
-#A dialog for choosing colors
-#@https://developer.gnome.org/gtk3/stable/GtkColorChooserDialog.html
+# A dialog for choosing colors
+# See: https://developer.gnome.org/gtk3/stable/GtkColorChooserDialog.html
 extern class GtkColorChooserDialog `{GtkColorChooserDialog *`}
        super GtkDialog
 
-       new ( title : String, parent : GtkWindow ) is extern import String.to_cstring `{
-               return (GtkColorChooserDialog *)gtk_color_chooser_dialog_new( String_to_cstring( title ), parent );
+       new (title: String, parent: GtkWindow) import String.to_cstring `{
+               return (GtkColorChooserDialog *)gtk_color_chooser_dialog_new(
+                       String_to_cstring(title), parent);
        `}
 end
 
-#A file chooser dialog, suitable for "File/Open" or "File/Save" commands
-#@https://developer.gnome.org/gtk3/stable/GtkFileChooserDialog.html
+# A file chooser dialog, suitable for "File/Open" or "File/Save" commands
+# See: https://developer.gnome.org/gtk3/stable/GtkFileChooserDialog.html
 extern class GtkFileChooserDialog `{GtkFileChooserDialog *`}
        super GtkDialog
 
-       new ( title : String, parent : GtkWindow, action : GtkFileChooserAction ) is extern import String.to_cstring `{
-               return (GtkFileChooserDialog *)gtk_file_chooser_dialog_new( String_to_cstring( title ), parent, action, "", NULL );
+       new (title: String, parent: GtkWindow, action: GtkFileChooserAction)
+       import String.to_cstring `{
+               return (GtkFileChooserDialog *)gtk_file_chooser_dialog_new(
+                       String_to_cstring(title), parent, action, "", NULL);
        `}
 end
 
-#enum GtkFileChooserAction
-#Describes whether a GtkFileChooser is being used to open existing files or to save to a possibly new file.
-#@https://developer.gnome.org/gtk3/stable/GtkFileChooser.html#GtkFileChooserAction
+# enum GtkFileChooserAction
+#
+# Describes whether a GtkFileChooser is being used to open existing files or to save to a possibly new file.
+# See: https://developer.gnome.org/gtk3/stable/GtkFileChooser.html#GtkFileChooserAction
 extern class GtkFileChooserAction `{GtkFileChooserAction`}
-       #Indicates open mode. The file chooser will only let the user pick an existing file.
+       # Open file mode
+       #
+       # The file chooser will only let the user pick an existing file.
        new open `{ return GTK_FILE_CHOOSER_ACTION_OPEN; `}
 
-       #Indicates save mode. The file chooser will let the user pick an existing file, or type in a new filename.
+       # Save file mode
+       #
+       # The file chooser will let the user pick an existing file, or type in a new filename.
        new save `{ return GTK_FILE_CHOOSER_ACTION_SAVE; `}
 
-       #Indicates an Open mode for selecting folders. The file chooser will let the user pick an existing folder.
+       # Select folder mode
+       #
+       # The file chooser will let the user pick an existing folder.
        new select_folder `{ return GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER; `}
 
-       #Indicates a mode for creating a new folder. The file chooser will let the user name an existing or new folder.
+       # Create a new folder mode
+       #
+       # The file chooser will let the user name an existing or new folder.
        new create_folder `{ return GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER; `}
 end
 
-#A dialog for selecting fonts
-#@https://developer.gnome.org/gtk3/stable/GtkFontChooserDialog.html
+# A dialog for selecting fonts
+# See: https://developer.gnome.org/gtk3/stable/GtkFontChooserDialog.html
 extern class GtkFontChooserDialog `{GtkFontChooserDialog *`}
        super GtkDialog
 
-       new ( title : String, parent : GtkWindow ) is extern `{
-               return (GtkFontChooserDialog *)gtk_font_chooser_dialog_new( String_to_cstring( title ), parent );
+       new (title: String, parent: GtkWindow) `{
+               return (GtkFontChooserDialog *)gtk_font_chooser_dialog_new(String_to_cstring(title), parent);
        `}
 end
 
-#A convenient message window
-#@https://developer.gnome.org/gtk3/stable/GtkMessageDialog.html
+# A convenient message window
+# See: https://developer.gnome.org/gtk3/stable/GtkMessageDialog.html
 extern class GtkMessageDialog `{GtkMessageDialog *`}
        super GtkDialog
 
-       new ( parent : GtkWindow, flags : GtkDialogFlags, msg_type : GtkMessageType, btn_type : GtkButtonsType, format : String ) is extern import String.to_cstring `{
-               return (GtkMessageDialog *)gtk_message_dialog_new( parent, flags, msg_type, btn_type, String_to_cstring( format ), NULL );
+       new (parent: GtkWindow, flags: GtkDialogFlags, msg_type: GtkMessageType, btn_type: GtkButtonsType, format: String) import String.to_cstring `{
+               return (GtkMessageDialog *)gtk_message_dialog_new(parent, flags, msg_type, btn_type, String_to_cstring(format), NULL);
        `}
 end
 
-#enum GtkButtonsType
-#Prebuilt sets of buttons for the dialog. If none of these choices are appropriate, simply use GTK_BUTTONS_NONE then call gtk_dialog_add_buttons().
-#@https://developer.gnome.org/gtk3/stable/GtkMessageDialog.html#GtkButtonsType
+# enum GtkButtonsType
+# Prebuilt sets of buttons for the dialog. If none of these choices are appropriate, simply use GTK_BUTTONS_NONE then call gtk_dialog_add_buttons().
+# See: https://developer.gnome.org/gtk3/stable/GtkMessageDialog.html#GtkButtonsType
 extern class GtkButtonsType `{GtkButtonsType`}
-       #No buttons at all
+       # No buttons at all
        new none `{ return GTK_BUTTONS_NONE; `}
 
-       #An OK button.
+       # An OK button.
        new ok `{ return GTK_BUTTONS_OK; `}
 
-       #A Close button.
+       # A Close button.
        new close `{ return GTK_BUTTONS_CLOSE; `}
 
-       #A Cancel button.
+       # A Cancel button.
        new cancel `{ return GTK_BUTTONS_CANCEL; `}
 
-       #Yes and No buttons.
+       # Yes and No buttons.
        new yes_no `{ return GTK_BUTTONS_YES_NO; `}
 
-       #OK and Cancel buttons.
+       # OK and Cancel buttons.
        new ok_cancel `{ return GTK_BUTTONS_OK_CANCEL; `}
 end
 
-#enum GtkMessageType
-#The type of message being displayed in the dialog.
-#@https://developer.gnome.org/gtk3/stable/GtkMessageDialog.html#GtkMessageType
+# enum GtkMessageType
+# The type of message being displayed in the dialog.
+# See: https://developer.gnome.org/gtk3/stable/GtkMessageDialog.html#GtkMessageType
 extern class GtkMessageType `{GtkMessageType`}
-       #Informational message
+       # Informational message
        new info `{ return GTK_MESSAGE_INFO; `}
 
-       #Non-fatal warning message.
+       # Non-fatal warning message.
        new warning `{ return GTK_MESSAGE_WARNING; `}
 
-       #Question requiring a choice.
+       # Question requiring a choice.
        new question `{ return GTK_MESSAGE_QUESTION; `}
 
-       #Fatal error message.
+       # Fatal error message.
        new error `{ return GTK_MESSAGE_ERROR; `}
 
-       #None of the above, doesn't get an icon.
+       # None of the above, doesn't get an icon.
        new other `{ return GTK_MESSAGE_OTHER; `}
 end
 
-#A page setup dialog
-#@https://developer.gnome.org/gtk3/stable/GtkPageSetupUnixDialog.html
-#extern class GtkPageSetupUnixDialog `{GtkPageSetupUnixDialog *`}
+# A page setup dialog
+# See: https://developer.gnome.org/gtk3/stable/GtkPageSetupUnixDialog.html
+# extern class GtkPageSetupUnixDialog `{GtkPageSetupUnixDialog *`}
 #      super GtkDialog
 #
-#end
+# end
 
-#A print dialog
-#@https://developer.gnome.org/gtk3/stable/GtkPrintUnixDialog.html
-#extern class GtkPrintUnixDialog `{GtkPrintUnixDialog *`}
+# A print dialog
+# See: https://developer.gnome.org/gtk3/stable/GtkPrintUnixDialog.html
+# extern class GtkPrintUnixDialog `{GtkPrintUnixDialog *`}
 #      super GtkDialog
 #
-#end
+# end
 
-#Displays recently used files in a dialog
-#@https://developer.gnome.org/gtk3/stable/GtkRecentChooserDialog.html
+# Displays recently used files in a dialog
+# See: https://developer.gnome.org/gtk3/stable/GtkRecentChooserDialog.html
 extern class GtkRecentChooserDialog `{GtkRecentChooserDialog *`}
        super GtkDialog
 
 end
 
 
-#enum GtkDialogFlags
-#Flags used to influence dialog construction.
-#@https://developer.gnome.org/gtk3/stable/GtkDialog.html#GtkDialogFlags
+# enum GtkDialogFlags
+# Flags used to influence dialog construction.
+# See: https://developer.gnome.org/gtk3/stable/GtkDialog.html#GtkDialogFlags
 extern class GtkDialogFlags `{GtkDialogFlags`}
-       #Make the constructed dialog modal.
+       # Make the constructed dialog modal.
        new modal `{ return GTK_DIALOG_MODAL; `}
 
-       #Destroy the dialog when its parent is destroyed.
+       # Destroy the dialog when its parent is destroyed.
        new destroy_with_parent `{ return GTK_DIALOG_DESTROY_WITH_PARENT; `}
 end
 
-#enum GtkResponseType
-#Predefined values for use as response ids in gtk_dialog_add_button().
-#@https://developer.gnome.org/gtk3/stable/GtkDialog.html#GtkResponseType
+# enum GtkResponseType
+# Predefined values for use as response ids in gtk_dialog_add_button().
+# See: https://developer.gnome.org/gtk3/stable/GtkDialog.html#GtkResponseType
 extern class GtkResponseType `{GtkResponseType`}
-       #Returned if an action widget has no response id, or if the dialog gets programmatically hidden or destroyed.
+       # Returned if an action widget has no response id, or if the dialog gets programmatically hidden or destroyed.
        new none `{ return GTK_RESPONSE_NONE; `}
 
-       #Generic response id, not used by GTK+ dialogs.
+       # Generic response id, not used by GTK+ dialogs.
        new reject `{ return GTK_RESPONSE_REJECT; `}
 
-       #Generic response id, not used by GTK+ dialogs
+       # Generic response id, not used by GTK+ dialogs
        new accept `{ return GTK_RESPONSE_ACCEPT; `}
 
-       #Returned if the dialog is deleted
+       # Returned if the dialog is deleted
        new delete_event `{ return GTK_RESPONSE_DELETE_EVENT; `}
-       #Returned by OK buttons in GTK+ dialogs.
+       # Returned by OK buttons in GTK+ dialogs.
        new ok `{ return GTK_RESPONSE_OK; `}
 
-       #Returned by Cancel buttons in GTK+ dialogs.
+       # Returned by Cancel buttons in GTK+ dialogs.
        new cancel `{ return GTK_RESPONSE_CANCEL; `}
 
-       #Returned by OK Close in GTK+ dialogs.
+       # Returned by OK Close in GTK+ dialogs.
        new close `{ return GTK_RESPONSE_CLOSE; `}
 
-       #Returned by OK Yes in GTK+ dialogs.
+       # Returned by OK Yes in GTK+ dialogs.
        new yes `{ return GTK_RESPONSE_YES; `}
 
-       #Returned by OK No in GTK+ dialogs.
+       # Returned by OK No in GTK+ dialogs.
        new no `{ return GTK_RESPONSE_NO; `}
 
-       #Returned by OK Apply in GTK+ dialogs.
+       # Returned by OK Apply in GTK+ dialogs.
        new apply `{ return GTK_RESPONSE_APPLY; `}
 
-       #Returned by OK Help in GTK+ dialogs.
+       # Returned by OK Help in GTK+ dialogs.
        new help `{ return GTK_RESPONSE_HELP; `}
 end
index 05d5ace..2a98464 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-module gtk_widgets_ext is pkgconfig("gtk+-3.0")
+module gtk_widgets_ext is pkgconfig "gtk+-3.0"
 
 import gtk_core
 
-#Displays a calendar and allows the user to select a date
-#@https://developer.gnome.org/gtk3/3.2/GtkCalendar.html
+# Displays a calendar and allows the user to select a date
+# See: https://developer.gnome.org/gtk3/3.2/GtkCalendar.html
 extern class GtkCalendar `{GtkCalendar *`}
        super GtkWidget
 
-       new is extern `{
+       new `{
                 return (GtkCalendar *)gtk_calendar_new();
        `}
 
-       fun month=( month : Int, year : Int ) is extern `{
-               gtk_calendar_select_month( recv, month, year );
+       fun month=(month: Int, year: Int) `{
+               gtk_calendar_select_month(recv, month, year);
        `}
 
-       fun day=( day : Int ) is extern `{
-               gtk_calendar_select_day( recv, day );
+       fun day=(day: Int) `{
+               gtk_calendar_select_day(recv, day);
        `}
 
-       fun mark_day( day : Int ) is extern `{
-               gtk_calendar_mark_day( recv, day );
+       fun mark_day(day: Int) `{
+               gtk_calendar_mark_day(recv, day);
        `}
 
-       fun unmark_day( day : Int ) is extern `{
-               gtk_calendar_unmark_day( recv, day );
+       fun unmark_day(day: Int) `{
+               gtk_calendar_unmark_day(recv, day);
        `}
 
-       fun is_marked( day : Int ): Bool is extern `{
-               return gtk_calendar_get_day_is_marked( recv, day );
+       fun is_marked(day: Int): Bool `{
+               return gtk_calendar_get_day_is_marked(recv, day);
        `}
 
-   fun clear_marks is extern `{
-               gtk_calendar_clear_marks( recv );
+   fun clear_marks `{
+               gtk_calendar_clear_marks(recv);
        `}
 
-       fun display_options : GtkCalendarDisplayOptions is extern `{
-               return gtk_calendar_get_display_options( recv );
+       fun display_options: GtkCalendarDisplayOptions `{
+               return gtk_calendar_get_display_options(recv);
        `}
 
 
-       fun display_options=( options : GtkCalendarDisplayOptions) is extern `{
-               gtk_calendar_set_display_options( recv, options );
+       fun display_options=(options: GtkCalendarDisplayOptions) `{
+               gtk_calendar_set_display_options(recv, options);
        `}
 
-       #date en nit...
+       # date en nit...
        fun date: String is abstract
 end
 
-#enum GtkCalendarDisplayOptions
-#@https://developer.gnome.org/gtk3/3.2/GtkCalendar.html#GtkCalendarDisplayOptions
+# enum GtkCalendarDisplayOptions
+# See: https://developer.gnome.org/gtk3/3.2/GtkCalendar.html#GtkCalendarDisplayOptions
 extern class GtkCalendarDisplayOptions `{GtkCalendarDisplayOptions`}
        new show_heading `{ return GTK_CALENDAR_SHOW_HEADING; `}
        new show_day_names `{ return GTK_CALENDAR_SHOW_DAY_NAMES; `}
@@ -75,68 +75,68 @@ extern class GtkCalendarDisplayOptions `{GtkCalendarDisplayOptions`}
        new show_details `{ return GTK_CALENDAR_SHOW_DETAILS; `}
 end
 
-#A separator widget
-#@https://developer.gnome.org/gtk3/stable/GtkSeparator.html
+# A separator widget
+# See: https://developer.gnome.org/gtk3/stable/GtkSeparator.html
 extern class GtkSeparator `{GtkSeparator *`}
        super GtkWidget
 
-       new ( orientation : GtkOrientation ) is extern `{
-                return (GtkSeparator *)gtk_separator_new( orientation );
+       new (orientation: GtkOrientation) `{
+                return (GtkSeparator *)gtk_separator_new(orientation);
        `}
 
 end
 
-#A widget which indicates progress visually
-#@https://developer.gnome.org/gtk3/3.2/GtkProgressBar.html
+# A widget which indicates progress visually
+# See: https://developer.gnome.org/gtk3/3.2/GtkProgressBar.html
 extern class GtkProgressBar `{GtkProgressBar *`}
        super GtkWidget
 
-       new is extern `{
+       new `{
                 return (GtkProgressBar *)gtk_progress_bar_new();
        `}
 
-       fun pulse is extern `{
-               gtk_progress_bar_pulse( recv );
+       fun pulse `{
+               gtk_progress_bar_pulse(recv);
        `}
 
-       fun pulse_step : Float is extern `{
-               return gtk_progress_bar_get_pulse_step( recv );
+       fun pulse_step: Float `{
+               return gtk_progress_bar_get_pulse_step(recv);
        `}
 
-       fun pulse_step=( step : Float ) is extern `{
-               gtk_progress_bar_set_pulse_step( recv, step);
+       fun pulse_step=(step: Float) `{
+               gtk_progress_bar_set_pulse_step(recv, step);
        `}
 
-       fun fraction : Float is extern `{
-               return gtk_progress_bar_get_fraction( recv );
+       fun fraction: Float `{
+               return gtk_progress_bar_get_fraction(recv);
        `}
 
-       fun fraction=( fraction : Float) is extern `{
-               gtk_progress_bar_set_fraction( recv, fraction );
+       fun fraction=(fraction: Float) `{
+               gtk_progress_bar_set_fraction(recv, fraction);
        `}
 
-       fun inverted : Bool is extern `{
-               return gtk_progress_bar_get_inverted( recv );
+       fun inverted: Bool `{
+               return gtk_progress_bar_get_inverted(recv);
        `}
 
-       fun inverted=( is_inverted : Bool) is extern `{
-               gtk_progress_bar_set_inverted( recv, is_inverted );
+       fun inverted=(is_inverted: Bool) `{
+               gtk_progress_bar_set_inverted(recv, is_inverted);
        `}
 
-       fun show_text : Bool is extern `{
-               return gtk_progress_bar_get_show_text( recv );
+       fun show_text: Bool `{
+               return gtk_progress_bar_get_show_text(recv);
        `}
 
-       fun show_text=( show : Bool) is extern `{
-               gtk_progress_bar_set_show_text( recv, show );
+       fun show_text=(show: Bool) `{
+               gtk_progress_bar_set_show_text(recv, show);
        `}
 
-       fun text : String is extern import NativeString.to_s `{
-               return NativeString_to_s( (char *)gtk_progress_bar_get_text( recv ) );
+       fun text: String import NativeString.to_s `{
+               return NativeString_to_s((char *)gtk_progress_bar_get_text(recv));
        `}
 
-       fun text=( value : String) is extern import String.to_cstring`{
-               gtk_progress_bar_set_text( recv, String_to_cstring( value ) );
+       fun text=(value: String) import String.to_cstring `{
+               gtk_progress_bar_set_text(recv, String_to_cstring(value));
        `}
 
        fun ellipsize is abstract
@@ -145,116 +145,104 @@ end
 
 extern class GtkColorSelectionDialog
        super GtkWidget
-       new ( title : String, parent : GtkWindow ) is extern  import String.to_cstring `{
-                return gtk_color_chooser_dialog_new( String_to_cstring( title ), parent );
+       new (title: String, parent: GtkWindow)  import String.to_cstring `{
+                return gtk_color_chooser_dialog_new(String_to_cstring(title), parent);
        `}
 
-       #fun color_selection :  is extern `{
-       #       return gtk_color_selection_dialog_get_color_selection( GTK_COLOR_SELECTION_DIALOG( recv ) );
-       #`}
+       # fun color_selection:  `{
+       #       return gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(recv));
+       # `}
 
-       #fun color : Float is extern `{
-       #       return gtk_color_selection_dialog_get_color_selection( GTK_COLOR_SELECTION_DIALOG( recv ) );
-       #`}
+       # fun color: Float `{
+       #       return gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(recv));
+       # `}
 end
 
-#Retrieve an integer or floating-point number from the user
-#@https://developer.gnome.org/gtk3/3.2/GtkSpinButton.html
+# Retrieve an integer or floating-point number from the user
+# See: https://developer.gnome.org/gtk3/3.2/GtkSpinButton.html
 extern class GtkSpinButton `{GtkSpinButton *`}
        super GtkEntry
 
-       new ( adjustment : GtkAdjustment, climb_rate : Float, digits : Int )is extern `{
-               return (GtkSpinButton *)gtk_spin_button_new( adjustment, climb_rate, digits );
+       new (adjustment: GtkAdjustment, climb_rate: Float, digits: Int)is extern `{
+               return (GtkSpinButton *)gtk_spin_button_new(adjustment, climb_rate, digits);
        `}
 
-       new with_range( min : Float, max : Float, step : Float )is extern `{
-               return (GtkSpinButton *)gtk_spin_button_new_with_range( min, max, step );
+       new with_range(min: Float, max: Float, step: Float)is extern `{
+               return (GtkSpinButton *)gtk_spin_button_new_with_range(min, max, step);
        `}
 
-       fun configure ( adjustment : GtkAdjustment, climb_rate : Float, digits : Int ) is extern `{
-               gtk_spin_button_configure( recv, adjustment, climb_rate, digits );
+       fun configure (adjustment: GtkAdjustment, climb_rate: Float, digits: Int) `{
+               gtk_spin_button_configure(recv, adjustment, climb_rate, digits);
        `}
 
-       fun adjustment : GtkAdjustment is extern `{
-               return gtk_spin_button_get_adjustment( recv );
+       fun adjustment: GtkAdjustment `{
+               return gtk_spin_button_get_adjustment(recv);
        `}
 
-       fun adjustment=( value : GtkAdjustment ) is extern `{
-               gtk_spin_button_set_adjustment( recv, value );
+       fun adjustment=(value: GtkAdjustment) `{
+               gtk_spin_button_set_adjustment(recv, value);
        `}
 
-       fun digits : Int is extern `{
-               return gtk_spin_button_get_digits( recv );
+       fun digits: Int `{
+               return gtk_spin_button_get_digits(recv);
        `}
 
-       fun digits=( nb_digits : Int ) is extern `{
-               gtk_spin_button_set_digits( recv, nb_digits );
+       fun digits=(nb_digits: Int) `{
+               gtk_spin_button_set_digits(recv, nb_digits);
        `}
 
-       fun value : Float is extern `{
-               return gtk_spin_button_get_value( recv );
+       fun value: Float `{
+               return gtk_spin_button_get_value(recv);
        `}
 
-       fun val=( val : Float ) is extern `{
-               gtk_spin_button_set_value( recv, val );
+       fun val=(val: Float) `{
+               gtk_spin_button_set_value(recv, val);
        `}
 
-       fun spin( direction : GtkSpinType, increment : Float ) is extern`{
-               gtk_spin_button_spin( recv, direction, increment );
+       fun spin(direction: GtkSpinType, increment: Float)`{
+               gtk_spin_button_spin(recv, direction, increment);
        `}
 end
 
-#enum GtkSpinType
-#The values of the GtkSpinType enumeration are used to specify the change to make in gtk_spin_button_spin().
-#@https://developer.gnome.org/gtk3/stable/GtkSpinButton.html#GtkSpinType
+# enum GtkSpinType
+# The values of the GtkSpinType enumeration are used to specify the change to make in gtk_spin_button_spin().
+# See: https://developer.gnome.org/gtk3/stable/GtkSpinButton.html#GtkSpinType
 extern class GtkSpinType `{GtkSpinType`}
-       #Increment by the adjustments step increment.
+       # Increment by the adjustments step increment.
        new step_forward `{ return GTK_SPIN_STEP_FORWARD; `}
 
-       #Decrement by the adjustments step increment.
+       # Decrement by the adjustments step increment.
        new step_backward `{ return GTK_SPIN_STEP_BACKWARD; `}
 
-       #Increment by the adjustments page increment.
+       # Increment by the adjustments page increment.
        new page_forward `{ return GTK_SPIN_PAGE_FORWARD; `}
 
-       #Decrement by the adjustments page increment.
+       # Decrement by the adjustments page increment.
        new page_backward `{ return GTK_SPIN_PAGE_BACKWARD; `}
 
-       #Go to the adjustments lower bound.
+       # Go to the adjustments lower bound.
        new lower_bound `{ return GTK_SPIN_HOME; `}
 
-       #Go to the adjustments upper bound.
+       # Go to the adjustments upper bound.
        new upper_bound `{ return GTK_SPIN_END; `}
 
-       #Change by a specified amount.
+       # Change by a specified amount.
        new user_defined `{ return GTK_SPIN_USER_DEFINED; `}
 end
 
-#A widget to unlock or lock privileged operations
-#@https://developer.gnome.org/gtk3/stable/GtkLockButton.html
+# A widget to unlock or lock privileged operations
+# See: https://developer.gnome.org/gtk3/stable/GtkLockButton.html
 extern class GtkLockButton
        super GtkButton
 end
 
-#A button to launch a color selection dialog
-#@https://developer.gnome.org/gtk3/stable/GtkColorButton.html
+# A button to launch a color selection dialog
+# See: https://developer.gnome.org/gtk3/stable/GtkColorButton.html
 extern class GtkColorButton `{GtkColorButton *`}
        super GtkButton
 
-       new is extern `{
-               return (GtkColorButton *)gtk_color_button_new(  );
-       `}
-
-       fun color=( col : GdkColor ) is extern `{
-
-               /* deprecated
-               GdkColor *c = malloc(sizeof(GdkColor));
-               c->pixel = 50;
-               c->red = 50;
-               c->green = 50;
-               c->blue = 50;
-
-               gtk_color_button_set_color( (GtkColorButton*)recv, c );*/
+       new `{
+               return (GtkColorButton *)gtk_color_button_new();
        `}
 end
 
index bf082c7..db45724 100644 (file)
@@ -15,7 +15,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-module v3_4 is pkgconfig("gtk+-3.0")
+module v3_4 is pkgconfig "gtk+-3.0"
 
 import gtk_widgets_ext
 import gtk_dialogs
index c424996..036c2bb 100644 (file)
 # limitations under the License.
 
 # GTK+ services added at version 3.6
-module v3_6 is pkgconfig("gtk+-3.0")
+module v3_6 is pkgconfig "gtk+-3.0"
 
 import v3_4
 
-#An entry which shows a search icon
-#@https://developer.gnome.org/gtk3/stable/GtkSearchEntry.html
+# An entry which shows a search icon
+# See: https://developer.gnome.org/gtk3/stable/GtkSearchEntry.html
 extern class GtkSearchEntry `{GtkSearchEntry *`}
        super GtkEntry
 
-       new is extern `{
-               return (GtkSearchEntry *)gtk_search_entry_new( );       
+       new `{
+               return (GtkSearchEntry *)gtk_search_entry_new();
        `}
 end
index 540db18..16b4167 100644 (file)
@@ -21,7 +21,7 @@ import v3_6
 
 redef class GtkWidget
        # Get the visibility of the widget, check if it's parents are visible too
-       fun visible: Bool is extern `{
+       fun visible: Bool `{
                return gtk_widget_is_visible(recv);
        `}
 end
index 12dbc7c..1107973 100644 (file)
@@ -56,6 +56,34 @@ interface Jsonable
        #
        # SEE: `to_json`
        fun append_json(buffer: Buffer) do buffer.append(to_json)
+
+       # Pretty print JSON string.
+       #
+       # ~~~
+       # var obj = new JsonObject
+       # obj["foo"] = 1
+       # obj["bar"] = true
+       # var arr = new JsonArray
+       # arr.add 2
+       # arr.add false
+       # arr.add "baz"
+       # obj["baz"] = arr
+       # var res = obj.to_pretty_json
+       # var exp = """{
+       #       "foo": 1,
+       #       "bar": true,
+       #       "baz": [2, false, "baz"]
+       # }\n"""
+       # assert res == exp
+       # ~~~
+       fun to_pretty_json: String do
+               var res = new FlatBuffer
+               pretty_json_visit(res, 0)
+               res.add '\n'
+               return res.write_to_string
+       end
+
+       private fun pretty_json_visit(buffer: FlatBuffer, indent: Int) is abstract
 end
 
 redef class Text
@@ -96,8 +124,10 @@ redef class Text
 
        # Encode `self` in JSON.
        #
-       #     assert "\t\"http://example.com\"\r\n\0\\".to_json ==
-       #               "\"\\t\\\"http:\\/\\/example.com\\\"\\r\\n\\u0000\\\\\""
+       # ~~~
+       # assert "\t\"http://example.com\"\r\n\0\\".to_json ==
+       #     "\"\\t\\\"http:\\/\\/example.com\\\"\\r\\n\\u0000\\\\\""
+       # ~~~
        redef fun to_json do return to_json_by_append
 
        # Parse `self` as JSON.
@@ -225,6 +255,29 @@ interface JsonMapRead[K: String, V: nullable Jsonable]
        #     assert obj.to_json == "\{\"baz\":null\}"
        redef fun to_json do return to_json_by_append
 
+       redef fun pretty_json_visit(buffer, indent) do
+               buffer.append "\{\n"
+               indent += 1
+               var i = 0
+               for k, v in self do
+                       buffer.append "\t" * indent
+                       buffer.append "\"{k}\": "
+                       if v isa JsonObject or v isa JsonArray then
+                               v.pretty_json_visit(buffer, indent)
+                       else
+                               buffer.append v.to_json
+                       end
+                       if i < length - 1 then
+                               buffer.append ","
+                       end
+                       buffer.append "\n"
+                       i += 1
+               end
+               indent -= 1
+               buffer.append "\t" * indent
+               buffer.append "\}"
+       end
+
        private fun append_json_entry(iterator: MapIterator[String, nullable Jsonable],
                        buffer: Buffer) do
                buffer.append iterator.key.to_json
@@ -269,6 +322,21 @@ class JsonSequenceRead[E: nullable Jsonable]
        #     assert arr.to_json =="[]"
        redef fun to_json do return to_json_by_append
 
+       redef fun pretty_json_visit(buffer, indent) do
+               buffer.append "\["
+               var i = 0
+               for v in self do
+                       if v isa JsonObject or v isa JsonArray then
+                               v.pretty_json_visit(buffer, indent)
+                       else
+                               buffer.append v.to_json
+                       end
+                       if i < length - 1 then buffer.append ", "
+                       i += 1
+               end
+               buffer.append "\]"
+       end
+
        private fun append_json_entry(iterator: Iterator[nullable Jsonable],
                        buffer: Buffer) do
                buffer.append_json_of(iterator.item)
@@ -287,13 +355,15 @@ redef class JsonParseError
 
        # Get the JSON representation of `self`.
        #
-       #     var err = new JsonParseError("foo", new Position(1, 2, 3, 4, 5, 6))
-       #     assert err.to_json == "\{\"error\":\"JsonParseError\"," +
-       #               "\"position\":\{" +
-       #                       "\"pos_start\":1,\"pos_end\":2," +
-       #                       "\"line_start\":3,\"line_end\":4," +
-       #                       "\"col_start\":5,\"col_end\":6" +
-       #               "\},\"message\":\"foo\"\}"
+       # ~~~
+       # var err = new JsonParseError("foo", new Position(1, 2, 3, 4, 5, 6))
+       # assert err.to_json == "\{\"error\":\"JsonParseError\"," +
+       #               "\"position\":\{" +
+       #                       "\"pos_start\":1,\"pos_end\":2," +
+       #                       "\"line_start\":3,\"line_end\":4," +
+       #                       "\"col_start\":5,\"col_end\":6" +
+       #               "\},\"message\":\"foo\"\}"
+       # ~~~
        redef fun to_json do
                return "\{\"error\":\"JsonParseError\"," +
                                "\"position\":{position.to_json}," +
@@ -306,12 +376,14 @@ redef class Position
 
        # Get the JSON representation of `self`.
        #
-       #     var pos = new Position(1, 2, 3, 4, 5, 6)
-       #     assert pos.to_json == "\{" +
-       #                       "\"pos_start\":1,\"pos_end\":2," +
-       #                       "\"line_start\":3,\"line_end\":4," +
-       #                       "\"col_start\":5,\"col_end\":6" +
-       #               "\}"
+       # ~~~
+       # var pos = new Position(1, 2, 3, 4, 5, 6)
+       # assert pos.to_json == "\{" +
+       #                       "\"pos_start\":1,\"pos_end\":2," +
+       #                       "\"line_start\":3,\"line_end\":4," +
+       #                       "\"col_start\":5,\"col_end\":6" +
+       #               "\}"
+       # ~~~
        redef fun to_json do
                return "\{\"pos_start\":{pos_start},\"pos_end\":{pos_end}," +
                                "\"line_start\":{line_start},\"line_end\":{line_end}," +
similarity index 97%
rename from lib/linux/linux_data_store.nit
rename to lib/linux/data_store.nit
index 3925e39..5743d82 100644 (file)
@@ -14,7 +14,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-module linux_data_store
+# `app::data_store` implementation on GNU/Linux
+module data_store
 
 import app::data_store
 private import xdg_basedir
index b106d62..2fecee8 100644 (file)
@@ -18,4 +18,4 @@
 module linux
 
 import app
-private import linux_data_store
+private import data_store
index 10dbcc6..7b7d319 100644 (file)
@@ -244,7 +244,7 @@ class MarkdownProcessor
        #
        # Markdown allows link refs to be defined over two lines:
        #
-       #       [id]: http://example.com/longish/path/to/resource/here
+       #       [id]: http://example.com/longish/path/to/resource/here
        #               "Optional Title Here"
        #
        private var last_link_ref: nullable LinkRef = null
@@ -2000,7 +2000,7 @@ abstract class TokenLinkOrImage
                                comment = lr.title
                        end
                else
-               var tid = name.write_to_string.replace("\n", " ").to_lower
+                       var tid = name.write_to_string.replace("\n", " ").to_lower
                        if v.processor.link_refs.has_key(tid) then
                                var lr = v.processor.link_refs[tid]
                                link = lr.link
diff --git a/lib/mongodb/mongodb.nit b/lib/mongodb/mongodb.nit
new file mode 100644 (file)
index 0000000..4a0718f
--- /dev/null
@@ -0,0 +1,659 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# MongoDB Nit Driver.
+#
+# This is actually a wrapper around the [MongoDB C Driver](http://api.mongodb.org/c/1.1.4/index.html).
+#
+# Usage:
+#
+# ~~~
+# # Opens the connexion with the Mongo server.
+# var client = new MongoClient("mongodb://localhost:27017/")
+#
+# # Retrieve a collection.
+# var col = client.database("test").collection("test")
+#
+# # Insert a document in the collection.
+# var doc = new JsonObject
+# doc["foo"] = 10
+# doc["bar"] = "bar"
+# doc["baz"] = new JsonArray
+# assert col.insert(doc)
+#
+# # Retrieve a document from the collection.
+# var query = new JsonObject
+# query["foo"] = 10
+# var res = col.find(query)
+# assert res["bar"] == "bar"
+# ~~~
+#
+# TODO Get last Object_ID
+module mongodb
+
+import json
+private import native_mongodb
+
+in "C header" `{
+       #include <mongoc.h>
+`}
+
+# Everything inside MongoDB is manipulated as BSON Objects.
+#
+# See:
+# * [Binary JSON spec](http://bsonspec.org/)
+# * [Libbson](http://api.mongodb.org/libbson/1.1.4/)#
+private class BSON
+       super Finalizable
+
+       # Native instance pointer.
+       var native: NativeBSON
+
+       # Is the native instance valid?
+       #
+       # This is set to false if the `native` is destroyed.
+       var is_alive = true
+
+       # Returns a new BSON object initialized from the content of `json`.
+       #
+       # ~~~
+       # intrude import mongodb
+       # var obj = new JsonObject
+       # obj["age"] = 10
+       # obj["name"] = "Rick"
+       # obj["ELS"] = new JsonArray
+       # var bson = new BSON.from_json(obj)
+       # assert bson.to_s == """{ "age" : 10, "name" : "Rick", "ELS" : [  ] }"""
+       # ~~~
+       init from_json(json: JsonObject) do
+               init(new NativeBSON.from_json_string(json.to_json.to_cstring))
+       end
+
+       # Returns a new BSON object parsed from `json_string`.
+       #
+       # If `json_string` is not a valid JSON string, this initializer returns NULL.
+       #
+       # ~~~
+       # intrude import mongodb
+       # var str = """{ "age" : 10, "name" : "Rick", "ELS" : [  ] }"""
+       # var bson = new BSON.from_json_string(str)
+       # assert bson.to_s == str
+       # ~~~
+       init from_json_string(json_string: String) do
+               init(new NativeBSON.from_json_string(json_string.to_cstring))
+       end
+
+       redef fun to_s do
+               assert is_alive
+               var ns = native.to_native_string
+               var res = ns.to_s_with_copy
+               ns.free # manual free of gc allocated NativeString
+               return res
+       end
+
+       # Returns a new JsonObject from `self`.
+       #
+       # ~~~
+       # intrude import mongodb
+       # var str = """{ "age" : 10, "name" : "Rick", "ELS" : [  ] }"""
+       # var bson = new BSON.from_json_string(str)
+       # var json = bson.to_json
+       # assert json["age"] == 10
+       # assert json["name"] == "Rick"
+       # assert json["ELS"].as(JsonArray).is_empty
+       # ~~~
+       fun to_json: JsonObject do
+               assert is_alive
+               return to_s.parse_json.as(JsonObject)
+       end
+
+       redef fun finalize do
+               if is_alive then
+                       native.destroy
+                       is_alive = false
+               end
+       end
+end
+
+redef class JsonObject
+       # Inits `self` from a BSON object.
+       private init from_bson(bson: BSON) do recover_with(bson.to_json)
+
+       # Returns a new BSON object from `self`.
+       private fun to_bson: BSON do return new BSON.from_json(self)
+end
+
+# An error returned by the mongoc client.
+#
+# Within the client, if a method returns `false` or `null` it's more likely that
+# an error occured during the execution.
+#
+# See `MongoClient::last_error`.
+class MongoError
+
+       private var native: BSONError
+
+       # Is the native instance valid?
+       #
+       # This is set to false if the `native` is destroyed.
+       private var is_alive = true
+
+       # Logical domain within a library that created the error.
+       fun domain: Int do
+               assert is_alive
+               return native.domain
+       end
+
+       # Domain specific error code.
+       fun code: Int do
+               assert is_alive
+               return native.code
+       end
+
+       # Human readable error message.
+       fun message: String do
+               assert is_alive
+               var ns = native.message
+               var res = ns.to_s_with_copy
+               ns.free
+               return res
+       end
+
+       redef fun to_s do return "{message} (code: {code})"
+end
+
+# The MongoClient is used to connect to the mongo server and send queries.
+#
+# Usage:
+#
+# ~~~
+# var uri = "mongodb://localhost:27017/"
+# var client = new MongoClient(uri)
+# assert client.server_uri == uri
+# ~~~
+class MongoClient
+       super Finalizable
+
+       # Server URI.
+       var server_uri: String
+
+       private var native: NativeMongoClient is noinit
+
+       # Is the native instance valid?
+       #
+       # This is set to false if the `native` is destroyed.
+       private var is_alive = true
+
+       init do
+               native = new NativeMongoClient(server_uri.to_cstring)
+       end
+
+       # Gets server data.
+       #
+       # Returns `null` if an error occured. See `last_error`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # assert client.server_status["process"] == "mongod"
+       # ~~~
+       fun server_status: nullable JsonObject do
+               assert is_alive
+               var nbson = native.server_status
+               if nbson == null then return null
+               var bson = new BSON(nbson)
+               var res = new JsonObject.from_bson(bson)
+               return res
+       end
+
+       # Lists available database names.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var db = client.database("test")
+       # db.collection("test").insert(new JsonObject)
+       # assert client.database_names.has("test")
+       # ~~~
+       fun database_names: Array[String] do
+               assert is_alive
+               var res = new Array[String]
+               var nas = native.database_names
+               var i = 0
+               var name = nas[i]
+               while not name.address_is_null do
+                       res.add name.to_s_with_copy
+                       name.free
+                       i += 1
+                       name = nas[i]
+               end
+               return res
+       end
+
+       # Loads or creates a database from its `name`.
+       #
+       # Database are automatically created on the MongoDB server upon insertion of
+       # the first document into a collection.
+       # There is no need to create a database manually.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # assert client.database("test").name == "test"
+       # ~~~
+       fun database(name: String): MongoDb do
+               assert is_alive
+               return new MongoDb(self, name)
+       end
+
+       # Close the connexion and destroy the instance.
+       #
+       # The reference should not be used beyond this point!
+       fun close do
+               assert is_alive
+               finalize
+       end
+
+       redef fun finalize do
+               if is_alive then
+                       native.destroy
+                       is_alive = false
+               end
+       end
+
+       # Last error raised by mongoc.
+       fun last_error: nullable MongoError do
+               var last_error = sys.last_mongoc_error
+               if last_error == null then return null
+               return new MongoError(last_error)
+       end
+end
+
+# A MongoDb database.
+#
+# Database are automatically created on the MongoDB server upon insertion of the
+# first document into a collection.
+# There is no need to create a database manually.
+class MongoDb
+       super Finalizable
+
+       # `MongoClient` used to load this database.
+       var client: MongoClient
+
+       # The database name.
+       var name: String
+
+       private var native: NativeMongoDb is noinit
+
+       # Is the native instance valid?
+       #
+       # This is set to false if the `native` is destroyed.
+       private var is_alive = true
+
+       init do
+               native = new NativeMongoDb(client.native, name.to_cstring)
+       end
+
+       # Lists available collection names.
+       #
+       # Returns `null` if an error occured. See `Sys::last_mongoc_error`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var db = client.database("test")
+       # db.collection("test").insert(new JsonObject)
+       # assert db.collection_names.has("test")
+       # ~~~
+       fun collection_names: Array[String] do
+               assert is_alive
+               var res = new Array[String]
+               var nas = native.collection_names
+               var i = 0
+               var name = nas[i]
+               while not name.address_is_null do
+                       res.add name.to_s_with_copy
+                       name.free
+                       i += 1
+                       name = nas[i]
+               end
+               return res
+       end
+
+       # Loads or creates a collection by its `name`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var db = client.database("test")
+       # var col = db.collection("test")
+       # assert col.name == "test"
+       # ~~~
+       fun collection(name: String): MongoCollection do
+               assert is_alive
+               return new MongoCollection(self, name)
+       end
+
+       # Checks if a collection named `name` exists.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var db = client.database("test")
+       # assert not db.has_collection("qwerty")
+       # ~~~
+       fun has_collection(name: String): Bool do
+               assert is_alive
+               # TODO handle error
+               return native.has_collection(name.to_cstring)
+       end
+
+       # Drop `self`, returns false if an error occured.
+       fun drop: Bool do
+               assert is_alive
+               return native.drop
+       end
+
+       redef fun finalize do
+               if is_alive then
+                       native.destroy
+                       is_alive = false
+               end
+       end
+end
+
+# A Mongo collection.
+#
+# Collections are automatically created on the MongoDB server upon insertion of
+# the first document.
+# There is no need to create a database manually.
+class MongoCollection
+       super Finalizable
+
+       # Database that collection belongs to.
+       var database: MongoDb
+
+       # Name of this collection.
+       var name: String
+
+       private var native: NativeMongoCollection is noinit
+
+       # Is the native instance valid?
+       #
+       # This is set to false if the `native` is destroyed.
+       private var is_alive = true
+
+       # Loads a collection.
+       #
+       # Call `MongoDb::collection` instead.
+       init do
+               native = new NativeMongoCollection(
+                       database.client.native,
+                       database.name.to_cstring,
+                       name.to_cstring)
+       end
+
+       # Inserts a new document in the collection.
+       #
+       # If no _id element is found in document, then a new one be generated locally
+       # and added to the document.
+       #
+       # Returns `false` if an error occured. See `Sys::last_mongoc_error`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var col = client.database("test").collection("test")
+       # var doc = new JsonObject
+       # doc["foo"] = 10
+       # doc["bar"] = "bar"
+       # doc["baz"] = new JsonArray
+       # assert col.insert(doc)
+       # ~~~
+       fun insert(doc: JsonObject): Bool do
+               assert is_alive
+               return native.insert(doc.to_bson.native)
+       end
+
+       # Inserts multiple documents in the collection.
+       #
+       # See `insert`.
+       fun insert_all(docs: Collection[JsonObject]): Bool do
+               assert is_alive
+               var res = true
+               for doc in docs do res = insert(doc) and res
+               return res
+       end
+
+       # Saves a new document in the collection.
+       #
+       # If the document has an `_id` field it will be updated.
+       # Otherwise it will be inserted.
+       #
+       # Returns `false` if an error occured. See `Sys::last_mongoc_error`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var col = client.database("test").collection("test")
+       # var doc = new JsonObject
+       # doc["foo"] = 10
+       # doc["bar"] = "bar"
+       # doc["baz"] = new JsonArray
+       # assert col.save(doc) # will be inserted
+       # ~~~
+       fun save(doc: JsonObject): Bool do
+               assert is_alive
+               return native.save(doc.to_bson.native)
+       end
+
+       # Removes the first document that matches `selector`.
+       #
+       # Returns `false` if an error occured. See `Sys::last_mongoc_error`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var col = client.database("test").collection("test")
+       # var sel = new JsonObject
+       # sel["foo"] = 10
+       # assert col.remove(sel)
+       # ~~~
+       fun remove(selector: JsonObject): Bool do
+               assert is_alive
+               return native.remove(selector.to_bson.native)
+       end
+
+       # Removes all the document that match `selector`.
+       #
+       # See `remove`.
+       fun remove_all(selector: JsonObject): Bool do
+               assert is_alive
+               return native.remove_all(selector.to_bson.native)
+       end
+
+       # Updates a document already existing in the collection.
+       #
+       # No upsert is done, see `save` instead.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var col = client.database("test").collection("test")
+       # var sel = new JsonObject
+       # sel["foo"] = 10
+       # var upd = new JsonObject
+       # upd["bar"] = "BAR"
+       # assert col.update(sel, upd)
+       # ~~~
+       fun update(selector: JsonObject, update: JsonObject): Bool do
+               assert is_alive
+               return native.update(
+                       selector.to_bson.native,
+                       update.to_bson.native)
+       end
+
+       # Updates all documents matching the `selector`.
+       #
+       # See `update`.
+       fun update_all(selector: JsonObject, update: JsonObject): Bool do
+               return native.update_all(
+                       selector.to_bson.native,
+                       update.to_bson.native)
+       end
+
+       # Counts the document matching `query`.
+       #
+       # Returns `-1` if an error occured. See `Sys::last_mongoc_error`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var col = client.database("test").collection("test")
+       # var query = new JsonObject
+       # query["foo"] = 10
+       # assert col.count(query) > 0
+       # ~~~
+       fun count(query: JsonObject): Int do
+               assert is_alive
+               return native.count(query.to_bson.native)
+       end
+
+       # Finds the first document that matches `query`.
+       #
+       # Returns `null` if an error occured. See `Sys::last_mongoc_error`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var col = client.database("test").collection("test")
+       # var query = new JsonObject
+       # query["foo"] = 10
+       # var doc = col.find(query)
+       # print doc or else "nullllllllllllllllll"
+       # print doc.to_json
+       # assert doc["foo"] == 10
+       # ~~~
+       fun find(query: JsonObject): nullable JsonObject do
+               assert is_alive
+               var c = native.find(query.to_bson.native)
+               if c == null then return null
+               var cursor = new MongoCursor(c)
+               if cursor.is_ok then
+                       cursor.next
+                       return cursor.item
+               end
+               return null
+       end
+
+       # Finds all the documents matching the `query`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var col = client.database("test").collection("test")
+       # var query = new JsonObject
+       # query["foo"] = 10
+       # assert col.find_all(query).length > 0
+       # ~~~
+       fun find_all(query: JsonObject): Array[JsonObject] do
+               assert is_alive
+               var res = new Array[JsonObject]
+               var c = native.find(query.to_bson.native)
+               if c == null then return res
+               var cursor = new MongoCursor(c)
+               for item in cursor do res.add item
+               return res
+       end
+
+       # Retrieves statistics about the collection.
+       #
+       # Returns `null` if an error occured. See `Sys::last_mongoc_error`.
+       #
+       # ~~~
+       # var client = new MongoClient("mongodb://localhost:27017/")
+       # var col = client.database("test").collection("test")
+       # assert col.stats["ns"] == "test.test"
+       # ~~~
+       fun stats: nullable JsonObject do
+               assert is_alive
+               var bson = native.stats
+               if bson == null then return null
+               return new JsonObject.from_bson(new BSON(bson))
+       end
+
+       # Drops `self`, returns false if an error occured.
+       fun drop: Bool do
+               assert is_alive
+               return native.drop
+       end
+
+       # Moves `self` to another `database`.
+       #
+       # The database will also be updated internally so it is safe to continue using
+       # this collection after the move.
+       # Additional operations will occur on moved collection.
+       fun move(database: MongoDb): Bool do
+               assert is_alive
+               self.database = database
+               return native.rename(database.name.to_cstring, name.to_cstring)
+       end
+
+       # Renames `self`.
+       #
+       # The name of the collection will also be updated internally so it is safe
+       # to continue using this collection after the rename.
+       # Additional operations will occur on renamed collection.
+       fun rename(name: String): Bool do
+               assert is_alive
+               self.name = name
+               return native.rename(database.name.to_cstring, name.to_cstring)
+       end
+
+       redef fun finalize do
+               if is_alive then
+                       native.destroy
+                       is_alive = false
+               end
+       end
+end
+
+# A MongoDB query cursor.
+#
+# It wraps up the wire protocol negotation required to initiate a query and
+# retreive an unknown number of documents.
+class MongoCursor
+       super Finalizable
+       super Iterator[JsonObject]
+
+       private var native: NativeMongoCursor
+
+       # Is the native instance valid?
+       #
+       # This is set to false if the `native` is destroyed.
+       private var is_alive = true
+
+       init do next
+
+       redef fun is_ok do
+               assert is_alive
+               return native.more
+       end
+
+       redef fun next do
+               assert is_alive
+               native.next
+       end
+
+       redef fun item do
+               assert is_alive
+               return new JsonObject.from_bson(new BSON(native.current))
+       end
+
+       redef fun finalize do
+               if is_alive then
+                       native.destroy
+                       is_alive = false
+               end
+       end
+end
diff --git a/lib/mongodb/native_mongodb.nit b/lib/mongodb/native_mongodb.nit
new file mode 100644 (file)
index 0000000..6608bc1
--- /dev/null
@@ -0,0 +1,492 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2015 Alexandre Terrasa <alexandre@moz-code.org>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Native wrapper for the MongoDB C Driver
+#
+# See [mongoc](http://api.mongodb.org/c/1.1.4/index.html).
+module native_mongodb is pkgconfig "libmongoc-1.0"
+
+import c
+
+in "C header" `{
+       #include <mongoc.h>
+`}
+
+# Wrapper for `bson_t`.
+#
+# All data manipulated by `mongoc` are BSON formated.
+#
+# The `bson_t` structure represents a BSON document.
+# This structure manages the underlying BSON encoded buffer.
+# For mutable documents, it can append new data to the document.
+#
+# See [`bson_t`](http://api.mongodb.org/libbson/current/bson_t.html).
+extern class NativeBSON `{ bson_t * `}
+
+       # Wrapper for `bson_new()`.
+       #
+       # The `bson_new()` function shall create a new `bson_t` structure on the heap.
+       # It should be freed with `bson_destroy()` when it is no longer in use.
+       new `{ return bson_new(); `}
+
+       # Wrapper for `bson_new_from_json()`.
+       #
+       # The `bson_new_from_json()` function allocates and initialize a new `bson_t`
+       # by parsing the JSON found in `data`.
+       # Only a single JSON object may exist in data or an error will be set and
+       # `NULL` returned.
+       new from_json_string(data: NativeString) import set_mongoc_error `{
+               bson_error_t error;
+               bson_t *bson;
+               bson = bson_new_from_json(data, -1, &error);
+               if(!bson) {
+                       NativeBSON_set_mongoc_error(recv, &error);
+                       return NULL;
+               }
+               return bson;
+       `}
+
+       # Wrapper for `bson_as_json()`.
+       #
+       # The `bson_as_json()` function shall encode bson as a JSON encoded UTF-8 string.
+       # The caller is responsible for freeing the resulting UTF-8 encoded string
+       # by calling `bson_free()` with the result.
+       fun to_native_string: NativeString `{ return bson_as_json(recv, NULL); `}
+
+       # Wrapper for `bson_destroy()`.
+       #
+       # The `bson_destroy()` function shall free an allocated `bson_t` structure.
+       # This function should always be called when you are done with a `bson_t`
+       # unless otherwise specified.
+       #
+       # This instance should not be used beyond this point!
+       fun destroy `{ bson_destroy(recv); `}
+
+       # Utility method to set `Sys.last_mongoc_error`.
+       fun set_mongoc_error(err: BSONError) do sys.last_mongoc_error = err
+end
+
+# Wrapper for `bson_error_t`.
+#
+# The `bson_error_t` structure is used to encapsulate information about an error.
+#
+# See [`bson_error_t`](http://api.mongodb.org/libbson/current/bson_error_t.html).
+extern class BSONError `{ bson_error_t * `}
+
+       # Wrapper for `error.domain`.
+       #
+       # The `error.domain` field contains the logical domain within a library that
+       # created the error.
+       fun domain: Int `{ return recv->domain; `}
+
+       # Wrapper for `error.code`.
+       #
+       # The `error.code` field contains the domain specific error code.
+       fun code: Int `{ return recv->code; `}
+
+       # Wrapper for `error.message`.
+       #
+       # The `error.message` field contains a human printable error message.
+       fun message: NativeString `{ return recv->message; `}
+end
+
+redef class Sys
+       # Last error raised by `monogdb::MongoClient`.
+       #
+       # See `MongoClient::last_error`.
+       var last_mongoc_error: nullable BSONError = null
+end
+
+# Wrapper for `char**`.
+#
+# Used to handle array of NativeString returned by MongoDB.
+redef class NativeCStringArray
+       # Frees `self`.
+       #
+       # This instance should not be used beyond this point!
+       fun destroy `{ free(recv); `}
+end
+
+# Wrapper for `mongoc_client_t`.
+#
+# `mongoc_client_t` is an opaque type that provides access to a MongoDB node,
+# replica-set, or sharded-cluster.
+# It maintains management of underlying sockets and routing to individual nodes.
+#
+# See [`mongoc_client_t`](http://api.mongodb.org/c/current/mongoc_client_t.html).
+extern class NativeMongoClient `{ mongoc_client_t * `}
+
+       # Wrapper for `mongoc_client_new()`.
+       #
+       # Creates a new `mongoc_client_t` using the `uri` string provided.
+       new(uri: NativeString) `{
+               mongoc_init();
+               return mongoc_client_new(uri);
+       `}
+
+       # Wrapper for `mongoc_client_get_server_status()`.
+       #
+       # Queries the server for the current server status.
+       # Returns `null` if an error occured.
+       fun server_status: nullable NativeBSON import set_mongoc_error, NativeBSON.as nullable `{
+               bson_error_t error;
+               bson_t *reply = bson_new();
+               if(!mongoc_client_get_server_status(recv, NULL, reply, &error)){
+                       NativeMongoClient_set_mongoc_error(recv, &error);
+                       return null_NativeBSON();
+               }
+               return NativeBSON_as_nullable(reply);
+       `}
+
+       # Wrapper for `mongoc_client_get_database_names()`.
+       #
+       # This function queries the MongoDB server for a list of known databases.
+       # Returns `null` if an error occured.
+       fun database_names: nullable NativeCStringArray
+               import set_mongoc_error, NativeCStringArray, NativeCStringArray.as nullable `{
+               bson_error_t error;
+               char **strv;
+               if(strv = mongoc_client_get_database_names(recv, &error)) {
+                       return NativeCStringArray_as_nullable(strv);
+               }
+               NativeMongoClient_set_mongoc_error(recv, &error);
+               return null_NativeCStringArray();
+       `}
+
+       # Wrapper for `mongoc_client_destroy()`.
+       #
+       # This instance should not be used beyond this point!
+       fun destroy `{
+               mongoc_client_destroy(recv);
+               mongoc_cleanup();
+       `}
+
+       # Utility method to set `Sys.last_mongoc_error`.
+       fun set_mongoc_error(err: BSONError) do sys.last_mongoc_error = err
+end
+
+# Wrapper for `mongoc_database_t`.
+#
+# `mongoc_database_t` provides access to a MongoDB database.
+# This handle is useful for actions a particular database object.
+# It is not a container for `mongoc_collection_t` structures.
+#
+# See [`mongoc_database_t`](http://api.mongodb.org/c/current/mongoc_database_t.html).
+extern class NativeMongoDb `{ mongoc_database_t * `}
+
+       # Wrapper for `mongoc_client_get_database()`.
+       #
+       # Get a newly allocated `mongoc_database_t` for the database named name.
+       #
+       # Database are automatically created on the MongoDB server upon insertion of
+       # the first document into a collection.
+       # There is no need to create a database manually.
+       new(client: NativeMongoClient, db_name: NativeString) `{
+               return mongoc_client_get_database(client, db_name);
+       `}
+
+       # Wrapper for `mongoc_database_get_collection_names()`.
+       #
+       # Fetches a `NULL` terminated array of `NULL-byte` terminated `char*` strings
+       # containing the names of all of the collections in database.
+       fun collection_names: nullable NativeCStringArray
+               import set_mongoc_error, NativeCStringArray, NativeCStringArray.as nullable `{
+               bson_error_t error;
+               char **strv;
+               if(strv = mongoc_database_get_collection_names(recv, &error)) {
+                       return NativeCStringArray_as_nullable(strv);
+               }
+               NativeMongoDb_set_mongoc_error(recv, &error);
+               return null_NativeCStringArray();
+       `}
+
+       # Wrapper for `mongoc_database_get_collection()`.
+       #
+       # Allocates a new `mongoc_collection_t` structure for the collection named
+       # `name` in database.
+       fun collection(name: NativeString): NativeMongoCollection `{
+               return mongoc_database_get_collection(recv, name);
+       `}
+
+       # Wrapper for `mongoc_database_has_collection()`.
+       #
+       # This function checks to see if a collection exists on the MongoDB server
+       # within database.
+       fun has_collection(name: NativeString): Bool import set_mongoc_error `{
+               bson_error_t error;
+               if(!mongoc_database_has_collection(recv, name, &error)) {
+                       NativeMongoDb_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_database_drop()`.
+       #
+       # This function attempts to drop a database on the MongoDB server.
+       fun drop: Bool import set_mongoc_error `{
+               bson_error_t error;
+               if(!mongoc_database_drop(recv, &error)) {
+                       NativeMongoDb_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_database_destroy()`.
+       #
+       # This instance should not be used beyond this point!
+       fun destroy `{ mongoc_database_destroy(recv); `}
+
+       # Utility method to set `Sys.last_mongoc_error`.
+       fun set_mongoc_error(err: BSONError) do sys.last_mongoc_error = err
+end
+
+# Wrapper for `mongoc_collection_t`.
+#
+# `mongoc_collection_t` provides access to a MongoDB collection.
+# This handle is useful for actions for most CRUD operations,
+# I.e. insert, update, delete, find, etc.
+#
+# It is an error to call `mongoc_collection_destroy()` on a collection that has
+# operations pending.
+# It is required that you release `mongoc_cursor_t` structures before calling
+# `mongoc_collection_destroy()`.
+#
+# See [`mongoc_collection_t`](http://api.mongodb.org/c/current/mongoc_collection_t.html).
+extern class NativeMongoCollection `{ mongoc_collection_t * `}
+
+       # Wrapper for `mongoc_client_get_collection()`.
+       #
+       # Get a newly allocated `mongoc_collection_t` for the collection named
+       # `collection` in the database named `db`.
+       #
+       # Collections are automatically created on the MongoDB server upon insertion
+       # of the first document.
+       # There is no need to create a collection manually.
+       new(client: NativeMongoClient, db, collection: NativeString) `{
+               return mongoc_client_get_collection(client, db, collection);
+       `}
+
+       # Wrapper for `mongoc_collection_insert()`.
+       #
+       # This function shall insert `document` into the collection.
+       # If no `_id` element is found in document, then a `bson_oid_t` will be
+       # generated locally and added to the document.
+       #
+       # You can retrieve a generated `_id` from `mongoc_collection_get_last_error()`.
+       fun insert(doc: NativeBSON): Bool import set_mongoc_error `{
+               bson_error_t error;
+               if(!mongoc_collection_insert(recv, MONGOC_INSERT_NONE, doc, NULL, &error)) {
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_collection_save()`.
+       #
+       # This function shall save a document into the collection.
+       # If the document has an `_id` field it will be updated.
+       # Otherwise it will be inserted.
+       fun save(document: NativeBSON): Bool import set_mongoc_error `{
+               bson_error_t error;
+               if(!mongoc_collection_save(recv, document, NULL, &error)) {
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_collection_remove(MONGOC_REMOVE_SINGLE_REMOVE)`.
+       #
+       # This function shall remove the first document in the collection that matches
+       # `selector`.
+       # The bson selector is not validated, simply passed along as appropriate to the server.
+       fun remove(selector: NativeBSON): Bool import set_mongoc_error `{
+               bson_error_t error;
+               if(!mongoc_collection_remove(recv, MONGOC_REMOVE_SINGLE_REMOVE, selector, NULL, &error)) {
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_collection_remove(MONGOC_REMOVE_NONE)`.
+       #
+       # This function shall remove documents in the collection that match `selector`.
+       fun remove_all(selector: NativeBSON): Bool import set_mongoc_error `{
+               bson_error_t error;
+               if(!mongoc_collection_remove(recv, MONGOC_REMOVE_NONE, selector, NULL, &error)) {
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_collection_update(MONGOC_UPDATE_NONE)`.
+       #
+       # This function shall update the first document in the collection that
+       # matches `selector`.
+       fun update(selector, update: NativeBSON): Bool import set_mongoc_error `{
+               bson_error_t error;
+               if(!mongoc_collection_update(recv, MONGOC_UPDATE_NONE, selector, update, NULL, &error)) {
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_collection_update(MONGOC_UPDATE_MULTI_UPDATE)`.
+       #
+       # This function shall update documents in the collection that match `selector`.
+       fun update_all(selector, update: NativeBSON): Bool import set_mongoc_error `{
+               bson_error_t error;
+               if(!mongoc_collection_update(recv, MONGOC_UPDATE_MULTI_UPDATE, selector, update, NULL, &error)) {
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_collection_count()`.
+       #
+       # This function shall execute a count `query` on the underlying collection.
+       fun count(query: NativeBSON): Int import set_mongoc_error `{
+               bson_error_t error;
+               int64_t count = mongoc_collection_count(recv, MONGOC_QUERY_NONE, query, 0, 0, NULL, &error);
+               if(count < 0) {
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return -1;
+               }
+               return count;
+       `}
+
+       # Wrapper for `mongoc_collection_find()`.
+       #
+       # This function shall execute a `query` on the underlying collection.
+       #
+       # If no options are necessary, `query` can simply contain a query such as `{a:1}`.
+       #
+       # If you would like to specify options such as a sort order,
+       # the query must be placed inside of `{"$query": {}}`.
+       fun find(query: NativeBSON): nullable NativeMongoCursor import
+               NativeMongoCursor.as nullable, set_mongoc_error `{
+               bson_error_t error;
+               mongoc_cursor_t *cursor;
+               cursor = mongoc_collection_find(recv, MONGOC_QUERY_NONE, 0, 0, 0, query, NULL, NULL);
+
+               if (mongoc_cursor_error(cursor, &error)) {
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return null_NativeMongoCursor();
+               }
+
+               return NativeMongoCursor_as_nullable(cursor);
+       `}
+
+       # Wrapper for `mongoc_collection_stats()`.
+       #
+       # This function is a helper to retrieve statistics about the collection.
+       fun stats: nullable NativeBSON import set_mongoc_error, NativeBSON.as nullable `{
+               bson_error_t error;
+               bson_t *reply = bson_new();
+               if(!mongoc_collection_stats(recv, NULL, reply, &error)){
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return null_NativeBSON();
+               }
+               return NativeBSON_as_nullable(reply);
+       `}
+
+       # Wrapper for `mongoc_collection_drop()`.
+       #
+       # This function requests that the `collection` be dropped,
+       # including all indexes associated with the collection.
+       fun drop: Bool import set_mongoc_error `{
+               bson_error_t error;
+               if(!mongoc_collection_drop(recv, &error)) {
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_collection_rename()`.
+       #
+       # This function is a helper to rename an existing collection on a MongoDB server.
+       # The name of the collection will also be updated internally so it is safe
+       # to continue using this collection after the rename.
+       # Additional operations will occur on renamed collection.
+       fun rename(new_database, new_name: NativeString): Bool `{
+               bson_error_t error;
+               if(!mongoc_collection_rename(recv, new_database, new_name, false, &error)){
+                       NativeMongoCollection_set_mongoc_error(recv, &error);
+                       return false;
+               }
+               return true;
+       `}
+
+       # Wrapper for `mongoc_collection_destroy()`.
+       #
+       # This instance should not be used beyond this point!
+       fun destroy `{ mongoc_collection_destroy(recv); `}
+
+       # Utility method to set `Sys.last_mongoc_error`.
+       fun set_mongoc_error(err: BSONError) do sys.last_mongoc_error = err
+end
+
+# Wrapper for `mongoc_cursor_t`.
+#
+# `mongoc_cursor_t` provides access to a MongoDB query cursor.
+# It wraps up the wire protocol negotation required to initiate a query and
+# retreive an unknown number of documents.
+#
+# Cursors are lazy, meaning that no network traffic occurs until the first call
+# to mongoc_cursor_next().
+#
+# At that point we can:
+# * Retreive more records with repeated calls to `mongoc_cursor_next()`.
+# * Test for more records with `mongoc_cursor_more()`.
+# * Retrieve the document under the cursor with `mongoc_cursor_current()`.
+#
+# See [`mongoc_cursor_t`](http://api.mongodb.org/c/current/mongoc_cursor_t.html).
+extern class NativeMongoCursor `{ mongoc_cursor_t* `}
+
+       # Wrapper for `mongoc_cursor_current()`.
+       #
+       # Fetches the cursors current document or NULL if there has been an error.
+       fun current: NativeBSON `{ return (bson_t*) mongoc_cursor_current(recv); `}
+
+       # Wrapper for `mongoc_cursor_next()`.
+       #
+       # This function shall iterate the underlying cursor, setting `current` to the next
+       # document.
+       #
+       # This function is a blocking function.
+       fun next: Bool `{
+               const bson_t *doc;
+               return mongoc_cursor_next(recv, &doc);
+       `}
+
+       # Wrapper for `mongoc_cursor_more()`.
+       #
+       # This function shall indicate if there is more data to be read from the cursor.
+       fun more: Bool `{ return mongoc_cursor_more(recv); `}
+
+       # Wrapper for `mongoc_cursor_destroy()`.
+       #
+       # This instance should not be used beyond this point!
+       fun destroy `{ mongoc_cursor_destroy(recv); `}
+end
index cd2698c..5c9b2ef 100644 (file)
@@ -849,6 +849,39 @@ abstract class Text
                return hash_cache.as(not null)
        end
 
+       # Gives the formatted string back as a Nit string with `args` in place
+       #
+       #       assert "This %1 is a %2.".format("String", "formatted String") == "This String is a formatted String"
+       #       assert "\\%1 This string".format("String") == "\\%1 This string"
+       fun format(args: Object...): String do
+               var s = new Array[Text]
+               var curr_st = 0
+               var i = 0
+               while i < length do
+                       # Skip escaped characters
+                       if self[i] == '\\' then
+                               i += 1
+                       # In case of format
+                       else if self[i] == '%' then
+                               var fmt_st = i
+                               i += 1
+                               var ciph_st = i
+                               while i < length and self[i].is_numeric do
+                                       i += 1
+                               end
+                               i -= 1
+                               var fmt_end = i
+                               var ciph_len = fmt_end - ciph_st + 1
+                               s.push substring(curr_st, fmt_st - curr_st)
+                               s.push args[substring(ciph_st, ciph_len).to_i - 1].to_s
+                               curr_st = i + 1
+                       end
+                       i += 1
+               end
+               s.push substring(curr_st, length - curr_st)
+               return s.to_s
+       end
+
 end
 
 # All kinds of array-based text representations.
index 18a579a..9c3ede7 100644 (file)
@@ -131,31 +131,31 @@ hi def link NITFFIDelimiters              Keyword
 " FFI Python
 syntax include @FFIPython syntax/python.vim
 unlet b:current_syntax
-syn match NITFFILanguage       /\c"Python"/ nextgroup=NITFFIBlockPython skipwhite
+syn match NITFFILanguage       /\c"Python"\ze.*`{/ nextgroup=NITFFIBlockPython skipwhite
 syn region NITFFIBlockPython matchgroup=NITFFI start='`{' matchgroup=NITFFI end='`}' keepend fold contains=@FFIPython
 
 " FFI Java
 syntax include @FFIJava syntax/java.vim
 unlet b:current_syntax
-syn match NITFFILanguage       /\c"Java\(\| inner\)"/ nextgroup=NITFFIBlockJava skipwhite
+syn match NITFFILanguage       /\c"Java\(\| inner\)"\ze.*`{/ nextgroup=NITFFIBlockJava skipwhite
 syn region NITFFIBlockJava matchgroup=NITFFI start='`{' matchgroup=NITFFI end='`}' keepend fold contains=@FFIJava
 
 " FFI C++
 syntax include @FFICpp syntax/cpp.vim
 unlet b:current_syntax
-syn match NITFFILanguage       /\c"C++\(\| header\| body\)"/ nextgroup=NITFFIBlockCpp skipwhite
+syn match NITFFILanguage       /\c"C++\(\| header\| body\)"\ze.*`{/ nextgroup=NITFFIBlockCpp skipwhite
 syn region NITFFIBlockCpp matchgroup=NITFFI start='`{' matchgroup=NITFFI end='`}' keepend fold contains=@FFICpp
 
 " FFI Objective-C
 syntax include @FFIObjC syntax/objc.vim
 unlet b:current_syntax
-syn match NITFFILanguage       /\c"ObjC\(\| Header\| Body\)"/ nextgroup=NITFFIBlockObjC skipwhite
+syn match NITFFILanguage       /\c"ObjC\(\| Header\| Body\)"\ze.*`{/ nextgroup=NITFFIBlockObjC skipwhite
 syn region NITFFIBlockObjC matchgroup=NITFFI start='`{' matchgroup=NITFFI end='`}' keepend fold contains=@FFIObjC
 
 " FFI C (the last one is the default)
 syntax include @FFIC syntax/c.vim
 unlet b:current_syntax
-syn match NITFFILanguage               /\c"C\(\| header\| body\)"/     nextgroup=NITFFIBlockC skipwhite
+syn match NITFFILanguage               /\c"C\(\| header\| body\)"\ze.*`{/      nextgroup=NITFFIBlockC skipwhite
 syn region NITFFIBlockC matchgroup=NITFFI start='`{' matchgroup=NITFFI end='`}' keepend fold contains=@FFIC
 
 hi def link NITFFILanguage             Define
index 99c8763..7dafd2f 100644 (file)
@@ -244,7 +244,9 @@ redef class AIfExpr
                _n_kwif = new TKwif
                _n_expr = condition
                _n_expr.parent = self
+               _n_kwthen = new TKwthen
                _n_then = new ABlockExpr.make
+               _n_kwelse = new TKwelse
                _n_else = new ABlockExpr.make
                self.mtype = mtype
                self.is_typed = true
index 932f03d..df2ddd8 100644 (file)
@@ -47,33 +47,37 @@ class CCompilationUnit
        # files to compile TODO check is appropriate
        var files = new Array[String]
 
-       fun add_local_function( efc : CFunction )
+       # Add `c_function` as a `static` function local to this unit
+       fun add_local_function(c_function: CFunction)
        do
-               body_decl.add "static {efc.signature};\n"
+               body_decl.add "static {c_function.signature};\n"
                body_impl.add "\n"
-               body_impl.add efc.to_writer
+               body_impl.add c_function.to_writer
        end
 
-       fun add_exported_function( efc : CFunction )
+       # Add `c_function` as a public function to this unit
+       fun add_exported_function(c_function: CFunction)
        do
-               header_decl.add( "{efc.signature};\n" )
-               body_impl.add( "\n" )
-               body_impl.add( efc.to_writer )
+               header_decl.add "{c_function.signature};\n"
+               body_impl.add "\n"
+               body_impl.add c_function.to_writer
        end
 
-       fun compile_header_core( stream : Writer )
+       # Write the core of the header to `stream`
+       fun compile_header_core(stream: Writer)
        do
-               header_c_base.write_to( stream )
-               header_custom.write_to( stream )
-               header_c_types.write_to( stream )
-               header_decl.write_to( stream )
+               header_c_base.write_to stream
+               header_custom.write_to stream
+               header_c_types.write_to stream
+               header_decl.write_to stream
        end
 
-       fun compile_body_core( stream : Writer )
+       # Write the core of the body to `stream`
+       fun compile_body_core(stream: Writer)
        do
-               body_decl.write_to( stream )
-               body_custom.write_to( stream )
-               body_impl.write_to( stream )
+               body_decl.write_to stream
+               body_custom.write_to stream
+               body_impl.write_to stream
        end
 end
 
similarity index 63%
rename from src/compiler/compiler_ffi.nit
rename to src/compiler/compiler_ffi/compiler_ffi.nit
index 42423f9..8b8f9de 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# FFI support for the compilers
+# Full FFI support for the compiler
 module compiler_ffi
 
-intrude import abstract_compiler
-intrude import ffi
+intrude import light
 import nitni
 
 redef class MModule
        private var foreign_callbacks = new ForeignCallbackSet
-       var nitni_ccu: nullable CCompilationUnit = null
-
-       private fun nmodule(v: AbstractCompilerVisitor): nullable AModule
-       do
-               return v.compiler.modelbuilder.mmodule2node(self)
-       end
 
        redef fun finalize_ffi(compiler: AbstractCompiler)
        do
                if not uses_ffi then return
 
-               var v = compiler.new_visitor
-               var n = nmodule(v)
-               if n == null then return
-               n.ensure_compile_ffi_wrapper
-               finalize_ffi_wrapper(v.compiler.modelbuilder.compile_dir, v.compiler.mainmodule)
-               for file in ffi_files do v.compiler.extern_bodies.add(file)
-
-               ensure_compile_nitni_base(v)
-
-               nitni_ccu.header_c_types.add("#include \"{c_name}._ffi.h\"\n")
-               nitni_ccu.header_c_types.add """
-extern void nitni_global_ref_incr(void*);
-extern void nitni_global_ref_decr(void*);
-"""
-
-               var cflags = self.cflags[""].join(" ")
-               nitni_ccu.write_as_nitni(self, v.compiler.modelbuilder.compile_dir)
-
-               for file in nitni_ccu.files do
-                       var f = new ExternCFile(file, cflags)
-                       f.pkgconfigs.add_all pkgconfigs
-                       v.compiler.extern_bodies.add(f)
-               end
+               super
 
-               # reset FFI things so the next compilation job, if any, starts with a clean context
-               # FIXME clean and rationalize this
-               nitni_ccu = null
-               compiled_ffi_methods.clear
-               ffi_ccu = null
-               ffi_files.clear
                compiled_callbacks.clear
                #Do not reset `foreign_callbacks` and `ffi_callbacks` because they are computed in previous phases
        end
 
-       private fun ensure_compile_nitni_base(v: AbstractCompilerVisitor)
-       do
-               if nitni_ccu != null then return
-
-               nitni_ccu = new CCompilationUnit
-       end
-
-       redef fun collect_linker_libs
-       do
-               if not self.ldflags.keys.has("") then return null
-               return self.ldflags[""]
-       end
-
        private var compiled_callbacks = new Array[NitniCallback]
 
        # Returns true if callbacks has yet to be generated and register it as being generated
@@ -93,23 +45,12 @@ extern void nitni_global_ref_decr(void*);
 end
 
 redef class AMethPropdef
-       private fun compile_ffi_support_to_c(v: AbstractCompilerVisitor)
+       redef fun compile_ffi_support_to_c(v)
        do
+               super
+
                var mmodule = mpropdef.mclassdef.mmodule
                var mainmodule = v.compiler.mainmodule
-               var amodule = v.compiler.modelbuilder.mmodule2node(mmodule)
-               var mclass_type = mpropdef.mclassdef.bound_mtype
-
-               # Declare as extern
-               var csignature = mpropdef.mproperty.build_csignature(mclass_type, mmodule, "___impl", long_signature, internal_call_context)
-               v.declare_once("{csignature};")
-
-               # FFI part
-               amodule.ensure_compile_ffi_wrapper
-               compile_ffi_method(mmodule)
-
-               # nitni - Compile missing callbacks
-               mmodule.ensure_compile_nitni_base(v)
                var ccu = mmodule.nitni_ccu.as(not null)
 
                for mtype in foreign_callbacks.types do
@@ -137,178 +78,71 @@ redef class AMethPropdef
                # manage nitni callback set
                mmodule.foreign_callbacks.join(foreign_callbacks)
        end
+end
 
-       redef fun compile_externmeth_to_c(v, mpropdef, arguments)
+redef class MExplicitCall
+       private fun compile_extern_callback(v: AbstractCompilerVisitor, ccu: CCompilationUnit, compile_implementation_too: Bool)
        do
-               # if using the old native interface fallback on previous implementation
-               if n_extern_code_block == null then return super
+               var mproperty = mproperty
+               assert mproperty isa MMethod
 
-               var mmodule = mpropdef.mclassdef.mmodule
-               mmodule.uses_ffi = true
+               # In nitni files, declare internal function as extern
+               var full_friendly_csignature = mproperty.build_csignature(recv_mtype, v.compiler.mainmodule, null, long_signature, internal_call_context)
+               ccu.header_decl.add("extern {full_friendly_csignature};\n")
 
-               var mclass_type = mpropdef.mclassdef.bound_mtype
+               if not compile_implementation_too then return
 
-               # Outgoing code in compiler
-               var externname = mpropdef.mproperty.build_cname(mpropdef.mclassdef.bound_mtype, mmodule, "___impl", long_signature)
-               var recv_var: nullable RuntimeVariable = null
-               var return_mtype = mpropdef.msignature.return_mtype
-               if return_mtype != null then
-                       return_mtype = return_mtype.anchor_to(mmodule, mclass_type)
-                       recv_var = v.new_var(return_mtype)
-               end
+               # Internally, implement internal function
+               var nitni_visitor = v.compiler.new_visitor
+               nitni_visitor.frame = v.frame
+               var msignature = mproperty.lookup_first_definition(v.compiler.mainmodule, recv_mtype).msignature
+               var csignature_blind = mproperty.build_csignature(recv_mtype, v.compiler.mainmodule, null, long_signature, internal_call_context)
 
-               v.adapt_signature(mpropdef, arguments)
-               v.unbox_signature_extern(mpropdef, arguments)
-
-               var arguments_for_c = new Array[String]
-               for a in [0..arguments.length[ do
-                       var arg = arguments[a]
-                       var param_mtype: MType
-                       if a == 0 then
-                               param_mtype = mpropdef.mclassdef.mclass.mclass_type
-                       else param_mtype = mpropdef.msignature.mparameters[a-1].mtype
-
-                       param_mtype = param_mtype.anchor_to(mmodule, mclass_type)
-
-                       if param_mtype.is_cprimitive then
-                               arguments_for_c.add(arg.name)
-                       else
-                               v.add("struct nitni_instance* var_for_c_{a};")
-                               v.add("var_for_c_{a} = nit_alloc(sizeof(struct nitni_instance));")
-                               v.add("var_for_c_{a}->value = {arg.name};")
-                               arguments_for_c.add("var_for_c_{a}")
-                       end
-               end
+               nitni_visitor.add_decl("/* nitni callback for {mproperty.full_name} */")
+               nitni_visitor.add_decl("{csignature_blind} \{")
 
-               if recv_var == null then
-                       v.add("{externname}({arguments_for_c.join(", ")});")
+               var vars = new Array[RuntimeVariable]
+               var mtype: MType = recv_mtype
+               var recv_var = null
+               if mproperty.is_init then
+                       var recv_mtype = recv_mtype
+                       recv_var = nitni_visitor.init_instance_or_extern(recv_mtype)
+                       nitni_visitor.add("{mtype.ctype} recv /* var self: {mtype} */;")
+                       nitni_visitor.add("recv = {recv_var};")
                else
-                       assert return_mtype != null
-                       if return_mtype.is_cprimitive then
-                               v.add("{recv_var} = {externname}({arguments_for_c.join(", ")});")
-                       else
-                               v.add("struct nitni_instance* ret_var;")
-                               v.add("ret_var = {externname}({arguments_for_c.join(", ")});")
-                               v.add("{recv_var} = ret_var->value;")
-                       end
-                       recv_var = v.box_extern(recv_var, return_mtype)
-                       v.ret(recv_var)
+                       mtype = mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
+                       recv_var = nitni_visitor.var_from_c("recv", mtype)
+                       recv_var = nitni_visitor.box_extern(recv_var, mtype)
                end
 
-               compile_ffi_support_to_c(v)
-               return true
-       end
-
-       redef fun compile_externinit_to_c(v, mpropdef, arguments)
-       do
-               # if using the old native interface fallback on previous implementation
-               if n_extern_code_block == null then return super
-
-               var mmodule = mpropdef.mclassdef.mmodule
-               mmodule.uses_ffi = true
-
-               var mclass_type = mpropdef.mclassdef.bound_mtype
-
-               var externname = mpropdef.mproperty.build_cname(mpropdef.mclassdef.bound_mtype, mmodule, "___impl", long_signature)
-               var return_mtype = arguments.first.mtype
-               var recv_var = v.new_var(return_mtype)
-
-               v.adapt_signature(mpropdef, arguments)
-               v.unbox_signature_extern(mpropdef, arguments)
-
-               arguments.shift
-
-               var arguments_for_c = new Array[String]
-               for a in [0..arguments.length[ do
-                       var arg = arguments[a]
-                       var param_mtype: MType
-                       param_mtype = mpropdef.msignature.mparameters[a].mtype
-                       param_mtype = param_mtype.anchor_to(mmodule, mclass_type)
-
-                       if param_mtype.is_cprimitive then
-                               arguments_for_c.add(arg.name)
-                       else
-                               v.add("struct nitni_instance* var_for_c_{a};")
-                               v.add("var_for_c_{a} = nit_alloc(sizeof(struct nitni_instance));")
-                               v.add("var_for_c_{a}->value = {arg.name};")
-                               arguments_for_c.add("var_for_c_{a}")
-                       end
-               end
+               vars.add(recv_var)
 
-               if return_mtype.is_cprimitive then
-                       v.add("{recv_var} = {externname}({arguments_for_c.join(", ")});")
-               else
-                       v.add("struct nitni_instance* ret_var;")
-                       v.add("ret_var = {externname}({arguments_for_c.join(", ")});")
-                       v.add("{recv_var} = ret_var->value;")
+               for p in msignature.mparameters do
+                       var arg_mtype = p.mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
+                       var arg = nitni_visitor.var_from_c(p.name, arg_mtype)
+                       arg = nitni_visitor.box_extern(arg, arg_mtype)
+                       vars.add(arg)
                end
-               recv_var = v.box_extern(recv_var, return_mtype)
-               v.ret(recv_var)
 
-               compile_ffi_support_to_c(v)
-               return true
-       end
-end
-
-redef class CCompilationUnit
-       fun write_as_nitni(mmodule: MModule, compdir: String)
-       do
-               var base_name = "{mmodule.c_name}._nitni"
-
-               var h_file = "{base_name}.h"
-               write_header_to_file( mmodule, "{compdir}/{h_file}", new Array[String],
-                       "{mmodule.c_name.to_s.to_upper}_NITG_NITNI_H")
-
-               var c_file = "{base_name}.c"
-               write_body_to_file( mmodule, "{compdir}/{c_file}", ["\"{h_file}\""] )
-
-               files.add( "{compdir}/{c_file}" )
-       end
-end
-
-redef class AbstractCompiler
-       # Cache to avoid multiple compilation of NULL values
-       # see FIXME in `MNullableType#compile_extern_helper_functions`
-       private var compiled_null_types = new Array[MNullableType]
-end
+               var ret_var = nitni_visitor.send(mproperty, vars)
 
-redef class AbstractCompilerVisitor
-       # Create a `RuntimeVariable` for this C variable originating from C user code
-       private fun var_from_c(name: String, mtype: MType): RuntimeVariable
-       do
-               if mtype.is_cprimitive then
-                       return new RuntimeVariable(name, mtype, mtype)
-               else
-                       return new RuntimeVariable("{name}->value", mtype, mtype)
+               var return_mtype = msignature.return_mtype
+               if mproperty.is_init then
+                       if recv_mtype.mclass.kind != extern_kind then ret_var = recv_var
+                       return_mtype = recv_mtype
                end
-       end
-
-       # Return a `RuntimeVarible` to C user code
-       private fun ret_to_c(src: RuntimeVariable, mtype: MType)
-       do
-               if mtype.is_cprimitive then
-                       add("return {src};")
-               else
-                       add("struct nitni_instance* ret_for_c;")
-                       add("ret_for_c = nit_alloc(sizeof(struct nitni_instance));")
-                       add("ret_for_c->value = {src};")
-                       add("return ret_for_c;")
+               if return_mtype != null then
+                       assert ret_var != null
+                       return_mtype = return_mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
+                       ret_var = nitni_visitor.autobox(ret_var, return_mtype)
+                       ret_var = nitni_visitor.unbox_extern(ret_var, return_mtype)
+                       nitni_visitor.ret_to_c(ret_var, return_mtype)
                end
+               nitni_visitor.add("\}")
        end
 end
 
 redef class MType
-       private fun compile_extern_type(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
-       do
-               assert not is_cprimitive
-
-               # define friendly type
-               ccu.header_c_types.add("#ifndef NIT_TYPE_{cname}\n")
-               ccu.header_c_types.add("#define NIT_TYPE_{cname} 1\n")
-               ccu.header_c_types.add("typedef struct nitni_instance *{cname};\n")
-               ccu.header_c_types.add("#endif\n")
-       end
-
        private fun compile_extern_helper_functions(v: AbstractCompilerVisitor, ccu: CCompilationUnit, compile_implementation_too: Bool)
        do
                # actually, we do not need to do anything when using the bohem garbage collector
@@ -362,68 +196,6 @@ redef class MNullableType
        end
 end
 
-redef class MExplicitCall
-       private fun compile_extern_callback(v: AbstractCompilerVisitor, ccu: CCompilationUnit, compile_implementation_too: Bool)
-       do
-               var mproperty = mproperty
-               assert mproperty isa MMethod
-
-               # In nitni files, declare internal function as extern
-               var full_friendly_csignature = mproperty.build_csignature(recv_mtype, v.compiler.mainmodule, null, long_signature, internal_call_context)
-               ccu.header_decl.add("extern {full_friendly_csignature};\n")
-
-               if not compile_implementation_too then return
-
-               # Internally, implement internal function
-               var nitni_visitor = v.compiler.new_visitor
-               nitni_visitor.frame = v.frame
-               var msignature = mproperty.lookup_first_definition(v.compiler.mainmodule, recv_mtype).msignature
-               var csignature_blind = mproperty.build_csignature(recv_mtype, v.compiler.mainmodule, null, long_signature, internal_call_context)
-
-               nitni_visitor.add_decl("/* nitni callback for {mproperty.full_name} */")
-               nitni_visitor.add_decl("{csignature_blind} \{")
-
-               var vars = new Array[RuntimeVariable]
-               var mtype: MType = recv_mtype
-               var recv_var = null
-               if mproperty.is_init then
-                       var recv_mtype = recv_mtype
-                       recv_var = nitni_visitor.init_instance_or_extern(recv_mtype)
-                       nitni_visitor.add("{mtype.ctype} recv /* var self: {mtype} */;")
-                       nitni_visitor.add("recv = {recv_var};")
-               else
-                       mtype = mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
-                       recv_var = nitni_visitor.var_from_c("recv", mtype)
-                       recv_var = nitni_visitor.box_extern(recv_var, mtype)
-               end
-
-               vars.add(recv_var)
-
-               for p in msignature.mparameters do
-                       var arg_mtype = p.mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
-                       var arg = nitni_visitor.var_from_c(p.name, arg_mtype)
-                       arg = nitni_visitor.box_extern(arg, arg_mtype)
-                       vars.add(arg)
-               end
-
-               var ret_var = nitni_visitor.send(mproperty, vars)
-
-               var return_mtype = msignature.return_mtype
-               if mproperty.is_init then
-                       if recv_mtype.mclass.kind != extern_kind then ret_var = recv_var
-                       return_mtype = recv_mtype
-               end
-               if return_mtype != null then
-                       assert ret_var != null
-                       return_mtype = return_mtype.anchor_to(v.compiler.mainmodule, recv_mtype)
-                       ret_var = nitni_visitor.autobox(ret_var, return_mtype)
-                       ret_var = nitni_visitor.unbox_extern(ret_var, return_mtype)
-                       nitni_visitor.ret_to_c(ret_var, return_mtype)
-               end
-               nitni_visitor.add("\}")
-       end
-end
-
 redef class MExplicitSuper
        private fun compile_extern_callback(v: AbstractCompilerVisitor, ccu: CCompilationUnit, compile_implementation_too: Bool)
        do
diff --git a/src/compiler/compiler_ffi/light.nit b/src/compiler/compiler_ffi/light.nit
new file mode 100644 (file)
index 0000000..dbe819a
--- /dev/null
@@ -0,0 +1,281 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2013-2015 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Light FFI support for the compiler
+module light
+
+intrude import abstract_compiler
+intrude import ffi::light_ffi
+
+redef class MModule
+       # `CCompilationUnit` used for nitni signatures and code specific to the compiler
+       var nitni_ccu: nullable CCompilationUnit = null
+
+       private fun nmodule(v: AbstractCompilerVisitor): nullable AModule
+       do
+               return v.compiler.modelbuilder.mmodule2node(self)
+       end
+
+       redef fun finalize_ffi(compiler: AbstractCompiler)
+       do
+               if not uses_ffi then return
+
+               var v = compiler.new_visitor
+               var n = nmodule(v)
+               if n == null then return
+               n.ensure_compile_ffi_wrapper
+               finalize_ffi_wrapper(v.compiler.modelbuilder.compile_dir, v.compiler.mainmodule)
+               for file in ffi_files do v.compiler.extern_bodies.add(file)
+
+               ensure_compile_nitni_base(v)
+
+               nitni_ccu.header_c_types.add("#include \"{c_name}._ffi.h\"\n")
+               nitni_ccu.header_c_types.add """
+extern void nitni_global_ref_incr(void*);
+extern void nitni_global_ref_decr(void*);
+"""
+
+               var cflags = self.cflags[""].join(" ")
+               nitni_ccu.write_as_nitni(self, v.compiler.modelbuilder.compile_dir)
+
+               for file in nitni_ccu.files do
+                       var f = new ExternCFile(file, cflags)
+                       f.pkgconfigs.add_all pkgconfigs
+                       v.compiler.extern_bodies.add(f)
+               end
+
+               # reset FFI things so the next compilation job, if any, starts with a clean context
+               # FIXME clean and rationalize this
+               nitni_ccu = null
+               compiled_ffi_methods.clear
+               ffi_ccu = null
+               ffi_files.clear
+       end
+
+       private fun ensure_compile_nitni_base(v: AbstractCompilerVisitor)
+       do
+               if nitni_ccu != null then return
+
+               nitni_ccu = new CCompilationUnit
+       end
+
+       redef fun collect_linker_libs
+       do
+               if not self.ldflags.keys.has("") then return null
+               return self.ldflags[""]
+       end
+end
+
+redef class AMethPropdef
+       private fun compile_ffi_support_to_c(v: AbstractCompilerVisitor)
+       do
+               var mmodule = mpropdef.mclassdef.mmodule
+               var amodule = v.compiler.modelbuilder.mmodule2node(mmodule)
+               var mclass_type = mpropdef.mclassdef.bound_mtype
+
+               # Declare as extern
+               var csignature = mpropdef.mproperty.build_csignature(mclass_type, mmodule, "___impl", long_signature, internal_call_context)
+               v.declare_once("{csignature};")
+
+               # FFI part
+               amodule.ensure_compile_ffi_wrapper
+               compile_ffi_method(mmodule)
+
+               # nitni - Compile missing callbacks
+               mmodule.ensure_compile_nitni_base(v)
+       end
+
+       # Should we compile the extern method `self`?
+       #
+       # Returns false when restricting to the light FFI on methods using callbacks.
+       fun accept_externmeth: Bool do return true
+
+       redef fun compile_externmeth_to_c(v, mpropdef, arguments)
+       do
+               # if using the old native interface fallback on previous implementation
+               if n_extern_code_block == null then return super
+
+               if not accept_externmeth then return false
+
+               var mmodule = mpropdef.mclassdef.mmodule
+               mmodule.uses_ffi = true
+
+               var mclass_type = mpropdef.mclassdef.bound_mtype
+
+               # Outgoing code in compiler
+               var externname = mpropdef.mproperty.build_cname(mpropdef.mclassdef.bound_mtype, mmodule, "___impl", long_signature)
+               var recv_var: nullable RuntimeVariable = null
+               var return_mtype = mpropdef.msignature.return_mtype
+               if return_mtype != null then
+                       return_mtype = return_mtype.anchor_to(mmodule, mclass_type)
+                       recv_var = v.new_var(return_mtype)
+               end
+
+               v.adapt_signature(mpropdef, arguments)
+               v.unbox_signature_extern(mpropdef, arguments)
+
+               var arguments_for_c = new Array[String]
+               for a in [0..arguments.length[ do
+                       var arg = arguments[a]
+                       var param_mtype: MType
+                       if a == 0 then
+                               param_mtype = mpropdef.mclassdef.mclass.mclass_type
+                       else param_mtype = mpropdef.msignature.mparameters[a-1].mtype
+
+                       param_mtype = param_mtype.anchor_to(mmodule, mclass_type)
+
+                       if param_mtype.is_cprimitive then
+                               arguments_for_c.add(arg.name)
+                       else
+                               v.add("struct nitni_instance* var_for_c_{a};")
+                               v.add("var_for_c_{a} = nit_alloc(sizeof(struct nitni_instance));")
+                               v.add("var_for_c_{a}->value = {arg.name};")
+                               arguments_for_c.add("var_for_c_{a}")
+                       end
+               end
+
+               if recv_var == null then
+                       v.add("{externname}({arguments_for_c.join(", ")});")
+               else
+                       assert return_mtype != null
+                       if return_mtype.is_cprimitive then
+                               v.add("{recv_var} = {externname}({arguments_for_c.join(", ")});")
+                       else
+                               v.add("struct nitni_instance* ret_var;")
+                               v.add("ret_var = {externname}({arguments_for_c.join(", ")});")
+                               v.add("{recv_var} = ret_var->value;")
+                       end
+                       recv_var = v.box_extern(recv_var, return_mtype)
+                       v.ret(recv_var)
+               end
+
+               compile_ffi_support_to_c(v)
+               return true
+       end
+
+       redef fun compile_externinit_to_c(v, mpropdef, arguments)
+       do
+               # if using the old native interface fallback on previous implementation
+               if n_extern_code_block == null then return super
+
+               if not accept_externmeth then return false
+
+               var mmodule = mpropdef.mclassdef.mmodule
+               mmodule.uses_ffi = true
+
+               var mclass_type = mpropdef.mclassdef.bound_mtype
+
+               var externname = mpropdef.mproperty.build_cname(mpropdef.mclassdef.bound_mtype, mmodule, "___impl", long_signature)
+               var return_mtype = arguments.first.mtype
+               var recv_var = v.new_var(return_mtype)
+
+               v.adapt_signature(mpropdef, arguments)
+               v.unbox_signature_extern(mpropdef, arguments)
+
+               arguments.shift
+
+               var arguments_for_c = new Array[String]
+               for a in [0..arguments.length[ do
+                       var arg = arguments[a]
+                       var param_mtype: MType
+                       param_mtype = mpropdef.msignature.mparameters[a].mtype
+                       param_mtype = param_mtype.anchor_to(mmodule, mclass_type)
+
+                       if param_mtype.is_cprimitive then
+                               arguments_for_c.add(arg.name)
+                       else
+                               v.add("struct nitni_instance* var_for_c_{a};")
+                               v.add("var_for_c_{a} = nit_alloc(sizeof(struct nitni_instance));")
+                               v.add("var_for_c_{a}->value = {arg.name};")
+                               arguments_for_c.add("var_for_c_{a}")
+                       end
+               end
+
+               if return_mtype.is_cprimitive then
+                       v.add("{recv_var} = {externname}({arguments_for_c.join(", ")});")
+               else
+                       v.add("struct nitni_instance* ret_var;")
+                       v.add("ret_var = {externname}({arguments_for_c.join(", ")});")
+                       v.add("{recv_var} = ret_var->value;")
+               end
+               recv_var = v.box_extern(recv_var, return_mtype)
+               v.ret(recv_var)
+
+               compile_ffi_support_to_c(v)
+               return true
+       end
+end
+
+redef class CCompilationUnit
+       # Compile a `_nitni` files, used to implement nitni features for the compiler
+       fun write_as_nitni(mmodule: MModule, compdir: String)
+       do
+               var base_name = "{mmodule.c_name}._nitni"
+
+               var h_file = "{base_name}.h"
+               write_header_to_file( mmodule, "{compdir}/{h_file}", new Array[String],
+                       "{mmodule.c_name.to_s.to_upper}_NITG_NITNI_H")
+
+               var c_file = "{base_name}.c"
+               write_body_to_file( mmodule, "{compdir}/{c_file}", ["\"{h_file}\""] )
+
+               files.add( "{compdir}/{c_file}" )
+       end
+end
+
+redef class AbstractCompiler
+       # Cache to avoid multiple compilation of NULL values
+       # see FIXME in `MNullableType#compile_extern_helper_functions`
+       private var compiled_null_types = new Array[MNullableType]
+end
+
+redef class AbstractCompilerVisitor
+       # Create a `RuntimeVariable` for this C variable originating from C user code
+       private fun var_from_c(name: String, mtype: MType): RuntimeVariable
+       do
+               if mtype.is_cprimitive then
+                       return new RuntimeVariable(name, mtype, mtype)
+               else
+                       return new RuntimeVariable("{name}->value", mtype, mtype)
+               end
+       end
+
+       # Return a `RuntimeVarible` to C user code
+       private fun ret_to_c(src: RuntimeVariable, mtype: MType)
+       do
+               if mtype.is_cprimitive then
+                       add("return {src};")
+               else
+                       add("struct nitni_instance* ret_for_c;")
+                       add("ret_for_c = nit_alloc(sizeof(struct nitni_instance));")
+                       add("ret_for_c->value = {src};")
+                       add("return ret_for_c;")
+               end
+       end
+end
+
+redef class MType
+       private fun compile_extern_type(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
+       do
+               assert not is_cprimitive
+
+               # define friendly type
+               ccu.header_c_types.add("#ifndef NIT_TYPE_{cname}\n")
+               ccu.header_c_types.add("#define NIT_TYPE_{cname} 1\n")
+               ccu.header_c_types.add("typedef struct nitni_instance *{cname};\n")
+               ccu.header_c_types.add("#endif\n")
+       end
+end
diff --git a/src/compiler/compiler_ffi/light_only.nit b/src/compiler/compiler_ffi/light_only.nit
new file mode 100644 (file)
index 0000000..3fc162d
--- /dev/null
@@ -0,0 +1,26 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Compiler support for the light FFI only, detects unsupported usage of callbacks
+module light_only
+
+import light
+
+redef class MClassType
+       redef fun cname_normal_class do return "void*"
+end
+
+redef class AMethPropdef
+       redef fun accept_externmeth do return n_extern_calls == null
+end
index 495d4e6..e09a80f 100644 (file)
 module c
 
 import ffi_base
+import light_c
 
-redef class FFILanguageAssignationPhase
-       var c_language: FFILanguage = new CLanguage(self)
-end
-
-class CLanguage
-       super FFILanguage
-
-       redef fun identify_language(n) do return n.is_c
-
-       redef fun compile_module_block(block, ecc, mmodule)
-       do
-               if block.is_c_header then
-                       ecc.header_custom.add block.location.as_line_pragma
-                       ecc.header_custom.add "\n"
-                       ecc.header_custom.add block.code
-               else if block.is_c_body then
-                       ecc.body_impl.add block.location.as_line_pragma
-                       ecc.body_impl.add "\n"
-                       ecc.body_impl.add block.code
-               end
-       end
-
-       redef fun compile_extern_method(block, m, ecc, mmodule)
-       do
-               var fc = new ExternCFunction(m, mmodule)
-               fc.decls.add( block.location.as_line_pragma )
-               fc.exprs.add( block.code )
-               ecc.add_exported_function( fc )
-       end
-
-       redef fun compile_extern_class(block, m, ecc, mmodule) do end
-
-       redef fun get_ftype(block, m) do return new ForeignCType(block.code)
-
+redef class CLanguage
        redef fun compile_callback(callback, mmodule, mainmodule, ecc)
        do
                callback.compile_callback_to_c(mainmodule, ecc)
        end
 end
 
-redef class AExternCodeBlock
-       fun is_c: Bool do return language_name == null or
-               language_name_lowered == "c" or language_name_lowered.has_prefix( "c " )
-
-       fun is_c_body: Bool do return language_name == null or
-               language_name_lowered == "c" or language_name_lowered ==  "c body"
-
-       fun is_c_header: Bool do return language_name_lowered == "c header"
-end
-
-redef class Location
-       fun as_line_pragma: String do return "#line {line_start-1} \"{file.filename}\"\n"
-end
-
-redef class MModule
-       # FIXME make nullable the key of `cflags`, `ldflags` and `cppflags` when
-       # supported by the bootstrap
-
-       # Custom options for the C compiler (CFLAGS)
-       var cflags = new MultiHashMap[String, String]
-
-       # Custom options for the C linker (LDFLAGS)
-       var ldflags = new MultiHashMap[String, String]
-
-       # Additional libraries needed for the compilation
-       # Will be used with pkg-config
-       var pkgconfigs = new Array[String]
-end
-
-class ForeignCType
-       super ForeignType
-
-       redef var ctype: String
-end
-
 redef class NitniCallback
        fun compile_callback_to_c(mmodule: MModule, ffi_ccu: CCompilationUnit) do end
 end
 
-redef class Object
-       # Context when calling user C code from generated code
-       fun to_c_call_context: ToCCallContext do return once new ToCCallContext
-
-       # Context when calling generated code from user C code
-       fun from_c_call_context: FromCCallContext do return once new FromCCallContext
-end
-
 redef class MExplicitCall
        redef fun compile_callback_to_c(mmodule, ffi_ccu)
        do
@@ -116,41 +41,3 @@ redef class MExplicitCall
                ffi_ccu.body_decl.add("#define {friendly_cname} {full_cname}\n")
        end
 end
-
-# Context when calling user C code from generated code
-class ToCCallContext
-       super CallContext
-
-       # TODO: private init because singleton instance (see `to_c_call_context`)
-
-       redef fun name_mtype(mtype)
-       do
-               if mtype isa MClassType and mtype.mclass.kind == extern_kind then return "void *"
-               return mtype.cname
-       end
-end
-
-# Context when calling generated code from user C code
-class FromCCallContext
-       super CallContext
-
-       # TODO: private init because singleton instance (see `from_c_call_context`)
-
-       redef fun name_mtype(mtype) do return mtype.cname
-end
-
-class ExternCFunction
-       super CFunction
-
-       var method: AMethPropdef
-
-       init (method: AMethPropdef, mmodule: MModule)
-       do
-               self.method = method
-
-               var recv_mtype = method.mpropdef.mclassdef.bound_mtype
-               var csignature = method.mpropdef.mproperty.build_csignature(recv_mtype, mmodule, "___impl", long_signature, from_c_call_context)
-
-               super( csignature )
-       end
-end
index 6b53008..c0e826b 100644 (file)
@@ -17,7 +17,8 @@
 # Manages all extern classes and their associated foreign type.
 module extern_classes
 
-import ffi_base
+import light_ffi_base
+import modelize
 
 redef class ToolContext
        var extern_classes_typing_phase_ast: Phase = new ExternClassesTypingPhaseAst(self, [ffi_language_assignation_phase, modelize_class_phase])
index 93acf66..e58d32a 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# FFI concers common between the compilers and the interpreter.
-# Offers services to compile modules using foreign code. Mainly allows
-# to wrap foreign code in Nit methods.
+# Full FFI support, independent of the compiler
+#
+# The full FFI support all the features of the light FFI and more:
+#
+# * More foreign languages: **C++, Java and Objective-C**.
+# * **Callbacks** to Nit from foreign codes.
+#   The callbacks are declared in Nit using the `import` annotation on extern methods.
+#   They are then generated on demand for the target foreign language.
+# * **Static Nit types** in C for precise typing and static typing errors in C.
+# * **Propagating public code blocks** at the module level (C Header).
+#   This allows to use extern classes in foreign code in other modules
+#   without having to import the related headers.
+#   This is optional in C as it is easy to find the correct importation.
+#   However it is important in Java and other complex FFIs.
+# * **Reference pinning** of Nit objects from foreign code.
+#   This ensure that objects referenced from foreign code are not liberated by the GC.
+# * FFI **annotations**:
+#   * `cflags`, `ldflags` and `cppflags` pass arguments to the C and C++
+# compilers and linker.
+#   * `pkgconfig` calls the `pkg-config` program to get the arguments
+# to pass to the C copiler and linker.
+#   * `extra_java_files` adds Java source file to the compilation chain.
 module ffi
 
 import modelbuilder
@@ -33,19 +52,11 @@ import cpp
 import java
 import extra_java_files
 import objc
+intrude import light_ffi
 
 redef class MModule
-       # Does this module uses the FFI?
-       var uses_ffi: Bool = false
-
-       # C compilation unit for the FFI files
-       private var ffi_ccu: nullable CCompilationUnit = null
-
-       # Foreign language used in this AModule
-       private var present_languages = new HashSet[FFILanguage]
-
        # Complete the compilation of the FFI code
-       fun finalize_ffi_wrapper(compdir: String, mainmodule: MModule)
+       redef fun finalize_ffi_wrapper(compdir, mainmodule)
        do
                for language in ffi_callbacks.keys do
                        for callback in ffi_callbacks[language] do
@@ -60,82 +71,10 @@ redef class MModule
                        if mod.uses_ffi then ffi_ccu.header_custom.add("#include \"{mod.c_name}._ffi.h\"\n")
                end
 
-               var cflags = self.cflags[""].join(" ")
-
-               ffi_ccu.write_as_impl(self, compdir)
-               for filename in ffi_ccu.files do
-                       var f = new ExternCFile(filename, cflags)
-                       f.pkgconfigs.add_all pkgconfigs
-                       ffi_files.add(f)
-               end
-       end
-
-       # Avoid the compile a ffi propdef more than once
-       # See `AMethPropdef::compile_ffi_method`
-       # FIXME find a better way
-       private var compiled_ffi_methods = new HashSet[AMethPropdef]
-end
-
-redef class AModule
-
-       # Ensures all of the general foreign code of the module has been analyzed.
-       # Manages header blocks, extern class types and foreign dependancies between modules
-       fun ensure_compile_ffi_wrapper
-       do
-               var mmodule = mmodule
-               if mmodule == null or mmodule.ffi_ccu != null then return
-
-               # ready extern code compiler
-               var ffi_ccu = new CCompilationUnit
-               mmodule.ffi_ccu = ffi_ccu
-
-               # generate code
-               for block in n_extern_code_blocks do
-                       var language = block.language
-                       assert language != null
-                       mmodule.present_languages.add(language)
-                       language.compile_module_block(block, ffi_ccu, mmodule)
-               end
-
-               ffi_ccu.header_c_base.add( "#include \"{mmodule.c_name}._nitni.h\"\n" )
-
-               ffi_ccu.body_decl.add("#ifdef ANDROID\n")
-               ffi_ccu.body_decl.add(" #include <android/log.h>\n")
-               ffi_ccu.body_decl.add(" #define PRINT_ERROR(...) (void)__android_log_print(ANDROID_LOG_WARN, \"Nit\", __VA_ARGS__)\n")
-               ffi_ccu.body_decl.add("#else\n")
-               ffi_ccu.body_decl.add(" #define PRINT_ERROR(...) fprintf(stderr, __VA_ARGS__)\n")
-               ffi_ccu.body_decl.add("#endif\n")
-
-               for nclassdef in n_classdefs do
-                       # Does it declares an extern type?
-                       if nclassdef isa AStdClassdef and nclassdef.n_extern_code_block != null then
-                               mmodule.uses_ffi = true
-                               var language = nclassdef.n_extern_code_block.language
-                               assert language != null
-                               mmodule.present_languages.add(language)
-                               nclassdef.n_extern_code_block.language.compile_extern_class(
-                                       nclassdef.n_extern_code_block.as(not null), nclassdef, ffi_ccu, mmodule)
-                       end
-               end
+               super
        end
 end
 
-redef class AMethPropdef
-       # Compile the necessary wrapper around this extern method or constructor
-       fun compile_ffi_method(mmodule: MModule)
-       do
-               assert n_extern_code_block != null
-
-               if mmodule.compiled_ffi_methods.has(self) then return
-               mmodule.compiled_ffi_methods.add self
-
-               var language = n_extern_code_block.language
-               assert language != null
-               mmodule.present_languages.add(language)
-               n_extern_code_block.language.compile_extern_method(
-                       n_extern_code_block.as(not null), self, mmodule.ffi_ccu.as(not null), mmodule)
-       end
-end
 
 redef class VerifyNitniCallbacksPhase
        redef fun process_npropdef(npropdef)
index b8a8103..77a982d 100644 (file)
@@ -14,7 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Tools and utilities for language targetted FFI implementations
+# Tools and utilities for implement FFI with different languages
 module ffi_base
 
 import c_tools
@@ -22,184 +22,17 @@ import parser
 import modelbuilder
 import nitni
 
-redef class ToolContext
-       var ffi_language_assignation_phase: Phase = new FFILanguageAssignationPhase(self, null)
-end
-
-class FFILanguageAssignationPhase
-       super Phase
-
-       # All supported languages
-       var languages = new Array[FFILanguage]
-
-       redef fun process_nmodule(nmodule)
-       do
-               for block in nmodule.n_extern_code_blocks do
-                       verify_foreign_code_on_node( block )
-               end
-       end
-
-       redef fun process_npropdef(npropdef)
-       do
-               if npropdef isa AMethPropdef then
-                       var code_block = npropdef.n_extern_code_block
-                       if code_block != null then
-                               verify_foreign_code_on_node( code_block )
-                       end
-               end
-       end
-
-       redef fun process_nclassdef(nclassdef)
-       do
-               if nclassdef isa AStdClassdef and nclassdef.n_extern_code_block != null then
-                       verify_foreign_code_on_node( nclassdef.n_extern_code_block.as(not null) )
-               end
-       end
-
-       private fun verify_foreign_code_on_node(n: AExternCodeBlock)
-       do
-               var found = false
-               for v in languages do
-                       var identified = v.identify_language(n)
-                       if identified then
-                               if found and identified then
-                                       toolcontext.error(n.location, "FFI Error: two languages identified as possible handlers.")
-                               end
-                               n.language = v
-                               found = true
-                       end
-               end
-
-               if not found then toolcontext.error(n.location, "FFI Error: unsupported language.")
-       end
-end
+import light_ffi_base
 
 redef class MModule
-       var ffi_files = new Array[ExternFile]
-
        # Callbacks used by this module, classified by language
        var ffi_callbacks = new HashMap[FFILanguage, Set[NitniCallback]]
 end
 
-redef class AExternCodeBlock
-       fun language_name: nullable String do
-               if n_in_language == null then return null
-               return n_in_language.n_string.without_quotes
-       end
-       fun language_name_lowered: nullable String do
-               if language_name == null then return null
-               return language_name.to_lower
-       end
-
-       fun code: String do return n_extern_code_segment.without_guard
-
-       var language: nullable FFILanguage = null
-end
-
 # Visitor for a specific languages. Works kinda like a `Phase` and is executed
 # by a `Phase`.
-class FFILanguage
-       var ffi_language_assignation_phase: FFILanguageAssignationPhase
-
-       init
-       do
-               ffi_language_assignation_phase.languages.add(self)
-       end
-
-       # Is this `block` written in this language?
-       fun identify_language(block: AExternCodeBlock ): Bool is abstract
-
-       # Generate wrapper code for this module/header code block
-       fun compile_module_block(block: AExternCodeBlock, ecc: CCompilationUnit, mmodule: MModule) is abstract
-
-       # Generate wrapper code for this extern method
-       fun compile_extern_method(block: AExternCodeBlock, m: AMethPropdef,
-               ecc: CCompilationUnit, nmodule: MModule) is abstract
-
-       # Generate wrapper code for this extern class
-       fun compile_extern_class(block: AExternCodeBlock, m: AClassdef,
-               ecc: CCompilationUnit, mmodule: MModule) is abstract
-
-       # Get the foreign type of this extern class definition
-       fun get_ftype(block: AExternCodeBlock, m: AClassdef): ForeignType is abstract
-
+redef class FFILanguage
        # Generate the code to offer this callback if foreign code
        fun compile_callback(callback: NitniCallback, mmodule: MModule,
                mainmmodule: MModule, ecc: CCompilationUnit) is abstract
-
-       # Complete compilation of generated code
-       fun compile_to_files(mmodule: MModule, directory: String) do end
-end
-
-redef class TString
-       # Returns the content of this node without both of the surrounding "
-       fun without_quotes: String
-       do
-               assert text.length >= 2
-               return text.substring(1, text.length-2)
-       end
-end
-
-redef class TExternCodeSegment
-       # Returns the content of this node without the surrounding `{ and `}
-       fun without_guard: String
-       do
-               assert text.length >= 4
-               return text.substring(2, text.length-4)
-       end
-end
-
-redef class CCompilationUnit
-       fun write_as_impl(mmodule: MModule, compdir: String)
-       do
-               var base_name = "{mmodule.c_name}._ffi"
-
-               var h_file = "{base_name}.h"
-               var guard = "{mmodule.c_name.to_upper}_NIT_H"
-               write_header_to_file(mmodule, "{compdir}/{h_file}", new Array[String], guard)
-
-               var c_file = "{base_name}.c"
-               write_body_to_file(mmodule, "{compdir}/{c_file}", ["<stdlib.h>", "<stdio.h>", "\"{h_file}\""])
-
-               files.add( "{compdir}/{c_file}" )
-       end
-
-       fun write_header_to_file(mmodule: MModule, file: String, includes: Array[String], guard: String)
-       do
-               var stream = new FileWriter.open( file )
-
-               # header comments
-               var module_info = "/*\n\tExtern implementation of Nit module {mmodule.name}\n*/\n"
-
-               stream.write( module_info )
-
-               stream.write( "#ifndef {guard}\n" )
-               stream.write( "#define {guard}\n\n" )
-
-               for incl in includes do stream.write( "#include {incl}\n" )
-
-               compile_header_core( stream )
-
-               # header file guard close
-               stream.write( "#endif\n" )
-               stream.close
-       end
-
-       fun write_body_to_file(mmodule: MModule, file: String, includes: Array[String])
-       do
-               var stream = new FileWriter.open(file)
-
-               var module_info = "/*\n\tExtern implementation of Nit module {mmodule.name}\n*/\n"
-
-               stream.write( module_info )
-               for incl in includes do stream.write( "#include {incl}\n" )
-
-               compile_body_core( stream )
-
-               stream.close
-       end
-end
-
-class ForeignType
-       fun ctype: String do return "void*"
 end
index 830e68c..ae37d9d 100644 (file)
@@ -424,7 +424,7 @@ redef class MExplicitCall
                var csignature = mproperty.build_c_implementation_signature(recv_mtype, mmodule, "___indirect", long_signature, from_java_call_context)
                var cf = new CFunction("JNIEXPORT {csignature}")
                cf.exprs.add "\t{mproperty.build_ccall(recv_mtype, mainmodule, null, long_signature, from_java_call_context, null)}\n"
-               ccu.add_local_function cf
+               ccu.add_non_static_local_function cf
 
                # In Java, declare the extern method as a private static local method
                var java_signature = mproperty.build_csignature(recv_mtype, mainmodule, null, short_signature, java_call_context)
@@ -651,3 +651,17 @@ end
 private fun java_call_context: JavaCallContext do return new JavaCallContext
 private fun to_java_call_context: ToJavaCallContext do return new ToJavaCallContext
 private fun from_java_call_context: FromJavaCallContext do return new FromJavaCallContext
+
+redef class CCompilationUnit
+       # Similar to `add_local_function` but not `static`
+       #
+       # Used when the signature contains a visibility attribute.
+       private fun add_non_static_local_function(c_function: CFunction)
+       do
+               body_decl.add c_function.signature
+               body_decl.add ";\n"
+
+               body_impl.add "\n"
+               body_impl.add c_function.to_writer
+       end
+end
diff --git a/src/ffi/light_c.nit b/src/ffi/light_c.nit
new file mode 100644 (file)
index 0000000..86ec651
--- /dev/null
@@ -0,0 +1,138 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2012-2014 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Support for nesting C code within a Nit program using its FFI
+module light_c
+
+import modelize::modelize_property
+
+import light_ffi_base
+
+redef class FFILanguageAssignationPhase
+       var c_language: FFILanguage = new CLanguage(self)
+end
+
+class CLanguage
+       super FFILanguage
+
+       redef fun identify_language(n) do return n.is_c
+
+       redef fun compile_module_block(block, ecc, mmodule)
+       do
+               if block.is_c_header then
+                       ecc.header_custom.add block.location.as_line_pragma
+                       ecc.header_custom.add "\n"
+                       ecc.header_custom.add block.code
+               else if block.is_c_body then
+                       ecc.body_impl.add block.location.as_line_pragma
+                       ecc.body_impl.add "\n"
+                       ecc.body_impl.add block.code
+               end
+       end
+
+       redef fun compile_extern_method(block, m, ecc, mmodule)
+       do
+               var fc = new ExternCFunction(m, mmodule)
+               fc.decls.add( block.location.as_line_pragma )
+               fc.exprs.add( block.code )
+               ecc.add_exported_function( fc )
+       end
+
+       redef fun compile_extern_class(block, m, ecc, mmodule) do end
+
+       redef fun get_ftype(block, m) do return new ForeignCType(block.code)
+end
+
+redef class AExternCodeBlock
+       fun is_c: Bool do return language_name == null or
+               language_name_lowered == "c" or language_name_lowered.has_prefix( "c " )
+
+       fun is_c_body: Bool do return language_name == null or
+               language_name_lowered == "c" or language_name_lowered ==  "c body"
+
+       fun is_c_header: Bool do return language_name_lowered == "c header"
+end
+
+redef class Location
+       fun as_line_pragma: String do return "#line {line_start-1} \"{file.filename}\"\n"
+end
+
+redef class MModule
+       # FIXME make nullable the key of `cflags`, `ldflags` and `cppflags` when
+       # supported by the bootstrap
+
+       # Custom options for the C compiler (CFLAGS)
+       var cflags = new MultiHashMap[String, String]
+
+       # Custom options for the C linker (LDFLAGS)
+       var ldflags = new MultiHashMap[String, String]
+
+       # Additional libraries needed for the compilation
+       # Will be used with pkg-config
+       var pkgconfigs = new Array[String]
+end
+
+class ForeignCType
+       super ForeignType
+
+       redef var ctype: String
+end
+
+redef class Object
+       # Context when calling user C code from generated code
+       fun to_c_call_context: ToCCallContext do return once new ToCCallContext
+
+       # Context when calling generated code from user C code
+       fun from_c_call_context: FromCCallContext do return once new FromCCallContext
+end
+
+# Context when calling user C code from generated code
+class ToCCallContext
+       super CallContext
+
+       # TODO: private init because singleton instance (see `to_c_call_context`)
+
+       redef fun name_mtype(mtype)
+       do
+               if mtype isa MClassType and mtype.mclass.kind == extern_kind then return "void *"
+               return mtype.cname
+       end
+end
+
+# Context when calling generated code from user C code
+class FromCCallContext
+       super CallContext
+
+       # TODO: private init because singleton instance (see `from_c_call_context`)
+
+       redef fun name_mtype(mtype) do return mtype.cname
+end
+
+class ExternCFunction
+       super CFunction
+
+       var method: AMethPropdef
+
+       init (method: AMethPropdef, mmodule: MModule)
+       do
+               self.method = method
+
+               var recv_mtype = method.mpropdef.mclassdef.bound_mtype
+               var csignature = method.mpropdef.mproperty.build_csignature(recv_mtype, mmodule, "___impl", long_signature, from_c_call_context)
+
+               super( csignature )
+       end
+end
diff --git a/src/ffi/light_ffi.nit b/src/ffi/light_ffi.nit
new file mode 100644 (file)
index 0000000..2245a92
--- /dev/null
@@ -0,0 +1,131 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2013 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Light FFI support, independent of the compiler
+#
+# The light FFI offers only basic FFI features:
+#
+# * **Extern methods** implemented in C, nested within the Nit code.
+#   The body of these method is copied directly to the generated C files for compilation.
+#   Also supports extern `new` factories.
+# * Module level **C code blocks**, both "C Body" (the default) and "C Header".
+#   They will be copied to the beginning of the generated C files.
+# * Automatic transformation of Nit **primitive types** from/to their equivalent in C.
+# * **Extern classes** to create a Nit class around a C pointer.
+#   Allows to specify the equivalent C type of the Nit extern class.
+#
+# These limited features should be easy to implement in new/alternative engines
+# to quickly achieve a bootstrap. For this reason, core features of the Nit
+# standard library should be limited to use the light FFI.
+module light_ffi
+
+import modelbuilder
+
+import nitni::nitni_utilities
+
+intrude import light_ffi_base
+import extern_classes
+import light_c
+
+redef class MModule
+       # Does this module uses the FFI?
+       var uses_ffi: Bool = false
+
+       # C compilation unit for the FFI files
+       private var ffi_ccu: nullable CCompilationUnit = null
+
+       # Foreign language used in this AModule
+       private var present_languages = new HashSet[FFILanguage]
+
+       # Complete the compilation of the FFI code
+       fun finalize_ffi_wrapper(compdir: String, mainmodule: MModule)
+       do
+               var cflags = self.cflags[""].join(" ")
+
+               ffi_ccu.write_as_impl(self, compdir)
+               for filename in ffi_ccu.files do
+                       var f = new ExternCFile(filename, cflags)
+                       f.pkgconfigs.add_all pkgconfigs
+                       ffi_files.add(f)
+               end
+       end
+
+       # Avoid the compile a ffi propdef more than once
+       # See `AMethPropdef::compile_ffi_method`
+       # FIXME find a better way
+       private var compiled_ffi_methods = new HashSet[AMethPropdef]
+end
+
+redef class AModule
+
+       # Ensures all of the general foreign code of the module has been analyzed.
+       # Manages header blocks, extern class types and foreign dependancies between modules
+       fun ensure_compile_ffi_wrapper
+       do
+               var mmodule = mmodule
+               if mmodule == null or mmodule.ffi_ccu != null then return
+
+               # ready extern code compiler
+               var ffi_ccu = new CCompilationUnit
+               mmodule.ffi_ccu = ffi_ccu
+
+               # generate code
+               for block in n_extern_code_blocks do
+                       var language = block.language
+                       assert language != null
+                       mmodule.present_languages.add(language)
+                       language.compile_module_block(block, ffi_ccu, mmodule)
+               end
+
+               ffi_ccu.header_c_base.add( "#include \"{mmodule.c_name}._nitni.h\"\n" )
+
+               ffi_ccu.body_decl.add("#ifdef ANDROID\n")
+               ffi_ccu.body_decl.add(" #include <android/log.h>\n")
+               ffi_ccu.body_decl.add(" #define PRINT_ERROR(...) (void)__android_log_print(ANDROID_LOG_WARN, \"Nit\", __VA_ARGS__)\n")
+               ffi_ccu.body_decl.add("#else\n")
+               ffi_ccu.body_decl.add(" #define PRINT_ERROR(...) fprintf(stderr, __VA_ARGS__)\n")
+               ffi_ccu.body_decl.add("#endif\n")
+
+               for nclassdef in n_classdefs do
+                       # Does it declares an extern type?
+                       if nclassdef isa AStdClassdef and nclassdef.n_extern_code_block != null then
+                               mmodule.uses_ffi = true
+                               var language = nclassdef.n_extern_code_block.language
+                               assert language != null
+                               mmodule.present_languages.add(language)
+                               nclassdef.n_extern_code_block.language.compile_extern_class(
+                                       nclassdef.n_extern_code_block.as(not null), nclassdef, ffi_ccu, mmodule)
+                       end
+               end
+       end
+end
+
+redef class AMethPropdef
+       # Compile the necessary wrapper around this extern method or constructor
+       fun compile_ffi_method(mmodule: MModule)
+       do
+               assert n_extern_code_block != null
+
+               if mmodule.compiled_ffi_methods.has(self) then return
+               mmodule.compiled_ffi_methods.add self
+
+               var language = n_extern_code_block.language
+               assert language != null
+               mmodule.present_languages.add(language)
+               n_extern_code_block.language.compile_extern_method(
+                       n_extern_code_block.as(not null), self, mmodule.ffi_ccu.as(not null), mmodule)
+       end
+end
diff --git a/src/ffi/light_ffi_base.nit b/src/ffi/light_ffi_base.nit
new file mode 100644 (file)
index 0000000..6791e5c
--- /dev/null
@@ -0,0 +1,214 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Copyright 2012 Alexis Laferrière <alexis.laf@xymus.net>
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Tools and utilities for implement FFI with different languages
+module light_ffi_base
+
+import c_tools
+import parser
+import modelbuilder
+import nitni::nitni_utilities
+
+redef class ToolContext
+       # Phase that assign a `FFILanguage` to all `AExternCodeBlock`
+       var ffi_language_assignation_phase: Phase = new FFILanguageAssignationPhase(self, null)
+end
+
+# Phase that assign a `FFILanguage` to all `AExternCodeBlock`
+#
+# It will also report errors when using an unknown foreign langages.
+class FFILanguageAssignationPhase
+       super Phase
+
+       # All supported languages
+       var languages = new Array[FFILanguage]
+
+       redef fun process_nmodule(nmodule)
+       do
+               for block in nmodule.n_extern_code_blocks do
+                       verify_foreign_code_on_node( block )
+               end
+       end
+
+       redef fun process_npropdef(npropdef)
+       do
+               if npropdef isa AMethPropdef then
+                       var code_block = npropdef.n_extern_code_block
+                       if code_block != null then
+                               verify_foreign_code_on_node( code_block )
+                       end
+               end
+       end
+
+       redef fun process_nclassdef(nclassdef)
+       do
+               if nclassdef isa AStdClassdef and nclassdef.n_extern_code_block != null then
+                       verify_foreign_code_on_node( nclassdef.n_extern_code_block.as(not null) )
+               end
+       end
+
+       private fun verify_foreign_code_on_node(n: AExternCodeBlock)
+       do
+               var found = false
+               for v in languages do
+                       var identified = v.identify_language(n)
+                       if identified then
+                               if found and identified then
+                                       toolcontext.error(n.location, "FFI Error: two languages identified as possible handlers.")
+                               end
+                               n.language = v
+                               found = true
+                       end
+               end
+
+               if not found then toolcontext.error(n.location, "FFI Error: unsupported language.")
+       end
+end
+
+redef class MModule
+       # All FFI files linked to this module
+       var ffi_files = new Array[ExternFile]
+end
+
+redef class AExternCodeBlock
+       # User entered name for the language of this block
+       fun language_name: nullable String do
+               if n_in_language == null then return null
+               return n_in_language.n_string.without_quotes
+       end
+
+       # `language_name`, in lower case
+       protected fun language_name_lowered: nullable String do
+               if language_name == null then return null
+               return language_name.to_lower
+       end
+
+       # User entered foreign code in the block
+       fun code: String do return n_extern_code_segment.without_guard
+
+       # `FFILanguage` assigned to this block
+       var language: nullable FFILanguage = null
+end
+
+# Visitor for a specific languages. Works kinda like a `Phase` and is executed
+# by a `Phase`.
+class FFILanguage
+       # `FFILanguageAssignationPhase` assigning `self` to `AExternCodeBlock`s
+       var ffi_language_assignation_phase: FFILanguageAssignationPhase
+
+       init
+       do
+               ffi_language_assignation_phase.languages.add(self)
+       end
+
+       # Is this `block` written in this language?
+       fun identify_language(block: AExternCodeBlock ): Bool is abstract
+
+       # Generate wrapper code for this module/header code block
+       fun compile_module_block(block: AExternCodeBlock, ecc: CCompilationUnit, mmodule: MModule) is abstract
+
+       # Generate wrapper code for this extern method
+       fun compile_extern_method(block: AExternCodeBlock, m: AMethPropdef,
+               ecc: CCompilationUnit, nmodule: MModule) is abstract
+
+       # Generate wrapper code for this extern class
+       fun compile_extern_class(block: AExternCodeBlock, m: AClassdef,
+               ecc: CCompilationUnit, mmodule: MModule) is abstract
+
+       # Get the foreign type of this extern class definition
+       fun get_ftype(block: AExternCodeBlock, m: AClassdef): ForeignType is abstract
+
+       # Complete compilation of generated code
+       fun compile_to_files(mmodule: MModule, directory: String) do end
+end
+
+redef class TString
+       # Returns the content of this node without both of the surrounding "
+       fun without_quotes: String
+       do
+               assert text.length >= 2
+               return text.substring(1, text.length-2)
+       end
+end
+
+redef class TExternCodeSegment
+       # Returns the content of this node without the surrounding `{ and `}
+       fun without_guard: String
+       do
+               assert text.length >= 4
+               return text.substring(2, text.length-4)
+       end
+end
+
+redef class CCompilationUnit
+       # Compile as `_ffi` files which contains the implementation of extern methods
+       fun write_as_impl(mmodule: MModule, compdir: String)
+       do
+               var base_name = "{mmodule.c_name}._ffi"
+
+               var h_file = "{base_name}.h"
+               var guard = "{mmodule.c_name.to_upper}_NIT_H"
+               write_header_to_file(mmodule, "{compdir}/{h_file}", new Array[String], guard)
+
+               var c_file = "{base_name}.c"
+               write_body_to_file(mmodule, "{compdir}/{c_file}", ["<stdlib.h>", "<stdio.h>", "\"{h_file}\""])
+
+               files.add( "{compdir}/{c_file}" )
+       end
+
+       # Write the header part to `file` including all `includes` using the `guard`
+       fun write_header_to_file(mmodule: MModule, file: String, includes: Array[String], guard: String)
+       do
+               var stream = new FileWriter.open( file )
+
+               # header comments
+               var module_info = "/*\n\tExtern implementation of Nit module {mmodule.name}\n*/\n"
+
+               stream.write( module_info )
+
+               stream.write( "#ifndef {guard}\n" )
+               stream.write( "#define {guard}\n\n" )
+
+               for incl in includes do stream.write( "#include {incl}\n" )
+
+               compile_header_core( stream )
+
+               # header file guard close
+               stream.write( "#endif\n" )
+               stream.close
+       end
+
+       # Write the body part to `file` including all `includes`
+       fun write_body_to_file(mmodule: MModule, file: String, includes: Array[String])
+       do
+               var stream = new FileWriter.open(file)
+
+               var module_info = "/*\n\tExtern implementation of Nit module {mmodule.name}\n*/\n"
+
+               stream.write( module_info )
+               for incl in includes do stream.write( "#include {incl}\n" )
+
+               compile_body_core( stream )
+
+               stream.close
+       end
+end
+
+# Foreign equivalent types of extern classes
+class ForeignType
+       # C type of `self`, by default it is `void*`
+       fun ctype: String do return "void*"
+end
index f068dc1..60bcdf9 100644 (file)
@@ -108,6 +108,19 @@ private class StringFinder
                if e isa AAnnotation then return
                super
        end
+
+       # Adds a String to the list of strings of the module
+       #
+       # The string needs to be pre-formatted to C standards (escape_to_c)
+       fun add_string(s: String, loc: Location) do
+               var locstr = "{amodule.mmodule.mgroup.name}::{amodule.mmodule.name} {loc.line_start}--{loc.column_start}:{loc.column_end}"
+               if not strings.has_key(s) then
+                       var po = new PObject([locstr], s, "")
+                       strings[s] = po
+               else
+                       strings[s].locations.push locstr
+               end
+       end
 end
 
 redef class ANode
@@ -119,15 +132,35 @@ redef class AStringExpr
        redef fun accept_string_finder(v) do
                var str = value.as(not null).escape_to_c
                var parse = v.toolcontext.parse_expr("\"{str}\".get_translation(\"{v.domain}\", \"{v.languages_location}\").unescape_nit")
-               var loc = location
-               var locstr = "{v.amodule.mmodule.mgroup.name}::{v.amodule.mmodule.name} {loc.line_start}--{loc.column_start}:{loc.column_end}"
-               if not v.strings.has_key(str) then
-                       var po = new PObject([locstr], str, "")
-                       v.strings[str] = po
-               else
-                       v.strings[str].locations.push locstr
-               end
                replace_with(parse)
+               v.add_string(str, location)
+       end
+end
+
+redef class ASuperstringExpr
+
+       redef fun accept_string_finder(v) do
+               var fmt = ""
+               var exprs = new Array[AExpr]
+               for i in n_exprs do
+                       if i isa AStringFormExpr then
+                               fmt += i.value.as(not null)
+                       else
+                               fmt += "%"
+                               exprs.push i
+                               fmt += exprs.length.to_s
+                       end
+               end
+               fmt = fmt.escape_to_c
+               v.add_string(fmt, location)
+               var parse = v.toolcontext.parse_expr("\"{fmt}\".get_translation(\"{v.domain}\", \"{v.languages_location}\").unescape_nit.format()")
+               if not parse isa ACallExpr then
+                       v.toolcontext.error(location, "Fatal error in i18n annotation, the parsed superstring could not be generated properly")
+                       return
+               end
+               var parse_exprs = parse.n_args.n_exprs
+               parse_exprs.add_all exprs
+               replace_with parse
        end
 end
 
index 092acad..66d5e9f 100644 (file)
@@ -182,7 +182,7 @@ redef class ModelBuilder
                var initializers = new Array[MProperty]
                for npropdef in nclassdef.n_propdefs do
                        if npropdef isa AMethPropdef then
-                               if npropdef.mpropdef == null then return # Skip broken attribute
+                               if npropdef.mpropdef == null then return # Skip broken method
                                var at = npropdef.get_single_annotation("autoinit", self)
                                if at == null then continue # Skip non tagged init
 
@@ -203,25 +203,26 @@ redef class ModelBuilder
                                npropdef.mpropdef.mproperty.is_autoinit = true
                        end
                        if npropdef isa AAttrPropdef then
-                               if npropdef.mpropdef == null then return # Skip broken attribute
+                               var mreadpropdef = npropdef.mreadpropdef
+                               if mreadpropdef == null or mreadpropdef.msignature == null then return # Skip broken attribute
                                if npropdef.noinit then continue # Skip noinit attribute
                                var atautoinit = npropdef.get_single_annotation("autoinit", self)
                                if atautoinit != null then
                                        # For autoinit attributes, call the reader to force
                                        # the lazy initialization of the attribute.
-                                       initializers.add(npropdef.mreadpropdef.mproperty)
-                                       npropdef.mreadpropdef.mproperty.is_autoinit = true
+                                       initializers.add(mreadpropdef.mproperty)
+                                       mreadpropdef.mproperty.is_autoinit = true
                                        continue
                                end
                                if npropdef.has_value then continue
-                               var paramname = npropdef.mpropdef.mproperty.name.substring_from(1)
-                               var ret_type = npropdef.mpropdef.static_mtype
+                               var paramname = mreadpropdef.mproperty.name
+                               var ret_type = mreadpropdef.msignature.return_mtype
                                if ret_type == null then return
                                var mparameter = new MParameter(paramname, ret_type, false, ret_type isa MNullableType)
                                mparameters.add(mparameter)
                                var msetter = npropdef.mwritepropdef
                                if msetter == null then
-                                       # No setter, it is a old-style attribute, so just add it
+                                       # No setter, it is a readonly attribute, so just add it
                                        initializers.add(npropdef.mpropdef.mproperty)
                                        npropdef.mpropdef.mproperty.is_autoinit = true
                                else
index bf12e9d..18a0f1f 100644 (file)
@@ -23,6 +23,8 @@ import transform
 import rapid_type_analysis
 import compiler::separate_erasure_compiler
 
+import compiler::compiler_ffi::light_only
+
 redef class ToolContext
        redef fun process_options(args)
        do
index 616d4ea..a1f49a7 100644 (file)
@@ -98,7 +98,7 @@ redef class MClassType
                        assert ctype != null
                        return ctype
                end
-               return mangled_cname
+               return cname_normal_class
        end
 
        redef fun cname_blind do
@@ -112,6 +112,9 @@ redef class MClassType
                return "struct nitni_instance *"
        end
 
+       # Name of this type in C for normal classes (not extern and not primitive)
+       protected fun cname_normal_class: String do return mangled_cname
+
        redef fun mangled_cname do return mclass.name
 
        redef fun is_cprimitive do return mclass.kind == extern_kind or
index 1f922d6..eb80d5f 100644 (file)
@@ -248,7 +248,10 @@ implicit_main_meth {-> propdef}
 
 /* CLASSES *******************************************************************/
 classdef
-       = [doc]:nd redef visibility classkind no qclassid formaldefs extern_code_block? propdefs kwend {-> New classdef.std(doc.doc, redef.kwredef, visibility, classkind, qclassid.classid, [formaldefs.formaldef], extern_code_block, [propdefs.propdef], kwend)};
+       = [doc]:nd redef visibility classkind no qclassid extern_code_block? propdefs kwend {-> New classdef.std(doc.doc, redef.kwredef, visibility, classkind, qclassid.classid, Null, [], Null, extern_code_block, [propdefs.propdef], kwend)}
+       | {for} [doc]:nd redef visibility classkind no qclassid obra [n2]:no formaldefs cbra extern_code_block? propdefs kwend {-> New classdef.std(doc.doc, redef.kwredef, visibility, classkind, qclassid.classid, obra, [formaldefs.formaldef], cbra, extern_code_block, [propdefs.propdef], kwend)}
+       ;
+
 redef {-> kwredef?}
        = kwredef? {-> kwredef};
 classkind
@@ -260,13 +263,13 @@ classkind
        ;
 
 formaldefs {-> formaldef*}
-       = obra no formaldef formaldefs_tail* [n2]:no cbra {-> [formaldef, formaldefs_tail.formaldef]}
-       | {null} {-> []}
+       = formaldef formaldefs_tail* {-> [formaldef, formaldefs_tail.formaldef]}
+       | {empty} {->[]}
        ;
 formaldefs_tail {-> formaldef}
        = comma no formaldef {-> formaldef};
 formaldef
-       = classid annotations? typing_o {-> New formaldef(classid, typing_o.type, annotations)};
+       = classid annotations? typing_o no {-> New formaldef(classid, typing_o.type, annotations)};
 
 superclass {-> propdef}
        = {super} [doc]:nd redef visibility kwsuper [n2]:no type annotation_withend {-> New propdef.super(doc.doc, redef.kwredef, visibility, kwsuper, type, annotation_withend.annotations)}
@@ -281,28 +284,28 @@ propdefn {-> propdef}
        = propdef n1 {-> propdef.propdef}
        ;
 propdef~toplevel {-> propdef}
-       = {meth} [doc]:nd redef visibility kwmeth qmethid signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.meth(doc.doc, redef.kwredef, visibility, kwmeth, Null, Null, qmethid.methid, signature, annotation_noend.annotations, Null, Null, stmtso.expr)}
-       | {nobody} [doc]:nd redef visibility kwmeth qmethid signature annotation_withend_nonull {-> New propdef.meth(doc.doc, redef.kwredef, visibility, kwmeth, Null, Null, qmethid.methid, signature.signature, annotation_withend_nonull.annotations, Null, Null, Null)}
-!toplevel| {intern_new} [doc]:nd redef visibility kwnew qmethid? signature annotation_withend_nonull {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, Null, kwnew, qmethid.methid, signature, annotation_withend_nonull.annotations, Null, Null, Null)}
-!toplevel| {new} [doc]:nd redef visibility kwnew qmethid? signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, Null, kwnew, qmethid.methid, signature, annotation_noend.annotations, Null, Null, stmtso.expr)}
-       | {extern_implicit} [doc]:nd redef visibility kwmeth qmethid signature annotation_noend? extern_calls extern_code_block {-> New propdef.meth(doc.doc, redef.kwredef, visibility, kwmeth, Null, Null, qmethid.methid, signature.signature, annotation_noend.annotations, extern_calls, extern_code_block, Null)}
-!toplevel| {var3} [doc]:nd redef visibility kwvar id typing_o annotation_withend {-> New propdef.attr(doc.doc, redef.kwredef, visibility, kwvar, id, typing_o.type, Null, annotation_withend.annotations, Null)}
-!toplevel| {var4} [doc]:nd redef visibility kwvar id typing_o assign [n2]:no expr annotation_withend {-> New propdef.attr(doc.doc, redef.kwredef, visibility, kwvar, id, typing_o.type, expr.expr, annotation_withend.annotations, Null)}
-!toplevel| {var5} [doc]:nd redef visibility kwvar id typing_o annotation_noend? kwdo stmtso kwend? {-> New propdef.attr(doc.doc, redef.kwredef, visibility, kwvar, id, typing_o.type, Null, annotation_noend.annotations, stmtso.expr)}
-!toplevel| {init} [doc]:nd redef visibility kwinit qmethid? signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, kwinit, Null, qmethid.methid, signature, annotation_noend.annotations, Null, Null, stmtso.expr)}
+       = {meth} [doc]:nd redef visibility kwmeth qmethid signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.meth(doc.doc, redef.kwredef, visibility, kwmeth, Null, Null, qmethid.methid, signature, annotation_noend.annotations, Null, Null, kwdo, stmtso.expr, kwend_o.kwend)}
+       | {nobody} [doc]:nd redef visibility kwmeth qmethid signature annotation_withend_nonull {-> New propdef.meth(doc.doc, redef.kwredef, visibility, kwmeth, Null, Null, qmethid.methid, signature.signature, annotation_withend_nonull.annotations, Null, Null, Null, Null, Null)}
+!toplevel| {intern_new} [doc]:nd redef visibility kwnew qmethid? signature annotation_withend_nonull {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, Null, kwnew, qmethid.methid, signature, annotation_withend_nonull.annotations, Null, Null, Null, Null, Null)}
+!toplevel| {new} [doc]:nd redef visibility kwnew qmethid? signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, Null, kwnew, qmethid.methid, signature, annotation_noend.annotations, Null, Null, kwdo, stmtso.expr, kwend_o.kwend)}
+       | {extern_implicit} [doc]:nd redef visibility kwmeth qmethid signature annotation_noend? extern_calls extern_code_block {-> New propdef.meth(doc.doc, redef.kwredef, visibility, kwmeth, Null, Null, qmethid.methid, signature.signature, annotation_noend.annotations, extern_calls, extern_code_block, Null, Null, Null)}
+!toplevel| {var3} [doc]:nd redef visibility kwvar id typing_o annotation_withend {-> New propdef.attr(doc.doc, redef.kwredef, visibility, kwvar, id, typing_o.type, Null, Null, annotation_withend.annotations, Null, Null, Null)}
+!toplevel| {var4} [doc]:nd redef visibility kwvar id typing_o assign [n2]:no expr annotation_withend {-> New propdef.attr(doc.doc, redef.kwredef, visibility, kwvar, id, typing_o.type, assign, expr.expr, annotation_withend.annotations, Null, Null, Null)}
+!toplevel| {var5} [doc]:nd redef visibility kwvar id typing_o annotation_noend? kwdo stmtso kwend? {-> New propdef.attr(doc.doc, redef.kwredef, visibility, kwvar, id, typing_o.type, Null, Null, annotation_noend.annotations, kwdo, stmtso.expr, kwend)}
+!toplevel| {init} [doc]:nd redef visibility kwinit qmethid? signature annotation_noend? kwdo stmtso kwend_o {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, kwinit, Null, qmethid.methid, signature, annotation_noend.annotations, Null, Null, kwdo, stmtso.expr, kwend_o.kwend)}
 !toplevel| {type} [doc]:nd redef visibility kwtype classid typing annotation_withend {-> New propdef.type(doc.doc, redef.kwredef, visibility, kwtype, classid, typing.type, annotation_withend.annotations)}
-!toplevel| {extern_init_implicit} [doc]:nd redef visibility kwnew qmethid? signature annotation_noend? extern_calls extern_code_block {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, Null, kwnew, qmethid.methid, signature, annotation_noend.annotations, extern_calls, extern_code_block, Null)}
+!toplevel| {extern_init_implicit} [doc]:nd redef visibility kwnew qmethid? signature annotation_noend? extern_calls extern_code_block {-> New propdef.meth(doc.doc, redef.kwredef, visibility, Null, Null, kwnew, qmethid.methid, signature, annotation_noend.annotations, extern_calls, extern_code_block, Null, Null, Null)}
 !toplevel| {annot} line_annotation_forclass {-> line_annotation_forclass.propdef}
 !toplevel| {super} superclass {-> superclass.propdef}
        ;
 annotation_withend~nonull {-> annotations?}
-       = {oneliner} kwis many_annotations {-> many_annotations.annotations}
-       | {more} kwis n1 line_annotations kwend {-> line_annotations.annotations}
+       = {oneliner} kwis annotation_list {-> New annotations(kwis, Null, Null, [annotation_list.annotation], Null, Null)}
+       | {more} kwis n1 line_annotation+ kwend {-> New annotations(kwis, Null, Null, [line_annotation.annotation], Null, kwend) }
 !nonull        | {null} {-> Null}
        ;
 annotation_noend {-> annotations}
-       = {oneliner} kwis many_annotations {-> many_annotations.annotations}
-       | {more} kwis n1 line_annotations {-> line_annotations.annotations}
+       = {oneliner} kwis annotation_list {-> New annotations(kwis, Null, Null, [annotation_list.annotation], Null, Null)}
+       | {more} kwis n1 line_annotation+ {-> New annotations(kwis, Null, Null, [line_annotation.annotation], Null, Null) }
        ;
 
 visibility
@@ -394,8 +397,8 @@ extern_code_body {-> extern_code_block} = no extern_code_block {-> extern_code_b
 
 /* TYPES *********************************************************************/
 type~nobra~nopar {-> type}
-       = {simple} kwnullable? classid annotations_o~nopar {-> New type(kwnullable, classid, [], annotations_o~nopar.annotations)}
-!nobra | {generic} kwnullable? classid obra no types [n2]:no cbra annotations_o~nopar {-> New type(kwnullable, classid, [types.type], annotations_o~nopar.annotations)}
+       = {simple} kwnullable? classid annotations_o~nopar {-> New type(kwnullable, classid, Null, [], Null, annotations_o~nopar.annotations)}
+!nobra | {generic} kwnullable? classid obra no types [n2]:no cbra annotations_o~nopar {-> New type(kwnullable, classid, obra, [types.type], cbra, annotations_o~nopar.annotations)}
        ;
 types {-> type*} 
        = type types_tail* {-> [type, types_tail.type]};
@@ -478,14 +481,15 @@ do~withelse {-> expr}
        ;
 
 if~withelse {-> expr}
-       = {onelineelse} kwif no expr [n2]:no kwthen stmt_withelse kwelse stmtso~withelse {-> New expr.if(kwif, expr, stmt_withelse.expr, stmtso~withelse.expr)}
-!withelse      | {oneline} kwif no expr [n2]:no kwthen stmt {-> New expr.if(kwif, expr, stmt.expr, Null)}
-!withelse      | {block} kwif no expr [n2]:no kwthen [n3]:n stmtsn elsepartblock {-> New expr.if(kwif, expr, stmtsn.expr, elsepartblock.expr)}
-!withelse      | {emptyblock} kwif no expr [n2]:no kwthen [n3]:n? elsepartblock {-> New expr.if(kwif, expr, Null, elsepartblock.expr)}
+       = {onelineelse} kwif no expr [n2]:no kwthen stmt_withelse kwelse stmtso~withelse {-> New expr.if(kwif, expr, kwthen, stmt_withelse.expr, kwelse, stmtso~withelse.expr)}
+!withelse      | {oneline} kwif no expr [n2]:no kwthen stmt {-> New expr.if(kwif, expr, kwthen, stmt.expr, Null, Null)}
+!withelse      | {block} kwif no expr [n2]:no kwthen [n3]:n stmtsn kwelse stmtso {-> New expr.if(kwif, expr, kwthen, stmtsn.expr, kwelse, stmtso.expr)}
+!withelse      | {emptyblock} kwif no expr [n2]:no kwthen [n3]:n? kwelse stmtso {-> New expr.if(kwif, expr, kwthen, Null, kwelse, stmtso.expr)}
+!withelse      | {blocknoelse} kwif no expr [n2]:no kwthen [n3]:n stmtsn endblock {-> New expr.if(kwif, expr, kwthen, stmtsn.expr, Null, endblock.expr)}
+!withelse      | {emptyblocknoelse} kwif no expr [n2]:no kwthen [n3]:n? endblock {-> New expr.if(kwif, expr, kwthen, Null, Null, endblock.expr)}
        ;
-elsepartblock {-> expr?}
-       = {else} kwelse stmtso {-> stmtso.expr}
-       | {empty} kwend {-> New expr.block([], kwend)}
+endblock {-> expr}
+       = {empty} kwend {-> New expr.block([], kwend)}
        ;
 
 loop~withelse {-> expr}
@@ -499,8 +503,8 @@ while~withelse {-> expr}
        ;
 
 for~withelse {-> expr}
-       = kwfor no [ids]:idlist [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso_withend label {-> New expr.for(kwfor, [ids.id], expr, kwdo, stmtso_withend.expr, label)}
-       | {nolabel} kwfor no [ids]:idlist [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso~withelse {-> New expr.for(kwfor, [ids.id], expr, kwdo, stmtso~withelse.expr, Null)}
+       = kwfor no [ids]:idlist [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso_withend label {-> New expr.for(kwfor, [ids.id], kwin, expr, kwdo, stmtso_withend.expr, label)}
+       | {nolabel} kwfor no [ids]:idlist [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso~withelse {-> New expr.for(kwfor, [ids.id], kwin, expr, kwdo, stmtso~withelse.expr, Null)}
        ;
 
 with~withelse {-> expr}
@@ -514,8 +518,8 @@ withexpr {-> expr}
        ;
 
 assert~withelse {-> expr}
-       = {else} kwassert assertid? expr kwelse stmtso~withelse {-> New expr.assert(kwassert, assertid.id, expr, stmtso~withelse.expr)}
-!withelse| {noelse} kwassert assertid? expr {-> New expr.assert(kwassert, assertid.id, expr, Null)}
+       = {else} kwassert assertid? expr kwelse stmtso~withelse {-> New expr.assert(kwassert, assertid.id, expr, kwelse, stmtso~withelse.expr)}
+!withelse| {noelse} kwassert assertid? expr {-> New expr.assert(kwassert, assertid.id, expr, Null, Null)}
        ;
 assertid {-> id}
        = id column {-> id};
@@ -636,8 +640,8 @@ expr_single~nopar~nobra {-> expr}
        | {superstring} superstring  {-> superstring.expr}
 !nopar | {par} expr_par {-> expr_par.expr}
 // !nopar to unambiguise 'foo[5].bar' between '(foo[5]).bar' and 'foo([5].bar),
-!nobra!nopar   | {range} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no cbra annotations_o {-> New expr.crange(obra, expr, expr2.expr, cbra, annotations_o.annotations)}
-!nobra!nopar   | {orange} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no [cbra]:obra annotations_o {-> New expr.orange(obra, expr, expr2.expr, cbra, annotations_o.annotations)}
+!nobra!nopar   | {range} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no cbra annotations_o {-> New expr.crange(obra, expr, dotdot, expr2.expr, cbra, annotations_o.annotations)}
+!nobra!nopar   | {orange} obra no expr [n2]:no dotdot [n3]:no [expr2]:expr_nobra [n4]:no [cbra]:obra annotations_o {-> New expr.orange(obra, expr, dotdot, expr2.expr, cbra, annotations_o.annotations)}
 !nobra!nopar   | {array} obra no array_items typing_o cbra annotations_o {-> New expr.array(obra, [array_items.expr], typing_o.type, cbra, annotations_o.annotations)}
        ;
 
@@ -662,8 +666,8 @@ array_items_tail {-> expr}
        ;
 array_item {-> expr}
        = expr no {-> expr}
-       | {for} kwfor no [ids]:idlist [n2]:no kwin [n3]:no expr [n4]:no kwdo [block]:array_item {-> New expr.for(kwfor, [ids.id], expr, kwdo, block.expr, Null)}
-       | {if} kwif [n1]:no expr [n2]:no kwthen [n3]:no [then]:array_item {-> New expr.if(kwif, expr, then.expr, Null)}
+       | {for} kwfor no [ids]:idlist [n2]:no kwin [n3]:no expr [n4]:no kwdo [block]:array_item {-> New expr.for(kwfor, [ids.id], kwin, expr, kwdo, block.expr, Null)}
+       | {if} kwif [n1]:no expr [n2]:no kwthen [n3]:no [then]:array_item {-> New expr.if(kwif, expr, kwthen, then.expr, Null, Null)}
        ;
 
 superstring {-> expr} 
@@ -686,8 +690,8 @@ superstring_end {-> expr}
 /* ANNOTATIONS *******************************************************************/
 
 annotations~nopar {-> annotations}
-       = {one} at one_annotation~nopar {-> New annotations(at, Null, [one_annotation~nopar.annotation], Null)}
-       | {many} at opar no annotation_list [n2]:no cpar {-> New annotations(at, opar, [annotation_list.annotation], cpar)}
+       = {one} at one_annotation~nopar {-> New annotations(Null, at, Null, [one_annotation~nopar.annotation], Null, Null)}
+       | {many} at opar no annotation_list [n2]:no cpar {-> New annotations(Null, at, opar, [annotation_list.annotation], cpar, Null)}
        ;
 annotations_o~nopar {-> annotations?}
        = annotations~nopar {-> annotations~nopar.annotations}
@@ -700,10 +704,6 @@ one_annotation~nopar {-> annotation}
 !nopar | {args} redef visibility atid opar no at_args [n2]:no cpar annotations_o~nopar {-> New annotation(Null, redef.kwredef, visibility, atid, opar, [at_args.expr], cpar, annotations_o~nopar.annotations)}
        ;
 
-many_annotations {-> annotations}
-       = {many} annotation_list {-> New annotations(Null, Null, [annotation_list.annotation], Null)}
-       ;
-
 annotation_list {-> annotation*}
        = {many} one_annotation_list annotations_tail* {-> [one_annotation_list.annotation, annotations_tail.annotation] }
        ;
@@ -723,9 +723,6 @@ annotations_tail {-> annotation}
        = comma no one_annotation_list {-> one_annotation_list.annotation}
        ;
 
-line_annotations {-> annotations}
-       = line_annotation+ {-> New annotations(Null, Null, [line_annotation.annotation], Null) }
-       ;
 line_annotation {-> annotation}
        = [doc]:nd redef visibility atid annotations? n1 {-> New annotation(doc.doc, redef.kwredef, visibility, atid.atid, Null, [], Null, annotations)}
        | {args} [doc]:nd redef visibility atid opar no at_args cpar annotations? n1 {-> New annotation(doc.doc, redef.kwredef, visibility, atid.atid, opar, [at_args.expr], cpar, annotations)}
@@ -875,7 +872,7 @@ visibility
        | {intrude} kwintrude
        ;
 
-classdef= {std} doc? kwredef? visibility classkind [id]:classid? [formaldefs]:formaldef* extern_code_block? [propdefs]:propdef* kwend
+classdef= {std} doc? kwredef? visibility classkind [id]:classid? obra? [formaldefs]:formaldef* cbra? extern_code_block? [propdefs]:propdef* kwend
        | {top} [propdefs]:propdef*
        | {main} [propdefs]:propdef*
        ;
@@ -889,10 +886,10 @@ classkind
 formaldef = [id]:classid type? annotations?;
 
 
-propdef = {attr} doc? kwredef? visibility kwvar [id2]:id type? expr? annotations? [block]:expr?
+propdef = {attr} doc? kwredef? visibility kwvar [id2]:id type? assign? expr? annotations? kwdo? [block]:expr? kwend?
        | {main_meth} kwredef? [block]:expr?
        | {type} doc? kwredef? visibility kwtype [id]:classid type annotations?
-       | {meth} doc? kwredef? visibility kwmeth? kwinit? kwnew? methid? signature annotations? extern_calls? extern_code_block? [block]:expr?
+       | {meth} doc? kwredef? visibility kwmeth? kwinit? kwnew? methid? signature annotations? extern_calls? extern_code_block? kwdo? [block]:expr? kwend?
        | {super} doc? kwredef? visibility kwsuper type annotations?
        | {annot} doc? kwredef? visibility? atid opar? [args]:expr* cpar? annotations?
        ;
@@ -928,7 +925,7 @@ signature = opar? [params]:param* cpar? type?;
 param  = id type? dotdotdot? annotations?
        ;
 
-type   = kwnullable? [id]:classid [types]:type* annotations?;
+type   = kwnullable? [id]:classid obra? [types]:type* cbra? annotations?;
 
 label = kwlabel id?;
 
@@ -939,13 +936,13 @@ expr      = {block} expr* kwend?
        | {abort} kwabort
        | {continue} kwcontinue? label?
        | {do} kwdo [block]:expr? label?
-       | {if} kwif expr [then]:expr? [else]:expr? 
+       | {if} kwif expr kwthen [then]:expr? kwelse? [else]:expr?
        | {ifexpr} kwif expr kwthen [then]:expr kwelse [else]:expr
        | {while} kwwhile expr kwdo [block]:expr? label?
        | {loop} kwloop [block]:expr? label?
-       | {for} kwfor [ids]:id* expr kwdo [block]:expr? label?
+       | {for} kwfor [ids]:id* kwin expr kwdo [block]:expr? label?
        | {with} kwwith expr kwdo [block]:expr? label?
-       | {assert} kwassert id? expr [else]:expr?
+       | {assert} kwassert id? expr kwelse? [else]:expr?
        | {once} kwonce expr 
        | {send} expr 
        | {binop} expr [expr2]:expr 
@@ -992,8 +989,8 @@ expr        = {block} expr* kwend?
        | {var_assign} id assign [value]:expr 
        | {var_reassign} id assign_op [value]:expr 
        | {range} expr [expr2]:expr annotations?
-       | {crange} obra expr [expr2]:expr cbra annotations?
-       | {orange} obra expr [expr2]:expr [cbra]:obra annotations?
+       | {crange} obra expr dotdot [expr2]:expr cbra annotations?
+       | {orange} obra expr dotdot [expr2]:expr [cbra]:obra annotations?
        | {array} obra [exprs]:expr* type? cbra annotations?
        | {self} kwself annotations?
        | {implicit_self} 
@@ -1059,7 +1056,7 @@ qualified = id* classid? ;
 
 doc = comment+;
 
-annotations = at? opar? [items]:annotation* cpar?;
+annotations = kwis? at? opar? [items]:annotation* cpar? kwend?;
 
 annotation = doc? kwredef? visibility? atid opar? [args]:expr* cpar? annotations?;
 
index 6b46d96..a815804 100644 (file)
@@ -38,26 +38,26 @@ redef class Parser
                        new ReduceAction24(5),
                        new ReduceAction26(6),
                        new ReduceAction27(6),
+                       new ReduceAction28(6),
+                       new ReduceAction29(6),
                        new ReduceAction22(7),
-                       new ReduceAction29(7),
-                       new ReduceAction30(8),
-                       new ReduceAction31(8),
+                       new ReduceAction31(7),
                        new ReduceAction32(8),
                        new ReduceAction33(8),
                        new ReduceAction34(8),
-                       new ReduceAction35(9),
-                       new ReduceAction36(9),
+                       new ReduceAction35(8),
+                       new ReduceAction36(8),
                        new ReduceAction37(9),
-                       new ReduceAction38(10),
-                       new ReduceAction39(11),
-                       new ReduceAction40(11),
-                       new ReduceAction41(12),
-                       new ReduceAction42(13),
-                       new ReduceAction43(13),
+                       new ReduceAction38(9),
+                       new ReduceAction39(9),
+                       new ReduceAction40(10),
+                       new ReduceAction41(11),
+                       new ReduceAction42(11),
+                       new ReduceAction43(12),
                        new ReduceAction44(13),
-                       new ReduceAction45(14),
-                       new ReduceAction46(15),
-                       new ReduceAction47(15),
+                       new ReduceAction45(13),
+                       new ReduceAction46(13),
+                       new ReduceAction47(14),
                        new ReduceAction48(15),
                        new ReduceAction49(15),
                        new ReduceAction50(15),
@@ -83,19 +83,19 @@ redef class Parser
                        new ReduceAction70(15),
                        new ReduceAction71(15),
                        new ReduceAction72(15),
-                       new ReduceAction72(15),
-                       new ReduceAction74(16),
-                       new ReduceAction75(16),
+                       new ReduceAction73(15),
+                       new ReduceAction74(15),
+                       new ReduceAction74(15),
+                       new ReduceAction76(16),
+                       new ReduceAction77(16),
                        new ReduceAction22(16),
-                       new ReduceAction74(17),
-                       new ReduceAction78(17),
-                       new ReduceAction79(18),
-                       new ReduceAction80(18),
+                       new ReduceAction76(17),
+                       new ReduceAction80(17),
                        new ReduceAction81(18),
                        new ReduceAction82(18),
                        new ReduceAction83(18),
-                       new ReduceAction84(19),
-                       new ReduceAction85(19),
+                       new ReduceAction84(18),
+                       new ReduceAction85(18),
                        new ReduceAction86(19),
                        new ReduceAction87(19),
                        new ReduceAction88(19),
@@ -117,124 +117,124 @@ redef class Parser
                        new ReduceAction104(19),
                        new ReduceAction105(19),
                        new ReduceAction106(19),
-                       new ReduceAction107(20),
-                       new ReduceAction108(20),
+                       new ReduceAction107(19),
+                       new ReduceAction108(19),
                        new ReduceAction109(20),
                        new ReduceAction110(20),
-                       new ReduceAction111(21),
-                       new ReduceAction112(21),
-                       new ReduceAction37(21),
-                       new ReduceAction114(22),
-                       new ReduceAction115(23),
-                       new ReduceAction116(23),
+                       new ReduceAction111(20),
+                       new ReduceAction112(20),
+                       new ReduceAction113(21),
+                       new ReduceAction114(21),
+                       new ReduceAction39(21),
+                       new ReduceAction116(22),
                        new ReduceAction117(23),
                        new ReduceAction118(23),
                        new ReduceAction119(23),
-                       new ReduceAction120(24),
-                       new ReduceAction121(24),
+                       new ReduceAction120(23),
+                       new ReduceAction121(23),
+                       new ReduceAction122(24),
+                       new ReduceAction123(24),
                        new ReduceAction22(24),
-                       new ReduceAction123(25),
-                       new ReduceAction124(26),
-                       new ReduceAction124(26),
+                       new ReduceAction125(25),
+                       new ReduceAction126(26),
                        new ReduceAction126(26),
-                       new ReduceAction127(27),
-                       new ReduceAction128(27),
+                       new ReduceAction128(26),
                        new ReduceAction129(27),
-                       new ReduceAction130(28),
-                       new ReduceAction131(28),
+                       new ReduceAction130(27),
+                       new ReduceAction131(27),
                        new ReduceAction132(28),
                        new ReduceAction133(28),
                        new ReduceAction134(28),
                        new ReduceAction135(28),
+                       new ReduceAction136(28),
+                       new ReduceAction137(28),
                        new ReduceAction22(29),
-                       new ReduceAction137(29),
-                       new ReduceAction138(30),
-                       new ReduceAction139(31),
-                       new ReduceAction140(31),
-                       new ReduceAction141(32),
+                       new ReduceAction139(29),
+                       new ReduceAction140(30),
+                       new ReduceAction141(31),
+                       new ReduceAction142(31),
+                       new ReduceAction143(32),
                        new ReduceAction22(32),
-                       new ReduceAction143(33),
-                       new ReduceAction144(34),
-                       new ReduceAction145(34),
+                       new ReduceAction145(33),
                        new ReduceAction146(34),
                        new ReduceAction147(34),
-                       new ReduceAction148(35),
-                       new ReduceAction149(35),
-                       new ReduceAction150(36),
-                       new ReduceAction150(37),
-                       new ReduceAction150(38),
+                       new ReduceAction148(34),
+                       new ReduceAction149(34),
+                       new ReduceAction150(35),
+                       new ReduceAction151(35),
+                       new ReduceAction152(36),
+                       new ReduceAction152(37),
+                       new ReduceAction152(38),
                        new ReduceAction22(38),
-                       new ReduceAction154(39),
-                       new ReduceAction155(39),
                        new ReduceAction156(39),
                        new ReduceAction157(39),
-                       new ReduceAction158(40),
-                       new ReduceAction159(40),
-                       new ReduceAction160(41),
-                       new ReduceAction161(41),
-                       new ReduceAction162(42),
-                       new ReduceAction163(42),
-                       new ReduceAction154(43),
-                       new ReduceAction157(44),
-                       new ReduceAction157(44),
-                       new ReduceAction167(44),
-                       new ReduceAction168(44),
+                       new ReduceAction158(39),
+                       new ReduceAction159(39),
+                       new ReduceAction160(40),
+                       new ReduceAction161(40),
+                       new ReduceAction162(41),
+                       new ReduceAction163(41),
+                       new ReduceAction164(42),
+                       new ReduceAction165(42),
+                       new ReduceAction156(43),
+                       new ReduceAction159(44),
+                       new ReduceAction159(44),
                        new ReduceAction169(44),
                        new ReduceAction170(44),
                        new ReduceAction171(44),
                        new ReduceAction172(44),
                        new ReduceAction173(44),
-                       new ReduceAction157(44),
-                       new ReduceAction157(44),
-                       new ReduceAction157(44),
-                       new ReduceAction157(44),
-                       new ReduceAction157(44),
-                       new ReduceAction157(44),
-                       new ReduceAction157(44),
-                       new ReduceAction181(44),
-                       new ReduceAction182(44),
+                       new ReduceAction174(44),
+                       new ReduceAction175(44),
+                       new ReduceAction159(44),
+                       new ReduceAction159(44),
+                       new ReduceAction159(44),
+                       new ReduceAction159(44),
+                       new ReduceAction159(44),
+                       new ReduceAction159(44),
+                       new ReduceAction159(44),
                        new ReduceAction183(44),
-                       new ReduceAction182(44),
+                       new ReduceAction184(44),
                        new ReduceAction185(44),
-                       new ReduceAction186(44),
+                       new ReduceAction184(44),
                        new ReduceAction187(44),
-                       new ReduceAction186(44),
+                       new ReduceAction188(44),
                        new ReduceAction189(44),
-                       new ReduceAction190(44),
+                       new ReduceAction188(44),
                        new ReduceAction191(44),
                        new ReduceAction192(44),
                        new ReduceAction193(44),
-                       new ReduceAction192(44),
-                       new ReduceAction195(44),
-                       new ReduceAction196(44),
+                       new ReduceAction194(44),
                        new ReduceAction195(44),
+                       new ReduceAction194(44),
+                       new ReduceAction197(44),
                        new ReduceAction198(44),
-                       new ReduceAction199(45),
-                       new ReduceAction200(45),
-                       new ReduceAction201(46),
-                       new ReduceAction202(46),
+                       new ReduceAction197(44),
+                       new ReduceAction200(44),
+                       new ReduceAction201(45),
+                       new ReduceAction202(45),
                        new ReduceAction203(46),
                        new ReduceAction204(46),
-                       new ReduceAction205(47),
-                       new ReduceAction206(47),
+                       new ReduceAction205(46),
+                       new ReduceAction206(46),
                        new ReduceAction207(47),
                        new ReduceAction208(47),
                        new ReduceAction209(47),
                        new ReduceAction210(47),
                        new ReduceAction211(47),
                        new ReduceAction212(47),
-                       new ReduceAction209(47),
-                       new ReduceAction210(47),
-                       new ReduceAction215(47),
-                       new ReduceAction216(47),
+                       new ReduceAction213(47),
+                       new ReduceAction214(47),
+                       new ReduceAction211(47),
+                       new ReduceAction212(47),
                        new ReduceAction217(47),
                        new ReduceAction218(47),
                        new ReduceAction219(47),
                        new ReduceAction220(47),
-                       new ReduceAction217(47),
-                       new ReduceAction218(47),
-                       new ReduceAction223(47),
-                       new ReduceAction224(47),
+                       new ReduceAction221(47),
+                       new ReduceAction222(47),
+                       new ReduceAction219(47),
+                       new ReduceAction220(47),
                        new ReduceAction225(47),
                        new ReduceAction226(47),
                        new ReduceAction227(47),
@@ -242,19 +242,19 @@ redef class Parser
                        new ReduceAction229(47),
                        new ReduceAction230(47),
                        new ReduceAction231(47),
-                       new ReduceAction228(47),
-                       new ReduceAction229(47),
-                       new ReduceAction234(47),
-                       new ReduceAction235(47),
+                       new ReduceAction232(47),
+                       new ReduceAction233(47),
+                       new ReduceAction230(47),
+                       new ReduceAction231(47),
                        new ReduceAction236(47),
                        new ReduceAction237(47),
                        new ReduceAction238(47),
                        new ReduceAction239(47),
-                       new ReduceAction236(47),
-                       new ReduceAction237(47),
-                       new ReduceAction242(47),
-                       new ReduceAction243(48),
-                       new ReduceAction244(48),
+                       new ReduceAction240(47),
+                       new ReduceAction241(47),
+                       new ReduceAction238(47),
+                       new ReduceAction239(47),
+                       new ReduceAction244(47),
                        new ReduceAction245(48),
                        new ReduceAction246(48),
                        new ReduceAction247(48),
@@ -264,842 +264,844 @@ redef class Parser
                        new ReduceAction251(48),
                        new ReduceAction252(48),
                        new ReduceAction253(48),
-                       new ReduceAction254(49),
-                       new ReduceAction255(49),
-                       new ReduceAction256(50),
-                       new ReduceAction257(50),
+                       new ReduceAction254(48),
+                       new ReduceAction255(48),
+                       new ReduceAction256(49),
+                       new ReduceAction257(49),
                        new ReduceAction258(50),
                        new ReduceAction259(50),
                        new ReduceAction260(50),
-                       new ReduceAction154(51),
-                       new ReduceAction156(51),
-                       new ReduceAction263(52),
-                       new ReduceAction264(52),
-                       new ReduceAction265(53),
-                       new ReduceAction266(53),
-                       new ReduceAction267(54),
-                       new ReduceAction268(54),
-                       new ReduceAction269(55),
-                       new ReduceAction270(55),
-                       new ReduceAction271(56),
-                       new ReduceAction272(56),
-                       new ReduceAction157(56),
-                       new ReduceAction274(57),
-                       new ReduceAction275(57),
-                       new ReduceAction276(57),
-                       new ReduceAction277(57),
-                       new ReduceAction278(58),
-                       new ReduceAction157(59),
-                       new ReduceAction280(59),
-                       new ReduceAction157(60),
-                       new ReduceAction282(60),
-                       new ReduceAction283(60),
-                       new ReduceAction284(60),
-                       new ReduceAction285(60),
-                       new ReduceAction157(61),
-                       new ReduceAction287(61),
-                       new ReduceAction157(62),
-                       new ReduceAction289(62),
-                       new ReduceAction290(62),
-                       new ReduceAction291(62),
-                       new ReduceAction292(62),
+                       new ReduceAction261(50),
+                       new ReduceAction262(50),
+                       new ReduceAction263(50),
+                       new ReduceAction264(50),
+                       new ReduceAction265(50),
+                       new ReduceAction158(51),
+                       new ReduceAction267(52),
+                       new ReduceAction268(52),
+                       new ReduceAction269(53),
+                       new ReduceAction270(53),
+                       new ReduceAction271(54),
+                       new ReduceAction272(54),
+                       new ReduceAction273(55),
+                       new ReduceAction274(55),
+                       new ReduceAction275(56),
+                       new ReduceAction276(56),
+                       new ReduceAction159(56),
+                       new ReduceAction278(57),
+                       new ReduceAction279(57),
+                       new ReduceAction280(57),
+                       new ReduceAction281(57),
+                       new ReduceAction282(58),
+                       new ReduceAction159(59),
+                       new ReduceAction284(59),
+                       new ReduceAction159(60),
+                       new ReduceAction286(60),
+                       new ReduceAction287(60),
+                       new ReduceAction288(60),
+                       new ReduceAction289(60),
+                       new ReduceAction159(61),
+                       new ReduceAction291(61),
+                       new ReduceAction159(62),
                        new ReduceAction293(62),
                        new ReduceAction294(62),
                        new ReduceAction295(62),
                        new ReduceAction296(62),
-                       new ReduceAction157(63),
-                       new ReduceAction298(63),
-                       new ReduceAction157(64),
-                       new ReduceAction300(64),
-                       new ReduceAction157(65),
-                       new ReduceAction302(65),
-                       new ReduceAction157(66),
-                       new ReduceAction304(66),
-                       new ReduceAction305(66),
-                       new ReduceAction157(67),
-                       new ReduceAction307(67),
-                       new ReduceAction308(67),
-                       new ReduceAction157(68),
-                       new ReduceAction310(68),
-                       new ReduceAction311(68),
-                       new ReduceAction312(68),
-                       new ReduceAction157(69),
-                       new ReduceAction314(69),
-                       new ReduceAction157(70),
-                       new ReduceAction316(70),
-                       new ReduceAction317(70),
-                       new ReduceAction318(70),
-                       new ReduceAction319(70),
-                       new ReduceAction157(71),
-                       new ReduceAction321(71),
-                       new ReduceAction322(71),
-                       new ReduceAction323(71),
-                       new ReduceAction324(71),
-                       new ReduceAction157(72),
-                       new ReduceAction326(72),
-                       new ReduceAction327(72),
-                       new ReduceAction181(72),
-                       new ReduceAction329(72),
-                       new ReduceAction182(72),
+                       new ReduceAction297(62),
+                       new ReduceAction298(62),
+                       new ReduceAction299(62),
+                       new ReduceAction300(62),
+                       new ReduceAction159(63),
+                       new ReduceAction302(63),
+                       new ReduceAction159(64),
+                       new ReduceAction304(64),
+                       new ReduceAction159(65),
+                       new ReduceAction306(65),
+                       new ReduceAction159(66),
+                       new ReduceAction308(66),
+                       new ReduceAction309(66),
+                       new ReduceAction159(67),
+                       new ReduceAction311(67),
+                       new ReduceAction312(67),
+                       new ReduceAction159(68),
+                       new ReduceAction314(68),
+                       new ReduceAction315(68),
+                       new ReduceAction316(68),
+                       new ReduceAction159(69),
+                       new ReduceAction318(69),
+                       new ReduceAction159(70),
+                       new ReduceAction320(70),
+                       new ReduceAction321(70),
+                       new ReduceAction322(70),
+                       new ReduceAction323(70),
+                       new ReduceAction159(71),
+                       new ReduceAction325(71),
+                       new ReduceAction326(71),
+                       new ReduceAction327(71),
+                       new ReduceAction328(71),
+                       new ReduceAction159(72),
+                       new ReduceAction330(72),
                        new ReduceAction331(72),
                        new ReduceAction183(72),
                        new ReduceAction333(72),
-                       new ReduceAction182(72),
-                       new ReduceAction331(72),
+                       new ReduceAction184(72),
+                       new ReduceAction335(72),
                        new ReduceAction185(72),
                        new ReduceAction337(72),
-                       new ReduceAction186(72),
-                       new ReduceAction339(72),
+                       new ReduceAction184(72),
+                       new ReduceAction335(72),
                        new ReduceAction187(72),
                        new ReduceAction341(72),
-                       new ReduceAction186(72),
-                       new ReduceAction339(72),
+                       new ReduceAction188(72),
+                       new ReduceAction343(72),
                        new ReduceAction189(72),
                        new ReduceAction345(72),
-                       new ReduceAction190(72),
-                       new ReduceAction347(72),
+                       new ReduceAction188(72),
+                       new ReduceAction343(72),
                        new ReduceAction191(72),
                        new ReduceAction349(72),
-                       new ReduceAction350(72),
+                       new ReduceAction192(72),
                        new ReduceAction351(72),
-                       new ReduceAction352(72),
+                       new ReduceAction193(72),
                        new ReduceAction353(72),
                        new ReduceAction354(72),
                        new ReduceAction355(72),
                        new ReduceAction356(72),
-                       new ReduceAction353(72),
-                       new ReduceAction354(72),
+                       new ReduceAction357(72),
+                       new ReduceAction358(72),
                        new ReduceAction359(72),
                        new ReduceAction360(72),
-                       new ReduceAction361(72),
-                       new ReduceAction157(73),
-                       new ReduceAction363(73),
-                       new ReduceAction364(73),
-                       new ReduceAction365(74),
-                       new ReduceAction366(74),
-                       new ReduceAction367(74),
-                       new ReduceAction368(74),
+                       new ReduceAction357(72),
+                       new ReduceAction358(72),
+                       new ReduceAction363(72),
+                       new ReduceAction364(72),
+                       new ReduceAction365(72),
+                       new ReduceAction159(73),
+                       new ReduceAction367(73),
+                       new ReduceAction368(73),
                        new ReduceAction369(74),
                        new ReduceAction370(74),
                        new ReduceAction371(74),
                        new ReduceAction372(74),
                        new ReduceAction373(74),
-                       new ReduceAction157(74),
-                       new ReduceAction157(74),
+                       new ReduceAction374(74),
+                       new ReduceAction375(74),
                        new ReduceAction376(74),
                        new ReduceAction377(74),
-                       new ReduceAction378(74),
-                       new ReduceAction379(75),
-                       new ReduceAction379(75),
-                       new ReduceAction381(76),
-                       new ReduceAction382(77),
-                       new ReduceAction383(78),
-                       new ReduceAction384(78),
-                       new ReduceAction382(79),
-                       new ReduceAction386(80),
-                       new ReduceAction268(80),
-                       new ReduceAction388(80),
-                       new ReduceAction389(81),
-                       new ReduceAction390(81),
-                       new ReduceAction391(82),
-                       new ReduceAction392(82),
-                       new ReduceAction393(83),
-                       new ReduceAction391(84),
-                       new ReduceAction392(84),
-                       new ReduceAction396(85),
-                       new ReduceAction397(86),
-                       new ReduceAction398(87),
-                       new ReduceAction399(87),
-                       new ReduceAction400(88),
+                       new ReduceAction159(74),
+                       new ReduceAction159(74),
+                       new ReduceAction380(74),
+                       new ReduceAction381(74),
+                       new ReduceAction382(74),
+                       new ReduceAction383(75),
+                       new ReduceAction383(75),
+                       new ReduceAction385(76),
+                       new ReduceAction386(77),
+                       new ReduceAction387(78),
+                       new ReduceAction388(78),
+                       new ReduceAction386(79),
+                       new ReduceAction390(80),
+                       new ReduceAction272(80),
+                       new ReduceAction392(80),
+                       new ReduceAction393(81),
+                       new ReduceAction394(81),
+                       new ReduceAction395(82),
+                       new ReduceAction396(82),
+                       new ReduceAction397(83),
+                       new ReduceAction395(84),
+                       new ReduceAction396(84),
+                       new ReduceAction400(85),
+                       new ReduceAction401(86),
+                       new ReduceAction402(87),
+                       new ReduceAction403(87),
+                       new ReduceAction404(88),
                        new ReduceAction22(88),
-                       new ReduceAction402(89),
-                       new ReduceAction403(89),
-                       new ReduceAction404(90),
-                       new ReduceAction405(91),
+                       new ReduceAction406(89),
+                       new ReduceAction407(89),
+                       new ReduceAction408(90),
+                       new ReduceAction409(90),
                        new ReduceAction406(91),
-                       new ReduceAction402(92),
-                       new ReduceAction403(92),
-                       new ReduceAction409(92),
-                       new ReduceAction157(93),
-                       new ReduceAction411(94),
-                       new ReduceAction404(95),
-                       new ReduceAction413(96),
-                       new ReduceAction414(96),
-                       new ReduceAction415(96),
-                       new ReduceAction416(96),
-                       new ReduceAction417(96),
-                       new ReduceAction418(97),
-                       new ReduceAction419(97),
-                       new ReduceAction420(97),
-                       new ReduceAction421(97),
-                       new ReduceAction422(97),
-                       new ReduceAction383(98),
-                       new ReduceAction384(98),
-                       new ReduceAction382(99),
-                       new ReduceAction426(100),
-                       new ReduceAction157(100),
-                       new ReduceAction157(100),
-                       new ReduceAction429(100),
-                       new ReduceAction430(100),
-                       new ReduceAction431(100),
-                       new ReduceAction432(101),
-                       new ReduceAction433(101),
-                       new ReduceAction434(101),
-                       new ReduceAction435(102),
-                       new ReduceAction436(102),
-                       new ReduceAction435(103),
-                       new ReduceAction438(103),
-                       new ReduceAction436(103),
-                       new ReduceAction440(103),
-                       new ReduceAction441(104),
-                       new ReduceAction392(105),
-                       new ReduceAction443(105),
-                       new ReduceAction444(106),
-                       new ReduceAction445(107),
-                       new ReduceAction446(107),
-                       new ReduceAction447(108),
-                       new ReduceAction448(108),
-                       new ReduceAction449(109),
-                       new ReduceAction450(109),
-                       new ReduceAction451(109),
-                       new ReduceAction452(109),
-                       new ReduceAction453(110),
-                       new ReduceAction454(110),
-                       new ReduceAction455(110),
-                       new ReduceAction22(110),
-                       new ReduceAction457(111),
-                       new ReduceAction458(111),
-                       new ReduceAction459(111),
-                       new ReduceAction458(111),
-                       new ReduceAction461(112),
-                       new ReduceAction462(112),
-                       new ReduceAction463(112),
-                       new ReduceAction462(112),
-                       new ReduceAction465(113),
-                       new ReduceAction466(114),
-                       new ReduceAction22(115),
-                       new ReduceAction468(115),
-                       new ReduceAction469(116),
-                       new ReduceAction469(116),
-                       new ReduceAction469(116),
-                       new ReduceAction472(117),
-                       new ReduceAction473(117),
-                       new ReduceAction23(117),
-                       new ReduceAction23(117),
-                       new ReduceAction476(117),
-                       new ReduceAction476(117),
-                       new ReduceAction478(117),
-                       new ReduceAction479(117),
-                       new ReduceAction480(117),
-                       new ReduceAction480(117),
-                       new ReduceAction482(117),
-                       new ReduceAction22(118),
-                       new ReduceAction484(118),
-                       new ReduceAction485(119),
-                       new ReduceAction469(119),
-                       new ReduceAction469(120),
-                       new ReduceAction488(120),
-                       new ReduceAction46(121),
-                       new ReduceAction47(121),
-                       new ReduceAction48(121),
-                       new ReduceAction55(121),
-                       new ReduceAction56(121),
-                       new ReduceAction74(122),
-                       new ReduceAction75(122),
-                       new ReduceAction84(123),
-                       new ReduceAction85(123),
-                       new ReduceAction86(123),
-                       new ReduceAction87(123),
-                       new ReduceAction88(123),
-                       new ReduceAction89(123),
-                       new ReduceAction90(123),
-                       new ReduceAction91(123),
-                       new ReduceAction92(123),
-                       new ReduceAction93(123),
-                       new ReduceAction94(123),
-                       new ReduceAction95(123),
-                       new ReduceAction96(123),
-                       new ReduceAction97(123),
-                       new ReduceAction98(123),
-                       new ReduceAction99(123),
-                       new ReduceAction100(123),
-                       new ReduceAction101(123),
-                       new ReduceAction102(123),
-                       new ReduceAction103(123),
-                       new ReduceAction104(123),
-                       new ReduceAction105(123),
-                       new ReduceAction461(124),
-                       new ReduceAction462(124),
-                       new ReduceAction463(124),
-                       new ReduceAction462(124),
-                       new ReduceAction144(125),
-                       new ReduceAction145(125),
-                       new ReduceAction157(126),
-                       new ReduceAction280(126),
-                       new ReduceAction157(127),
-                       new ReduceAction282(127),
-                       new ReduceAction283(127),
-                       new ReduceAction284(127),
-                       new ReduceAction285(127),
-                       new ReduceAction157(128),
-                       new ReduceAction287(128),
-                       new ReduceAction157(129),
-                       new ReduceAction289(129),
-                       new ReduceAction290(129),
-                       new ReduceAction291(129),
-                       new ReduceAction292(129),
-                       new ReduceAction293(129),
-                       new ReduceAction294(129),
-                       new ReduceAction295(129),
-                       new ReduceAction296(129),
-                       new ReduceAction157(130),
-                       new ReduceAction298(130),
-                       new ReduceAction157(131),
-                       new ReduceAction300(131),
-                       new ReduceAction157(132),
-                       new ReduceAction302(132),
-                       new ReduceAction157(133),
-                       new ReduceAction304(133),
-                       new ReduceAction305(133),
-                       new ReduceAction157(134),
-                       new ReduceAction307(134),
-                       new ReduceAction308(134),
-                       new ReduceAction157(135),
-                       new ReduceAction310(135),
-                       new ReduceAction311(135),
-                       new ReduceAction312(135),
-                       new ReduceAction157(136),
-                       new ReduceAction314(136),
-                       new ReduceAction157(137),
-                       new ReduceAction316(137),
-                       new ReduceAction317(137),
-                       new ReduceAction318(137),
-                       new ReduceAction319(137),
-                       new ReduceAction157(138),
-                       new ReduceAction321(138),
-                       new ReduceAction322(138),
-                       new ReduceAction323(138),
-                       new ReduceAction324(138),
-                       new ReduceAction157(139),
-                       new ReduceAction326(139),
-                       new ReduceAction327(139),
-                       new ReduceAction181(139),
-                       new ReduceAction185(139),
-                       new ReduceAction329(139),
-                       new ReduceAction337(139),
-                       new ReduceAction182(139),
-                       new ReduceAction186(139),
-                       new ReduceAction331(139),
-                       new ReduceAction339(139),
-                       new ReduceAction183(139),
-                       new ReduceAction187(139),
-                       new ReduceAction333(139),
-                       new ReduceAction341(139),
-                       new ReduceAction182(139),
-                       new ReduceAction186(139),
-                       new ReduceAction331(139),
-                       new ReduceAction339(139),
-                       new ReduceAction189(139),
-                       new ReduceAction345(139),
-                       new ReduceAction190(139),
-                       new ReduceAction191(139),
-                       new ReduceAction347(139),
-                       new ReduceAction349(139),
-                       new ReduceAction351(139),
-                       new ReduceAction352(139),
-                       new ReduceAction353(139),
-                       new ReduceAction354(139),
-                       new ReduceAction355(139),
-                       new ReduceAction356(139),
-                       new ReduceAction353(139),
-                       new ReduceAction354(139),
-                       new ReduceAction359(139),
-                       new ReduceAction360(139),
-                       new ReduceAction361(139),
-                       new ReduceAction157(140),
-                       new ReduceAction363(140),
-                       new ReduceAction364(140),
-                       new ReduceAction365(141),
-                       new ReduceAction366(141),
-                       new ReduceAction367(141),
-                       new ReduceAction368(141),
-                       new ReduceAction369(141),
-                       new ReduceAction370(141),
-                       new ReduceAction371(141),
-                       new ReduceAction372(141),
-                       new ReduceAction373(141),
-                       new ReduceAction157(141),
-                       new ReduceAction157(141),
-                       new ReduceAction144(142),
-                       new ReduceAction145(142),
-                       new ReduceAction146(142),
-                       new ReduceAction147(142),
-                       new ReduceAction157(143),
-                       new ReduceAction157(143),
-                       new ReduceAction167(143),
-                       new ReduceAction168(143),
-                       new ReduceAction169(143),
-                       new ReduceAction170(143),
-                       new ReduceAction171(143),
-                       new ReduceAction172(143),
-                       new ReduceAction173(143),
-                       new ReduceAction157(143),
-                       new ReduceAction157(143),
-                       new ReduceAction157(143),
-                       new ReduceAction157(143),
-                       new ReduceAction157(143),
-                       new ReduceAction157(143),
-                       new ReduceAction157(143),
-                       new ReduceAction181(143),
-                       new ReduceAction182(143),
-                       new ReduceAction183(143),
-                       new ReduceAction182(143),
-                       new ReduceAction185(143),
-                       new ReduceAction186(143),
-                       new ReduceAction187(143),
-                       new ReduceAction186(143),
-                       new ReduceAction189(143),
-                       new ReduceAction190(143),
-                       new ReduceAction191(143),
-                       new ReduceAction192(143),
-                       new ReduceAction193(143),
-                       new ReduceAction192(143),
-                       new ReduceAction195(143),
-                       new ReduceAction196(143),
-                       new ReduceAction195(143),
-                       new ReduceAction198(143),
-                       new ReduceAction205(144),
-                       new ReduceAction206(144),
-                       new ReduceAction207(144),
-                       new ReduceAction208(144),
-                       new ReduceAction209(144),
-                       new ReduceAction210(144),
-                       new ReduceAction211(144),
-                       new ReduceAction212(144),
-                       new ReduceAction209(144),
-                       new ReduceAction210(144),
-                       new ReduceAction215(144),
-                       new ReduceAction216(144),
-                       new ReduceAction217(144),
-                       new ReduceAction218(144),
-                       new ReduceAction219(144),
-                       new ReduceAction220(144),
-                       new ReduceAction217(144),
-                       new ReduceAction218(144),
-                       new ReduceAction223(144),
-                       new ReduceAction224(144),
-                       new ReduceAction225(144),
-                       new ReduceAction226(144),
-                       new ReduceAction227(144),
-                       new ReduceAction228(144),
-                       new ReduceAction229(144),
-                       new ReduceAction230(144),
-                       new ReduceAction231(144),
-                       new ReduceAction228(144),
-                       new ReduceAction229(144),
-                       new ReduceAction234(144),
-                       new ReduceAction235(144),
-                       new ReduceAction236(144),
-                       new ReduceAction237(144),
-                       new ReduceAction238(144),
-                       new ReduceAction239(144),
-                       new ReduceAction236(144),
-                       new ReduceAction237(144),
-                       new ReduceAction242(144),
-                       new ReduceAction157(145),
-                       new ReduceAction280(145),
-                       new ReduceAction157(146),
-                       new ReduceAction282(146),
-                       new ReduceAction283(146),
-                       new ReduceAction284(146),
-                       new ReduceAction285(146),
-                       new ReduceAction157(147),
-                       new ReduceAction287(147),
-                       new ReduceAction157(148),
-                       new ReduceAction289(148),
-                       new ReduceAction290(148),
-                       new ReduceAction291(148),
-                       new ReduceAction292(148),
-                       new ReduceAction293(148),
-                       new ReduceAction294(148),
-                       new ReduceAction295(148),
-                       new ReduceAction296(148),
-                       new ReduceAction157(149),
-                       new ReduceAction298(149),
-                       new ReduceAction157(150),
-                       new ReduceAction300(150),
-                       new ReduceAction157(151),
-                       new ReduceAction302(151),
-                       new ReduceAction157(152),
-                       new ReduceAction304(152),
-                       new ReduceAction305(152),
-                       new ReduceAction157(153),
-                       new ReduceAction307(153),
-                       new ReduceAction308(153),
-                       new ReduceAction157(154),
-                       new ReduceAction310(154),
-                       new ReduceAction311(154),
-                       new ReduceAction312(154),
-                       new ReduceAction157(155),
-                       new ReduceAction314(155),
-                       new ReduceAction157(156),
-                       new ReduceAction316(156),
-                       new ReduceAction317(156),
-                       new ReduceAction318(156),
-                       new ReduceAction319(156),
-                       new ReduceAction157(157),
-                       new ReduceAction321(157),
-                       new ReduceAction322(157),
-                       new ReduceAction323(157),
-                       new ReduceAction324(157),
-                       new ReduceAction157(158),
-                       new ReduceAction326(158),
-                       new ReduceAction327(158),
-                       new ReduceAction181(158),
-                       new ReduceAction329(158),
-                       new ReduceAction182(158),
-                       new ReduceAction331(158),
-                       new ReduceAction183(158),
-                       new ReduceAction333(158),
-                       new ReduceAction182(158),
-                       new ReduceAction331(158),
-                       new ReduceAction185(158),
-                       new ReduceAction337(158),
-                       new ReduceAction186(158),
-                       new ReduceAction339(158),
-                       new ReduceAction187(158),
-                       new ReduceAction341(158),
-                       new ReduceAction186(158),
-                       new ReduceAction339(158),
-                       new ReduceAction189(158),
-                       new ReduceAction345(158),
-                       new ReduceAction190(158),
-                       new ReduceAction347(158),
-                       new ReduceAction191(158),
-                       new ReduceAction349(158),
-                       new ReduceAction350(158),
-                       new ReduceAction351(158),
-                       new ReduceAction352(158),
-                       new ReduceAction353(158),
-                       new ReduceAction354(158),
-                       new ReduceAction355(158),
-                       new ReduceAction356(158),
-                       new ReduceAction353(158),
-                       new ReduceAction354(158),
-                       new ReduceAction359(158),
-                       new ReduceAction360(158),
-                       new ReduceAction361(158),
-                       new ReduceAction157(159),
-                       new ReduceAction363(159),
-                       new ReduceAction364(159),
-                       new ReduceAction365(160),
-                       new ReduceAction366(160),
-                       new ReduceAction367(160),
-                       new ReduceAction368(160),
-                       new ReduceAction369(160),
-                       new ReduceAction370(160),
-                       new ReduceAction371(160),
-                       new ReduceAction372(160),
-                       new ReduceAction373(160),
-                       new ReduceAction157(160),
-                       new ReduceAction398(161),
-                       new ReduceAction399(161),
-                       new ReduceAction400(162),
-                       new ReduceAction22(162),
-                       new ReduceAction402(163),
-                       new ReduceAction402(164),
-                       new ReduceAction383(165),
-                       new ReduceAction384(165),
-                       new ReduceAction426(166),
-                       new ReduceAction157(166),
-                       new ReduceAction157(166),
-                       new ReduceAction429(166),
-                       new ReduceAction430(166),
-                       new ReduceAction144(167),
-                       new ReduceAction145(167),
-                       new ReduceAction157(168),
-                       new ReduceAction280(168),
-                       new ReduceAction157(169),
-                       new ReduceAction282(169),
-                       new ReduceAction283(169),
-                       new ReduceAction284(169),
-                       new ReduceAction285(169),
-                       new ReduceAction157(170),
-                       new ReduceAction287(170),
-                       new ReduceAction157(171),
-                       new ReduceAction289(171),
-                       new ReduceAction290(171),
-                       new ReduceAction291(171),
-                       new ReduceAction292(171),
-                       new ReduceAction293(171),
-                       new ReduceAction294(171),
-                       new ReduceAction295(171),
-                       new ReduceAction296(171),
-                       new ReduceAction157(172),
-                       new ReduceAction298(172),
-                       new ReduceAction157(173),
-                       new ReduceAction300(173),
-                       new ReduceAction157(174),
-                       new ReduceAction302(174),
-                       new ReduceAction157(175),
-                       new ReduceAction304(175),
-                       new ReduceAction305(175),
-                       new ReduceAction157(176),
-                       new ReduceAction307(176),
-                       new ReduceAction308(176),
-                       new ReduceAction157(177),
-                       new ReduceAction310(177),
-                       new ReduceAction311(177),
-                       new ReduceAction312(177),
-                       new ReduceAction157(178),
-                       new ReduceAction314(178),
-                       new ReduceAction157(179),
-                       new ReduceAction316(179),
-                       new ReduceAction317(179),
-                       new ReduceAction318(179),
-                       new ReduceAction319(179),
-                       new ReduceAction157(180),
-                       new ReduceAction321(180),
-                       new ReduceAction322(180),
-                       new ReduceAction851(180),
-                       new ReduceAction157(181),
-                       new ReduceAction853(181),
-                       new ReduceAction854(181),
-                       new ReduceAction855(181),
-                       new ReduceAction856(181),
-                       new ReduceAction857(181),
-                       new ReduceAction181(181),
-                       new ReduceAction329(181),
-                       new ReduceAction856(181),
-                       new ReduceAction857(181),
-                       new ReduceAction189(181),
-                       new ReduceAction345(181),
-                       new ReduceAction864(181),
-                       new ReduceAction865(181),
-                       new ReduceAction351(181),
-                       new ReduceAction352(181),
-                       new ReduceAction353(181),
-                       new ReduceAction354(181),
-                       new ReduceAction355(181),
-                       new ReduceAction356(181),
-                       new ReduceAction353(181),
-                       new ReduceAction354(181),
-                       new ReduceAction359(181),
-                       new ReduceAction360(181),
-                       new ReduceAction361(181),
-                       new ReduceAction157(182),
-                       new ReduceAction363(182),
-                       new ReduceAction364(182),
-                       new ReduceAction365(183),
-                       new ReduceAction366(183),
-                       new ReduceAction367(183),
-                       new ReduceAction368(183),
-                       new ReduceAction369(183),
-                       new ReduceAction370(183),
-                       new ReduceAction371(183),
-                       new ReduceAction372(183),
-                       new ReduceAction373(183),
+                       new ReduceAction407(91),
+                       new ReduceAction412(91),
+                       new ReduceAction159(92),
+                       new ReduceAction414(93),
+                       new ReduceAction415(94),
+                       new ReduceAction416(94),
+                       new ReduceAction417(94),
+                       new ReduceAction418(94),
+                       new ReduceAction419(94),
+                       new ReduceAction420(95),
+                       new ReduceAction421(95),
+                       new ReduceAction422(95),
+                       new ReduceAction423(95),
+                       new ReduceAction424(95),
+                       new ReduceAction387(96),
+                       new ReduceAction388(96),
+                       new ReduceAction386(97),
+                       new ReduceAction428(98),
+                       new ReduceAction159(98),
+                       new ReduceAction159(98),
+                       new ReduceAction431(98),
+                       new ReduceAction432(98),
+                       new ReduceAction433(98),
+                       new ReduceAction434(99),
+                       new ReduceAction435(99),
+                       new ReduceAction436(99),
+                       new ReduceAction437(100),
+                       new ReduceAction438(100),
+                       new ReduceAction437(101),
+                       new ReduceAction440(101),
+                       new ReduceAction438(101),
+                       new ReduceAction442(101),
+                       new ReduceAction443(102),
+                       new ReduceAction396(103),
+                       new ReduceAction445(103),
+                       new ReduceAction446(104),
+                       new ReduceAction447(105),
+                       new ReduceAction448(105),
+                       new ReduceAction449(106),
+                       new ReduceAction450(106),
+                       new ReduceAction451(107),
+                       new ReduceAction452(107),
+                       new ReduceAction453(107),
+                       new ReduceAction454(107),
+                       new ReduceAction455(108),
+                       new ReduceAction456(108),
+                       new ReduceAction457(108),
+                       new ReduceAction22(108),
+                       new ReduceAction459(109),
+                       new ReduceAction460(109),
+                       new ReduceAction461(109),
+                       new ReduceAction460(109),
+                       new ReduceAction463(110),
+                       new ReduceAction464(110),
+                       new ReduceAction465(110),
+                       new ReduceAction464(110),
+                       new ReduceAction467(111),
+                       new ReduceAction468(112),
+                       new ReduceAction22(113),
+                       new ReduceAction470(113),
+                       new ReduceAction471(114),
+                       new ReduceAction471(114),
+                       new ReduceAction471(114),
+                       new ReduceAction474(115),
+                       new ReduceAction475(115),
+                       new ReduceAction23(115),
+                       new ReduceAction23(115),
+                       new ReduceAction478(115),
+                       new ReduceAction478(115),
+                       new ReduceAction480(115),
+                       new ReduceAction481(115),
+                       new ReduceAction482(115),
+                       new ReduceAction482(115),
+                       new ReduceAction484(115),
+                       new ReduceAction22(116),
+                       new ReduceAction486(116),
+                       new ReduceAction487(117),
+                       new ReduceAction471(117),
+                       new ReduceAction471(118),
+                       new ReduceAction490(118),
+                       new ReduceAction48(119),
+                       new ReduceAction49(119),
+                       new ReduceAction50(119),
+                       new ReduceAction57(119),
+                       new ReduceAction58(119),
+                       new ReduceAction76(120),
+                       new ReduceAction77(120),
+                       new ReduceAction86(121),
+                       new ReduceAction87(121),
+                       new ReduceAction88(121),
+                       new ReduceAction89(121),
+                       new ReduceAction90(121),
+                       new ReduceAction91(121),
+                       new ReduceAction92(121),
+                       new ReduceAction93(121),
+                       new ReduceAction94(121),
+                       new ReduceAction95(121),
+                       new ReduceAction96(121),
+                       new ReduceAction97(121),
+                       new ReduceAction98(121),
+                       new ReduceAction99(121),
+                       new ReduceAction100(121),
+                       new ReduceAction101(121),
+                       new ReduceAction102(121),
+                       new ReduceAction103(121),
+                       new ReduceAction104(121),
+                       new ReduceAction105(121),
+                       new ReduceAction106(121),
+                       new ReduceAction107(121),
+                       new ReduceAction463(122),
+                       new ReduceAction464(122),
+                       new ReduceAction465(122),
+                       new ReduceAction464(122),
+                       new ReduceAction146(123),
+                       new ReduceAction147(123),
+                       new ReduceAction159(124),
+                       new ReduceAction284(124),
+                       new ReduceAction159(125),
+                       new ReduceAction286(125),
+                       new ReduceAction287(125),
+                       new ReduceAction288(125),
+                       new ReduceAction289(125),
+                       new ReduceAction159(126),
+                       new ReduceAction291(126),
+                       new ReduceAction159(127),
+                       new ReduceAction293(127),
+                       new ReduceAction294(127),
+                       new ReduceAction295(127),
+                       new ReduceAction296(127),
+                       new ReduceAction297(127),
+                       new ReduceAction298(127),
+                       new ReduceAction299(127),
+                       new ReduceAction300(127),
+                       new ReduceAction159(128),
+                       new ReduceAction302(128),
+                       new ReduceAction159(129),
+                       new ReduceAction304(129),
+                       new ReduceAction159(130),
+                       new ReduceAction306(130),
+                       new ReduceAction159(131),
+                       new ReduceAction308(131),
+                       new ReduceAction309(131),
+                       new ReduceAction159(132),
+                       new ReduceAction311(132),
+                       new ReduceAction312(132),
+                       new ReduceAction159(133),
+                       new ReduceAction314(133),
+                       new ReduceAction315(133),
+                       new ReduceAction316(133),
+                       new ReduceAction159(134),
+                       new ReduceAction318(134),
+                       new ReduceAction159(135),
+                       new ReduceAction320(135),
+                       new ReduceAction321(135),
+                       new ReduceAction322(135),
+                       new ReduceAction323(135),
+                       new ReduceAction159(136),
+                       new ReduceAction325(136),
+                       new ReduceAction326(136),
+                       new ReduceAction327(136),
+                       new ReduceAction328(136),
+                       new ReduceAction159(137),
+                       new ReduceAction330(137),
+                       new ReduceAction331(137),
+                       new ReduceAction183(137),
+                       new ReduceAction187(137),
+                       new ReduceAction333(137),
+                       new ReduceAction341(137),
+                       new ReduceAction184(137),
+                       new ReduceAction188(137),
+                       new ReduceAction335(137),
+                       new ReduceAction343(137),
+                       new ReduceAction185(137),
+                       new ReduceAction189(137),
+                       new ReduceAction337(137),
+                       new ReduceAction345(137),
+                       new ReduceAction184(137),
+                       new ReduceAction188(137),
+                       new ReduceAction335(137),
+                       new ReduceAction343(137),
+                       new ReduceAction191(137),
+                       new ReduceAction349(137),
+                       new ReduceAction192(137),
+                       new ReduceAction193(137),
+                       new ReduceAction351(137),
+                       new ReduceAction353(137),
+                       new ReduceAction355(137),
+                       new ReduceAction356(137),
+                       new ReduceAction357(137),
+                       new ReduceAction358(137),
+                       new ReduceAction359(137),
+                       new ReduceAction360(137),
+                       new ReduceAction357(137),
+                       new ReduceAction358(137),
+                       new ReduceAction363(137),
+                       new ReduceAction364(137),
+                       new ReduceAction365(137),
+                       new ReduceAction159(138),
+                       new ReduceAction367(138),
+                       new ReduceAction368(138),
+                       new ReduceAction369(139),
+                       new ReduceAction370(139),
+                       new ReduceAction371(139),
+                       new ReduceAction372(139),
+                       new ReduceAction373(139),
+                       new ReduceAction374(139),
+                       new ReduceAction375(139),
+                       new ReduceAction376(139),
+                       new ReduceAction377(139),
+                       new ReduceAction159(139),
+                       new ReduceAction159(139),
+                       new ReduceAction146(140),
+                       new ReduceAction147(140),
+                       new ReduceAction148(140),
+                       new ReduceAction149(140),
+                       new ReduceAction159(141),
+                       new ReduceAction159(141),
+                       new ReduceAction169(141),
+                       new ReduceAction170(141),
+                       new ReduceAction171(141),
+                       new ReduceAction172(141),
+                       new ReduceAction173(141),
+                       new ReduceAction174(141),
+                       new ReduceAction175(141),
+                       new ReduceAction159(141),
+                       new ReduceAction159(141),
+                       new ReduceAction159(141),
+                       new ReduceAction159(141),
+                       new ReduceAction159(141),
+                       new ReduceAction159(141),
+                       new ReduceAction159(141),
+                       new ReduceAction183(141),
+                       new ReduceAction184(141),
+                       new ReduceAction185(141),
+                       new ReduceAction184(141),
+                       new ReduceAction187(141),
+                       new ReduceAction188(141),
+                       new ReduceAction189(141),
+                       new ReduceAction188(141),
+                       new ReduceAction191(141),
+                       new ReduceAction192(141),
+                       new ReduceAction193(141),
+                       new ReduceAction194(141),
+                       new ReduceAction195(141),
+                       new ReduceAction194(141),
+                       new ReduceAction197(141),
+                       new ReduceAction198(141),
+                       new ReduceAction197(141),
+                       new ReduceAction200(141),
+                       new ReduceAction207(142),
+                       new ReduceAction208(142),
+                       new ReduceAction209(142),
+                       new ReduceAction210(142),
+                       new ReduceAction211(142),
+                       new ReduceAction212(142),
+                       new ReduceAction213(142),
+                       new ReduceAction214(142),
+                       new ReduceAction211(142),
+                       new ReduceAction212(142),
+                       new ReduceAction217(142),
+                       new ReduceAction218(142),
+                       new ReduceAction219(142),
+                       new ReduceAction220(142),
+                       new ReduceAction221(142),
+                       new ReduceAction222(142),
+                       new ReduceAction219(142),
+                       new ReduceAction220(142),
+                       new ReduceAction225(142),
+                       new ReduceAction226(142),
+                       new ReduceAction227(142),
+                       new ReduceAction228(142),
+                       new ReduceAction229(142),
+                       new ReduceAction230(142),
+                       new ReduceAction231(142),
+                       new ReduceAction232(142),
+                       new ReduceAction233(142),
+                       new ReduceAction230(142),
+                       new ReduceAction231(142),
+                       new ReduceAction236(142),
+                       new ReduceAction237(142),
+                       new ReduceAction238(142),
+                       new ReduceAction239(142),
+                       new ReduceAction240(142),
+                       new ReduceAction241(142),
+                       new ReduceAction238(142),
+                       new ReduceAction239(142),
+                       new ReduceAction244(142),
+                       new ReduceAction159(143),
+                       new ReduceAction284(143),
+                       new ReduceAction159(144),
+                       new ReduceAction286(144),
+                       new ReduceAction287(144),
+                       new ReduceAction288(144),
+                       new ReduceAction289(144),
+                       new ReduceAction159(145),
+                       new ReduceAction291(145),
+                       new ReduceAction159(146),
+                       new ReduceAction293(146),
+                       new ReduceAction294(146),
+                       new ReduceAction295(146),
+                       new ReduceAction296(146),
+                       new ReduceAction297(146),
+                       new ReduceAction298(146),
+                       new ReduceAction299(146),
+                       new ReduceAction300(146),
+                       new ReduceAction159(147),
+                       new ReduceAction302(147),
+                       new ReduceAction159(148),
+                       new ReduceAction304(148),
+                       new ReduceAction159(149),
+                       new ReduceAction306(149),
+                       new ReduceAction159(150),
+                       new ReduceAction308(150),
+                       new ReduceAction309(150),
+                       new ReduceAction159(151),
+                       new ReduceAction311(151),
+                       new ReduceAction312(151),
+                       new ReduceAction159(152),
+                       new ReduceAction314(152),
+                       new ReduceAction315(152),
+                       new ReduceAction316(152),
+                       new ReduceAction159(153),
+                       new ReduceAction318(153),
+                       new ReduceAction159(154),
+                       new ReduceAction320(154),
+                       new ReduceAction321(154),
+                       new ReduceAction322(154),
+                       new ReduceAction323(154),
+                       new ReduceAction159(155),
+                       new ReduceAction325(155),
+                       new ReduceAction326(155),
+                       new ReduceAction327(155),
+                       new ReduceAction328(155),
+                       new ReduceAction159(156),
+                       new ReduceAction330(156),
+                       new ReduceAction331(156),
+                       new ReduceAction183(156),
+                       new ReduceAction333(156),
+                       new ReduceAction184(156),
+                       new ReduceAction335(156),
+                       new ReduceAction185(156),
+                       new ReduceAction337(156),
+                       new ReduceAction184(156),
+                       new ReduceAction335(156),
+                       new ReduceAction187(156),
+                       new ReduceAction341(156),
+                       new ReduceAction188(156),
+                       new ReduceAction343(156),
+                       new ReduceAction189(156),
+                       new ReduceAction345(156),
+                       new ReduceAction188(156),
+                       new ReduceAction343(156),
+                       new ReduceAction191(156),
+                       new ReduceAction349(156),
+                       new ReduceAction192(156),
+                       new ReduceAction351(156),
+                       new ReduceAction193(156),
+                       new ReduceAction353(156),
+                       new ReduceAction354(156),
+                       new ReduceAction355(156),
+                       new ReduceAction356(156),
+                       new ReduceAction357(156),
+                       new ReduceAction358(156),
+                       new ReduceAction359(156),
+                       new ReduceAction360(156),
+                       new ReduceAction357(156),
+                       new ReduceAction358(156),
+                       new ReduceAction363(156),
+                       new ReduceAction364(156),
+                       new ReduceAction365(156),
+                       new ReduceAction159(157),
+                       new ReduceAction367(157),
+                       new ReduceAction368(157),
+                       new ReduceAction369(158),
+                       new ReduceAction370(158),
+                       new ReduceAction371(158),
+                       new ReduceAction372(158),
+                       new ReduceAction373(158),
+                       new ReduceAction374(158),
+                       new ReduceAction375(158),
+                       new ReduceAction376(158),
+                       new ReduceAction377(158),
+                       new ReduceAction159(158),
+                       new ReduceAction402(159),
+                       new ReduceAction403(159),
+                       new ReduceAction404(160),
+                       new ReduceAction22(160),
+                       new ReduceAction406(161),
+                       new ReduceAction406(162),
+                       new ReduceAction387(163),
+                       new ReduceAction388(163),
+                       new ReduceAction428(164),
+                       new ReduceAction159(164),
+                       new ReduceAction159(164),
+                       new ReduceAction431(164),
+                       new ReduceAction432(164),
+                       new ReduceAction146(165),
+                       new ReduceAction147(165),
+                       new ReduceAction159(166),
+                       new ReduceAction284(166),
+                       new ReduceAction159(167),
+                       new ReduceAction286(167),
+                       new ReduceAction287(167),
+                       new ReduceAction288(167),
+                       new ReduceAction289(167),
+                       new ReduceAction159(168),
+                       new ReduceAction291(168),
+                       new ReduceAction159(169),
+                       new ReduceAction293(169),
+                       new ReduceAction294(169),
+                       new ReduceAction295(169),
+                       new ReduceAction296(169),
+                       new ReduceAction297(169),
+                       new ReduceAction298(169),
+                       new ReduceAction299(169),
+                       new ReduceAction300(169),
+                       new ReduceAction159(170),
+                       new ReduceAction302(170),
+                       new ReduceAction159(171),
+                       new ReduceAction304(171),
+                       new ReduceAction159(172),
+                       new ReduceAction306(172),
+                       new ReduceAction159(173),
+                       new ReduceAction308(173),
+                       new ReduceAction309(173),
+                       new ReduceAction159(174),
+                       new ReduceAction311(174),
+                       new ReduceAction312(174),
+                       new ReduceAction159(175),
+                       new ReduceAction314(175),
+                       new ReduceAction315(175),
+                       new ReduceAction316(175),
+                       new ReduceAction159(176),
+                       new ReduceAction318(176),
+                       new ReduceAction159(177),
+                       new ReduceAction320(177),
+                       new ReduceAction321(177),
+                       new ReduceAction322(177),
+                       new ReduceAction323(177),
+                       new ReduceAction159(178),
+                       new ReduceAction325(178),
+                       new ReduceAction326(178),
+                       new ReduceAction853(178),
+                       new ReduceAction159(179),
+                       new ReduceAction855(179),
+                       new ReduceAction856(179),
+                       new ReduceAction857(179),
+                       new ReduceAction858(179),
+                       new ReduceAction859(179),
+                       new ReduceAction183(179),
+                       new ReduceAction333(179),
+                       new ReduceAction858(179),
+                       new ReduceAction859(179),
+                       new ReduceAction191(179),
+                       new ReduceAction349(179),
+                       new ReduceAction866(179),
+                       new ReduceAction867(179),
+                       new ReduceAction355(179),
+                       new ReduceAction356(179),
+                       new ReduceAction357(179),
+                       new ReduceAction358(179),
+                       new ReduceAction359(179),
+                       new ReduceAction360(179),
+                       new ReduceAction357(179),
+                       new ReduceAction358(179),
+                       new ReduceAction363(179),
+                       new ReduceAction364(179),
+                       new ReduceAction365(179),
+                       new ReduceAction159(180),
+                       new ReduceAction367(180),
+                       new ReduceAction368(180),
+                       new ReduceAction369(181),
+                       new ReduceAction370(181),
+                       new ReduceAction371(181),
+                       new ReduceAction372(181),
+                       new ReduceAction373(181),
+                       new ReduceAction374(181),
+                       new ReduceAction375(181),
+                       new ReduceAction376(181),
+                       new ReduceAction377(181),
+                       new ReduceAction159(181),
+                       new ReduceAction892(182),
+                       new ReduceAction893(182),
+                       new ReduceAction156(183),
                        new ReduceAction157(183),
-                       new ReduceAction890(184),
-                       new ReduceAction891(184),
-                       new ReduceAction154(185),
-                       new ReduceAction155(185),
-                       new ReduceAction156(185),
-                       new ReduceAction157(185),
-                       new ReduceAction157(186),
-                       new ReduceAction157(186),
-                       new ReduceAction167(186),
-                       new ReduceAction168(186),
-                       new ReduceAction169(186),
-                       new ReduceAction170(186),
-                       new ReduceAction171(186),
-                       new ReduceAction172(186),
-                       new ReduceAction173(186),
-                       new ReduceAction157(186),
-                       new ReduceAction157(186),
-                       new ReduceAction157(186),
-                       new ReduceAction157(186),
-                       new ReduceAction157(186),
-                       new ReduceAction157(186),
-                       new ReduceAction157(186),
-                       new ReduceAction181(186),
-                       new ReduceAction182(186),
-                       new ReduceAction183(186),
-                       new ReduceAction182(186),
-                       new ReduceAction185(186),
-                       new ReduceAction186(186),
-                       new ReduceAction187(186),
-                       new ReduceAction186(186),
-                       new ReduceAction189(186),
-                       new ReduceAction190(186),
-                       new ReduceAction191(186),
-                       new ReduceAction192(186),
-                       new ReduceAction193(186),
-                       new ReduceAction192(186),
-                       new ReduceAction195(186),
-                       new ReduceAction196(186),
-                       new ReduceAction195(186),
-                       new ReduceAction198(186),
-                       new ReduceAction254(187),
-                       new ReduceAction255(187),
-                       new ReduceAction256(188),
-                       new ReduceAction263(189),
-                       new ReduceAction264(189),
-                       new ReduceAction265(190),
-                       new ReduceAction266(190),
-                       new ReduceAction267(191),
-                       new ReduceAction268(191),
-                       new ReduceAction269(192),
-                       new ReduceAction270(192),
-                       new ReduceAction274(193),
-                       new ReduceAction275(193),
-                       new ReduceAction157(194),
+                       new ReduceAction158(183),
+                       new ReduceAction159(183),
+                       new ReduceAction159(184),
+                       new ReduceAction159(184),
+                       new ReduceAction169(184),
+                       new ReduceAction170(184),
+                       new ReduceAction171(184),
+                       new ReduceAction172(184),
+                       new ReduceAction173(184),
+                       new ReduceAction174(184),
+                       new ReduceAction175(184),
+                       new ReduceAction159(184),
+                       new ReduceAction159(184),
+                       new ReduceAction159(184),
+                       new ReduceAction159(184),
+                       new ReduceAction159(184),
+                       new ReduceAction159(184),
+                       new ReduceAction159(184),
+                       new ReduceAction183(184),
+                       new ReduceAction184(184),
+                       new ReduceAction185(184),
+                       new ReduceAction184(184),
+                       new ReduceAction187(184),
+                       new ReduceAction188(184),
+                       new ReduceAction189(184),
+                       new ReduceAction188(184),
+                       new ReduceAction191(184),
+                       new ReduceAction192(184),
+                       new ReduceAction193(184),
+                       new ReduceAction194(184),
+                       new ReduceAction195(184),
+                       new ReduceAction194(184),
+                       new ReduceAction197(184),
+                       new ReduceAction198(184),
+                       new ReduceAction197(184),
+                       new ReduceAction200(184),
+                       new ReduceAction256(185),
+                       new ReduceAction257(185),
+                       new ReduceAction258(186),
+                       new ReduceAction267(187),
+                       new ReduceAction268(187),
+                       new ReduceAction269(188),
+                       new ReduceAction270(188),
+                       new ReduceAction271(189),
+                       new ReduceAction272(189),
+                       new ReduceAction273(190),
+                       new ReduceAction274(190),
+                       new ReduceAction278(191),
+                       new ReduceAction279(191),
+                       new ReduceAction159(192),
+                       new ReduceAction159(192),
+                       new ReduceAction169(192),
+                       new ReduceAction170(192),
+                       new ReduceAction171(192),
+                       new ReduceAction172(192),
+                       new ReduceAction173(192),
+                       new ReduceAction174(192),
+                       new ReduceAction175(192),
+                       new ReduceAction159(192),
+                       new ReduceAction159(192),
+                       new ReduceAction159(192),
+                       new ReduceAction159(192),
+                       new ReduceAction159(192),
+                       new ReduceAction159(192),
+                       new ReduceAction159(192),
+                       new ReduceAction183(192),
+                       new ReduceAction184(192),
+                       new ReduceAction185(192),
+                       new ReduceAction184(192),
+                       new ReduceAction187(192),
+                       new ReduceAction188(192),
+                       new ReduceAction189(192),
+                       new ReduceAction188(192),
+                       new ReduceAction191(192),
+                       new ReduceAction192(192),
+                       new ReduceAction193(192),
+                       new ReduceAction194(192),
+                       new ReduceAction195(192),
+                       new ReduceAction194(192),
+                       new ReduceAction197(192),
+                       new ReduceAction198(192),
+                       new ReduceAction197(192),
+                       new ReduceAction200(192),
+                       new ReduceAction156(193),
+                       new ReduceAction157(193),
+                       new ReduceAction158(193),
+                       new ReduceAction156(194),
                        new ReduceAction157(194),
-                       new ReduceAction167(194),
-                       new ReduceAction168(194),
-                       new ReduceAction169(194),
-                       new ReduceAction170(194),
-                       new ReduceAction171(194),
-                       new ReduceAction172(194),
-                       new ReduceAction173(194),
-                       new ReduceAction157(194),
-                       new ReduceAction157(194),
-                       new ReduceAction157(194),
-                       new ReduceAction157(194),
-                       new ReduceAction157(194),
-                       new ReduceAction157(194),
-                       new ReduceAction157(194),
-                       new ReduceAction181(194),
-                       new ReduceAction182(194),
-                       new ReduceAction183(194),
-                       new ReduceAction182(194),
-                       new ReduceAction185(194),
-                       new ReduceAction186(194),
-                       new ReduceAction187(194),
-                       new ReduceAction186(194),
-                       new ReduceAction189(194),
-                       new ReduceAction190(194),
-                       new ReduceAction191(194),
-                       new ReduceAction192(194),
-                       new ReduceAction193(194),
-                       new ReduceAction192(194),
-                       new ReduceAction195(194),
-                       new ReduceAction196(194),
-                       new ReduceAction195(194),
-                       new ReduceAction198(194),
-                       new ReduceAction154(195),
-                       new ReduceAction155(195),
-                       new ReduceAction156(195),
-                       new ReduceAction154(196),
-                       new ReduceAction155(196),
-                       new ReduceAction156(196),
-                       new ReduceAction157(197),
-                       new ReduceAction157(197),
-                       new ReduceAction167(197),
-                       new ReduceAction168(197),
+                       new ReduceAction158(194),
+                       new ReduceAction159(195),
+                       new ReduceAction159(195),
+                       new ReduceAction169(195),
+                       new ReduceAction170(195),
+                       new ReduceAction171(195),
+                       new ReduceAction172(195),
+                       new ReduceAction173(195),
+                       new ReduceAction174(195),
+                       new ReduceAction175(195),
+                       new ReduceAction159(195),
+                       new ReduceAction159(195),
+                       new ReduceAction159(195),
+                       new ReduceAction159(195),
+                       new ReduceAction159(195),
+                       new ReduceAction159(195),
+                       new ReduceAction200(195),
+                       new ReduceAction159(196),
+                       new ReduceAction159(196),
+                       new ReduceAction169(196),
+                       new ReduceAction170(196),
+                       new ReduceAction171(196),
+                       new ReduceAction172(196),
+                       new ReduceAction173(196),
+                       new ReduceAction174(196),
+                       new ReduceAction175(196),
+                       new ReduceAction159(196),
+                       new ReduceAction159(196),
+                       new ReduceAction159(196),
+                       new ReduceAction159(196),
+                       new ReduceAction159(196),
+                       new ReduceAction159(196),
+                       new ReduceAction200(196),
+                       new ReduceAction159(197),
+                       new ReduceAction159(197),
                        new ReduceAction169(197),
                        new ReduceAction170(197),
                        new ReduceAction171(197),
                        new ReduceAction172(197),
                        new ReduceAction173(197),
-                       new ReduceAction157(197),
-                       new ReduceAction157(197),
-                       new ReduceAction157(197),
-                       new ReduceAction157(197),
-                       new ReduceAction157(197),
-                       new ReduceAction157(197),
-                       new ReduceAction198(197),
-                       new ReduceAction157(198),
-                       new ReduceAction157(198),
-                       new ReduceAction167(198),
-                       new ReduceAction168(198),
+                       new ReduceAction174(197),
+                       new ReduceAction175(197),
+                       new ReduceAction159(197),
+                       new ReduceAction159(197),
+                       new ReduceAction159(197),
+                       new ReduceAction159(197),
+                       new ReduceAction159(197),
+                       new ReduceAction159(197),
+                       new ReduceAction200(197),
+                       new ReduceAction159(198),
+                       new ReduceAction159(198),
                        new ReduceAction169(198),
                        new ReduceAction170(198),
                        new ReduceAction171(198),
                        new ReduceAction172(198),
                        new ReduceAction173(198),
-                       new ReduceAction157(198),
-                       new ReduceAction157(198),
-                       new ReduceAction157(198),
-                       new ReduceAction157(198),
-                       new ReduceAction157(198),
-                       new ReduceAction157(198),
-                       new ReduceAction198(198),
-                       new ReduceAction157(199),
-                       new ReduceAction157(199),
-                       new ReduceAction167(199),
-                       new ReduceAction168(199),
-                       new ReduceAction169(199),
-                       new ReduceAction170(199),
-                       new ReduceAction171(199),
-                       new ReduceAction172(199),
-                       new ReduceAction173(199),
-                       new ReduceAction157(199),
-                       new ReduceAction157(199),
-                       new ReduceAction157(199),
-                       new ReduceAction157(199),
-                       new ReduceAction157(199),
-                       new ReduceAction157(199),
-                       new ReduceAction198(199),
-                       new ReduceAction157(200),
-                       new ReduceAction157(200),
-                       new ReduceAction167(200),
-                       new ReduceAction168(200),
-                       new ReduceAction169(200),
-                       new ReduceAction170(200),
-                       new ReduceAction171(200),
-                       new ReduceAction172(200),
-                       new ReduceAction173(200),
-                       new ReduceAction157(200),
-                       new ReduceAction157(200),
-                       new ReduceAction157(200),
-                       new ReduceAction157(200),
-                       new ReduceAction157(200),
-                       new ReduceAction157(200),
-                       new ReduceAction198(200),
-                       new ReduceAction432(201),
-                       new ReduceAction434(201),
-                       new ReduceAction472(202),
-                       new ReduceAction473(202),
-                       new ReduceAction23(202),
-                       new ReduceAction1052(203),
-                       new ReduceAction1053(203),
-                       new ReduceAction1054(204),
-                       new ReduceAction1055(204),
-                       new ReduceAction1056(205),
-                       new ReduceAction1057(205),
-                       new ReduceAction1058(206),
-                       new ReduceAction1059(206),
-                       new ReduceAction43(207),
-                       new ReduceAction1061(207),
-                       new ReduceAction1062(208),
-                       new ReduceAction1063(208),
-                       new ReduceAction1064(209),
-                       new ReduceAction1065(209),
-                       new ReduceAction148(210),
-                       new ReduceAction1067(210),
-                       new ReduceAction383(211),
-                       new ReduceAction1069(211),
-                       new ReduceAction383(212),
-                       new ReduceAction1069(212),
-                       new ReduceAction383(213),
-                       new ReduceAction1069(213),
-                       new ReduceAction446(214),
-                       new ReduceAction1075(214),
-                       new ReduceAction405(215),
-                       new ReduceAction1077(215),
-                       new ReduceAction405(216),
-                       new ReduceAction1077(216),
-                       new ReduceAction383(217),
-                       new ReduceAction1069(217),
-                       new ReduceAction383(218),
-                       new ReduceAction1069(218),
-                       new ReduceAction447(219),
-                       new ReduceAction1085(219),
-                       new ReduceAction1086(220),
-                       new ReduceAction1087(220),
-                       new ReduceAction469(221),
-                       new ReduceAction488(221)
+                       new ReduceAction174(198),
+                       new ReduceAction175(198),
+                       new ReduceAction159(198),
+                       new ReduceAction159(198),
+                       new ReduceAction159(198),
+                       new ReduceAction159(198),
+                       new ReduceAction159(198),
+                       new ReduceAction159(198),
+                       new ReduceAction200(198),
+                       new ReduceAction434(199),
+                       new ReduceAction436(199),
+                       new ReduceAction474(200),
+                       new ReduceAction475(200),
+                       new ReduceAction23(200),
+                       new ReduceAction1054(201),
+                       new ReduceAction1055(201),
+                       new ReduceAction1056(202),
+                       new ReduceAction1057(202),
+                       new ReduceAction1058(203),
+                       new ReduceAction1059(203),
+                       new ReduceAction37(204),
+                       new ReduceAction1061(204),
+                       new ReduceAction45(205),
+                       new ReduceAction1063(205),
+                       new ReduceAction408(206),
+                       new ReduceAction1065(206),
+                       new ReduceAction1066(207),
+                       new ReduceAction1067(207),
+                       new ReduceAction1068(208),
+                       new ReduceAction1069(208),
+                       new ReduceAction150(209),
+                       new ReduceAction1071(209),
+                       new ReduceAction387(210),
+                       new ReduceAction1073(210),
+                       new ReduceAction387(211),
+                       new ReduceAction1073(211),
+                       new ReduceAction387(212),
+                       new ReduceAction1073(212),
+                       new ReduceAction448(213),
+                       new ReduceAction1079(213),
+                       new ReduceAction408(214),
+                       new ReduceAction1065(214),
+                       new ReduceAction387(215),
+                       new ReduceAction1073(215),
+                       new ReduceAction387(216),
+                       new ReduceAction1073(216),
+                       new ReduceAction449(217),
+                       new ReduceAction1087(217),
+                       new ReduceAction1088(218),
+                       new ReduceAction1089(218),
+                       new ReduceAction471(219),
+                       new ReduceAction490(219)
                )
        end
 end
@@ -1794,7 +1796,6 @@ private class ReduceAction26
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
@@ -1804,7 +1805,7 @@ private class ReduceAction26
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
                                        var listnode8 = new Array[Object]
-                                       var listnode11 = new Array[Object]
+                                       var listnode12 = new Array[Object]
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
                                        var tkwredefnode3 = nodearraylist2
@@ -1815,24 +1816,23 @@ private class ReduceAction26
                                        assert pclasskindnode5 isa nullable AClasskind
                                        var tclassidnode6 = nodearraylist6
                                        assert tclassidnode6 isa nullable TClassid
-                                       var listnode7 = nodearraylist7
-                                       assert listnode7 isa Array[Object]
-                                       listnode8 = concat(listnode8, listnode7)
-                                       var listnode10 = nodearraylist8
-                                       assert listnode10 isa Array[Object]
-                                       listnode11 = concat(listnode11, listnode10)
-                                       var tkwendnode12 = nodearraylist9
-                                       assert tkwendnode12 isa nullable TKwend
+                                       var listnode11 = nodearraylist7
+                                       assert listnode11 isa Array[Object]
+                                       listnode12 = concat(listnode12, listnode11)
+                                       var tkwendnode13 = nodearraylist8
+                                       assert tkwendnode13 isa nullable TKwend
                                        var pclassdefnode1: nullable AStdClassdef = new AStdClassdef.init_astdclassdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
                                                pclasskindnode5,
                                                tclassidnode6,
+                                               null,
                                                listnode8,
                                                null,
-                                               listnode11,
-                                               tkwendnode12
+                                               null,
+                                               listnode12,
+                                               tkwendnode13
                                        )
                                        node_list = pclassdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -1843,7 +1843,6 @@ private class ReduceAction27
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist10 = p.pop
                                        var nodearraylist9 = p.pop
                                        var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
@@ -1854,7 +1853,7 @@ private class ReduceAction27
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
                                        var listnode8 = new Array[Object]
-                                       var listnode11 = new Array[Object]
+                                       var listnode12 = new Array[Object]
                                        var pdocnode2 = nodearraylist1
                                        assert pdocnode2 isa nullable ADoc
                                        var tkwredefnode3 = nodearraylist2
@@ -1865,26 +1864,83 @@ private class ReduceAction27
                                        assert pclasskindnode5 isa nullable AClasskind
                                        var tclassidnode6 = nodearraylist6
                                        assert tclassidnode6 isa nullable TClassid
-                                       var listnode7 = nodearraylist7
-                                       assert listnode7 isa Array[Object]
-                                       listnode8 = concat(listnode8, listnode7)
-                                       var pexterncodeblocknode9 = nodearraylist8
-                                       assert pexterncodeblocknode9 isa nullable AExternCodeBlock
-                                       var listnode10 = nodearraylist9
-                                       assert listnode10 isa Array[Object]
-                                       listnode11 = concat(listnode11, listnode10)
-                                       var tkwendnode12 = nodearraylist10
-                                       assert tkwendnode12 isa nullable TKwend
+                                       var pexterncodeblocknode10 = nodearraylist7
+                                       assert pexterncodeblocknode10 isa nullable AExternCodeBlock
+                                       var listnode11 = nodearraylist8
+                                       assert listnode11 isa Array[Object]
+                                       listnode12 = concat(listnode12, listnode11)
+                                       var tkwendnode13 = nodearraylist9
+                                       assert tkwendnode13 isa nullable TKwend
                                        var pclassdefnode1: nullable AStdClassdef = new AStdClassdef.init_astdclassdef(
                                                pdocnode2,
                                                tkwredefnode3,
                                                pvisibilitynode4,
                                                pclasskindnode5,
                                                tclassidnode6,
+                                               null,
                                                listnode8,
-                                               pexterncodeblocknode9,
-                                               listnode11,
-                                               tkwendnode12
+                                               null,
+                                               pexterncodeblocknode10,
+                                               listnode12,
+                                               tkwendnode13
+                                       )
+                                       node_list = pclassdefnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction28
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist12 = p.pop
+                                       var nodearraylist11 = p.pop
+                                       var nodearraylist10 = p.pop
+                                       var nodearraylist9 = p.pop
+                                       var nodearraylist8 = p.pop
+                                       var nodearraylist7 = p.pop
+                                       var nodearraylist6 = p.pop
+                                       var nodearraylist5 = p.pop
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var listnode9 = new Array[Object]
+                                       var listnode13 = new Array[Object]
+                                       var pdocnode2 = nodearraylist1
+                                       assert pdocnode2 isa nullable ADoc
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var pclasskindnode5 = nodearraylist4
+                                       assert pclasskindnode5 isa nullable AClasskind
+                                       var tclassidnode6 = nodearraylist6
+                                       assert tclassidnode6 isa nullable TClassid
+                                       var tobranode7 = nodearraylist7
+                                       assert tobranode7 isa nullable TObra
+                                       var listnode8 = nodearraylist9
+                                       assert listnode8 isa Array[Object]
+                                       listnode9 = concat(listnode9, listnode8)
+                                       var tcbranode10 = nodearraylist10
+                                       assert tcbranode10 isa nullable TCbra
+                                       var listnode12 = nodearraylist11
+                                       assert listnode12 isa Array[Object]
+                                       listnode13 = concat(listnode13, listnode12)
+                                       var tkwendnode14 = nodearraylist12
+                                       assert tkwendnode14 isa nullable TKwend
+                                       var pclassdefnode1: nullable AStdClassdef = new AStdClassdef.init_astdclassdef(
+                                               pdocnode2,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
+                                               pclasskindnode5,
+                                               tclassidnode6,
+                                               tobranode7,
+                                               listnode9,
+                                               tcbranode10,
+                                               null,
+                                               listnode13,
+                                               tkwendnode14
                                        )
                                        node_list = pclassdefnode1
                                        p.push(p.go_to(_goto), node_list)
@@ -1895,13 +1951,74 @@ private class ReduceAction29
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist13 = p.pop
+                                       var nodearraylist12 = p.pop
+                                       var nodearraylist11 = p.pop
+                                       var nodearraylist10 = p.pop
+                                       var nodearraylist9 = p.pop
+                                       var nodearraylist8 = p.pop
+                                       var nodearraylist7 = p.pop
+                                       var nodearraylist6 = p.pop
+                                       var nodearraylist5 = p.pop
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var listnode9 = new Array[Object]
+                                       var listnode13 = new Array[Object]
+                                       var pdocnode2 = nodearraylist1
+                                       assert pdocnode2 isa nullable ADoc
+                                       var tkwredefnode3 = nodearraylist2
+                                       assert tkwredefnode3 isa nullable TKwredef
+                                       var pvisibilitynode4 = nodearraylist3
+                                       assert pvisibilitynode4 isa nullable AVisibility
+                                       var pclasskindnode5 = nodearraylist4
+                                       assert pclasskindnode5 isa nullable AClasskind
+                                       var tclassidnode6 = nodearraylist6
+                                       assert tclassidnode6 isa nullable TClassid
+                                       var tobranode7 = nodearraylist7
+                                       assert tobranode7 isa nullable TObra
+                                       var listnode8 = nodearraylist9
+                                       assert listnode8 isa Array[Object]
+                                       listnode9 = concat(listnode9, listnode8)
+                                       var tcbranode10 = nodearraylist10
+                                       assert tcbranode10 isa nullable TCbra
+                                       var pexterncodeblocknode11 = nodearraylist11
+                                       assert pexterncodeblocknode11 isa nullable AExternCodeBlock
+                                       var listnode12 = nodearraylist12
+                                       assert listnode12 isa Array[Object]
+                                       listnode13 = concat(listnode13, listnode12)
+                                       var tkwendnode14 = nodearraylist13
+                                       assert tkwendnode14 isa nullable TKwend
+                                       var pclassdefnode1: nullable AStdClassdef = new AStdClassdef.init_astdclassdef(
+                                               pdocnode2,
+                                               tkwredefnode3,
+                                               pvisibilitynode4,
+                                               pclasskindnode5,
+                                               tclassidnode6,
+                                               tobranode7,
+                                               listnode9,
+                                               tcbranode10,
+                                               pexterncodeblocknode11,
+                                               listnode13,
+                                               tkwendnode14
+                                       )
+                                       node_list = pclassdefnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction31
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
                                        var nodearraylist1 = p.pop
                                        var tkwredefnode1 = nodearraylist1
                                        node_list = tkwredefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction30
+private class ReduceAction32
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -1916,7 +2033,7 @@ private class ReduceAction30
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction31
+private class ReduceAction33
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -1935,7 +2052,7 @@ private class ReduceAction31
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction32
+private class ReduceAction34
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -1950,7 +2067,7 @@ private class ReduceAction32
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction33
+private class ReduceAction35
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -1965,7 +2082,7 @@ private class ReduceAction33
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction34
+private class ReduceAction36
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -1984,18 +2101,14 @@ private class ReduceAction34
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction35
+private class ReduceAction37
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
-                                       var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
                                        var listnode2 = new Array[Object]
-                                       var pformaldefnode1 = nodearraylist3
+                                       var pformaldefnode1 = nodearraylist1
                                        if pformaldefnode1 != null then
                                                listnode2.add(pformaldefnode1)
                                        end
@@ -2003,20 +2116,16 @@ private class ReduceAction35
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction36
+private class ReduceAction38
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist6 = p.pop
-                                       var nodearraylist5 = p.pop
-                                       var nodearraylist4 = p.pop
-                                       var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
                                        var listnode3 = new Array[Object]
-                                       var pformaldefnode1 = nodearraylist3
-                                       var listnode2 = nodearraylist4
+                                       var pformaldefnode1 = nodearraylist1
+                                       var listnode2 = nodearraylist2
                                        assert listnode2 isa Array[Object]
                                        if pformaldefnode1 != null then
                                                listnode3.add(pformaldefnode1)
@@ -2026,7 +2135,7 @@ private class ReduceAction36
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction37
+private class ReduceAction39
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2036,7 +2145,7 @@ private class ReduceAction37
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction38
+private class ReduceAction40
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2049,11 +2158,12 @@ private class ReduceAction38
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction39
+private class ReduceAction41
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
                                        var tclassidnode2 = nodearraylist1
@@ -2069,11 +2179,12 @@ private class ReduceAction39
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction40
+private class ReduceAction42
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist4 = p.pop
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
@@ -2092,7 +2203,7 @@ private class ReduceAction40
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction41
+private class ReduceAction43
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2128,7 +2239,7 @@ private class ReduceAction41
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction42
+private class ReduceAction44
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2143,7 +2254,7 @@ private class ReduceAction42
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction43
+private class ReduceAction45
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2158,7 +2269,7 @@ private class ReduceAction43
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction44
+private class ReduceAction46
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2169,7 +2280,7 @@ private class ReduceAction44
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction45
+private class ReduceAction47
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2181,7 +2292,7 @@ private class ReduceAction45
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction46
+private class ReduceAction48
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2207,8 +2318,12 @@ private class ReduceAction46
                                        assert pmethidnode8 isa nullable AMethid
                                        var psignaturenode9 = nodearraylist6
                                        assert psignaturenode9 isa nullable ASignature
-                                       var pexprnode13 = nodearraylist8
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist7
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist8
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist9
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2221,13 +2336,15 @@ private class ReduceAction46
                                                null,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction47
+private class ReduceAction49
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2256,8 +2373,12 @@ private class ReduceAction47
                                        assert psignaturenode9 isa nullable ASignature
                                        var pannotationsnode10 = nodearraylist7
                                        assert pannotationsnode10 isa nullable AAnnotations
-                                       var pexprnode13 = nodearraylist9
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist8
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist9
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist10
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2270,13 +2391,15 @@ private class ReduceAction47
                                                pannotationsnode10,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction48
+private class ReduceAction50
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2314,13 +2437,15 @@ private class ReduceAction48
                                                pannotationsnode10,
                                                null,
                                                null,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction49
+private class ReduceAction51
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2355,13 +2480,15 @@ private class ReduceAction49
                                                pannotationsnode10,
                                                null,
                                                null,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction50
+private class ReduceAction52
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2399,13 +2526,15 @@ private class ReduceAction50
                                                pannotationsnode10,
                                                null,
                                                null,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction51
+private class ReduceAction53
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2428,8 +2557,12 @@ private class ReduceAction51
                                        assert tkwnewnode7 isa nullable TKwnew
                                        var psignaturenode9 = nodearraylist5
                                        assert psignaturenode9 isa nullable ASignature
-                                       var pexprnode13 = nodearraylist7
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist6
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist7
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist8
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2442,13 +2575,15 @@ private class ReduceAction51
                                                null,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction52
+private class ReduceAction54
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2474,8 +2609,12 @@ private class ReduceAction52
                                        assert pmethidnode8 isa nullable AMethid
                                        var psignaturenode9 = nodearraylist6
                                        assert psignaturenode9 isa nullable ASignature
-                                       var pexprnode13 = nodearraylist8
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist7
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist8
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist9
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2488,13 +2627,15 @@ private class ReduceAction52
                                                null,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction53
+private class ReduceAction55
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2520,8 +2661,12 @@ private class ReduceAction53
                                        assert psignaturenode9 isa nullable ASignature
                                        var pannotationsnode10 = nodearraylist6
                                        assert pannotationsnode10 isa nullable AAnnotations
-                                       var pexprnode13 = nodearraylist8
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist7
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist8
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist9
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2534,13 +2679,15 @@ private class ReduceAction53
                                                pannotationsnode10,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction54
+private class ReduceAction56
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2569,8 +2716,12 @@ private class ReduceAction54
                                        assert psignaturenode9 isa nullable ASignature
                                        var pannotationsnode10 = nodearraylist7
                                        assert pannotationsnode10 isa nullable AAnnotations
-                                       var pexprnode13 = nodearraylist9
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist8
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist9
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist10
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2583,13 +2734,15 @@ private class ReduceAction54
                                                pannotationsnode10,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction55
+private class ReduceAction57
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2630,13 +2783,15 @@ private class ReduceAction55
                                                null,
                                                pexterncallsnode11,
                                                pexterncodeblocknode12,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction56
+private class ReduceAction58
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2680,13 +2835,15 @@ private class ReduceAction56
                                                pannotationsnode10,
                                                pexterncallsnode11,
                                                pexterncodeblocknode12,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction57
+private class ReduceAction59
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2710,8 +2867,8 @@ private class ReduceAction57
                                        assert tidnode6 isa nullable TId
                                        var ptypenode7 = nodearraylist6
                                        assert ptypenode7 isa nullable AType
-                                       var pannotationsnode9 = nodearraylist7
-                                       assert pannotationsnode9 isa nullable AAnnotations
+                                       var pannotationsnode10 = nodearraylist7
+                                       assert pannotationsnode10 isa nullable AAnnotations
                                        var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2720,14 +2877,17 @@ private class ReduceAction57
                                                tidnode6,
                                                ptypenode7,
                                                null,
-                                               pannotationsnode9,
+                                               null,
+                                               pannotationsnode10,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction58
+private class ReduceAction60
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2754,10 +2914,12 @@ private class ReduceAction58
                                        assert tidnode6 isa nullable TId
                                        var ptypenode7 = nodearraylist6
                                        assert ptypenode7 isa nullable AType
-                                       var pexprnode8 = nodearraylist9
-                                       assert pexprnode8 isa nullable AExpr
-                                       var pannotationsnode9 = nodearraylist10
-                                       assert pannotationsnode9 isa nullable AAnnotations
+                                       var tassignnode8 = nodearraylist7
+                                       assert tassignnode8 isa nullable TAssign
+                                       var pexprnode9 = nodearraylist9
+                                       assert pexprnode9 isa nullable AExpr
+                                       var pannotationsnode10 = nodearraylist10
+                                       assert pannotationsnode10 isa nullable AAnnotations
                                        var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2765,15 +2927,18 @@ private class ReduceAction58
                                                tkwvarnode5,
                                                tidnode6,
                                                ptypenode7,
-                                               pexprnode8,
-                                               pannotationsnode9,
+                                               tassignnode8,
+                                               pexprnode9,
+                                               pannotationsnode10,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction59
+private class ReduceAction61
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2798,8 +2963,10 @@ private class ReduceAction59
                                        assert tidnode6 isa nullable TId
                                        var ptypenode7 = nodearraylist6
                                        assert ptypenode7 isa nullable AType
-                                       var pexprnode10 = nodearraylist8
-                                       assert pexprnode10 isa nullable AExpr
+                                       var tkwdonode11 = nodearraylist7
+                                       assert tkwdonode11 isa nullable TKwdo
+                                       var pexprnode12 = nodearraylist8
+                                       assert pexprnode12 isa nullable AExpr
                                        var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2809,13 +2976,16 @@ private class ReduceAction59
                                                ptypenode7,
                                                null,
                                                null,
-                                               pexprnode10
+                                               null,
+                                               tkwdonode11,
+                                               pexprnode12,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction60
+private class ReduceAction62
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2841,10 +3011,12 @@ private class ReduceAction60
                                        assert tidnode6 isa nullable TId
                                        var ptypenode7 = nodearraylist6
                                        assert ptypenode7 isa nullable AType
-                                       var pannotationsnode9 = nodearraylist7
-                                       assert pannotationsnode9 isa nullable AAnnotations
-                                       var pexprnode10 = nodearraylist9
-                                       assert pexprnode10 isa nullable AExpr
+                                       var pannotationsnode10 = nodearraylist7
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var tkwdonode11 = nodearraylist8
+                                       assert tkwdonode11 isa nullable TKwdo
+                                       var pexprnode12 = nodearraylist9
+                                       assert pexprnode12 isa nullable AExpr
                                        var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2853,14 +3025,17 @@ private class ReduceAction60
                                                tidnode6,
                                                ptypenode7,
                                                null,
-                                               pannotationsnode9,
-                                               pexprnode10
+                                               null,
+                                               pannotationsnode10,
+                                               tkwdonode11,
+                                               pexprnode12,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction61
+private class ReduceAction63
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2886,8 +3061,12 @@ private class ReduceAction61
                                        assert tidnode6 isa nullable TId
                                        var ptypenode7 = nodearraylist6
                                        assert ptypenode7 isa nullable AType
-                                       var pexprnode10 = nodearraylist8
-                                       assert pexprnode10 isa nullable AExpr
+                                       var tkwdonode11 = nodearraylist7
+                                       assert tkwdonode11 isa nullable TKwdo
+                                       var pexprnode12 = nodearraylist8
+                                       assert pexprnode12 isa nullable AExpr
+                                       var tkwendnode13 = nodearraylist9
+                                       assert tkwendnode13 isa nullable TKwend
                                        var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2897,13 +3076,16 @@ private class ReduceAction61
                                                ptypenode7,
                                                null,
                                                null,
-                                               pexprnode10
+                                               null,
+                                               tkwdonode11,
+                                               pexprnode12,
+                                               tkwendnode13
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction62
+private class ReduceAction64
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2930,10 +3112,14 @@ private class ReduceAction62
                                        assert tidnode6 isa nullable TId
                                        var ptypenode7 = nodearraylist6
                                        assert ptypenode7 isa nullable AType
-                                       var pannotationsnode9 = nodearraylist7
-                                       assert pannotationsnode9 isa nullable AAnnotations
-                                       var pexprnode10 = nodearraylist9
-                                       assert pexprnode10 isa nullable AExpr
+                                       var pannotationsnode10 = nodearraylist7
+                                       assert pannotationsnode10 isa nullable AAnnotations
+                                       var tkwdonode11 = nodearraylist8
+                                       assert tkwdonode11 isa nullable TKwdo
+                                       var pexprnode12 = nodearraylist9
+                                       assert pexprnode12 isa nullable AExpr
+                                       var tkwendnode13 = nodearraylist10
+                                       assert tkwendnode13 isa nullable TKwend
                                        var ppropdefnode1: nullable AAttrPropdef = new AAttrPropdef.init_aattrpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2942,14 +3128,17 @@ private class ReduceAction62
                                                tidnode6,
                                                ptypenode7,
                                                null,
-                                               pannotationsnode9,
-                                               pexprnode10
+                                               null,
+                                               pannotationsnode10,
+                                               tkwdonode11,
+                                               pexprnode12,
+                                               tkwendnode13
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction63
+private class ReduceAction65
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -2972,8 +3161,12 @@ private class ReduceAction63
                                        assert tkwinitnode6 isa nullable TKwinit
                                        var psignaturenode9 = nodearraylist5
                                        assert psignaturenode9 isa nullable ASignature
-                                       var pexprnode13 = nodearraylist7
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist6
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist7
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist8
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -2986,13 +3179,15 @@ private class ReduceAction63
                                                null,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction64
+private class ReduceAction66
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3018,8 +3213,12 @@ private class ReduceAction64
                                        assert pmethidnode8 isa nullable AMethid
                                        var psignaturenode9 = nodearraylist6
                                        assert psignaturenode9 isa nullable ASignature
-                                       var pexprnode13 = nodearraylist8
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist7
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist8
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist9
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -3032,13 +3231,15 @@ private class ReduceAction64
                                                null,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction65
+private class ReduceAction67
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3064,8 +3265,12 @@ private class ReduceAction65
                                        assert psignaturenode9 isa nullable ASignature
                                        var pannotationsnode10 = nodearraylist6
                                        assert pannotationsnode10 isa nullable AAnnotations
-                                       var pexprnode13 = nodearraylist8
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist7
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist8
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist9
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -3078,13 +3283,15 @@ private class ReduceAction65
                                                pannotationsnode10,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction66
+private class ReduceAction68
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3113,8 +3320,12 @@ private class ReduceAction66
                                        assert psignaturenode9 isa nullable ASignature
                                        var pannotationsnode10 = nodearraylist7
                                        assert pannotationsnode10 isa nullable AAnnotations
-                                       var pexprnode13 = nodearraylist9
-                                       assert pexprnode13 isa nullable AExpr
+                                       var tkwdonode13 = nodearraylist8
+                                       assert tkwdonode13 isa nullable TKwdo
+                                       var pexprnode14 = nodearraylist9
+                                       assert pexprnode14 isa nullable AExpr
+                                       var tkwendnode15 = nodearraylist10
+                                       assert tkwendnode15 isa nullable TKwend
                                        var ppropdefnode1: nullable AMethPropdef = new AMethPropdef.init_amethpropdef(
                                                pdocnode2,
                                                tkwredefnode3,
@@ -3127,13 +3338,15 @@ private class ReduceAction66
                                                pannotationsnode10,
                                                null,
                                                null,
-                                               pexprnode13
+                                               tkwdonode13,
+                                               pexprnode14,
+                                               tkwendnode15
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction67
+private class ReduceAction69
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3172,7 +3385,7 @@ private class ReduceAction67
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction68
+private class ReduceAction70
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3210,13 +3423,15 @@ private class ReduceAction68
                                                null,
                                                pexterncallsnode11,
                                                pexterncodeblocknode12,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction69
+private class ReduceAction71
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3257,13 +3472,15 @@ private class ReduceAction69
                                                null,
                                                pexterncallsnode11,
                                                pexterncodeblocknode12,
-                                               null
+                                               null,
+                                               null,
+                                               null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction70
+private class ReduceAction72
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3304,13 +3521,15 @@ private class ReduceAction70
                                                pannotationsnode10,
                                                pexterncallsnode11,
                                                pexterncodeblocknode12,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction71
+private class ReduceAction73
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3354,13 +3573,15 @@ private class ReduceAction71
                                                pannotationsnode10,
                                                pexterncallsnode11,
                                                pexterncodeblocknode12,
+                                               null,
+                                               null,
                                                null
                                        )
                                        node_list = ppropdefnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction72
+private class ReduceAction74
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3371,19 +3592,32 @@ private class ReduceAction72
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction74
+private class ReduceAction76
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var pannotationsnode1 = nodearraylist2
+                                       var listnode6 = new Array[Object]
+                                       var tkwisnode2 = nodearraylist1
+                                       assert tkwisnode2 isa nullable TKwis
+                                       var listnode5 = nodearraylist2
+                                       assert listnode5 isa Array[Object]
+                                       listnode6 = concat(listnode6, listnode5)
+                                       var pannotationsnode1: nullable AAnnotations = new AAnnotations.init_aannotations(
+                                               tkwisnode2,
+                                               null,
+                                               null,
+                                               listnode6,
+                                               null,
+                                               null
+                                       )
                                        node_list = pannotationsnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction75
+private class ReduceAction77
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3392,12 +3626,27 @@ private class ReduceAction75
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var pannotationsnode1 = nodearraylist3
+                                       var listnode6 = new Array[Object]
+                                       var tkwisnode2 = nodearraylist1
+                                       assert tkwisnode2 isa nullable TKwis
+                                       var listnode5 = nodearraylist3
+                                       assert listnode5 isa Array[Object]
+                                       listnode6 = concat(listnode6, listnode5)
+                                       var tkwendnode8 = nodearraylist4
+                                       assert tkwendnode8 isa nullable TKwend
+                                       var pannotationsnode1: nullable AAnnotations = new AAnnotations.init_aannotations(
+                                               tkwisnode2,
+                                               null,
+                                               null,
+                                               listnode6,
+                                               null,
+                                               tkwendnode8
+                                       )
                                        node_list = pannotationsnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction78
+private class ReduceAction80
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3405,12 +3654,25 @@ private class ReduceAction78
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var pannotationsnode1 = nodearraylist3
+                                       var listnode6 = new Array[Object]
+                                       var tkwisnode2 = nodearraylist1
+                                       assert tkwisnode2 isa nullable TKwis
+                                       var listnode5 = nodearraylist3
+                                       assert listnode5 isa Array[Object]
+                                       listnode6 = concat(listnode6, listnode5)
+                                       var pannotationsnode1: nullable AAnnotations = new AAnnotations.init_aannotations(
+                                               tkwisnode2,
+                                               null,
+                                               null,
+                                               listnode6,
+                                               null,
+                                               null
+                                       )
                                        node_list = pannotationsnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction79
+private class ReduceAction81
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3422,7 +3684,7 @@ private class ReduceAction79
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction80
+private class ReduceAction82
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3438,7 +3700,7 @@ private class ReduceAction80
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction81
+private class ReduceAction83
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3454,7 +3716,7 @@ private class ReduceAction81
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction82
+private class ReduceAction84
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3470,7 +3732,7 @@ private class ReduceAction82
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction83
+private class ReduceAction85
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3486,7 +3748,7 @@ private class ReduceAction83
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction84
+private class ReduceAction86
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3501,7 +3763,7 @@ private class ReduceAction84
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction85
+private class ReduceAction87
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3516,7 +3778,7 @@ private class ReduceAction85
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction86
+private class ReduceAction88
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3531,7 +3793,7 @@ private class ReduceAction86
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction87
+private class ReduceAction89
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3546,7 +3808,7 @@ private class ReduceAction87
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction88
+private class ReduceAction90
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3561,7 +3823,7 @@ private class ReduceAction88
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction89
+private class ReduceAction91
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3576,7 +3838,7 @@ private class ReduceAction89
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction90
+private class ReduceAction92
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3591,7 +3853,7 @@ private class ReduceAction90
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction91
+private class ReduceAction93
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3606,7 +3868,7 @@ private class ReduceAction91
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction92
+private class ReduceAction94
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3621,7 +3883,7 @@ private class ReduceAction92
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction93
+private class ReduceAction95
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3636,7 +3898,7 @@ private class ReduceAction93
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction94
+private class ReduceAction96
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3651,7 +3913,7 @@ private class ReduceAction94
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction95
+private class ReduceAction97
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3666,7 +3928,7 @@ private class ReduceAction95
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction96
+private class ReduceAction98
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3681,7 +3943,7 @@ private class ReduceAction96
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction97
+private class ReduceAction99
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3696,7 +3958,7 @@ private class ReduceAction97
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction98
+private class ReduceAction100
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3711,7 +3973,7 @@ private class ReduceAction98
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction99
+private class ReduceAction101
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3726,7 +3988,7 @@ private class ReduceAction99
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction100
+private class ReduceAction102
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3741,7 +4003,7 @@ private class ReduceAction100
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction101
+private class ReduceAction103
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3756,7 +4018,7 @@ private class ReduceAction101
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction102
+private class ReduceAction104
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3775,7 +4037,7 @@ private class ReduceAction102
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction103
+private class ReduceAction105
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3790,7 +4052,7 @@ private class ReduceAction103
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction104
+private class ReduceAction106
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3809,7 +4071,7 @@ private class ReduceAction104
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction105
+private class ReduceAction107
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3832,7 +4094,7 @@ private class ReduceAction105
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction106
+private class ReduceAction108
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3847,7 +4109,7 @@ private class ReduceAction106
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction107
+private class ReduceAction109
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3878,7 +4140,7 @@ private class ReduceAction107
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction108
+private class ReduceAction110
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3906,7 +4168,7 @@ private class ReduceAction108
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction109
+private class ReduceAction111
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3926,7 +4188,7 @@ private class ReduceAction109
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction110
+private class ReduceAction112
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3943,7 +4205,7 @@ private class ReduceAction110
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction111
+private class ReduceAction113
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3959,7 +4221,7 @@ private class ReduceAction111
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction112
+private class ReduceAction114
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3979,7 +4241,7 @@ private class ReduceAction112
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction114
+private class ReduceAction116
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -3992,7 +4254,7 @@ private class ReduceAction114
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction115
+private class ReduceAction117
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4013,7 +4275,7 @@ private class ReduceAction115
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction116
+private class ReduceAction118
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4034,7 +4296,7 @@ private class ReduceAction116
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction117
+private class ReduceAction119
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4058,7 +4320,7 @@ private class ReduceAction117
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction118
+private class ReduceAction120
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4082,7 +4344,7 @@ private class ReduceAction118
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction119
+private class ReduceAction121
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4109,7 +4371,7 @@ private class ReduceAction119
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction120
+private class ReduceAction122
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4133,7 +4395,7 @@ private class ReduceAction120
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction121
+private class ReduceAction123
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4161,7 +4423,7 @@ private class ReduceAction121
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction123
+private class ReduceAction125
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4174,7 +4436,7 @@ private class ReduceAction123
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction124
+private class ReduceAction126
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4185,7 +4447,7 @@ private class ReduceAction124
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction126
+private class ReduceAction128
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4200,7 +4462,7 @@ private class ReduceAction126
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction127
+private class ReduceAction129
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4215,7 +4477,7 @@ private class ReduceAction127
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction128
+private class ReduceAction130
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4238,7 +4500,7 @@ private class ReduceAction128
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction129
+private class ReduceAction131
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4253,7 +4515,7 @@ private class ReduceAction129
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction130
+private class ReduceAction132
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4285,7 +4547,7 @@ private class ReduceAction130
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction131
+private class ReduceAction133
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4313,7 +4575,7 @@ private class ReduceAction131
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction132
+private class ReduceAction134
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4342,7 +4604,7 @@ private class ReduceAction132
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction133
+private class ReduceAction135
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4367,7 +4629,7 @@ private class ReduceAction133
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction134
+private class ReduceAction136
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4401,7 +4663,7 @@ private class ReduceAction134
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction135
+private class ReduceAction137
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4431,7 +4693,7 @@ private class ReduceAction135
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction137
+private class ReduceAction139
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4442,7 +4704,7 @@ private class ReduceAction137
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction138
+private class ReduceAction140
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4463,7 +4725,7 @@ private class ReduceAction138
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction139
+private class ReduceAction141
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4479,7 +4741,7 @@ private class ReduceAction139
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction140
+private class ReduceAction142
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4498,7 +4760,7 @@ private class ReduceAction140
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction141
+private class ReduceAction143
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4509,7 +4771,7 @@ private class ReduceAction141
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction143
+private class ReduceAction145
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4521,29 +4783,31 @@ private class ReduceAction143
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction144
+private class ReduceAction146
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var listnode4 = new Array[Object]
+                                       var listnode5 = new Array[Object]
                                        var tclassidnode3 = nodearraylist1
                                        assert tclassidnode3 isa nullable TClassid
-                                       var pannotationsnode5 = nodearraylist2
-                                       assert pannotationsnode5 isa nullable AAnnotations
+                                       var pannotationsnode7 = nodearraylist2
+                                       assert pannotationsnode7 isa nullable AAnnotations
                                        var ptypenode1: nullable AType = new AType.init_atype(
                                                null,
                                                tclassidnode3,
-                                               listnode4,
-                                               pannotationsnode5
+                                               null,
+                                               listnode5,
+                                               null,
+                                               pannotationsnode7
                                        )
                                        node_list = ptypenode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction145
+private class ReduceAction147
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4551,24 +4815,26 @@ private class ReduceAction145
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var listnode4 = new Array[Object]
+                                       var listnode5 = new Array[Object]
                                        var tkwnullablenode2 = nodearraylist1
                                        assert tkwnullablenode2 isa nullable TKwnullable
                                        var tclassidnode3 = nodearraylist2
                                        assert tclassidnode3 isa nullable TClassid
-                                       var pannotationsnode5 = nodearraylist3
-                                       assert pannotationsnode5 isa nullable AAnnotations
+                                       var pannotationsnode7 = nodearraylist3
+                                       assert pannotationsnode7 isa nullable AAnnotations
                                        var ptypenode1: nullable AType = new AType.init_atype(
                                                tkwnullablenode2,
                                                tclassidnode3,
-                                               listnode4,
-                                               pannotationsnode5
+                                               null,
+                                               listnode5,
+                                               null,
+                                               pannotationsnode7
                                        )
                                        node_list = ptypenode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction146
+private class ReduceAction148
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4580,25 +4846,31 @@ private class ReduceAction146
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var listnode5 = new Array[Object]
+                                       var listnode6 = new Array[Object]
                                        var tclassidnode3 = nodearraylist1
                                        assert tclassidnode3 isa nullable TClassid
-                                       var listnode4 = nodearraylist4
-                                       assert listnode4 isa Array[Object]
-                                       listnode5 = concat(listnode5, listnode4)
-                                       var pannotationsnode6 = nodearraylist7
-                                       assert pannotationsnode6 isa nullable AAnnotations
+                                       var tobranode4 = nodearraylist2
+                                       assert tobranode4 isa nullable TObra
+                                       var listnode5 = nodearraylist4
+                                       assert listnode5 isa Array[Object]
+                                       listnode6 = concat(listnode6, listnode5)
+                                       var tcbranode7 = nodearraylist6
+                                       assert tcbranode7 isa nullable TCbra
+                                       var pannotationsnode8 = nodearraylist7
+                                       assert pannotationsnode8 isa nullable AAnnotations
                                        var ptypenode1: nullable AType = new AType.init_atype(
                                                null,
                                                tclassidnode3,
-                                               listnode5,
-                                               pannotationsnode6
+                                               tobranode4,
+                                               listnode6,
+                                               tcbranode7,
+                                               pannotationsnode8
                                        )
                                        node_list = ptypenode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction147
+private class ReduceAction149
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4611,27 +4883,33 @@ private class ReduceAction147
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var listnode5 = new Array[Object]
+                                       var listnode6 = new Array[Object]
                                        var tkwnullablenode2 = nodearraylist1
                                        assert tkwnullablenode2 isa nullable TKwnullable
                                        var tclassidnode3 = nodearraylist2
                                        assert tclassidnode3 isa nullable TClassid
-                                       var listnode4 = nodearraylist5
-                                       assert listnode4 isa Array[Object]
-                                       listnode5 = concat(listnode5, listnode4)
-                                       var pannotationsnode6 = nodearraylist8
-                                       assert pannotationsnode6 isa nullable AAnnotations
+                                       var tobranode4 = nodearraylist3
+                                       assert tobranode4 isa nullable TObra
+                                       var listnode5 = nodearraylist5
+                                       assert listnode5 isa Array[Object]
+                                       listnode6 = concat(listnode6, listnode5)
+                                       var tcbranode7 = nodearraylist7
+                                       assert tcbranode7 isa nullable TCbra
+                                       var pannotationsnode8 = nodearraylist8
+                                       assert pannotationsnode8 isa nullable AAnnotations
                                        var ptypenode1: nullable AType = new AType.init_atype(
                                                tkwnullablenode2,
                                                tclassidnode3,
-                                               listnode5,
-                                               pannotationsnode6
+                                               tobranode4,
+                                               listnode6,
+                                               tcbranode7,
+                                               pannotationsnode8
                                        )
                                        node_list = ptypenode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction148
+private class ReduceAction150
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4646,7 +4924,7 @@ private class ReduceAction148
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction149
+private class ReduceAction151
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4665,7 +4943,7 @@ private class ReduceAction149
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction150
+private class ReduceAction152
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4678,7 +4956,7 @@ private class ReduceAction150
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction154
+private class ReduceAction156
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4690,7 +4968,7 @@ private class ReduceAction154
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction155
+private class ReduceAction157
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4708,7 +4986,7 @@ private class ReduceAction155
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction156
+private class ReduceAction158
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4725,7 +5003,7 @@ private class ReduceAction156
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction157
+private class ReduceAction159
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4736,7 +5014,7 @@ private class ReduceAction157
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction158
+private class ReduceAction160
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4756,7 +5034,7 @@ private class ReduceAction158
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction159
+private class ReduceAction161
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4780,7 +5058,7 @@ private class ReduceAction159
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction160
+private class ReduceAction162
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4801,7 +5079,7 @@ private class ReduceAction160
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction161
+private class ReduceAction163
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4826,7 +5104,7 @@ private class ReduceAction161
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction162
+private class ReduceAction164
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4850,7 +5128,7 @@ private class ReduceAction162
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction163
+private class ReduceAction165
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4878,7 +5156,7 @@ private class ReduceAction163
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction167
+private class ReduceAction169
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4894,7 +5172,7 @@ private class ReduceAction167
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction168
+private class ReduceAction170
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4913,7 +5191,7 @@ private class ReduceAction168
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction169
+private class ReduceAction171
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4929,7 +5207,7 @@ private class ReduceAction169
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction170
+private class ReduceAction172
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4948,7 +5226,7 @@ private class ReduceAction170
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction171
+private class ReduceAction173
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4963,7 +5241,7 @@ private class ReduceAction171
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction172
+private class ReduceAction174
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4979,7 +5257,7 @@ private class ReduceAction172
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction173
+private class ReduceAction175
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -4998,7 +5276,7 @@ private class ReduceAction173
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction181
+private class ReduceAction183
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5023,7 +5301,7 @@ private class ReduceAction181
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction182
+private class ReduceAction184
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5049,7 +5327,7 @@ private class ReduceAction182
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction183
+private class ReduceAction185
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5076,7 +5354,7 @@ private class ReduceAction183
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction185
+private class ReduceAction187
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5097,7 +5375,7 @@ private class ReduceAction185
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction186
+private class ReduceAction188
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5119,7 +5397,7 @@ private class ReduceAction186
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction187
+private class ReduceAction189
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5142,7 +5420,7 @@ private class ReduceAction187
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction189
+private class ReduceAction191
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5165,7 +5443,7 @@ private class ReduceAction189
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction190
+private class ReduceAction192
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5190,7 +5468,7 @@ private class ReduceAction190
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction191
+private class ReduceAction193
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5211,7 +5489,7 @@ private class ReduceAction191
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction192
+private class ReduceAction194
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5237,7 +5515,7 @@ private class ReduceAction192
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction193
+private class ReduceAction195
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5264,7 +5542,7 @@ private class ReduceAction193
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction195
+private class ReduceAction197
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5286,7 +5564,7 @@ private class ReduceAction195
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction196
+private class ReduceAction198
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5309,7 +5587,7 @@ private class ReduceAction196
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction198
+private class ReduceAction200
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5337,7 +5615,7 @@ private class ReduceAction198
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction199
+private class ReduceAction201
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5353,7 +5631,7 @@ private class ReduceAction199
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction200
+private class ReduceAction202
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5372,7 +5650,7 @@ private class ReduceAction200
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction201
+private class ReduceAction203
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5398,7 +5676,7 @@ private class ReduceAction201
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction202
+private class ReduceAction204
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5427,7 +5705,7 @@ private class ReduceAction202
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction203
+private class ReduceAction205
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5460,7 +5738,7 @@ private class ReduceAction203
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction204
+private class ReduceAction206
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5496,7 +5774,7 @@ private class ReduceAction204
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction205
+private class ReduceAction207
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5526,7 +5804,7 @@ private class ReduceAction205
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction206
+private class ReduceAction208
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5552,7 +5830,7 @@ private class ReduceAction206
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction207
+private class ReduceAction209
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5585,7 +5863,7 @@ private class ReduceAction207
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction208
+private class ReduceAction210
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5619,7 +5897,7 @@ private class ReduceAction208
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction209
+private class ReduceAction211
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5653,7 +5931,7 @@ private class ReduceAction209
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction210
+private class ReduceAction212
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5688,7 +5966,7 @@ private class ReduceAction210
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction211
+private class ReduceAction213
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5723,7 +6001,7 @@ private class ReduceAction211
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction212
+private class ReduceAction214
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5759,7 +6037,7 @@ private class ReduceAction212
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction215
+private class ReduceAction217
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5788,7 +6066,7 @@ private class ReduceAction215
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction216
+private class ReduceAction218
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5818,7 +6096,7 @@ private class ReduceAction216
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction217
+private class ReduceAction219
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5848,7 +6126,7 @@ private class ReduceAction217
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction218
+private class ReduceAction220
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5879,7 +6157,7 @@ private class ReduceAction218
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction219
+private class ReduceAction221
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5910,7 +6188,7 @@ private class ReduceAction219
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction220
+private class ReduceAction222
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5942,7 +6220,7 @@ private class ReduceAction220
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction223
+private class ReduceAction225
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5969,7 +6247,7 @@ private class ReduceAction223
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction224
+private class ReduceAction226
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -5999,7 +6277,7 @@ private class ReduceAction224
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction225
+private class ReduceAction227
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6025,7 +6303,7 @@ private class ReduceAction225
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction226
+private class ReduceAction228
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6058,7 +6336,7 @@ private class ReduceAction226
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction227
+private class ReduceAction229
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6092,7 +6370,7 @@ private class ReduceAction227
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction228
+private class ReduceAction230
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6126,7 +6404,7 @@ private class ReduceAction228
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction229
+private class ReduceAction231
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6161,7 +6439,7 @@ private class ReduceAction229
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction230
+private class ReduceAction232
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6196,7 +6474,7 @@ private class ReduceAction230
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction231
+private class ReduceAction233
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6232,7 +6510,7 @@ private class ReduceAction231
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction234
+private class ReduceAction236
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6261,7 +6539,7 @@ private class ReduceAction234
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction235
+private class ReduceAction237
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6291,7 +6569,7 @@ private class ReduceAction235
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction236
+private class ReduceAction238
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6321,7 +6599,7 @@ private class ReduceAction236
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction237
+private class ReduceAction239
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6352,7 +6630,7 @@ private class ReduceAction237
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction238
+private class ReduceAction240
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6383,7 +6661,7 @@ private class ReduceAction238
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction239
+private class ReduceAction241
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6415,7 +6693,7 @@ private class ReduceAction239
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction242
+private class ReduceAction244
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6442,7 +6720,7 @@ private class ReduceAction242
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction243
+private class ReduceAction245
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6457,7 +6735,7 @@ private class ReduceAction243
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction244
+private class ReduceAction246
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6472,7 +6750,7 @@ private class ReduceAction244
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction245
+private class ReduceAction247
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6487,7 +6765,7 @@ private class ReduceAction245
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction246
+private class ReduceAction248
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6502,7 +6780,7 @@ private class ReduceAction246
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction247
+private class ReduceAction249
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6517,7 +6795,7 @@ private class ReduceAction247
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction248
+private class ReduceAction250
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6532,7 +6810,7 @@ private class ReduceAction248
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction249
+private class ReduceAction251
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6547,7 +6825,7 @@ private class ReduceAction249
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction250
+private class ReduceAction252
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6562,7 +6840,7 @@ private class ReduceAction250
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction251
+private class ReduceAction253
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6577,7 +6855,7 @@ private class ReduceAction251
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction252
+private class ReduceAction254
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6592,7 +6870,7 @@ private class ReduceAction252
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction253
+private class ReduceAction255
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6607,7 +6885,7 @@ private class ReduceAction253
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction254
+private class ReduceAction256
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6630,32 +6908,137 @@ private class ReduceAction254
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction255
+private class ReduceAction257
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var tkwdonode2 = nodearraylist1
+                                       assert tkwdonode2 isa nullable TKwdo
+                                       var pexprnode3 = nodearraylist2
+                                       assert pexprnode3 isa nullable AExpr
+                                       var pexprnode1: nullable ADoExpr = new ADoExpr.init_adoexpr(
+                                               tkwdonode2,
+                                               pexprnode3,
+                                               null
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction258
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist8 = p.pop
+                                       var nodearraylist7 = p.pop
+                                       var nodearraylist6 = p.pop
+                                       var nodearraylist5 = p.pop
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var tkwifnode2 = nodearraylist1
+                                       assert tkwifnode2 isa nullable TKwif
+                                       var pexprnode3 = nodearraylist3
+                                       assert pexprnode3 isa nullable AExpr
+                                       var tkwthennode4 = nodearraylist5
+                                       assert tkwthennode4 isa nullable TKwthen
+                                       var pexprnode5 = nodearraylist6
+                                       assert pexprnode5 isa nullable AExpr
+                                       var tkwelsenode6 = nodearraylist7
+                                       assert tkwelsenode6 isa nullable TKwelse
+                                       var pexprnode7 = nodearraylist8
+                                       assert pexprnode7 isa nullable AExpr
+                                       var pexprnode1: nullable AIfExpr = new AIfExpr.init_aifexpr(
+                                               tkwifnode2,
+                                               pexprnode3,
+                                               tkwthennode4,
+                                               pexprnode5,
+                                               tkwelsenode6,
+                                               pexprnode7
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction259
+       super ReduceAction
+       redef fun action(p: Parser)
+       do
+                                       var node_list: nullable Object = null
+                                       var nodearraylist6 = p.pop
+                                       var nodearraylist5 = p.pop
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
+                                       var nodearraylist2 = p.pop
+                                       var nodearraylist1 = p.pop
+                                       var tkwifnode2 = nodearraylist1
+                                       assert tkwifnode2 isa nullable TKwif
+                                       var pexprnode3 = nodearraylist3
+                                       assert pexprnode3 isa nullable AExpr
+                                       var tkwthennode4 = nodearraylist5
+                                       assert tkwthennode4 isa nullable TKwthen
+                                       var pexprnode5 = nodearraylist6
+                                       assert pexprnode5 isa nullable AExpr
+                                       var pexprnode1: nullable AIfExpr = new AIfExpr.init_aifexpr(
+                                               tkwifnode2,
+                                               pexprnode3,
+                                               tkwthennode4,
+                                               pexprnode5,
+                                               null,
+                                               null
+                                       )
+                                       node_list = pexprnode1
+                                       p.push(p.go_to(_goto), node_list)
+       end
+end
+private class ReduceAction260
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist9 = p.pop
+                                       var nodearraylist8 = p.pop
+                                       var nodearraylist7 = p.pop
+                                       var nodearraylist6 = p.pop
+                                       var nodearraylist5 = p.pop
+                                       var nodearraylist4 = p.pop
+                                       var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var tkwdonode2 = nodearraylist1
-                                       assert tkwdonode2 isa nullable TKwdo
-                                       var pexprnode3 = nodearraylist2
+                                       var tkwifnode2 = nodearraylist1
+                                       assert tkwifnode2 isa nullable TKwif
+                                       var pexprnode3 = nodearraylist3
                                        assert pexprnode3 isa nullable AExpr
-                                       var pexprnode1: nullable ADoExpr = new ADoExpr.init_adoexpr(
-                                               tkwdonode2,
+                                       var tkwthennode4 = nodearraylist5
+                                       assert tkwthennode4 isa nullable TKwthen
+                                       var pexprnode5 = nodearraylist7
+                                       assert pexprnode5 isa nullable AExpr
+                                       var tkwelsenode6 = nodearraylist8
+                                       assert tkwelsenode6 isa nullable TKwelse
+                                       var pexprnode7 = nodearraylist9
+                                       assert pexprnode7 isa nullable AExpr
+                                       var pexprnode1: nullable AIfExpr = new AIfExpr.init_aifexpr(
+                                               tkwifnode2,
                                                pexprnode3,
-                                               null
+                                               tkwthennode4,
+                                               pexprnode5,
+                                               tkwelsenode6,
+                                               pexprnode7
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction256
+private class ReduceAction261
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
-                                       var nodearraylist8 = p.pop
                                        var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
@@ -6667,25 +7050,31 @@ private class ReduceAction256
                                        assert tkwifnode2 isa nullable TKwif
                                        var pexprnode3 = nodearraylist3
                                        assert pexprnode3 isa nullable AExpr
-                                       var pexprnode4 = nodearraylist6
-                                       assert pexprnode4 isa nullable AExpr
-                                       var pexprnode5 = nodearraylist8
-                                       assert pexprnode5 isa nullable AExpr
+                                       var tkwthennode4 = nodearraylist5
+                                       assert tkwthennode4 isa nullable TKwthen
+                                       var tkwelsenode6 = nodearraylist6
+                                       assert tkwelsenode6 isa nullable TKwelse
+                                       var pexprnode7 = nodearraylist7
+                                       assert pexprnode7 isa nullable AExpr
                                        var pexprnode1: nullable AIfExpr = new AIfExpr.init_aifexpr(
                                                tkwifnode2,
                                                pexprnode3,
-                                               pexprnode4,
-                                               pexprnode5
+                                               tkwthennode4,
+                                               null,
+                                               tkwelsenode6,
+                                               pexprnode7
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction257
+private class ReduceAction262
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist8 = p.pop
+                                       var nodearraylist7 = p.pop
                                        var nodearraylist6 = p.pop
                                        var nodearraylist5 = p.pop
                                        var nodearraylist4 = p.pop
@@ -6696,19 +7085,25 @@ private class ReduceAction257
                                        assert tkwifnode2 isa nullable TKwif
                                        var pexprnode3 = nodearraylist3
                                        assert pexprnode3 isa nullable AExpr
-                                       var pexprnode4 = nodearraylist6
-                                       assert pexprnode4 isa nullable AExpr
+                                       var tkwthennode4 = nodearraylist5
+                                       assert tkwthennode4 isa nullable TKwthen
+                                       var tkwelsenode6 = nodearraylist7
+                                       assert tkwelsenode6 isa nullable TKwelse
+                                       var pexprnode7 = nodearraylist8
+                                       assert pexprnode7 isa nullable AExpr
                                        var pexprnode1: nullable AIfExpr = new AIfExpr.init_aifexpr(
                                                tkwifnode2,
                                                pexprnode3,
-                                               pexprnode4,
-                                               null
+                                               tkwthennode4,
+                                               null,
+                                               tkwelsenode6,
+                                               pexprnode7
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction258
+private class ReduceAction263
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6725,21 +7120,25 @@ private class ReduceAction258
                                        assert tkwifnode2 isa nullable TKwif
                                        var pexprnode3 = nodearraylist3
                                        assert pexprnode3 isa nullable AExpr
-                                       var pexprnode4 = nodearraylist7
-                                       assert pexprnode4 isa nullable AExpr
-                                       var pexprnode5 = nodearraylist8
+                                       var tkwthennode4 = nodearraylist5
+                                       assert tkwthennode4 isa nullable TKwthen
+                                       var pexprnode5 = nodearraylist7
                                        assert pexprnode5 isa nullable AExpr
+                                       var pexprnode7 = nodearraylist8
+                                       assert pexprnode7 isa nullable AExpr
                                        var pexprnode1: nullable AIfExpr = new AIfExpr.init_aifexpr(
                                                tkwifnode2,
                                                pexprnode3,
-                                               pexprnode4,
-                                               pexprnode5
+                                               tkwthennode4,
+                                               pexprnode5,
+                                               null,
+                                               pexprnode7
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction259
+private class ReduceAction264
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6754,19 +7153,23 @@ private class ReduceAction259
                                        assert tkwifnode2 isa nullable TKwif
                                        var pexprnode3 = nodearraylist3
                                        assert pexprnode3 isa nullable AExpr
-                                       var pexprnode5 = nodearraylist6
-                                       assert pexprnode5 isa nullable AExpr
+                                       var tkwthennode4 = nodearraylist5
+                                       assert tkwthennode4 isa nullable TKwthen
+                                       var pexprnode7 = nodearraylist6
+                                       assert pexprnode7 isa nullable AExpr
                                        var pexprnode1: nullable AIfExpr = new AIfExpr.init_aifexpr(
                                                tkwifnode2,
                                                pexprnode3,
+                                               tkwthennode4,
                                                null,
-                                               pexprnode5
+                                               null,
+                                               pexprnode7
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction260
+private class ReduceAction265
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6782,19 +7185,23 @@ private class ReduceAction260
                                        assert tkwifnode2 isa nullable TKwif
                                        var pexprnode3 = nodearraylist3
                                        assert pexprnode3 isa nullable AExpr
-                                       var pexprnode5 = nodearraylist7
-                                       assert pexprnode5 isa nullable AExpr
+                                       var tkwthennode4 = nodearraylist5
+                                       assert tkwthennode4 isa nullable TKwthen
+                                       var pexprnode7 = nodearraylist7
+                                       assert pexprnode7 isa nullable AExpr
                                        var pexprnode1: nullable AIfExpr = new AIfExpr.init_aifexpr(
                                                tkwifnode2,
                                                pexprnode3,
+                                               tkwthennode4,
                                                null,
-                                               pexprnode5
+                                               null,
+                                               pexprnode7
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction263
+private class ReduceAction267
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6817,7 +7224,7 @@ private class ReduceAction263
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction264
+private class ReduceAction268
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6837,7 +7244,7 @@ private class ReduceAction264
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction265
+private class ReduceAction269
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6870,7 +7277,7 @@ private class ReduceAction265
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction266
+private class ReduceAction270
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6900,7 +7307,7 @@ private class ReduceAction266
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction267
+private class ReduceAction271
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6922,27 +7329,30 @@ private class ReduceAction267
                                        var listnode3 = nodearraylist3
                                        assert listnode3 isa Array[Object]
                                        listnode4 = concat(listnode4, listnode3)
-                                       var pexprnode5 = nodearraylist7
-                                       assert pexprnode5 isa nullable AExpr
-                                       var tkwdonode6 = nodearraylist9
-                                       assert tkwdonode6 isa nullable TKwdo
-                                       var pexprnode7 = nodearraylist10
-                                       assert pexprnode7 isa nullable AExpr
-                                       var plabelnode8 = nodearraylist11
-                                       assert plabelnode8 isa nullable ALabel
+                                       var tkwinnode5 = nodearraylist5
+                                       assert tkwinnode5 isa nullable TKwin
+                                       var pexprnode6 = nodearraylist7
+                                       assert pexprnode6 isa nullable AExpr
+                                       var tkwdonode7 = nodearraylist9
+                                       assert tkwdonode7 isa nullable TKwdo
+                                       var pexprnode8 = nodearraylist10
+                                       assert pexprnode8 isa nullable AExpr
+                                       var plabelnode9 = nodearraylist11
+                                       assert plabelnode9 isa nullable ALabel
                                        var pexprnode1: nullable AForExpr = new AForExpr.init_aforexpr(
                                                tkwfornode2,
                                                listnode4,
-                                               pexprnode5,
-                                               tkwdonode6,
-                                               pexprnode7,
-                                               plabelnode8
+                                               tkwinnode5,
+                                               pexprnode6,
+                                               tkwdonode7,
+                                               pexprnode8,
+                                               plabelnode9
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction268
+private class ReduceAction272
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -6963,25 +7373,28 @@ private class ReduceAction268
                                        var listnode3 = nodearraylist3
                                        assert listnode3 isa Array[Object]
                                        listnode4 = concat(listnode4, listnode3)
-                                       var pexprnode5 = nodearraylist7
-                                       assert pexprnode5 isa nullable AExpr
-                                       var tkwdonode6 = nodearraylist9
-                                       assert tkwdonode6 isa nullable TKwdo
-                                       var pexprnode7 = nodearraylist10
-                                       assert pexprnode7 isa nullable AExpr
+                                       var tkwinnode5 = nodearraylist5
+                                       assert tkwinnode5 isa nullable TKwin
+                                       var pexprnode6 = nodearraylist7
+                                       assert pexprnode6 isa nullable AExpr
+                                       var tkwdonode7 = nodearraylist9
+                                       assert tkwdonode7 isa nullable TKwdo
+                                       var pexprnode8 = nodearraylist10
+                                       assert pexprnode8 isa nullable AExpr
                                        var pexprnode1: nullable AForExpr = new AForExpr.init_aforexpr(
                                                tkwfornode2,
                                                listnode4,
-                                               pexprnode5,
-                                               tkwdonode6,
-                                               pexprnode7,
+                                               tkwinnode5,
+                                               pexprnode6,
+                                               tkwdonode7,
+                                               pexprnode8,
                                                null
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction269
+private class ReduceAction273
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7014,7 +7427,7 @@ private class ReduceAction269
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction270
+private class ReduceAction274
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7044,7 +7457,7 @@ private class ReduceAction270
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction271
+private class ReduceAction275
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7074,7 +7487,7 @@ private class ReduceAction271
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction272
+private class ReduceAction276
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7107,7 +7520,7 @@ private class ReduceAction272
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction274
+private class ReduceAction278
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7120,19 +7533,22 @@ private class ReduceAction274
                                        assert tkwassertnode2 isa nullable TKwassert
                                        var pexprnode4 = nodearraylist2
                                        assert pexprnode4 isa nullable AExpr
-                                       var pexprnode5 = nodearraylist4
-                                       assert pexprnode5 isa nullable AExpr
+                                       var tkwelsenode5 = nodearraylist3
+                                       assert tkwelsenode5 isa nullable TKwelse
+                                       var pexprnode6 = nodearraylist4
+                                       assert pexprnode6 isa nullable AExpr
                                        var pexprnode1: nullable AAssertExpr = new AAssertExpr.init_aassertexpr(
                                                tkwassertnode2,
                                                null,
                                                pexprnode4,
-                                               pexprnode5
+                                               tkwelsenode5,
+                                               pexprnode6
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction275
+private class ReduceAction279
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7148,19 +7564,22 @@ private class ReduceAction275
                                        assert tidnode3 isa nullable TId
                                        var pexprnode4 = nodearraylist3
                                        assert pexprnode4 isa nullable AExpr
-                                       var pexprnode5 = nodearraylist5
-                                       assert pexprnode5 isa nullable AExpr
+                                       var tkwelsenode5 = nodearraylist4
+                                       assert tkwelsenode5 isa nullable TKwelse
+                                       var pexprnode6 = nodearraylist5
+                                       assert pexprnode6 isa nullable AExpr
                                        var pexprnode1: nullable AAssertExpr = new AAssertExpr.init_aassertexpr(
                                                tkwassertnode2,
                                                tidnode3,
                                                pexprnode4,
-                                               pexprnode5
+                                               tkwelsenode5,
+                                               pexprnode6
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction276
+private class ReduceAction280
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7175,13 +7594,14 @@ private class ReduceAction276
                                                tkwassertnode2,
                                                null,
                                                pexprnode4,
+                                               null,
                                                null
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction277
+private class ReduceAction281
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7199,13 +7619,14 @@ private class ReduceAction277
                                                tkwassertnode2,
                                                tidnode3,
                                                pexprnode4,
+                                               null,
                                                null
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction278
+private class ReduceAction282
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7217,7 +7638,7 @@ private class ReduceAction278
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction280
+private class ReduceAction284
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7257,7 +7678,7 @@ private class ReduceAction280
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction282
+private class ReduceAction286
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7281,7 +7702,7 @@ private class ReduceAction282
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction283
+private class ReduceAction287
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7305,7 +7726,7 @@ private class ReduceAction283
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction284
+private class ReduceAction288
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7333,7 +7754,7 @@ private class ReduceAction284
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction285
+private class ReduceAction289
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7357,7 +7778,7 @@ private class ReduceAction285
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction287
+private class ReduceAction291
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7377,7 +7798,7 @@ private class ReduceAction287
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction289
+private class ReduceAction293
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7401,7 +7822,7 @@ private class ReduceAction289
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction290
+private class ReduceAction294
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7425,7 +7846,7 @@ private class ReduceAction290
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction291
+private class ReduceAction295
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7449,7 +7870,7 @@ private class ReduceAction291
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction292
+private class ReduceAction296
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7473,7 +7894,7 @@ private class ReduceAction292
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction293
+private class ReduceAction297
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7497,7 +7918,7 @@ private class ReduceAction293
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction294
+private class ReduceAction298
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7521,7 +7942,7 @@ private class ReduceAction294
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction295
+private class ReduceAction299
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7545,7 +7966,7 @@ private class ReduceAction295
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction296
+private class ReduceAction300
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7569,7 +7990,7 @@ private class ReduceAction296
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction298
+private class ReduceAction302
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7593,7 +8014,7 @@ private class ReduceAction298
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction300
+private class ReduceAction304
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7617,7 +8038,7 @@ private class ReduceAction300
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction302
+private class ReduceAction306
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7641,7 +8062,7 @@ private class ReduceAction302
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction304
+private class ReduceAction308
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7665,7 +8086,7 @@ private class ReduceAction304
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction305
+private class ReduceAction309
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7689,7 +8110,7 @@ private class ReduceAction305
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction307
+private class ReduceAction311
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7713,7 +8134,7 @@ private class ReduceAction307
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction308
+private class ReduceAction312
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7737,7 +8158,7 @@ private class ReduceAction308
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction310
+private class ReduceAction314
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7761,7 +8182,7 @@ private class ReduceAction310
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction311
+private class ReduceAction315
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7785,7 +8206,7 @@ private class ReduceAction311
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction312
+private class ReduceAction316
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7809,7 +8230,7 @@ private class ReduceAction312
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction314
+private class ReduceAction318
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7833,7 +8254,7 @@ private class ReduceAction314
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction316
+private class ReduceAction320
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7852,7 +8273,7 @@ private class ReduceAction316
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction317
+private class ReduceAction321
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7871,7 +8292,7 @@ private class ReduceAction317
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction318
+private class ReduceAction322
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7890,7 +8311,7 @@ private class ReduceAction318
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction319
+private class ReduceAction323
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7910,7 +8331,7 @@ private class ReduceAction319
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction321
+private class ReduceAction325
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7935,7 +8356,7 @@ private class ReduceAction321
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction322
+private class ReduceAction326
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7961,7 +8382,7 @@ private class ReduceAction322
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction323
+private class ReduceAction327
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -7987,7 +8408,7 @@ private class ReduceAction323
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction324
+private class ReduceAction328
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8009,7 +8430,7 @@ private class ReduceAction324
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction326
+private class ReduceAction330
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8031,7 +8452,7 @@ private class ReduceAction326
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction327
+private class ReduceAction331
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8049,7 +8470,7 @@ private class ReduceAction327
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction329
+private class ReduceAction333
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8075,7 +8496,7 @@ private class ReduceAction329
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction331
+private class ReduceAction335
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8102,7 +8523,7 @@ private class ReduceAction331
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction333
+private class ReduceAction337
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8130,7 +8551,7 @@ private class ReduceAction333
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction337
+private class ReduceAction341
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8152,7 +8573,7 @@ private class ReduceAction337
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction339
+private class ReduceAction343
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8175,7 +8596,7 @@ private class ReduceAction339
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction341
+private class ReduceAction345
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8199,7 +8620,7 @@ private class ReduceAction341
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction345
+private class ReduceAction349
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8223,7 +8644,7 @@ private class ReduceAction345
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction347
+private class ReduceAction351
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8249,7 +8670,7 @@ private class ReduceAction347
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction349
+private class ReduceAction353
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8271,7 +8692,7 @@ private class ReduceAction349
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction350
+private class ReduceAction354
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8290,7 +8711,7 @@ private class ReduceAction350
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction351
+private class ReduceAction355
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8320,7 +8741,7 @@ private class ReduceAction351
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction352
+private class ReduceAction356
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8351,7 +8772,7 @@ private class ReduceAction352
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction353
+private class ReduceAction357
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8382,7 +8803,7 @@ private class ReduceAction353
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction354
+private class ReduceAction358
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8414,7 +8835,7 @@ private class ReduceAction354
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction355
+private class ReduceAction359
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8446,7 +8867,7 @@ private class ReduceAction355
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction356
+private class ReduceAction360
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8479,7 +8900,7 @@ private class ReduceAction356
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction359
+private class ReduceAction363
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8515,7 +8936,7 @@ private class ReduceAction359
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction360
+private class ReduceAction364
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8556,7 +8977,7 @@ private class ReduceAction360
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction361
+private class ReduceAction365
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8589,7 +9010,7 @@ private class ReduceAction361
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction363
+private class ReduceAction367
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8608,7 +9029,7 @@ private class ReduceAction363
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction364
+private class ReduceAction368
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8631,7 +9052,7 @@ private class ReduceAction364
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction365
+private class ReduceAction369
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8650,7 +9071,7 @@ private class ReduceAction365
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction366
+private class ReduceAction370
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8669,7 +9090,7 @@ private class ReduceAction366
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction367
+private class ReduceAction371
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8688,7 +9109,7 @@ private class ReduceAction367
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction368
+private class ReduceAction372
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8707,7 +9128,7 @@ private class ReduceAction368
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction369
+private class ReduceAction373
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8726,7 +9147,7 @@ private class ReduceAction369
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction370
+private class ReduceAction374
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8745,7 +9166,7 @@ private class ReduceAction370
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction371
+private class ReduceAction375
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8764,7 +9185,7 @@ private class ReduceAction371
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction372
+private class ReduceAction376
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8783,7 +9204,7 @@ private class ReduceAction372
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction373
+private class ReduceAction377
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8802,7 +9223,7 @@ private class ReduceAction373
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction376
+private class ReduceAction380
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8820,25 +9241,28 @@ private class ReduceAction376
                                        var tobranode2 = nodearraylist1
                                        assert tobranode2 isa nullable TObra
                                        var pexprnode3 = nodearraylist3
-                                       assert pexprnode3 isa nullable AExpr
-                                       var pexprnode4 = nodearraylist7
-                                       assert pexprnode4 isa nullable AExpr
-                                       var tcbranode5 = nodearraylist9
-                                       assert tcbranode5 isa nullable TCbra
-                                       var pannotationsnode6 = nodearraylist10
-                                       assert pannotationsnode6 isa nullable AAnnotations
+                                       assert pexprnode3 isa nullable AExpr
+                                       var tdotdotnode4 = nodearraylist5
+                                       assert tdotdotnode4 isa nullable TDotdot
+                                       var pexprnode5 = nodearraylist7
+                                       assert pexprnode5 isa nullable AExpr
+                                       var tcbranode6 = nodearraylist9
+                                       assert tcbranode6 isa nullable TCbra
+                                       var pannotationsnode7 = nodearraylist10
+                                       assert pannotationsnode7 isa nullable AAnnotations
                                        var pexprnode1: nullable ACrangeExpr = new ACrangeExpr.init_acrangeexpr(
                                                tobranode2,
                                                pexprnode3,
-                                               pexprnode4,
-                                               tcbranode5,
-                                               pannotationsnode6
+                                               tdotdotnode4,
+                                               pexprnode5,
+                                               tcbranode6,
+                                               pannotationsnode7
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction377
+private class ReduceAction381
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8857,24 +9281,27 @@ private class ReduceAction377
                                        assert tobranode2 isa nullable TObra
                                        var pexprnode3 = nodearraylist3
                                        assert pexprnode3 isa nullable AExpr
-                                       var pexprnode4 = nodearraylist7
-                                       assert pexprnode4 isa nullable AExpr
-                                       var tobranode5 = nodearraylist9
-                                       assert tobranode5 isa nullable TObra
-                                       var pannotationsnode6 = nodearraylist10
-                                       assert pannotationsnode6 isa nullable AAnnotations
+                                       var tdotdotnode4 = nodearraylist5
+                                       assert tdotdotnode4 isa nullable TDotdot
+                                       var pexprnode5 = nodearraylist7
+                                       assert pexprnode5 isa nullable AExpr
+                                       var tobranode6 = nodearraylist9
+                                       assert tobranode6 isa nullable TObra
+                                       var pannotationsnode7 = nodearraylist10
+                                       assert pannotationsnode7 isa nullable AAnnotations
                                        var pexprnode1: nullable AOrangeExpr = new AOrangeExpr.init_aorangeexpr(
                                                tobranode2,
                                                pexprnode3,
-                                               pexprnode4,
-                                               tobranode5,
-                                               pannotationsnode6
+                                               tdotdotnode4,
+                                               pexprnode5,
+                                               tobranode6,
+                                               pannotationsnode7
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction378
+private class ReduceAction382
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8908,7 +9335,7 @@ private class ReduceAction378
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction379
+private class ReduceAction383
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8937,7 +9364,7 @@ private class ReduceAction379
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction381
+private class ReduceAction385
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8960,7 +9387,7 @@ private class ReduceAction381
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction382
+private class ReduceAction386
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8973,7 +9400,7 @@ private class ReduceAction382
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction383
+private class ReduceAction387
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -8988,7 +9415,7 @@ private class ReduceAction383
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction384
+private class ReduceAction388
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9007,7 +9434,7 @@ private class ReduceAction384
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction386
+private class ReduceAction390
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9019,7 +9446,7 @@ private class ReduceAction386
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction388
+private class ReduceAction392
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9035,19 +9462,23 @@ private class ReduceAction388
                                        assert tkwifnode2 isa nullable TKwif
                                        var pexprnode3 = nodearraylist3
                                        assert pexprnode3 isa nullable AExpr
-                                       var pexprnode4 = nodearraylist7
-                                       assert pexprnode4 isa nullable AExpr
+                                       var tkwthennode4 = nodearraylist5
+                                       assert tkwthennode4 isa nullable TKwthen
+                                       var pexprnode5 = nodearraylist7
+                                       assert pexprnode5 isa nullable AExpr
                                        var pexprnode1: nullable AIfExpr = new AIfExpr.init_aifexpr(
                                                tkwifnode2,
                                                pexprnode3,
-                                               pexprnode4,
+                                               tkwthennode4,
+                                               pexprnode5,
+                                               null,
                                                null
                                        )
                                        node_list = pexprnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction389
+private class ReduceAction393
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9074,7 +9505,7 @@ private class ReduceAction389
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction390
+private class ReduceAction394
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9105,7 +9536,7 @@ private class ReduceAction390
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction391
+private class ReduceAction395
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9127,7 +9558,7 @@ private class ReduceAction391
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction392
+private class ReduceAction396
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9143,7 +9574,7 @@ private class ReduceAction392
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction393
+private class ReduceAction397
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9158,7 +9589,7 @@ private class ReduceAction393
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction396
+private class ReduceAction400
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9173,7 +9604,7 @@ private class ReduceAction396
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction397
+private class ReduceAction401
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9188,32 +9619,34 @@ private class ReduceAction397
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction398
+private class ReduceAction402
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var listnode5 = new Array[Object]
-                                       var tatnode2 = nodearraylist1
-                                       assert tatnode2 isa nullable TAt
-                                       var pannotationnode4 = nodearraylist2
-                                       assert pannotationnode4 isa nullable AAnnotation
-                                       if pannotationnode4 != null then
-                                               listnode5.add(pannotationnode4)
+                                       var listnode6 = new Array[Object]
+                                       var tatnode3 = nodearraylist1
+                                       assert tatnode3 isa nullable TAt
+                                       var pannotationnode5 = nodearraylist2
+                                       assert pannotationnode5 isa nullable AAnnotation
+                                       if pannotationnode5 != null then
+                                               listnode6.add(pannotationnode5)
                                        end
                                        var pannotationsnode1: nullable AAnnotations = new AAnnotations.init_aannotations(
-                                               tatnode2,
                                                null,
-                                               listnode5,
+                                               tatnode3,
+                                               null,
+                                               listnode6,
+                                               null,
                                                null
                                        )
                                        node_list = pannotationsnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction399
+private class ReduceAction403
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9224,27 +9657,29 @@ private class ReduceAction399
                                        var nodearraylist3 = p.pop
                                        var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var listnode5 = new Array[Object]
-                                       var tatnode2 = nodearraylist1
-                                       assert tatnode2 isa nullable TAt
-                                       var toparnode3 = nodearraylist2
-                                       assert toparnode3 isa nullable TOpar
-                                       var listnode4 = nodearraylist4
-                                       assert listnode4 isa Array[Object]
-                                       listnode5 = concat(listnode5, listnode4)
-                                       var tcparnode6 = nodearraylist6
-                                       assert tcparnode6 isa nullable TCpar
+                                       var listnode6 = new Array[Object]
+                                       var tatnode3 = nodearraylist1
+                                       assert tatnode3 isa nullable TAt
+                                       var toparnode4 = nodearraylist2
+                                       assert toparnode4 isa nullable TOpar
+                                       var listnode5 = nodearraylist4
+                                       assert listnode5 isa Array[Object]
+                                       listnode6 = concat(listnode6, listnode5)
+                                       var tcparnode7 = nodearraylist6
+                                       assert tcparnode7 isa nullable TCpar
                                        var pannotationsnode1: nullable AAnnotations = new AAnnotations.init_aannotations(
-                                               tatnode2,
-                                               toparnode3,
-                                               listnode5,
-                                               tcparnode6
+                                               null,
+                                               tatnode3,
+                                               toparnode4,
+                                               listnode6,
+                                               tcparnode7,
+                                               null
                                        )
                                        node_list = pannotationsnode1
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction400
+private class ReduceAction404
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9255,7 +9690,7 @@ private class ReduceAction400
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction402
+private class ReduceAction406
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9287,7 +9722,7 @@ private class ReduceAction402
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction403
+private class ReduceAction407
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9331,27 +9766,7 @@ private class ReduceAction403
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction404
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist1 = p.pop
-                                       var listnode5 = new Array[Object]
-                                       var listnode4 = nodearraylist1
-                                       assert listnode4 isa Array[Object]
-                                       listnode5 = concat(listnode5, listnode4)
-                                       var pannotationsnode1: nullable AAnnotations = new AAnnotations.init_aannotations(
-                                               null,
-                                               null,
-                                               listnode5,
-                                               null
-                                       )
-                                       node_list = pannotationsnode1
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction405
+private class ReduceAction408
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9366,7 +9781,7 @@ private class ReduceAction405
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction406
+private class ReduceAction409
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9385,7 +9800,7 @@ private class ReduceAction406
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction409
+private class ReduceAction412
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9420,7 +9835,7 @@ private class ReduceAction409
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction411
+private class ReduceAction414
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9433,7 +9848,7 @@ private class ReduceAction411
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction413
+private class ReduceAction415
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9466,7 +9881,7 @@ private class ReduceAction413
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction414
+private class ReduceAction416
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9502,7 +9917,7 @@ private class ReduceAction414
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction415
+private class ReduceAction417
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9546,7 +9961,7 @@ private class ReduceAction415
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction416
+private class ReduceAction418
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9593,7 +10008,7 @@ private class ReduceAction416
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction417
+private class ReduceAction419
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9630,7 +10045,7 @@ private class ReduceAction417
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction418
+private class ReduceAction420
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9656,7 +10071,7 @@ private class ReduceAction418
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction419
+private class ReduceAction421
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9685,7 +10100,7 @@ private class ReduceAction419
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction420
+private class ReduceAction422
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9722,7 +10137,7 @@ private class ReduceAction420
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction421
+private class ReduceAction423
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9762,7 +10177,7 @@ private class ReduceAction421
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction422
+private class ReduceAction424
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9792,7 +10207,7 @@ private class ReduceAction422
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction426
+private class ReduceAction428
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9807,7 +10222,7 @@ private class ReduceAction426
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction429
+private class ReduceAction431
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9828,7 +10243,7 @@ private class ReduceAction429
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction430
+private class ReduceAction432
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9845,7 +10260,7 @@ private class ReduceAction430
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction431
+private class ReduceAction433
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9860,7 +10275,7 @@ private class ReduceAction431
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction432
+private class ReduceAction434
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9875,7 +10290,7 @@ private class ReduceAction432
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction433
+private class ReduceAction435
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9890,7 +10305,7 @@ private class ReduceAction433
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction434
+private class ReduceAction436
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9905,7 +10320,7 @@ private class ReduceAction434
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction435
+private class ReduceAction437
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9931,7 +10346,7 @@ private class ReduceAction435
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction436
+private class ReduceAction438
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9953,7 +10368,7 @@ private class ReduceAction436
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction438
+private class ReduceAction440
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9972,7 +10387,7 @@ private class ReduceAction438
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction440
+private class ReduceAction442
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -9985,7 +10400,7 @@ private class ReduceAction440
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction441
+private class ReduceAction443
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10011,7 +10426,7 @@ private class ReduceAction441
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction443
+private class ReduceAction445
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10031,7 +10446,7 @@ private class ReduceAction443
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction444
+private class ReduceAction446
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10045,7 +10460,7 @@ private class ReduceAction444
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction445
+private class ReduceAction447
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10063,7 +10478,7 @@ private class ReduceAction445
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction446
+private class ReduceAction448
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10077,7 +10492,7 @@ private class ReduceAction446
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction447
+private class ReduceAction449
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10092,7 +10507,7 @@ private class ReduceAction447
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction448
+private class ReduceAction450
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10113,7 +10528,7 @@ private class ReduceAction448
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction449
+private class ReduceAction451
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10131,7 +10546,7 @@ private class ReduceAction449
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction450
+private class ReduceAction452
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10153,7 +10568,7 @@ private class ReduceAction450
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction451
+private class ReduceAction453
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10175,7 +10590,7 @@ private class ReduceAction451
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction452
+private class ReduceAction454
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10201,7 +10616,7 @@ private class ReduceAction452
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction453
+private class ReduceAction455
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10218,7 +10633,7 @@ private class ReduceAction453
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction454
+private class ReduceAction456
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10239,7 +10654,7 @@ private class ReduceAction454
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction455
+private class ReduceAction457
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10257,7 +10672,7 @@ private class ReduceAction455
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction457
+private class ReduceAction459
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10268,7 +10683,7 @@ private class ReduceAction457
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction458
+private class ReduceAction460
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10280,7 +10695,7 @@ private class ReduceAction458
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction459
+private class ReduceAction461
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10293,7 +10708,7 @@ private class ReduceAction459
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction461
+private class ReduceAction463
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10304,7 +10719,7 @@ private class ReduceAction461
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction462
+private class ReduceAction464
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10316,7 +10731,7 @@ private class ReduceAction462
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction463
+private class ReduceAction465
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10329,7 +10744,7 @@ private class ReduceAction463
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction465
+private class ReduceAction467
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10342,7 +10757,7 @@ private class ReduceAction465
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction466
+private class ReduceAction468
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10355,7 +10770,7 @@ private class ReduceAction466
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction468
+private class ReduceAction470
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10366,7 +10781,7 @@ private class ReduceAction468
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction469
+private class ReduceAction471
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10375,7 +10790,7 @@ private class ReduceAction469
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction472
+private class ReduceAction474
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10392,7 +10807,7 @@ private class ReduceAction472
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction473
+private class ReduceAction475
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10410,7 +10825,7 @@ private class ReduceAction473
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction476
+private class ReduceAction478
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10421,7 +10836,7 @@ private class ReduceAction476
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction478
+private class ReduceAction480
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10433,7 +10848,7 @@ private class ReduceAction478
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction479
+private class ReduceAction481
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10445,7 +10860,7 @@ private class ReduceAction479
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction480
+private class ReduceAction482
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10458,7 +10873,7 @@ private class ReduceAction480
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction482
+private class ReduceAction484
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10472,7 +10887,7 @@ private class ReduceAction482
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction484
+private class ReduceAction486
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10483,7 +10898,7 @@ private class ReduceAction484
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction485
+private class ReduceAction487
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10491,7 +10906,7 @@ private class ReduceAction485
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction488
+private class ReduceAction490
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10501,7 +10916,7 @@ private class ReduceAction488
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction851
+private class ReduceAction853
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10525,7 +10940,7 @@ private class ReduceAction851
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction853
+private class ReduceAction855
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10545,7 +10960,7 @@ private class ReduceAction853
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction854
+private class ReduceAction856
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10568,7 +10983,7 @@ private class ReduceAction854
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction855
+private class ReduceAction857
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10592,7 +11007,7 @@ private class ReduceAction855
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction856
+private class ReduceAction858
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10616,7 +11031,7 @@ private class ReduceAction856
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction857
+private class ReduceAction859
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10641,7 +11056,7 @@ private class ReduceAction857
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction864
+private class ReduceAction866
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10664,7 +11079,7 @@ private class ReduceAction864
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction865
+private class ReduceAction867
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10688,7 +11103,7 @@ private class ReduceAction865
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction890
+private class ReduceAction892
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10701,7 +11116,7 @@ private class ReduceAction890
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction891
+private class ReduceAction893
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10711,7 +11126,7 @@ private class ReduceAction891
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1052
+private class ReduceAction1054
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10726,7 +11141,7 @@ private class ReduceAction1052
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1053
+private class ReduceAction1055
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10745,7 +11160,7 @@ private class ReduceAction1053
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1054
+private class ReduceAction1056
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10760,7 +11175,7 @@ private class ReduceAction1054
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1055
+private class ReduceAction1057
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10779,7 +11194,7 @@ private class ReduceAction1055
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1056
+private class ReduceAction1058
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10794,7 +11209,7 @@ private class ReduceAction1056
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1057
+private class ReduceAction1059
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10813,22 +11228,26 @@ private class ReduceAction1057
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1058
+private class ReduceAction1061
        super ReduceAction
        redef fun action(p: Parser)
        do
                                        var node_list: nullable Object = null
+                                       var nodearraylist2 = p.pop
                                        var nodearraylist1 = p.pop
-                                       var listnode2 = new Array[Object]
-                                       var pformaldefnode1 = nodearraylist1
-                                       if pformaldefnode1 != null then
-                                               listnode2.add(pformaldefnode1)
+                                       var listnode3 = new Array[Object]
+                                       var listnode1 = nodearraylist1
+                                       assert listnode1 isa Array[Object]
+                                       var pformaldefnode2 = nodearraylist2
+                                       listnode3 = concat(listnode3, listnode1)
+                                       if pformaldefnode2 != null then
+                                               listnode3.add(pformaldefnode2)
                                        end
-                                       node_list = listnode2
+                                       node_list = listnode3
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1059
+private class ReduceAction1063
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10838,16 +11257,16 @@ private class ReduceAction1059
                                        var listnode3 = new Array[Object]
                                        var listnode1 = nodearraylist1
                                        assert listnode1 isa Array[Object]
-                                       var pformaldefnode2 = nodearraylist2
+                                       var ppropdefnode2 = nodearraylist2
                                        listnode3 = concat(listnode3, listnode1)
-                                       if pformaldefnode2 != null then
-                                               listnode3.add(pformaldefnode2)
+                                       if ppropdefnode2 != null then
+                                               listnode3.add(ppropdefnode2)
                                        end
                                        node_list = listnode3
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1061
+private class ReduceAction1065
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10857,16 +11276,16 @@ private class ReduceAction1061
                                        var listnode3 = new Array[Object]
                                        var listnode1 = nodearraylist1
                                        assert listnode1 isa Array[Object]
-                                       var ppropdefnode2 = nodearraylist2
+                                       var pannotationnode2 = nodearraylist2
                                        listnode3 = concat(listnode3, listnode1)
-                                       if ppropdefnode2 != null then
-                                               listnode3.add(ppropdefnode2)
+                                       if pannotationnode2 != null then
+                                               listnode3.add(pannotationnode2)
                                        end
                                        node_list = listnode3
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1062
+private class ReduceAction1066
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10881,7 +11300,7 @@ private class ReduceAction1062
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1063
+private class ReduceAction1067
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10900,7 +11319,7 @@ private class ReduceAction1063
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1064
+private class ReduceAction1068
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10915,7 +11334,7 @@ private class ReduceAction1064
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1065
+private class ReduceAction1069
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10934,7 +11353,7 @@ private class ReduceAction1065
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1067
+private class ReduceAction1071
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10953,7 +11372,7 @@ private class ReduceAction1067
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1069
+private class ReduceAction1073
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10972,7 +11391,7 @@ private class ReduceAction1069
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1075
+private class ReduceAction1079
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -10990,26 +11409,7 @@ private class ReduceAction1075
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1077
-       super ReduceAction
-       redef fun action(p: Parser)
-       do
-                                       var node_list: nullable Object = null
-                                       var nodearraylist2 = p.pop
-                                       var nodearraylist1 = p.pop
-                                       var listnode3 = new Array[Object]
-                                       var listnode1 = nodearraylist1
-                                       assert listnode1 isa Array[Object]
-                                       var pannotationnode2 = nodearraylist2
-                                       listnode3 = concat(listnode3, listnode1)
-                                       if pannotationnode2 != null then
-                                               listnode3.add(pannotationnode2)
-                                       end
-                                       node_list = listnode3
-                                       p.push(p.go_to(_goto), node_list)
-       end
-end
-private class ReduceAction1085
+private class ReduceAction1087
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -11028,7 +11428,7 @@ private class ReduceAction1085
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1086
+private class ReduceAction1088
        super ReduceAction
        redef fun action(p: Parser)
        do
@@ -11043,7 +11443,7 @@ private class ReduceAction1086
                                        p.push(p.go_to(_goto), node_list)
        end
 end
-private class ReduceAction1087
+private class ReduceAction1089
        super ReduceAction
        redef fun action(p: Parser)
        do
index c990bb8..b26e0f9 100644 (file)
@@ -426,7 +426,9 @@ class AStdClassdef
        var n_visibility: AVisibility is writable, noinit
        var n_classkind: AClasskind is writable, noinit
        var n_id: nullable TClassid = null is writable
+       var n_obra: nullable TObra = null is writable
        var n_formaldefs: List[AFormaldef] = new List[AFormaldef]
+       var n_cbra: nullable TCbra = null is writable
        var n_extern_code_block: nullable AExternCodeBlock = null is writable
        var n_propdefs: List[APropdef] = new List[APropdef]
        var n_kwend: TKwend is writable, noinit
@@ -475,9 +477,12 @@ class AAttrPropdef
        var n_kwvar: TKwvar is writable, noinit
        var n_id2: TId is writable, noinit
        var n_type: nullable AType = null is writable
+       var n_assign: nullable TAssign = null is writable
        var n_expr: nullable AExpr = null is writable
        var n_annotations: nullable AAnnotations = null is writable
+       var n_kwdo: nullable TKwdo = null is writable
        var n_block: nullable AExpr = null is writable
+       var n_kwend: nullable TKwend = null is writable
 end
 class AMainMethPropdef
        super APropdef
@@ -507,7 +512,9 @@ class AMethPropdef
        var n_annotations: nullable AAnnotations = null is writable
        var n_extern_calls: nullable AExternCalls = null is writable
        var n_extern_code_block: nullable AExternCodeBlock = null is writable
+       var n_kwdo: nullable TKwdo = null is writable
        var n_block: nullable AExpr = null is writable
+       var n_kwend: nullable TKwend = null is writable
 end
 class ASuperPropdef
        super APropdef
@@ -643,7 +650,9 @@ class AType
        super AType
        var n_kwnullable: nullable TKwnullable = null is writable
        var n_id: TClassid is writable, noinit
+       var n_obra: nullable TObra = null is writable
        var n_types: List[AType] = new List[AType]
+       var n_cbra: nullable TCbra = null is writable
        var n_annotations: nullable AAnnotations = null is writable
 end
 class ALabel
@@ -694,7 +703,9 @@ class AIfExpr
        super AExpr
        var n_kwif: TKwif is writable, noinit
        var n_expr: AExpr is writable, noinit
+       var n_kwthen: TKwthen is writable, noinit
        var n_then: nullable AExpr = null is writable
+       var n_kwelse: nullable TKwelse = null is writable
        var n_else: nullable AExpr = null is writable
 end
 class AIfexprExpr
@@ -724,6 +735,7 @@ class AForExpr
        super AExpr
        var n_kwfor: TKwfor is writable, noinit
        var n_ids: List[TId] = new List[TId]
+       var n_kwin: TKwin is writable, noinit
        var n_expr: AExpr is writable, noinit
        var n_kwdo: TKwdo is writable, noinit
        var n_block: nullable AExpr = null is writable
@@ -742,6 +754,7 @@ class AAssertExpr
        var n_kwassert: TKwassert is writable, noinit
        var n_id: nullable TId = null is writable
        var n_expr: AExpr is writable, noinit
+       var n_kwelse: nullable TKwelse = null is writable
        var n_else: nullable AExpr = null is writable
 end
 class AOnceExpr
@@ -1022,6 +1035,7 @@ class ACrangeExpr
        super AExpr
        var n_obra: TObra is writable, noinit
        var n_expr: AExpr is writable, noinit
+       var n_dotdot: TDotdot is writable, noinit
        var n_expr2: AExpr is writable, noinit
        var n_cbra: TCbra is writable, noinit
        var n_annotations: nullable AAnnotations = null is writable
@@ -1030,6 +1044,7 @@ class AOrangeExpr
        super AExpr
        var n_obra: TObra is writable, noinit
        var n_expr: AExpr is writable, noinit
+       var n_dotdot: TDotdot is writable, noinit
        var n_expr2: AExpr is writable, noinit
        var n_cbra: TObra is writable, noinit
        var n_annotations: nullable AAnnotations = null is writable
@@ -1305,10 +1320,12 @@ class ADoc
 end
 class AAnnotations
        super AAnnotations
+       var n_kwis: nullable TKwis = null is writable
        var n_at: nullable TAt = null is writable
        var n_opar: nullable TOpar = null is writable
        var n_items: List[AAnnotation] = new List[AAnnotation]
        var n_cpar: nullable TCpar = null is writable
+       var n_kwend: nullable TKwend = null is writable
 end
 class AAnnotation
        super AAnnotation
index 8c7b941..fe79ef1 100644 (file)
@@ -1142,9 +1142,15 @@ class AStdClassdef
        # The name of the class
        var n_id: nullable TClassid = null is writable
 
+       # The `[` symbol
+       var n_obra: nullable TObra = null is writable
+
        # The list of formal parameter types
        var n_formaldefs = new ANodes[AFormaldef](self)
 
+       # The `]` symbol
+       var n_cbra: nullable TCbra = null is writable
+
        # The extern block code
        var n_extern_code_block: nullable AExternCodeBlock = null is writable
 
@@ -1240,21 +1246,30 @@ end
 class AAttrPropdef
        super APropdef
 
-       # The identifier for a old-style attribute (null if new-style)
+       # The `var` keyword
        var n_kwvar: TKwvar is writable, noinit
 
-       # The identifier for a new-style attribute (null if old-style)
+       # The identifier for a new-style attribute
        var n_id2: TId is writable, noinit
 
        # The declared type of the attribute
        var n_type: nullable AType = null is writable
 
+       # The `=` symbol
+       var n_assign: nullable TAssign = null is writable
+
        # The initial value, if any (set with `=`)
        var n_expr: nullable AExpr = null is writable
 
+       # The `do` keyword
+       var n_kwdo: nullable TKwdo = null is writable
+
        # The initial value, if any (set with `do return`)
        var n_block: nullable AExpr = null is writable
 
+       # The `end` keyword
+       var n_kwend: nullable TKwend = null is writable
+
        redef fun hot_location
        do
                return n_id2.location
@@ -1280,9 +1295,15 @@ class AMethPropdef
        # The signature of the method, if any
        var n_signature: nullable ASignature = null is writable
 
+       # The `do` keyword
+       var n_kwdo: nullable TKwdo = null is writable
+
        # The body (in Nit) of the method, if any
        var n_block: nullable AExpr = null is writable
 
+       # The `end` keyword
+       var n_kwend: nullable TKwend = null is writable
+
        # The list of declared callbacks (for extern methods)
        var n_extern_calls: nullable AExternCalls = null is writable
 
@@ -1643,8 +1664,14 @@ class AType
        # The name of the class or of the formal type
        var n_id: TClassid is writable, noinit
 
+       # The opening bracket
+       var n_obra: nullable TObra = null is writable
+
        # Type arguments for a generic type
        var n_types = new ANodes[AType](self)
+
+       # The closing bracket
+       var n_cbra: nullable TCbra = null is writable
 end
 
 # A label at the end of a block or in a break/continue statement. eg `label x`
@@ -1771,9 +1798,15 @@ class AIfExpr
        # The expression used as the condition of the `if`
        var n_expr: AExpr is writable, noinit
 
+       # The `then` keyword
+       var n_kwthen: TKwthen is writable, noinit
+
        # The body of the `then` part
        var n_then: nullable AExpr = null is writable
 
+       # The `else` keyword
+       var n_kwelse: nullable TKwelse = null is writable
+
        # The body of the `else` part
        var n_else: nullable AExpr = null is writable
 end
@@ -1842,6 +1875,9 @@ class AForExpr
        # The list of name of the automatic variables
        var n_ids = new ANodes[TId](self)
 
+       # The `in` keyword
+       var n_kwin: TKwin is writable, noinit
+
        # The expression used as the collection to iterate on
        var n_expr: AExpr is writable, noinit
 
@@ -1883,6 +1919,9 @@ class AAssertExpr
        # The expression used as the condition of the `assert`
        var n_expr: AExpr is writable, noinit
 
+       # The `else` keyword
+       var n_kwelse: nullable TKwelse = null is writable
+
        # The body to execute when the assert fails
        var n_else: nullable AExpr = null is writable
 end
@@ -2319,7 +2358,10 @@ abstract class ARangeExpr
        # The left (lower) element of the range
        var n_expr: AExpr is writable, noinit
 
-       # The right (uppr) element of the range
+       # The `..`
+       var n_dotdot: TDotdot is writable, noinit
+
+       # The right (upper) element of the range
        var n_expr2: AExpr is writable, noinit
 end
 
@@ -2802,6 +2844,9 @@ end
 class AAnnotations
        super Prod
 
+       # The `is` keyword, for *is* annotations
+       var n_kwis: nullable TKwis = null is writable
+
        # The `@` symbol, for *at* annotations
        var n_at: nullable TAt = null is writable
 
@@ -2813,6 +2858,9 @@ class AAnnotations
 
        # The closing parenthesis in *at* annotations
        var n_cpar: nullable TCpar = null is writable
+
+       # The `end` keyword, for *is* annotations
+       var n_kwend: nullable TKwend = null is writable
 end
 
 # A single annotation
index 12175cf..8743717 100644 (file)
@@ -387,7 +387,9 @@ redef class AStdClassdef
                n_visibility: nullable AVisibility,
                n_classkind: nullable AClasskind,
                n_id: nullable TClassid,
+               n_obra: nullable TObra,
                n_formaldefs: Collection[Object], # Should be Collection[AFormaldef]
+               n_cbra: nullable TCbra,
                n_extern_code_block: nullable AExternCodeBlock,
                n_propdefs: Collection[Object], # Should be Collection[APropdef]
                n_kwend: nullable TKwend
@@ -403,7 +405,11 @@ redef class AStdClassdef
                n_classkind.parent = self
                _n_id = n_id
                if n_id != null then n_id.parent = self
+               _n_obra = n_obra
+               if n_obra != null then n_obra.parent = self
                self.n_formaldefs.unsafe_add_all(n_formaldefs)
+               _n_cbra = n_cbra
+               if n_cbra != null then n_cbra.parent = self
                _n_extern_code_block = n_extern_code_block
                if n_extern_code_block != null then n_extern_code_block.parent = self
                self.n_propdefs.unsafe_add_all(n_propdefs)
@@ -433,7 +439,15 @@ redef class AStdClassdef
                        n_id = new_child.as(nullable TClassid)
                        return
                end
+               if _n_obra == old_child then
+                       n_obra = new_child.as(nullable TObra)
+                       return
+               end
                if n_formaldefs.replace_child(old_child, new_child) then return
+               if _n_cbra == old_child then
+                       n_cbra = new_child.as(nullable TCbra)
+                       return
+               end
                if _n_extern_code_block == old_child then
                        n_extern_code_block = new_child.as(nullable AExternCodeBlock)
                        return
@@ -470,6 +484,16 @@ redef class AStdClassdef
                _n_id = node
                if node != null then node.parent = self
        end
+       redef fun n_obra=(node)
+       do
+               _n_obra = node
+               if node != null then node.parent = self
+       end
+       redef fun n_cbra=(node)
+       do
+               _n_cbra = node
+               if node != null then node.parent = self
+       end
        redef fun n_extern_code_block=(node)
        do
                _n_extern_code_block = node
@@ -489,7 +513,9 @@ redef class AStdClassdef
                v.enter_visit(_n_visibility)
                v.enter_visit(_n_classkind)
                v.enter_visit(_n_id)
+               v.enter_visit(_n_obra)
                n_formaldefs.visit_all(v)
+               v.enter_visit(_n_cbra)
                v.enter_visit(_n_extern_code_block)
                n_propdefs.visit_all(v)
                v.enter_visit(_n_kwend)
@@ -769,9 +795,12 @@ redef class AAttrPropdef
                n_kwvar: nullable TKwvar,
                n_id2: nullable TId,
                n_type: nullable AType,
+               n_assign: nullable TAssign,
                n_expr: nullable AExpr,
                n_annotations: nullable AAnnotations,
-               n_block: nullable AExpr
+               n_kwdo: nullable TKwdo,
+               n_block: nullable AExpr,
+               n_kwend: nullable TKwend
        )
        do
                _n_doc = n_doc
@@ -786,12 +815,18 @@ redef class AAttrPropdef
                n_id2.parent = self
                _n_type = n_type
                if n_type != null then n_type.parent = self
+               _n_assign = n_assign
+               if n_assign != null then n_assign.parent = self
                _n_expr = n_expr
                if n_expr != null then n_expr.parent = self
                _n_annotations = n_annotations
                if n_annotations != null then n_annotations.parent = self
+               _n_kwdo = n_kwdo
+               if n_kwdo != null then n_kwdo.parent = self
                _n_block = n_block
                if n_block != null then n_block.parent = self
+               _n_kwend = n_kwend
+               if n_kwend != null then n_kwend.parent = self
        end
 
        redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -820,6 +855,10 @@ redef class AAttrPropdef
                        n_type = new_child.as(nullable AType)
                        return
                end
+               if _n_assign == old_child then
+                       n_assign = new_child.as(nullable TAssign)
+                       return
+               end
                if _n_expr == old_child then
                        n_expr = new_child.as(nullable AExpr)
                        return
@@ -828,10 +867,18 @@ redef class AAttrPropdef
                        n_annotations = new_child.as(nullable AAnnotations)
                        return
                end
+               if _n_kwdo == old_child then
+                       n_kwdo = new_child.as(nullable TKwdo)
+                       return
+               end
                if _n_block == old_child then
                        n_block = new_child.as(nullable AExpr)
                        return
                end
+               if _n_kwend == old_child then
+                       n_kwend = new_child.as(nullable TKwend)
+                       return
+               end
        end
 
        redef fun n_doc=(node)
@@ -864,6 +911,11 @@ redef class AAttrPropdef
                _n_type = node
                if node != null then node.parent = self
        end
+       redef fun n_assign=(node)
+       do
+               _n_assign = node
+               if node != null then node.parent = self
+       end
        redef fun n_expr=(node)
        do
                _n_expr = node
@@ -874,11 +926,21 @@ redef class AAttrPropdef
                _n_annotations = node
                if node != null then node.parent = self
        end
+       redef fun n_kwdo=(node)
+       do
+               _n_kwdo = node
+               if node != null then node.parent = self
+       end
        redef fun n_block=(node)
        do
                _n_block = node
                if node != null then node.parent = self
        end
+       redef fun n_kwend=(node)
+       do
+               _n_kwend = node
+               if node != null then node.parent = self
+       end
 
 
        redef fun visit_all(v: Visitor)
@@ -889,9 +951,12 @@ redef class AAttrPropdef
                v.enter_visit(_n_kwvar)
                v.enter_visit(_n_id2)
                v.enter_visit(_n_type)
+               v.enter_visit(_n_assign)
                v.enter_visit(_n_expr)
                v.enter_visit(_n_annotations)
+               v.enter_visit(_n_kwdo)
                v.enter_visit(_n_block)
+               v.enter_visit(_n_kwend)
        end
 end
 redef class AMainMethPropdef
@@ -1056,7 +1121,9 @@ redef class AMethPropdef
                n_annotations: nullable AAnnotations,
                n_extern_calls: nullable AExternCalls,
                n_extern_code_block: nullable AExternCodeBlock,
-               n_block: nullable AExpr
+               n_kwdo: nullable TKwdo,
+               n_block: nullable AExpr,
+               n_kwend: nullable TKwend
        )
        do
                _n_doc = n_doc
@@ -1081,8 +1148,12 @@ redef class AMethPropdef
                if n_extern_calls != null then n_extern_calls.parent = self
                _n_extern_code_block = n_extern_code_block
                if n_extern_code_block != null then n_extern_code_block.parent = self
+               _n_kwdo = n_kwdo
+               if n_kwdo != null then n_kwdo.parent = self
                _n_block = n_block
                if n_block != null then n_block.parent = self
+               _n_kwend = n_kwend
+               if n_kwend != null then n_kwend.parent = self
        end
 
        redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -1131,10 +1202,18 @@ redef class AMethPropdef
                        n_extern_code_block = new_child.as(nullable AExternCodeBlock)
                        return
                end
+               if _n_kwdo == old_child then
+                       n_kwdo = new_child.as(nullable TKwdo)
+                       return
+               end
                if _n_block == old_child then
                        n_block = new_child.as(nullable AExpr)
                        return
                end
+               if _n_kwend == old_child then
+                       n_kwend = new_child.as(nullable TKwend)
+                       return
+               end
        end
 
        redef fun n_doc=(node)
@@ -1192,11 +1271,21 @@ redef class AMethPropdef
                _n_extern_code_block = node
                if node != null then node.parent = self
        end
+       redef fun n_kwdo=(node)
+       do
+               _n_kwdo = node
+               if node != null then node.parent = self
+       end
        redef fun n_block=(node)
        do
                _n_block = node
                if node != null then node.parent = self
        end
+       redef fun n_kwend=(node)
+       do
+               _n_kwend = node
+               if node != null then node.parent = self
+       end
 
 
        redef fun visit_all(v: Visitor)
@@ -1212,7 +1301,9 @@ redef class AMethPropdef
                v.enter_visit(_n_annotations)
                v.enter_visit(_n_extern_calls)
                v.enter_visit(_n_extern_code_block)
+               v.enter_visit(_n_kwdo)
                v.enter_visit(_n_block)
+               v.enter_visit(_n_kwend)
        end
 end
 redef class ASuperPropdef
@@ -2270,7 +2361,9 @@ redef class AType
        init init_atype (
                n_kwnullable: nullable TKwnullable,
                n_id: nullable TClassid,
+               n_obra: nullable TObra,
                n_types: Collection[Object], # Should be Collection[AType]
+               n_cbra: nullable TCbra,
                n_annotations: nullable AAnnotations
        )
        do
@@ -2278,7 +2371,11 @@ redef class AType
                if n_kwnullable != null then n_kwnullable.parent = self
                _n_id = n_id.as(not null)
                n_id.parent = self
+               _n_obra = n_obra
+               if n_obra != null then n_obra.parent = self
                self.n_types.unsafe_add_all(n_types)
+               _n_cbra = n_cbra
+               if n_cbra != null then n_cbra.parent = self
                _n_annotations = n_annotations
                if n_annotations != null then n_annotations.parent = self
        end
@@ -2293,7 +2390,15 @@ redef class AType
                        n_id = new_child.as(TClassid)
                        return
                end
+               if _n_obra == old_child then
+                       n_obra = new_child.as(nullable TObra)
+                       return
+               end
                if n_types.replace_child(old_child, new_child) then return
+               if _n_cbra == old_child then
+                       n_cbra = new_child.as(nullable TCbra)
+                       return
+               end
                if _n_annotations == old_child then
                        n_annotations = new_child.as(nullable AAnnotations)
                        return
@@ -2310,6 +2415,16 @@ redef class AType
                _n_id = node
                node.parent = self
        end
+       redef fun n_obra=(node)
+       do
+               _n_obra = node
+               if node != null then node.parent = self
+       end
+       redef fun n_cbra=(node)
+       do
+               _n_cbra = node
+               if node != null then node.parent = self
+       end
        redef fun n_annotations=(node)
        do
                _n_annotations = node
@@ -2321,7 +2436,9 @@ redef class AType
        do
                v.enter_visit(_n_kwnullable)
                v.enter_visit(_n_id)
+               v.enter_visit(_n_obra)
                n_types.visit_all(v)
+               v.enter_visit(_n_cbra)
                v.enter_visit(_n_annotations)
        end
 end
@@ -2708,7 +2825,9 @@ redef class AIfExpr
        init init_aifexpr (
                n_kwif: nullable TKwif,
                n_expr: nullable AExpr,
+               n_kwthen: nullable TKwthen,
                n_then: nullable AExpr,
+               n_kwelse: nullable TKwelse,
                n_else: nullable AExpr
        )
        do
@@ -2716,8 +2835,12 @@ redef class AIfExpr
                n_kwif.parent = self
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_kwthen = n_kwthen.as(not null)
+               n_kwthen.parent = self
                _n_then = n_then
                if n_then != null then n_then.parent = self
+               _n_kwelse = n_kwelse
+               if n_kwelse != null then n_kwelse.parent = self
                _n_else = n_else
                if n_else != null then n_else.parent = self
        end
@@ -2732,10 +2855,18 @@ redef class AIfExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_kwthen == old_child then
+                       n_kwthen = new_child.as(TKwthen)
+                       return
+               end
                if _n_then == old_child then
                        n_then = new_child.as(nullable AExpr)
                        return
                end
+               if _n_kwelse == old_child then
+                       n_kwelse = new_child.as(nullable TKwelse)
+                       return
+               end
                if _n_else == old_child then
                        n_else = new_child.as(nullable AExpr)
                        return
@@ -2752,11 +2883,21 @@ redef class AIfExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_kwthen=(node)
+       do
+               _n_kwthen = node
+               node.parent = self
+       end
        redef fun n_then=(node)
        do
                _n_then = node
                if node != null then node.parent = self
        end
+       redef fun n_kwelse=(node)
+       do
+               _n_kwelse = node
+               if node != null then node.parent = self
+       end
        redef fun n_else=(node)
        do
                _n_else = node
@@ -2768,7 +2909,9 @@ redef class AIfExpr
        do
                v.enter_visit(_n_kwif)
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_kwthen)
                v.enter_visit(_n_then)
+               v.enter_visit(_n_kwelse)
                v.enter_visit(_n_else)
        end
 end
@@ -3006,6 +3149,7 @@ redef class AForExpr
        init init_aforexpr (
                n_kwfor: nullable TKwfor,
                n_ids: Collection[Object], # Should be Collection[TId]
+               n_kwin: nullable TKwin,
                n_expr: nullable AExpr,
                n_kwdo: nullable TKwdo,
                n_block: nullable AExpr,
@@ -3015,6 +3159,8 @@ redef class AForExpr
                _n_kwfor = n_kwfor.as(not null)
                n_kwfor.parent = self
                self.n_ids.unsafe_add_all(n_ids)
+               _n_kwin = n_kwin.as(not null)
+               n_kwin.parent = self
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
                _n_kwdo = n_kwdo.as(not null)
@@ -3032,6 +3178,10 @@ redef class AForExpr
                        return
                end
                if n_ids.replace_child(old_child, new_child) then return
+               if _n_kwin == old_child then
+                       n_kwin = new_child.as(TKwin)
+                       return
+               end
                if _n_expr == old_child then
                        n_expr = new_child.as(AExpr)
                        return
@@ -3055,6 +3205,11 @@ redef class AForExpr
                _n_kwfor = node
                node.parent = self
        end
+       redef fun n_kwin=(node)
+       do
+               _n_kwin = node
+               node.parent = self
+       end
        redef fun n_expr=(node)
        do
                _n_expr = node
@@ -3081,6 +3236,7 @@ redef class AForExpr
        do
                v.enter_visit(_n_kwfor)
                n_ids.visit_all(v)
+               v.enter_visit(_n_kwin)
                v.enter_visit(_n_expr)
                v.enter_visit(_n_kwdo)
                v.enter_visit(_n_block)
@@ -3173,6 +3329,7 @@ redef class AAssertExpr
                n_kwassert: nullable TKwassert,
                n_id: nullable TId,
                n_expr: nullable AExpr,
+               n_kwelse: nullable TKwelse,
                n_else: nullable AExpr
        )
        do
@@ -3182,6 +3339,8 @@ redef class AAssertExpr
                if n_id != null then n_id.parent = self
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_kwelse = n_kwelse
+               if n_kwelse != null then n_kwelse.parent = self
                _n_else = n_else
                if n_else != null then n_else.parent = self
        end
@@ -3200,6 +3359,10 @@ redef class AAssertExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_kwelse == old_child then
+                       n_kwelse = new_child.as(nullable TKwelse)
+                       return
+               end
                if _n_else == old_child then
                        n_else = new_child.as(nullable AExpr)
                        return
@@ -3221,6 +3384,11 @@ redef class AAssertExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_kwelse=(node)
+       do
+               _n_kwelse = node
+               if node != null then node.parent = self
+       end
        redef fun n_else=(node)
        do
                _n_else = node
@@ -3233,6 +3401,7 @@ redef class AAssertExpr
                v.enter_visit(_n_kwassert)
                v.enter_visit(_n_id)
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_kwelse)
                v.enter_visit(_n_else)
        end
 end
@@ -5744,6 +5913,7 @@ redef class ACrangeExpr
        init init_acrangeexpr (
                n_obra: nullable TObra,
                n_expr: nullable AExpr,
+               n_dotdot: nullable TDotdot,
                n_expr2: nullable AExpr,
                n_cbra: nullable TCbra,
                n_annotations: nullable AAnnotations
@@ -5753,6 +5923,8 @@ redef class ACrangeExpr
                n_obra.parent = self
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_dotdot = n_dotdot.as(not null)
+               n_dotdot.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
                _n_cbra = n_cbra.as(not null)
@@ -5771,6 +5943,10 @@ redef class ACrangeExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_dotdot == old_child then
+                       n_dotdot = new_child.as(TDotdot)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -5795,6 +5971,11 @@ redef class ACrangeExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_dotdot=(node)
+       do
+               _n_dotdot = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -5816,6 +5997,7 @@ redef class ACrangeExpr
        do
                v.enter_visit(_n_obra)
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_dotdot)
                v.enter_visit(_n_expr2)
                v.enter_visit(_n_cbra)
                v.enter_visit(_n_annotations)
@@ -5825,6 +6007,7 @@ redef class AOrangeExpr
        init init_aorangeexpr (
                n_obra: nullable TObra,
                n_expr: nullable AExpr,
+               n_dotdot: nullable TDotdot,
                n_expr2: nullable AExpr,
                n_cbra: nullable TObra,
                n_annotations: nullable AAnnotations
@@ -5834,6 +6017,8 @@ redef class AOrangeExpr
                n_obra.parent = self
                _n_expr = n_expr.as(not null)
                n_expr.parent = self
+               _n_dotdot = n_dotdot.as(not null)
+               n_dotdot.parent = self
                _n_expr2 = n_expr2.as(not null)
                n_expr2.parent = self
                _n_cbra = n_cbra.as(not null)
@@ -5852,6 +6037,10 @@ redef class AOrangeExpr
                        n_expr = new_child.as(AExpr)
                        return
                end
+               if _n_dotdot == old_child then
+                       n_dotdot = new_child.as(TDotdot)
+                       return
+               end
                if _n_expr2 == old_child then
                        n_expr2 = new_child.as(AExpr)
                        return
@@ -5876,6 +6065,11 @@ redef class AOrangeExpr
                _n_expr = node
                node.parent = self
        end
+       redef fun n_dotdot=(node)
+       do
+               _n_dotdot = node
+               node.parent = self
+       end
        redef fun n_expr2=(node)
        do
                _n_expr2 = node
@@ -5897,6 +6091,7 @@ redef class AOrangeExpr
        do
                v.enter_visit(_n_obra)
                v.enter_visit(_n_expr)
+               v.enter_visit(_n_dotdot)
                v.enter_visit(_n_expr2)
                v.enter_visit(_n_cbra)
                v.enter_visit(_n_annotations)
@@ -8067,12 +8262,16 @@ redef class ADoc
 end
 redef class AAnnotations
        init init_aannotations (
+               n_kwis: nullable TKwis,
                n_at: nullable TAt,
                n_opar: nullable TOpar,
                n_items: Collection[Object], # Should be Collection[AAnnotation]
-               n_cpar: nullable TCpar
+               n_cpar: nullable TCpar,
+               n_kwend: nullable TKwend
        )
        do
+               _n_kwis = n_kwis
+               if n_kwis != null then n_kwis.parent = self
                _n_at = n_at
                if n_at != null then n_at.parent = self
                _n_opar = n_opar
@@ -8080,10 +8279,16 @@ redef class AAnnotations
                self.n_items.unsafe_add_all(n_items)
                _n_cpar = n_cpar
                if n_cpar != null then n_cpar.parent = self
+               _n_kwend = n_kwend
+               if n_kwend != null then n_kwend.parent = self
        end
 
        redef fun replace_child(old_child: ANode, new_child: nullable ANode)
        do
+               if _n_kwis == old_child then
+                       n_kwis = new_child.as(nullable TKwis)
+                       return
+               end
                if _n_at == old_child then
                        n_at = new_child.as(nullable TAt)
                        return
@@ -8097,8 +8302,17 @@ redef class AAnnotations
                        n_cpar = new_child.as(nullable TCpar)
                        return
                end
+               if _n_kwend == old_child then
+                       n_kwend = new_child.as(nullable TKwend)
+                       return
+               end
        end
 
+       redef fun n_kwis=(node)
+       do
+               _n_kwis = node
+               if node != null then node.parent = self
+       end
        redef fun n_at=(node)
        do
                _n_at = node
@@ -8114,14 +8328,21 @@ redef class AAnnotations
                _n_cpar = node
                if node != null then node.parent = self
        end
+       redef fun n_kwend=(node)
+       do
+               _n_kwend = node
+               if node != null then node.parent = self
+       end
 
 
        redef fun visit_all(v: Visitor)
        do
+               v.enter_visit(_n_kwis)
                v.enter_visit(_n_at)
                v.enter_visit(_n_opar)
                n_items.visit_all(v)
                v.enter_visit(_n_cpar)
+               v.enter_visit(_n_kwend)
        end
 end
 redef class AAnnotation
index 5ee56d3..eb77663 100644 (file)
@@ -2290,25 +2290,25 @@ const int lexer_accept_table[] = {
 
 static int parser_action_row1[] = {
        7,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       28, 1, 485,
+       28, 1, 487,
        95, 0, 3,
-       109, 1, 485,
+       109, 1, 487,
        110, 1, 22
 };
 static int parser_action_row2[] = {
        1,
-       -1, 1, 487
+       -1, 1, 489
 };
 static int parser_action_row3[] = {
        1,
-       -1, 1, 1086
+       -1, 1, 1088
 };
 static int parser_action_row4[] = {
        4,
-       -1, 1, 475,
+       -1, 1, 477,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
@@ -2320,21 +2320,21 @@ static int parser_action_row5[] = {
 };
 static int parser_action_row6[] = {
        7,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       28, 1, 485,
+       28, 1, 487,
        95, 0, 3,
-       109, 1, 485,
+       109, 1, 487,
        110, 1, 22
 };
 static int parser_action_row7[] = {
        1,
-       -1, 1, 1052
+       -1, 1, 1054
 };
 static int parser_action_row8[] = {
        1,
-       -1, 1, 1056
+       -1, 1, 1058
 };
 static int parser_action_row9[] = {
        1,
@@ -2350,16 +2350,16 @@ static int parser_action_row11[] = {
 };
 static int parser_action_row12[] = {
        1,
-       -1, 1, 1054
+       -1, 1, 1056
 };
 static int parser_action_row13[] = {
        2,
-       -1, 1, 484,
+       -1, 1, 486,
        110, 1, 23
 };
 static int parser_action_row14[] = {
        33,
-       -1, 1, 28,
+       -1, 1, 30,
        12, 0, 31,
        13, 0, 32,
        15, 0, 33,
@@ -2374,7 +2374,7 @@ static int parser_action_row14[] = {
        36, 0, 42,
        37, 0, 43,
        38, 0, 44,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -2385,7 +2385,7 @@ static int parser_action_row14[] = {
        54, 0, 52,
        96, 0, 53,
        97, 0, 54,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -2401,7 +2401,7 @@ static int parser_action_row15[] = {
 };
 static int parser_action_row16[] = {
        1,
-       -1, 1, 1088
+       -1, 1, 1090
 };
 static int parser_action_row17[] = {
        4,
@@ -2412,31 +2412,31 @@ static int parser_action_row17[] = {
 };
 static int parser_action_row18[] = {
        1,
-       -1, 1, 486
+       -1, 1, 488
 };
 static int parser_action_row19[] = {
        7,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       28, 1, 485,
+       28, 1, 487,
        95, 0, 3,
-       109, 1, 485,
+       109, 1, 487,
        110, 1, 22
 };
 static int parser_action_row20[] = {
        7,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       28, 1, 485,
+       28, 1, 487,
        95, 0, 3,
-       109, 1, 485,
+       109, 1, 487,
        110, 1, 22
 };
 static int parser_action_row21[] = {
        5,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3,
@@ -2444,38 +2444,38 @@ static int parser_action_row21[] = {
 };
 static int parser_action_row22[] = {
        7,
-       -1, 1, 472,
+       -1, 1, 474,
        0, 0, 102,
        1, 0, 103,
-       9, 1, 1049,
-       28, 1, 1049,
+       9, 1, 1051,
+       28, 1, 1051,
        95, 0, 104,
-       109, 1, 1049
+       109, 1, 1051
 };
 static int parser_action_row23[] = {
        7,
-       -1, 1, 474,
+       -1, 1, 476,
        0, 0, 1,
        1, 0, 2,
-       9, 1, 1051,
-       28, 1, 1051,
+       9, 1, 1053,
+       28, 1, 1053,
        95, 0, 105,
-       109, 1, 1051
+       109, 1, 1053
 };
 static int parser_action_row24[] = {
        1,
-       -1, 1, 479
+       -1, 1, 481
 };
 static int parser_action_row25[] = {
        4,
-       -1, 1, 472,
+       -1, 1, 474,
        0, 0, 102,
        1, 0, 103,
        95, 0, 104
 };
 static int parser_action_row26[] = {
        4,
-       -1, 1, 474,
+       -1, 1, 476,
        0, 0, 1,
        1, 0, 2,
        95, 0, 105
@@ -2486,7 +2486,7 @@ static int parser_action_row27[] = {
 };
 static int parser_action_row28[] = {
        33,
-       -1, 1, 28,
+       -1, 1, 30,
        12, 0, 31,
        13, 0, 32,
        15, 0, 33,
@@ -2501,7 +2501,7 @@ static int parser_action_row28[] = {
        36, 0, 42,
        37, 0, 43,
        38, 0, 44,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -2512,7 +2512,7 @@ static int parser_action_row28[] = {
        54, 0, 52,
        96, 0, 53,
        97, 0, 54,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -2522,27 +2522,27 @@ static int parser_action_row28[] = {
 };
 static int parser_action_row29[] = {
        7,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       28, 1, 485,
+       28, 1, 487,
        95, 0, 3,
-       109, 1, 485,
+       109, 1, 487,
        110, 1, 22
 };
 static int parser_action_row30[] = {
        7,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       28, 1, 485,
+       28, 1, 487,
        95, 0, 3,
-       109, 1, 485,
+       109, 1, 487,
        110, 1, 22
 };
 static int parser_action_row31[] = {
        5,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3,
@@ -2550,27 +2550,27 @@ static int parser_action_row31[] = {
 };
 static int parser_action_row32[] = {
        27,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 349,
-       73, 1, 349,
+       54, 1, 353,
+       73, 1, 353,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -2580,11 +2580,11 @@ static int parser_action_row32[] = {
 };
 static int parser_action_row33[] = {
        1,
-       -1, 1, 29
+       -1, 1, 31
 };
 static int parser_action_row34[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 157,
@@ -2626,19 +2626,19 @@ static int parser_action_row35[] = {
 };
 static int parser_action_row36[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row37[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row38[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 157,
@@ -2675,19 +2675,19 @@ static int parser_action_row38[] = {
 };
 static int parser_action_row39[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row40[] = {
        26,
-       -1, 1, 167,
+       -1, 1, 169,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -2700,7 +2700,7 @@ static int parser_action_row40[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -2710,21 +2710,21 @@ static int parser_action_row40[] = {
 };
 static int parser_action_row41[] = {
        2,
-       -1, 1, 172,
+       -1, 1, 174,
        49, 0, 197
 };
 static int parser_action_row42[] = {
        2,
-       -1, 1, 169,
+       -1, 1, 171,
        49, 0, 197
 };
 static int parser_action_row43[] = {
        1,
-       -1, 1, 171
+       -1, 1, 173
 };
 static int parser_action_row44[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -2751,33 +2751,33 @@ static int parser_action_row44[] = {
 };
 static int parser_action_row45[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row46[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row47[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row48[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row49[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row50[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -2788,13 +2788,13 @@ static int parser_action_row51[] = {
 };
 static int parser_action_row52[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row53[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -2805,20 +2805,20 @@ static int parser_action_row54[] = {
 };
 static int parser_action_row55[] = {
        40,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 337,
+       54, 1, 341,
        58, 0, 215,
        59, 0, 216,
        60, 0, 217,
@@ -2832,13 +2832,13 @@ static int parser_action_row55[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 337,
+       73, 1, 341,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -2848,36 +2848,36 @@ static int parser_action_row55[] = {
 };
 static int parser_action_row56[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row57[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row58[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row59[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row60[] = {
        1,
-       -1, 1, 393
+       -1, 1, 397
 };
 static int parser_action_row61[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row62[] = {
        5,
-       -1, 1, 79,
+       -1, 1, 81,
        18, 0, 236,
        19, 0, 237,
        20, 0, 238,
@@ -2893,46 +2893,46 @@ static int parser_action_row64[] = {
 };
 static int parser_action_row65[] = {
        4,
-       -1, 1, 158,
+       -1, 1, 160,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
 static int parser_action_row66[] = {
        1,
-       -1, 1, 165
+       -1, 1, 167
 };
 static int parser_action_row67[] = {
        1,
-       -1, 1, 166
+       -1, 1, 168
 };
 static int parser_action_row68[] = {
        1,
-       -1, 1, 174
+       -1, 1, 176
 };
 static int parser_action_row69[] = {
        1,
-       -1, 1, 175
+       -1, 1, 177
 };
 static int parser_action_row70[] = {
        1,
-       -1, 1, 177
+       -1, 1, 179
 };
 static int parser_action_row71[] = {
        1,
-       -1, 1, 176
+       -1, 1, 178
 };
 static int parser_action_row72[] = {
        1,
-       -1, 1, 178
+       -1, 1, 180
 };
 static int parser_action_row73[] = {
        1,
-       -1, 1, 179
+       -1, 1, 181
 };
 static int parser_action_row74[] = {
        1,
-       -1, 1, 180
+       -1, 1, 182
 };
 static int parser_action_row75[] = {
        3,
@@ -2942,15 +2942,15 @@ static int parser_action_row75[] = {
 };
 static int parser_action_row76[] = {
        1,
-       -1, 1, 325
+       -1, 1, 329
 };
 static int parser_action_row77[] = {
        1,
-       -1, 1, 375
+       -1, 1, 379
 };
 static int parser_action_row78[] = {
        1,
-       -1, 1, 374
+       -1, 1, 378
 };
 static int parser_action_row79[] = {
        3,
@@ -2960,7 +2960,7 @@ static int parser_action_row79[] = {
 };
 static int parser_action_row80[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -2972,30 +2972,30 @@ static int parser_action_row81[] = {
 };
 static int parser_action_row82[] = {
        1,
-       -1, 1, 1084
+       -1, 1, 1086
 };
 static int parser_action_row83[] = {
        3,
-       -1, 1, 453,
+       -1, 1, 455,
        12, 0, 256,
        97, 0, 257
 };
 static int parser_action_row84[] = {
        4,
-       -1, 1, 455,
+       -1, 1, 457,
        12, 0, 258,
        96, 0, 53,
        97, 0, 259
 };
 static int parser_action_row85[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row86[] = {
        1,
-       -1, 1, 139
+       -1, 1, 141
 };
 static int parser_action_row87[] = {
        2,
@@ -3004,19 +3004,19 @@ static int parser_action_row87[] = {
 };
 static int parser_action_row88[] = {
        1,
-       -1, 1, 143
+       -1, 1, 145
 };
 static int parser_action_row89[] = {
        1,
-       -1, 1, 470
+       -1, 1, 472
 };
 static int parser_action_row90[] = {
        1,
-       -1, 1, 469
+       -1, 1, 471
 };
 static int parser_action_row91[] = {
        1,
-       -1, 1, 471
+       -1, 1, 473
 };
 static int parser_action_row92[] = {
        1,
@@ -3024,7 +3024,7 @@ static int parser_action_row92[] = {
 };
 static int parser_action_row93[] = {
        1,
-       -1, 1, 1053
+       -1, 1, 1055
 };
 static int parser_action_row94[] = {
        1,
@@ -3032,17 +3032,17 @@ static int parser_action_row94[] = {
 };
 static int parser_action_row95[] = {
        7,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       28, 1, 485,
+       28, 1, 487,
        95, 0, 3,
-       109, 1, 485,
+       109, 1, 487,
        110, 1, 22
 };
 static int parser_action_row96[] = {
        5,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3,
@@ -3054,11 +3054,11 @@ static int parser_action_row97[] = {
 };
 static int parser_action_row98[] = {
        1,
-       -1, 1, 1055
+       -1, 1, 1057
 };
 static int parser_action_row99[] = {
        33,
-       -1, 1, 28,
+       -1, 1, 30,
        12, 0, 31,
        13, 0, 32,
        15, 0, 33,
@@ -3073,7 +3073,7 @@ static int parser_action_row99[] = {
        36, 0, 42,
        37, 0, 43,
        38, 0, 44,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -3084,7 +3084,7 @@ static int parser_action_row99[] = {
        54, 0, 52,
        96, 0, 53,
        97, 0, 54,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -3094,7 +3094,7 @@ static int parser_action_row99[] = {
 };
 static int parser_action_row100[] = {
        5,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3,
@@ -3102,7 +3102,7 @@ static int parser_action_row100[] = {
 };
 static int parser_action_row101[] = {
        1,
-       -1, 1, 1057
+       -1, 1, 1059
 };
 static int parser_action_row102[] = {
        1,
@@ -3110,50 +3110,50 @@ static int parser_action_row102[] = {
 };
 static int parser_action_row103[] = {
        1,
-       -1, 1, 488
+       -1, 1, 490
 };
 static int parser_action_row104[] = {
        1,
-       -1, 1, 1087
+       -1, 1, 1089
 };
 static int parser_action_row105[] = {
        4,
-       -1, 1, 477,
+       -1, 1, 479,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
 static int parser_action_row106[] = {
        4,
-       -1, 1, 476,
+       -1, 1, 478,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
 static int parser_action_row107[] = {
        1,
-       -1, 1, 1089
+       -1, 1, 1091
 };
 static int parser_action_row108[] = {
        7,
-       -1, 1, 473,
+       -1, 1, 475,
        0, 0, 102,
        1, 0, 103,
-       9, 1, 1050,
-       28, 1, 1050,
+       9, 1, 1052,
+       28, 1, 1052,
        95, 0, 271,
-       109, 1, 1050
+       109, 1, 1052
 };
 static int parser_action_row109[] = {
        4,
-       -1, 1, 473,
+       -1, 1, 475,
        0, 0, 102,
        1, 0, 103,
        95, 0, 271
 };
 static int parser_action_row110[] = {
        5,
-       -1, 1, 79,
+       -1, 1, 81,
        18, 0, 236,
        19, 0, 237,
        20, 0, 238,
@@ -3165,17 +3165,17 @@ static int parser_action_row111[] = {
 };
 static int parser_action_row112[] = {
        7,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       28, 1, 485,
+       28, 1, 487,
        95, 0, 3,
-       109, 1, 485,
+       109, 1, 487,
        110, 1, 22
 };
 static int parser_action_row113[] = {
        5,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3,
@@ -3187,7 +3187,7 @@ static int parser_action_row114[] = {
 };
 static int parser_action_row115[] = {
        5,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3,
@@ -3199,56 +3199,56 @@ static int parser_action_row116[] = {
 };
 static int parser_action_row117[] = {
        2,
-       -1, 1, 766,
+       -1, 1, 768,
        52, 0, 277
 };
 static int parser_action_row118[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row119[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row120[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row121[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row122[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row123[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row124[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row125[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row126[] = {
        15,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 287,
        42, 0, 121,
@@ -3266,13 +3266,13 @@ static int parser_action_row126[] = {
 };
 static int parser_action_row127[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row128[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -3297,7 +3297,7 @@ static int parser_action_row128[] = {
 };
 static int parser_action_row129[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -3322,7 +3322,7 @@ static int parser_action_row129[] = {
 };
 static int parser_action_row130[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -3347,46 +3347,46 @@ static int parser_action_row130[] = {
 };
 static int parser_action_row131[] = {
        3,
-       -1, 1, 754,
+       -1, 1, 756,
        52, 0, 277,
        58, 0, 215
 };
 static int parser_action_row132[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row133[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row134[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row135[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row136[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row137[] = {
        1,
-       -1, 1, 791
+       -1, 1, 793
 };
 static int parser_action_row138[] = {
        1,
-       -1, 1, 348
+       -1, 1, 352
 };
 static int parser_action_row139[] = {
        1,
-       -1, 1, 191
+       -1, 1, 193
 };
 static int parser_action_row140[] = {
        3,
@@ -3396,31 +3396,31 @@ static int parser_action_row140[] = {
 };
 static int parser_action_row141[] = {
        2,
-       -1, 1, 453,
+       -1, 1, 455,
        97, 0, 302
 };
 static int parser_action_row142[] = {
        1,
-       -1, 1, 438
+       -1, 1, 440
 };
 static int parser_action_row143[] = {
        4,
-       -1, 1, 696,
+       -1, 1, 698,
        29, 0, 303,
        30, 0, 304,
        32, 0, 305
 };
 static int parser_action_row144[] = {
        1,
-       -1, 1, 698
+       -1, 1, 700
 };
 static int parser_action_row145[] = {
        1,
-       -1, 1, 703
+       -1, 1, 705
 };
 static int parser_action_row146[] = {
        10,
-       -1, 1, 705,
+       -1, 1, 707,
        39, 0, 306,
        80, 0, 307,
        84, 0, 308,
@@ -3433,78 +3433,78 @@ static int parser_action_row146[] = {
 };
 static int parser_action_row147[] = {
        2,
-       -1, 1, 714,
+       -1, 1, 716,
        81, 0, 315
 };
 static int parser_action_row148[] = {
        2,
-       -1, 1, 716,
+       -1, 1, 718,
        82, 0, 316
 };
 static int parser_action_row149[] = {
        3,
-       -1, 1, 718,
+       -1, 1, 720,
        88, 0, 317,
        91, 0, 318
 };
 static int parser_action_row150[] = {
        3,
-       -1, 1, 720,
+       -1, 1, 722,
        74, 0, 319,
        75, 0, 320
 };
 static int parser_action_row151[] = {
        4,
-       -1, 1, 723,
+       -1, 1, 725,
        76, 0, 321,
        78, 0, 322,
        79, 0, 323
 };
 static int parser_action_row152[] = {
        1,
-       -1, 1, 726
+       -1, 1, 728
 };
 static int parser_action_row153[] = {
        2,
-       -1, 1, 730,
+       -1, 1, 732,
        77, 0, 324
 };
 static int parser_action_row154[] = {
        1,
-       -1, 1, 732
+       -1, 1, 734
 };
 static int parser_action_row155[] = {
        3,
-       -1, 1, 737,
+       -1, 1, 739,
        54, 0, 244,
        73, 0, 325
 };
 static int parser_action_row156[] = {
        1,
-       -1, 1, 742
+       -1, 1, 744
 };
 static int parser_action_row157[] = {
        3,
-       -1, 1, 455,
+       -1, 1, 457,
        96, 0, 53,
        97, 0, 327
 };
 static int parser_action_row158[] = {
        2,
-       -1, 1, 156,
-       49, 1, 979
+       -1, 1, 158,
+       49, 1, 981
 };
 static int parser_action_row159[] = {
        1,
-       -1, 1, 255
+       -1, 1, 257
 };
 static int parser_action_row160[] = {
        1,
-       -1, 1, 157
+       -1, 1, 159
 };
 static int parser_action_row161[] = {
        31,
-       -1, 1, 456,
+       -1, 1, 458,
        9, 0, 329,
        12, 0, 31,
        15, 0, 33,
@@ -3543,13 +3543,13 @@ static int parser_action_row162[] = {
 };
 static int parser_action_row163[] = {
        3,
-       -1, 1, 153,
+       -1, 1, 155,
        57, 0, 333,
        94, 0, 204
 };
 static int parser_action_row164[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -3576,19 +3576,19 @@ static int parser_action_row164[] = {
 };
 static int parser_action_row165[] = {
        3,
-       -1, 1, 1049,
+       -1, 1, 1051,
        0, 0, 102,
        1, 0, 103
 };
 static int parser_action_row166[] = {
        3,
-       -1, 1, 1051,
+       -1, 1, 1053,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row167[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -3615,7 +3615,7 @@ static int parser_action_row167[] = {
 };
 static int parser_action_row168[] = {
        1,
-       -1, 1, 264
+       -1, 1, 268
 };
 static int parser_action_row169[] = {
        2,
@@ -3630,36 +3630,36 @@ static int parser_action_row170[] = {
 };
 static int parser_action_row171[] = {
        2,
-       -1, 1, 349,
+       -1, 1, 353,
        52, 0, 277
 };
 static int parser_action_row172[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row173[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row174[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row175[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row176[] = {
        17,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 44,
        42, 0, 45,
@@ -3679,7 +3679,7 @@ static int parser_action_row176[] = {
 };
 static int parser_action_row177[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -3704,7 +3704,7 @@ static int parser_action_row177[] = {
 };
 static int parser_action_row178[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -3729,7 +3729,7 @@ static int parser_action_row178[] = {
 };
 static int parser_action_row179[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -3754,32 +3754,32 @@ static int parser_action_row179[] = {
 };
 static int parser_action_row180[] = {
        3,
-       -1, 1, 337,
+       -1, 1, 341,
        52, 0, 277,
        58, 0, 215
 };
 static int parser_action_row181[] = {
        1,
-       -1, 1, 168
+       -1, 1, 170
 };
 static int parser_action_row182[] = {
        4,
-       -1, 1, 279,
+       -1, 1, 283,
        29, 0, 354,
        30, 0, 355,
        32, 0, 356
 };
 static int parser_action_row183[] = {
        1,
-       -1, 1, 281
+       -1, 1, 285
 };
 static int parser_action_row184[] = {
        1,
-       -1, 1, 286
+       -1, 1, 290
 };
 static int parser_action_row185[] = {
        10,
-       -1, 1, 288,
+       -1, 1, 292,
        39, 0, 357,
        80, 0, 358,
        84, 0, 359,
@@ -3792,49 +3792,49 @@ static int parser_action_row185[] = {
 };
 static int parser_action_row186[] = {
        2,
-       -1, 1, 297,
+       -1, 1, 301,
        81, 0, 366
 };
 static int parser_action_row187[] = {
        2,
-       -1, 1, 299,
+       -1, 1, 303,
        82, 0, 367
 };
 static int parser_action_row188[] = {
        3,
-       -1, 1, 301,
+       -1, 1, 305,
        88, 0, 368,
        91, 0, 369
 };
 static int parser_action_row189[] = {
        3,
-       -1, 1, 303,
+       -1, 1, 307,
        74, 0, 370,
        75, 0, 371
 };
 static int parser_action_row190[] = {
        4,
-       -1, 1, 306,
+       -1, 1, 310,
        76, 0, 372,
        78, 0, 373,
        79, 0, 374
 };
 static int parser_action_row191[] = {
        1,
-       -1, 1, 309
+       -1, 1, 313
 };
 static int parser_action_row192[] = {
        2,
-       -1, 1, 313,
+       -1, 1, 317,
        77, 0, 375
 };
 static int parser_action_row193[] = {
        1,
-       -1, 1, 315
+       -1, 1, 319
 };
 static int parser_action_row194[] = {
        3,
-       -1, 1, 320,
+       -1, 1, 324,
        54, 0, 244,
        73, 0, 376
 };
@@ -3846,38 +3846,38 @@ static int parser_action_row195[] = {
 };
 static int parser_action_row196[] = {
        2,
-       -1, 1, 453,
+       -1, 1, 455,
        97, 0, 380
 };
 static int parser_action_row197[] = {
        3,
-       -1, 1, 455,
+       -1, 1, 457,
        96, 0, 53,
        97, 0, 381
 };
 static int parser_action_row198[] = {
        2,
-       -1, 1, 199,
+       -1, 1, 201,
        97, 0, 383
 };
 static int parser_action_row199[] = {
        1,
-       -1, 1, 173
+       -1, 1, 175
 };
 static int parser_action_row200[] = {
        1,
-       -1, 1, 170
+       -1, 1, 172
 };
 static int parser_action_row201[] = {
        4,
-       -1, 1, 337,
+       -1, 1, 341,
        52, 0, 277,
        57, 0, 384,
        58, 0, 215
 };
 static int parser_action_row202[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -3904,7 +3904,7 @@ static int parser_action_row202[] = {
 };
 static int parser_action_row203[] = {
        2,
-       -1, 1, 276,
+       -1, 1, 280,
        24, 0, 386
 };
 static int parser_action_row204[] = {
@@ -3915,33 +3915,33 @@ static int parser_action_row204[] = {
 };
 static int parser_action_row205[] = {
        3,
-       -1, 1, 28,
+       -1, 1, 30,
        13, 0, 32,
        52, 0, 390
 };
 static int parser_action_row206[] = {
        1,
-       -1, 1, 400
+       -1, 1, 404
 };
 static int parser_action_row207[] = {
        1,
-       -1, 1, 365
+       -1, 1, 369
 };
 static int parser_action_row208[] = {
        1,
-       -1, 1, 366
+       -1, 1, 370
 };
 static int parser_action_row209[] = {
        1,
-       -1, 1, 367
+       -1, 1, 371
 };
 static int parser_action_row210[] = {
        1,
-       -1, 1, 368
+       -1, 1, 372
 };
 static int parser_action_row211[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -3974,7 +3974,7 @@ static int parser_action_row212[] = {
 };
 static int parser_action_row213[] = {
        54,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        15, 0, 33,
        16, 0, 34,
@@ -4031,7 +4031,7 @@ static int parser_action_row213[] = {
 };
 static int parser_action_row214[] = {
        25,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 446,
        27, 0, 447,
@@ -4059,19 +4059,19 @@ static int parser_action_row214[] = {
 };
 static int parser_action_row215[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row216[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row217[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -4098,51 +4098,51 @@ static int parser_action_row217[] = {
 };
 static int parser_action_row218[] = {
        1,
-       -1, 1, 243
+       -1, 1, 245
 };
 static int parser_action_row219[] = {
        1,
-       -1, 1, 244
+       -1, 1, 246
 };
 static int parser_action_row220[] = {
        1,
-       -1, 1, 245
+       -1, 1, 247
 };
 static int parser_action_row221[] = {
        1,
-       -1, 1, 246
+       -1, 1, 248
 };
 static int parser_action_row222[] = {
        1,
-       -1, 1, 247
+       -1, 1, 249
 };
 static int parser_action_row223[] = {
        1,
-       -1, 1, 248
+       -1, 1, 250
 };
 static int parser_action_row224[] = {
        1,
-       -1, 1, 249
+       -1, 1, 251
 };
 static int parser_action_row225[] = {
        1,
-       -1, 1, 250
+       -1, 1, 252
 };
 static int parser_action_row226[] = {
        1,
-       -1, 1, 251
+       -1, 1, 253
 };
 static int parser_action_row227[] = {
        1,
-       -1, 1, 252
+       -1, 1, 254
 };
 static int parser_action_row228[] = {
        1,
-       -1, 1, 253
+       -1, 1, 255
 };
 static int parser_action_row229[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -4169,7 +4169,7 @@ static int parser_action_row229[] = {
 };
 static int parser_action_row230[] = {
        13,
-       -1, 1, 336,
+       -1, 1, 340,
        59, 0, 455,
        60, 0, 217,
        61, 0, 218,
@@ -4185,49 +4185,49 @@ static int parser_action_row230[] = {
 };
 static int parser_action_row231[] = {
        1,
-       -1, 1, 185
+       -1, 1, 187
 };
 static int parser_action_row232[] = {
        1,
-       -1, 1, 369
+       -1, 1, 373
 };
 static int parser_action_row233[] = {
        1,
-       -1, 1, 370
+       -1, 1, 374
 };
 static int parser_action_row234[] = {
        1,
-       -1, 1, 371
+       -1, 1, 375
 };
 static int parser_action_row235[] = {
        1,
-       -1, 1, 373
+       -1, 1, 377
 };
 static int parser_action_row236[] = {
        1,
-       -1, 1, 372
+       -1, 1, 376
 };
 static int parser_action_row237[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row238[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row239[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row240[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -4245,11 +4245,11 @@ static int parser_action_row241[] = {
 };
 static int parser_action_row242[] = {
        1,
-       -1, 1, 1068
+       -1, 1, 1072
 };
 static int parser_action_row243[] = {
        32,
-       -1, 1, 160,
+       -1, 1, 162,
        12, 0, 31,
        15, 0, 33,
        16, 0, 34,
@@ -4263,7 +4263,7 @@ static int parser_action_row243[] = {
        36, 0, 42,
        37, 0, 43,
        38, 0, 44,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -4274,7 +4274,7 @@ static int parser_action_row243[] = {
        54, 0, 52,
        96, 0, 53,
        97, 0, 54,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -4284,26 +4284,26 @@ static int parser_action_row243[] = {
 };
 static int parser_action_row244[] = {
        4,
-       -1, 1, 159,
+       -1, 1, 161,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
 static int parser_action_row245[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row246[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row247[] = {
        13,
-       -1, 1, 350,
+       -1, 1, 354,
        59, 0, 475,
        60, 0, 217,
        61, 0, 218,
@@ -4319,25 +4319,25 @@ static int parser_action_row247[] = {
 };
 static int parser_action_row248[] = {
        1,
-       -1, 1, 396
+       -1, 1, 400
 };
 static int parser_action_row249[] = {
        1,
-       -1, 1, 397
+       -1, 1, 401
 };
 static int parser_action_row250[] = {
        1,
-       -1, 1, 1074
+       -1, 1, 1078
 };
 static int parser_action_row251[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row252[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row253[] = {
@@ -4348,7 +4348,7 @@ static int parser_action_row253[] = {
 };
 static int parser_action_row254[] = {
        26,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -4371,33 +4371,33 @@ static int parser_action_row254[] = {
        101, 0, 57,
        102, 0, 58,
        103, 0, 59,
-       104, 1, 392,
-       105, 1, 392,
+       104, 1, 396,
+       105, 1, 396,
        106, 0, 60
 };
 static int parser_action_row255[] = {
        27,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 345,
-       73, 1, 345,
+       54, 1, 349,
+       73, 1, 349,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -4407,7 +4407,7 @@ static int parser_action_row255[] = {
 };
 static int parser_action_row256[] = {
        13,
-       -1, 1, 327,
+       -1, 1, 331,
        59, 0, 484,
        60, 0, 217,
        61, 0, 218,
@@ -4423,13 +4423,13 @@ static int parser_action_row256[] = {
 };
 static int parser_action_row257[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -4441,7 +4441,7 @@ static int parser_action_row257[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -4451,20 +4451,20 @@ static int parser_action_row257[] = {
 };
 static int parser_action_row258[] = {
        39,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 339,
+       54, 1, 343,
        59, 0, 488,
        60, 0, 217,
        61, 0, 218,
@@ -4477,13 +4477,13 @@ static int parser_action_row258[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 339,
+       73, 1, 343,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -4493,13 +4493,13 @@ static int parser_action_row258[] = {
 };
 static int parser_action_row259[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -4511,7 +4511,7 @@ static int parser_action_row259[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -4521,20 +4521,20 @@ static int parser_action_row259[] = {
 };
 static int parser_action_row260[] = {
        40,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 343,
+       54, 1, 347,
        58, 0, 215,
        59, 0, 493,
        60, 0, 217,
@@ -4548,13 +4548,13 @@ static int parser_action_row260[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 343,
+       73, 1, 347,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -4564,11 +4564,11 @@ static int parser_action_row260[] = {
 };
 static int parser_action_row261[] = {
        1,
-       -1, 1, 1085
+       -1, 1, 1087
 };
 static int parser_action_row262[] = {
        3,
-       -1, 1, 454,
+       -1, 1, 456,
        12, 0, 497,
        97, 0, 498
 };
@@ -4579,7 +4579,7 @@ static int parser_action_row263[] = {
 };
 static int parser_action_row264[] = {
        1,
-       -1, 1, 140
+       -1, 1, 142
 };
 static int parser_action_row265[] = {
        1,
@@ -4587,7 +4587,7 @@ static int parser_action_row265[] = {
 };
 static int parser_action_row266[] = {
        5,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3,
@@ -4599,7 +4599,7 @@ static int parser_action_row267[] = {
 };
 static int parser_action_row268[] = {
        5,
-       -1, 1, 79,
+       -1, 1, 81,
        18, 0, 236,
        19, 0, 237,
        20, 0, 238,
@@ -4611,15 +4611,15 @@ static int parser_action_row269[] = {
 };
 static int parser_action_row270[] = {
        1,
-       -1, 1, 481
+       -1, 1, 483
 };
 static int parser_action_row271[] = {
        1,
-       -1, 1, 480
+       -1, 1, 482
 };
 static int parser_action_row272[] = {
        4,
-       -1, 1, 478,
+       -1, 1, 480,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
@@ -4641,7 +4641,7 @@ static int parser_action_row274[] = {
 };
 static int parser_action_row275[] = {
        5,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3,
@@ -4657,17 +4657,17 @@ static int parser_action_row277[] = {
 };
 static int parser_action_row278[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row279[] = {
        1,
-       -1, 1, 765
+       -1, 1, 767
 };
 static int parser_action_row280[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -4694,7 +4694,7 @@ static int parser_action_row280[] = {
 };
 static int parser_action_row281[] = {
        21,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        31, 0, 118,
        38, 0, 119,
@@ -4724,7 +4724,7 @@ static int parser_action_row282[] = {
 };
 static int parser_action_row283[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -4749,23 +4749,23 @@ static int parser_action_row283[] = {
 };
 static int parser_action_row284[] = {
        1,
-       -1, 1, 782
+       -1, 1, 784
 };
 static int parser_action_row285[] = {
        1,
-       -1, 1, 783
+       -1, 1, 785
 };
 static int parser_action_row286[] = {
        1,
-       -1, 1, 784
+       -1, 1, 786
 };
 static int parser_action_row287[] = {
        1,
-       -1, 1, 785
+       -1, 1, 787
 };
 static int parser_action_row288[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -4783,7 +4783,7 @@ static int parser_action_row290[] = {
 };
 static int parser_action_row291[] = {
        25,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -4811,217 +4811,217 @@ static int parser_action_row291[] = {
 };
 static int parser_action_row292[] = {
        1,
-       -1, 1, 734
+       -1, 1, 736
 };
 static int parser_action_row293[] = {
        1,
-       -1, 1, 733
+       -1, 1, 735
 };
 static int parser_action_row294[] = {
        1,
-       -1, 1, 735
+       -1, 1, 737
 };
 static int parser_action_row295[] = {
        1,
-       -1, 1, 753
+       -1, 1, 755
 };
 static int parser_action_row296[] = {
        1,
-       -1, 1, 786
+       -1, 1, 788
 };
 static int parser_action_row297[] = {
        1,
-       -1, 1, 787
+       -1, 1, 789
 };
 static int parser_action_row298[] = {
        1,
-       -1, 1, 788
+       -1, 1, 790
 };
 static int parser_action_row299[] = {
        1,
-       -1, 1, 790
+       -1, 1, 792
 };
 static int parser_action_row300[] = {
        1,
-       -1, 1, 789
+       -1, 1, 791
 };
 static int parser_action_row301[] = {
        2,
-       -1, 1, 762,
+       -1, 1, 764,
        52, 0, 277
 };
 static int parser_action_row302[] = {
        1,
-       -1, 1, 744
+       -1, 1, 746
 };
 static int parser_action_row303[] = {
        2,
-       -1, 1, 756,
+       -1, 1, 758,
        52, 0, 277
 };
 static int parser_action_row304[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row305[] = {
        4,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        24, 0, 520
 };
 static int parser_action_row306[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row307[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row308[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row309[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row310[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row311[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row312[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row313[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row314[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row315[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row316[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row317[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row318[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row319[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row320[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row321[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row322[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row323[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row324[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row325[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row326[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row327[] = {
        1,
-       -1, 1, 767
+       -1, 1, 769
 };
 static int parser_action_row328[] = {
        3,
-       -1, 1, 760,
+       -1, 1, 762,
        52, 0, 277,
        58, 0, 215
 };
 static int parser_action_row329[] = {
        2,
-       -1, 1, 454,
+       -1, 1, 456,
        97, 0, 544
 };
 static int parser_action_row330[] = {
        2,
-       -1, 1, 155,
-       49, 1, 978
+       -1, 1, 157,
+       49, 1, 980
 };
 static int parser_action_row331[] = {
        2,
-       -1, 1, 154,
-       49, 1, 977
+       -1, 1, 156,
+       49, 1, 979
 };
 static int parser_action_row332[] = {
        4,
@@ -5032,70 +5032,70 @@ static int parser_action_row332[] = {
 };
 static int parser_action_row333[] = {
        1,
-       -1, 1, 254
+       -1, 1, 256
 };
 static int parser_action_row334[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row335[] = {
        2,
-       -1, 1, 201,
+       -1, 1, 203,
        59, 0, 548
 };
 static int parser_action_row336[] = {
        2,
-       -1, 1, 153,
+       -1, 1, 155,
        57, 0, 333
 };
 static int parser_action_row337[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row338[] = {
        3,
-       -1, 1, 1050,
+       -1, 1, 1052,
        0, 0, 102,
        1, 0, 103
 };
 static int parser_action_row339[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row340[] = {
        1,
-       -1, 1, 263
+       -1, 1, 267
 };
 static int parser_action_row341[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row342[] = {
        1,
-       -1, 1, 447
+       -1, 1, 449
 };
 static int parser_action_row343[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row344[] = {
        2,
-       -1, 1, 446,
+       -1, 1, 448,
        56, 0, 554
 };
 static int parser_action_row345[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -5122,7 +5122,7 @@ static int parser_action_row345[] = {
 };
 static int parser_action_row346[] = {
        23,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        31, 0, 172,
        38, 0, 173,
@@ -5154,7 +5154,7 @@ static int parser_action_row347[] = {
 };
 static int parser_action_row348[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -5191,204 +5191,204 @@ static int parser_action_row350[] = {
 };
 static int parser_action_row351[] = {
        1,
-       -1, 1, 317
+       -1, 1, 321
 };
 static int parser_action_row352[] = {
        1,
-       -1, 1, 316
+       -1, 1, 320
 };
 static int parser_action_row353[] = {
        1,
-       -1, 1, 318
+       -1, 1, 322
 };
 static int parser_action_row354[] = {
        1,
-       -1, 1, 336
+       -1, 1, 340
 };
 static int parser_action_row355[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row356[] = {
        4,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        24, 0, 562
 };
 static int parser_action_row357[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row358[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row359[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row360[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row361[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row362[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row363[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row364[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row365[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row366[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row367[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row368[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row369[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row370[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row371[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row372[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row373[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row374[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row375[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row376[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row377[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row378[] = {
        1,
-       -1, 1, 350
+       -1, 1, 354
 };
 static int parser_action_row379[] = {
        2,
-       -1, 1, 345,
+       -1, 1, 349,
        52, 0, 277
 };
 static int parser_action_row380[] = {
        1,
-       -1, 1, 327
+       -1, 1, 331
 };
 static int parser_action_row381[] = {
        2,
-       -1, 1, 339,
+       -1, 1, 343,
        52, 0, 277
 };
 static int parser_action_row382[] = {
        3,
-       -1, 1, 343,
+       -1, 1, 347,
        52, 0, 277,
        58, 0, 215
 };
 static int parser_action_row383[] = {
        2,
-       -1, 1, 454,
+       -1, 1, 456,
        97, 0, 587
 };
 static int parser_action_row384[] = {
        1,
-       -1, 1, 200
+       -1, 1, 202
 };
 static int parser_action_row385[] = {
        1,
-       -1, 1, 278
+       -1, 1, 282
 };
 static int parser_action_row386[] = {
        2,
-       -1, 1, 277,
+       -1, 1, 281,
        24, 0, 588
 };
 static int parser_action_row387[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -5430,7 +5430,7 @@ static int parser_action_row388[] = {
 };
 static int parser_action_row389[] = {
        3,
-       -1, 1, 795,
+       -1, 1, 797,
        54, 0, 593,
        94, 0, 594
 };
@@ -5441,13 +5441,13 @@ static int parser_action_row390[] = {
 };
 static int parser_action_row391[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row392[] = {
        5,
-       -1, 1, 79,
+       -1, 1, 81,
        18, 0, 236,
        19, 0, 237,
        20, 0, 238,
@@ -5455,26 +5455,26 @@ static int parser_action_row392[] = {
 };
 static int parser_action_row393[] = {
        1,
-       -1, 1, 398
+       -1, 1, 402
 };
 static int parser_action_row394[] = {
        6,
-       -1, 1, 337,
+       -1, 1, 341,
        52, 0, 277,
        57, 0, 333,
        58, 0, 215,
-       59, 1, 153,
+       59, 1, 155,
        94, 0, 204
 };
 static int parser_action_row395[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row396[] = {
        1,
-       -1, 1, 273
+       -1, 1, 277
 };
 static int parser_action_row397[] = {
        2,
@@ -5483,7 +5483,7 @@ static int parser_action_row397[] = {
 };
 static int parser_action_row398[] = {
        3,
-       -1, 1, 401,
+       -1, 1, 405,
        54, 0, 604,
        94, 0, 204
 };
@@ -5494,13 +5494,13 @@ static int parser_action_row399[] = {
 };
 static int parser_action_row400[] = {
        26,
-       -1, 1, 985,
+       -1, 1, 987,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -5513,7 +5513,7 @@ static int parser_action_row400[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -5523,17 +5523,17 @@ static int parser_action_row400[] = {
 };
 static int parser_action_row401[] = {
        2,
-       -1, 1, 990,
+       -1, 1, 992,
        49, 0, 197
 };
 static int parser_action_row402[] = {
        2,
-       -1, 1, 987,
+       -1, 1, 989,
        49, 0, 197
 };
 static int parser_action_row403[] = {
        1,
-       -1, 1, 989
+       -1, 1, 991
 };
 static int parser_action_row404[] = {
        2,
@@ -5542,18 +5542,18 @@ static int parser_action_row404[] = {
 };
 static int parser_action_row405[] = {
        4,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        55, 0, 611
 };
 static int parser_action_row406[] = {
        24,
-       -1, 1, 496,
+       -1, 1, 498,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -5566,7 +5566,7 @@ static int parser_action_row406[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -5576,11 +5576,11 @@ static int parser_action_row406[] = {
 };
 static int parser_action_row407[] = {
        24,
-       -1, 1, 497,
+       -1, 1, 499,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -5593,7 +5593,7 @@ static int parser_action_row407[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -5603,39 +5603,39 @@ static int parser_action_row407[] = {
 };
 static int parser_action_row408[] = {
        1,
-       -1, 1, 498
+       -1, 1, 500
 };
 static int parser_action_row409[] = {
        1,
-       -1, 1, 499
+       -1, 1, 501
 };
 static int parser_action_row410[] = {
        1,
-       -1, 1, 500
+       -1, 1, 502
 };
 static int parser_action_row411[] = {
        1,
-       -1, 1, 501
+       -1, 1, 503
 };
 static int parser_action_row412[] = {
        1,
-       -1, 1, 502
+       -1, 1, 504
 };
 static int parser_action_row413[] = {
        1,
-       -1, 1, 503
+       -1, 1, 505
 };
 static int parser_action_row414[] = {
        1,
-       -1, 1, 504
+       -1, 1, 506
 };
 static int parser_action_row415[] = {
        24,
-       -1, 1, 505,
+       -1, 1, 507,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -5648,7 +5648,7 @@ static int parser_action_row415[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -5658,50 +5658,50 @@ static int parser_action_row415[] = {
 };
 static int parser_action_row416[] = {
        1,
-       -1, 1, 506
+       -1, 1, 508
 };
 static int parser_action_row417[] = {
        1,
-       -1, 1, 507
+       -1, 1, 509
 };
 static int parser_action_row418[] = {
        1,
-       -1, 1, 510
+       -1, 1, 512
 };
 static int parser_action_row419[] = {
        1,
-       -1, 1, 508
+       -1, 1, 510
 };
 static int parser_action_row420[] = {
        1,
-       -1, 1, 512
+       -1, 1, 514
 };
 static int parser_action_row421[] = {
        1,
-       -1, 1, 511
+       -1, 1, 513
 };
 static int parser_action_row422[] = {
        1,
-       -1, 1, 509
+       -1, 1, 511
 };
 static int parser_action_row423[] = {
        1,
-       -1, 1, 513
+       -1, 1, 515
 };
 static int parser_action_row424[] = {
        1,
-       -1, 1, 515
+       -1, 1, 517
 };
 static int parser_action_row425[] = {
        4,
-       -1, 1, 401,
+       -1, 1, 405,
        54, 0, 604,
        58, 0, 214,
        94, 0, 204
 };
 static int parser_action_row426[] = {
        15,
-       -1, 1, 337,
+       -1, 1, 341,
        52, 0, 277,
        58, 0, 215,
        59, 0, 612,
@@ -5719,63 +5719,63 @@ static int parser_action_row426[] = {
 };
 static int parser_action_row427[] = {
        1,
-       -1, 1, 426
+       -1, 1, 428
 };
 static int parser_action_row428[] = {
        1,
-       -1, 1, 983
+       -1, 1, 985
 };
 static int parser_action_row429[] = {
        1,
-       -1, 1, 984
+       -1, 1, 986
 };
 static int parser_action_row430[] = {
        1,
-       -1, 1, 992
+       -1, 1, 994
 };
 static int parser_action_row431[] = {
        1,
-       -1, 1, 994
+       -1, 1, 996
 };
 static int parser_action_row432[] = {
        1,
-       -1, 1, 993
+       -1, 1, 995
 };
 static int parser_action_row433[] = {
        1,
-       -1, 1, 995
+       -1, 1, 997
 };
 static int parser_action_row434[] = {
        1,
-       -1, 1, 996
+       -1, 1, 998
 };
 static int parser_action_row435[] = {
        1,
-       -1, 1, 997
+       -1, 1, 999
 };
 static int parser_action_row436[] = {
        1,
-       -1, 1, 427
+       -1, 1, 429
 };
 static int parser_action_row437[] = {
        3,
-       -1, 1, 320,
+       -1, 1, 324,
        54, 0, 244,
        73, 0, 613
 };
 static int parser_action_row438[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row439[] = {
        1,
-       -1, 1, 431
+       -1, 1, 433
 };
 static int parser_action_row440[] = {
        4,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        56, 0, 615
@@ -5788,7 +5788,7 @@ static int parser_action_row441[] = {
 };
 static int parser_action_row442[] = {
        22,
-       -1, 1, 453,
+       -1, 1, 455,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -5813,19 +5813,19 @@ static int parser_action_row442[] = {
 };
 static int parser_action_row443[] = {
        1,
-       -1, 1, 518
+       -1, 1, 520
 };
 static int parser_action_row444[] = {
        1,
-       -1, 1, 430
+       -1, 1, 432
 };
 static int parser_action_row445[] = {
        1,
-       -1, 1, 428
+       -1, 1, 430
 };
 static int parser_action_row446[] = {
        23,
-       -1, 1, 455,
+       -1, 1, 457,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -5851,51 +5851,51 @@ static int parser_action_row446[] = {
 };
 static int parser_action_row447[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row448[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row449[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row450[] = {
        2,
-       -1, 1, 153,
+       -1, 1, 155,
        57, 0, 333
 };
 static int parser_action_row451[] = {
        2,
-       -1, 1, 383,
+       -1, 1, 387,
        56, 0, 632
 };
 static int parser_action_row452[] = {
        1,
-       -1, 1, 466
+       -1, 1, 468
 };
 static int parser_action_row453[] = {
        1,
-       -1, 1, 465
+       -1, 1, 467
 };
 static int parser_action_row454[] = {
        1,
-       -1, 1, 216
+       -1, 1, 218
 };
 static int parser_action_row455[] = {
        1,
-       -1, 1, 235
+       -1, 1, 237
 };
 static int parser_action_row456[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -5922,7 +5922,7 @@ static int parser_action_row456[] = {
 };
 static int parser_action_row457[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -5949,35 +5949,35 @@ static int parser_action_row457[] = {
 };
 static int parser_action_row458[] = {
        1,
-       -1, 1, 80
+       -1, 1, 82
 };
 static int parser_action_row459[] = {
        1,
-       -1, 1, 82
+       -1, 1, 84
 };
 static int parser_action_row460[] = {
        1,
-       -1, 1, 81
+       -1, 1, 83
 };
 static int parser_action_row461[] = {
        1,
-       -1, 1, 83
+       -1, 1, 85
 };
 static int parser_action_row462[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row463[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row464[] = {
        1,
-       -1, 1, 30
+       -1, 1, 32
 };
 static int parser_action_row465[] = {
        2,
@@ -5986,11 +5986,11 @@ static int parser_action_row465[] = {
 };
 static int parser_action_row466[] = {
        1,
-       -1, 1, 32
+       -1, 1, 34
 };
 static int parser_action_row467[] = {
        1,
-       -1, 1, 33
+       -1, 1, 35
 };
 static int parser_action_row468[] = {
        23,
@@ -6025,21 +6025,21 @@ static int parser_action_row469[] = {
 };
 static int parser_action_row470[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row471[] = {
        1,
-       -1, 1, 164
+       -1, 1, 166
 };
 static int parser_action_row472[] = {
        1,
-       -1, 1, 1069
+       -1, 1, 1073
 };
 static int parser_action_row473[] = {
        32,
-       -1, 1, 161,
+       -1, 1, 163,
        12, 0, 31,
        15, 0, 33,
        16, 0, 34,
@@ -6053,7 +6053,7 @@ static int parser_action_row473[] = {
        36, 0, 42,
        37, 0, 43,
        38, 0, 44,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -6064,7 +6064,7 @@ static int parser_action_row473[] = {
        54, 0, 52,
        96, 0, 53,
        97, 0, 54,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -6074,7 +6074,7 @@ static int parser_action_row473[] = {
 };
 static int parser_action_row474[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6101,7 +6101,7 @@ static int parser_action_row474[] = {
 };
 static int parser_action_row475[] = {
        5,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 668,
        46, 0, 669,
        96, 0, 53,
@@ -6109,7 +6109,7 @@ static int parser_action_row475[] = {
 };
 static int parser_action_row476[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6136,7 +6136,7 @@ static int parser_action_row476[] = {
 };
 static int parser_action_row477[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6163,7 +6163,7 @@ static int parser_action_row477[] = {
 };
 static int parser_action_row478[] = {
        26,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6186,40 +6186,40 @@ static int parser_action_row478[] = {
        101, 0, 57,
        102, 0, 58,
        103, 0, 59,
-       104, 1, 395,
-       105, 1, 395,
+       104, 1, 399,
+       105, 1, 399,
        106, 0, 60
 };
 static int parser_action_row479[] = {
        1,
-       -1, 1, 389
+       -1, 1, 393
 };
 static int parser_action_row480[] = {
        1,
-       -1, 1, 1075
+       -1, 1, 1079
 };
 static int parser_action_row481[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row482[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row483[] = {
        1,
-       -1, 1, 344
+       -1, 1, 348
 };
 static int parser_action_row484[] = {
        1,
-       -1, 1, 189
+       -1, 1, 191
 };
 static int parser_action_row485[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6246,7 +6246,7 @@ static int parser_action_row485[] = {
 };
 static int parser_action_row486[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6273,17 +6273,17 @@ static int parser_action_row486[] = {
 };
 static int parser_action_row487[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row488[] = {
        1,
-       -1, 1, 195
+       -1, 1, 197
 };
 static int parser_action_row489[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6310,7 +6310,7 @@ static int parser_action_row489[] = {
 };
 static int parser_action_row490[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6337,7 +6337,7 @@ static int parser_action_row490[] = {
 };
 static int parser_action_row491[] = {
        13,
-       -1, 1, 338,
+       -1, 1, 342,
        59, 0, 684,
        60, 0, 217,
        61, 0, 218,
@@ -6353,15 +6353,15 @@ static int parser_action_row491[] = {
 };
 static int parser_action_row492[] = {
        1,
-       -1, 1, 186
+       -1, 1, 188
 };
 static int parser_action_row493[] = {
        1,
-       -1, 1, 197
+       -1, 1, 199
 };
 static int parser_action_row494[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6388,7 +6388,7 @@ static int parser_action_row494[] = {
 };
 static int parser_action_row495[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6415,7 +6415,7 @@ static int parser_action_row495[] = {
 };
 static int parser_action_row496[] = {
        13,
-       -1, 1, 342,
+       -1, 1, 346,
        59, 0, 688,
        60, 0, 217,
        61, 0, 218,
@@ -6431,17 +6431,17 @@ static int parser_action_row496[] = {
 };
 static int parser_action_row497[] = {
        1,
-       -1, 1, 188
+       -1, 1, 190
 };
 static int parser_action_row498[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -6453,7 +6453,7 @@ static int parser_action_row498[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -6463,20 +6463,20 @@ static int parser_action_row498[] = {
 };
 static int parser_action_row499[] = {
        39,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 341,
+       54, 1, 345,
        59, 0, 691,
        60, 0, 217,
        61, 0, 218,
@@ -6489,13 +6489,13 @@ static int parser_action_row499[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 341,
+       73, 1, 345,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -6505,7 +6505,7 @@ static int parser_action_row499[] = {
 };
 static int parser_action_row500[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -6525,7 +6525,7 @@ static int parser_action_row502[] = {
 };
 static int parser_action_row503[] = {
        1,
-       -1, 1, 482
+       -1, 1, 484
 };
 static int parser_action_row504[] = {
        1,
@@ -6533,7 +6533,7 @@ static int parser_action_row504[] = {
 };
 static int parser_action_row505[] = {
        25,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -6561,23 +6561,23 @@ static int parser_action_row505[] = {
 };
 static int parser_action_row506[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row507[] = {
        1,
-       -1, 1, 704
+       -1, 1, 706
 };
 static int parser_action_row508[] = {
        3,
-       -1, 1, 739,
+       -1, 1, 741,
        52, 0, 277,
        73, 0, 699
 };
 static int parser_action_row509[] = {
        1,
-       -1, 1, 736
+       -1, 1, 738
 };
 static int parser_action_row510[] = {
        3,
@@ -6587,43 +6587,43 @@ static int parser_action_row510[] = {
 };
 static int parser_action_row511[] = {
        3,
-       -1, 1, 741,
-       54, 1, 744,
-       73, 1, 744
+       -1, 1, 743,
+       54, 1, 746,
+       73, 1, 746
 };
 static int parser_action_row512[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row513[] = {
        9,
-       -1, 1, 436,
-       0, 1, 439,
-       1, 1, 439,
-       9, 1, 439,
-       24, 1, 439,
-       53, 1, 439,
-       56, 1, 439,
-       95, 1, 439,
-       110, 1, 439
+       -1, 1, 438,
+       0, 1, 441,
+       1, 1, 441,
+       9, 1, 441,
+       24, 1, 441,
+       53, 1, 441,
+       56, 1, 441,
+       95, 1, 441,
+       110, 1, 441
 };
 static int parser_action_row514[] = {
        4,
-       -1, 1, 337,
+       -1, 1, 341,
        52, 0, 277,
        58, 0, 215,
        59, 0, 703
 };
 static int parser_action_row515[] = {
        2,
-       -1, 1, 362,
+       -1, 1, 366,
        71, 0, 704
 };
 static int parser_action_row516[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -6634,15 +6634,15 @@ static int parser_action_row517[] = {
 };
 static int parser_action_row518[] = {
        1,
-       -1, 1, 761
+       -1, 1, 763
 };
 static int parser_action_row519[] = {
        1,
-       -1, 1, 755
+       -1, 1, 757
 };
 static int parser_action_row520[] = {
        21,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        31, 0, 118,
        38, 0, 119,
@@ -6666,13 +6666,13 @@ static int parser_action_row520[] = {
 };
 static int parser_action_row521[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row522[] = {
        21,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        31, 0, 118,
        38, 0, 119,
@@ -6696,7 +6696,7 @@ static int parser_action_row522[] = {
 };
 static int parser_action_row523[] = {
        21,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        31, 0, 118,
        38, 0, 119,
@@ -6726,7 +6726,7 @@ static int parser_action_row524[] = {
 };
 static int parser_action_row525[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6749,7 +6749,7 @@ static int parser_action_row525[] = {
 };
 static int parser_action_row526[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6772,7 +6772,7 @@ static int parser_action_row526[] = {
 };
 static int parser_action_row527[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6795,7 +6795,7 @@ static int parser_action_row527[] = {
 };
 static int parser_action_row528[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6818,7 +6818,7 @@ static int parser_action_row528[] = {
 };
 static int parser_action_row529[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6841,7 +6841,7 @@ static int parser_action_row529[] = {
 };
 static int parser_action_row530[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6864,7 +6864,7 @@ static int parser_action_row530[] = {
 };
 static int parser_action_row531[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6887,7 +6887,7 @@ static int parser_action_row531[] = {
 };
 static int parser_action_row532[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6910,7 +6910,7 @@ static int parser_action_row532[] = {
 };
 static int parser_action_row533[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6933,7 +6933,7 @@ static int parser_action_row533[] = {
 };
 static int parser_action_row534[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6956,7 +6956,7 @@ static int parser_action_row534[] = {
 };
 static int parser_action_row535[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -6979,7 +6979,7 @@ static int parser_action_row535[] = {
 };
 static int parser_action_row536[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -7002,7 +7002,7 @@ static int parser_action_row536[] = {
 };
 static int parser_action_row537[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -7025,7 +7025,7 @@ static int parser_action_row537[] = {
 };
 static int parser_action_row538[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -7048,7 +7048,7 @@ static int parser_action_row538[] = {
 };
 static int parser_action_row539[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -7071,7 +7071,7 @@ static int parser_action_row539[] = {
 };
 static int parser_action_row540[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -7094,7 +7094,7 @@ static int parser_action_row540[] = {
 };
 static int parser_action_row541[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -7117,7 +7117,7 @@ static int parser_action_row541[] = {
 };
 static int parser_action_row542[] = {
        20,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        38, 0, 119,
        40, 0, 120,
@@ -7140,7 +7140,7 @@ static int parser_action_row542[] = {
 };
 static int parser_action_row543[] = {
        5,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 730,
        46, 0, 731,
        96, 0, 53,
@@ -7148,16 +7148,16 @@ static int parser_action_row543[] = {
 };
 static int parser_action_row544[] = {
        1,
-       -1, 1, 759
+       -1, 1, 761
 };
 static int parser_action_row545[] = {
        2,
-       -1, 1, 758,
+       -1, 1, 760,
        52, 0, 277
 };
 static int parser_action_row546[] = {
        31,
-       -1, 1, 456,
+       -1, 1, 458,
        9, 0, 737,
        12, 0, 31,
        15, 0, 33,
@@ -7204,13 +7204,13 @@ static int parser_action_row548[] = {
 };
 static int parser_action_row549[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row550[] = {
        2,
-       -1, 1, 202,
+       -1, 1, 204,
        59, 0, 741
 };
 static int parser_action_row551[] = {
@@ -7235,45 +7235,45 @@ static int parser_action_row554[] = {
 };
 static int parser_action_row555[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row556[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row557[] = {
        1,
-       -1, 1, 287
+       -1, 1, 291
 };
 static int parser_action_row558[] = {
        3,
-       -1, 1, 322,
+       -1, 1, 326,
        52, 0, 277,
        73, 0, 597
 };
 static int parser_action_row559[] = {
        1,
-       -1, 1, 319
+       -1, 1, 323
 };
 static int parser_action_row560[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row561[] = {
        3,
-       -1, 1, 324,
-       54, 1, 327,
-       73, 1, 327
+       -1, 1, 328,
+       54, 1, 331,
+       73, 1, 331
 };
 static int parser_action_row562[] = {
        23,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        31, 0, 172,
        38, 0, 173,
@@ -7299,13 +7299,13 @@ static int parser_action_row562[] = {
 };
 static int parser_action_row563[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row564[] = {
        23,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        31, 0, 172,
        38, 0, 173,
@@ -7331,7 +7331,7 @@ static int parser_action_row564[] = {
 };
 static int parser_action_row565[] = {
        23,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        31, 0, 172,
        38, 0, 173,
@@ -7363,7 +7363,7 @@ static int parser_action_row566[] = {
 };
 static int parser_action_row567[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7388,7 +7388,7 @@ static int parser_action_row567[] = {
 };
 static int parser_action_row568[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7413,7 +7413,7 @@ static int parser_action_row568[] = {
 };
 static int parser_action_row569[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7438,7 +7438,7 @@ static int parser_action_row569[] = {
 };
 static int parser_action_row570[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7463,7 +7463,7 @@ static int parser_action_row570[] = {
 };
 static int parser_action_row571[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7488,7 +7488,7 @@ static int parser_action_row571[] = {
 };
 static int parser_action_row572[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7513,7 +7513,7 @@ static int parser_action_row572[] = {
 };
 static int parser_action_row573[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7538,7 +7538,7 @@ static int parser_action_row573[] = {
 };
 static int parser_action_row574[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7563,7 +7563,7 @@ static int parser_action_row574[] = {
 };
 static int parser_action_row575[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7588,7 +7588,7 @@ static int parser_action_row575[] = {
 };
 static int parser_action_row576[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7613,7 +7613,7 @@ static int parser_action_row576[] = {
 };
 static int parser_action_row577[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7638,7 +7638,7 @@ static int parser_action_row577[] = {
 };
 static int parser_action_row578[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7663,7 +7663,7 @@ static int parser_action_row578[] = {
 };
 static int parser_action_row579[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7688,7 +7688,7 @@ static int parser_action_row579[] = {
 };
 static int parser_action_row580[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7713,7 +7713,7 @@ static int parser_action_row580[] = {
 };
 static int parser_action_row581[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7738,7 +7738,7 @@ static int parser_action_row581[] = {
 };
 static int parser_action_row582[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7763,7 +7763,7 @@ static int parser_action_row582[] = {
 };
 static int parser_action_row583[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7788,7 +7788,7 @@ static int parser_action_row583[] = {
 };
 static int parser_action_row584[] = {
        22,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        38, 0, 173,
        40, 0, 174,
@@ -7813,7 +7813,7 @@ static int parser_action_row584[] = {
 };
 static int parser_action_row585[] = {
        5,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 773,
        46, 0, 669,
        96, 0, 53,
@@ -7821,20 +7821,20 @@ static int parser_action_row585[] = {
 };
 static int parser_action_row586[] = {
        1,
-       -1, 1, 338
+       -1, 1, 342
 };
 static int parser_action_row587[] = {
        1,
-       -1, 1, 342
+       -1, 1, 346
 };
 static int parser_action_row588[] = {
        2,
-       -1, 1, 341,
+       -1, 1, 345,
        52, 0, 277
 };
 static int parser_action_row589[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -7871,15 +7871,15 @@ static int parser_action_row589[] = {
 };
 static int parser_action_row590[] = {
        1,
-       -1, 1, 156
+       -1, 1, 158
 };
 static int parser_action_row591[] = {
        1,
-       -1, 1, 274
+       -1, 1, 278
 };
 static int parser_action_row592[] = {
        31,
-       -1, 1, 456,
+       -1, 1, 458,
        9, 0, 780,
        12, 0, 31,
        15, 0, 33,
@@ -7913,39 +7913,39 @@ static int parser_action_row592[] = {
 };
 static int parser_action_row593[] = {
        3,
-       -1, 1, 795,
+       -1, 1, 797,
        54, 0, 782,
        94, 0, 594
 };
 static int parser_action_row594[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row595[] = {
        3,
-       -1, 1, 28,
+       -1, 1, 30,
        13, 0, 32,
        52, 0, 785
 };
 static int parser_action_row596[] = {
        1,
-       -1, 1, 794
+       -1, 1, 796
 };
 static int parser_action_row597[] = {
        1,
-       -1, 1, 620
+       -1, 1, 622
 };
 static int parser_action_row598[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row599[] = {
        2,
-       -1, 1, 28,
+       -1, 1, 30,
        13, 0, 32
 };
 static int parser_action_row600[] = {
@@ -7962,7 +7962,7 @@ static int parser_action_row601[] = {
 };
 static int parser_action_row602[] = {
        2,
-       -1, 1, 153,
+       -1, 1, 155,
        57, 0, 333
 };
 static int parser_action_row603[] = {
@@ -7972,23 +7972,23 @@ static int parser_action_row603[] = {
 };
 static int parser_action_row604[] = {
        3,
-       -1, 1, 401,
+       -1, 1, 405,
        54, 0, 799,
        94, 0, 204
 };
 static int parser_action_row605[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row606[] = {
        1,
-       -1, 1, 144
+       -1, 1, 146
 };
 static int parser_action_row607[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8015,15 +8015,15 @@ static int parser_action_row607[] = {
 };
 static int parser_action_row608[] = {
        1,
-       -1, 1, 986
+       -1, 1, 988
 };
 static int parser_action_row609[] = {
        1,
-       -1, 1, 991
+       -1, 1, 993
 };
 static int parser_action_row610[] = {
        1,
-       -1, 1, 988
+       -1, 1, 990
 };
 static int parser_action_row611[] = {
        3,
@@ -8033,18 +8033,18 @@ static int parser_action_row611[] = {
 };
 static int parser_action_row612[] = {
        2,
-       -1, 1, 514,
+       -1, 1, 516,
        59, 0, 804
 };
 static int parser_action_row613[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -8057,7 +8057,7 @@ static int parser_action_row613[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -8067,7 +8067,7 @@ static int parser_action_row613[] = {
 };
 static int parser_action_row614[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -8078,13 +8078,13 @@ static int parser_action_row615[] = {
 };
 static int parser_action_row616[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row617[] = {
        1,
-       -1, 1, 1070
+       -1, 1, 1074
 };
 static int parser_action_row618[] = {
        2,
@@ -8093,7 +8093,7 @@ static int parser_action_row618[] = {
 };
 static int parser_action_row619[] = {
        2,
-       -1, 1, 381,
+       -1, 1, 385,
        56, 0, 615
 };
 static int parser_action_row620[] = {
@@ -8103,19 +8103,19 @@ static int parser_action_row620[] = {
 };
 static int parser_action_row621[] = {
        1,
-       -1, 1, 496
+       -1, 1, 498
 };
 static int parser_action_row622[] = {
        1,
-       -1, 1, 497
+       -1, 1, 499
 };
 static int parser_action_row623[] = {
        1,
-       -1, 1, 505
+       -1, 1, 507
 };
 static int parser_action_row624[] = {
        14,
-       -1, 1, 339,
+       -1, 1, 343,
        52, 0, 277,
        59, 0, 810,
        60, 0, 217,
@@ -8132,11 +8132,11 @@ static int parser_action_row624[] = {
 };
 static int parser_action_row625[] = {
        1,
-       -1, 1, 519
+       -1, 1, 521
 };
 static int parser_action_row626[] = {
        15,
-       -1, 1, 343,
+       -1, 1, 347,
        52, 0, 277,
        58, 0, 215,
        59, 0, 811,
@@ -8154,7 +8154,7 @@ static int parser_action_row626[] = {
 };
 static int parser_action_row627[] = {
        22,
-       -1, 1, 454,
+       -1, 1, 456,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -8179,11 +8179,11 @@ static int parser_action_row627[] = {
 };
 static int parser_action_row628[] = {
        1,
-       -1, 1, 521
+       -1, 1, 523
 };
 static int parser_action_row629[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8216,7 +8216,7 @@ static int parser_action_row630[] = {
 };
 static int parser_action_row631[] = {
        2,
-       -1, 1, 386,
+       -1, 1, 390,
        72, 0, 816
 };
 static int parser_action_row632[] = {
@@ -8226,26 +8226,26 @@ static int parser_action_row632[] = {
 };
 static int parser_action_row633[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row634[] = {
        1,
-       -1, 1, 1072
+       -1, 1, 1076
 };
 static int parser_action_row635[] = {
        2,
-       -1, 1, 384,
+       -1, 1, 388,
        56, 0, 632
 };
 static int parser_action_row636[] = {
        1,
-       -1, 1, 215
+       -1, 1, 217
 };
 static int parser_action_row637[] = {
        1,
-       -1, 1, 234
+       -1, 1, 236
 };
 static int parser_action_row638[] = {
        3,
@@ -8262,7 +8262,7 @@ static int parser_action_row639[] = {
 };
 static int parser_action_row640[] = {
        1,
-       -1, 1, 31
+       -1, 1, 33
 };
 static int parser_action_row641[] = {
        2,
@@ -8271,93 +8271,93 @@ static int parser_action_row641[] = {
 };
 static int parser_action_row642[] = {
        1,
-       -1, 1, 84
+       -1, 1, 86
 };
 static int parser_action_row643[] = {
        1,
-       -1, 1, 85
+       -1, 1, 87
 };
 static int parser_action_row644[] = {
        1,
-       -1, 1, 86
+       -1, 1, 88
 };
 static int parser_action_row645[] = {
        1,
-       -1, 1, 87
+       -1, 1, 89
 };
 static int parser_action_row646[] = {
        1,
-       -1, 1, 88
+       -1, 1, 90
 };
 static int parser_action_row647[] = {
        1,
-       -1, 1, 89
+       -1, 1, 91
 };
 static int parser_action_row648[] = {
        1,
-       -1, 1, 90
+       -1, 1, 92
 };
 static int parser_action_row649[] = {
        1,
-       -1, 1, 91
+       -1, 1, 93
 };
 static int parser_action_row650[] = {
        1,
-       -1, 1, 92
+       -1, 1, 94
 };
 static int parser_action_row651[] = {
        1,
-       -1, 1, 93
+       -1, 1, 95
 };
 static int parser_action_row652[] = {
        1,
-       -1, 1, 94
+       -1, 1, 96
 };
 static int parser_action_row653[] = {
        1,
-       -1, 1, 95
+       -1, 1, 97
 };
 static int parser_action_row654[] = {
        1,
-       -1, 1, 98
+       -1, 1, 100
 };
 static int parser_action_row655[] = {
        1,
-       -1, 1, 96
+       -1, 1, 98
 };
 static int parser_action_row656[] = {
        1,
-       -1, 1, 100
+       -1, 1, 102
 };
 static int parser_action_row657[] = {
        1,
-       -1, 1, 99
+       -1, 1, 101
 };
 static int parser_action_row658[] = {
        1,
-       -1, 1, 97
+       -1, 1, 99
 };
 static int parser_action_row659[] = {
        1,
-       -1, 1, 101
+       -1, 1, 103
 };
 static int parser_action_row660[] = {
        1,
-       -1, 1, 103
+       -1, 1, 105
 };
 static int parser_action_row661[] = {
        3,
-       -1, 1, 106,
+       -1, 1, 108,
        58, 0, 215,
        59, 0, 827
 };
 static int parser_action_row662[] = {
        1,
-       -1, 1, 461
+       -1, 1, 463
 };
 static int parser_action_row663[] = {
        5,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        52, 0, 828,
@@ -8416,7 +8416,7 @@ static int parser_action_row665[] = {
 };
 static int parser_action_row666[] = {
        1,
-       -1, 1, 34
+       -1, 1, 36
 };
 static int parser_action_row667[] = {
        3,
@@ -8431,27 +8431,27 @@ static int parser_action_row668[] = {
 };
 static int parser_action_row669[] = {
        27,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 347,
-       73, 1, 347,
+       54, 1, 351,
+       73, 1, 351,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -8461,26 +8461,26 @@ static int parser_action_row669[] = {
 };
 static int parser_action_row670[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row671[] = {
        40,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 329,
+       54, 1, 333,
        58, 0, 215,
        59, 0, 846,
        60, 0, 217,
@@ -8494,13 +8494,13 @@ static int parser_action_row671[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 329,
+       73, 1, 333,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -8515,50 +8515,50 @@ static int parser_action_row672[] = {
 };
 static int parser_action_row673[] = {
        3,
-       -1, 1, 453,
+       -1, 1, 455,
        12, 0, 851,
        97, 0, 852
 };
 static int parser_action_row674[] = {
        4,
-       -1, 1, 455,
+       -1, 1, 457,
        12, 0, 853,
        96, 0, 53,
        97, 0, 854
 };
 static int parser_action_row675[] = {
        1,
-       -1, 1, 223
+       -1, 1, 225
 };
 static int parser_action_row676[] = {
        1,
-       -1, 1, 242
+       -1, 1, 244
 };
 static int parser_action_row677[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row678[] = {
        1,
-       -1, 1, 390
+       -1, 1, 394
 };
 static int parser_action_row679[] = {
        1,
-       -1, 1, 391
+       -1, 1, 395
 };
 static int parser_action_row680[] = {
        1,
-       -1, 1, 206
+       -1, 1, 208
 };
 static int parser_action_row681[] = {
        1,
-       -1, 1, 225
+       -1, 1, 227
 };
 static int parser_action_row682[] = {
        25,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8586,15 +8586,15 @@ static int parser_action_row682[] = {
 };
 static int parser_action_row683[] = {
        1,
-       -1, 1, 218
+       -1, 1, 220
 };
 static int parser_action_row684[] = {
        1,
-       -1, 1, 237
+       -1, 1, 239
 };
 static int parser_action_row685[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8621,7 +8621,7 @@ static int parser_action_row685[] = {
 };
 static int parser_action_row686[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8648,15 +8648,15 @@ static int parser_action_row686[] = {
 };
 static int parser_action_row687[] = {
        1,
-       -1, 1, 222
+       -1, 1, 224
 };
 static int parser_action_row688[] = {
        1,
-       -1, 1, 241
+       -1, 1, 243
 };
 static int parser_action_row689[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8683,7 +8683,7 @@ static int parser_action_row689[] = {
 };
 static int parser_action_row690[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8710,11 +8710,11 @@ static int parser_action_row690[] = {
 };
 static int parser_action_row691[] = {
        1,
-       -1, 1, 196
+       -1, 1, 198
 };
 static int parser_action_row692[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8741,7 +8741,7 @@ static int parser_action_row692[] = {
 };
 static int parser_action_row693[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8768,7 +8768,7 @@ static int parser_action_row693[] = {
 };
 static int parser_action_row694[] = {
        13,
-       -1, 1, 340,
+       -1, 1, 344,
        59, 0, 865,
        60, 0, 217,
        61, 0, 218,
@@ -8784,15 +8784,15 @@ static int parser_action_row694[] = {
 };
 static int parser_action_row695[] = {
        1,
-       -1, 1, 187
+       -1, 1, 189
 };
 static int parser_action_row696[] = {
        1,
-       -1, 1, 138
+       -1, 1, 140
 };
 static int parser_action_row697[] = {
        1,
-       -1, 1, 436
+       -1, 1, 438
 };
 static int parser_action_row698[] = {
        2,
@@ -8806,13 +8806,13 @@ static int parser_action_row699[] = {
 };
 static int parser_action_row700[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row701[] = {
        1,
-       -1, 1, 738
+       -1, 1, 740
 };
 static int parser_action_row702[] = {
        2,
@@ -8821,7 +8821,7 @@ static int parser_action_row702[] = {
 };
 static int parser_action_row703[] = {
        5,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 730,
        46, 0, 731,
        96, 0, 53,
@@ -8829,7 +8829,7 @@ static int parser_action_row703[] = {
 };
 static int parser_action_row704[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -8856,32 +8856,32 @@ static int parser_action_row704[] = {
 };
 static int parser_action_row705[] = {
        1,
-       -1, 1, 363
+       -1, 1, 367
 };
 static int parser_action_row706[] = {
        2,
-       -1, 1, 442,
+       -1, 1, 444,
        56, 0, 872
 };
 static int parser_action_row707[] = {
        9,
-       -1, 1, 435,
-       0, 1, 437,
-       1, 1, 437,
-       9, 1, 437,
-       24, 1, 437,
-       53, 1, 437,
-       56, 1, 437,
-       95, 1, 437,
-       110, 1, 437
+       -1, 1, 437,
+       0, 1, 439,
+       1, 1, 439,
+       9, 1, 439,
+       24, 1, 439,
+       53, 1, 439,
+       56, 1, 439,
+       95, 1, 439,
+       110, 1, 439
 };
 static int parser_action_row708[] = {
        1,
-       -1, 1, 700
+       -1, 1, 702
 };
 static int parser_action_row709[] = {
        21,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 116,
        31, 0, 118,
        38, 0, 119,
@@ -8905,123 +8905,123 @@ static int parser_action_row709[] = {
 };
 static int parser_action_row710[] = {
        1,
-       -1, 1, 699
+       -1, 1, 701
 };
 static int parser_action_row711[] = {
        1,
-       -1, 1, 702
+       -1, 1, 704
 };
 static int parser_action_row712[] = {
        1,
-       -1, 1, 713
+       -1, 1, 715
 };
 static int parser_action_row713[] = {
        2,
-       -1, 1, 715,
+       -1, 1, 717,
        81, 0, 315
 };
 static int parser_action_row714[] = {
        2,
-       -1, 1, 706,
+       -1, 1, 708,
        80, 0, 307
 };
 static int parser_action_row715[] = {
        2,
-       -1, 1, 707,
+       -1, 1, 709,
        80, 0, 307
 };
 static int parser_action_row716[] = {
        2,
-       -1, 1, 708,
+       -1, 1, 710,
        80, 0, 307
 };
 static int parser_action_row717[] = {
        2,
-       -1, 1, 709,
+       -1, 1, 711,
        80, 0, 307
 };
 static int parser_action_row718[] = {
        2,
-       -1, 1, 710,
+       -1, 1, 712,
        80, 0, 307
 };
 static int parser_action_row719[] = {
        2,
-       -1, 1, 711,
+       -1, 1, 713,
        80, 0, 307
 };
 static int parser_action_row720[] = {
        2,
-       -1, 1, 712,
+       -1, 1, 714,
        80, 0, 307
 };
 static int parser_action_row721[] = {
        2,
-       -1, 1, 717,
+       -1, 1, 719,
        82, 0, 316
 };
 static int parser_action_row722[] = {
        3,
-       -1, 1, 719,
+       -1, 1, 721,
        88, 0, 317,
        91, 0, 318
 };
 static int parser_action_row723[] = {
        3,
-       -1, 1, 721,
+       -1, 1, 723,
        74, 0, 319,
        75, 0, 320
 };
 static int parser_action_row724[] = {
        3,
-       -1, 1, 722,
+       -1, 1, 724,
        74, 0, 319,
        75, 0, 320
 };
 static int parser_action_row725[] = {
        4,
-       -1, 1, 724,
+       -1, 1, 726,
        76, 0, 321,
        78, 0, 322,
        79, 0, 323
 };
 static int parser_action_row726[] = {
        4,
-       -1, 1, 725,
+       -1, 1, 727,
        76, 0, 321,
        78, 0, 322,
        79, 0, 323
 };
 static int parser_action_row727[] = {
        1,
-       -1, 1, 727
+       -1, 1, 729
 };
 static int parser_action_row728[] = {
        1,
-       -1, 1, 728
+       -1, 1, 730
 };
 static int parser_action_row729[] = {
        1,
-       -1, 1, 729
+       -1, 1, 731
 };
 static int parser_action_row730[] = {
        1,
-       -1, 1, 731
+       -1, 1, 733
 };
 static int parser_action_row731[] = {
        2,
-       -1, 1, 764,
+       -1, 1, 766,
        52, 0, 277
 };
 static int parser_action_row732[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row733[] = {
        3,
-       -1, 1, 746,
+       -1, 1, 748,
        52, 0, 277,
        58, 0, 215
 };
@@ -9032,26 +9032,26 @@ static int parser_action_row734[] = {
 };
 static int parser_action_row735[] = {
        2,
-       -1, 1, 453,
+       -1, 1, 455,
        97, 0, 880
 };
 static int parser_action_row736[] = {
        3,
-       -1, 1, 455,
+       -1, 1, 457,
        96, 0, 53,
        97, 0, 881
 };
 static int parser_action_row737[] = {
        1,
-       -1, 1, 757
+       -1, 1, 759
 };
 static int parser_action_row738[] = {
        1,
-       -1, 1, 162
+       -1, 1, 164
 };
 static int parser_action_row739[] = {
        31,
-       -1, 1, 456,
+       -1, 1, 458,
        9, 0, 883,
        12, 0, 31,
        15, 0, 33,
@@ -9085,11 +9085,11 @@ static int parser_action_row739[] = {
 };
 static int parser_action_row740[] = {
        1,
-       -1, 1, 152
+       -1, 1, 154
 };
 static int parser_action_row741[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -9116,13 +9116,13 @@ static int parser_action_row741[] = {
 };
 static int parser_action_row742[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row743[] = {
        35,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 886,
@@ -9160,7 +9160,7 @@ static int parser_action_row743[] = {
 };
 static int parser_action_row744[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 157,
@@ -9197,14 +9197,14 @@ static int parser_action_row744[] = {
 };
 static int parser_action_row745[] = {
        4,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        56, 0, 554
 };
 static int parser_action_row746[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -9220,11 +9220,11 @@ static int parser_action_row748[] = {
 };
 static int parser_action_row749[] = {
        1,
-       -1, 1, 321
+       -1, 1, 325
 };
 static int parser_action_row750[] = {
        5,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 773,
        46, 0, 669,
        96, 0, 53,
@@ -9232,11 +9232,11 @@ static int parser_action_row750[] = {
 };
 static int parser_action_row751[] = {
        1,
-       -1, 1, 283
+       -1, 1, 287
 };
 static int parser_action_row752[] = {
        23,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        31, 0, 172,
        38, 0, 173,
@@ -9262,117 +9262,117 @@ static int parser_action_row752[] = {
 };
 static int parser_action_row753[] = {
        1,
-       -1, 1, 282
+       -1, 1, 286
 };
 static int parser_action_row754[] = {
        1,
-       -1, 1, 285
+       -1, 1, 289
 };
 static int parser_action_row755[] = {
        1,
-       -1, 1, 296
+       -1, 1, 300
 };
 static int parser_action_row756[] = {
        2,
-       -1, 1, 298,
+       -1, 1, 302,
        81, 0, 366
 };
 static int parser_action_row757[] = {
        2,
-       -1, 1, 289,
+       -1, 1, 293,
        80, 0, 358
 };
 static int parser_action_row758[] = {
        2,
-       -1, 1, 290,
+       -1, 1, 294,
        80, 0, 358
 };
 static int parser_action_row759[] = {
        2,
-       -1, 1, 291,
+       -1, 1, 295,
        80, 0, 358
 };
 static int parser_action_row760[] = {
        2,
-       -1, 1, 292,
+       -1, 1, 296,
        80, 0, 358
 };
 static int parser_action_row761[] = {
        2,
-       -1, 1, 293,
+       -1, 1, 297,
        80, 0, 358
 };
 static int parser_action_row762[] = {
        2,
-       -1, 1, 294,
+       -1, 1, 298,
        80, 0, 358
 };
 static int parser_action_row763[] = {
        2,
-       -1, 1, 295,
+       -1, 1, 299,
        80, 0, 358
 };
 static int parser_action_row764[] = {
        2,
-       -1, 1, 300,
+       -1, 1, 304,
        82, 0, 367
 };
 static int parser_action_row765[] = {
        3,
-       -1, 1, 302,
+       -1, 1, 306,
        88, 0, 368,
        91, 0, 369
 };
 static int parser_action_row766[] = {
        3,
-       -1, 1, 304,
+       -1, 1, 308,
        74, 0, 370,
        75, 0, 371
 };
 static int parser_action_row767[] = {
        3,
-       -1, 1, 305,
+       -1, 1, 309,
        74, 0, 370,
        75, 0, 371
 };
 static int parser_action_row768[] = {
        4,
-       -1, 1, 307,
+       -1, 1, 311,
        76, 0, 372,
        78, 0, 373,
        79, 0, 374
 };
 static int parser_action_row769[] = {
        4,
-       -1, 1, 308,
+       -1, 1, 312,
        76, 0, 372,
        78, 0, 373,
        79, 0, 374
 };
 static int parser_action_row770[] = {
        1,
-       -1, 1, 310
+       -1, 1, 314
 };
 static int parser_action_row771[] = {
        1,
-       -1, 1, 311
+       -1, 1, 315
 };
 static int parser_action_row772[] = {
        1,
-       -1, 1, 312
+       -1, 1, 316
 };
 static int parser_action_row773[] = {
        1,
-       -1, 1, 314
+       -1, 1, 318
 };
 static int parser_action_row774[] = {
        2,
-       -1, 1, 347,
+       -1, 1, 351,
        52, 0, 277
 };
 static int parser_action_row775[] = {
        3,
-       -1, 1, 329,
+       -1, 1, 333,
        52, 0, 277,
        58, 0, 215
 };
@@ -9383,40 +9383,40 @@ static int parser_action_row776[] = {
 };
 static int parser_action_row777[] = {
        2,
-       -1, 1, 453,
+       -1, 1, 455,
        97, 0, 929
 };
 static int parser_action_row778[] = {
        3,
-       -1, 1, 455,
+       -1, 1, 457,
        96, 0, 53,
        97, 0, 930
 };
 static int parser_action_row779[] = {
        1,
-       -1, 1, 340
+       -1, 1, 344
 };
 static int parser_action_row780[] = {
        1,
-       -1, 1, 275
+       -1, 1, 279
 };
 static int parser_action_row781[] = {
        1,
-       -1, 1, 155
+       -1, 1, 157
 };
 static int parser_action_row782[] = {
        1,
-       -1, 1, 154
+       -1, 1, 156
 };
 static int parser_action_row783[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row784[] = {
        1,
-       -1, 1, 621
+       -1, 1, 623
 };
 static int parser_action_row785[] = {
        3,
@@ -9426,13 +9426,13 @@ static int parser_action_row785[] = {
 };
 static int parser_action_row786[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row787[] = {
        5,
-       -1, 1, 79,
+       -1, 1, 81,
        18, 0, 236,
        19, 0, 237,
        20, 0, 238,
@@ -9440,7 +9440,7 @@ static int parser_action_row787[] = {
 };
 static int parser_action_row788[] = {
        1,
-       -1, 1, 792
+       -1, 1, 794
 };
 static int parser_action_row789[] = {
        3,
@@ -9450,7 +9450,7 @@ static int parser_action_row789[] = {
 };
 static int parser_action_row790[] = {
        5,
-       -1, 1, 79,
+       -1, 1, 81,
        18, 0, 236,
        19, 0, 237,
        20, 0, 238,
@@ -9458,36 +9458,36 @@ static int parser_action_row790[] = {
 };
 static int parser_action_row791[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row792[] = {
        2,
-       -1, 1, 405,
+       -1, 1, 408,
        56, 0, 942
 };
 static int parser_action_row793[] = {
        1,
-       -1, 1, 434
+       -1, 1, 436
 };
 static int parser_action_row794[] = {
        1,
-       -1, 1, 433
+       -1, 1, 435
 };
 static int parser_action_row795[] = {
        1,
-       -1, 1, 432
+       -1, 1, 434
 };
 static int parser_action_row796[] = {
        3,
-       -1, 1, 401,
+       -1, 1, 405,
        52, 0, 945,
        94, 0, 204
 };
 static int parser_action_row797[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -9498,7 +9498,7 @@ static int parser_action_row798[] = {
 };
 static int parser_action_row799[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 157,
@@ -9535,13 +9535,13 @@ static int parser_action_row799[] = {
 };
 static int parser_action_row800[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row801[] = {
        1,
-       -1, 1, 145
+       -1, 1, 147
 };
 static int parser_action_row802[] = {
        3,
@@ -9551,7 +9551,7 @@ static int parser_action_row802[] = {
 };
 static int parser_action_row803[] = {
        1,
-       -1, 1, 198
+       -1, 1, 200
 };
 static int parser_action_row804[] = {
        2,
@@ -9560,11 +9560,11 @@ static int parser_action_row804[] = {
 };
 static int parser_action_row805[] = {
        1,
-       -1, 1, 517
+       -1, 1, 519
 };
 static int parser_action_row806[] = {
        25,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 773,
        46, 0, 669,
        54, 0, 619,
@@ -9592,12 +9592,12 @@ static int parser_action_row806[] = {
 };
 static int parser_action_row807[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row808[] = {
        54,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        15, 0, 33,
        16, 0, 34,
@@ -9654,22 +9654,22 @@ static int parser_action_row808[] = {
 };
 static int parser_action_row809[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row810[] = {
        1,
-       -1, 1, 1071
+       -1, 1, 1075
 };
 static int parser_action_row811[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -9682,7 +9682,7 @@ static int parser_action_row811[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -9692,13 +9692,13 @@ static int parser_action_row811[] = {
 };
 static int parser_action_row812[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -9711,7 +9711,7 @@ static int parser_action_row812[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -9721,7 +9721,7 @@ static int parser_action_row812[] = {
 };
 static int parser_action_row813[] = {
        14,
-       -1, 1, 341,
+       -1, 1, 345,
        52, 0, 277,
        59, 0, 961,
        60, 0, 217,
@@ -9738,34 +9738,34 @@ static int parser_action_row813[] = {
 };
 static int parser_action_row814[] = {
        1,
-       -1, 1, 520
+       -1, 1, 522
 };
 static int parser_action_row815[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row816[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row817[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row818[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
 static int parser_action_row819[] = {
        25,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 446,
        27, 0, 447,
@@ -9793,22 +9793,22 @@ static int parser_action_row819[] = {
 };
 static int parser_action_row820[] = {
        1,
-       -1, 1, 1073
+       -1, 1, 1077
 };
 static int parser_action_row821[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row822[] = {
        2,
-       -1, 1, 449,
+       -1, 1, 451,
        58, 0, 215
 };
 static int parser_action_row823[] = {
        2,
-       -1, 1, 76,
+       -1, 1, 78,
        14, 0, 969
 };
 static int parser_action_row824[] = {
@@ -9825,59 +9825,59 @@ static int parser_action_row825[] = {
 };
 static int parser_action_row826[] = {
        2,
-       -1, 1, 76,
+       -1, 1, 78,
        14, 0, 969
 };
 static int parser_action_row827[] = {
        2,
-       -1, 1, 102,
+       -1, 1, 104,
        59, 0, 974
 };
 static int parser_action_row828[] = {
        1,
-       -1, 1, 104
+       -1, 1, 106
 };
 static int parser_action_row829[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row830[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row831[] = {
        4,
-       -1, 1, 122,
+       -1, 1, 124,
        4, 0, 977,
        14, 0, 978,
        15, 0, 979
 };
 static int parser_action_row832[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row833[] = {
        1,
-       -1, 1, 110
+       -1, 1, 112
 };
 static int parser_action_row834[] = {
        2,
-       -1, 1, 106,
+       -1, 1, 108,
        59, 0, 827
 };
 static int parser_action_row835[] = {
        1,
-       -1, 1, 462
+       -1, 1, 464
 };
 static int parser_action_row836[] = {
        1,
-       -1, 1, 464
+       -1, 1, 466
 };
 static int parser_action_row837[] = {
        22,
@@ -9906,7 +9906,7 @@ static int parser_action_row837[] = {
 };
 static int parser_action_row838[] = {
        2,
-       -1, 1, 457,
+       -1, 1, 459,
        58, 0, 214
 };
 static int parser_action_row839[] = {
@@ -9915,42 +9915,47 @@ static int parser_action_row839[] = {
        58, 0, 215
 };
 static int parser_action_row840[] = {
-       2,
-       -1, 1, 37,
-       54, 0, 985
+       7,
+       -1, 1, 485,
+       0, 0, 1,
+       1, 0, 2,
+       28, 0, 84,
+       54, 0, 985,
+       95, 0, 3,
+       109, 0, 85
 };
 static int parser_action_row841[] = {
        2,
        -1, 3, 840,
-       96, 0, 987
+       96, 0, 995
 };
 static int parser_action_row842[] = {
        3,
        -1, 3, 841,
-       96, 0, 988,
+       96, 0, 996,
        97, 0, 838
 };
 static int parser_action_row843[] = {
        1,
-       -1, 1, 441
+       -1, 1, 443
 };
 static int parser_action_row844[] = {
        1,
-       -1, 1, 346
+       -1, 1, 350
 };
 static int parser_action_row845[] = {
        1,
-       -1, 1, 190
+       -1, 1, 192
 };
 static int parser_action_row846[] = {
        3,
        -1, 3, 845,
-       31, 0, 990,
-       52, 0, 991
+       31, 0, 998,
+       52, 0, 999
 };
 static int parser_action_row847[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -9977,7 +9982,7 @@ static int parser_action_row847[] = {
 };
 static int parser_action_row848[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -10004,8 +10009,8 @@ static int parser_action_row848[] = {
 };
 static int parser_action_row849[] = {
        13,
-       -1, 1, 328,
-       59, 0, 994,
+       -1, 1, 332,
+       59, 0, 1002,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -10020,12 +10025,12 @@ static int parser_action_row849[] = {
 };
 static int parser_action_row850[] = {
        1,
-       -1, 1, 181
+       -1, 1, 183
 };
 static int parser_action_row851[] = {
        13,
-       -1, 1, 326,
-       59, 0, 996,
+       -1, 1, 330,
+       59, 0, 1004,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -10040,13 +10045,13 @@ static int parser_action_row851[] = {
 };
 static int parser_action_row852[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -10058,7 +10063,7 @@ static int parser_action_row852[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -10068,21 +10073,21 @@ static int parser_action_row852[] = {
 };
 static int parser_action_row853[] = {
        39,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 331,
-       59, 0, 999,
+       54, 1, 335,
+       59, 0, 1007,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -10094,13 +10099,13 @@ static int parser_action_row853[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 331,
+       73, 1, 335,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -10110,13 +10115,13 @@ static int parser_action_row853[] = {
 };
 static int parser_action_row854[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -10128,7 +10133,7 @@ static int parser_action_row854[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -10138,22 +10143,22 @@ static int parser_action_row854[] = {
 };
 static int parser_action_row855[] = {
        40,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 335,
+       54, 1, 339,
        58, 0, 215,
-       59, 0, 1004,
+       59, 0, 1012,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -10165,13 +10170,13 @@ static int parser_action_row855[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 335,
+       73, 1, 339,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -10181,50 +10186,50 @@ static int parser_action_row855[] = {
 };
 static int parser_action_row856[] = {
        3,
-       -1, 1, 454,
-       12, 0, 1008,
-       97, 0, 1009
+       -1, 1, 456,
+       12, 0, 1016,
+       97, 0, 1017
 };
 static int parser_action_row857[] = {
        1,
-       -1, 1, 394
+       -1, 1, 398
 };
 static int parser_action_row858[] = {
        1,
-       -1, 1, 439
+       -1, 1, 441
 };
 static int parser_action_row859[] = {
        2,
        -1, 3, 858,
-       53, 0, 1010
+       53, 0, 1018
 };
 static int parser_action_row860[] = {
        1,
-       -1, 1, 217
+       -1, 1, 219
 };
 static int parser_action_row861[] = {
        1,
-       -1, 1, 236
+       -1, 1, 238
 };
 static int parser_action_row862[] = {
        1,
-       -1, 1, 221
+       -1, 1, 223
 };
 static int parser_action_row863[] = {
        1,
-       -1, 1, 240
+       -1, 1, 242
 };
 static int parser_action_row864[] = {
        1,
-       -1, 1, 220
+       -1, 1, 222
 };
 static int parser_action_row865[] = {
        1,
-       -1, 1, 239
+       -1, 1, 241
 };
 static int parser_action_row866[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -10251,7 +10256,7 @@ static int parser_action_row866[] = {
 };
 static int parser_action_row867[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -10278,11 +10283,11 @@ static int parser_action_row867[] = {
 };
 static int parser_action_row868[] = {
        1,
-       -1, 1, 435
+       -1, 1, 437
 };
 static int parser_action_row869[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
@@ -10290,81 +10295,81 @@ static int parser_action_row870[] = {
        3,
        -1, 3, 869,
        96, 0, 53,
-       97, 0, 1014
+       97, 0, 1022
 };
 static int parser_action_row871[] = {
        2,
        -1, 3, 870,
-       98, 0, 1017
+       98, 0, 1025
 };
 static int parser_action_row872[] = {
        1,
-       -1, 1, 364
+       -1, 1, 368
 };
 static int parser_action_row873[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row874[] = {
        1,
-       -1, 1, 1082
+       -1, 1, 1084
 };
 static int parser_action_row875[] = {
        2,
-       -1, 1, 443,
+       -1, 1, 445,
        56, 0, 872
 };
 static int parser_action_row876[] = {
        1,
-       -1, 1, 701
+       -1, 1, 703
 };
 static int parser_action_row877[] = {
        1,
-       -1, 1, 763
+       -1, 1, 765
 };
 static int parser_action_row878[] = {
        3,
        -1, 3, 877,
-       31, 0, 1020,
-       52, 0, 1021
+       31, 0, 1028,
+       52, 0, 1029
 };
 static int parser_action_row879[] = {
        1,
-       -1, 1, 745
+       -1, 1, 747
 };
 static int parser_action_row880[] = {
        1,
-       -1, 1, 743
+       -1, 1, 745
 };
 static int parser_action_row881[] = {
        2,
-       -1, 1, 748,
+       -1, 1, 750,
        52, 0, 277
 };
 static int parser_action_row882[] = {
        3,
-       -1, 1, 752,
+       -1, 1, 754,
        52, 0, 277,
        58, 0, 215
 };
 static int parser_action_row883[] = {
        2,
-       -1, 1, 454,
-       97, 0, 1024
+       -1, 1, 456,
+       97, 0, 1032
 };
 static int parser_action_row884[] = {
        1,
-       -1, 1, 163
+       -1, 1, 165
 };
 static int parser_action_row885[] = {
        1,
-       -1, 1, 203
+       -1, 1, 205
 };
 static int parser_action_row886[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -10391,31 +10396,31 @@ static int parser_action_row886[] = {
 };
 static int parser_action_row887[] = {
        1,
-       -1, 1, 262
+       -1, 1, 266
 };
 static int parser_action_row888[] = {
        27,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 349,
-       73, 1, 349,
+       54, 1, 353,
+       73, 1, 353,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -10425,10 +10430,10 @@ static int parser_action_row888[] = {
 };
 static int parser_action_row889[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1027,
+       9, 0, 1035,
        12, 0, 887,
        15, 0, 888,
        16, 0, 34,
@@ -10462,13 +10467,13 @@ static int parser_action_row889[] = {
 };
 static int parser_action_row890[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row891[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -10505,16 +10510,16 @@ static int parser_action_row891[] = {
 };
 static int parser_action_row892[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row893[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1027,
+       9, 0, 1035,
        12, 0, 887,
        15, 0, 888,
        16, 0, 34,
@@ -10548,20 +10553,20 @@ static int parser_action_row893[] = {
 };
 static int parser_action_row894[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row895[] = {
        27,
-       -1, 1, 167,
+       -1, 1, 169,
        12, 0, 170,
        22, 0, 171,
-       24, 1, 898,
+       24, 1, 900,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -10574,7 +10579,7 @@ static int parser_action_row895[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -10584,24 +10589,24 @@ static int parser_action_row895[] = {
 };
 static int parser_action_row896[] = {
        3,
-       -1, 1, 172,
-       24, 1, 903,
+       -1, 1, 174,
+       24, 1, 905,
        49, 0, 197
 };
 static int parser_action_row897[] = {
        3,
-       -1, 1, 169,
-       24, 1, 900,
+       -1, 1, 171,
+       24, 1, 902,
        49, 0, 197
 };
 static int parser_action_row898[] = {
        2,
-       -1, 1, 171,
-       24, 1, 902
+       -1, 1, 173,
+       24, 1, 904
 };
 static int parser_action_row899[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -10628,31 +10633,31 @@ static int parser_action_row899[] = {
 };
 static int parser_action_row900[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row901[] = {
        2,
        -1, 3, 900,
-       11, 0, 1044
+       11, 0, 1052
 };
 static int parser_action_row902[] = {
        40,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 337,
+       54, 1, 341,
        58, 0, 215,
        59, 0, 216,
        60, 0, 217,
@@ -10666,13 +10671,13 @@ static int parser_action_row902[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 337,
+       73, 1, 341,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -10682,49 +10687,49 @@ static int parser_action_row902[] = {
 };
 static int parser_action_row903[] = {
        1,
-       -1, 1, 257
+       -1, 1, 259
 };
 static int parser_action_row904[] = {
        2,
-       -1, 1, 165,
-       24, 1, 896
+       -1, 1, 167,
+       24, 1, 898
 };
 static int parser_action_row905[] = {
        2,
-       -1, 1, 166,
-       24, 1, 897
+       -1, 1, 168,
+       24, 1, 899
 };
 static int parser_action_row906[] = {
        1,
-       -1, 1, 259
+       -1, 1, 264
 };
 static int parser_action_row907[] = {
        3,
        -1, 3, 906,
        54, 0, 244,
-       73, 0, 1046
+       73, 0, 1054
 };
 static int parser_action_row908[] = {
        3,
        -1, 3, 907,
-       41, 0, 1047,
+       41, 0, 1055,
        98, 0, 255
 };
 static int parser_action_row909[] = {
        3,
-       -1, 1, 453,
-       12, 0, 1048,
-       97, 0, 1049
+       -1, 1, 455,
+       12, 0, 1056,
+       97, 0, 1057
 };
 static int parser_action_row910[] = {
        32,
-       -1, 1, 456,
+       -1, 1, 458,
        9, 0, 886,
        12, 0, 31,
        15, 0, 33,
        16, 0, 34,
        22, 0, 35,
-       24, 0, 890,
+       24, 0, 1058,
        25, 0, 36,
        26, 0, 37,
        27, 0, 38,
@@ -10754,46 +10759,46 @@ static int parser_action_row910[] = {
 static int parser_action_row911[] = {
        2,
        -1, 3, 910,
-       24, 0, 1053
+       24, 0, 1062
 };
 static int parser_action_row912[] = {
        1,
-       -1, 1, 905
+       -1, 1, 907
 };
 static int parser_action_row913[] = {
        1,
-       -1, 1, 906
+       -1, 1, 908
 };
 static int parser_action_row914[] = {
        1,
-       -1, 1, 908
+       -1, 1, 910
 };
 static int parser_action_row915[] = {
        1,
-       -1, 1, 907
+       -1, 1, 909
 };
 static int parser_action_row916[] = {
        1,
-       -1, 1, 909
+       -1, 1, 911
 };
 static int parser_action_row917[] = {
        1,
-       -1, 1, 910
+       -1, 1, 912
 };
 static int parser_action_row918[] = {
        1,
-       -1, 1, 911
+       -1, 1, 913
 };
 static int parser_action_row919[] = {
        4,
-       -1, 1, 455,
-       12, 0, 1054,
+       -1, 1, 457,
+       12, 0, 1063,
        96, 0, 53,
-       97, 0, 1055
+       97, 0, 1064
 };
 static int parser_action_row920[] = {
        1,
-       -1, 1, 266
+       -1, 1, 270
 };
 static int parser_action_row921[] = {
        2,
@@ -10803,11 +10808,11 @@ static int parser_action_row921[] = {
 static int parser_action_row922[] = {
        2,
        -1, 3, 921,
-       53, 0, 1058
+       53, 0, 1067
 };
 static int parser_action_row923[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -10834,46 +10839,46 @@ static int parser_action_row923[] = {
 };
 static int parser_action_row924[] = {
        1,
-       -1, 1, 448
+       -1, 1, 450
 };
 static int parser_action_row925[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row926[] = {
        2,
        -1, 3, 925,
-       98, 0, 1061
+       98, 0, 1070
 };
 static int parser_action_row927[] = {
        1,
-       -1, 1, 284
+       -1, 1, 288
 };
 static int parser_action_row928[] = {
        1,
-       -1, 1, 328
+       -1, 1, 332
 };
 static int parser_action_row929[] = {
        1,
-       -1, 1, 326
+       -1, 1, 330
 };
 static int parser_action_row930[] = {
        2,
-       -1, 1, 331,
+       -1, 1, 335,
        52, 0, 277
 };
 static int parser_action_row931[] = {
        3,
-       -1, 1, 335,
+       -1, 1, 339,
        52, 0, 277,
        58, 0, 215
 };
 static int parser_action_row932[] = {
        2,
-       -1, 1, 454,
-       97, 0, 1064
+       -1, 1, 456,
+       97, 0, 1073
 };
 static int parser_action_row933[] = {
        3,
@@ -10883,18 +10888,18 @@ static int parser_action_row933[] = {
 };
 static int parser_action_row934[] = {
        2,
-       -1, 1, 148,
-       56, 0, 1066
+       -1, 1, 150,
+       56, 0, 1075
 };
 static int parser_action_row935[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row936[] = {
        2,
-       -1, 1, 28,
+       -1, 1, 30,
        13, 0, 32
 };
 static int parser_action_row937[] = {
@@ -10906,20 +10911,20 @@ static int parser_action_row937[] = {
 };
 static int parser_action_row938[] = {
        3,
-       -1, 1, 352,
+       -1, 1, 356,
        52, 0, 277,
        58, 0, 215
 };
 static int parser_action_row939[] = {
        2,
        -1, 3, 938,
-       97, 0, 1073
+       97, 0, 1082
 };
 static int parser_action_row940[] = {
        3,
        -1, 3, 939,
        96, 0, 53,
-       97, 0, 1074
+       97, 0, 1083
 };
 static int parser_action_row941[] = {
        4,
@@ -10931,36 +10936,36 @@ static int parser_action_row941[] = {
 static int parser_action_row942[] = {
        2,
        -1, 3, 941,
-       53, 0, 1077
+       53, 0, 1086
 };
 static int parser_action_row943[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row944[] = {
        1,
-       -1, 1, 1076
+       -1, 1, 1080
 };
 static int parser_action_row945[] = {
        2,
-       -1, 1, 406,
+       -1, 1, 409,
        56, 0, 942
 };
 static int parser_action_row946[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row947[] = {
        1,
-       -1, 1, 402
+       -1, 1, 406
 };
 static int parser_action_row948[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -10987,13 +10992,13 @@ static int parser_action_row948[] = {
 };
 static int parser_action_row949[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row950[] = {
        1,
-       -1, 1, 270
+       -1, 1, 274
 };
 static int parser_action_row951[] = {
        2,
@@ -11008,13 +11013,13 @@ static int parser_action_row952[] = {
 };
 static int parser_action_row953[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row954[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11041,10 +11046,10 @@ static int parser_action_row954[] = {
 };
 static int parser_action_row955[] = {
        15,
-       -1, 1, 329,
+       -1, 1, 333,
        52, 0, 277,
        58, 0, 215,
-       59, 0, 1087,
+       59, 0, 1096,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -11059,7 +11064,7 @@ static int parser_action_row955[] = {
 };
 static int parser_action_row956[] = {
        22,
-       -1, 1, 453,
+       -1, 1, 455,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -11080,15 +11085,15 @@ static int parser_action_row956[] = {
        90, 0, 421,
        91, 0, 422,
        92, 0, 423,
-       97, 0, 1088
+       97, 0, 1097
 };
 static int parser_action_row957[] = {
        1,
-       -1, 1, 429
+       -1, 1, 431
 };
 static int parser_action_row958[] = {
        23,
-       -1, 1, 455,
+       -1, 1, 457,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -11110,29 +11115,29 @@ static int parser_action_row958[] = {
        91, 0, 422,
        92, 0, 423,
        96, 0, 53,
-       97, 0, 1089
+       97, 0, 1098
 };
 static int parser_action_row959[] = {
        1,
-       -1, 1, 380
+       -1, 1, 384
 };
 static int parser_action_row960[] = {
        1,
-       -1, 1, 382
+       -1, 1, 386
 };
 static int parser_action_row961[] = {
        1,
-       -1, 1, 379
+       -1, 1, 383
 };
 static int parser_action_row962[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -11145,7 +11150,7 @@ static int parser_action_row962[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -11156,61 +11161,61 @@ static int parser_action_row962[] = {
 static int parser_action_row963[] = {
        2,
        -1, 3, 962,
-       23, 0, 1091
+       23, 0, 1100
 };
 static int parser_action_row964[] = {
        2,
        -1, 3, 963,
-       28, 0, 1092
+       28, 0, 1101
 };
 static int parser_action_row965[] = {
        23,
-       -1, 1, 456,
-       12, 0, 1093,
-       22, 0, 1094,
-       31, 0, 1095,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       22, 0, 1103,
+       31, 0, 1104,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
 static int parser_action_row966[] = {
        1,
-       -1, 1, 378
+       -1, 1, 382
 };
 static int parser_action_row967[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row968[] = {
        1,
-       -1, 1, 385
+       -1, 1, 389
 };
 static int parser_action_row969[] = {
        2,
        -1, 3, 968,
-       97, 0, 1133
+       97, 0, 1142
 };
 static int parser_action_row970[] = {
        5,
-       -1, 1, 28,
+       -1, 1, 30,
        0, 0, 88,
        1, 0, 89,
        13, 0, 32,
@@ -11225,7 +11230,7 @@ static int parser_action_row971[] = {
 };
 static int parser_action_row972[] = {
        2,
-       -1, 1, 450,
+       -1, 1, 452,
        58, 0, 215
 };
 static int parser_action_row973[] = {
@@ -11241,12 +11246,12 @@ static int parser_action_row974[] = {
 };
 static int parser_action_row975[] = {
        1,
-       -1, 1, 105
+       -1, 1, 107
 };
 static int parser_action_row976[] = {
        2,
-       -1, 1, 113,
-       97, 0, 1140
+       -1, 1, 115,
+       97, 0, 1148
 };
 static int parser_action_row977[] = {
        3,
@@ -11256,13 +11261,13 @@ static int parser_action_row977[] = {
 };
 static int parser_action_row978[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row979[] = {
        5,
-       -1, 1, 28,
+       -1, 1, 30,
        0, 0, 88,
        1, 0, 89,
        13, 0, 32,
@@ -11270,7 +11275,7 @@ static int parser_action_row979[] = {
 };
 static int parser_action_row980[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -11307,9 +11312,9 @@ static int parser_action_row980[] = {
 };
 static int parser_action_row981[] = {
        3,
-       -1, 1, 122,
+       -1, 1, 124,
        4, 0, 977,
-       15, 0, 1148
+       15, 0, 1156
 };
 static int parser_action_row982[] = {
        3,
@@ -11319,68 +11324,111 @@ static int parser_action_row982[] = {
 };
 static int parser_action_row983[] = {
        1,
-       -1, 1, 491
+       -1, 1, 493
 };
 static int parser_action_row984[] = {
        1,
-       -1, 1, 109
+       -1, 1, 111
 };
 static int parser_action_row985[] = {
        1,
-       -1, 1, 463
+       -1, 1, 465
 };
 static int parser_action_row986[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
 static int parser_action_row987[] = {
-       6,
-       -1, 1, 483,
+       2,
+       -1, 1, 75,
+       9, 1, 45
+};
+static int parser_action_row988[] = {
+       2,
+       -1, 3, 987,
+       9, 0, 1160
+};
+static int parser_action_row989[] = {
+       1,
+       -1, 1, 1062
+};
+static int parser_action_row990[] = {
+       4,
+       -1, 3, 989,
+       0, 0, 88,
+       1, 0, 89,
+       95, 0, 90
+};
+static int parser_action_row991[] = {
+       4,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       28, 0, 84,
-       95, 0, 3,
-       109, 0, 85
+       95, 0, 3
 };
-static int parser_action_row988[] = {
+static int parser_action_row992[] = {
+       1,
+       -1, 1, 74
+};
+static int parser_action_row993[] = {
        1,
-       -1, 1, 458
+       -1, 1, 486
 };
-static int parser_action_row989[] = {
+static int parser_action_row994[] = {
+       5,
+       -1, 1, 30,
+       6, 0, 1163,
+       9, 1, 46,
+       13, 0, 32,
+       97, 0, 1164
+};
+static int parser_action_row995[] = {
+       5,
+       -1, 1, 485,
+       0, 0, 1,
+       1, 0, 2,
+       9, 1, 487,
+       95, 0, 3
+};
+static int parser_action_row996[] = {
+       1,
+       -1, 1, 460
+};
+static int parser_action_row997[] = {
        2,
-       -1, 1, 460,
+       -1, 1, 462,
        58, 0, 214
 };
-static int parser_action_row990[] = {
+static int parser_action_row998[] = {
        2,
-       -1, 3, 989,
-       96, 0, 1161
+       -1, 3, 997,
+       96, 0, 1171
 };
-static int parser_action_row991[] = {
+static int parser_action_row999[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row992[] = {
+static int parser_action_row1000[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row993[] = {
+static int parser_action_row1001[] = {
        1,
-       -1, 1, 208
+       -1, 1, 210
 };
-static int parser_action_row994[] = {
+static int parser_action_row1002[] = {
        1,
-       -1, 1, 227
+       -1, 1, 229
 };
-static int parser_action_row995[] = {
+static int parser_action_row1003[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11405,9 +11453,9 @@ static int parser_action_row995[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row996[] = {
+static int parser_action_row1004[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11432,9 +11480,9 @@ static int parser_action_row996[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row997[] = {
+static int parser_action_row1005[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11459,9 +11507,9 @@ static int parser_action_row997[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row998[] = {
+static int parser_action_row1006[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11486,13 +11534,13 @@ static int parser_action_row998[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row999[] = {
+static int parser_action_row1007[] = {
        1,
-       -1, 1, 192
+       -1, 1, 194
 };
-static int parser_action_row1000[] = {
+static int parser_action_row1008[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11517,9 +11565,9 @@ static int parser_action_row1000[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1001[] = {
+static int parser_action_row1009[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11544,10 +11592,10 @@ static int parser_action_row1001[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1002[] = {
+static int parser_action_row1010[] = {
        13,
-       -1, 1, 330,
-       59, 0, 1170,
+       -1, 1, 334,
+       59, 0, 1180,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -11560,17 +11608,17 @@ static int parser_action_row1002[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1003[] = {
+static int parser_action_row1011[] = {
        1,
-       -1, 1, 182
+       -1, 1, 184
 };
-static int parser_action_row1004[] = {
+static int parser_action_row1012[] = {
        1,
-       -1, 1, 194
+       -1, 1, 196
 };
-static int parser_action_row1005[] = {
+static int parser_action_row1013[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11595,9 +11643,9 @@ static int parser_action_row1005[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1006[] = {
+static int parser_action_row1014[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11622,10 +11670,10 @@ static int parser_action_row1006[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1007[] = {
+static int parser_action_row1015[] = {
        13,
-       -1, 1, 334,
-       59, 0, 1174,
+       -1, 1, 338,
+       59, 0, 1184,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -11638,19 +11686,19 @@ static int parser_action_row1007[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1008[] = {
+static int parser_action_row1016[] = {
        1,
-       -1, 1, 184
+       -1, 1, 186
 };
-static int parser_action_row1009[] = {
+static int parser_action_row1017[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -11662,7 +11710,7 @@ static int parser_action_row1009[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -11670,23 +11718,23 @@ static int parser_action_row1009[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1010[] = {
+static int parser_action_row1018[] = {
        39,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 333,
-       59, 0, 1177,
+       54, 1, 337,
+       59, 0, 1187,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -11698,13 +11746,13 @@ static int parser_action_row1010[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 333,
+       73, 1, 337,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -11712,21 +11760,21 @@ static int parser_action_row1010[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1011[] = {
+static int parser_action_row1019[] = {
        1,
-       -1, 1, 437
+       -1, 1, 439
 };
-static int parser_action_row1012[] = {
+static int parser_action_row1020[] = {
        1,
-       -1, 1, 219
+       -1, 1, 221
 };
-static int parser_action_row1013[] = {
+static int parser_action_row1021[] = {
        1,
-       -1, 1, 238
+       -1, 1, 240
 };
-static int parser_action_row1014[] = {
+static int parser_action_row1022[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11751,32 +11799,32 @@ static int parser_action_row1014[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1015[] = {
+static int parser_action_row1023[] = {
        3,
-       -1, 1, 769,
+       -1, 1, 771,
        52, 0, 277,
        58, 0, 215
 };
-static int parser_action_row1016[] = {
+static int parser_action_row1024[] = {
        2,
-       -1, 3, 1015,
-       97, 0, 1183
+       -1, 3, 1023,
+       97, 0, 1193
 };
-static int parser_action_row1017[] = {
+static int parser_action_row1025[] = {
        3,
-       -1, 3, 1016,
+       -1, 3, 1024,
        96, 0, 53,
-       97, 0, 1184
+       97, 0, 1194
 };
-static int parser_action_row1018[] = {
+static int parser_action_row1026[] = {
        3,
-       -1, 1, 740,
-       54, 1, 743,
-       73, 1, 743
+       -1, 1, 742,
+       54, 1, 745,
+       73, 1, 745
 };
-static int parser_action_row1019[] = {
+static int parser_action_row1027[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11801,54 +11849,54 @@ static int parser_action_row1019[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1020[] = {
+static int parser_action_row1028[] = {
        1,
-       -1, 1, 1083
+       -1, 1, 1085
 };
-static int parser_action_row1021[] = {
+static int parser_action_row1029[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1022[] = {
+static int parser_action_row1030[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1023[] = {
+static int parser_action_row1031[] = {
        1,
-       -1, 1, 747
+       -1, 1, 749
 };
-static int parser_action_row1024[] = {
+static int parser_action_row1032[] = {
        1,
-       -1, 1, 751
+       -1, 1, 753
 };
-static int parser_action_row1025[] = {
+static int parser_action_row1033[] = {
        2,
-       -1, 1, 750,
+       -1, 1, 752,
        52, 0, 277
 };
-static int parser_action_row1026[] = {
+static int parser_action_row1034[] = {
        1,
-       -1, 1, 204
+       -1, 1, 206
 };
-static int parser_action_row1027[] = {
+static int parser_action_row1035[] = {
        2,
-       -1, 1, 191,
-       24, 1, 922
+       -1, 1, 193,
+       24, 1, 924
 };
-static int parser_action_row1028[] = {
+static int parser_action_row1036[] = {
        3,
-       -1, 1, 156,
-       24, 1, 894,
-       49, 1, 979
+       -1, 1, 158,
+       24, 1, 896,
+       49, 1, 981
 };
-static int parser_action_row1029[] = {
+static int parser_action_row1037[] = {
        31,
-       -1, 1, 456,
-       9, 0, 1190,
+       -1, 1, 458,
+       9, 0, 1200,
        12, 0, 31,
        15, 0, 33,
        16, 0, 34,
@@ -11879,22 +11927,22 @@ static int parser_action_row1029[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1030[] = {
+static int parser_action_row1038[] = {
        1,
-       -1, 1, 931
+       -1, 1, 933
 };
-static int parser_action_row1031[] = {
+static int parser_action_row1039[] = {
        1,
-       -1, 1, 895
+       -1, 1, 897
 };
-static int parser_action_row1032[] = {
+static int parser_action_row1040[] = {
        2,
-       -1, 3, 1031,
+       -1, 3, 1039,
        49, 0, 197
 };
-static int parser_action_row1033[] = {
+static int parser_action_row1041[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11919,13 +11967,13 @@ static int parser_action_row1033[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1034[] = {
+static int parser_action_row1042[] = {
        1,
        -1, 1, 261
 };
-static int parser_action_row1035[] = {
+static int parser_action_row1043[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -11950,39 +11998,39 @@ static int parser_action_row1035[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1036[] = {
+static int parser_action_row1044[] = {
        1,
-       -1, 1, 934
+       -1, 1, 936
 };
-static int parser_action_row1037[] = {
+static int parser_action_row1045[] = {
        2,
-       -1, 3, 1036,
+       -1, 3, 1044,
        49, 0, 197
 };
-static int parser_action_row1038[] = {
+static int parser_action_row1046[] = {
        3,
-       -1, 3, 1037,
+       -1, 3, 1045,
        52, 0, 340,
        97, 0, 341
 };
-static int parser_action_row1039[] = {
+static int parser_action_row1047[] = {
        2,
-       -1, 1, 168,
-       24, 1, 899
+       -1, 1, 170,
+       24, 1, 901
 };
-static int parser_action_row1040[] = {
+static int parser_action_row1048[] = {
        2,
-       -1, 1, 173,
-       24, 1, 904
+       -1, 1, 175,
+       24, 1, 906
 };
-static int parser_action_row1041[] = {
+static int parser_action_row1049[] = {
        2,
-       -1, 1, 170,
-       24, 1, 901
+       -1, 1, 172,
+       24, 1, 903
 };
-static int parser_action_row1042[] = {
+static int parser_action_row1050[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -12007,14 +12055,14 @@ static int parser_action_row1042[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1043[] = {
+static int parser_action_row1051[] = {
        2,
-       -1, 1, 276,
-       24, 0, 1198
+       -1, 1, 280,
+       24, 0, 1208
 };
-static int parser_action_row1044[] = {
+static int parser_action_row1052[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -12039,46 +12087,46 @@ static int parser_action_row1044[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1045[] = {
+static int parser_action_row1053[] = {
        3,
-       -1, 3, 1044,
+       -1, 3, 1052,
        47, 0, 396,
        96, 0, 397
 };
-static int parser_action_row1046[] = {
+static int parser_action_row1054[] = {
        2,
-       -1, 1, 185,
-       24, 1, 916
+       -1, 1, 187,
+       24, 1, 918
 };
-static int parser_action_row1047[] = {
+static int parser_action_row1055[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1048[] = {
+static int parser_action_row1056[] = {
        27,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 345,
-       73, 1, 345,
+       54, 1, 349,
+       73, 1, 349,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -12086,15 +12134,15 @@ static int parser_action_row1048[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1049[] = {
+static int parser_action_row1057[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -12106,7 +12154,7 @@ static int parser_action_row1049[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -12114,22 +12162,22 @@ static int parser_action_row1049[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1050[] = {
+static int parser_action_row1058[] = {
        39,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 339,
+       54, 1, 343,
        59, 0, 488,
        60, 0, 217,
        61, 0, 218,
@@ -12142,13 +12190,13 @@ static int parser_action_row1050[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 339,
+       73, 1, 343,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -12156,26 +12204,63 @@ static int parser_action_row1050[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1051[] = {
+static int parser_action_row1059[] = {
+       34,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2,
+       9, 0, 589,
+       12, 0, 31,
+       15, 0, 33,
+       16, 0, 34,
+       22, 0, 35,
+       25, 0, 36,
+       26, 0, 37,
+       27, 0, 38,
+       33, 0, 39,
+       34, 0, 40,
+       35, 0, 41,
+       36, 0, 42,
+       37, 0, 43,
+       38, 0, 44,
+       42, 0, 45,
+       43, 0, 46,
+       44, 0, 47,
+       45, 0, 48,
+       50, 0, 49,
+       51, 0, 50,
+       52, 0, 51,
+       54, 0, 52,
+       95, 0, 3,
+       96, 0, 53,
+       97, 0, 54,
+       99, 0, 55,
+       100, 0, 56,
+       101, 0, 57,
+       102, 0, 58,
+       103, 0, 59,
+       106, 0, 60
+};
+static int parser_action_row1060[] = {
        3,
-       -1, 3, 1050,
+       -1, 3, 1059,
        9, 0, 886,
-       24, 0, 890
+       24, 0, 1216
 };
-static int parser_action_row1052[] = {
+static int parser_action_row1061[] = {
        4,
-       -1, 3, 1051,
+       -1, 3, 1060,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
-static int parser_action_row1053[] = {
+static int parser_action_row1062[] = {
        1,
-       -1, 1, 260
+       -1, 1, 265
 };
-static int parser_action_row1054[] = {
+static int parser_action_row1063[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -12210,15 +12295,15 @@ static int parser_action_row1054[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1055[] = {
+static int parser_action_row1064[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -12230,7 +12315,7 @@ static int parser_action_row1055[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -12238,22 +12323,22 @@ static int parser_action_row1055[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1056[] = {
+static int parser_action_row1065[] = {
        40,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 343,
+       54, 1, 347,
        58, 0, 215,
        59, 0, 493,
        60, 0, 217,
@@ -12267,13 +12352,13 @@ static int parser_action_row1056[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 343,
+       73, 1, 347,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -12281,29 +12366,29 @@ static int parser_action_row1056[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1057[] = {
+static int parser_action_row1066[] = {
        3,
-       -1, 1, 454,
-       12, 0, 1210,
-       97, 0, 1211
+       -1, 1, 456,
+       12, 0, 1222,
+       97, 0, 1223
 };
-static int parser_action_row1058[] = {
+static int parser_action_row1067[] = {
        1,
-       -1, 1, 265
+       -1, 1, 269
 };
-static int parser_action_row1059[] = {
+static int parser_action_row1068[] = {
        1,
-       -1, 1, 445
+       -1, 1, 447
 };
-static int parser_action_row1060[] = {
+static int parser_action_row1069[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1061[] = {
+static int parser_action_row1070[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -12328,90 +12413,90 @@ static int parser_action_row1061[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1062[] = {
+static int parser_action_row1071[] = {
        3,
-       -1, 1, 323,
-       54, 1, 326,
-       73, 1, 326
+       -1, 1, 327,
+       54, 1, 330,
+       73, 1, 330
 };
-static int parser_action_row1063[] = {
+static int parser_action_row1072[] = {
        1,
-       -1, 1, 330
+       -1, 1, 334
 };
-static int parser_action_row1064[] = {
+static int parser_action_row1073[] = {
        1,
-       -1, 1, 334
+       -1, 1, 338
 };
-static int parser_action_row1065[] = {
+static int parser_action_row1074[] = {
        2,
-       -1, 1, 333,
+       -1, 1, 337,
        52, 0, 277
 };
-static int parser_action_row1066[] = {
+static int parser_action_row1075[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1067[] = {
+static int parser_action_row1076[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1068[] = {
+static int parser_action_row1077[] = {
        1,
-       -1, 1, 1066
+       -1, 1, 1070
 };
-static int parser_action_row1069[] = {
+static int parser_action_row1078[] = {
        2,
-       -1, 1, 149,
-       56, 0, 1066
+       -1, 1, 151,
+       56, 0, 1075
 };
-static int parser_action_row1070[] = {
+static int parser_action_row1079[] = {
        2,
-       -1, 3, 1069,
-       55, 0, 1218
+       -1, 3, 1078,
+       55, 0, 1230
 };
-static int parser_action_row1071[] = {
+static int parser_action_row1080[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1072[] = {
+static int parser_action_row1081[] = {
        2,
-       -1, 1, 795,
+       -1, 1, 797,
        94, 0, 594
 };
-static int parser_action_row1073[] = {
+static int parser_action_row1082[] = {
        1,
-       -1, 1, 351
+       -1, 1, 355
 };
-static int parser_action_row1074[] = {
+static int parser_action_row1083[] = {
        2,
-       -1, 1, 354,
+       -1, 1, 358,
        52, 0, 277
 };
-static int parser_action_row1075[] = {
+static int parser_action_row1084[] = {
        3,
-       -1, 1, 358,
+       -1, 1, 362,
        52, 0, 277,
        58, 0, 215
 };
-static int parser_action_row1076[] = {
+static int parser_action_row1085[] = {
        2,
-       -1, 3, 1075,
-       97, 0, 1223
+       -1, 3, 1084,
+       97, 0, 1235
 };
-static int parser_action_row1077[] = {
+static int parser_action_row1086[] = {
        13,
-       -1, 1, 401,
+       -1, 1, 405,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
-       52, 0, 1224,
+       52, 0, 1236,
        94, 0, 204,
        99, 0, 131,
        100, 0, 132,
@@ -12420,22 +12505,22 @@ static int parser_action_row1077[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1078[] = {
+static int parser_action_row1087[] = {
        1,
-       -1, 1, 399
+       -1, 1, 403
 };
-static int parser_action_row1079[] = {
+static int parser_action_row1088[] = {
        2,
-       -1, 1, 28,
+       -1, 1, 30,
        13, 0, 32
 };
-static int parser_action_row1080[] = {
+static int parser_action_row1089[] = {
        1,
-       -1, 1, 1077
+       -1, 1, 1081
 };
-static int parser_action_row1081[] = {
+static int parser_action_row1090[] = {
        54,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        15, 0, 33,
        16, 0, 34,
@@ -12490,13 +12575,13 @@ static int parser_action_row1081[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1082[] = {
+static int parser_action_row1091[] = {
        1,
-       -1, 1, 271
+       -1, 1, 275
 };
-static int parser_action_row1083[] = {
+static int parser_action_row1092[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -12521,34 +12606,34 @@ static int parser_action_row1083[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1084[] = {
+static int parser_action_row1093[] = {
        1,
-       -1, 1, 269
+       -1, 1, 273
 };
-static int parser_action_row1085[] = {
+static int parser_action_row1094[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1086[] = {
+static int parser_action_row1095[] = {
        2,
-       -1, 3, 1085,
-       55, 0, 1233
+       -1, 3, 1094,
+       55, 0, 1245
 };
-static int parser_action_row1087[] = {
+static int parser_action_row1096[] = {
        1,
-       -1, 1, 998
+       -1, 1, 1000
 };
-static int parser_action_row1088[] = {
+static int parser_action_row1097[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -12561,7 +12646,7 @@ static int parser_action_row1088[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -12569,11 +12654,11 @@ static int parser_action_row1088[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1089[] = {
+static int parser_action_row1098[] = {
        14,
-       -1, 1, 331,
+       -1, 1, 335,
        52, 0, 277,
-       59, 0, 1234,
+       59, 0, 1246,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -12586,12 +12671,12 @@ static int parser_action_row1089[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1090[] = {
+static int parser_action_row1099[] = {
        15,
-       -1, 1, 335,
+       -1, 1, 339,
        52, 0, 277,
        58, 0, 215,
-       59, 0, 1235,
+       59, 0, 1247,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -12604,9 +12689,9 @@ static int parser_action_row1090[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1091[] = {
+static int parser_action_row1100[] = {
        22,
-       -1, 1, 454,
+       -1, 1, 456,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -12627,364 +12712,360 @@ static int parser_action_row1091[] = {
        90, 0, 421,
        91, 0, 422,
        92, 0, 423,
-       97, 0, 1236
+       97, 0, 1248
 };
-static int parser_action_row1092[] = {
+static int parser_action_row1101[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1093[] = {
+static int parser_action_row1102[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1094[] = {
+static int parser_action_row1103[] = {
        2,
-       -1, 1, 594,
+       -1, 1, 596,
        52, 0, 277
 };
-static int parser_action_row1095[] = {
+static int parser_action_row1104[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1096[] = {
+static int parser_action_row1105[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1097[] = {
+static int parser_action_row1106[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1098[] = {
+static int parser_action_row1107[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1099[] = {
+static int parser_action_row1108[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1100[] = {
+static int parser_action_row1109[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1101[] = {
+static int parser_action_row1110[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1102[] = {
+static int parser_action_row1111[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1103[] = {
+static int parser_action_row1112[] = {
        16,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1248,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1260,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
        52, 0, 51,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1104[] = {
+static int parser_action_row1113[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1105[] = {
+static int parser_action_row1114[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1106[] = {
+static int parser_action_row1115[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1107[] = {
+static int parser_action_row1116[] = {
        3,
-       -1, 1, 576,
+       -1, 1, 578,
        52, 0, 277,
        58, 0, 215
 };
-static int parser_action_row1108[] = {
+static int parser_action_row1117[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1109[] = {
+static int parser_action_row1118[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1110[] = {
+static int parser_action_row1119[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1111[] = {
+static int parser_action_row1120[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1112[] = {
+static int parser_action_row1121[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1113[] = {
+static int parser_action_row1122[] = {
        1,
-       -1, 1, 619
+       -1, 1, 621
 };
-static int parser_action_row1114[] = {
+static int parser_action_row1123[] = {
        1,
-       -1, 1, 618
+       -1, 1, 620
 };
-static int parser_action_row1115[] = {
+static int parser_action_row1124[] = {
        3,
-       -1, 3, 1114,
-       41, 0, 1260,
-       98, 0, 1261
+       -1, 3, 1123,
+       41, 0, 1272,
+       98, 0, 1273
 };
-static int parser_action_row1116[] = {
+static int parser_action_row1125[] = {
        2,
-       -1, 1, 453,
-       97, 0, 1262
+       -1, 1, 455,
+       97, 0, 1274
 };
-static int parser_action_row1117[] = {
+static int parser_action_row1126[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1118[] = {
+static int parser_action_row1127[] = {
        4,
-       -1, 1, 524,
-       29, 0, 1264,
-       30, 0, 1265,
-       32, 0, 1266
+       -1, 1, 526,
+       29, 0, 1276,
+       30, 0, 1277,
+       32, 0, 1278
 };
-static int parser_action_row1119[] = {
+static int parser_action_row1128[] = {
        1,
-       -1, 1, 526
+       -1, 1, 528
 };
-static int parser_action_row1120[] = {
+static int parser_action_row1129[] = {
        1,
-       -1, 1, 531
+       -1, 1, 533
 };
-static int parser_action_row1121[] = {
+static int parser_action_row1130[] = {
        10,
-       -1, 1, 533,
-       39, 0, 1267,
-       80, 0, 1268,
-       84, 0, 1269,
-       85, 0, 1270,
-       86, 0, 1271,
-       87, 0, 1272,
-       89, 0, 1273,
-       90, 0, 1274,
-       92, 0, 1275
-};
-static int parser_action_row1122[] = {
-       2,
-       -1, 1, 542,
-       81, 0, 1276
+       -1, 1, 535,
+       39, 0, 1279,
+       80, 0, 1280,
+       84, 0, 1281,
+       85, 0, 1282,
+       86, 0, 1283,
+       87, 0, 1284,
+       89, 0, 1285,
+       90, 0, 1286,
+       92, 0, 1287
 };
-static int parser_action_row1123[] = {
+static int parser_action_row1131[] = {
        2,
        -1, 1, 544,
-       82, 0, 1277
+       81, 0, 1288
 };
-static int parser_action_row1124[] = {
-       3,
+static int parser_action_row1132[] = {
+       2,
        -1, 1, 546,
-       88, 0, 1278,
-       91, 0, 1279
+       82, 0, 1289
 };
-static int parser_action_row1125[] = {
+static int parser_action_row1133[] = {
        3,
        -1, 1, 548,
-       74, 0, 1280,
-       75, 0, 1281
+       88, 0, 1290,
+       91, 0, 1291
 };
-static int parser_action_row1126[] = {
+static int parser_action_row1134[] = {
+       3,
+       -1, 1, 550,
+       74, 0, 1292,
+       75, 0, 1293
+};
+static int parser_action_row1135[] = {
        4,
-       -1, 1, 551,
-       76, 0, 1282,
-       78, 0, 1283,
-       79, 0, 1284
+       -1, 1, 553,
+       76, 0, 1294,
+       78, 0, 1295,
+       79, 0, 1296
 };
-static int parser_action_row1127[] = {
+static int parser_action_row1136[] = {
        1,
-       -1, 1, 554
+       -1, 1, 556
 };
-static int parser_action_row1128[] = {
+static int parser_action_row1137[] = {
        2,
-       -1, 1, 558,
-       77, 0, 1285
+       -1, 1, 560,
+       77, 0, 1297
 };
-static int parser_action_row1129[] = {
+static int parser_action_row1138[] = {
        1,
-       -1, 1, 560
+       -1, 1, 562
 };
-static int parser_action_row1130[] = {
+static int parser_action_row1139[] = {
        2,
-       -1, 1, 565,
-       73, 0, 1286
+       -1, 1, 567,
+       73, 0, 1298
 };
-static int parser_action_row1131[] = {
+static int parser_action_row1140[] = {
        1,
-       -1, 1, 570
+       -1, 1, 572
 };
-static int parser_action_row1132[] = {
+static int parser_action_row1141[] = {
        3,
-       -1, 1, 455,
+       -1, 1, 457,
        96, 0, 53,
-       97, 0, 1287
+       97, 0, 1299
 };
-static int parser_action_row1133[] = {
+static int parser_action_row1142[] = {
        1,
-       -1, 1, 386
+       -1, 1, 390
 };
-static int parser_action_row1134[] = {
+static int parser_action_row1143[] = {
        2,
-       -1, 1, 451,
+       -1, 1, 453,
        58, 0, 215
 };
-static int parser_action_row1135[] = {
+static int parser_action_row1144[] = {
        2,
-       -1, 3, 1134,
-       97, 0, 1289
-};
-static int parser_action_row1136[] = {
-       1,
-       -1, 1, 74
+       -1, 3, 1143,
+       97, 0, 1301
 };
-static int parser_action_row1137[] = {
+static int parser_action_row1145[] = {
        1,
-       -1, 1, 404
+       -1, 1, 76
 };
-static int parser_action_row1138[] = {
+static int parser_action_row1146[] = {
        4,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
-static int parser_action_row1139[] = {
+static int parser_action_row1147[] = {
        1,
        -1, 1, 16
 };
-static int parser_action_row1140[] = {
+static int parser_action_row1148[] = {
        1,
        -1, 1, 17
 };
-static int parser_action_row1141[] = {
+static int parser_action_row1149[] = {
        3,
-       -1, 1, 401,
+       -1, 1, 405,
        57, 0, 829,
        94, 0, 204
 };
-static int parser_action_row1142[] = {
+static int parser_action_row1150[] = {
        2,
-       -1, 3, 1141,
-       53, 0, 1297
+       -1, 3, 1149,
+       53, 0, 1308
 };
-static int parser_action_row1143[] = {
+static int parser_action_row1151[] = {
        4,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
-       56, 0, 1298
+       56, 0, 1309
 };
-static int parser_action_row1144[] = {
+static int parser_action_row1152[] = {
        1,
-       -1, 1, 151
+       -1, 1, 153
 };
-static int parser_action_row1145[] = {
+static int parser_action_row1153[] = {
        25,
-       -1, 3, 1144,
-       41, 0, 1302,
+       -1, 3, 1152,
+       41, 0, 1313,
        47, 0, 396,
        54, 0, 640,
        74, 0, 641,
@@ -13009,28 +13090,28 @@ static int parser_action_row1145[] = {
        96, 0, 424,
        97, 0, 660
 };
-static int parser_action_row1146[] = {
+static int parser_action_row1154[] = {
        4,
-       -1, 1, 77,
-       0, 1, 494,
-       1, 1, 494,
-       95, 1, 494
+       -1, 1, 79,
+       0, 1, 496,
+       1, 1, 496,
+       95, 1, 496
 };
-static int parser_action_row1147[] = {
+static int parser_action_row1155[] = {
        4,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
-static int parser_action_row1148[] = {
+static int parser_action_row1156[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
-static int parser_action_row1149[] = {
+static int parser_action_row1157[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -13065,116 +13146,171 @@ static int parser_action_row1149[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1150[] = {
+static int parser_action_row1158[] = {
        3,
-       -1, 3, 1149,
+       -1, 3, 1157,
        28, 0, 84,
        109, 0, 85
 };
-static int parser_action_row1151[] = {
+static int parser_action_row1159[] = {
        1,
-       -1, 1, 492
+       -1, 1, 494
 };
-static int parser_action_row1152[] = {
+static int parser_action_row1160[] = {
        2,
-       -1, 3, 1151,
-       96, 0, 1313
+       -1, 1, 39,
+       96, 0, 1324
 };
-static int parser_action_row1153[] = {
-       2,
-       -1, 1, 73,
-       9, 1, 43
+static int parser_action_row1161[] = {
+       1,
+       -1, 1, 26
 };
-static int parser_action_row1154[] = {
+static int parser_action_row1162[] = {
+       1,
+       -1, 1, 47
+};
+static int parser_action_row1163[] = {
        2,
-       -1, 3, 1153,
-       9, 0, 1315
+       -1, 3, 1162,
+       9, 0, 1327
 };
-static int parser_action_row1155[] = {
+static int parser_action_row1164[] = {
        1,
-       -1, 1, 1060
+       -1, 1, 1050
 };
-static int parser_action_row1156[] = {
-       4,
-       -1, 3, 1155,
-       0, 0, 88,
-       1, 0, 89,
-       95, 0, 90
+static int parser_action_row1165[] = {
+       1,
+       -1, 1, 1049
 };
-static int parser_action_row1157[] = {
-       4,
-       -1, 1, 483,
-       0, 0, 1,
-       1, 0, 2,
-       95, 0, 3
+static int parser_action_row1166[] = {
+       5,
+       -1, 1, 81,
+       18, 0, 236,
+       19, 0, 237,
+       20, 0, 238,
+       21, 0, 239
 };
-static int parser_action_row1158[] = {
+static int parser_action_row1167[] = {
+       56,
+       -1, 1, 420,
+       12, 0, 116,
+       15, 0, 33,
+       16, 0, 34,
+       22, 0, 117,
+       25, 0, 36,
+       26, 0, 37,
+       27, 0, 38,
+       31, 0, 118,
+       33, 0, 1329,
+       34, 0, 1330,
+       35, 0, 1331,
+       36, 0, 1332,
+       37, 0, 43,
+       38, 0, 119,
+       40, 0, 120,
+       41, 1, 458,
+       42, 0, 121,
+       43, 0, 122,
+       44, 0, 123,
+       45, 0, 124,
+       47, 0, 396,
+       48, 0, 125,
+       50, 0, 49,
+       51, 0, 1333,
+       52, 0, 1334,
+       54, 0, 619,
+       74, 0, 1335,
+       75, 0, 1336,
+       76, 0, 407,
+       77, 0, 408,
+       78, 0, 409,
+       79, 0, 410,
+       80, 0, 411,
+       81, 0, 412,
+       82, 0, 413,
+       83, 0, 1337,
+       84, 0, 415,
+       85, 0, 416,
+       86, 0, 417,
+       87, 0, 418,
+       88, 0, 419,
+       89, 0, 420,
+       90, 0, 421,
+       91, 0, 422,
+       92, 0, 423,
+       94, 0, 204,
+       96, 0, 424,
+       97, 0, 1338,
+       98, 1, 458,
+       99, 0, 131,
+       100, 0, 132,
+       101, 0, 133,
+       102, 0, 134,
+       103, 0, 59,
+       106, 0, 135
+};
+static int parser_action_row1168[] = {
        1,
-       -1, 1, 72
+       -1, 1, 75
 };
-static int parser_action_row1159[] = {
+static int parser_action_row1169[] = {
        1,
-       -1, 1, 484
+       -1, 1, 1063
 };
-static int parser_action_row1160[] = {
-       5,
-       -1, 1, 28,
-       6, 0, 1318,
-       9, 1, 44,
+static int parser_action_row1170[] = {
+       4,
+       -1, 1, 30,
+       6, 0, 1163,
        13, 0, 32,
-       97, 0, 1319
+       97, 0, 1164
 };
-static int parser_action_row1161[] = {
-       5,
-       -1, 1, 483,
-       0, 0, 1,
-       1, 0, 2,
-       9, 1, 485,
-       95, 0, 3
+static int parser_action_row1171[] = {
+       1,
+       -1, 1, 44
 };
-static int parser_action_row1162[] = {
+static int parser_action_row1172[] = {
        1,
-       -1, 1, 459
+       -1, 1, 461
 };
-static int parser_action_row1163[] = {
+static int parser_action_row1173[] = {
        2,
-       -1, 3, 1162,
-       45, 0, 1326
+       -1, 3, 1172,
+       45, 0, 1358
 };
-static int parser_action_row1164[] = {
+static int parser_action_row1174[] = {
        4,
-       -1, 3, 1163,
-       31, 0, 1327,
+       -1, 3, 1173,
+       31, 0, 1359,
        47, 0, 396,
        96, 0, 397
 };
-static int parser_action_row1165[] = {
+static int parser_action_row1175[] = {
        1,
-       -1, 1, 207
+       -1, 1, 209
 };
-static int parser_action_row1166[] = {
+static int parser_action_row1176[] = {
        1,
-       -1, 1, 226
+       -1, 1, 228
 };
-static int parser_action_row1167[] = {
+static int parser_action_row1177[] = {
        1,
-       -1, 1, 205
+       -1, 1, 207
 };
-static int parser_action_row1168[] = {
+static int parser_action_row1178[] = {
        1,
-       -1, 1, 224
+       -1, 1, 226
 };
-static int parser_action_row1169[] = {
+static int parser_action_row1179[] = {
        1,
-       -1, 1, 210
+       -1, 1, 212
 };
-static int parser_action_row1170[] = {
+static int parser_action_row1180[] = {
        1,
-       -1, 1, 229
+       -1, 1, 231
 };
-static int parser_action_row1171[] = {
+static int parser_action_row1181[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -13199,9 +13335,9 @@ static int parser_action_row1171[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1172[] = {
+static int parser_action_row1182[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -13226,17 +13362,17 @@ static int parser_action_row1172[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1173[] = {
+static int parser_action_row1183[] = {
        1,
-       -1, 1, 214
+       -1, 1, 216
 };
-static int parser_action_row1174[] = {
+static int parser_action_row1184[] = {
        1,
-       -1, 1, 233
+       -1, 1, 235
 };
-static int parser_action_row1175[] = {
+static int parser_action_row1185[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -13261,9 +13397,9 @@ static int parser_action_row1175[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1176[] = {
+static int parser_action_row1186[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -13288,13 +13424,13 @@ static int parser_action_row1176[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1177[] = {
+static int parser_action_row1187[] = {
        1,
-       -1, 1, 193
+       -1, 1, 195
 };
-static int parser_action_row1178[] = {
+static int parser_action_row1188[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -13319,9 +13455,9 @@ static int parser_action_row1178[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1179[] = {
+static int parser_action_row1189[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -13346,10 +13482,10 @@ static int parser_action_row1179[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1180[] = {
+static int parser_action_row1190[] = {
        13,
-       -1, 1, 332,
-       59, 0, 1335,
+       -1, 1, 336,
+       59, 0, 1367,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -13362,109 +13498,109 @@ static int parser_action_row1180[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1181[] = {
+static int parser_action_row1191[] = {
        1,
-       -1, 1, 183
+       -1, 1, 185
 };
-static int parser_action_row1182[] = {
+static int parser_action_row1192[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1183[] = {
+static int parser_action_row1193[] = {
        1,
-       -1, 1, 768
+       -1, 1, 770
 };
-static int parser_action_row1184[] = {
+static int parser_action_row1194[] = {
        2,
-       -1, 1, 771,
+       -1, 1, 773,
        52, 0, 277
 };
-static int parser_action_row1185[] = {
+static int parser_action_row1195[] = {
        3,
-       -1, 1, 775,
+       -1, 1, 777,
        52, 0, 277,
        58, 0, 215
 };
-static int parser_action_row1186[] = {
+static int parser_action_row1196[] = {
        2,
-       -1, 3, 1185,
-       97, 0, 1340
+       -1, 3, 1195,
+       97, 0, 1372
 };
-static int parser_action_row1187[] = {
+static int parser_action_row1197[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1188[] = {
+static int parser_action_row1198[] = {
        2,
-       -1, 3, 1187,
-       45, 0, 1342
+       -1, 3, 1197,
+       45, 0, 1374
 };
-static int parser_action_row1189[] = {
+static int parser_action_row1199[] = {
        4,
-       -1, 3, 1188,
-       31, 0, 1343,
+       -1, 3, 1198,
+       31, 0, 1375,
        47, 0, 396,
        96, 0, 397
 };
-static int parser_action_row1190[] = {
+static int parser_action_row1200[] = {
        1,
-       -1, 1, 749
+       -1, 1, 751
 };
-static int parser_action_row1191[] = {
+static int parser_action_row1201[] = {
        3,
-       -1, 1, 155,
-       24, 1, 893,
-       49, 1, 978
+       -1, 1, 157,
+       24, 1, 895,
+       49, 1, 980
 };
-static int parser_action_row1192[] = {
+static int parser_action_row1202[] = {
        3,
-       -1, 1, 154,
-       24, 1, 892,
-       49, 1, 977
+       -1, 1, 156,
+       24, 1, 894,
+       49, 1, 979
 };
-static int parser_action_row1193[] = {
+static int parser_action_row1203[] = {
        2,
-       -1, 1, 254,
-       24, 1, 930
+       -1, 1, 256,
+       24, 1, 932
 };
-static int parser_action_row1194[] = {
+static int parser_action_row1204[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1195[] = {
+static int parser_action_row1205[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1196[] = {
+static int parser_action_row1206[] = {
        2,
-       -1, 1, 263,
-       24, 1, 933
+       -1, 1, 267,
+       24, 1, 935
 };
-static int parser_action_row1197[] = {
+static int parser_action_row1207[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1198[] = {
+static int parser_action_row1208[] = {
        2,
-       -1, 1, 277,
-       24, 0, 1348
+       -1, 1, 281,
+       24, 0, 1380
 };
-static int parser_action_row1199[] = {
+static int parser_action_row1209[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1349,
+       9, 0, 1381,
        12, 0, 887,
        15, 0, 888,
        16, 0, 34,
@@ -13496,74 +13632,115 @@ static int parser_action_row1199[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1200[] = {
+static int parser_action_row1210[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1201[] = {
+static int parser_action_row1211[] = {
        2,
-       -1, 3, 1200,
-       57, 0, 1353
+       -1, 3, 1210,
+       57, 0, 1385
 };
-static int parser_action_row1202[] = {
+static int parser_action_row1212[] = {
        5,
-       -1, 1, 456,
-       12, 0, 1354,
+       -1, 1, 458,
+       12, 0, 1386,
        46, 0, 669,
        96, 0, 53,
-       97, 0, 1355
+       97, 0, 1387
 };
-static int parser_action_row1203[] = {
+static int parser_action_row1213[] = {
        2,
-       -1, 1, 189,
-       24, 1, 920
+       -1, 1, 191,
+       24, 1, 922
 };
-static int parser_action_row1204[] = {
+static int parser_action_row1214[] = {
        2,
-       -1, 1, 195,
-       24, 1, 926
+       -1, 1, 197,
+       24, 1, 928
 };
-static int parser_action_row1205[] = {
+static int parser_action_row1215[] = {
        2,
-       -1, 1, 186,
-       24, 1, 917
+       -1, 1, 188,
+       24, 1, 919
 };
-static int parser_action_row1206[] = {
+static int parser_action_row1216[] = {
        1,
-       -1, 1, 258
+       -1, 1, 262
 };
-static int parser_action_row1207[] = {
+static int parser_action_row1217[] = {
+       34,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2,
+       9, 0, 589,
+       12, 0, 31,
+       15, 0, 33,
+       16, 0, 34,
+       22, 0, 35,
+       25, 0, 36,
+       26, 0, 37,
+       27, 0, 38,
+       33, 0, 39,
+       34, 0, 40,
+       35, 0, 41,
+       36, 0, 42,
+       37, 0, 43,
+       38, 0, 44,
+       42, 0, 45,
+       43, 0, 46,
+       44, 0, 47,
+       45, 0, 48,
+       50, 0, 49,
+       51, 0, 50,
+       52, 0, 51,
+       54, 0, 52,
+       95, 0, 3,
+       96, 0, 53,
+       97, 0, 54,
+       99, 0, 55,
+       100, 0, 56,
+       101, 0, 57,
+       102, 0, 58,
+       103, 0, 59,
+       106, 0, 60
+};
+static int parser_action_row1218[] = {
+       1,
+       -1, 1, 263
+};
+static int parser_action_row1219[] = {
        4,
-       -1, 3, 1206,
+       -1, 3, 1218,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
-static int parser_action_row1208[] = {
+static int parser_action_row1220[] = {
        1,
-       -1, 1, 256
+       -1, 1, 258
 };
-static int parser_action_row1209[] = {
+static int parser_action_row1221[] = {
        2,
-       -1, 1, 197,
-       24, 1, 928
+       -1, 1, 199,
+       24, 1, 930
 };
-static int parser_action_row1210[] = {
+static int parser_action_row1222[] = {
        2,
-       -1, 1, 188,
-       24, 1, 919
+       -1, 1, 190,
+       24, 1, 921
 };
-static int parser_action_row1211[] = {
+static int parser_action_row1223[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -13575,7 +13752,7 @@ static int parser_action_row1211[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -13583,22 +13760,22 @@ static int parser_action_row1211[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1212[] = {
+static int parser_action_row1224[] = {
        39,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 341,
+       54, 1, 345,
        59, 0, 691,
        60, 0, 217,
        61, 0, 218,
@@ -13611,13 +13788,13 @@ static int parser_action_row1212[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 341,
+       73, 1, 345,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -13625,119 +13802,119 @@ static int parser_action_row1212[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1213[] = {
+static int parser_action_row1225[] = {
        2,
-       -1, 3, 1212,
-       15, 0, 1360
+       -1, 3, 1224,
+       15, 0, 1393
 };
-static int parser_action_row1214[] = {
+static int parser_action_row1226[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1215[] = {
+static int parser_action_row1227[] = {
        1,
-       -1, 1, 332
+       -1, 1, 336
 };
-static int parser_action_row1216[] = {
+static int parser_action_row1228[] = {
        2,
-       -1, 3, 1215,
-       55, 0, 1362
+       -1, 3, 1227,
+       55, 0, 1395
 };
-static int parser_action_row1217[] = {
+static int parser_action_row1229[] = {
        3,
-       -1, 3, 1216,
+       -1, 3, 1228,
        47, 0, 396,
        96, 0, 397
 };
-static int parser_action_row1218[] = {
+static int parser_action_row1230[] = {
        1,
-       -1, 1, 1067
+       -1, 1, 1071
 };
-static int parser_action_row1219[] = {
+static int parser_action_row1231[] = {
        2,
-       -1, 1, 795,
+       -1, 1, 797,
        94, 0, 594
 };
-static int parser_action_row1220[] = {
+static int parser_action_row1232[] = {
        2,
-       -1, 3, 1219,
-       53, 0, 1365
+       -1, 3, 1231,
+       53, 0, 1398
 };
-static int parser_action_row1221[] = {
+static int parser_action_row1233[] = {
        1,
-       -1, 1, 796
+       -1, 1, 798
 };
-static int parser_action_row1222[] = {
+static int parser_action_row1234[] = {
        1,
-       -1, 1, 353
+       -1, 1, 357
 };
-static int parser_action_row1223[] = {
+static int parser_action_row1235[] = {
        1,
-       -1, 1, 357
+       -1, 1, 361
 };
-static int parser_action_row1224[] = {
+static int parser_action_row1236[] = {
        2,
-       -1, 1, 356,
+       -1, 1, 360,
        52, 0, 277
 };
-static int parser_action_row1225[] = {
+static int parser_action_row1237[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1226[] = {
+static int parser_action_row1238[] = {
        1,
-       -1, 1, 407
+       -1, 1, 410
 };
-static int parser_action_row1227[] = {
+static int parser_action_row1239[] = {
        1,
-       -1, 1, 409
+       -1, 1, 412
 };
-static int parser_action_row1228[] = {
+static int parser_action_row1240[] = {
        1,
-       -1, 1, 410
+       -1, 1, 413
 };
-static int parser_action_row1229[] = {
+static int parser_action_row1241[] = {
        1,
-       -1, 1, 411
+       -1, 1, 414
 };
-static int parser_action_row1230[] = {
+static int parser_action_row1242[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1231[] = {
+static int parser_action_row1243[] = {
        2,
-       -1, 1, 423,
-       56, 0, 1369
+       -1, 1, 425,
+       56, 0, 1402
 };
-static int parser_action_row1232[] = {
+static int parser_action_row1244[] = {
        1,
-       -1, 1, 272
+       -1, 1, 276
 };
-static int parser_action_row1233[] = {
+static int parser_action_row1245[] = {
        2,
-       -1, 3, 1232,
-       55, 0, 1372
+       -1, 3, 1244,
+       55, 0, 1405
 };
-static int parser_action_row1234[] = {
+static int parser_action_row1246[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1235[] = {
+static int parser_action_row1247[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -13750,7 +13927,7 @@ static int parser_action_row1235[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -13758,15 +13935,15 @@ static int parser_action_row1235[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1236[] = {
+static int parser_action_row1248[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -13779,7 +13956,7 @@ static int parser_action_row1236[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -13787,11 +13964,11 @@ static int parser_action_row1236[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1237[] = {
+static int parser_action_row1249[] = {
        14,
-       -1, 1, 333,
+       -1, 1, 337,
        52, 0, 277,
-       59, 0, 1374,
+       59, 0, 1407,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -13804,9 +13981,9 @@ static int parser_action_row1237[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1238[] = {
+static int parser_action_row1250[] = {
        25,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 446,
        27, 0, 447,
@@ -13832,9 +14009,9 @@ static int parser_action_row1238[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1239[] = {
+static int parser_action_row1251[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -13859,13 +14036,13 @@ static int parser_action_row1239[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1240[] = {
+static int parser_action_row1252[] = {
        1,
-       -1, 1, 592
+       -1, 1, 594
 };
-static int parser_action_row1241[] = {
+static int parser_action_row1253[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -13890,494 +14067,650 @@ static int parser_action_row1241[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1242[] = {
+static int parser_action_row1254[] = {
        22,
-       -1, 1, 456,
-       12, 0, 1093,
-       31, 0, 1095,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       31, 0, 1104,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1243[] = {
+static int parser_action_row1255[] = {
        3,
-       -1, 3, 1242,
-       47, 0, 1380,
-       96, 0, 1381
+       -1, 3, 1254,
+       47, 0, 1413,
+       96, 0, 1414
 };
-static int parser_action_row1244[] = {
+static int parser_action_row1256[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1245[] = {
+static int parser_action_row1257[] = {
        1,
-       -1, 1, 609
+       -1, 1, 611
 };
-static int parser_action_row1246[] = {
+static int parser_action_row1258[] = {
        1,
-       -1, 1, 610
+       -1, 1, 612
 };
-static int parser_action_row1247[] = {
+static int parser_action_row1259[] = {
        1,
-       -1, 1, 611
+       -1, 1, 613
 };
-static int parser_action_row1248[] = {
+static int parser_action_row1260[] = {
        1,
-       -1, 1, 612
+       -1, 1, 614
 };
-static int parser_action_row1249[] = {
+static int parser_action_row1261[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1250[] = {
+static int parser_action_row1262[] = {
        3,
-       -1, 3, 1249,
-       41, 0, 1260,
-       98, 0, 1385
+       -1, 3, 1261,
+       41, 0, 1272,
+       98, 0, 1418
 };
-static int parser_action_row1251[] = {
+static int parser_action_row1263[] = {
        2,
-       -1, 3, 1250,
-       73, 0, 1386
-};
-static int parser_action_row1252[] = {
-       1,
-       -1, 1, 562
+       -1, 3, 1262,
+       73, 0, 1419
 };
-static int parser_action_row1253[] = {
+static int parser_action_row1264[] = {
        1,
-       -1, 1, 561
+       -1, 1, 564
 };
-static int parser_action_row1254[] = {
+static int parser_action_row1265[] = {
        1,
        -1, 1, 563
 };
-static int parser_action_row1255[] = {
+static int parser_action_row1266[] = {
        1,
-       -1, 1, 574
+       -1, 1, 565
 };
-static int parser_action_row1256[] = {
+static int parser_action_row1267[] = {
        1,
-       -1, 1, 613
+       -1, 1, 576
 };
-static int parser_action_row1257[] = {
+static int parser_action_row1268[] = {
        1,
-       -1, 1, 614
+       -1, 1, 615
 };
-static int parser_action_row1258[] = {
+static int parser_action_row1269[] = {
        1,
-       -1, 1, 615
+       -1, 1, 616
 };
-static int parser_action_row1259[] = {
+static int parser_action_row1270[] = {
        1,
        -1, 1, 617
 };
-static int parser_action_row1260[] = {
+static int parser_action_row1271[] = {
        1,
-       -1, 1, 616
-};
-static int parser_action_row1261[] = {
-       2,
-       -1, 1, 590,
-       52, 0, 277
+       -1, 1, 619
 };
-static int parser_action_row1262[] = {
+static int parser_action_row1272[] = {
        1,
-       -1, 1, 572
+       -1, 1, 618
 };
-static int parser_action_row1263[] = {
+static int parser_action_row1273[] = {
        2,
-       -1, 1, 580,
+       -1, 1, 592,
        52, 0, 277
 };
-static int parser_action_row1264[] = {
+static int parser_action_row1274[] = {
+       1,
+       -1, 1, 574
+};
+static int parser_action_row1275[] = {
+       2,
+       -1, 1, 582,
+       52, 0, 277
+};
+static int parser_action_row1276[] = {
        3,
-       -1, 3, 1263,
-       54, 0, 1389,
-       55, 0, 1390
+       -1, 3, 1275,
+       54, 0, 1422,
+       55, 0, 1423
 };
-static int parser_action_row1265[] = {
+static int parser_action_row1277[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1266[] = {
+static int parser_action_row1278[] = {
        4,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
-       24, 0, 1392
+       24, 0, 1425
 };
-static int parser_action_row1267[] = {
+static int parser_action_row1279[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1268[] = {
+static int parser_action_row1280[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1269[] = {
+static int parser_action_row1281[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1270[] = {
+static int parser_action_row1282[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1271[] = {
+static int parser_action_row1283[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1272[] = {
+static int parser_action_row1284[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1273[] = {
+static int parser_action_row1285[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1274[] = {
+static int parser_action_row1286[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1275[] = {
+static int parser_action_row1287[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1276[] = {
+static int parser_action_row1288[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1277[] = {
+static int parser_action_row1289[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1278[] = {
+static int parser_action_row1290[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1279[] = {
+static int parser_action_row1291[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1280[] = {
+static int parser_action_row1292[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1281[] = {
+static int parser_action_row1293[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1282[] = {
+static int parser_action_row1294[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1283[] = {
+static int parser_action_row1295[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1284[] = {
+static int parser_action_row1296[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1285[] = {
+static int parser_action_row1297[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1286[] = {
+static int parser_action_row1298[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1287[] = {
+static int parser_action_row1299[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1288[] = {
+static int parser_action_row1300[] = {
        3,
-       -1, 1, 588,
+       -1, 1, 590,
        52, 0, 277,
        58, 0, 215
 };
-static int parser_action_row1289[] = {
+static int parser_action_row1301[] = {
        2,
-       -1, 1, 454,
-       97, 0, 1416
+       -1, 1, 456,
+       97, 0, 1449
 };
-static int parser_action_row1290[] = {
+static int parser_action_row1302[] = {
        2,
-       -1, 1, 452,
+       -1, 1, 454,
        58, 0, 215
 };
-static int parser_action_row1291[] = {
-       2,
-       -1, 3, 1290,
-       9, 0, 1417
-};
-static int parser_action_row1292[] = {
+static int parser_action_row1303[] = {
        1,
-       -1, 1, 1078
+       -1, 1, 1064
 };
-static int parser_action_row1293[] = {
+static int parser_action_row1304[] = {
        2,
-       -1, 1, 28,
+       -1, 1, 30,
        13, 0, 32
 };
-static int parser_action_row1294[] = {
-       9,
-       -1, 1, 483,
+static int parser_action_row1305[] = {
+       5,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
-       4, 1, 412,
-       9, 1, 412,
-       15, 1, 412,
-       28, 1, 412,
-       95, 0, 3,
-       109, 1, 412
+       9, 0, 1451,
+       95, 0, 3
 };
-static int parser_action_row1295[] = {
+static int parser_action_row1306[] = {
        2,
-       -1, 1, 116,
-       71, 0, 1420
+       -1, 1, 118,
+       71, 0, 1453
 };
-static int parser_action_row1296[] = {
+static int parser_action_row1307[] = {
        2,
-       -1, 1, 400,
+       -1, 1, 404,
        57, 0, 829
 };
-static int parser_action_row1297[] = {
+static int parser_action_row1308[] = {
        1,
-       -1, 1, 115
+       -1, 1, 117
 };
-static int parser_action_row1298[] = {
+static int parser_action_row1309[] = {
        4,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        57, 0, 829
 };
-static int parser_action_row1299[] = {
+static int parser_action_row1310[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1300[] = {
+static int parser_action_row1311[] = {
        1,
-       -1, 1, 1062
+       -1, 1, 1066
 };
-static int parser_action_row1301[] = {
+static int parser_action_row1312[] = {
        1,
-       -1, 1, 111
+       -1, 1, 113
 };
-static int parser_action_row1302[] = {
+static int parser_action_row1313[] = {
        4,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
-       56, 0, 1298
+       56, 0, 1309
 };
-static int parser_action_row1303[] = {
+static int parser_action_row1314[] = {
        1,
-       -1, 1, 126
+       -1, 1, 128
 };
-static int parser_action_row1304[] = {
+static int parser_action_row1315[] = {
        2,
-       -1, 1, 120,
-       56, 0, 1427
+       -1, 1, 122,
+       56, 0, 1460
 };
-static int parser_action_row1305[] = {
+static int parser_action_row1316[] = {
        1,
-       -1, 1, 124
+       -1, 1, 126
 };
-static int parser_action_row1306[] = {
+static int parser_action_row1317[] = {
        1,
-       -1, 1, 125
+       -1, 1, 127
 };
-static int parser_action_row1307[] = {
+static int parser_action_row1318[] = {
        2,
-       -1, 1, 129,
-       73, 0, 1430
+       -1, 1, 131,
+       73, 0, 1463
 };
-static int parser_action_row1308[] = {
+static int parser_action_row1319[] = {
        1,
-       -1, 1, 127
+       -1, 1, 129
 };
-static int parser_action_row1309[] = {
-       2,
-       -1, 1, 78,
-       9, 0, 1431
+static int parser_action_row1320[] = {
+       9,
+       -1, 1, 485,
+       0, 0, 1,
+       1, 0, 2,
+       4, 1, 80,
+       9, 0, 1464,
+       15, 1, 80,
+       28, 1, 80,
+       95, 0, 3,
+       109, 1, 80
 };
-static int parser_action_row1310[] = {
+static int parser_action_row1321[] = {
        1,
-       -1, 1, 468
+       -1, 1, 470
 };
-static int parser_action_row1311[] = {
+static int parser_action_row1322[] = {
        1,
-       -1, 1, 489
+       -1, 1, 491
 };
-static int parser_action_row1312[] = {
+static int parser_action_row1323[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
-static int parser_action_row1313[] = {
+static int parser_action_row1324[] = {
        1,
-       -1, 1, 493
+       -1, 1, 495
 };
-static int parser_action_row1314[] = {
+static int parser_action_row1325[] = {
        3,
-       -1, 1, 153,
+       -1, 1, 155,
        57, 0, 333,
        94, 0, 204
 };
-static int parser_action_row1315[] = {
-       4,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2,
-       56, 0, 1435
+static int parser_action_row1326[] = {
+       2,
+       -1, 3, 1325,
+       55, 0, 1468
 };
-static int parser_action_row1316[] = {
-       1,
-       -1, 1, 26
+static int parser_action_row1327[] = {
+       2,
+       -1, 1, 37,
+       56, 0, 1469
 };
-static int parser_action_row1317[] = {
+static int parser_action_row1328[] = {
        1,
-       -1, 1, 45
+       -1, 1, 27
 };
-static int parser_action_row1318[] = {
+static int parser_action_row1329[] = {
+       7,
+       -1, 3, 1328,
+       10, 0, 1472,
+       11, 0, 1473,
+       12, 0, 1474,
+       16, 0, 1475,
+       38, 0, 1476,
+       41, 0, 1477
+};
+static int parser_action_row1330[] = {
+       26,
+       -1, 1, 1003,
+       12, 0, 170,
+       22, 0, 171,
+       31, 0, 172,
+       38, 0, 173,
+       40, 0, 174,
+       41, 1, 458,
+       42, 0, 45,
+       43, 0, 46,
+       44, 0, 47,
+       45, 0, 48,
+       48, 0, 175,
+       52, 0, 51,
+       54, 0, 52,
+       74, 0, 176,
+       75, 0, 177,
+       83, 0, 178,
+       96, 0, 53,
+       97, 0, 179,
+       98, 1, 458,
+       99, 0, 55,
+       100, 0, 56,
+       101, 0, 57,
+       102, 0, 58,
+       103, 0, 59,
+       106, 0, 60
+};
+static int parser_action_row1331[] = {
        2,
-       -1, 3, 1317,
-       9, 0, 1439
+       -1, 1, 1008,
+       49, 0, 197
 };
-static int parser_action_row1319[] = {
-       1,
-       -1, 1, 1048
+static int parser_action_row1332[] = {
+       2,
+       -1, 1, 1005,
+       49, 0, 197
 };
-static int parser_action_row1320[] = {
+static int parser_action_row1333[] = {
        1,
-       -1, 1, 1047
+       -1, 1, 1007
 };
-static int parser_action_row1321[] = {
-       5,
-       -1, 1, 79,
-       18, 0, 236,
-       19, 0, 237,
-       20, 0, 238,
-       21, 0, 239
+static int parser_action_row1334[] = {
+       2,
+       -1, 3, 1333,
+       11, 0, 1481
 };
-static int parser_action_row1322[] = {
-       56,
-       -1, 1, 418,
-       12, 0, 116,
-       15, 0, 33,
-       16, 0, 34,
-       22, 0, 117,
-       25, 0, 36,
-       26, 0, 37,
-       27, 0, 38,
-       31, 0, 118,
-       33, 0, 1441,
-       34, 0, 1442,
-       35, 0, 1443,
-       36, 0, 1444,
-       37, 0, 43,
-       38, 0, 119,
-       40, 0, 120,
-       41, 1, 456,
-       42, 0, 121,
-       43, 0, 122,
-       44, 0, 123,
-       45, 0, 124,
-       47, 0, 396,
-       48, 0, 125,
-       50, 0, 49,
-       51, 0, 1445,
-       52, 0, 1446,
+static int parser_action_row1335[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1336[] = {
+       24,
+       -1, 1, 498,
+       12, 0, 170,
+       38, 0, 173,
+       40, 0, 174,
+       41, 1, 458,
+       42, 0, 45,
+       43, 0, 46,
+       44, 0, 47,
+       45, 0, 48,
+       48, 0, 175,
+       52, 0, 51,
+       54, 0, 52,
+       74, 0, 176,
+       75, 0, 177,
+       83, 0, 178,
+       96, 0, 53,
+       97, 0, 179,
+       98, 1, 458,
+       99, 0, 55,
+       100, 0, 56,
+       101, 0, 57,
+       102, 0, 58,
+       103, 0, 59,
+       106, 0, 60
+};
+static int parser_action_row1337[] = {
+       24,
+       -1, 1, 499,
+       12, 0, 170,
+       38, 0, 173,
+       40, 0, 174,
+       41, 1, 458,
+       42, 0, 45,
+       43, 0, 46,
+       44, 0, 47,
+       45, 0, 48,
+       48, 0, 175,
+       52, 0, 51,
+       54, 0, 52,
+       74, 0, 176,
+       75, 0, 177,
+       83, 0, 178,
+       96, 0, 53,
+       97, 0, 179,
+       98, 1, 458,
+       99, 0, 55,
+       100, 0, 56,
+       101, 0, 57,
+       102, 0, 58,
+       103, 0, 59,
+       106, 0, 60
+};
+static int parser_action_row1338[] = {
+       24,
+       -1, 1, 507,
+       12, 0, 170,
+       38, 0, 173,
+       40, 0, 174,
+       41, 1, 458,
+       42, 0, 45,
+       43, 0, 46,
+       44, 0, 47,
+       45, 0, 48,
+       48, 0, 175,
+       52, 0, 51,
+       54, 0, 52,
+       74, 0, 176,
+       75, 0, 177,
+       83, 0, 178,
+       96, 0, 53,
+       97, 0, 179,
+       98, 1, 458,
+       99, 0, 55,
+       100, 0, 56,
+       101, 0, 57,
+       102, 0, 58,
+       103, 0, 59,
+       106, 0, 60
+};
+static int parser_action_row1339[] = {
+       15,
+       -1, 1, 756,
+       52, 0, 277,
+       58, 0, 215,
+       59, 0, 1483,
+       60, 0, 217,
+       61, 0, 218,
+       62, 0, 219,
+       63, 0, 220,
+       64, 0, 221,
+       65, 0, 222,
+       66, 0, 223,
+       67, 0, 224,
+       68, 0, 225,
+       69, 0, 226,
+       70, 0, 227
+};
+static int parser_action_row1340[] = {
+       1,
+       -1, 1, 802
+};
+static int parser_action_row1341[] = {
+       1,
+       -1, 1, 1001
+};
+static int parser_action_row1342[] = {
+       1,
+       -1, 1, 1010
+};
+static int parser_action_row1343[] = {
+       1,
+       -1, 1, 1012
+};
+static int parser_action_row1344[] = {
+       1,
+       -1, 1, 1011
+};
+static int parser_action_row1345[] = {
+       1,
+       -1, 1, 1013
+};
+static int parser_action_row1346[] = {
+       1,
+       -1, 1, 1014
+};
+static int parser_action_row1347[] = {
+       1,
+       -1, 1, 1015
+};
+static int parser_action_row1348[] = {
+       1,
+       -1, 1, 421
+};
+static int parser_action_row1349[] = {
+       3,
+       -1, 3, 1348,
+       41, 0, 300,
+       98, 0, 1486
+};
+static int parser_action_row1350[] = {
+       22,
+       -1, 1, 455,
        54, 0, 619,
-       74, 0, 1447,
-       75, 0, 1448,
+       74, 0, 620,
+       75, 0, 621,
        76, 0, 407,
        77, 0, 408,
        78, 0, 409,
@@ -14385,7 +14718,7 @@ static int parser_action_row1322[] = {
        80, 0, 411,
        81, 0, 412,
        82, 0, 413,
-       83, 0, 1449,
+       83, 0, 622,
        84, 0, 415,
        85, 0, 416,
        86, 0, 417,
@@ -14395,79 +14728,108 @@ static int parser_action_row1322[] = {
        90, 0, 421,
        91, 0, 422,
        92, 0, 423,
-       94, 0, 204,
-       96, 0, 424,
-       97, 0, 1450,
-       98, 1, 456,
-       99, 0, 131,
-       100, 0, 132,
-       101, 0, 133,
-       102, 0, 134,
-       103, 0, 59,
-       106, 0, 135
+       97, 0, 1487
 };
-static int parser_action_row1323[] = {
+static int parser_action_row1351[] = {
        1,
-       -1, 1, 73
+       -1, 1, 806
 };
-static int parser_action_row1324[] = {
+static int parser_action_row1352[] = {
        1,
-       -1, 1, 1061
+       -1, 1, 1002
 };
-static int parser_action_row1325[] = {
-       4,
-       -1, 1, 28,
-       6, 0, 1318,
-       13, 0, 32,
-       97, 0, 1319
+static int parser_action_row1353[] = {
+       1,
+       -1, 1, 803
 };
-static int parser_action_row1326[] = {
+static int parser_action_row1354[] = {
+       3,
+       -1, 1, 739,
+       54, 0, 244,
+       73, 0, 1488
+};
+static int parser_action_row1355[] = {
        1,
-       -1, 1, 42
+       -1, 1, 424
 };
-static int parser_action_row1327[] = {
+static int parser_action_row1356[] = {
+       2,
+       -1, 1, 800,
+       56, 0, 1402
+};
+static int parser_action_row1357[] = {
        1,
-       -1, 1, 361
+       -1, 1, 804
 };
-static int parser_action_row1328[] = {
+static int parser_action_row1358[] = {
+       23,
+       -1, 1, 457,
+       54, 0, 619,
+       74, 0, 620,
+       75, 0, 621,
+       76, 0, 407,
+       77, 0, 408,
+       78, 0, 409,
+       79, 0, 410,
+       80, 0, 411,
+       81, 0, 412,
+       82, 0, 413,
+       83, 0, 622,
+       84, 0, 415,
+       85, 0, 416,
+       86, 0, 417,
+       87, 0, 418,
+       88, 0, 419,
+       89, 0, 420,
+       90, 0, 421,
+       91, 0, 422,
+       92, 0, 423,
+       96, 0, 53,
+       97, 0, 1491
+};
+static int parser_action_row1359[] = {
+       1,
+       -1, 1, 365
+};
+static int parser_action_row1360[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1329[] = {
+static int parser_action_row1361[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1330[] = {
+static int parser_action_row1362[] = {
        1,
-       -1, 1, 209
+       -1, 1, 211
 };
-static int parser_action_row1331[] = {
+static int parser_action_row1363[] = {
        1,
-       -1, 1, 228
+       -1, 1, 230
 };
-static int parser_action_row1332[] = {
+static int parser_action_row1364[] = {
        1,
-       -1, 1, 213
+       -1, 1, 215
 };
-static int parser_action_row1333[] = {
+static int parser_action_row1365[] = {
        1,
-       -1, 1, 232
+       -1, 1, 234
 };
-static int parser_action_row1334[] = {
+static int parser_action_row1366[] = {
        1,
-       -1, 1, 212
+       -1, 1, 214
 };
-static int parser_action_row1335[] = {
+static int parser_action_row1367[] = {
        1,
-       -1, 1, 231
+       -1, 1, 233
 };
-static int parser_action_row1336[] = {
+static int parser_action_row1368[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -14492,9 +14854,9 @@ static int parser_action_row1336[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1337[] = {
+static int parser_action_row1369[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -14519,65 +14881,65 @@ static int parser_action_row1337[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1338[] = {
+static int parser_action_row1370[] = {
        2,
-       -1, 3, 1337,
-       24, 0, 1474
+       -1, 3, 1369,
+       24, 0, 1497
 };
-static int parser_action_row1339[] = {
+static int parser_action_row1371[] = {
        1,
-       -1, 1, 770
+       -1, 1, 772
 };
-static int parser_action_row1340[] = {
+static int parser_action_row1372[] = {
        1,
-       -1, 1, 774
+       -1, 1, 776
 };
-static int parser_action_row1341[] = {
+static int parser_action_row1373[] = {
        2,
-       -1, 1, 773,
+       -1, 1, 775,
        52, 0, 277
 };
-static int parser_action_row1342[] = {
+static int parser_action_row1374[] = {
        1,
-       -1, 1, 444
+       -1, 1, 446
 };
-static int parser_action_row1343[] = {
+static int parser_action_row1375[] = {
        1,
-       -1, 1, 778
+       -1, 1, 780
 };
-static int parser_action_row1344[] = {
+static int parser_action_row1376[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1345[] = {
+static int parser_action_row1377[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1346[] = {
+static int parser_action_row1378[] = {
        2,
-       -1, 3, 1345,
-       23, 0, 1478
+       -1, 3, 1377,
+       23, 0, 1501
 };
-static int parser_action_row1347[] = {
+static int parser_action_row1379[] = {
        2,
-       -1, 3, 1346,
-       15, 0, 1479
+       -1, 3, 1378,
+       15, 0, 1502
 };
-static int parser_action_row1348[] = {
+static int parser_action_row1380[] = {
        2,
-       -1, 3, 1347,
-       28, 0, 1480
+       -1, 3, 1379,
+       28, 0, 1503
 };
-static int parser_action_row1349[] = {
+static int parser_action_row1381[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1349,
+       9, 0, 1381,
        12, 0, 887,
        15, 0, 888,
        16, 0, 34,
@@ -14609,15 +14971,15 @@ static int parser_action_row1349[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1350[] = {
+static int parser_action_row1382[] = {
        2,
-       -1, 1, 156,
-       24, 1, 894
+       -1, 1, 158,
+       24, 1, 896
 };
-static int parser_action_row1351[] = {
+static int parser_action_row1383[] = {
        31,
-       -1, 1, 456,
-       9, 0, 1482,
+       -1, 1, 458,
+       9, 0, 1505,
        12, 0, 31,
        15, 0, 33,
        16, 0, 34,
@@ -14648,18 +15010,18 @@ static int parser_action_row1351[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1352[] = {
+static int parser_action_row1384[] = {
        1,
-       -1, 1, 941
+       -1, 1, 943
 };
-static int parser_action_row1353[] = {
+static int parser_action_row1385[] = {
        2,
-       -1, 3, 1352,
-       15, 0, 1484
+       -1, 3, 1384,
+       15, 0, 1507
 };
-static int parser_action_row1354[] = {
+static int parser_action_row1386[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -14684,29 +15046,29 @@ static int parser_action_row1354[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1355[] = {
+static int parser_action_row1387[] = {
        27,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 347,
-       73, 1, 347,
+       54, 1, 351,
+       73, 1, 351,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -14714,22 +15076,22 @@ static int parser_action_row1355[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1356[] = {
+static int parser_action_row1388[] = {
        40,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 329,
+       54, 1, 333,
        58, 0, 215,
        59, 0, 846,
        60, 0, 217,
@@ -14743,13 +15105,13 @@ static int parser_action_row1356[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 329,
+       73, 1, 333,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -14757,32 +15119,36 @@ static int parser_action_row1356[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1357[] = {
+static int parser_action_row1389[] = {
        3,
-       -1, 1, 453,
-       12, 0, 1488,
-       97, 0, 1489
+       -1, 1, 455,
+       12, 0, 1511,
+       97, 0, 1512
 };
-static int parser_action_row1358[] = {
+static int parser_action_row1390[] = {
        4,
-       -1, 1, 455,
-       12, 0, 1490,
+       -1, 1, 457,
+       12, 0, 1513,
        96, 0, 53,
-       97, 0, 1491
+       97, 0, 1514
 };
-static int parser_action_row1359[] = {
+static int parser_action_row1391[] = {
+       1,
+       -1, 1, 260
+};
+static int parser_action_row1392[] = {
        2,
-       -1, 1, 196,
-       24, 1, 927
+       -1, 1, 198,
+       24, 1, 929
 };
-static int parser_action_row1360[] = {
+static int parser_action_row1393[] = {
        2,
-       -1, 1, 187,
-       24, 1, 918
+       -1, 1, 189,
+       24, 1, 920
 };
-static int parser_action_row1361[] = {
+static int parser_action_row1394[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 157,
@@ -14817,35 +15183,35 @@ static int parser_action_row1361[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1362[] = {
+static int parser_action_row1395[] = {
        2,
-       -1, 3, 1361,
-       24, 0, 1495
+       -1, 3, 1394,
+       24, 0, 1518
 };
-static int parser_action_row1363[] = {
+static int parser_action_row1396[] = {
        2,
-       -1, 1, 795,
+       -1, 1, 797,
        94, 0, 594
 };
-static int parser_action_row1364[] = {
+static int parser_action_row1397[] = {
        1,
-       -1, 1, 150
+       -1, 1, 152
 };
-static int parser_action_row1365[] = {
+static int parser_action_row1398[] = {
        1,
-       -1, 1, 622
+       -1, 1, 624
 };
-static int parser_action_row1366[] = {
+static int parser_action_row1399[] = {
        1,
-       -1, 1, 793
+       -1, 1, 795
 };
-static int parser_action_row1367[] = {
+static int parser_action_row1400[] = {
        1,
-       -1, 1, 355
+       -1, 1, 359
 };
-static int parser_action_row1368[] = {
+static int parser_action_row1401[] = {
        54,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        15, 0, 33,
        16, 0, 34,
@@ -14900,44 +15266,44 @@ static int parser_action_row1368[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1369[] = {
+static int parser_action_row1402[] = {
        2,
-       -1, 3, 1368,
-       53, 0, 1498
+       -1, 3, 1401,
+       53, 0, 1521
 };
-static int parser_action_row1370[] = {
+static int parser_action_row1403[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1371[] = {
+static int parser_action_row1404[] = {
        1,
-       -1, 1, 1080
+       -1, 1, 1082
 };
-static int parser_action_row1372[] = {
+static int parser_action_row1405[] = {
        2,
-       -1, 1, 424,
-       56, 0, 1369
+       -1, 1, 426,
+       56, 0, 1402
 };
-static int parser_action_row1373[] = {
+static int parser_action_row1406[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1374[] = {
+static int parser_action_row1407[] = {
        1,
-       -1, 1, 146
+       -1, 1, 148
 };
-static int parser_action_row1375[] = {
+static int parser_action_row1408[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -14950,7 +15316,7 @@ static int parser_action_row1375[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -14958,690 +15324,690 @@ static int parser_action_row1375[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1376[] = {
+static int parser_action_row1409[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1377[] = {
+static int parser_action_row1410[] = {
        1,
-       -1, 1, 388
+       -1, 1, 392
 };
-static int parser_action_row1378[] = {
+static int parser_action_row1411[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1379[] = {
+static int parser_action_row1412[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1380[] = {
+static int parser_action_row1413[] = {
        1,
-       -1, 1, 532
+       -1, 1, 534
 };
-static int parser_action_row1381[] = {
+static int parser_action_row1414[] = {
        2,
-       -1, 3, 1380,
-       96, 0, 1505
+       -1, 3, 1413,
+       96, 0, 1528
 };
-static int parser_action_row1382[] = {
+static int parser_action_row1415[] = {
        2,
-       -1, 1, 795,
+       -1, 1, 797,
        94, 0, 594
 };
-static int parser_action_row1383[] = {
+static int parser_action_row1416[] = {
        3,
-       -1, 1, 567,
+       -1, 1, 569,
        52, 0, 277,
-       73, 0, 1507
+       73, 0, 1530
 };
-static int parser_action_row1384[] = {
+static int parser_action_row1417[] = {
        1,
-       -1, 1, 564
+       -1, 1, 566
 };
-static int parser_action_row1385[] = {
+static int parser_action_row1418[] = {
        3,
-       -1, 3, 1384,
-       47, 0, 1380,
-       96, 0, 1381
+       -1, 3, 1417,
+       47, 0, 1413,
+       96, 0, 1414
 };
-static int parser_action_row1386[] = {
+static int parser_action_row1419[] = {
        2,
-       -1, 1, 569,
-       73, 1, 572
+       -1, 1, 571,
+       73, 1, 574
 };
-static int parser_action_row1387[] = {
+static int parser_action_row1420[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1388[] = {
+static int parser_action_row1421[] = {
        1,
-       -1, 1, 589
+       -1, 1, 591
 };
-static int parser_action_row1389[] = {
+static int parser_action_row1422[] = {
        1,
-       -1, 1, 578
+       -1, 1, 580
 };
-static int parser_action_row1390[] = {
+static int parser_action_row1423[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1391[] = {
+static int parser_action_row1424[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1392[] = {
+static int parser_action_row1425[] = {
        22,
-       -1, 1, 456,
-       12, 0, 1093,
-       31, 0, 1095,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       31, 0, 1104,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1393[] = {
+static int parser_action_row1426[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1394[] = {
+static int parser_action_row1427[] = {
        22,
-       -1, 1, 456,
-       12, 0, 1093,
-       31, 0, 1095,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       31, 0, 1104,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1395[] = {
+static int parser_action_row1428[] = {
        22,
-       -1, 1, 456,
-       12, 0, 1093,
-       31, 0, 1095,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       31, 0, 1104,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1396[] = {
+static int parser_action_row1429[] = {
        3,
-       -1, 3, 1395,
-       47, 0, 1517,
-       96, 0, 1518
+       -1, 3, 1428,
+       47, 0, 1540,
+       96, 0, 1541
 };
-static int parser_action_row1397[] = {
+static int parser_action_row1430[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1398[] = {
+static int parser_action_row1431[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1399[] = {
+static int parser_action_row1432[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1400[] = {
+static int parser_action_row1433[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1401[] = {
+static int parser_action_row1434[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1402[] = {
+static int parser_action_row1435[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1403[] = {
+static int parser_action_row1436[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1404[] = {
+static int parser_action_row1437[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1405[] = {
+static int parser_action_row1438[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1406[] = {
+static int parser_action_row1439[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1407[] = {
+static int parser_action_row1440[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1408[] = {
+static int parser_action_row1441[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1409[] = {
+static int parser_action_row1442[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1410[] = {
+static int parser_action_row1443[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1411[] = {
+static int parser_action_row1444[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1412[] = {
+static int parser_action_row1445[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1413[] = {
+static int parser_action_row1446[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1414[] = {
+static int parser_action_row1447[] = {
        21,
-       -1, 1, 456,
-       12, 0, 1093,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1415[] = {
+static int parser_action_row1448[] = {
        5,
-       -1, 1, 456,
-       12, 0, 1538,
-       46, 0, 1539,
+       -1, 1, 458,
+       12, 0, 1561,
+       46, 0, 1562,
        96, 0, 53,
-       97, 0, 1540
+       97, 0, 1563
 };
-static int parser_action_row1416[] = {
+static int parser_action_row1449[] = {
        1,
-       -1, 1, 586
+       -1, 1, 588
 };
-static int parser_action_row1417[] = {
+static int parser_action_row1450[] = {
        2,
-       -1, 1, 584,
+       -1, 1, 586,
        52, 0, 277
 };
-static int parser_action_row1418[] = {
-       1,
-       -1, 1, 75
-};
-static int parser_action_row1419[] = {
+static int parser_action_row1451[] = {
        5,
-       -1, 1, 79,
+       -1, 1, 81,
        18, 0, 236,
        19, 0, 237,
        20, 0, 238,
        21, 0, 239
 };
-static int parser_action_row1420[] = {
+static int parser_action_row1452[] = {
        1,
-       -1, 1, 1079
+       -1, 1, 77
 };
-static int parser_action_row1421[] = {
+static int parser_action_row1453[] = {
        1,
-       -1, 1, 118
+       -1, 1, 1065
 };
-static int parser_action_row1422[] = {
-       2,
-       -1, 1, 117,
-       71, 0, 1546
+static int parser_action_row1454[] = {
+       1,
+       -1, 1, 120
 };
-static int parser_action_row1423[] = {
+static int parser_action_row1455[] = {
+       2,
+       -1, 1, 119,
+       71, 0, 1569
+};
+static int parser_action_row1456[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1424[] = {
+static int parser_action_row1457[] = {
        1,
-       -1, 1, 108
+       -1, 1, 110
 };
-static int parser_action_row1425[] = {
+static int parser_action_row1458[] = {
        2,
-       -1, 3, 1424,
-       97, 0, 1140
+       -1, 3, 1457,
+       97, 0, 1148
 };
-static int parser_action_row1426[] = {
+static int parser_action_row1459[] = {
        1,
-       -1, 1, 1063
+       -1, 1, 1067
 };
-static int parser_action_row1427[] = {
+static int parser_action_row1460[] = {
        1,
-       -1, 1, 112
+       -1, 1, 114
 };
-static int parser_action_row1428[] = {
+static int parser_action_row1461[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1429[] = {
+static int parser_action_row1462[] = {
        1,
-       -1, 1, 1064
+       -1, 1, 1068
 };
-static int parser_action_row1430[] = {
+static int parser_action_row1463[] = {
        2,
-       -1, 1, 121,
-       56, 0, 1427
+       -1, 1, 123,
+       56, 0, 1460
 };
-static int parser_action_row1431[] = {
+static int parser_action_row1464[] = {
        24,
-       -1, 3, 1430,
-       46, 0, 1551,
+       -1, 3, 1463,
+       46, 0, 1574,
        54, 0, 640,
        74, 0, 641,
        75, 0, 642,
@@ -15665,81 +16031,219 @@ static int parser_action_row1431[] = {
        96, 0, 53,
        97, 0, 660
 };
-static int parser_action_row1432[] = {
+static int parser_action_row1465[] = {
        1,
-       -1, 1, 495
+       -1, 1, 497
 };
-static int parser_action_row1433[] = {
+static int parser_action_row1466[] = {
        1,
-       -1, 1, 490
+       -1, 1, 492
 };
-static int parser_action_row1434[] = {
-       1,
-       -1, 1, 39
+static int parser_action_row1467[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
-static int parser_action_row1435[] = {
+static int parser_action_row1468[] = {
        2,
-       -1, 1, 153,
+       -1, 1, 155,
        57, 0, 333
 };
-static int parser_action_row1436[] = {
-       3,
+static int parser_action_row1469[] = {
+       6,
        -1, 1, 485,
        0, 0, 1,
+       1, 0, 2,
+       28, 0, 84,
+       95, 0, 3,
+       109, 0, 85
+};
+static int parser_action_row1470[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1437[] = {
+static int parser_action_row1471[] = {
        1,
-       -1, 1, 1058
+       -1, 1, 1060
 };
-static int parser_action_row1438[] = {
+static int parser_action_row1472[] = {
        2,
-       -1, 3, 1437,
-       55, 0, 1555
+       -1, 1, 38,
+       56, 0, 1469
 };
-static int parser_action_row1439[] = {
-       4,
-       -1, 1, 485,
+static int parser_action_row1473[] = {
+       23,
+       -1, 3, 1472,
+       54, 0, 640,
+       74, 0, 641,
+       75, 0, 642,
+       76, 0, 643,
+       77, 0, 644,
+       78, 0, 645,
+       79, 0, 646,
+       80, 0, 647,
+       81, 0, 648,
+       82, 0, 649,
+       83, 0, 650,
+       84, 0, 651,
+       85, 0, 652,
+       86, 0, 653,
+       87, 0, 654,
+       88, 0, 655,
+       89, 0, 656,
+       90, 0, 657,
+       91, 0, 658,
+       92, 0, 659,
+       96, 0, 53,
+       97, 0, 660
+};
+static int parser_action_row1474[] = {
+       2,
+       -1, 3, 1473,
+       96, 0, 1583
+};
+static int parser_action_row1475[] = {
+       27,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
-       56, 0, 1435
+       52, 0, 828,
+       54, 0, 640,
+       57, 0, 829,
+       74, 0, 641,
+       75, 0, 642,
+       76, 0, 643,
+       77, 0, 644,
+       78, 0, 645,
+       79, 0, 646,
+       80, 0, 647,
+       81, 0, 648,
+       82, 0, 649,
+       83, 0, 650,
+       84, 0, 651,
+       85, 0, 652,
+       86, 0, 653,
+       87, 0, 654,
+       88, 0, 655,
+       89, 0, 656,
+       90, 0, 657,
+       91, 0, 658,
+       92, 0, 659,
+       96, 0, 53,
+       97, 0, 660
 };
-static int parser_action_row1440[] = {
+static int parser_action_row1476[] = {
+       2,
+       -1, 3, 1475,
+       97, 0, 1586
+};
+static int parser_action_row1477[] = {
+       27,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2,
+       52, 0, 828,
+       54, 0, 640,
+       57, 0, 829,
+       74, 0, 641,
+       75, 0, 642,
+       76, 0, 643,
+       77, 0, 644,
+       78, 0, 645,
+       79, 0, 646,
+       80, 0, 647,
+       81, 0, 648,
+       82, 0, 649,
+       83, 0, 650,
+       84, 0, 651,
+       85, 0, 652,
+       86, 0, 653,
+       87, 0, 654,
+       88, 0, 655,
+       89, 0, 656,
+       90, 0, 657,
+       91, 0, 658,
+       92, 0, 659,
+       96, 0, 53,
+       97, 0, 660
+};
+static int parser_action_row1478[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1479[] = {
        1,
-       -1, 1, 27
+       -1, 1, 1004
 };
-static int parser_action_row1441[] = {
-       7,
-       -1, 3, 1440,
-       10, 0, 1558,
-       11, 0, 1559,
-       12, 0, 1560,
-       16, 0, 1561,
-       38, 0, 1562,
-       41, 0, 1563
+static int parser_action_row1480[] = {
+       1,
+       -1, 1, 1009
 };
-static int parser_action_row1442[] = {
-       26,
-       -1, 1, 1001,
+static int parser_action_row1481[] = {
+       1,
+       -1, 1, 1006
+};
+static int parser_action_row1482[] = {
+       3,
+       -1, 3, 1481,
+       47, 0, 396,
+       96, 0, 397
+};
+static int parser_action_row1483[] = {
+       54,
+       -1, 1, 458,
        12, 0, 170,
+       15, 0, 33,
+       16, 0, 34,
        22, 0, 171,
+       25, 0, 36,
+       26, 0, 37,
+       27, 0, 38,
        31, 0, 172,
+       33, 0, 399,
+       34, 0, 400,
+       35, 0, 401,
+       36, 0, 402,
+       37, 0, 43,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
        45, 0, 48,
+       47, 0, 396,
        48, 0, 175,
+       50, 0, 49,
+       51, 0, 403,
        52, 0, 51,
-       54, 0, 52,
-       74, 0, 176,
-       75, 0, 177,
-       83, 0, 178,
-       96, 0, 53,
-       97, 0, 179,
-       98, 1, 456,
+       54, 0, 404,
+       74, 0, 405,
+       75, 0, 406,
+       76, 0, 407,
+       77, 0, 408,
+       78, 0, 409,
+       79, 0, 410,
+       80, 0, 411,
+       81, 0, 412,
+       82, 0, 413,
+       83, 0, 414,
+       84, 0, 415,
+       85, 0, 416,
+       86, 0, 417,
+       87, 0, 418,
+       88, 0, 419,
+       89, 0, 420,
+       90, 0, 421,
+       91, 0, 422,
+       92, 0, 423,
+       94, 0, 204,
+       96, 0, 424,
+       97, 0, 425,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -15747,38 +16251,15 @@ static int parser_action_row1442[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1443[] = {
-       2,
-       -1, 1, 1006,
-       49, 0, 197
-};
-static int parser_action_row1444[] = {
-       2,
-       -1, 1, 1003,
-       49, 0, 197
-};
-static int parser_action_row1445[] = {
-       1,
-       -1, 1, 1005
-};
-static int parser_action_row1446[] = {
-       2,
-       -1, 3, 1445,
-       11, 0, 1567
-};
-static int parser_action_row1447[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1448[] = {
-       24,
-       -1, 1, 496,
+static int parser_action_row1484[] = {
+       26,
+       -1, 1, 518,
        12, 0, 170,
+       22, 0, 171,
+       31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -15791,7 +16272,7 @@ static int parser_action_row1448[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -15799,13 +16280,14 @@ static int parser_action_row1448[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1449[] = {
+static int parser_action_row1485[] = {
        24,
-       -1, 1, 497,
+       -1, 1, 458,
        12, 0, 170,
+       22, 0, 171,
+       31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -15818,7 +16300,6 @@ static int parser_action_row1449[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -15826,39 +16307,10 @@ static int parser_action_row1449[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1450[] = {
-       24,
-       -1, 1, 505,
-       12, 0, 170,
-       38, 0, 173,
-       40, 0, 174,
-       41, 1, 456,
-       42, 0, 45,
-       43, 0, 46,
-       44, 0, 47,
-       45, 0, 48,
-       48, 0, 175,
-       52, 0, 51,
-       54, 0, 52,
-       74, 0, 176,
-       75, 0, 177,
-       83, 0, 178,
-       96, 0, 53,
-       97, 0, 179,
-       98, 1, 456,
-       99, 0, 55,
-       100, 0, 56,
-       101, 0, 57,
-       102, 0, 58,
-       103, 0, 59,
-       106, 0, 60
-};
-static int parser_action_row1451[] = {
-       15,
-       -1, 1, 754,
-       52, 0, 277,
-       58, 0, 215,
-       59, 0, 1569,
+static int parser_action_row1486[] = {
+       13,
+       -1, 1, 755,
+       59, 0, 1594,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -15871,107 +16323,87 @@ static int parser_action_row1451[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1452[] = {
-       1,
-       -1, 1, 800
-};
-static int parser_action_row1453[] = {
-       1,
-       -1, 1, 999
-};
-static int parser_action_row1454[] = {
-       1,
-       -1, 1, 1008
-};
-static int parser_action_row1455[] = {
-       1,
-       -1, 1, 1010
-};
-static int parser_action_row1456[] = {
-       1,
-       -1, 1, 1009
-};
-static int parser_action_row1457[] = {
-       1,
-       -1, 1, 1011
-};
-static int parser_action_row1458[] = {
-       1,
-       -1, 1, 1012
-};
-static int parser_action_row1459[] = {
-       1,
-       -1, 1, 1013
-};
-static int parser_action_row1460[] = {
-       1,
-       -1, 1, 419
-};
-static int parser_action_row1461[] = {
-       3,
-       -1, 3, 1460,
-       41, 0, 300,
-       98, 0, 1572
-};
-static int parser_action_row1462[] = {
-       22,
-       -1, 1, 453,
-       54, 0, 619,
-       74, 0, 620,
-       75, 0, 621,
-       76, 0, 407,
-       77, 0, 408,
-       78, 0, 409,
-       79, 0, 410,
-       80, 0, 411,
-       81, 0, 412,
-       82, 0, 413,
-       83, 0, 622,
-       84, 0, 415,
-       85, 0, 416,
-       86, 0, 417,
-       87, 0, 418,
-       88, 0, 419,
-       89, 0, 420,
-       90, 0, 421,
-       91, 0, 422,
-       92, 0, 423,
-       97, 0, 1573
-};
-static int parser_action_row1463[] = {
-       1,
-       -1, 1, 804
-};
-static int parser_action_row1464[] = {
-       1,
-       -1, 1, 1000
+static int parser_action_row1487[] = {
+       13,
+       -1, 1, 746,
+       59, 0, 1596,
+       60, 0, 217,
+       61, 0, 218,
+       62, 0, 219,
+       63, 0, 220,
+       64, 0, 221,
+       65, 0, 222,
+       66, 0, 223,
+       67, 0, 224,
+       68, 0, 225,
+       69, 0, 226,
+       70, 0, 227
 };
-static int parser_action_row1465[] = {
-       1,
-       -1, 1, 801
+static int parser_action_row1488[] = {
+       14,
+       -1, 1, 758,
+       52, 0, 277,
+       59, 0, 1598,
+       60, 0, 217,
+       61, 0, 218,
+       62, 0, 219,
+       63, 0, 220,
+       64, 0, 221,
+       65, 0, 222,
+       66, 0, 223,
+       67, 0, 224,
+       68, 0, 225,
+       69, 0, 226,
+       70, 0, 227
 };
-static int parser_action_row1466[] = {
+static int parser_action_row1489[] = {
        3,
-       -1, 1, 737,
-       54, 0, 244,
-       73, 0, 1574
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
-static int parser_action_row1467[] = {
-       1,
-       -1, 1, 422
+static int parser_action_row1490[] = {
+       13,
+       -1, 1, 769,
+       59, 0, 1602,
+       60, 0, 217,
+       61, 0, 218,
+       62, 0, 219,
+       63, 0, 220,
+       64, 0, 221,
+       65, 0, 222,
+       66, 0, 223,
+       67, 0, 224,
+       68, 0, 225,
+       69, 0, 226,
+       70, 0, 227
 };
-static int parser_action_row1468[] = {
+static int parser_action_row1491[] = {
        2,
-       -1, 1, 798,
-       56, 0, 1369
+       -1, 1, 801,
+       56, 0, 1402
 };
-static int parser_action_row1469[] = {
-       1,
-       -1, 1, 802
+static int parser_action_row1492[] = {
+       15,
+       -1, 1, 762,
+       52, 0, 277,
+       58, 0, 215,
+       59, 0, 1604,
+       60, 0, 217,
+       61, 0, 218,
+       62, 0, 219,
+       63, 0, 220,
+       64, 0, 221,
+       65, 0, 222,
+       66, 0, 223,
+       67, 0, 224,
+       68, 0, 225,
+       69, 0, 226,
+       70, 0, 227
 };
-static int parser_action_row1470[] = {
-       23,
-       -1, 1, 455,
+static int parser_action_row1493[] = {
+       22,
+       -1, 1, 456,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -15992,50 +16424,49 @@ static int parser_action_row1470[] = {
        90, 0, 421,
        91, 0, 422,
        92, 0, 423,
-       96, 0, 53,
-       97, 0, 1577
+       97, 0, 1607
 };
-static int parser_action_row1471[] = {
+static int parser_action_row1494[] = {
        2,
-       -1, 3, 1470,
-       45, 0, 1579
+       -1, 3, 1493,
+       45, 0, 1608
 };
-static int parser_action_row1472[] = {
+static int parser_action_row1495[] = {
        2,
-       -1, 3, 1471,
-       53, 0, 1580
+       -1, 3, 1494,
+       53, 0, 1609
 };
-static int parser_action_row1473[] = {
+static int parser_action_row1496[] = {
        1,
-       -1, 1, 211
+       -1, 1, 213
 };
-static int parser_action_row1474[] = {
+static int parser_action_row1497[] = {
        1,
-       -1, 1, 230
+       -1, 1, 232
 };
-static int parser_action_row1475[] = {
+static int parser_action_row1498[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1476[] = {
+static int parser_action_row1499[] = {
        1,
-       -1, 1, 772
+       -1, 1, 774
 };
-static int parser_action_row1477[] = {
+static int parser_action_row1500[] = {
        2,
-       -1, 3, 1476,
-       45, 0, 1582
+       -1, 3, 1499,
+       45, 0, 1611
 };
-static int parser_action_row1478[] = {
+static int parser_action_row1501[] = {
        2,
-       -1, 3, 1477,
-       53, 0, 1583
+       -1, 3, 1500,
+       53, 0, 1612
 };
-static int parser_action_row1479[] = {
+static int parser_action_row1502[] = {
        35,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 886,
@@ -16071,12 +16502,12 @@ static int parser_action_row1479[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1480[] = {
+static int parser_action_row1503[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1027,
+       9, 0, 1035,
        12, 0, 887,
        15, 0, 888,
        16, 0, 34,
@@ -16108,32 +16539,32 @@ static int parser_action_row1480[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1481[] = {
+static int parser_action_row1504[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1482[] = {
+static int parser_action_row1505[] = {
        1,
-       -1, 1, 942
+       -1, 1, 944
 };
-static int parser_action_row1483[] = {
+static int parser_action_row1506[] = {
        2,
-       -1, 1, 155,
-       24, 1, 893
+       -1, 1, 157,
+       24, 1, 895
 };
-static int parser_action_row1484[] = {
+static int parser_action_row1507[] = {
        2,
-       -1, 1, 154,
-       24, 1, 892
+       -1, 1, 156,
+       24, 1, 894
 };
-static int parser_action_row1485[] = {
+static int parser_action_row1508[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
-       9, 0, 1027,
+       9, 0, 1035,
        12, 0, 887,
        15, 0, 888,
        16, 0, 34,
@@ -16165,30 +16596,30 @@ static int parser_action_row1485[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1486[] = {
+static int parser_action_row1509[] = {
        2,
-       -1, 1, 198,
-       24, 1, 929
+       -1, 1, 200,
+       24, 1, 931
 };
-static int parser_action_row1487[] = {
+static int parser_action_row1510[] = {
        2,
-       -1, 1, 190,
-       24, 1, 921
+       -1, 1, 192,
+       24, 1, 923
 };
-static int parser_action_row1488[] = {
+static int parser_action_row1511[] = {
        2,
-       -1, 1, 181,
-       24, 1, 912
+       -1, 1, 183,
+       24, 1, 914
 };
-static int parser_action_row1489[] = {
+static int parser_action_row1512[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -16200,7 +16631,7 @@ static int parser_action_row1489[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -16208,23 +16639,23 @@ static int parser_action_row1489[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1490[] = {
+static int parser_action_row1513[] = {
        39,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 331,
-       59, 0, 999,
+       54, 1, 335,
+       59, 0, 1007,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -16236,13 +16667,13 @@ static int parser_action_row1490[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 331,
+       73, 1, 335,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -16250,15 +16681,15 @@ static int parser_action_row1490[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1491[] = {
+static int parser_action_row1514[] = {
        25,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
@@ -16270,7 +16701,7 @@ static int parser_action_row1491[] = {
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -16278,24 +16709,24 @@ static int parser_action_row1491[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1492[] = {
+static int parser_action_row1515[] = {
        40,
-       -1, 1, 440,
+       -1, 1, 442,
        12, 0, 116,
        22, 0, 117,
        31, 0, 118,
        38, 0, 119,
        40, 0, 120,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 121,
        43, 0, 122,
        44, 0, 123,
        45, 0, 124,
        48, 0, 125,
        52, 0, 126,
-       54, 1, 335,
+       54, 1, 339,
        58, 0, 215,
-       59, 0, 1004,
+       59, 0, 1012,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -16307,13 +16738,13 @@ static int parser_action_row1492[] = {
        68, 0, 225,
        69, 0, 226,
        70, 0, 227,
-       73, 1, 335,
+       73, 1, 339,
        74, 0, 127,
        75, 0, 128,
        83, 0, 129,
        96, 0, 53,
        97, 0, 130,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 131,
        100, 0, 132,
        101, 0, 133,
@@ -16321,45 +16752,45 @@ static int parser_action_row1492[] = {
        103, 0, 59,
        106, 0, 135
 };
-static int parser_action_row1493[] = {
+static int parser_action_row1516[] = {
        3,
-       -1, 1, 454,
-       12, 0, 1594,
-       97, 0, 1595
+       -1, 1, 456,
+       12, 0, 1623,
+       97, 0, 1624
 };
-static int parser_action_row1494[] = {
+static int parser_action_row1517[] = {
        1,
-       -1, 1, 268
+       -1, 1, 272
 };
-static int parser_action_row1495[] = {
+static int parser_action_row1518[] = {
        2,
-       -1, 3, 1494,
+       -1, 3, 1517,
        49, 0, 197
 };
-static int parser_action_row1496[] = {
+static int parser_action_row1519[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1497[] = {
+static int parser_action_row1520[] = {
        1,
-       -1, 1, 623
+       -1, 1, 625
 };
-static int parser_action_row1498[] = {
+static int parser_action_row1521[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1499[] = {
+static int parser_action_row1522[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1500[] = {
+static int parser_action_row1523[] = {
        54,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        15, 0, 33,
        16, 0, 34,
@@ -16414,273 +16845,273 @@ static int parser_action_row1500[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1501[] = {
+static int parser_action_row1524[] = {
        1,
-       -1, 1, 1081
+       -1, 1, 1083
 };
-static int parser_action_row1502[] = {
+static int parser_action_row1525[] = {
        1,
-       -1, 1, 147
+       -1, 1, 149
 };
-static int parser_action_row1503[] = {
+static int parser_action_row1526[] = {
        2,
-       -1, 1, 386,
-       24, 0, 1495
+       -1, 1, 390,
+       24, 0, 1518
 };
-static int parser_action_row1504[] = {
+static int parser_action_row1527[] = {
        2,
-       -1, 3, 1503,
-       15, 0, 1601
+       -1, 3, 1526,
+       15, 0, 1630
 };
-static int parser_action_row1505[] = {
+static int parser_action_row1528[] = {
        2,
-       -1, 3, 1504,
-       23, 0, 1602
+       -1, 3, 1527,
+       23, 0, 1631
 };
-static int parser_action_row1506[] = {
+static int parser_action_row1529[] = {
        2,
-       -1, 1, 795,
+       -1, 1, 797,
        94, 0, 594
 };
-static int parser_action_row1507[] = {
+static int parser_action_row1530[] = {
        1,
-       -1, 1, 805
+       -1, 1, 807
 };
-static int parser_action_row1508[] = {
+static int parser_action_row1531[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1509[] = {
+static int parser_action_row1532[] = {
        1,
-       -1, 1, 566
+       -1, 1, 568
 };
-static int parser_action_row1510[] = {
+static int parser_action_row1533[] = {
        2,
-       -1, 3, 1509,
-       73, 0, 1507
+       -1, 3, 1532,
+       73, 0, 1530
 };
-static int parser_action_row1511[] = {
+static int parser_action_row1534[] = {
        5,
-       -1, 1, 456,
-       12, 0, 1538,
-       46, 0, 1539,
+       -1, 1, 458,
+       12, 0, 1561,
+       46, 0, 1562,
        96, 0, 53,
-       97, 0, 1540
+       97, 0, 1563
 };
-static int parser_action_row1512[] = {
+static int parser_action_row1535[] = {
        1,
-       -1, 1, 377
+       -1, 1, 381
 };
-static int parser_action_row1513[] = {
+static int parser_action_row1536[] = {
        1,
-       -1, 1, 376
+       -1, 1, 380
 };
-static int parser_action_row1514[] = {
+static int parser_action_row1537[] = {
        1,
-       -1, 1, 528
+       -1, 1, 530
 };
-static int parser_action_row1515[] = {
+static int parser_action_row1538[] = {
        22,
-       -1, 1, 456,
-       12, 0, 1093,
-       31, 0, 1095,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
+       -1, 1, 458,
+       12, 0, 1102,
+       31, 0, 1104,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
        52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
        96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
        103, 0, 59,
-       106, 0, 1111
+       106, 0, 1120
 };
-static int parser_action_row1516[] = {
+static int parser_action_row1539[] = {
        1,
-       -1, 1, 527
+       -1, 1, 529
 };
-static int parser_action_row1517[] = {
+static int parser_action_row1540[] = {
        1,
-       -1, 1, 530
+       -1, 1, 532
 };
-static int parser_action_row1518[] = {
+static int parser_action_row1541[] = {
        2,
-       -1, 3, 1517,
-       96, 0, 1607
+       -1, 3, 1540,
+       96, 0, 1636
 };
-static int parser_action_row1519[] = {
+static int parser_action_row1542[] = {
        2,
-       -1, 1, 401,
+       -1, 1, 405,
        94, 0, 204
 };
-static int parser_action_row1520[] = {
+static int parser_action_row1543[] = {
        1,
-       -1, 1, 541
+       -1, 1, 543
 };
-static int parser_action_row1521[] = {
-       2,
-       -1, 1, 543,
-       81, 0, 1276
-};
-static int parser_action_row1522[] = {
-       2,
-       -1, 1, 534,
-       80, 0, 1268
-};
-static int parser_action_row1523[] = {
+static int parser_action_row1544[] = {
        2,
-       -1, 1, 535,
-       80, 0, 1268
+       -1, 1, 545,
+       81, 0, 1288
 };
-static int parser_action_row1524[] = {
+static int parser_action_row1545[] = {
        2,
        -1, 1, 536,
-       80, 0, 1268
+       80, 0, 1280
 };
-static int parser_action_row1525[] = {
+static int parser_action_row1546[] = {
        2,
        -1, 1, 537,
-       80, 0, 1268
+       80, 0, 1280
 };
-static int parser_action_row1526[] = {
+static int parser_action_row1547[] = {
        2,
        -1, 1, 538,
-       80, 0, 1268
+       80, 0, 1280
 };
-static int parser_action_row1527[] = {
+static int parser_action_row1548[] = {
        2,
        -1, 1, 539,
-       80, 0, 1268
+       80, 0, 1280
 };
-static int parser_action_row1528[] = {
+static int parser_action_row1549[] = {
        2,
        -1, 1, 540,
-       80, 0, 1268
+       80, 0, 1280
 };
-static int parser_action_row1529[] = {
+static int parser_action_row1550[] = {
        2,
-       -1, 1, 545,
-       82, 0, 1277
+       -1, 1, 541,
+       80, 0, 1280
 };
-static int parser_action_row1530[] = {
-       3,
+static int parser_action_row1551[] = {
+       2,
+       -1, 1, 542,
+       80, 0, 1280
+};
+static int parser_action_row1552[] = {
+       2,
        -1, 1, 547,
-       88, 0, 1278,
-       91, 0, 1279
+       82, 0, 1289
 };
-static int parser_action_row1531[] = {
+static int parser_action_row1553[] = {
        3,
        -1, 1, 549,
-       74, 0, 1280,
-       75, 0, 1281
+       88, 0, 1290,
+       91, 0, 1291
 };
-static int parser_action_row1532[] = {
+static int parser_action_row1554[] = {
        3,
-       -1, 1, 550,
-       74, 0, 1280,
-       75, 0, 1281
+       -1, 1, 551,
+       74, 0, 1292,
+       75, 0, 1293
 };
-static int parser_action_row1533[] = {
-       4,
+static int parser_action_row1555[] = {
+       3,
        -1, 1, 552,
-       76, 0, 1282,
-       78, 0, 1283,
-       79, 0, 1284
+       74, 0, 1292,
+       75, 0, 1293
 };
-static int parser_action_row1534[] = {
+static int parser_action_row1556[] = {
        4,
-       -1, 1, 553,
-       76, 0, 1282,
-       78, 0, 1283,
-       79, 0, 1284
+       -1, 1, 554,
+       76, 0, 1294,
+       78, 0, 1295,
+       79, 0, 1296
 };
-static int parser_action_row1535[] = {
-       1,
-       -1, 1, 555
+static int parser_action_row1557[] = {
+       4,
+       -1, 1, 555,
+       76, 0, 1294,
+       78, 0, 1295,
+       79, 0, 1296
 };
-static int parser_action_row1536[] = {
+static int parser_action_row1558[] = {
        1,
-       -1, 1, 556
+       -1, 1, 557
 };
-static int parser_action_row1537[] = {
+static int parser_action_row1559[] = {
        1,
-       -1, 1, 557
+       -1, 1, 558
 };
-static int parser_action_row1538[] = {
+static int parser_action_row1560[] = {
        1,
        -1, 1, 559
 };
-static int parser_action_row1539[] = {
+static int parser_action_row1561[] = {
+       1,
+       -1, 1, 561
+};
+static int parser_action_row1562[] = {
        2,
-       -1, 1, 593,
+       -1, 1, 595,
        52, 0, 277
 };
-static int parser_action_row1540[] = {
+static int parser_action_row1563[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1541[] = {
+static int parser_action_row1564[] = {
        3,
-       -1, 1, 575,
+       -1, 1, 577,
        52, 0, 277,
        58, 0, 215
 };
-static int parser_action_row1542[] = {
+static int parser_action_row1565[] = {
        2,
-       -1, 3, 1541,
-       98, 0, 1612
+       -1, 3, 1564,
+       98, 0, 1641
 };
-static int parser_action_row1543[] = {
+static int parser_action_row1566[] = {
        2,
-       -1, 1, 453,
-       97, 0, 1613
+       -1, 1, 455,
+       97, 0, 1642
 };
-static int parser_action_row1544[] = {
+static int parser_action_row1567[] = {
        3,
-       -1, 1, 455,
+       -1, 1, 457,
        96, 0, 53,
-       97, 0, 1614
+       97, 0, 1643
 };
-static int parser_action_row1545[] = {
+static int parser_action_row1568[] = {
        1,
-       -1, 1, 582
+       -1, 1, 584
 };
-static int parser_action_row1546[] = {
+static int parser_action_row1569[] = {
        4,
-       -1, 3, 1545,
+       -1, 3, 1568,
        6, 0, 792,
        17, 0, 793,
        97, 0, 794
 };
-static int parser_action_row1547[] = {
+static int parser_action_row1570[] = {
        1,
-       -1, 1, 119
+       -1, 1, 121
 };
-static int parser_action_row1548[] = {
+static int parser_action_row1571[] = {
        1,
-       -1, 1, 107
+       -1, 1, 109
 };
-static int parser_action_row1549[] = {
+static int parser_action_row1572[] = {
        1,
-       -1, 1, 114
+       -1, 1, 116
 };
-static int parser_action_row1550[] = {
+static int parser_action_row1573[] = {
        25,
-       -1, 3, 1549,
-       41, 0, 1302,
+       -1, 3, 1572,
+       41, 0, 1313,
        47, 0, 396,
        54, 0, 640,
        74, 0, 641,
@@ -16705,873 +17136,125 @@ static int parser_action_row1550[] = {
        96, 0, 424,
        97, 0, 660
 };
-static int parser_action_row1551[] = {
+static int parser_action_row1574[] = {
        1,
-       -1, 1, 1065
+       -1, 1, 1069
 };
-static int parser_action_row1552[] = {
+static int parser_action_row1575[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1553[] = {
-       1,
-       -1, 1, 128
-};
-static int parser_action_row1554[] = {
+static int parser_action_row1576[] = {
        1,
-       -1, 1, 40
-};
-static int parser_action_row1555[] = {
-       2,
-       -1, 3, 1554,
-       96, 0, 1313
+       -1, 1, 130
 };
-static int parser_action_row1556[] = {
+static int parser_action_row1577[] = {
        1,
-       -1, 1, 35
+       -1, 1, 41
 };
-static int parser_action_row1557[] = {
-       1,
-       -1, 1, 1059
+static int parser_action_row1578[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
-static int parser_action_row1558[] = {
+static int parser_action_row1579[] = {
        2,
-       -1, 3, 1557,
-       55, 0, 1620
+       -1, 3, 1578,
+       9, 0, 1649
 };
-static int parser_action_row1559[] = {
-       23,
-       -1, 3, 1558,
-       54, 0, 640,
-       74, 0, 641,
-       75, 0, 642,
-       76, 0, 643,
-       77, 0, 644,
-       78, 0, 645,
-       79, 0, 646,
-       80, 0, 647,
-       81, 0, 648,
-       82, 0, 649,
-       83, 0, 650,
-       84, 0, 651,
-       85, 0, 652,
-       86, 0, 653,
-       87, 0, 654,
-       88, 0, 655,
-       89, 0, 656,
-       90, 0, 657,
-       91, 0, 658,
-       92, 0, 659,
-       96, 0, 53,
-       97, 0, 660
+static int parser_action_row1580[] = {
+       4,
+       -1, 1, 485,
+       0, 0, 1,
+       1, 0, 2,
+       95, 0, 3
 };
-static int parser_action_row1560[] = {
+static int parser_action_row1581[] = {
        2,
-       -1, 3, 1559,
-       96, 0, 1622
+       -1, 3, 1580,
+       96, 0, 1324
 };
-static int parser_action_row1561[] = {
-       27,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2,
-       52, 0, 828,
-       54, 0, 640,
-       57, 0, 829,
-       74, 0, 641,
-       75, 0, 642,
-       76, 0, 643,
-       77, 0, 644,
-       78, 0, 645,
-       79, 0, 646,
-       80, 0, 647,
-       81, 0, 648,
-       82, 0, 649,
-       83, 0, 650,
-       84, 0, 651,
-       85, 0, 652,
-       86, 0, 653,
-       87, 0, 654,
-       88, 0, 655,
-       89, 0, 656,
-       90, 0, 657,
-       91, 0, 658,
-       92, 0, 659,
-       96, 0, 53,
-       97, 0, 660
-};
-static int parser_action_row1562[] = {
-       2,
-       -1, 3, 1561,
-       97, 0, 1625
-};
-static int parser_action_row1563[] = {
-       27,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2,
-       52, 0, 828,
-       54, 0, 640,
-       57, 0, 829,
-       74, 0, 641,
-       75, 0, 642,
-       76, 0, 643,
-       77, 0, 644,
-       78, 0, 645,
-       79, 0, 646,
-       80, 0, 647,
-       81, 0, 648,
-       82, 0, 649,
-       83, 0, 650,
-       84, 0, 651,
-       85, 0, 652,
-       86, 0, 653,
-       87, 0, 654,
-       88, 0, 655,
-       89, 0, 656,
-       90, 0, 657,
-       91, 0, 658,
-       92, 0, 659,
-       96, 0, 53,
-       97, 0, 660
-};
-static int parser_action_row1564[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1565[] = {
-       1,
-       -1, 1, 1002
-};
-static int parser_action_row1566[] = {
-       1,
-       -1, 1, 1007
-};
-static int parser_action_row1567[] = {
-       1,
-       -1, 1, 1004
-};
-static int parser_action_row1568[] = {
-       3,
-       -1, 3, 1567,
-       47, 0, 396,
-       96, 0, 397
-};
-static int parser_action_row1569[] = {
-       54,
-       -1, 1, 456,
-       12, 0, 170,
-       15, 0, 33,
-       16, 0, 34,
-       22, 0, 171,
-       25, 0, 36,
-       26, 0, 37,
-       27, 0, 38,
-       31, 0, 172,
-       33, 0, 399,
-       34, 0, 400,
-       35, 0, 401,
-       36, 0, 402,
-       37, 0, 43,
-       38, 0, 173,
-       40, 0, 174,
-       42, 0, 45,
-       43, 0, 46,
-       44, 0, 47,
-       45, 0, 48,
-       47, 0, 396,
-       48, 0, 175,
-       50, 0, 49,
-       51, 0, 403,
-       52, 0, 51,
-       54, 0, 404,
-       74, 0, 405,
-       75, 0, 406,
-       76, 0, 407,
-       77, 0, 408,
-       78, 0, 409,
-       79, 0, 410,
-       80, 0, 411,
-       81, 0, 412,
-       82, 0, 413,
-       83, 0, 414,
-       84, 0, 415,
-       85, 0, 416,
-       86, 0, 417,
-       87, 0, 418,
-       88, 0, 419,
-       89, 0, 420,
-       90, 0, 421,
-       91, 0, 422,
-       92, 0, 423,
-       94, 0, 204,
-       96, 0, 424,
-       97, 0, 425,
-       99, 0, 55,
-       100, 0, 56,
-       101, 0, 57,
-       102, 0, 58,
-       103, 0, 59,
-       106, 0, 60
-};
-static int parser_action_row1570[] = {
-       26,
-       -1, 1, 516,
-       12, 0, 170,
-       22, 0, 171,
-       31, 0, 172,
-       38, 0, 173,
-       40, 0, 174,
-       41, 1, 456,
-       42, 0, 45,
-       43, 0, 46,
-       44, 0, 47,
-       45, 0, 48,
-       48, 0, 175,
-       52, 0, 51,
-       54, 0, 52,
-       74, 0, 176,
-       75, 0, 177,
-       83, 0, 178,
-       96, 0, 53,
-       97, 0, 179,
-       98, 1, 456,
-       99, 0, 55,
-       100, 0, 56,
-       101, 0, 57,
-       102, 0, 58,
-       103, 0, 59,
-       106, 0, 60
-};
-static int parser_action_row1571[] = {
-       24,
-       -1, 1, 456,
-       12, 0, 170,
-       22, 0, 171,
-       31, 0, 172,
-       38, 0, 173,
-       40, 0, 174,
-       42, 0, 45,
-       43, 0, 46,
-       44, 0, 47,
-       45, 0, 48,
-       48, 0, 175,
-       52, 0, 51,
-       54, 0, 52,
-       74, 0, 176,
-       75, 0, 177,
-       83, 0, 178,
-       96, 0, 53,
-       97, 0, 179,
-       99, 0, 55,
-       100, 0, 56,
-       101, 0, 57,
-       102, 0, 58,
-       103, 0, 59,
-       106, 0, 60
-};
-static int parser_action_row1572[] = {
-       13,
-       -1, 1, 753,
-       59, 0, 1633,
-       60, 0, 217,
-       61, 0, 218,
-       62, 0, 219,
-       63, 0, 220,
-       64, 0, 221,
-       65, 0, 222,
-       66, 0, 223,
-       67, 0, 224,
-       68, 0, 225,
-       69, 0, 226,
-       70, 0, 227
-};
-static int parser_action_row1573[] = {
-       13,
-       -1, 1, 744,
-       59, 0, 1635,
-       60, 0, 217,
-       61, 0, 218,
-       62, 0, 219,
-       63, 0, 220,
-       64, 0, 221,
-       65, 0, 222,
-       66, 0, 223,
-       67, 0, 224,
-       68, 0, 225,
-       69, 0, 226,
-       70, 0, 227
-};
-static int parser_action_row1574[] = {
-       14,
-       -1, 1, 756,
-       52, 0, 277,
-       59, 0, 1637,
-       60, 0, 217,
-       61, 0, 218,
-       62, 0, 219,
-       63, 0, 220,
-       64, 0, 221,
-       65, 0, 222,
-       66, 0, 223,
-       67, 0, 224,
-       68, 0, 225,
-       69, 0, 226,
-       70, 0, 227
-};
-static int parser_action_row1575[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1576[] = {
-       13,
-       -1, 1, 767,
-       59, 0, 1641,
-       60, 0, 217,
-       61, 0, 218,
-       62, 0, 219,
-       63, 0, 220,
-       64, 0, 221,
-       65, 0, 222,
-       66, 0, 223,
-       67, 0, 224,
-       68, 0, 225,
-       69, 0, 226,
-       70, 0, 227
-};
-static int parser_action_row1577[] = {
-       2,
-       -1, 1, 799,
-       56, 0, 1369
-};
-static int parser_action_row1578[] = {
-       15,
-       -1, 1, 760,
-       52, 0, 277,
-       58, 0, 215,
-       59, 0, 1643,
-       60, 0, 217,
-       61, 0, 218,
-       62, 0, 219,
-       63, 0, 220,
-       64, 0, 221,
-       65, 0, 222,
-       66, 0, 223,
-       67, 0, 224,
-       68, 0, 225,
-       69, 0, 226,
-       70, 0, 227
-};
-static int parser_action_row1579[] = {
-       22,
-       -1, 1, 454,
-       54, 0, 619,
-       74, 0, 620,
-       75, 0, 621,
-       76, 0, 407,
-       77, 0, 408,
-       78, 0, 409,
-       79, 0, 410,
-       80, 0, 411,
-       81, 0, 412,
-       82, 0, 413,
-       83, 0, 622,
-       84, 0, 415,
-       85, 0, 416,
-       86, 0, 417,
-       87, 0, 418,
-       88, 0, 419,
-       89, 0, 420,
-       90, 0, 421,
-       91, 0, 422,
-       92, 0, 423,
-       97, 0, 1646
-};
-static int parser_action_row1580[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1581[] = {
-       1,
-       -1, 1, 359
-};
-static int parser_action_row1582[] = {
-       22,
-       -1, 1, 456,
-       12, 0, 116,
-       22, 0, 117,
-       31, 0, 118,
-       38, 0, 119,
-       40, 0, 120,
-       42, 0, 121,
-       43, 0, 122,
-       44, 0, 123,
-       45, 0, 124,
-       48, 0, 125,
-       74, 0, 127,
-       75, 0, 128,
-       83, 0, 129,
-       96, 0, 53,
-       97, 0, 130,
-       99, 0, 131,
-       100, 0, 132,
-       101, 0, 133,
-       102, 0, 134,
-       103, 0, 59,
-       106, 0, 135
-};
-static int parser_action_row1583[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1584[] = {
-       1,
-       -1, 1, 776
-};
-static int parser_action_row1585[] = {
-       2,
-       -1, 3, 1584,
-       24, 0, 1650
-};
-static int parser_action_row1586[] = {
-       1,
-       -1, 1, 936
-};
-static int parser_action_row1587[] = {
-       2,
-       -1, 3, 1586,
-       49, 0, 197
-};
-static int parser_action_row1588[] = {
-       24,
-       -1, 1, 456,
-       12, 0, 170,
-       22, 0, 171,
-       31, 0, 172,
-       38, 0, 173,
-       40, 0, 174,
-       42, 0, 45,
-       43, 0, 46,
-       44, 0, 47,
-       45, 0, 48,
-       48, 0, 175,
-       52, 0, 51,
-       54, 0, 52,
-       74, 0, 176,
-       75, 0, 177,
-       83, 0, 178,
-       96, 0, 53,
-       97, 0, 179,
-       99, 0, 55,
-       100, 0, 56,
-       101, 0, 57,
-       102, 0, 58,
-       103, 0, 59,
-       106, 0, 60
-};
-static int parser_action_row1589[] = {
-       1,
-       -1, 1, 940
-};
-static int parser_action_row1590[] = {
-       2,
-       -1, 3, 1589,
-       49, 0, 197
-};
-static int parser_action_row1591[] = {
-       2,
-       -1, 1, 192,
-       24, 1, 923
-};
-static int parser_action_row1592[] = {
-       2,
-       -1, 1, 182,
-       24, 1, 913
-};
-static int parser_action_row1593[] = {
-       2,
-       -1, 1, 194,
-       24, 1, 925
-};
-static int parser_action_row1594[] = {
-       2,
-       -1, 1, 184,
-       24, 1, 915
-};
-static int parser_action_row1595[] = {
-       25,
-       -1, 1, 440,
-       12, 0, 116,
-       22, 0, 117,
-       31, 0, 118,
-       38, 0, 119,
-       40, 0, 120,
-       41, 1, 456,
-       42, 0, 121,
-       43, 0, 122,
-       44, 0, 123,
-       45, 0, 124,
-       48, 0, 125,
-       52, 0, 486,
-       74, 0, 127,
-       75, 0, 128,
-       83, 0, 129,
-       96, 0, 53,
-       97, 0, 130,
-       98, 1, 456,
-       99, 0, 131,
-       100, 0, 132,
-       101, 0, 133,
-       102, 0, 134,
-       103, 0, 59,
-       106, 0, 135
-};
-static int parser_action_row1596[] = {
-       39,
-       -1, 1, 440,
-       12, 0, 116,
-       22, 0, 117,
-       31, 0, 118,
-       38, 0, 119,
-       40, 0, 120,
-       41, 1, 456,
-       42, 0, 121,
-       43, 0, 122,
-       44, 0, 123,
-       45, 0, 124,
-       48, 0, 125,
-       52, 0, 126,
-       54, 1, 333,
-       59, 0, 1177,
-       60, 0, 217,
-       61, 0, 218,
-       62, 0, 219,
-       63, 0, 220,
-       64, 0, 221,
-       65, 0, 222,
-       66, 0, 223,
-       67, 0, 224,
-       68, 0, 225,
-       69, 0, 226,
-       70, 0, 227,
-       73, 1, 333,
-       74, 0, 127,
-       75, 0, 128,
-       83, 0, 129,
-       96, 0, 53,
-       97, 0, 130,
-       98, 1, 456,
-       99, 0, 131,
-       100, 0, 132,
-       101, 0, 133,
-       102, 0, 134,
-       103, 0, 59,
-       106, 0, 135
-};
-static int parser_action_row1597[] = {
-       1,
-       -1, 1, 267
-};
-static int parser_action_row1598[] = {
-       24,
-       -1, 1, 456,
-       12, 0, 170,
-       22, 0, 171,
-       31, 0, 172,
-       38, 0, 173,
-       40, 0, 174,
-       42, 0, 45,
-       43, 0, 46,
-       44, 0, 47,
-       45, 0, 48,
-       48, 0, 175,
-       52, 0, 51,
-       54, 0, 52,
-       74, 0, 176,
-       75, 0, 177,
-       83, 0, 178,
-       96, 0, 53,
-       97, 0, 179,
-       99, 0, 55,
-       100, 0, 56,
-       101, 0, 57,
-       102, 0, 58,
-       103, 0, 59,
-       106, 0, 60
-};
-static int parser_action_row1599[] = {
-       2,
-       -1, 3, 1598,
-       53, 0, 1657
-};
-static int parser_action_row1600[] = {
-       1,
-       -1, 1, 403
-};
-static int parser_action_row1601[] = {
-       1,
-       -1, 1, 425
-};
-static int parser_action_row1602[] = {
-       25,
-       -1, 1, 456,
-       12, 0, 170,
-       22, 0, 446,
-       27, 0, 447,
-       31, 0, 172,
-       38, 0, 173,
-       40, 0, 174,
-       42, 0, 45,
-       43, 0, 46,
-       44, 0, 47,
-       45, 0, 48,
-       48, 0, 175,
-       52, 0, 51,
-       54, 0, 52,
-       74, 0, 176,
-       75, 0, 177,
-       83, 0, 178,
-       96, 0, 53,
-       97, 0, 179,
-       99, 0, 55,
-       100, 0, 56,
-       101, 0, 57,
-       102, 0, 58,
-       103, 0, 59,
-       106, 0, 60
-};
-static int parser_action_row1603[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1604[] = {
-       1,
-       -1, 1, 806
-};
-static int parser_action_row1605[] = {
-       3,
-       -1, 3, 1604,
-       96, 0, 53,
-       97, 0, 1660
-};
-static int parser_action_row1606[] = {
-       2,
-       -1, 3, 1605,
-       98, 0, 1663
-};
-static int parser_action_row1607[] = {
-       1,
-       -1, 1, 529
-};
-static int parser_action_row1608[] = {
-       2,
-       -1, 1, 401,
-       94, 0, 204
-};
-static int parser_action_row1609[] = {
-       1,
-       -1, 1, 522
-};
-static int parser_action_row1610[] = {
-       1,
-       -1, 1, 591
-};
-static int parser_action_row1611[] = {
-       3,
-       -1, 3, 1610,
-       31, 0, 1665,
-       52, 0, 1666
-};
-static int parser_action_row1612[] = {
-       1,
-       -1, 1, 573
-};
-static int parser_action_row1613[] = {
-       1,
-       -1, 1, 571
-};
-static int parser_action_row1614[] = {
-       2,
-       -1, 1, 579,
-       52, 0, 277
-};
-static int parser_action_row1615[] = {
-       3,
-       -1, 1, 587,
-       52, 0, 277,
-       58, 0, 215
-};
-static int parser_action_row1616[] = {
-       2,
-       -1, 1, 454,
-       97, 0, 1669
-};
-static int parser_action_row1617[] = {
-       57,
-       -1, 1, 456,
-       0, 0, 88,
-       1, 0, 89,
-       12, 0, 116,
-       15, 0, 33,
-       16, 0, 34,
-       22, 0, 117,
-       25, 0, 36,
-       26, 0, 37,
-       27, 0, 38,
-       31, 0, 118,
-       33, 0, 1441,
-       34, 0, 1442,
-       35, 0, 1443,
-       36, 0, 1444,
-       37, 0, 43,
-       38, 0, 119,
-       40, 0, 120,
-       42, 0, 121,
-       43, 0, 122,
-       44, 0, 123,
-       45, 0, 124,
-       47, 0, 396,
-       48, 0, 125,
-       50, 0, 49,
-       51, 0, 1445,
-       52, 0, 1670,
-       54, 0, 619,
-       74, 0, 1447,
-       75, 0, 1448,
-       76, 0, 407,
-       77, 0, 408,
-       78, 0, 409,
-       79, 0, 410,
-       80, 0, 411,
-       81, 0, 412,
-       82, 0, 413,
-       83, 0, 1449,
-       84, 0, 415,
-       85, 0, 416,
-       86, 0, 417,
-       87, 0, 418,
-       88, 0, 419,
-       89, 0, 420,
-       90, 0, 421,
-       91, 0, 422,
-       92, 0, 423,
-       94, 0, 204,
-       95, 0, 90,
-       96, 0, 424,
-       97, 0, 1450,
-       99, 0, 131,
-       100, 0, 132,
-       101, 0, 133,
-       102, 0, 134,
-       103, 0, 59,
-       106, 0, 135
-};
-static int parser_action_row1618[] = {
-       1,
-       -1, 1, 123
-};
-static int parser_action_row1619[] = {
-       5,
-       -1, 3, 1618,
-       31, 0, 1674,
-       47, 0, 1675,
-       52, 0, 1676,
-       96, 0, 397
-};
-static int parser_action_row1620[] = {
-       1,
-       -1, 1, 38
-};
-static int parser_action_row1621[] = {
-       1,
-       -1, 1, 36
-};
-static int parser_action_row1622[] = {
-       5,
-       -1, 1, 485,
+static int parser_action_row1582[] = {
+       1,
+       -1, 1, 1061
+};
+static int parser_action_row1583[] = {
+       5,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        52, 0, 828,
        57, 0, 829
 };
-static int parser_action_row1623[] = {
+static int parser_action_row1584[] = {
        2,
-       -1, 3, 1622,
+       -1, 3, 1583,
        57, 0, 829
 };
-static int parser_action_row1624[] = {
+static int parser_action_row1585[] = {
        3,
-       -1, 3, 1623,
-       14, 0, 1680,
-       15, 0, 1681
+       -1, 3, 1584,
+       14, 0, 1654,
+       15, 0, 1655
 };
-static int parser_action_row1625[] = {
+static int parser_action_row1586[] = {
        5,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        52, 0, 828,
        57, 0, 829
 };
-static int parser_action_row1626[] = {
+static int parser_action_row1587[] = {
        2,
-       -1, 1, 153,
+       -1, 1, 155,
        57, 0, 333
 };
-static int parser_action_row1627[] = {
+static int parser_action_row1588[] = {
        4,
-       -1, 1, 122,
+       -1, 1, 124,
        4, 0, 977,
        14, 0, 978,
-       15, 0, 1685
+       15, 0, 1659
 };
-static int parser_action_row1628[] = {
+static int parser_action_row1589[] = {
        5,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2,
        52, 0, 828,
        57, 0, 829
 };
-static int parser_action_row1629[] = {
+static int parser_action_row1590[] = {
        3,
-       -1, 3, 1628,
+       -1, 3, 1589,
        47, 0, 396,
        96, 0, 397
 };
-static int parser_action_row1630[] = {
+static int parser_action_row1591[] = {
        2,
-       -1, 3, 1629,
-       57, 0, 1691
+       -1, 3, 1590,
+       57, 0, 1665
 };
-static int parser_action_row1631[] = {
+static int parser_action_row1592[] = {
        2,
-       -1, 3, 1630,
-       53, 0, 1692
+       -1, 3, 1591,
+       53, 0, 1666
 };
-static int parser_action_row1632[] = {
+static int parser_action_row1593[] = {
        1,
-       -1, 1, 669
+       -1, 1, 671
 };
-static int parser_action_row1633[] = {
+static int parser_action_row1594[] = {
        1,
-       -1, 1, 688
+       -1, 1, 690
 };
-static int parser_action_row1634[] = {
+static int parser_action_row1595[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -17596,9 +17279,9 @@ static int parser_action_row1634[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1635[] = {
+static int parser_action_row1596[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -17623,9 +17306,9 @@ static int parser_action_row1635[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1636[] = {
+static int parser_action_row1597[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -17650,9 +17333,9 @@ static int parser_action_row1636[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1637[] = {
+static int parser_action_row1598[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -17677,15 +17360,15 @@ static int parser_action_row1637[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1638[] = {
+static int parser_action_row1599[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -17698,7 +17381,7 @@ static int parser_action_row1638[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -17706,9 +17389,9 @@ static int parser_action_row1638[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1639[] = {
+static int parser_action_row1600[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -17733,10 +17416,10 @@ static int parser_action_row1639[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1640[] = {
+static int parser_action_row1601[] = {
        13,
-       -1, 1, 755,
-       59, 0, 1699,
+       -1, 1, 757,
+       59, 0, 1673,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -17749,9 +17432,9 @@ static int parser_action_row1640[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1641[] = {
+static int parser_action_row1602[] = {
        25,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 730,
        46, 0, 731,
        54, 0, 619,
@@ -17775,11 +17458,11 @@ static int parser_action_row1641[] = {
        91, 0, 422,
        92, 0, 423,
        96, 0, 53,
-       97, 0, 1701
+       97, 0, 1675
 };
-static int parser_action_row1642[] = {
+static int parser_action_row1603[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -17804,9 +17487,9 @@ static int parser_action_row1642[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1643[] = {
+static int parser_action_row1604[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -17831,15 +17514,15 @@ static int parser_action_row1643[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1644[] = {
+static int parser_action_row1605[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -17852,7 +17535,7 @@ static int parser_action_row1644[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -17860,9 +17543,9 @@ static int parser_action_row1644[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1645[] = {
+static int parser_action_row1606[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -17887,10 +17570,10 @@ static int parser_action_row1645[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1646[] = {
+static int parser_action_row1607[] = {
        13,
-       -1, 1, 759,
-       59, 0, 1710,
+       -1, 1, 761,
+       59, 0, 1684,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -17903,11 +17586,11 @@ static int parser_action_row1646[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1647[] = {
+static int parser_action_row1608[] = {
        14,
-       -1, 1, 758,
+       -1, 1, 760,
        52, 0, 277,
-       59, 0, 1712,
+       59, 0, 1686,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -17920,50 +17603,85 @@ static int parser_action_row1647[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1648[] = {
+static int parser_action_row1609[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1610[] = {
+       1,
+       -1, 1, 363
+};
+static int parser_action_row1611[] = {
+       22,
+       -1, 1, 458,
+       12, 0, 116,
+       22, 0, 117,
+       31, 0, 118,
+       38, 0, 119,
+       40, 0, 120,
+       42, 0, 121,
+       43, 0, 122,
+       44, 0, 123,
+       45, 0, 124,
+       48, 0, 125,
+       74, 0, 127,
+       75, 0, 128,
+       83, 0, 129,
+       96, 0, 53,
+       97, 0, 130,
+       99, 0, 131,
+       100, 0, 132,
+       101, 0, 133,
+       102, 0, 134,
+       103, 0, 59,
+       106, 0, 135
+};
+static int parser_action_row1612[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1613[] = {
+       1,
+       -1, 1, 778
+};
+static int parser_action_row1614[] = {
        2,
-       -1, 3, 1647,
-       53, 0, 1715
+       -1, 3, 1613,
+       24, 0, 1692
 };
-static int parser_action_row1649[] = {
+static int parser_action_row1615[] = {
        1,
-       -1, 1, 697
+       -1, 1, 938
 };
-static int parser_action_row1650[] = {
+static int parser_action_row1616[] = {
        2,
-       -1, 3, 1649,
-       53, 0, 1716
+       -1, 3, 1615,
+       49, 0, 197
 };
-static int parser_action_row1651[] = {
-       34,
-       -1, 1, 456,
-       0, 0, 1,
-       1, 0, 2,
-       9, 0, 1349,
-       12, 0, 887,
-       15, 0, 888,
-       16, 0, 34,
-       22, 0, 889,
-       25, 0, 891,
-       26, 0, 892,
-       27, 0, 893,
-       33, 0, 894,
-       34, 0, 895,
-       35, 0, 896,
-       36, 0, 897,
-       37, 0, 898,
-       38, 0, 44,
+static int parser_action_row1617[] = {
+       24,
+       -1, 1, 458,
+       12, 0, 170,
+       22, 0, 171,
+       31, 0, 172,
+       38, 0, 173,
+       40, 0, 174,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
        45, 0, 48,
-       50, 0, 899,
-       51, 0, 900,
+       48, 0, 175,
        52, 0, 51,
        54, 0, 52,
-       95, 0, 3,
+       74, 0, 176,
+       75, 0, 177,
+       83, 0, 178,
        96, 0, 53,
-       97, 0, 901,
+       97, 0, 179,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -17971,50 +17689,155 @@ static int parser_action_row1651[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1652[] = {
+static int parser_action_row1618[] = {
+       1,
+       -1, 1, 942
+};
+static int parser_action_row1619[] = {
        2,
-       -1, 1, 265,
-       24, 1, 935
+       -1, 3, 1618,
+       49, 0, 197
 };
-static int parser_action_row1653[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
+static int parser_action_row1620[] = {
+       2,
+       -1, 1, 194,
+       24, 1, 925
 };
-static int parser_action_row1654[] = {
+static int parser_action_row1621[] = {
        2,
-       -1, 1, 269,
-       24, 1, 939
+       -1, 1, 184,
+       24, 1, 915
 };
-static int parser_action_row1655[] = {
+static int parser_action_row1622[] = {
        2,
-       -1, 1, 193,
-       24, 1, 924
+       -1, 1, 196,
+       24, 1, 927
+};
+static int parser_action_row1623[] = {
+       2,
+       -1, 1, 186,
+       24, 1, 917
+};
+static int parser_action_row1624[] = {
+       25,
+       -1, 1, 442,
+       12, 0, 116,
+       22, 0, 117,
+       31, 0, 118,
+       38, 0, 119,
+       40, 0, 120,
+       41, 1, 458,
+       42, 0, 121,
+       43, 0, 122,
+       44, 0, 123,
+       45, 0, 124,
+       48, 0, 125,
+       52, 0, 486,
+       74, 0, 127,
+       75, 0, 128,
+       83, 0, 129,
+       96, 0, 53,
+       97, 0, 130,
+       98, 1, 458,
+       99, 0, 131,
+       100, 0, 132,
+       101, 0, 133,
+       102, 0, 134,
+       103, 0, 59,
+       106, 0, 135
+};
+static int parser_action_row1625[] = {
+       39,
+       -1, 1, 442,
+       12, 0, 116,
+       22, 0, 117,
+       31, 0, 118,
+       38, 0, 119,
+       40, 0, 120,
+       41, 1, 458,
+       42, 0, 121,
+       43, 0, 122,
+       44, 0, 123,
+       45, 0, 124,
+       48, 0, 125,
+       52, 0, 126,
+       54, 1, 337,
+       59, 0, 1187,
+       60, 0, 217,
+       61, 0, 218,
+       62, 0, 219,
+       63, 0, 220,
+       64, 0, 221,
+       65, 0, 222,
+       66, 0, 223,
+       67, 0, 224,
+       68, 0, 225,
+       69, 0, 226,
+       70, 0, 227,
+       73, 1, 337,
+       74, 0, 127,
+       75, 0, 128,
+       83, 0, 129,
+       96, 0, 53,
+       97, 0, 130,
+       98, 1, 458,
+       99, 0, 131,
+       100, 0, 132,
+       101, 0, 133,
+       102, 0, 134,
+       103, 0, 59,
+       106, 0, 135
+};
+static int parser_action_row1626[] = {
+       1,
+       -1, 1, 271
+};
+static int parser_action_row1627[] = {
+       24,
+       -1, 1, 458,
+       12, 0, 170,
+       22, 0, 171,
+       31, 0, 172,
+       38, 0, 173,
+       40, 0, 174,
+       42, 0, 45,
+       43, 0, 46,
+       44, 0, 47,
+       45, 0, 48,
+       48, 0, 175,
+       52, 0, 51,
+       54, 0, 52,
+       74, 0, 176,
+       75, 0, 177,
+       83, 0, 178,
+       96, 0, 53,
+       97, 0, 179,
+       99, 0, 55,
+       100, 0, 56,
+       101, 0, 57,
+       102, 0, 58,
+       103, 0, 59,
+       106, 0, 60
 };
-static int parser_action_row1656[] = {
+static int parser_action_row1628[] = {
        2,
-       -1, 1, 183,
-       24, 1, 914
+       -1, 3, 1627,
+       53, 0, 1699
 };
-static int parser_action_row1657[] = {
+static int parser_action_row1629[] = {
        1,
-       -1, 1, 280
-};
-static int parser_action_row1658[] = {
-       2,
-       -1, 1, 401,
-       94, 0, 204
+       -1, 1, 407
 };
-static int parser_action_row1659[] = {
+static int parser_action_row1630[] = {
        1,
-       -1, 1, 387
+       -1, 1, 427
 };
-static int parser_action_row1660[] = {
-       24,
-       -1, 1, 456,
+static int parser_action_row1631[] = {
+       25,
+       -1, 1, 458,
        12, 0, 170,
-       22, 0, 171,
+       22, 0, 446,
+       27, 0, 447,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
@@ -18037,125 +17860,186 @@ static int parser_action_row1660[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1661[] = {
+static int parser_action_row1632[] = {
        3,
-       -1, 1, 596,
-       52, 0, 277,
-       58, 0, 215
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
-static int parser_action_row1662[] = {
-       2,
-       -1, 3, 1661,
-       97, 0, 1722
+static int parser_action_row1633[] = {
+       1,
+       -1, 1, 808
 };
-static int parser_action_row1663[] = {
+static int parser_action_row1634[] = {
        3,
-       -1, 3, 1662,
+       -1, 3, 1633,
        96, 0, 53,
-       97, 0, 1723
+       97, 0, 1702
 };
-static int parser_action_row1664[] = {
+static int parser_action_row1635[] = {
        2,
-       -1, 1, 568,
-       73, 1, 571
+       -1, 3, 1634,
+       98, 0, 1705
 };
-static int parser_action_row1665[] = {
+static int parser_action_row1636[] = {
        1,
-       -1, 1, 523
+       -1, 1, 531
 };
-static int parser_action_row1666[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
+static int parser_action_row1637[] = {
+       2,
+       -1, 1, 405,
+       94, 0, 204
 };
-static int parser_action_row1667[] = {
+static int parser_action_row1638[] = {
+       1,
+       -1, 1, 524
+};
+static int parser_action_row1639[] = {
+       1,
+       -1, 1, 593
+};
+static int parser_action_row1640[] = {
        3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
+       -1, 3, 1639,
+       31, 0, 1707,
+       52, 0, 1708
 };
-static int parser_action_row1668[] = {
+static int parser_action_row1641[] = {
        1,
-       -1, 1, 577
+       -1, 1, 575
 };
-static int parser_action_row1669[] = {
+static int parser_action_row1642[] = {
        1,
-       -1, 1, 585
+       -1, 1, 573
 };
-static int parser_action_row1670[] = {
+static int parser_action_row1643[] = {
        2,
-       -1, 1, 583,
+       -1, 1, 581,
        52, 0, 277
 };
-static int parser_action_row1671[] = {
+static int parser_action_row1644[] = {
        3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
+       -1, 1, 589,
+       52, 0, 277,
+       58, 0, 215
 };
-static int parser_action_row1672[] = {
-       4,
-       -1, 3, 1671,
+static int parser_action_row1645[] = {
+       2,
+       -1, 1, 456,
+       97, 0, 1711
+};
+static int parser_action_row1646[] = {
+       57,
+       -1, 1, 458,
        0, 0, 88,
        1, 0, 89,
-       95, 0, 90
+       12, 0, 116,
+       15, 0, 33,
+       16, 0, 34,
+       22, 0, 117,
+       25, 0, 36,
+       26, 0, 37,
+       27, 0, 38,
+       31, 0, 118,
+       33, 0, 1329,
+       34, 0, 1330,
+       35, 0, 1331,
+       36, 0, 1332,
+       37, 0, 43,
+       38, 0, 119,
+       40, 0, 120,
+       42, 0, 121,
+       43, 0, 122,
+       44, 0, 123,
+       45, 0, 124,
+       47, 0, 396,
+       48, 0, 125,
+       50, 0, 49,
+       51, 0, 1333,
+       52, 0, 1712,
+       54, 0, 619,
+       74, 0, 1335,
+       75, 0, 1336,
+       76, 0, 407,
+       77, 0, 408,
+       78, 0, 409,
+       79, 0, 410,
+       80, 0, 411,
+       81, 0, 412,
+       82, 0, 413,
+       83, 0, 1337,
+       84, 0, 415,
+       85, 0, 416,
+       86, 0, 417,
+       87, 0, 418,
+       88, 0, 419,
+       89, 0, 420,
+       90, 0, 421,
+       91, 0, 422,
+       92, 0, 423,
+       94, 0, 204,
+       95, 0, 90,
+       96, 0, 424,
+       97, 0, 1338,
+       99, 0, 131,
+       100, 0, 132,
+       101, 0, 133,
+       102, 0, 134,
+       103, 0, 59,
+       106, 0, 135
 };
-static int parser_action_row1673[] = {
+static int parser_action_row1647[] = {
        1,
-       -1, 1, 413
+       -1, 1, 125
 };
-static int parser_action_row1674[] = {
-       4,
-       -1, 3, 1673,
-       0, 0, 88,
-       1, 0, 89,
-       95, 0, 90
+static int parser_action_row1648[] = {
+       5,
+       -1, 3, 1647,
+       31, 0, 1716,
+       47, 0, 1717,
+       52, 0, 1718,
+       96, 0, 397
 };
-static int parser_action_row1675[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
+static int parser_action_row1649[] = {
+       1,
+       -1, 1, 42
 };
-static int parser_action_row1676[] = {
-       2,
-       -1, 1, 133,
-       96, 0, 603
+static int parser_action_row1650[] = {
+       1,
+       -1, 1, 28
 };
-static int parser_action_row1677[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
+static int parser_action_row1651[] = {
+       2,
+       -1, 3, 1650,
+       9, 0, 1720
 };
-static int parser_action_row1678[] = {
+static int parser_action_row1652[] = {
        1,
-       -1, 1, 131
+       -1, 1, 40
 };
-static int parser_action_row1679[] = {
+static int parser_action_row1653[] = {
        4,
-       -1, 1, 122,
+       -1, 1, 124,
        4, 0, 977,
        14, 0, 978,
-       15, 0, 1733
+       15, 0, 1721
 };
-static int parser_action_row1680[] = {
+static int parser_action_row1654[] = {
        2,
-       -1, 1, 76,
+       -1, 1, 78,
        14, 0, 969
 };
-static int parser_action_row1681[] = {
+static int parser_action_row1655[] = {
        5,
-       -1, 1, 28,
+       -1, 1, 30,
        0, 0, 88,
        1, 0, 89,
        13, 0, 32,
        95, 0, 90
 };
-static int parser_action_row1682[] = {
+static int parser_action_row1656[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -18190,27 +18074,27 @@ static int parser_action_row1682[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1683[] = {
+static int parser_action_row1657[] = {
        2,
-       -1, 3, 1682,
-       15, 0, 1741
+       -1, 3, 1656,
+       15, 0, 1729
 };
-static int parser_action_row1684[] = {
+static int parser_action_row1658[] = {
        3,
-       -1, 3, 1683,
-       14, 0, 1680,
-       15, 0, 1742
+       -1, 3, 1657,
+       14, 0, 1654,
+       15, 0, 1730
 };
-static int parser_action_row1685[] = {
+static int parser_action_row1659[] = {
        4,
-       -1, 1, 76,
-       14, 0, 1744,
-       15, 0, 1745,
-       59, 0, 1746
+       -1, 1, 78,
+       14, 0, 1732,
+       15, 0, 1733,
+       59, 0, 1734
 };
-static int parser_action_row1686[] = {
+static int parser_action_row1660[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -18245,37 +18129,37 @@ static int parser_action_row1686[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1687[] = {
+static int parser_action_row1661[] = {
        3,
-       -1, 1, 122,
+       -1, 1, 124,
        4, 0, 977,
-       15, 0, 1750
+       15, 0, 1738
 };
-static int parser_action_row1688[] = {
+static int parser_action_row1662[] = {
        3,
-       -1, 3, 1687,
+       -1, 3, 1661,
        28, 0, 84,
        109, 0, 85
 };
-static int parser_action_row1689[] = {
+static int parser_action_row1663[] = {
        1,
-       -1, 1, 49
+       -1, 1, 51
 };
-static int parser_action_row1690[] = {
+static int parser_action_row1664[] = {
        4,
-       -1, 1, 122,
+       -1, 1, 124,
        4, 0, 977,
        14, 0, 978,
-       15, 0, 1753
+       15, 0, 1741
 };
-static int parser_action_row1691[] = {
+static int parser_action_row1665[] = {
        2,
-       -1, 1, 76,
+       -1, 1, 78,
        14, 0, 969
 };
-static int parser_action_row1692[] = {
+static int parser_action_row1666[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -18300,38 +18184,38 @@ static int parser_action_row1692[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1693[] = {
+static int parser_action_row1667[] = {
        2,
-       -1, 1, 420,
+       -1, 1, 422,
        94, 0, 204
 };
-static int parser_action_row1694[] = {
+static int parser_action_row1668[] = {
        1,
-       -1, 1, 668
+       -1, 1, 670
 };
-static int parser_action_row1695[] = {
+static int parser_action_row1669[] = {
        1,
-       -1, 1, 687
+       -1, 1, 689
 };
-static int parser_action_row1696[] = {
+static int parser_action_row1670[] = {
        1,
-       -1, 1, 659
+       -1, 1, 661
 };
-static int parser_action_row1697[] = {
+static int parser_action_row1671[] = {
        1,
-       -1, 1, 678
+       -1, 1, 680
 };
-static int parser_action_row1698[] = {
+static int parser_action_row1672[] = {
        1,
-       -1, 1, 671
+       -1, 1, 673
 };
-static int parser_action_row1699[] = {
+static int parser_action_row1673[] = {
        1,
-       -1, 1, 690
+       -1, 1, 692
 };
-static int parser_action_row1700[] = {
+static int parser_action_row1674[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -18356,9 +18240,9 @@ static int parser_action_row1700[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1701[] = {
+static int parser_action_row1675[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -18383,12 +18267,12 @@ static int parser_action_row1701[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1702[] = {
+static int parser_action_row1676[] = {
        15,
-       -1, 1, 746,
+       -1, 1, 748,
        52, 0, 277,
        58, 0, 215,
-       59, 0, 1762,
+       59, 0, 1750,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -18401,14 +18285,14 @@ static int parser_action_row1702[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1703[] = {
+static int parser_action_row1677[] = {
        2,
-       -1, 3, 1702,
-       98, 0, 1765
+       -1, 3, 1676,
+       98, 0, 1753
 };
-static int parser_action_row1704[] = {
+static int parser_action_row1678[] = {
        22,
-       -1, 1, 453,
+       -1, 1, 455,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -18429,15 +18313,15 @@ static int parser_action_row1704[] = {
        90, 0, 421,
        91, 0, 422,
        92, 0, 423,
-       97, 0, 1766
+       97, 0, 1754
 };
-static int parser_action_row1705[] = {
+static int parser_action_row1679[] = {
        1,
-       -1, 1, 803
+       -1, 1, 805
 };
-static int parser_action_row1706[] = {
+static int parser_action_row1680[] = {
        23,
-       -1, 1, 455,
+       -1, 1, 457,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -18459,27 +18343,27 @@ static int parser_action_row1706[] = {
        91, 0, 422,
        92, 0, 423,
        96, 0, 53,
-       97, 0, 1767
+       97, 0, 1755
 };
-static int parser_action_row1707[] = {
+static int parser_action_row1681[] = {
        1,
-       -1, 1, 676
+       -1, 1, 678
 };
-static int parser_action_row1708[] = {
+static int parser_action_row1682[] = {
        1,
-       -1, 1, 695
+       -1, 1, 697
 };
-static int parser_action_row1709[] = {
+static int parser_action_row1683[] = {
        1,
-       -1, 1, 675
+       -1, 1, 677
 };
-static int parser_action_row1710[] = {
+static int parser_action_row1684[] = {
        1,
-       -1, 1, 694
+       -1, 1, 696
 };
-static int parser_action_row1711[] = {
+static int parser_action_row1685[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -18504,9 +18388,9 @@ static int parser_action_row1711[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1712[] = {
+static int parser_action_row1686[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -18531,15 +18415,15 @@ static int parser_action_row1712[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1713[] = {
+static int parser_action_row1687[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -18552,7 +18436,7 @@ static int parser_action_row1713[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -18560,9 +18444,9 @@ static int parser_action_row1713[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1714[] = {
+static int parser_action_row1688[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -18587,10 +18471,10 @@ static int parser_action_row1714[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1715[] = {
+static int parser_action_row1689[] = {
        13,
-       -1, 1, 757,
-       59, 0, 1773,
+       -1, 1, 759,
+       59, 0, 1761,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -18603,119 +18487,116 @@ static int parser_action_row1715[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1716[] = {
-       1,
-       -1, 1, 360
-};
-static int parser_action_row1717[] = {
-       1,
-       -1, 1, 777
+static int parser_action_row1690[] = {
+       2,
+       -1, 3, 1689,
+       53, 0, 1763
 };
-static int parser_action_row1718[] = {
+static int parser_action_row1691[] = {
        1,
-       -1, 1, 932
+       -1, 1, 699
 };
-static int parser_action_row1719[] = {
+static int parser_action_row1692[] = {
        2,
-       -1, 3, 1718,
-       15, 0, 1775
+       -1, 3, 1691,
+       53, 0, 1764
 };
-static int parser_action_row1720[] = {
-       1,
-       -1, 1, 408
+static int parser_action_row1693[] = {
+       34,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2,
+       9, 0, 1381,
+       12, 0, 887,
+       15, 0, 888,
+       16, 0, 34,
+       22, 0, 889,
+       25, 0, 891,
+       26, 0, 892,
+       27, 0, 893,
+       33, 0, 894,
+       34, 0, 895,
+       35, 0, 896,
+       36, 0, 897,
+       37, 0, 898,
+       38, 0, 44,
+       42, 0, 45,
+       43, 0, 46,
+       44, 0, 47,
+       45, 0, 48,
+       50, 0, 899,
+       51, 0, 900,
+       52, 0, 51,
+       54, 0, 52,
+       95, 0, 3,
+       96, 0, 53,
+       97, 0, 901,
+       99, 0, 55,
+       100, 0, 56,
+       101, 0, 57,
+       102, 0, 58,
+       103, 0, 59,
+       106, 0, 60
 };
-static int parser_action_row1721[] = {
+static int parser_action_row1694[] = {
+       2,
+       -1, 1, 269,
+       24, 1, 937
+};
+static int parser_action_row1695[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1722[] = {
-       1,
-       -1, 1, 595
-};
-static int parser_action_row1723[] = {
+static int parser_action_row1696[] = {
        2,
-       -1, 1, 598,
-       52, 0, 277
-};
-static int parser_action_row1724[] = {
-       3,
-       -1, 1, 602,
-       52, 0, 277,
-       58, 0, 215
+       -1, 1, 273,
+       24, 1, 941
 };
-static int parser_action_row1725[] = {
+static int parser_action_row1697[] = {
        2,
-       -1, 3, 1724,
-       97, 0, 1779
+       -1, 1, 195,
+       24, 1, 926
 };
-static int parser_action_row1726[] = {
+static int parser_action_row1698[] = {
        2,
-       -1, 3, 1725,
-       45, 0, 1780
+       -1, 1, 185,
+       24, 1, 916
 };
-static int parser_action_row1727[] = {
-       4,
-       -1, 3, 1726,
-       31, 0, 1781,
-       47, 0, 396,
-       96, 0, 397
+static int parser_action_row1699[] = {
+       1,
+       -1, 1, 284
 };
-static int parser_action_row1728[] = {
+static int parser_action_row1700[] = {
+       2,
+       -1, 1, 405,
+       94, 0, 204
+};
+static int parser_action_row1701[] = {
        1,
-       -1, 1, 581
+       -1, 1, 391
 };
-static int parser_action_row1729[] = {
-       54,
-       -1, 1, 456,
+static int parser_action_row1702[] = {
+       24,
+       -1, 1, 458,
        12, 0, 170,
-       15, 0, 33,
-       16, 0, 34,
        22, 0, 171,
-       25, 0, 36,
-       26, 0, 37,
-       27, 0, 38,
        31, 0, 172,
-       33, 0, 399,
-       34, 0, 400,
-       35, 0, 401,
-       36, 0, 402,
-       37, 0, 43,
        38, 0, 173,
        40, 0, 174,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
        45, 0, 48,
-       47, 0, 396,
        48, 0, 175,
-       50, 0, 49,
-       51, 0, 403,
        52, 0, 51,
-       54, 0, 404,
-       74, 0, 405,
-       75, 0, 406,
-       76, 0, 407,
-       77, 0, 408,
-       78, 0, 409,
-       79, 0, 410,
-       80, 0, 411,
-       81, 0, 412,
-       82, 0, 413,
-       83, 0, 414,
-       84, 0, 415,
-       85, 0, 416,
-       86, 0, 417,
-       87, 0, 418,
-       88, 0, 419,
-       89, 0, 420,
-       90, 0, 421,
-       91, 0, 422,
-       92, 0, 423,
-       94, 0, 204,
-       96, 0, 424,
-       97, 0, 425,
+       54, 0, 52,
+       74, 0, 176,
+       75, 0, 177,
+       83, 0, 178,
+       96, 0, 53,
+       97, 0, 179,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -18723,29 +18604,109 @@ static int parser_action_row1729[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1730[] = {
+static int parser_action_row1703[] = {
+       3,
+       -1, 1, 598,
+       52, 0, 277,
+       58, 0, 215
+};
+static int parser_action_row1704[] = {
+       2,
+       -1, 3, 1703,
+       97, 0, 1770
+};
+static int parser_action_row1705[] = {
+       3,
+       -1, 3, 1704,
+       96, 0, 53,
+       97, 0, 1771
+};
+static int parser_action_row1706[] = {
+       2,
+       -1, 1, 570,
+       73, 1, 573
+};
+static int parser_action_row1707[] = {
        1,
-       -1, 1, 414
+       -1, 1, 525
+};
+static int parser_action_row1708[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1709[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1710[] = {
+       1,
+       -1, 1, 579
+};
+static int parser_action_row1711[] = {
+       1,
+       -1, 1, 587
+};
+static int parser_action_row1712[] = {
+       2,
+       -1, 1, 585,
+       52, 0, 277
+};
+static int parser_action_row1713[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1714[] = {
+       4,
+       -1, 3, 1713,
+       0, 0, 88,
+       1, 0, 89,
+       95, 0, 90
+};
+static int parser_action_row1715[] = {
+       1,
+       -1, 1, 415
+};
+static int parser_action_row1716[] = {
+       4,
+       -1, 3, 1715,
+       0, 0, 88,
+       1, 0, 89,
+       95, 0, 90
+};
+static int parser_action_row1717[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
+};
+static int parser_action_row1718[] = {
+       2,
+       -1, 1, 135,
+       96, 0, 603
+};
+static int parser_action_row1719[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
-static int parser_action_row1731[] = {
+static int parser_action_row1720[] = {
        1,
-       -1, 1, 417
-};
-static int parser_action_row1732[] = {
-       2,
-       -1, 3, 1731,
-       47, 0, 1784
+       -1, 1, 133
 };
-static int parser_action_row1733[] = {
-       4,
-       -1, 3, 1732,
-       31, 0, 1785,
-       47, 0, 1786,
-       96, 0, 397
+static int parser_action_row1721[] = {
+       1,
+       -1, 1, 29
 };
-static int parser_action_row1734[] = {
+static int parser_action_row1722[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -18780,45 +18741,45 @@ static int parser_action_row1734[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1735[] = {
+static int parser_action_row1723[] = {
        3,
-       -1, 1, 122,
+       -1, 1, 124,
        4, 0, 977,
-       15, 0, 1789
+       15, 0, 1782
 };
-static int parser_action_row1736[] = {
+static int parser_action_row1724[] = {
        3,
-       -1, 3, 1735,
+       -1, 3, 1723,
        28, 0, 84,
        109, 0, 85
 };
-static int parser_action_row1737[] = {
+static int parser_action_row1725[] = {
        1,
-       -1, 1, 48
+       -1, 1, 50
 };
-static int parser_action_row1738[] = {
+static int parser_action_row1726[] = {
        1,
-       -1, 1, 67
+       -1, 1, 69
 };
-static int parser_action_row1739[] = {
+static int parser_action_row1727[] = {
        1,
-       -1, 1, 77
+       -1, 1, 79
 };
-static int parser_action_row1740[] = {
+static int parser_action_row1728[] = {
        4,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
-static int parser_action_row1741[] = {
+static int parser_action_row1729[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
-static int parser_action_row1742[] = {
+static int parser_action_row1730[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -18853,9 +18814,9 @@ static int parser_action_row1742[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1743[] = {
+static int parser_action_row1731[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -18890,22 +18851,22 @@ static int parser_action_row1743[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1744[] = {
+static int parser_action_row1732[] = {
        2,
-       -1, 3, 1743,
-       15, 0, 1796
+       -1, 3, 1731,
+       15, 0, 1789
 };
-static int parser_action_row1745[] = {
+static int parser_action_row1733[] = {
        5,
-       -1, 1, 28,
+       -1, 1, 30,
        0, 0, 88,
        1, 0, 89,
        13, 0, 32,
        95, 0, 90
 };
-static int parser_action_row1746[] = {
+static int parser_action_row1734[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -18940,29 +18901,29 @@ static int parser_action_row1746[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1747[] = {
+static int parser_action_row1735[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1748[] = {
+static int parser_action_row1736[] = {
        1,
-       -1, 1, 57
+       -1, 1, 59
 };
-static int parser_action_row1749[] = {
+static int parser_action_row1737[] = {
        2,
-       -1, 3, 1748,
-       15, 0, 1801
+       -1, 3, 1736,
+       15, 0, 1794
 };
-static int parser_action_row1750[] = {
+static int parser_action_row1738[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
-static int parser_action_row1751[] = {
+static int parser_action_row1739[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -18997,19 +18958,19 @@ static int parser_action_row1751[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1752[] = {
+static int parser_action_row1740[] = {
        3,
-       -1, 3, 1751,
+       -1, 3, 1739,
        28, 0, 84,
        109, 0, 85
 };
-static int parser_action_row1753[] = {
+static int parser_action_row1741[] = {
        1,
-       -1, 1, 68
+       -1, 1, 70
 };
-static int parser_action_row1754[] = {
+static int parser_action_row1742[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -19044,51 +19005,51 @@ static int parser_action_row1754[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1755[] = {
+static int parser_action_row1743[] = {
        3,
-       -1, 1, 122,
+       -1, 1, 124,
        4, 0, 977,
-       15, 0, 1806
+       15, 0, 1799
 };
-static int parser_action_row1756[] = {
+static int parser_action_row1744[] = {
        3,
-       -1, 3, 1755,
+       -1, 3, 1743,
        28, 0, 84,
        109, 0, 85
 };
-static int parser_action_row1757[] = {
+static int parser_action_row1745[] = {
        1,
-       -1, 1, 50
+       -1, 1, 52
 };
-static int parser_action_row1758[] = {
+static int parser_action_row1746[] = {
        1,
-       -1, 1, 41
+       -1, 1, 43
 };
-static int parser_action_row1759[] = {
+static int parser_action_row1747[] = {
        1,
-       -1, 1, 1014
+       -1, 1, 1016
 };
-static int parser_action_row1760[] = {
+static int parser_action_row1748[] = {
        1,
-       -1, 1, 421
+       -1, 1, 423
 };
-static int parser_action_row1761[] = {
+static int parser_action_row1749[] = {
        1,
-       -1, 1, 670
+       -1, 1, 672
 };
-static int parser_action_row1762[] = {
+static int parser_action_row1750[] = {
        1,
-       -1, 1, 689
+       -1, 1, 691
 };
-static int parser_action_row1763[] = {
+static int parser_action_row1751[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -19101,7 +19062,7 @@ static int parser_action_row1763[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -19109,9 +19070,9 @@ static int parser_action_row1763[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1764[] = {
+static int parser_action_row1752[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19136,10 +19097,10 @@ static int parser_action_row1764[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1765[] = {
+static int parser_action_row1753[] = {
        13,
-       -1, 1, 745,
-       59, 0, 1811,
+       -1, 1, 747,
+       59, 0, 1804,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -19152,10 +19113,10 @@ static int parser_action_row1765[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1766[] = {
+static int parser_action_row1754[] = {
        13,
-       -1, 1, 743,
-       59, 0, 1813,
+       -1, 1, 745,
+       59, 0, 1806,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -19168,11 +19129,11 @@ static int parser_action_row1766[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1767[] = {
+static int parser_action_row1755[] = {
        14,
-       -1, 1, 748,
+       -1, 1, 750,
        52, 0, 277,
-       59, 0, 1815,
+       59, 0, 1808,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -19185,12 +19146,12 @@ static int parser_action_row1767[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1768[] = {
+static int parser_action_row1756[] = {
        15,
-       -1, 1, 752,
+       -1, 1, 754,
        52, 0, 277,
        58, 0, 215,
-       59, 0, 1818,
+       59, 0, 1811,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -19203,9 +19164,9 @@ static int parser_action_row1768[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1769[] = {
+static int parser_action_row1757[] = {
        22,
-       -1, 1, 454,
+       -1, 1, 456,
        54, 0, 619,
        74, 0, 620,
        75, 0, 621,
@@ -19226,27 +19187,27 @@ static int parser_action_row1769[] = {
        90, 0, 421,
        91, 0, 422,
        92, 0, 423,
-       97, 0, 1821
+       97, 0, 1814
 };
-static int parser_action_row1770[] = {
+static int parser_action_row1758[] = {
        1,
-       -1, 1, 674
+       -1, 1, 676
 };
-static int parser_action_row1771[] = {
+static int parser_action_row1759[] = {
        1,
-       -1, 1, 693
+       -1, 1, 695
 };
-static int parser_action_row1772[] = {
+static int parser_action_row1760[] = {
        1,
-       -1, 1, 673
+       -1, 1, 675
 };
-static int parser_action_row1773[] = {
+static int parser_action_row1761[] = {
        1,
-       -1, 1, 692
+       -1, 1, 694
 };
-static int parser_action_row1774[] = {
+static int parser_action_row1762[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19271,9 +19232,9 @@ static int parser_action_row1774[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1775[] = {
+static int parser_action_row1763[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19298,36 +19259,119 @@ static int parser_action_row1775[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1776[] = {
-       34,
-       -1, 1, 456,
+static int parser_action_row1764[] = {
+       1,
+       -1, 1, 364
+};
+static int parser_action_row1765[] = {
+       1,
+       -1, 1, 779
+};
+static int parser_action_row1766[] = {
+       1,
+       -1, 1, 934
+};
+static int parser_action_row1767[] = {
+       2,
+       -1, 3, 1766,
+       15, 0, 1817
+};
+static int parser_action_row1768[] = {
+       1,
+       -1, 1, 411
+};
+static int parser_action_row1769[] = {
+       3,
+       -1, 1, 487,
        0, 0, 1,
-       1, 0, 2,
-       9, 0, 1027,
-       12, 0, 887,
-       15, 0, 888,
+       1, 0, 2
+};
+static int parser_action_row1770[] = {
+       1,
+       -1, 1, 597
+};
+static int parser_action_row1771[] = {
+       2,
+       -1, 1, 600,
+       52, 0, 277
+};
+static int parser_action_row1772[] = {
+       3,
+       -1, 1, 604,
+       52, 0, 277,
+       58, 0, 215
+};
+static int parser_action_row1773[] = {
+       2,
+       -1, 3, 1772,
+       97, 0, 1821
+};
+static int parser_action_row1774[] = {
+       2,
+       -1, 3, 1773,
+       45, 0, 1822
+};
+static int parser_action_row1775[] = {
+       4,
+       -1, 3, 1774,
+       31, 0, 1823,
+       47, 0, 396,
+       96, 0, 397
+};
+static int parser_action_row1776[] = {
+       1,
+       -1, 1, 583
+};
+static int parser_action_row1777[] = {
+       54,
+       -1, 1, 458,
+       12, 0, 170,
+       15, 0, 33,
        16, 0, 34,
-       22, 0, 889,
-       25, 0, 891,
-       26, 0, 892,
-       27, 0, 893,
-       33, 0, 894,
-       34, 0, 895,
-       35, 0, 896,
-       36, 0, 897,
-       37, 0, 898,
-       38, 0, 44,
+       22, 0, 171,
+       25, 0, 36,
+       26, 0, 37,
+       27, 0, 38,
+       31, 0, 172,
+       33, 0, 399,
+       34, 0, 400,
+       35, 0, 401,
+       36, 0, 402,
+       37, 0, 43,
+       38, 0, 173,
+       40, 0, 174,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
        45, 0, 48,
-       50, 0, 899,
-       51, 0, 900,
+       47, 0, 396,
+       48, 0, 175,
+       50, 0, 49,
+       51, 0, 403,
        52, 0, 51,
-       54, 0, 52,
-       95, 0, 3,
-       96, 0, 53,
-       97, 0, 901,
+       54, 0, 404,
+       74, 0, 405,
+       75, 0, 406,
+       76, 0, 407,
+       77, 0, 408,
+       78, 0, 409,
+       79, 0, 410,
+       80, 0, 411,
+       81, 0, 412,
+       82, 0, 413,
+       83, 0, 414,
+       84, 0, 415,
+       85, 0, 416,
+       86, 0, 417,
+       87, 0, 418,
+       88, 0, 419,
+       89, 0, 420,
+       90, 0, 421,
+       91, 0, 422,
+       92, 0, 423,
+       94, 0, 204,
+       96, 0, 424,
+       97, 0, 425,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -19335,76 +19379,34 @@ static int parser_action_row1776[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1777[] = {
-       2,
-       -1, 3, 1776,
-       24, 0, 1826
-};
 static int parser_action_row1778[] = {
        1,
-       -1, 1, 597
+       -1, 1, 416
 };
 static int parser_action_row1779[] = {
        1,
-       -1, 1, 601
+       -1, 1, 419
 };
 static int parser_action_row1780[] = {
        2,
-       -1, 1, 600,
-       52, 0, 277
+       -1, 3, 1779,
+       47, 0, 1826
 };
 static int parser_action_row1781[] = {
-       1,
-       -1, 1, 605
-};
-static int parser_action_row1782[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1783[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1784[] = {
-       2,
-       -1, 3, 1783,
-       53, 0, 1830
-};
-static int parser_action_row1785[] = {
-       1,
-       -1, 1, 135
-};
-static int parser_action_row1786[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
-};
-static int parser_action_row1787[] = {
        4,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2,
-       96, 0, 603
-};
-static int parser_action_row1788[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
+       -1, 3, 1780,
+       31, 0, 1827,
+       47, 0, 1828,
+       96, 0, 397
 };
-static int parser_action_row1789[] = {
+static int parser_action_row1782[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
-static int parser_action_row1790[] = {
+static int parser_action_row1783[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -19439,37 +19441,41 @@ static int parser_action_row1790[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1791[] = {
+static int parser_action_row1784[] = {
        3,
-       -1, 3, 1790,
+       -1, 3, 1783,
        28, 0, 84,
        109, 0, 85
 };
-static int parser_action_row1792[] = {
+static int parser_action_row1785[] = {
        1,
-       -1, 1, 55
+       -1, 1, 57
 };
-static int parser_action_row1793[] = {
-       1,
-       -1, 1, 78
+static int parser_action_row1786[] = {
+       5,
+       -1, 1, 485,
+       0, 0, 1,
+       1, 0, 2,
+       15, 1, 80,
+       95, 0, 3
 };
-static int parser_action_row1794[] = {
+static int parser_action_row1787[] = {
        1,
-       -1, 1, 63
+       -1, 1, 65
 };
-static int parser_action_row1795[] = {
+static int parser_action_row1788[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
-static int parser_action_row1796[] = {
+static int parser_action_row1789[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
-static int parser_action_row1797[] = {
+static int parser_action_row1790[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -19504,26 +19510,26 @@ static int parser_action_row1797[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1798[] = {
+static int parser_action_row1791[] = {
        2,
-       -1, 1, 74,
-       15, 1, 77
+       -1, 1, 76,
+       15, 1, 79
 };
-static int parser_action_row1799[] = {
+static int parser_action_row1792[] = {
        4,
-       -1, 1, 483,
+       -1, 1, 485,
        0, 0, 1,
        1, 0, 2,
        95, 0, 3
 };
-static int parser_action_row1800[] = {
+static int parser_action_row1793[] = {
        2,
-       -1, 1, 59,
-       9, 0, 1841
+       -1, 1, 61,
+       9, 0, 1837
 };
-static int parser_action_row1801[] = {
+static int parser_action_row1794[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19548,9 +19554,9 @@ static int parser_action_row1801[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1802[] = {
+static int parser_action_row1795[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -19585,27 +19591,27 @@ static int parser_action_row1802[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1803[] = {
+static int parser_action_row1796[] = {
        1,
-       -1, 1, 51
+       -1, 1, 53
 };
-static int parser_action_row1804[] = {
+static int parser_action_row1797[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
-static int parser_action_row1805[] = {
+static int parser_action_row1798[] = {
        1,
-       -1, 1, 70
+       -1, 1, 72
 };
-static int parser_action_row1806[] = {
+static int parser_action_row1799[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
-static int parser_action_row1807[] = {
+static int parser_action_row1800[] = {
        34,
-       -1, 1, 456,
+       -1, 1, 458,
        0, 0, 1,
        1, 0, 2,
        9, 0, 589,
@@ -19640,27 +19646,27 @@ static int parser_action_row1807[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1808[] = {
+static int parser_action_row1801[] = {
        3,
-       -1, 3, 1807,
+       -1, 3, 1800,
        28, 0, 84,
        109, 0, 85
 };
-static int parser_action_row1809[] = {
+static int parser_action_row1802[] = {
        1,
-       -1, 1, 69
+       -1, 1, 71
 };
-static int parser_action_row1810[] = {
+static int parser_action_row1803[] = {
        1,
-       -1, 1, 661
+       -1, 1, 663
 };
-static int parser_action_row1811[] = {
+static int parser_action_row1804[] = {
        1,
-       -1, 1, 680
+       -1, 1, 682
 };
-static int parser_action_row1812[] = {
+static int parser_action_row1805[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19685,9 +19691,9 @@ static int parser_action_row1812[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1813[] = {
+static int parser_action_row1806[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19712,9 +19718,9 @@ static int parser_action_row1813[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1814[] = {
+static int parser_action_row1807[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19739,9 +19745,9 @@ static int parser_action_row1814[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1815[] = {
+static int parser_action_row1808[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19766,15 +19772,15 @@ static int parser_action_row1815[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1816[] = {
+static int parser_action_row1809[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -19787,7 +19793,7 @@ static int parser_action_row1816[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -19795,9 +19801,9 @@ static int parser_action_row1816[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1817[] = {
+static int parser_action_row1810[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19822,10 +19828,10 @@ static int parser_action_row1817[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1818[] = {
+static int parser_action_row1811[] = {
        13,
-       -1, 1, 747,
-       59, 0, 1854,
+       -1, 1, 749,
+       59, 0, 1850,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -19838,15 +19844,15 @@ static int parser_action_row1818[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1819[] = {
+static int parser_action_row1812[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -19859,7 +19865,7 @@ static int parser_action_row1819[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -19867,9 +19873,9 @@ static int parser_action_row1819[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1820[] = {
+static int parser_action_row1813[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -19894,10 +19900,10 @@ static int parser_action_row1820[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1821[] = {
+static int parser_action_row1814[] = {
        13,
-       -1, 1, 751,
-       59, 0, 1858,
+       -1, 1, 753,
+       59, 0, 1854,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -19910,11 +19916,11 @@ static int parser_action_row1821[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1822[] = {
+static int parser_action_row1815[] = {
        14,
-       -1, 1, 750,
+       -1, 1, 752,
        52, 0, 277,
-       59, 0, 1860,
+       59, 0, 1856,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -19927,155 +19933,206 @@ static int parser_action_row1822[] = {
        69, 0, 226,
        70, 0, 227
 };
+static int parser_action_row1816[] = {
+       1,
+       -1, 1, 674
+};
+static int parser_action_row1817[] = {
+       1,
+       -1, 1, 693
+};
+static int parser_action_row1818[] = {
+       34,
+       -1, 1, 458,
+       0, 0, 1,
+       1, 0, 2,
+       9, 0, 1035,
+       12, 0, 887,
+       15, 0, 888,
+       16, 0, 34,
+       22, 0, 889,
+       25, 0, 891,
+       26, 0, 892,
+       27, 0, 893,
+       33, 0, 894,
+       34, 0, 895,
+       35, 0, 896,
+       36, 0, 897,
+       37, 0, 898,
+       38, 0, 44,
+       42, 0, 45,
+       43, 0, 46,
+       44, 0, 47,
+       45, 0, 48,
+       50, 0, 899,
+       51, 0, 900,
+       52, 0, 51,
+       54, 0, 52,
+       95, 0, 3,
+       96, 0, 53,
+       97, 0, 901,
+       99, 0, 55,
+       100, 0, 56,
+       101, 0, 57,
+       102, 0, 58,
+       103, 0, 59,
+       106, 0, 60
+};
+static int parser_action_row1819[] = {
+       2,
+       -1, 3, 1818,
+       24, 0, 1861
+};
+static int parser_action_row1820[] = {
+       1,
+       -1, 1, 599
+};
+static int parser_action_row1821[] = {
+       1,
+       -1, 1, 603
+};
+static int parser_action_row1822[] = {
+       2,
+       -1, 1, 602,
+       52, 0, 277
+};
 static int parser_action_row1823[] = {
        1,
-       -1, 1, 672
+       -1, 1, 607
 };
 static int parser_action_row1824[] = {
-       1,
-       -1, 1, 691
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row1825[] = {
-       1,
-       -1, 1, 938
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row1826[] = {
        2,
        -1, 3, 1825,
-       49, 0, 197
+       53, 0, 1865
 };
 static int parser_action_row1827[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 137
 };
 static int parser_action_row1828[] = {
-       1,
-       -1, 1, 599
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row1829[] = {
-       2,
-       -1, 3, 1828,
-       45, 0, 1865
+       4,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2,
+       96, 0, 603
 };
 static int parser_action_row1830[] = {
-       2,
-       -1, 3, 1829,
-       53, 0, 1866
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row1831[] = {
-       5,
-       -1, 3, 1830,
-       0, 0, 88,
-       1, 0, 89,
-       94, 0, 204,
-       95, 0, 90
+       1,
+       -1, 1, 48
 };
 static int parser_action_row1832[] = {
        2,
-       -1, 3, 1831,
-       47, 0, 1869
+       -1, 1, 469,
+       9, 0, 1320
 };
 static int parser_action_row1833[] = {
-       2,
-       -1, 3, 1832,
-       53, 0, 1870
+       1,
+       -1, 1, 58
 };
 static int parser_action_row1834[] = {
-       2,
-       -1, 3, 1833,
-       53, 0, 1871
+       1,
+       -1, 1, 67
 };
 static int parser_action_row1835[] = {
        1,
-       -1, 1, 46
+       -1, 1, 66
 };
 static int parser_action_row1836[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 469,
+       9, 0, 1320
 };
 static int parser_action_row1837[] = {
-       1,
-       -1, 1, 56
+       6,
+       -1, 1, 485,
+       0, 0, 1,
+       1, 0, 2,
+       9, 0, 1451,
+       15, 1, 80,
+       95, 0, 3
 };
 static int parser_action_row1838[] = {
        1,
-       -1, 1, 65
+       -1, 1, 63
 };
 static int parser_action_row1839[] = {
-       1,
-       -1, 1, 64
+       2,
+       -1, 1, 78,
+       14, 0, 969
 };
 static int parser_action_row1840[] = {
        2,
-       -1, 1, 467,
-       9, 0, 1309
+       -1, 1, 62,
+       9, 0, 1872
 };
 static int parser_action_row1841[] = {
-       2,
-       -1, 1, 78,
-       9, 0, 1417
+       1,
+       -1, 1, 55
 };
 static int parser_action_row1842[] = {
        1,
-       -1, 1, 61
+       -1, 1, 54
 };
 static int parser_action_row1843[] = {
        2,
-       -1, 1, 76,
-       14, 0, 969
+       -1, 1, 469,
+       9, 0, 1320
 };
 static int parser_action_row1844[] = {
-       2,
-       -1, 1, 60,
-       9, 0, 1875
+       1,
+       -1, 1, 73
 };
 static int parser_action_row1845[] = {
        1,
-       -1, 1, 53
+       -1, 1, 662
 };
 static int parser_action_row1846[] = {
        1,
-       -1, 1, 52
+       -1, 1, 681
 };
 static int parser_action_row1847[] = {
-       2,
-       -1, 1, 467,
-       9, 0, 1309
+       1,
+       -1, 1, 660
 };
 static int parser_action_row1848[] = {
        1,
-       -1, 1, 71
+       -1, 1, 679
 };
 static int parser_action_row1849[] = {
        1,
-       -1, 1, 660
+       -1, 1, 665
 };
 static int parser_action_row1850[] = {
        1,
-       -1, 1, 679
+       -1, 1, 684
 };
 static int parser_action_row1851[] = {
-       1,
-       -1, 1, 658
-};
-static int parser_action_row1852[] = {
-       1,
-       -1, 1, 677
-};
-static int parser_action_row1853[] = {
-       1,
-       -1, 1, 663
-};
-static int parser_action_row1854[] = {
-       1,
-       -1, 1, 682
-};
-static int parser_action_row1855[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -20100,9 +20157,9 @@ static int parser_action_row1855[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1856[] = {
+static int parser_action_row1852[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -20127,17 +20184,17 @@ static int parser_action_row1856[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1857[] = {
+static int parser_action_row1853[] = {
        1,
-       -1, 1, 667
+       -1, 1, 669
 };
-static int parser_action_row1858[] = {
+static int parser_action_row1854[] = {
        1,
-       -1, 1, 686
+       -1, 1, 688
 };
-static int parser_action_row1859[] = {
+static int parser_action_row1855[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -20162,9 +20219,9 @@ static int parser_action_row1859[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1860[] = {
+static int parser_action_row1856[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -20189,15 +20246,15 @@ static int parser_action_row1860[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1861[] = {
+static int parser_action_row1857[] = {
        26,
-       -1, 1, 516,
+       -1, 1, 518,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
        38, 0, 173,
        40, 0, 174,
-       41, 1, 456,
+       41, 1, 458,
        42, 0, 45,
        43, 0, 46,
        44, 0, 47,
@@ -20210,7 +20267,7 @@ static int parser_action_row1861[] = {
        83, 0, 178,
        96, 0, 53,
        97, 0, 179,
-       98, 1, 456,
+       98, 1, 458,
        99, 0, 55,
        100, 0, 56,
        101, 0, 57,
@@ -20218,9 +20275,9 @@ static int parser_action_row1861[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1862[] = {
+static int parser_action_row1858[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -20245,10 +20302,10 @@ static int parser_action_row1862[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1863[] = {
+static int parser_action_row1859[] = {
        13,
-       -1, 1, 749,
-       59, 0, 1883,
+       -1, 1, 751,
+       59, 0, 1880,
        60, 0, 217,
        61, 0, 218,
        62, 0, 219,
@@ -20261,119 +20318,105 @@ static int parser_action_row1863[] = {
        69, 0, 226,
        70, 0, 227
 };
-static int parser_action_row1864[] = {
-       2,
-       -1, 1, 267,
-       24, 1, 937
+static int parser_action_row1860[] = {
+       1,
+       -1, 1, 940
 };
-static int parser_action_row1865[] = {
-       23,
-       -1, 1, 456,
-       12, 0, 1093,
-       22, 0, 1094,
-       31, 0, 1095,
-       38, 0, 1096,
-       40, 0, 1097,
-       42, 0, 1098,
-       43, 0, 1099,
-       44, 0, 1100,
-       45, 0, 1101,
-       48, 0, 1102,
-       52, 0, 51,
-       74, 0, 1103,
-       75, 0, 1104,
-       83, 0, 1105,
-       96, 0, 53,
-       97, 0, 1106,
-       99, 0, 1107,
-       100, 0, 1108,
-       101, 0, 1109,
-       102, 0, 1110,
-       103, 0, 59,
-       106, 0, 1111
+static int parser_action_row1861[] = {
+       2,
+       -1, 3, 1860,
+       49, 0, 197
 };
-static int parser_action_row1866[] = {
+static int parser_action_row1862[] = {
        3,
-       -1, 1, 485,
+       -1, 1, 487,
        0, 0, 1,
        1, 0, 2
 };
-static int parser_action_row1867[] = {
+static int parser_action_row1863[] = {
        1,
-       -1, 1, 603
+       -1, 1, 601
 };
-static int parser_action_row1868[] = {
-       4,
-       -1, 3, 1867,
+static int parser_action_row1864[] = {
+       2,
+       -1, 3, 1863,
+       45, 0, 1884
+};
+static int parser_action_row1865[] = {
+       2,
+       -1, 3, 1864,
+       53, 0, 1885
+};
+static int parser_action_row1866[] = {
+       5,
+       -1, 3, 1865,
        0, 0, 88,
        1, 0, 89,
+       94, 0, 204,
        95, 0, 90
 };
+static int parser_action_row1867[] = {
+       2,
+       -1, 3, 1866,
+       47, 0, 1888
+};
+static int parser_action_row1868[] = {
+       2,
+       -1, 3, 1867,
+       53, 0, 1889
+};
 static int parser_action_row1869[] = {
-       1,
-       -1, 1, 415
+       2,
+       -1, 3, 1868,
+       53, 0, 1890
 };
 static int parser_action_row1870[] = {
-       3,
-       -1, 1, 485,
-       0, 0, 1,
-       1, 0, 2
+       1,
+       -1, 1, 49
 };
 static int parser_action_row1871[] = {
        1,
-       -1, 1, 132
+       -1, 1, 68
 };
 static int parser_action_row1872[] = {
        1,
-       -1, 1, 130
+       -1, 1, 60
 };
 static int parser_action_row1873[] = {
        1,
-       -1, 1, 47
+       -1, 1, 64
 };
 static int parser_action_row1874[] = {
        1,
-       -1, 1, 66
+       -1, 1, 56
 };
 static int parser_action_row1875[] = {
        1,
-       -1, 1, 58
+       -1, 1, 664
 };
 static int parser_action_row1876[] = {
        1,
-       -1, 1, 62
+       -1, 1, 683
 };
 static int parser_action_row1877[] = {
        1,
-       -1, 1, 54
+       -1, 1, 668
 };
 static int parser_action_row1878[] = {
        1,
-       -1, 1, 662
+       -1, 1, 687
 };
 static int parser_action_row1879[] = {
        1,
-       -1, 1, 681
+       -1, 1, 667
 };
 static int parser_action_row1880[] = {
        1,
-       -1, 1, 666
+       -1, 1, 686
 };
 static int parser_action_row1881[] = {
-       1,
-       -1, 1, 685
-};
-static int parser_action_row1882[] = {
-       1,
-       -1, 1, 665
-};
-static int parser_action_row1883[] = {
-       1,
-       -1, 1, 684
-};
-static int parser_action_row1884[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -20398,9 +20441,9 @@ static int parser_action_row1884[] = {
        103, 0, 59,
        106, 0, 60
 };
-static int parser_action_row1885[] = {
+static int parser_action_row1882[] = {
        24,
-       -1, 1, 456,
+       -1, 1, 458,
        12, 0, 170,
        22, 0, 171,
        31, 0, 172,
@@ -20425,39 +20468,105 @@ static int parser_action_row1885[] = {
        103, 0, 59,
        106, 0, 60
 };
+static int parser_action_row1883[] = {
+       2,
+       -1, 1, 271,
+       24, 1, 939
+};
+static int parser_action_row1884[] = {
+       23,
+       -1, 1, 458,
+       12, 0, 1102,
+       22, 0, 1103,
+       31, 0, 1104,
+       38, 0, 1105,
+       40, 0, 1106,
+       42, 0, 1107,
+       43, 0, 1108,
+       44, 0, 1109,
+       45, 0, 1110,
+       48, 0, 1111,
+       52, 0, 51,
+       74, 0, 1112,
+       75, 0, 1113,
+       83, 0, 1114,
+       96, 0, 53,
+       97, 0, 1115,
+       99, 0, 1116,
+       100, 0, 1117,
+       101, 0, 1118,
+       102, 0, 1119,
+       103, 0, 59,
+       106, 0, 1120
+};
+static int parser_action_row1885[] = {
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
+};
 static int parser_action_row1886[] = {
        1,
-       -1, 1, 525
+       -1, 1, 605
 };
 static int parser_action_row1887[] = {
-       2,
+       4,
        -1, 3, 1886,
-       53, 0, 1891
+       0, 0, 88,
+       1, 0, 89,
+       95, 0, 90
 };
 static int parser_action_row1888[] = {
        1,
-       -1, 1, 416
+       -1, 1, 417
 };
 static int parser_action_row1889[] = {
-       2,
-       -1, 3, 1888,
-       53, 0, 1892
+       3,
+       -1, 1, 487,
+       0, 0, 1,
+       1, 0, 2
 };
 static int parser_action_row1890[] = {
        1,
-       -1, 1, 664
+       -1, 1, 134
 };
 static int parser_action_row1891[] = {
        1,
-       -1, 1, 683
+       -1, 1, 132
 };
 static int parser_action_row1892[] = {
        1,
-       -1, 1, 604
+       -1, 1, 666
 };
 static int parser_action_row1893[] = {
        1,
-       -1, 1, 134
+       -1, 1, 685
+};
+static int parser_action_row1894[] = {
+       1,
+       -1, 1, 527
+};
+static int parser_action_row1895[] = {
+       2,
+       -1, 3, 1894,
+       53, 0, 1897
+};
+static int parser_action_row1896[] = {
+       1,
+       -1, 1, 418
+};
+static int parser_action_row1897[] = {
+       2,
+       -1, 3, 1896,
+       53, 0, 1898
+};
+static int parser_action_row1898[] = {
+       1,
+       -1, 1, 606
+};
+static int parser_action_row1899[] = {
+       1,
+       -1, 1, 136
 };
 
 const int* const parser_action_table[] = {
@@ -22353,7 +22462,13 @@ const int* const parser_action_table[] = {
        parser_action_row1890,
        parser_action_row1891,
        parser_action_row1892,
-       parser_action_row1893
+       parser_action_row1893,
+       parser_action_row1894,
+       parser_action_row1895,
+       parser_action_row1896,
+       parser_action_row1897,
+       parser_action_row1898,
+       parser_action_row1899
 };
 
 static int parser_goto_row1[] = {
@@ -22417,9 +22532,9 @@ static int parser_goto_row8[] = {
        98, 267,
        204, 391,
        594, 786,
-       1159, 1320,
-       1292, 1418,
-       1324, 1320
+       993, 1165,
+       1169, 1165,
+       1303, 1450
 };
 static int parser_goto_row9[] = {
        1,
@@ -22427,55 +22542,57 @@ static int parser_goto_row9[] = {
 };
 static int parser_goto_row10[] = {
        1,
-       -1, 986
+       -1, 1325
 };
 static int parser_goto_row11[] = {
        2,
-       -1, 1436,
-       1438, 1556
+       -1, 1470,
+       1471, 1581
 };
 static int parser_goto_row12[] = {
        2,
-       -1, 1314,
-       1554, 1619
+       -1, 1326,
+       1580, 1651
 };
 static int parser_goto_row13[] = {
        2,
-       -1, 1152,
-       1160, 1322
+       -1, 986,
+       994, 1167
 };
 static int parser_goto_row14[] = {
-       2,
-       -1, 1153,
-       1156, 1317
+       4,
+       -1, 987,
+       990, 1162,
+       1468, 1578,
+       1579, 1650
 };
 static int parser_goto_row15[] = {
        2,
-       -1, 1154,
-       1160, 1323
+       -1, 988,
+       994, 1168
 };
 static int parser_goto_row16[] = {
        1,
-       -1, 1155
+       -1, 989
 };
 static int parser_goto_row17[] = {
        6,
        -1, 970,
        825, 973,
-       1679, 1737,
-       1684, 1747,
-       1690, 1757,
-       1842, 1874
+       1653, 1725,
+       1658, 1735,
+       1664, 1745,
+       1838, 1871
 };
 static int parser_goto_row18[] = {
        7,
        -1, 980,
-       1623, 1682,
-       1626, 1686,
-       1678, 1734,
-       1683, 1743,
-       1684, 1748,
-       1689, 1754
+       1584, 1656,
+       1587, 1660,
+       1652, 1722,
+       1657, 1731,
+       1658, 1736,
+       1663, 1742
 };
 static int parser_goto_row19[] = {
        8,
@@ -22485,8 +22602,8 @@ static int parser_goto_row19[] = {
        391, 599,
        786, 936,
        789, 940,
-       1320, 1440,
-       1418, 1545
+       1165, 1328,
+       1450, 1568
 };
 static int parser_goto_row20[] = {
        4,
@@ -22498,54 +22615,54 @@ static int parser_goto_row20[] = {
 static int parser_goto_row21[] = {
        6,
        -1, 830,
-       1560, 1623,
-       1562, 1626,
-       1621, 1678,
-       1624, 1683,
-       1627, 1689
+       1474, 1584,
+       1476, 1587,
+       1582, 1652,
+       1585, 1657,
+       1588, 1663
 };
 static int parser_goto_row22[] = {
        1,
-       -1, 1141
+       -1, 1149
 };
 static int parser_goto_row23[] = {
        2,
-       -1, 1299,
-       1301, 1425
+       -1, 1310,
+       1312, 1458
 };
 static int parser_goto_row24[] = {
        2,
-       -1, 1142,
-       1424, 1548
+       -1, 1150,
+       1457, 1571
 };
 static int parser_goto_row25[] = {
        8,
        -1, 981,
-       980, 1149,
-       1626, 1687,
-       1678, 1735,
-       1686, 1751,
-       1689, 1755,
-       1734, 1790,
-       1754, 1807
+       980, 1157,
+       1587, 1661,
+       1652, 1723,
+       1660, 1739,
+       1663, 1743,
+       1722, 1783,
+       1742, 1800
 };
 static int parser_goto_row26[] = {
        2,
-       -1, 1428,
-       1429, 1550
+       -1, 1461,
+       1462, 1573
 };
 static int parser_goto_row27[] = {
        2,
-       -1, 1303,
-       1549, 1617
+       -1, 1314,
+       1572, 1646
 };
 static int parser_goto_row28[] = {
        1,
-       -1, 1304
+       -1, 1315
 };
 static int parser_goto_row29[] = {
        1,
-       -1, 1305
+       -1, 1316
 };
 static int parser_goto_row30[] = {
        1,
@@ -22556,17 +22673,18 @@ static int parser_goto_row31[] = {
        -1, 86
 };
 static int parser_goto_row32[] = {
-       10,
+       11,
        -1, 87,
-       981, 1150,
-       986, 1156,
-       1149, 1312,
-       1687, 1752,
-       1735, 1791,
-       1751, 1804,
-       1755, 1808,
-       1790, 1836,
-       1807, 1847
+       839, 990,
+       981, 1158,
+       1157, 1323,
+       1468, 1579,
+       1661, 1740,
+       1723, 1784,
+       1739, 1797,
+       1743, 1801,
+       1783, 1832,
+       1800, 1843
 };
 static int parser_goto_row33[] = {
        1,
@@ -22592,40 +22710,40 @@ static int parser_goto_row35[] = {
        801, 933,
        932, 933,
        951, 933,
-       976, 1143,
-       1044, 1200,
-       1144, 1306,
-       1163, 1328,
-       1188, 1344,
-       1216, 1363,
-       1321, 1451,
-       1549, 1306,
-       1567, 1629,
-       1616, 1451,
-       1618, 1677,
-       1628, 1690,
-       1726, 1782,
-       1732, 1787
+       976, 1151,
+       1052, 1210,
+       1152, 1317,
+       1166, 1339,
+       1173, 1360,
+       1198, 1376,
+       1228, 1396,
+       1481, 1590,
+       1572, 1317,
+       1589, 1664,
+       1645, 1339,
+       1647, 1719,
+       1774, 1824,
+       1780, 1829
 };
 static int parser_goto_row36[] = {
        4,
        -1, 934,
        801, 952,
-       932, 1065,
-       951, 1084
+       932, 1074,
+       951, 1093
 };
 static int parser_goto_row37[] = {
        2,
-       -1, 1067,
-       1068, 1217
+       -1, 1076,
+       1077, 1229
 };
 static int parser_goto_row38[] = {
        5,
        -1, 831,
-       1140, 1294,
-       1295, 1421,
-       1297, 1422,
-       1622, 1679
+       1148, 1305,
+       1306, 1454,
+       1308, 1455,
+       1583, 1653
 };
 static int parser_goto_row39[] = {
        8,
@@ -22634,42 +22752,44 @@ static int parser_goto_row39[] = {
        393, 600,
        449, 631,
        601, 797,
-       1313, 1433,
-       1434, 1553,
-       1625, 1684
+       1324, 1466,
+       1467, 1577,
+       1586, 1658
 };
 static int parser_goto_row40[] = {
-       30,
+       32,
        -1, 158,
        37, 167,
        386, 590,
        588, 779,
        743, 919,
        798, 949,
-       890, 1033,
+       890, 1041,
        892, 167,
-       979, 1147,
-       1053, 1207,
-       1148, 1311,
-       1198, 590,
-       1348, 779,
-       1360, 1493,
-       1479, 919,
-       1484, 949,
-       1650, 1207,
-       1681, 1740,
-       1685, 1749,
-       1733, 1788,
-       1741, 1794,
-       1742, 1795,
-       1745, 1799,
-       1750, 1803,
-       1753, 1805,
-       1775, 1493,
+       979, 1155,
+       1058, 1215,
+       1062, 1219,
+       1156, 1322,
+       1208, 590,
+       1216, 1390,
+       1380, 779,
+       1393, 1516,
+       1502, 919,
+       1507, 949,
+       1655, 1728,
+       1659, 1737,
+       1692, 1219,
+       1721, 1781,
+       1729, 1787,
+       1730, 1788,
+       1733, 1792,
+       1738, 1796,
+       1741, 1798,
+       1782, 1831,
        1789, 1835,
-       1796, 1839,
-       1801, 1843,
-       1806, 1846
+       1794, 1839,
+       1799, 1842,
+       1817, 1516
 };
 static int parser_goto_row41[] = {
        1,
@@ -22678,21 +22798,21 @@ static int parser_goto_row41[] = {
 static int parser_goto_row42[] = {
        2,
        -1, 63,
-       909, 1050
+       909, 1059
 };
 static int parser_goto_row43[] = {
        4,
        -1, 330,
        591, 781,
-       1028, 1191,
-       1350, 1483
+       1036, 1201,
+       1382, 1506
 };
 static int parser_goto_row44[] = {
        4,
        -1, 241,
        243, 471,
        546, 471,
-       1206, 471
+       1218, 471
 };
 static int parser_goto_row45[] = {
        15,
@@ -22707,10 +22827,10 @@ static int parser_goto_row45[] = {
        591, 331,
        738, 470,
        742, 902,
-       909, 1051,
-       1028, 331,
-       1350, 331,
-       1478, 902
+       909, 1060,
+       1036, 331,
+       1382, 331,
+       1501, 902
 };
 static int parser_goto_row46[] = {
        18,
@@ -22720,18 +22840,18 @@ static int parser_goto_row46[] = {
        168, 339,
        400, 608,
        401, 609,
-       895, 1039,
-       896, 1040,
-       920, 1057,
-       950, 1083,
-       1031, 1192,
-       1036, 1195,
-       1442, 1565,
-       1443, 1566,
-       1494, 1596,
-       1586, 1651,
-       1589, 1653,
-       1825, 1863
+       895, 1047,
+       896, 1048,
+       920, 1066,
+       950, 1092,
+       1039, 1202,
+       1044, 1205,
+       1330, 1479,
+       1331, 1480,
+       1517, 1625,
+       1615, 1693,
+       1618, 1695,
+       1860, 1882
 };
 static int parser_goto_row47[] = {
        20,
@@ -22741,20 +22861,20 @@ static int parser_goto_row47[] = {
        807, 427,
        888, 903,
        892, 903,
-       1080, 427,
-       1198, 903,
-       1321, 1452,
-       1348, 903,
-       1367, 427,
-       1478, 903,
-       1479, 903,
-       1484, 903,
-       1499, 427,
-       1568, 427,
-       1616, 1452,
-       1650, 903,
-       1728, 427,
-       1775, 903
+       1089, 427,
+       1166, 1340,
+       1208, 903,
+       1380, 903,
+       1400, 427,
+       1482, 427,
+       1501, 903,
+       1502, 903,
+       1507, 903,
+       1522, 427,
+       1645, 1340,
+       1692, 903,
+       1776, 427,
+       1817, 903
 };
 static int parser_goto_row48[] = {
        18,
@@ -22764,18 +22884,18 @@ static int parser_goto_row48[] = {
        807, 428,
        888, 904,
        892, 904,
-       1080, 428,
-       1198, 904,
-       1348, 904,
-       1367, 428,
-       1478, 904,
-       1479, 904,
-       1484, 904,
-       1499, 428,
-       1568, 428,
-       1650, 904,
-       1728, 428,
-       1775, 904
+       1089, 428,
+       1208, 904,
+       1380, 904,
+       1400, 428,
+       1482, 428,
+       1501, 904,
+       1502, 904,
+       1507, 904,
+       1522, 428,
+       1692, 904,
+       1776, 428,
+       1817, 904
 };
 static int parser_goto_row49[] = {
        52,
@@ -22793,57 +22913,57 @@ static int parser_goto_row49[] = {
        670, 847,
        693, 866,
        812, 692,
-       848, 995,
-       850, 997,
-       852, 1000,
-       854, 1005,
+       848, 1003,
+       850, 1005,
+       852, 1008,
+       854, 1013,
        954, 847,
-       1001, 1171,
-       1006, 1175,
-       1009, 1178,
-       1049, 489,
-       1055, 494,
-       1088, 1000,
-       1089, 1005,
-       1179, 1336,
-       1211, 692,
-       1236, 1178,
-       1355, 847,
-       1450, 1570,
-       1489, 1000,
-       1491, 1005,
-       1571, 1634,
-       1572, 1636,
-       1573, 1638,
-       1575, 1642,
-       1577, 1644,
-       1595, 1178,
-       1639, 1700,
-       1645, 1711,
-       1646, 1713,
-       1701, 1763,
-       1714, 1774,
-       1764, 1812,
-       1765, 1814,
-       1766, 1816,
-       1767, 1819,
-       1817, 1855,
-       1820, 1859,
-       1821, 1861,
-       1862, 1884
+       1009, 1181,
+       1014, 1185,
+       1017, 1188,
+       1057, 489,
+       1064, 494,
+       1097, 1008,
+       1098, 1013,
+       1189, 1368,
+       1223, 692,
+       1248, 1188,
+       1338, 1484,
+       1387, 847,
+       1485, 1595,
+       1486, 1597,
+       1487, 1599,
+       1489, 1603,
+       1491, 1605,
+       1512, 1008,
+       1514, 1013,
+       1600, 1674,
+       1606, 1685,
+       1607, 1687,
+       1624, 1188,
+       1675, 1751,
+       1688, 1762,
+       1752, 1805,
+       1753, 1807,
+       1754, 1809,
+       1755, 1812,
+       1810, 1851,
+       1813, 1855,
+       1814, 1857,
+       1858, 1881
 };
 static int parser_goto_row50[] = {
        10,
        -1, 67,
        212, 429,
        807, 429,
-       1080, 429,
-       1321, 1453,
-       1367, 429,
-       1499, 429,
-       1568, 429,
-       1616, 1453,
-       1728, 429
+       1089, 429,
+       1166, 1341,
+       1400, 429,
+       1482, 429,
+       1522, 429,
+       1645, 1341,
+       1776, 429
 };
 static int parser_goto_row51[] = {
        1,
@@ -22852,83 +22972,83 @@ static int parser_goto_row51[] = {
 static int parser_goto_row52[] = {
        3,
        -1, 905,
-       909, 1052,
-       1050, 1205
+       909, 1061,
+       1059, 1217
 };
 static int parser_goto_row53[] = {
        10,
        -1, 69,
        212, 430,
        807, 430,
-       1080, 430,
-       1321, 1454,
-       1367, 430,
-       1499, 430,
-       1568, 430,
-       1616, 1454,
-       1728, 430
+       1089, 430,
+       1166, 1342,
+       1400, 430,
+       1482, 430,
+       1522, 430,
+       1645, 1342,
+       1776, 430
 };
 static int parser_goto_row54[] = {
        10,
        -1, 70,
        212, 431,
        807, 431,
-       1080, 431,
-       1321, 1455,
-       1367, 431,
-       1499, 431,
-       1568, 431,
-       1616, 1455,
-       1728, 431
+       1089, 431,
+       1166, 1343,
+       1400, 431,
+       1482, 431,
+       1522, 431,
+       1645, 1343,
+       1776, 431
 };
 static int parser_goto_row55[] = {
        10,
        -1, 71,
        212, 432,
        807, 432,
-       1080, 432,
-       1321, 1456,
-       1367, 432,
-       1499, 432,
-       1568, 432,
-       1616, 1456,
-       1728, 432
+       1089, 432,
+       1166, 1344,
+       1400, 432,
+       1482, 432,
+       1522, 432,
+       1645, 1344,
+       1776, 432
 };
 static int parser_goto_row56[] = {
        10,
        -1, 72,
        212, 433,
        807, 433,
-       1080, 433,
-       1321, 1457,
-       1367, 433,
-       1499, 433,
-       1568, 433,
-       1616, 1457,
-       1728, 433
+       1089, 433,
+       1166, 1345,
+       1400, 433,
+       1482, 433,
+       1522, 433,
+       1645, 1345,
+       1776, 433
 };
 static int parser_goto_row57[] = {
        2,
        -1, 394,
-       1043, 1199
+       1051, 1209
 };
 static int parser_goto_row58[] = {
        10,
        -1, 73,
        212, 434,
        807, 434,
-       1080, 434,
-       1321, 1458,
-       1367, 434,
-       1499, 434,
-       1568, 434,
-       1616, 1458,
-       1728, 434
+       1089, 434,
+       1166, 1346,
+       1400, 434,
+       1482, 434,
+       1522, 434,
+       1645, 1346,
+       1776, 434
 };
 static int parser_goto_row59[] = {
        2,
        -1, 201,
-       898, 1041
+       898, 1049
 };
 static int parser_goto_row60[] = {
        131,
@@ -22975,94 +23095,94 @@ static int parser_goto_row60[] = {
        810, 682,
        811, 686,
        818, 966,
-       846, 992,
-       847, 993,
-       865, 1011,
-       866, 1012,
-       885, 1025,
-       894, 1038,
-       898, 1042,
-       922, 1059,
-       947, 1081,
-       953, 1086,
+       846, 1000,
+       847, 1001,
+       865, 1019,
+       866, 1020,
+       885, 1033,
+       894, 1046,
+       898, 1050,
+       922, 1068,
+       947, 1090,
+       953, 1095,
        961, 863,
-       994, 1164,
-       995, 1165,
-       996, 1166,
-       997, 1167,
-       999, 1168,
-       1000, 1169,
-       1004, 1172,
-       1005, 1173,
-       1013, 1181,
-       1018, 514,
-       1032, 1193,
-       1034, 1194,
-       1041, 1197,
-       1043, 395,
-       1060, 1213,
-       1082, 1231,
-       1087, 992,
-       1170, 1329,
-       1171, 1330,
-       1174, 1331,
-       1175, 1332,
-       1177, 1333,
-       1178, 1334,
-       1234, 1168,
-       1235, 1172,
-       1237, 1375,
-       1238, 1377,
-       1240, 1378,
-       1335, 1472,
-       1336, 1473,
-       1353, 1485,
-       1374, 1333,
-       1441, 1564,
-       1569, 1631,
-       1570, 1632,
-       1587, 1652,
-       1597, 1656,
-       1601, 966,
-       1633, 1693,
-       1634, 1694,
-       1635, 1695,
-       1636, 1696,
-       1637, 1697,
-       1638, 1698,
-       1641, 1706,
-       1642, 1707,
-       1643, 1708,
-       1644, 1709,
-       1659, 1720,
-       1691, 1758,
-       1699, 1760,
-       1700, 1761,
-       1710, 1769,
-       1711, 1770,
-       1712, 1771,
-       1713, 1772,
-       1762, 1809,
-       1763, 1810,
-       1773, 1822,
-       1774, 1823,
-       1800, 1842,
-       1811, 1848,
-       1812, 1849,
-       1813, 1850,
-       1814, 1851,
-       1815, 1852,
-       1816, 1853,
-       1818, 1856,
-       1819, 1857,
-       1854, 1877,
-       1855, 1878,
-       1858, 1879,
-       1859, 1880,
-       1860, 1881,
-       1861, 1882,
-       1883, 1889,
-       1884, 1890
+       1002, 1174,
+       1003, 1175,
+       1004, 1176,
+       1005, 1177,
+       1007, 1178,
+       1008, 1179,
+       1012, 1182,
+       1013, 1183,
+       1021, 1191,
+       1026, 514,
+       1040, 1203,
+       1042, 1204,
+       1049, 1207,
+       1051, 395,
+       1069, 1225,
+       1091, 1243,
+       1096, 1000,
+       1180, 1361,
+       1181, 1362,
+       1184, 1363,
+       1185, 1364,
+       1187, 1365,
+       1188, 1366,
+       1246, 1178,
+       1247, 1182,
+       1249, 1408,
+       1250, 1410,
+       1252, 1411,
+       1329, 1478,
+       1367, 1495,
+       1368, 1496,
+       1385, 1508,
+       1407, 1365,
+       1483, 1592,
+       1484, 1593,
+       1594, 1667,
+       1595, 1668,
+       1596, 1669,
+       1597, 1670,
+       1598, 1671,
+       1599, 1672,
+       1602, 1680,
+       1603, 1681,
+       1604, 1682,
+       1605, 1683,
+       1616, 1694,
+       1626, 1698,
+       1630, 966,
+       1665, 1746,
+       1673, 1748,
+       1674, 1749,
+       1684, 1757,
+       1685, 1758,
+       1686, 1759,
+       1687, 1760,
+       1701, 1768,
+       1750, 1802,
+       1751, 1803,
+       1761, 1815,
+       1762, 1816,
+       1793, 1838,
+       1804, 1844,
+       1805, 1845,
+       1806, 1846,
+       1807, 1847,
+       1808, 1848,
+       1809, 1849,
+       1811, 1852,
+       1812, 1853,
+       1850, 1874,
+       1851, 1875,
+       1854, 1876,
+       1855, 1877,
+       1856, 1878,
+       1857, 1879,
+       1880, 1891,
+       1881, 1892
 };
 static int parser_goto_row61[] = {
        1,
@@ -23141,16 +23261,16 @@ static int parser_goto_row71[] = {
        405, 350,
        406, 351,
        414, 352,
-       1447, 291,
-       1448, 292,
-       1449, 293
+       1335, 291,
+       1336, 292,
+       1337, 293
 };
 static int parser_goto_row72[] = {
        1,
        -1, 192
 };
 static int parser_goto_row73[] = {
-       54,
+       56,
        -1, 193,
        13, 74,
        27, 74,
@@ -23176,40 +23296,42 @@ static int parser_goto_row73[] = {
        892, 906,
        909, 74,
        979, 74,
-       1028, 74,
-       1053, 74,
-       1080, 436,
-       1148, 74,
-       1198, 906,
-       1348, 906,
-       1350, 74,
-       1360, 74,
-       1367, 436,
-       1478, 906,
-       1479, 906,
-       1484, 906,
-       1499, 436,
-       1568, 436,
-       1650, 906,
-       1681, 74,
-       1685, 74,
-       1728, 436,
+       1036, 74,
+       1058, 74,
+       1062, 74,
+       1089, 436,
+       1156, 74,
+       1208, 906,
+       1216, 74,
+       1380, 906,
+       1382, 74,
+       1393, 74,
+       1400, 436,
+       1482, 436,
+       1501, 906,
+       1502, 906,
+       1507, 906,
+       1522, 436,
+       1655, 74,
+       1659, 74,
+       1692, 906,
+       1721, 74,
+       1729, 74,
+       1730, 74,
        1733, 74,
+       1738, 74,
        1741, 74,
-       1742, 74,
-       1745, 74,
-       1750, 74,
-       1753, 74,
-       1775, 906,
+       1776, 436,
+       1782, 74,
        1789, 74,
-       1796, 74,
-       1801, 74,
-       1806, 74
+       1794, 74,
+       1799, 74,
+       1817, 906
 };
 static int parser_goto_row74[] = {
        2,
        -1, 515,
-       1018, 1186
+       1026, 1196
 };
 static int parser_goto_row75[] = {
        1,
@@ -23218,36 +23340,36 @@ static int parser_goto_row75[] = {
 static int parser_goto_row76[] = {
        31,
        -1, 76,
-       964, 1112,
-       1102, 1112,
-       1103, 1112,
-       1104, 1112,
-       1105, 1112,
-       1241, 1112,
-       1243, 1112,
-       1391, 1112,
-       1393, 1112,
-       1394, 1112,
-       1396, 1112,
-       1397, 1112,
-       1398, 1112,
-       1399, 1112,
-       1400, 1112,
-       1401, 1112,
-       1402, 1112,
-       1403, 1112,
-       1404, 1112,
-       1405, 1112,
-       1406, 1112,
-       1407, 1112,
-       1408, 1112,
-       1409, 1112,
-       1410, 1112,
-       1411, 1112,
-       1412, 1112,
-       1413, 1112,
-       1514, 1112,
-       1864, 1112
+       964, 1121,
+       1111, 1121,
+       1112, 1121,
+       1113, 1121,
+       1114, 1121,
+       1253, 1121,
+       1255, 1121,
+       1424, 1121,
+       1426, 1121,
+       1427, 1121,
+       1429, 1121,
+       1430, 1121,
+       1431, 1121,
+       1432, 1121,
+       1433, 1121,
+       1434, 1121,
+       1435, 1121,
+       1436, 1121,
+       1437, 1121,
+       1438, 1121,
+       1439, 1121,
+       1440, 1121,
+       1441, 1121,
+       1442, 1121,
+       1443, 1121,
+       1444, 1121,
+       1445, 1121,
+       1446, 1121,
+       1537, 1121,
+       1883, 1121
 };
 static int parser_goto_row77[] = {
        1,
@@ -23271,8 +23393,8 @@ static int parser_goto_row81[] = {
        4,
        -1, 450,
        818, 967,
-       1237, 1376,
-       1601, 1658
+       1249, 1409,
+       1630, 1700
 };
 static int parser_goto_row82[] = {
        93,
@@ -23318,57 +23440,57 @@ static int parser_goto_row82[] = {
        854, 136,
        887, 136,
        901, 136,
-       964, 1113,
-       1008, 136,
-       1009, 136,
-       1047, 136,
-       1048, 136,
-       1049, 136,
-       1054, 136,
+       964, 1122,
+       1016, 136,
+       1017, 136,
        1055, 136,
-       1076, 136,
-       1102, 1113,
-       1103, 1113,
-       1104, 1113,
-       1105, 1113,
-       1210, 136,
-       1211, 136,
-       1241, 1113,
-       1243, 1113,
-       1321, 136,
-       1354, 136,
-       1355, 136,
-       1391, 1113,
-       1393, 1113,
-       1394, 1113,
-       1396, 1113,
-       1397, 1113,
-       1398, 1113,
-       1399, 1113,
-       1400, 1113,
-       1401, 1113,
-       1402, 1113,
-       1403, 1113,
-       1404, 1113,
-       1405, 1113,
-       1406, 1113,
-       1407, 1113,
-       1408, 1113,
-       1409, 1113,
-       1410, 1113,
-       1411, 1113,
-       1412, 1113,
-       1413, 1113,
-       1488, 136,
-       1489, 136,
-       1490, 136,
-       1491, 136,
-       1514, 1113,
-       1581, 136,
-       1594, 136,
-       1595, 136,
-       1616, 136,
-       1864, 1113
+       1056, 136,
+       1057, 136,
+       1063, 136,
+       1064, 136,
+       1085, 136,
+       1111, 1122,
+       1112, 1122,
+       1113, 1122,
+       1114, 1122,
+       1166, 136,
+       1222, 136,
+       1223, 136,
+       1253, 1122,
+       1255, 1122,
+       1386, 136,
+       1387, 136,
+       1424, 1122,
+       1426, 1122,
+       1427, 1122,
+       1429, 1122,
+       1430, 1122,
+       1431, 1122,
+       1432, 1122,
+       1433, 1122,
+       1434, 1122,
+       1435, 1122,
+       1436, 1122,
+       1437, 1122,
+       1438, 1122,
+       1439, 1122,
+       1440, 1122,
+       1441, 1122,
+       1442, 1122,
+       1443, 1122,
+       1444, 1122,
+       1445, 1122,
+       1446, 1122,
+       1511, 136,
+       1512, 136,
+       1513, 136,
+       1514, 136,
+       1537, 1122,
+       1610, 136,
+       1623, 136,
+       1624, 136,
+       1645, 136,
+       1883, 1122
 };
 static int parser_goto_row83[] = {
        1,
@@ -23399,17 +23521,17 @@ static int parser_goto_row88[] = {
        212, 438,
        393, 601,
        807, 438,
-       1080, 438,
-       1140, 1295,
-       1313, 1434,
-       1321, 1459,
-       1367, 438,
-       1499, 438,
-       1568, 438,
-       1616, 1671,
-       1692, 1759,
-       1728, 438,
-       1830, 1867
+       1089, 438,
+       1148, 1306,
+       1166, 1347,
+       1324, 1467,
+       1400, 438,
+       1482, 438,
+       1522, 438,
+       1645, 1713,
+       1666, 1747,
+       1776, 438,
+       1865, 1886
 };
 static int parser_goto_row89[] = {
        45,
@@ -23439,101 +23561,93 @@ static int parser_goto_row89[] = {
        806, 958,
        808, 960,
        817, 965,
-       1076, 1225,
-       1098, 1244,
-       1099, 1245,
-       1100, 1246,
-       1101, 1247,
-       1107, 1255,
-       1108, 1256,
-       1109, 1257,
-       1110, 1258,
-       1111, 1259,
-       1140, 1296,
-       1233, 1373,
-       1372, 1501,
-       1389, 1511,
-       1390, 1512,
-       1498, 1599,
-       1518, 1608,
-       1607, 1664,
-       1657, 1719
+       1085, 1237,
+       1107, 1256,
+       1108, 1257,
+       1109, 1258,
+       1110, 1259,
+       1116, 1267,
+       1117, 1268,
+       1118, 1269,
+       1119, 1270,
+       1120, 1271,
+       1148, 1307,
+       1245, 1406,
+       1405, 1524,
+       1422, 1534,
+       1423, 1535,
+       1521, 1628,
+       1541, 1637,
+       1636, 1706,
+       1699, 1767
 };
 static int parser_goto_row90[] = {
        1,
        -1, 392
 };
 static int parser_goto_row91[] = {
-       4,
-       -1, 1135,
-       978, 1145,
-       1680, 1738,
-       1744, 1797
+       6,
+       -1, 790,
+       935, 1079,
+       969, 1144,
+       978, 1153,
+       1654, 1726,
+       1732, 1790
 };
 static int parser_goto_row92[] = {
-       3,
-       -1, 1136,
-       598, 790,
-       935, 1070
-};
-static int parser_goto_row93[] = {
        2,
        -1, 791,
-       1078, 1228
+       1087, 1240
 };
-static int parser_goto_row94[] = {
+static int parser_goto_row93[] = {
        1,
-       -1, 1226
+       -1, 1238
 };
-static int parser_goto_row95[] = {
+static int parser_goto_row94[] = {
        2,
        -1, 943,
-       944, 1079
+       944, 1088
 };
-static int parser_goto_row96[] = {
-       4,
-       -1, 1290,
-       1146, 1308,
-       1739, 1792,
-       1798, 1840
-};
-static int parser_goto_row97[] = {
-       2,
-       -1, 1291,
-       1293, 1419
+static int parser_goto_row95[] = {
+       5,
+       -1, 1302,
+       1304, 1452,
+       1319, 1452,
+       1785, 1452,
+       1836, 1452
 };
-static int parser_goto_row98[] = {
+static int parser_goto_row96[] = {
        1,
-       -1, 1157
+       -1, 991
 };
-static int parser_goto_row99[] = {
+static int parser_goto_row97[] = {
        4,
-       -1, 1229,
-       1367, 1497,
-       1568, 1630,
-       1728, 1783
+       -1, 1241,
+       1400, 1520,
+       1482, 1591,
+       1776, 1825
 };
-static int parser_goto_row100[] = {
+static int parser_goto_row98[] = {
        3,
-       -1, 1370,
-       1371, 1500,
-       1576, 1500
+       -1, 1403,
+       1404, 1523,
+       1490, 1523
 };
-static int parser_goto_row101[] = {
+static int parser_goto_row99[] = {
        4,
-       -1, 1230,
+       -1, 1242,
        212, 439,
        807, 959,
-       1499, 1600
+       1522, 1629
 };
-static int parser_goto_row102[] = {
+static int parser_goto_row100[] = {
        4,
        -1, 795,
-       936, 1071,
-       940, 1076,
-       1545, 1616
+       936, 1080,
+       940, 1085,
+       1568, 1645
 };
-static int parser_goto_row103[] = {
+static int parser_goto_row101[] = {
        86,
        -1, 353,
        31, 137,
@@ -23565,64 +23679,64 @@ static int parser_goto_row103[] = {
        773, 843,
        774, 927,
        812, 693,
-       852, 1001,
-       854, 1006,
-       880, 1022,
-       881, 1023,
+       852, 1009,
+       854, 1014,
+       880, 1030,
+       881, 1031,
        887, 137,
        901, 229,
-       929, 1062,
-       930, 1063,
-       937, 1072,
+       929, 1071,
+       930, 1072,
+       937, 1081,
        954, 848,
-       1009, 1179,
-       1014, 1182,
-       1024, 1189,
-       1047, 482,
-       1049, 490,
-       1055, 495,
-       1064, 1214,
-       1073, 1221,
-       1074, 1222,
-       1088, 1001,
-       1089, 1006,
-       1093, 1239,
-       1106, 1254,
-       1183, 1338,
-       1184, 1339,
-       1211, 693,
-       1223, 1366,
-       1236, 1179,
-       1260, 1387,
-       1262, 1388,
-       1287, 1415,
-       1340, 1475,
-       1354, 843,
-       1355, 848,
-       1382, 1508,
-       1416, 1544,
-       1450, 1571,
-       1489, 1001,
-       1491, 1006,
-       1538, 1609,
-       1540, 1611,
-       1573, 1639,
-       1577, 1645,
-       1595, 1179,
-       1613, 1667,
-       1614, 1668,
-       1646, 1714,
-       1660, 1721,
-       1669, 1727,
-       1701, 1764,
-       1722, 1777,
-       1723, 1778,
-       1766, 1817,
-       1767, 1820,
-       1779, 1827,
+       1017, 1189,
+       1022, 1192,
+       1032, 1199,
+       1055, 482,
+       1057, 490,
+       1064, 495,
+       1073, 1226,
+       1082, 1233,
+       1083, 1234,
+       1097, 1009,
+       1098, 1014,
+       1102, 1251,
+       1115, 1266,
+       1193, 1370,
+       1194, 1371,
+       1223, 693,
+       1235, 1399,
+       1248, 1189,
+       1272, 1420,
+       1274, 1421,
+       1299, 1448,
+       1338, 1485,
+       1372, 1498,
+       1386, 843,
+       1387, 848,
+       1415, 1531,
+       1449, 1567,
+       1487, 1600,
+       1491, 1606,
+       1512, 1009,
+       1514, 1014,
+       1561, 1638,
+       1563, 1640,
+       1607, 1688,
+       1624, 1189,
+       1642, 1709,
+       1643, 1710,
+       1675, 1752,
+       1702, 1769,
+       1711, 1775,
+       1754, 1810,
+       1755, 1813,
+       1770, 1819,
+       1771, 1820,
+       1814, 1858,
        1821, 1862
 };
-static int parser_goto_row104[] = {
+static int parser_goto_row102[] = {
        34,
        -1, 138,
        54, 230,
@@ -23635,69 +23749,69 @@ static int parser_goto_row104[] = {
        498, 694,
        668, 844,
        670, 849,
-       851, 998,
-       852, 1002,
-       853, 1003,
-       854, 1007,
-       887, 1026,
-       901, 1045,
-       1008, 1176,
-       1009, 1180,
-       1047, 1202,
-       1048, 1203,
-       1049, 1204,
-       1054, 1208,
-       1055, 1209,
-       1210, 1358,
-       1211, 1359,
-       1354, 1486,
-       1355, 1487,
-       1488, 1590,
-       1489, 1591,
-       1490, 1592,
-       1491, 1593,
-       1594, 1654,
-       1595, 1655
+       851, 1006,
+       852, 1010,
+       853, 1011,
+       854, 1015,
+       887, 1034,
+       901, 1053,
+       1016, 1186,
+       1017, 1190,
+       1055, 1212,
+       1056, 1213,
+       1057, 1214,
+       1063, 1220,
+       1064, 1221,
+       1222, 1391,
+       1223, 1392,
+       1386, 1509,
+       1387, 1510,
+       1511, 1619,
+       1512, 1620,
+       1513, 1621,
+       1514, 1622,
+       1623, 1696,
+       1624, 1697
 };
-static int parser_goto_row105[] = {
+static int parser_goto_row103[] = {
        6,
        -1, 246,
        154, 326,
        193, 377,
        289, 326,
        348, 377,
-       1465, 1575
+       1353, 1489
 };
-static int parser_goto_row106[] = {
+static int parser_goto_row104[] = {
        4,
        -1, 516,
        473, 667,
        504, 697,
        681, 858
 };
-static int parser_goto_row107[] = {
+static int parser_goto_row105[] = {
        2,
        -1, 873,
-       874, 1019
+       874, 1027
 };
-static int parser_goto_row108[] = {
+static int parser_goto_row106[] = {
        3,
        -1, 342,
        629, 815,
-       1037, 1196
+       1045, 1206
 };
-static int parser_goto_row109[] = {
+static int parser_goto_row107[] = {
        2,
        -1, 343,
        552, 744
 };
-static int parser_goto_row110[] = {
+static int parser_goto_row108[] = {
        2,
        -1, 822,
        638, 825
 };
-static int parser_goto_row111[] = {
-       155,
+static int parser_goto_row109[] = {
+       157,
        -1, 194,
        13, 80,
        27, 80,
@@ -23769,105 +23883,107 @@ static int parser_goto_row111[] = {
        892, 907,
        901, 139,
        909, 80,
-       964, 1114,
+       964, 1123,
        979, 80,
-       1008, 139,
-       1009, 139,
-       1028, 80,
-       1047, 139,
-       1048, 139,
-       1049, 139,
-       1053, 80,
-       1054, 139,
+       1016, 139,
+       1017, 139,
+       1036, 80,
        1055, 139,
-       1080, 440,
-       1102, 1249,
-       1103, 1114,
-       1104, 1114,
-       1105, 1114,
-       1148, 80,
-       1198, 907,
-       1201, 671,
-       1210, 139,
-       1211, 139,
-       1241, 1114,
-       1243, 1114,
-       1321, 1460,
-       1348, 907,
-       1350, 80,
-       1354, 139,
-       1355, 139,
-       1360, 80,
-       1367, 440,
-       1391, 1114,
-       1393, 1114,
-       1394, 1114,
-       1396, 1114,
-       1397, 1114,
-       1398, 1114,
-       1399, 1114,
-       1400, 1114,
-       1401, 1114,
-       1402, 1114,
-       1403, 1114,
-       1404, 1114,
-       1405, 1114,
-       1406, 1114,
-       1407, 1114,
-       1408, 1114,
-       1409, 1114,
-       1410, 1114,
-       1411, 1114,
-       1412, 1114,
-       1413, 1114,
-       1414, 1541,
-       1478, 907,
-       1479, 907,
-       1484, 907,
-       1488, 139,
-       1489, 139,
-       1490, 139,
-       1491, 139,
-       1499, 440,
-       1510, 1605,
-       1514, 1114,
-       1568, 440,
-       1581, 139,
-       1594, 139,
-       1595, 139,
-       1616, 1460,
-       1640, 1702,
-       1650, 907,
-       1681, 80,
-       1685, 80,
-       1728, 440,
+       1056, 139,
+       1057, 139,
+       1058, 80,
+       1062, 80,
+       1063, 139,
+       1064, 139,
+       1089, 440,
+       1111, 1261,
+       1112, 1123,
+       1113, 1123,
+       1114, 1123,
+       1156, 80,
+       1166, 1348,
+       1208, 907,
+       1211, 671,
+       1216, 80,
+       1222, 139,
+       1223, 139,
+       1253, 1123,
+       1255, 1123,
+       1380, 907,
+       1382, 80,
+       1386, 139,
+       1387, 139,
+       1393, 80,
+       1400, 440,
+       1424, 1123,
+       1426, 1123,
+       1427, 1123,
+       1429, 1123,
+       1430, 1123,
+       1431, 1123,
+       1432, 1123,
+       1433, 1123,
+       1434, 1123,
+       1435, 1123,
+       1436, 1123,
+       1437, 1123,
+       1438, 1123,
+       1439, 1123,
+       1440, 1123,
+       1441, 1123,
+       1442, 1123,
+       1443, 1123,
+       1444, 1123,
+       1445, 1123,
+       1446, 1123,
+       1447, 1564,
+       1482, 440,
+       1501, 907,
+       1502, 907,
+       1507, 907,
+       1511, 139,
+       1512, 139,
+       1513, 139,
+       1514, 139,
+       1522, 440,
+       1533, 1634,
+       1537, 1123,
+       1601, 1676,
+       1610, 139,
+       1623, 139,
+       1624, 139,
+       1645, 1348,
+       1655, 80,
+       1659, 80,
+       1692, 907,
+       1721, 80,
+       1729, 80,
+       1730, 80,
        1733, 80,
+       1738, 80,
        1741, 80,
-       1742, 80,
-       1745, 80,
-       1750, 80,
-       1753, 80,
-       1775, 907,
+       1776, 440,
+       1782, 80,
        1789, 80,
-       1796, 80,
-       1801, 80,
-       1806, 80,
-       1864, 1114
+       1794, 80,
+       1799, 80,
+       1817, 907,
+       1883, 1123
 };
-static int parser_goto_row112[] = {
+static int parser_goto_row110[] = {
        1,
        -1, 839
 };
-static int parser_goto_row113[] = {
+static int parser_goto_row111[] = {
        6,
-       -1, 1307,
+       -1, 1318,
        467, 662,
-       1430, 1552,
-       1558, 1621,
-       1560, 1624,
-       1562, 1627
+       1463, 1575,
+       1472, 1582,
+       1474, 1585,
+       1476, 1588
 };
-static int parser_goto_row114[] = {
+static int parser_goto_row112[] = {
        22,
        -1, 81,
        83, 260,
@@ -23883,17 +23999,17 @@ static int parser_goto_row114[] = {
        918, 260,
        939, 260,
        957, 260,
-       1016, 260,
-       1131, 260,
-       1134, 260,
+       1024, 260,
+       1140, 260,
+       1143, 260,
        1357, 260,
-       1469, 260,
-       1543, 260,
-       1662, 260,
-       1705, 260
+       1389, 260,
+       1566, 260,
+       1679, 260,
+       1704, 260
 };
-static int parser_goto_row115[] = {
-       184,
+static int parser_goto_row113[] = {
+       186,
        -1, 195,
        13, 82,
        27, 82,
@@ -23965,154 +24081,156 @@ static int parser_goto_row115[] = {
        798, 82,
        805, 955,
        807, 441,
-       841, 989,
+       841, 997,
        851, 140,
        852, 140,
        853, 140,
        854, 140,
-       869, 1015,
+       869, 1023,
        887, 140,
        888, 908,
        890, 82,
        892, 908,
        901, 140,
        909, 82,
-       918, 1056,
-       939, 1075,
-       957, 1090,
-       964, 1115,
+       918, 1065,
+       939, 1084,
+       957, 1099,
+       964, 1124,
        979, 82,
-       1008, 140,
-       1009, 140,
-       1016, 1185,
-       1028, 82,
-       1047, 140,
-       1048, 140,
-       1049, 140,
-       1053, 82,
-       1054, 140,
+       1016, 140,
+       1017, 140,
+       1024, 1195,
+       1036, 82,
        1055, 140,
-       1080, 441,
-       1102, 1115,
-       1103, 1115,
-       1104, 1115,
-       1105, 1115,
-       1131, 1288,
-       1144, 663,
-       1148, 82,
-       1198, 908,
-       1201, 1356,
-       1210, 140,
-       1211, 140,
-       1241, 1115,
-       1243, 1115,
-       1321, 1461,
-       1348, 908,
-       1350, 82,
-       1354, 140,
-       1355, 140,
+       1056, 140,
+       1057, 140,
+       1058, 82,
+       1062, 82,
+       1063, 140,
+       1064, 140,
+       1089, 441,
+       1111, 1124,
+       1112, 1124,
+       1113, 1124,
+       1114, 1124,
+       1140, 1300,
+       1152, 663,
+       1156, 82,
+       1166, 1349,
+       1208, 908,
+       1211, 1388,
+       1216, 82,
+       1222, 140,
+       1223, 140,
+       1253, 1124,
+       1255, 1124,
        1357, 1492,
-       1360, 82,
-       1367, 441,
-       1391, 1115,
-       1393, 1115,
-       1394, 1115,
-       1396, 1115,
-       1397, 1115,
-       1398, 1115,
-       1399, 1115,
-       1400, 1115,
-       1401, 1115,
-       1402, 1115,
-       1403, 1115,
-       1404, 1115,
-       1405, 1115,
-       1406, 1115,
-       1407, 1115,
-       1408, 1115,
-       1409, 1115,
-       1410, 1115,
-       1411, 1115,
-       1412, 1115,
-       1413, 1115,
-       1414, 1542,
-       1430, 663,
-       1469, 1578,
-       1478, 908,
-       1479, 908,
-       1484, 908,
-       1488, 140,
-       1489, 140,
-       1490, 140,
-       1491, 140,
-       1499, 441,
-       1510, 1542,
-       1514, 1115,
-       1543, 1615,
-       1549, 663,
-       1558, 663,
-       1560, 663,
-       1562, 663,
-       1568, 441,
-       1581, 140,
-       1594, 140,
-       1595, 140,
-       1604, 1661,
-       1616, 1461,
-       1640, 1703,
-       1650, 908,
-       1662, 1724,
-       1681, 82,
-       1685, 82,
-       1705, 1768,
-       1728, 441,
+       1380, 908,
+       1382, 82,
+       1386, 140,
+       1387, 140,
+       1389, 1515,
+       1393, 82,
+       1400, 441,
+       1424, 1124,
+       1426, 1124,
+       1427, 1124,
+       1429, 1124,
+       1430, 1124,
+       1431, 1124,
+       1432, 1124,
+       1433, 1124,
+       1434, 1124,
+       1435, 1124,
+       1436, 1124,
+       1437, 1124,
+       1438, 1124,
+       1439, 1124,
+       1440, 1124,
+       1441, 1124,
+       1442, 1124,
+       1443, 1124,
+       1444, 1124,
+       1445, 1124,
+       1446, 1124,
+       1447, 1565,
+       1463, 663,
+       1472, 663,
+       1474, 663,
+       1476, 663,
+       1482, 441,
+       1501, 908,
+       1502, 908,
+       1507, 908,
+       1511, 140,
+       1512, 140,
+       1513, 140,
+       1514, 140,
+       1522, 441,
+       1533, 1565,
+       1537, 1124,
+       1566, 1644,
+       1572, 663,
+       1601, 1677,
+       1610, 140,
+       1623, 140,
+       1624, 140,
+       1633, 1703,
+       1645, 1349,
+       1655, 82,
+       1659, 82,
+       1679, 1756,
+       1692, 908,
+       1704, 1772,
+       1721, 82,
+       1729, 82,
+       1730, 82,
        1733, 82,
+       1738, 82,
        1741, 82,
-       1742, 82,
-       1745, 82,
-       1750, 82,
-       1753, 82,
-       1775, 908,
+       1776, 441,
+       1782, 82,
        1789, 82,
-       1796, 82,
-       1801, 82,
-       1806, 82,
-       1864, 1115
+       1794, 82,
+       1799, 82,
+       1817, 908,
+       1883, 1124
 };
-static int parser_goto_row116[] = {
+static int parser_goto_row114[] = {
        12,
-       -1, 1310,
-       1311, 1432,
-       1740, 1793,
-       1749, 1802,
+       -1, 1321,
+       1322, 1465,
+       1728, 1786,
+       1737, 1795,
+       1781, 1830,
+       1787, 1833,
        1788, 1834,
-       1794, 1837,
-       1795, 1838,
-       1803, 1844,
-       1805, 1845,
-       1835, 1872,
-       1839, 1873,
-       1846, 1876
+       1796, 1840,
+       1798, 1841,
+       1831, 1869,
+       1835, 1870,
+       1842, 1873
 };
-static int parser_goto_row117[] = {
+static int parser_goto_row115[] = {
        14,
        -1, 91,
        824, 972,
-       969, 1137,
-       970, 1138,
-       973, 1139,
-       978, 1146,
-       1155, 1316,
-       1616, 1672,
-       1671, 1729,
-       1673, 1730,
-       1680, 1739,
-       1744, 1798,
-       1830, 1868,
-       1867, 1887
+       969, 1145,
+       970, 1146,
+       973, 1147,
+       978, 1154,
+       989, 1161,
+       1645, 1714,
+       1654, 1727,
+       1713, 1777,
+       1715, 1778,
+       1732, 1791,
+       1865, 1887,
+       1886, 1895
 };
-static int parser_goto_row118[] = {
-       50,
+static int parser_goto_row116[] = {
+       55,
        -1, 591,
        0, 12,
        3, 23,
@@ -24143,44 +24261,54 @@ static int parser_goto_row118[] = {
        742, 909,
        743, 160,
        798, 160,
-       888, 1028,
-       892, 1028,
-       986, 1158,
-       1051, 242,
-       1137, 1158,
-       1146, 1158,
-       1156, 1158,
-       1160, 1158,
-       1198, 1350,
-       1206, 472,
-       1293, 1158,
-       1348, 1350,
-       1360, 160,
-       1478, 909,
-       1479, 1028,
-       1484, 1028,
-       1650, 1350,
-       1739, 1158,
-       1775, 1028,
-       1798, 1158
+       839, 992,
+       888, 1036,
+       892, 1036,
+       990, 992,
+       994, 992,
+       1060, 242,
+       1145, 992,
+       1154, 992,
+       1208, 1382,
+       1218, 472,
+       1304, 992,
+       1319, 992,
+       1380, 1382,
+       1393, 160,
+       1468, 992,
+       1501, 909,
+       1502, 1036,
+       1507, 1036,
+       1579, 992,
+       1692, 1382,
+       1727, 992,
+       1785, 992,
+       1791, 992,
+       1817, 1036,
+       1836, 992
 };
-static int parser_goto_row119[] = {
-       13,
+static int parser_goto_row117[] = {
+       18,
        -1, 98,
        0, 13,
        5, 27,
        18, 27,
        28, 27,
-       986, 1159,
-       1137, 1292,
-       1146, 1292,
-       1156, 1159,
-       1160, 1324,
-       1293, 1292,
-       1739, 1292,
-       1798, 1292
+       839, 993,
+       990, 993,
+       994, 1169,
+       1145, 1303,
+       1154, 1303,
+       1304, 1303,
+       1319, 1303,
+       1468, 993,
+       1579, 993,
+       1727, 1303,
+       1785, 1303,
+       1791, 1303,
+       1836, 1303
 };
-static int parser_goto_row120[] = {
+static int parser_goto_row118[] = {
        249,
        -1, 14,
        35, 163,
@@ -24312,145 +24440,145 @@ static int parser_goto_row120[] = {
        828, 975,
        829, 976,
        831, 983,
-       868, 1013,
-       872, 1018,
-       889, 1032,
-       891, 1034,
-       893, 1037,
-       899, 1043,
-       924, 1060,
-       934, 1069,
-       942, 1078,
-       945, 1080,
-       948, 1082,
-       952, 1085,
-       966, 1132,
-       977, 1144,
-       985, 1151,
-       990, 1162,
-       991, 1163,
-       1020, 1187,
-       1021, 1188,
-       1046, 1201,
-       1059, 1212,
-       1065, 1215,
-       1066, 1216,
-       1070, 1219,
-       1084, 1232,
-       1091, 1237,
-       1092, 1238,
-       1094, 1240,
-       1095, 1241,
-       1096, 1242,
-       1097, 1243,
-       1116, 1263,
-       1142, 1300,
-       1160, 1325,
-       1181, 1337,
-       1186, 1341,
-       1193, 1345,
-       1194, 1346,
-       1196, 1347,
-       1199, 1352,
-       1213, 1361,
-       1224, 1367,
-       1229, 1368,
-       1248, 1384,
-       1264, 1391,
-       1265, 1393,
-       1266, 1394,
-       1267, 1395,
-       1268, 1396,
-       1269, 1397,
-       1270, 1398,
-       1271, 1399,
-       1272, 1400,
-       1273, 1401,
-       1274, 1402,
-       1275, 1403,
-       1276, 1404,
-       1277, 1405,
-       1278, 1406,
-       1279, 1407,
-       1280, 1408,
-       1281, 1409,
-       1282, 1410,
-       1283, 1411,
-       1284, 1412,
-       1285, 1413,
-       1286, 1414,
-       1297, 1423,
-       1298, 1424,
-       1301, 1426,
-       1314, 1437,
-       1327, 1470,
-       1328, 1471,
-       1343, 1476,
-       1344, 1477,
-       1369, 1499,
-       1375, 1502,
-       1377, 1503,
-       1378, 1504,
-       1386, 1510,
-       1392, 1514,
-       1422, 1547,
-       1427, 1549,
-       1435, 1554,
-       1438, 1557,
-       1446, 1568,
-       1474, 1581,
-       1480, 1587,
-       1495, 1597,
-       1497, 1598,
-       1507, 1604,
-       1539, 1610,
-       1551, 1618,
-       1560, 832,
-       1562, 832,
-       1563, 1628,
-       1574, 1640,
-       1579, 1647,
-       1582, 1649,
-       1602, 1659,
-       1621, 832,
-       1624, 832,
-       1627, 832,
-       1652, 1718,
-       1665, 1725,
-       1666, 1726,
-       1670, 1728,
-       1674, 1731,
-       1676, 1732,
-       1720, 1776,
-       1746, 1800,
-       1781, 1828,
-       1782, 1829,
-       1785, 1831,
-       1786, 1832,
-       1787, 1833,
-       1826, 1864,
-       1865, 1886,
-       1869, 1888
+       868, 1021,
+       872, 1026,
+       889, 1040,
+       891, 1042,
+       893, 1045,
+       899, 1051,
+       924, 1069,
+       934, 1078,
+       942, 1087,
+       945, 1089,
+       948, 1091,
+       952, 1094,
+       966, 1141,
+       977, 1152,
+       985, 1159,
+       994, 1170,
+       998, 1172,
+       999, 1173,
+       1028, 1197,
+       1029, 1198,
+       1054, 1211,
+       1068, 1224,
+       1074, 1227,
+       1075, 1228,
+       1079, 1231,
+       1093, 1244,
+       1100, 1249,
+       1101, 1250,
+       1103, 1252,
+       1104, 1253,
+       1105, 1254,
+       1106, 1255,
+       1125, 1275,
+       1150, 1311,
+       1191, 1369,
+       1196, 1373,
+       1203, 1377,
+       1204, 1378,
+       1206, 1379,
+       1209, 1384,
+       1225, 1394,
+       1236, 1400,
+       1241, 1401,
+       1260, 1417,
+       1276, 1424,
+       1277, 1426,
+       1278, 1427,
+       1279, 1428,
+       1280, 1429,
+       1281, 1430,
+       1282, 1431,
+       1283, 1432,
+       1284, 1433,
+       1285, 1434,
+       1286, 1435,
+       1287, 1436,
+       1288, 1437,
+       1289, 1438,
+       1290, 1439,
+       1291, 1440,
+       1292, 1441,
+       1293, 1442,
+       1294, 1443,
+       1295, 1444,
+       1296, 1445,
+       1297, 1446,
+       1298, 1447,
+       1308, 1456,
+       1309, 1457,
+       1312, 1459,
+       1334, 1482,
+       1359, 1493,
+       1360, 1494,
+       1375, 1499,
+       1376, 1500,
+       1402, 1522,
+       1408, 1525,
+       1410, 1526,
+       1411, 1527,
+       1419, 1533,
+       1425, 1537,
+       1455, 1570,
+       1460, 1572,
+       1466, 1576,
+       1469, 1580,
+       1474, 832,
+       1476, 832,
+       1477, 1589,
+       1488, 1601,
+       1497, 1610,
+       1503, 1616,
+       1518, 1626,
+       1520, 1627,
+       1530, 1633,
+       1562, 1639,
+       1574, 1647,
+       1577, 1648,
+       1582, 832,
+       1585, 832,
+       1588, 832,
+       1608, 1689,
+       1611, 1691,
+       1631, 1701,
+       1694, 1766,
+       1707, 1773,
+       1708, 1774,
+       1712, 1776,
+       1716, 1779,
+       1718, 1780,
+       1734, 1793,
+       1768, 1818,
+       1823, 1863,
+       1824, 1864,
+       1827, 1866,
+       1828, 1867,
+       1829, 1868,
+       1861, 1883,
+       1884, 1894,
+       1888, 1896
 };
-static int parser_goto_row121[] = {
+static int parser_goto_row119[] = {
        4,
        -1, 15,
        22, 106,
        25, 106,
        165, 106
 };
-static int parser_goto_row122[] = {
+static int parser_goto_row120[] = {
        1,
        -1, 16
 };
-static int parser_goto_row123[] = {
+static int parser_goto_row121[] = {
        4,
        -1, 982,
-       1626, 1688,
-       1678, 1736,
-       1689, 1756
+       1587, 1662,
+       1652, 1724,
+       1663, 1744
 };
-static int parser_goto_row124[] = {
+static int parser_goto_row122[] = {
        13,
        -1, 442,
        441, 624,
@@ -24458,146 +24586,146 @@ static int parser_goto_row124[] = {
        626, 813,
        955, 624,
        957, 627,
-       1090, 813,
-       1461, 624,
-       1469, 627,
-       1578, 813,
-       1703, 624,
-       1705, 627,
-       1768, 813
+       1099, 813,
+       1349, 624,
+       1357, 627,
+       1492, 813,
+       1677, 624,
+       1679, 627,
+       1756, 813
 };
-static int parser_goto_row125[] = {
+static int parser_goto_row123[] = {
        5,
        -1, 443,
        805, 956,
-       1321, 1462,
-       1616, 1462,
-       1640, 1704
+       1166, 1350,
+       1601, 1678,
+       1645, 1350
 };
-static int parser_goto_row126[] = {
+static int parser_goto_row124[] = {
        1,
-       -1, 1519
+       -1, 1542
 };
-static int parser_goto_row127[] = {
+static int parser_goto_row125[] = {
        2,
-       -1, 1116,
-       1864, 1885
+       -1, 1125,
+       1883, 1893
 };
-static int parser_goto_row128[] = {
+static int parser_goto_row126[] = {
        1,
-       -1, 1117
+       -1, 1126
 };
-static int parser_goto_row129[] = {
+static int parser_goto_row127[] = {
        6,
-       -1, 1118,
-       1241, 1379,
-       1391, 1513,
-       1393, 1515,
-       1394, 1516,
-       1514, 1606
+       -1, 1127,
+       1253, 1412,
+       1424, 1536,
+       1426, 1538,
+       1427, 1539,
+       1537, 1635
 };
-static int parser_goto_row130[] = {
+static int parser_goto_row128[] = {
        1,
-       -1, 1119
+       -1, 1128
 };
-static int parser_goto_row131[] = {
+static int parser_goto_row129[] = {
        8,
-       -1, 1120,
-       1397, 1521,
-       1398, 1522,
-       1399, 1523,
-       1400, 1524,
-       1401, 1525,
-       1402, 1526,
-       1403, 1527
+       -1, 1129,
+       1430, 1544,
+       1431, 1545,
+       1432, 1546,
+       1433, 1547,
+       1434, 1548,
+       1435, 1549,
+       1436, 1550
 };
-static int parser_goto_row132[] = {
+static int parser_goto_row130[] = {
        2,
-       -1, 1121,
-       1396, 1520
+       -1, 1130,
+       1429, 1543
 };
-static int parser_goto_row133[] = {
+static int parser_goto_row131[] = {
        2,
-       -1, 1122,
-       1404, 1528
+       -1, 1131,
+       1437, 1551
 };
-static int parser_goto_row134[] = {
+static int parser_goto_row132[] = {
        2,
-       -1, 1123,
-       1405, 1529
+       -1, 1132,
+       1438, 1552
 };
-static int parser_goto_row135[] = {
+static int parser_goto_row133[] = {
        3,
-       -1, 1124,
-       1406, 1530,
-       1407, 1531
+       -1, 1133,
+       1439, 1553,
+       1440, 1554
 };
-static int parser_goto_row136[] = {
+static int parser_goto_row134[] = {
        3,
-       -1, 1125,
-       1408, 1532,
-       1409, 1533
+       -1, 1134,
+       1441, 1555,
+       1442, 1556
 };
-static int parser_goto_row137[] = {
+static int parser_goto_row135[] = {
        5,
-       -1, 1126,
-       1410, 1534,
-       1411, 1535,
-       1412, 1536,
-       1413, 1537
+       -1, 1135,
+       1443, 1557,
+       1444, 1558,
+       1445, 1559,
+       1446, 1560
 };
-static int parser_goto_row138[] = {
+static int parser_goto_row136[] = {
        5,
-       -1, 1127,
-       1103, 1251,
-       1104, 1252,
-       1105, 1253,
-       1243, 1383
+       -1, 1136,
+       1112, 1263,
+       1113, 1264,
+       1114, 1265,
+       1255, 1416
 };
-static int parser_goto_row139[] = {
+static int parser_goto_row137[] = {
        1,
-       -1, 1128
+       -1, 1137
 };
-static int parser_goto_row140[] = {
+static int parser_goto_row138[] = {
        2,
-       -1, 1129,
-       1102, 1250
+       -1, 1138,
+       1111, 1262
 };
-static int parser_goto_row141[] = {
+static int parser_goto_row139[] = {
        1,
        -1, -1
 };
-static int parser_goto_row142[] = {
+static int parser_goto_row140[] = {
        1,
-       -1, 1130
+       -1, 1139
 };
-static int parser_goto_row143[] = {
+static int parser_goto_row141[] = {
        4,
        -1, 389,
        281, 507,
        346, 557,
        509, 701
 };
-static int parser_goto_row144[] = {
+static int parser_goto_row142[] = {
        1,
        -1, -1
 };
-static int parser_goto_row145[] = {
+static int parser_goto_row143[] = {
        1,
-       -1, 1463
+       -1, 1351
 };
-static int parser_goto_row146[] = {
+static int parser_goto_row144[] = {
        4,
        -1, 141,
-       1321, 1464,
-       1581, 1648,
-       1616, 1464
+       1166, 1352,
+       1610, 1690,
+       1645, 1352
 };
-static int parser_goto_row147[] = {
+static int parser_goto_row145[] = {
        1,
        -1, 142
 };
-static int parser_goto_row148[] = {
+static int parser_goto_row146[] = {
        6,
        -1, 143,
        280, 506,
@@ -24606,11 +24734,11 @@ static int parser_goto_row148[] = {
        522, 710,
        708, 875
 };
-static int parser_goto_row149[] = {
+static int parser_goto_row147[] = {
        1,
        -1, 144
 };
-static int parser_goto_row150[] = {
+static int parser_goto_row148[] = {
        8,
        -1, 145,
        525, 713,
@@ -24621,34 +24749,34 @@ static int parser_goto_row150[] = {
        530, 718,
        531, 719
 };
-static int parser_goto_row151[] = {
+static int parser_goto_row149[] = {
        2,
        -1, 146,
        524, 712
 };
-static int parser_goto_row152[] = {
+static int parser_goto_row150[] = {
        2,
        -1, 147,
        532, 720
 };
-static int parser_goto_row153[] = {
+static int parser_goto_row151[] = {
        2,
        -1, 148,
        533, 721
 };
-static int parser_goto_row154[] = {
+static int parser_goto_row152[] = {
        3,
        -1, 149,
        534, 722,
        535, 723
 };
-static int parser_goto_row155[] = {
+static int parser_goto_row153[] = {
        3,
        -1, 150,
        536, 724,
        537, 725
 };
-static int parser_goto_row156[] = {
+static int parser_goto_row154[] = {
        5,
        -1, 151,
        538, 726,
@@ -24656,65 +24784,73 @@ static int parser_goto_row156[] = {
        540, 728,
        541, 729
 };
-static int parser_goto_row157[] = {
+static int parser_goto_row155[] = {
        1,
        -1, 152
 };
-static int parser_goto_row158[] = {
+static int parser_goto_row156[] = {
        1,
        -1, 153
 };
-static int parser_goto_row159[] = {
+static int parser_goto_row157[] = {
        4,
        -1, 154,
        125, 289,
-       1321, 1465,
-       1616, 1465
+       1166, 1353,
+       1645, 1353
 };
-static int parser_goto_row160[] = {
+static int parser_goto_row158[] = {
        1,
        -1, -1
 };
-static int parser_goto_row161[] = {
+static int parser_goto_row159[] = {
        2,
        -1, 155,
-       1076, 1227
+       1085, 1239
 };
-static int parser_goto_row162[] = {
+static int parser_goto_row160[] = {
        1,
        -1, 595
 };
-static int parser_goto_row163[] = {
+static int parser_goto_row161[] = {
        7,
        -1, 596,
        592, 783,
-       1071, 1220,
-       1218, 1364,
-       1362, 1496,
-       1381, 1506,
-       1505, 1603
+       1080, 1232,
+       1230, 1397,
+       1395, 1519,
+       1414, 1529,
+       1528, 1632
 };
-static int parser_goto_row164[] = {
+static int parser_goto_row162[] = {
        1,
        -1, 787
 };
-static int parser_goto_row165[] = {
+static int parser_goto_row163[] = {
        1,
        -1, -1
 };
+static int parser_goto_row164[] = {
+       2,
+       -1, 1354,
+       1645, 1715
+};
+static int parser_goto_row165[] = {
+       1,
+       -1, 1355
+};
 static int parser_goto_row166[] = {
        2,
-       -1, 1466,
-       1616, 1673
+       -1, 1415,
+       1417, 1532
 };
 static int parser_goto_row167[] = {
        1,
-       -1, 1467
+       -1, -1
 };
 static int parser_goto_row168[] = {
-       2,
-       -1, 1382,
-       1384, 1509
+       1,
+       -1, -1
 };
 static int parser_goto_row169[] = {
        1,
@@ -24777,116 +24913,108 @@ static int parser_goto_row183[] = {
        -1, -1
 };
 static int parser_goto_row184[] = {
-       1,
-       -1, -1
-};
-static int parser_goto_row185[] = {
-       1,
-       -1, -1
-};
-static int parser_goto_row186[] = {
        8,
-       -1, 1029,
-       892, 1035,
-       1198, 1351,
-       1348, 1481,
-       1479, 1585,
-       1484, 1588,
-       1650, 1717,
-       1775, 1824
+       -1, 1037,
+       892, 1043,
+       1208, 1383,
+       1380, 1504,
+       1502, 1614,
+       1507, 1617,
+       1692, 1765,
+       1817, 1859
 };
-static int parser_goto_row187[] = {
+static int parser_goto_row185[] = {
        3,
-       -1, 1030,
+       -1, 1038,
        742, 910,
-       1478, 1584
+       1501, 1613
 };
-static int parser_goto_row188[] = {
+static int parser_goto_row186[] = {
        1,
        -1, 911
 };
-static int parser_goto_row189[] = {
+static int parser_goto_row187[] = {
        1,
        -1, 912
 };
-static int parser_goto_row190[] = {
+static int parser_goto_row188[] = {
        1,
        -1, 913
 };
-static int parser_goto_row191[] = {
+static int parser_goto_row189[] = {
        1,
        -1, 914
 };
-static int parser_goto_row192[] = {
+static int parser_goto_row190[] = {
        1,
        -1, 915
 };
-static int parser_goto_row193[] = {
+static int parser_goto_row191[] = {
        1,
        -1, 916
 };
-static int parser_goto_row194[] = {
+static int parser_goto_row192[] = {
        1,
        -1, 917
 };
-static int parser_goto_row195[] = {
+static int parser_goto_row193[] = {
        1,
        -1, -1
 };
-static int parser_goto_row196[] = {
+static int parser_goto_row194[] = {
        10,
        -1, 161,
        37, 168,
        743, 920,
        798, 950,
-       888, 1031,
-       892, 1036,
-       1360, 1494,
-       1479, 1586,
-       1484, 1589,
-       1775, 1825
+       888, 1039,
+       892, 1044,
+       1393, 1517,
+       1502, 1615,
+       1507, 1618,
+       1817, 1860
 };
-static int parser_goto_row197[] = {
+static int parser_goto_row195[] = {
        1,
        -1, -1
 };
-static int parser_goto_row198[] = {
+static int parser_goto_row196[] = {
        1,
        -1, 444
 };
-static int parser_goto_row199[] = {
+static int parser_goto_row197[] = {
        1,
-       -1, 1468
+       -1, 1356
 };
-static int parser_goto_row200[] = {
+static int parser_goto_row198[] = {
        1,
        -1, -1
 };
-static int parser_goto_row201[] = {
+static int parser_goto_row199[] = {
        1,
        -1, -1
 };
-static int parser_goto_row202[] = {
+static int parser_goto_row200[] = {
        1,
-       -1, 1321
+       -1, 1166
 };
-static int parser_goto_row203[] = {
+static int parser_goto_row201[] = {
        1,
        -1, 17
 };
-static int parser_goto_row204[] = {
+static int parser_goto_row202[] = {
        2,
        -1, 18,
        5, 28
 };
-static int parser_goto_row205[] = {
+static int parser_goto_row203[] = {
        4,
        -1, 19,
        5, 29,
        18, 94,
        28, 111
 };
-static int parser_goto_row206[] = {
+static int parser_goto_row204[] = {
        8,
        -1, 20,
        5, 30,
@@ -24897,63 +25025,66 @@ static int parser_goto_row206[] = {
        94, 265,
        111, 274
 };
-static int parser_goto_row207[] = {
+static int parser_goto_row205[] = {
        1,
-       -1, 1438
+       -1, 1471
+};
+static int parser_goto_row206[] = {
+       1,
+       -1, 994
+};
+static int parser_goto_row207[] = {
+       4,
+       -1, 1304,
+       1154, 1319,
+       1727, 1785,
+       1791, 1836
 };
 static int parser_goto_row208[] = {
        1,
-       -1, 1160
+       -1, 1312
 };
 static int parser_goto_row209[] = {
        1,
-       -1, 1301
+       -1, 1462
 };
 static int parser_goto_row210[] = {
        1,
-       -1, 1429
+       -1, 1077
 };
 static int parser_goto_row211[] = {
-       1,
-       -1, 1068
-};
-static int parser_goto_row212[] = {
        3,
        -1, 243,
        331, 546,
-       1051, 1206
+       1060, 1218
 };
-static int parser_goto_row213[] = {
+static int parser_goto_row212[] = {
        1,
        -1, 618
 };
-static int parser_goto_row214[] = {
+static int parser_goto_row213[] = {
        1,
        -1, 634
 };
-static int parser_goto_row215[] = {
+static int parser_goto_row214[] = {
        1,
        -1, 252
 };
-static int parser_goto_row216[] = {
+static int parser_goto_row215[] = {
        1,
        -1, 944
 };
-static int parser_goto_row217[] = {
-       1,
-       -1, 1293
-};
-static int parser_goto_row218[] = {
+static int parser_goto_row216[] = {
        2,
-       -1, 1371,
-       1467, 1576
+       -1, 1404,
+       1355, 1490
 };
-static int parser_goto_row219[] = {
+static int parser_goto_row217[] = {
        1,
        -1, 874
 };
-static int parser_goto_row220[] = {
-       168,
+static int parser_goto_row218[] = {
+       170,
        -1, 196,
        13, 83,
        27, 83,
@@ -25023,108 +25154,110 @@ static int parser_goto_row220[] = {
        852, 156,
        853, 156,
        854, 156,
-       869, 1016,
+       869, 1024,
        887, 156,
        888, 918,
        890, 83,
        892, 918,
        901, 156,
        909, 83,
-       964, 1131,
-       968, 1134,
+       964, 1140,
+       968, 1143,
        979, 83,
-       1008, 156,
-       1009, 156,
-       1028, 83,
-       1047, 156,
-       1048, 156,
-       1049, 156,
-       1053, 83,
-       1054, 156,
+       1016, 156,
+       1017, 156,
+       1036, 83,
        1055, 156,
-       1080, 445,
-       1102, 1131,
-       1103, 1131,
-       1104, 1131,
-       1105, 1131,
-       1144, 664,
-       1148, 83,
-       1198, 918,
-       1201, 1357,
-       1210, 156,
-       1211, 156,
-       1241, 1131,
-       1243, 1131,
-       1321, 1469,
-       1348, 918,
-       1350, 83,
-       1354, 156,
-       1355, 156,
-       1360, 83,
-       1367, 445,
-       1391, 1131,
-       1393, 1131,
-       1394, 1131,
-       1396, 1131,
-       1397, 1131,
-       1398, 1131,
-       1399, 1131,
-       1400, 1131,
-       1401, 1131,
-       1402, 1131,
-       1403, 1131,
-       1404, 1131,
-       1405, 1131,
-       1406, 1131,
-       1407, 1131,
-       1408, 1131,
-       1409, 1131,
-       1410, 1131,
-       1411, 1131,
-       1412, 1131,
-       1413, 1131,
-       1414, 1543,
-       1430, 664,
-       1478, 918,
-       1479, 918,
-       1484, 918,
-       1488, 156,
-       1489, 156,
-       1490, 156,
-       1491, 156,
-       1499, 445,
-       1510, 1543,
-       1514, 1131,
-       1549, 664,
-       1558, 664,
-       1560, 664,
-       1562, 664,
-       1568, 445,
-       1581, 156,
-       1594, 156,
-       1595, 156,
-       1604, 1662,
-       1616, 1469,
-       1640, 1705,
-       1650, 918,
-       1681, 83,
-       1685, 83,
-       1728, 445,
+       1056, 156,
+       1057, 156,
+       1058, 83,
+       1062, 83,
+       1063, 156,
+       1064, 156,
+       1089, 445,
+       1111, 1140,
+       1112, 1140,
+       1113, 1140,
+       1114, 1140,
+       1152, 664,
+       1156, 83,
+       1166, 1357,
+       1208, 918,
+       1211, 1389,
+       1216, 83,
+       1222, 156,
+       1223, 156,
+       1253, 1140,
+       1255, 1140,
+       1380, 918,
+       1382, 83,
+       1386, 156,
+       1387, 156,
+       1393, 83,
+       1400, 445,
+       1424, 1140,
+       1426, 1140,
+       1427, 1140,
+       1429, 1140,
+       1430, 1140,
+       1431, 1140,
+       1432, 1140,
+       1433, 1140,
+       1434, 1140,
+       1435, 1140,
+       1436, 1140,
+       1437, 1140,
+       1438, 1140,
+       1439, 1140,
+       1440, 1140,
+       1441, 1140,
+       1442, 1140,
+       1443, 1140,
+       1444, 1140,
+       1445, 1140,
+       1446, 1140,
+       1447, 1566,
+       1463, 664,
+       1472, 664,
+       1474, 664,
+       1476, 664,
+       1482, 445,
+       1501, 918,
+       1502, 918,
+       1507, 918,
+       1511, 156,
+       1512, 156,
+       1513, 156,
+       1514, 156,
+       1522, 445,
+       1533, 1566,
+       1537, 1140,
+       1572, 664,
+       1601, 1679,
+       1610, 156,
+       1623, 156,
+       1624, 156,
+       1633, 1704,
+       1645, 1357,
+       1655, 83,
+       1659, 83,
+       1692, 918,
+       1721, 83,
+       1729, 83,
+       1730, 83,
        1733, 83,
+       1738, 83,
        1741, 83,
-       1742, 83,
-       1745, 83,
-       1750, 83,
-       1753, 83,
-       1775, 918,
+       1776, 445,
+       1782, 83,
        1789, 83,
-       1796, 83,
-       1801, 83,
-       1806, 83,
-       1864, 1131
+       1794, 83,
+       1799, 83,
+       1817, 918,
+       1883, 1140
 };
-static int parser_goto_row221[] = {
-       71,
+static int parser_goto_row219[] = {
+       78,
        -1, 164,
        0, 21,
        3, 24,
@@ -25160,45 +25293,52 @@ static int parser_goto_row221[] = {
        742, 24,
        743, 24,
        798, 24,
+       839, 24,
        888, 24,
        890, 24,
        892, 24,
        979, 24,
-       986, 24,
-       1051, 24,
-       1053, 24,
-       1137, 24,
-       1146, 24,
-       1148, 24,
+       990, 24,
+       994, 21,
+       1058, 24,
+       1060, 24,
+       1062, 24,
+       1145, 24,
+       1154, 24,
        1156, 24,
-       1160, 21,
-       1198, 24,
-       1206, 24,
-       1293, 24,
-       1348, 24,
-       1360, 24,
-       1478, 24,
-       1479, 24,
-       1484, 24,
-       1650, 24,
-       1681, 24,
-       1685, 24,
+       1208, 24,
+       1216, 24,
+       1218, 24,
+       1304, 24,
+       1319, 24,
+       1380, 24,
+       1393, 24,
+       1468, 24,
+       1501, 24,
+       1502, 24,
+       1507, 24,
+       1579, 24,
+       1655, 24,
+       1659, 24,
+       1692, 24,
+       1721, 24,
+       1727, 24,
+       1729, 24,
+       1730, 24,
        1733, 24,
-       1739, 24,
+       1738, 24,
        1741, 24,
-       1742, 24,
-       1745, 24,
-       1750, 24,
-       1753, 24,
-       1775, 24,
+       1782, 24,
+       1785, 24,
        1789, 24,
-       1796, 24,
-       1798, 24,
-       1801, 24,
-       1806, 24
+       1791, 24,
+       1794, 24,
+       1799, 24,
+       1817, 24,
+       1836, 24
 };
-static int parser_goto_row222[] = {
-       68,
+static int parser_goto_row220[] = {
+       75,
        -1, 165,
        0, 22,
        3, 25,
@@ -25231,42 +25371,49 @@ static int parser_goto_row222[] = {
        742, 25,
        743, 25,
        798, 25,
+       839, 25,
        888, 25,
        890, 25,
        892, 25,
        979, 25,
-       986, 25,
-       1051, 25,
-       1053, 25,
-       1137, 25,
-       1146, 25,
-       1148, 25,
+       990, 25,
+       994, 22,
+       1058, 25,
+       1060, 25,
+       1062, 25,
+       1145, 25,
+       1154, 25,
        1156, 25,
-       1160, 22,
-       1198, 25,
-       1206, 25,
-       1293, 25,
-       1348, 25,
-       1360, 25,
-       1478, 25,
-       1479, 25,
-       1484, 25,
-       1650, 25,
-       1681, 25,
-       1685, 25,
+       1208, 25,
+       1216, 25,
+       1218, 25,
+       1304, 25,
+       1319, 25,
+       1380, 25,
+       1393, 25,
+       1468, 25,
+       1501, 25,
+       1502, 25,
+       1507, 25,
+       1579, 25,
+       1655, 25,
+       1659, 25,
+       1692, 25,
+       1721, 25,
+       1727, 25,
+       1729, 25,
+       1730, 25,
        1733, 25,
-       1739, 25,
+       1738, 25,
        1741, 25,
-       1742, 25,
-       1745, 25,
-       1750, 25,
-       1753, 25,
-       1775, 25,
+       1782, 25,
+       1785, 25,
        1789, 25,
-       1796, 25,
-       1798, 25,
-       1801, 25,
-       1806, 25
+       1791, 25,
+       1794, 25,
+       1799, 25,
+       1817, 25,
+       1836, 25
 };
 
 const int* const parser_goto_table[] = {
@@ -25489,7 +25636,5 @@ const int* const parser_goto_table[] = {
        parser_goto_row217,
        parser_goto_row218,
        parser_goto_row219,
-       parser_goto_row220,
-       parser_goto_row221,
-       parser_goto_row222
+       parser_goto_row220
 };
diff --git a/tests/base_attr_abstract2.nit b/tests/base_attr_abstract2.nit
new file mode 100644 (file)
index 0000000..931f334
--- /dev/null
@@ -0,0 +1,28 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import standard::kernel
+
+abstract class A
+       var x: Int
+       var y: Int is abstract
+end
+
+class B
+       super A
+       redef fun y=(v) do v.output
+end
+
+var b = new B(1,2)
+b.x.output
diff --git a/tests/sav/base_attr_abstract2.res b/tests/sav/base_attr_abstract2.res
new file mode 100644 (file)
index 0000000..5f1d0ec
--- /dev/null
@@ -0,0 +1,2 @@
+2
+1
index 5ff1d37..5865ea3 100644 (file)
@@ -9,22 +9,22 @@ base_formal_subtype.nit:58,10--19: Warning: expression is already a `VE` since i
 base_formal_subtype.nit:59,10--18: Warning: expression is already a `E` since it is a `VVE`.
 base_formal_subtype.nit:60,10--23: Warning: expression is already a `Object` since it is a `VVE`.
 base_formal_subtype.nit:62,10--20: Warning: expression is already a `VGE`.
-base_formal_subtype.nit:63,10--20: Warning: expression is already a `G[E]` since it is a `VGE`.
-base_formal_subtype.nit:64,10--25: Warning: expression is already a `G[Object]` since it is a `VGE`.
+base_formal_subtype.nit:63,10--21: Warning: expression is already a `G[E]` since it is a `VGE`.
+base_formal_subtype.nit:64,10--26: Warning: expression is already a `G[Object]` since it is a `VGE`.
 base_formal_subtype.nit:65,10--23: Warning: expression is already a `Object` since it is a `VGE`.
 base_formal_subtype.nit:67,10--22: Warning: expression is already a `VVGE`.
 base_formal_subtype.nit:68,10--21: Warning: expression is already a `VGE` since it is a `VVGE`.
-base_formal_subtype.nit:69,10--21: Warning: expression is already a `G[E]` since it is a `VVGE`.
-base_formal_subtype.nit:70,10--26: Warning: expression is already a `G[Object]` since it is a `VVGE`.
+base_formal_subtype.nit:69,10--22: Warning: expression is already a `G[E]` since it is a `VVGE`.
+base_formal_subtype.nit:70,10--27: Warning: expression is already a `G[Object]` since it is a `VVGE`.
 base_formal_subtype.nit:71,10--24: Warning: expression is already a `Object` since it is a `VVGE`.
 base_formal_subtype.nit:73,10--22: Warning: expression is already a `VGVE`.
-base_formal_subtype.nit:74,10--22: Warning: expression is already a `G[VE]` since it is a `VGVE`.
-base_formal_subtype.nit:75,10--21: Warning: expression is already a `G[E]` since it is a `VGVE`.
-base_formal_subtype.nit:76,10--26: Warning: expression is already a `G[Object]` since it is a `VGVE`.
+base_formal_subtype.nit:74,10--23: Warning: expression is already a `G[VE]` since it is a `VGVE`.
+base_formal_subtype.nit:75,10--22: Warning: expression is already a `G[E]` since it is a `VGVE`.
+base_formal_subtype.nit:76,10--27: Warning: expression is already a `G[Object]` since it is a `VGVE`.
 base_formal_subtype.nit:77,10--24: Warning: expression is already a `Object` since it is a `VGVE`.
 base_formal_subtype.nit:79,10--24: Warning: expression is already a `VGVVE`.
-base_formal_subtype.nit:80,10--24: Warning: expression is already a `G[VVE]` since it is a `VGVVE`.
-base_formal_subtype.nit:81,10--23: Warning: expression is already a `G[VE]` since it is a `VGVVE`.
-base_formal_subtype.nit:82,10--22: Warning: expression is already a `G[E]` since it is a `VGVVE`.
-base_formal_subtype.nit:83,10--27: Warning: expression is already a `G[Object]` since it is a `VGVVE`.
+base_formal_subtype.nit:80,10--25: Warning: expression is already a `G[VVE]` since it is a `VGVVE`.
+base_formal_subtype.nit:81,10--24: Warning: expression is already a `G[VE]` since it is a `VGVVE`.
+base_formal_subtype.nit:82,10--23: Warning: expression is already a `G[E]` since it is a `VGVVE`.
+base_formal_subtype.nit:83,10--28: Warning: expression is already a `G[Object]` since it is a `VGVVE`.
 base_formal_subtype.nit:84,10--25: Warning: expression is already a `Object` since it is a `VGVVE`.
index ab2b981..1c07e6e 100644 (file)
@@ -1 +1 @@
-alt/base_gen2_alt1.nit:61,13--17: Type Error: `A` is not a generic class.
+alt/base_gen2_alt1.nit:61,13--18: Type Error: `A` is not a generic class.
index 08000b1..5693f2b 100644 (file)
@@ -1 +1 @@
-alt/base_gen2_alt3.nit:63,13--22: Type Error: expected 1 formal argument(s) for `B[E: nullable Object]`; got 2.
+alt/base_gen2_alt3.nit:63,13--23: Type Error: expected 1 formal argument(s) for `B[E: nullable Object]`; got 2.
index 77eb2ca..eaad7c9 100644 (file)
@@ -1 +1 @@
-alt/base_gen2_alt5.nit:65,13--17: Type Error: expected 2 formal argument(s) for `C[F: nullable Object, G: nullable Object]`; got 1.
+alt/base_gen2_alt5.nit:65,13--18: Type Error: expected 2 formal argument(s) for `C[F: nullable Object, G: nullable Object]`; got 1.
index e8ade92..989bc61 100644 (file)
@@ -1,4 +1,4 @@
 base_isa_gen1.nit:62,8--14: Warning: expression is already a `A` since it is a `F`.
-base_isa_gen1.nit:65,8--29: Warning: expression is already a `D[Object, Object]` since it is a `G[Object]`.
-base_isa_gen1.nit:66,8--29: Warning: expression is already a `D[Object, Object]` since it is a `E[F]`.
+base_isa_gen1.nit:65,8--30: Warning: expression is already a `D[Object, Object]` since it is a `G[Object]`.
+base_isa_gen1.nit:66,8--30: Warning: expression is already a `D[Object, Object]` since it is a `E[F]`.
 true
index 1994474..6dde482 100644 (file)
@@ -1,5 +1,5 @@
-base_isa_gen2.nit:39,8--21: Warning: expression is already a `A[Object]`.
-base_isa_gen2.nit:41,8--21: Warning: expression is already a `A[Object]` since it is a `B[Object]`.
-base_isa_gen2.nit:44,8--21: Warning: expression is already a `A[Object]` since it is a `C[Object]`.
-base_isa_gen2.nit:48,8--21: Warning: expression is already a `A[Object]` since it is a `D[Object, Object]`.
+base_isa_gen2.nit:39,8--22: Warning: expression is already a `A[Object]`.
+base_isa_gen2.nit:41,8--22: Warning: expression is already a `A[Object]` since it is a `B[Object]`.
+base_isa_gen2.nit:44,8--22: Warning: expression is already a `A[Object]` since it is a `C[Object]`.
+base_isa_gen2.nit:48,8--22: Warning: expression is already a `A[Object]` since it is a `D[Object, Object]`.
 true
index 427c827..8725a4a 100644 (file)
@@ -1,5 +1,5 @@
 base_isa_gen4.nit:34,8--15: Warning: expression is already a `A` since it is a `B[Canard]`.
-base_isa_gen4.nit:36,8--22: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
-base_isa_gen4.nit:40,8--24: Warning: expression is already a `B[B[Canard]]`.
-base_isa_gen4.nit:42,8--24: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
+base_isa_gen4.nit:36,8--23: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
+base_isa_gen4.nit:40,8--26: Warning: expression is already a `B[B[Canard]]`.
+base_isa_gen4.nit:42,8--26: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
 true
index 6e347f5..c391776 100644 (file)
@@ -1,5 +1,5 @@
 base_isa_gen5.nit:39,8--15: Warning: expression is already a `A` since it is a `B[Canard]`.
-base_isa_gen5.nit:41,8--22: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
-base_isa_gen5.nit:46,8--24: Warning: expression is already a `B[B[Canard]]`.
-base_isa_gen5.nit:48,8--24: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
+base_isa_gen5.nit:41,8--23: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
+base_isa_gen5.nit:46,8--26: Warning: expression is already a `B[B[Canard]]`.
+base_isa_gen5.nit:48,8--26: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
 true
index 1569432..0e4a6ca 100644 (file)
@@ -1,10 +1,10 @@
-base_isa_gen8.nit:49,8--17: Warning: expression is already a `A[X]`.
-base_isa_gen8.nit:50,8--17: Warning: expression is already a `A[Y]`.
-base_isa_gen8.nit:51,8--17: Warning: expression is already a `A[Z]`.
-base_isa_gen8.nit:53,8--21: Warning: expression is already a `B[Object]` since it is a `B[X]`.
-base_isa_gen8.nit:55,8--21: Warning: expression is already a `C[X, X]`.
-base_isa_gen8.nit:56,8--21: Warning: expression is already a `C[X, Y]`.
-base_isa_gen8.nit:57,8--21: Warning: expression is already a `C[X, Z]`.
-base_isa_gen8.nit:59,8--22: Warning: expression is already a `D[X, Y, Z]`.
-base_isa_gen8.nit:60,8--28: Warning: expression is already a `E[X, Y, Z, Bool]`.
+base_isa_gen8.nit:49,8--18: Warning: expression is already a `A[X]`.
+base_isa_gen8.nit:50,8--18: Warning: expression is already a `A[Y]`.
+base_isa_gen8.nit:51,8--18: Warning: expression is already a `A[Z]`.
+base_isa_gen8.nit:53,8--22: Warning: expression is already a `B[Object]` since it is a `B[X]`.
+base_isa_gen8.nit:55,8--22: Warning: expression is already a `C[X, X]`.
+base_isa_gen8.nit:56,8--22: Warning: expression is already a `C[X, Y]`.
+base_isa_gen8.nit:57,8--22: Warning: expression is already a `C[X, Z]`.
+base_isa_gen8.nit:59,8--23: Warning: expression is already a `D[X, Y, Z]`.
+base_isa_gen8.nit:60,8--29: Warning: expression is already a `E[X, Y, Z, Bool]`.
 true
index ae76751..2b455c4 100644 (file)
@@ -1,6 +1,6 @@
 base_isa_nullable1.nit:39,8--15: Warning: expression is already a `A` since it is a `B[Integer]`.
-base_isa_nullable1.nit:41,8--24: Warning: expression is already a `B[Discrete]` since it is a `B[Integer]`.
-base_isa_nullable1.nit:46,8--25: Warning: expression is already a `B[B[Integer]]`.
-base_isa_nullable1.nit:48,8--26: Warning: expression is already a `B[B[Discrete]]` since it is a `B[B[Integer]]`.
-base_isa_nullable1.nit:50,8--33: Warning: expression is already a `B[nullable Discrete]` since it is a `B[Discrete]`.
+base_isa_nullable1.nit:41,8--25: Warning: expression is already a `B[Discrete]` since it is a `B[Integer]`.
+base_isa_nullable1.nit:46,8--27: Warning: expression is already a `B[B[Integer]]`.
+base_isa_nullable1.nit:48,8--28: Warning: expression is already a `B[B[Discrete]]` since it is a `B[B[Integer]]`.
+base_isa_nullable1.nit:50,8--34: Warning: expression is already a `B[nullable Discrete]` since it is a `B[Discrete]`.
 true
index b4b3d25..947e8c1 100644 (file)
@@ -1,5 +1,5 @@
 base_isa_nullable2.nit:27,8--23: Warning: expression is already a `nullable A` since it is a `A`.
-base_isa_nullable2.nit:29,8--30: Warning: expression is already a `nullable B[Object]` since it is a `B[Object]`.
-base_isa_nullable2.nit:30,8--39: Warning: expression is already a `nullable B[nullable Object]` since it is a `nullable B[Object]`.
-base_isa_nullable2.nit:33,8--30: Warning: expression is already a `C[nullable Object]`.
+base_isa_nullable2.nit:29,8--31: Warning: expression is already a `nullable B[Object]` since it is a `B[Object]`.
+base_isa_nullable2.nit:30,8--40: Warning: expression is already a `nullable B[nullable Object]` since it is a `nullable B[Object]`.
+base_isa_nullable2.nit:33,8--31: Warning: expression is already a `C[nullable Object]`.
 true
index 3ba9f50..a2b07bc 100644 (file)
@@ -1,6 +1,6 @@
-base_isa_vt_gen1.nit:30,10--34: Warning: expression is already a `Triple[T, U, V]`.
-base_isa_vt_gen1.nit:54,8--52: Warning: expression is already a `Triple[String, Int, nullable Object]`.
-base_isa_vt_gen1.nit:57,8--46: Warning: expression is already a `Triple[String, String, String]`.
-base_isa_vt_gen1.nit:60,8--48: Warning: expression is already a `Triple[String, String, B[String]]`.
-base_isa_vt_gen1.nit:63,8--46: Warning: expression is already a `Triple[String, String, String]`.
+base_isa_vt_gen1.nit:30,10--35: Warning: expression is already a `Triple[T, U, V]`.
+base_isa_vt_gen1.nit:54,8--53: Warning: expression is already a `Triple[String, Int, nullable Object]`.
+base_isa_vt_gen1.nit:57,8--47: Warning: expression is already a `Triple[String, String, String]`.
+base_isa_vt_gen1.nit:60,8--50: Warning: expression is already a `Triple[String, String, B[String]]`.
+base_isa_vt_gen1.nit:63,8--47: Warning: expression is already a `Triple[String, String, String]`.
 true
index 319de47..bae2431 100644 (file)
@@ -1 +1 @@
-error_formal.nit:18,9--13: Type Error: formal type `T` cannot have formal parameters.
+error_formal.nit:18,9--14: Type Error: formal type `T` cannot have formal parameters.
index 623beb3..3687868 100644 (file)
@@ -1 +1 @@
-alt/error_needed_method_alt2.nit:47,10--27: Type Error: cannot instantiate interface `Collection[Int]`.
+alt/error_needed_method_alt2.nit:47,10--28: Type Error: cannot instantiate interface `Collection[Int]`.
index 1949e18..69708db 100644 (file)
@@ -23,7 +23,7 @@ error_operators.nit:46,10: Syntax Error: binary operator `>=` requires exactly o
 error_operators.nit:47,11: Syntax Error: binary operator `<=>` requires exactly one parameter; got 0.
 error_operators.nit:48,10: Syntax Error: binary operator `<<` requires exactly one parameter; got 0.
 error_operators.nit:49,10: Syntax Error: binary operator `>>` requires exactly one parameter; got 0.
-error_operators.nit:50,14: Syntax Error: `foo=` requires at least 1 parameter(s); got 0.
+error_operators.nit:50,11: Syntax Error: `foo=` requires at least 1 parameter(s); got 0.
 error_operators.nit:51,10: Syntax Error: `[]` requires at least 1 parameter(s); got 0.
 error_operators.nit:52,9--14: Syntax Error: `[]=` requires at least 2 parameter(s); got 1.
 error_operators.nit:57,7--18: Syntax Error: binary operator `+` requires exactly one parameter; got 3.
index e00f31a..8c231e7 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt2_alt1.nit:26,18: Redef Error: expected 1 parameter(s) for `f1(i: Int)`; got 0. See introduction at `error_redef_1alt2_alt1::A::f1`.
+alt/error_redef_1alt2_alt1.nit:26,15: Redef Error: expected 1 parameter(s) for `f1(i: Int)`; got 0. See introduction at `error_redef_1alt2_alt1::A::f1`.
index 618b516..8c19f5a 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt2_alt4.nit:29,18: Redef Error: expected 1 parameter(s) for `f1(i: Int)`; got 0. See introduction at `error_redef_1alt2_alt4::A::f1`.
+alt/error_redef_1alt2_alt4.nit:29,15: Redef Error: expected 1 parameter(s) for `f1(i: Int)`; got 0. See introduction at `error_redef_1alt2_alt4::A::f1`.
index b835f2c..8af74ef 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt4_alt1.nit:26,18: Redef Error: expected 1 parameter(s) for `f1(i: Int): Int`; got 0. See introduction at `error_redef_1alt4_alt1::A::f1`.
+alt/error_redef_1alt4_alt1.nit:26,15: Redef Error: expected 1 parameter(s) for `f1(i: Int): Int`; got 0. See introduction at `error_redef_1alt4_alt1::A::f1`.
index f957017..4391f63 100644 (file)
@@ -1 +1 @@
-alt/error_redef_1alt4_alt4.nit:29,18: Redef Error: expected 1 parameter(s) for `f1(i: Int): Int`; got 0. See introduction at `error_redef_1alt4_alt4::A::f1`.
+alt/error_redef_1alt4_alt4.nit:29,15: Redef Error: expected 1 parameter(s) for `f1(i: Int): Int`; got 0. See introduction at `error_redef_1alt4_alt4::A::f1`.
index d970d0e..ab9e44c 100644 (file)
@@ -1,2 +1,2 @@
 alt/error_type_unk_alt2.nit:9,8--11: Error: class `Fail` not found in module `error_type_unk_alt2`.
-alt/error_type_unk_alt2.nit:11,8--13: Error: class `Fail` not found in module `error_type_unk_alt2`.
+alt/error_type_unk_alt2.nit:11,8--14: Error: class `Fail` not found in module `error_type_unk_alt2`.
index ab1b279..92b9dfd 100644 (file)
@@ -1 +1 @@
-error_virtual_type2.nit:40,17--26: Redef Error: expected `G[T]` bound type; got `G[Discrete]`.
+error_virtual_type2.nit:40,17--27: Redef Error: expected `G[T]` bound type; got `G[Discrete]`.
index cbecfd2..102039e 100644 (file)
@@ -1,5 +1,5 @@
-alt/error_virtual_type2_alt1.nit:22,2--24,13: Error: circularity of virtual type definition: GT -> T <-> T.
+alt/error_virtual_type2_alt1.nit:22,2--24,14: Error: circularity of virtual type definition: GT -> T <-> T.
 alt/error_virtual_type2_alt1.nit:25,2--10: Error: circularity of virtual type definition: T <-> T.
 alt/error_virtual_type2_alt1.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
-alt/error_virtual_type2_alt1.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt1.nit:40,17--27: Redef Error: expected `null` bound type; got `G[Discrete]`.
 alt/error_virtual_type2_alt1.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
index 64d40fb..a591422 100644 (file)
@@ -1,5 +1,5 @@
-alt/error_virtual_type2_alt2.nit:22,2--24,13: Error: circularity of virtual type definition: GT -> T <-> nullable T.
+alt/error_virtual_type2_alt2.nit:22,2--24,14: Error: circularity of virtual type definition: GT -> T <-> nullable T.
 alt/error_virtual_type2_alt2.nit:25,2--26,19: Error: circularity of virtual type definition: T <-> nullable T.
 alt/error_virtual_type2_alt2.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
-alt/error_virtual_type2_alt2.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt2.nit:40,17--27: Redef Error: expected `null` bound type; got `G[Discrete]`.
 alt/error_virtual_type2_alt2.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
index d0f163d..0a01c3d 100644 (file)
@@ -1,5 +1,5 @@
-alt/error_virtual_type2_alt3.nit:22,2--24,13: Error: circularity of virtual type definition: GT -> G[T] <-> T.
-alt/error_virtual_type2_alt3.nit:25,2--27,12: Error: circularity of virtual type definition: T <-> G[T].
+alt/error_virtual_type2_alt3.nit:22,2--24,14: Error: circularity of virtual type definition: GT -> G[T] <-> T.
+alt/error_virtual_type2_alt3.nit:25,2--27,13: Error: circularity of virtual type definition: T <-> G[T].
 alt/error_virtual_type2_alt3.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
-alt/error_virtual_type2_alt3.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt3.nit:40,17--27: Redef Error: expected `null` bound type; got `G[Discrete]`.
 alt/error_virtual_type2_alt3.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
index 521bd6a..4d60ab3 100644 (file)
@@ -1,4 +1,4 @@
 alt/error_virtual_type2_alt4.nit:29,10--13: Error: class `FAIL` not found in module `error_virtual_type2_alt4`.
 alt/error_virtual_type2_alt4.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
-alt/error_virtual_type2_alt4.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt4.nit:40,17--27: Redef Error: expected `null` bound type; got `G[Discrete]`.
 alt/error_virtual_type2_alt4.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
index 5d3086a..62974d7 100644 (file)
@@ -1,5 +1,5 @@
-alt/error_virtual_type2_alt5.nit:22,2--24,13: Error: circularity of virtual type definition: GT -> T <-> U.
+alt/error_virtual_type2_alt5.nit:22,2--24,14: Error: circularity of virtual type definition: GT -> T <-> U.
 alt/error_virtual_type2_alt5.nit:25,2--30,10: Error: circularity of virtual type definition: T <-> U.
 alt/error_virtual_type2_alt5.nit:38,23: Redef Error: expected `Comparable` for return type; got `T`.
-alt/error_virtual_type2_alt5.nit:40,17--26: Redef Error: expected `null` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt5.nit:40,17--27: Redef Error: expected `null` bound type; got `G[Discrete]`.
 alt/error_virtual_type2_alt5.nit:42,23: Redef Error: expected `Comparable` for return type; got `T`.
index 964af31..48dc700 100644 (file)
@@ -1,2 +1,2 @@
-alt/error_virtual_type2_alt6.nit:40,17--26: Redef Error: expected `G[T]` bound type; got `G[Discrete]`.
-alt/error_virtual_type2_alt6.nit:41,2--22: Error: a property `GT` is already defined in class `B` at line 39.
+alt/error_virtual_type2_alt6.nit:40,17--27: Redef Error: expected `G[T]` bound type; got `G[Discrete]`.
+alt/error_virtual_type2_alt6.nit:41,2--23: Error: a property `GT` is already defined in class `B` at line 39.
index 359a845..7514f5f 100644 (file)
@@ -1,2 +1,2 @@
 alt/error_virtual_type_alt3.nit:25,12: Type Error: expected `Object`, got `T`.
-alt/error_virtual_type_alt3.nit:22,2--25,12: Error: circularity of virtual type definition: T <-> G[T].
+alt/error_virtual_type_alt3.nit:22,2--25,13: Error: circularity of virtual type definition: T <-> G[T].
index b929fb0..4000211 100644 (file)
@@ -1,4 +1,4 @@
 base_isa_gen1.nit:62,8--14: Warning: expression is already a `A` since it is a `F`.
-base_isa_gen1.nit:65,8--29: Warning: expression is already a `D[Object, Object]` since it is a `G[Object]`.
-base_isa_gen1.nit:66,8--29: Warning: expression is already a `D[Object, Object]` since it is a `E[F]`.
+base_isa_gen1.nit:65,8--30: Warning: expression is already a `D[Object, Object]` since it is a `G[Object]`.
+base_isa_gen1.nit:66,8--30: Warning: expression is already a `D[Object, Object]` since it is a `E[F]`.
 Runtime error: Assert failed (base_isa_gen1.nit:68)
index 47f5a1a..203c263 100644 (file)
@@ -1,5 +1,5 @@
 base_isa_gen4.nit:34,8--15: Warning: expression is already a `A` since it is a `B[Canard]`.
-base_isa_gen4.nit:36,8--22: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
-base_isa_gen4.nit:40,8--24: Warning: expression is already a `B[B[Canard]]`.
-base_isa_gen4.nit:42,8--24: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
+base_isa_gen4.nit:36,8--23: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
+base_isa_gen4.nit:40,8--26: Warning: expression is already a `B[B[Canard]]`.
+base_isa_gen4.nit:42,8--26: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
 Runtime error: Assert failed (base_isa_gen4.nit:37)
index 74ee1c6..26754cf 100644 (file)
@@ -1,5 +1,5 @@
 base_isa_gen5.nit:39,8--15: Warning: expression is already a `A` since it is a `B[Canard]`.
-base_isa_gen5.nit:41,8--22: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
-base_isa_gen5.nit:46,8--24: Warning: expression is already a `B[B[Canard]]`.
-base_isa_gen5.nit:48,8--24: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
+base_isa_gen5.nit:41,8--23: Warning: expression is already a `B[Animal]` since it is a `B[Canard]`.
+base_isa_gen5.nit:46,8--26: Warning: expression is already a `B[B[Canard]]`.
+base_isa_gen5.nit:48,8--26: Warning: expression is already a `B[B[Animal]]` since it is a `B[B[Canard]]`.
 Runtime error: Assert failed (base_isa_gen5.nit:42)
index 1b28872..ff43ba5 100644 (file)
@@ -1,6 +1,6 @@
 base_isa_nullable1.nit:39,8--15: Warning: expression is already a `A` since it is a `B[Integer]`.
-base_isa_nullable1.nit:41,8--24: Warning: expression is already a `B[Discrete]` since it is a `B[Integer]`.
-base_isa_nullable1.nit:46,8--25: Warning: expression is already a `B[B[Integer]]`.
-base_isa_nullable1.nit:48,8--26: Warning: expression is already a `B[B[Discrete]]` since it is a `B[B[Integer]]`.
-base_isa_nullable1.nit:50,8--33: Warning: expression is already a `B[nullable Discrete]` since it is a `B[Discrete]`.
+base_isa_nullable1.nit:41,8--25: Warning: expression is already a `B[Discrete]` since it is a `B[Integer]`.
+base_isa_nullable1.nit:46,8--27: Warning: expression is already a `B[B[Integer]]`.
+base_isa_nullable1.nit:48,8--28: Warning: expression is already a `B[B[Discrete]]` since it is a `B[B[Integer]]`.
+base_isa_nullable1.nit:50,8--34: Warning: expression is already a `B[nullable Discrete]` since it is a `B[Discrete]`.
 Runtime error: Assert failed (base_isa_nullable1.nit:42)
index 5255183..84216d5 100644 (file)
@@ -1,5 +1,5 @@
 base_isa_nullable2.nit:27,8--23: Warning: expression is already a `nullable A` since it is a `A`.
-base_isa_nullable2.nit:29,8--30: Warning: expression is already a `nullable B[Object]` since it is a `B[Object]`.
-base_isa_nullable2.nit:30,8--39: Warning: expression is already a `nullable B[nullable Object]` since it is a `nullable B[Object]`.
-base_isa_nullable2.nit:33,8--30: Warning: expression is already a `C[nullable Object]`.
+base_isa_nullable2.nit:29,8--31: Warning: expression is already a `nullable B[Object]` since it is a `B[Object]`.
+base_isa_nullable2.nit:30,8--40: Warning: expression is already a `nullable B[nullable Object]` since it is a `nullable B[Object]`.
+base_isa_nullable2.nit:33,8--31: Warning: expression is already a `C[nullable Object]`.
 Runtime error: Assert failed (base_isa_nullable2.nit:32)
index 73ce784..c3c9801 100644 (file)
@@ -402,41 +402,41 @@ Distribution of direct smallers
   <=8: sub-population=1 (14.28%); cumulated value=6 (100.00%)
 --- AST Metrics ---
 ## All nodes of the AST
- population: 48
+ population: 50
  minimum value: 1
  maximum value: 40
- total value: 261
- average value: 5.43
+ total value: 270
+ average value: 5.40
  distribution:
-  <=1: sub-population=15 (31.25%); cumulated value=15 (5.74%)
-  <=2: sub-population=5 (10.41%); cumulated value=10 (3.83%)
-  <=4: sub-population=10 (20.83%); cumulated value=32 (12.26%)
-  <=8: sub-population=10 (20.83%); cumulated value=64 (24.52%)
-  <=16: sub-population=4 (8.33%); cumulated value=44 (16.85%)
-  <=32: sub-population=3 (6.25%); cumulated value=56 (21.45%)
-  <=64: sub-population=1 (2.08%); cumulated value=40 (15.32%)
+  <=1: sub-population=16 (32.00%); cumulated value=16 (5.92%)
+  <=2: sub-population=5 (10.00%); cumulated value=10 (3.70%)
+  <=4: sub-population=9 (18.00%); cumulated value=28 (10.37%)
+  <=8: sub-population=12 (24.00%); cumulated value=76 (28.14%)
+  <=16: sub-population=4 (8.00%); cumulated value=44 (16.29%)
+  <=32: sub-population=3 (6.00%); cumulated value=56 (20.74%)
+  <=64: sub-population=1 (2.00%); cumulated value=40 (14.81%)
  list:
-  TId: 40 (15.32%)
-  APublicVisibility: 19 (7.27%)
-  AListExprs: 19 (7.27%)
-  ACallExpr: 18 (6.89%)
-  TClassid: 15 (5.74%)
-  TNumber: 10 (3.83%)
-  ADecIntExpr: 10 (3.83%)
-  AType: 9 (3.44%)
-  TKwend: 8 (3.06%)
-  ASignature: 8 (3.06%)
+  TId: 40 (14.81%)
+  APublicVisibility: 19 (7.03%)
+  AListExprs: 19 (7.03%)
+  ACallExpr: 18 (6.66%)
+  TClassid: 15 (5.55%)
+  TNumber: 10 (3.70%)
+  ADecIntExpr: 10 (3.70%)
+  AType: 9 (3.33%)
+  TKwend: 8 (2.96%)
+  ASignature: 8 (2.96%)
   ...
-  ACallAssignExpr: 1 (0.38%)
-  AAnnotations: 1 (0.38%)
-  AReturnExpr: 1 (0.38%)
-  TKwreturn: 1 (0.38%)
-  AInterfaceClasskind: 1 (0.38%)
-  TKwinterface: 1 (0.38%)
-  ANoImport: 1 (0.38%)
-  AMainMethPropdef: 1 (0.38%)
-  AMainClassdef: 1 (0.38%)
-  TKwimport: 1 (0.38%)
+  ASelfExpr: 1 (0.37%)
+  AAnnotations: 1 (0.37%)
+  ACallAssignExpr: 1 (0.37%)
+  TKwreturn: 1 (0.37%)
+  AInterfaceClasskind: 1 (0.37%)
+  TKwinterface: 1 (0.37%)
+  ANoImport: 1 (0.37%)
+  AMainMethPropdef: 1 (0.37%)
+  AMainClassdef: 1 (0.37%)
+  TKwimport: 1 (0.37%)
 ## All identifiers of the AST
  population: 20
  minimum value: 1
index 7a8fe04..b63845a 100644 (file)
@@ -34,9 +34,8 @@ fun errno: Int is extern `{
        return errno;
 `}
 
-fun errnoooooooooooooooooooooooooooooooooooooooooooooooooooooooooo: Int is extern `{
-        return errno;
-`}
+fun errnoooooooooooooooooooooooooooooooooooooooooooooooooooooooooo: Int is
+       extern `{ return errno; `}
 
 private class A
        var my_attr = 1234
index 67755e7..9357190 100644 (file)
@@ -4,7 +4,7 @@ test_attr_easy.nit:19,31--39: Warning: expression is already a `Int`.
 test_attr_easy.nit:19,43--53: Warning: expression is already a `Float`.
 test_attr_easy.nit:20,5--16: Warning: expression is already a `String`.
 test_attr_easy.nit:20,20--26: Warning: expression is already a `B`.
-test_attr_easy.nit:20,44--62: Warning: expression is already a `HashMap[Int, B]`.
+test_attr_easy.nit:20,44--63: Warning: expression is already a `HashMap[Int, B]`.
 true false 12345 1.235 asdf true
 an instance of B
 true true true true
index 1f99f54..9172e4f 100644 (file)
@@ -41,6 +41,7 @@ Start ../src/test_parser.nit:17,1--156,1
         TId "rank" ../src/test_parser.nit:27,14--17
         AType ../src/test_parser.nit:27,20--22
           TClassid "Int" ../src/test_parser.nit:27,20--22
+        TAssign "=" ../src/test_parser.nit:27,24
         ADecIntExpr ../src/test_parser.nit:27,26
           TNumber "0" ../src/test_parser.nit:27,26
       AMethPropdef ../src/test_parser.nit:28,2--38,4
@@ -54,6 +55,7 @@ Start ../src/test_parser.nit:17,1--156,1
           AParam ../src/test_parser.nit:28,18
             TId "n" ../src/test_parser.nit:28,18
           TCpar ")" ../src/test_parser.nit:28,19
+        TKwdo "do" ../src/test_parser.nit:29,2--3
         ABlockExpr ../src/test_parser.nit:30,3--38,4
           AIfExpr ../src/test_parser.nit:30,3--34,5
             TKwif "if" ../src/test_parser.nit:30,3--4
@@ -65,6 +67,7 @@ Start ../src/test_parser.nit:17,1--156,1
               TKwisa "isa" ../src/test_parser.nit:30,8--10
               AType ../src/test_parser.nit:30,12--16
                 TClassid "Token" ../src/test_parser.nit:30,12--16
+            TKwthen "then" ../src/test_parser.nit:30,18--21
             ABlockExpr ../src/test_parser.nit:31,4--88
               ACallExpr ../src/test_parser.nit:31,4--88
                 AImplicitSelfExpr ../src/test_parser.nit:31,4
@@ -110,6 +113,7 @@ Start ../src/test_parser.nit:17,1--156,1
                   AStringExpr ../src/test_parser.nit:31,84--87
                     TString "\"\\n\"" ../src/test_parser.nit:31,84--87
                   TCpar ")" ../src/test_parser.nit:31,88
+            TKwelse "else" ../src/test_parser.nit:32,3--6
             ABlockExpr ../src/test_parser.nit:33,4--34,5
               ACallExpr ../src/test_parser.nit:33,4--59
                 AImplicitSelfExpr ../src/test_parser.nit:33,4
@@ -267,6 +271,7 @@ Start ../src/test_parser.nit:17,1--156,1
                   TEq "==" ../src/test_parser.nit:49,16--17
                   AStringExpr ../src/test_parser.nit:49,19--22
                     TString "\"-n\"" ../src/test_parser.nit:49,19--22
+                TKwthen "then" ../src/test_parser.nit:49,24--27
                 ABlockExpr ../src/test_parser.nit:50,3--17
                   ACallAssignExpr ../src/test_parser.nit:50,3--17
                     AImplicitSelfExpr ../src/test_parser.nit:50,3
@@ -275,6 +280,7 @@ Start ../src/test_parser.nit:17,1--156,1
                     TAssign "=" ../src/test_parser.nit:50,12
                     ATrueExpr ../src/test_parser.nit:50,14--17
                       TKwtrue "true" ../src/test_parser.nit:50,14--17
+                TKwelse "else" ../src/test_parser.nit:51,2--5
                 AIfExpr ../src/test_parser.nit:51,7--66,4
                   TKwif "if" ../src/test_parser.nit:51,7--8
                   AEqExpr ../src/test_parser.nit:51,10--27
@@ -288,6 +294,7 @@ Start ../src/test_parser.nit:17,1--156,1
                     TEq "==" ../src/test_parser.nit:51,21--22
                     AStringExpr ../src/test_parser.nit:51,24--27
                       TString "\"-l\"" ../src/test_parser.nit:51,24--27
+                  TKwthen "then" ../src/test_parser.nit:51,29--32
                   ABlockExpr ../src/test_parser.nit:52,3--19
                     ACallAssignExpr ../src/test_parser.nit:52,3--19
                       AImplicitSelfExpr ../src/test_parser.nit:52,3
@@ -296,6 +303,7 @@ Start ../src/test_parser.nit:17,1--156,1
                       TAssign "=" ../src/test_parser.nit:52,14
                       ATrueExpr ../src/test_parser.nit:52,16--19
                         TKwtrue "true" ../src/test_parser.nit:52,16--19
+                  TKwelse "else" ../src/test_parser.nit:53,2--5
                   AIfExpr ../src/test_parser.nit:53,7--66,4
                     TKwif "if" ../src/test_parser.nit:53,7--8
                     AEqExpr ../src/test_parser.nit:53,10--27
@@ -309,6 +317,7 @@ Start ../src/test_parser.nit:17,1--156,1
                       TEq "==" ../src/test_parser.nit:53,21--22
                       AStringExpr ../src/test_parser.nit:53,24--27
                         TString "\"-p\"" ../src/test_parser.nit:53,24--27
+                    TKwthen "then" ../src/test_parser.nit:53,29--32
                     ABlockExpr ../src/test_parser.nit:54,3--20
                       ACallAssignExpr ../src/test_parser.nit:54,3--20
                         AImplicitSelfExpr ../src/test_parser.nit:54,3
@@ -317,6 +326,7 @@ Start ../src/test_parser.nit:17,1--156,1
                         TAssign "=" ../src/test_parser.nit:54,14
                         AFalseExpr ../src/test_parser.nit:54,16--20
                           TKwfalse "false" ../src/test_parser.nit:54,16--20
+                    TKwelse "else" ../src/test_parser.nit:55,2--5
                     AIfExpr ../src/test_parser.nit:55,7--66,4
                       TKwif "if" ../src/test_parser.nit:55,7--8
                       AEqExpr ../src/test_parser.nit:55,10--27
@@ -330,6 +340,7 @@ Start ../src/test_parser.nit:17,1--156,1
                         TEq "==" ../src/test_parser.nit:55,21--22
                         AStringExpr ../src/test_parser.nit:55,24--27
                           TString "\"-x\"" ../src/test_parser.nit:55,24--27
+                      TKwthen "then" ../src/test_parser.nit:55,29--32
                       ABlockExpr ../src/test_parser.nit:56,3--12
                         ACallAssignExpr ../src/test_parser.nit:56,3--12
                           AImplicitSelfExpr ../src/test_parser.nit:56,3
@@ -338,6 +349,7 @@ Start ../src/test_parser.nit:17,1--156,1
                           TAssign "=" ../src/test_parser.nit:56,7
                           ATrueExpr ../src/test_parser.nit:56,9--12
                             TKwtrue "true" ../src/test_parser.nit:56,9--12
+                      TKwelse "else" ../src/test_parser.nit:57,2--5
                       AIfExpr ../src/test_parser.nit:57,7--66,4
                         TKwif "if" ../src/test_parser.nit:57,7--8
                         AEqExpr ../src/test_parser.nit:57,10--27
@@ -351,6 +363,7 @@ Start ../src/test_parser.nit:17,1--156,1
                           TEq "==" ../src/test_parser.nit:57,21--22
                           AStringExpr ../src/test_parser.nit:57,24--27
                             TString "\"-e\"" ../src/test_parser.nit:57,24--27
+                        TKwthen "then" ../src/test_parser.nit:57,29--32
                         ABlockExpr ../src/test_parser.nit:58,3--16
                           ACallAssignExpr ../src/test_parser.nit:58,3--16
                             AImplicitSelfExpr ../src/test_parser.nit:58,3
@@ -359,6 +372,7 @@ Start ../src/test_parser.nit:17,1--156,1
                             TAssign "=" ../src/test_parser.nit:58,11
                             ATrueExpr ../src/test_parser.nit:58,13--16
                               TKwtrue "true" ../src/test_parser.nit:58,13--16
+                        TKwelse "else" ../src/test_parser.nit:59,2--5
                         AIfExpr ../src/test_parser.nit:59,7--66,4
                           TKwif "if" ../src/test_parser.nit:59,7--8
                           AEqExpr ../src/test_parser.nit:59,10--27
@@ -372,6 +386,7 @@ Start ../src/test_parser.nit:17,1--156,1
                             TEq "==" ../src/test_parser.nit:59,21--22
                             AStringExpr ../src/test_parser.nit:59,24--27
                               TString "\"-i\"" ../src/test_parser.nit:59,24--27
+                          TKwthen "then" ../src/test_parser.nit:59,29--32
                           ABlockExpr ../src/test_parser.nit:60,3--20
                             ACallAssignExpr ../src/test_parser.nit:60,3--20
                               AImplicitSelfExpr ../src/test_parser.nit:60,3
@@ -380,6 +395,7 @@ Start ../src/test_parser.nit:17,1--156,1
                               TAssign "=" ../src/test_parser.nit:60,15
                               ATrueExpr ../src/test_parser.nit:60,17--20
                                 TKwtrue "true" ../src/test_parser.nit:60,17--20
+                          TKwelse "else" ../src/test_parser.nit:61,2--5
                           AIfExpr ../src/test_parser.nit:61,7--66,4
                             TKwif "if" ../src/test_parser.nit:61,7--8
                             AOrExpr ../src/test_parser.nit:61,10--49
@@ -406,6 +422,7 @@ Start ../src/test_parser.nit:17,1--156,1
                                 TEq "==" ../src/test_parser.nit:61,43--44
                                 AStringExpr ../src/test_parser.nit:61,46--49
                                   TString "\"-?\"" ../src/test_parser.nit:61,46--49
+                            TKwthen "then" ../src/test_parser.nit:61,51--54
                             ABlockExpr ../src/test_parser.nit:62,3--18
                               ACallAssignExpr ../src/test_parser.nit:62,3--18
                                 AImplicitSelfExpr ../src/test_parser.nit:62,3
@@ -414,6 +431,7 @@ Start ../src/test_parser.nit:17,1--156,1
                                 TAssign "=" ../src/test_parser.nit:62,13
                                 ATrueExpr ../src/test_parser.nit:62,15--18
                                   TKwtrue "true" ../src/test_parser.nit:62,15--18
+                            TKwelse "else" ../src/test_parser.nit:63,2--5
                             ABlockExpr ../src/test_parser.nit:64,3--66,4
                               ACallExpr ../src/test_parser.nit:64,3--48
                                 ACallExpr ../src/test_parser.nit:64,3--8
@@ -479,6 +497,7 @@ Start ../src/test_parser.nit:17,1--156,1
                 AImplicitSelfExpr ../src/test_parser.nit:70,43
                 TId "need_help" ../src/test_parser.nit:70,43--51
                 AListExprs ../src/test_parser.nit:70,51
+            TKwthen "then" ../src/test_parser.nit:70,53--56
             ABlockExpr ../src/test_parser.nit:71,2--82,30
               ACallExpr ../src/test_parser.nit:71,2--16
                 AImplicitSelfExpr ../src/test_parser.nit:71,2
@@ -576,12 +595,14 @@ Start ../src/test_parser.nit:17,1--156,1
                   AStringExpr ../src/test_parser.nit:82,8--29
                     TString "\"  -h\tprint this help\"" ../src/test_parser.nit:82,8--29
                   TCpar ")" ../src/test_parser.nit:82,30
+            TKwelse "else" ../src/test_parser.nit:83,1--4
             AIfExpr ../src/test_parser.nit:83,6--155,3
               TKwif "if" ../src/test_parser.nit:83,6--7
               ACallExpr ../src/test_parser.nit:83,9--19
                 AImplicitSelfExpr ../src/test_parser.nit:83,9
                 TId "interactive" ../src/test_parser.nit:83,9--19
                 AListExprs ../src/test_parser.nit:83,19
+              TKwthen "then" ../src/test_parser.nit:83,21--24
               ABlockExpr ../src/test_parser.nit:84,2--117,4
                 AIfExpr ../src/test_parser.nit:84,2--93,4
                   TKwif "if" ../src/test_parser.nit:84,2--3
@@ -589,6 +610,7 @@ Start ../src/test_parser.nit:17,1--156,1
                     AImplicitSelfExpr ../src/test_parser.nit:84,5
                     TId "only_lexer" ../src/test_parser.nit:84,5--14
                     AListExprs ../src/test_parser.nit:84,14
+                  TKwthen "then" ../src/test_parser.nit:84,16--19
                   ABlockExpr ../src/test_parser.nit:85,3--86,8
                     ACallExpr ../src/test_parser.nit:85,3--43
                       AImplicitSelfExpr ../src/test_parser.nit:85,3
@@ -602,12 +624,14 @@ Start ../src/test_parser.nit:17,1--156,1
                       AListExprs ../src/test_parser.nit:86,8
                         ADecIntExpr ../src/test_parser.nit:86,8
                           TNumber "1" ../src/test_parser.nit:86,8
+                  TKwelse "else" ../src/test_parser.nit:87,2--5
                   AIfExpr ../src/test_parser.nit:87,7--93,4
                     TKwif "if" ../src/test_parser.nit:87,7--8
                     ACallExpr ../src/test_parser.nit:87,10--16
                       AImplicitSelfExpr ../src/test_parser.nit:87,10
                       TId "no_file" ../src/test_parser.nit:87,10--16
                       AListExprs ../src/test_parser.nit:87,16
+                    TKwthen "then" ../src/test_parser.nit:87,18--21
                     ABlockExpr ../src/test_parser.nit:88,3--89,8
                       ACallExpr ../src/test_parser.nit:88,3--43
                         AImplicitSelfExpr ../src/test_parser.nit:88,3
@@ -621,6 +645,7 @@ Start ../src/test_parser.nit:17,1--156,1
                         AListExprs ../src/test_parser.nit:89,8
                           ADecIntExpr ../src/test_parser.nit:89,8
                             TNumber "1" ../src/test_parser.nit:89,8
+                    TKwelse "else" ../src/test_parser.nit:90,2--5
                     AIfExpr ../src/test_parser.nit:90,7--93,4
                       TKwif "if" ../src/test_parser.nit:90,7--8
                       ANotExpr ../src/test_parser.nit:90,10--26
@@ -632,6 +657,7 @@ Start ../src/test_parser.nit:17,1--156,1
                             AListExprs ../src/test_parser.nit:90,17
                           TId "is_empty" ../src/test_parser.nit:90,19--26
                           AListExprs ../src/test_parser.nit:90,26
+                      TKwthen "then" ../src/test_parser.nit:90,28--31
                       ABlockExpr ../src/test_parser.nit:91,3--92,8
                         ACallExpr ../src/test_parser.nit:91,3--43
                           AImplicitSelfExpr ../src/test_parser.nit:91,3
@@ -684,6 +710,7 @@ Start ../src/test_parser.nit:17,1--156,1
                         TKwisa "isa" ../src/test_parser.nit:99,8--10
                         AType ../src/test_parser.nit:99,12--18
                           TClassid "TString" ../src/test_parser.nit:99,12--18
+                      TKwthen "then" ../src/test_parser.nit:99,20--23
                       ABlockExpr ../src/test_parser.nit:100,4--106,11
                         AVardeclExpr ../src/test_parser.nit:100,4--17
                           TKwvar "var" ../src/test_parser.nit:100,4--6
@@ -706,9 +733,11 @@ Start ../src/test_parser.nit:17,1--156,1
                             TEq "==" ../src/test_parser.nit:101,9--10
                             AStringExpr ../src/test_parser.nit:101,12--15
                               TString "\":q\"" ../src/test_parser.nit:101,12--15
+                          TKwthen "then" ../src/test_parser.nit:101,17--20
                           ABlockExpr ../src/test_parser.nit:102,5--9
                             ABreakExpr ../src/test_parser.nit:102,5--9
                               TKwbreak "break" ../src/test_parser.nit:102,5--9
+                          TKwelse "else" ../src/test_parser.nit:103,4--7
                           ABlockExpr ../src/test_parser.nit:104,5--105,6
                             ACallExpr ../src/test_parser.nit:104,5--24
                               AImplicitSelfExpr ../src/test_parser.nit:104,5
@@ -731,6 +760,7 @@ Start ../src/test_parser.nit:17,1--156,1
                         TKwisa "isa" ../src/test_parser.nit:109,8--10
                         AType ../src/test_parser.nit:109,12--17
                           TClassid "AError" ../src/test_parser.nit:109,12--17
+                      TKwthen "then" ../src/test_parser.nit:109,19--22
                       ABlockExpr ../src/test_parser.nit:110,4--111,11
                         ACallExpr ../src/test_parser.nit:110,4--57
                           AImplicitSelfExpr ../src/test_parser.nit:110,4
@@ -776,6 +806,7 @@ Start ../src/test_parser.nit:17,1--156,1
                           AImplicitSelfExpr ../src/test_parser.nit:114,10
                           TId "no_print" ../src/test_parser.nit:114,10--17
                           AListExprs ../src/test_parser.nit:114,17
+                      TKwthen "then" ../src/test_parser.nit:114,19--22
                       ABlockExpr ../src/test_parser.nit:115,4--40
                         ACallExpr ../src/test_parser.nit:115,4--40
                           AParExpr ../src/test_parser.nit:115,4--25
@@ -797,10 +828,12 @@ Start ../src/test_parser.nit:17,1--156,1
                       ABlockExpr ../src/test_parser.nit:116,3--5
                         TKwend "end" ../src/test_parser.nit:116,3--5
                     TKwend "end" ../src/test_parser.nit:117,2--4
+              TKwelse "else" ../src/test_parser.nit:118,1--4
               ABlockExpr ../src/test_parser.nit:119,2--155,3
                 AForExpr ../src/test_parser.nit:119,2--154,4
                   TKwfor "for" ../src/test_parser.nit:119,2--4
                   TId "a" ../src/test_parser.nit:119,6
+                  TKwin "in" ../src/test_parser.nit:119,8--9
                   ACallExpr ../src/test_parser.nit:119,11--14
                     AImplicitSelfExpr ../src/test_parser.nit:119,11
                     TId "args" ../src/test_parser.nit:119,11--14
@@ -816,6 +849,7 @@ Start ../src/test_parser.nit:17,1--156,1
                         AImplicitSelfExpr ../src/test_parser.nit:121,6
                         TId "no_file" ../src/test_parser.nit:121,6--12
                         AListExprs ../src/test_parser.nit:121,12
+                      TKwthen "then" ../src/test_parser.nit:121,14--17
                       ABlockExpr ../src/test_parser.nit:122,4--45
                         ACallAssignExpr ../src/test_parser.nit:122,4--45
                           AImplicitSelfExpr ../src/test_parser.nit:122,4
@@ -836,6 +870,7 @@ Start ../src/test_parser.nit:17,1--156,1
                                 TId "a" ../src/test_parser.nit:122,44
                                 AListExprs ../src/test_parser.nit:122,44
                               TCpar ")" ../src/test_parser.nit:122,45
+                      TKwelse "else" ../src/test_parser.nit:123,3--6
                       ABlockExpr ../src/test_parser.nit:124,4--127,5
                         AVardeclExpr ../src/test_parser.nit:124,4--33
                           TKwvar "var" ../src/test_parser.nit:124,4--6
@@ -902,6 +937,7 @@ Start ../src/test_parser.nit:17,1--156,1
                         AImplicitSelfExpr ../src/test_parser.nit:129,6
                         TId "only_lexer" ../src/test_parser.nit:129,6--15
                         AListExprs ../src/test_parser.nit:129,15
+                      TKwthen "then" ../src/test_parser.nit:129,17--20
                       ABlockExpr ../src/test_parser.nit:130,4--136,6
                         AVardeclExpr ../src/test_parser.nit:130,4--25
                           TKwvar "var" ../src/test_parser.nit:130,4--6
@@ -936,6 +972,7 @@ Start ../src/test_parser.nit:17,1--156,1
                                   AImplicitSelfExpr ../src/test_parser.nit:132,12
                                   TId "no_print" ../src/test_parser.nit:132,12--19
                                   AListExprs ../src/test_parser.nit:132,19
+                              TKwthen "then" ../src/test_parser.nit:132,21--24
                               ABlockExpr ../src/test_parser.nit:133,6--64
                                 ACallExpr ../src/test_parser.nit:133,6--64
                                   AImplicitSelfExpr ../src/test_parser.nit:133,6
@@ -979,6 +1016,7 @@ Start ../src/test_parser.nit:17,1--156,1
                                 TId "next" ../src/test_parser.nit:135,19--22
                                 AListExprs ../src/test_parser.nit:135,22
                             TKwend "end" ../src/test_parser.nit:136,4--6
+                      TKwelse "else" ../src/test_parser.nit:137,3--6
                       ABlockExpr ../src/test_parser.nit:138,4--153,5
                         AVardeclExpr ../src/test_parser.nit:138,4--33
                           TKwvar "var" ../src/test_parser.nit:138,4--6
@@ -1027,6 +1065,7 @@ Start ../src/test_parser.nit:17,1--156,1
                             TKwisa "isa" ../src/test_parser.nit:142,13--15
                             AType ../src/test_parser.nit:142,17--22
                               TClassid "AError" ../src/test_parser.nit:142,17--22
+                          TKwthen "then" ../src/test_parser.nit:142,24--27
                           ABlockExpr ../src/test_parser.nit:143,5--144,10
                             ACallExpr ../src/test_parser.nit:143,5--58
                               AImplicitSelfExpr ../src/test_parser.nit:143,5
@@ -1065,6 +1104,7 @@ Start ../src/test_parser.nit:17,1--156,1
                             AImplicitSelfExpr ../src/test_parser.nit:147,7
                             TId "xml" ../src/test_parser.nit:147,7--9
                             AListExprs ../src/test_parser.nit:147,9
+                          TKwthen "then" ../src/test_parser.nit:147,11--14
                           ABlockExpr ../src/test_parser.nit:148,5--149,32
                             ACallExpr ../src/test_parser.nit:148,5--25
                               ACallExpr ../src/test_parser.nit:148,5--8
@@ -1089,6 +1129,7 @@ Start ../src/test_parser.nit:17,1--156,1
                                   TId "stdout" ../src/test_parser.nit:149,26--31
                                   AListExprs ../src/test_parser.nit:149,31
                                 TCpar ")" ../src/test_parser.nit:149,32
+                          TKwelse "else" ../src/test_parser.nit:150,4--7
                           AIfExpr ../src/test_parser.nit:150,9--152,6
                             TKwif "if" ../src/test_parser.nit:150,9--10
                             ANotExpr ../src/test_parser.nit:150,12--23
@@ -1097,6 +1138,7 @@ Start ../src/test_parser.nit:17,1--156,1
                                 AImplicitSelfExpr ../src/test_parser.nit:150,16
                                 TId "no_print" ../src/test_parser.nit:150,16--23
                                 AListExprs ../src/test_parser.nit:150,23
+                            TKwthen "then" ../src/test_parser.nit:150,25--28
                             ABlockExpr ../src/test_parser.nit:151,5--44
                               ACallExpr ../src/test_parser.nit:151,5--44
                                 AParExpr ../src/test_parser.nit:151,5--26
index 34ceaf4..36683fa 100644 (file)
@@ -14,6 +14,7 @@
 --> AForExpr 1,1--15
   TKwfor "for" 1,1--3
   TId "i" 1,5
+  TKwin "in" 1,7--8
   ACallExpr 1,10
     AImplicitSelfExpr 1,10
     TId "x" 1,10
@@ -30,7 +31,8 @@
       TKwmeth "fun" 1,1--3
       AIdMethid 1,5--7
         TId "foo" 1,5--7
-      ASignature 1,12
+      ASignature 1,9
+      TKwdo "do" 1,9--10
       ACallExpr 1,12
         AImplicitSelfExpr 1,12
         TId "z" 1,12
@@ -38,6 +40,7 @@
 --> ... ... AForExpr 1,1--3,3
   TKwfor "for" 1,1--3
   TId "i" 1,5
+  TKwin "in" 1,7--8
   ACallExpr 1,10
     AImplicitSelfExpr 1,10
     TId "x" 1,10
       TKwmeth "fun" 1,1--3
       AIdMethid 1,5--7
         TId "foo" 1,5--7
-      ASignature 2,1
+      ASignature 1,9
+      TKwdo "do" 1,9--10
       ABlockExpr 2,1--5,3
         AForExpr 2,1--4,3
           TKwfor "for" 2,1--3
           TId "i" 2,5
+          TKwin "in" 2,7--8
           ACallExpr 2,10
             AImplicitSelfExpr 2,10
             TId "x" 2,10
index 510b5fb..4916f4b 100644 (file)
@@ -47,9 +47,10 @@ class MyApp
        do
                init_gtk
 
-               win = new GtkWindow( 0 )
+               win = new GtkWindow(new GtkWindowType.toplevel)
+               win.connect_destroy_signal_to_quit
 
-               container = new GtkGrid(2,1,true)
+               container = new GtkGrid
                win.add( container )
 
                lbl = new GtkLabel( "Hello world" )