]> matita.cs.unibo.it Git - helm.git/commitdiff
daemons tamed
authorStefano Zacchiroli <zack@upsilon.cc>
Thu, 2 Feb 2006 18:42:41 +0000 (18:42 +0000)
committerStefano Zacchiroli <zack@upsilon.cc>
Thu, 2 Feb 2006 18:42:41 +0000 (18:42 +0000)
119 files changed:
daemons/graphs/jsmenu/HM_Arrays.js [new file with mode: 0644]
daemons/graphs/jsmenu/HM_Arrays_prova.js [new file with mode: 0644]
daemons/graphs/jsmenu/HM_Loader.js [new file with mode: 0644]
daemons/graphs/jsmenu/HM_Loader_prova.js [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_black_left.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_black_right.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_blue_left.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_blue_right.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_cyan_left.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_cyan_right.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_green_left.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_green_right.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_magenta_left.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_magenta_right.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_red_left.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_red_right.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_white_left.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_white_right.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_yellow_left.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_More_yellow_right.gif [new file with mode: 0644]
daemons/graphs/jsmenu/HM_ScriptDOM.js [new file with mode: 0644]
daemons/graphs/jsmenu/HM_ScriptIE4.js [new file with mode: 0644]
daemons/graphs/jsmenu/HM_ScriptNS4.js [new file with mode: 0644]
daemons/graphs/jsmenu/LoadMe.html [new file with mode: 0644]
daemons/graphs/jsmenu/prova.gif [new file with mode: 0644]
daemons/graphs/jsmenu/prova.html [new file with mode: 0644]
daemons/graphs/tools/.cvsignore [new file with mode: 0644]
daemons/graphs/tools/Makefile [new file with mode: 0644]
daemons/graphs/tools/drawGraph.conf.xml.sample [new file with mode: 0644]
daemons/graphs/tools/drawGraph.ml [new file with mode: 0644]
daemons/graphs/tools/mk_html.pl [new file with mode: 0755]
daemons/graphs/tools/simplify_deps/.cvsignore [new file with mode: 0644]
daemons/graphs/tools/simplify_deps/Makefile [new file with mode: 0644]
daemons/graphs/tools/simplify_deps/simplify_deps.ml [new file with mode: 0644]
daemons/graphs/tools/uriSetQueue.conf.xml.sample [new file with mode: 0644]
daemons/graphs/tools/uriSetQueue.ml [new file with mode: 0644]
daemons/http_getter/.cvsignore [new file with mode: 0644]
daemons/http_getter/AUTHORS [new file with mode: 0644]
daemons/http_getter/BUGS [new file with mode: 0644]
daemons/http_getter/COPYING [new file with mode: 0644]
daemons/http_getter/ChangeLog [new file with mode: 0644]
daemons/http_getter/Makefile [new file with mode: 0644]
daemons/http_getter/Makefile.overrides [new file with mode: 0644]
daemons/http_getter/NEWS [new file with mode: 0644]
daemons/http_getter/README [new file with mode: 0644]
daemons/http_getter/buildTimeOpts.ml.in [new file with mode: 0644]
daemons/http_getter/configure.ac [new file with mode: 0644]
daemons/http_getter/http_getter.conf.xml.sample [new file with mode: 0644]
daemons/http_getter/main.ml [new file with mode: 0644]
daemons/http_getter/panel/.cvsignore [new file with mode: 0644]
daemons/http_getter/panel/Makefile [new file with mode: 0644]
daemons/http_getter/panel/control.html [new file with mode: 0644]
daemons/http_getter/panel/control.js [new file with mode: 0644]
daemons/http_getter/panel/index.html [new file with mode: 0644]
daemons/http_getter/panel/welcome.html [new file with mode: 0644]
daemons/http_getter/tools/dump_db.ml [new file with mode: 0755]
daemons/http_getter/tools/dump_db.pl [new file with mode: 0755]
daemons/http_getter/tools/uri_escape.pl [new file with mode: 0755]
daemons/http_getter/tools/uri_unescape.pl [new file with mode: 0755]
daemons/proofChecker/.cvsignore [new file with mode: 0644]
daemons/proofChecker/.depend [new file with mode: 0644]
daemons/proofChecker/Makefile [new file with mode: 0644]
daemons/proofChecker/proofChecker.conf.xml.sample [new file with mode: 0644]
daemons/proofChecker/proofChecker.ml [new file with mode: 0644]
daemons/rdfly/.cvsignore [new file with mode: 0644]
daemons/rdfly/Makefile [new file with mode: 0644]
daemons/rdfly/rdfly.conf.xml.sample [new file with mode: 0644]
daemons/rdfly/rdfly.ml [new file with mode: 0644]
daemons/uwobo/.cvsignore [new file with mode: 0644]
daemons/uwobo/.depend [new file with mode: 0644]
daemons/uwobo/Makefile [new file with mode: 0644]
daemons/uwobo/doc/uwobo.tex [new file with mode: 0644]
daemons/uwobo/log/.cvsignore [new file with mode: 0644]
daemons/uwobo/panel/.cvsignore [new file with mode: 0644]
daemons/uwobo/panel/Makefile [new file with mode: 0644]
daemons/uwobo/panel/control.html [new file with mode: 0644]
daemons/uwobo/panel/control.js [new file with mode: 0644]
daemons/uwobo/panel/index.html [new file with mode: 0644]
daemons/uwobo/panel/welcome.html [new file with mode: 0644]
daemons/uwobo/uwobo.conf.xml.sample [new file with mode: 0644]
daemons/uwobo/uwobo.ml [new file with mode: 0644]
daemons/uwobo/uwobo_common.ml [new file with mode: 0644]
daemons/uwobo/uwobo_common.mli [new file with mode: 0644]
daemons/uwobo/uwobo_engine.ml [new file with mode: 0644]
daemons/uwobo/uwobo_engine.mli [new file with mode: 0644]
daemons/uwobo/uwobo_logger.ml [new file with mode: 0644]
daemons/uwobo/uwobo_logger.mli [new file with mode: 0644]
daemons/uwobo/uwobo_profiles.ml [new file with mode: 0644]
daemons/uwobo/uwobo_profiles.mli [new file with mode: 0644]
daemons/uwobo/uwobo_styles.ml [new file with mode: 0644]
daemons/uwobo/uwobo_styles.mli [new file with mode: 0644]
daemons/whelp/.cvsignore [new file with mode: 0644]
daemons/whelp/.depend [new file with mode: 0644]
daemons/whelp/Makefile [new file with mode: 0644]
daemons/whelp/html/Makefile [new file with mode: 0644]
daemons/whelp/html/includes.xsl [new file with mode: 0644]
daemons/whelp/html/manual/alias.jpg [new file with mode: 0644]
daemons/whelp/html/manual/ex1.jpg [new file with mode: 0644]
daemons/whelp/html/manual/frames.jpg [new file with mode: 0644]
daemons/whelp/html/manual/index.html [new file with mode: 0644]
daemons/whelp/html/moogle.html.src [new file with mode: 0644]
daemons/whelp/html/moogle.png [new file with mode: 0644]
daemons/whelp/html/moogle_chat.html.src [new file with mode: 0644]
daemons/whelp/html/moogle_form.html.src [new file with mode: 0644]
daemons/whelp/html/moogle_header.html.src [new file with mode: 0644]
daemons/whelp/html/moogle_help.html [new file with mode: 0644]
daemons/whelp/html/moogle_init.html [new file with mode: 0644]
daemons/whelp/html/moogle_querybar.html.src [new file with mode: 0644]
daemons/whelp/html/moogle_small.png [new file with mode: 0644]
daemons/whelp/html/moogle_syntax.html [new file with mode: 0644]
daemons/whelp/html/moogle_trailer.html.src [new file with mode: 0644]
daemons/whelp/html/whelp.png [new file with mode: 0644]
daemons/whelp/html/whelp.svg [new file with mode: 0644]
daemons/whelp/html/whelp_small.png [new file with mode: 0644]
daemons/whelp/mooglePp.ml [new file with mode: 0644]
daemons/whelp/mooglePp.mli [new file with mode: 0644]
daemons/whelp/preloaded_uris.txt [new file with mode: 0644]
daemons/whelp/searchEngine.conf.xml.sample [new file with mode: 0644]
daemons/whelp/searchEngine.ml [new file with mode: 0644]

diff --git a/daemons/graphs/jsmenu/HM_Arrays.js b/daemons/graphs/jsmenu/HM_Arrays.js
new file mode 100644 (file)
index 0000000..467506c
--- /dev/null
@@ -0,0 +1,250 @@
+
+HM_Array1 = [
+[150,,,
+,,,,,,,,,,,,,,,,
+1,true],
+["Experts","http://www.webreference.com/experts/",1,0,1],
+["Contents","http://www.webreference.com/index2.html",1,0,0],
+["Services","http://www.webreference.com/index2.html",1,0,1],
+["About","http://www.webreference.com/about.html",1,0,0],
+["Hot Sites","http://www.webreference.com/hot/",1,0,1]
+]
+
+HM_Array1_1 = [
+[],
+["3-D Animation","http://www.webreference.com/3d/",1,0,0],
+["Design","http://www.webreference.com/dlab/",1,0,0],
+["HTML","http://www.webreference.com/html/",1,0,0],
+["JavaScript","http://www.webreference.com/js/",1,0,0],
+["Graphics","http://www.webreference.com/graphics/",1,0,0],
+["DHTML","http://www.webreference.com/dhtml/",1,0,1],
+["Perl","http://www.webreference.com/perl/",1,0,0],
+["XML","http://www.webreference.com/xml/",1,0,0]
+]
+
+HM_Array1_3 = [
+[],
+["Features","http://www.webreference.com/articles.html",1,0,0],
+["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0],
+["How-to","http://www.webreference.com/dev/",1,0,0],
+["New","http://www.webreference.com/headlines/",1,0,0],
+["Hot Sites","http://www.webreference.com/hot/",1,0,0]
+]
+
+HM_Array1_5 = [
+[],
+["3-D Animation","http://www.webreference.com/3d/",1,0,0],
+["Design","http://www.webreference.com/dlab/",1,0,0],
+["HTML","http://www.webreference.com/html/",1,0,0],
+["JavaScript","http://www.webreference.com/js/",1,0,0],
+["Graphics","http://www.webreference.com/graphics/",1,0,0],
+["DHTML","http://www.webreference.com/dhtml/",1,0,1],
+["Perl","http://www.webreference.com/perl/",1,0,0],
+["XML","http://www.webreference.com/xml/",1,0,0]
+]
+
+HM_Array1_1_6 = [
+[],
+["Diner","http://www.webreference.com/dhtml/diner/",1,0,0],
+["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0],
+["Links","http://www.webreference.com/dhtml/links/",1,0,0]
+]
+
+HM_Array2 = [
+[100,                          // menu width
+"HM_f_CenterMenu('HM_Menu2')", // left_position
+90,                            // top_position
+"red",                         // font_color
+"yellow",                      // mouseover_font_color
+"yellow",                      // background_color
+"black",                       // mouseover_background_color
+"blue",                        // border_color
+"green",                       // separator_color
+1,                             // top_is_permanent
+1,                             // top_is_horizontal
+0,                             // tree_is_horizontal
+1,                             // position_under
+1,                             // top_more_images_visible
+1,                             // tree_more_images_visible
+"null",                        // evaluate_upon_tree_show
+"null",                        // evaluate_upon_tree_hide
+,                                                         // right_to_left
+1],                                               // display_on_click
+["Experts","http://www.webreference.com/experts/",1,0,1],
+["Contents","http://www.webreference.com/index2.html",1,0,0],
+["Services","http://www.webreference.com/index2.html",1,0,1],
+["About","http://www.webreference.com/about.html",1,0,1]
+]
+
+HM_Array2_1 = [
+[],
+["3-D Animation","http://www.webreference.com/3d/",1,0,0],
+["Design","http://www.webreference.com/dlab/",1,0,0],
+["HTML","http://www.webreference.com/html/",1,0,0],
+["JavaScript","http://www.webreference.com/js/",1,0,0],
+["Graphics","http://www.webreference.com/graphics/",1,0,0],
+["DHTML","http://www.webreference.com/dhtml/",1,0,0],
+["Perl","http://www.webreference.com/perl/",1,0,0],
+["XML","http://www.webreference.com/xml/",1,0,0]
+]
+
+HM_Array2_3 = [
+[],
+["Features","http://www.webreference.com/articles.html",1,0,0],
+["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0],
+["How-to","http://www.webreference.com/dev/",1,0,0],
+["New","http://www.webreference.com/headlines/",1,0,0],
+["Hot Sites","http://www.webreference.com/hot/",1,0,0]
+]
+
+HM_Array2_4 = [
+[],
+["Features","http://www.webreference.com/articles.html",1,0,0],
+["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0],
+["How-to","http://www.webreference.com/dev/",1,0,0],
+["New","http://www.webreference.com/headlines/",1,0,0],
+["Hot Sites","http://www.webreference.com/hot/",1,0,0]
+]
+
+HM_Array2_1_6 = [
+[],
+["Diner","http://www.webreference.com/dhtml/diner/",1,0,0],
+["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0],
+["Links","http://www.webreference.com/dhtml/links/",1,0,0]
+]
+
+HM_Array3 = [
+[120,      // menu width
+200,       // left_position
+300,       // top_position
+"black",   // font_color
+"white",   // mouseover_font_color
+"white",   // background_color
+"black",   // mouseover_background_color
+"black",   // border_color
+"gray",    // separator_color
+0,         // top_is_permanent
+0,         // top_is_horizontal
+0,         // tree_is_horizontal
+1,         // position_under
+1,         // top_more_images_visible
+1,         // tree_more_images_visible
+"null",    // evaluate_upon_tree_show
+"null",    // evaluate_upon_tree_hide
+,          // right_to_left
+],     // display_on_click
+["Experts","http://www.webreference.com/experts/",1,0,1],
+["Contents","http://www.webreference.com/index2.html",1,0,0],
+["Services","http://www.webreference.com/index2.html",1,0,1],
+["About","http://www.webreference.com/about.html",1,0,0]
+]
+
+HM_Array3_1 = [
+[],
+["3-D Animation","http://www.webreference.com/3d/",1,0,0],
+["Design","http://www.webreference.com/dlab/",1,0,0],
+["HTML","http://www.webreference.com/html/",1,0,0],
+["JavaScript","http://www.webreference.com/js/",1,0,0],
+["Graphics","http://www.webreference.com/graphics/",1,0,0],
+["DHTML","http://www.webreference.com/dhtml/",1,0,1],
+["Perl","http://www.webreference.com/perl/",1,0,0],
+["XML","http://www.webreference.com/xml/",1,0,0]
+]
+
+HM_Array3_3 = [
+[],
+["Features","http://www.webreference.com/articles.html",1,0,0],
+["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0],
+["How-to","http://www.webreference.com/dev/",1,0,0],
+["New","http://www.webreference.com/headlines/",1,0,0],
+["Hot Sites","http://www.webreference.com/hot/",1,0,0]
+]
+
+HM_Array3_1_6 = [
+[],
+["Diner","http://www.webreference.com/dhtml/diner/",1,0,0],
+["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0],
+["Links","http://www.webreference.com/dhtml/links/",1,0,0]
+]
+
+HM_Array4 = [
+[120,
+"mouse_x_position + 20",
+"mouse_y_position + 20",
+,,,,,,,,,,,,,,,
+true],
+["Experts","http://www.webreference.com/experts/",1,0,1],
+["Contents","http://www.webreference.com/index2.html",1,0,0],
+["Services","http://www.webreference.com/index2.html",1,0,0],
+["About","http://www.webreference.com/about.html",1,0,0]
+]
+
+HM_Array4_1 = [
+[],
+["3-D Animation","http://www.webreference.com/3d/",1,0,0],
+["Design","http://www.webreference.com/dlab/",1,0,0],
+["HTML","http://www.webreference.com/html/",1,0,0],
+["JavaScript","http://www.webreference.com/js/",1,0,0],
+["Graphics","http://www.webreference.com/graphics/",1,0,0],
+["DHTML","http://www.webreference.com/dhtml/",1,0,0],
+["Perl","http://www.webreference.com/perl/",1,0,0],
+["XML","http://www.webreference.com/xml/",1,0,0]
+]
+
+HM_Array5 = [
+[100,                          // menu_width
+70, // left_position
+170,                            // top_position
+"red",                         // font_color
+"yellow",                      // mouseover_font_color
+"yellow",                      // background_color
+"black",                       // mouseover_background_color
+"blue",                        // border_color
+"green",                       // separator_color
+1,                             // top_is_permanent
+1,                             // top_is_horizontal
+0,                             // tree_is_horizontal
+1,                             // position_under
+0,                             // top_more_images_visible
+1,                             // tree_more_images_visible
+"null",                        // evaluate_upon_tree_show
+"null",                        // evaluate_upon_tree_hide
+,                                                         // right_to_left
+,                                                 // display_on_click
+true,                                             // top_is_variable_width
+,                                                         // tree_is_variable_width
+],
+["Experts","http://www.webreference.com/experts/",1,0,1],
+["Contents","http://www.webreference.com/index2.html",1,0,0],
+["Services","http://www.webreference.com/index2.html",1,0,1],
+["About","http://www.webreference.com/about.html",1,0,0]
+]
+
+HM_Array5_1 = [
+[],
+["3-D Animation","http://www.webreference.com/3d/",1,0,0],
+["Design","http://www.webreference.com/dlab/",1,0,0],
+["HTML","http://www.webreference.com/html/",1,0,0],
+["JavaScript","http://www.webreference.com/js/",1,0,0],
+["Graphics","http://www.webreference.com/graphics/",1,0,0],
+["DHTML","http://www.webreference.com/dhtml/",1,0,1],
+["Perl","http://www.webreference.com/perl/",1,0,0],
+["XML","http://www.webreference.com/xml/",1,0,0]
+]
+
+HM_Array5_3 = [
+[],
+["Features","http://www.webreference.com/articles.html",1,0,0],
+["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0],
+["How-to","http://www.webreference.com/dev/",1,0,0],
+["New","http://www.webreference.com/headlines/",1,0,0],
+["Hot Sites","http://www.webreference.com/hot/",1,0,0]
+]
+
+HM_Array5_1_6 = [
+[],
+["Diner","http://www.webreference.com/dhtml/diner/",1,0,0],
+["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0],
+["Links","http://www.webreference.com/dhtml/links/",1,0,0]
+]
+
diff --git a/daemons/graphs/jsmenu/HM_Arrays_prova.js b/daemons/graphs/jsmenu/HM_Arrays_prova.js
new file mode 100644 (file)
index 0000000..93143ac
--- /dev/null
@@ -0,0 +1,60 @@
+
+HM_Array1 = [
+[150,,,
+,,,,,,,,,,,,,,,,
+1,true],
+["Experts","http://www.webreference.com/experts/",1,0,1],
+["Contents","http://www.webreference.com/index2.html",1,0,0],
+["Services","http://www.webreference.com/index2.html",1,0,1],
+["About","http://www.webreference.com/about.html",1,0,0],
+["Hot Sites","http://www.webreference.com/hot/",1,0,1]
+]
+
+HM_Array1_1 = [
+[],
+["3-D Animation","http://www.webreference.com/3d/",1,0,0],
+["Design","http://www.webreference.com/dlab/",1,0,0],
+["HTML","http://www.webreference.com/html/",1,0,0],
+["JavaScript","http://www.webreference.com/js/",1,0,0],
+["Graphics","http://www.webreference.com/graphics/",1,0,0],
+["DHTML","http://www.webreference.com/dhtml/",1,0,1],
+["Perl","http://www.webreference.com/perl/",1,0,0],
+["XML","http://www.webreference.com/xml/",1,0,0]
+]
+
+HM_Array1_3 = [
+[],
+["Features","http://www.webreference.com/articles.html",1,0,0],
+["Forum","http://www.webreference.com/cgi-bin/Ultimate.cgi?action=intro",1,0,0],
+["How-to","http://www.webreference.com/dev/",1,0,0],
+["New","http://www.webreference.com/headlines/",1,0,0],
+["Hot Sites","http://www.webreference.com/hot/",1,0,0]
+]
+
+HM_Array1_5 = [
+[],
+["3-D Animation","http://www.webreference.com/3d/",1,0,0],
+["Design","http://www.webreference.com/dlab/",1,0,0],
+["HTML","http://www.webreference.com/html/",1,0,0],
+["JavaScript","http://www.webreference.com/js/",1,0,0],
+["Graphics","http://www.webreference.com/graphics/",1,0,0],
+["DHTML","http://www.webreference.com/dhtml/",1,0,1],
+["Perl","http://www.webreference.com/perl/",1,0,0],
+["XML","http://www.webreference.com/xml/",1,0,0]
+]
+
+HM_Array1_1_6 = [
+[],
+["Diner","http://www.webreference.com/dhtml/diner/",1,0,0],
+["Dynomat","http://www.webreference.com/dhtml/dynomat/",1,0,0],
+["Links","http://www.webreference.com/dhtml/links/",1,0,0]
+]
+
+HM_Array2 = [
+[150,,,
+,,,,,,,,,,,,,,,,
+1,true],
+["Pippo","http://www.inria.fr",1,0,1],
+["Pluto","http://www.cs.unibo.it",1,0,0],
+["Paperino","http://www.larepubblica.it",1,0,1],
+]
diff --git a/daemons/graphs/jsmenu/HM_Loader.js b/daemons/graphs/jsmenu/HM_Loader.js
new file mode 100644 (file)
index 0000000..2c7e31f
--- /dev/null
@@ -0,0 +1,89 @@
+/*HM_Loader.js
+* by Peter Belesis. v4.1.1 011002
+* Copyright (c) 2001 Peter Belesis. All Rights Reserved.
+*/
+
+   HM_DOM = (document.getElementById) ? true : false;
+   HM_NS4 = (document.layers) ? true : false;
+    HM_IE = (document.all) ? true : false;
+   HM_IE4 = HM_IE && !HM_DOM;
+   HM_Mac = (navigator.appVersion.indexOf("Mac") != -1);
+  HM_IE4M = HM_IE4 && HM_Mac;
+ HM_Opera = (navigator.userAgent.indexOf("Opera")!=-1);
+ HM_Konqueror = (navigator.userAgent.indexOf("Konqueror")!=-1);
+
+HM_IsMenu = !HM_Opera && !HM_Konqueror && !HM_IE4M && (HM_DOM || HM_NS4 || HM_IE4);
+
+HM_BrowserString = HM_NS4 ? "NS4" : HM_DOM ? "DOM" : "IE4";
+
+
+if(window.event + "" == "undefined") event = null;
+function HM_f_PopUp(){return false};
+function HM_f_PopDown(){return false};
+popUp = HM_f_PopUp;
+popDown = HM_f_PopDown;
+
+
+HM_GL_MenuWidth          = 150;
+HM_GL_FontFamily         = "Arial,sans-serif";
+HM_GL_FontSize           = 10;
+HM_GL_FontBold           = true;
+HM_GL_FontItalic         = false;
+HM_GL_FontColor          = "black";
+HM_GL_FontColorOver      = "white";
+HM_GL_BGColor            = "transparent";
+HM_GL_BGColorOver        = "transparent";
+HM_GL_ItemPadding        = 3;
+
+HM_GL_BorderWidth        = 2;
+HM_GL_BorderColor        = "red";
+HM_GL_BorderStyle        = "solid";
+HM_GL_SeparatorSize      = 2;
+HM_GL_SeparatorColor     = "yellow";
+
+HM_GL_ImageSrc = "HM_More_black_right.gif";
+HM_GL_ImageSrcLeft = "HM_More_black_left.gif";
+
+HM_GL_ImageSrcOver = "HM_More_white_right.gif";
+HM_GL_ImageSrcLeftOver = "HM_More_white_left.gif";
+
+HM_GL_ImageSize          = 5;
+HM_GL_ImageHorizSpace    = 5;
+HM_GL_ImageVertSpace     = 5;
+
+HM_GL_KeepHilite         = false;
+HM_GL_ClickStart         = false;
+HM_GL_ClickKill          = 0;
+HM_GL_ChildOverlap       = 40;
+HM_GL_ChildOffset        = 10;
+HM_GL_ChildPerCentOver   = null;
+HM_GL_TopSecondsVisible  = .5;
+HM_GL_ChildSecondsVisible = .3;
+HM_GL_StatusDisplayBuild = 0;
+HM_GL_StatusDisplayLink  = 1;
+HM_GL_UponDisplay        = null;
+HM_GL_UponHide           = null;
+
+HM_GL_RightToLeft      = false;
+HM_GL_CreateTopOnly      = HM_NS4 ? true : false;
+HM_GL_ShowLinkCursor     = true;
+
+// the following function is included to illustrate the improved JS expression handling of
+// the left_position and top_position parameters
+// you may delete if you have no use for it
+
+function HM_f_CenterMenu(topmenuid) {
+       var MinimumPixelLeft = 0;
+       var TheMenu = HM_DOM ? document.getElementById(topmenuid) : HM_IE4 ? document.all(topmenuid) : eval("window." + topmenuid);
+       var TheMenuWidth = HM_DOM ? parseInt(TheMenu.style.width) : HM_IE4 ? TheMenu.style.pixelWidth : TheMenu.clip.width;
+       var TheWindowWidth = HM_IE ? document.body.clientWidth : window.innerWidth;
+       return Math.max(parseInt((TheWindowWidth-TheMenuWidth) / 2),MinimumPixelLeft);
+}
+
+if(HM_IsMenu) {
+       document.write("<SCR" + "IPT LANGUAGE='JavaScript1.2' SRC='HM_Arrays.js' TYPE='text/javascript'><\/SCR" + "IPT>");
+       document.write("<SCR" + "IPT LANGUAGE='JavaScript1.2' SRC='HM_Script"+ HM_BrowserString +".js' TYPE='text/javascript'><\/SCR" + "IPT>");
+}
+
+
+//end
\ No newline at end of file
diff --git a/daemons/graphs/jsmenu/HM_Loader_prova.js b/daemons/graphs/jsmenu/HM_Loader_prova.js
new file mode 100644 (file)
index 0000000..ed8f957
--- /dev/null
@@ -0,0 +1,89 @@
+/*HM_Loader.js
+* by Peter Belesis. v4.1.1 011002
+* Copyright (c) 2001 Peter Belesis. All Rights Reserved.
+*/
+
+   HM_DOM = (document.getElementById) ? true : false;
+   HM_NS4 = (document.layers) ? true : false;
+    HM_IE = (document.all) ? true : false;
+   HM_IE4 = HM_IE && !HM_DOM;
+   HM_Mac = (navigator.appVersion.indexOf("Mac") != -1);
+  HM_IE4M = HM_IE4 && HM_Mac;
+ HM_Opera = (navigator.userAgent.indexOf("Opera")!=-1);
+ HM_Konqueror = (navigator.userAgent.indexOf("Konqueror")!=-1);
+
+HM_IsMenu = !HM_Opera && !HM_Konqueror && !HM_IE4M && (HM_DOM || HM_NS4 || HM_IE4);
+
+HM_BrowserString = HM_NS4 ? "NS4" : HM_DOM ? "DOM" : "IE4";
+
+
+if(window.event + "" == "undefined") event = null;
+function HM_f_PopUp(){return false};
+function HM_f_PopDown(){return false};
+popUp = HM_f_PopUp;
+popDown = HM_f_PopDown;
+
+
+HM_GL_MenuWidth          = 150;
+HM_GL_FontFamily         = "Arial,sans-serif";
+HM_GL_FontSize           = 10;
+HM_GL_FontBold           = true;
+HM_GL_FontItalic         = false;
+HM_GL_FontColor          = "black";
+HM_GL_FontColorOver      = "white";
+HM_GL_BGColor            = "transparent";
+HM_GL_BGColorOver        = "transparent";
+HM_GL_ItemPadding        = 3;
+
+HM_GL_BorderWidth        = 2;
+HM_GL_BorderColor        = "red";
+HM_GL_BorderStyle        = "solid";
+HM_GL_SeparatorSize      = 2;
+HM_GL_SeparatorColor     = "yellow";
+
+HM_GL_ImageSrc = "HM_More_black_right.gif";
+HM_GL_ImageSrcLeft = "HM_More_black_left.gif";
+
+HM_GL_ImageSrcOver = "HM_More_white_right.gif";
+HM_GL_ImageSrcLeftOver = "HM_More_white_left.gif";
+
+HM_GL_ImageSize          = 5;
+HM_GL_ImageHorizSpace    = 5;
+HM_GL_ImageVertSpace     = 5;
+
+HM_GL_KeepHilite         = false;
+HM_GL_ClickStart         = false;
+HM_GL_ClickKill          = 0;
+HM_GL_ChildOverlap       = 40;
+HM_GL_ChildOffset        = 10;
+HM_GL_ChildPerCentOver   = null;
+HM_GL_TopSecondsVisible  = .5;
+HM_GL_ChildSecondsVisible = .3;
+HM_GL_StatusDisplayBuild = 0;
+HM_GL_StatusDisplayLink  = 1;
+HM_GL_UponDisplay        = null;
+HM_GL_UponHide           = null;
+
+HM_GL_RightToLeft      = false;
+HM_GL_CreateTopOnly      = HM_NS4 ? true : false;
+HM_GL_ShowLinkCursor     = true;
+
+// the following function is included to illustrate the improved JS expression handling of
+// the left_position and top_position parameters
+// you may delete if you have no use for it
+
+function HM_f_CenterMenu(topmenuid) {
+       var MinimumPixelLeft = 0;
+       var TheMenu = HM_DOM ? document.getElementById(topmenuid) : HM_IE4 ? document.all(topmenuid) : eval("window." + topmenuid);
+       var TheMenuWidth = HM_DOM ? parseInt(TheMenu.style.width) : HM_IE4 ? TheMenu.style.pixelWidth : TheMenu.clip.width;
+       var TheWindowWidth = HM_IE ? document.body.clientWidth : window.innerWidth;
+       return Math.max(parseInt((TheWindowWidth-TheMenuWidth) / 2),MinimumPixelLeft);
+}
+
+if(HM_IsMenu) {
+       document.write("<SCR" + "IPT LANGUAGE='JavaScript1.2' SRC='HM_Arrays_prova.js' TYPE='text/javascript'><\/SCR" + "IPT>");
+       document.write("<SCR" + "IPT LANGUAGE='JavaScript1.2' SRC='HM_Script"+ HM_BrowserString +".js' TYPE='text/javascript'><\/SCR" + "IPT>");
+}
+
+
+//end
diff --git a/daemons/graphs/jsmenu/HM_More_black_left.gif b/daemons/graphs/jsmenu/HM_More_black_left.gif
new file mode 100644 (file)
index 0000000..ae9b1dd
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_black_left.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_black_right.gif b/daemons/graphs/jsmenu/HM_More_black_right.gif
new file mode 100644 (file)
index 0000000..ca628ba
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_black_right.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_blue_left.gif b/daemons/graphs/jsmenu/HM_More_blue_left.gif
new file mode 100644 (file)
index 0000000..1637826
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_blue_left.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_blue_right.gif b/daemons/graphs/jsmenu/HM_More_blue_right.gif
new file mode 100644 (file)
index 0000000..ebc8f9b
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_blue_right.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_cyan_left.gif b/daemons/graphs/jsmenu/HM_More_cyan_left.gif
new file mode 100644 (file)
index 0000000..48e8325
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_cyan_left.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_cyan_right.gif b/daemons/graphs/jsmenu/HM_More_cyan_right.gif
new file mode 100644 (file)
index 0000000..788d9d2
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_cyan_right.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_green_left.gif b/daemons/graphs/jsmenu/HM_More_green_left.gif
new file mode 100644 (file)
index 0000000..132e1d2
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_green_left.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_green_right.gif b/daemons/graphs/jsmenu/HM_More_green_right.gif
new file mode 100644 (file)
index 0000000..dfaaf00
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_green_right.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_magenta_left.gif b/daemons/graphs/jsmenu/HM_More_magenta_left.gif
new file mode 100644 (file)
index 0000000..e6369cf
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_magenta_left.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_magenta_right.gif b/daemons/graphs/jsmenu/HM_More_magenta_right.gif
new file mode 100644 (file)
index 0000000..56179da
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_magenta_right.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_red_left.gif b/daemons/graphs/jsmenu/HM_More_red_left.gif
new file mode 100644 (file)
index 0000000..b36de20
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_red_left.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_red_right.gif b/daemons/graphs/jsmenu/HM_More_red_right.gif
new file mode 100644 (file)
index 0000000..035f5e6
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_red_right.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_white_left.gif b/daemons/graphs/jsmenu/HM_More_white_left.gif
new file mode 100644 (file)
index 0000000..935308d
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_white_left.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_white_right.gif b/daemons/graphs/jsmenu/HM_More_white_right.gif
new file mode 100644 (file)
index 0000000..969fc49
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_white_right.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_yellow_left.gif b/daemons/graphs/jsmenu/HM_More_yellow_left.gif
new file mode 100644 (file)
index 0000000..8e10145
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_yellow_left.gif differ
diff --git a/daemons/graphs/jsmenu/HM_More_yellow_right.gif b/daemons/graphs/jsmenu/HM_More_yellow_right.gif
new file mode 100644 (file)
index 0000000..8a438b9
Binary files /dev/null and b/daemons/graphs/jsmenu/HM_More_yellow_right.gif differ
diff --git a/daemons/graphs/jsmenu/HM_ScriptDOM.js b/daemons/graphs/jsmenu/HM_ScriptDOM.js
new file mode 100644 (file)
index 0000000..498a591
--- /dev/null
@@ -0,0 +1,962 @@
+/*HM_ScriptDOM.js
+* by Peter Belesis. v4.1.1 011002
+* Copyright (c) 2001 Peter Belesis. All Rights Reserved.
+* Originally published and documented at http://www.dhtmlab.com/
+* Available solely from INT Media Group. Incorporated under exclusive license.
+* Contact licensing@internet.com for more information.
+*/
+
+HM_IE5M = HM_IE && HM_Mac;
+HM_IE5W = HM_IE && !HM_Mac;
+HM_NS6 = (navigator.vendor == ("Netscape6") || navigator.product == ("Gecko"));
+HM_IEpos = HM_IE || (HM_NS6 && parseInt(navigator.productSub)>=20010710);
+HM_IEDTD = (HM_IE && document.doctype) ? document.doctype.name.indexOf(".dtd")!=-1 : false;
+HM_IEnoDTD = HM_IE && !HM_IEDTD;
+
+HM_a_Parameters = [
+       ["MenuWidth",          150,             "number"],
+       ["FontFamily",         "Arial,sans-serif"],
+       ["FontSize",           10,              "number"],
+       ["FontBold",           false,   "boolean"],
+       ["FontItalic",         false,   "boolean"],
+       ["FontColor",          "black"],
+       ["FontColorOver",      "white"],
+       ["BGColor",            "white"],
+       ["BGColorOver",        "black"],
+       ["ItemPadding",        3,               "number"],
+       ["BorderWidth",        2,               "number"],
+       ["BorderColor",        "red"],
+       ["BorderStyle",        "solid"],
+       ["SeparatorSize",      1,               "number"],
+       ["SeparatorColor",     "yellow"],
+       ["ImageSrc",           "HM_More_black_right.gif"],
+       ["ImageSrcOver",       null],
+       ["ImageSrcLeft",       "HM_More_black_left.gif"],
+       ["ImageSrcLeftOver",   null],
+       ["ImageSize",          5,               "number"],
+       ["ImageHorizSpace",    0,               "number"],
+       ["ImageVertSpace",     0,               "number"],
+       ["KeepHilite",         false,   "boolean"],
+       ["ClickStart",         false,   "boolean"],
+       ["ClickKill",          true,    "boolean"],
+       ["ChildOverlap",       20,              "number"],
+       ["ChildOffset",        10,              "number"],
+       ["ChildPerCentOver",   null,    "number"],
+       ["TopSecondsVisible",  .5,              "number"],
+       ["ChildSecondsVisible",.3,              "number"],
+       ["StatusDisplayBuild", 1,               "boolean"],
+       ["StatusDisplayLink",  1,               "boolean"],
+       ["UponDisplay",        null,    "delayed"],
+       ["UponHide",           null,    "delayed"],
+       ["RightToLeft",        false,   "boolean"],
+       ["CreateTopOnly",      0,               "boolean"],
+       ["ShowLinkCursor",     false,   "boolean"]
+]
+
+HM_MenuIDPrefix = "HM_Menu";
+HM_ItemIDPrefix = "HM_Item";
+HM_ArrayIDPrefix = "HM_Array";
+
+Function.prototype.isFunction = true;
+Function.prototype.isString = false;
+String.prototype.isFunction = false;
+String.prototype.isString = true;
+String.prototype.isBoolean = false;
+String.prototype.isNumber = false;
+Number.prototype.isString = false;
+Number.prototype.isFunction = false;
+Number.prototype.isBoolean = false;
+Number.prototype.isNumber = true;
+Boolean.prototype.isString = false;
+Boolean.prototype.isFunction = false;
+Boolean.prototype.isBoolean = true;
+Boolean.prototype.isNumber = false;
+Array.prototype.itemValidation = false;
+Array.prototype.isArray = true;
+
+if(HM_IE) {
+       HM_a_ElementsCreated = [];
+
+       function HM_f_StoreElement(el){
+               HM_a_ElementsCreated[HM_a_ElementsCreated.length] = el;
+       }
+}
+
+function HM_f_AssignParameters(paramarray){
+       var ParamName = paramarray[0];
+       var DefaultValue = paramarray[1];
+       var FullParamName = "HM_" + ParamName;
+       
+       if (typeof eval("window.HM_PG_" + ParamName) == "undefined") {
+               if (typeof eval("window.HM_GL_" + ParamName) == "undefined") {
+                       eval(FullParamName + "= DefaultValue");
+               }
+               else {
+                       eval(FullParamName + "= HM_GL_" + ParamName);
+               }
+       }
+       else {
+               eval(FullParamName + "= HM_PG_" + ParamName);
+       }
+
+       paramarray[0] = FullParamName;
+       paramarray[1] = eval(FullParamName);
+}
+
+function HM_f_EvalParameters(valuenew,valueold,valuetype){
+       var TestString, ParPosition;
+
+       if(typeof valuenew == "undefined" || valuenew == null || (valuenew.isString && valuenew.length == 0)){
+               return valueold;
+       }
+
+       if(valuetype != "delayed"){
+               while(valuenew.isString) {
+                       ParPosition = valuenew.indexOf("(");
+                       if(ParPosition !=-1) {
+                               TestString = "window." + valuenew.substr(0,ParPosition);
+                               if (typeof eval(TestString) != "undefined" && eval(TestString).isFunction) {
+                                       valuenew = eval(valuenew);
+                               }
+                       }
+                       else break
+               }
+       }
+
+       while(valuenew.isFunction) {valuenew = valuenew()}
+
+       switch(valuetype){      
+               case "number":
+                       while (valuenew.isString) {valuenew = eval(valuenew)}
+                       break;
+               case "boolean":
+                       while (!valuenew.isBoolean) {
+                               valuenew = (valuenew.isNumber) ? valuenew ? true : false : eval(valuenew);
+                       }
+                       break;
+       }
+
+       return valuenew;
+}
+
+for (i=0;i<HM_a_Parameters.length;i++) {
+       HM_f_AssignParameters(HM_a_Parameters[i]);
+       eval(HM_a_Parameters[i][0] + "= HM_f_EvalParameters("+ HM_a_Parameters[i][0] +",null,HM_a_Parameters[i][2])")
+}
+
+HM_ChildPerCentOver = (isNaN(parseFloat(HM_ChildPerCentOver))) ? null : parseFloat(HM_ChildPerCentOver)/100;
+
+HM_ChildMilliSecondsVisible = HM_ChildSecondsVisible * 1000;
+
+function HM_f_ValidateArray(arrayname){
+       var MenuArrayIsValid = false;
+       var MenuArrayIsObject = (typeof eval("window." + arrayname) == "object");
+       if(MenuArrayIsObject) { 
+               var TheMenuArray = eval(arrayname);
+               if(TheMenuArray.isArray && TheMenuArray.length > 1) {
+                       MenuArrayIsValid = true;
+                       if(!TheMenuArray.itemValidation) {
+                               while((typeof TheMenuArray[TheMenuArray.length-1] != "object") || (!TheMenuArray[TheMenuArray.length-1].isArray)) {
+                                       TheMenuArray.length--;
+                               }
+                               TheMenuArray.itemValidation = true;
+                       }
+               }
+       }
+       return MenuArrayIsValid;
+}
+
+if(!window.HM_a_TreesToBuild) {
+       HM_a_TreesToBuild = [];
+       for(i=1; i<100; i++){
+               if(HM_f_ValidateArray(HM_ArrayIDPrefix + i)) HM_a_TreesToBuild[HM_a_TreesToBuild.length] = i;
+       }
+}
+
+HM_CurrentArray = null;
+HM_CurrentTree  = null;
+HM_CurrentMenu  = null;
+HM_CurrentItem  = null;
+HM_a_TopMenus = [];
+HM_AreLoaded = false;
+HM_AreCreated = false;
+HM_BeingCreated = false;
+HM_UserOverMenu = false;
+HM_HideAllTimer = null;
+HM_TotalTrees = 0; 
+HM_ZIndex = 5000;
+
+function HM_f_StartIt() {
+       if(HM_AreCreated) return;
+       if((typeof(document.body) == "undefined") || (document.body == null)) return;
+       HM_AreLoaded = true;
+       if (HM_ClickKill) {
+               HM_f_OtherMouseDown = (document.onmousedown) ? document.onmousedown :  new Function;
+       document.onmousedown = function(){HM_f_PageClick();HM_f_OtherMouseDown()}
+    }
+       else {
+               HM_TopMilliSecondsVisible = HM_TopSecondsVisible * 1000;
+       }
+    HM_f_MakeTrees();
+       HM_f_OtherOnLoad();
+}
+
+function HM_f_MakeTrees(){
+    HM_BeingCreated = true;
+       var TreeParams = null;
+       var TreeHasChildren = false;
+       var ItemArray = null;
+
+       for(var t=0; t<HM_a_TreesToBuild.length; t++) {
+               if(!HM_f_ValidateArray(HM_ArrayIDPrefix + HM_a_TreesToBuild[t])) continue;
+               HM_CurrentArray = eval(HM_ArrayIDPrefix + HM_a_TreesToBuild[t]);
+
+               TreeParams = HM_CurrentArray[0];
+               TreeHasChildren = false;
+
+               for(var i=1; i<HM_CurrentArray.length; i++) {
+                       ItemArray = HM_CurrentArray[i];
+                       if(ItemArray[ItemArray.length-1]) {TreeHasChildren = true; break}
+               }
+               HM_CurrentTree = {
+                       MenuWidth        : MenuWidth = HM_f_EvalParameters(TreeParams[0],HM_MenuWidth,"number"),
+                       MenuLeft         : MenuLeft = HM_f_EvalParameters(TreeParams[1],null,"delayed"),
+                       MenuTop          : MenuTop = HM_f_EvalParameters(TreeParams[2],null,"delayed"),
+                       ItemWidth        : MenuWidth - (HM_BorderWidth*2),
+                       FontColor        : HM_f_EvalParameters(TreeParams[3],HM_FontColor),
+                       FontColorOver    : HM_f_EvalParameters(TreeParams[4],HM_FontColorOver),
+                       BGColor          : HM_f_EvalParameters(TreeParams[5],HM_BGColor),
+                       BGColorOver      : HM_f_EvalParameters(TreeParams[6],HM_BGColorOver),
+                       BorderColor      : HM_f_EvalParameters(TreeParams[7],HM_BorderColor),
+                       SeparatorColor   : HM_f_EvalParameters(TreeParams[8],HM_SeparatorColor),
+                       TopIsPermanent   : ((MenuLeft == null) || (MenuTop == null)) ? false : HM_f_EvalParameters(TreeParams[9],false,"boolean"),
+                       TopIsHorizontal  : TopIsHorizontal = HM_f_EvalParameters(TreeParams[10],false,"boolean"),
+                       TreeIsHorizontal : TreeHasChildren ? HM_f_EvalParameters(TreeParams[11],false,"boolean") : false,
+                       PositionUnder    : (!TopIsHorizontal || !TreeHasChildren) ? false : HM_f_EvalParameters(TreeParams[12],false,"boolean"),
+                       TopImageShow     : TreeHasChildren ? HM_f_EvalParameters(TreeParams[13],true,"boolean")  : false,
+                       TreeImageShow    : TreeHasChildren ? HM_f_EvalParameters(TreeParams[14],true,"boolean")  : false,
+                       UponDisplay      : HM_f_EvalParameters(TreeParams[15],HM_UponDisplay,"delayed"),
+                       UponHide         : HM_f_EvalParameters(TreeParams[16],HM_UponHide,"delayed"),
+                       RightToLeft      : HM_f_EvalParameters(TreeParams[17],HM_RightToLeft,"boolean"),
+                       ClickStart               : HM_f_EvalParameters(TreeParams[18],HM_ClickStart,"boolean"),
+                       TopIsVariableWidth  : HM_f_EvalParameters(TreeParams[19],false,"boolean"),
+                       TreeIsVariableWidth  : HM_f_EvalParameters(TreeParams[20],false,"boolean")
+               }
+
+               HM_CurrentMenu = null;
+               HM_f_MakeMenu(HM_a_TreesToBuild[t]);
+               HM_a_TopMenus[HM_TotalTrees] = HM_CurrentTree.treeParent;
+               HM_TotalTrees++;
+               if(HM_CurrentTree.TopIsPermanent){
+                       with(HM_CurrentTree.treeParent) {
+                               HM_CurrentTree.treeParent.xPos = eval(HM_CurrentTree.MenuLeft);
+                               HM_CurrentTree.treeParent.yPos = eval(HM_CurrentTree.MenuTop);
+                               moveTo(HM_CurrentTree.treeParent.xPos,HM_CurrentTree.treeParent.yPos);
+                               style.zIndex = HM_ZIndex;
+                       }
+                       if(HM_IE5M) setTimeout(HM_CurrentTree.treeParent.id + ".fixSize(true)",10);     
+                       else HM_CurrentTree.treeParent.style.visibility = "visible";
+               }
+    }
+
+       if(HM_StatusDisplayBuild) status = HM_TotalTrees + " Hierarchical Menu Trees Created";
+    HM_AreCreated = true;
+    HM_BeingCreated = false;
+}
+
+function HM_f_SetItemProperties(itemidsuffix) {
+       this.tree        = HM_CurrentTree;
+       this.index       = HM_CurrentMenu.itemCount - 1;
+       this.isLastItem  = (HM_CurrentMenu.itemCount == HM_CurrentMenu.maxItems);
+       this.array               = HM_CurrentMenu.array[HM_CurrentMenu.itemCount];
+       this.dispText    = this.array[0];
+       this.linkText    = this.array[1];
+       this.permHilite  = HM_f_EvalParameters(this.array[3],false,"boolean");
+       this.hasRollover = (!this.permHilite && HM_f_EvalParameters(this.array[2],true,"boolean"));
+       this.hasMore     = HM_f_EvalParameters(this.array[4],false,"boolean") && HM_f_ValidateArray(HM_ArrayIDPrefix + itemidsuffix);
+       this.childID     = this.hasMore ? (HM_MenuIDPrefix + itemidsuffix) : null;
+       this.child               = null;
+    this.onmouseover = HM_f_ItemOver;
+    this.onmouseout  = HM_f_ItemOut;
+       this.setItemStyle = HM_f_SetItemStyle;
+       this.showChild   = HM_f_ShowChild;
+       this.ClickStart = this.hasMore && this.tree.ClickStart && (this.tree.TopIsPermanent && (this.tree.treeParent==this.menu));
+       if(this.ClickStart) {
+               this.linkText = "";
+               this.onclick = this.showChild;
+       }
+       this.ChildOverlap = null;
+}
+
+function HM_f_MakeElement(menuid) {
+       var MenuObject;
+       MenuObject = document.createElement("DIV");
+
+       if(HM_IE)HM_f_StoreElement(MenuObject);
+
+       with(MenuObject){
+               id = menuid;
+               with(style) {
+                       position = "absolute";
+                       visibility = "hidden";
+                       left = "-500px";
+                       top = "0px";
+                       width = (HM_IEnoDTD ? HM_CurrentTree.MenuWidth : HM_CurrentTree.ItemWidth) + "px";
+               }
+       }
+       document.body.appendChild(MenuObject);
+       return MenuObject;
+}
+
+function HM_f_MakeMenu(menucount) {
+       if(!HM_f_ValidateArray(HM_ArrayIDPrefix + menucount)) return false;
+       HM_CurrentArray = eval(HM_ArrayIDPrefix + menucount);
+
+       NewMenu = document.getElementById(HM_MenuIDPrefix + menucount);
+       if(!NewMenu){
+               NewMenu = HM_f_MakeElement(HM_MenuIDPrefix + menucount);
+               if(HM_CurrentMenu) {
+                       NewMenu.parentMenu = HM_CurrentMenu;
+                       NewMenu.parentItem = HM_CurrentMenu.itemElement;
+                       NewMenu.parentItem.child = NewMenu;
+                       NewMenu.hasParent = true;
+                       NewMenu.isHorizontal = HM_CurrentTree.TreeIsHorizontal;
+                       NewMenu.showImage = HM_CurrentTree.TreeImageShow;
+               }
+               else {
+                       NewMenu.isHorizontal = HM_CurrentTree.TopIsHorizontal;
+                       NewMenu.showImage = HM_CurrentTree.TopImageShow;
+                       HM_CurrentTree.treeParent = HM_CurrentTree.startChild = NewMenu;
+               }
+
+               HM_CurrentMenu = NewMenu;
+               HM_CurrentMenu.array = HM_CurrentArray;
+               HM_CurrentMenu.tree  = HM_CurrentTree;
+               HM_CurrentMenu.itemCount = 0;
+               HM_CurrentMenu.maxItems = HM_CurrentMenu.array.length - 1;
+               HM_CurrentMenu.IsVariableWidth = ((HM_CurrentMenu.hasParent && HM_CurrentTree.TreeIsVariableWidth) || (!HM_CurrentMenu.hasParent && HM_CurrentTree.TopIsVariableWidth));
+               HM_CurrentMenu.showIt = HM_f_ShowIt;
+               HM_CurrentMenu.count = menucount;
+               HM_CurrentMenu.keepInWindow = HM_f_KeepInWindow;
+           HM_CurrentMenu.onmouseover = HM_f_MenuOver;
+           HM_CurrentMenu.onmouseout = HM_f_MenuOut;
+           HM_CurrentMenu.hideTree = HM_f_HideTree
+           HM_CurrentMenu.hideParents = HM_f_HideParents;
+           HM_CurrentMenu.hideChildren = HM_f_HideChildren;
+           HM_CurrentMenu.hideTop = HM_f_HideTop;
+           HM_CurrentMenu.hideSelf = HM_f_HideSelf;
+           HM_CurrentMenu.hasChildVisible = false;
+           HM_CurrentMenu.isOn = false;
+           HM_CurrentMenu.hideTimer = null;
+           HM_CurrentMenu.currentItem = null;
+               HM_CurrentMenu.setMenuStyle = HM_f_SetMenuStyle;
+               HM_CurrentMenu.sizeFixed = false;
+               HM_CurrentMenu.fixSize = HM_f_FixSize;
+
+               if(HM_IE) HM_CurrentMenu.onselectstart = HM_f_CancelSelect;
+           HM_CurrentMenu.moveTo = HM_f_MoveTo;
+               HM_CurrentMenu.setMenuStyle();
+       }
+
+       while (HM_CurrentMenu.itemCount < HM_CurrentMenu.maxItems) {
+               HM_CurrentMenu.itemCount++;
+               HM_CurrentMenu.itemElement = document.getElementById(HM_ItemIDPrefix + menucount + "_" + HM_CurrentMenu.itemCount);
+               if(!HM_CurrentMenu.itemElement){
+                       if(HM_StatusDisplayBuild) status = "Creating Hierarchical Menus: " + menucount + " / " + HM_CurrentMenu.itemCount;
+                       HM_CurrentMenu.itemElement = HM_f_MakeItemElement(menucount);
+               }
+               if(HM_CurrentMenu.itemElement.hasMore && (!HM_CreateTopOnly || HM_AreCreated && HM_CreateTopOnly)) {
+                   MenuCreated = HM_f_MakeMenu(menucount + "_" + HM_CurrentMenu.itemCount);
+           if(MenuCreated) {
+                               HM_CurrentMenu = HM_CurrentMenu.parentMenu;
+                       }
+               }
+    }
+       if(!HM_IE5M)HM_CurrentMenu.fixSize();
+       return HM_CurrentMenu;
+}
+
+function HM_f_SetMenuStyle(){
+       with(this.style) {
+               borderWidth = HM_BorderWidth + "px";
+               borderColor = HM_CurrentTree.BorderColor;
+               borderStyle = HM_BorderStyle;
+               overflow    = "hidden";
+               cursor      = "default";
+       }
+}
+
+function HM_f_MakeItemElement(menucount) {
+       var ItemElement = document.createElement("DIV");
+
+       if(HM_IE)HM_f_StoreElement(ItemElement);
+
+       ItemElement.id = HM_ItemIDPrefix + menucount + "_" + HM_CurrentMenu.itemCount;
+       ItemElement.style.position = "absolute";
+       ItemElement.style.visibility = "inherit";
+       HM_CurrentMenu.appendChild(ItemElement);
+       ItemElement.menu = HM_CurrentMenu;
+       ItemElement.setItemProperties = HM_f_SetItemProperties;
+       ItemElement.setItemProperties(menucount + "_" + HM_CurrentMenu.itemCount);
+       ItemElement.siblingBelow = ItemElement.previousSibling;
+       if(ItemElement.linkText && !ItemElement.ClickStart) {
+               ItemElement.onclick = HM_f_LinkIt;
+               if(HM_ShowLinkCursor)ItemElement.style.cursor = HM_NS6 ? "pointer" : "hand";
+       }
+       var FullPadding  = (HM_ItemPadding*2) + HM_ImageSize + HM_ImageHorizSpace;
+
+       ItemElement.hasImage = (ItemElement.hasMore && HM_CurrentMenu.showImage);
+    if(ItemElement.hasImage) {
+               var ImageElement = document.createElement("IMG");
+
+               if(HM_IE)HM_f_StoreElement(ImageElement);
+
+               ItemElement.imageSrc = HM_CurrentTree.RightToLeft ? HM_ImageSrcLeft : HM_ImageSrc;
+               ItemElement.hasImageRollover = ((!HM_CurrentTree.RightToLeft && HM_ImageSrcOver) || (HM_CurrentTree.RightToLeft && HM_ImageSrcLeftOver));
+               if(ItemElement.hasImageRollover) {
+                       ItemElement.imageSrcOver = HM_CurrentTree.RightToLeft ? HM_ImageSrcLeftOver : HM_ImageSrcOver;
+                       if(ItemElement.permHilite) ItemElement.imageSrc = ItemElement.imageSrcOver;
+               }
+
+               with(ImageElement){
+                       src = ItemElement.imageSrc;
+                       removeAttribute("height");
+                       hspace = (!HM_CurrentTree.RightToLeft && HM_IE5W) ? HM_ItemPadding : 0;
+                       vspace = 0;
+                       width = HM_ImageSize;
+                       with(style) {
+                               position = "absolute";
+                               top = (HM_ItemPadding + HM_ImageVertSpace) + "px";
+
+                               if(HM_CurrentTree.RightToLeft) {
+                                       left = (HM_ItemPadding + HM_ImageHorizSpace) + "px";
+                               }
+                       }
+               }
+               ItemElement.imgLyr = ImageElement;
+       }
+       ItemElement.innerHTML = ItemElement.dispText;
+       if(ImageElement) ItemElement.insertBefore(ImageElement,ItemElement.firstChild);
+       ItemElement.setItemStyle();
+       return ItemElement;
+}
+
+function HM_f_SetItemStyle() {
+       with(this.style){
+               backgroundColor = (this.permHilite) ? HM_CurrentTree.BGColorOver : HM_CurrentTree.BGColor;
+               color = (this.permHilite) ? HM_CurrentTree.FontColorOver : HM_CurrentTree.FontColor;
+               padding = HM_ItemPadding +"px";
+               font = ((HM_FontBold) ? "bold " : "normal ") + HM_FontSize + "pt " + HM_FontFamily;
+               fontStyle = (HM_FontItalic) ? "italic" : "normal";
+               if(HM_IE) overflow = "hidden";
+
+               if((this.menu.showImage && (!this.menu.IsVariableWidth || (this.menu.IsVariableWidth && this.tree.RightToLeft && !this.menu.isHorizontal))) || (this.menu.IsVariableWidth && this.imgLyr)) {
+
+                       var FullPadding  = (HM_ItemPadding*2) + HM_ImageSize + HM_ImageHorizSpace;
+                       if (HM_CurrentTree.RightToLeft) paddingLeft = FullPadding + "px";
+                       else paddingRight = FullPadding + "px";
+               }
+               if(!this.isLastItem) {
+                       var SeparatorString = HM_SeparatorSize + "px solid " + this.tree.SeparatorColor;
+                       if (this.menu.isHorizontal) borderRight = SeparatorString;
+                       else borderBottom = SeparatorString;
+               }
+
+               if(this.menu.isHorizontal){
+                       top = "0px";
+                       if(!this.menu.IsVariableWidth) {
+                               if(HM_IEnoDTD){
+                                       if(this.isLastItem) width = (HM_CurrentTree.MenuWidth - HM_BorderWidth - HM_SeparatorSize) + "px";
+                                       else width = (HM_CurrentTree.MenuWidth - HM_BorderWidth) + "px";
+                                       left = (this.index * (HM_CurrentTree.MenuWidth - HM_BorderWidth)) + "px";
+                               }
+                               else {
+                                       width = (HM_CurrentTree.MenuWidth - HM_BorderWidth - parseInt(paddingLeft) - parseInt(paddingRight) - HM_SeparatorSize) + "px";
+                                       left = ((this.index * parseInt(width)) + ((HM_SeparatorSize * this.index)))  + ((parseInt(paddingLeft) + parseInt(paddingRight)) * this.index) + "px";
+                               }
+                               var LeftAndWidth = parseInt(left) + parseInt(width);
+                               this.menu.style.width = LeftAndWidth + (HM_IEnoDTD ? (HM_BorderWidth * 2) : (parseInt(paddingLeft) + parseInt(paddingRight))) + "px"
+                       }
+               }
+               else {
+                       left = "0px";
+                       if(!this.menu.IsVariableWidth) {
+                               if(HM_IEnoDTD) width = HM_CurrentTree.ItemWidth + "px";
+                               else width = (HM_CurrentTree.ItemWidth - (parseInt(paddingLeft) + parseInt(paddingRight))) + "px";
+                       }
+
+               }
+       }
+}
+
+function HM_f_FixSize(makevis){
+       if(this.isHorizontal) {
+               if(this.IsVariableWidth) {
+                   for(i=0; i<this.childNodes.length; i++) {
+                       var TempItem = this.childNodes[i];
+                               TempItem.realWidth = HM_IE ? TempItem.scrollWidth : TempItem.offsetWidth;
+                               if(HM_IE5M) TempItem.realWidth += (parseInt(TempItem.style.paddingLeft) + parseInt(TempItem.style.paddingRight))
+                               if(HM_IEnoDTD){
+                                       if(TempItem.isLastItem) TempItem.style.width = (TempItem.realWidth) + "px";
+                                       else TempItem.style.width = (TempItem.realWidth + HM_SeparatorSize) + "px";
+                                       TempItem.style.left = (TempItem.index ? parseInt(TempItem.siblingBelow.style.left) + parseInt(TempItem.siblingBelow.style.width) : 0) + "px";
+                               }
+                               else { 
+                                       if(TempItem.hasImage && !HM_CurrentTree.RightToLeft) {
+                                               TempItem.realWidth += HM_ItemPadding;
+                                       }
+                                       TempItem.realWidth -= (parseInt(TempItem.style.paddingLeft) + parseInt(TempItem.style.paddingRight))
+                                       if(!HM_IE5M && !TempItem.isLastItem)  TempItem.realWidth -= HM_SeparatorSize;
+                                       TempItem.allowableWidth = TempItem.tree.ItemWidth - (parseInt(TempItem.style.paddingLeft) + parseInt(TempItem.style.paddingRight));
+                                       TempItem.style.width = Math.min(TempItem.allowableWidth,TempItem.realWidth) + "px";
+                                       TempItem.style.left = (TempItem.index ? (parseInt(TempItem.siblingBelow.style.left) + TempItem.siblingBelow.offsetWidth) : 0) + "px";
+                               }
+                               if(TempItem.isLastItem) {
+                                       LeftAndWidth = parseInt(TempItem.style.left) + parseInt(TempItem.style.width);
+                                       this.style.width = LeftAndWidth + (HM_IEnoDTD ? (HM_BorderWidth * 2) : (parseInt(TempItem.style.paddingLeft) + parseInt(TempItem.style.paddingRight))) + "px";
+                               }
+                       }
+               }
+
+               var MaxItemHeight = 0;
+           for(i=0; i<this.childNodes.length; i++) {
+               var TempItem = this.childNodes[i];
+                   if(TempItem.index) {
+                               var SiblingHeight = TempItem.siblingBelow.offsetHeight - (HM_IEnoDTD ? 0 : (HM_ItemPadding * 2));
+                               MaxItemHeight = Math.max(MaxItemHeight,SiblingHeight);
+                       }
+               else {
+                               MaxItemHeight = TempItem.offsetHeight - (HM_IEnoDTD ? 0 : (HM_ItemPadding * 2));
+                       }
+               }
+           for(i=0; i<this.childNodes.length; i++) {
+               var TempItem = this.childNodes[i];
+                       TempItem.style.height = MaxItemHeight +"px";
+                       if(TempItem.imgLyr) {
+                               if(this.tree.RightToLeft){
+                                       TempItem.imgLyr.style.left = (HM_ItemPadding + HM_ImageHorizSpace) + "px";
+                               }
+                               else {
+                                       TempItem.imgLyr.style.left = (TempItem.offsetWidth - ((TempItem.isLastItem ? 0 : HM_SeparatorSize) + (HM_IEnoDTD ? HM_IE5M ? HM_ItemPadding : HM_ItemPadding * 2 : HM_ItemPadding) + HM_ImageHorizSpace + HM_ImageSize)) + "px";
+                               }
+                       }
+               }
+
+               this.style.height = MaxItemHeight + (HM_IEnoDTD ? HM_BorderWidth * 2 : (HM_ItemPadding * 2)) + "px";
+       }
+       else {
+               if(this.IsVariableWidth) {
+                       var MaxItemWidth = 0;
+               for(i=0; i<this.childNodes.length; i++) {
+                       var TempItem = this.childNodes[i];
+                               TempItem.realWidth = HM_IE ? TempItem.scrollWidth : TempItem.offsetWidth;
+                               if(HM_IE5M) TempItem.realWidth += (parseInt(TempItem.style.paddingLeft) + parseInt(TempItem.style.paddingRight))
+                               if(!HM_IEnoDTD) {
+                                       TempItem.realWidth -= ((parseInt(TempItem.style.paddingRight) + parseInt(TempItem.style.paddingLeft)))
+                               }
+                               MaxItemWidth = i ? Math.max(MaxItemWidth,TempItem.realWidth) : TempItem.realWidth;
+                               if(MaxItemWidth==TempItem.realWidth) TempWidest = TempItem;
+                       }
+
+               for(i=0; i<this.childNodes.length; i++) {
+                               this.childNodes[i].style.width = (TempWidest.realWidth + (HM_IEnoDTD ? 0 : (0))) + "px";
+                               if(!HM_IEnoDTD) {
+                                       this.childNodes[i].style.paddingLeft = TempWidest.style.paddingLeft;
+                                       this.childNodes[i].style.paddingRight = TempWidest.style.paddingRight;
+                               }
+                       }
+                       this.style.width = (this.childNodes[0].offsetWidth +  (HM_IEnoDTD ? HM_BorderWidth * 2 : 0)) + "px";
+               }
+
+           for(i=0; i<this.childNodes.length; i++) {
+               var TempItem = this.childNodes[i];
+                   if (TempItem.index) {
+                               var SiblingHeight =(TempItem.siblingBelow.offsetHeight);
+                               TempItem.style.top = parseInt(TempItem.siblingBelow.style.top) + SiblingHeight + "px";
+                       }
+                       else TempItem.style.top = "0px";
+
+                       if(TempItem.imgLyr) {
+                               if(this.tree.RightToLeft){
+                                       TempItem.imgLyr.style.left = (HM_ItemPadding + HM_ImageHorizSpace) + "px";
+                               }
+                               else {
+                                       TempItem.imgLyr.style.left = (TempItem.offsetWidth - ((HM_IEnoDTD ? HM_IE5M ? HM_ItemPadding : HM_ItemPadding*2 :  HM_ItemPadding) + HM_ImageHorizSpace + HM_ImageSize)) + "px";
+                               }
+                       }
+               }
+               this.style.height = parseInt(TempItem.style.top) + (HM_IE5W ? TempItem.scrollHeight : TempItem.offsetHeight) + (HM_IEnoDTD ? (HM_BorderWidth * 2) : 0) + "px";
+       }
+
+       this.sizeFixed = true;
+       if(makevis)this.style.visibility = "visible";
+}
+
+function HM_f_PopUp(menuname,e){
+       if(HM_IE) e = event;
+    if (!HM_AreLoaded) return;
+       menuname = menuname.replace("elMenu",HM_MenuIDPrefix);
+       var TempMenu = document.getElementById(menuname);
+       if(!TempMenu)return;
+       HM_CurrentMenu = TempMenu;
+       if (HM_CurrentMenu.tree.ClickStart) {
+               var ClickElement = (HM_IE) ? e.srcElement : e.target;
+               if(HM_NS6) {
+                       while(ClickElement.tagName==null){
+                               ClickElement = ClickElement.parentNode;
+                       }
+               }
+               ClickElement.onclick = HM_f_PopMenu;
+    }
+       else HM_f_PopMenu(e);
+}
+
+function HM_f_PopMenu(e){
+       if(HM_IE) e = event;
+    if (!HM_AreLoaded || !HM_AreCreated) return true;
+    if (HM_CurrentMenu.tree.ClickStart && e.type != "click") return true;
+       var mouse_x_position, mouse_y_position;
+    HM_f_HideAll();
+    HM_CurrentMenu.hasParent = false;
+       HM_CurrentMenu.tree.startChild = HM_CurrentMenu;
+       HM_CurrentMenu.mouseX = mouse_x_position = (HM_IE) ? (e.clientX + document.body.scrollLeft) : e.pageX;
+       HM_CurrentMenu.mouseY = mouse_y_position = (HM_IE) ? (e.clientY + document.body.scrollTop)  : e.pageY;
+       HM_CurrentMenu.xIntended = HM_CurrentMenu.xPos = (HM_CurrentMenu.tree.MenuLeft!=null) ? eval(HM_CurrentMenu.tree.MenuLeft) : mouse_x_position;
+       HM_CurrentMenu.yIntended = HM_CurrentMenu.yPos = (HM_CurrentMenu.tree.MenuTop!=null)  ? eval(HM_CurrentMenu.tree.MenuTop)  : mouse_y_position;
+       if(HM_IE5M && !HM_CurrentMenu.sizeFixed) HM_CurrentMenu.fixSize(false);
+       HM_CurrentMenu.keepInWindow();
+    HM_CurrentMenu.moveTo(HM_CurrentMenu.xPos,HM_CurrentMenu.yPos);
+    HM_CurrentMenu.isOn = true;
+    HM_CurrentMenu.showIt(true);
+    return false;
+}
+
+function HM_f_MenuOver() {
+       if(!this.tree.startChild){this.tree.startChild = this}
+       if(this.tree.startChild == this) HM_f_HideAll(this)
+    this.isOn = true;
+    HM_UserOverMenu = true;
+    HM_CurrentMenu = this;
+    if (this.hideTimer) clearTimeout(this.hideTimer);
+}
+
+function HM_f_MenuOut() {
+       if(HM_IE && event.srcElement.contains(event.toElement)) return;
+    this.isOn = false;
+    HM_UserOverMenu = false;
+    if(HM_StatusDisplayLink) status = "";
+       if(!HM_ClickKill) {
+               clearTimeout(HM_HideAllTimer);
+               HM_HideAllTimer = null;
+               HM_HideAllTimer = setTimeout("HM_CurrentMenu.hideTree()",HM_ChildMilliSecondsVisible); 
+       }
+}
+
+function HM_f_ShowChild(){
+               if(!this.child) {
+                       HM_CurrentTree = this.tree;
+                       HM_CurrentMenu = this.menu;
+                       HM_CurrentItem = this;
+                       HM_CurrentMenu.itemElement = this;
+                       this.child = HM_f_MakeMenu(this.menu.count + "_"+(this.index+1));
+                       this.tree.treeParent = this.menu;
+                       this.tree.startChild = this.menu;
+               }
+               if(HM_IE5M && !this.child.sizeFixed) this.child.fixSize(false);
+
+               if (this.tree.PositionUnder && (this.menu == this.tree.treeParent)) {
+                       this.child.xPos = parseInt(this.menu.style.left) + parseInt(this.style.left);
+                       this.child.yPos = parseInt(this.menu.style.top)  + this.menu.offsetHeight - (HM_BorderWidth);
+               }
+               else {
+                       if(this.ChildOverlap==null) {
+                               this.DistanceToRightEdge = parseInt(this.style.width);
+                               if(!HM_IEnoDTD) this.DistanceToRightEdge += (parseInt(this.style.paddingLeft)+parseInt(this.style.paddingRight)) + ((this.menu.isHorizontal && !this.isLastItem) ? HM_SeparatorSize : 0); 
+                               if (!this.menu.isHorizontal || (this.menu.isHorizontal && this.isLastItem)) this.DistanceToRightEdge += HM_BorderWidth;
+                               this.DistanceToLeftEdge = (!this.menu.isHorizontal || (this.menu.isHorizontal && this.index==0)) ? HM_BorderWidth : HM_SeparatorSize;
+                               this.ChildOverlap = (parseInt((HM_ChildPerCentOver != null) ? (HM_ChildPerCentOver  * this.DistanceToRightEdge) : HM_ChildOverlap));
+                       }
+
+                       if(HM_IE5M) {
+                               this.oL = parseInt(this.menu.style.left) - HM_ItemPadding;
+                               this.oL += this.offsetLeft;
+                               this.oT = parseInt(this.menu.style.top) - HM_ItemPadding;
+                               this.oT += this.offsetTop;
+                       }
+                       else {
+                               this.oL = (HM_IEpos) ? parseInt(this.menu.style.left) + HM_BorderWidth : 0;
+                               this.oL += this.offsetLeft;
+                               this.oT = (HM_IEpos) ? parseInt(this.menu.style.top) : -HM_BorderWidth;
+                               this.oT += this.offsetTop;
+                       }
+
+                       if(this.tree.RightToLeft) {
+                               this.child.xPos = ((this.oL - this.DistanceToLeftEdge) + this.ChildOverlap) - this.child.offsetWidth;
+                       }
+                       else {          
+                               this.child.xPos = (this.oL + this.DistanceToRightEdge) - this.ChildOverlap;
+                       }
+                       this.child.yPos = this.oT + HM_ChildOffset + HM_BorderWidth;
+               }
+
+               this.child.xDiff = this.child.xPos - parseInt(this.menu.style.left);
+               this.child.yDiff = this.child.yPos - parseInt(this.menu.style.top);
+
+        if(!this.tree.PositionUnder || this.menu!=this.tree.treeParent) this.child.keepInWindow();
+               this.child.moveTo(this.child.xPos,this.child.yPos);
+        this.menu.hasChildVisible = true;
+        this.menu.visibleChild = this.child;
+        this.child.showIt(true);
+    }
+
+function HM_f_ItemOver(){
+    if (HM_KeepHilite) {
+        if (this.menu.currentItem && this.menu.currentItem != this && this.menu.currentItem.hasRollover) {
+                       with(this.menu.currentItem.style){
+                               backgroundColor = this.tree.BGColor;
+               color = this.tree.FontColor
+                       }
+                       if(this.menu.currentItem.hasImageRollover)this.menu.currentItem.imgLyr.src = this.menu.currentItem.imageSrc;
+        }
+    }
+       if(HM_IE && event.srcElement.id == "HM_ImMore") return;
+       if(this.hasRollover) {
+           this.style.backgroundColor = this.tree.BGColorOver;
+           this.style.color = this.tree.FontColorOver;
+               if(this.hasImageRollover)this.imgLyr.src = this.imageSrcOver;
+       }
+
+    if(HM_StatusDisplayLink) status = this.linkText;
+    this.menu.currentItem = this;
+
+       if (this.menu.hasChildVisible) {
+               if(this.menu.visibleChild == this.child && this.menu.visibleChild.hasChildVisible) this.menu.visibleChild.hideChildren(this);
+               else this.menu.hideChildren(this);
+    }
+
+    if (this.hasMore && !this.ClickStart) this.showChild();
+}
+
+function HM_f_ItemOut() {
+       if (HM_IE && (event.srcElement.contains(event.toElement)
+         || (event.fromElement.tagName=="IMG" && (event.toElement && event.toElement.contains(event.fromElement)))))
+                 return;
+    if ( (!HM_KeepHilite || ((this.tree.TopIsPermanent && (this.tree.treeParent==this)) && !this.menu.hasChildVisible)) && this.hasRollover) {
+        with(this.style) {
+                       backgroundColor = this.tree.BGColor;
+               color = this.tree.FontColor
+               }
+               if(this.hasImageRollover)this.imgLyr.src = this.imageSrc;
+    }
+}
+
+function HM_f_MoveTo(xPos,yPos) {
+       this.style.left = xPos + "px";
+       this.style.top = yPos + "px";
+}
+
+function HM_f_ShowIt(on) {
+       if (!(this.tree.TopIsPermanent && (this.tree.treeParent==this))) {
+               if(!this.hasParent || (this.hasParent && this.tree.TopIsPermanent && (this.tree.treeParent==this.parentMenu))) {
+                       var IsVisible = (this.style.visibility == "visible");
+                       if ((on && !IsVisible) || (!on && IsVisible))
+                               eval(on ? this.tree.UponDisplay : this.tree.UponHide)
+               }
+               if (on) this.style.zIndex = ++HM_ZIndex;
+               this.style.visibility = (on) ? "visible" : "hidden";
+       }
+    if (HM_KeepHilite && this.currentItem && this.currentItem.hasRollover) {
+               with(this.currentItem.style){
+                       backgroundColor = this.tree.BGColor;
+                       color = this.tree.FontColor;
+               }
+               if(this.currentItem.hasImageRollover)this.currentItem.imgLyr.src = this.currentItem.imageSrc;
+    }
+    this.currentItem = null;
+}
+
+function HM_f_KeepInWindow() {
+    var ExtraSpace     = 10;
+       var WindowLeftEdge = (HM_IE) ? document.body.scrollLeft   : window.pageXOffset;
+       var WindowTopEdge  = (HM_IE) ? document.body.scrollTop    : window.pageYOffset;
+       var WindowWidth    = (HM_IE) ? document.body.clientWidth  : window.innerWidth;
+       var WindowHeight   = (HM_IE) ? document.body.clientHeight : window.innerHeight;
+       var WindowRightEdge  = (WindowLeftEdge + WindowWidth) - ExtraSpace;
+       var WindowBottomEdge = (WindowTopEdge + WindowHeight) - ExtraSpace;
+
+       var MenuLeftEdge = this.xPos;
+       var MenuRightEdge = MenuLeftEdge + this.offsetWidth;
+       var MenuBottomEdge = this.yPos + this.offsetHeight;
+
+       if (this.hasParent) {
+               var ParentLeftEdge = this.parentItem.oL;
+       }
+       if (MenuRightEdge > WindowRightEdge) {
+               if (this.hasParent) {
+                       this.xPos = ((ParentLeftEdge - this.parentItem.DistanceToLeftEdge) + this.parentItem.ChildOverlap) - this.offsetWidth;
+               }
+               else {
+                       dif = MenuRightEdge - WindowRightEdge;
+                       this.xPos -= dif;
+               }
+               this.xPos = Math.max(5,this.xPos);
+       }
+
+       if (MenuBottomEdge > WindowBottomEdge) {
+               dif = MenuBottomEdge - WindowBottomEdge;
+               this.yPos -= dif;
+       }
+
+       if (MenuLeftEdge < WindowLeftEdge) {
+               if (this.hasParent) {
+                       this.xPos = (ParentLeftEdge + this.parentItem.DistanceToRightEdge) - this.parentItem.ChildOverlap;
+                       MenuRightEdge = this.xPos + this.offsetWidth;
+                       if(MenuRightEdge > WindowRightEdge) this.xPos -= (MenuRightEdge - WindowRightEdge);
+               }
+               else {this.xPos = 5}
+       }       
+}
+
+function HM_f_LinkIt() {
+    if (this.linkText.indexOf("javascript:")!=-1) eval(this.linkText)
+    else {
+               HM_f_HideAll();
+               location.href = this.linkText;
+       }
+}
+
+function HM_f_PopDown(menuname){
+    if (!HM_AreLoaded || !HM_AreCreated) return;
+       menuname = menuname.replace("elMenu",HM_MenuIDPrefix);
+    var MenuToHide = document.getElementById(menuname);
+       if(!MenuToHide)return;
+    MenuToHide.isOn = false;
+    if (!HM_ClickKill) MenuToHide.hideTop();
+}
+
+function HM_f_HideAll(callingmenu) {
+       for(var i=0; i<HM_TotalTrees; i++) {
+        var TopMenu = HM_a_TopMenus[i].tree.startChild;
+               if(TopMenu == callingmenu)continue
+        TopMenu.isOn = false;
+        if (TopMenu.hasChildVisible) TopMenu.hideChildren();
+        TopMenu.showIt(false);
+    }    
+}
+
+function HM_f_HideTree() { 
+    HM_HideAllTimer = null;
+    if (HM_UserOverMenu) return;
+    if (this.hasChildVisible) this.hideChildren();
+    this.hideParents();
+}
+
+function HM_f_HideTop() {
+       TopMenuToHide = this;
+    (HM_ClickKill) ? TopMenuToHide.hideSelf() : (this.hideTimer = setTimeout("TopMenuToHide.hideSelf()",HM_TopMilliSecondsVisible));
+}
+
+function HM_f_HideSelf() {
+    this.hideTimer = null;
+    if (!this.isOn && !HM_UserOverMenu) this.showIt(false);
+}
+
+function HM_f_HideParents() {
+    var TempMenu = this;
+    while(TempMenu.hasParent) {
+        TempMenu.showIt(false);
+        TempMenu.parentMenu.isOn = false;        
+        TempMenu = TempMenu.parentMenu;
+    }
+    TempMenu.hideTop();
+}
+
+function HM_f_HideChildren(callingitem) {
+    var TempMenu = this.visibleChild;
+    while(TempMenu.hasChildVisible) {
+        TempMenu.visibleChild.showIt(false);
+        TempMenu.hasChildVisible = false;
+        TempMenu = TempMenu.visibleChild;
+    }
+       if((callingitem && (!callingitem.hasMore || this.visibleChild != callingitem.child)) || (!callingitem && !this.isOn)) {
+        this.visibleChild.showIt(false);
+        this.hasChildVisible = false;
+    }
+}
+
+function HM_f_CancelSelect(){return false}
+
+function HM_f_PageClick() {
+    if (!HM_UserOverMenu && HM_CurrentMenu!=null && !HM_CurrentMenu.isOn) HM_f_HideAll();
+}
+
+popUp = HM_f_PopUp;
+popDown = HM_f_PopDown;
+
+function HM_f_ResizeHandler(){
+       var mouse_x_position, mouse_y_position;
+       for(var i=0; i<HM_TotalTrees; i++) {
+        var TopMenu = HM_a_TopMenus[i].tree.startChild;
+               if(TopMenu.style.visibility == "visible") {
+                       TopMenu.oldLeft = TopMenu.xPos;
+                       TopMenu.oldTop = TopMenu.yPos;
+                       mouse_x_position = TopMenu.mouseX;
+                       mouse_y_position = TopMenu.mouseY;
+                       TopMenu.xPos = eval(TopMenu.tree.MenuLeft);
+                       TopMenu.yPos = eval(TopMenu.tree.MenuTop);
+                       if(TopMenu.xPos == null) TopMenu.xPos = TopMenu.xIntended;
+                       if(TopMenu.yPos == null) TopMenu.yPos = TopMenu.yIntended;
+                       if(!TopMenu.tree.TopIsPermanent) TopMenu.keepInWindow();
+                       TopMenu.moveTo(TopMenu.xPos,TopMenu.yPos);
+                       var TempMenu = TopMenu;
+                   while(TempMenu.hasChildVisible) {
+                               TempParent = TempMenu;
+                               TempMenu = TempMenu.visibleChild;
+                               TempMenu.xPos = TempParent.xPos + TempMenu.xDiff;
+                               TempMenu.yPos = TempParent.yPos + TempMenu.yDiff;
+                               if(!TopMenu.tree.TopIsPermanent || (TopMenu.tree.TopIsPermanent && !TopMenu.tree.PositionUnder)) TempMenu.keepInWindow();
+                               TempMenu.moveTo(TempMenu.xPos,TempMenu.yPos);
+                   }
+               }
+    }
+       HM_f_OtherResize();
+}
+
+HM_f_OtherResize = (window.onresize) ? window.onresize :  new Function;
+window.onresize = HM_f_ResizeHandler;
+
+HM_f_OtherOnLoad = (window.onload) ? window.onload :  new Function;
+window.onload = function(){setTimeout("HM_f_StartIt()",10)};
+
+if(HM_IE) {
+       HM_f_OtherOnUnload = (window.onunload) ? window.onunload :  new Function;
+       window.onunload = function(){
+               HM_CurrentMenu = null;
+               HM_CurrentItem = null;
+               HM_CurrentTree.treeParent = null;
+               HM_CurrentTree.startChild = null;
+       
+               var Eclength = HM_a_ElementsCreated.length;
+               for(var i=Eclength-1; i>=0; i--){
+                       TempElement = HM_a_ElementsCreated[i];
+                       TempElement.parentMenu = null;
+                       TempElement.parentItem = null;
+                       TempElement.itemElement = null;
+                       TempElement.currentItem = null;
+                       TempElement.child = null;
+                       TempElement.siblingBelow = null;
+                       TempElement.imgLyr = null;
+               }
+               TempElement = null;
+       
+               for(var i=0; i<HM_TotalTrees; i++) {
+                       HM_a_TopMenus[i].tree.startChild = null;
+                       HM_a_TopMenus[i].tree.treeParent = null;
+               }
+
+               HM_f_OtherOnUnload();
+       }
+}
+
+
+//end
\ No newline at end of file
diff --git a/daemons/graphs/jsmenu/HM_ScriptIE4.js b/daemons/graphs/jsmenu/HM_ScriptIE4.js
new file mode 100644 (file)
index 0000000..7a62c2b
--- /dev/null
@@ -0,0 +1,867 @@
+/*HM_ScriptIE4.js
+* by Peter Belesis. v4.1.1 011002
+* Copyright (c) 2001 Peter Belesis. All Rights Reserved.
+* Originally published and documented at http://www.dhtmlab.com/
+* Available solely from INT Media Group. Incorporated under exclusive license.
+* Contact licensing@internet.com for more information.
+*/
+
+HM_a_Parameters = [
+       ["MenuWidth",          150,             "number"],
+       ["FontFamily",         "Arial,sans-serif"],
+       ["FontSize",           10,              "number"],
+       ["FontBold",           false,   "boolean"],
+       ["FontItalic",         false,   "boolean"],
+       ["FontColor",          "black"],
+       ["FontColorOver",      "white"],
+       ["BGColor",            "white"],
+       ["BGColorOver",        "black"],
+       ["ItemPadding",        3,               "number"],
+       ["BorderWidth",        2,               "number"],
+       ["BorderColor",        "red"],
+       ["BorderStyle",        "solid"],
+       ["SeparatorSize",      1,               "number"],
+       ["SeparatorColor",     "yellow"],
+       ["ImageSrc",           "HM_More_black_right.gif"],
+       ["ImageSrcOver",       null],
+       ["ImageSrcLeft",       "HM_More_black_left.gif"],
+       ["ImageSrcLeftOver",   null],
+       ["ImageSize",          5,               "number"],
+       ["ImageHorizSpace",    0,               "number"],
+       ["ImageVertSpace",     0,               "number"],
+       ["KeepHilite",         false,   "boolean"],
+       ["ClickStart",         false,   "boolean"],
+       ["ClickKill",          true,    "boolean"],
+       ["ChildOverlap",       20,              "number"],
+       ["ChildOffset",        10,              "number"],
+       ["ChildPerCentOver",   null,    "number"],
+       ["TopSecondsVisible",  .5,              "number"],
+       ["ChildSecondsVisible",.3,              "number"],
+       ["StatusDisplayBuild", 1,               "boolean"],
+       ["StatusDisplayLink",  1,               "boolean"],
+       ["UponDisplay",        null,    "delayed"],
+       ["UponHide",           null,    "delayed"],
+       ["RightToLeft",        false,   "boolean"],
+       ["CreateTopOnly",      0,               "boolean"],
+       ["ShowLinkCursor",     false,   "boolean"]
+]
+
+HM_MenuIDPrefix = "HM_Menu";
+HM_ItemIDPrefix = "HM_Item";
+HM_ArrayIDPrefix = "HM_Array";
+
+Function.prototype.isFunction = true;
+Function.prototype.isString = false;
+String.prototype.isFunction = false;
+String.prototype.isString = true;
+String.prototype.isBoolean = false;
+String.prototype.isNumber = false;
+Number.prototype.isString = false;
+Number.prototype.isFunction = false;
+Number.prototype.isBoolean = false;
+Number.prototype.isNumber = true;
+Boolean.prototype.isString = false;
+Boolean.prototype.isFunction = false;
+Boolean.prototype.isBoolean = true;
+Boolean.prototype.isNumber = false;
+Array.prototype.itemValidation = false;
+Array.prototype.isArray = true;
+
+function HM_f_AssignParameters(paramarray){
+       var ParamName = paramarray[0];
+       var DefaultValue = paramarray[1];
+       var FullParamName = "HM_" + ParamName;
+
+       if (typeof eval("window.HM_PG_" + ParamName) == "undefined") {
+               if (typeof eval("window.HM_GL_" + ParamName) == "undefined") {
+                       eval(FullParamName + "= DefaultValue");
+               }
+               else {
+                       eval(FullParamName + "= HM_GL_" + ParamName);
+               }
+       }
+       else {
+               eval(FullParamName + "= HM_PG_" + ParamName);
+       }
+
+       paramarray[0] = FullParamName;
+       paramarray[1] = eval(FullParamName);
+}
+
+function HM_f_EvalParameters(valuenew,valueold,valuetype){
+       var TestString, ParPosition;
+
+       if(typeof valuenew == "undefined" || valuenew == null || (valuenew.isString && valuenew.length == 0)){
+               return valueold;
+       }
+
+       if(valuetype != "delayed"){
+               while(valuenew.isString) {
+                       ParPosition = valuenew.indexOf("(");
+                       if(ParPosition !=-1) {
+                               TestString = "window." + valuenew.substr(0,ParPosition);
+                               if (typeof eval(TestString) != "undefined" && eval(TestString).isFunction) {
+                                       valuenew = eval(valuenew);
+                               }
+                       }
+                       else break
+               }
+       }
+
+       while(valuenew.isFunction) {valuenew = valuenew()}
+
+       switch(valuetype){      
+               case "number":
+                       while (valuenew.isString) {valuenew = eval(valuenew)}
+                       break;
+               case "boolean":
+                       while (!valuenew.isBoolean) {
+                               valuenew = (valuenew.isNumber) ? valuenew ? true : false : eval(valuenew);
+                       }
+                       break;
+       }
+
+       return valuenew;
+}
+
+for (i=0;i<HM_a_Parameters.length;i++) {
+       HM_f_AssignParameters(HM_a_Parameters[i]);
+       eval(HM_a_Parameters[i][0] + "= HM_f_EvalParameters("+ HM_a_Parameters[i][0] +",null,HM_a_Parameters[i][2])")
+}
+
+HM_ChildPerCentOver = (isNaN(parseFloat(HM_ChildPerCentOver))) ? null : parseFloat(HM_ChildPerCentOver)/100;
+
+HM_ChildMilliSecondsVisible = HM_ChildSecondsVisible * 1000;
+
+function HM_f_ValidateArray(arrayname){
+       var MenuArrayIsValid = false;
+       var MenuArrayIsObject = (typeof eval("window." + arrayname) == "object");
+       if(MenuArrayIsObject) { 
+               var TheMenuArray = eval(arrayname);
+               if(TheMenuArray.isArray && TheMenuArray.length > 1) {
+                       MenuArrayIsValid = true;
+                       if(!TheMenuArray.itemValidation) {
+                               while((typeof TheMenuArray[TheMenuArray.length-1] != "object") || (!TheMenuArray[TheMenuArray.length-1].isArray)) {
+                                       TheMenuArray.length--;
+                               }
+                               TheMenuArray.itemValidation = true;
+                       }
+               }
+       }
+       return MenuArrayIsValid;
+}
+
+if(!window.HM_a_TreesToBuild) {
+       HM_a_TreesToBuild = [];
+       for(i=1; i<100; i++){
+               if(HM_f_ValidateArray(HM_ArrayIDPrefix + i)) HM_a_TreesToBuild[HM_a_TreesToBuild.length] = i;
+       }
+}
+
+HM_CurrentArray = null;
+HM_CurrentTree  = null;
+HM_CurrentMenu  = null;
+HM_CurrentItem  = null;
+HM_a_TopMenus = [];
+HM_AreLoaded = false;
+HM_AreCreated = false;
+HM_BeingCreated = false;
+HM_UserOverMenu = false;
+HM_HideAllTimer = null;
+HM_TotalTrees = 0; 
+HM_ZIndex = 5000;
+
+function propertyTransfer(){
+       this.obj = eval(this.id + "Obj");
+       for (temp in this.obj) {this[temp] = this.obj[temp]}
+}
+
+function HM_f_StartIt() {
+       if((typeof(document.body) == "undefined") || (document.body == null)) return;
+       if(HM_AreCreated) return;
+       HM_AreLoaded = true;
+       if (HM_ClickKill) {
+               HM_f_OtherMouseDown = (document.onmousedown) ? document.onmousedown : new Function;
+       document.onmousedown = function(){HM_f_PageClick();HM_f_OtherMouseDown()}
+    }
+       else {
+               HM_TopMilliSecondsVisible = HM_TopSecondsVisible * 1000;
+       }
+    HM_f_MakeTrees();
+       HM_f_OtherOnLoad();
+}
+
+function HM_f_MakeTrees(){
+    HM_BeingCreated = true;
+       var TreeParams = null;
+       var TreeHasChildren = false;
+       var ItemArray = null;
+
+       for(var t=0; t<HM_a_TreesToBuild.length; t++) {
+               if(!HM_f_ValidateArray(HM_ArrayIDPrefix + HM_a_TreesToBuild[t])) continue;
+               HM_CurrentArray = eval(HM_ArrayIDPrefix + HM_a_TreesToBuild[t]);
+
+               TreeParams = HM_CurrentArray[0];
+               TreeHasChildren = false;
+
+               for(var i=1; i<HM_CurrentArray.length; i++) {
+                       ItemArray = HM_CurrentArray[i];
+                       if(ItemArray[ItemArray.length-1]) {TreeHasChildren = true; break}
+               }
+
+               HM_CurrentTree = {
+                       MenuWidth        : MenuWidth = HM_f_EvalParameters(TreeParams[0],HM_MenuWidth,"number"),
+                       MenuLeft         : MenuLeft = HM_f_EvalParameters(TreeParams[1],null,"delayed"),
+                       MenuTop          : MenuTop = HM_f_EvalParameters(TreeParams[2],null,"delayed"),
+                       ItemWidth        : MenuWidth - (HM_BorderWidth*2),
+                       FontColor        : HM_f_EvalParameters(TreeParams[3],HM_FontColor),
+                       FontColorOver    : HM_f_EvalParameters(TreeParams[4],HM_FontColorOver),
+                       BGColor          : HM_f_EvalParameters(TreeParams[5],HM_BGColor),
+                       BGColorOver      : HM_f_EvalParameters(TreeParams[6],HM_BGColorOver),
+                       BorderColor      : HM_f_EvalParameters(TreeParams[7],HM_BorderColor),
+                       SeparatorColor   : HM_f_EvalParameters(TreeParams[8],HM_SeparatorColor),
+                       TopIsPermanent   : ((MenuLeft == null) || (MenuTop == null)) ? false : HM_f_EvalParameters(TreeParams[9],false,"boolean"),
+                       TopIsHorizontal  : TopIsHorizontal = HM_f_EvalParameters(TreeParams[10],false,"boolean"),
+                       TreeIsHorizontal : TreeHasChildren ? HM_f_EvalParameters(TreeParams[11],false,"boolean") : false,
+                       PositionUnder    : (!TopIsHorizontal || !TreeHasChildren) ? false : HM_f_EvalParameters(TreeParams[12],false,"boolean"),
+                       TopImageShow     : TreeHasChildren ? HM_f_EvalParameters(TreeParams[13],true,"boolean")  : false,
+                       TreeImageShow    : TreeHasChildren ? HM_f_EvalParameters(TreeParams[14],true,"boolean")  : false,
+                       UponDisplay      : HM_f_EvalParameters(TreeParams[15],HM_UponDisplay,"delayed"),
+                       UponHide         : HM_f_EvalParameters(TreeParams[16],HM_UponHide,"delayed"),
+                       RightToLeft      : HM_f_EvalParameters(TreeParams[17],HM_RightToLeft,"boolean"),
+                       ClickStart               : HM_f_EvalParameters(TreeParams[18],HM_ClickStart,"boolean"),
+                       TopIsVariableWidth  : HM_f_EvalParameters(TreeParams[19],false,"boolean"),
+                       TreeIsVariableWidth  : HM_f_EvalParameters(TreeParams[20],false,"boolean")
+               }
+
+               HM_CurrentMenu = null;
+               HM_f_MakeMenu(HM_a_TreesToBuild[t]);
+               HM_a_TopMenus[HM_TotalTrees] = HM_CurrentTree.treeParent;
+               HM_TotalTrees++;
+               if(HM_CurrentTree.TopIsPermanent){
+                       with(HM_CurrentTree.treeParent) {
+                               HM_CurrentTree.treeParent.xPos = eval(HM_CurrentTree.MenuLeft);
+                               HM_CurrentTree.treeParent.yPos = eval(HM_CurrentTree.MenuTop);
+                               moveTo(HM_CurrentTree.treeParent.xPos,HM_CurrentTree.treeParent.yPos);
+                               style.zIndex = HM_ZIndex;
+                               setTimeout(HM_CurrentTree.treeParent.id + ".fixSize(true)",10);
+                       }
+               }
+    }
+
+       if(HM_StatusDisplayBuild) status = HM_TotalTrees + " Hierarchical Menu Trees Created";
+    HM_AreCreated = true;
+    HM_BeingCreated = false;
+}
+
+function HM_f_GetItemDivStr(itemid,disptext,hasmore){
+       var WidthValue = HM_CurrentMenu.isHorizontal ? (ItemElement.isLastItem) ? (HM_CurrentTree.MenuWidth - HM_BorderWidth - HM_SeparatorSize) : (HM_CurrentTree.MenuWidth - HM_BorderWidth) : HM_CurrentTree.ItemWidth;
+       var TempString = "<DIV ID=" + itemid + " STYLE='position:absolute;width:" + WidthValue + "px'>";
+       if(HM_CurrentMenu.showImage) {
+               var FullPadding  = (HM_ItemPadding*2) + HM_ImageSize + HM_ImageHorizSpace;
+       }
+    if(hasmore && HM_CurrentMenu.showImage) {
+               var ImgSrc      = HM_CurrentTree.RightToLeft ? HM_ImageSrcLeft : HM_ImageSrc;
+               var ImgStyle    = "top:"+ (HM_ItemPadding + HM_ImageVertSpace) + "px;width:"+ HM_ImageSize + "px;";
+               var ImgString   = "<IMG ID='HM_ImMore' STYLE='position:absolute;"+ ImgStyle +"' SRC='" + ImgSrc + "' HSPACE=0 VSPACE=0 BORDER=0>";
+               TempString += ImgString;
+       }
+       TempString += disptext + "</DIV>";
+       return TempString;
+}
+
+function HM_f_SetItemProperties(itemid,itemidsuffix) {
+       this.tree        = HM_CurrentTree;
+       this.itemsetup   = HM_f_ItemSetup;
+       this.index       = HM_CurrentMenu.itemCount - 1;
+       this.isLastItem  = (HM_CurrentMenu.itemCount == HM_CurrentMenu.maxItems);
+       this.array               = HM_CurrentMenu.array[HM_CurrentMenu.itemCount];
+       this.dispText    = this.array[0];
+       this.linkText    = this.array[1];
+       this.permHilite  = HM_f_EvalParameters(this.array[3],false,"boolean");
+       this.hasRollover = (!this.permHilite && HM_f_EvalParameters(this.array[2],true,"boolean"));
+       this.hasMore     = HM_f_EvalParameters(this.array[4],false,"boolean") && HM_f_ValidateArray(HM_ArrayIDPrefix + itemidsuffix);
+       this.childID     = this.hasMore ? (HM_MenuIDPrefix + itemidsuffix) : null;
+       this.child               = null;
+    this.onmouseover = HM_f_ItemOver;
+    this.onmouseout  = HM_f_ItemOut;
+       this.setItemStyle = HM_f_SetItemStyle;
+       this.itemStr     = HM_f_GetItemDivStr(itemid,this.dispText,this.hasMore);
+       this.showChild   = HM_f_ShowChild;
+       this.ChildOverlap = null;
+}
+
+function HM_f_Make4ItemElement(menucount) {
+       var ItemIDSuffix = menucount + "_" + HM_CurrentMenu.itemCount;
+       var LayerID  = HM_ItemIDPrefix + ItemIDSuffix;
+       var ObjectID = LayerID + "Obj";
+       eval(ObjectID + " = new Object()");
+       ItemElement = eval(ObjectID);
+       ItemElement.setItemProperties = HM_f_SetItemProperties;
+       ItemElement.setItemProperties(LayerID,ItemIDSuffix);
+       return ItemElement;
+}
+
+function HM_f_MakeElement(menuid) {
+       var MenuObject;
+       var LayerID  = menuid;
+       var ObjectID = LayerID + "Obj";
+       eval(ObjectID + " = new Object()"); 
+       MenuObject = eval(ObjectID);
+       return MenuObject;
+}
+
+function HM_f_MakeMenu(menucount) {
+       if(!HM_f_ValidateArray(HM_ArrayIDPrefix + menucount)) return false;
+       HM_CurrentArray = eval(HM_ArrayIDPrefix + menucount);
+       NewMenu = document.all(HM_MenuIDPrefix + menucount);
+       if(!NewMenu) {
+               NewMenu = HM_f_MakeElement(HM_MenuIDPrefix + menucount);
+               NewMenu.array = HM_CurrentArray;
+               NewMenu.tree  = HM_CurrentTree;
+
+               if(HM_CurrentMenu) {
+                       NewMenu.parentMenu = HM_CurrentMenu;
+                       NewMenu.parentItem = HM_CurrentMenu.itemElement;
+                       NewMenu.parentItem.child = NewMenu;
+                       NewMenu.hasParent = true;
+                       NewMenu.isHorizontal = HM_CurrentTree.TreeIsHorizontal;
+                       NewMenu.showImage = HM_CurrentTree.TreeImageShow;
+               }
+               else {
+                       NewMenu.isHorizontal = HM_CurrentTree.TopIsHorizontal;
+                       NewMenu.showImage = HM_CurrentTree.TopImageShow;
+               }
+       
+               HM_CurrentMenu = NewMenu;
+               HM_CurrentMenu.itemCount = 0;
+               HM_CurrentMenu.maxItems = HM_CurrentMenu.array.length - 1;
+               HM_CurrentMenu.showIt = HM_f_ShowIt;
+               HM_CurrentMenu.keepInWindow = HM_f_KeepInWindow;
+           HM_CurrentMenu.onmouseover = HM_f_MenuOver;
+           HM_CurrentMenu.onmouseout = HM_f_MenuOut;
+           HM_CurrentMenu.hideTree = HM_f_HideTree
+           HM_CurrentMenu.hideParents = HM_f_HideParents;
+           HM_CurrentMenu.hideChildren = HM_f_HideChildren;
+           HM_CurrentMenu.hideTop = HM_f_HideTop;
+           HM_CurrentMenu.hideSelf = HM_f_HideSelf;
+               HM_CurrentMenu.count = menucount;
+           HM_CurrentMenu.hasChildVisible = false;
+           HM_CurrentMenu.isOn = false;
+           HM_CurrentMenu.hideTimer = null;
+           HM_CurrentMenu.currentItem = null;
+               HM_CurrentMenu.setMenuStyle = HM_f_SetMenuStyle;
+               HM_CurrentMenu.sizeFixed = false;
+               HM_CurrentMenu.fixSize = HM_f_FixSize;
+               HM_CurrentMenu.onselectstart = HM_f_CancelSelect;
+       HM_CurrentMenu.moveTo = HM_f_MoveTo;
+               HM_CurrentMenu.IsVariableWidth = ((HM_CurrentMenu.hasParent && HM_CurrentTree.TreeIsVariableWidth) || (!HM_CurrentMenu.hasParent && HM_CurrentTree.TopIsVariableWidth));
+               HM_CurrentMenu.htmlString = "<DIV ID='" + HM_MenuIDPrefix + menucount +"' STYLE='position:absolute;visibility:hidden;width:"+ HM_CurrentTree.MenuWidth +"'>";
+       }
+
+       while (HM_CurrentMenu.itemCount < HM_CurrentMenu.maxItems) {
+               HM_CurrentMenu.itemCount++;
+
+               HM_CurrentItem = document.all(HM_ItemIDPrefix + menucount + "_" + HM_CurrentMenu.itemCount);
+               if(!HM_CurrentItem) {
+                       if(HM_StatusDisplayBuild) status = "Creating Hierarchical Menus: " + menucount + " / " + HM_CurrentMenu.itemCount;
+                       HM_CurrentMenu.itemElement = HM_f_Make4ItemElement(menucount);
+                       HM_CurrentMenu.htmlString += HM_CurrentMenu.itemElement.itemStr;
+               }
+               if(HM_CurrentMenu.itemElement.hasMore && (!HM_CreateTopOnly || HM_AreCreated && HM_CreateTopOnly)) {
+               MenuCreated = HM_f_MakeMenu(menucount + "_" + HM_CurrentMenu.itemCount);
+            if(MenuCreated) {
+                               HM_CurrentMenu = HM_CurrentMenu.parentMenu;
+                       }
+        }
+    }
+
+       document.body.insertAdjacentHTML("BeforeEnd",HM_CurrentMenu.htmlString + "</DIV>");
+       menuLyr = document.all(HM_MenuIDPrefix + menucount);
+       menuLyr.propertyTransfer = propertyTransfer;
+       menuLyr.propertyTransfer();
+       HM_CurrentMenu = menuLyr;
+       if(!HM_CurrentMenu.hasParent)HM_CurrentTree.treeParent = HM_CurrentTree.startChild = HM_CurrentMenu;
+       HM_CurrentMenu.setMenuStyle();
+    HM_CurrentMenu.items = HM_CurrentMenu.children;
+       HM_CurrentMenu.lastItem = HM_CurrentMenu.items[HM_CurrentMenu.items.length-1];
+    for(var i=0; i<HM_CurrentMenu.items.length; i++) {
+        it = HM_CurrentMenu.items[i];
+               it.siblingBelow = i>0 ? HM_CurrentMenu.items[i-1] : null;
+               it.propertyTransfer = propertyTransfer;
+               it.propertyTransfer();
+               it.itemsetup(i+1);
+       }
+       HM_CurrentMenu.moveTo(0,0);
+       return HM_CurrentMenu;
+}
+
+function HM_f_SetMenuStyle(){
+       with(this.style) {
+               borderWidth = HM_BorderWidth + "px";
+               borderColor = HM_CurrentTree.BorderColor;
+               borderStyle = HM_BorderStyle;
+               overflow    = "hidden";
+               cursor      = "default";
+       }
+}
+
+function HM_f_SetItemStyle() {
+       with(this.style){
+               backgroundColor = (this.permHilite) ? HM_CurrentTree.BGColorOver : HM_CurrentTree.BGColor;
+               color           = (this.permHilite) ? HM_CurrentTree.FontColorOver : HM_CurrentTree.FontColor;
+               font            = ((HM_FontBold) ? "bold " : "normal ") + HM_FontSize + "pt " + HM_FontFamily;
+               padding         = HM_ItemPadding + "px";
+               fontStyle       = (HM_FontItalic) ? "italic" : "normal";
+               overflow        = "hidden";
+               pixelWidth      = HM_CurrentTree.ItemWidth;
+
+               if((this.menu.showImage && (!this.menu.IsVariableWidth || (this.menu.IsVariableWidth && this.tree.RightToLeft && !this.menu.isHorizontal))) || (this.menu.IsVariableWidth && this.imgLyr)) {
+
+                       var FullPadding  = (HM_ItemPadding*2) + HM_ImageSize + HM_ImageHorizSpace;
+                       if (this.tree.RightToLeft) paddingLeft = FullPadding + "px";
+                       else paddingRight = FullPadding + "px";
+               }
+               if(!this.isLastItem) {
+                       var SeparatorString = HM_SeparatorSize + "px solid " + this.tree.SeparatorColor;
+                       if (this.menu.isHorizontal) borderRight = SeparatorString;
+                       else borderBottom = SeparatorString;
+               }
+
+               if(this.menu.isHorizontal){
+                       pixelTop = 0;
+                       if(this.menu.IsVariableWidth) {
+                               this.realWidth = this.scrollWidth;
+                               if(this.isLastItem) pixelWidth = this.realWidth;
+                               else pixelWidth = (this.realWidth + HM_SeparatorSize);
+                               pixelLeft = this.index ? (this.siblingBelow.style.pixelLeft + this.siblingBelow.style.pixelWidth) : 0;
+                               if(this.isLastItem) {
+                                       LeftAndWidth = pixelLeft + pixelWidth;
+                                       this.menu.style.pixelWidth = LeftAndWidth + (HM_BorderWidth * 2);
+                               }
+
+                       }
+                       else {
+                               if(this.isLastItem) pixelWidth = (HM_CurrentTree.MenuWidth - HM_BorderWidth - HM_SeparatorSize);
+                               else pixelWidth = (HM_CurrentTree.MenuWidth - HM_BorderWidth);
+                               pixelLeft = (this.index * (HM_CurrentTree.MenuWidth - HM_BorderWidth));
+                               var LeftAndWidth = pixelLeft + pixelWidth;
+                               this.menu.style.pixelWidth = LeftAndWidth + (HM_BorderWidth * 2);
+                       }
+               }
+               else {
+                       pixelLeft = 0;
+               }
+       }
+}
+
+function HM_f_FixSize(makevis){
+       if(this.isHorizontal) {
+               var MaxItemHeight = 0;
+           for(i=0; i<this.items.length; i++) {
+               var TempItem = this.items[i];
+                   if (TempItem.index) {
+                               var SiblingHeight = TempItem.siblingBelow.scrollHeight;
+                               MaxItemHeight = Math.max(MaxItemHeight,SiblingHeight);
+                       }
+               else{
+                               MaxItemHeight = TempItem.scrollHeight;
+                       }
+               }
+           for(i=0; i<this.items.length; i++) {
+               var TempItem = this.items[i];
+                       TempItem.style.pixelHeight = MaxItemHeight;
+                       if(TempItem.imgLyr) {
+                               if(this.tree.RightToLeft){
+                                       TempItem.imgLyr.style.pixelLeft = (HM_ItemPadding + HM_ImageHorizSpace);
+                               }
+                               else {
+                                       TempItem.imgLyr.style.pixelLeft = TempItem.style.pixelWidth - ((TempItem.isLastItem ? 0 : HM_SeparatorSize) + HM_ItemPadding + HM_ImageHorizSpace + HM_ImageSize);
+                               }
+                       }
+               }
+               this.style.pixelHeight = MaxItemHeight + (HM_BorderWidth * 2);
+       }
+       else {
+               if(this.IsVariableWidth) {
+                       var MaxItemWidth = 0;
+               for(i=0; i<this.items.length; i++) {
+                       var TempItem = this.items[i];
+                               TempItem.style.pixelWidth = TempItem.scrollWidth;
+                               MaxItemWidth = i ? Math.max(MaxItemWidth,TempItem.style.pixelWidth) : TempItem.style.pixelWidth;
+                       }
+               for(i=0; i<this.items.length; i++) {
+                               this.items[i].style.pixelWidth = MaxItemWidth;
+                       }
+                       this.style.pixelWidth = MaxItemWidth + (HM_BorderWidth * 2);
+               }
+           for(i=0; i<this.items.length; i++) {
+               var TempItem = this.items[i];
+                   if (TempItem.index) {
+                               var SiblingHeight =(TempItem.siblingBelow.scrollHeight + HM_SeparatorSize);
+                               TempItem.style.pixelTop = TempItem.siblingBelow.style.pixelTop + SiblingHeight;
+                       }
+                       else TempItem.style.pixelTop = 0;
+                       if(TempItem.imgLyr) {
+                               if(HM_CurrentTree.RightToLeft){
+                                       TempItem.imgLyr.style.pixelLeft = (HM_ItemPadding + HM_ImageHorizSpace);
+                               }
+                               else {
+                                       TempItem.imgLyr.style.pixelLeft = TempItem.style.pixelWidth - (HM_ItemPadding + HM_ImageHorizSpace + HM_ImageSize);
+                               }
+                       }
+               }
+               this.style.pixelHeight = TempItem.style.pixelTop + TempItem.scrollHeight + (HM_BorderWidth * 2);
+       }
+       this.sizeFixed = true;
+       if(makevis)this.style.visibility = "visible";
+}
+
+function HM_f_ItemSetup(whichItem) {
+    this.menu = this.parentElement;
+       this.ClickStart = this.hasMore && this.tree.ClickStart && (this.tree.TopIsPermanent && (this.tree.treeParent==this.menu));
+       if(this.ClickStart) {
+               this.linkText = "";
+               this.onclick = this.showChild;
+       }
+
+    if (this.hasMore) {
+               if(this.menu.showImage){
+                       this.imgLyr = this.children("HM_ImMore");
+                       this.hasImageRollover = ((!this.tree.RightToLeft && HM_ImageSrcOver) || (this.tree.RightToLeft && HM_ImageSrcLeftOver));
+                       if(this.hasImageRollover) {
+                               this.imageSrc = this.tree.RightToLeft ? HM_ImageSrcLeft : HM_ImageSrc;
+                               this.imageSrcOver = this.tree.RightToLeft ? HM_ImageSrcLeftOver : HM_ImageSrcOver;
+                               if(this.permHilite) this.imgLyr.src = this.imageSrcOver;
+                       }
+               }
+
+        this.child = document.all(this.childID);
+        if(this.child) {
+                       this.child.parentMenu = this.menu;
+               this.child.parentItem = this;
+               }
+    }
+       if(this.linkText && !this.ClickStart) {
+               this.onclick = HM_f_LinkIt;
+               if(HM_ShowLinkCursor)this.style.cursor = "hand";
+       }
+
+       this.setItemStyle();
+}
+
+function HM_f_PopUp(menuname){
+    if (!HM_AreLoaded) return;
+       menuname = menuname.replace("elMenu",HM_MenuIDPrefix);
+       var TempMenu = document.all(menuname);
+       if(!TempMenu) return;
+       HM_CurrentMenu = TempMenu;
+       if (HM_CurrentMenu.tree.ClickStart) {
+               var ClickElement = event.srcElement;
+               ClickElement.onclick = HM_f_PopMenu;
+    }
+       else HM_f_PopMenu();
+}
+
+function HM_f_PopMenu(){
+    if (!HM_AreLoaded || !HM_AreCreated) return true;
+    if (HM_CurrentMenu.tree.ClickStart && event.type != "click") return true;
+       var mouse_x_position, mouse_y_position;
+    HM_f_HideAll();
+    HM_CurrentMenu.hasParent = false;
+       HM_CurrentMenu.tree.startChild = HM_CurrentMenu;
+       HM_CurrentMenu.mouseX = mouse_x_position = (event.clientX + document.body.scrollLeft);
+       HM_CurrentMenu.mouseY = mouse_y_position = (event.clientY + document.body.scrollTop);
+       HM_CurrentMenu.xIntended = HM_CurrentMenu.xPos = (HM_CurrentMenu.tree.MenuLeft!=null) ? eval(HM_CurrentMenu.tree.MenuLeft) : mouse_x_position;
+       HM_CurrentMenu.yIntended = HM_CurrentMenu.yPos = (HM_CurrentMenu.tree.MenuTop!=null)  ? eval(HM_CurrentMenu.tree.MenuTop)  : mouse_y_position;
+       if(!HM_CurrentMenu.sizeFixed) HM_CurrentMenu.fixSize(false);
+    HM_CurrentMenu.keepInWindow();
+    HM_CurrentMenu.moveTo(HM_CurrentMenu.xPos,HM_CurrentMenu.yPos);
+    HM_CurrentMenu.isOn = true;
+    HM_CurrentMenu.showIt(true);
+    return false;
+}
+
+function HM_f_MenuOver() {
+       if(!this.tree.startChild){this.tree.startChild = this}
+       if(this.tree.startChild == this) HM_f_HideAll(this)
+    this.isOn = true;
+    HM_UserOverMenu = true;
+    HM_CurrentMenu = this;
+    if (this.hideTimer) clearTimeout(this.hideTimer);
+}
+
+function HM_f_MenuOut() {
+       if(event.srcElement.contains(event.toElement)) return;
+    this.isOn = false;
+    HM_UserOverMenu = false;
+    if(HM_StatusDisplayLink) status = "";
+       if(!HM_ClickKill) {
+               clearTimeout(HM_HideAllTimer);
+               HM_HideAllTimer = null;
+               HM_HideAllTimer = setTimeout("HM_CurrentMenu.hideTree()",HM_ChildMilliSecondsVisible);
+       }
+}
+
+function HM_f_ShowChild(){
+       if(!this.child) {
+               HM_CurrentTree = this.tree;
+               HM_CurrentMenu = this.menu;
+               HM_CurrentItem = this;
+               this.child = HM_f_MakeMenu(this.menu.count + "_"+(this.index+1));
+               this.tree.treeParent = this.menu;
+               this.tree.startChild = this.menu;
+               this.child.parentItem = this;
+       }
+
+       if(!this.child.sizeFixed) this.child.fixSize(false);
+
+       if (this.tree.PositionUnder && (this.menu == this.tree.treeParent)) {
+               this.child.xPos = this.menu.style.pixelLeft + this.style.pixelLeft;
+               this.child.yPos = this.menu.style.pixelTop + this.menu.offsetHeight - (HM_BorderWidth);
+       }
+       else {
+               if(this.ChildOverlap==null) {
+                       this.DistanceToRightEdge = this.style.pixelWidth;
+                       if (!this.menu.isHorizontal || (this.menu.isHorizontal && this.isLastItem)) this.DistanceToRightEdge += HM_BorderWidth;
+                       this.DistanceToLeftEdge = (!this.menu.isHorizontal || (this.menu.isHorizontal && this.index==0)) ? HM_BorderWidth : HM_SeparatorSize;
+                       this.ChildOverlap = (parseInt((HM_ChildPerCentOver != null) ? (HM_ChildPerCentOver  * this.DistanceToRightEdge) : HM_ChildOverlap));
+               }
+
+               this.oL = this.menu.style.pixelLeft + this.offsetLeft + HM_BorderWidth;
+               this.oT = this.menu.style.pixelTop  + this.offsetTop;
+               if(this.tree.RightToLeft) {
+                       this.child.xPos = ((this.oL - this.DistanceToLeftEdge) + this.ChildOverlap) - this.child.style.pixelWidth;
+               }
+               else {          
+                       this.child.xPos = (this.oL + this.DistanceToRightEdge) - this.ChildOverlap;
+               }
+               this.child.yPos = this.oT + HM_ChildOffset + HM_BorderWidth;
+       }
+       this.child.xDiff = this.child.xPos - this.menu.style.pixelLeft;
+       this.child.yDiff = this.child.yPos - this.menu.style.pixelTop;
+       if(!this.tree.PositionUnder || this.menu!=this.tree.treeParent) this.child.keepInWindow();
+       this.child.moveTo(this.child.xPos,this.child.yPos);
+       this.menu.hasChildVisible = true;
+       this.menu.visibleChild = this.child;
+       this.child.showIt(true);
+}
+
+function HM_f_ItemOver(){
+    if (HM_KeepHilite) {
+        if (this.menu.currentItem && this.menu.currentItem != this && this.menu.currentItem.hasRollover) {
+            with(this.menu.currentItem.style){
+                               backgroundColor = this.tree.BGColor;
+               color = this.tree.FontColor
+                       }
+                       if(this.menu.currentItem.hasImageRollover)this.menu.currentItem.imgLyr.src = this.menu.currentItem.imageSrc;
+        }
+    }
+       if(event.srcElement.id == "HM_ImMore") return;
+       if(this.hasRollover) {
+               this.style.backgroundColor = this.tree.BGColorOver;
+               this.style.color = this.tree.FontColorOver;
+               if(this.hasImageRollover)this.imgLyr.src = this.imageSrcOver;
+       }
+    if(HM_StatusDisplayLink) status = this.linkText;
+    this.menu.currentItem = this;
+       if (this.menu.hasChildVisible) {
+               if(this.menu.visibleChild == this.child && this.menu.visibleChild.hasChildVisible) this.menu.visibleChild.hideChildren(this);
+               else this.menu.hideChildren(this);
+    }
+    if (this.hasMore && !this.ClickStart) this.showChild();
+}
+
+function HM_f_ItemOut() {
+       if (event.srcElement.contains(event.toElement)
+         || (event.fromElement.tagName=="IMG" && (event.toElement && event.toElement.contains(event.fromElement))))
+                 return;
+    if ( (!HM_KeepHilite || ((this.tree.TopIsPermanent && (this.tree.treeParent==this)) && !this.menu.hasChildVisible)) && this.hasRollover) {
+               with(this.style) {
+                       backgroundColor = this.tree.BGColor;
+                       color = this.tree.FontColor
+               }
+               if(this.hasImageRollover)this.imgLyr.src = this.imageSrc;
+
+    }
+}
+
+function HM_f_MoveTo(xPos,yPos) {
+       this.style.pixelLeft = xPos;
+       this.style.pixelTop = yPos;
+}
+
+function HM_f_ShowIt(on) {
+       if (!(this.tree.TopIsPermanent && (this.tree.treeParent==this))) {
+               if(!this.hasParent || (this.hasParent && this.tree.TopIsPermanent && (this.tree.treeParent==this.parentMenu))) {
+                       var IsVisible = (this.style.visibility == "visible");
+                       if ((on && !IsVisible) || (!on && IsVisible))
+                               eval(on ? this.tree.UponDisplay : this.tree.UponHide)
+               }
+               if (on) this.style.zIndex = ++HM_ZIndex;
+               this.style.visibility = (on) ? "visible" : "hidden";
+       }
+    if (HM_KeepHilite && this.currentItem && this.currentItem.hasRollover) {
+               with(this.currentItem.style){
+                       backgroundColor = this.tree.BGColor;
+                       color = this.tree.FontColor;
+               }
+               if(this.currentItem.hasImageRollover)this.currentItem.imgLyr.src = this.currentItem.imageSrc;
+    }
+    this.currentItem = null;
+}
+
+function HM_f_KeepInWindow() {
+    var ExtraSpace     = 10;
+       var WindowLeftEdge = document.body.scrollLeft;
+       var WindowTopEdge  = document.body.scrollTop;
+       var WindowWidth    = document.body.clientWidth;
+       var WindowHeight   = document.body.clientHeight;
+       var WindowRightEdge  = (WindowLeftEdge + WindowWidth) - ExtraSpace;
+       var WindowBottomEdge = (WindowTopEdge + WindowHeight) - ExtraSpace;
+
+       var MenuLeftEdge = this.xPos;
+       var MenuRightEdge = MenuLeftEdge + this.style.pixelWidth;
+       var MenuBottomEdge = this.yPos + this.style.pixelHeight;
+
+       if (this.hasParent) {
+               var ParentLeftEdge = this.parentItem.oL;
+       }
+       if (MenuRightEdge > WindowRightEdge) {
+               if (this.hasParent) {
+                       this.xPos = ((ParentLeftEdge - this.parentItem.DistanceToLeftEdge) + this.parentItem.ChildOverlap) - this.offsetWidth;
+               }
+               else {
+                       dif = MenuRightEdge - WindowRightEdge;
+                       this.xPos -= dif;
+               }
+               this.xPos = Math.max(5,this.xPos);
+       }
+
+       if (MenuBottomEdge > WindowBottomEdge) {
+               dif = MenuBottomEdge - WindowBottomEdge;
+               this.yPos -= dif;
+       }
+
+       if (MenuLeftEdge < WindowLeftEdge) {
+               if (this.hasParent) {
+                       this.xPos = (ParentLeftEdge + this.parentItem.DistanceToRightEdge) - this.parentItem.ChildOverlap;
+                       MenuRightEdge = this.xPos + this.style.pixelWidth;
+                       if(MenuRightEdge > WindowRightEdge) this.xPos -= (MenuRightEdge - WindowRightEdge);
+               }
+               else {this.xPos = 5}
+       }
+}
+
+function HM_f_LinkIt() {
+    if (this.linkText.indexOf("javascript:")!=-1) eval(this.linkText)
+    else {
+               HM_f_HideAll();
+               location.href = this.linkText;
+       }
+}
+
+function HM_f_PopDown(menuname){
+    if (!HM_AreLoaded || !HM_AreCreated) return;
+       menuname = menuname.replace("elMenu",HM_MenuIDPrefix);
+    var MenuToHide = document.all(menuname);
+       if(!MenuToHide)return;
+    MenuToHide.isOn = false;
+    if (!HM_ClickKill) MenuToHide.hideTop();
+}
+
+function HM_f_HideAll(callingmenu) {
+       for(var i=0; i<HM_TotalTrees; i++) {
+        var TopMenu = HM_a_TopMenus[i].tree.startChild;
+               if(TopMenu == callingmenu)continue
+        TopMenu.isOn = false;
+        if (TopMenu.hasChildVisible) TopMenu.hideChildren();
+        TopMenu.showIt(false);
+    }    
+}
+
+function HM_f_HideTree() { 
+    HM_HideAllTimer = null;
+    if (HM_UserOverMenu) return;
+    if (this.hasChildVisible) this.hideChildren();
+    this.hideParents();
+}
+
+function HM_f_HideTop() {
+       TopMenuToHide = this;
+    (HM_ClickKill) ? TopMenuToHide.hideSelf() : (this.hideTimer = setTimeout("TopMenuToHide.hideSelf()",HM_TopMilliSecondsVisible));
+}
+
+function HM_f_HideSelf() {
+    this.hideTimer = null;
+    if (!this.isOn && !HM_UserOverMenu) this.showIt(false);
+}
+
+function HM_f_HideParents() {
+    var TempMenu = this;
+    while(TempMenu.hasParent) {
+        TempMenu.showIt(false);
+        TempMenu.parentMenu.isOn = false;        
+        TempMenu = TempMenu.parentMenu;
+    }
+    TempMenu.hideTop();
+}
+
+function HM_f_HideChildren(callingitem) {
+    var TempMenu = this.visibleChild;
+    while(TempMenu.hasChildVisible) {
+        TempMenu.visibleChild.showIt(false);
+        TempMenu.hasChildVisible = false;
+        TempMenu = TempMenu.visibleChild;
+    }
+       if((callingitem && (!callingitem.hasMore || this.visibleChild != callingitem.child)) || (!callingitem && !this.isOn)) {
+               this.visibleChild.showIt(false);
+               this.hasChildVisible = false;
+       }
+}
+
+function HM_f_CancelSelect(){return false}
+
+function HM_f_PageClick() {
+    if (!HM_UserOverMenu && HM_CurrentMenu!=null && !HM_CurrentMenu.isOn) HM_f_HideAll();
+}
+
+popUp = HM_f_PopUp;
+popDown = HM_f_PopDown;
+
+function HM_f_ResizeHandler(){
+       var mouse_x_position, mouse_y_position;
+       for(var i=0; i<HM_TotalTrees; i++) {
+        var TopMenu = HM_a_TopMenus[i].tree.startChild;
+               if(TopMenu.style.visibility == "visible") {
+                       TopMenu.oldLeft = TopMenu.xPos;
+                       TopMenu.oldTop = TopMenu.yPos;
+                       mouse_x_position = TopMenu.mouseX;
+                       mouse_y_position = TopMenu.mouseY;
+                       TopMenu.xPos = eval(TopMenu.tree.MenuLeft);
+                       TopMenu.yPos = eval(TopMenu.tree.MenuTop);
+                       if(TopMenu.xPos == null) TopMenu.xPos = TopMenu.xIntended;
+                       if(TopMenu.yPos == null) TopMenu.yPos = TopMenu.yIntended;
+                       if(!TopMenu.tree.TopIsPermanent) TopMenu.keepInWindow();
+                       TopMenu.moveTo(TopMenu.xPos,TopMenu.yPos);
+                       var TempMenu = TopMenu;
+                   while(TempMenu.hasChildVisible) {
+                               TempParent = TempMenu;
+                               TempMenu = TempMenu.visibleChild;
+                               TempMenu.xPos = TempParent.xPos + TempMenu.xDiff;
+                               TempMenu.yPos = TempParent.yPos + TempMenu.yDiff;
+                               if(!TopMenu.tree.TopIsPermanent || (TopMenu.tree.TopIsPermanent && !TopMenu.tree.PositionUnder)) TempMenu.keepInWindow();
+                               TempMenu.moveTo(TempMenu.xPos,TempMenu.yPos);
+                   }
+               }
+    }
+       HM_f_OtherResize();
+}
+
+HM_f_OtherResize = (window.onresize) ? window.onresize :  new Function;
+window.onresize = HM_f_ResizeHandler;
+
+HM_f_OtherOnLoad = (window.onload) ? window.onload :  new Function;
+window.onload = function(){setTimeout("HM_f_StartIt()",10)};
+
+//end
\ No newline at end of file
diff --git a/daemons/graphs/jsmenu/HM_ScriptNS4.js b/daemons/graphs/jsmenu/HM_ScriptNS4.js
new file mode 100644 (file)
index 0000000..01eb249
--- /dev/null
@@ -0,0 +1,805 @@
+/*HM_ScriptNS4.js
+* by Peter Belesis. v4.1.1 011002
+* Copyright (c) 2001 Peter Belesis. All Rights Reserved.
+* Originally published and documented at http://www.dhtmlab.com/
+* Available solely from INT Media Group. Incorporated under exclusive license.
+* Contact licensing@internet.com for more information.
+*/
+
+HM_a_Parameters = [
+       ["MenuWidth",          150,             "number"],
+       ["FontFamily",         "Arial,sans-serif"],
+       ["FontSize",           10,              "number"],
+       ["FontBold",           false,   "boolean"],
+       ["FontItalic",         false,   "boolean"],
+       ["FontColor",          "black"],
+       ["FontColorOver",      "white"],
+       ["BGColor",            "white"],
+       ["BGColorOver",        "black"],
+       ["ItemPadding",        3,               "number"],
+       ["BorderWidth",        2,               "number"],
+       ["BorderColor",        "red"],
+       ["SeparatorSize",      1,               "number"],
+       ["ImageSrc",           "HM_More_black_right.gif"],
+       ["ImageSrcOver",       null],
+       ["ImageSrcLeft",       "HM_More_black_left.gif"],
+       ["ImageSrcLeftOver",   null],
+       ["ImageSize",          5,               "number"],
+       ["ImageHorizSpace",    0,               "number"],
+       ["ImageVertSpace",     0,               "number"],
+       ["KeepHilite",         false,   "boolean"],
+       ["ClickStart",         false,   "boolean"],
+       ["ClickKill",          true,    "boolean"],
+       ["ChildOverlap",       20,              "number"],
+       ["ChildOffset",        10,              "number"],
+       ["ChildPerCentOver",   null,    "number"],
+       ["TopSecondsVisible",  .5,              "number"],
+       ["ChildSecondsVisible",.3,              "number"],
+       ["StatusDisplayBuild", 1,               "boolean"],
+       ["StatusDisplayLink",  1,               "boolean"],
+       ["UponDisplay",        null,    "delayed"],
+       ["UponHide",           null,    "delayed"],
+       ["RightToLeft",        false,   "boolean"],
+       ["CreateTopOnly",      0,               "boolean"],
+       ["ShowLinkCursor",     false,   "boolean"],
+       ["NSFontOver",             true,        "boolean"]
+]
+
+HM_MenuIDPrefix = "HM_Menu";
+HM_ItemIDPrefix = "HM_Item";
+HM_ArrayIDPrefix = "HM_Array";
+
+Function.prototype.isFunction = true;
+Function.prototype.isString = false;
+String.prototype.isFunction = false;
+String.prototype.isString = true;
+String.prototype.isBoolean = false;
+String.prototype.isNumber = false;
+Number.prototype.isString = false;
+Number.prototype.isFunction = false;
+Number.prototype.isBoolean = false;
+Number.prototype.isNumber = true;
+Boolean.prototype.isString = false;
+Boolean.prototype.isFunction = false;
+Boolean.prototype.isBoolean = true;
+Boolean.prototype.isNumber = false;
+Array.prototype.itemValidation = false;
+Array.prototype.isArray = true;
+
+
+function HM_f_AssignParameters(paramarray){
+       var ParamName = paramarray[0];
+       var DefaultValue = paramarray[1];
+       var FullParamName = "HM_" + ParamName;
+
+       if (typeof eval("window.HM_PG_" + ParamName) == "undefined") {
+               if (typeof eval("window.HM_GL_" + ParamName) == "undefined") {
+                       eval(FullParamName + "= DefaultValue");
+               }
+               else {
+                       eval(FullParamName + "= HM_GL_" + ParamName);
+               }
+       }
+       else {
+               eval(FullParamName + "= HM_PG_" + ParamName);
+       }
+
+       paramarray[0] = FullParamName;
+       paramarray[1] = eval(FullParamName);
+}
+
+function HM_f_EvalParameters(valuenew,valueold,valuetype){
+       var TestString, ParPosition;
+
+       if(typeof valuenew == "undefined" || valuenew == null || (valuenew.isString && valuenew.length == 0)){
+               return valueold;
+       }
+
+       if(valuetype != "delayed"){
+               while(valuenew.isString) {
+                       ParPosition = valuenew.indexOf("(");
+                       if(ParPosition !=-1) {
+                               TestString = "window." + valuenew.substr(0,ParPosition);
+                               if (typeof eval(TestString) != "undefined" && eval(TestString).isFunction) {
+                                       valuenew = eval(valuenew);
+                               }
+                       }
+                       else break
+               }
+       }
+
+       while(valuenew.isFunction) {valuenew = valuenew()}
+
+       switch(valuetype){      
+               case "number":
+                       while (valuenew.isString) {valuenew = eval(valuenew)}
+                       break;
+               case "boolean":
+                       while (!valuenew.isBoolean) {
+                               valuenew = (valuenew.isNumber) ? valuenew ? true : false : eval(valuenew);
+                       }
+                       break;
+       }
+
+       return valuenew;
+}
+
+for (i=0;i<HM_a_Parameters.length;i++) {
+       HM_f_AssignParameters(HM_a_Parameters[i]);
+       eval(HM_a_Parameters[i][0] + "= HM_f_EvalParameters("+ HM_a_Parameters[i][0] +",null,HM_a_Parameters[i][2])")
+}
+
+HM_ChildPerCentOver = (isNaN(parseFloat(HM_ChildPerCentOver))) ? null : parseFloat(HM_ChildPerCentOver)/100;
+
+HM_ChildMilliSecondsVisible = HM_ChildSecondsVisible * 1000;
+
+function HM_f_ValidateArray(arrayname){
+       var MenuArrayIsValid = false;
+       var MenuArrayIsObject = (typeof eval("window." + arrayname) == "object");
+       if(MenuArrayIsObject) { 
+               var TheMenuArray = eval(arrayname);
+               if(TheMenuArray.isArray && TheMenuArray.length > 1) {
+                       MenuArrayIsValid = true;
+                       if(!TheMenuArray.itemValidation) {
+                               while((typeof TheMenuArray[TheMenuArray.length-1] != "object") || (!TheMenuArray[TheMenuArray.length-1].isArray)) {
+                                       TheMenuArray.length--;
+                               }
+                               TheMenuArray.itemValidation = true;
+                       }
+               }
+       }
+       return MenuArrayIsValid;
+}
+
+if(!window.HM_a_TreesToBuild) {
+       HM_a_TreesToBuild = [];
+       for(i=1; i<100; i++){
+               if(HM_f_ValidateArray(HM_ArrayIDPrefix + i)) HM_a_TreesToBuild[HM_a_TreesToBuild.length] = i;
+       }
+}
+
+HM_CurrentArray = null;
+HM_CurrentTree  = null;
+HM_CurrentMenu  = null;
+HM_CurrentItem  = null;
+HM_a_TopMenus = [];
+HM_AreLoaded = false;
+HM_AreCreated = false;
+HM_BeingCreated = false;
+HM_UserOverMenu = false;
+HM_HideAllTimer = null;
+HM_TotalTrees = 0;
+HM_ZIndex = 5000;
+
+function HM_f_Initialize() {
+    if(HM_AreCreated) {
+               for(var i=0; i<HM_TotalTrees; i++) {
+                       var TopMenu = HM_a_TopMenus[i];
+                       clearTimeout(TopMenu.hideTimer);
+                       TopMenu.hideTimer = null;
+        }
+        clearTimeout(HM_HideAllTimer);
+    }
+       HM_AreCreated = false;
+       HM_BeingCreated = false;
+       HM_UserOverMenu = false;
+       HM_CurrentMenu = null;
+       HM_HideAllTimer = null;
+       HM_TotalTrees = 0;
+       HM_a_TopMenus = [];
+}
+
+Layer.prototype.showIt = HM_f_ShowIt;
+Layer.prototype.keepInWindow = HM_f_KeepInWindow;
+Layer.prototype.hideTree = HM_f_HideTree
+Layer.prototype.hideParents = HM_f_HideParents;
+Layer.prototype.hideChildren = HM_f_HideChildren;
+Layer.prototype.hideTop = HM_f_HideTop;
+Layer.prototype.hideSelf = HM_f_HideSelf;
+Layer.prototype.hasChildVisible = false;
+Layer.prototype.isOn = false;
+Layer.prototype.hideTimer = null;
+Layer.prototype.currentItem = null;
+Layer.prototype.itemSetup = HM_f_ItemSetup;
+Layer.prototype.itemCount = 0;
+Layer.prototype.child = null;
+Layer.prototype.isWritten = false;
+
+HM_NS_OrigWidth  = window.innerWidth;
+HM_NS_OrigHeight = window.innerHeight;
+
+window.onresize = function (){
+    if (window.innerWidth == HM_NS_OrigWidth && window.innerHeight == HM_NS_OrigHeight) return;
+    HM_f_Initialize();
+       window.history.go(0);
+}
+
+function HM_f_StartIt() {
+       if(HM_AreCreated) return;
+       HM_AreLoaded = true;
+       if (HM_ClickKill) {
+               HM_f_OtherMouseDown = (document.onmousedown) ? document.onmousedown :  new Function;
+               document.captureEvents(Event.MOUSEDOWN);
+       document.onmousedown = function(){HM_f_PageClick();HM_f_OtherMouseDown()}
+    }
+       else {
+               HM_TopMilliSecondsVisible = HM_TopSecondsVisible * 1000;
+       }
+    HM_f_MakeTrees();
+       HM_f_OtherOnLoad();
+}
+
+function HM_f_MakeTrees(){
+    HM_BeingCreated = true;
+       var TreeParams = null;
+       var TreeHasChildren = false;
+       var ItemArray = null;
+
+       for(var t=0; t<HM_a_TreesToBuild.length; t++) {
+               if(!HM_f_ValidateArray(HM_ArrayIDPrefix + HM_a_TreesToBuild[t])) continue;
+               HM_CurrentArray = eval(HM_ArrayIDPrefix + HM_a_TreesToBuild[t]);
+
+               TreeParams = HM_CurrentArray[0];
+               TreeHasChildren = false;
+
+               for(var i=1; i<HM_CurrentArray.length; i++) {
+                       ItemArray = HM_CurrentArray[i];
+                       if(ItemArray[ItemArray.length-1]) {TreeHasChildren = true; break}
+               }
+
+               HM_CurrentTree = {
+                       MenuWidth        : MenuWidth = HM_f_EvalParameters(TreeParams[0],HM_MenuWidth,"number"),
+                       MenuLeft         : MenuLeft = HM_f_EvalParameters(TreeParams[1],null,"delayed"),
+                       MenuTop          : MenuTop = HM_f_EvalParameters(TreeParams[2],null,"delayed"),
+                       ItemWidth        : ItemWidth = MenuWidth - (HM_BorderWidth*2),
+                       ItemTextWidth    : TreeHasChildren ? (ItemWidth - (HM_ImageSize + HM_ImageHorizSpace + HM_ItemPadding)) : ItemWidth,
+                       FontColor        : FontColor = HM_f_EvalParameters(TreeParams[3],HM_FontColor),
+                       FontColorOver    : FontColorOver = HM_f_EvalParameters(TreeParams[4],HM_FontColorOver),
+                       BGColor          : HM_f_EvalParameters(TreeParams[5],HM_BGColor),
+                       BGColorOver      : HM_f_EvalParameters(TreeParams[6],HM_BGColorOver),
+                       BorderColor      : HM_f_EvalParameters(TreeParams[7],HM_BorderColor),
+                       TopIsPermanent   : ((MenuLeft == null) || (MenuTop == null)) ? false : HM_f_EvalParameters(TreeParams[9],false,"boolean"),
+                       TopIsHorizontal  : TopIsHorizontal = HM_f_EvalParameters(TreeParams[10],false,"boolean"),
+                       TreeIsHorizontal : TreeHasChildren ? HM_f_EvalParameters(TreeParams[11],false,"boolean") : false,
+                       PositionUnder    : (!TopIsHorizontal || !TreeHasChildren) ? false : HM_f_EvalParameters(TreeParams[12],false,"boolean"),
+                       TopImageShow     : TreeHasChildren ? HM_f_EvalParameters(TreeParams[13],true,"boolean")  : false,
+                       TreeImageShow    : TreeHasChildren ? HM_f_EvalParameters(TreeParams[14],true,"boolean")  : false,
+                       UponDisplay      : HM_f_EvalParameters(TreeParams[15],HM_UponDisplay,"delayed"),
+                       UponHide         : HM_f_EvalParameters(TreeParams[16],HM_UponHide,"delayed"),
+                       RightToLeft      : HM_f_EvalParameters(TreeParams[17],HM_RightToLeft,"boolean"),
+                       NSFontOver               : HM_NSFontOver ? (FontColor != FontColorOver) : false,
+                       ClickStart               : HM_f_EvalParameters(TreeParams[18],HM_ClickStart,"boolean"),
+                       TopIsVariableWidth  : HM_f_EvalParameters(TreeParams[19],false,"boolean"),
+                       TreeIsVariableWidth  : HM_f_EvalParameters(TreeParams[20],false,"boolean")
+               }
+
+               HM_CurrentMenu = null;
+               HM_f_MakeMenu(HM_a_TreesToBuild[t]);
+               HM_a_TopMenus[HM_TotalTrees] = HM_CurrentTree.treeParent;
+               HM_TotalTrees++;
+               if(HM_CurrentTree.TopIsPermanent){
+                       with(HM_CurrentTree.treeParent) {
+                               moveTo(eval(HM_CurrentTree.MenuLeft),eval(HM_CurrentTree.MenuTop));
+                               zIndex = HM_ZIndex;
+                               visibility = "show";
+                       }
+               }
+    }
+
+       if(HM_StatusDisplayBuild) status = HM_TotalTrees + " Hierarchical Menu Trees Created";
+    HM_AreCreated = true;
+    HM_BeingCreated = false;
+}
+
+function HM_f_GetItemHtmlStr(arraystring){
+       var TempString = arraystring;
+       if (HM_FontBold) TempString = TempString.bold();
+       if (HM_FontItalic) TempString = TempString.italics();
+       TempString = "<FONT FACE='" + HM_FontFamily + "' POINT-SIZE=" + HM_FontSize + ">" + TempString + "</FONT>";
+       var TempStringOver = TempString.fontcolor(HM_CurrentTree.FontColorOver);
+       TempString = TempString.fontcolor(HM_CurrentTree.FontColor);
+       return [TempString,TempStringOver];
+}
+
+function HM_f_MakeMenu(menucount) {
+       if(!HM_f_ValidateArray(HM_ArrayIDPrefix + menucount)) return false;
+       HM_CurrentArray = eval(HM_ArrayIDPrefix + menucount);
+
+       NewMenu = eval("window." + HM_MenuIDPrefix + menucount);
+       if(!NewMenu) {
+               eval(HM_MenuIDPrefix + menucount + " = new Layer(HM_CurrentTree.MenuWidth,window)");
+               NewMenu = eval(HM_MenuIDPrefix + menucount);
+       
+               if(HM_CurrentMenu) {
+                       NewMenu.parentMenu = HM_CurrentMenu;
+                       NewMenu.parentItem = HM_CurrentItem;
+                       NewMenu.parentItem.child = NewMenu;
+                       NewMenu.hasParent = true;
+                       NewMenu.isHorizontal = HM_CurrentTree.TreeIsHorizontal;
+                       NewMenu.showImage = HM_CurrentTree.TreeImageShow;
+               }
+               else {
+                       NewMenu.isHorizontal = HM_CurrentTree.TopIsHorizontal;
+                       NewMenu.showImage = HM_CurrentTree.TopImageShow;
+               }
+       
+               HM_CurrentMenu = NewMenu;
+               HM_CurrentMenu.count = menucount;
+               HM_CurrentMenu.tree  = HM_CurrentTree;
+               HM_CurrentMenu.array = HM_CurrentArray;
+               HM_CurrentMenu.maxItems = HM_CurrentArray.length - 1;
+               HM_CurrentMenu.bgColor = HM_CurrentTree.BorderColor;
+               HM_CurrentMenu.IsVariableWidth = ((HM_CurrentMenu.hasParent && HM_CurrentTree.TreeIsVariableWidth) || (!HM_CurrentMenu.hasParent && HM_CurrentTree.TopIsVariableWidth));
+           HM_CurrentMenu.onmouseover = HM_f_MenuOver;
+           HM_CurrentMenu.onmouseout = HM_f_MenuOut;
+               HM_CurrentMenu.moveTo(0,0);
+       }
+
+       if(!HM_CurrentTree.treeParent) HM_CurrentTree.treeParent = HM_CurrentTree.startChild = HM_CurrentMenu;
+
+       while (HM_CurrentMenu.itemCount < HM_CurrentMenu.maxItems) {
+               HM_CurrentMenu.itemCount++;
+               HM_CurrentItem = eval("window." + HM_ItemIDPrefix + menucount + "_" + HM_CurrentMenu.itemCount);
+               if(!HM_CurrentItem) {
+                       eval(HM_ItemIDPrefix + menucount + "_" + HM_CurrentMenu.itemCount + " = new Layer(HM_CurrentTree.ItemWidth - (HM_ItemPadding*2),HM_CurrentMenu)")
+                       if(HM_StatusDisplayBuild) status = "Creating Hierarchical Menus: " + menucount + " / " + HM_CurrentMenu.itemCount;
+                       HM_CurrentItem = eval(HM_ItemIDPrefix + menucount + "_" + HM_CurrentMenu.itemCount);
+                       HM_CurrentItem.itemSetup(menucount + "_" + HM_CurrentMenu.itemCount);
+               }
+               if(HM_CurrentItem.hasMore && (!HM_CreateTopOnly || HM_AreCreated && HM_CreateTopOnly)) {
+               MenuCreated = HM_f_MakeMenu(menucount + "_" + HM_CurrentMenu.itemCount);
+               if(MenuCreated) {
+                               HM_CurrentMenu =  HM_CurrentMenu.parentMenu;
+                               HM_CurrentArray = HM_CurrentMenu.array;
+                       }
+               }
+    }
+       HM_CurrentMenu.itemCount = 0;
+       if (HM_CurrentMenu.isHorizontal) {
+           HM_CurrentMenu.clip.right = HM_CurrentMenu.lastItem.left + HM_CurrentMenu.lastItem.clip.right + HM_BorderWidth;
+       }
+       else {
+           HM_CurrentMenu.clip.right = HM_CurrentMenu.lastItem.clip.width + (HM_BorderWidth*2);
+       }
+    HM_CurrentMenu.clip.bottom = HM_CurrentMenu.lastItem.top + HM_CurrentMenu.lastItem.clip.bottom + HM_BorderWidth;
+       return HM_CurrentMenu;
+}
+
+function HM_f_ItemSetup(itemidsuffix) {
+       this.menu = HM_CurrentMenu;
+       this.tree = HM_CurrentTree;
+       this.index = HM_CurrentMenu.itemCount - 1;
+       this.array = HM_CurrentArray[HM_CurrentMenu.itemCount];
+       this.dispText = this.array[0];
+       this.linkText = this.array[1];
+       this.permHilite  = HM_f_EvalParameters(this.array[3],false,"boolean");
+       this.hasRollover = (!this.permHilite && HM_f_EvalParameters(this.array[2],true,"boolean"));
+       this.hasMore     = HM_f_EvalParameters(this.array[4],false,"boolean") && HM_f_ValidateArray(HM_ArrayIDPrefix + itemidsuffix);
+       var HtmlStrings = HM_f_GetItemHtmlStr(this.dispText);
+       this.htmStr = HtmlStrings[0];
+       this.htmStrOver = HtmlStrings[1];
+       this.visibility = "inherit";
+    this.onmouseover = HM_f_ItemOver;
+       this.onmouseout  = HM_f_ItemOut;
+       this.menu.lastItem = this;
+       this.showChild = HM_f_ShowChild;
+
+       this.ClickStart = this.hasMore && this.tree.ClickStart && (this.tree.TopIsPermanent && (this.tree.treeParent==this.menu));
+       if(this.ClickStart) {
+               this.captureEvents(Event.MOUSEUP);
+               this.onmouseup = this.showChild;
+               this.linkText = "";
+       }
+       else {
+           if (this.linkText) {
+                       this.captureEvents(Event.MOUSEUP);
+                       this.onmouseup = HM_f_LinkIt;
+           }
+       }
+
+       this.txtLyrOff = new Layer(HM_CurrentTree.ItemTextWidth - (HM_ItemPadding*2),this);
+       with(this.txtLyrOff) {
+               document.write(this.permHilite ? this.htmStrOver : this.htmStr);
+               document.close();
+               if (HM_CurrentTree.RightToLeft && this.menu.showImage && (!this.menu.isHorizontal || (this.menu.isHorizontal && (!this.menu.IsVariableWidth || (this.menu.IsVariableWidth && this.hasMore))) )) left = HM_ItemPadding + HM_ImageSize + HM_ImageHorizSpace;
+               visibility = "inherit";
+       }
+
+       if(this.menu.IsVariableWidth){
+               this.ItemTextWidth = this.txtLyrOff.document.width;
+               this.ItemWidth = this.ItemTextWidth + (HM_ItemPadding*2);
+               if(HM_CurrentMenu.showImage) {
+                       if(!this.menu.isHorizontal || this.hasMore) {
+                               this.ItemWidth += (HM_ItemPadding + HM_ImageSize + HM_ImageHorizSpace);
+                       }
+               }
+       }
+       else {
+               this.ItemWidth = this.tree.ItemWidth;
+               this.ItemTextWidth = this.tree.ItemTextWidth;
+       }
+       if (this.menu.isHorizontal) {
+       if (this.index) this.left = this.siblingBelow.left + this.siblingBelow.clip.width + HM_SeparatorSize;
+               else this.left = (HM_BorderWidth + HM_ItemPadding);
+               this.top = (HM_BorderWidth + HM_ItemPadding);
+       }
+       else {
+               this.left = (HM_BorderWidth + HM_ItemPadding);
+           if (this.index) this.top = this.siblingBelow.top + this.siblingBelow.clip.height + HM_SeparatorSize;
+       else this.top = (HM_BorderWidth + HM_ItemPadding)
+       }
+    this.clip.top = this.clip.left = -HM_ItemPadding;
+    this.clip.right = this.ItemWidth - HM_ItemPadding;
+       this.bgColor = this.permHilite ? this.tree.BGColorOver : this.tree.BGColor;
+
+       if(this.tree.NSFontOver) {
+               if(!this.permHilite){
+                       this.txtLyrOn = new Layer(this.ItemTextWidth,this);
+                       with(this.txtLyrOn) {
+                               if (HM_CurrentTree.RightToLeft && this.menu.showImage && (!this.menu.isHorizontal || (this.menu.isHorizontal && (!this.menu.IsVariableWidth || (this.menu.IsVariableWidth && this.hasMore))) ))  left = HM_ItemPadding + HM_ImageSize + HM_ImageHorizSpace;
+                               visibility = "hide";
+                       }
+               }
+       }
+
+       this.fullClip = this.txtLyrOff.document.height + (HM_ItemPadding * 2);
+       if(this.menu.isHorizontal) {
+               if(this.index) {
+                       var SiblingHeight = this.siblingBelow.clip.height;
+                       this.fullClip = Math.max(SiblingHeight,this.fullClip);
+                       if(this.fullClip > SiblingHeight) {
+                               var SiblingPrevious = this.siblingBelow;
+                               while(SiblingPrevious != null) {
+                                       SiblingPrevious.clip.height = this.fullClip;
+                                       SiblingPrevious = SiblingPrevious.siblingBelow;
+                               }
+                       }
+               }
+       }
+       this.clip.height = this.fullClip;
+
+       if(!this.menu.isHorizontal && this.menu.IsVariableWidth) {
+               this.fullWidth = this.clip.width;
+               if(this.index) {
+                       var SiblingWidth = this.siblingBelow.clip.width;
+                       this.fullWidth = Math.max(SiblingWidth,this.fullWidth);
+                       SiblingPrevious = this.siblingBelow;
+                       while(SiblingPrevious != null) {
+                               SiblingPrevious.clip.width = this.fullWidth;
+                               SiblingPrevious.dummyLyr.clip.width = this.fullWidth;
+                               if(SiblingPrevious.hasMore) {
+                                       SiblingPrevious.DistanceToRightEdge = SiblingPrevious.clip.right + SiblingPrevious.WhatsOnRight;
+                                       SiblingPrevious.DistanceToLeftEdge = HM_ItemPadding + SiblingPrevious.WhatsOnLeft;
+                                       SiblingPrevious.CompleteWidth = SiblingPrevious.ItemWidth + SiblingPrevious.WhatsOnLeft + SiblingPrevious.WhatsOnRight;
+                                       SiblingPrevious.ChildOverlap = (parseInt((HM_ChildPerCentOver != null) ? (HM_ChildPerCentOver  * SiblingPrevious.CompleteWidth) : HM_ChildOverlap));
+                               }
+                               if(SiblingPrevious.imgLyr && !HM_CurrentTree.RightToLeft) {
+                                       SiblingPrevious.imgLyr.left = this.fullWidth - (HM_ItemPadding * 2) - HM_ImageSize - HM_ImageHorizSpace;
+                               }
+                               SiblingPrevious = SiblingPrevious.siblingBelow;
+                       }
+               }
+               this.clip.width = this.fullWidth;
+       }
+
+       this.dummyLyr = new Layer(100,this);
+       with(this.dummyLyr) {
+               left = top = -HM_ItemPadding;
+               clip.width = this.clip.width;
+               clip.height = this.clip.height;
+               visibility = "inherit";
+       }
+
+       if(this.hasMore && HM_CurrentMenu.showImage) {
+               this.imageSrc = this.tree.RightToLeft ? HM_ImageSrcLeft : HM_ImageSrc;
+               this.hasImageRollover = ((!this.tree.RightToLeft && HM_ImageSrcOver) || (this.tree.RightToLeft && HM_ImageSrcLeftOver));
+               if(this.hasImageRollover) {
+                       this.imageSrcOver = this.tree.RightToLeft ? HM_ImageSrcLeftOver : HM_ImageSrcOver;
+                       if(this.permHilite) this.imageSrc = this.imageSrcOver;
+               }
+               this.imgLyr = new Layer(HM_ImageSize,this);
+
+               with(this.imgLyr) {
+                       document.write("<IMG SRC='" + this.imageSrc + "' WIDTH=" + HM_ImageSize + " VSPACE=0 HSPACE=0 BORDER=0>");
+                       document.close();
+                       moveBelow(this.txtLyrOff);
+                       left = (HM_CurrentTree.RightToLeft) ? HM_ImageHorizSpace : this.ItemWidth - (HM_ItemPadding * 2) - HM_ImageSize - HM_ImageHorizSpace;
+                       top = HM_ImageVertSpace;
+                       visibility = "inherit";
+               }
+               this.imageElement = this.imgLyr.document.images[0];
+       }
+
+       if(this.hasMore) {
+               this.WhatsOnRight = (!this.menu.isHorizontal || (this.menu.isHorizontal && this.isLastItem)) ?  HM_BorderWidth : HM_SeparatorSize;
+               this.DistanceToRightEdge = this.clip.right + this.WhatsOnRight;
+               this.WhatsOnLeft = (!this.menu.isHorizontal || (this.menu.isHorizontal && this.index==0)) ? HM_BorderWidth : HM_SeparatorSize;
+               this.DistanceToLeftEdge = HM_ItemPadding + this.WhatsOnLeft;
+               this.CompleteWidth = this.ItemWidth + this.WhatsOnLeft + this.WhatsOnRight;
+               this.ChildOverlap = (parseInt((HM_ChildPerCentOver != null) ? (HM_ChildPerCentOver  * this.CompleteWidth) : HM_ChildOverlap));
+       }
+}
+
+function HM_f_PopUp(menuname,e){
+    if (!HM_AreLoaded) return;
+       menuname = menuname.replace("elMenu",HM_MenuIDPrefix);
+       var TempMenu = eval("window."+menuname);
+       if(!TempMenu)return;
+       HM_CurrentMenu = TempMenu;
+       if (HM_CurrentMenu.tree.ClickStart) {
+               var ClickElement = e.target;
+               ClickElement.onclick = HM_f_PopMenu;
+    }
+       else HM_f_PopMenu(e);
+}
+
+function HM_f_PopMenu(e){
+    if (!HM_AreLoaded || !HM_AreCreated) return true;
+    if (HM_CurrentMenu.tree.ClickStart && e.type != "click") return true;
+    HM_f_HideAll();
+    HM_CurrentMenu.hasParent = false;
+       HM_CurrentMenu.tree.startChild = HM_CurrentMenu;
+       var mouse_x_position = e.pageX;
+       var mouse_y_position = e.pageY;
+       HM_CurrentMenu.xPos = (HM_CurrentMenu.tree.MenuLeft!=null) ? eval(HM_CurrentMenu.tree.MenuLeft) : mouse_x_position;
+       HM_CurrentMenu.yPos = (HM_CurrentMenu.tree.MenuTop!=null)  ? eval(HM_CurrentMenu.tree.MenuTop)  : mouse_y_position;
+
+    HM_CurrentMenu.keepInWindow();
+    HM_CurrentMenu.moveTo(HM_CurrentMenu.xPos,HM_CurrentMenu.yPos);
+    HM_CurrentMenu.isOn = true;
+    HM_CurrentMenu.showIt(true);
+    return false;
+}
+
+function HM_f_MenuOver() {
+       if(!this.tree.startChild){this.tree.startChild = this}
+       if(this.tree.startChild == this) HM_f_HideAll(this)
+    this.isOn = true;
+    HM_UserOverMenu = true;
+    HM_CurrentMenu = this;
+    if (this.hideTimer) clearTimeout(this.hideTimer);
+}
+
+function HM_f_MenuOut() {
+    this.isOn = false;
+    HM_UserOverMenu = false;
+    if(HM_StatusDisplayLink) status = "";
+    if(!HM_ClickKill) {
+               clearTimeout(HM_HideAllTimer);
+               HM_HideAllTimer = null;
+               HM_HideAllTimer = setTimeout("HM_CurrentMenu.hideTree()",HM_ChildMilliSecondsVisible);
+       }
+}
+
+function HM_f_ShowChild(){
+       if(!this.child) {
+               HM_CurrentTree = this.tree;
+               HM_CurrentMenu = this.menu;
+               HM_CurrentItem = this;
+               this.child = HM_f_MakeMenu(this.menu.count + "_"+(this.index+1));
+               this.tree.treeParent = this.menu;
+               this.tree.startChild = this.menu;
+       }
+       if (this.tree.PositionUnder && (this.menu == this.tree.treeParent)) {
+               this.child.xPos = this.pageX + this.clip.left - HM_BorderWidth;
+               this.child.yPos = this.menu.top + this.menu.clip.height - HM_BorderWidth;
+       }
+       else {
+               this.oL = this.pageX;
+               this.child.offsetWidth = this.child.clip.width;
+               this.oT = this.pageY + this.clip.top - HM_BorderWidth;
+               if(this.tree.RightToLeft) {
+                       this.child.xPos = ((this.oL - this.DistanceToLeftEdge) + this.ChildOverlap) - this.child.offsetWidth;
+               }
+               else {          
+                       this.child.xPos = (this.oL + this.DistanceToRightEdge) - this.ChildOverlap;
+               }
+               this.child.yPos = this.oT + HM_ChildOffset + HM_BorderWidth;
+       }
+       if(!this.tree.PositionUnder || this.menu!=this.tree.treeParent) this.child.keepInWindow();
+       this.child.moveTo(this.child.xPos,this.child.yPos);
+       this.menu.hasChildVisible = true;
+       this.menu.visibleChild = this.child;
+       this.child.showIt(true);
+}
+
+function HM_f_ItemOver(){
+    if (HM_KeepHilite) {
+        if (this.menu.currentItem && this.menu.currentItem != this && this.menu.currentItem.hasRollover) {
+            with(this.menu.currentItem){
+                               bgColor = this.tree.BGColor;
+                               if(this.tree.NSFontOver) {
+                   txtLyrOff.visibility = "inherit";
+                                       txtLyrOn.visibility = "hide";
+                               }
+                       }
+                       if(this.menu.currentItem.hasImageRollover)this.menu.currentItem.imageElement.src = this.menu.currentItem.imageSrc;
+        }
+    }
+       if(this.hasRollover) {
+           this.bgColor = this.tree.BGColorOver;
+               if(this.tree.NSFontOver) {
+                       if(!this.txtLyrOn.isWritten){
+                               this.txtLyrOn.document.write(this.htmStrOver);
+                               this.txtLyrOn.document.close();
+                               this.txtLyrOn.isWritten = true;
+                       }
+                       this.txtLyrOff.visibility = "hide";
+                       this.txtLyrOn.visibility = "inherit";
+               }
+               if(this.hasImageRollover)this.imageElement.src = this.imageSrcOver;
+       }
+
+    if(HM_StatusDisplayLink) status = this.linkText;
+    this.menu.currentItem = this;
+       if (this.menu.hasChildVisible) {
+               if(this.menu.visibleChild == this.child && this.menu.visibleChild.hasChildVisible) this.menu.visibleChild.hideChildren(this);
+               else this.menu.hideChildren(this);
+    }
+
+    if (this.hasMore && !this.ClickStart) this.showChild();
+}
+
+function HM_f_ItemOut() {
+    if ( (!HM_KeepHilite || ((this.tree.TopIsPermanent && (this.tree.treeParent==this)) && !this.menu.hasChildVisible)) && this.hasRollover) {
+               with(this){
+                       bgColor = this.tree.BGColor;
+                       if(this.tree.NSFontOver) {
+                               txtLyrOff.visibility = "inherit";
+                               txtLyrOn.visibility = "hide";
+                       }
+                       if(this.hasImageRollover)this.imageElement.src = this.imageSrc;
+               }
+    }
+       if(!HM_ClickKill && !HM_UserOverMenu) {
+               clearTimeout(HM_HideAllTimer);
+               HM_HideAllTimer = null;
+        HM_HideAllTimer = setTimeout("HM_CurrentMenu.hideTree()",HM_ChildMilliSecondsVisible);
+    }
+}
+
+function HM_f_ShowIt(on) {
+       if (!(this.tree.TopIsPermanent && (this.tree.treeParent==this))) {
+               if(!this.hasParent || (this.hasParent && this.tree.TopIsPermanent && (this.tree.treeParent==this.parentMenu)    )) {
+                       if (on == this.hidden)
+                               eval(on ? this.tree.UponDisplay : this.tree.UponHide)
+               }
+               if (on) this.zIndex = ++HM_ZIndex;
+               this.visibility = on ? "show" : "hide";
+       }
+    if (HM_KeepHilite && this.currentItem && this.currentItem.hasRollover) {
+        with(this.currentItem){
+                       bgColor = this.tree.BGColor;
+                       if(this.tree.NSFontOver) {
+                               txtLyrOff.visibility = "inherit";
+                               txtLyrOn.visibility = "hide";
+                       }
+               }
+               if(this.currentItem.hasImageRollover)this.currentItem.imageElement.src = this.currentItem.imageSrc;
+       }
+    this.currentItem = null;
+}
+
+function HM_f_KeepInWindow() {
+    var ExtraSpace     = 10;
+       var WindowLeftEdge = window.pageXOffset;
+       var WindowTopEdge  = window.pageYOffset;
+       var WindowWidth    = window.innerWidth;
+       var WindowHeight   = window.innerHeight;
+       var WindowRightEdge  = (WindowLeftEdge + WindowWidth) - ExtraSpace;
+       var WindowBottomEdge = (WindowTopEdge + WindowHeight) - ExtraSpace;
+
+       var MenuLeftEdge = this.xPos;
+       var MenuRightEdge = MenuLeftEdge + this.clip.width;
+       var MenuBottomEdge = this.yPos + this.clip.height;
+
+       if (this.hasParent) {
+               var ParentLeftEdge = this.parentItem.pageX;
+               this.offsetWidth = this.clip.width;
+       }
+       if (MenuRightEdge > WindowRightEdge) {
+               if (this.hasParent) {
+                       this.xPos = ((ParentLeftEdge - this.parentItem.DistanceToLeftEdge) + this.parentItem.ChildOverlap) - this.offsetWidth;
+               }
+               else {
+                       dif = MenuRightEdge - WindowRightEdge;
+                       this.xPos -= dif;
+               }
+               this.xPos = Math.max(5,this.xPos);
+       }
+
+       if (MenuBottomEdge > WindowBottomEdge) {
+               dif = MenuBottomEdge - WindowBottomEdge;
+               this.yPos -= dif;
+       }
+
+       if (MenuLeftEdge < WindowLeftEdge) {
+               if (this.hasParent) {
+                       this.xPos = (ParentLeftEdge + this.parentItem.DistanceToRightEdge) - this.parentItem.ChildOverlap;
+                       MenuRightEdge = this.xPos + this.offsetWidth;
+                       if(MenuRightEdge > WindowRightEdge) this.xPos -= (MenuRightEdge - WindowRightEdge);
+               }
+               else {this.xPos = 5}
+       }       
+}
+
+function HM_f_LinkIt() {
+    if (this.linkText.indexOf("javascript:")!=-1) eval(this.linkText)
+    else {
+               HM_f_HideAll();
+               location.href = this.linkText;
+       }
+}
+
+function HM_f_PopDown(menuname){
+    if (!HM_AreLoaded || !HM_AreCreated) return;
+       menuname = menuname.replace("elMenu",HM_MenuIDPrefix);
+    var MenuToHide = eval("window."+menuname);
+       if(!MenuToHide)return;
+    MenuToHide.isOn = false;
+    if (!HM_ClickKill) MenuToHide.hideTop();
+}
+
+function HM_f_HideAll(callingmenu) {
+       for(var i=0; i<HM_TotalTrees; i++) {
+        var TopMenu = HM_a_TopMenus[i].tree.startChild;
+               if(TopMenu == callingmenu)continue
+        TopMenu.isOn = false;
+        if (TopMenu.hasChildVisible) TopMenu.hideChildren();
+        TopMenu.showIt(false);
+    }    
+}
+
+function HM_f_HideTree() { 
+    HM_HideAllTimer = null;
+    if (HM_UserOverMenu) return;
+    if (this.hasChildVisible) this.hideChildren();
+    this.hideParents();
+}
+
+function HM_f_HideTop() {
+       TopMenuToHide = this;
+    (HM_ClickKill) ? TopMenuToHide.hideSelf() : (this.hideTimer = setTimeout("TopMenuToHide.hideSelf()",HM_TopMilliSecondsVisible));
+}
+
+function HM_f_HideSelf() {
+    this.hideTimer = null;
+    if (!this.isOn && !HM_UserOverMenu) this.showIt(false);
+}
+
+function HM_f_HideParents() {
+    var TempMenu = this;
+    while(TempMenu.hasParent) {
+        TempMenu.showIt(false);
+        TempMenu.parentMenu.isOn = false;        
+        TempMenu = TempMenu.parentMenu;
+    }
+    TempMenu.hideTop();
+}
+
+function HM_f_HideChildren(callingitem) {
+    var TempMenu = this.visibleChild;
+    while(TempMenu.hasChildVisible) {
+        TempMenu.visibleChild.showIt(false);
+        TempMenu.hasChildVisible = false;
+        TempMenu = TempMenu.visibleChild;
+    }
+
+    if (!this.isOn || !callingitem.hasMore || this.visibleChild != callingitem.child) {
+        this.visibleChild.showIt(false);
+        this.hasChildVisible = false;
+    }
+}
+
+function HM_f_PageClick() {
+    if (!HM_UserOverMenu && HM_CurrentMenu!=null && !HM_CurrentMenu.isOn) HM_f_HideAll();
+}
+
+popUp = HM_f_PopUp;
+popDown = HM_f_PopDown;
+
+HM_f_OtherOnLoad = (window.onload) ? window.onload :  new Function;
+window.onload = HM_f_StartIt;
+
+
+//end
\ No newline at end of file
diff --git a/daemons/graphs/jsmenu/LoadMe.html b/daemons/graphs/jsmenu/LoadMe.html
new file mode 100644 (file)
index 0000000..de17970
--- /dev/null
@@ -0,0 +1,99 @@
+<HTML>
+<HEAD>
+<TITLE>HM Version 4.1.1 Examples</TITLE>
+
+<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
+<!--
+
+if(window.event + "" == "undefined") event = null;
+function HM_f_PopUp(){return false};
+function HM_f_PopDown(){return false};
+popUp = HM_f_PopUp;
+popDown = HM_f_PopDown;
+
+//-->
+</SCRIPT>
+
+<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
+<!--
+
+HM_PG_MenuWidth = 150;
+HM_PG_FontFamily = "Arial,sans-serif";
+HM_PG_FontSize = 10;
+HM_PG_FontBold = 0;
+HM_PG_FontItalic = 0;
+HM_PG_FontColor = "blue";
+HM_PG_FontColorOver = "white";
+HM_PG_BGColor = "#DDDDDD";
+HM_PG_BGColorOver = "#FFCCCC";
+HM_PG_ItemPadding = 3;
+
+HM_PG_BorderWidth = 2;
+HM_PG_BorderColor = "black";
+HM_PG_BorderStyle = "solid";
+HM_PG_SeparatorSize = 2;
+HM_PG_SeparatorColor = "#d0ff00";
+
+HM_PG_ImageSrc = "HM_More_black_right.gif";
+HM_PG_ImageSrcLeft = "HM_More_black_left.gif";
+HM_PG_ImageSrcOver = "HM_More_white_right.gif";
+HM_PG_ImageSrcLeftOver = "HM_More_white_left.gif";
+
+HM_PG_ImageSize = 5;
+HM_PG_ImageHorizSpace = 0;
+HM_PG_ImageVertSpace = 2;
+
+HM_PG_KeepHilite = true; 
+HM_PG_ClickStart = 0;
+HM_PG_ClickKill = false;
+HM_PG_ChildOverlap = 20;
+HM_PG_ChildOffset = 10;
+HM_PG_ChildPerCentOver = null;
+HM_PG_TopSecondsVisible = .5;
+HM_PG_StatusDisplayBuild =0;
+HM_PG_StatusDisplayLink = 0;
+HM_PG_UponDisplay = null;
+HM_PG_UponHide = null;
+HM_PG_RightToLeft = 0;
+
+HM_PG_CreateTopOnly = 0;
+HM_PG_ShowLinkCursor = 1;
+HM_PG_NSFontOver = true;
+
+//HM_a_TreesToBuild = [2];
+
+
+//-->
+</SCRIPT>
+
+</HEAD>
+<BODY>
+
+<BLOCKQUOTE>
+<H3>Sample HTML page with 5 Hierarchical Menus</H3>
+<P>Permanent Centered Horizontal Menu (Cascades on <I>click</I>):</P>
+<BR><BR>
+<P>Permanent Horizontal Variable-Width Menu (Cascades on <I>mouseover</I>):</P>
+<BR><BR>
+<P><A HREF="aLinkForOldBrowsersGoesHere.html"
+      onMouseOver="HM_f_PopUp('elMenu1',event)"
+      onMouseOut="HM_f_PopDown('elMenu1')">
+          Relative-to-Mouse-Position Vertical Variable-Width Popup Menu (Displays on <I>mouseover</I>)</A></P>
+<BR>
+
+<P><A HREF="aLinkForOldBrowsersGoesHere.html"
+      onMouseOver="HM_f_PopUp('elMenu4',event)"
+      onMouseOut="HM_f_PopDown('elMenu4')">
+          Relative-to-Mouse-Position Using Keywords Popup Menu (Displays on <I>click</I>)</A></P>
+<BR>
+<P><A HREF="aLinkForOldBrowsersGoesHere.html"
+      onMouseOver="popUp('HM_Menu3',event)"
+      onMouseOut="popDown('HM_Menu3')">
+          Absolute Position Popup Menu (Displays on <I>mouseover</I>)</A></P>
+</BLOCKQUOTE>
+
+<SCRIPT LANGUAGE="JavaScript1.2"
+        SRC="HM_Loader.js"
+        TYPE='text/javascript'></SCRIPT>
+</BODY>
+</HTML>
diff --git a/daemons/graphs/jsmenu/prova.gif b/daemons/graphs/jsmenu/prova.gif
new file mode 100644 (file)
index 0000000..7f53e61
Binary files /dev/null and b/daemons/graphs/jsmenu/prova.gif differ
diff --git a/daemons/graphs/jsmenu/prova.html b/daemons/graphs/jsmenu/prova.html
new file mode 100644 (file)
index 0000000..7f24294
--- /dev/null
@@ -0,0 +1,87 @@
+<HTML>
+<HEAD>
+<TITLE>HM Version 4.1.1 Examples</TITLE>
+
+<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
+<!--
+
+if(window.event + "" == "undefined") event = null;
+function HM_f_PopUp(){return false};
+function HM_f_PopDown(){return false};
+popUp = HM_f_PopUp;
+popDown = HM_f_PopDown;
+
+//-->
+</SCRIPT>
+
+<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
+<!--
+
+HM_PG_MenuWidth = 150;
+HM_PG_FontFamily = "Arial,sans-serif";
+HM_PG_FontSize = 10;
+HM_PG_FontBold = 0;
+HM_PG_FontItalic = 0;
+HM_PG_FontColor = "blue";
+HM_PG_FontColorOver = "white";
+HM_PG_BGColor = "#DDDDDD";
+HM_PG_BGColorOver = "#FFCCCC";
+HM_PG_ItemPadding = 3;
+
+HM_PG_BorderWidth = 2;
+HM_PG_BorderColor = "black";
+HM_PG_BorderStyle = "solid";
+HM_PG_SeparatorSize = 2;
+HM_PG_SeparatorColor = "#d0ff00";
+
+HM_PG_ImageSrc = "HM_More_black_right.gif";
+HM_PG_ImageSrcLeft = "HM_More_black_left.gif";
+HM_PG_ImageSrcOver = "HM_More_white_right.gif";
+HM_PG_ImageSrcLeftOver = "HM_More_white_left.gif";
+
+HM_PG_ImageSize = 5;
+HM_PG_ImageHorizSpace = 0;
+HM_PG_ImageVertSpace = 2;
+
+HM_PG_KeepHilite = true; 
+HM_PG_ClickStart = 0;
+HM_PG_ClickKill = false;
+HM_PG_ChildOverlap = 20;
+HM_PG_ChildOffset = 10;
+HM_PG_ChildPerCentOver = null;
+HM_PG_TopSecondsVisible = .5;
+HM_PG_StatusDisplayBuild =0;
+HM_PG_StatusDisplayLink = 0;
+HM_PG_UponDisplay = null;
+HM_PG_UponHide = null;
+HM_PG_RightToLeft = 0;
+
+HM_PG_CreateTopOnly = 0;
+HM_PG_ShowLinkCursor = 1;
+HM_PG_NSFontOver = true;
+
+//HM_a_TreesToBuild = [2];
+
+
+//-->
+</SCRIPT>
+
+</HEAD>
+<BODY>
+
+<IMG border="false" src="prova.gif" usemap="#graphe">
+ <MAP name="graphe">
+  <AREA shape="rect" href="pluto" coords="107.6,107,161.4,155" target="cic"
+   onMouseOver="HM_f_PopUp('elMenu1',event)"
+   onMouseOut="HM_f_PopDown('elMenu1')">
+  <AREA shape="rect" href="paperino" coords="381.8,107,426.2,155" target="cic"
+   onMouseOver="HM_f_PopUp('elMenu2',event)"
+   onMouseOut="HM_f_PopDown('elMenu2')">
+ </MAP>
+</IMG>
+
+<SCRIPT LANGUAGE="JavaScript1.2"
+        SRC="HM_Loader_prova.js"
+        TYPE='text/javascript'></SCRIPT>
+</BODY>
+</HTML>
diff --git a/daemons/graphs/tools/.cvsignore b/daemons/graphs/tools/.cvsignore
new file mode 100644 (file)
index 0000000..a9c3ad4
--- /dev/null
@@ -0,0 +1,7 @@
+*.cm[iaox]
+*.[ao]
+*.cmxa
+drawGraph
+uriSetQueue
+drawGraph.opt
+uriSetQueue.opt
diff --git a/daemons/graphs/tools/Makefile b/daemons/graphs/tools/Makefile
new file mode 100644 (file)
index 0000000..0726670
--- /dev/null
@@ -0,0 +1,60 @@
+PID=
+DOT=dot
+#SED=sed "s/font-family:Times;//g"
+SED=cat
+
+REQUIRES = http helm-registry
+PREDICATES = mt
+OCAMLOPTIONS = -package "$(REQUIRES)" -predicates "$(PREDICATES)" -thread
+OCAMLC = ocamlfind ocamlc $(OCAMLOPTIONS)
+OCAMLOPT = ocamlfind ocamlopt $(OCAMLOPTIONS)
+EXECUTABLES = uriSetQueue drawGraph
+EXECUTABLES_OPT = $(patsubst %,%.opt,$(EXECUTABLES))
+
+#OBJS=prova.$(PID).svg prova.$(PID).ps prova.$(PID).gif prova.$(PID).ismap prova.$(PID).imap prova.$(PID).html
+OBJS=prova.$(PID).gif prova.$(PID).ismap prova.$(PID).html
+
+all: $(EXECUTABLES)
+opt: $(EXECUTABLES_OPT)
+world: all opt
+clean:
+       rm -f *.cm[aiox] *.cmxa *.[ao] $(EXECUTABLES) $(EXECUTABLES_OPT)
+
+tmp: $(OBJS)
+clean_tmp:
+       rm -f $(OBJS) prova.$(PID).dot xx.$(PID)00 xx.$(PID)01 xx.$(PID)02 \
+               xx.$(PID)02n xx.$(PID)03 log.$(PID)
+
+uriSetQueue: uriSetQueue.ml
+       $(OCAMLC) -linkpkg -o $@ $<
+uriSetQueue.opt: uriSetQueue.ml
+       $(OCAMLOPT) -linkpkg -o $@ $<
+
+drawGraph: drawGraph.ml
+       $(OCAMLC) -linkpkg -o $@ $<
+drawGraph.opt: drawGraph.ml
+       $(OCAMLOPT) -linkpkg -o $@ $<
+
+prova.$(PID).dot: prova0.$(PID).dot
+       csplit --prefix=xx.$(PID) prova0.$(PID).dot 1 2 `expr \`wc -l prova0.$(PID).dot | sed 's/\([0123456789]\+\) prova0.$(PID).dot/\1/'\` + 1`
+       ./simplify_deps/simplify_deps.opt < xx.$(PID)02 > xx.$(PID)02n
+       cat xx.$(PID)01 xx.$(PID)02n xx.$(PID)03 > prova.$(PID).dot
+
+prova.$(PID).svg: prova.$(PID).dot
+       $(DOT) -Tsvg prova.$(PID).dot | $(SED) > prova.$(PID).svg
+
+prova.$(PID).ps: prova.$(PID).dot
+       $(DOT) -Tps prova.$(PID).dot > prova.$(PID).ps
+
+prova.$(PID).imap: prova.$(PID).dot
+       $(DOT) -Timap prova.$(PID).dot > prova.$(PID).imap
+
+prova.$(PID).gif: prova.$(PID).dot
+       $(DOT) -Tgif prova.$(PID).dot > prova.$(PID).gif
+
+prova.$(PID).ismap: prova.$(PID).dot
+       $(DOT) -Tismap prova.$(PID).dot > prova.$(PID).ismap
+
+prova.$(PID).html: prova.$(PID).ismap
+       cat xx.$(PID)00 prova.$(PID).ismap | ./mk_html.pl $(PID) > prova.$(PID).html
+
diff --git a/daemons/graphs/tools/drawGraph.conf.xml.sample b/daemons/graphs/tools/drawGraph.conf.xml.sample
new file mode 100644 (file)
index 0000000..a26b4b9
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<helm_registry>
+  <section name="draw_graph">
+    <key name="port">58083</key>
+    <key name="dir">/projects/helm/daemons/graphs/tools</key>
+  </section>
+</helm_registry>
diff --git a/daemons/graphs/tools/drawGraph.ml b/daemons/graphs/tools/drawGraph.ml
new file mode 100644 (file)
index 0000000..c17902f
--- /dev/null
@@ -0,0 +1,101 @@
+(* Copyright (C) 2002, HELM Team.
+ * 
+ * This file is part of HELM, an Hypertextual, Electronic
+ * Library of Mathematics, developed at the Computer Science
+ * Department, University of Bologna, Italy.
+ * 
+ * HELM is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * HELM is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HELM; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA  02111-1307, USA.
+ * 
+ * For details, see the HELM World-Wide-Web page,
+ * http://cs.unibo.it/helm/.
+ *)
+
+open Printf;;
+
+let debug = true;;
+let debug_print s = if debug then prerr_endline s;;
+
+let configuration_file = "/projects/helm/etc/drawGraph.conf.xml";;
+
+let daemon_name = "Draw Graph";;
+
+let wget url fname =
+  prerr_endline (sprintf "DEBUG: wgetting url '%s'" url);
+  let oc = open_out fname in
+  Http_user_agent.get_iter (output_string oc) url;
+  close_out oc
+;;
+
+let errmsg =
+  sprintf
+"<html>
+ <head>
+  <title>Graph: error</title>
+ </head>
+ <body>
+  <h1>Error occurred while drawing graph!<br />Please report the occured problem</h1>
+  <h2>%s</h2>
+ </body>
+</html>"
+in
+let string_of_exit_status = function
+  | Unix.WEXITED n -> sprintf "Process exited with code %d" n
+  | Unix.WSIGNALED n -> sprintf "Process killed by signal %d" n
+  | Unix.WSTOPPED n -> sprintf "Process stopped by signal %d" n
+in
+let callback (req: Http_types.request) outchan =
+  try
+    (match req#path with
+    | "/draw" ->
+        let url = req#param "url" in
+        let pid = Unix.getpid () in
+        wget (sprintf "%s&param.PID=%d" url pid) (sprintf "prova0.%d.dot" pid);
+        (match Unix.system (sprintf "make tmp PID=%d > log.%d" pid pid) with
+        | Unix.WEXITED 0 ->
+            debug_print "HTML successfully generated";
+            Http_daemon.respond_file (sprintf "prova.%d.html" pid) outchan
+        | status ->
+            debug_print "Failure, sending error message";
+            let res =
+              new Http_response.response
+                ~body:
+                  (errmsg ("Exit status: " ^ (string_of_exit_status status)))
+                ()
+            in
+            Http_daemon.respond_with res outchan)
+    | "/get_gif" ->
+        let pid = req#param "pid" in
+        Http_daemon.respond_file (sprintf "prova.%s.gif" pid) outchan;
+        ignore (Unix.system (
+          sprintf "make PID=%s clean_tmp; rm -f prova0.%s.dot" pid pid))
+    | invalid_request ->
+        Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request))
+          outchan)
+  with
+  | Http_types.Param_not_found attr_name ->
+      Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request))
+        ~body:(sprintf "Parameter '%s' is missing" attr_name)
+        outchan
+in
+Helm_registry.load_from configuration_file;
+let port = Helm_registry.get_int "draw_graph.port" in
+Sys.chdir (Helm_registry.get "draw_graph.dir");
+printf "%s started and listening on port %d\n" daemon_name port;
+printf "current directory is %s\n" (Sys.getcwd ());
+flush stdout;
+Http_daemon.start' ~port callback;
+printf "%s is terminating, bye!\n" daemon_name
+
diff --git a/daemons/graphs/tools/mk_html.pl b/daemons/graphs/tools/mk_html.pl
new file mode 100755 (executable)
index 0000000..a928cd5
--- /dev/null
@@ -0,0 +1,47 @@
+#!/usr/bin/perl
+
+use URI::Escape;
+
+print <<EOT;
+<?xml version="1.0"?>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:subst="http://www.cs.unibo.it/helm/subst">
+ <head>
+  <title>Graph</title>
+ </head>
+ <body bgcolor="white" onLoad="window.focus()">
+  <script>
+   var draw_graphURL = "<subst:draw_graphURL/>";
+<![CDATA[
+   document.write('<img border="false" src="' + draw_graphURL + 'get_gif?pid=$ARGV[0]" usemap="#graphe">');
+]]>
+  </script>
+  <map name="graphe">
+EOT
+
+my $count = 0;
+
+while (<STDIN>) {
+ $count++;
+ my (undef,$point1,$point2,$uri) = split;
+ my ($point1x,$point1y) = split /,/,$point1;
+ my ($point2x,$point2y) = split /,/,$point2;
+ $point1y = substr($point1y,0,-1);
+ $point2y = substr($point2y,0,-1);
+ $point1x = substr($point1x,1);
+ $point2x = substr($point2x,1);
+
+ print <<EOT;
+   <area shape="rect" href="$uri" coords="$point1x,$point2y,$point2x,$point1y" />
+EOT
+}
+
+print <<EOT;
+   </map>
+  <script>
+<![CDATA[
+   document.write('</img>');
+]]>
+  </script>
+ </body>
+</html>
+EOT
diff --git a/daemons/graphs/tools/simplify_deps/.cvsignore b/daemons/graphs/tools/simplify_deps/.cvsignore
new file mode 100644 (file)
index 0000000..51af834
--- /dev/null
@@ -0,0 +1,5 @@
+simplify_deps.cmi
+simplify_deps.cmo
+simplify_deps.cmx
+simplify_deps
+simplify_deps.opt
diff --git a/daemons/graphs/tools/simplify_deps/Makefile b/daemons/graphs/tools/simplify_deps/Makefile
new file mode 100644 (file)
index 0000000..7395c8c
--- /dev/null
@@ -0,0 +1,12 @@
+OBJS = simplify_deps simplify_deps.opt
+
+all: $(OBJS)
+
+simplify_deps: simplify_deps.ml
+       ocamlfind ocamlc -package str -linkpkg simplify_deps.ml -o simplify_deps
+
+simplify_deps.opt: simplify_deps.ml
+       ocamlfind ocamlopt -package str -linkpkg simplify_deps.ml -o simplify_deps.opt
+
+clean:
+       rm -f $(OBJS) simplify_deps.cm[iox] simplify_deps.o
diff --git a/daemons/graphs/tools/simplify_deps/simplify_deps.ml b/daemons/graphs/tools/simplify_deps/simplify_deps.ml
new file mode 100644 (file)
index 0000000..9b0fb00
--- /dev/null
@@ -0,0 +1,102 @@
+type node =
+ Node of string * node list ref (* label, children *)
+
+let debug = false;;
+
+(************************************************)
+(*      SIMPLIFICATION AND PRETTY-PRINTING      *)
+(************************************************)
+
+let reachable target source_arcs =
+ let rec find s =
+  if s = target then true
+  else
+   let Node (_,arcs) = s in
+    List.fold_left (fun i n -> i or find n) false !arcs
+ in
+  List.fold_left
+   (fun i n ->
+     i or
+      (if n = target then
+        (* this is the arc we would like to get rid of *)
+        false
+       else
+        find n
+      )
+   ) false source_arcs
+;;
+
+let consider_arc (source,target,rest) =
+ let Node (source_name,source_arcs) = source in
+ let Node (target_name,_) = target in
+  if not (reachable target !source_arcs) then
+   print_endline (source_name ^ " -> " ^ target_name ^ rest ^ ";")
+  else
+   if debug then
+    print_endline (source_name ^ " -> " ^ target_name ^ " [color=green];")
+;;
+
+let simplify_deps_and_output_them =
+ List.iter consider_arc
+;;
+
+(************************************************)
+(*                   PARSING                    *)
+(************************************************)
+
+let nodes = ref [];;
+let arcs  = ref [];;  (* (source,target) *)
+
+let search_node s =
+ List.find (function Node (s',_) -> s' = s) !nodes
+;;
+
+let parse () =
+ try
+  while true do
+   let line = read_line () in
+    if Str.string_match (Str.regexp " \\([^ ]*\\) -> \\([^ ;]*\\)\\(\\( \\[.*\\]\\)?\\);") line 0 then
+     let source = Str.matched_group 1 line in
+     let target = Str.matched_group 2 line in
+      begin
+       if source <> target then
+        (* not a self loop *)
+        let rest   = Str.matched_group 3 line in
+         let tar =
+           try
+                 search_node target
+           with
+            Not_found ->
+                  let tar = Node (target,ref []) in
+                   nodes := tar :: !nodes ;
+                   tar
+         in
+          let sou =
+           try
+            let sou = search_node source in
+             let Node (_,ts) = sou in
+              ts := tar::!ts ;
+                   sou
+           with
+            Not_found ->
+             let sou = Node (source,ref [tar]) in
+              nodes := sou :: !nodes ;
+                   sou
+          in
+           arcs := (sou,tar,rest)::!arcs
+      end
+    else
+     print_endline line
+  done
+ with
+  End_of_file -> ()
+;;
+
+(************************************************)
+(*                     MAIN                     *)
+(************************************************)
+
+let _ =
+ parse () ;
+ simplify_deps_and_output_them !arcs
+;;
diff --git a/daemons/graphs/tools/uriSetQueue.conf.xml.sample b/daemons/graphs/tools/uriSetQueue.conf.xml.sample
new file mode 100644 (file)
index 0000000..9bfc3d8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<helm_registry>
+  <section name="uriSetQueue">
+    <key name="port">58082</key>
+  </section>
+</helm_registry>
diff --git a/daemons/graphs/tools/uriSetQueue.ml b/daemons/graphs/tools/uriSetQueue.ml
new file mode 100644 (file)
index 0000000..4302758
--- /dev/null
@@ -0,0 +1,190 @@
+(* Copyright (C) 2002, HELM Team.
+ * 
+ * This file is part of HELM, an Hypertextual, Electronic
+ * Library of Mathematics, developed at the Computer Science
+ * Department, University of Bologna, Italy.
+ * 
+ * HELM is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * HELM is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HELM; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA  02111-1307, USA.
+ * 
+ * For details, see the HELM World-Wide-Web page,
+ * http://cs.unibo.it/helm/.
+ *)
+
+let debug = true;;
+let debug_print s = if debug then prerr_endline s;;
+Http_common.debug := debug;;
+
+open Printf;;
+
+let configuration_file = "/projects/helm/etc/uriSetQueue.conf.xml";;
+let daemon_name = "Uri Set Queue";;
+
+module OrderedUri: Set.OrderedType with type t = string =
+  struct
+    type t = string
+    let compare = compare
+  end
+module UriSet = Set.Make (OrderedUri)
+type uri_queue = {
+  mutable size: int;
+  mutable overflowed: bool;
+  uris: string Queue.t;
+  mutable olduris: UriSet.t;
+}
+  (** raised when a queue is accessed before being defined *)
+exception Queue_not_found of int;;
+  (** global uri_queue, used by all children *)
+let uri_queue = {
+  size = 0; overflowed = false; uris = Queue.create (); olduris = UriSet.empty
+};;
+let (get_queue, add_queue, remove_queue) =
+  let uri_queues = Hashtbl.create 17 in
+  ((fun pid -> (* get_queue *)
+    try
+      Hashtbl.find uri_queues pid
+    with Not_found -> raise (Queue_not_found pid)),
+  (fun pid size ->  (* add_queue *)
+    Hashtbl.replace
+      uri_queues
+      pid
+      { size = size; overflowed = false;
+        uris = Queue.create (); olduris = UriSet.empty }),
+  (fun pid -> (* remove_queue *)
+    try
+      Hashtbl.remove uri_queues pid
+    with Not_found -> raise (Queue_not_found pid)))
+;;
+
+exception Found;;
+let queue_mem item queue =  (* mem function over queues *)
+  try
+    Queue.iter (fun e -> if item = e then raise Found) queue;
+    false
+  with Found -> true
+;;
+
+let callback (req: Http_types.request) outchan =
+  try
+    let res = new Http_response.response () in
+    res#addBasicHeaders;
+    res#setContentType "text/xml";
+    (match req#path with
+
+    | "/add_if_not_in" ->
+        let (uri, pid) = (req#param "uri", int_of_string (req#param "PID")) in
+        debug_print (sprintf "Adding uri '%s' to queue '%d'" uri pid);
+        let queue = get_queue pid in
+        let result =
+          if (Queue.length queue.uris) + (UriSet.cardinal queue.olduris) >=
+             queue.size
+          then
+            begin (* overflow! *)
+              queue.overflowed <- true;
+              debug_print "Answer: not_added_because_already_too_many";
+              "not_added_because_already_too_many"
+            end else begin  (* there's room for another uri *)
+              if (queue_mem uri queue.uris) || (UriSet.mem uri queue.olduris)
+              then
+                begin (* url already in *)
+                  debug_print "Answer: already_in";
+                  "already_in"
+                end else begin (* uri not in *)
+                  Queue.add uri queue.uris;
+                  debug_print "Answer: added";
+                  "added"
+                end
+            end
+        in
+        res#setBody (sprintf "<?xml version=\"1.0\"?>\n<%s/>\n" result);
+        if debug then res#serialize stderr;
+        Http_daemon.respond_with res outchan
+
+    | "/is_overflowed" ->
+        let pid = int_of_string (req#param "PID") in
+        let queue = get_queue pid in
+        let result = string_of_bool (queue.overflowed) in
+        debug_print (sprintf "%d queue is_overflowed = %s" pid result);
+        res#setBody (sprintf "<?xml version=\"1.0\"?>\n<%s/>\n" result);
+        if debug then res#serialize stderr;
+        Http_daemon.respond_with res outchan
+
+    | "/set_uri_set_size" ->
+        let (pid, size) =
+          (int_of_string (req#param "PID"), int_of_string (req#param "size"))
+        in
+        debug_print (sprintf "Setting size '%d' for queue '%d'" size pid);
+        (try
+          let queue = get_queue pid in
+          queue.size <- size;
+        with Queue_not_found p ->
+          assert (p = pid);
+          add_queue pid size);
+        res#setBody "<?xml version=\"1.0\"?>\n<done/>\n";
+        if debug then res#serialize stderr;
+        Http_daemon.respond_with res outchan
+
+    | "/get_next" ->
+        let pid = int_of_string (req#param "PID") in
+        debug_print (sprintf "Getting next uri from queue '%d'" pid);
+        let queue = get_queue pid in
+        let element = (* xml response's root element *)
+          try
+            let uri = Queue.take queue.uris in
+            queue.olduris <- UriSet.add uri queue.olduris;
+            sprintf
+              "<%suri value=\"%s\"/>"
+              (if queue.overflowed then "marked_" else "")
+              uri
+          with Queue.Empty -> "<empty/>"
+        in
+        res#setBody ("<?xml version=\"1.0\"?>\n" ^ element ^ "\n");
+        if debug then res#serialize stderr;
+        Http_daemon.respond_with res outchan
+
+    | "/reset_to_empty" ->
+        let pid = int_of_string (req#param "PID") in
+        remove_queue pid;
+        debug_print (sprintf "Resetting queue '%d'" pid);
+        res#setBody "<?xml version=\"1.0\"?>\n<done/>\n";
+        if debug then res#serialize stderr;
+        Http_daemon.respond_with res outchan
+
+    | invalid_request ->
+        debug_print ("Invalid request received");
+        Http_daemon.respond_error
+          ~code:(`Status (`Client_error `Bad_request)) outchan);
+        prerr_endline "Request done!\n"
+  with
+  | Http_types.Param_not_found attr_name ->
+      Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request))
+        ~body:(sprintf "Parameter '%s' is missing" attr_name)
+        outchan
+  | Failure "int_of_string" ->  (* error in converting some paramters *)
+      Http_daemon.respond_error
+        ~code:(`Status (`Client_error `Bad_request)) outchan
+  | Queue_not_found queue_name ->
+      Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request))
+        ~body:(sprintf "Queue '%d' is not defined" queue_name)
+        outchan
+in
+
+Helm_registry.load_from configuration_file;
+let port = Helm_registry.get_int "uri_set_queue.port" in
+printf "%s started and listening on port %d\n" daemon_name port;
+flush stdout;
+Http_daemon.start' ~port ~mode:`Thread callback;
+printf "%s is terminating, bye!\n" daemon_name
+
diff --git a/daemons/http_getter/.cvsignore b/daemons/http_getter/.cvsignore
new file mode 100644 (file)
index 0000000..111b760
--- /dev/null
@@ -0,0 +1,14 @@
+*.cmi
+*.cmo
+*.cma
+*.cmx
+*.cmxa
+*.a
+*.o
+http_getter
+http_getter.opt
+autom4te.cache
+buildTimeOpts.ml
+config.log
+config.status
+configure
diff --git a/daemons/http_getter/AUTHORS b/daemons/http_getter/AUTHORS
new file mode 100644 (file)
index 0000000..5eab6c0
--- /dev/null
@@ -0,0 +1,11 @@
+
+- current version (the OCaml one!):
+
+    Stefano Zacchiroli <zack@cs.unibo.it>
+
+- for the old Perl version:
+
+    Claudio Sacerdoti Coen  <sacerdot@cs.unibo.it>
+    Stefano Zacchiroli      <zack@cs.unibo.it>
+    Luca Padovani           <lpadovan@cs.unibo.it>
+
diff --git a/daemons/http_getter/BUGS b/daemons/http_getter/BUGS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/daemons/http_getter/COPYING b/daemons/http_getter/COPYING
new file mode 100644 (file)
index 0000000..d60c31a
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/daemons/http_getter/ChangeLog b/daemons/http_getter/ChangeLog
new file mode 100644 (file)
index 0000000..cd6f55b
--- /dev/null
@@ -0,0 +1,6 @@
+- ignore comments and blank lines in servers file
+- added "list_servers", "add_server", "remove_server" methods
+- bugfix: multiple definition of URI by different servers are now permitted
+
+08/01/2003: OCaml reimplementation available! (version 0.2.1)
+28/12/2000: First alpha release
diff --git a/daemons/http_getter/Makefile b/daemons/http_getter/Makefile
new file mode 100644 (file)
index 0000000..d7b1089
--- /dev/null
@@ -0,0 +1,31 @@
+VERSION = 0.3.0
+NAME = http_getter
+
+REQUIRES = helm-getter helm-logger helm-registry netstring
+COMMONOPTS = -package "$(REQUIRES)" -pp camlp4o -thread
+OCAMLFIND = OCAMLPATH=../ocaml/METAS ocamlfind
+OCAMLC = $(OCAMLFIND) ocamlc -g $(COMMONOPTS)
+OCAMLOPT = $(OCAMLFIND) opt $(COMMONOPTS)
+
+all: byte
+byte: $(NAME)
+opt: $(NAME).opt
+world: byte opt
+
+$(NAME): buildTimeOpts.cmo main.ml
+       $(OCAMLC) -linkpkg -o $@ $^
+$(NAME).opt: buildTimeOpts.cmx main.ml
+       $(OCAMLOPT) -linkpkg -o $@ $^
+
+%.cmo: %.ml
+       $(OCAMLC) -c $<
+%.cmx: %.ml
+       $(OCAMLOPT) -c $<
+
+distclean: clean
+       rm -f buildTimeOpts.ml
+clean:
+       rm -f *.cm[aiox] *.o $(NAME){,.opt} *.dot
+
+.PHONY: all byte opt world clean distclean
+
diff --git a/daemons/http_getter/Makefile.overrides b/daemons/http_getter/Makefile.overrides
new file mode 100644 (file)
index 0000000..4b669eb
--- /dev/null
@@ -0,0 +1,2 @@
+http_getter_types.cmi http_getter_types.cmo: http_getter_types.ml
+       $(OCAMLC) -c $<
diff --git a/daemons/http_getter/NEWS b/daemons/http_getter/NEWS
new file mode 100644 (file)
index 0000000..aaf0047
--- /dev/null
@@ -0,0 +1,13 @@
+
+09/02/2004
+
+  Split getter in backend and frontend. Frontend is the only remaining file here
+  (namely main.ml). Backend is shipped in the helm-http_getter library (look in
+  the HELM cvs, dir ocaml/getter/).
+  -- Zack <zack@cs.unibo.it>
+
+08/01/2003
+
+  Fully OCaml HTTP Getter is now available: go and burn the Perl implementation!
+  -- Zack <zack@cs.unibo.it>
+
diff --git a/daemons/http_getter/README b/daemons/http_getter/README
new file mode 100644 (file)
index 0000000..1074b3b
--- /dev/null
@@ -0,0 +1,7 @@
+HELM (Hypertextual Electronic Library of Mathematics) is a project aimed
+at the creation of tools for the development and exploitation of a huge
+distributed library of formal mathematical knowledge. This package holds
+the getter used to map logical names into phisical names and download
+the required files.
+
+For more information see http://helm.cs.unibo.it
diff --git a/daemons/http_getter/buildTimeOpts.ml.in b/daemons/http_getter/buildTimeOpts.ml.in
new file mode 100644 (file)
index 0000000..b4865ac
--- /dev/null
@@ -0,0 +1,3 @@
+
+let conffile = "@GETTER_CONF_FILE@";;
+
diff --git a/daemons/http_getter/configure.ac b/daemons/http_getter/configure.ac
new file mode 100644 (file)
index 0000000..36efda5
--- /dev/null
@@ -0,0 +1,13 @@
+AC_INIT(main.ml)
+
+AC_ARG_WITH(conffile,
+             AS_HELP_STRING([--with-conffile=fname],
+                            [set default run time configuration file (default is /etc/http_getter.conf.xml]),
+             [GETTER_CONF_FILE=$withval], [GETTER_CONF_FILE=/etc/http_getter.conf.xml])
+
+AC_SUBST(GETTER_CONF_FILE)
+
+AC_OUTPUT([
+  buildTimeOpts.ml
+])
+
diff --git a/daemons/http_getter/http_getter.conf.xml.sample b/daemons/http_getter/http_getter.conf.xml.sample
new file mode 100644 (file)
index 0000000..b98763c
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<helm_registry>
+  <section name="getter">
+    <key name="servers_file">/projects/helm/var/servers.txt</key>
+    <key name="cache_dir">/tmp/helm/cache</key>
+    <key name="maps_dir">/projects/helm/var</key>
+    <key name="dtd_dir">/projects/helm/xml/dtd</key>
+    <key name="port">58081</key>
+    <key name="log_file">http_getter.log</key>
+  </section>
+</helm_registry>
diff --git a/daemons/http_getter/main.ml b/daemons/http_getter/main.ml
new file mode 100644 (file)
index 0000000..3117a85
--- /dev/null
@@ -0,0 +1,352 @@
+(* Copyright (C) 2003-2005, HELM Team.
+ * 
+ * This file is part of HELM, an Hypertextual, Electronic
+ * Library of Mathematics, developed at the Computer Science
+ * Department, University of Bologna, Italy.
+ * 
+ * HELM is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * HELM is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HELM; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA  02111-1307, USA.
+ * 
+ * For details, see the HELM World-Wide-Web page,
+ * http://helm.cs.unibo.it/
+ *)
+
+open Printf
+
+open Http_getter_common
+open Http_getter_const
+open Http_getter_misc
+open Http_getter_types
+
+  (* constants *)
+
+let configuration_file = BuildTimeOpts.conffile
+
+let common_headers = [
+  "Cache-Control", "no-cache";
+  "Pragma", "no-cache";
+  "Expires", "0"
+]
+
+  (* HTTP queries argument parsing *)
+
+  (* parse encoding ("format" parameter), default is `Normal *)
+let parse_enc (req: Http_types.request) =
+  try
+    (match req#param "format" with
+    | "normal" -> `Normal
+    | "gz" -> `Gzipped
+    | s -> raise (Bad_request ("Invalid format: " ^ s)))
+  with Http_types.Param_not_found _ -> `Normal
+
+  (* parse "patch_dtd" parameter, default is true *)
+let parse_patch (req: Http_types.request) =
+  try
+    (match req#param "patch_dtd" with
+    | s when String.lowercase s = "yes" -> true
+    | s when String.lowercase s = "no" -> false
+    | s -> raise (Bad_request ("Invalid patch_dtd value: " ^ s)))
+  with Http_types.Param_not_found _ -> true
+
+  (* parse output format ("format" parameter), no default value *)
+let parse_output_format meth (req: Http_types.request) =
+  match req#param "format" with
+  | s when String.lowercase s = "txt" -> `Text
+  | s when String.lowercase s = "xml" -> `Xml
+  | s -> raise (Bad_request ("Invalid /" ^ meth ^ " format: " ^ s))
+
+let xml_escape = Netencoding.Html.encode ~in_enc:`Enc_utf8 ()
+
+let html_tag ?exn () =
+  let xml_decl = "<?xml version=\"1.0\"?>\n" in
+  match exn with
+  | Some (exn, arg) ->
+      let (exn, arg) = (xml_escape exn, xml_escape arg) in
+      sprintf
+        ("%s<html xmlns=\"%s\"\nxmlns:helm=\"%s\"\n"
+        ^^ "helm:exception=\"%s\"\nhelm:exception_arg=\"%s\">\n")
+        xml_decl xhtml_ns helm_ns exn arg
+  | None ->
+      sprintf "%s<html xmlns=\"%s\"\nxmlns:helm=\"%s\">\n"
+        xml_decl xhtml_ns helm_ns
+
+let mk_return_fun pp_fun contype msg outchan =
+  Http_daemon.respond
+    ~body:(pp_fun msg) ~headers:["Content-Type", contype] outchan
+
+let pp_msg s = sprintf "%s<body>%s</body></html>" (html_tag ()) s
+let null_pp s = s
+
+let return_html_error exn =
+  let pp_error s =
+    sprintf
+      ("%s\n<body>Http Getter error: <span style=\"color:red\">%s"
+      ^^ "</span></body></html>")
+      (html_tag ~exn ()) s
+  in
+  mk_return_fun pp_error "text/xml"
+
+let return_html_internal_error exn =
+  let pp_internal_error s =
+    sprintf
+      ("%s\n<body>Http Getter Internal error: <span style=\"color:red\">%s"
+      ^^ "</span></body></html>")
+      (html_tag ~exn ()) s
+  in
+  mk_return_fun pp_internal_error "text/xml"
+
+let return_html_msg = mk_return_fun pp_msg "text/xml"
+let return_html_raw = mk_return_fun null_pp "text/xml"
+let return_xml_raw = mk_return_fun null_pp "text/xml"
+let return_400 exn body = return_html_error exn body
+
+let return_all_uris doctype uris outchan =
+  Http_daemon.send_basic_headers ~code:(`Code 200) outchan;
+  Http_daemon.send_header "Content-Type" "text/xml" outchan;
+  Http_daemon.send_headers common_headers outchan;
+  Http_daemon.send_CRLF outchan;
+  output_string
+    outchan
+    (sprintf
+"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
+<!DOCTYPE %s SYSTEM \"%s/getdtd?uri=%s.dtd\">
+
+<%s>
+"
+      doctype
+      (Lazy.force Http_getter_env.my_own_url)
+      doctype
+      doctype);
+  List.iter
+    (fun uri -> output_string outchan (sprintf "\t<uri value=\"%s\" />\n" uri))
+    uris;
+  output_string outchan (sprintf "</%s>\n" doctype)
+
+let return_all_xml_uris fmt outchan =
+  let uris = Http_getter.getalluris () in
+  match fmt with
+  | `Text ->
+      let buf = Buffer.create 10240 in
+      List.iter (bprintf buf "%s\n") uris ;
+      let body = Buffer.contents buf in
+      Http_daemon.respond
+        ~headers:(("Content-Type", "text/plain") :: common_headers)
+        ~body outchan
+   | `Xml -> return_all_uris "alluris" uris outchan
+
+let return_ls regexp fmt outchan =
+  let ls_items = Http_getter.ls regexp in
+  let buf = Buffer.create 10240 in
+  (match fmt with
+  | `Text ->
+      List.iter
+        (function
+          | Ls_section dir -> bprintf buf "dir, %s\n" dir
+          | Ls_object obj ->
+              bprintf buf "object, %s, <%s,%s,%s,%s>\n"
+              obj.uri (if obj.ann then "YES" else "NO")
+              (string_of_ls_flag obj.types)
+              (string_of_ls_flag obj.body)
+              (string_of_ls_flag obj.proof_tree))
+        ls_items
+  | `Xml ->
+      Buffer.add_string buf "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
+      bprintf buf "<!DOCTYPE ls SYSTEM \"%s/getdtd?uri=ls.dtd\">\n"
+        (Lazy.force Http_getter_env.my_own_url);
+      Buffer.add_string buf "<ls>\n";
+      List.iter
+        (function
+          | Ls_section dir -> bprintf buf "<section>%s</section>\n" dir
+          | Ls_object obj ->
+              bprintf buf
+"<object name=\"%s\">
+\t<ann value=\"%s\" />
+\t<types value=\"%s\" />
+\t<body value=\"%s\" />
+\t<proof_tree value=\"%s\" />
+</object>
+"
+              obj.uri (if obj.ann then "YES" else "NO")
+              (string_of_ls_flag obj.types)
+              (string_of_ls_flag obj.body)
+              (string_of_ls_flag obj.proof_tree))
+        ls_items;
+      Buffer.add_string buf "</ls>\n");
+  let body = Buffer.contents buf in
+  Http_daemon.respond
+    ~headers:(("Content-Type", "text/plain") :: common_headers)
+    ~body outchan
+
+let return_help outchan = return_html_raw (Http_getter.help ()) outchan
+
+let return_resolve uri outchan =
+  try
+    return_xml_raw
+      (sprintf "<url value=\"%s\" />\n" (Http_getter.resolve uri))
+      outchan
+  with
+  | Unresolvable_URI _ -> return_xml_raw "<unresolvable />\n" outchan
+  | Key_not_found _ -> return_xml_raw "<not_found />\n" outchan
+
+let log_failure msg = Http_getter_logger.log ("Request not fulfilled: " ^ msg)
+
+let convert_file ~from_enc ~to_enc fname =
+  let remove f = fun () -> if Sys.file_exists f then Sys.remove f in
+  match from_enc, to_enc with
+  | `Normal, `Normal
+  | `Gzipped, `Gzipped -> fname, (fun () -> ())
+  | `Normal, `Gzipped ->
+      let tmp = Http_getter_misc.tempfile () in
+      Http_getter_misc.gzip ~keep:true ~output:tmp fname;
+      tmp, remove tmp
+  | `Gzipped, `Normal ->
+      let tmp = Http_getter_misc.tempfile () in
+      Http_getter_misc.gunzip ~keep:true ~output:tmp fname;
+      tmp, remove tmp
+
+let is_gzip fname = Http_getter_misc.extension fname = ".gz"
+
+let patch_fun_for uri url =
+  let xmlbases =
+    if Http_getter_common.is_theory_uri uri then
+      Some (Filename.dirname uri, Filename.dirname url)
+    else
+      None
+  in
+  Http_getter_common.patch_xml ?xmlbases ~via_http:true ()
+
+let respond_dtd patch_dtd fname outchan =
+  let via_http = false in
+  let patch_fun =
+    if patch_dtd then Some (Http_getter_common.patch_dtd ~via_http ())
+    else None
+  in
+  Http_getter_common.return_file ~via_http:true ~fname ~contype:"text/plain"
+    ~gunzip:false ?patch_fun ~enc:`Normal outchan
+
+(* let respond_xsl
+  ?(via_http = true) ?(enc = `Normal) ?(patch = true) ~url outchan
+  =
+  let patch_fun =
+    if patch then Http_getter_common.patch_xsl ~via_http () else (fun x -> x)
+  in
+  let fname = tempfile () in
+  finally (fun () -> Sys.remove fname) (lazy (
+    wget ~output:fname url;
+    return_file ~via_http ~fname ~contype:"text/xml" ~patch_fun ~enc outchan
+  )) *)
+(*  | "/getxslt" ->
+     Http_getter_cache.respond_xsl
+      ~url:(Http_getter.resolve (req#param "uri"))
+      ~patch:(parse_patch req) outchan *)
+
+let respond_xslt patch_xslt xslt_name outchan =
+  let fname = Http_getter.getxslt xslt_name in
+  let patch_fun =
+    if patch_xslt then Some (Http_getter_common.patch_xsl ~via_http:true ())
+    else None
+  in
+  Http_getter_common.return_file ~fname ~contype:"text/xml" ?patch_fun
+    ~gunzip:false ~via_http:true ~enc:`Normal outchan
+
+  (* thread action *)
+
+let callback (req: Http_types.request) outchan =
+  try
+    Http_getter_logger.log ("Connection from " ^ req#clientAddr);
+    Http_getter_logger.log ("Received request: " ^ req#uri);
+    (match req#path with
+    | "/help" -> return_help outchan
+    | "/getxml" ->
+        let uri = req#param "uri" in
+        let fname = Http_getter.getxml uri in (* local name, in cache *)
+        let remote_name = Http_getter.resolve uri in (* remote name *)
+        let src_enc = if is_gzip fname then `Gzipped else `Normal in
+        let enc = parse_enc req in
+        let fname, cleanup = convert_file ~from_enc:src_enc ~to_enc:enc fname in
+        let contenc = if enc = `Gzipped then Some "x-gzip" else None in
+        let patch_fun =
+          if parse_patch req
+          then Some (patch_fun_for uri remote_name)
+          else None
+        in
+        let gunzip = (enc = `Gzipped) in
+        (try
+          Http_getter_common.return_file
+            ~fname ~contype:"text/xml" ?contenc ?patch_fun ~gunzip
+            ~via_http:true ~enc outchan;
+        with exn -> cleanup (); raise exn);
+        cleanup ()
+    | "/getxslt" -> respond_xslt (parse_patch req) (req#param "uri") outchan
+    | "/getdtd" ->
+        let fname = Http_getter.getdtd (req#param "uri") in
+        respond_dtd (parse_patch req) fname outchan
+    | "/resolve" -> return_resolve (req#param "uri") outchan
+    | "/clean_cache" ->
+        Http_getter.clean_cache ();
+        return_html_msg "Done." outchan
+    | "/getalluris" ->
+       return_all_xml_uris (parse_output_format "getalluris" req) outchan
+    | "/ls" ->
+        return_ls (req#param "baseuri") (parse_output_format "ls" req) outchan
+    | "/getempty" ->
+        Http_daemon.respond ~body:Http_getter_const.empty_xml outchan
+    | invalid_request ->
+        Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request))
+          outchan);
+    Http_getter_logger.log "Done!\n"
+  with
+  | Http_types.Param_not_found attr_name ->
+      let msg = sprintf "Parameter '%s' is missing" attr_name in
+      log_failure msg;
+      return_400 ("bad_request", msg) msg outchan
+  | Bad_request msg ->
+      log_failure msg;
+      return_html_error ("bad_request", msg) msg outchan
+  | Internal_error msg ->
+      log_failure msg;
+      return_html_internal_error ("internal_error", msg) msg outchan
+  | exn ->
+      let msg = "uncaught exception: " ^ (Printexc.to_string exn) in
+      (match exn with
+      | Http_getter_types.Key_not_found uri ->
+          return_html_error ("key_not_found", uri) msg outchan
+      | _ ->
+          log_failure msg;
+          return_html_error ("uncaught_exception", msg) msg outchan)
+
+let batch_update = ref false      
+
+let args = [ ]
+      
+    (* Main *)
+let main () =
+  Arg.parse args (fun _-> ()) "http_getter honors the following options:\n";
+  Helm_registry.load_from configuration_file;
+  Http_getter.init ();
+  print_string (Http_getter_env.env_to_string ());
+  flush stdout;
+  Sys.catch_break true;
+  let d_spec = Http_daemon.daemon_spec
+     ~mode:`Thread ~timeout:(Some 600) 
+     ~port:(Lazy.force Http_getter_env.port)
+     ~callback:callback ()
+  in
+  try
+    Http_daemon.main d_spec
+  with Sys.Break -> ()
+
+let _ = main ()
+
diff --git a/daemons/http_getter/panel/.cvsignore b/daemons/http_getter/panel/.cvsignore
new file mode 100644 (file)
index 0000000..5c9fd16
--- /dev/null
@@ -0,0 +1 @@
+getter-panel.tar.gz
diff --git a/daemons/http_getter/panel/Makefile b/daemons/http_getter/panel/Makefile
new file mode 100644 (file)
index 0000000..2663e20
--- /dev/null
@@ -0,0 +1,12 @@
+
+all:
+
+clean:
+       rm -f getter-panel.tar.gz
+
+cleanbak:
+       rm -rf *~
+
+dist: clean cleanbak
+       cd ..; tar cvfz getter-panel.tar.gz panel ; mv getter-panel.tar.gz panel
+
diff --git a/daemons/http_getter/panel/control.html b/daemons/http_getter/panel/control.html
new file mode 100644 (file)
index 0000000..495c420
--- /dev/null
@@ -0,0 +1,129 @@
+<html>
+
+<head>
+<title>Getter Control Panel</title>
+
+<style type="text/css">
+#normal { background-color: white; font-family: sans-serif }
+td.head { font-weight: bold; background-color: #e6e6fa; color: brown }
+td.back { background-color: #e6e6fa; color: brown }
+#indent { margin-left: 1cm; margin-right: 1cm }
+</style>
+
+<script language="JavaScript" src="control.js">
+</script>
+
+</head>
+
+<body id="normal">
+<a name="top"/>
+<table border="0" width="100%" cellpadding="4">
+<tr><td class="head" align="center"><big><big>Getter Control Panel</big></big></td></tr>
+</table>
+
+<br />
+
+<div id="indent">
+This is a control panel for the HTTP getter. You can control a local or remote getter by filling
+the appropriate field below and sending the desired commands. In most cases, results of commands, such as error
+messages or documents, will be opened in the frame at the bottom of this page.
+Note that in order to use this page <i>you must have JavaScript enabled</i>.
+If you have troubles, please send an email to the author:
+<a href="mailto:luca.padovani@cs.unibo.it">luca.padovani@cs.unibo.it</a>
+</div>
+
+<div id="indent">
+<br />
+<table border="1">
+  <tr>
+    <td>
+      <form name="getterURL">
+        Getter <b>URL</b>
+        <script>
+          document.write('<input type="text" value="' + getInitialGetterURL() + '" size="50"/>');
+        </script>
+        <select onChange="selectGetterURL(this)">
+          <option value="">---</option>
+          <option value="localhost:8081/">localhost</option>
+          <option value="marcello.cs.unibo.it:8081/">marcello</option>
+          <option value="phd.cs.unibo.it:8081/">phd</option>
+          <option value="eolo.cs.unibo.it:8081/">eolo</option>
+          <option value="mowgli.cs.unibo.it:58081/">mowgli</option>
+        </select>
+      </form>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <form>
+        <b>Check</b> if Getter is running and request <b>Help</b>:<br />
+        <input type="button" value="Check & Help" onClick="top.result.location.replace(getGetterURL() + 'help')"/>
+      </form>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <form>
+        <b>Update</b> Getter's maps:<br />
+        <input type="button" value="Update" onClick="top.result.location.replace(getGetterURL() + 'update')"/>
+      </form>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <form>
+        <b>Clean cache</b> (must be done every time a file is modified)<br />
+        <input type="button" value="Clean" onClick="top.result.location.replace(getGetterURL() + 'clean_cache')"/>
+      </form>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <form>
+        <b>List</b> servers:<br />
+        <input type="button" value="List servers" onClick="top.result.location.replace(getGetterURL() + 'list_servers')"/>
+      </form>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <form name="addServer">
+        <b>Add</b> a server to the servers list:<br />
+        Server URL: <input type="text" name="url" size="50" value="http://" /><br />
+        Server position: <input type="text" name="position" value="0" /><br />
+        <input type="button" value="Add server" onClick="top.result.location.replace(getGetterURL() + 'add_server?url=' + escape(document.addServer.elements[0].value) +'&position=' + escape(document.addServer.elements[1].value))"/>
+      </form>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <form name="removeServer">
+        <b>Remove</b> a server from the servers list:<br />
+        Server number: <input type="text" name="position" value="0" /><br />
+        <input type="button" value="Remove server" onClick="top.result.location.replace(getGetterURL() + 'remove_server?position=' + escape(document.removeServer.elements[0].value))"/>
+      </form>
+    </td>
+  </tr>
+</table>
+</div>
+
+<div id="indent">
+
+<table border="0">
+</table>
+
+</div>
+
+<div id="indent">
+  <br />
+  In case you want to customize the panel for your own needs, you can download
+  the source archive (HTML + JavaScript):
+  <ul>
+    <li>Getter Panel [<a href="getter-panel.tar.gz">.tar.gz</a>]</li>
+  </ul>
+</div>
+
+</body>
+
+</html>
+
diff --git a/daemons/http_getter/panel/control.js b/daemons/http_getter/panel/control.js
new file mode 100644 (file)
index 0000000..45736aa
--- /dev/null
@@ -0,0 +1,35 @@
+
+function getParam(name, def)
+{
+  var search = top.location.search;
+  search = search.slice(1);
+  var args = search.split("&");
+  var value = "-1";
+  for (var i = 0 ; i < args.length ; i++) {
+    var couple = args[i].split("=");
+    if (couple[0] == name) value = couple[1];
+  }
+  if (value == "-1") value = def;
+  return value;
+}
+
+function getInitialGetterURL()
+{
+  return getParam("getterURL", "http://mowgli.cs.unibo.it:58081/");
+}
+
+function getGetterURL()
+{
+  return document.getterURL.elements[0].value;
+}
+
+function selectGetterURL(ss)
+{
+  if (ss.selectedIndex == 0) {
+    document.getterURL.elements[0].value = "";
+  } else {
+    //document.getterURL.elements[0].value = "http://" + ss.options[ss.selectedIndex].value + ":8081/";
+    document.getterURL.elements[0].value = "http://" + ss.options[ss.selectedIndex].value;
+  }
+}
+
diff --git a/daemons/http_getter/panel/index.html b/daemons/http_getter/panel/index.html
new file mode 100644 (file)
index 0000000..caeebcf
--- /dev/null
@@ -0,0 +1,8 @@
+<html>
+
+<frameset rows="75%,*">
+  <frame src="control.html" name="control"/>
+  <frame src="welcome.html" name="result"/>
+</frameset>
+
+</html>
diff --git a/daemons/http_getter/panel/welcome.html b/daemons/http_getter/panel/welcome.html
new file mode 100644 (file)
index 0000000..f6fbed4
--- /dev/null
@@ -0,0 +1,6 @@
+<html>
+
+<body bgcolor="white">
+</body>
+
+</html>
diff --git a/daemons/http_getter/tools/dump_db.ml b/daemons/http_getter/tools/dump_db.ml
new file mode 100755 (executable)
index 0000000..3a64f1d
--- /dev/null
@@ -0,0 +1,6 @@
+#!/usr/bin/ocamlrun /usr/bin/ocaml
+#use "topfind";;
+#require "dbm";;
+let db = Dbm.opendbm Sys.argv.(1) [ Dbm.Dbm_rdonly ] 0 in
+Dbm.iter (Printf.printf "%s: %s\n") db;
+Dbm.close db
diff --git a/daemons/http_getter/tools/dump_db.pl b/daemons/http_getter/tools/dump_db.pl
new file mode 100755 (executable)
index 0000000..95d3f4a
--- /dev/null
@@ -0,0 +1,19 @@
+#!/usr/bin/perl -w
+
+# dump on stdout the data contained in a db file.
+# Print one line for each record in this format
+#  <key> = <value>
+#
+# Stefano "Zack" Zacchiroli <zack@cs.unibo.it>
+#
+
+use strict qw(O_RDONLY);
+use DB_File;
+
+my $dbfile = shift || die "which db file ?";
+my %map;
+tie(%map, 'DB_File', $dbfile, O_RDONLY, 0664);
+while(($key,$value) = each %map) {
+       print "$key = $value\n";
+}
+
diff --git a/daemons/http_getter/tools/uri_escape.pl b/daemons/http_getter/tools/uri_escape.pl
new file mode 100755 (executable)
index 0000000..0303e3f
--- /dev/null
@@ -0,0 +1,16 @@
+#!/usr/bin/perl -w
+use strict;
+
+# escape a URI with uri escaping
+#
+# Stefano "Zack" Zacchiroli <zack@cs.unibo.it>
+#
+
+
+use URI::Escape;
+
+while(<>) {
+ chomp;
+ print uri_escape($_);
+ print "\n";
+}
diff --git a/daemons/http_getter/tools/uri_unescape.pl b/daemons/http_getter/tools/uri_unescape.pl
new file mode 100755 (executable)
index 0000000..7f77d37
--- /dev/null
@@ -0,0 +1,15 @@
+#!/usr/bin/perl -w
+use strict;
+
+# unescape a URI escaped with uri escaping
+#
+# Stefano "Zack" Zacchiroli <zack@cs.unibo.it>
+#
+
+use URI::Escape;
+
+while(<>) {
+ chomp;
+ print uri_unescape($_);
+ print "\n";
+}
diff --git a/daemons/proofChecker/.cvsignore b/daemons/proofChecker/.cvsignore
new file mode 100644 (file)
index 0000000..aae07b8
--- /dev/null
@@ -0,0 +1 @@
+*.cm[iox] *.o proofChecker proofChecker.opt
diff --git a/daemons/proofChecker/.depend b/daemons/proofChecker/.depend
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/daemons/proofChecker/Makefile b/daemons/proofChecker/Makefile
new file mode 100644 (file)
index 0000000..af48d0a
--- /dev/null
@@ -0,0 +1,47 @@
+BIN_DIR = /usr/local/bin
+REQUIRES = helm-cic_proof_checking http
+PREDICATES =
+OCAMLOPTIONS = -package "$(REQUIRES)" -predicates "$(PREDICATES)" -thread
+OCAMLC = ocamlfind ocamlc $(OCAMLOPTIONS) -g
+OCAMLOPT = ocamlfind ocamlopt $(OCAMLOPTIONS)
+OCAMLDEP = ocamldep
+
+LIBRARIES = $(shell ocamlfind query -recursive -predicates "byte $(PREDICATES)" -format "%d/%a" $(REQUIRES))
+LIBRARIES_OPT = $(shell ocamlfind query -recursive -predicates "native $(PREDICATES)" -format "%d/%a" $(REQUIRES))
+
+all: $(PROOFCHECKEROBJS) proofChecker
+opt: $(PROOFCHECKEROBJS:.cmo=.cmx) proofChecker.opt
+
+DEPOBJS = proofChecker.ml
+
+PROOFCHECKEROBJS = proofChecker.cmo
+
+depend:
+       $(OCAMLDEP) $(DEPOBJS) > .depend
+
+proofChecker: $(PROOFCHECKEROBJS) $(LIBRARIES)
+       $(OCAMLC)  -linkpkg -o proofChecker $(PROOFCHECKEROBJS)
+
+proofChecker.opt: $(PROOFCHECKEROBJS:.cmo=.cmx) $(LIBRARIES_OPT)
+       $(OCAMLOPT) -linkpkg -o proofChecker.opt $(PROOFCHECKEROBJS:.cmo=.cmx)
+
+.SUFFIXES: .ml .mli .cmo .cmi .cmx
+.ml.cmo: $(LIBRARIES)
+       $(OCAMLC) -c $<
+.mli.cmi: $(LIBRARIES)
+       $(OCAMLC) -c $<
+.ml.cmx: $(LIBRARIES_OPT)
+       $(OCAMLOPT) -c $<
+
+clean:
+       rm -f *.cm[iox] *.o proofChecker proofChecker.opt
+
+install:
+       cp proofChecker proofChecker.opt $(BIN_DIR)
+
+uninstall:
+       rm -f $(BIN_DIR)/proofChecker $(BIN_DIR)/proofChecker.opt
+
+.PHONY: install uninstall clean
+
+include .depend
diff --git a/daemons/proofChecker/proofChecker.conf.xml.sample b/daemons/proofChecker/proofChecker.conf.xml.sample
new file mode 100644 (file)
index 0000000..1f58c6c
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<helm_registry>
+ <section name="proofchecker">
+  <key name="port">58084</key>
+ </section>
+ <section name="getter">
+  <key name="mode">remote</key>
+  <key name="url">http://localhost:58081/</key>
+  <!-- <key name="url">http://mowgli.cs.unibo.it:58081/</key> -->
+ </section>
+</helm_registry>
diff --git a/daemons/proofChecker/proofChecker.ml b/daemons/proofChecker/proofChecker.ml
new file mode 100644 (file)
index 0000000..e4f00fe
--- /dev/null
@@ -0,0 +1,133 @@
+(* Copyright (C) 2002, HELM Team.
+ * 
+ * This file is part of HELM, an Hypertextual, Electronic
+ * Library of Mathematics, developed at the Computer Science
+ * Department, University of Bologna, Italy.
+ * 
+ * HELM is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * HELM is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HELM; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA  02111-1307, USA.
+ * 
+ * For details, see the HELM World-Wide-Web page,
+ * http://cs.unibo.it/helm/.
+ *)
+
+open Printf;;
+
+let _ = Helm_registry.load_from "/projects/helm/etc/proofChecker.conf.xml";;
+
+let port = Helm_registry.get_int "proofchecker.port";;
+
+let (html_preamble, html_postamble) =
+  ((fun uri ->
+    (sprintf
+"<html>
+<head>
+ <title>Proof-Checking %s</title>
+</head>
+<body bgcolor=\"white\">
+<h3>Proof-Checking %s:</h3>
+"
+      uri uri)),
+("<h3>Done.</h3>
+</body>
+</html>
+END
+"))
+;;
+
+let bad_request outchan =
+  printf "INVALID REQUEST !!!!!\n\n";
+  flush stdout;
+  Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request))
+    outchan;
+  flush outchan
+;;
+
+let usage_string =
+"
+<html>
+  <head>
+    <title>ProofChecker's help message</title>
+  </head>
+  <body>
+    <h1>ProofChecker</h1>
+    <h2>Usage</h2>
+    <p>
+    Usage: <kbd>http://hostname:proofcheckerport/</kbd><em>command</em>
+    </p>
+    <p>
+    Available commands:
+    </p>
+    <p>
+      <b><kbd>help</kbd></b><br />
+      display this help message
+    </p>
+    <p>
+      <b><kbd>proofCheck?uri=uri</kbd></b><br />
+      proof-checks the object whose URI is specified by <em>uri</em>
+    </p>
+  </body>
+</html>
+"
+;;
+
+let outchan = ref stderr;;
+
+let _ =
+ HelmLogger.register_log_callback
+  (fun ?append_NL msg ->
+    output_string !outchan (HelmLogger.html_of_html_msg msg) ;
+    flush !outchan)
+;;
+
+let callback (req : Http_types.request) outchan' =
+  match req#path with
+  | "/proofCheck" ->
+      begin
+        outchan := outchan' ;
+        try
+          let uri = req#param "uri" in
+          Http_daemon.send_basic_headers ~code:(`Code 200) outchan' ;
+          Http_daemon.send_header "Content-type" "text/html" outchan' ; 
+          Http_daemon.send_CRLF outchan' ;
+          printf "Request to proof-check \"%s\"..." uri;
+          flush stdout;
+          fprintf outchan' "%s" (html_preamble uri);
+          flush outchan';
+          (try
+            ignore (CicTypeChecker.typecheck (UriManager.uri_of_string uri));
+           with e ->
+            fprintf outchan' "%s\n" (Printexc.to_string e);
+            flush outchan');
+          fprintf outchan' "%s" html_postamble;
+          flush outchan';
+          printf " done\n\n";
+          flush stdout
+        with Http_types.Param_not_found _ -> (* 'uri' argument not found *)
+          bad_request outchan'
+      end
+  | "/help" ->
+      Http_daemon.respond ~body:usage_string
+       ~headers:["Content-Type", "text/html"] outchan'
+  | req -> bad_request outchan'
+
+in
+
+printf "Proof Checker started and listening on port %d\n" port;
+flush stdout;
+CicEnvironment.set_trust (fun _ -> false);
+Http_daemon.start' ~port ~mode:`Fork callback ;
+printf "Proof Checker is terminating, bye!\n"
+
diff --git a/daemons/rdfly/.cvsignore b/daemons/rdfly/.cvsignore
new file mode 100644 (file)
index 0000000..5424f8c
--- /dev/null
@@ -0,0 +1 @@
+*.o *.cm[iox] rdfly rdfly.opt
diff --git a/daemons/rdfly/Makefile b/daemons/rdfly/Makefile
new file mode 100644 (file)
index 0000000..779bb7b
--- /dev/null
@@ -0,0 +1,39 @@
+BIN_DIR = /usr/local/bin
+REQUIRES = mysql http helm-registry
+PREDICATES = 
+OCAMLOPTIONS = -package "$(REQUIRES)" -predicates "$(PREDICATES)" -pp camlp4o
+OCAMLFIND = ocamlfind
+OCAMLC = $(OCAMLFIND) ocamlc -thread $(OCAMLOPTIONS)
+OCAMLOPT = $(OCAMLFIND) ocamlopt -thread $(OCAMLOPTIONS)
+OCAMLDEP = ocamldep -pp camlp4o
+
+LIBRARIES = $(shell $(OCAMLFIND) query -recursive -predicates "byte $(PREDICATES)" -format "%d/%a" $(REQUIRES))
+LIBRARIES_OPT = $(shell $(OCAMLFIND) query -recursive -predicates "native $(PREDICATES)" -format "%d/%a" $(REQUIRES))
+
+OBJS = rdfly.cmo
+
+all: rdfly
+opt: rdfly.opt
+
+rdfly: $(OBJS) $(LIBRARIES)
+       $(OCAMLC) -linkpkg -o $@ $(OBJS)
+
+rdfly.opt: $(OBJS:.cmo=.cmx) $(LIBRARIES_OPT)
+       $(OCAMLOPT) -linkpkg -o rdfly.opt $(OBJS:.cmo=.cmx)
+
+.SUFFIXES: .ml .mli .cmo .cmi .cmx
+.ml.cmo:
+       $(OCAMLC) -c $<
+.mli.cmi:
+       $(OCAMLC) -c $<
+.ml.cmx:
+       $(OCAMLOPT) -c $<
+
+$(OBJS): $(LIBRARIES)
+$(OBJS:.cmo=.cmx)): $(LIBRARIES_OPT)
+
+clean:
+       rm -f *.cm[iox] *.o rdfly rdfly.opt
+
+.PHONY: install uninstall clean
+
diff --git a/daemons/rdfly/rdfly.conf.xml.sample b/daemons/rdfly/rdfly.conf.xml.sample
new file mode 100644 (file)
index 0000000..5d479da
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<helm_registry>
+  <section name="rdfly">
+    <section name="mysql_connection">
+      <key name="host">localhost</key>
+      <key name="user">helm</key>
+      <key name="database">mowgli</key>
+      <key name="port">3306</key>
+    </section>
+    <key name="port">58086</key>
+  </section>
+</helm_registry>
diff --git a/daemons/rdfly/rdfly.ml b/daemons/rdfly/rdfly.ml
new file mode 100644 (file)
index 0000000..b9a79d1
--- /dev/null
@@ -0,0 +1,192 @@
+
+module M = Mysql
+
+  (* First of all we load the configuration *)
+let _ =
+ let configuration_file = "/projects/helm/etc/rdfly.conf.xml" in
+  Helm_registry.load_from configuration_file
+;;
+
+let open_db ?host ?database ?port ?password ?user =
+  try
+    M.quick_connect ?host ?database ?port ?password ?user
+  with
+    M.Error e as exc ->
+      prerr_endline e ;
+      raise exc
+
+let extract_position s =
+  let sharp_pos = String.rindex s '#' + 1 in
+  String.sub s sharp_pos ((String.length s) - sharp_pos)
+
+let mk_new_msg () = ref []
+
+let msg_output_string msg s = msg := s::!msg
+
+let msg_serialize msg =
+  String.concat "" (List.rev !msg)
+
+let msg_output_header msg obj =
+  msg_output_string msg "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n\n" ;
+  msg_output_string msg ("<rdf:RDF xml:lang=\"en\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:h=\"http://www.cs.unibo.it/helm/schemas/mattone.rdf#\">\n  <h:Object rdf:about=\"" ^ obj ^ "\">\n")
+
+let msg_output_trailer msg =
+  msg_output_string msg "  </h:Object>\n</rdf:RDF>\n"
+
+let msg_output_dc_header msg obj =
+  msg_output_string msg "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n\n" ;
+  msg_output_string msg ("<rdf:RDF xml:lang=\"en\"\n         xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n         xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\"\n         xmlns:dc=\"http://purl.org/metadata/dublin_core#\"\n         xmlns:dcq=\"http://purl.org/metadata/dublin_core_qualifiers#\"\n         xmlns:h=\"http:/www.cs.unibo.it/helm/schemas/schema-h.rdf#\"\n         xmlns:hth=\"http://www.cs.unibo.it/helm/schemas/schema-hth.rdf#\">\n") ;
+  msg_output_string msg "  <h:DirectoryOfObjects>"
+;;
+
+let msg_output_dc_trailer msg =
+  msg_output_string msg "  </h:DirectoryOfObjects>\n</rdf:RDF>"
+;;
+
+let value_of_optional_value =
+ function
+    None -> assert false
+  | Some v -> v
+;;
+
+let forward_metadata db obj =
+  let res = M.exec db ("SELECT * FROM refObj WHERE source = '" ^ obj ^ "';") in
+  let msg = mk_new_msg () in
+  msg_output_header msg obj ;
+  M.iter res
+   ~f:(function cols ->
+     let position = extract_position (value_of_optional_value (cols.(2))) in
+     let occurrence = value_of_optional_value (cols.(1)) in
+     msg_output_string msg "    <h:refObj>\n      <h:Occurrence>\n" ;
+     msg_output_string msg ("        <h:position>" ^ position ^ "</h:position>\n") ;
+     msg_output_string msg ("        <h:occurrence>" ^ occurrence ^ "</h:occurrence>\n") ;
+     msg_output_string msg "      </h:Occurrence>\n    </h:refObj>\n"
+   ) ;
+  msg_output_trailer msg ;
+  msg_serialize msg
+;;
+
+let backward_metadata db obj =
+  let res = M.exec db ("SELECT * FROM refObj WHERE h_occurrence = '" ^ obj ^ "';") in
+  let msg = mk_new_msg () in
+  msg_output_header msg obj ;
+  M.iter res
+   ~f:(function cols ->
+     let position = extract_position (value_of_optional_value (cols.(2))) in
+     let occurrence = value_of_optional_value (cols.(0)) in
+     msg_output_string msg "    <h:backPointer>\n      <h:Occurrence>\n" ;
+     msg_output_string msg ("        <h:position>" ^ position ^ "</h:position>\n") ;
+     msg_output_string msg ("        <h:occurrence>" ^ occurrence ^ "</h:occurrence>\n") ;
+     msg_output_string msg "      </h:Occurrence>\n    </h:backPointer>\n"
+   ) ;
+  msg_output_trailer msg ;
+  msg_serialize msg
+;;
+
+let dc_metadata db obj =
+ let tables =
+  [ "dc:creator","dccreator" ;
+    "dc:date","dcdate" ;
+    "dc:description","dcdescription" ;
+    "dc:format","dcformat" ;
+    "dc:identifier","dcidentifier" ;
+    "dc:language","dclanguage" ;
+    "dc:publisher","dcpublisher" ;
+    "dcq:RelationType","dcqRelationType" ;
+    "dc:relation","dcrelation" ;
+    "dc:rights","dcrights" ;
+    "dc:source","dcsource" ;
+    "dc:subject","dcsubject" ;
+    "dc:title","dctitle" ;
+    "hth:ResourceFormat","hthResourceFormat" ;
+    "hth:contact","hthcontact" ;
+    "hth:firstVersion","hthfirstVersion" ;
+    "hth:institution","hthinstitution" ;
+    "hth:modified","hthmodified"
+ ]
+ in
+  let msg = mk_new_msg () in
+  msg_output_dc_header msg obj ;
+  List.iter
+   (fun (propertyname,tablename) -> 
+     let res =
+      M.exec db
+       ("SELECT * FROM " ^ tablename ^ " WHERE uri = '" ^ obj ^ "';") in
+     M.iter res
+      ~f:(function cols ->
+        let value = value_of_optional_value (cols.(0)) in
+        msg_output_string msg
+         ("    <" ^ propertyname ^ ">" ^ value ^ "</" ^ propertyname ^ ">\n") ;
+      ) ;
+   ) tables ;
+   msg_output_dc_trailer msg ;
+   msg_serialize msg
+;;
+
+let debug_print s = prerr_endline ("[RDFly] " ^ s)
+
+let mk_return_fun contype msg outchan =
+  Http_daemon.respond
+    ~body:msg ~headers:["Content-Type", contype] outchan
+                                                                                                                                                                                    
+let return_html = mk_return_fun "text/html"
+let return_xml = mk_return_fun "text/xml"
+let return_400 body ch =
+  Http_daemon.respond_error ~code:(`Code 400) ~body ch
+let return_html_error s = return_html ("<html><body>" ^ s ^ "</body></html>")
+
+let get_option key =
+  try
+    Some (Helm_registry.get key)
+  with Helm_registry.Key_not_found _ -> None
+
+let get_int_option key =
+  try
+    Some (Helm_registry.get_int key)
+  with Helm_registry.Key_not_found _ -> None
+
+let host = get_option "rdfly.mysql_connection.host";;
+let database = get_option "rdfly.mysql_connection.database";;
+let port = get_int_option "rdfly.mysql_connection.port";;
+let password = get_option "rdfly.mysql_connection.password";;
+let user = get_option "rdfly.mysql_connection.user";;
+let daemonport = Helm_registry.get_int "rdfly.port";;
+
+let callback (req: Http_types.request) ch =
+  try
+    debug_print ("Connection from " ^ req#clientAddr) ;
+    debug_print ("Received request: " ^ req#uri) ;
+    (match req#path with
+    | "/help" ->
+        return_html_error "yeah right..." ch
+    | "/get" ->
+      let obj = req#param "object"
+      and kind = req#param "kind" in
+      let db = open_db ?host ?database ?port ?password ?user () in
+      begin
+        match kind with
+          "forward" -> return_xml (forward_metadata db obj) ch
+        | "backward" -> return_xml (backward_metadata db obj) ch
+        | "dc" -> return_xml (dc_metadata db obj) ch
+        | s -> return_html_error ("unsupported kind: " ^ s) ch
+      end ;
+      M.disconnect db
+    | invalid_request ->
+        Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request))
+          ch)
+  with
+  | Http_types.Param_not_found attr_name ->
+      return_400 (Printf.sprintf "Parameter '%s' is missing" attr_name) ch
+  | exc ->
+      return_html_error ("Uncaught exception: " ^ (Printexc.to_string exc)) ch
+
+let main () =
+  Sys.catch_break true;
+  try
+    Http_daemon.start'
+      ~timeout:(Some 600) ~port:daemonport callback
+  with Sys.Break -> ()
+in
+                                                                                                                                                                                    
+main ()
+
diff --git a/daemons/uwobo/.cvsignore b/daemons/uwobo/.cvsignore
new file mode 100644 (file)
index 0000000..7a77a0e
--- /dev/null
@@ -0,0 +1,7 @@
+*.cmi
+*.cmo
+*.cmx
+*.cma
+*.cmxa
+uwobo
+uwobo.opt
diff --git a/daemons/uwobo/.depend b/daemons/uwobo/.depend
new file mode 100644 (file)
index 0000000..a37a2cd
--- /dev/null
@@ -0,0 +1,18 @@
+uwobo.cmo: uwobo_common.cmi uwobo_engine.cmi uwobo_logger.cmi \
+    uwobo_profiles.cmi uwobo_styles.cmi 
+uwobo.cmx: uwobo_common.cmx uwobo_engine.cmx uwobo_logger.cmx \
+    uwobo_profiles.cmx uwobo_styles.cmx 
+uwobo_common.cmo: uwobo_common.cmi 
+uwobo_common.cmx: uwobo_common.cmi 
+uwobo_engine.cmo: uwobo_common.cmi uwobo_logger.cmi uwobo_styles.cmi \
+    uwobo_engine.cmi 
+uwobo_engine.cmx: uwobo_common.cmx uwobo_logger.cmx uwobo_styles.cmx \
+    uwobo_engine.cmi 
+uwobo_logger.cmo: uwobo_logger.cmi 
+uwobo_logger.cmx: uwobo_logger.cmi 
+uwobo_profiles.cmo: uwobo_profiles.cmi 
+uwobo_profiles.cmx: uwobo_profiles.cmi 
+uwobo_styles.cmo: uwobo_common.cmi uwobo_logger.cmi uwobo_styles.cmi 
+uwobo_styles.cmx: uwobo_common.cmx uwobo_logger.cmx uwobo_styles.cmi 
+uwobo_engine.cmi: uwobo_common.cmi uwobo_logger.cmi uwobo_styles.cmi 
+uwobo_styles.cmi: uwobo_common.cmi uwobo_logger.cmi 
diff --git a/daemons/uwobo/Makefile b/daemons/uwobo/Makefile
new file mode 100644 (file)
index 0000000..00b578a
--- /dev/null
@@ -0,0 +1,68 @@
+VERSION = 0.3.0
+DISTDIR = uwobo-$(VERSION)
+DISTTARBALL = $(DISTDIR).tar.gz
+REQUIRES = http gdome2 gdome2-xslt pcre unix helm-registry
+COMMONOPTS = -package "$(REQUIRES)" -pp camlp4o
+OCAMLFIND = ocamlfind
+OCAMLC = $(OCAMLFIND) ocamlc $(COMMONOPTS)
+OCAMLOPT = $(OCAMLFIND) ocamlopt $(COMMONOPTS)
+OCAMLDEP = $(OCAMLFIND) ocamldep $(COMMONOPTS)
+OCAMLDOC =     \
+       ocamldoc        \
+               $(shell $(OCAMLFIND) query -i-format http)      \
+               $(shell $(OCAMLFIND) query -i-format gdome2)    \
+               $(shell $(OCAMLFIND) query -i-format gdome2-xslt)       \
+               $(shell $(OCAMLFIND) query -i-format pcre)      \
+               $(shell $(OCAMLFIND) query -i-format unix)
+MODULES = uwobo_common uwobo_styles uwobo_profiles uwobo_logger uwobo_engine
+OBJS = $(patsubst %,%.cmo,$(MODULES))
+OBJSOPT = $(patsubst %,%.cmx,$(MODULES))
+
+all: byte
+byte: uwobo
+opt: uwobo.opt
+world: byte opt
+
+include .depend
+depend:
+       $(OCAMLDEP) *.ml *.mli > .depend
+
+%.cmi: %.mli
+       $(OCAMLC) -c $<
+%.cmo: %.ml %.cmi
+       $(OCAMLC) -c $<
+%.cmx: %.ml %.cmi
+       $(OCAMLOPT) -c $<
+uwobo.cmo: uwobo.ml
+       $(OCAMLC) -c $<
+uwobo.cmx: uwobo.ml
+       $(OCAMLOPT) -c $<
+uwobo: $(OBJS) uwobo.ml
+       $(OCAMLC) -linkpkg -o $@ $^
+uwobo.opt: $(OBJSOPT) uwobo.ml
+       $(OCAMLOPT) -linkpkg -o $@ $^
+
+uwobo.dot: *.ml *.mli
+       $(OCAMLDOC) -dot -o $@ $^
+
+distclean: clean
+clean:
+       rm -f *.cm[aiox] *.o uwobo{,.opt,.dot}
+dist: distclean depend
+       mkdir $(DISTDIR)/
+       cp      \
+               $(patsubst %, %.ml, $(MODULES)) \
+               $(patsubst %, %.mli, $(MODULES))        \
+               uwobo.ml        \
+               Makefile .depend        \
+               $(DISTDIR)/
+       tar cvzf $(DISTTARBALL) $(DISTDIR)/
+       rm -rf $(DISTDIR)/
+distcheck: $(DISTTARBALL)
+       if [ -d $(DISTDIR) ]; then rm -rf $(DISTDIR); else true; fi
+       tar xvzf $<
+       cd $(DISTDIR); make
+       rm -rf $(DISTDIR)
+
+.PHONY: all dist distclean distcheck byte opt world depend clean
+
diff --git a/daemons/uwobo/doc/uwobo.tex b/daemons/uwobo/doc/uwobo.tex
new file mode 100644 (file)
index 0000000..177d21d
--- /dev/null
@@ -0,0 +1,216 @@
+\documentclass{article}
+
+\usepackage{hyperref}
+
+\title{UWOBO Reference Manual\thanks{People who contributed to former
+versions are Ferruccio Guidi, Riccardo Solmi, Stephen Watt.}}
+\author{Luca Padovani \and Claudio Sacerdoti Coen \and Stefano
+Zacchiroli}
+
+\begin{document}
+
+\maketitle
+
+\noindent UWOBO is a Web Service implementing a XSLT engine. It allows
+XSLT stylesheets to be applied to XML documents. Once the UWOBO deamon
+is up and running, commands must be sent at the URL
+
+\begin{verbatim}
+http://hostname:uwoboport/command
+\end{verbatim}
+
+\section*{Stylesheet Management}
+
+Before stylesheets can be applied to XML documents, they must be
+loaded into UWOBO. This way stylesheets are compiled once and used as
+many times as needed. Once loaded, each stylesheet is identified by a
+unique identifier.
+
+\begin{verbatim}
+add?bind=key,uri[&bind=key,uri[&...]]
+\end{verbatim}
+
+The \texttt{add} command is used to load a new stylesheet, specified
+by a URI, and bind it to a corresponding key. Multiple stylesheets can
+be loaded at once.
+
+\begin{verbatim}
+remove?keys=[key1,key2,...]
+\end{verbatim}
+
+The \texttt{remove} command unloads one or more stylesheets specified
+by provided keys. It removes \emph{all} the loaded stylesheets if no
+key is given.
+
+\begin{verbatim}
+reload?keys=[key1,key2,...]
+\end{verbatim}
+
+The \texttt{reload} command reloads previously loaded stylesheets
+specified by the provided keys.  It reloads all the loaded stylesheets
+if no key is given. This command is particularly useful during
+stylesheet development (assuming the URI of the loaded stylesheets
+does not change), since it does not require the client to specify the
+URL of the stylesheets again.
+
+\begin{verbatim}
+list
+\end{verbatim}
+
+The \texttt{list} command returns the list of the loaded stylesheets
+along with their associated key.
+
+\section*{Profile Management}
+
+XSLT stylesheets may have \emph{parameters} that are typically
+supplied at application time. Although UWOBO supports this kind of
+interaction, it may be impractical from several different points of
+view.  Since parameters are communicated to UWOBO in the URL, the URL
+itself may become very large: the URL readibility decreases because of
+its lengths and also because of the quoting of the parameter values;
+moreover, there is an upper limit to the length of a URL which can be
+easily reached.
+
+Furthermore, it is often the case that among the supplied parameters,
+a large number of these stays the same between applications. 
+
+UWOBO provides a facility to store imperatively the value of
+parameters as its internal state. However, since parameters are
+typically used for storing user-dependent settings and preferences,
+UWOBO provides a notion of \emph{profile}. Profiles can be created as
+part of UWOBO's internal state. Profiles are identified by a key (a
+sequence of alphanumeric characters) and map parameter names to
+parameter values. At application time, UWOBO may be instructed to take
+the values of the parameters to be passed to the stylesheets from a
+particular profile.
+
+\begin{verbatim}
+listprofiles
+\end{verbatim}
+The \texttt{listprofiles} command returns the list of profiles
+currently loaded in UWOBO.
+
+\begin{verbatim}
+createprofile?[id=id][&orig=orig][&origpassword=origpassword]
+  [&readperm={public|private}][&writeperm={public|private}]
+  [&adminperm={public|private}][&password=password]
+\end{verbatim}
+The \texttt{createprofile} command creates a new profile. The
+identifier of the new profile can be provided, otherwise UWOBO will
+pick a randomly chosen fresh identifier. An \emph{original profile}
+can optionally be cloned (a password for the original profile must be
+provided if the original profile has private read
+permission). Permissions for read, write, and administrative access
+can be set to public or to private, the default being public. The
+newly created profile may optionally have a password set (the default
+is no password set).
+
+\begin{verbatim}
+removeprofile?id=id[&password=password]
+\end{verbatim}
+The \texttt{removeprofile} commands erases and removes the profile
+from UWOBO. The password is required if the profile has private
+administrative permission.
+
+\begin{verbatim}
+setparam?id=id[&password=password]&key=key[&value=value]
+\end{verbatim}
+The \texttt{setparam} command sets the parameter \texttt{key} to
+\texttt{value}, if the value is provided; otherwise the parameter is
+unset. The password is required if the profile has private write
+permission.
+
+\begin{verbatim}
+setpassword?id=id[&oldpassword=oldpassword][&password=password]
+\end{verbatim}
+The \texttt{setpassword} command changes or unset the password
+associated with the profile \texttt{id}. The old password must be
+provided if it was set.
+
+\begin{verbatim}
+setpermission?id=id[&password=password]
+  &permission={read|write|admin}&value={public|private}
+\end{verbatim}
+The \texttt{setpermission} commands changes the specified
+permission. Permissions can be set to private (password protected) or
+public.  The password is required if the profile has private
+administrative permission.
+
+\begin{verbatim}
+getparams?id=id[&password=password]
+\end{verbatim}
+The \texttt{getparams} command returns a list of all the parameters
+set in the specified profile. The password is required if the profile
+has private read permission.
+
+\begin{verbatim}
+getparam?id=id[&password=password]&key=key
+\end{verbatim}
+The \texttt{getparam} commands returns the value of the specified
+parameter in the profile \texttt{id}. The password is required if the
+profile has private read permission.
+
+\begin{verbatim}
+getpermission?id=id[&password=password]&for={read|write|admin}
+\end{verbatim}
+The \texttt{getpermission} command returns the value of the permission
+\texttt{key} in the profile \texttt{id}. The password is required if
+the profile has private administrative permission.
+
+\section*{Stylesheet Application}
+
+\begin{verbatim}
+apply?xmluri=uri&keys=key1,key2,...
+  [&errormode={ignore|comment|embed}]
+  [&debugmode={ignore|comment|embed}]
+  [&profile=id][&password=password]
+  [&param.name=value[&param.name=value[&...]]]
+  [&param.key.name=value[&param.key.name=value[&...]]]
+  [&prop.name[=value][&prop.name[=value][&...]]]
+\end{verbatim}
+The \texttt{apply} command applies a chain of stylesheets, specified
+by the keys \texttt{key1}, \texttt{key2}, \dots, to an input document,
+specified by \texttt{uri}.  Error and debugging modes can be set to
+three different values: \texttt{ignore} means that LibXSLT messages
+are ignored; \texttt{comment} means that LibXSLT messages are embedded
+in the result document inside an XML like comment; \texttt{embed}
+means that LibXSLT messages are embedded at the beginning of the
+result document (as childs of the root node) in XML elements in the
+UWOBO namespace.
+
+Parameters can be set for each stylesheet application: global
+parameters (i.e. parameters passed to all stylesheets) are set using
+\texttt{param.name=value} syntax, per-stylesheet parameters are set
+using \texttt{param.key.name=value} where \texttt{key} is the key of a
+loaded stylesheet.  It is possible to specify a profile that is
+searched for additional global and local parameters. The parameters
+stored in the profile have lower precedence with respect to those
+provided in the URL. A password must be provided if the profile has
+private read permission.
+
+Properties of the final chain output can be set as well: valueless
+properties can be set using \texttt{prop.name} syntax, others can be
+set using \texttt{prop.name=value} syntax.  Supported properties are
+listed in the UWOBO help page.
+
+\section*{Miscellaneous Commands}
+
+\begin{verbatim}
+help
+\end{verbatim}
+The \texttt{help} command displays an help message.
+
+\begin{verbatim}
+newsession?port=p
+\end{verbatim}
+The \texttt{newsession} command forks a new daemon on a specified
+port. The newly created deamon inherits the state of the original
+UWOBO it was forked off.
+
+\begin{verbatim}
+kill
+\end{verbatim}
+The \texttt{kill} command kills the daemon. The log file is \emph{not}
+deleted.
+
+\end{document}
\ No newline at end of file
diff --git a/daemons/uwobo/log/.cvsignore b/daemons/uwobo/log/.cvsignore
new file mode 100644 (file)
index 0000000..397b4a7
--- /dev/null
@@ -0,0 +1 @@
+*.log
diff --git a/daemons/uwobo/panel/.cvsignore b/daemons/uwobo/panel/.cvsignore
new file mode 100644 (file)
index 0000000..335ec95
--- /dev/null
@@ -0,0 +1 @@
+*.tar.gz
diff --git a/daemons/uwobo/panel/Makefile b/daemons/uwobo/panel/Makefile
new file mode 100644 (file)
index 0000000..cb4fdd9
--- /dev/null
@@ -0,0 +1,11 @@
+
+all:
+
+clean:
+       rm -f uwobo-panel.tar.gz
+
+cleanbak:
+       rm -rf *~
+
+dist: clean cleanbak
+       cd ..; tar cvfz uwobo-panel.tar.gz uwobo-panel ; mv uwobo-panel.tar.gz uwobo-panel
diff --git a/daemons/uwobo/panel/control.html b/daemons/uwobo/panel/control.html
new file mode 100644 (file)
index 0000000..d47e6f7
--- /dev/null
@@ -0,0 +1,638 @@
+<html>
+
+<head>
+<title>UWOBO Control Panel</title>
+
+<style type="text/css">
+#normal { background-color: white; font-family: sans-serif }
+td.head { font-weight: bold; background-color: #e6e6fa; color: brown }
+td.back { background-color: #e6e6fa; color: brown }
+#indent { margin-left: 1cm; margin-right: 1cm }
+</style>
+
+<script language="JavaScript" src="control.js">
+</script>
+
+</head>
+
+<body id="normal">
+<a name="top"/>
+<table border="0" width="100%" cellpadding="4">
+<tr><td class="head" align="center"><big><big>UWOBO Control Panel</big></big></td></tr>
+</table>
+
+<br />
+
+<div id="indent">
+This is a control panel for the UWOBO Web-Service. You can control a local or remote UWOBO service by filling
+the appropriate fields <a href="#params">below</a> and sending the desired commands. In most cases, results of commands, such as error
+messages or documents, will be opened in the frame at the bottom of this page. For those commands sending multiple
+requests to the UWOBO server, a new window will be opened for each request issued. Note that in order to use
+this page <i>you must have JavaScript enabled</i>.
+
+<br /><br />
+
+The sections:
+<ul>
+  <li><a href="#params">Global Parameters</a></li>
+  <li><a href="#sessions">Daemon Management</a></li>
+  <li><a href="#queries">Queries</a></li>
+  <li><a href="#profiles">Profiles</a></li>
+  <li><a href="#stylesheets">Stylesheet Management</a></li>
+  <li><a href="#process">Processing</a></li>
+</ul>
+
+In case you want to customize the panel for your own needs, you can download the source archive
+(HTML + JavaScript):
+<ul>
+  <li>UWOBO Panel [<a href="uwobo-panel.tar.gz">.tar.gz</a>]</li>
+</ul>
+
+</div>
+
+<a name="params"/>
+<table border="0" width="100%" cellpadding="4" cellspacing="0">
+<tr>
+  <td class="head" align="left"><big>Global Parameters</big></td>
+  <td class="back" align="right"><a href="#top">top</a></td>
+</tr>
+</table>
+
+<br />
+
+<div id="indent">
+The following are global parameters used by all the other section to contact the UWOBO service and possibly a
+Getter. The Getter is not required for some operations and can be excluded by unchecking the proper buttons
+below.
+
+<br /><br />
+
+The following is the URL used to contact the UWOBO Web-Service.
+<tt>localhost</tt> is relative to your machine. 
+
+<br /><br />
+
+<table border="0">
+  <tr>
+    <th colspan="2" align="left">UWOBO URL</th>
+  </tr>
+  <tr>
+    <td>
+      <form name="uwoboURL">
+        <script>
+          document.write('<input type="text" value="' + getInitialProcessorURL() + '" size="50"/>');
+       </script>
+      </form>
+    </td>
+    <td>
+      <form>
+        <select onChange="selectUwoboURL(this)">
+         <option value="">---</option>
+         <option value="localhost">localhost</option>
+         <option value="marcello.cs.unibo.it">marcello</option>
+         <option value="phd.cs.unibo.it">phd</option>
+         <option value="eolo.cs.unibo.it">eolo</option>
+    <option value="helm.phd.cs.unibo.it">helm</option>
+       </select>
+      </form>
+    </td>
+    <td>
+      <form>
+        <input type="button" value="Check" onClick="top.result.location.replace(getUwoboURL() + 'help')"/>
+      </form>
+    </td>
+  </tr>
+</table>
+
+The following is the URL used to contact the getter. The getter is usually launched manually.
+In all cases except for the check button below, 
+<tt>localhost</tt> is relative to the host running UWOBO, because the getter URL is sent as
+a parameter along with UWOBO commands. In other words, <tt>localhost</tt> <i>is</i> the host
+running UWOBO and not your machine.
+
+<br /><br />
+
+<table border="0">
+  <tr>
+    <th colspan="2" align="left">Getter URL</th>
+  </tr>
+  <tr>
+    <td>
+      <form name="getterURL">
+        <script>
+         document.write('<input type="text" value="' + getInitialGetterURL() + '" size="50"/>');
+       </script>
+      </form>
+    </td>
+    <td>
+      <form>
+        <select onChange="selectGetterURL(this)">
+         <option value="">---</option>
+         <option value="localhost">localhost</option>
+         <option value="marcello.cs.unibo.it">marcello</option>
+         <option value="phd.cs.unibo.it">phd</option>
+         <option value="eolo.cs.unibo.it">eolo</option>
+       </select>
+      </form>
+    </td>
+    <td>
+      <form>
+        <input type="button" value="Check" onClick="top.result.location.replace(getGetterURL() + 'help')"/>
+      </form>
+    </td>
+  </tr>
+</table>
+</div>
+
+<br />
+
+<a name="sessions"/>
+<table border="0" width="100%" cellpadding="4" cellspacing="0">
+<tr>
+  <td class="head" align="left"><big>Daemon Management</big></td>
+  <td class="back" align="right"><a href="#top">top</a></td>
+</tr>
+</table>
+
+<br />
+
+<div id="indent">
+<p>You can start a new daemon on a given port. The new daemon will have
+   an empty list of processed stylesheets.
+</p>
+<table border="0">
+  <tr>
+    <th colspan="2" align="left">Port</th>
+  </tr>
+  <tr>
+    <td>
+      <form name="sessions">
+        <script>
+         document.write('<input type="text" value="' + getInitialPort() + '" size="5"/>');
+       </script>
+      </form>
+    </td>
+    <td>
+      <form>
+        <input type="button" value="Start New Daemon" onClick="top.result.location.replace(getUwoboURL() + 'newsession?port=' + document.sessions.elements[0].value)"/>
+      </form>
+    </td>
+  </tr>
+</table>
+</div>
+
+<br />
+
+<div id="indent">
+<p>You can also kill the daemon. The log file will be mantained.</p>
+<table border="0">
+  <tr>
+    <td>
+      <form>
+        <input type="button" value="Stop Daemon" onClick="top.result.location.replace(getUwoboURL() + 'kill')"/>
+      </form>
+    </td>
+  </tr>
+</table>
+</div>
+
+<br />
+<a name="queries"/>
+<table border="0" width="100%" cellpadding="4" cellspacing="0">
+<tr>
+  <td class="head" align="left"><big>Queries</big></td>
+  <td class="back" align="right"><a href="#top">top</a></td>
+</tr>
+</table>
+
+<div id="indent">
+
+<br />
+
+The following are commands to do some simple queries about the UWOBO service.
+
+<br /><br />
+
+<table border="0">
+<tr>
+  <td>
+    Retrieve the version of the UWOBO service running at the UWOBO URL and list the syntax
+    of the accepted commands.
+    You can use this button to verify that a UWOBO service
+    is actually running there:
+  </td>
+</tr>
+<tr>
+  <td><form><input type="button" value="Help" onClick="top.result.location.replace(getUwoboURL() + 'help')"/></form></td>
+</tr>
+<tr>
+  <td>
+    Ask UWOBO for a list of the stylesheets currently compiled inside the Web-Service, along with their keys:
+  </td>
+</tr>
+<tr>
+  <td><form><input type="button" value="List Stylesheets" onClick="top.result.location.replace(getUwoboURL() + 'list')"/></form></td>
+</tr>
+</table>
+
+<br />
+
+</div>
+
+<br />
+<a name="profiles"/>
+<table border="0" width="100%" cellpadding="4" cellspacing="0">
+<tr>
+  <td class="head" align="left"><big>Profiles</big></td>
+  <td class="back" align="right"><a href="#top">top</a></td>
+</tr>
+</table>
+
+<div id="indent">
+
+<br />
+
+The following are commands to list and edit the UWOBO profiles.
+
+<br /><br />
+
+<p><em>List existent profiles.</em></p>
+<table border="0">
+<tr>
+  <td><form><input type="button" value="List Profiles" onClick="top.result.location.replace(getUwoboURL() + 'listprofiles')"/></form></td>
+</tr>
+</table>
+
+<p><em>Create a new profile.</em></p>
+<table border="0">
+<tr>
+  <th align="left">Name</th>
+  <th align="left">Parent profile</th>
+  <th align="left">Parent profile password</th>
+</tr>
+<tr>
+  <td>
+    <form name="createProfileID">
+      <input type="text" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form name="createProfileClone">
+      <input type="text" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form name="createProfilePassword">
+      <input type="password" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Create Profile" onClick="createProfile()"/>
+    </form>
+  </td>
+</tr>
+</table>
+
+<p><em>Remove a profile.</em></p>
+<table border="0">
+<tr>
+  <th align="left">Name</th>
+  <th align="left">Password</th>
+</tr>
+<tr>
+  <td>
+    <form name="removeProfileID">
+      <input type="text" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form name="removeProfilePassword">
+      <input type="password" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Remove Profile" onClick="removeProfile()"/>
+    </form>
+  </td>
+</tr>
+</table>
+
+<p><em>Show profile parameters.</em></p>
+<table border="0">
+<tr>
+  <th align="left">Name</th>
+  <th align="left">Password</th>
+</tr>
+<tr>
+  <td>
+    <form name="getParamsProfileID">
+      <input type="text" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form name="getParamsProfilePassword">
+      <input type="password" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Show Params" onClick="getProfileParams()"/>
+    </form>
+  </td>
+</tr>
+</table>
+
+<p><em>Set profile parameters.</em></p>
+<table border="0">
+<tr>
+  <th align="left">Name</th>
+  <th align="left">Password</th>
+  <th align="left">Parameter name</th>
+  <th align="left">Parameter value</th>
+</tr>
+<tr>
+  <td>
+    <form name="setParamProfileID">
+      <input type="text" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form name="setParamProfilePassword">
+      <input type="password" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form name="setParamProfileKey">
+      <input type="text" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form name="setParamProfileValue">
+      <input type="text" size="20"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Set Param" onClick="setProfileParam()"/>
+    </form>
+  </td>
+</tr>
+</table>
+
+<br />
+
+</div>
+
+<a name="stylesheets"/>
+<table border="0" width="100%" cellpadding="4" cellspacing="0">
+<tr>
+  <td class="head" align="left"><big>Stylesheet Management</big></td>
+  <td class="back" align="right"><a href="#top">top</a></td>
+</tr>
+</table>
+
+<div id="indent">
+
+<br />
+
+In this section you can add, remove and reload stylesheet into the server. There are
+some frequently used stylesheets whose URIs and keys can be automatically filled in
+by selecting one of the options of the box below. Note that for such stylesheets
+the getter is used by default (you can deselect it, however):
+
+<br /><br 7>
+
+<table border="0">
+<tr>
+  <th align="left">Predefined Stylesheets</th>
+</tr>
+<tr>
+  <td>
+    <form name="predefinedStylesheets">
+      <select size="1" onChange="selectPredefinedStylesheet(this)">
+        <option value="">---</option>
+        <option value="C1,rootcontent.xsl,true">CIC ==&gt; MathML Content</option>
+        <option value="TC1,objtheorycontent.xsl,true">CIC ==&gt; MathML Content (Show only the thesis)</option>
+        <option value="C2,annotatedpres.xsl,true">MathML Content ==&gt; MathML Presentation</option>
+        <option value="T1,theory_content.xsl,true">Theory CIC ==&gt; MathML Content</option>
+        <option value="T2,theory_pres.xsl,true">Theory Content ==&gt; MathML Presentation</option>
+        <option value="E,expandobj.xsl,true">Expander</option>
+        <option value="G,genmmlid.xsl,true">MathML Content ==&gt; MathML Content + IDs</option>
+        <option value="HC2,content_to_html.xsl,true">MathML Content ==&gt; HTML</option>
+        <option value="L,link.xsl,true">Resolve links</option>
+        <option value="d_c,drop_coercions.xsl,true">Drop implicit coercions</option>
+        <option value="meta_theory,mk_meta_theory.xsl,true">Metadata (back-pointers) to theory</option>
+       <option value="L2T,ls2theory.xsl,true">Getter LS ==&gt; Theory</option>
+        <option value="GP,getParam.xsl,true">Get Param</option>
+        <option value="RT,resolve_topurl.xsl,true">Logic-sheet to substitute the interface URL</option>
+        <option value="S,search.xsl,true">Call the search engine</option>
+        <option value="MC,metadataControl.xsl,true">Stylesheet to create links to metadata</option>
+        <option value="MGL,makeGraphLinks.xsl,true">Add hyperlink menus to graphs</option>
+        <option value="MMG,mk_meta_graph.xsl,true">Make graph of backward dependencies</option>
+        <option value="MDG,mk_dep_graph.xsl,true">Make graph of dependencies</option>
+        <option value="HAT,hanane_textedepreuve2omdoc.xsl,true">Proof-Trees ==&gt; OMDoc</option>
+        <option value="HAO,hanane_omdoc2xhtml.xsl,true">OMDoc ==&gt; XHTML+MathML</option>
+       <option value="SPK,substKey.xsl,true">Substitute UWOBO keys</option>
+      </select>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Load All Predefined" onClick="loadAllPredefined()"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Remove All Predefined" onClick="removeAllPredefined()"/>
+    </form>
+  </td>
+</tr>
+</table>
+
+Here you have to identify a stylesheet by means of a relative or absolute URI. Usually
+you will specify a relative URI when using the getter to retrieve the stylesheet.
+Moreover, you can specify a key associated to this stylesheet, so that it will be easier to
+refer to it in subsequent operations. If escaping is enabled, then the stylesheet URI will
+be escaped. This might be particularly useful if the stylesheet is loaded by the getter.
+
+<br /><br />
+
+<table border="0">
+<tr>
+  <th align="left">Stylesheet</th>
+  <th align="left">Key</th>
+  <th align="left">Use Getter</th>
+  <th align="left">Escape</th>
+</tr>
+<tr>
+  <td>
+    <form name="stylesheetURI">
+      <input type="text" size="50"/>
+    </form>
+  </td>
+  <td>
+    <form name="stylesheetKey">
+      <input type="text" size="10"/>
+    </form>
+  </td>
+  <td>
+    <form name="loadUseGetter">
+      <input type="checkbox" checked="true"/>
+    </form>
+  </td>
+  <td>
+    <form name="loadEscape">
+      <input type="checkbox" checked="true"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Load" onClick="loadStylesheet()"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Reload" onClick="reloadStylesheet()"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Remove" onClick="removeStylesheet()"/>
+    </form>
+  </td>
+</tr>
+</table>
+
+Use the buttons below to remove or reload <i>all</i> the stylesheets.
+Use these commands with
+care, and remember that UWOBO can be shared among different users:
+
+<br /><br />
+
+<table border="0">
+<tr>
+  <td>
+    <form>
+      <input type="button" value="Remove All" onClick="removeAllStylesheets()"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Reload All" onClick="reloadAllStylesheets()"/>
+    </form>
+  </td>
+</tr>
+</table>
+</div>
+
+<a name="process"/>
+<table border="0" width="100%" cellpadding="4" cellspacing="0">
+<tr>
+  <td class="head" align="left"><big>Processing</big></td>
+  <td class="back" align="right"><a href="#top">top</a></td>
+</tr>
+</table>
+
+<div id="indent">
+
+<br />
+
+You can use the &quot;Apply&quot; command to perform a transformation. Specify the URI of the source
+document in the form below. The URI can be relative or absolute (in the former case you
+will probably want to enable the use of the getter).
+If escaping is enabled, then special characters are escaped. This might be particularly useful
+if the source is loaded by the getter.
+
+<br /><br />
+
+<table border="0">
+<tr>
+  <th align="left">Source Document</th>
+  <th align="left">Escape</th>
+</tr>
+<tr>
+  <td>
+    <form name="sourceDocument">
+      <input type="text" size="50"/>
+    </form>
+  </td>
+  <td>
+    <form name="escapeSource">
+      <input type="checkbox" checked="true"/>
+    </form>
+  </td>
+</tr>
+</table>
+
+You can specify a sequence of zero or more parameters separated by blanks. Each
+parameter is made of a name immediately followed by <tt>=</tt> and then a value.
+If &quot;Escape&quot; is checked, then parameters are escaped in the final
+URI.
+
+<br /><br />
+
+<table border="0">
+<tr>
+  <th align="left">Parameters (optional)</th>
+  <th align="left">Escape</th>
+</tr>
+<tr>
+  <td>
+    <form name="parameters">
+      <input type="text" size="50"/>
+    </form>
+  </td>
+  <td>
+    <form name="escapeParameters">
+      <input type="checkbox" checked="true"/>
+    </form>
+  </td>
+</tr>
+</table>
+
+In the key list specify a list of keys
+separated by blanks. This is the list of stylesheets to be applied in sequence to the
+source document.
+When ready, click on the button and have fun!
+
+<br /><br />
+
+<table border="0">
+<tr>
+  <th align="left">Key list</th>
+  <th align="left">Use Getter</th>
+</tr>
+<tr>
+  <td>
+    <form name="keyList">
+      <input type="text" size="50"/>
+    </form>
+  </td>
+  <td>
+    <form name="applyUseGetter">
+      <input type="checkbox" checked="true"/>
+    </form>
+  </td>
+  <td>
+    <form>
+      <input type="button" value="Apply" onClick="applyStylesheets()"/>
+    </form>
+  </td>
+</tr>
+</table>
+
+</div>
+
+<table border="0" width="100%" cellpadding="4" cellspacing="0">
+<tr>
+  <td class="back" align="left">Page maintained by: <a href="http://www.cs.unibo.it/~lpadovan">Luca Padovani</a></td>
+  <td class="back" align="right"><a href="#top">top</a></td>
+</tr>
+</table>
+
+</body>
+
+</html>
+
diff --git a/daemons/uwobo/panel/control.js b/daemons/uwobo/panel/control.js
new file mode 100644 (file)
index 0000000..9858fe1
--- /dev/null
@@ -0,0 +1,234 @@
+
+function getParam(name, def)
+{
+  var search = top.location.search;
+  search = search.slice(1);
+  var args = search.split("&");
+  var value = "-1";
+  for (var i = 0 ; i < args.length ; i++) {
+    var couple = args[i].split("=");
+    if (couple[0] == name) value = couple[1];
+  }
+  if (value == "-1") value = def;
+  return value;
+}
+
+function getInitialPort()
+{
+  return "38080";
+}
+
+function getInitialProcessorURL()
+{
+  return getParam("processorURL", "http://mowgli.cs.unibo.it:58080/");
+}
+
+function getInitialGetterURL()
+{
+  return getParam("getterURL", "http://mowgli.cs.unibo.it:58081/");
+}
+
+function getUwoboURL()
+{
+  return document.uwoboURL.elements[0].value;
+}
+
+function getGetterURL()
+{
+  return document.getterURL.elements[0].value;
+}
+
+function selectUwoboURL(ss)
+{
+  if (ss.selectedIndex == 0) {
+    document.uwoboURL.elements[0].value = "";
+  } else {
+    document.uwoboURL.elements[0].value = "http://" + ss.options[ss.selectedIndex].value + ":58080/";
+  }
+}
+
+function selectGetterURL(ss)
+{
+  if (ss.selectedIndex == 0) {
+    document.getterURL.elements[0].value = "";
+  } else {
+    document.getterURL.elements[0].value = "http://" + ss.options[ss.selectedIndex].value + ":8081/";
+  }
+}
+
+function getPredefinedStylesheetKey(i)
+{
+  var v = document.predefinedStylesheets.elements[0].options[i].value;
+  var va = v.split(",");
+  return va[0];
+}
+
+function getPredefinedStylesheetURI(i)
+{
+  var v = document.predefinedStylesheets.elements[0].options[i].value;
+  var va = v.split(",");
+  return va[1];
+}
+
+function getPredefinedStylesheetUseGetter(i)
+{
+  var v = document.predefinedStylesheets.elements[0].options[i].value;
+  var va = v.split(",");
+  return va[2];
+}
+
+function selectPredefinedStylesheet(ss)
+{
+  if (ss.selectedIndex == 0) {
+    document.stylesheetURI.elements[0].value = "";
+    document.stylesheetKey.elements[0].value = "";
+  } else {
+    document.stylesheetURI.elements[0].value = getPredefinedStylesheetURI(ss.selectedIndex);
+    document.stylesheetKey.elements[0].value = getPredefinedStylesheetKey(ss.selectedIndex);
+  }
+
+  document.loadUseGetter.elements[0].checked = getPredefinedStylesheetUseGetter(ss.selectedIndex) == "true" ? true : false;
+  document.loadEscape.elements[0].checked = true;
+}
+
+function getProfileParams()
+{
+  var password = document.getParamsProfilePassword.elements[0].value;
+  if (password != "") { password = "&password=" + password; };
+
+  top.result.location.replace(getUwoboURL() + "getparams?id=" + document.getParamsProfileID.elements[0].value + password);
+}
+
+function setProfileParam()
+{
+  var password = document.setParamProfilePassword.elements[0].value;
+  if (password != "") { password = "&password=" + password; };
+
+  top.result.location.replace(getUwoboURL() + "setparam?id=" + document.setParamProfileID.elements[0].value + "&key=" + document.setParamProfileKey.elements[0].value + "&value=" + document.setParamProfileValue.elements[0].value + password);
+}
+
+function createProfile()
+{
+  var id = document.createProfileID.elements[0].value;
+  if (id != "") { id = "&id=" + id; };
+
+  var password = document.createProfilePassword.elements[0].value;
+  if (password != "") { password = "&password=" + password; };
+
+  var clone = document.createProfileClone.elements[0].value;
+  if (clone != "") { clone = "&orig=" + clone; };
+
+  top.result.location.replace(getUwoboURL() + "createprofile?foo=x" + id + password + clone);
+}
+
+function removeProfile()
+{
+  var password = document.removeProfilePassword.elements[0].value;
+  if (password != "") { password = "&password=" + password; };
+
+  top.result.location.replace(getUwoboURL() + "removeprofile?id=" + document.removeProfileID.elements[0].value + password);
+}
+
+function getStylesheetURL()
+{
+  var s;
+
+  if (document.loadUseGetter.elements[0].checked) {
+    s = getGetterURL() + "getxslt?uri=" + document.stylesheetURI.elements[0].value;
+  } else {
+    s = document.stylesheetURI.elements[0].value;
+  }
+
+  if (document.loadEscape.elements[0].checked) s = escape(s);
+  
+  return s;
+}
+
+function loadStylesheet()
+{
+  top.result.location.replace(getUwoboURL() + "add?bind=" + document.stylesheetKey.elements[0].value + "," + getStylesheetURL());
+}
+
+function removeStylesheet()
+{
+  top.result.location.replace(getUwoboURL() + "remove?keys=" + document.stylesheetKey.elements[0].value);
+}
+
+function removeAllStylesheets()
+{
+  top.result.location.replace(getUwoboURL() + "remove?keys=");
+}
+
+function reloadStylesheet()
+{
+  top.result.location.replace(getUwoboURL() + "reload?keys=" + document.stylesheetKey.elements[0].value);
+}
+
+function reloadAllStylesheets()
+{
+  top.result.location.replace(getUwoboURL() + 'reload?keys=');
+}
+
+function loadAllPredefined()
+{
+  with (document.predefinedStylesheets.elements[0]) {
+    var i;
+    var request = "";
+
+    for (i = 1; i < length; i++)
+      request +=
+        (request == "" ? "" : "&") +
+        "bind=" + getPredefinedStylesheetKey(i) + "," +  escape((getPredefinedStylesheetUseGetter(i) == "true" ? (getGetterURL() + "getxslt?uri=") : "") + getPredefinedStylesheetURI(i));
+    top.result.location.replace(getUwoboURL() + "add?" + request);
+  }
+}
+
+function removeAllPredefined()
+{
+  with (document.predefinedStylesheets.elements[0]) {
+    var i;
+    var request = "";
+
+    for (i = 1; i < length; i++)
+      request += getPredefinedStylesheetKey(i) + (i == length - 1 ? "" : ",");
+    top.result.location.replace(getUwoboURL() + "remove?keys=" + request);
+  }
+}
+
+function applyStylesheets()
+{
+  var i = 0;
+  var keyList = document.keyList.elements[0].value.split(" ");
+
+  var url = getUwoboURL() + "apply?xmluri=";
+  
+  var sourceURL = "";
+
+  if (document.applyUseGetter.elements[0].checked)
+    sourceURL += getGetterURL() + "getxml?uri=";
+    
+  sourceURL += document.sourceDocument.elements[0].value;
+
+  if (document.escapeSource.elements[0].checked)
+    url += escape(sourceURL);
+  else
+    url += sourceURL;
+
+  url += "&keys=";
+  for (i = 0; i < keyList.length; i++) {
+    url += keyList[i];
+    if (i < keyList.length - 1) url += ",";
+  }
+
+  var paramList = document.parameters.elements[0].value.split(" ");
+  for (i = 0; i < paramList.length; i++)
+    if (paramList[i].length > 0) {
+      if (document.escapeParameters.elements[0].checked) {
+        var p = paramList[i].split("=");
+        url += "&param." + p[0] + "=" + escape(p[1]);
+      } else
+        url += "&param." + paramList[i];
+    }
+  
+  top.result.location.replace(url);
+}
diff --git a/daemons/uwobo/panel/index.html b/daemons/uwobo/panel/index.html
new file mode 100644 (file)
index 0000000..caeebcf
--- /dev/null
@@ -0,0 +1,8 @@
+<html>
+
+<frameset rows="75%,*">
+  <frame src="control.html" name="control"/>
+  <frame src="welcome.html" name="result"/>
+</frameset>
+
+</html>
diff --git a/daemons/uwobo/panel/welcome.html b/daemons/uwobo/panel/welcome.html
new file mode 100644 (file)
index 0000000..f6fbed4
--- /dev/null
@@ -0,0 +1,6 @@
+<html>
+
+<body bgcolor="white">
+</body>
+
+</html>
diff --git a/daemons/uwobo/uwobo.conf.xml.sample b/daemons/uwobo/uwobo.conf.xml.sample
new file mode 100644 (file)
index 0000000..75b6f2d
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<helm_registry>
+  <section name="per_user_settings">
+    <key name="dbm_dir">/projects/helm/var</key>
+    <key name="cache_dir">/tmp/helm/cache</key>
+  </section>
+
+  <section name="uwobo">
+    <key name="log_basename">/var/log/mowgli/uwobo</key>
+    <key name="log_extension">.log</key>
+
+    <key name="port">58080</key>
+  </section>
+</helm_registry>
diff --git a/daemons/uwobo/uwobo.ml b/daemons/uwobo/uwobo.ml
new file mode 100644 (file)
index 0000000..1a5b44f
--- /dev/null
@@ -0,0 +1,817 @@
+(*
+ * Copyright (C) 2003:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+open Printf;;
+open Uwobo_common;;
+
+ (* debugging settings *)
+let debug = false ;;
+let debug_level = `Notice ;;
+let debug_print s = if debug then prerr_endline s ;;
+Http_common.debug := false ;;
+
+let configuration_file = "/projects/helm/etc/uwobo.conf.xml";;
+
+  (* First of all we load the configuration *)
+let _ =
+  Helm_registry.load_from configuration_file
+;;
+
+let save_configuration () =
+  if not (Helm_registry.has "uwobo.cloned") then
+    Helm_registry.save_to configuration_file
+;;
+
+  (* other settings *)
+let daemon_name = "UWOBO OCaml" ;;
+let default_media_type = "text/html" ;;
+let default_encoding = "utf8" ;;
+
+let get_media_type props =
+ try
+  List.assoc "media-type" props
+ with
+  Not_found -> default_media_type
+;;
+
+let get_encoding props =
+ try
+  List.assoc "encoding" props
+ with
+  Not_found -> default_encoding
+;;
+
+let string_of_param_option (req: Http_types.request) name =
+  try
+    req#param name
+  with
+      Http_types.Param_not_found _ -> "#"
+
+let string_option_of_string =
+  function
+      "#" -> None
+    | s -> Some s
+
+let port = Helm_registry.get_int "uwobo.port";;
+
+let logfilename_of_port port =
+ let basename = Helm_registry.get "uwobo.log_basename" in
+ let extension = Helm_registry.get "uwobo.log_extension" in
+  basename ^ "_" ^ string_of_int port ^ extension
+;;
+
+let logfile = logfilename_of_port port;;
+let logfile_perm = 0o640 ;;
+
+let respond_html body outchan =
+  Http_daemon.respond ~body ~headers:["Content-Type", "text/html"] outchan
+;;
+
+  (** perform an 'action' that can be applied to a list of keys or, if no keys
+  was given, to all keys *)
+let act_on_keys
+  keys_param styles logger per_key_action all_keys_action all_keys logmsg
+=
+  let keys =
+    try
+      Pcre.split ~pat:"," keys_param
+    with Http_types.Param_not_found _ -> []
+  in
+  match keys with
+  | [] -> (* no key provided, act on all stylesheets *)
+      logger#log (sprintf "%s all stylesheets (keys = %s) ..."
+        logmsg (String.concat ", " all_keys));
+      (try all_keys_action () with e -> logger#log (Printexc.to_string e));
+      logger#log (sprintf "Done! (all stylesheets)")
+  | keys ->
+      List.iter
+        (fun key -> (* act on a single stylesheet *)
+          logger#log (sprintf "%s stylesheet %s" logmsg key);
+          (try per_key_action key with e -> logger#log (Printexc.to_string e));
+          logger#log (sprintf "Done! (stylesheet %s)" key))
+        keys
+;;
+
+  (** parse parameters for '/apply' action *)
+let parse_apply_params =
+  let is_global_param x = Pcre.pmatch ~pat:"^param(\\.[^.]+){1}$" x in
+  let is_local_param x = Pcre.pmatch ~pat:"^param(\\.[^.]+){2}$" x in
+  let is_property x = Pcre.pmatch ~pat:"^prop\\.[^.]+$" x in
+  List.fold_left
+    (fun (old_params, old_properties) (name, value) ->
+      match name with
+      | name when is_global_param name ->
+          let name = Pcre.replace ~pat:"^param\\." name in
+          ((fun x -> (old_params x) @ [name, value]), old_properties)
+      | name when is_local_param name ->
+          let pieces = Pcre.extract ~pat:"^param\\.([^.]+)\\.(.*)" name in
+          let (key, name) = (pieces.(1), pieces.(2)) in
+          ((function
+            | x when x = key -> [name, value] @ (old_params x)
+            | x -> old_params x),
+           old_properties)
+      | name when is_property name ->
+          let name = Pcre.replace ~pat:"^prop\\." name in
+          (old_params, ((name, value) :: old_properties))
+      | _ -> (old_params, old_properties))
+    ((fun _ -> []), []) (* no parameters, no properties *)
+;;
+
+let serialize_param_list =
+  let is_global_param = Pcre.pmatch ~pat:"^param(\\.[^.]+){1}$" in
+  let is_local_param = Pcre.pmatch ~pat:"^param(\\.[^.]+){2}$" in
+    function params ->
+      let param_value_list =
+       List.filter
+         (fun (param, _) -> (is_global_param param) || (is_local_param param))
+         params
+      in
+       (String.concat
+          "," 
+          (List.map
+             (fun (param, value) -> (Pcre.replace ~pat:"^param\\." param) ^ "=" ^ value)
+             param_value_list))
+         
+let deserialize_param_list =
+  List.map
+    (fun pv ->
+       match Pcre.split ~pat:"=" pv with
+          [key] -> (key, None)
+        | [key; value] -> (key, Some value)
+        | _ -> assert false)
+
+(** Parse libxslt's message modes for error and debugging messages. Default is
+  to ignore mesages of both kind *)
+let parse_libxslt_msgs_mode (req: Http_types.request) =
+  ((try
+    (match req#param "errormode" with
+    | s when String.lowercase s = "ignore" -> LibXsltMsgIgnore
+    | s when String.lowercase s = "comment" -> LibXsltMsgComment
+    | s when String.lowercase s = "embed" -> LibXsltMsgEmbed
+    | err ->
+        raise (Uwobo_failure
+          (sprintf
+            "Unknown value '%s' for parameter '%s', use one of '%s' or '%s'"
+            err "errormode" "ignore" "comment")))
+  with Http_types.Param_not_found _ -> LibXsltMsgIgnore),
+  (try
+    (match req#param "debugmode" with
+    | s when String.lowercase s = "ignore" -> LibXsltMsgIgnore
+    | s when String.lowercase s = "comment" -> LibXsltMsgComment
+    | s when String.lowercase s = "embed" -> LibXsltMsgEmbed
+    | err ->
+        raise (Uwobo_failure
+          (sprintf
+            "Unknown value '%s' for parameter '%s', use one of '%s' or '%s'"
+            err "debugmode" "ignore" "comment")))
+  with Http_types.Param_not_found _ -> LibXsltMsgIgnore))
+;;
+
+  (** send ~cmd (without trailing "\n"!) through ~cmd_pipe, then wait for answer
+  on ~res_pipe (with a timeout of 60 seconds) and send over outchan data
+  received from ~res_pipe *)
+let short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan =
+(*   debug_print (sprintf "Sending command '%s' to grandparent ..." cmd); *)
+  output_string cmd_pipe (cmd ^ "\n");  (* send command to grandfather *)
+  flush cmd_pipe;
+  let res_pipe_fd = Unix.descr_of_in_channel res_pipe in
+  let (read_fds, _, _) =  (* wait for an answer *)
+    Unix.select [res_pipe_fd] [] [] 60.0
+  in
+  (match read_fds with
+  | [fd] when fd = res_pipe_fd -> (* send answer to http client *)
+      Http_daemon.send_basic_headers ~code:(`Code 200) outchan;
+      Http_daemon.send_header "Content-Type" "text/html" outchan;
+      Http_daemon.send_CRLF outchan;
+      (try
+        while true do
+          output_string outchan ((input_line res_pipe) ^ "\n")
+        done
+      with End_of_file -> flush outchan)
+  | _ ->  (* no answer received from grandfather *)
+      return_error "Timeout!" outchan)
+;;
+
+let (add_cmd_RE, remove_cmd_RE, reload_cmd_RE, kill_cmd_RE,
+     createprofile_cmd_RE, removeprofile_cmd_RE, setprofileparam_cmd_RE,
+     setparams_cmd_RE, setpassword_cmd_RE, setpermission_cmd_RE) =
+  (Pcre.regexp "^add ", Pcre.regexp "^remove ", Pcre.regexp "^reload ",
+   Pcre.regexp "^kill", Pcre.regexp "^createprofile ", Pcre.regexp "^removeprofile ",
+   Pcre.regexp "^setprofileparam ", 
+   Pcre.regexp "^setparams ", Pcre.regexp "^setpassword ", Pcre.regexp "^setpermission ")
+;;
+
+  (** raised by child processes when HTTP daemon process have to be restarted *)
+exception Restart_HTTP_daemon ;;
+
+  (** log a list of libxslt's messages using a processing logger *)
+let log_libxslt_msgs logger libxslt_logger =
+  List.iter
+    (function
+      | (LibXsltErrorMsg _) as msg -> logger#logBold (string_of_xslt_msg msg)
+      | (LibXsltDebugMsg _) as msg -> logger#logEmph (string_of_xslt_msg msg))
+    libxslt_logger#msgs
+;;
+
+  (* LibXSLT logger *)
+let veillogger = new Uwobo_common.libXsltLogger ;;
+
+  (* start_new_session cmd_pipe_exit res_pipe_entrance outchan port logfile
+  @param cmd_pipe Pipe to be closed before forking
+  @param res_pipe Pipe to be closed before forking
+  @param outchan  To be closed before forking
+  @param port The port to be used
+  @param logfile The logfile to redirect the stdout and sterr to
+  *)
+  (* It can raise Failure "Connection refused" *)
+  (* It can raise Failure "Port already in use" *)
+let start_new_session cmd_pipe res_pipe outchan port logfile =
+ (* Let's check that the port is free *)
+ (try
+   ignore
+    (Http_user_agent.get
+      ("http://127.0.0.1:" ^ string_of_int port ^ "/help")) ;
+   raise (Failure "Port already in use")
+  with
+   Unix.Unix_error (Unix.ECONNREFUSED, _, _) -> ()
+ ) ;
+ match Unix.fork () with
+    0 ->
+      Unix.handle_unix_error
+       (function () ->
+         (* 1. We close all the open pipes to avoid duplicating them *)
+         Unix.close (Unix.descr_of_out_channel cmd_pipe) ;
+         Unix.close (Unix.descr_of_in_channel res_pipe) ;
+         Unix.close (Unix.descr_of_out_channel outchan) ;
+         (* 2. We redirect stdout and stderr to the logfile *)
+         Unix.close Unix.stdout ;
+         assert
+          (Unix.openfile logfile [Unix.O_WRONLY ; Unix.O_APPEND ; Unix.O_CREAT]
+            0o664 = Unix.stdout) ;
+         Unix.close Unix.stderr ;
+         assert
+          (Unix.openfile logfile [Unix.O_WRONLY ; Unix.O_APPEND ; Unix.O_CREAT]
+            0o664 = Unix.stderr) ;
+         prerr_endline "***** Starting a new session" ;
+
+         (* 3. We set up a new environment *)
+         let environment =
+          (* Here I am loosing the current value of port_env_var; *)
+          (* this should not matter                               *)
+          Unix.putenv "uwobo__port" (string_of_int port) ;
+         Unix.putenv "uwobo__cloned" "1" ;
+          Unix.environment ()
+         in
+         (* 4. We exec a new copy of uwobo *)
+         Unix.execve Sys.executable_name [||] environment ; 
+         (* It should never reach this point *)
+         assert false
+       ) ()
+  | child when child > 0 ->
+     (* let's check if the new UWOBO started correctly *)
+     Unix.sleep 5 ;
+     (* It can raise Failure "Connection refused" *)
+     (try
+       ignore
+         (Http_user_agent.get
+           ("http://127.0.0.1:" ^ string_of_int port ^ "/help"))
+     with Unix.Unix_error (Unix.ECONNREFUSED, _, _) ->
+       raise (Failure "Connection refused"))
+  | _ -> failwith "Can't fork :-("
+;;
+
+  (* request handler action
+  @param syslogger Uwobo_logger.sysLogger instance used for logginf
+  @param styles Uwobo_styles.styles instance which keeps the stylesheets list
+  @param cmd_pipe output _channel_ used to _write_ update messages
+  @param res_pipe input _channel_ used to _read_ grandparent results
+  @param req http request instance
+  @param outchan output channel connected to http client
+  *)
+let callback
+  ~syslogger ~styles ~cmd_pipe ~res_pipe () (req: Http_types.request) outchan
+  =
+  try
+    syslogger#log `Notice (sprintf "Connection from %s" req#clientAddr);
+    syslogger#log `Debug (sprintf "Received request: %s" req#path);
+    (match req#path with
+    | "/add" ->
+        (let bindings = req#paramAll "bind" in
+        if bindings = [] then
+          return_error "No [key,stylesheet] binding provided" outchan
+        else begin
+          let cmd = sprintf "add %s" (String.concat ";" bindings) in
+          short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+        end)
+    | "/kill" ->
+        let logger = new Uwobo_logger.processingLogger () in
+         logger#log "Exiting" ;
+         respond_html logger#asHtml outchan ;
+         let cmd = "kill" in
+          short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+    | "/newsession" ->
+        let logger = new Uwobo_logger.processingLogger () in
+        let port = int_of_string (req#param "port") in
+        let logfile = logfilename_of_port port in
+        (try
+          start_new_session cmd_pipe res_pipe outchan port logfile ;
+          logger#log (sprintf "New session started: port = %d" port) ;
+          respond_html logger#asHtml outchan
+         with
+            Failure "int_of_string" ->
+             logger#log (sprintf "Invalid port number") ;
+             respond_html logger#asHtml outchan
+          | Failure "Port already in use" ->
+             Uwobo_common.return_error "port already in use" outchan
+          | Failure "Connection refused" ->
+             let log = ref [] in
+              (try
+                let ch = open_in logfile in
+                 while true do log := (input_line ch ^ "\n") :: !log ; done
+               with
+                  Sys_error _
+                | End_of_file -> ()
+              ) ;
+              let rec get_last_lines acc =
+               function
+                  (n,he::tl) when n > 0 ->
+                    get_last_lines (he ^ "<br />" ^ acc) (n-1,tl)
+                | _ -> acc
+              in
+               (* we just show the last 10 lines of the log file *)
+               let msg =
+                (if List.length !log > 0 then "<br />...<br />" else "<br />") ^
+                 get_last_lines "" (10,!log)
+               in
+                Uwobo_common.return_error "daemon not initialized"
+                 ~body:msg outchan)
+    | "/remove" ->
+          let cmd = sprintf "remove %s" (req#param "keys") in
+          short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+    | "/reload" ->
+          let cmd = sprintf "reload %s" (req#param "keys") in
+          short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+    | "/list" ->
+        (let logger = new Uwobo_logger.processingLogger () in
+        (match styles#list with
+        | [] -> logger#log "No stylesheets loaded (yet)!"
+        | l ->
+            logger#log "Stylesheets list:";
+            List.iter (fun s -> logger#log s) l);
+        respond_html logger#asHtml outchan)
+    | "/listprofiles" ->
+       let profile_list = Uwobo_profiles.list () in
+       respond_html ("<html><body><ul>" ^ String.concat "" (List.map (fun s -> "<li>" ^ s ^ "</li>") profile_list) ^ "</ul></body></html>") outchan
+    | "/createprofile" ->
+       let serialized_param_value_list = serialize_param_list req#params in
+       let cmd = sprintf "createprofile %s,%s,%s,%s,%s,%s,%s,%s" 
+                   (string_of_param_option req "id")
+                   (string_of_param_option req "orig")
+                   (string_of_param_option req "origpassword")
+                   (string_of_param_option req "readperm")
+                   (string_of_param_option req "writeperm")
+                   (string_of_param_option req "adminperm")
+                   (string_of_param_option req "password")
+                   serialized_param_value_list
+       in
+         short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+    | "/removeprofile" -> 
+       let cmd = sprintf "removeprofile %s,%s" 
+                   (req#param "id")
+                   (string_of_param_option req "password")
+       in
+         short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+    | "/setparam" ->
+       let cmd = sprintf "setprofileparam %s,%s,%s,%s" 
+                   (string_of_param_option req "id")
+                   (string_of_param_option req "password")
+                   (req#param "key")
+                   (string_of_param_option req "value")
+       in
+         short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+    | "/setpassword" ->
+       let cmd = sprintf "setpassword %s,%s,%s" 
+                   (req#param "id")
+                   (string_of_param_option req "oldpassword")
+                   (string_of_param_option req "password")
+       in
+         short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+    | "/setpermission" ->
+       begin
+         match req#param "for" with
+             "read"
+           | "write"
+           | "admin" as forwhat ->
+               let cmd = sprintf "setpermission %s,%s,%s,%s" 
+                           (req#param "id")
+                           (string_of_param_option req "password")
+                           forwhat
+                           (req#param "value")
+               in
+                 short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+           | _ -> Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) outchan
+       end
+    | "/getparams" ->
+        let pid = req#param "id" in
+       let password = try Some (req#param "password") with _ -> None in
+       let res = Uwobo_profiles.get_params pid ?password () in
+       respond_html
+        ("<html><body><ul>" ^
+         String.concat "" (List.map (fun (k,v) -> "<li><key>" ^ k ^ "</key> = <value>" ^ v  ^ "</value></li>") res) ^
+         "</ul></body></html>") outchan
+    | "/setparams" ->
+       let serialized_param_value_list = serialize_param_list req#params in
+       let cmd = sprintf "setparams %s,%s,%s"
+                   (req#param "id")
+                   (string_of_param_option req "password")
+                   serialized_param_value_list
+       in
+         short_circuit_grandfather_and_client ~cmd ~cmd_pipe ~res_pipe outchan
+    | "/getparam" ->
+        let pid = req#param "id" in
+       let password = try Some (req#param "password") with _ -> None in
+        let key = req#param "key" in
+       let value = Uwobo_profiles.get_param pid ?password ~key () in
+       respond_html ("<html><body>" ^ value ^ "</body></html>") outchan
+    | "/getpermission" ->
+        let pid = req#param "id" in
+       let password = try Some (req#param "password") with _ -> None in
+        let forwhat =
+        match req#param "for" with
+            "read" -> Some `Read
+          | "write" -> Some `Write
+          | "admin" -> Some `Admin
+          | _ -> None
+       in
+        begin
+         match forwhat with
+            Some forwhat ->
+             let value = Uwobo_profiles.get_permission pid ?password forwhat in
+             respond_html ("<html><body>" ^ (if value then "public" else "private") ^ "</body></html>") outchan
+           | None -> Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) outchan ;
+         end
+    | "/apply" ->
+        let logger = new Uwobo_logger.processingLogger () in
+        veillogger#clearMsgs;
+       let profile = try Some (req#param "profile") with _ -> None in
+       let password = try Some (req#param "password") with _ -> None in
+        let xmluri = req#param "xmluri" in
+        let keys = Pcre.split ~pat:"," (req#param "keys") in
+        (* notation: "local" parameters are those defined on a per-stylesheet
+        pasis (i.e. param.key.param=value), "global" parameters are those
+        defined for all stylesheets (i.e. param.param=value) *)
+        let (user_params, props) = parse_apply_params req#params in
+       let profile_params =
+        match profile with
+           None -> []
+         | Some profile -> Uwobo_profiles.get_params profile ?password () in
+       let params =
+        (* user provided parameters override the profile parameters *)
+         let is_global_param x = Pcre.pmatch ~pat:"^(\\.[^.]+){1}$" ("." ^ x) in
+         let is_local_param x = Pcre.pmatch ~pat:"^(\\.[^.]+){2}$" ("." ^ x) in
+        let add key value params =
+         if List.mem_assoc key params then params else params @ [key,value]
+        in
+          List.fold_left
+            (fun old_params (name, value) ->
+              match name with
+              | name when is_global_param name ->
+                 (fun x -> add name value (old_params x))
+              | name when is_local_param name ->
+                 let pieces = Pcre.extract ~pat:"^([^.]+)\\.(.*)" name in
+                 let (key, name) = (pieces.(1), pieces.(2)) in
+                  (function
+                    | x when x = key -> add name value (old_params x)
+                    | x -> old_params x)
+              | _ -> assert false)
+            user_params profile_params
+       in
+        let (libxslt_errormode, libxslt_debugmode) =
+          parse_libxslt_msgs_mode req
+        in
+        syslogger#log `Debug (sprintf "Parsing input document %s ..." xmluri);
+        let domImpl = Gdome.domImplementation () in
+        let input = domImpl#createDocumentFromURI ~uri:xmluri () in
+        if debug then begin
+          let tmp_xml, tmp_uri =
+            let dir =
+              Filename.dirname (Helm_registry.get "uwobo.log_basename")
+            in
+            dir ^ "/input.xml", dir ^ "/input.uri"
+          in
+          ignore (domImpl#saveDocumentToFile ~doc:input ~name:tmp_xml ());
+          let oc = open_out tmp_uri in
+          output_string oc xmluri;
+          close_out oc
+        end;
+        syslogger#log `Debug "Applying stylesheet chain ...";
+        (try
+          let (write_result, media_type, encoding) = (* out_channel -> unit *)
+            Uwobo_engine.apply
+              ~logger:syslogger ~styles ~keys ~params ~props ~veillogger
+              ~errormode:libxslt_errormode ~debugmode:libxslt_debugmode
+              input
+          in
+          let content_type = (* value of Content-Type HTTP response header *)
+            sprintf "%s; charset=%s"
+              (match media_type with None -> get_media_type props | Some t -> t)
+              (match encoding with None -> get_encoding props | Some e -> e)
+          in
+          syslogger#log `Debug
+            (sprintf "sending output to client (Content-Type: %s)...."
+              content_type);
+          Http_daemon.send_basic_headers ~code:(`Code 200) outchan;
+          Http_daemon.send_header "Content-Type" content_type outchan;
+          Http_daemon.send_CRLF outchan;
+          write_result outchan
+        with Uwobo_failure errmsg ->
+          return_error
+            ("Stylesheet chain application failed: " ^ errmsg)
+            ~body: ("<h2>LibXSLT's messages:</h2>" ^
+              String.concat "<br />\n"
+                (List.map string_of_xslt_msg veillogger#msgs))
+            outchan)
+    | "/help" -> respond_html usage_string outchan
+    | invalid_request ->
+        Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) outchan);
+    syslogger#log `Debug (sprintf "%s done!" req#path);
+  with
+  | Http_types.Param_not_found attr_name ->
+      bad_request (sprintf "Parameter '%s' is missing" attr_name) outchan
+  | exc ->
+      return_error ("Uncaught exception: " ^ (Printexc.to_string exc)) outchan
+;;
+
+  (* UWOBO's startup *)
+let main () =
+    (* (1) system logger *)
+  let logger_outchan =
+   debug_print (sprintf "Logging to file %s" logfile);
+   open_out_gen [Open_wronly; Open_append; Open_creat] logfile_perm logfile
+  in
+  let syslogger =
+    new Uwobo_logger.sysLogger ~level:debug_level ~outchan:logger_outchan ()
+  in
+  syslogger#enable;
+    (* (2) stylesheets list *)
+  let styles = new Uwobo_styles.styles in
+    (* (3) clean up actions *)
+  let last_process = ref true in
+  let http_child = ref None in
+  let die_nice () = (** at_exit callback *)
+    if !last_process then begin
+      (match !http_child with
+      | None -> ()
+      | Some pid -> Unix.kill pid Sys.sigterm);
+      syslogger#log `Notice (sprintf "%s is terminating, bye!" daemon_name);
+      syslogger#disable;
+      close_out logger_outchan
+    end
+  in
+  at_exit die_nice;
+  ignore (Sys.signal Sys.sigterm
+    (Sys.Signal_handle (fun _ -> raise Sys.Break)));
+  syslogger#log `Notice
+    (sprintf "%s started and listening on port %d" daemon_name port);
+  syslogger#log `Notice (sprintf "current directory is %s" (Sys.getcwd ()));
+  Unix.putenv "http_proxy" "";  (* reset http_proxy to avoid libxslt problems *)
+  while true do
+    let (cmd_pipe_exit, cmd_pipe_entrance) = Unix.pipe () in
+    let (res_pipe_exit, res_pipe_entrance) = Unix.pipe () in
+    match Unix.fork () with
+    | child when child > 0 -> (* (4) parent: listen on cmd pipe for updates *)
+        http_child := Some child;
+        let stop_http_daemon () =  (* kill child *)
+          debug_print (sprintf "UWOBOmaster: killing pid %d" child);
+          Unix.kill child Sys.sigterm;  (* kill child ... *)
+          ignore (Unix.waitpid [] child);  (* ... and its zombie *)
+        in
+        Unix.close cmd_pipe_entrance;
+        Unix.close res_pipe_exit;
+        let cmd_pipe = Unix.in_channel_of_descr cmd_pipe_exit in
+        let res_pipe = Unix.out_channel_of_descr res_pipe_entrance in
+        (try
+          while true do
+            (* INVARIANT: 'Restart_HTTP_daemon' exception is raised only after
+            child process has been killed *)
+            debug_print "UWOBOmaster: waiting for commands ...";
+            let cmd = input_line cmd_pipe in
+            debug_print (sprintf "UWOBOmaster: received %s command" cmd);
+            (match cmd with  (* command from grandchild *)
+            | "test" ->
+                stop_http_daemon ();
+                output_string res_pipe "UWOBOmaster: Hello, world!\n";
+                flush res_pipe;
+                raise Restart_HTTP_daemon
+            | line when Pcre.pmatch ~rex:kill_cmd_RE line -> (* /kill *)
+                exit 0
+            | line when Pcre.pmatch ~rex:add_cmd_RE line -> (* /add *)
+                let bindings =
+                  Pcre.split ~pat:";" (Pcre.replace ~rex:add_cmd_RE line)
+                in
+                stop_http_daemon ();
+                let logger = new Uwobo_logger.processingLogger () in
+                List.iter
+                  (fun binding -> (* add a <key, stylesheet> binding *)
+                    let pieces = Pcre.split ~pat:"," binding in
+                    match pieces with
+                    | [key; style] ->
+                        logger#log (sprintf "adding binding <%s,%s>" key style);
+                        veillogger#clearMsgs;
+                        (try
+                          veillogger#clearMsgs;
+                          styles#add key style;
+                          log_libxslt_msgs logger veillogger;
+                        with e ->
+                          logger#log (Printexc.to_string e))
+                    | _ -> logger#log (sprintf "invalid binding %s" binding))
+                  bindings;
+                output_string res_pipe logger#asHtml;
+                flush res_pipe;
+                raise Restart_HTTP_daemon
+            | line when Pcre.pmatch ~rex:remove_cmd_RE line ->  (* /remove *)
+                stop_http_daemon ();
+                let arg = Pcre.replace ~rex:remove_cmd_RE line in
+                let logger = new Uwobo_logger.processingLogger () in
+                veillogger#clearMsgs;
+                act_on_keys
+                  arg styles logger
+                  styles#remove (fun () -> styles#removeAll) styles#keys
+                  "removing";
+                log_libxslt_msgs logger veillogger;
+                output_string res_pipe (logger#asHtml);
+                raise Restart_HTTP_daemon
+            | line when Pcre.pmatch ~rex:reload_cmd_RE line ->  (* /reload *)
+                stop_http_daemon ();
+                let arg = Pcre.replace ~rex:reload_cmd_RE line in
+                let logger = new Uwobo_logger.processingLogger () in
+                veillogger#clearMsgs;
+                act_on_keys
+                  arg styles logger
+                  styles#reload (fun () -> styles#reloadAll) styles#keys
+                  "reloading";
+                output_string res_pipe (logger#asHtml);
+                raise Restart_HTTP_daemon
+           | line when Pcre.pmatch ~rex:createprofile_cmd_RE line -> (* /createprofile *)
+              stop_http_daemon ();
+               begin
+                 match (Pcre.split ~pat:"," (Pcre.replace ~rex:createprofile_cmd_RE line)) with
+                     id::clone::clone_password::read_perm::write_perm::admin_perm::password::pv_list ->
+                       let bool_option_of_string_option =
+                         function
+                             Some "true" -> Some true
+                           | Some _ -> Some false
+                           | None -> None
+                       in
+                       let pid =
+                         Uwobo_profiles.create
+                           ?id:(string_option_of_string id)
+                           ?clone:(string_option_of_string clone)
+                           ?clone_password:(string_option_of_string clone_password)
+                           ?read_perm:(bool_option_of_string_option (string_option_of_string read_perm))
+                           ?write_perm:(bool_option_of_string_option (string_option_of_string write_perm))
+                           ?admin_perm:(bool_option_of_string_option (string_option_of_string admin_perm))
+                           ?password:(string_option_of_string password)
+                           ()
+                       in
+                       let pv_list' = (deserialize_param_list pv_list) in
+                         List.iter
+                           (fun (key, value) ->
+                              Uwobo_profiles.set_param
+                              pid ?password:(string_option_of_string password) ~key ~value ())
+                           pv_list' ;
+                         save_configuration () ;
+                         output_string res_pipe ("Profile " ^ pid ^ " created. Hi " ^ pid) ;
+                         raise Restart_HTTP_daemon
+                   | _ -> assert false
+               end
+           | line when Pcre.pmatch ~rex:removeprofile_cmd_RE line -> (* /removeprofile *)
+              stop_http_daemon ();
+             let pid, password =
+               match Pcre.split ~pat:"," (Pcre.replace ~rex:removeprofile_cmd_RE line) with
+                   [pid; password] -> pid, (string_option_of_string password)
+                 | _ -> assert false
+              in
+               Uwobo_profiles.remove pid ?password () ;
+               save_configuration () ;
+               output_string res_pipe "Done" ;
+               raise Restart_HTTP_daemon
+           | line when Pcre.pmatch ~rex:setparams_cmd_RE line -> (* /setparams *)
+             stop_http_daemon () ;
+               let pid, password, pv_list =
+                 match Pcre.split ~pat:"," (Pcre.replace ~rex:setparams_cmd_RE line) with
+                     pid::password::pv_list ->
+                       pid, (string_option_of_string password), (deserialize_param_list pv_list)
+                   | _ -> assert false
+               in
+                 List.iter
+                   (fun (key, value) -> Uwobo_profiles.set_param pid ?password ~key ~value ())
+                   pv_list ;
+                 save_configuration () ;
+                 output_string res_pipe "Done" ;
+                 raise Restart_HTTP_daemon
+           | line when Pcre.pmatch ~rex:setprofileparam_cmd_RE line -> (* /setprofileparam *)
+              stop_http_daemon ();
+             let pid, password, key, value =
+               match Pcre.split ~pat:"," (Pcre.replace ~rex:setprofileparam_cmd_RE line) with
+                   [pid; password; key; value] ->
+                     pid, (string_option_of_string password), key, (string_option_of_string value)
+                 | _ -> assert false
+              in
+               Uwobo_profiles.set_param pid ?password ~key ~value () ;
+               save_configuration () ;
+               output_string res_pipe "Done" ;
+               raise Restart_HTTP_daemon
+           | line when Pcre.pmatch ~rex:setpassword_cmd_RE line -> (* /setpassword *)
+              stop_http_daemon ();
+             let pid, old_password, password =
+               match Pcre.split ~pat:"," (Pcre.replace ~rex:setpassword_cmd_RE line) with
+                   [pid; old_password; password] ->
+                     pid, (string_option_of_string old_password), (string_option_of_string password)
+                 | _ -> assert false
+              in
+               Uwobo_profiles.set_password pid ?old_password password ;
+               save_configuration () ;
+               output_string res_pipe "Done" ;
+               raise Restart_HTTP_daemon
+           | line when Pcre.pmatch ~rex:setpermission_cmd_RE line -> (* /setpermission *)
+              stop_http_daemon ();
+             let permission_of_string =
+               function
+                   "read" -> `Read
+                 | "write" -> `Write
+                 | "admin" -> `Admin
+                 | _ -> assert false
+             and bool_of_string s = "public" = s
+             in
+             let pid, password, forwhat, value =
+               match Pcre.split ~pat:"," (Pcre.replace ~rex:setpermission_cmd_RE line) with
+                   [pid; password; forwhat; value] ->
+                     pid, (string_option_of_string password), (permission_of_string forwhat), (bool_of_string value)
+                 | _ -> assert false
+              in
+               Uwobo_profiles.set_permission pid ?password forwhat value ;
+               save_configuration () ;
+               output_string res_pipe "Done" ;
+               raise Restart_HTTP_daemon
+            | cmd ->  (* invalid interprocess command received *)
+                syslogger#log `Warning
+                  (sprintf "Ignoring invalid interprocess command: '%s'" cmd))
+          done
+        with
+        | Restart_HTTP_daemon ->
+            close_in cmd_pipe;  (* these calls close also fds *)
+            close_out res_pipe
+         | Sys.Break as exn -> raise exn
+        | e -> (* Should we return a 404 error here? Maybe... (how?) *)
+           output_string res_pipe (Printexc.to_string e);
+            close_in cmd_pipe;  (* these calls close also fds *)
+            close_out res_pipe)
+    | 0 ->  (* (5) child: serve http requests *)
+        Unix.close cmd_pipe_exit;
+        Unix.close res_pipe_entrance;
+        last_process := false;
+        let cmd_pipe = Unix.out_channel_of_descr cmd_pipe_entrance in
+        let res_pipe = Unix.in_channel_of_descr res_pipe_exit in
+        debug_print (sprintf "Starting HTTP daemon on port %d ..." port);
+          (* next invocation doesn't return, process will keep on serving HTTP
+          requests until it will get killed by father *)
+        Http_daemon.start'~port ~mode:`Fork
+          (callback ~syslogger ~styles ~cmd_pipe ~res_pipe ())
+    | _ (* < 0 *) ->  (* fork failed :-((( *)
+        failwith "Can't fork :-("
+  done
+;;
+
+  (* daemon initialization *)
+try
+  Sys.catch_break true;
+  main ()
+with Sys.Break -> ()  (* 'die_nice' registered with at_exit *)
+;;
+
diff --git a/daemons/uwobo/uwobo_common.ml b/daemons/uwobo/uwobo_common.ml
new file mode 100644 (file)
index 0000000..8952f81
--- /dev/null
@@ -0,0 +1,243 @@
+(*
+ * Copyright (C) 2003:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+open Printf ;;
+
+exception Uwobo_failure of string ;;
+
+let uwobo_namespace = "http://helm.cs.unibo.it/uwobo" ;;
+let xsl_namespace = "http://helm.cs.unibo.it/uwobo" ;;
+
+let supported_properties = [
+  "cdata-section-elements";
+  "doctype-public";
+  "doctype-system";
+  "encoding";
+  "indent";
+  "media-type";
+  "method";
+  "omit-xml-declaration";
+  "standalone";
+  "version"
+]
+
+let is_supported_property name = List.mem name supported_properties
+
+let version = "0.3.0" ;;
+
+let usage_string =
+  sprintf
+    "
+<html>
+  <head>
+    <title>UWOBO's help message</title>
+  </head>
+  <body>
+    <h1>UWOBO (version: %s)</h1>
+    <h2>Information</h2>
+    Version: %s
+    <h2>Usage</h2>
+    <p>
+    Usage: <kbd>http://hostname:uwoboport/</kbd><em>command</em>
+    </p>
+    <p>
+    Available commands:
+    </p>
+    <p>
+      <b><kbd>help</kbd></b><br />
+      displays this help message
+    </p>
+    <p>
+      <b><kbd>newsession?port=p</kbd></b><br />
+      starts a new daemon on a given port <em>p</em>
+    </p>
+    <p>
+      <b><kbd>kill</kbd></b><br />
+      kills the daemon. The log file is mantained.
+    </p>
+    <p>
+      <b><kbd>add?bind=key,uri[&bind=key,uri[&...]]</kbd></b><br />
+      loads a new stylesheet, specified by <em>uri</em>, and bind it to key
+          <em>key</em>
+    </p>
+    <p>
+      <b><kbd>remove?keys=[key1,key2,...]</kbd></b><br />
+      unload stylesheets specified by <em>key1, key2, ...</em> or all
+          stylesheets if no key was given
+    </p>
+    <p>
+      <b><kbd>reload?keys=[key1,key2,...]</kbd></b><br />
+      reloads the stylesheets specified by <em>key1, key2, ...</em>. Reloads all
+          the stylesheets if no key was given
+    </p>
+    <p>
+      <b><kbd>list</kbd></b><br />
+      returns the list of loaded stylesheets
+    </p>
+    <p>
+      <b><kbd>apply?xmluri=uri&keys=key1,key2,...[&errormode={ignore|comment|embed}][&debugmode={ignore|comment|embed}][&profile=id][&password=password][&param.name=value[&param.name=value[&...]]][&param.key.name=value[&param.key.name=value[&...]]][&prop.name[=value][&prop.name[=value][&...]]]</kbd></b><br />
+      applies a chain of stylesheets, specified by <em>key1, key2, ...</em>, to an
+      input document, specified by <em>uri</em>.<br />
+      Error and debugging modes could be ste to three different values.
+      <em>ignore</em> means that LibXSLT messages are ignored; <em>comment</em>
+      meanst that LibXSLT messages are embedded in the result document inside an
+      XML like comment; <em>embed</em> means that LibXSLT messages are embedded
+      at the beginning of the result document (as childs of the root node) in
+      XML elements in the UWOBO namespace<br />
+      Additional parameters can be set for each stylesheet application: global
+      parameters (i.e. parameters passed to all stylesheets) are set using
+      <em>param.name=value</em> syntax, per stylesheet parameters are set using
+      <em>param.key.name=value</em> where <em>key</em> is the key of a loaded
+      stylesheet.<br />
+      Moreover, it is possible to specify a <em>profile</em> that is searched for
+      additional global and local parameters. The parameters stored in the profile
+      have lower precedence with respect to those provided in the URL. A
+      <em>password</em> for the profile must be provided if the read permission
+      of the profile is set to false.<br />
+      Properties of the final chain output can be set as well: valueless properties
+      can be set using <em>prop.name</em> syntax, others can be set using
+      <em>prop.name=value</em> syntax.<br />
+      Current supported properties are: %s.
+    </p>
+    <p>
+      <b><kbd>listprofiles</kbd></b><br />
+      returns the list of profiles available
+    </p>
+    <p>
+      <b><kbd>createprofile?[id=id][&orig=orig][&origpassword=origpassword][&readperm={public|private}][&writeperm={public|private}][&adminperm={public|private}][&password=password]</kbd></b><br />
+      creates a new profile. The id of the created profile is <em>id</em> (if provided); otherwise it is a fresh id.
+      The parameters are inherited from the profile <em>orig</em>, if provided. <em>origpassword</em> is the password of the
+      profile being copied in case the read permission of that profile is set to false. The default for
+      <em>password</em> is no password, the defaults for <em>readper,writeperm,adminperm</em> are public, public, public.
+    </p>
+    <p>
+      <b><kbd>removeprofile?id=id[&password=password]</kbd></b><br />
+      removes the profile <em>id</em>. The password is required if the profile administrative permission
+      is set to false.
+    </p>
+    <p>
+      <b><kbd>setparam?id=id[&password=password]&key=key[&value=value]</kbd></b><br />
+      sets the parameter <em>key</em> to <em>value</em>, if <em>value</em> is provided; otherwise
+      the parameter is unset. The password is required if the profile writing permission is set to
+      false.
+    </p>
+    <p>
+      <b><kbd>setpassword?id=id[&oldpassword=oldpassword][&password=password]</kbd></b><br />
+      changes or unset the password for a profile. The old password is required if it was set.
+    </p>
+    <p>
+      <b><kbd>setpermission?id=id[&password=password]&permission={read|write|admin}&value={public|private}</kbd></b><br />
+      changes the permission <em>permission</em>. The password is required if the administrative permission
+      is set to false.
+    </p>
+    <p>
+      <b><kbd>getparams?id=id[&password=password]</kbd></b><br />
+      returns all the parameters of the profile <em>id</em>. The password is required if the read permission
+      is set to false.
+    </p>
+    <p>
+      <b><kbd>getparam?id=id[&password=password]&key=key</kbd></b><br />
+      returns the value of the parameter <em>key</em> of the profile <em>id</em>. The password is required if the read permission
+      is set to false.
+    </p>
+    <p>
+      <b><kbd>getpermission?id=id[&password=password]&for={read|write|admin}</kbd></b><br />
+      returns the value of the permission <em>key</em> of the profile <em>id</em>. The password is required if the administrative
+      permission is set to false.
+    </p>
+  </body>
+</html>
+"
+    version version
+    (String.concat ", " supported_properties) (* supported properties *)
+;;
+
+let pp_error =
+  sprintf
+    "<html><body><span style=\"color:red\">Error: %s</span>%s</body></html>"
+;;
+let return_error msg ?(body = "") outchan =
+  Http_daemon.respond ~body:(pp_error msg body) outchan;;
+let bad_request body outchan =
+  Http_daemon.respond_error ~code:(`Code 400) ~body outchan
+;;
+
+  (** {2 LibXSLT logging} *)
+
+type xslt_msg =
+  | LibXsltErrorMsg of string
+  | LibXsltDebugMsg of string
+;;
+
+let string_of_xslt_msg = function
+  | LibXsltErrorMsg msg -> "LibXSLT ERROR: " ^ msg
+  | LibXsltDebugMsg msg -> "LibXSLT DEBUG: " ^ msg
+;;
+
+type xslt_msg_mode =
+  | LibXsltMsgIgnore
+  | LibXsltMsgComment
+  | LibXsltMsgEmbed
+;;
+
+class libXsltLogger =
+  let is_libxslt_error = function LibXsltErrorMsg _ -> true | _ -> false in
+  let is_libxslt_debug = function LibXsltDebugMsg _ -> true | _ -> false in
+  let flatten_libxslt_msg = function
+    | LibXsltErrorMsg msg -> msg
+    | LibXsltDebugMsg msg -> msg
+  in
+  object (self)
+
+    initializer
+      Gdome_xslt.setErrorCallback
+        (Some (fun msg -> self#appendMsg (LibXsltErrorMsg msg)));
+      Gdome_xslt.setDebugCallback
+        (Some (fun msg -> self#appendMsg (LibXsltDebugMsg msg)))
+
+    val mutable libXsltMsgs = []  (** libxslt's error and debugging messages *)
+
+      (* libxslt's error and debugging messages handling *)
+
+    method private appendMsg msg = libXsltMsgs <- msg :: libXsltMsgs
+
+    method clearMsgs = libXsltMsgs <- []
+    method clearErrorMsgs =
+      libXsltMsgs <- List.filter is_libxslt_debug libXsltMsgs
+    method clearDebugMsgs =
+      libXsltMsgs <- List.filter is_libxslt_error libXsltMsgs
+
+    method msgs = libXsltMsgs
+    method errorMsgs =
+      List.map flatten_libxslt_msg (List.filter is_libxslt_error libXsltMsgs)
+    method debugMsgs =
+      List.map flatten_libxslt_msg (List.filter is_libxslt_debug libXsltMsgs)
+
+  end
+;;
+
diff --git a/daemons/uwobo/uwobo_common.mli b/daemons/uwobo/uwobo_common.mli
new file mode 100644 (file)
index 0000000..9bd90c5
--- /dev/null
@@ -0,0 +1,75 @@
+(*
+ * Copyright (C) 2003:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+exception Uwobo_failure of string
+
+  (** XML namespace of UWOBO generated XML elements *)
+val uwobo_namespace: string
+
+val supported_properties: string list
+val is_supported_property: string -> bool
+
+val version: string (** version *)
+val usage_string: string  (** HTTP GET usage string *)
+
+  (** return an ok (200) http response, which display in html an error message.
+  Error title is reported inside an h1 tag; error body, if given, follows *)
+val return_error: string -> ?body: string -> out_channel -> unit
+  (** return a 400 (bad request) http response *)
+val bad_request: string -> out_channel -> unit
+
+  (** {2 LibXSLT logging} *)
+
+  (** libxslt's message *)
+type xslt_msg =
+  | LibXsltErrorMsg of string   (** libxslt's error messages *)
+  | LibXsltDebugMsg of string   (** libxslt's debugging messages *)
+
+  (** pretty print a xslt_msg *)
+val string_of_xslt_msg: xslt_msg -> string
+
+  (** libxslt's message reporting mode. That is: how to report libxslt's
+  messages during apply method *)
+type xslt_msg_mode =
+  | LibXsltMsgIgnore    (** Ignore some kind of messages *)
+  | LibXsltMsgComment   (** Embed in XML comments some kind of messages *)
+  | LibXsltMsgEmbed     (** Embed in XML elements some kind of messages *)
+
+class libXsltLogger:
+  object
+
+    method clearMsgs: unit
+    method clearErrorMsgs: unit
+    method clearDebugMsgs: unit
+
+    method msgs: xslt_msg list
+    method errorMsgs: string list
+    method debugMsgs: string list
+
+  end
+
diff --git a/daemons/uwobo/uwobo_engine.ml b/daemons/uwobo/uwobo_engine.ml
new file mode 100644 (file)
index 0000000..03a3b42
--- /dev/null
@@ -0,0 +1,263 @@
+(*
+ * Copyright (C) 2003:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+open Printf;;
+open Uwobo_common;;
+
+  (** set this to true and uwobo will save transformation's intermediate results
+  in /tmp/uwobo_intermediate_<seqno>_<pid>.xml *)
+let save_intermediate_results = false;;
+
+let xslNS = Gdome.domString "http://www.w3.org/1999/XSL/Transform"
+let outputS = Gdome.domString "output"
+
+  (** given a Gdome.document representing an XSLT stylesheet and an output
+  property return 'Some value' where 'value' is the property value, or None if
+  it's not defined *)
+let get_property name (document: Gdome.document) =
+  let node_list = document#getElementsByTagNameNS xslNS outputS in
+  match node_list#item 0 with
+  | None -> None
+  | Some node ->
+      let element = new Gdome.element_of_node node in
+      let domName = Gdome.domString name in
+      if element#hasAttribute domName then
+        Some (element#getAttribute domName)#to_string
+      else
+        None
+;;
+
+let namespaceURI = Some (Gdome.domString Uwobo_common.uwobo_namespace) ;;
+
+  (** output type wrt adding of debugging/error messages *)
+type outputType =
+  | XmlOutput of Gdome.node
+  | TextPlainOutput of Gdome.text
+  | NoOutput
+;;
+
+exception Found of int ;;
+
+  (** add debugging and/or error messages to a Gdome document. Handle three
+  distinct cases: (1) output contains an XML tree, (2) output contains only one
+  text node, (3) output contains no data.
+  If output contains an XML tree then users wishes are preserved and messages
+  are either not included or included as comments or included as XML ndoes.
+  If output contains only a text node comments are either not included or
+  included at the beginning of the textual output.
+  If output contains no data (i.e. DOM superroot node with no element or text
+  children) messages are embedded as XML comments or not embedded at all *)
+let add_msgs ~errormode ~debugmode ~msgs (doc: Gdome.document) =
+  let getOutputType (doc: Gdome.document) =
+    let children = doc#get_childNodes in
+    let len = children#get_length in
+    let rec find_element i =
+      if i > len then
+        raise Not_found
+      else
+        (match children#item i with
+        | Some node when node#get_nodeType = GdomeNodeTypeT.ELEMENT_NODE ->
+            XmlOutput node
+        | _ -> find_element (i + 1))
+    in
+    let rec find_text i =
+      if i > len then
+        raise Not_found
+      else
+        (match children#item i with
+        | Some node when node#get_nodeType = GdomeNodeTypeT.TEXT_NODE ->
+            TextPlainOutput (new Gdome.text_of_node node)
+        | _ -> find_element (i + 1))
+    in
+    if len = 0 then
+      NoOutput
+    else
+      (try find_element 0 with Not_found ->
+        (try find_text 0 with Not_found -> NoOutput))
+  in
+  match getOutputType (doc :> Gdome.document) with
+  | XmlOutput node ->
+    let add_generic_msg mode build tagname =
+      (match mode with
+      | LibXsltMsgIgnore -> (fun msg -> ())
+      | LibXsltMsgComment ->
+          (fun msg ->
+(*                 let contents = string_of_xslt_msg (build msg) ^ "<br />" in *)
+            let contents = string_of_xslt_msg (build msg) in
+            ignore (node#insertBefore
+              ~newChild:(doc#createComment
+                (Gdome.domString contents) :> Gdome.node)
+              ~refChild:node#get_firstChild))
+      | LibXsltMsgEmbed ->
+          (fun msg ->
+(*                 let contents = string_of_xslt_msg (build msg) ^ "<br />" in *)
+            let contents = string_of_xslt_msg (build msg) in
+            let element =
+              doc#createElementNS
+                ~namespaceURI ~qualifiedName:(Gdome.domString tagname)
+            in
+            ignore (element#appendChild
+              (doc#createTextNode
+                ~data:(Gdome.domString contents) :> Gdome.node));
+            ignore (node#insertBefore
+              ~newChild:(element :> Gdome.node)
+              ~refChild:node#get_firstChild)))
+    in
+    let add_error_msg =
+      add_generic_msg
+        errormode (fun msg -> LibXsltErrorMsg msg) "uwobo:error"
+    in
+    let add_debug_msg =
+      add_generic_msg
+        debugmode (fun msg -> LibXsltDebugMsg msg) "uwobo:debug"
+    in
+    List.iter
+      (function
+        | LibXsltErrorMsg msg -> add_error_msg msg
+        | LibXsltDebugMsg msg -> add_debug_msg msg)
+      (List.rev msgs) (* because each msg is added as 1st children *)
+| TextPlainOutput text ->
+    let add_generic_msg mode build =
+      (match mode with
+      | LibXsltMsgIgnore -> (fun _ -> ())
+      | LibXsltMsgComment | LibXsltMsgEmbed ->
+          (fun msg ->
+            text#insertData ~offset:0
+              ~arg:(Gdome.domString
+                (string_of_xslt_msg (build msg) ^ "\n"))))
+    in
+    let add_error_msg =
+      add_generic_msg errormode (fun msg -> LibXsltErrorMsg msg)
+    in
+    let add_debug_msg =
+      add_generic_msg debugmode (fun msg -> LibXsltDebugMsg msg)
+    in
+    List.iter
+      (function
+        | LibXsltErrorMsg msg -> add_error_msg msg
+        | LibXsltDebugMsg msg -> add_debug_msg msg)
+      (List.rev msgs) (* because each msg is added as 1st children *)
+| NoOutput ->
+    let add_generic_msg mode build =
+      (match mode with
+      | LibXsltMsgIgnore -> (fun _ -> ())
+      | LibXsltMsgComment | LibXsltMsgEmbed ->
+          (fun msg ->
+            let comment_node =
+              (* use comments anyway because text nodes aren't allowed in DOM as
+              superroot children *)
+              doc#createComment
+                (Gdome.domString (string_of_xslt_msg (build msg)))
+            in
+            ignore (doc#insertBefore ~newChild:(comment_node :> Gdome.node)
+              ~refChild:doc#get_firstChild)))
+    in
+    let add_error_msg =
+      add_generic_msg errormode (fun msg -> LibXsltErrorMsg msg)
+    in
+    let add_debug_msg =
+      add_generic_msg debugmode (fun msg -> LibXsltDebugMsg msg)
+    in
+    List.iter
+      (function
+        | LibXsltErrorMsg msg -> add_error_msg msg
+        | LibXsltDebugMsg msg -> add_debug_msg msg)
+      (List.rev msgs) (* because each msg is added as 1st children *)
+;;
+
+let apply
+  ~(logger: Uwobo_logger.sysLogger)
+  ~(styles: Uwobo_styles.styles)
+  ~keys ~params ~props
+  ~(veillogger: Uwobo_common.libXsltLogger)
+  ?(errormode = LibXsltMsgIgnore) ?(debugmode = LibXsltMsgIgnore)
+  input
+  =
+    (* "p_" prefix means "processed" *)
+  let (p_stylesheets,last_stylesheet) = styles#get keys props logger in
+  logger#log `Debug "Creating input document ...";
+  let intermediate_results_seqno = ref 0 in
+  let result = (* Gdome.document *)
+    List.fold_left
+      (fun source (key, stylesheet) ->
+        logger#log `Debug (sprintf "Applying stylesheet %s ..." key);
+        try
+          let params =
+            List.map
+             (fun (key,value) ->
+               let quoted_value =
+                if String.contains value '\'' then
+                 if String.contains value '"' then
+                  raise
+                   (Failure
+                     ("A parameter value can not contain both single and " ^
+                      "double quotes, since it must be a valid XPath string " ^
+                      "literal"))
+                 else
+                  "\"" ^ value ^ "\""
+                else
+                 "'" ^ value ^ "'"
+               in
+                (key,quoted_value)
+             ) (params key)
+          in
+          logger#log `Debug
+            (sprintf "Gdome_xslt.applyStylesheet params=%s"
+              (String.concat ", " (List.map (fun (k,v) -> k^": "^v) params)));
+          let res = Gdome_xslt.applyStylesheet ~source ~stylesheet ~params in
+          if save_intermediate_results then begin
+            let domImpl = Gdome.domImplementation () in
+            ignore
+              (domImpl#saveDocumentToFile
+                ~doc:res
+                ~name:(sprintf "/tmp/uwobo_intermediate_%d_%d.xml"
+                  !intermediate_results_seqno (Unix.getpid()))
+                ());
+            incr intermediate_results_seqno;
+          end;
+          res
+        with e -> raise (Uwobo_failure (Printexc.to_string e)))
+      input
+      p_stylesheets
+  in
+    (* add error and debugging messages to result document *)
+  add_msgs ~errormode ~debugmode ~msgs:veillogger#msgs result;
+(*
+  (* DEBUGGING *)
+  add_msgs
+    ~errormode:LibXsltMsgEmbed ~debugmode:LibXsltMsgEmbed
+    ~msgs:[LibXsltErrorMsg "error1"; LibXsltDebugMsg "debug1"]
+    result;
+*)
+  let p_last_stylesheet = snd (List.hd (List.rev p_stylesheets)) in
+  ((fun outchan ->                              (* serialization function *)
+      Gdome_xslt.saveResultToChannel ~outchan ~result
+        ~stylesheet:p_last_stylesheet),
+   (get_property "media-type" last_stylesheet), (* media-type *)
+   (get_property "encoding" last_stylesheet))   (* encoding *)
+
diff --git a/daemons/uwobo/uwobo_engine.mli b/daemons/uwobo/uwobo_engine.mli
new file mode 100644 (file)
index 0000000..407afab
--- /dev/null
@@ -0,0 +1,55 @@
+(*
+ * Copyright (C) 2003:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+open Uwobo_common ;;
+
+  (**
+    @param logger logger for processing messages
+    @param styles stylesheets object
+    @param keys (ordered) list of stylesheet names to be applied
+    @param params function mapping stylesheet names to parameters list
+    @param props xml:output properties
+    @param errormode what to do with LibXSLT's error messages
+    @param debugmode what to do with LibXSLT's debugging messages
+    @param input URI of input document
+    @return a triple: 1st element is a function that takes an out_channel and
+    write the result document on it, 2nd element is a string option representing
+    the desired media-type, 3rd is a string option representing the desired
+    encoding
+  *)
+val apply:
+  logger: Uwobo_logger.sysLogger ->
+  styles: Uwobo_styles.styles ->
+  keys: string list ->
+  params: (string -> (string * string) list) ->
+  props: (string * string) list ->
+  veillogger: Uwobo_common.libXsltLogger ->
+  ?errormode: xslt_msg_mode -> ?debugmode: xslt_msg_mode ->
+  Gdome.document ->
+    ((out_channel -> unit) * string option * string option)
+
diff --git a/daemons/uwobo/uwobo_logger.ml b/daemons/uwobo/uwobo_logger.ml
new file mode 100644 (file)
index 0000000..0b557f1
--- /dev/null
@@ -0,0 +1,107 @@
+(*
+ * Copyright (C) 2003:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+open Printf;;
+
+type priority = [ 
+  `Emerg | `Alert | `Crit | `Err | `Warning | `Notice | `Info | `Debug
+]
+
+let int_of_priority = function
+  | `Emerg    -> 0
+  | `Alert    -> 1
+  | `Crit     -> 2
+  | `Err      -> 3
+  | `Warning  -> 4
+  | `Notice   -> 5
+  | `Info     -> 6
+  | `Debug    -> 7
+
+let string_of_priority = function
+  | `Emerg    -> "EMERGENCY"
+  | `Alert    -> "ALERT"
+  | `Crit     -> "CRITICAL"
+  | `Err      -> "ERROR"
+  | `Warning  -> "WARNING"
+  | `Notice   -> "NOTICE"
+  | `Info     -> "INFO"
+  | `Debug    -> "DEBUG"
+
+class sysLogger ?(level: priority = `Notice) ?(outchan = stderr) () =
+  object (self)
+    val level_no = int_of_priority level
+    val mutable enabled = false
+    method level = level
+    method levelNo = level_no
+    method enable = enabled <- true
+    method disable = enabled <- false
+    method log (prio: priority) msg =
+      let tm = Unix.localtime (Unix.time ()) in
+      if enabled && (int_of_priority prio <= level_no) then begin
+        fprintf outchan ("[UWOBO %02d/%02d/%4d %02d:%02d:%02d] %s: %s\n")
+          tm.Unix.tm_mday (tm.Unix.tm_mon + 1) (tm.Unix.tm_year + 1900)
+          tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
+          (string_of_priority prio) msg;
+        flush outchan
+      end
+  end
+
+type lineType =
+  | Line of string        (** normal line *)
+  | LineBold of string    (** bold line *)
+  | LineEmph of string    (** emph line *)
+;;
+
+  (** non thread safe, a processingLogger is usually instantied locally for each
+  thread *)
+class processingLogger =
+  let html_escape = Netencoding.Html.encode ~in_enc:`Enc_iso88591 () in
+  let html_of_line = function
+    | Line l -> html_escape l
+    | LineBold l -> "<b>" ^ html_escape l ^ "</b>"
+    | LineEmph l -> "<em>" ^ html_escape l ^ "</em>"
+  in
+  let text_of_line = function
+    | Line l -> l
+    | LineBold l -> l
+    | LineEmph l -> l
+  in
+  fun () ->
+  object
+    val mutable log_lines = []
+    method log msg = log_lines <- Line msg :: log_lines
+    method logBold msg = log_lines <- LineBold msg :: log_lines
+    method logEmph msg = log_lines <- LineEmph msg :: log_lines
+    method asText =
+      String.concat "\n" (List.rev (List.map text_of_line log_lines))
+    method asHtml =
+      sprintf
+        "<html><body>\n%s\n</body></html>"
+        (String.concat "<br />\n" (List.map html_of_line (List.rev log_lines)))
+  end
+
diff --git a/daemons/uwobo/uwobo_logger.mli b/daemons/uwobo/uwobo_logger.mli
new file mode 100644 (file)
index 0000000..2a1a6cd
--- /dev/null
@@ -0,0 +1,69 @@
+(*
+ * Copyright (C) 2003:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+type priority = [
+  | `Emerg    (* system is unusable *)
+  | `Alert    (* action must be taken immediately *)
+  | `Crit     (* critical conditions *)
+  | `Err      (* error conditions *)
+  | `Warning  (* warning conditions *)
+  | `Notice   (* normal, but significant, condition *)
+  | `Info     (* informational message *)
+  | `Debug    (* debug-level message *)
+]
+
+  (**
+  Warning: logging is disabled by default, you have to invoke #enable method
+  before being able to log anything.
+  @param level minimum level of priority that will be reported, msg with
+  priority less than this will be ignored
+  @param outchan output channel on which output log messages *)
+class sysLogger:
+  ?level: priority -> ?outchan: out_channel ->
+  unit ->
+    object
+      method level: priority
+      method levelNo: int
+        (** enable logging, by default logging is disabled *)
+      method enable: unit
+        (** disable logging *)
+      method disable: unit
+        (** log a message *)
+      method log: priority -> string -> unit
+    end
+
+class processingLogger:
+  unit ->
+    object
+      method log: string -> unit
+      method logBold: string -> unit
+      method logEmph: string -> unit
+      method asText: string
+      method asHtml: string
+    end
+
diff --git a/daemons/uwobo/uwobo_profiles.ml b/daemons/uwobo/uwobo_profiles.ml
new file mode 100644 (file)
index 0000000..bd6e919
--- /dev/null
@@ -0,0 +1,151 @@
+(*
+ * Copyright (C) 2004:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+type profile_id = string
+
+let profiles = "profiles"
+
+let profile_key pid =
+  profiles ^ "." ^ pid
+
+let string_of_permission =
+ function
+   `Read -> "read"
+  | `Write -> "write"
+  | `Admin -> "admin"
+
+let permission_key for_what pid =
+ profile_key pid ^ ".permissions." ^ (string_of_permission for_what)
+
+let read_permission_key = permission_key `Read
+let write_permission_key = permission_key `Write
+let admin_permission_key = permission_key `Admin
+
+let password_key pid =
+  profile_key pid ^ ".password"
+
+let params_key pid =
+  profile_key pid ^ ".params"
+
+let param_key pid param =
+  params_key pid ^ "." ^ param
+
+exception Access_denied of string * profile_id
+exception Profile_exists of profile_id
+exception Impossible
+
+let new_key () =
+  let hex_of_nibble n =
+    if n >= 0 && n < 10 then
+      string_of_int n
+    else if n >= 10 && n < 16 then
+      String.make 1 (Char.chr (n - 10 + (Char.code 'A')))
+    else
+      raise Impossible
+  in
+  let rec aux s =
+    function
+        0 -> s
+      | n -> aux ((hex_of_nibble (Random.int 16)) ^ s) (n - 1)
+  in
+  aux "" 4
+
+let create_fresh_id =
+  let rec aux () =
+    let key = new_key () in
+    if Helm_registry.has (read_permission_key key) then
+      aux ()
+    else
+      key
+  in
+  aux
+
+let list () = fst (Helm_registry.ls profiles)
+
+let to_list_rel ~prefix () =
+ List.map (fun (key,value) -> Pcre.replace ~pat:("^" ^ Pcre.quote (prefix ^ ".")) key, value)
+  (Helm_registry.to_list ~prefix ())
+
+let check_permission pid password for_what =
+  match password, Helm_registry.get_bool (permission_key for_what pid) with
+      _, true -> ()
+    | Some pwd, false
+      when Some pwd = Helm_registry.get_opt Helm_registry.string (password_key pid) -> ()
+    | _ -> raise (Access_denied (string_of_permission for_what, pid))
+
+let create ?id ?clone ?clone_password ?(read_perm=true) ?(write_perm=true) ?(admin_perm=true) ?password () =
+  let pid =
+    match id with
+       None -> create_fresh_id ()
+      | Some pid when Helm_registry.has (read_permission_key pid) -> raise (Profile_exists pid)
+      | Some pid -> pid
+  in
+  let params = 
+    match clone with
+       None -> []
+      | Some pid ->
+         check_permission pid clone_password `Read ;
+         to_list_rel ~prefix:(params_key pid) ()
+  in
+    List.iter (fun (key, value) -> Helm_registry.set_string (params_key pid ^ "." ^ key) value) params ;
+    Helm_registry.set_bool (read_permission_key pid) read_perm ;
+    Helm_registry.set_bool (write_permission_key pid) write_perm ;
+    Helm_registry.set_bool (admin_permission_key pid) admin_perm ;
+    Helm_registry.set_opt Helm_registry.of_string (password_key pid) password ;
+    pid
+
+let remove pid ?password () =
+  check_permission pid password `Admin ;
+  List.iter (fun (key, _) -> Helm_registry.unset key) (Helm_registry.to_list ~prefix:(profile_key pid) ())
+
+let get_params pid ?password () =
+   check_permission pid password `Read ;
+   to_list_rel ~prefix:(params_key pid) ()
+
+let set_param pid ?password ~key ~value () =
+  check_permission pid password `Write ;
+  match value with
+      Some value' -> Helm_registry.set (param_key pid key) value'
+    | None -> Helm_registry.unset (param_key pid key)
+
+let get_param pid ?password ~key () =
+  check_permission pid password `Read ;
+  Helm_registry.get (param_key pid key)
+
+let set_password pid ?old_password new_password =
+  check_permission pid old_password `Admin ;
+  Helm_registry.set_opt Helm_registry.of_string (password_key pid) new_password
+
+let set_permission pid ?password for_what value =
+  check_permission pid password `Admin ;
+  Helm_registry.set_bool (permission_key for_what pid) value
+
+let get_permission pid ?password for_what = 
+  check_permission pid password `Admin ;
+  Helm_registry.get_bool (permission_key for_what pid)
+
diff --git a/daemons/uwobo/uwobo_profiles.mli b/daemons/uwobo/uwobo_profiles.mli
new file mode 100644 (file)
index 0000000..fc0798f
--- /dev/null
@@ -0,0 +1,56 @@
+(*
+ * Copyright (C) 2004:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+type profile_id = string
+
+exception Access_denied of string * profile_id
+exception Profile_exists of profile_id
+
+val list : unit -> string list
+val create :
+  ?id:profile_id ->
+  ?clone:profile_id ->
+  ?clone_password:string ->
+  ?read_perm:bool ->
+  ?write_perm:bool ->
+  ?admin_perm:bool -> ?password:string -> unit -> profile_id
+val remove : profile_id -> ?password:string -> unit -> unit
+val get_params : profile_id -> ?password:string -> unit -> (string * string) list
+val set_param :
+  profile_id ->
+  ?password:string -> key:string -> value:(string option) -> unit -> unit
+val get_param :
+  profile_id -> ?password:string -> key:string -> unit -> string
+val set_password :
+  profile_id -> ?old_password:string -> string option -> unit
+val set_permission :
+  profile_id ->
+  ?password:string -> [ `Admin | `Read | `Write ] -> bool -> unit
+val get_permission :
+  profile_id -> ?password:string -> [ `Admin | `Read | `Write ] -> bool
+
diff --git a/daemons/uwobo/uwobo_styles.ml b/daemons/uwobo/uwobo_styles.ml
new file mode 100644 (file)
index 0000000..7730857
--- /dev/null
@@ -0,0 +1,208 @@
+(*
+ * Copyright (C) 2003:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+open Printf;;
+open Uwobo_common;;
+
+exception Stylesheet_not_found of string ;;
+exception Stylesheet_already_in of string ;;
+exception Unsupported_property of string;;
+
+let xslNS = Gdome.domString "http://www.w3.org/1999/XSL/Transform"
+let outputS = Gdome.domString "output"
+let q_outputS = Gdome.domString "xsl:output"
+
+let default_properties = [] (* no default properties *)
+
+  (** apply an output property to an xslt stylesheet *)
+let apply_property logger (element: Gdome.element) (name, value) =
+  if Uwobo_common.is_supported_property name then begin
+    logger#log `Debug (sprintf "Setting property: %s = %s" name value);
+    element#setAttribute (Gdome.domString name) (Gdome.domString value)
+  end else
+    raise (Unsupported_property name)
+
+  (** set a list of output properties in an xslt stylesheet, return a copy of
+  the given stylesheet modified as needed, given stylesheet wont be changed by
+  this operation.
+  Before applying "props" properties applies a set of default properties as
+  defined in "default_properties" *)
+let apply_properties logger last_stylesheet props =
+  let last_stylesheet =
+    new Gdome.document_of_node (last_stylesheet#cloneNode ~deep:true)
+  in
+  let output_element =
+    let node_list = last_stylesheet#getElementsByTagNameNS xslNS outputS in
+    (match node_list#item 0 with
+    | None -> (* no xsl:output element, create it from scratch *)
+        logger#log `Debug "Creating xsl:output node ...";
+        let elt = last_stylesheet#createElementNS (Some xslNS) q_outputS in
+        let root = last_stylesheet#get_documentElement in
+        ignore (root#appendChild (elt :> Gdome.node));
+        elt
+    | Some node -> new Gdome.element_of_node node)
+  in
+  List.iter
+    (apply_property logger (output_element :> Gdome.element))
+    (default_properties @ props);
+  last_stylesheet
+
+class styles =
+  object (self)
+    (* INVARIANT: 'stylesheets' and 'uris' are in sync *)
+
+     (** association list: key * props -> I_gdome_xslt.processed_stylesheet
+         It is the cache of the processed stylesheets *)
+    val mutable p_stylesheets = []
+    val mutable stylesheets = []  (** association list: key -> Gdome.document *)
+    val mutable uris = []         (** association list: key -> uri *)
+
+    val domImpl = Gdome.domImplementation ()
+
+      (** process an XSLT stylesheet *)
+    method private process uri =
+      let dom = domImpl#createDocumentFromURI ~uri () in
+      dom, Gdome_xslt.processStylesheet dom  (* produce libXSLT messages in
+                                                case of errors *)
+
+    (* stylesheets management *)
+
+    method add key uri =
+      if (List.mem_assoc key uris) then
+        raise (Stylesheet_already_in key)
+      else begin
+        uris <- (key, uri) :: uris;
+        let stylesheet, p_stylesheet = self#process uri in
+         stylesheets <- (key, stylesheet) :: stylesheets ;
+         p_stylesheets <- ((key,[]), p_stylesheet) :: p_stylesheets ;
+      end
+
+    method remove key =
+      if not (List.mem_assoc key uris) then
+        raise (Stylesheet_not_found key)
+      else begin
+        uris <- List.remove_assoc key uris;
+        stylesheets <- List.remove_assoc key stylesheets ;
+        p_stylesheets <-
+         List.filter (function ((key',_),_) -> key = key') p_stylesheets
+      end
+
+    method removeAll =
+      uris <- [];
+      stylesheets <- [];
+      p_stylesheets <- []
+
+    method reload key =
+      (try
+        let uri = List.assoc key uris in
+        let stylesheet,p_stylesheet = self#process uri in
+        stylesheets <-
+          (key, stylesheet) :: (List.remove_assoc key stylesheets) ;
+        (* we remove the processed stylesheet from the cache *)
+        p_stylesheets <-
+          List.filter (function ((key',_),_) -> key = key') p_stylesheets ;
+        p_stylesheets <- ((key,[]),p_stylesheet)::p_stylesheets
+      with Not_found ->
+        raise (Stylesheet_not_found key))
+
+    method reloadAll =
+      let (stylesheets',p_stylesheets') =
+       let processed =
+        List.map (fun (key, uri) -> (key, self#process uri)) uris
+       in
+        List.map (function (key,(stylesheet,_)) -> key,stylesheet) processed,
+        List.map
+         (function (key,(_,p_stylesheet)) -> (key,[]),p_stylesheet) processed
+      in
+       stylesheets <- stylesheets' ;
+       p_stylesheets <- p_stylesheets'
+
+    (* stylesheets usage *)
+
+    method keys = List.map fst uris
+
+    method list =
+      List.map
+        (fun (key, uri) ->
+          sprintf "key = %s, uri = %s" key (List.assoc key uris))
+        uris
+
+    method get keys props (logger : Uwobo_logger.sysLogger) =
+      match List.rev keys with
+         [] -> assert false
+       | last_key::rev_keys ->
+          let last_stylesheet =
+           try
+            List.assoc last_key stylesheets
+           with Not_found -> raise (Stylesheet_not_found last_key)
+          in
+          let p_last_stylesheet =
+           try
+            List.assoc (last_key,props) p_stylesheets
+           with
+            Not_found ->
+             (* Cache miss *)
+             let last_stylesheet' =
+               try
+                 apply_properties logger last_stylesheet props
+               with Unsupported_property prop ->
+                 raise (Uwobo_failure (sprintf "Unsupported property: %s" prop))
+             in
+             let p_last_stylesheet =
+              Gdome_xslt.processStylesheet last_stylesheet
+             in
+              p_stylesheets <-
+               ((last_key,props),p_last_stylesheet)::p_stylesheets ;
+              p_last_stylesheet
+          in
+           let p_stylesheets =
+            List.fold_left
+              (fun collected_styles key ->
+                let p_stylesheet =
+                 try
+                  List.assoc (key,[]) p_stylesheets
+                 with
+                  Not_found ->
+                   (* Cache miss *)
+                   let stylesheet =
+                     try
+                       List.assoc key stylesheets
+                     with Not_found -> raise (Stylesheet_not_found key)
+                   in
+                   let p_stylesheet = 
+                    Gdome_xslt.processStylesheet stylesheet
+                   in
+                    p_stylesheets <- ((key,[]),p_stylesheet)::p_stylesheets ;
+                    p_stylesheet
+                in
+                 (key,p_stylesheet)::collected_styles)
+              [last_key,p_last_stylesheet]
+              rev_keys
+           in
+            p_stylesheets, last_stylesheet
+  end
diff --git a/daemons/uwobo/uwobo_styles.mli b/daemons/uwobo/uwobo_styles.mli
new file mode 100644 (file)
index 0000000..95af2a4
--- /dev/null
@@ -0,0 +1,84 @@
+(*
+ * Copyright (C) 2003:
+ *    Stefano Zacchiroli <zack@cs.unibo.it>
+ *    for the HELM Team http://helm.cs.unibo.it/
+ *
+ *  This file is part of HELM, an Hypertextual, Electronic
+ *  Library of Mathematics, developed at the Computer Science
+ *  Department, University of Bologna, Italy.
+ *
+ *  HELM is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  HELM is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with HELM; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ *  MA  02111-1307, USA.
+ *
+ *  For details, see the HELM World-Wide-Web page,
+ *  http://helm.cs.unibo.it/
+ *)
+
+open Uwobo_common ;;
+
+exception Stylesheet_not_found of string ;;
+exception Stylesheet_already_in of string ;;
+
+  (** hold UWOBO styles at runtime *)
+class styles:
+  object
+
+    (** {2 Stylesheets management} *)
+
+      (** add a stylesheet, bound to a given key, to the UWOBO loaded
+      stylesheets
+      @param key key to which the stylesheets will be bound
+      @param uri uri of the stylesheet to be loaded
+      @raise Stylesheet_already_in if key is already bound *)
+    method add: string -> string -> unit
+
+      (** remove the stylesheet bound to a given key *)
+    method remove: string -> unit
+
+      (** remove all loaded stylesheet *)
+    method removeAll: unit
+
+      (** reload the stylesheet bound to a given key *)
+    method reload: string -> unit
+
+      (** reload all stylesheets *)
+    method reloadAll: unit
+
+    (** {2 Stylesheets usage} *)
+
+      (** @return the list of currently loaded stylesheets' keys *)
+    method keys: string list
+
+      (** @return a list of strings, each string is a textual representation of
+      information related to a loaded stylesheet. This representation includes
+      at least stylesheet's key and URI *)
+    method list: string list
+
+      (**
+      @param key_list non empty list of keys
+      @param props list of prop
+      @param logger the logger to be used to report errors and warnings
+      @return a pair. The first argument of the pair is an association list
+      that maps given keys to gdome2-xslt processed stylesheets. The last
+      stylesheet xsl:output element is modified according to the given
+      properties. The second argument of the pair is the last unprocessed
+      stylesheet.
+      *)
+    method get:
+      string list -> (string * string) list -> Uwobo_logger.sysLogger ->
+        (string * I_gdome_xslt.processed_stylesheet) list * Gdome.document
+
+  end
+
diff --git a/daemons/whelp/.cvsignore b/daemons/whelp/.cvsignore
new file mode 100644 (file)
index 0000000..6ecb17c
--- /dev/null
@@ -0,0 +1 @@
+*.cm[ioxa] *.o searchEngine searchEngine.opt
diff --git a/daemons/whelp/.depend b/daemons/whelp/.depend
new file mode 100644 (file)
index 0000000..8b6a29e
--- /dev/null
@@ -0,0 +1,4 @@
+mooglePp.cmo: mooglePp.cmi 
+mooglePp.cmx: mooglePp.cmi 
+searchEngine.cmo: mooglePp.cmi 
+searchEngine.cmx: mooglePp.cmx 
diff --git a/daemons/whelp/Makefile b/daemons/whelp/Makefile
new file mode 100644 (file)
index 0000000..2ae59df
--- /dev/null
@@ -0,0 +1,45 @@
+REQUIRES = http helm-cic_textual_parser2 helm-logger helm-tactics
+OCAMLOPTIONS = -thread -package "$(REQUIRES)" -pp camlp4o
+OCAMLC = ocamlfind ocamlc $(OCAMLOPTIONS)
+OCAMLOPT = ocamlfind ocamlopt $(OCAMLOPTIONS)
+OCAMLDEP = ocamlfind ocamldep -package "$(REQUIRES)" -pp camlp4o
+
+MODULES = mooglePp
+SRCS = $(patsubst %,%.ml,$(MODULES)) $(patsubst %,%.mli,$(MODULES)) \
+       searchEngine.ml
+CMOS = $(patsubst %,%.cmo,$(MODULES))
+CMXS = $(patsubst %,%.cmx,$(MODULES))
+
+all: byte html
+world: byte opt
+byte: searchEngine
+opt: searchEngine.opt html
+
+.PHONY: html
+html:
+       make -C html/
+
+%.cmi: %.mli
+       $(OCAMLC) -c $<
+%.cmo %.cmi: %.ml
+       $(OCAMLC) -c $<
+%.cmx: %.ml
+       $(OCAMLOPT) -c $<
+
+searchEngine: $(CMOS) searchEngine.ml
+       $(OCAMLC) -linkpkg -o $@ $^
+searchEngine.opt: $(CMXS) searchEngine.ml
+       $(OCAMLOPT) -linkpkg -o $@ $^
+
+clean:
+       make -C html/ clean
+       rm -f *.cm[aiox] *.o searchEngine{,.opt}
+
+.PHONY: depend
+depend:
+       $(OCAMLDEP) $(SRCS) > .depend
+
+.PHONY: all opt clean
+
+include .depend
+
diff --git a/daemons/whelp/html/Makefile b/daemons/whelp/html/Makefile
new file mode 100644 (file)
index 0000000..03a653f
--- /dev/null
@@ -0,0 +1,7 @@
+INC_STYLESHEET = includes.xsl
+TARGETS = moogle.html moogle_chat.html
+all: $(TARGETS)
+clean:
+       rm -f $(TARGETS)
+%.html: %.html.src *.src
+       xsltproc $(INC_STYLESHEET) $< > $@
diff --git a/daemons/whelp/html/includes.xsl b/daemons/whelp/html/includes.xsl
new file mode 100644 (file)
index 0000000..bc2497d
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<xsl:stylesheet
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+  xmlns:helm="http://www.cs.unibo.it/helm"
+  version="1.0"
+>
+  <xsl:template match="/|@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()" />
+    </xsl:copy>
+  </xsl:template>
+  <xsl:template match="helm:include">
+    <xsl:apply-templates select="document(@href)/*[1]/*" />
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/daemons/whelp/html/manual/alias.jpg b/daemons/whelp/html/manual/alias.jpg
new file mode 100644 (file)
index 0000000..0f57638
Binary files /dev/null and b/daemons/whelp/html/manual/alias.jpg differ
diff --git a/daemons/whelp/html/manual/ex1.jpg b/daemons/whelp/html/manual/ex1.jpg
new file mode 100644 (file)
index 0000000..8e75c08
Binary files /dev/null and b/daemons/whelp/html/manual/ex1.jpg differ
diff --git a/daemons/whelp/html/manual/frames.jpg b/daemons/whelp/html/manual/frames.jpg
new file mode 100644 (file)
index 0000000..994b7ae
Binary files /dev/null and b/daemons/whelp/html/manual/frames.jpg differ
diff --git a/daemons/whelp/html/manual/index.html b/daemons/whelp/html/manual/index.html
new file mode 100644 (file)
index 0000000..8efa276
--- /dev/null
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>Search Engine Interface Online Manual</title>
+</head>
+<body>
+<h1>Search Engine Interface Online Manual</h1>
+<h2>Index</h2>
+1. <a href="#roles">Roles of the frames</a><br>
+2. <a href="#mqlquery">How to compose a low-level query</a><br>
+3. <a href="#pdqquery">How to compose a pre-defined query</a><br>
+<a name="roles"><h2>1. Roles of the frames</h2></a>
+<p>
+The interface is composed by five frames, as you can see below.<br><br>
+<img src="./frames.jpg"><br><br>
+Each frame has its own role, in particular:<br><ul>
+<li>frame <b>1</b> contains the query as it is, the frame is refreshed whenever you modify the query.<br>
+<li>frame <b>2</b> contains all the available options for the composition of the query, it's where most of the interaction happens.<br>
+<li>frame <b>3</b> contains the form used for the submission of the query and various buttons to modify it.<br>
+<li>frame <b>4</b> contains the grammar.<br>
+<li>frame <b>5</b> contains online help.<br>
+</ul>
+</p>
+<a name="mqlquery"><h2>2. How to compose a low-level query</h2></a>
+<p>
+In order to compose a low-level query, you must click the &quot;compose a query&quot; button in the main page. Here's what you'll get:<br> <ul><li>In frame 1, you have the query in its actual state, so at the beginning the frame is empty. Later, the frame will be updated automatically on every change of the query and will contain hypertextual links in this form: <b>[?&lt;production name&gt;&lt;production number&gt;]</b>. Possible names are &quot;set&quot;,&quot;val&quot; and &quot;bol&quot; and they represent the main productions of MathQL grammar. By clicking on each of these links you'll obtain the visualization of possible options for the corresponding production in frame 2, allowing the sobstitution of the link with what will be selected.<br> <li>Frame 2 contains, in order: the identifier of the production you are choosing (e.g. <b>[?set1]</b> or <b>[?bol3]</b>), an &quot;undo&quot; button, a &quot;redo&quot; button, the options list, a &quot;compose&quot; button to confirm your choice, a &quot;get help&quot; button to know the semantic meaning of the selected option. The options list is composed by various radio buttons, sometimes you'll have only to select one of them while sometimes you'll have to fill input areas with identifiers, paths or other things: anyway, whenever an input area gets the focus, a help about what you can write there will appear in frame 5.<br>
+<li>Frame 3 contains a textarea with the query, a &quot;submit the query&quot; button, a &quot;restart&quot; button (it will bring you to the main page, erasing you query) and an &quot;apply changes&quot; button to modify the query. <br><li> Frame 4 contains the MathQL grammar.<br> <li>Frame 5 contains various help messages, whenever an object gets the focus a message will appear there.<br></ul>
+Being &quot;set&quot; the main production of MathQL, at the beginning frame 1 is empty and frame 2 contains the menu for &quot;set&quot;. You should choose one option by clicking on its radio button and then press &quot;compose&quot;. The interface will perform a syntax check of what you entered and should something be wrong a message will appear, otherwise the query will be updated. Afterwards, the query will appear in frame 1 and in frame 3, and frame 2 will display the menu of the first production found in the new query string. For example, in the picture below you see the interface after the selection of the 10th production inserting &quot;positions&quot; as the requested identifier. As you can see, frame 2 now displays the &quot;val&quot; menu.<br><br>
+<img src="./ex1.jpg"><br><br>
+Now your options include following the instructions in frame 2, choosing a different production by clicking on a link in frame 1, or manually modifying the query by writing the changes in the textarea in frame 3 and then clicking &quot;apply changes&quot;. Obviously &quot;undo&quot; and &quot;redo&quot; buttons will allow you to recover from mistakes; just DON'T use &quot;back&quot;,&quot;forward&quot; and &quot;refresh&quot; buttons on your browser since they will cause unpredictable errors. Once the query is completed, the &quot;submit the query&quot; button will display the results in frame 2.</p>
+<a name="pdqquery"><h2>3. How to compose a pre-defined query</h2></a>
+<p>
+There are actually three pre-defined queries, <b>Locate Object</b>, <b>Search Pattern</b> and <b>Match Conclusion</b>. By clicking on &quot;submit a pre-defined query&quot; in the main page, a small menu with the three options will appear in frame 2. <br>
+<b>Locate Object</b> is very simple, you must enter the name of the object to search in the text box and click &quot;display results&quot;.<br>
+<b>Search Pattern</b>, which takes a CIC term and finds theorems which have it as thesis, and <b>Match Conclusion</b> which takes a CIC term and finds theorems which have it as conclusion, have an identical interface, being the only difference in the output. 
+First thing to do is to insert a list of aliases (you may skip this step since the search engine will ask you later about ambiguous interpretations of your query if you don't know objects names, for example), then you must compose the CIC term. Composing a CIC term is pretty much the same thing as composing a MathQL query, except that the term is usually so short that there is no need for links, undo buttons and the like. While composing the term, you may modify your list of aliases (i.e. add or remove them) anytime by clicking &quot;edit&quot; in the frame 3. When the query is completed, the &quot;submit&quot; button will display the results in frame 2, and the server will ask you to solve ambiguities, thus adding aliases to your list.  Once a result is displayed, you may want to submit a different query but keep your aliases; in this case, just click &quot;new expression&quot; in frame 3. The &quot;edit&quot; button will work even in this phase.<br><br>
+<img src="./alias.jpg"><br><br>
+</p>
+
+</body>
+</html>
diff --git a/daemons/whelp/html/moogle.html.src b/daemons/whelp/html/moogle.html.src
new file mode 100644 (file)
index 0000000..eca23d3
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<html
+  xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:ht="http://www.cs.unibo.it/helm/namespaces/helm-theory"
+  xmlns:helm="http://www.cs.unibo.it/helm"
+  xml:lang="en"
+  lang="en"
+>
+  <helm:include href="moogle_header.html.src" />
+  <body>
+    <helm:include href="moogle_form.html.src" />
+    <helm:include href="moogle_querybar.html.src" />
+    <!-- MOZILLA SEARCH PLUGIN: BEGIN LIST -->
+    <div>
+      @RESULTS@
+    </div>
+    <!-- MOZILLA SEARCH PLUGIN: END LIST -->
+    <helm:include href="moogle_trailer.html.src" />
+  </body>
+</html>
+
diff --git a/daemons/whelp/html/moogle.png b/daemons/whelp/html/moogle.png
new file mode 100644 (file)
index 0000000..07570d0
Binary files /dev/null and b/daemons/whelp/html/moogle.png differ
diff --git a/daemons/whelp/html/moogle_chat.html.src b/daemons/whelp/html/moogle_chat.html.src
new file mode 100644 (file)
index 0000000..bda0482
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<html
+  xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:ht="http://www.cs.unibo.it/helm/namespaces/helm-theory"
+  xmlns:helm="http://www.cs.unibo.it/helm"
+  xml:lang="en"
+  lang="en"
+>
+  <helm:include href="moogle_header.html.src" />
+  <body>
+    <helm:include href="moogle_form.html.src" />
+    <helm:include href="moogle_querybar.html.src" />
+    <div style="font-size: larger;">
+      <p>
+       <b>Ambiguous input:</b> <kbd>@EXPRESSION@</kbd>
+      </p>
+      <p>
+       Please choose one of the following interpretations:
+      </p>
+      <p>
+       <helm:uwobo_form>
+         <helm:hidden_params />
+         <input type="hidden" name="keys" value="S,T1,T2,L,RT,E"/>
+         <input type="hidden" name="param.expression" value="@EXPRESSION@"/>
+         <input type="hidden" name="param.action" value="@ACTION@"/>
+         <input type="hidden" name="param.advanced" value="@ADVANCED@"/>
+         <input type="hidden" name="param.choices" value="@CURRENT_CHOICES@"/>
+         @INTERPRETATIONS@
+         <br />
+         <input type="submit" value="Choose" />
+       </helm:uwobo_form>
+      </p>
+    </div>
+  <div class='bottombar'>
+    <span class="invisible">moogle rules</span>
+  </div>
+  </body>
+</html>
+
diff --git a/daemons/whelp/html/moogle_form.html.src b/daemons/whelp/html/moogle_form.html.src
new file mode 100644 (file)
index 0000000..05eba4c
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<helm:content
+  xmlns:helm="http://www.cs.unibo.it/helm"
+  xmlns="http://www.w3.org/1999/xhtml"
+>
+  <helm:uwobo_form>
+    <helm:hidden_params />
+    <input type="hidden" name="advanced" value="@ADVANCED@"/>
+    <input type="hidden" name="keys" value="S,T1,T2,L,RT,E"/>
+    <table cellspacing="0" cellpadding="0">
+      <tr valign="middle">
+       <td><img src="@SEARCH_ENGINE_URL@/getpage?url=whelp_small.png" alt="whelp" /></td>
+       <td>&#xA0;&#xA0;</td>
+       <td align="center">
+         <input maxLength="1024" size="45" name="param.expression" value="@EXPRESSION@" />
+       </td>
+       <td>
+         <input type="submit" value="locate" name="param.action" />
+         <input type="submit" value="hint" name="param.action" />
+         <input type="submit" value="match" name="param.action" />
+         <input type="submit" value="elim" name="param.action" />
+         <input type="submit" value="instance" name="param.action" />
+       </td>
+       <td>&#xA0;&#xA0;&#xA0;</td>
+       <td>
+         <font size="-2">
+           <a href="@SEARCH_ENGINE_URL@/getpage?url=moogle_help.html">Help</a><br />
+           <a href="@SEARCH_ENGINE_URL@/getpage?url=moogle_syntax.html">Input Syntax</a>
+         </font>
+       </td>
+      </tr>
+      <br />
+      <!--
+      <tr>
+       <td colspan="2" />
+       <td align="center">
+         <font size="-1">
+           <input type="radio" name="param.advanced" value="no" @SIMPLE_CHECKED@ />
+           <label>Simple search</label>
+           <input type="radio" name="param.advanced" value="yes" @ADVANCED_CHECKED@ />
+           <label>Advanced search</label>
+         </font>
+       </td>
+       <td colspan="2" />
+      </tr>
+      -->
+    </table>
+  </helm:uwobo_form>
+</helm:content>
diff --git a/daemons/whelp/html/moogle_header.html.src b/daemons/whelp/html/moogle_header.html.src
new file mode 100644 (file)
index 0000000..a788d1f
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<helm:content
+  xmlns:helm="http://www.cs.unibo.it/helm"
+  xmlns="http://www.w3.org/1999/xhtml"
+>
+<head>
+  <title>Whelp search</title>
+  <style>
+    div.resultsbar {
+      background-color: #e5ecf9;
+      border-top: solid;
+      border-width: thin;
+      border-color: #3366cc;
+    }
+    div.bottombar {
+      background-color: #e5ecf9;
+      border-top: solid;
+      border-bottom: solid;
+      border-width: thin;
+      border-color: #3366cc;
+      text-align: center;
+    }
+    table.interp {
+      border-collapse: collapse;
+      border-top: solid;
+      border-width: 1pt;
+    }
+    tr.interp {
+      border-bottom: solid;
+      border-width: 1pt;
+    }
+    td.left { text-align: left }
+    td.right { text-align: right }
+    b.error { color: red }
+    b.query_kind { font-size: large }
+    body {
+      font-family: sans-serif;
+      font-size: smaller;
+      background-color: #ffffff;
+    }
+    span.uri { color: blue; }
+    span.invisible { color: #e5ecf9; }
+  </style>
+</head>
+</helm:content>
diff --git a/daemons/whelp/html/moogle_help.html b/daemons/whelp/html/moogle_help.html
new file mode 100644 (file)
index 0000000..7b2a8bd
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<html>
+  <body>
+    <table align="center">
+      <tr>
+        <td>
+          <img align="center" src="http://helm.cs.unibo.it/whelp.png" alt="whelp"/>
+        </td>
+      </tr>
+      <tr>
+        <td> </td>
+      </tr>
+      <tr>
+        <td align="center">
+          <h2>Coming soon!</h2>
+        </td>
+      </tr>
+    </table>
+    <br />
+    <br />
+    In the meantime have a look at the
+    <a href="http://mowgli.mowgli.cs.unibo.it:58085/getpage?url=moogle_syntax.html">Input Syntax page</a>
+    for syntax and examples.
+  </body>
+</html>
diff --git a/daemons/whelp/html/moogle_init.html b/daemons/whelp/html/moogle_init.html
new file mode 100644 (file)
index 0000000..5260da7
--- /dev/null
@@ -0,0 +1,106 @@
+<?xml version="1.0"?>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ht="http://www.cs.unibo.it/helm/namespaces/helm-theory" xmlns:helm="http://www.cs.unibo.it/helm" xml:lang="en" lang="en">
+<head>
+<title>Whelp search</title>
+<style>
+       body { font-family: sans-serif }
+</style>
+
+<script type="text/javascript" language="JavaScript">
+       function submit_query(q){
+               if ( q == 'w' ) {
+                       alert("This is Whelp!");        
+               } else {
+                       e = document.createElement("input");
+                       e.setAttribute("type","hidden");
+                       e.setAttribute("name","param.action");
+                       e.setAttribute("value",q);
+
+                       document.forms[0].appendChild(e);
+                       
+                       document.forms[0].submit();
+               }
+       }               
+</script>
+
+</head>
+
+<body bgcolor="#ffffff">
+       
+<center>
+<table border="0" cellspacing="0" cellpadding="0">
+<tr>
+       <td>
+               <img src="@SEARCH_ENGINE_URL@/getpage?url=whelp.png" 
+               alt="whelp" usemap="#map" 
+               style="border: 0;"/>
+       </td>
+</tr>
+
+
+<map name="map">
+       
+<!-- #$-:Image Map file created by GIMP Imagemap Plugin -->
+<!-- #$-:GIMP Imagemap Plugin by Maurits Rijk -->
+<!-- #$-:Please do not edit lines starting with "#$" -->
+<!-- #$VERSION:2.0 -->
+<!-- #$AUTHOR:Enrico Tassi -->
+
+<area shape="poly" coords="17,42,26,42,34,46,40,52,42,59,42,65,38,69,32,73,26,76,16,76,10,74,5,70,1,64,1,57,2,52,6,48,12,44" alt="HINT" 
+onclick="submit_query('hint')" />
+
+<area shape="poly" coords="55,12,68,12,77,17,84,24,85,34,83,41,77,47,70,51,63,51,55,51,47,49,38,40,37,33,37,24,42,19,50,13" alt="ELIM"
+onclick="submit_query('elim')" />
+<area shape="poly" coords="90,13,102,2,115,0,130,5,139,15,139,28,127,40,117,43,105,41,94,35,89,26" alt="LOCATE" 
+onclick="submit_query('locate')" />
+<area shape="poly" coords="144,26,153,17,166,13,179,12,188,16,195,24,199,34,198,44,192,54,182,59,169,61,156,58,147,52,143,44,142,36,142,35" alt="PATTERN MATCHING"
+onclick="submit_query('match')" />
+<area shape="poly" coords="49,68,63,58,82,51,100,48,116,49,134,54,153,62,164,74,174,90,178,103,177,116,173,130,164,141,154,152,142,159,127,165,110,167,94,167,78,164,64,159,53,151,44,143,36,132,31,120,30,100,34,87,40,77,45,71" alt="WOUNDERFUL" 
+onclick="submit_query('w')" />
+</map>
+
+</table>
+<br />
+<helm:uwobo_form>
+  <helm:hidden_params />
+  <input type="hidden" name="advanced" value="@ADVANCED@"/>
+  <input type="hidden" name="keys" value="S,T1,T2,L,RT,E"/>
+  <table cellspacing="0" cellpadding="0">
+  <tr valign="middle"><td width="25%"> </td>
+  <td align="center">
+  <input maxLength="1024" size="55" name="param.expression" value="" />
+  <br />
+  <input type="submit" value="locate" name="param.action" />
+  <input type="submit" value="hint" name="param.action" />
+  <input type="submit" value="match" name="param.action" />
+  <input type="submit" value="elim" name="param.action" />
+  <input type="submit" value="instance" name="param.action" />
+  </td>
+  <td valign="top" width="25%">
+   <font size="-2">
+    <a href="@SEARCH_ENGINE_URL@/getpage?url=moogle_help.html">Help</a><br />
+    <a href="@SEARCH_ENGINE_URL@/getpage?url=moogle_syntax.html">Input Syntax</a>
+   </font>
+  </td>
+  </tr>
+<!--
+  <tr>
+   <td colspan="3" align="center">
+    <font size="-1">
+    <input id="all" type="radio" name="param.advanced" value="no" checked="true" />
+     <label for="all">Simple search</label>
+    <input id="standard" type="radio" name="param.advanced" value="yes" />
+     <label for="standard">Advanced search</label>
+    </font>
+   </td>
+   </tr>
+-->
+  </table>
+</helm:uwobo_form>
+</center>
+<font size="-1">
+@RESULTS@
+</font>
+</body>
+</html>
+
diff --git a/daemons/whelp/html/moogle_querybar.html.src b/daemons/whelp/html/moogle_querybar.html.src
new file mode 100644 (file)
index 0000000..7a5110a
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<helm:content
+  xmlns:helm="http://www.cs.unibo.it/helm"
+  xmlns="http://www.w3.org/1999/xhtml"
+>
+  <div class='resultsbar'>
+    <table width='100%%'>
+      <tr>
+       <td class='left'><b class='query_kind'>@QUERY_KIND@</b></td>
+       <td class='right'>@QUERY_SUMMARY@</td>
+      </tr>
+    </table>
+  </div>
+  <br />
+</helm:content>
diff --git a/daemons/whelp/html/moogle_small.png b/daemons/whelp/html/moogle_small.png
new file mode 100644 (file)
index 0000000..a387d9a
Binary files /dev/null and b/daemons/whelp/html/moogle_small.png differ
diff --git a/daemons/whelp/html/moogle_syntax.html b/daemons/whelp/html/moogle_syntax.html
new file mode 100644 (file)
index 0000000..7fa0fe3
--- /dev/null
@@ -0,0 +1,98 @@
+<html>
+  <head>
+    <style type="text/css">
+      ul.spaced li { padding-bottom: 1em; }
+      ul.empty li { list-style-type: none; }
+      tt { font-weight: bold; background-color: lightgray; }
+      tt.uri { font-weight: normal; background-color: transparent; }
+    </style>
+  </head>
+  <body>
+    <table>
+      <tr>
+       <td>
+         <img align="center" src="http://helm.cs.unibo.it/whelp.png" alt="whelp" />
+       </td>
+      </tr>
+      <tr>
+       <td>
+         <h2>Whelp Input Syntax</h2>
+         <ul class="spaced">
+           <li>
+           <b>locate <em>&lt;pattern&gt;</em></b>
+           <p>
+           <em>&lt;pattern&gt;</em> is a shell like pattern which could
+           include <tt>*</tt> (denoting any sequence of 0 or more characters)
+           and <tt>?</tt> (denoting any single character).<br />
+           </p>
+           <p>
+           <u>Examples:</u>
+           <ul class="empty">
+             <li> <tt>nat</tt> pattern matches
+             <tt class="uri">cic:/Coq/Init/Datatypes/nat.ind#xpointer(1/1)</tt> only
+             </li>
+             <li> <tt>n?t</tt> pattern matches
+             <tt class="uri">cic:/Coq/Init/Datatypes/nat.ind#xpointer(1/1)</tt> and
+             <tt class="uri">cic:/Coq/Init/Logic/not.con</tt>
+             </li>
+             <li> <tt>nat*</tt> pattern matches
+             <tt class="uri">cic:/Coq/Init/Datatypes/nat.ind#xpointer(1/1)</tt>,
+             <tt class="uri">cic:/Coq/Init/Peano/nat_case.con</tt> and many more
+             </li>
+           </ul>
+           </p>
+           </li>
+           <li>
+           <b>match <em>&lt;term&gt;</em></b>
+           <p>
+           <u>Examples:</u>
+           <ul class="empty">
+             <li> <tt>\forall x,y:nat.x+y=y+x</tt>
+             (commutativity of natural plus)
+             </li>
+             <li> <tt>\forall x,y,z:R.x*(y+z)=x*y+x*z</tt>
+             (distributivity of real times over real plus)
+             </li>
+             <li> <tt>nat \to nat \to nat</tt>
+             (all binary functions over naturals)
+             </li>
+           </ul>
+           </p>
+           </li>
+           <li>
+           <b>hint <em>&lt;term&gt;</em></b>
+           <p>
+           <u>Examples:</u>
+           <ul class="empty">
+             <li> <tt>\forall n:nat. (fact n) = n * (fact (n - 1))</tt>
+             (how could we prove <em>n! = (n-1)! * n</em> ?)
+             </li>
+             <li> <tt>\forall n:nat.n \lt n+5</tt>
+             (how could we prove <em>n &lt; n + 5</em> ?)
+             </li>
+             <li> <tt>\forall x,y:nat. x*y \lt (S x)*(S y)</tt>
+             (how could we prove <em>x*y &lt; (x+1)*(y+1)</em> ?)
+             </li>
+           </ul>
+           </p>
+           </li>
+           <li>
+           <b>elim <em>&lt;identifier&gt;</em></b>
+           <p>
+           <u>Examples:</u>
+           <ul class="empty">
+             <li> <tt>nat</tt>
+             (induction/elimination principles over natural numbers)
+             </li>
+             <li> <tt>list</tt>
+             (induction/elimination principles over lists)
+             </li>
+           </ul>
+           </p>
+           </li>
+         </ul>
+       </td>
+      </tr>
+    </table>
+  </body>
+</html>
diff --git a/daemons/whelp/html/moogle_trailer.html.src b/daemons/whelp/html/moogle_trailer.html.src
new file mode 100644 (file)
index 0000000..be349ba
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<helm:content
+  xmlns:helm="http://www.cs.unibo.it/helm"
+  xmlns="http://www.w3.org/1999/xhtml"
+>
+  <div class='bottombar'>
+    @PAGES@: @PREV_LINK@ <b>@PAGELIST@</b> @NEXT_LINK@
+  </div>
+</helm:content>
diff --git a/daemons/whelp/html/whelp.png b/daemons/whelp/html/whelp.png
new file mode 100644 (file)
index 0000000..8e36ced
Binary files /dev/null and b/daemons/whelp/html/whelp.png differ
diff --git a/daemons/whelp/html/whelp.svg b/daemons/whelp/html/whelp.svg
new file mode 100644 (file)
index 0000000..8672027
--- /dev/null
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:xml="http://www.w3.org/XML/1998/namespace"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="210mm"
+   height="297mm"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.41"
+   sodipodi:docbase="/projects/helm/daemons/searchEngine/html"
+   sodipodi:docname="whelp.svg">
+  <defs
+     id="defs3" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.53878789"
+     inkscape:cx="372.04725"
+     inkscape:cy="526.18109"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="697"
+     inkscape:window-height="743"
+     inkscape:window-x="538"
+     inkscape:window-y="47" />
+  <metadata
+     id="metadata4">
+    <rdf:RDF
+       id="RDF5">
+      <cc:Work
+         rdf:about=""
+         id="Work6">
+        <dc:format
+           id="format7">image/svg+xml</dc:format>
+        <dc:type
+           id="type9"
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       inkscape:export-ydpi="100.84000"
+       inkscape:export-xdpi="100.84000"
+       inkscape:export-filename="/projects/helm/daemons/searchEngine/html/whelp.png"
+       transform="matrix(3.536915,0.000000,0.000000,3.972675,-821.7510,-1982.086)"
+       id="g3923">
+      <path
+         sodipodi:type="arc"
+         style="fill:#780000;fill-opacity:0.48627451;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+         id="path2998"
+         sodipodi:cx="255.71428"
+         sodipodi:cy="465.21933"
+         sodipodi:rx="21.428572"
+         sodipodi:ry="18.571428"
+         d="M 277.14285 465.21933 A 21.428572 18.571428 0 1 1  234.28571,465.21933 A 21.428572 18.571428 0 1 1  277.14285 465.21933 z"
+         transform="matrix(0.874334,0.000000,0.000000,0.816604,44.53485,211.7504)" />
+      <text
+         xml:space="preserve"
+         style="font-size:36.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:0.78431374;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Domestic Manners;text-anchor:start;writing-mode:lr-tb"
+         x="257.61462"
+         y="600.53583"
+         id="text3000"><tspan
+           sodipodi:role="line"
+           id="tspan3002"
+           x="257.61462"
+           y="600.53583">h</tspan></text>
+      <path
+         sodipodi:type="arc"
+         style="fill:#780000;fill-opacity:0.48627451;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+         id="path3004"
+         sodipodi:cx="255.71428"
+         sodipodi:cy="465.21933"
+         sodipodi:rx="21.428572"
+         sodipodi:ry="18.571428"
+         d="M 277.14285 465.21933 A 21.428572 18.571428 0 1 1  234.28571,465.21933 A 21.428572 18.571428 0 1 1  277.14285 465.21933 z"
+         transform="matrix(1.011345,0.000000,0.000000,0.947604,44.96344,126.1641)" />
+      <text
+         xml:space="preserve"
+         style="font-size:36.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:0.78431374;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Domestic Manners;text-anchor:start;writing-mode:lr-tb"
+         x="292.11462"
+         y="573.53583"
+         id="text3006"><tspan
+           sodipodi:role="line"
+           id="tspan3008"
+           x="292.11462"
+           y="573.53583">e</tspan></text>
+      <path
+         sodipodi:type="arc"
+         style="fill:#780000;fill-opacity:0.48627451;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+         id="path3010"
+         sodipodi:cx="300.00000"
+         sodipodi:cy="442.36218"
+         sodipodi:rx="22.857143"
+         sodipodi:ry="18.571428"
+         d="M 322.85714 442.36218 A 22.857143 18.571428 0 1 1  277.14286,442.36218 A 22.857143 18.571428 0 1 1  322.85714 442.36218 z"
+         transform="translate(51.11460,115.2886)" />
+      <text
+         xml:space="preserve"
+         style="font-size:36.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:0.78431374;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Domestic Manners;text-anchor:start;writing-mode:lr-tb"
+         x="345.11462"
+         y="570.53583"
+         id="text3012"><tspan
+           sodipodi:role="line"
+           id="tspan3014"
+           x="345.11462"
+           y="570.53583">l</tspan></text>
+      <path
+         sodipodi:type="arc"
+         style="fill:#780000;fill-opacity:0.48627451;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+         id="path3016"
+         sodipodi:cx="358.57144"
+         sodipodi:cy="436.64789"
+         sodipodi:rx="24.285715"
+         sodipodi:ry="21.428572"
+         d="M 382.85716 436.64789 A 24.285715 21.428572 0 1 1  334.28573,436.64789 A 24.285715 21.428572 0 1 1  382.85716 436.64789 z"
+         transform="matrix(1.060519,0.000000,0.000000,1.000000,20.91431,134.7886)" />
+      <text
+         xml:space="preserve"
+         style="font-size:36.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:0.78431374;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Domestic Manners;text-anchor:start;writing-mode:lr-tb"
+         x="392.11462"
+         y="575.03583"
+         id="text3018"><tspan
+           sodipodi:role="line"
+           id="tspan3020"
+           x="392.11462"
+           y="575.03583">p</tspan></text>
+      <path
+         sodipodi:type="arc"
+         style="fill:#000050;fill-opacity:0.31372550;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+         id="path3024"
+         sodipodi:cx="328.57144"
+         sodipodi:cy="513.79077"
+         sodipodi:rx="65.714287"
+         sodipodi:ry="52.857143"
+         d="M 394.28573 513.79077 A 65.714287 52.857143 0 1 1  262.85715,513.79077 A 65.714287 52.857143 0 1 1  394.28573 513.79077 z"
+         transform="translate(13.11460,121.2886)" />
+      <text
+         xml:space="preserve"
+         style="font-size:64.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:0.78431374;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Domestic Manners;text-anchor:start;writing-mode:lr-tb"
+         x="317.61459"
+         y="655.03577"
+         id="text3026"><tspan
+           sodipodi:role="line"
+           id="tspan3028"
+           x="317.61459"
+           y="655.03577">W</tspan></text>
+    </g>
+  </g>
+</svg>
diff --git a/daemons/whelp/html/whelp_small.png b/daemons/whelp/html/whelp_small.png
new file mode 100644 (file)
index 0000000..10c6158
Binary files /dev/null and b/daemons/whelp/html/whelp_small.png differ
diff --git a/daemons/whelp/mooglePp.ml b/daemons/whelp/mooglePp.ml
new file mode 100644 (file)
index 0000000..3af0afb
--- /dev/null
@@ -0,0 +1,83 @@
+
+open Printf
+
+let pp_error title msg =
+  sprintf "<div><b class='error'>%s:</b> %s</div><br />" title msg
+
+let paginate ~size ~page l =
+  let min = 1 + (page-1) * size in
+  let max = page * size in
+  let rec aux i l =
+    match (i, l) with
+    | _, [] -> []
+    | i, hd :: tl when i < min -> aux (i+1) tl
+    | i, hd :: tl when i >= min && i <= max -> hd :: aux (i+1) tl
+    | i, hd :: tl -> []
+  in
+  assert (size > 0 && page > 0);
+  aux 1 l
+
+  (** pretty print a list of URIs to an HELM theory file *)
+let theory_of_result page result =
+  let results_per_page =
+    Helm_registry.get_int "search_engine.results_per_page"
+  in
+  let results_no = List.length result in
+  let buffer = Buffer.create (200 * results_no) in
+  let result = paginate ~size:results_per_page ~page result in
+  if results_no > 0 then
+   let mode = "typeonly" in
+   let output_results () =
+    let idx = ref ((page - 1) * results_per_page) in
+     List.iter
+      (fun uri ->
+        incr idx;
+        Printf.bprintf buffer 
+           "<tr>
+            <td valign=\"top\">%d.</td>
+            <td><span class=\"uri\">%s</span></td>
+            </tr>
+            <tr>
+            <td />
+            <td><ht:OBJECT uri=\"%s\" mode=\"%s\"/></td>
+            </tr>"
+          !idx uri uri mode) result ;
+   in
+   let summary =
+     sprintf "<b>%d</b> result%s found"
+       results_no (if results_no > 1 then "s" else "")
+   in
+    begin
+     Buffer.add_string buffer
+      "<table xmlns:ht=\"http://www.cs.unibo.it/helm/namespaces/helm-theory\">";
+     output_results ();
+     Buffer.add_string buffer "</table>";
+     (summary, Buffer.contents buffer)
+    end
+  else
+    ("no results found", "")
+
+let html_of_interpretations interps =
+  let choice_of_interp interp =
+    sprintf "<table>\n%s\n</table>"
+      (String.concat "\n"
+        (List.map
+           (fun (k, v) ->
+              sprintf "<tr><td><em>%s</em></td><td>%s</td></tr>" k v)
+           interp))
+  in
+  let interp_no = ref ~-1 in
+    sprintf "<table class=\"interp\">\n%s\n</table>"
+      (String.concat "\n"
+        (List.map
+           (fun interp ->
+              sprintf "
+                  <tr class=\"interp\">
+                  <td><input type=\"radio\" name=\"param.interp\" value=\"%d\" /></td>
+                  <td>
+                  %s
+                  </td></tr>"
+                (incr interp_no; !interp_no)
+                (choice_of_interp interp))
+           interps))
+
diff --git a/daemons/whelp/mooglePp.mli b/daemons/whelp/mooglePp.mli
new file mode 100644 (file)
index 0000000..f3e2e59
--- /dev/null
@@ -0,0 +1,35 @@
+(* Copyright (C) 2002-2005, HELM Team.
+ * 
+ * This file is part of HELM, an Hypertextual, Electronic
+ * Library of Mathematics, developed at the Computer Science
+ * Department, University of Bologna, Italy.
+ * 
+ * HELM is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * HELM is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HELM; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA  02111-1307, USA.
+ * 
+ * For details, see the HELM World-Wide-Web page,
+ * http://cs.unibo.it/helm/.
+ *)
+
+val pp_error : string -> string -> string
+
+(** @param page page number
+  * @param results query results
+  * @return a pair <summary, results> of suitable instantiations for
+  * QUERY_SUMMARY and QUERY_RESULTS tag in moogle's main template *)
+val theory_of_result : int -> string list -> string * string
+
+val html_of_interpretations: (string * string) list list -> string
+
diff --git a/daemons/whelp/preloaded_uris.txt b/daemons/whelp/preloaded_uris.txt
new file mode 100644 (file)
index 0000000..be1cea1
--- /dev/null
@@ -0,0 +1,4130 @@
+cic:/Coq/Arith/Between/P_nth_ind.con
+cic:/Coq/Arith/Between/bet_eq.con
+cic:/Coq/Arith/Between/between_Sk_l.con
+cic:/Coq/Arith/Between/between_in_int.con
+cic:/Coq/Arith/Between/between_ind.con
+cic:/Coq/Arith/Between/between_le.con
+cic:/Coq/Arith/Between/between_not_exists.con
+cic:/Coq/Arith/Between/between_or_exists.con
+cic:/Coq/Arith/Between/between_restr.con
+cic:/Coq/Arith/Between/event_O.con
+cic:/Coq/Arith/Between/eventually.con
+cic:/Coq/Arith/Between/exists_S_le.con
+cic:/Coq/Arith/Between/exists_between_ind.con
+cic:/Coq/Arith/Between/exists_in_int.con
+cic:/Coq/Arith/Between/exists_le_S.con
+cic:/Coq/Arith/Between/exists_lt.con
+cic:/Coq/Arith/Between/in_int.con
+cic:/Coq/Arith/Between/in_int_S.con
+cic:/Coq/Arith/Between/in_int_Sp_q.con
+cic:/Coq/Arith/Between/in_int_between.con
+cic:/Coq/Arith/Between/in_int_exists.con
+cic:/Coq/Arith/Between/in_int_intro.con
+cic:/Coq/Arith/Between/in_int_lt.con
+cic:/Coq/Arith/Between/in_int_p_Sq.con
+cic:/Coq/Arith/Between/nth_le.con
+cic:/Coq/Arith/Bool_nat/lt_ge_dec.con
+cic:/Coq/Arith/Bool_nat/nat_eq_bool.con
+cic:/Coq/Arith/Bool_nat/nat_ge_lt_bool.con
+cic:/Coq/Arith/Bool_nat/nat_gt_le_bool.con
+cic:/Coq/Arith/Bool_nat/nat_le_gt_bool.con
+cic:/Coq/Arith/Bool_nat/nat_lt_ge_bool.con
+cic:/Coq/Arith/Bool_nat/nat_noteq_bool.con
+cic:/Coq/Arith/Bool_nat/notzerop.con
+cic:/Coq/Arith/Bool_nat/notzerop_bool.con
+cic:/Coq/Arith/Bool_nat/zerop_bool.con
+cic:/Coq/Arith/Compare/Pcompare.con
+cic:/Coq/Arith/Compare/discrete_nat.con
+cic:/Coq/Arith/Compare/le_dec.con
+cic:/Coq/Arith/Compare/le_decide.con
+cic:/Coq/Arith/Compare/le_le_S_eq.con
+cic:/Coq/Arith/Compare/le_or_le_S.con
+cic:/Coq/Arith/Compare/lt_or_eq.con
+cic:/Coq/Arith/Compare_dec/dec_ge.con
+cic:/Coq/Arith/Compare_dec/dec_gt.con
+cic:/Coq/Arith/Compare_dec/dec_le.con
+cic:/Coq/Arith/Compare_dec/dec_lt.con
+cic:/Coq/Arith/Compare_dec/gt_eq_gt_dec.con
+cic:/Coq/Arith/Compare_dec/le_ge_dec.con
+cic:/Coq/Arith/Compare_dec/le_gt_dec.con
+cic:/Coq/Arith/Compare_dec/le_le_S_dec.con
+cic:/Coq/Arith/Compare_dec/le_lt_dec.con
+cic:/Coq/Arith/Compare_dec/le_lt_eq_dec.con
+cic:/Coq/Arith/Compare_dec/lt_eq_lt_dec.con
+cic:/Coq/Arith/Compare_dec/not_eq.con
+cic:/Coq/Arith/Compare_dec/not_ge.con
+cic:/Coq/Arith/Compare_dec/not_gt.con
+cic:/Coq/Arith/Compare_dec/not_le.con
+cic:/Coq/Arith/Compare_dec/not_lt.con
+cic:/Coq/Arith/Compare_dec/zerop.con
+cic:/Coq/Arith/Div2/div2.con
+cic:/Coq/Arith/Div2/div2_even.con
+cic:/Coq/Arith/Div2/div2_odd.con
+cic:/Coq/Arith/Div2/double.con
+cic:/Coq/Arith/Div2/double_S.con
+cic:/Coq/Arith/Div2/double_even.con
+cic:/Coq/Arith/Div2/double_odd.con
+cic:/Coq/Arith/Div2/double_plus.con
+cic:/Coq/Arith/Div2/even_2n.con
+cic:/Coq/Arith/Div2/even_div2.con
+cic:/Coq/Arith/Div2/even_double.con
+cic:/Coq/Arith/Div2/even_odd_div2.con
+cic:/Coq/Arith/Div2/even_odd_double.con
+cic:/Coq/Arith/Div2/ind_0_1_SS.con
+cic:/Coq/Arith/Div2/lt_div2.con
+cic:/Coq/Arith/Div2/odd_S2n.con
+cic:/Coq/Arith/Div2/odd_div2.con
+cic:/Coq/Arith/Div2/odd_double.con
+cic:/Coq/Arith/EqNat/beq_nat.con
+cic:/Coq/Arith/EqNat/beq_nat_eq.con
+cic:/Coq/Arith/EqNat/beq_nat_refl.con
+cic:/Coq/Arith/EqNat/eq_eq_nat.con
+cic:/Coq/Arith/EqNat/eq_nat.con
+cic:/Coq/Arith/EqNat/eq_nat_decide.con
+cic:/Coq/Arith/EqNat/eq_nat_elim.con
+cic:/Coq/Arith/EqNat/eq_nat_eq.con
+cic:/Coq/Arith/EqNat/eq_nat_refl.con
+cic:/Coq/Arith/Euclid/diveucl_ind.con
+cic:/Coq/Arith/Euclid/diveucl_rec.con
+cic:/Coq/Arith/Euclid/diveucl_rect.con
+cic:/Coq/Arith/Euclid/eucl_dev.con
+cic:/Coq/Arith/Euclid/modulo.con
+cic:/Coq/Arith/Euclid/quotient.con
+cic:/Coq/Arith/Even/even_even_plus.con
+cic:/Coq/Arith/Even/even_ind.con
+cic:/Coq/Arith/Even/even_mult_aux.con
+cic:/Coq/Arith/Even/even_mult_inv_l.con
+cic:/Coq/Arith/Even/even_mult_inv_r.con
+cic:/Coq/Arith/Even/even_mult_l.con
+cic:/Coq/Arith/Even/even_mult_r.con
+cic:/Coq/Arith/Even/even_odd_dec.con
+cic:/Coq/Arith/Even/even_or_odd.con
+cic:/Coq/Arith/Even/even_plus_aux.con
+cic:/Coq/Arith/Even/even_plus_even_inv_l.con
+cic:/Coq/Arith/Even/even_plus_even_inv_r.con
+cic:/Coq/Arith/Even/even_plus_odd_inv_l.con
+cic:/Coq/Arith/Even/even_plus_odd_inv_r.con
+cic:/Coq/Arith/Even/not_even_and_odd.con
+cic:/Coq/Arith/Even/odd_even_plus.con
+cic:/Coq/Arith/Even/odd_ind.con
+cic:/Coq/Arith/Even/odd_mult.con
+cic:/Coq/Arith/Even/odd_mult_inv_l.con
+cic:/Coq/Arith/Even/odd_mult_inv_r.con
+cic:/Coq/Arith/Even/odd_plus_even_inv_l.con
+cic:/Coq/Arith/Even/odd_plus_even_inv_r.con
+cic:/Coq/Arith/Even/odd_plus_l.con
+cic:/Coq/Arith/Even/odd_plus_odd_inv_l.con
+cic:/Coq/Arith/Even/odd_plus_odd_inv_r.con
+cic:/Coq/Arith/Even/odd_plus_r.con
+cic:/Coq/Arith/Factorial/fact.con
+cic:/Coq/Arith/Factorial/fact_le.con
+cic:/Coq/Arith/Factorial/fact_neq_0.con
+cic:/Coq/Arith/Factorial/lt_O_fact.con
+cic:/Coq/Arith/Gt/gt_O_eq.con
+cic:/Coq/Arith/Gt/gt_S.con
+cic:/Coq/Arith/Gt/gt_S_le.con
+cic:/Coq/Arith/Gt/gt_S_n.con
+cic:/Coq/Arith/Gt/gt_Sn_O.con
+cic:/Coq/Arith/Gt/gt_Sn_n.con
+cic:/Coq/Arith/Gt/gt_asym.con
+cic:/Coq/Arith/Gt/gt_irrefl.con
+cic:/Coq/Arith/Gt/gt_le_S.con
+cic:/Coq/Arith/Gt/gt_le_trans.con
+cic:/Coq/Arith/Gt/gt_n_S.con
+cic:/Coq/Arith/Gt/gt_not_le.con
+cic:/Coq/Arith/Gt/gt_pred.con
+cic:/Coq/Arith/Gt/gt_trans.con
+cic:/Coq/Arith/Gt/gt_trans_S.con
+cic:/Coq/Arith/Gt/le_S_gt.con
+cic:/Coq/Arith/Gt/le_gt_S.con
+cic:/Coq/Arith/Gt/le_gt_trans.con
+cic:/Coq/Arith/Gt/le_not_gt.con
+cic:/Coq/Arith/Gt/plus_gt_compat_l.con
+cic:/Coq/Arith/Gt/plus_gt_reg_l.con
+cic:/Coq/Arith/Le/le_O_n.con
+cic:/Coq/Arith/Le/le_S_n.con
+cic:/Coq/Arith/Le/le_Sn_O.con
+cic:/Coq/Arith/Le/le_Sn_le.con
+cic:/Coq/Arith/Le/le_Sn_n.con
+cic:/Coq/Arith/Le/le_antisym.con
+cic:/Coq/Arith/Le/le_elim_rel.con
+cic:/Coq/Arith/Le/le_n_O_eq.con
+cic:/Coq/Arith/Le/le_n_S.con
+cic:/Coq/Arith/Le/le_n_Sn.con
+cic:/Coq/Arith/Le/le_pred.con
+cic:/Coq/Arith/Le/le_pred_n.con
+cic:/Coq/Arith/Le/le_refl.con
+cic:/Coq/Arith/Le/le_trans.con
+cic:/Coq/Arith/Lt/S_pred.con
+cic:/Coq/Arith/Lt/le_lt_n_Sm.con
+cic:/Coq/Arith/Lt/le_lt_or_eq.con
+cic:/Coq/Arith/Lt/le_lt_trans.con
+cic:/Coq/Arith/Lt/le_not_lt.con
+cic:/Coq/Arith/Lt/le_or_lt.con
+cic:/Coq/Arith/Lt/lt_O_Sn.con
+cic:/Coq/Arith/Lt/lt_O_neq.con
+cic:/Coq/Arith/Lt/lt_S.con
+cic:/Coq/Arith/Lt/lt_S_n.con
+cic:/Coq/Arith/Lt/lt_asym.con
+cic:/Coq/Arith/Lt/lt_irrefl.con
+cic:/Coq/Arith/Lt/lt_le_S.con
+cic:/Coq/Arith/Lt/lt_le_trans.con
+cic:/Coq/Arith/Lt/lt_le_weak.con
+cic:/Coq/Arith/Lt/lt_n_O.con
+cic:/Coq/Arith/Lt/lt_n_S.con
+cic:/Coq/Arith/Lt/lt_n_Sm_le.con
+cic:/Coq/Arith/Lt/lt_n_Sn.con
+cic:/Coq/Arith/Lt/lt_not_le.con
+cic:/Coq/Arith/Lt/lt_pred.con
+cic:/Coq/Arith/Lt/lt_pred_n_n.con
+cic:/Coq/Arith/Lt/lt_trans.con
+cic:/Coq/Arith/Lt/nat_total_order.con
+cic:/Coq/Arith/Lt/neq_O_lt.con
+cic:/Coq/Arith/Max/le_max_l.con
+cic:/Coq/Arith/Max/le_max_r.con
+cic:/Coq/Arith/Max/max.con
+cic:/Coq/Arith/Max/max_SS.con
+cic:/Coq/Arith/Max/max_case.con
+cic:/Coq/Arith/Max/max_case2.con
+cic:/Coq/Arith/Max/max_comm.con
+cic:/Coq/Arith/Max/max_dec.con
+cic:/Coq/Arith/Max/max_l.con
+cic:/Coq/Arith/Max/max_r.con
+cic:/Coq/Arith/Min/le_min_l.con
+cic:/Coq/Arith/Min/le_min_r.con
+cic:/Coq/Arith/Min/min.con
+cic:/Coq/Arith/Min/min_SS.con
+cic:/Coq/Arith/Min/min_case.con
+cic:/Coq/Arith/Min/min_case2.con
+cic:/Coq/Arith/Min/min_comm.con
+cic:/Coq/Arith/Min/min_dec.con
+cic:/Coq/Arith/Min/min_l.con
+cic:/Coq/Arith/Min/min_r.con
+cic:/Coq/Arith/Minus/le_minus.con
+cic:/Coq/Arith/Minus/le_plus_minus.con
+cic:/Coq/Arith/Minus/le_plus_minus_r.con
+cic:/Coq/Arith/Minus/lt_O_minus_lt.con
+cic:/Coq/Arith/Minus/lt_minus.con
+cic:/Coq/Arith/Minus/minus_Sn_m.con
+cic:/Coq/Arith/Minus/minus_n_O.con
+cic:/Coq/Arith/Minus/minus_n_n.con
+cic:/Coq/Arith/Minus/minus_plus.con
+cic:/Coq/Arith/Minus/minus_plus_simpl_l_reverse.con
+cic:/Coq/Arith/Minus/not_le_minus_0.con
+cic:/Coq/Arith/Minus/plus_minus.con
+cic:/Coq/Arith/Minus/pred_of_minus.con
+cic:/Coq/Arith/Mult/mult_0_l.con
+cic:/Coq/Arith/Mult/mult_0_r.con
+cic:/Coq/Arith/Mult/mult_1_l.con
+cic:/Coq/Arith/Mult/mult_1_r.con
+cic:/Coq/Arith/Mult/mult_O_le.con
+cic:/Coq/Arith/Mult/mult_S_le_reg_l.con
+cic:/Coq/Arith/Mult/mult_S_lt_compat_l.con
+cic:/Coq/Arith/Mult/mult_acc.con
+cic:/Coq/Arith/Mult/mult_acc_aux.con
+cic:/Coq/Arith/Mult/mult_assoc.con
+cic:/Coq/Arith/Mult/mult_assoc_reverse.con
+cic:/Coq/Arith/Mult/mult_comm.con
+cic:/Coq/Arith/Mult/mult_le_compat.con
+cic:/Coq/Arith/Mult/mult_le_compat_l.con
+cic:/Coq/Arith/Mult/mult_le_compat_r.con
+cic:/Coq/Arith/Mult/mult_lt_compat_r.con
+cic:/Coq/Arith/Mult/mult_minus_distr_r.con
+cic:/Coq/Arith/Mult/mult_plus_distr_l.con
+cic:/Coq/Arith/Mult/mult_plus_distr_r.con
+cic:/Coq/Arith/Mult/mult_tail_mult.con
+cic:/Coq/Arith/Mult/odd_even_lem.con
+cic:/Coq/Arith/Mult/tail_mult.con
+cic:/Coq/Arith/Peano_dec/O_or_S.con
+cic:/Coq/Arith/Peano_dec/dec_eq_nat.con
+cic:/Coq/Arith/Peano_dec/eq_nat_dec.con
+cic:/Coq/Arith/Plus/le_plus_l.con
+cic:/Coq/Arith/Plus/le_plus_r.con
+cic:/Coq/Arith/Plus/le_plus_trans.con
+cic:/Coq/Arith/Plus/lt_plus_trans.con
+cic:/Coq/Arith/Plus/plus_0_l.con
+cic:/Coq/Arith/Plus/plus_0_r.con
+cic:/Coq/Arith/Plus/plus_Snm_nSm.con
+cic:/Coq/Arith/Plus/plus_acc.con
+cic:/Coq/Arith/Plus/plus_assoc.con
+cic:/Coq/Arith/Plus/plus_assoc_reverse.con
+cic:/Coq/Arith/Plus/plus_comm.con
+cic:/Coq/Arith/Plus/plus_is_O.con
+cic:/Coq/Arith/Plus/plus_is_one.con
+cic:/Coq/Arith/Plus/plus_le_compat.con
+cic:/Coq/Arith/Plus/plus_le_compat_l.con
+cic:/Coq/Arith/Plus/plus_le_compat_r.con
+cic:/Coq/Arith/Plus/plus_le_lt_compat.con
+cic:/Coq/Arith/Plus/plus_le_reg_l.con
+cic:/Coq/Arith/Plus/plus_lt_compat.con
+cic:/Coq/Arith/Plus/plus_lt_compat_l.con
+cic:/Coq/Arith/Plus/plus_lt_compat_r.con
+cic:/Coq/Arith/Plus/plus_lt_le_compat.con
+cic:/Coq/Arith/Plus/plus_lt_reg_l.con
+cic:/Coq/Arith/Plus/plus_permute.con
+cic:/Coq/Arith/Plus/plus_permute_2_in_4.con
+cic:/Coq/Arith/Plus/plus_reg_l.con
+cic:/Coq/Arith/Plus/plus_tail_plus.con
+cic:/Coq/Arith/Plus/tail_plus.con
+cic:/Coq/Arith/Wf_nat/acc_lt_rel.con
+cic:/Coq/Arith/Wf_nat/gt_wf_ind.con
+cic:/Coq/Arith/Wf_nat/gt_wf_rec.con
+cic:/Coq/Arith/Wf_nat/gtof.con
+cic:/Coq/Arith/Wf_nat/induction_gtof1.con
+cic:/Coq/Arith/Wf_nat/induction_gtof2.con
+cic:/Coq/Arith/Wf_nat/induction_ltof1.con
+cic:/Coq/Arith/Wf_nat/induction_ltof2.con
+cic:/Coq/Arith/Wf_nat/inv_lt_rel.con
+cic:/Coq/Arith/Wf_nat/lt_wf.con
+cic:/Coq/Arith/Wf_nat/lt_wf_double_ind.con
+cic:/Coq/Arith/Wf_nat/lt_wf_double_rec.con
+cic:/Coq/Arith/Wf_nat/lt_wf_ind.con
+cic:/Coq/Arith/Wf_nat/lt_wf_rec.con
+cic:/Coq/Arith/Wf_nat/lt_wf_rec1.con
+cic:/Coq/Arith/Wf_nat/ltof.con
+cic:/Coq/Arith/Wf_nat/well_founded_gtof.con
+cic:/Coq/Arith/Wf_nat/well_founded_inv_lt_rel_compat.con
+cic:/Coq/Arith/Wf_nat/well_founded_inv_rel_inv_lt_rel.con
+cic:/Coq/Arith/Wf_nat/well_founded_lt_compat.con
+cic:/Coq/Arith/Wf_nat/well_founded_ltof.con
+cic:/Coq/Bool/Bool/Is_true.con
+cic:/Coq/Bool/Bool/Is_true_eq_left.con
+cic:/Coq/Bool/Bool/Is_true_eq_right.con
+cic:/Coq/Bool/Bool/Is_true_eq_true.con
+cic:/Coq/Bool/Bool/Is_true_eq_true2.con
+cic:/Coq/Bool/Bool/absoption_andb.con
+cic:/Coq/Bool/Bool/absoption_orb.con
+cic:/Coq/Bool/Bool/andb.con
+cic:/Coq/Bool/Bool/andb_assoc.con
+cic:/Coq/Bool/Bool/andb_b_false.con
+cic:/Coq/Bool/Bool/andb_b_true.con
+cic:/Coq/Bool/Bool/andb_comm.con
+cic:/Coq/Bool/Bool/andb_false_b.con
+cic:/Coq/Bool/Bool/andb_false_elim.con
+cic:/Coq/Bool/Bool/andb_false_intro1.con
+cic:/Coq/Bool/Bool/andb_false_intro2.con
+cic:/Coq/Bool/Bool/andb_neg_b.con
+cic:/Coq/Bool/Bool/andb_prop.con
+cic:/Coq/Bool/Bool/andb_prop2.con
+cic:/Coq/Bool/Bool/andb_true_b.con
+cic:/Coq/Bool/Bool/andb_true_eq.con
+cic:/Coq/Bool/Bool/andb_true_intro.con
+cic:/Coq/Bool/Bool/andb_true_intro2.con
+cic:/Coq/Bool/Bool/bool_1.con
+cic:/Coq/Bool/Bool/bool_2.con
+cic:/Coq/Bool/Bool/bool_3.con
+cic:/Coq/Bool/Bool/bool_4.con
+cic:/Coq/Bool/Bool/bool_5.con
+cic:/Coq/Bool/Bool/bool_6.con
+cic:/Coq/Bool/Bool/demorgan1.con
+cic:/Coq/Bool/Bool/demorgan2.con
+cic:/Coq/Bool/Bool/demorgan3.con
+cic:/Coq/Bool/Bool/demorgan4.con
+cic:/Coq/Bool/Bool/diff_false_true.con
+cic:/Coq/Bool/Bool/diff_true_false.con
+cic:/Coq/Bool/Bool/eq_true_false_abs.con
+cic:/Coq/Bool/Bool/eqb.con
+cic:/Coq/Bool/Bool/eqb_eq.con
+cic:/Coq/Bool/Bool/eqb_negb1.con
+cic:/Coq/Bool/Bool/eqb_negb2.con
+cic:/Coq/Bool/Bool/eqb_prop.con
+cic:/Coq/Bool/Bool/eqb_refl.con
+cic:/Coq/Bool/Bool/eqb_reflx.con
+cic:/Coq/Bool/Bool/eqb_subst.con
+cic:/Coq/Bool/Bool/false_xorb.con
+cic:/Coq/Bool/Bool/if_negb.con
+cic:/Coq/Bool/Bool/ifb.con
+cic:/Coq/Bool/Bool/implb.con
+cic:/Coq/Bool/Bool/leb.con
+cic:/Coq/Bool/Bool/negb.con
+cic:/Coq/Bool/Bool/negb_andb.con
+cic:/Coq/Bool/Bool/negb_elim.con
+cic:/Coq/Bool/Bool/negb_intro.con
+cic:/Coq/Bool/Bool/negb_orb.con
+cic:/Coq/Bool/Bool/negb_sym.con
+cic:/Coq/Bool/Bool/no_fixpoint_negb.con
+cic:/Coq/Bool/Bool/not_false_is_true.con
+cic:/Coq/Bool/Bool/not_true_is_false.con
+cic:/Coq/Bool/Bool/orb.con
+cic:/Coq/Bool/Bool/orb_assoc.con
+cic:/Coq/Bool/Bool/orb_b_false.con
+cic:/Coq/Bool/Bool/orb_b_true.con
+cic:/Coq/Bool/Bool/orb_comm.con
+cic:/Coq/Bool/Bool/orb_false_b.con
+cic:/Coq/Bool/Bool/orb_false_elim.con
+cic:/Coq/Bool/Bool/orb_false_intro.con
+cic:/Coq/Bool/Bool/orb_neg_b.con
+cic:/Coq/Bool/Bool/orb_prop.con
+cic:/Coq/Bool/Bool/orb_prop2.con
+cic:/Coq/Bool/Bool/orb_true_b.con
+cic:/Coq/Bool/Bool/orb_true_elim.con
+cic:/Coq/Bool/Bool/orb_true_intro.con
+cic:/Coq/Bool/Bool/true_xorb.con
+cic:/Coq/Bool/Bool/xorb.con
+cic:/Coq/Bool/Bool/xorb_assoc.con
+cic:/Coq/Bool/Bool/xorb_comm.con
+cic:/Coq/Bool/Bool/xorb_eq.con
+cic:/Coq/Bool/Bool/xorb_false.con
+cic:/Coq/Bool/Bool/xorb_move_l_r_1.con
+cic:/Coq/Bool/Bool/xorb_move_l_r_2.con
+cic:/Coq/Bool/Bool/xorb_move_r_l_1.con
+cic:/Coq/Bool/Bool/xorb_move_r_l_2.con
+cic:/Coq/Bool/Bool/xorb_nilpotent.con
+cic:/Coq/Bool/Bool/xorb_true.con
+cic:/Coq/Bool/BoolEq/beq_eq_not_false.con
+cic:/Coq/Bool/BoolEq/beq_eq_true.con
+cic:/Coq/Bool/BoolEq/beq_false_not_eq.con
+cic:/Coq/Bool/BoolEq/eq_dec.con
+cic:/Coq/Bool/BoolEq/exists_beq_eq.con
+cic:/Coq/Bool/BoolEq/not_eq_false_beq.con
+cic:/Coq/Bool/Bvector/BVand.con
+cic:/Coq/Bool/Bvector/BVor.con
+cic:/Coq/Bool/Bvector/BVxor.con
+cic:/Coq/Bool/Bvector/Bcons.con
+cic:/Coq/Bool/Bvector/Bhigh.con
+cic:/Coq/Bool/Bvector/Blow.con
+cic:/Coq/Bool/Bvector/Bneg.con
+cic:/Coq/Bool/Bvector/Bnil.con
+cic:/Coq/Bool/Bvector/BshiftL.con
+cic:/Coq/Bool/Bvector/BshiftL_iter.con
+cic:/Coq/Bool/Bvector/BshiftRa.con
+cic:/Coq/Bool/Bvector/BshiftRa_iter.con
+cic:/Coq/Bool/Bvector/BshiftRl.con
+cic:/Coq/Bool/Bvector/BshiftRl_iter.con
+cic:/Coq/Bool/Bvector/Bsign.con
+cic:/Coq/Bool/Bvector/Bvect_false.con
+cic:/Coq/Bool/Bvector/Bvect_true.con
+cic:/Coq/Bool/Bvector/Bvector.con
+cic:/Coq/Bool/Bvector/Vbinary.con
+cic:/Coq/Bool/Bvector/Vconst.con
+cic:/Coq/Bool/Bvector/Vextend.con
+cic:/Coq/Bool/Bvector/Vhead.con
+cic:/Coq/Bool/Bvector/Vlast.con
+cic:/Coq/Bool/Bvector/Vshiftin.con
+cic:/Coq/Bool/Bvector/Vshiftout.con
+cic:/Coq/Bool/Bvector/Vshiftrepeat.con
+cic:/Coq/Bool/Bvector/Vtail.con
+cic:/Coq/Bool/Bvector/Vtrunc.con
+cic:/Coq/Bool/Bvector/Vunary.con
+cic:/Coq/Bool/Bvector/vector_ind.con
+cic:/Coq/Bool/Bvector/vector_rec.con
+cic:/Coq/Bool/Bvector/vector_rect.con
+cic:/Coq/Bool/DecBool/ifdec.con
+cic:/Coq/Bool/DecBool/ifdec_left.con
+cic:/Coq/Bool/DecBool/ifdec_right.con
+cic:/Coq/Bool/IfProp/IfProp_false.con
+cic:/Coq/Bool/IfProp/IfProp_ind.con
+cic:/Coq/Bool/IfProp/IfProp_or.con
+cic:/Coq/Bool/IfProp/IfProp_sum.con
+cic:/Coq/Bool/IfProp/IfProp_true.con
+cic:/Coq/Bool/IfProp/Iffalse_inv.con
+cic:/Coq/Bool/IfProp/Iftrue_inv.con
+cic:/Coq/Bool/Sumbool/bool_eq_ind.con
+cic:/Coq/Bool/Sumbool/bool_eq_rec.con
+cic:/Coq/Bool/Sumbool/bool_of_sumbool.con
+cic:/Coq/Bool/Sumbool/sumbool_and.con
+cic:/Coq/Bool/Sumbool/sumbool_not.con
+cic:/Coq/Bool/Sumbool/sumbool_of_bool.con
+cic:/Coq/Bool/Sumbool/sumbool_or.con
+cic:/Coq/Bool/Zerob/zerob.con
+cic:/Coq/Bool/Zerob/zerob_false_elim.con
+cic:/Coq/Bool/Zerob/zerob_false_intro.con
+cic:/Coq/Bool/Zerob/zerob_true_elim.con
+cic:/Coq/Bool/Zerob/zerob_true_intro.con
+cic:/Coq/Init/Datatypes/CompOpp.con
+cic:/Coq/Init/Datatypes/Empty_set_ind.con
+cic:/Coq/Init/Datatypes/Empty_set_rec.con
+cic:/Coq/Init/Datatypes/Empty_set_rect.con
+cic:/Coq/Init/Datatypes/bool_ind.con
+cic:/Coq/Init/Datatypes/bool_rec.con
+cic:/Coq/Init/Datatypes/bool_rect.con
+cic:/Coq/Init/Datatypes/comparison_ind.con
+cic:/Coq/Init/Datatypes/comparison_rec.con
+cic:/Coq/Init/Datatypes/comparison_rect.con
+cic:/Coq/Init/Datatypes/fst.con
+cic:/Coq/Init/Datatypes/identity_ind.con
+cic:/Coq/Init/Datatypes/identity_rec.con
+cic:/Coq/Init/Datatypes/identity_rect.con
+cic:/Coq/Init/Datatypes/injective_projections.con
+cic:/Coq/Init/Datatypes/nat_ind.con
+cic:/Coq/Init/Datatypes/nat_rec.con
+cic:/Coq/Init/Datatypes/nat_rect.con
+cic:/Coq/Init/Datatypes/option_ind.con
+cic:/Coq/Init/Datatypes/option_rec.con
+cic:/Coq/Init/Datatypes/option_rect.con
+cic:/Coq/Init/Datatypes/prod_ind.con
+cic:/Coq/Init/Datatypes/prod_rec.con
+cic:/Coq/Init/Datatypes/prod_rect.con
+cic:/Coq/Init/Datatypes/snd.con
+cic:/Coq/Init/Datatypes/sum_ind.con
+cic:/Coq/Init/Datatypes/sum_rec.con
+cic:/Coq/Init/Datatypes/sum_rect.con
+cic:/Coq/Init/Datatypes/surjective_pairing.con
+cic:/Coq/Init/Datatypes/unit_ind.con
+cic:/Coq/Init/Datatypes/unit_rec.con
+cic:/Coq/Init/Datatypes/unit_rect.con
+cic:/Coq/Init/Logic/False_ind.con
+cic:/Coq/Init/Logic/False_rec.con
+cic:/Coq/Init/Logic/False_rect.con
+cic:/Coq/Init/Logic/IF_then_else.con
+cic:/Coq/Init/Logic/True_ind.con
+cic:/Coq/Init/Logic/True_rec.con
+cic:/Coq/Init/Logic/True_rect.con
+cic:/Coq/Init/Logic/absurd.con
+cic:/Coq/Init/Logic/all.con
+cic:/Coq/Init/Logic/and_ind.con
+cic:/Coq/Init/Logic/and_rec.con
+cic:/Coq/Init/Logic/and_rect.con
+cic:/Coq/Init/Logic/eq_ind.con
+cic:/Coq/Init/Logic/eq_ind_r.con
+cic:/Coq/Init/Logic/eq_rec.con
+cic:/Coq/Init/Logic/eq_rec_r.con
+cic:/Coq/Init/Logic/eq_rect.con
+cic:/Coq/Init/Logic/eq_rect_r.con
+cic:/Coq/Init/Logic/ex2_ind.con
+cic:/Coq/Init/Logic/ex_ind.con
+cic:/Coq/Init/Logic/f_equal.con
+cic:/Coq/Init/Logic/f_equal2.con
+cic:/Coq/Init/Logic/f_equal3.con
+cic:/Coq/Init/Logic/f_equal4.con
+cic:/Coq/Init/Logic/f_equal5.con
+cic:/Coq/Init/Logic/gen.con
+cic:/Coq/Init/Logic/iff.con
+cic:/Coq/Init/Logic/iff_refl.con
+cic:/Coq/Init/Logic/iff_sym.con
+cic:/Coq/Init/Logic/iff_trans.con
+cic:/Coq/Init/Logic/inst.con
+cic:/Coq/Init/Logic/not.con
+cic:/Coq/Init/Logic/or_ind.con
+cic:/Coq/Init/Logic/proj1.con
+cic:/Coq/Init/Logic/proj2.con
+cic:/Coq/Init/Logic/sym_eq.con
+cic:/Coq/Init/Logic/sym_equal.con
+cic:/Coq/Init/Logic/sym_not_eq.con
+cic:/Coq/Init/Logic/sym_not_equal.con
+cic:/Coq/Init/Logic/trans_eq.con
+cic:/Coq/Init/Logic/trans_equal.con
+cic:/Coq/Init/Logic_Type/congr_id.con
+cic:/Coq/Init/Logic_Type/fstT.con
+cic:/Coq/Init/Logic_Type/identity_ind_r.con
+cic:/Coq/Init/Logic_Type/identity_rec_r.con
+cic:/Coq/Init/Logic_Type/identity_rect_r.con
+cic:/Coq/Init/Logic_Type/notT.con
+cic:/Coq/Init/Logic_Type/prodT_curry.con
+cic:/Coq/Init/Logic_Type/prodT_ind.con
+cic:/Coq/Init/Logic_Type/prodT_rec.con
+cic:/Coq/Init/Logic_Type/prodT_rect.con
+cic:/Coq/Init/Logic_Type/prodT_uncurry.con
+cic:/Coq/Init/Logic_Type/sndT.con
+cic:/Coq/Init/Logic_Type/sym_id.con
+cic:/Coq/Init/Logic_Type/sym_not_id.con
+cic:/Coq/Init/Logic_Type/trans_id.con
+cic:/Coq/Init/Peano/IsSucc.con
+cic:/Coq/Init/Peano/O_S.con
+cic:/Coq/Init/Peano/eq_S.con
+cic:/Coq/Init/Peano/eq_add_S.con
+cic:/Coq/Init/Peano/ge.con
+cic:/Coq/Init/Peano/gt.con
+cic:/Coq/Init/Peano/le_ind.con
+cic:/Coq/Init/Peano/lt.con
+cic:/Coq/Init/Peano/minus.con
+cic:/Coq/Init/Peano/mult.con
+cic:/Coq/Init/Peano/mult_n_O.con
+cic:/Coq/Init/Peano/mult_n_Sm.con
+cic:/Coq/Init/Peano/n_Sn.con
+cic:/Coq/Init/Peano/nat_case.con
+cic:/Coq/Init/Peano/nat_double_ind.con
+cic:/Coq/Init/Peano/not_eq_S.con
+cic:/Coq/Init/Peano/plus.con
+cic:/Coq/Init/Peano/plus_O_n.con
+cic:/Coq/Init/Peano/plus_Sn_m.con
+cic:/Coq/Init/Peano/plus_n_O.con
+cic:/Coq/Init/Peano/plus_n_Sm.con
+cic:/Coq/Init/Peano/pred.con
+cic:/Coq/Init/Peano/pred_Sn.con
+cic:/Coq/Init/Specif/Choice.con
+cic:/Coq/Init/Specif/Choice2.con
+cic:/Coq/Init/Specif/Exc.con
+cic:/Coq/Init/Specif/absurd_set.con
+cic:/Coq/Init/Specif/bool_choice.con
+cic:/Coq/Init/Specif/error.con
+cic:/Coq/Init/Specif/except.con
+cic:/Coq/Init/Specif/proj1_sig.con
+cic:/Coq/Init/Specif/proj2_sig.con
+cic:/Coq/Init/Specif/projS1.con
+cic:/Coq/Init/Specif/projS2.con
+cic:/Coq/Init/Specif/projT1.con
+cic:/Coq/Init/Specif/projT2.con
+cic:/Coq/Init/Specif/sig2_ind.con
+cic:/Coq/Init/Specif/sig2_rec.con
+cic:/Coq/Init/Specif/sig2_rect.con
+cic:/Coq/Init/Specif/sigS2_ind.con
+cic:/Coq/Init/Specif/sigS2_rec.con
+cic:/Coq/Init/Specif/sigS2_rect.con
+cic:/Coq/Init/Specif/sigS_ind.con
+cic:/Coq/Init/Specif/sigS_rec.con
+cic:/Coq/Init/Specif/sigS_rect.con
+cic:/Coq/Init/Specif/sigT_ind.con
+cic:/Coq/Init/Specif/sigT_rec.con
+cic:/Coq/Init/Specif/sigT_rect.con
+cic:/Coq/Init/Specif/sig_ind.con
+cic:/Coq/Init/Specif/sig_rec.con
+cic:/Coq/Init/Specif/sig_rect.con
+cic:/Coq/Init/Specif/sumbool_ind.con
+cic:/Coq/Init/Specif/sumbool_rec.con
+cic:/Coq/Init/Specif/sumbool_rect.con
+cic:/Coq/Init/Specif/sumor_ind.con
+cic:/Coq/Init/Specif/sumor_rec.con
+cic:/Coq/Init/Specif/sumor_rect.con
+cic:/Coq/Init/Specif/value.con
+cic:/Coq/Init/Wf/Acc_ind.con
+cic:/Coq/Init/Wf/Acc_inv.con
+cic:/Coq/Init/Wf/Acc_inv_dep.con
+cic:/Coq/Init/Wf/Acc_iter.con
+cic:/Coq/Init/Wf/Acc_iter_2.con
+cic:/Coq/Init/Wf/Acc_rec.con
+cic:/Coq/Init/Wf/Acc_rect.con
+cic:/Coq/Init/Wf/Fix.con
+cic:/Coq/Init/Wf/Fix_F.con
+cic:/Coq/Init/Wf/Fix_F_eq.con
+cic:/Coq/Init/Wf/Fix_F_inv.con
+cic:/Coq/Init/Wf/Fix_eq.con
+cic:/Coq/Init/Wf/well_founded.con
+cic:/Coq/Init/Wf/well_founded_ind.con
+cic:/Coq/Init/Wf/well_founded_induction.con
+cic:/Coq/Init/Wf/well_founded_induction_type.con
+cic:/Coq/Init/Wf/well_founded_induction_type_2.con
+cic:/Coq/Lists/List/In.con
+cic:/Coq/Lists/List/In_dec.con
+cic:/Coq/Lists/List/app.con
+cic:/Coq/Lists/List/app_ass.con
+cic:/Coq/Lists/List/app_comm_cons.con
+cic:/Coq/Lists/List/app_cons_not_nil.con
+cic:/Coq/Lists/List/app_eq_nil.con
+cic:/Coq/Lists/List/app_eq_unit.con
+cic:/Coq/Lists/List/app_inj_tail.con
+cic:/Coq/Lists/List/app_nil_end.con
+cic:/Coq/Lists/List/ass_app.con
+cic:/Coq/Lists/List/distr_rev.con
+cic:/Coq/Lists/List/flat_map.con
+cic:/Coq/Lists/List/fold_left.con
+cic:/Coq/Lists/List/fold_right.con
+cic:/Coq/Lists/List/fold_symmetric.con
+cic:/Coq/Lists/List/head.con
+cic:/Coq/Lists/List/in_app_or.con
+cic:/Coq/Lists/List/in_cons.con
+cic:/Coq/Lists/List/in_eq.con
+cic:/Coq/Lists/List/in_inv.con
+cic:/Coq/Lists/List/in_map.con
+cic:/Coq/Lists/List/in_nil.con
+cic:/Coq/Lists/List/in_or_app.con
+cic:/Coq/Lists/List/in_prod.con
+cic:/Coq/Lists/List/in_prod_aux.con
+cic:/Coq/Lists/List/incl.con
+cic:/Coq/Lists/List/incl_app.con
+cic:/Coq/Lists/List/incl_appl.con
+cic:/Coq/Lists/List/incl_appr.con
+cic:/Coq/Lists/List/incl_cons.con
+cic:/Coq/Lists/List/incl_refl.con
+cic:/Coq/Lists/List/incl_tl.con
+cic:/Coq/Lists/List/incl_tran.con
+cic:/Coq/Lists/List/lel.con
+cic:/Coq/Lists/List/lel_cons.con
+cic:/Coq/Lists/List/lel_cons_cons.con
+cic:/Coq/Lists/List/lel_nil.con
+cic:/Coq/Lists/List/lel_refl.con
+cic:/Coq/Lists/List/lel_tail.con
+cic:/Coq/Lists/List/lel_trans.con
+cic:/Coq/Lists/List/length.con
+cic:/Coq/Lists/List/list_eq_dec.con
+cic:/Coq/Lists/List/list_ind.con
+cic:/Coq/Lists/List/list_power.con
+cic:/Coq/Lists/List/list_prod.con
+cic:/Coq/Lists/List/list_rec.con
+cic:/Coq/Lists/List/list_rect.con
+cic:/Coq/Lists/List/map.con
+cic:/Coq/Lists/List/nil_cons.con
+cic:/Coq/Lists/List/nth.con
+cic:/Coq/Lists/List/nth_In.con
+cic:/Coq/Lists/List/nth_S_cons.con
+cic:/Coq/Lists/List/nth_default.con
+cic:/Coq/Lists/List/nth_error.con
+cic:/Coq/Lists/List/nth_in_or_default.con
+cic:/Coq/Lists/List/nth_ok.con
+cic:/Coq/Lists/List/rev.con
+cic:/Coq/Lists/List/rev_ind.con
+cic:/Coq/Lists/List/rev_involutive.con
+cic:/Coq/Lists/List/rev_list_ind.con
+cic:/Coq/Lists/List/rev_unit.con
+cic:/Coq/Lists/List/tail.con
+cic:/Coq/Lists/ListSet/empty_set.con
+cic:/Coq/Lists/ListSet/set.con
+cic:/Coq/Lists/ListSet/set_In.con
+cic:/Coq/Lists/ListSet/set_In_dec.con
+cic:/Coq/Lists/ListSet/set_add.con
+cic:/Coq/Lists/ListSet/set_add_elim.con
+cic:/Coq/Lists/ListSet/set_add_elim2.con
+cic:/Coq/Lists/ListSet/set_add_intro.con
+cic:/Coq/Lists/ListSet/set_add_intro1.con
+cic:/Coq/Lists/ListSet/set_add_intro2.con
+cic:/Coq/Lists/ListSet/set_add_not_empty.con
+cic:/Coq/Lists/ListSet/set_diff.con
+cic:/Coq/Lists/ListSet/set_diff_elim1.con
+cic:/Coq/Lists/ListSet/set_diff_elim2.con
+cic:/Coq/Lists/ListSet/set_diff_intro.con
+cic:/Coq/Lists/ListSet/set_diff_trivial.con
+cic:/Coq/Lists/ListSet/set_fold_left.con
+cic:/Coq/Lists/ListSet/set_fold_right.con
+cic:/Coq/Lists/ListSet/set_inter.con
+cic:/Coq/Lists/ListSet/set_inter_elim.con
+cic:/Coq/Lists/ListSet/set_inter_elim1.con
+cic:/Coq/Lists/ListSet/set_inter_elim2.con
+cic:/Coq/Lists/ListSet/set_inter_intro.con
+cic:/Coq/Lists/ListSet/set_map.con
+cic:/Coq/Lists/ListSet/set_mem.con
+cic:/Coq/Lists/ListSet/set_mem_complete1.con
+cic:/Coq/Lists/ListSet/set_mem_complete2.con
+cic:/Coq/Lists/ListSet/set_mem_correct1.con
+cic:/Coq/Lists/ListSet/set_mem_correct2.con
+cic:/Coq/Lists/ListSet/set_mem_ind.con
+cic:/Coq/Lists/ListSet/set_mem_ind2.con
+cic:/Coq/Lists/ListSet/set_power.con
+cic:/Coq/Lists/ListSet/set_prod.con
+cic:/Coq/Lists/ListSet/set_remove.con
+cic:/Coq/Lists/ListSet/set_union.con
+cic:/Coq/Lists/ListSet/set_union_elim.con
+cic:/Coq/Lists/ListSet/set_union_emptyL.con
+cic:/Coq/Lists/ListSet/set_union_emptyR.con
+cic:/Coq/Lists/ListSet/set_union_intro.con
+cic:/Coq/Lists/ListSet/set_union_intro1.con
+cic:/Coq/Lists/ListSet/set_union_intro2.con
+cic:/Coq/Lists/MonoList/A.con
+cic:/Coq/Lists/MonoList/In.con
+cic:/Coq/Lists/MonoList/List_Dom.con
+cic:/Coq/Lists/MonoList/app.con
+cic:/Coq/Lists/MonoList/app_ass.con
+cic:/Coq/Lists/MonoList/app_nil_end.con
+cic:/Coq/Lists/MonoList/ass_app.con
+cic:/Coq/Lists/MonoList/in_app_or.con
+cic:/Coq/Lists/MonoList/in_cons.con
+cic:/Coq/Lists/MonoList/in_eq.con
+cic:/Coq/Lists/MonoList/in_or_app.con
+cic:/Coq/Lists/MonoList/incl.con
+cic:/Coq/Lists/MonoList/incl_app.con
+cic:/Coq/Lists/MonoList/incl_appl.con
+cic:/Coq/Lists/MonoList/incl_appr.con
+cic:/Coq/Lists/MonoList/incl_cons.con
+cic:/Coq/Lists/MonoList/incl_refl.con
+cic:/Coq/Lists/MonoList/incl_tl.con
+cic:/Coq/Lists/MonoList/incl_tran.con
+cic:/Coq/Lists/MonoList/lel.con
+cic:/Coq/Lists/MonoList/lel_cons.con
+cic:/Coq/Lists/MonoList/lel_cons_cons.con
+cic:/Coq/Lists/MonoList/lel_nil.con
+cic:/Coq/Lists/MonoList/lel_refl.con
+cic:/Coq/Lists/MonoList/lel_tail.con
+cic:/Coq/Lists/MonoList/lel_trans.con
+cic:/Coq/Lists/MonoList/length.con
+cic:/Coq/Lists/MonoList/list_ind.con
+cic:/Coq/Lists/MonoList/list_rec.con
+cic:/Coq/Lists/MonoList/list_rect.con
+cic:/Coq/Lists/MonoList/nil_cons.con
+cic:/Coq/Lists/MonoList/tail.con
+cic:/Coq/Lists/Streams/EqSt_reflex.con
+cic:/Coq/Lists/Streams/Exists_ind.con
+cic:/Coq/Lists/Streams/ForAll_coind.con
+cic:/Coq/Lists/Streams/Str_nth.con
+cic:/Coq/Lists/Streams/Str_nth_plus.con
+cic:/Coq/Lists/Streams/Str_nth_tl.con
+cic:/Coq/Lists/Streams/Str_nth_tl_plus.con
+cic:/Coq/Lists/Streams/const.con
+cic:/Coq/Lists/Streams/eqst_ntheq.con
+cic:/Coq/Lists/Streams/hd.con
+cic:/Coq/Lists/Streams/map.con
+cic:/Coq/Lists/Streams/ntheq_eqst.con
+cic:/Coq/Lists/Streams/sym_EqSt.con
+cic:/Coq/Lists/Streams/tl.con
+cic:/Coq/Lists/Streams/tl_nth_tl.con
+cic:/Coq/Lists/Streams/trans_EqSt.con
+cic:/Coq/Lists/Streams/unfold_Stream.con
+cic:/Coq/Lists/TheoryList/AllS_assoc_ind.con
+cic:/Coq/Lists/TheoryList/AllS_ind.con
+cic:/Coq/Lists/TheoryList/Assoc.con
+cic:/Coq/Lists/TheoryList/Find.con
+cic:/Coq/Lists/TheoryList/Hd.con
+cic:/Coq/Lists/TheoryList/InR_INV.con
+cic:/Coq/Lists/TheoryList/InR_app_or.con
+cic:/Coq/Lists/TheoryList/InR_cons_inv.con
+cic:/Coq/Lists/TheoryList/InR_ind.con
+cic:/Coq/Lists/TheoryList/InR_inv.con
+cic:/Coq/Lists/TheoryList/InR_or_app.con
+cic:/Coq/Lists/TheoryList/In_In_spec.con
+cic:/Coq/Lists/TheoryList/In_spec_ind.con
+cic:/Coq/Lists/TheoryList/Index.con
+cic:/Coq/Lists/TheoryList/Index_p.con
+cic:/Coq/Lists/TheoryList/Isnil.con
+cic:/Coq/Lists/TheoryList/Isnil_dec.con
+cic:/Coq/Lists/TheoryList/Isnil_nil.con
+cic:/Coq/Lists/TheoryList/Item.con
+cic:/Coq/Lists/TheoryList/Length.con
+cic:/Coq/Lists/TheoryList/Length_l.con
+cic:/Coq/Lists/TheoryList/Length_l_pf.con
+cic:/Coq/Lists/TheoryList/Mem.con
+cic:/Coq/Lists/TheoryList/Nth.con
+cic:/Coq/Lists/TheoryList/Nth_func.con
+cic:/Coq/Lists/TheoryList/Tl.con
+cic:/Coq/Lists/TheoryList/Try_find.con
+cic:/Coq/Lists/TheoryList/Uncons.con
+cic:/Coq/Lists/TheoryList/assoc.con
+cic:/Coq/Lists/TheoryList/find.con
+cic:/Coq/Lists/TheoryList/fst_nth_nth.con
+cic:/Coq/Lists/TheoryList/fst_nth_spec_ind.con
+cic:/Coq/Lists/TheoryList/index_p.con
+cic:/Coq/Lists/TheoryList/mem.con
+cic:/Coq/Lists/TheoryList/not_Isnil_cons.con
+cic:/Coq/Lists/TheoryList/nth_le_length.con
+cic:/Coq/Lists/TheoryList/nth_lt_O.con
+cic:/Coq/Lists/TheoryList/nth_spec_ind.con
+cic:/Coq/Lists/TheoryList/try_find.con
+cic:/Coq/Logic/Berardi/AC.con
+cic:/Coq/Logic/Berardi/AC_IF.con
+cic:/Coq/Logic/Berardi/IFProp.con
+cic:/Coq/Logic/Berardi/L1.con
+cic:/Coq/Logic/Berardi/Not_b.con
+cic:/Coq/Logic/Berardi/R.con
+cic:/Coq/Logic/Berardi/U.con
+cic:/Coq/Logic/Berardi/classical_proof_irrelevence.con
+cic:/Coq/Logic/Berardi/f.con
+cic:/Coq/Logic/Berardi/g.con
+cic:/Coq/Logic/Berardi/i.con
+cic:/Coq/Logic/Berardi/i2.con
+cic:/Coq/Logic/Berardi/inv.con
+cic:/Coq/Logic/Berardi/inv2.con
+cic:/Coq/Logic/Berardi/j.con
+cic:/Coq/Logic/Berardi/j2.con
+cic:/Coq/Logic/Berardi/not_has_fixpoint.con
+cic:/Coq/Logic/Berardi/pow.con
+cic:/Coq/Logic/Berardi/retract_cond_ind.con
+cic:/Coq/Logic/Berardi/retract_cond_rec.con
+cic:/Coq/Logic/Berardi/retract_cond_rect.con
+cic:/Coq/Logic/Berardi/retract_ind.con
+cic:/Coq/Logic/Berardi/retract_pow_U_U.con
+cic:/Coq/Logic/Berardi/retract_rec.con
+cic:/Coq/Logic/Berardi/retract_rect.con
+cic:/Coq/Logic/ChoiceFacts/FunChoice_Equiv_RelChoice_and_ParamDefinDescr.con
+cic:/Coq/Logic/ChoiceFacts/FunctionalChoice.con
+cic:/Coq/Logic/ChoiceFacts/GuardedRelationalChoice.con
+cic:/Coq/Logic/ChoiceFacts/IndependenceOfPremises.con
+cic:/Coq/Logic/ChoiceFacts/ParamDefiniteDescription.con
+cic:/Coq/Logic/ChoiceFacts/ProofIrrelevance.con
+cic:/Coq/Logic/ChoiceFacts/RelationalChoice.con
+cic:/Coq/Logic/ChoiceFacts/description_rel_choice_imp_funct_choice.con
+cic:/Coq/Logic/ChoiceFacts/funct_choice_imp_description.con
+cic:/Coq/Logic/ChoiceFacts/funct_choice_imp_rel_choice.con
+cic:/Coq/Logic/ChoiceFacts/rel_choice_and_proof_irrel_imp_guarded_rel_choice.con
+cic:/Coq/Logic/ChoiceFacts/rel_choice_indep_of_premises_imp_guarded_rel_choice.con
+cic:/Coq/Logic/ClassicalChoice/choice.con
+cic:/Coq/Logic/ClassicalDescription/classic_set.con
+cic:/Coq/Logic/ClassicalDescription/dependent_description.con
+cic:/Coq/Logic/ClassicalDescription/description.con
+cic:/Coq/Logic/ClassicalFacts/BoolP.con
+cic:/Coq/Logic/ClassicalFacts/BoolP_dep_induction.con
+cic:/Coq/Logic/ClassicalFacts/BoolP_elim.con
+cic:/Coq/Logic/ClassicalFacts/BoolP_elim_redl.con
+cic:/Coq/Logic/ClassicalFacts/BoolP_elim_redr.con
+cic:/Coq/Logic/ClassicalFacts/F.con
+cic:/Coq/Logic/ClassicalFacts/FalseP.con
+cic:/Coq/Logic/ClassicalFacts/Fix.con
+cic:/Coq/Logic/ClassicalFacts/TrueP.con
+cic:/Coq/Logic/ClassicalFacts/aux.con
+cic:/Coq/Logic/ClassicalFacts/boolP_elim_redl.con
+cic:/Coq/Logic/ClassicalFacts/boolP_elim_redr.con
+cic:/Coq/Logic/ClassicalFacts/boolP_ind.con
+cic:/Coq/Logic/ClassicalFacts/boolP_indd.con
+cic:/Coq/Logic/ClassicalFacts/excluded_middle.con
+cic:/Coq/Logic/ClassicalFacts/ext_prop_dep_proof_irrel_cc.con
+cic:/Coq/Logic/ClassicalFacts/ext_prop_dep_proof_irrel_cic.con
+cic:/Coq/Logic/ClassicalFacts/ext_prop_dep_proof_irrel_gen.con
+cic:/Coq/Logic/ClassicalFacts/ext_prop_fixpoint.con
+cic:/Coq/Logic/ClassicalFacts/f1.con
+cic:/Coq/Logic/ClassicalFacts/f1_o_f2.con
+cic:/Coq/Logic/ClassicalFacts/f2.con
+cic:/Coq/Logic/ClassicalFacts/has_fixpoint_ind.con
+cic:/Coq/Logic/ClassicalFacts/has_fixpoint_rec.con
+cic:/Coq/Logic/ClassicalFacts/has_fixpoint_rect.con
+cic:/Coq/Logic/ClassicalFacts/inhabited.con
+cic:/Coq/Logic/ClassicalFacts/proof_irrelevance.con
+cic:/Coq/Logic/ClassicalFacts/prop_degen_em.con
+cic:/Coq/Logic/ClassicalFacts/prop_degen_ext.con
+cic:/Coq/Logic/ClassicalFacts/prop_degeneracy.con
+cic:/Coq/Logic/ClassicalFacts/prop_ext_A_eq_A_imp_A.con
+cic:/Coq/Logic/ClassicalFacts/prop_ext_em_degen.con
+cic:/Coq/Logic/ClassicalFacts/prop_ext_retract_A_A_imp_A.con
+cic:/Coq/Logic/ClassicalFacts/prop_extensionality.con
+cic:/Coq/Logic/ClassicalFacts/retract_ind.con
+cic:/Coq/Logic/ClassicalFacts/retract_rec.con
+cic:/Coq/Logic/ClassicalFacts/retract_rect.con
+cic:/Coq/Logic/Classical_Pred_Set/all_not_not_ex.con
+cic:/Coq/Logic/Classical_Pred_Set/ex_not_not_all.con
+cic:/Coq/Logic/Classical_Pred_Set/not_all_ex_not.con
+cic:/Coq/Logic/Classical_Pred_Set/not_all_not_ex.con
+cic:/Coq/Logic/Classical_Pred_Set/not_ex_all_not.con
+cic:/Coq/Logic/Classical_Pred_Set/not_ex_not_all.con
+cic:/Coq/Logic/Classical_Pred_Type/all_not_not_ex.con
+cic:/Coq/Logic/Classical_Pred_Type/ex_not_not_all.con
+cic:/Coq/Logic/Classical_Pred_Type/not_all_ex_not.con
+cic:/Coq/Logic/Classical_Pred_Type/not_all_not_ex.con
+cic:/Coq/Logic/Classical_Pred_Type/not_ex_all_not.con
+cic:/Coq/Logic/Classical_Pred_Type/not_ex_not_all.con
+cic:/Coq/Logic/Classical_Prop/NNPP.con
+cic:/Coq/Logic/Classical_Prop/and_not_or.con
+cic:/Coq/Logic/Classical_Prop/classic.con
+cic:/Coq/Logic/Classical_Prop/imply_and_or.con
+cic:/Coq/Logic/Classical_Prop/imply_and_or2.con
+cic:/Coq/Logic/Classical_Prop/imply_to_and.con
+cic:/Coq/Logic/Classical_Prop/imply_to_or.con
+cic:/Coq/Logic/Classical_Prop/not_and_or.con
+cic:/Coq/Logic/Classical_Prop/not_imply_elim.con
+cic:/Coq/Logic/Classical_Prop/not_imply_elim2.con
+cic:/Coq/Logic/Classical_Prop/not_or_and.con
+cic:/Coq/Logic/Classical_Prop/or_not_and.con
+cic:/Coq/Logic/Classical_Prop/or_to_imply.con
+cic:/Coq/Logic/Classical_Prop/proof_irrelevance.con
+cic:/Coq/Logic/Decidable/dec_False.con
+cic:/Coq/Logic/Decidable/dec_True.con
+cic:/Coq/Logic/Decidable/dec_and.con
+cic:/Coq/Logic/Decidable/dec_imp.con
+cic:/Coq/Logic/Decidable/dec_not.con
+cic:/Coq/Logic/Decidable/dec_not_not.con
+cic:/Coq/Logic/Decidable/dec_or.con
+cic:/Coq/Logic/Decidable/decidable.con
+cic:/Coq/Logic/Decidable/imp_simp.con
+cic:/Coq/Logic/Decidable/not_and.con
+cic:/Coq/Logic/Decidable/not_imp.con
+cic:/Coq/Logic/Decidable/not_not.con
+cic:/Coq/Logic/Decidable/not_or.con
+cic:/Coq/Logic/Diaconescu/AC.con
+cic:/Coq/Logic/Diaconescu/PredicateExtensionality.con
+cic:/Coq/Logic/Diaconescu/guarded_rel_choice.con
+cic:/Coq/Logic/Diaconescu/pred_ext_and_rel_choice_imp_EM.con
+cic:/Coq/Logic/Diaconescu/proof_irrel.con
+cic:/Coq/Logic/Diaconescu/prop_ext.con
+cic:/Coq/Logic/Eqdep/Streicher_K.con
+cic:/Coq/Logic/Eqdep/UIP.con
+cic:/Coq/Logic/Eqdep/UIP_refl.con
+cic:/Coq/Logic/Eqdep/eq_dep1_dep.con
+cic:/Coq/Logic/Eqdep/eq_dep1_eq.con
+cic:/Coq/Logic/Eqdep/eq_dep1_ind.con
+cic:/Coq/Logic/Eqdep/eq_dep1_rec.con
+cic:/Coq/Logic/Eqdep/eq_dep1_rect.con
+cic:/Coq/Logic/Eqdep/eq_dep_dep1.con
+cic:/Coq/Logic/Eqdep/eq_dep_eq.con
+cic:/Coq/Logic/Eqdep/eq_dep_ind.con
+cic:/Coq/Logic/Eqdep/eq_dep_rec.con
+cic:/Coq/Logic/Eqdep/eq_dep_rect.con
+cic:/Coq/Logic/Eqdep/eq_dep_sym.con
+cic:/Coq/Logic/Eqdep/eq_dep_trans.con
+cic:/Coq/Logic/Eqdep/eq_indd.con
+cic:/Coq/Logic/Eqdep/eq_rec_eq.con
+cic:/Coq/Logic/Eqdep/eq_rect_eq.con
+cic:/Coq/Logic/Eqdep/equiv_eqex_eqdep.con
+cic:/Coq/Logic/Eqdep/inj_pair2.con
+cic:/Coq/Logic/Eqdep/inj_pairT2.con
+cic:/Coq/Logic/Eqdep_dec/K_dec.con
+cic:/Coq/Logic/Eqdep_dec/K_dec_set.con
+cic:/Coq/Logic/Eqdep_dec/eq2eqT.con
+cic:/Coq/Logic/Eqdep_dec/eqT2eq.con
+cic:/Coq/Logic/Eqdep_dec/eqT_eq_bij.con
+cic:/Coq/Logic/Eqdep_dec/eq_eqT_bij.con
+cic:/Coq/Logic/Eqdep_dec/eq_proofs_unicity.con
+cic:/Coq/Logic/Eqdep_dec/inj_right_pair.con
+cic:/Coq/Logic/Eqdep_dec/nu_left_inv.con
+cic:/Coq/Logic/Eqdep_dec/trans_sym_eqT.con
+cic:/Coq/Logic/Hurkens/I.con
+cic:/Coq/Logic/Hurkens/Omega.con
+cic:/Coq/Logic/Hurkens/U.con
+cic:/Coq/Logic/Hurkens/V.con
+cic:/Coq/Logic/Hurkens/WF.con
+cic:/Coq/Logic/Hurkens/induct.con
+cic:/Coq/Logic/Hurkens/le.con
+cic:/Coq/Logic/Hurkens/lemma1.con
+cic:/Coq/Logic/Hurkens/lemma2.con
+cic:/Coq/Logic/Hurkens/paradox.con
+cic:/Coq/Logic/Hurkens/sb.con
+cic:/Coq/Logic/JMeq/JMeq_eq.con
+cic:/Coq/Logic/JMeq/JMeq_eq_dep.con
+cic:/Coq/Logic/JMeq/JMeq_ind.con
+cic:/Coq/Logic/JMeq/JMeq_ind_r.con
+cic:/Coq/Logic/JMeq/JMeq_rec.con
+cic:/Coq/Logic/JMeq/JMeq_rec_r.con
+cic:/Coq/Logic/JMeq/JMeq_rect.con
+cic:/Coq/Logic/JMeq/eq_dep_JMeq.con
+cic:/Coq/Logic/JMeq/sym_JMeq.con
+cic:/Coq/Logic/JMeq/trans_JMeq.con
+cic:/Coq/Logic/ProofIrrelevance/b2p.con
+cic:/Coq/Logic/ProofIrrelevance/or_elim_redl.con
+cic:/Coq/Logic/ProofIrrelevance/or_elim_redr.con
+cic:/Coq/Logic/ProofIrrelevance/or_indd.con
+cic:/Coq/Logic/ProofIrrelevance/p2b.con
+cic:/Coq/Logic/ProofIrrelevance/p2p1.con
+cic:/Coq/Logic/ProofIrrelevance/p2p2.con
+cic:/Coq/Logic/ProofIrrelevance/proof_irrelevance_cc.con
+cic:/Coq/Logic/ProofIrrelevance/proof_irrelevance_cci.con
+cic:/Coq/Logic/RelationalChoice/relational_choice.con
+cic:/Coq/NArith/BinNat/N_ind.con
+cic:/Coq/NArith/BinNat/N_rec.con
+cic:/Coq/NArith/BinNat/N_rect.con
+cic:/Coq/NArith/BinNat/Ncompare.con
+cic:/Coq/NArith/BinNat/Ncompare_Eq_eq.con
+cic:/Coq/NArith/BinNat/Ndouble.con
+cic:/Coq/NArith/BinNat/Ndouble_plus_one.con
+cic:/Coq/NArith/BinNat/Nind.con
+cic:/Coq/NArith/BinNat/Nmult.con
+cic:/Coq/NArith/BinNat/Nmult_0_l.con
+cic:/Coq/NArith/BinNat/Nmult_1_l.con
+cic:/Coq/NArith/BinNat/Nmult_1_r.con
+cic:/Coq/NArith/BinNat/Nmult_assoc.con
+cic:/Coq/NArith/BinNat/Nmult_comm.con
+cic:/Coq/NArith/BinNat/Nmult_plus_distr_r.con
+cic:/Coq/NArith/BinNat/Nmult_reg_r.con
+cic:/Coq/NArith/BinNat/Nplus.con
+cic:/Coq/NArith/BinNat/Nplus_0_l.con
+cic:/Coq/NArith/BinNat/Nplus_0_r.con
+cic:/Coq/NArith/BinNat/Nplus_assoc.con
+cic:/Coq/NArith/BinNat/Nplus_comm.con
+cic:/Coq/NArith/BinNat/Nplus_reg_l.con
+cic:/Coq/NArith/BinNat/Nplus_succ.con
+cic:/Coq/NArith/BinNat/Nsucc.con
+cic:/Coq/NArith/BinNat/Nsucc_inj.con
+cic:/Coq/NArith/BinPos/Dcompare.con
+cic:/Coq/NArith/BinPos/P_of_succ_nat.con
+cic:/Coq/NArith/BinPos/Pcase.con
+cic:/Coq/NArith/BinPos/Pcompare.con
+cic:/Coq/NArith/BinPos/Pcompare_Eq_eq.con
+cic:/Coq/NArith/BinPos/Pcompare_Gt_Gt.con
+cic:/Coq/NArith/BinPos/Pcompare_Gt_Lt.con
+cic:/Coq/NArith/BinPos/Pcompare_Lt_Gt.con
+cic:/Coq/NArith/BinPos/Pcompare_Lt_Lt.con
+cic:/Coq/NArith/BinPos/Pcompare_antisym.con
+cic:/Coq/NArith/BinPos/Pcompare_not_Eq.con
+cic:/Coq/NArith/BinPos/Pcompare_refl.con
+cic:/Coq/NArith/BinPos/Pdiv2.con
+cic:/Coq/NArith/BinPos/Pdouble_mask.con
+cic:/Coq/NArith/BinPos/Pdouble_minus_one.con
+cic:/Coq/NArith/BinPos/Pdouble_minus_one_o_succ_eq_xI.con
+cic:/Coq/NArith/BinPos/Pdouble_minus_two.con
+cic:/Coq/NArith/BinPos/Pdouble_plus_one_mask.con
+cic:/Coq/NArith/BinPos/Pind.con
+cic:/Coq/NArith/BinPos/Pminus.con
+cic:/Coq/NArith/BinPos/Pminus_mask.con
+cic:/Coq/NArith/BinPos/Pminus_mask_Gt.con
+cic:/Coq/NArith/BinPos/Pminus_mask_carry.con
+cic:/Coq/NArith/BinPos/Pminus_mask_diag.con
+cic:/Coq/NArith/BinPos/Pmult.con
+cic:/Coq/NArith/BinPos/Pmult_1_inversion_l.con
+cic:/Coq/NArith/BinPos/Pmult_1_r.con
+cic:/Coq/NArith/BinPos/Pmult_assoc.con
+cic:/Coq/NArith/BinPos/Pmult_comm.con
+cic:/Coq/NArith/BinPos/Pmult_nat.con
+cic:/Coq/NArith/BinPos/Pmult_plus_distr_l.con
+cic:/Coq/NArith/BinPos/Pmult_plus_distr_r.con
+cic:/Coq/NArith/BinPos/Pmult_reg_l.con
+cic:/Coq/NArith/BinPos/Pmult_reg_r.con
+cic:/Coq/NArith/BinPos/Pmult_xI_mult_xO_discr.con
+cic:/Coq/NArith/BinPos/Pmult_xI_permute_r.con
+cic:/Coq/NArith/BinPos/Pmult_xO_discr.con
+cic:/Coq/NArith/BinPos/Pmult_xO_permute_r.con
+cic:/Coq/NArith/BinPos/Pplus.con
+cic:/Coq/NArith/BinPos/Pplus_assoc.con
+cic:/Coq/NArith/BinPos/Pplus_carry.con
+cic:/Coq/NArith/BinPos/Pplus_carry_no_neutral.con
+cic:/Coq/NArith/BinPos/Pplus_carry_plus.con
+cic:/Coq/NArith/BinPos/Pplus_carry_pred_eq_plus.con
+cic:/Coq/NArith/BinPos/Pplus_carry_reg_l.con
+cic:/Coq/NArith/BinPos/Pplus_carry_reg_r.con
+cic:/Coq/NArith/BinPos/Pplus_carry_spec.con
+cic:/Coq/NArith/BinPos/Pplus_comm.con
+cic:/Coq/NArith/BinPos/Pplus_diag.con
+cic:/Coq/NArith/BinPos/Pplus_minus.con
+cic:/Coq/NArith/BinPos/Pplus_no_neutral.con
+cic:/Coq/NArith/BinPos/Pplus_one_succ_l.con
+cic:/Coq/NArith/BinPos/Pplus_one_succ_r.con
+cic:/Coq/NArith/BinPos/Pplus_reg_l.con
+cic:/Coq/NArith/BinPos/Pplus_reg_r.con
+cic:/Coq/NArith/BinPos/Pplus_succ_permute_l.con
+cic:/Coq/NArith/BinPos/Pplus_succ_permute_r.con
+cic:/Coq/NArith/BinPos/Pplus_xI_double_minus_one.con
+cic:/Coq/NArith/BinPos/Pplus_xO_double_minus_one.con
+cic:/Coq/NArith/BinPos/Ppred.con
+cic:/Coq/NArith/BinPos/Ppred_succ.con
+cic:/Coq/NArith/BinPos/Prec.con
+cic:/Coq/NArith/BinPos/Psucc.con
+cic:/Coq/NArith/BinPos/Psucc_discr.con
+cic:/Coq/NArith/BinPos/Psucc_inj.con
+cic:/Coq/NArith/BinPos/Psucc_not_one.con
+cic:/Coq/NArith/BinPos/Psucc_o_double_minus_one_eq_xO.con
+cic:/Coq/NArith/BinPos/Psucc_pred.con
+cic:/Coq/NArith/BinPos/ZC1.con
+cic:/Coq/NArith/BinPos/ZC2.con
+cic:/Coq/NArith/BinPos/ZC3.con
+cic:/Coq/NArith/BinPos/ZC4.con
+cic:/Coq/NArith/BinPos/ZL10.con
+cic:/Coq/NArith/BinPos/ZL11.con
+cic:/Coq/NArith/BinPos/double_eq_one_discr.con
+cic:/Coq/NArith/BinPos/double_eq_zero_inversion.con
+cic:/Coq/NArith/BinPos/double_moins_un_xO_discr.con
+cic:/Coq/NArith/BinPos/double_plus_one_eq_one_inversion.con
+cic:/Coq/NArith/BinPos/double_plus_one_zero_discr.con
+cic:/Coq/NArith/BinPos/iterate_add.con
+cic:/Coq/NArith/BinPos/nat_of_P.con
+cic:/Coq/NArith/BinPos/plus_iter.con
+cic:/Coq/NArith/BinPos/plus_iter_eq_plus.con
+cic:/Coq/NArith/BinPos/plus_iter_xI.con
+cic:/Coq/NArith/BinPos/plus_iter_xO.con
+cic:/Coq/NArith/BinPos/positive_ind.con
+cic:/Coq/NArith/BinPos/positive_mask_ind.con
+cic:/Coq/NArith/BinPos/positive_mask_rec.con
+cic:/Coq/NArith/BinPos/positive_mask_rect.con
+cic:/Coq/NArith/BinPos/positive_rec.con
+cic:/Coq/NArith/BinPos/positive_rect.con
+cic:/Coq/NArith/BinPos/xI_succ_xO.con
+cic:/Coq/NArith/BinPos/xO_succ_permute.con
+cic:/Coq/NArith/Pnat/P_of_succ_nat_o_nat_of_P_eq_succ.con
+cic:/Coq/NArith/Pnat/Pcompare_minus_l.con
+cic:/Coq/NArith/Pnat/Pcompare_minus_r.con
+cic:/Coq/NArith/Pnat/Pmult_minus_distr_l.con
+cic:/Coq/NArith/Pnat/Pmult_nat_2_mult_2_permute.con
+cic:/Coq/NArith/Pnat/Pmult_nat_4_mult_2_permute.con
+cic:/Coq/NArith/Pnat/Pmult_nat_l_plus_morphism.con
+cic:/Coq/NArith/Pnat/Pmult_nat_mult_permute.con
+cic:/Coq/NArith/Pnat/Pmult_nat_plus_carry_morphism.con
+cic:/Coq/NArith/Pnat/Pmult_nat_r_plus_morphism.con
+cic:/Coq/NArith/Pnat/Pmult_nat_succ_morphism.con
+cic:/Coq/NArith/Pnat/ZL16.con
+cic:/Coq/NArith/Pnat/ZL17.con
+cic:/Coq/NArith/Pnat/ZL3.con
+cic:/Coq/NArith/Pnat/ZL4.con
+cic:/Coq/NArith/Pnat/ZL5.con
+cic:/Coq/NArith/Pnat/ZL6.con
+cic:/Coq/NArith/Pnat/ZL7.con
+cic:/Coq/NArith/Pnat/ZL8.con
+cic:/Coq/NArith/Pnat/le_Pmult_nat.con
+cic:/Coq/NArith/Pnat/lt_O_nat_of_P.con
+cic:/Coq/NArith/Pnat/nat_of_P_gt_Gt_compare_complement_morphism.con
+cic:/Coq/NArith/Pnat/nat_of_P_gt_Gt_compare_morphism.con
+cic:/Coq/NArith/Pnat/nat_of_P_inj.con
+cic:/Coq/NArith/Pnat/nat_of_P_lt_Lt_compare_complement_morphism.con
+cic:/Coq/NArith/Pnat/nat_of_P_lt_Lt_compare_morphism.con
+cic:/Coq/NArith/Pnat/nat_of_P_minus_morphism.con
+cic:/Coq/NArith/Pnat/nat_of_P_mult_morphism.con
+cic:/Coq/NArith/Pnat/nat_of_P_o_P_of_succ_nat_eq_succ.con
+cic:/Coq/NArith/Pnat/nat_of_P_plus_carry_morphism.con
+cic:/Coq/NArith/Pnat/nat_of_P_plus_morphism.con
+cic:/Coq/NArith/Pnat/nat_of_P_succ_morphism.con
+cic:/Coq/NArith/Pnat/nat_of_P_xH.con
+cic:/Coq/NArith/Pnat/nat_of_P_xI.con
+cic:/Coq/NArith/Pnat/nat_of_P_xO.con
+cic:/Coq/NArith/Pnat/pred_o_P_of_succ_nat_o_nat_of_P_eq_id.con
+cic:/Coq/Reals/ArithProp/euclidian_division.con
+cic:/Coq/Reals/ArithProp/even_odd_cor.con
+cic:/Coq/Reals/ArithProp/le_double.con
+cic:/Coq/Reals/ArithProp/le_minusni_n.con
+cic:/Coq/Reals/ArithProp/lt_minus_O_lt.con
+cic:/Coq/Reals/ArithProp/minus_neq_O.con
+cic:/Coq/Reals/ArithProp/tech8.con
+cic:/Coq/Reals/Binomial/C.con
+cic:/Coq/Reals/Binomial/binomial.con
+cic:/Coq/Reals/Binomial/pascal.con
+cic:/Coq/Reals/Binomial/pascal_step1.con
+cic:/Coq/Reals/Binomial/pascal_step2.con
+cic:/Coq/Reals/Binomial/pascal_step3.con
+cic:/Coq/Reals/Cauchy_prod/cauchy_finite.con
+cic:/Coq/Reals/Cauchy_prod/sum_N_predN.con
+cic:/Coq/Reals/Cauchy_prod/sum_plus.con
+cic:/Coq/Reals/Cos_plus/Majxy.con
+cic:/Coq/Reals/Cos_plus/Majxy_cv_R0.con
+cic:/Coq/Reals/Cos_plus/cos_plus.con
+cic:/Coq/Reals/Cos_plus/reste1_cv_R0.con
+cic:/Coq/Reals/Cos_plus/reste1_maj.con
+cic:/Coq/Reals/Cos_plus/reste2_cv_R0.con
+cic:/Coq/Reals/Cos_plus/reste2_maj.con
+cic:/Coq/Reals/Cos_plus/reste_cv_R0.con
+cic:/Coq/Reals/Cos_rel/A1.con
+cic:/Coq/Reals/Cos_rel/A1_cvg.con
+cic:/Coq/Reals/Cos_rel/B1.con
+cic:/Coq/Reals/Cos_rel/B1_cvg.con
+cic:/Coq/Reals/Cos_rel/C1.con
+cic:/Coq/Reals/Cos_rel/C1_cvg.con
+cic:/Coq/Reals/Cos_rel/Reste.con
+cic:/Coq/Reals/Cos_rel/Reste1.con
+cic:/Coq/Reals/Cos_rel/Reste2.con
+cic:/Coq/Reals/Cos_rel/cos_plus_form.con
+cic:/Coq/Reals/Cos_rel/pow_sqr.con
+cic:/Coq/Reals/DiscrR/IZR_eq.con
+cic:/Coq/Reals/DiscrR/IZR_neq.con
+cic:/Coq/Reals/DiscrR/Rlt_R0_R2.con
+cic:/Coq/Reals/DiscrR/Rplus_lt_pos.con
+cic:/Coq/Reals/Exp_prop/E1.con
+cic:/Coq/Reals/Exp_prop/E1_cvg.con
+cic:/Coq/Reals/Exp_prop/Reste_E.con
+cic:/Coq/Reals/Exp_prop/Reste_E_cv.con
+cic:/Coq/Reals/Exp_prop/Reste_E_maj.con
+cic:/Coq/Reals/Exp_prop/Rle_Rinv.con
+cic:/Coq/Reals/Exp_prop/derivable_pt_lim_exp_0.con
+cic:/Coq/Reals/Exp_prop/div2_S_double.con
+cic:/Coq/Reals/Exp_prop/div2_double.con
+cic:/Coq/Reals/Exp_prop/div2_not_R0.con
+cic:/Coq/Reals/Exp_prop/exp_form.con
+cic:/Coq/Reals/Exp_prop/exp_plus.con
+cic:/Coq/Reals/Exp_prop/exp_pos.con
+cic:/Coq/Reals/Exp_prop/exp_pos_pos.con
+cic:/Coq/Reals/Exp_prop/maj_Reste_E.con
+cic:/Coq/Reals/Exp_prop/maj_Reste_cv_R0.con
+cic:/Coq/Reals/MVT/IAF.con
+cic:/Coq/Reals/MVT/IAF_var.con
+cic:/Coq/Reals/MVT/MVT.con
+cic:/Coq/Reals/MVT/MVT_cor1.con
+cic:/Coq/Reals/MVT/MVT_cor2.con
+cic:/Coq/Reals/MVT/MVT_cor3.con
+cic:/Coq/Reals/MVT/Rolle.con
+cic:/Coq/Reals/MVT/antiderivative_Ucte.con
+cic:/Coq/Reals/MVT/derive_increasing_interv.con
+cic:/Coq/Reals/MVT/derive_increasing_interv_ax.con
+cic:/Coq/Reals/MVT/derive_increasing_interv_var.con
+cic:/Coq/Reals/MVT/increasing_decreasing.con
+cic:/Coq/Reals/MVT/increasing_decreasing_opp.con
+cic:/Coq/Reals/MVT/negative_derivative.con
+cic:/Coq/Reals/MVT/nonneg_derivative_1.con
+cic:/Coq/Reals/MVT/nonpos_derivative_0.con
+cic:/Coq/Reals/MVT/nonpos_derivative_1.con
+cic:/Coq/Reals/MVT/null_derivative_0.con
+cic:/Coq/Reals/MVT/null_derivative_1.con
+cic:/Coq/Reals/MVT/null_derivative_loc.con
+cic:/Coq/Reals/MVT/positive_derivative.con
+cic:/Coq/Reals/MVT/strictincreasing_strictdecreasing_opp.con
+cic:/Coq/Reals/NewtonInt/FTCN_step1.con
+cic:/Coq/Reals/NewtonInt/FTC_Newton.con
+cic:/Coq/Reals/NewtonInt/NewtonInt.con
+cic:/Coq/Reals/NewtonInt/NewtonInt_P1.con
+cic:/Coq/Reals/NewtonInt/NewtonInt_P2.con
+cic:/Coq/Reals/NewtonInt/NewtonInt_P3.con
+cic:/Coq/Reals/NewtonInt/NewtonInt_P4.con
+cic:/Coq/Reals/NewtonInt/NewtonInt_P5.con
+cic:/Coq/Reals/NewtonInt/NewtonInt_P6.con
+cic:/Coq/Reals/NewtonInt/NewtonInt_P7.con
+cic:/Coq/Reals/NewtonInt/NewtonInt_P8.con
+cic:/Coq/Reals/NewtonInt/NewtonInt_P9.con
+cic:/Coq/Reals/NewtonInt/Newton_integrable.con
+cic:/Coq/Reals/NewtonInt/antiderivative_P1.con
+cic:/Coq/Reals/NewtonInt/antiderivative_P2.con
+cic:/Coq/Reals/NewtonInt/antiderivative_P3.con
+cic:/Coq/Reals/NewtonInt/antiderivative_P4.con
+cic:/Coq/Reals/PartSum/Cauchy_crit_series.con
+cic:/Coq/Reals/PartSum/Rabs_triang_gen.con
+cic:/Coq/Reals/PartSum/Rsum_abs.con
+cic:/Coq/Reals/PartSum/SP.con
+cic:/Coq/Reals/PartSum/cauchy_abs.con
+cic:/Coq/Reals/PartSum/cond_pos_sum.con
+cic:/Coq/Reals/PartSum/cv_cauchy_1.con
+cic:/Coq/Reals/PartSum/cv_cauchy_2.con
+cic:/Coq/Reals/PartSum/decomp_sum.con
+cic:/Coq/Reals/PartSum/minus_sum.con
+cic:/Coq/Reals/PartSum/plus_sum.con
+cic:/Coq/Reals/PartSum/scal_sum.con
+cic:/Coq/Reals/PartSum/sum_Rle.con
+cic:/Coq/Reals/PartSum/sum_cte.con
+cic:/Coq/Reals/PartSum/sum_cv_maj.con
+cic:/Coq/Reals/PartSum/sum_decomposition.con
+cic:/Coq/Reals/PartSum/sum_eq.con
+cic:/Coq/Reals/PartSum/sum_eq_R0.con
+cic:/Coq/Reals/PartSum/sum_growing.con
+cic:/Coq/Reals/PartSum/sum_incr.con
+cic:/Coq/Reals/PartSum/tech1.con
+cic:/Coq/Reals/PartSum/tech11.con
+cic:/Coq/Reals/PartSum/tech12.con
+cic:/Coq/Reals/PartSum/tech2.con
+cic:/Coq/Reals/PartSum/tech3.con
+cic:/Coq/Reals/PartSum/tech4.con
+cic:/Coq/Reals/PartSum/tech5.con
+cic:/Coq/Reals/PartSum/tech6.con
+cic:/Coq/Reals/PartSum/tech7.con
+cic:/Coq/Reals/PartSum/uniqueness_sum.con
+cic:/Coq/Reals/RIneq/INR_IZR_INZ.con
+cic:/Coq/Reals/RIneq/INR_eq.con
+cic:/Coq/Reals/RIneq/INR_le.con
+cic:/Coq/Reals/RIneq/INR_lt.con
+cic:/Coq/Reals/RIneq/INR_lt_1.con
+cic:/Coq/Reals/RIneq/INR_pos.con
+cic:/Coq/Reals/RIneq/IZN.con
+cic:/Coq/Reals/RIneq/IZR_ge.con
+cic:/Coq/Reals/RIneq/IZR_le.con
+cic:/Coq/Reals/RIneq/IZR_lt.con
+cic:/Coq/Reals/RIneq/RTheory.con
+cic:/Coq/Reals/RIneq/Rdichotomy.con
+cic:/Coq/Reals/RIneq/Req_dec.con
+cic:/Coq/Reals/RIneq/Req_ge.con
+cic:/Coq/Reals/RIneq/Req_ge_sym.con
+cic:/Coq/Reals/RIneq/Req_le.con
+cic:/Coq/Reals/RIneq/Req_le_sym.con
+cic:/Coq/Reals/RIneq/Rge_antisym.con
+cic:/Coq/Reals/RIneq/Rge_dec.con
+cic:/Coq/Reals/RIneq/Rge_gt_trans.con
+cic:/Coq/Reals/RIneq/Rge_le.con
+cic:/Coq/Reals/RIneq/Rge_minus.con
+cic:/Coq/Reals/RIneq/Rge_trans.con
+cic:/Coq/Reals/RIneq/Rgt_dec.con
+cic:/Coq/Reals/RIneq/Rgt_ge.con
+cic:/Coq/Reals/RIneq/Rgt_ge_trans.con
+cic:/Coq/Reals/RIneq/Rgt_minus.con
+cic:/Coq/Reals/RIneq/Rgt_not_eq.con
+cic:/Coq/Reals/RIneq/Rgt_not_le.con
+cic:/Coq/Reals/RIneq/Rgt_trans.con
+cic:/Coq/Reals/RIneq/Rinv_0_lt_compat.con
+cic:/Coq/Reals/RIneq/Rinv_1.con
+cic:/Coq/Reals/RIneq/Rinv_1_lt_contravar.con
+cic:/Coq/Reals/RIneq/Rinv_involutive.con
+cic:/Coq/Reals/RIneq/Rinv_l_sym.con
+cic:/Coq/Reals/RIneq/Rinv_lt_0_compat.con
+cic:/Coq/Reals/RIneq/Rinv_lt_contravar.con
+cic:/Coq/Reals/RIneq/Rinv_mult_distr.con
+cic:/Coq/Reals/RIneq/Rinv_mult_simpl.con
+cic:/Coq/Reals/RIneq/Rinv_neq_0_compat.con
+cic:/Coq/Reals/RIneq/Rinv_r.con
+cic:/Coq/Reals/RIneq/Rinv_r_simpl_l.con
+cic:/Coq/Reals/RIneq/Rinv_r_simpl_m.con
+cic:/Coq/Reals/RIneq/Rinv_r_simpl_r.con
+cic:/Coq/Reals/RIneq/Rinv_r_sym.con
+cic:/Coq/Reals/RIneq/Rle_0_1.con
+cic:/Coq/Reals/RIneq/Rle_0_sqr.con
+cic:/Coq/Reals/RIneq/Rle_antisym.con
+cic:/Coq/Reals/RIneq/Rle_dec.con
+cic:/Coq/Reals/RIneq/Rle_ge.con
+cic:/Coq/Reals/RIneq/Rle_le_eq.con
+cic:/Coq/Reals/RIneq/Rle_lt_0_plus_1.con
+cic:/Coq/Reals/RIneq/Rle_lt_or_eq_dec.con
+cic:/Coq/Reals/RIneq/Rle_lt_trans.con
+cic:/Coq/Reals/RIneq/Rle_minus.con
+cic:/Coq/Reals/RIneq/Rle_not_lt.con
+cic:/Coq/Reals/RIneq/Rle_or_lt.con
+cic:/Coq/Reals/RIneq/Rle_refl.con
+cic:/Coq/Reals/RIneq/Rle_trans.con
+cic:/Coq/Reals/RIneq/Rlt_0_1.con
+cic:/Coq/Reals/RIneq/Rlt_0_sqr.con
+cic:/Coq/Reals/RIneq/Rlt_dec.con
+cic:/Coq/Reals/RIneq/Rlt_dichotomy_converse.con
+cic:/Coq/Reals/RIneq/Rlt_eq_compat.con
+cic:/Coq/Reals/RIneq/Rlt_irrefl.con
+cic:/Coq/Reals/RIneq/Rlt_le.con
+cic:/Coq/Reals/RIneq/Rlt_le_dec.con
+cic:/Coq/Reals/RIneq/Rlt_le_trans.con
+cic:/Coq/Reals/RIneq/Rlt_minus.con
+cic:/Coq/Reals/RIneq/Rlt_not_eq.con
+cic:/Coq/Reals/RIneq/Rlt_not_ge.con
+cic:/Coq/Reals/RIneq/Rlt_not_le.con
+cic:/Coq/Reals/RIneq/Rlt_plus_1.con
+cic:/Coq/Reals/RIneq/Rminus_0_l.con
+cic:/Coq/Reals/RIneq/Rminus_0_r.con
+cic:/Coq/Reals/RIneq/Rminus_diag_eq.con
+cic:/Coq/Reals/RIneq/Rminus_diag_uniq.con
+cic:/Coq/Reals/RIneq/Rminus_diag_uniq_sym.con
+cic:/Coq/Reals/RIneq/Rminus_eq_contra.con
+cic:/Coq/Reals/RIneq/Rminus_le.con
+cic:/Coq/Reals/RIneq/Rminus_lt.con
+cic:/Coq/Reals/RIneq/Rminus_not_eq.con
+cic:/Coq/Reals/RIneq/Rminus_not_eq_right.con
+cic:/Coq/Reals/RIneq/Rmult_0_l.con
+cic:/Coq/Reals/RIneq/Rmult_0_r.con
+cic:/Coq/Reals/RIneq/Rmult_1_r.con
+cic:/Coq/Reals/RIneq/Rmult_eq_0_compat.con
+cic:/Coq/Reals/RIneq/Rmult_eq_0_compat_l.con
+cic:/Coq/Reals/RIneq/Rmult_eq_0_compat_r.con
+cic:/Coq/Reals/RIneq/Rmult_eq_compat_l.con
+cic:/Coq/Reals/RIneq/Rmult_eq_reg_l.con
+cic:/Coq/Reals/RIneq/Rmult_ge_0_gt_0_lt_compat.con
+cic:/Coq/Reals/RIneq/Rmult_ge_compat_r.con
+cic:/Coq/Reals/RIneq/Rmult_gt_0_compat.con
+cic:/Coq/Reals/RIneq/Rmult_gt_0_lt_compat.con
+cic:/Coq/Reals/RIneq/Rmult_integral.con
+cic:/Coq/Reals/RIneq/Rmult_integral_contrapositive.con
+cic:/Coq/Reals/RIneq/Rmult_le_0_lt_compat.con
+cic:/Coq/Reals/RIneq/Rmult_le_compat.con
+cic:/Coq/Reals/RIneq/Rmult_le_compat_l.con
+cic:/Coq/Reals/RIneq/Rmult_le_compat_neg_l.con
+cic:/Coq/Reals/RIneq/Rmult_le_compat_r.con
+cic:/Coq/Reals/RIneq/Rmult_le_ge_compat_neg_l.con
+cic:/Coq/Reals/RIneq/Rmult_le_pos.con
+cic:/Coq/Reals/RIneq/Rmult_le_reg_l.con
+cic:/Coq/Reals/RIneq/Rmult_lt_0_compat.con
+cic:/Coq/Reals/RIneq/Rmult_lt_compat_r.con
+cic:/Coq/Reals/RIneq/Rmult_lt_gt_compat_neg_l.con
+cic:/Coq/Reals/RIneq/Rmult_lt_reg_l.con
+cic:/Coq/Reals/RIneq/Rmult_minus_distr_l.con
+cic:/Coq/Reals/RIneq/Rmult_ne.con
+cic:/Coq/Reals/RIneq/Rmult_neq_0_reg.con
+cic:/Coq/Reals/RIneq/Rmult_opp_opp.con
+cic:/Coq/Reals/RIneq/Rmult_plus_distr_r.con
+cic:/Coq/Reals/RIneq/Rnot_ge_lt.con
+cic:/Coq/Reals/RIneq/Rnot_gt_le.con
+cic:/Coq/Reals/RIneq/Rnot_le_lt.con
+cic:/Coq/Reals/RIneq/Rnot_lt_ge.con
+cic:/Coq/Reals/RIneq/Rnot_lt_le.con
+cic:/Coq/Reals/RIneq/Ropp_0.con
+cic:/Coq/Reals/RIneq/Ropp_0_ge_le_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_0_gt_lt_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_0_le_ge_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_0_lt_gt_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_Ropp_IZR.con
+cic:/Coq/Reals/RIneq/Ropp_eq_0_compat.con
+cic:/Coq/Reals/RIneq/Ropp_eq_compat.con
+cic:/Coq/Reals/RIneq/Ropp_ge_le_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_gt_lt_0_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_gt_lt_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_inv_permute.con
+cic:/Coq/Reals/RIneq/Ropp_involutive.con
+cic:/Coq/Reals/RIneq/Ropp_le_cancel.con
+cic:/Coq/Reals/RIneq/Ropp_le_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_le_ge_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_lt_cancel.con
+cic:/Coq/Reals/RIneq/Ropp_lt_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_lt_gt_0_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_lt_gt_contravar.con
+cic:/Coq/Reals/RIneq/Ropp_minus_distr'.con
+cic:/Coq/Reals/RIneq/Ropp_minus_distr.con
+cic:/Coq/Reals/RIneq/Ropp_mult_distr_l_reverse.con
+cic:/Coq/Reals/RIneq/Ropp_mult_distr_r_reverse.con
+cic:/Coq/Reals/RIneq/Ropp_neq_0_compat.con
+cic:/Coq/Reals/RIneq/Ropp_plus_distr.con
+cic:/Coq/Reals/RIneq/Rplus_0_r.con
+cic:/Coq/Reals/RIneq/Rplus_0_r_uniq.con
+cic:/Coq/Reals/RIneq/Rplus_eq_0_l.con
+cic:/Coq/Reals/RIneq/Rplus_eq_R0.con
+cic:/Coq/Reals/RIneq/Rplus_eq_compat_l.con
+cic:/Coq/Reals/RIneq/Rplus_eq_reg_l.con
+cic:/Coq/Reals/RIneq/Rplus_ge_compat_l.con
+cic:/Coq/Reals/RIneq/Rplus_ge_reg_l.con
+cic:/Coq/Reals/RIneq/Rplus_gt_compat_l.con
+cic:/Coq/Reals/RIneq/Rplus_gt_reg_l.con
+cic:/Coq/Reals/RIneq/Rplus_le_compat.con
+cic:/Coq/Reals/RIneq/Rplus_le_compat_l.con
+cic:/Coq/Reals/RIneq/Rplus_le_compat_r.con
+cic:/Coq/Reals/RIneq/Rplus_le_le_0_compat.con
+cic:/Coq/Reals/RIneq/Rplus_le_lt_0_compat.con
+cic:/Coq/Reals/RIneq/Rplus_le_lt_compat.con
+cic:/Coq/Reals/RIneq/Rplus_le_reg_l.con
+cic:/Coq/Reals/RIneq/Rplus_lt_0_compat.con
+cic:/Coq/Reals/RIneq/Rplus_lt_compat.con
+cic:/Coq/Reals/RIneq/Rplus_lt_compat_r.con
+cic:/Coq/Reals/RIneq/Rplus_lt_le_0_compat.con
+cic:/Coq/Reals/RIneq/Rplus_lt_le_compat.con
+cic:/Coq/Reals/RIneq/Rplus_lt_reg_r.con
+cic:/Coq/Reals/RIneq/Rplus_minus.con
+cic:/Coq/Reals/RIneq/Rplus_ne.con
+cic:/Coq/Reals/RIneq/Rplus_opp_l.con
+cic:/Coq/Reals/RIneq/Rplus_opp_r_uniq.con
+cic:/Coq/Reals/RIneq/Rplus_sqr_eq_0.con
+cic:/Coq/Reals/RIneq/Rplus_sqr_eq_0_l.con
+cic:/Coq/Reals/RIneq/Rsqr.con
+cic:/Coq/Reals/RIneq/Rsqr_0.con
+cic:/Coq/Reals/RIneq/Rsqr_0_uniq.con
+cic:/Coq/Reals/RIneq/Rtotal_order.con
+cic:/Coq/Reals/RIneq/S_INR.con
+cic:/Coq/Reals/RIneq/S_O_plus_INR.con
+cic:/Coq/Reals/RIneq/Z_R_minus.con
+cic:/Coq/Reals/RIneq/completeness_weak.con
+cic:/Coq/Reals/RIneq/cond_neg.con
+cic:/Coq/Reals/RIneq/cond_nonneg.con
+cic:/Coq/Reals/RIneq/cond_nonpos.con
+cic:/Coq/Reals/RIneq/cond_nonzero.con
+cic:/Coq/Reals/RIneq/cond_pos.con
+cic:/Coq/Reals/RIneq/double.con
+cic:/Coq/Reals/RIneq/double_var.con
+cic:/Coq/Reals/RIneq/eq_IZR.con
+cic:/Coq/Reals/RIneq/eq_IZR_R0.con
+cic:/Coq/Reals/RIneq/inser_trans_R.con
+cic:/Coq/Reals/RIneq/le_INR.con
+cic:/Coq/Reals/RIneq/le_IZR.con
+cic:/Coq/Reals/RIneq/le_IZR_R1.con
+cic:/Coq/Reals/RIneq/le_O_IZR.con
+cic:/Coq/Reals/RIneq/le_epsilon.con
+cic:/Coq/Reals/RIneq/lt_INR.con
+cic:/Coq/Reals/RIneq/lt_INR_0.con
+cic:/Coq/Reals/RIneq/lt_IZR.con
+cic:/Coq/Reals/RIneq/lt_O_IZR.con
+cic:/Coq/Reals/RIneq/minus_INR.con
+cic:/Coq/Reals/RIneq/minus_Rge.con
+cic:/Coq/Reals/RIneq/minus_Rgt.con
+cic:/Coq/Reals/RIneq/mult_INR.con
+cic:/Coq/Reals/RIneq/mult_IZR.con
+cic:/Coq/Reals/RIneq/neg.con
+cic:/Coq/Reals/RIneq/negreal_ind.con
+cic:/Coq/Reals/RIneq/negreal_rec.con
+cic:/Coq/Reals/RIneq/negreal_rect.con
+cic:/Coq/Reals/RIneq/nonneg.con
+cic:/Coq/Reals/RIneq/nonnegreal_ind.con
+cic:/Coq/Reals/RIneq/nonnegreal_rec.con
+cic:/Coq/Reals/RIneq/nonnegreal_rect.con
+cic:/Coq/Reals/RIneq/nonpos.con
+cic:/Coq/Reals/RIneq/nonposreal_ind.con
+cic:/Coq/Reals/RIneq/nonposreal_rec.con
+cic:/Coq/Reals/RIneq/nonposreal_rect.con
+cic:/Coq/Reals/RIneq/nonzero.con
+cic:/Coq/Reals/RIneq/nonzeroreal_ind.con
+cic:/Coq/Reals/RIneq/nonzeroreal_rec.con
+cic:/Coq/Reals/RIneq/nonzeroreal_rect.con
+cic:/Coq/Reals/RIneq/not_1_INR.con
+cic:/Coq/Reals/RIneq/not_INR_O.con
+cic:/Coq/Reals/RIneq/not_O_INR.con
+cic:/Coq/Reals/RIneq/not_O_IZR.con
+cic:/Coq/Reals/RIneq/not_nm_INR.con
+cic:/Coq/Reals/RIneq/one_IZR_lt1.con
+cic:/Coq/Reals/RIneq/one_IZR_r_R1.con
+cic:/Coq/Reals/RIneq/one_IZR_r_R1_subproof.con
+cic:/Coq/Reals/RIneq/plus_INR.con
+cic:/Coq/Reals/RIneq/plus_IZR.con
+cic:/Coq/Reals/RIneq/plus_IZR_NEG_POS.con
+cic:/Coq/Reals/RIneq/plus_le_is_le.con
+cic:/Coq/Reals/RIneq/plus_lt_is_lt.con
+cic:/Coq/Reals/RIneq/pos.con
+cic:/Coq/Reals/RIneq/pos_INR.con
+cic:/Coq/Reals/RIneq/posreal_ind.con
+cic:/Coq/Reals/RIneq/posreal_rec.con
+cic:/Coq/Reals/RIneq/posreal_rect.con
+cic:/Coq/Reals/RIneq/prod_neq_R0.con
+cic:/Coq/Reals/RIneq/single_z_r_R1.con
+cic:/Coq/Reals/RIneq/sum_inequa_Rle_lt.con
+cic:/Coq/Reals/RIneq/tech_Rgt_minus.con
+cic:/Coq/Reals/RIneq/tech_Rplus.con
+cic:/Coq/Reals/RIneq/tech_single_z_r_R1.con
+cic:/Coq/Reals/RList/AbsList.con
+cic:/Coq/Reals/RList/AbsList_P1.con
+cic:/Coq/Reals/RList/AbsList_P2.con
+cic:/Coq/Reals/RList/FF.con
+cic:/Coq/Reals/RList/In.con
+cic:/Coq/Reals/RList/MaxRlist.con
+cic:/Coq/Reals/RList/MaxRlist_P1.con
+cic:/Coq/Reals/RList/MaxRlist_P2.con
+cic:/Coq/Reals/RList/MinRlist.con
+cic:/Coq/Reals/RList/MinRlist_P1.con
+cic:/Coq/Reals/RList/MinRlist_P2.con
+cic:/Coq/Reals/RList/RList_P0.con
+cic:/Coq/Reals/RList/RList_P1.con
+cic:/Coq/Reals/RList/RList_P10.con
+cic:/Coq/Reals/RList/RList_P11.con
+cic:/Coq/Reals/RList/RList_P12.con
+cic:/Coq/Reals/RList/RList_P13.con
+cic:/Coq/Reals/RList/RList_P14.con
+cic:/Coq/Reals/RList/RList_P15.con
+cic:/Coq/Reals/RList/RList_P16.con
+cic:/Coq/Reals/RList/RList_P17.con
+cic:/Coq/Reals/RList/RList_P18.con
+cic:/Coq/Reals/RList/RList_P19.con
+cic:/Coq/Reals/RList/RList_P2.con
+cic:/Coq/Reals/RList/RList_P20.con
+cic:/Coq/Reals/RList/RList_P21.con
+cic:/Coq/Reals/RList/RList_P22.con
+cic:/Coq/Reals/RList/RList_P23.con
+cic:/Coq/Reals/RList/RList_P24.con
+cic:/Coq/Reals/RList/RList_P25.con
+cic:/Coq/Reals/RList/RList_P26.con
+cic:/Coq/Reals/RList/RList_P27.con
+cic:/Coq/Reals/RList/RList_P28.con
+cic:/Coq/Reals/RList/RList_P29.con
+cic:/Coq/Reals/RList/RList_P3.con
+cic:/Coq/Reals/RList/RList_P4.con
+cic:/Coq/Reals/RList/RList_P5.con
+cic:/Coq/Reals/RList/RList_P6.con
+cic:/Coq/Reals/RList/RList_P7.con
+cic:/Coq/Reals/RList/RList_P8.con
+cic:/Coq/Reals/RList/RList_P9.con
+cic:/Coq/Reals/RList/Rlength.con
+cic:/Coq/Reals/RList/Rlist_P1.con
+cic:/Coq/Reals/RList/Rlist_ind.con
+cic:/Coq/Reals/RList/Rlist_rec.con
+cic:/Coq/Reals/RList/Rlist_rect.con
+cic:/Coq/Reals/RList/Rtail.con
+cic:/Coq/Reals/RList/app_Rlist.con
+cic:/Coq/Reals/RList/cons_ORlist.con
+cic:/Coq/Reals/RList/cons_Rlist.con
+cic:/Coq/Reals/RList/insert.con
+cic:/Coq/Reals/RList/mid_Rlist.con
+cic:/Coq/Reals/RList/ordered_Rlist.con
+cic:/Coq/Reals/RList/pos_Rl.con
+cic:/Coq/Reals/RList/pos_Rl_P1.con
+cic:/Coq/Reals/RList/pos_Rl_P2.con
+cic:/Coq/Reals/R_Ifp/Int_part.con
+cic:/Coq/Reals/R_Ifp/Int_part_INR.con
+cic:/Coq/Reals/R_Ifp/R0_fp_O.con
+cic:/Coq/Reals/R_Ifp/Rminus_Int_part1.con
+cic:/Coq/Reals/R_Ifp/Rminus_Int_part2.con
+cic:/Coq/Reals/R_Ifp/Rminus_fp1.con
+cic:/Coq/Reals/R_Ifp/Rminus_fp2.con
+cic:/Coq/Reals/R_Ifp/base_Int_part.con
+cic:/Coq/Reals/R_Ifp/base_fp.con
+cic:/Coq/Reals/R_Ifp/for_base_fp.con
+cic:/Coq/Reals/R_Ifp/fp_R0.con
+cic:/Coq/Reals/R_Ifp/fp_nat.con
+cic:/Coq/Reals/R_Ifp/frac_part.con
+cic:/Coq/Reals/R_Ifp/plus_Int_part1.con
+cic:/Coq/Reals/R_Ifp/plus_Int_part2.con
+cic:/Coq/Reals/R_Ifp/plus_frac_part1.con
+cic:/Coq/Reals/R_Ifp/plus_frac_part2.con
+cic:/Coq/Reals/R_Ifp/tech_up.con
+cic:/Coq/Reals/R_Ifp/up_tech.con
+cic:/Coq/Reals/R_sqr/Rsqr_1.con
+cic:/Coq/Reals/R_sqr/Rsqr_abs.con
+cic:/Coq/Reals/R_sqr/Rsqr_div.con
+cic:/Coq/Reals/R_sqr/Rsqr_eq.con
+cic:/Coq/Reals/R_sqr/Rsqr_eq_0.con
+cic:/Coq/Reals/R_sqr/Rsqr_eq_abs_0.con
+cic:/Coq/Reals/R_sqr/Rsqr_eq_asb_1.con
+cic:/Coq/Reals/R_sqr/Rsqr_gt_0_0.con
+cic:/Coq/Reals/R_sqr/Rsqr_incr_0.con
+cic:/Coq/Reals/R_sqr/Rsqr_incr_0_var.con
+cic:/Coq/Reals/R_sqr/Rsqr_incr_1.con
+cic:/Coq/Reals/R_sqr/Rsqr_incrst_0.con
+cic:/Coq/Reals/R_sqr/Rsqr_incrst_1.con
+cic:/Coq/Reals/R_sqr/Rsqr_inj.con
+cic:/Coq/Reals/R_sqr/Rsqr_inv.con
+cic:/Coq/Reals/R_sqr/Rsqr_le_abs_0.con
+cic:/Coq/Reals/R_sqr/Rsqr_le_abs_1.con
+cic:/Coq/Reals/R_sqr/Rsqr_lt_abs_0.con
+cic:/Coq/Reals/R_sqr/Rsqr_lt_abs_1.con
+cic:/Coq/Reals/R_sqr/Rsqr_minus.con
+cic:/Coq/Reals/R_sqr/Rsqr_minus_plus.con
+cic:/Coq/Reals/R_sqr/Rsqr_mult.con
+cic:/Coq/Reals/R_sqr/Rsqr_neg.con
+cic:/Coq/Reals/R_sqr/Rsqr_neg_minus.con
+cic:/Coq/Reals/R_sqr/Rsqr_neg_pos_le_0.con
+cic:/Coq/Reals/R_sqr/Rsqr_neg_pos_le_1.con
+cic:/Coq/Reals/R_sqr/Rsqr_plus.con
+cic:/Coq/Reals/R_sqr/Rsqr_plus_minus.con
+cic:/Coq/Reals/R_sqr/Rsqr_pos_lt.con
+cic:/Coq/Reals/R_sqr/canonical_Rsqr.con
+cic:/Coq/Reals/R_sqr/neg_pos_Rsqr_le.con
+cic:/Coq/Reals/R_sqr/triangle_rectangle.con
+cic:/Coq/Reals/R_sqr/triangle_rectangle_le.con
+cic:/Coq/Reals/R_sqr/triangle_rectangle_lt.con
+cic:/Coq/Reals/R_sqrt/Delta.con
+cic:/Coq/Reals/R_sqrt/Delta_is_pos.con
+cic:/Coq/Reals/R_sqrt/Rsqr_sol_eq_0_0.con
+cic:/Coq/Reals/R_sqrt/Rsqr_sol_eq_0_1.con
+cic:/Coq/Reals/R_sqrt/Rsqr_sqrt.con
+cic:/Coq/Reals/R_sqrt/sol_x1.con
+cic:/Coq/Reals/R_sqrt/sol_x2.con
+cic:/Coq/Reals/R_sqrt/sqrt.con
+cic:/Coq/Reals/R_sqrt/sqrt_0.con
+cic:/Coq/Reals/R_sqrt/sqrt_1.con
+cic:/Coq/Reals/R_sqrt/sqrt_Rsqr.con
+cic:/Coq/Reals/R_sqrt/sqrt_Rsqr_abs.con
+cic:/Coq/Reals/R_sqrt/sqrt_cauchy.con
+cic:/Coq/Reals/R_sqrt/sqrt_def.con
+cic:/Coq/Reals/R_sqrt/sqrt_div.con
+cic:/Coq/Reals/R_sqrt/sqrt_eq_0.con
+cic:/Coq/Reals/R_sqrt/sqrt_inj.con
+cic:/Coq/Reals/R_sqrt/sqrt_le_0.con
+cic:/Coq/Reals/R_sqrt/sqrt_le_1.con
+cic:/Coq/Reals/R_sqrt/sqrt_lem_0.con
+cic:/Coq/Reals/R_sqrt/sqrt_less.con
+cic:/Coq/Reals/R_sqrt/sqrt_lt_0.con
+cic:/Coq/Reals/R_sqrt/sqrt_lt_1.con
+cic:/Coq/Reals/R_sqrt/sqrt_lt_R0.con
+cic:/Coq/Reals/R_sqrt/sqrt_more.con
+cic:/Coq/Reals/R_sqrt/sqrt_mult.con
+cic:/Coq/Reals/R_sqrt/sqrt_positivity.con
+cic:/Coq/Reals/R_sqrt/sqrt_sqrt.con
+cic:/Coq/Reals/R_sqrt/sqrt_square.con
+cic:/Coq/Reals/R_sqrt/sqtr_lem_1.con
+cic:/Coq/Reals/Raxioms/INR.con
+cic:/Coq/Reals/Raxioms/IZR.con
+cic:/Coq/Reals/Raxioms/R1_neq_R0.con
+cic:/Coq/Reals/Raxioms/Rinv_l.con
+cic:/Coq/Reals/Raxioms/Rlt_asym.con
+cic:/Coq/Reals/Raxioms/Rlt_trans.con
+cic:/Coq/Reals/Raxioms/Rmult_1_l.con
+cic:/Coq/Reals/Raxioms/Rmult_assoc.con
+cic:/Coq/Reals/Raxioms/Rmult_comm.con
+cic:/Coq/Reals/Raxioms/Rmult_lt_compat_l.con
+cic:/Coq/Reals/Raxioms/Rmult_plus_distr_l.con
+cic:/Coq/Reals/Raxioms/Rplus_0_l.con
+cic:/Coq/Reals/Raxioms/Rplus_assoc.con
+cic:/Coq/Reals/Raxioms/Rplus_comm.con
+cic:/Coq/Reals/Raxioms/Rplus_lt_compat_l.con
+cic:/Coq/Reals/Raxioms/Rplus_opp_r.con
+cic:/Coq/Reals/Raxioms/archimed.con
+cic:/Coq/Reals/Raxioms/bound.con
+cic:/Coq/Reals/Raxioms/completeness.con
+cic:/Coq/Reals/Raxioms/is_lub.con
+cic:/Coq/Reals/Raxioms/is_upper_bound.con
+cic:/Coq/Reals/Raxioms/total_order_T.con
+cic:/Coq/Reals/Rbasic_fun/RRle_abs.con
+cic:/Coq/Reals/Rbasic_fun/RRle_abs_subproof.con
+cic:/Coq/Reals/Rbasic_fun/RRle_abs_subproof0.con
+cic:/Coq/Reals/Rbasic_fun/Rabs.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_R0.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_R1.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_Rabsolu.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_Rinv.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_Ropp.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_Zabs.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_def1.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_def2.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_left.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_left1.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_minus_sym.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_mult.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_no_R0.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_pos.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_pos_eq.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_pos_lt.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_right.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_triang.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_triang_inv.con
+cic:/Coq/Reals/Rbasic_fun/Rabs_triang_inv2.con
+cic:/Coq/Reals/Rbasic_fun/Rcase_abs.con
+cic:/Coq/Reals/Rbasic_fun/Rmax.con
+cic:/Coq/Reals/Rbasic_fun/RmaxAbs.con
+cic:/Coq/Reals/Rbasic_fun/RmaxLess1.con
+cic:/Coq/Reals/Rbasic_fun/RmaxLess2.con
+cic:/Coq/Reals/Rbasic_fun/RmaxRmult.con
+cic:/Coq/Reals/Rbasic_fun/RmaxSym.con
+cic:/Coq/Reals/Rbasic_fun/Rmax_Rle.con
+cic:/Coq/Reals/Rbasic_fun/Rmax_stable_in_negreal.con
+cic:/Coq/Reals/Rbasic_fun/Rmin.con
+cic:/Coq/Reals/Rbasic_fun/Rmin_Rgt.con
+cic:/Coq/Reals/Rbasic_fun/Rmin_Rgt_l.con
+cic:/Coq/Reals/Rbasic_fun/Rmin_Rgt_r.con
+cic:/Coq/Reals/Rbasic_fun/Rmin_comm.con
+cic:/Coq/Reals/Rbasic_fun/Rmin_l.con
+cic:/Coq/Reals/Rbasic_fun/Rmin_r.con
+cic:/Coq/Reals/Rbasic_fun/Rmin_stable_in_posreal.con
+cic:/Coq/Reals/Rcomplete/R_complete.con
+cic:/Coq/Reals/Rdefinitions/R.con
+cic:/Coq/Reals/Rdefinitions/R0.con
+cic:/Coq/Reals/Rdefinitions/R1.con
+cic:/Coq/Reals/Rdefinitions/Rdiv.con
+cic:/Coq/Reals/Rdefinitions/Rge.con
+cic:/Coq/Reals/Rdefinitions/Rgt.con
+cic:/Coq/Reals/Rdefinitions/Rinv.con
+cic:/Coq/Reals/Rdefinitions/Rle.con
+cic:/Coq/Reals/Rdefinitions/Rlt.con
+cic:/Coq/Reals/Rdefinitions/Rminus.con
+cic:/Coq/Reals/Rdefinitions/Rmult.con
+cic:/Coq/Reals/Rdefinitions/Ropp.con
+cic:/Coq/Reals/Rdefinitions/Rplus.con
+cic:/Coq/Reals/Rdefinitions/up.con
+cic:/Coq/Reals/Rderiv/D_in.con
+cic:/Coq/Reals/Rderiv/D_pow_n.con
+cic:/Coq/Reals/Rderiv/D_x.con
+cic:/Coq/Reals/Rderiv/Dadd.con
+cic:/Coq/Reals/Rderiv/Dcomp.con
+cic:/Coq/Reals/Rderiv/Dconst.con
+cic:/Coq/Reals/Rderiv/Dminus.con
+cic:/Coq/Reals/Rderiv/Dmult.con
+cic:/Coq/Reals/Rderiv/Dmult_const.con
+cic:/Coq/Reals/Rderiv/Dopp.con
+cic:/Coq/Reals/Rderiv/Dx.con
+cic:/Coq/Reals/Rderiv/Dx_pow_n.con
+cic:/Coq/Reals/Rderiv/cont_deriv.con
+cic:/Coq/Reals/Rderiv/cont_deriv_subproof.con
+cic:/Coq/Reals/Rderiv/cont_deriv_subproof0.con
+cic:/Coq/Reals/Rderiv/continue_in.con
+cic:/Coq/Reals/Rfunctions/GP_finite.con
+cic:/Coq/Reals/Rfunctions/INR_fact_neq_0.con
+cic:/Coq/Reals/Rfunctions/Pow_x_infinity.con
+cic:/Coq/Reals/Rfunctions/Power_monotonic.con
+cic:/Coq/Reals/Rfunctions/RPow_abs.con
+cic:/Coq/Reals/Rfunctions/R_dist.con
+cic:/Coq/Reals/Rfunctions/R_dist_eq.con
+cic:/Coq/Reals/Rfunctions/R_dist_plus.con
+cic:/Coq/Reals/Rfunctions/R_dist_pos.con
+cic:/Coq/Reals/Rfunctions/R_dist_refl.con
+cic:/Coq/Reals/Rfunctions/R_dist_sym.con
+cic:/Coq/Reals/Rfunctions/R_dist_tri.con
+cic:/Coq/Reals/Rfunctions/Rinv_pow.con
+cic:/Coq/Reals/Rfunctions/Rle_pow.con
+cic:/Coq/Reals/Rfunctions/Rlt_pow.con
+cic:/Coq/Reals/Rfunctions/Rlt_pow_R1.con
+cic:/Coq/Reals/Rfunctions/Zpower_NR0.con
+cic:/Coq/Reals/Rfunctions/Zpower_nat_powerRZ.con
+cic:/Coq/Reals/Rfunctions/Zpower_nat_powerRZ_absolu.con
+cic:/Coq/Reals/Rfunctions/decimal_exp.con
+cic:/Coq/Reals/Rfunctions/fact_simpl.con
+cic:/Coq/Reals/Rfunctions/infinit_sum.con
+cic:/Coq/Reals/Rfunctions/poly.con
+cic:/Coq/Reals/Rfunctions/pow.con
+cic:/Coq/Reals/Rfunctions/pow1.con
+cic:/Coq/Reals/Rfunctions/pow_1.con
+cic:/Coq/Reals/Rfunctions/pow_1_abs.con
+cic:/Coq/Reals/Rfunctions/pow_1_even.con
+cic:/Coq/Reals/Rfunctions/pow_1_odd.con
+cic:/Coq/Reals/Rfunctions/pow_O.con
+cic:/Coq/Reals/Rfunctions/pow_R1.con
+cic:/Coq/Reals/Rfunctions/pow_R1_Rle.con
+cic:/Coq/Reals/Rfunctions/pow_RN_plus.con
+cic:/Coq/Reals/Rfunctions/pow_Rabs.con
+cic:/Coq/Reals/Rfunctions/pow_Rsqr.con
+cic:/Coq/Reals/Rfunctions/pow_add.con
+cic:/Coq/Reals/Rfunctions/pow_incr.con
+cic:/Coq/Reals/Rfunctions/pow_le.con
+cic:/Coq/Reals/Rfunctions/pow_lt.con
+cic:/Coq/Reals/Rfunctions/pow_lt_1_zero.con
+cic:/Coq/Reals/Rfunctions/pow_maj_Rabs.con
+cic:/Coq/Reals/Rfunctions/pow_mult.con
+cic:/Coq/Reals/Rfunctions/pow_ne_zero.con
+cic:/Coq/Reals/Rfunctions/pow_nonzero.con
+cic:/Coq/Reals/Rfunctions/powerRZ.con
+cic:/Coq/Reals/Rfunctions/powerRZ_1.con
+cic:/Coq/Reals/Rfunctions/powerRZ_NOR.con
+cic:/Coq/Reals/Rfunctions/powerRZ_O.con
+cic:/Coq/Reals/Rfunctions/powerRZ_R1.con
+cic:/Coq/Reals/Rfunctions/powerRZ_add.con
+cic:/Coq/Reals/Rfunctions/powerRZ_le.con
+cic:/Coq/Reals/Rfunctions/powerRZ_lt.con
+cic:/Coq/Reals/Rfunctions/simpl_fact.con
+cic:/Coq/Reals/Rfunctions/sum_f.con
+cic:/Coq/Reals/Rfunctions/sum_f_R0.con
+cic:/Coq/Reals/Rfunctions/sum_f_R0_triangle.con
+cic:/Coq/Reals/Rfunctions/sum_nat.con
+cic:/Coq/Reals/Rfunctions/sum_nat_O.con
+cic:/Coq/Reals/Rfunctions/sum_nat_f.con
+cic:/Coq/Reals/Rfunctions/sum_nat_f_O.con
+cic:/Coq/Reals/Rfunctions/tech_pow_Rmult.con
+cic:/Coq/Reals/Rfunctions/tech_pow_Rplus.con
+cic:/Coq/Reals/Rlimit/Base.con
+cic:/Coq/Reals/Rlimit/Dgf.con
+cic:/Coq/Reals/Rlimit/Metric_Space_ind.con
+cic:/Coq/Reals/Rlimit/Metric_Space_rec.con
+cic:/Coq/Reals/Rlimit/Metric_Space_rect.con
+cic:/Coq/Reals/Rlimit/R_met.con
+cic:/Coq/Reals/Rlimit/Rlt_eps2_eps.con
+cic:/Coq/Reals/Rlimit/Rlt_eps2_eps_subproof.con
+cic:/Coq/Reals/Rlimit/Rlt_eps2_eps_subproof0.con
+cic:/Coq/Reals/Rlimit/Rlt_eps4_eps.con
+cic:/Coq/Reals/Rlimit/Rlt_eps4_eps_subproof.con
+cic:/Coq/Reals/Rlimit/Rlt_eps4_eps_subproof0.con
+cic:/Coq/Reals/Rlimit/Rlt_eps4_eps_subproof1.con
+cic:/Coq/Reals/Rlimit/adhDa.con
+cic:/Coq/Reals/Rlimit/dist.con
+cic:/Coq/Reals/Rlimit/dist_pos.con
+cic:/Coq/Reals/Rlimit/dist_refl.con
+cic:/Coq/Reals/Rlimit/dist_sym.con
+cic:/Coq/Reals/Rlimit/dist_tri.con
+cic:/Coq/Reals/Rlimit/eps2.con
+cic:/Coq/Reals/Rlimit/eps2_Rgt_R0.con
+cic:/Coq/Reals/Rlimit/eps2_Rgt_R0_subproof.con
+cic:/Coq/Reals/Rlimit/eps4.con
+cic:/Coq/Reals/Rlimit/lim_x.con
+cic:/Coq/Reals/Rlimit/limit1_in.con
+cic:/Coq/Reals/Rlimit/limit_Ropp.con
+cic:/Coq/Reals/Rlimit/limit_comp.con
+cic:/Coq/Reals/Rlimit/limit_free.con
+cic:/Coq/Reals/Rlimit/limit_in.con
+cic:/Coq/Reals/Rlimit/limit_inv.con
+cic:/Coq/Reals/Rlimit/limit_minus.con
+cic:/Coq/Reals/Rlimit/limit_mul.con
+cic:/Coq/Reals/Rlimit/limit_plus.con
+cic:/Coq/Reals/Rlimit/mul_factor.con
+cic:/Coq/Reals/Rlimit/mul_factor_gt.con
+cic:/Coq/Reals/Rlimit/mul_factor_gt_f.con
+cic:/Coq/Reals/Rlimit/mul_factor_wd.con
+cic:/Coq/Reals/Rlimit/prop_eps.con
+cic:/Coq/Reals/Rlimit/single_limit.con
+cic:/Coq/Reals/Rlimit/tech_limit.con
+cic:/Coq/Reals/Rlimit/tech_limit_contr.con
+cic:/Coq/Reals/Rpower/D_in_ext.con
+cic:/Coq/Reals/Rpower/D_in_imp.con
+cic:/Coq/Reals/Rpower/P_Rmin.con
+cic:/Coq/Reals/Rpower/Rinv_Rdiv.con
+cic:/Coq/Reals/Rpower/Rle_Rpower.con
+cic:/Coq/Reals/Rpower/Rln.con
+cic:/Coq/Reals/Rpower/Rpower.con
+cic:/Coq/Reals/Rpower/Rpower_1.con
+cic:/Coq/Reals/Rpower/Rpower_O.con
+cic:/Coq/Reals/Rpower/Rpower_Ropp.con
+cic:/Coq/Reals/Rpower/Rpower_lt.con
+cic:/Coq/Reals/Rpower/Rpower_plus.con
+cic:/Coq/Reals/Rpower/derivable_pt_lim_ln.con
+cic:/Coq/Reals/Rpower/exp_Ropp.con
+cic:/Coq/Reals/Rpower/exp_increasing.con
+cic:/Coq/Reals/Rpower/exp_ineq1.con
+cic:/Coq/Reals/Rpower/exp_inv.con
+cic:/Coq/Reals/Rpower/exp_le_3.con
+cic:/Coq/Reals/Rpower/exp_ln.con
+cic:/Coq/Reals/Rpower/exp_lt_inv.con
+cic:/Coq/Reals/Rpower/limit1_ext.con
+cic:/Coq/Reals/Rpower/limit1_imp.con
+cic:/Coq/Reals/Rpower/ln.con
+cic:/Coq/Reals/Rpower/ln_1.con
+cic:/Coq/Reals/Rpower/ln_Rinv.con
+cic:/Coq/Reals/Rpower/ln_continue.con
+cic:/Coq/Reals/Rpower/ln_exists.con
+cic:/Coq/Reals/Rpower/ln_exists1.con
+cic:/Coq/Reals/Rpower/ln_exp.con
+cic:/Coq/Reals/Rpower/ln_increasing.con
+cic:/Coq/Reals/Rpower/ln_inv.con
+cic:/Coq/Reals/Rpower/ln_lt_2.con
+cic:/Coq/Reals/Rpower/ln_lt_inv.con
+cic:/Coq/Reals/Rpower/ln_mult.con
+cic:/Coq/Reals/Rprod/C_maj.con
+cic:/Coq/Reals/Rprod/INR_fact_lt_0.con
+cic:/Coq/Reals/Rprod/RfactN_fact2N_factk.con
+cic:/Coq/Reals/Rprod/fact_prodSO.con
+cic:/Coq/Reals/Rprod/le_n_2n.con
+cic:/Coq/Reals/Rprod/prod_SO_Rle.con
+cic:/Coq/Reals/Rprod/prod_SO_pos.con
+cic:/Coq/Reals/Rprod/prod_SO_split.con
+cic:/Coq/Reals/Rprod/prod_f_SO.con
+cic:/Coq/Reals/Rseries/Cauchy_crit.con
+cic:/Coq/Reals/Rseries/EUn.con
+cic:/Coq/Reals/Rseries/EUn_noempty.con
+cic:/Coq/Reals/Rseries/GP_infinite.con
+cic:/Coq/Reals/Rseries/Pser.con
+cic:/Coq/Reals/Rseries/Rmax_N.con
+cic:/Coq/Reals/Rseries/Un_bound_imp.con
+cic:/Coq/Reals/Rseries/Un_cv.con
+cic:/Coq/Reals/Rseries/Un_cv_crit.con
+cic:/Coq/Reals/Rseries/Un_growing.con
+cic:/Coq/Reals/Rseries/Un_in_EUn.con
+cic:/Coq/Reals/Rseries/cauchy_bound.con
+cic:/Coq/Reals/Rseries/finite_greater.con
+cic:/Coq/Reals/Rseries/growing_prop.con
+cic:/Coq/Reals/Rsigma/sigma.con
+cic:/Coq/Reals/Rsigma/sigma_diff.con
+cic:/Coq/Reals/Rsigma/sigma_diff_neg.con
+cic:/Coq/Reals/Rsigma/sigma_eq_arg.con
+cic:/Coq/Reals/Rsigma/sigma_first.con
+cic:/Coq/Reals/Rsigma/sigma_last.con
+cic:/Coq/Reals/Rsigma/sigma_split.con
+cic:/Coq/Reals/Rsqrt_def/Dichotomy_lb.con
+cic:/Coq/Reals/Rsqrt_def/Dichotomy_ub.con
+cic:/Coq/Reals/Rsqrt_def/IVT.con
+cic:/Coq/Reals/Rsqrt_def/IVT_cor.con
+cic:/Coq/Reals/Rsqrt_def/Rsqrt.con
+cic:/Coq/Reals/Rsqrt_def/Rsqrt_Rsqrt.con
+cic:/Coq/Reals/Rsqrt_def/Rsqrt_exists.con
+cic:/Coq/Reals/Rsqrt_def/Rsqrt_positivity.con
+cic:/Coq/Reals/Rsqrt_def/cond_positivity.con
+cic:/Coq/Reals/Rsqrt_def/continuity_seq.con
+cic:/Coq/Reals/Rsqrt_def/cv_dicho.con
+cic:/Coq/Reals/Rsqrt_def/dicho_comp.con
+cic:/Coq/Reals/Rsqrt_def/dicho_lb.con
+cic:/Coq/Reals/Rsqrt_def/dicho_lb_car.con
+cic:/Coq/Reals/Rsqrt_def/dicho_lb_cv.con
+cic:/Coq/Reals/Rsqrt_def/dicho_lb_dicho_up.con
+cic:/Coq/Reals/Rsqrt_def/dicho_lb_growing.con
+cic:/Coq/Reals/Rsqrt_def/dicho_lb_maj.con
+cic:/Coq/Reals/Rsqrt_def/dicho_lb_maj_y.con
+cic:/Coq/Reals/Rsqrt_def/dicho_up.con
+cic:/Coq/Reals/Rsqrt_def/dicho_up_car.con
+cic:/Coq/Reals/Rsqrt_def/dicho_up_cv.con
+cic:/Coq/Reals/Rsqrt_def/dicho_up_decreasing.con
+cic:/Coq/Reals/Rsqrt_def/dicho_up_min.con
+cic:/Coq/Reals/Rsqrt_def/dicho_up_min_x.con
+cic:/Coq/Reals/Rsqrt_def/pow_2_n.con
+cic:/Coq/Reals/Rsqrt_def/pow_2_n_growing.con
+cic:/Coq/Reals/Rsqrt_def/pow_2_n_infty.con
+cic:/Coq/Reals/Rsqrt_def/pow_2_n_neq_R0.con
+cic:/Coq/Reals/Rtopology/Bolzano_Weierstrass.con
+cic:/Coq/Reals/Rtopology/Heine.con
+cic:/Coq/Reals/Rtopology/Rlt_Rminus.con
+cic:/Coq/Reals/Rtopology/Rsepare.con
+cic:/Coq/Reals/Rtopology/ValAdh.con
+cic:/Coq/Reals/Rtopology/ValAdh_un.con
+cic:/Coq/Reals/Rtopology/ValAdh_un_exists.con
+cic:/Coq/Reals/Rtopology/ValAdh_un_prop.con
+cic:/Coq/Reals/Rtopology/adherence.con
+cic:/Coq/Reals/Rtopology/adherence_P1.con
+cic:/Coq/Reals/Rtopology/adherence_P2.con
+cic:/Coq/Reals/Rtopology/adherence_P3.con
+cic:/Coq/Reals/Rtopology/adherence_P4.con
+cic:/Coq/Reals/Rtopology/bounded.con
+cic:/Coq/Reals/Rtopology/closed_set.con
+cic:/Coq/Reals/Rtopology/closed_set_P1.con
+cic:/Coq/Reals/Rtopology/compact.con
+cic:/Coq/Reals/Rtopology/compact_EMP.con
+cic:/Coq/Reals/Rtopology/compact_P1.con
+cic:/Coq/Reals/Rtopology/compact_P2.con
+cic:/Coq/Reals/Rtopology/compact_P3.con
+cic:/Coq/Reals/Rtopology/compact_P4.con
+cic:/Coq/Reals/Rtopology/compact_P5.con
+cic:/Coq/Reals/Rtopology/compact_P6.con
+cic:/Coq/Reals/Rtopology/compact_carac.con
+cic:/Coq/Reals/Rtopology/compact_eqDom.con
+cic:/Coq/Reals/Rtopology/complementary.con
+cic:/Coq/Reals/Rtopology/complementary_P1.con
+cic:/Coq/Reals/Rtopology/cond_fam.con
+cic:/Coq/Reals/Rtopology/continuity_P1.con
+cic:/Coq/Reals/Rtopology/continuity_P2.con
+cic:/Coq/Reals/Rtopology/continuity_P3.con
+cic:/Coq/Reals/Rtopology/continuity_ab_maj.con
+cic:/Coq/Reals/Rtopology/continuity_ab_min.con
+cic:/Coq/Reals/Rtopology/continuity_compact.con
+cic:/Coq/Reals/Rtopology/covering.con
+cic:/Coq/Reals/Rtopology/covering_finite.con
+cic:/Coq/Reals/Rtopology/covering_open_set.con
+cic:/Coq/Reals/Rtopology/disc.con
+cic:/Coq/Reals/Rtopology/disc_P1.con
+cic:/Coq/Reals/Rtopology/domain_P1.con
+cic:/Coq/Reals/Rtopology/domain_finite.con
+cic:/Coq/Reals/Rtopology/eq_Dom.con
+cic:/Coq/Reals/Rtopology/f.con
+cic:/Coq/Reals/Rtopology/family_P1.con
+cic:/Coq/Reals/Rtopology/family_closed_set.con
+cic:/Coq/Reals/Rtopology/family_finite.con
+cic:/Coq/Reals/Rtopology/family_ind.con
+cic:/Coq/Reals/Rtopology/family_open_set.con
+cic:/Coq/Reals/Rtopology/family_rec.con
+cic:/Coq/Reals/Rtopology/family_rect.con
+cic:/Coq/Reals/Rtopology/image_dir.con
+cic:/Coq/Reals/Rtopology/image_rec.con
+cic:/Coq/Reals/Rtopology/included.con
+cic:/Coq/Reals/Rtopology/included_trans.con
+cic:/Coq/Reals/Rtopology/ind.con
+cic:/Coq/Reals/Rtopology/interior.con
+cic:/Coq/Reals/Rtopology/interior_P1.con
+cic:/Coq/Reals/Rtopology/interior_P2.con
+cic:/Coq/Reals/Rtopology/interior_P3.con
+cic:/Coq/Reals/Rtopology/intersection_domain.con
+cic:/Coq/Reals/Rtopology/intersection_family.con
+cic:/Coq/Reals/Rtopology/intersection_vide_finite_in.con
+cic:/Coq/Reals/Rtopology/intersection_vide_in.con
+cic:/Coq/Reals/Rtopology/is_lub_u.con
+cic:/Coq/Reals/Rtopology/neighbourhood.con
+cic:/Coq/Reals/Rtopology/neighbourhood_P1.con
+cic:/Coq/Reals/Rtopology/open_set.con
+cic:/Coq/Reals/Rtopology/open_set_P1.con
+cic:/Coq/Reals/Rtopology/open_set_P2.con
+cic:/Coq/Reals/Rtopology/open_set_P3.con
+cic:/Coq/Reals/Rtopology/open_set_P4.con
+cic:/Coq/Reals/Rtopology/open_set_P5.con
+cic:/Coq/Reals/Rtopology/open_set_P6.con
+cic:/Coq/Reals/Rtopology/point_adherent.con
+cic:/Coq/Reals/Rtopology/prolongement_C0.con
+cic:/Coq/Reals/Rtopology/restriction_family.con
+cic:/Coq/Reals/Rtopology/subfamily.con
+cic:/Coq/Reals/Rtopology/uniform_continuity.con
+cic:/Coq/Reals/Rtopology/union_domain.con
+cic:/Coq/Reals/Rtrigo/COS.con
+cic:/Coq/Reals/Rtrigo/COS_bound.con
+cic:/Coq/Reals/Rtrigo/PI2_RGT_0.con
+cic:/Coq/Reals/Rtrigo/PI2_Rlt_PI.con
+cic:/Coq/Reals/Rtrigo/PI4_RLT_PI2.con
+cic:/Coq/Reals/Rtrigo/PI_neq0.con
+cic:/Coq/Reals/Rtrigo/SIN.con
+cic:/Coq/Reals/Rtrigo/SIN_bound.con
+cic:/Coq/Reals/Rtrigo/_PI2_RLT_0.con
+cic:/Coq/Reals/Rtrigo/cos2.con
+cic:/Coq/Reals/Rtrigo/cos_2PI.con
+cic:/Coq/Reals/Rtrigo/cos_2a.con
+cic:/Coq/Reals/Rtrigo/cos_2a_cos.con
+cic:/Coq/Reals/Rtrigo/cos_2a_sin.con
+cic:/Coq/Reals/Rtrigo/cos_3PI2.con
+cic:/Coq/Reals/Rtrigo/cos_PI.con
+cic:/Coq/Reals/Rtrigo/cos_PI2.con
+cic:/Coq/Reals/Rtrigo/cos_decr_0.con
+cic:/Coq/Reals/Rtrigo/cos_decr_1.con
+cic:/Coq/Reals/Rtrigo/cos_decreasing_0.con
+cic:/Coq/Reals/Rtrigo/cos_decreasing_1.con
+cic:/Coq/Reals/Rtrigo/cos_eq_0_1.con
+cic:/Coq/Reals/Rtrigo/cos_eq_0_2PI_0.con
+cic:/Coq/Reals/Rtrigo/cos_eq_0_2PI_1.con
+cic:/Coq/Reals/Rtrigo/cos_ge_0.con
+cic:/Coq/Reals/Rtrigo/cos_gt_0.con
+cic:/Coq/Reals/Rtrigo/cos_incr_0.con
+cic:/Coq/Reals/Rtrigo/cos_incr_1.con
+cic:/Coq/Reals/Rtrigo/cos_increasing_0.con
+cic:/Coq/Reals/Rtrigo/cos_increasing_1.con
+cic:/Coq/Reals/Rtrigo/cos_lb.con
+cic:/Coq/Reals/Rtrigo/cos_le_0.con
+cic:/Coq/Reals/Rtrigo/cos_lt_0.con
+cic:/Coq/Reals/Rtrigo/cos_minus.con
+cic:/Coq/Reals/Rtrigo/cos_neg.con
+cic:/Coq/Reals/Rtrigo/cos_period.con
+cic:/Coq/Reals/Rtrigo/cos_shift.con
+cic:/Coq/Reals/Rtrigo/cos_sin.con
+cic:/Coq/Reals/Rtrigo/cos_sin_0.con
+cic:/Coq/Reals/Rtrigo/cos_sin_0_var.con
+cic:/Coq/Reals/Rtrigo/cos_ub.con
+cic:/Coq/Reals/Rtrigo/form1.con
+cic:/Coq/Reals/Rtrigo/form2.con
+cic:/Coq/Reals/Rtrigo/form3.con
+cic:/Coq/Reals/Rtrigo/form4.con
+cic:/Coq/Reals/Rtrigo/neg_cos.con
+cic:/Coq/Reals/Rtrigo/neg_sin.con
+cic:/Coq/Reals/Rtrigo/sin2.con
+cic:/Coq/Reals/Rtrigo/sin2_cos2.con
+cic:/Coq/Reals/Rtrigo/sin_2PI.con
+cic:/Coq/Reals/Rtrigo/sin_2a.con
+cic:/Coq/Reals/Rtrigo/sin_PI.con
+cic:/Coq/Reals/Rtrigo/sin_PI2.con
+cic:/Coq/Reals/Rtrigo/sin_PI_x.con
+cic:/Coq/Reals/Rtrigo/sin_cos.con
+cic:/Coq/Reals/Rtrigo/sin_decr_0.con
+cic:/Coq/Reals/Rtrigo/sin_decr_1.con
+cic:/Coq/Reals/Rtrigo/sin_decreasing_0.con
+cic:/Coq/Reals/Rtrigo/sin_decreasing_1.con
+cic:/Coq/Reals/Rtrigo/sin_eq_0_0.con
+cic:/Coq/Reals/Rtrigo/sin_eq_0_1.con
+cic:/Coq/Reals/Rtrigo/sin_eq_O_2PI_0.con
+cic:/Coq/Reals/Rtrigo/sin_eq_O_2PI_1.con
+cic:/Coq/Reals/Rtrigo/sin_ge_0.con
+cic:/Coq/Reals/Rtrigo/sin_gt_0.con
+cic:/Coq/Reals/Rtrigo/sin_incr_0.con
+cic:/Coq/Reals/Rtrigo/sin_incr_1.con
+cic:/Coq/Reals/Rtrigo/sin_increasing_0.con
+cic:/Coq/Reals/Rtrigo/sin_increasing_1.con
+cic:/Coq/Reals/Rtrigo/sin_lb.con
+cic:/Coq/Reals/Rtrigo/sin_lb_gt_0.con
+cic:/Coq/Reals/Rtrigo/sin_le_0.con
+cic:/Coq/Reals/Rtrigo/sin_lt_0.con
+cic:/Coq/Reals/Rtrigo/sin_minus.con
+cic:/Coq/Reals/Rtrigo/sin_neg.con
+cic:/Coq/Reals/Rtrigo/sin_period.con
+cic:/Coq/Reals/Rtrigo/sin_plus.con
+cic:/Coq/Reals/Rtrigo/sin_shift.con
+cic:/Coq/Reals/Rtrigo/sin_ub.con
+cic:/Coq/Reals/Rtrigo/tan.con
+cic:/Coq/Reals/Rtrigo/tan_0.con
+cic:/Coq/Reals/Rtrigo/tan_2a.con
+cic:/Coq/Reals/Rtrigo/tan_diff.con
+cic:/Coq/Reals/Rtrigo/tan_gt_0.con
+cic:/Coq/Reals/Rtrigo/tan_incr_0.con
+cic:/Coq/Reals/Rtrigo/tan_incr_1.con
+cic:/Coq/Reals/Rtrigo/tan_increasing_0.con
+cic:/Coq/Reals/Rtrigo/tan_increasing_1.con
+cic:/Coq/Reals/Rtrigo/tan_lt_0.con
+cic:/Coq/Reals/Rtrigo/tan_minus.con
+cic:/Coq/Reals/Rtrigo/tan_neg.con
+cic:/Coq/Reals/Rtrigo/tan_plus.con
+cic:/Coq/Reals/Rtrigo_alt/PI_4.con
+cic:/Coq/Reals/Rtrigo_alt/cos_approx.con
+cic:/Coq/Reals/Rtrigo_alt/cos_bound.con
+cic:/Coq/Reals/Rtrigo_alt/cos_term.con
+cic:/Coq/Reals/Rtrigo_alt/sin_approx.con
+cic:/Coq/Reals/Rtrigo_alt/sin_bound.con
+cic:/Coq/Reals/Rtrigo_alt/sin_term.con
+cic:/Coq/Reals/Rtrigo_calc/PI4_RGT_0.con
+cic:/Coq/Reals/Rtrigo_calc/PI6_RGT_0.con
+cic:/Coq/Reals/Rtrigo_calc/PI6_RLT_PI2.con
+cic:/Coq/Reals/Rtrigo_calc/R1_sqrt2_neq_0.con
+cic:/Coq/Reals/Rtrigo_calc/Rgt_2PI_0.con
+cic:/Coq/Reals/Rtrigo_calc/Rgt_3PI2_0.con
+cic:/Coq/Reals/Rtrigo_calc/Rlt_3PI2_2PI.con
+cic:/Coq/Reals/Rtrigo_calc/Rlt_PI_3PI2.con
+cic:/Coq/Reals/Rtrigo_calc/Rlt_sqrt2_0.con
+cic:/Coq/Reals/Rtrigo_calc/Rlt_sqrt3_0.con
+cic:/Coq/Reals/Rtrigo_calc/Rsqr_sin_cos_d_one.con
+cic:/Coq/Reals/Rtrigo_calc/cos3PI4.con
+cic:/Coq/Reals/Rtrigo_calc/cos_2PI3.con
+cic:/Coq/Reals/Rtrigo_calc/cos_5PI4.con
+cic:/Coq/Reals/Rtrigo_calc/cos_PI3.con
+cic:/Coq/Reals/Rtrigo_calc/cos_PI4.con
+cic:/Coq/Reals/Rtrigo_calc/cos_PI6.con
+cic:/Coq/Reals/Rtrigo_calc/cosd.con
+cic:/Coq/Reals/Rtrigo_calc/deg_rad.con
+cic:/Coq/Reals/Rtrigo_calc/plat.con
+cic:/Coq/Reals/Rtrigo_calc/rad_deg.con
+cic:/Coq/Reals/Rtrigo_calc/sin3PI4.con
+cic:/Coq/Reals/Rtrigo_calc/sin_2PI3.con
+cic:/Coq/Reals/Rtrigo_calc/sin_3PI2.con
+cic:/Coq/Reals/Rtrigo_calc/sin_5PI4.con
+cic:/Coq/Reals/Rtrigo_calc/sin_PI3.con
+cic:/Coq/Reals/Rtrigo_calc/sin_PI3_cos_PI6.con
+cic:/Coq/Reals/Rtrigo_calc/sin_PI4.con
+cic:/Coq/Reals/Rtrigo_calc/sin_PI6.con
+cic:/Coq/Reals/Rtrigo_calc/sin_PI6_cos_PI3.con
+cic:/Coq/Reals/Rtrigo_calc/sin_cos5PI4.con
+cic:/Coq/Reals/Rtrigo_calc/sin_cos_PI4.con
+cic:/Coq/Reals/Rtrigo_calc/sin_lb_ge_0.con
+cic:/Coq/Reals/Rtrigo_calc/sind.con
+cic:/Coq/Reals/Rtrigo_calc/sqrt2_neq_0.con
+cic:/Coq/Reals/Rtrigo_calc/sqrt3_2_neq_0.con
+cic:/Coq/Reals/Rtrigo_calc/tan_2PI.con
+cic:/Coq/Reals/Rtrigo_calc/tan_2PI3.con
+cic:/Coq/Reals/Rtrigo_calc/tan_PI.con
+cic:/Coq/Reals/Rtrigo_calc/tan_PI3.con
+cic:/Coq/Reals/Rtrigo_calc/tan_PI6.con
+cic:/Coq/Reals/Rtrigo_calc/tand.con
+cic:/Coq/Reals/Rtrigo_calc/toDeg.con
+cic:/Coq/Reals/Rtrigo_calc/toRad.con
+cic:/Coq/Reals/Rtrigo_calc/toRad_inj.con
+cic:/Coq/Reals/Rtrigo_def/Alembert_cos.con
+cic:/Coq/Reals/Rtrigo_def/Alembert_sin.con
+cic:/Coq/Reals/Rtrigo_def/archimed_cor1.con
+cic:/Coq/Reals/Rtrigo_def/cos.con
+cic:/Coq/Reals/Rtrigo_def/cos_0.con
+cic:/Coq/Reals/Rtrigo_def/cos_in.con
+cic:/Coq/Reals/Rtrigo_def/cos_n.con
+cic:/Coq/Reals/Rtrigo_def/cos_sym.con
+cic:/Coq/Reals/Rtrigo_def/cosh.con
+cic:/Coq/Reals/Rtrigo_def/cosh_0.con
+cic:/Coq/Reals/Rtrigo_def/cosn_no_R0.con
+cic:/Coq/Reals/Rtrigo_def/exist_cos.con
+cic:/Coq/Reals/Rtrigo_def/exist_cos0.con
+cic:/Coq/Reals/Rtrigo_def/exist_exp.con
+cic:/Coq/Reals/Rtrigo_def/exist_exp0.con
+cic:/Coq/Reals/Rtrigo_def/exist_sin.con
+cic:/Coq/Reals/Rtrigo_def/exp.con
+cic:/Coq/Reals/Rtrigo_def/exp_0.con
+cic:/Coq/Reals/Rtrigo_def/exp_cof_no_R0.con
+cic:/Coq/Reals/Rtrigo_def/exp_in.con
+cic:/Coq/Reals/Rtrigo_def/pow_i.con
+cic:/Coq/Reals/Rtrigo_def/simpl_cos_n.con
+cic:/Coq/Reals/Rtrigo_def/simpl_sin_n.con
+cic:/Coq/Reals/Rtrigo_def/sin.con
+cic:/Coq/Reals/Rtrigo_def/sin_0.con
+cic:/Coq/Reals/Rtrigo_def/sin_antisym.con
+cic:/Coq/Reals/Rtrigo_def/sin_in.con
+cic:/Coq/Reals/Rtrigo_def/sin_n.con
+cic:/Coq/Reals/Rtrigo_def/sin_no_R0.con
+cic:/Coq/Reals/Rtrigo_def/sinh.con
+cic:/Coq/Reals/Rtrigo_def/sinh_0.con
+cic:/Coq/Reals/Rtrigo_def/tanh.con
+cic:/Coq/Reals/Rtrigo_fun/Alembert_exp.con
+cic:/Coq/Reals/Rtrigo_reg/CVN_R_cos.con
+cic:/Coq/Reals/Rtrigo_reg/CVN_R_sin.con
+cic:/Coq/Reals/Rtrigo_reg/continuity_cos.con
+cic:/Coq/Reals/Rtrigo_reg/continuity_sin.con
+cic:/Coq/Reals/Rtrigo_reg/derivable_cos.con
+cic:/Coq/Reals/Rtrigo_reg/derivable_pt_cos.con
+cic:/Coq/Reals/Rtrigo_reg/derivable_pt_lim_sin.con
+cic:/Coq/Reals/Rtrigo_reg/derivable_pt_lim_sin_0.con
+cic:/Coq/Reals/Rtrigo_reg/derivable_pt_sin.con
+cic:/Coq/Reals/Rtrigo_reg/derivable_sin.con
+cic:/Coq/Reals/Rtrigo_reg/derive_pt_cos.con
+cic:/Coq/Reals/Rtrigo_reg/derive_pt_sin.con
+cic:/Coq/Reals/SeqProp/CV_Cauchy.con
+cic:/Coq/Reals/SeqProp/CV_minus.con
+cic:/Coq/Reals/SeqProp/CV_mult.con
+cic:/Coq/Reals/SeqProp/CV_opp.con
+cic:/Coq/Reals/SeqProp/CV_plus.con
+cic:/Coq/Reals/SeqProp/UL_sequence.con
+cic:/Coq/Reals/SeqProp/Un_decreasing.con
+cic:/Coq/Reals/SeqProp/Vn_Un_Wn_order.con
+cic:/Coq/Reals/SeqProp/Vn_growing.con
+cic:/Coq/Reals/SeqProp/Wn_decreasing.con
+cic:/Coq/Reals/SeqProp/approx_maj.con
+cic:/Coq/Reals/SeqProp/approx_min.con
+cic:/Coq/Reals/SeqProp/cauchy_maj.con
+cic:/Coq/Reals/SeqProp/cauchy_min.con
+cic:/Coq/Reals/SeqProp/cauchy_opp.con
+cic:/Coq/Reals/SeqProp/cond_eq.con
+cic:/Coq/Reals/SeqProp/cv_cvabs.con
+cic:/Coq/Reals/SeqProp/cv_infty.con
+cic:/Coq/Reals/SeqProp/cv_infty_cv_R0.con
+cic:/Coq/Reals/SeqProp/cv_speed_pow_fact.con
+cic:/Coq/Reals/SeqProp/decreasing_cv.con
+cic:/Coq/Reals/SeqProp/decreasing_growing.con
+cic:/Coq/Reals/SeqProp/decreasing_ineq.con
+cic:/Coq/Reals/SeqProp/decreasing_prop.con
+cic:/Coq/Reals/SeqProp/growing_cv.con
+cic:/Coq/Reals/SeqProp/growing_ineq.con
+cic:/Coq/Reals/SeqProp/has_lb.con
+cic:/Coq/Reals/SeqProp/has_ub.con
+cic:/Coq/Reals/SeqProp/maj_by_pos.con
+cic:/Coq/Reals/SeqProp/maj_cv.con
+cic:/Coq/Reals/SeqProp/maj_min.con
+cic:/Coq/Reals/SeqProp/maj_ss.con
+cic:/Coq/Reals/SeqProp/maj_sup.con
+cic:/Coq/Reals/SeqProp/majorant.con
+cic:/Coq/Reals/SeqProp/min_cv.con
+cic:/Coq/Reals/SeqProp/min_inf.con
+cic:/Coq/Reals/SeqProp/min_maj.con
+cic:/Coq/Reals/SeqProp/min_ss.con
+cic:/Coq/Reals/SeqProp/minorant.con
+cic:/Coq/Reals/SeqProp/not_Rlt.con
+cic:/Coq/Reals/SeqProp/opp_seq.con
+cic:/Coq/Reals/SeqProp/sequence_majorant.con
+cic:/Coq/Reals/SeqProp/sequence_minorant.con
+cic:/Coq/Reals/SeqProp/tech10.con
+cic:/Coq/Reals/SeqProp/tech13.con
+cic:/Coq/Reals/SeqProp/tech9.con
+cic:/Coq/Reals/SeqSeries/Cesaro.con
+cic:/Coq/Reals/SeqSeries/Cesaro_1.con
+cic:/Coq/Reals/SeqSeries/Rseries_CV_comp.con
+cic:/Coq/Reals/SeqSeries/sum_maj1.con
+cic:/Coq/Reals/Sqrt_reg/continuity_pt_sqrt.con
+cic:/Coq/Reals/Sqrt_reg/derivable_pt_sqrt.con
+cic:/Coq/Reals/Sqrt_reg/derive_pt_sqrt.con
+cic:/Coq/Reals/Sqrt_reg/sqrt_continuity_pt.con
+cic:/Coq/Reals/Sqrt_reg/sqrt_continuity_pt_R1.con
+cic:/Coq/Reals/Sqrt_reg/sqrt_var_maj.con
+cic:/Coq/Relations/Newman/Diagram.con
+cic:/Coq/Relations/Newman/Ind_proof.con
+cic:/Coq/Relations/Newman/Newman.con
+cic:/Coq/Relations/Newman/Rstar_coherence.con
+cic:/Coq/Relations/Newman/caseRxy.con
+cic:/Coq/Relations/Newman/coherence.con
+cic:/Coq/Relations/Newman/coherence_intro.con
+cic:/Coq/Relations/Newman/coherence_sym.con
+cic:/Coq/Relations/Newman/confluence.con
+cic:/Coq/Relations/Newman/local_confluence.con
+cic:/Coq/Relations/Newman/noetherian.con
+cic:/Coq/Relations/Operators_Properties/clos_refl_trans_ind_left.con
+cic:/Coq/Relations/Operators_Properties/clos_rst_idempotent.con
+cic:/Coq/Relations/Operators_Properties/clos_rst_is_equiv.con
+cic:/Coq/Relations/Operators_Properties/clos_rt_clos_rst.con
+cic:/Coq/Relations/Operators_Properties/clos_rt_idempotent.con
+cic:/Coq/Relations/Operators_Properties/clos_rt_is_preorder.con
+cic:/Coq/Relations/Relation_Definitions/PER_ind.con
+cic:/Coq/Relations/Relation_Definitions/PER_rec.con
+cic:/Coq/Relations/Relation_Definitions/PER_rect.con
+cic:/Coq/Relations/Relation_Definitions/antisymmetric.con
+cic:/Coq/Relations/Relation_Definitions/commut.con
+cic:/Coq/Relations/Relation_Definitions/equiv.con
+cic:/Coq/Relations/Relation_Definitions/equiv_refl.con
+cic:/Coq/Relations/Relation_Definitions/equiv_sym.con
+cic:/Coq/Relations/Relation_Definitions/equiv_trans.con
+cic:/Coq/Relations/Relation_Definitions/equivalence_ind.con
+cic:/Coq/Relations/Relation_Definitions/equivalence_rec.con
+cic:/Coq/Relations/Relation_Definitions/equivalence_rect.con
+cic:/Coq/Relations/Relation_Definitions/inclusion.con
+cic:/Coq/Relations/Relation_Definitions/ord_antisym.con
+cic:/Coq/Relations/Relation_Definitions/ord_refl.con
+cic:/Coq/Relations/Relation_Definitions/ord_trans.con
+cic:/Coq/Relations/Relation_Definitions/order_ind.con
+cic:/Coq/Relations/Relation_Definitions/order_rec.con
+cic:/Coq/Relations/Relation_Definitions/order_rect.con
+cic:/Coq/Relations/Relation_Definitions/per_sym.con
+cic:/Coq/Relations/Relation_Definitions/per_trans.con
+cic:/Coq/Relations/Relation_Definitions/preord_refl.con
+cic:/Coq/Relations/Relation_Definitions/preord_trans.con
+cic:/Coq/Relations/Relation_Definitions/preorder_ind.con
+cic:/Coq/Relations/Relation_Definitions/preorder_rec.con
+cic:/Coq/Relations/Relation_Definitions/preorder_rect.con
+cic:/Coq/Relations/Relation_Definitions/reflexive.con
+cic:/Coq/Relations/Relation_Definitions/relation.con
+cic:/Coq/Relations/Relation_Definitions/same_relation.con
+cic:/Coq/Relations/Relation_Definitions/symmetric.con
+cic:/Coq/Relations/Relation_Definitions/transitive.con
+cic:/Coq/Relations/Relation_Operators/Desc_ind.con
+cic:/Coq/Relations/Relation_Operators/Ltl_ind.con
+cic:/Coq/Relations/Relation_Operators/Pow.con
+cic:/Coq/Relations/Relation_Operators/clos_refl_sym_trans_ind.con
+cic:/Coq/Relations/Relation_Operators/clos_refl_trans_ind.con
+cic:/Coq/Relations/Relation_Operators/clos_trans_ind.con
+cic:/Coq/Relations/Relation_Operators/le_AsB_ind.con
+cic:/Coq/Relations/Relation_Operators/lex_exp.con
+cic:/Coq/Relations/Relation_Operators/lexprod_ind.con
+cic:/Coq/Relations/Relation_Operators/swapprod_ind.con
+cic:/Coq/Relations/Relation_Operators/symprod_ind.con
+cic:/Coq/Relations/Relation_Operators/transp.con
+cic:/Coq/Relations/Relation_Operators/union.con
+cic:/Coq/Relations/Relations/inverse_image_of_eq.con
+cic:/Coq/Relations/Relations/inverse_image_of_equivalence.con
+cic:/Coq/Relations/Rstar/Rstar'.con
+cic:/Coq/Relations/Rstar/Rstar'_R.con
+cic:/Coq/Relations/Rstar/Rstar'_Rstar.con
+cic:/Coq/Relations/Rstar/Rstar'_reflexive.con
+cic:/Coq/Relations/Rstar/Rstar.con
+cic:/Coq/Relations/Rstar/Rstar_R.con
+cic:/Coq/Relations/Rstar/Rstar_Rstar'.con
+cic:/Coq/Relations/Rstar/Rstar_reflexive.con
+cic:/Coq/Relations/Rstar/Rstar_transitive.con
+cic:/Coq/Relations/Rstar/commut.con
+cic:/Coq/Setoids/Setoid/Prop_S.con
+cic:/Coq/Setoids/Setoid/Seq_refl.con
+cic:/Coq/Setoids/Setoid/Seq_sym.con
+cic:/Coq/Setoids/Setoid/Seq_trans.con
+cic:/Coq/Setoids/Setoid/Setoid_Theory_ind.con
+cic:/Coq/Setoids/Setoid/Setoid_Theory_rec.con
+cic:/Coq/Setoids/Setoid/Setoid_Theory_rect.con
+cic:/Coq/Setoids/Setoid/and_ext.con
+cic:/Coq/Setoids/Setoid/and_ext2.con
+cic:/Coq/Setoids/Setoid/fleche.con
+cic:/Coq/Setoids/Setoid/fleche_ext.con
+cic:/Coq/Setoids/Setoid/fleche_ext2.con
+cic:/Coq/Setoids/Setoid/not_ext.con
+cic:/Coq/Setoids/Setoid/not_ext2.con
+cic:/Coq/Setoids/Setoid/or_ext.con
+cic:/Coq/Setoids/Setoid/or_ext2.con
+cic:/Coq/Setoids/Setoid/setoid_eq_ext1.con
+cic:/Coq/Setoids/Setoid/setoid_eq_ext2.con
+cic:/Coq/Sets/Classical_sets/Complement_Complement.con
+cic:/Coq/Sets/Classical_sets/Included_Strict_Included.con
+cic:/Coq/Sets/Classical_sets/Inhabited_Setminus.con
+cic:/Coq/Sets/Classical_sets/Strict_Included_inv.con
+cic:/Coq/Sets/Classical_sets/Strict_super_set_contains_new_element.con
+cic:/Coq/Sets/Classical_sets/Subtract_intro.con
+cic:/Coq/Sets/Classical_sets/Subtract_inv.con
+cic:/Coq/Sets/Classical_sets/not_SIncl_empty.con
+cic:/Coq/Sets/Classical_sets/not_empty_Inhabited.con
+cic:/Coq/Sets/Classical_sets/not_included_empty_Inhabited.con
+cic:/Coq/Sets/Constructive_sets/Add_intro1.con
+cic:/Coq/Sets/Constructive_sets/Add_intro2.con
+cic:/Coq/Sets/Constructive_sets/Add_inv.con
+cic:/Coq/Sets/Constructive_sets/Add_not_Empty.con
+cic:/Coq/Sets/Constructive_sets/Couple_inv.con
+cic:/Coq/Sets/Constructive_sets/Extension.con
+cic:/Coq/Sets/Constructive_sets/Included_Empty.con
+cic:/Coq/Sets/Constructive_sets/Inhabited_add.con
+cic:/Coq/Sets/Constructive_sets/Inhabited_not_empty.con
+cic:/Coq/Sets/Constructive_sets/Intersection_inv.con
+cic:/Coq/Sets/Constructive_sets/Noone_in_empty.con
+cic:/Coq/Sets/Constructive_sets/Setminus_intro.con
+cic:/Coq/Sets/Constructive_sets/Singleton_intro.con
+cic:/Coq/Sets/Constructive_sets/Singleton_inv.con
+cic:/Coq/Sets/Constructive_sets/Strict_Included_intro.con
+cic:/Coq/Sets/Constructive_sets/Strict_Included_strict.con
+cic:/Coq/Sets/Constructive_sets/Union_inv.con
+cic:/Coq/Sets/Constructive_sets/not_Empty_Add.con
+cic:/Coq/Sets/Cpo/Bottom_ind.con
+cic:/Coq/Sets/Cpo/Bottom_rec.con
+cic:/Coq/Sets/Cpo/Bottom_rect.con
+cic:/Coq/Sets/Cpo/Chain_cond.con
+cic:/Coq/Sets/Cpo/Chain_ind.con
+cic:/Coq/Sets/Cpo/Chain_rec.con
+cic:/Coq/Sets/Cpo/Chain_rect.con
+cic:/Coq/Sets/Cpo/Compatible.con
+cic:/Coq/Sets/Cpo/Complete_ind.con
+cic:/Coq/Sets/Cpo/Complete_rec.con
+cic:/Coq/Sets/Cpo/Complete_rect.con
+cic:/Coq/Sets/Cpo/Conditionally_complete_ind.con
+cic:/Coq/Sets/Cpo/Conditionally_complete_rec.con
+cic:/Coq/Sets/Cpo/Conditionally_complete_rect.con
+cic:/Coq/Sets/Cpo/Cpo_cond.con
+cic:/Coq/Sets/Cpo/Cpo_ind.con
+cic:/Coq/Sets/Cpo/Cpo_rec.con
+cic:/Coq/Sets/Cpo/Cpo_rect.con
+cic:/Coq/Sets/Cpo/Directed_ind.con
+cic:/Coq/Sets/Cpo/Directed_rec.con
+cic:/Coq/Sets/Cpo/Directed_rect.con
+cic:/Coq/Sets/Cpo/Glb_ind.con
+cic:/Coq/Sets/Cpo/Glb_rec.con
+cic:/Coq/Sets/Cpo/Glb_rect.con
+cic:/Coq/Sets/Cpo/Lower_Bound_ind.con
+cic:/Coq/Sets/Cpo/Lower_Bound_rec.con
+cic:/Coq/Sets/Cpo/Lower_Bound_rect.con
+cic:/Coq/Sets/Cpo/Lub_ind.con
+cic:/Coq/Sets/Cpo/Lub_rec.con
+cic:/Coq/Sets/Cpo/Lub_rect.con
+cic:/Coq/Sets/Cpo/PO_of_chain.con
+cic:/Coq/Sets/Cpo/PO_of_cpo.con
+cic:/Coq/Sets/Cpo/Totally_ordered_ind.con
+cic:/Coq/Sets/Cpo/Totally_ordered_rec.con
+cic:/Coq/Sets/Cpo/Totally_ordered_rect.con
+cic:/Coq/Sets/Cpo/Upper_Bound_ind.con
+cic:/Coq/Sets/Cpo/Upper_Bound_rec.con
+cic:/Coq/Sets/Cpo/Upper_Bound_rect.con
+cic:/Coq/Sets/Ensembles/Add.con
+cic:/Coq/Sets/Ensembles/Complement.con
+cic:/Coq/Sets/Ensembles/Couple_ind.con
+cic:/Coq/Sets/Ensembles/Disjoint_ind.con
+cic:/Coq/Sets/Ensembles/Disjoint_rec.con
+cic:/Coq/Sets/Ensembles/Disjoint_rect.con
+cic:/Coq/Sets/Ensembles/Empty_set_ind.con
+cic:/Coq/Sets/Ensembles/Empty_set_rec.con
+cic:/Coq/Sets/Ensembles/Empty_set_rect.con
+cic:/Coq/Sets/Ensembles/Ensemble.con
+cic:/Coq/Sets/Ensembles/Extensionality_Ensembles.con
+cic:/Coq/Sets/Ensembles/Full_set_ind.con
+cic:/Coq/Sets/Ensembles/In.con
+cic:/Coq/Sets/Ensembles/Included.con
+cic:/Coq/Sets/Ensembles/Inhabited_ind.con
+cic:/Coq/Sets/Ensembles/Intersection_ind.con
+cic:/Coq/Sets/Ensembles/Same_set.con
+cic:/Coq/Sets/Ensembles/Setminus.con
+cic:/Coq/Sets/Ensembles/Singleton_ind.con
+cic:/Coq/Sets/Ensembles/Singleton_rec.con
+cic:/Coq/Sets/Ensembles/Singleton_rect.con
+cic:/Coq/Sets/Ensembles/Strict_Included.con
+cic:/Coq/Sets/Ensembles/Subtract.con
+cic:/Coq/Sets/Ensembles/Triple_ind.con
+cic:/Coq/Sets/Ensembles/Union_ind.con
+cic:/Coq/Sets/Finite_sets/Finite_ind.con
+cic:/Coq/Sets/Finite_sets/cardinal_elim.con
+cic:/Coq/Sets/Finite_sets/cardinal_ind.con
+cic:/Coq/Sets/Finite_sets/cardinal_invert.con
+cic:/Coq/Sets/Finite_sets_facts/Add_preserves_Finite.con
+cic:/Coq/Sets/Finite_sets_facts/Finite_downward_closed.con
+cic:/Coq/Sets/Finite_sets_facts/G_aux.con
+cic:/Coq/Sets/Finite_sets_facts/Generalized_induction_on_finite_sets.con
+cic:/Coq/Sets/Finite_sets_facts/Intersection_preserves_finite.con
+cic:/Coq/Sets/Finite_sets_facts/Singleton_is_finite.con
+cic:/Coq/Sets/Finite_sets_facts/Union_preserves_Finite.con
+cic:/Coq/Sets/Finite_sets_facts/card_Add_gen.con
+cic:/Coq/Sets/Finite_sets_facts/card_soustr_1.con
+cic:/Coq/Sets/Finite_sets_facts/cardinalO_empty.con
+cic:/Coq/Sets/Finite_sets_facts/cardinal_Empty.con
+cic:/Coq/Sets/Finite_sets_facts/cardinal_finite.con
+cic:/Coq/Sets/Finite_sets_facts/cardinal_is_functional.con
+cic:/Coq/Sets/Finite_sets_facts/cardinal_unicity.con
+cic:/Coq/Sets/Finite_sets_facts/finite_cardinal.con
+cic:/Coq/Sets/Finite_sets_facts/incl_card_le.con
+cic:/Coq/Sets/Finite_sets_facts/incl_st_card_lt.con
+cic:/Coq/Sets/Finite_sets_facts/inh_card_gt_O.con
+cic:/Coq/Sets/Image/Im_add.con
+cic:/Coq/Sets/Image/Im_def.con
+cic:/Coq/Sets/Image/Im_ind.con
+cic:/Coq/Sets/Image/Im_inv.con
+cic:/Coq/Sets/Image/In_Image_elim.con
+cic:/Coq/Sets/Image/Pigeonhole.con
+cic:/Coq/Sets/Image/Pigeonhole_principle.con
+cic:/Coq/Sets/Image/cardinal_Im_intro.con
+cic:/Coq/Sets/Image/cardinal_decreases.con
+cic:/Coq/Sets/Image/finite_image.con
+cic:/Coq/Sets/Image/image_empty.con
+cic:/Coq/Sets/Image/injective.con
+cic:/Coq/Sets/Image/injective_preserves_cardinal.con
+cic:/Coq/Sets/Image/not_injective_elim.con
+cic:/Coq/Sets/Infinite_sets/Approximant_ind.con
+cic:/Coq/Sets/Infinite_sets/Approximant_rec.con
+cic:/Coq/Sets/Infinite_sets/Approximant_rect.con
+cic:/Coq/Sets/Infinite_sets/Image_set_continuous'.con
+cic:/Coq/Sets/Infinite_sets/Image_set_continuous.con
+cic:/Coq/Sets/Infinite_sets/Pigeonhole_bis.con
+cic:/Coq/Sets/Infinite_sets/Pigeonhole_ter.con
+cic:/Coq/Sets/Infinite_sets/approximant_can_be_any_size.con
+cic:/Coq/Sets/Infinite_sets/approximants_grow'.con
+cic:/Coq/Sets/Infinite_sets/approximants_grow.con
+cic:/Coq/Sets/Infinite_sets/make_new_approximant.con
+cic:/Coq/Sets/Integers/Finite_subset_has_lub.con
+cic:/Coq/Sets/Integers/Integers_has_no_ub.con
+cic:/Coq/Sets/Integers/Integers_ind.con
+cic:/Coq/Sets/Integers/Integers_infinite.con
+cic:/Coq/Sets/Integers/le_Order.con
+cic:/Coq/Sets/Integers/le_antisym.con
+cic:/Coq/Sets/Integers/le_reflexive.con
+cic:/Coq/Sets/Integers/le_total_order.con
+cic:/Coq/Sets/Integers/le_trans.con
+cic:/Coq/Sets/Integers/nat_po.con
+cic:/Coq/Sets/Integers/triv_nat.con
+cic:/Coq/Sets/Multiset/EmptyBag.con
+cic:/Coq/Sets/Multiset/SingletonBag.con
+cic:/Coq/Sets/Multiset/meq.con
+cic:/Coq/Sets/Multiset/meq_congr.con
+cic:/Coq/Sets/Multiset/meq_left.con
+cic:/Coq/Sets/Multiset/meq_refl.con
+cic:/Coq/Sets/Multiset/meq_right.con
+cic:/Coq/Sets/Multiset/meq_sym.con
+cic:/Coq/Sets/Multiset/meq_trans.con
+cic:/Coq/Sets/Multiset/multiplicity.con
+cic:/Coq/Sets/Multiset/multiset_ind.con
+cic:/Coq/Sets/Multiset/multiset_rec.con
+cic:/Coq/Sets/Multiset/multiset_rect.con
+cic:/Coq/Sets/Multiset/multiset_twist1.con
+cic:/Coq/Sets/Multiset/multiset_twist2.con
+cic:/Coq/Sets/Multiset/munion.con
+cic:/Coq/Sets/Multiset/munion_ass.con
+cic:/Coq/Sets/Multiset/munion_comm.con
+cic:/Coq/Sets/Multiset/munion_empty_left.con
+cic:/Coq/Sets/Multiset/munion_empty_right.con
+cic:/Coq/Sets/Multiset/munion_perm_left.con
+cic:/Coq/Sets/Multiset/munion_rotate.con
+cic:/Coq/Sets/Multiset/treesort_twist1.con
+cic:/Coq/Sets/Multiset/treesort_twist2.con
+cic:/Coq/Sets/Partial_Order/Carrier.con
+cic:/Coq/Sets/Partial_Order/Carrier_of.con
+cic:/Coq/Sets/Partial_Order/PO_cond1.con
+cic:/Coq/Sets/Partial_Order/PO_cond2.con
+cic:/Coq/Sets/Partial_Order/PO_ind.con
+cic:/Coq/Sets/Partial_Order/PO_rec.con
+cic:/Coq/Sets/Partial_Order/PO_rect.con
+cic:/Coq/Sets/Partial_Order/Rel.con
+cic:/Coq/Sets/Partial_Order/Rel_of.con
+cic:/Coq/Sets/Partial_Order/Strict_Rel_Transitive.con
+cic:/Coq/Sets/Partial_Order/Strict_Rel_Transitive_with_Rel.con
+cic:/Coq/Sets/Partial_Order/Strict_Rel_Transitive_with_Rel_left.con
+cic:/Coq/Sets/Partial_Order/Strict_Rel_of.con
+cic:/Coq/Sets/Partial_Order/covers_ind.con
+cic:/Coq/Sets/Partial_Order/covers_rec.con
+cic:/Coq/Sets/Partial_Order/covers_rect.con
+cic:/Coq/Sets/Permut/comm_left.con
+cic:/Coq/Sets/Permut/comm_right.con
+cic:/Coq/Sets/Permut/cong_congr.con
+cic:/Coq/Sets/Permut/op_rotate.con
+cic:/Coq/Sets/Permut/perm_left.con
+cic:/Coq/Sets/Permut/perm_right.con
+cic:/Coq/Sets/Permut/twist.con
+cic:/Coq/Sets/Powerset/Empty_set_is_Bottom.con
+cic:/Coq/Sets/Powerset/Empty_set_minimal.con
+cic:/Coq/Sets/Powerset/Inclusion_is_an_order.con
+cic:/Coq/Sets/Powerset/Inclusion_is_transitive.con
+cic:/Coq/Sets/Powerset/Intersection_decreases_l.con
+cic:/Coq/Sets/Powerset/Intersection_decreases_r.con
+cic:/Coq/Sets/Powerset/Intersection_is_Glb.con
+cic:/Coq/Sets/Powerset/Intersection_maximal.con
+cic:/Coq/Sets/Powerset/Power_set_Inhabited.con
+cic:/Coq/Sets/Powerset/Power_set_PO.con
+cic:/Coq/Sets/Powerset/Power_set_ind.con
+cic:/Coq/Sets/Powerset/Strict_Rel_is_Strict_Included.con
+cic:/Coq/Sets/Powerset/Strict_inclusion_is_transitive.con
+cic:/Coq/Sets/Powerset/Strict_inclusion_is_transitive_with_inclusion.con
+cic:/Coq/Sets/Powerset/Strict_inclusion_is_transitive_with_inclusion_left.con
+cic:/Coq/Sets/Powerset/Union_increases_l.con
+cic:/Coq/Sets/Powerset/Union_increases_r.con
+cic:/Coq/Sets/Powerset/Union_is_Lub.con
+cic:/Coq/Sets/Powerset/Union_minimal.con
+cic:/Coq/Sets/Powerset_Classical_facts/Add_covers.con
+cic:/Coq/Sets/Powerset_Classical_facts/Included_Add.con
+cic:/Coq/Sets/Powerset_Classical_facts/Simplify_add.con
+cic:/Coq/Sets/Powerset_Classical_facts/Singleton_atomic.con
+cic:/Coq/Sets/Powerset_Classical_facts/Sub_Add_new.con
+cic:/Coq/Sets/Powerset_Classical_facts/add_soustr_1.con
+cic:/Coq/Sets/Powerset_Classical_facts/add_soustr_2.con
+cic:/Coq/Sets/Powerset_Classical_facts/add_soustr_xy.con
+cic:/Coq/Sets/Powerset_Classical_facts/covers_Add.con
+cic:/Coq/Sets/Powerset_Classical_facts/covers_is_Add.con
+cic:/Coq/Sets/Powerset_Classical_facts/incl_soustr.con
+cic:/Coq/Sets/Powerset_Classical_facts/incl_soustr_add_l.con
+cic:/Coq/Sets/Powerset_Classical_facts/incl_soustr_add_r.con
+cic:/Coq/Sets/Powerset_Classical_facts/incl_soustr_in.con
+cic:/Coq/Sets/Powerset_Classical_facts/incl_st_add_soustr.con
+cic:/Coq/Sets/Powerset_Classical_facts/less_than_singleton.con
+cic:/Coq/Sets/Powerset_Classical_facts/setcover_inv.con
+cic:/Coq/Sets/Powerset_Classical_facts/sincl_add_x.con
+cic:/Coq/Sets/Powerset_facts/Add_commutative'.con
+cic:/Coq/Sets/Powerset_facts/Add_commutative.con
+cic:/Coq/Sets/Powerset_facts/Add_distributes.con
+cic:/Coq/Sets/Powerset_facts/Couple_as_union.con
+cic:/Coq/Sets/Powerset_facts/Distributivity'.con
+cic:/Coq/Sets/Powerset_facts/Distributivity.con
+cic:/Coq/Sets/Powerset_facts/Empty_set_zero'.con
+cic:/Coq/Sets/Powerset_facts/Empty_set_zero.con
+cic:/Coq/Sets/Powerset_facts/Intersection_commutative.con
+cic:/Coq/Sets/Powerset_facts/Non_disjoint_union'.con
+cic:/Coq/Sets/Powerset_facts/Non_disjoint_union.con
+cic:/Coq/Sets/Powerset_facts/Triple_as_Couple.con
+cic:/Coq/Sets/Powerset_facts/Triple_as_Couple_Singleton.con
+cic:/Coq/Sets/Powerset_facts/Triple_as_union.con
+cic:/Coq/Sets/Powerset_facts/Union_absorbs.con
+cic:/Coq/Sets/Powerset_facts/Union_add.con
+cic:/Coq/Sets/Powerset_facts/Union_associative.con
+cic:/Coq/Sets/Powerset_facts/Union_commutative.con
+cic:/Coq/Sets/Powerset_facts/Union_idempotent.con
+cic:/Coq/Sets/Powerset_facts/incl_add.con
+cic:/Coq/Sets/Powerset_facts/incl_add_x.con
+cic:/Coq/Sets/Powerset_facts/less_than_empty.con
+cic:/Coq/Sets/Powerset_facts/setcover_intro.con
+cic:/Coq/Sets/Powerset_facts/singlx.con
+cic:/Coq/Sets/Relations_1/Antisymmetric.con
+cic:/Coq/Sets/Relations_1/Equivalence_ind.con
+cic:/Coq/Sets/Relations_1/Equivalence_rec.con
+cic:/Coq/Sets/Relations_1/Equivalence_rect.con
+cic:/Coq/Sets/Relations_1/Order_ind.con
+cic:/Coq/Sets/Relations_1/Order_rec.con
+cic:/Coq/Sets/Relations_1/Order_rect.con
+cic:/Coq/Sets/Relations_1/PER_ind.con
+cic:/Coq/Sets/Relations_1/PER_rec.con
+cic:/Coq/Sets/Relations_1/PER_rect.con
+cic:/Coq/Sets/Relations_1/Preorder_ind.con
+cic:/Coq/Sets/Relations_1/Preorder_rec.con
+cic:/Coq/Sets/Relations_1/Preorder_rect.con
+cic:/Coq/Sets/Relations_1/Reflexive.con
+cic:/Coq/Sets/Relations_1/Relation.con
+cic:/Coq/Sets/Relations_1/Symmetric.con
+cic:/Coq/Sets/Relations_1/Transitive.con
+cic:/Coq/Sets/Relations_1/contains.con
+cic:/Coq/Sets/Relations_1/same_relation.con
+cic:/Coq/Sets/Relations_1_facts/Complement.con
+cic:/Coq/Sets/Relations_1_facts/Equiv_from_order.con
+cic:/Coq/Sets/Relations_1_facts/Equiv_from_preorder.con
+cic:/Coq/Sets/Relations_1_facts/Rsym_imp_notRsym.con
+cic:/Coq/Sets/Relations_1_facts/cong_antisymmetric_same_relation.con
+cic:/Coq/Sets/Relations_1_facts/cong_reflexive_same_relation.con
+cic:/Coq/Sets/Relations_1_facts/cong_symmetric_same_relation.con
+cic:/Coq/Sets/Relations_1_facts/cong_transitive_same_relation.con
+cic:/Coq/Sets/Relations_1_facts/contains_is_preorder.con
+cic:/Coq/Sets/Relations_1_facts/same_relation_is_equivalence.con
+cic:/Coq/Sets/Relations_2/Rplus_ind.con
+cic:/Coq/Sets/Relations_2/Rstar1_ind.con
+cic:/Coq/Sets/Relations_2/Rstar_ind.con
+cic:/Coq/Sets/Relations_2/Strongly_confluent.con
+cic:/Coq/Sets/Relations_2_facts/Lemma1.con
+cic:/Coq/Sets/Relations_2_facts/Rplus_contains_R.con
+cic:/Coq/Sets/Relations_2_facts/RstarRplus_RRstar.con
+cic:/Coq/Sets/Relations_2_facts/Rstar_cases.con
+cic:/Coq/Sets/Relations_2_facts/Rstar_contains_R.con
+cic:/Coq/Sets/Relations_2_facts/Rstar_contains_Rplus.con
+cic:/Coq/Sets/Relations_2_facts/Rstar_equiv_Rstar1.con
+cic:/Coq/Sets/Relations_2_facts/Rstar_reflexive.con
+cic:/Coq/Sets/Relations_2_facts/Rstar_transitive.con
+cic:/Coq/Sets/Relations_2_facts/Rsym_imp_Rstarsym.con
+cic:/Coq/Sets/Relations_2_facts/Sstar_contains_Rstar.con
+cic:/Coq/Sets/Relations_2_facts/star_monotone.con
+cic:/Coq/Sets/Relations_3/Confluent.con
+cic:/Coq/Sets/Relations_3/Locally_confluent.con
+cic:/Coq/Sets/Relations_3/Noetherian.con
+cic:/Coq/Sets/Relations_3/coherent.con
+cic:/Coq/Sets/Relations_3/confluent.con
+cic:/Coq/Sets/Relations_3/locally_confluent.con
+cic:/Coq/Sets/Relations_3/noetherian_ind.con
+cic:/Coq/Sets/Relations_3_facts/Newman.con
+cic:/Coq/Sets/Relations_3_facts/Noetherian_contains_Noetherian.con
+cic:/Coq/Sets/Relations_3_facts/Rstar_imp_coherent.con
+cic:/Coq/Sets/Relations_3_facts/Strong_confluence.con
+cic:/Coq/Sets/Relations_3_facts/Strong_confluence_direct.con
+cic:/Coq/Sets/Relations_3_facts/coherent_symmetric.con
+cic:/Coq/Sets/Uniset/Emptyset.con
+cic:/Coq/Sets/Uniset/Fullset.con
+cic:/Coq/Sets/Uniset/In.con
+cic:/Coq/Sets/Uniset/Singleton.con
+cic:/Coq/Sets/Uniset/charac.con
+cic:/Coq/Sets/Uniset/incl.con
+cic:/Coq/Sets/Uniset/incl_left.con
+cic:/Coq/Sets/Uniset/incl_right.con
+cic:/Coq/Sets/Uniset/leb_refl.con
+cic:/Coq/Sets/Uniset/seq.con
+cic:/Coq/Sets/Uniset/seq_congr.con
+cic:/Coq/Sets/Uniset/seq_left.con
+cic:/Coq/Sets/Uniset/seq_refl.con
+cic:/Coq/Sets/Uniset/seq_right.con
+cic:/Coq/Sets/Uniset/seq_sym.con
+cic:/Coq/Sets/Uniset/seq_trans.con
+cic:/Coq/Sets/Uniset/treesort_twist1.con
+cic:/Coq/Sets/Uniset/treesort_twist2.con
+cic:/Coq/Sets/Uniset/union.con
+cic:/Coq/Sets/Uniset/union_ass.con
+cic:/Coq/Sets/Uniset/union_comm.con
+cic:/Coq/Sets/Uniset/union_empty_left.con
+cic:/Coq/Sets/Uniset/union_empty_right.con
+cic:/Coq/Sets/Uniset/union_perm_left.con
+cic:/Coq/Sets/Uniset/union_rotate.con
+cic:/Coq/Sets/Uniset/uniset_ind.con
+cic:/Coq/Sets/Uniset/uniset_rec.con
+cic:/Coq/Sets/Uniset/uniset_rect.con
+cic:/Coq/Sets/Uniset/uniset_twist1.con
+cic:/Coq/Sets/Uniset/uniset_twist2.con
+cic:/Coq/Sorting/Heap/Tree_ind.con
+cic:/Coq/Sorting/Heap/Tree_rec.con
+cic:/Coq/Sorting/Heap/Tree_rect.con
+cic:/Coq/Sorting/Heap/build_heap_ind.con
+cic:/Coq/Sorting/Heap/build_heap_rec.con
+cic:/Coq/Sorting/Heap/build_heap_rect.con
+cic:/Coq/Sorting/Heap/contents.con
+cic:/Coq/Sorting/Heap/equiv_Tree.con
+cic:/Coq/Sorting/Heap/flat_spec_ind.con
+cic:/Coq/Sorting/Heap/flat_spec_rec.con
+cic:/Coq/Sorting/Heap/flat_spec_rect.con
+cic:/Coq/Sorting/Heap/heap_to_list.con
+cic:/Coq/Sorting/Heap/insert.con
+cic:/Coq/Sorting/Heap/insert_spec_ind.con
+cic:/Coq/Sorting/Heap/insert_spec_rec.con
+cic:/Coq/Sorting/Heap/insert_spec_rect.con
+cic:/Coq/Sorting/Heap/invert_heap.con
+cic:/Coq/Sorting/Heap/is_heap_ind.con
+cic:/Coq/Sorting/Heap/is_heap_rec.con
+cic:/Coq/Sorting/Heap/leA_Tree.con
+cic:/Coq/Sorting/Heap/leA_Tree_Leaf.con
+cic:/Coq/Sorting/Heap/leA_Tree_Node.con
+cic:/Coq/Sorting/Heap/list_to_heap.con
+cic:/Coq/Sorting/Heap/low_trans.con
+cic:/Coq/Sorting/Heap/treesort.con
+cic:/Coq/Sorting/Permutation/list_contents.con
+cic:/Coq/Sorting/Permutation/list_contents_app.con
+cic:/Coq/Sorting/Permutation/permut_app.con
+cic:/Coq/Sorting/Permutation/permut_cons.con
+cic:/Coq/Sorting/Permutation/permut_middle.con
+cic:/Coq/Sorting/Permutation/permut_refl.con
+cic:/Coq/Sorting/Permutation/permut_right.con
+cic:/Coq/Sorting/Permutation/permut_tran.con
+cic:/Coq/Sorting/Permutation/permutation.con
+cic:/Coq/Sorting/Sorting/lelistA_ind.con
+cic:/Coq/Sorting/Sorting/lelistA_inv.con
+cic:/Coq/Sorting/Sorting/merge.con
+cic:/Coq/Sorting/Sorting/merge_lem_ind.con
+cic:/Coq/Sorting/Sorting/merge_lem_rec.con
+cic:/Coq/Sorting/Sorting/merge_lem_rect.con
+cic:/Coq/Sorting/Sorting/sort_ind.con
+cic:/Coq/Sorting/Sorting/sort_inv.con
+cic:/Coq/Sorting/Sorting/sort_rec.con
+cic:/Coq/Wellfounded/Disjoint_Union/acc_A_sum.con
+cic:/Coq/Wellfounded/Disjoint_Union/acc_B_sum.con
+cic:/Coq/Wellfounded/Disjoint_Union/wf_disjoint_sum.con
+cic:/Coq/Wellfounded/Inclusion/Acc_incl.con
+cic:/Coq/Wellfounded/Inclusion/wf_incl.con
+cic:/Coq/Wellfounded/Inverse_Image/Acc_inverse_image.con
+cic:/Coq/Wellfounded/Inverse_Image/Acc_inverse_rel.con
+cic:/Coq/Wellfounded/Inverse_Image/Acc_lemma.con
+cic:/Coq/Wellfounded/Inverse_Image/wf_inverse_image.con
+cic:/Coq/Wellfounded/Inverse_Image/wf_inverse_rel.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/acc_app.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/desc_end.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/desc_prefix.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/desc_tail.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/dist_Desc_concat.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/dist_aux.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/left_prefix.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/ltl_unit.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/right_prefix.con
+cic:/Coq/Wellfounded/Lexicographic_Exponentiation/wf_lex_exp.con
+cic:/Coq/Wellfounded/Lexicographic_Product/Acc_swapprod.con
+cic:/Coq/Wellfounded/Lexicographic_Product/Acc_symprod.con
+cic:/Coq/Wellfounded/Lexicographic_Product/acc_A_B_lexprod.con
+cic:/Coq/Wellfounded/Lexicographic_Product/swap_Acc.con
+cic:/Coq/Wellfounded/Lexicographic_Product/wf_lexprod.con
+cic:/Coq/Wellfounded/Lexicographic_Product/wf_swapprod.con
+cic:/Coq/Wellfounded/Lexicographic_Product/wf_symprod.con
+cic:/Coq/Wellfounded/Transitive_Closure/Acc_clos_trans.con
+cic:/Coq/Wellfounded/Transitive_Closure/Acc_inv_trans.con
+cic:/Coq/Wellfounded/Transitive_Closure/incl_clos_trans.con
+cic:/Coq/Wellfounded/Transitive_Closure/wf_clos_trans.con
+cic:/Coq/Wellfounded/Union/Acc_union.con
+cic:/Coq/Wellfounded/Union/strip_commut.con
+cic:/Coq/Wellfounded/Union/wf_union.con
+cic:/Coq/Wellfounded/Well_Ordering/B.con
+cic:/Coq/Wellfounded/Well_Ordering/WO_ind.con
+cic:/Coq/Wellfounded/Well_Ordering/WO_rec.con
+cic:/Coq/Wellfounded/Well_Ordering/WO_rect.con
+cic:/Coq/Wellfounded/Well_Ordering/le_WO_ind.con
+cic:/Coq/Wellfounded/Well_Ordering/wf_WO.con
+cic:/Coq/Wellfounded/Well_Ordering/wof.con
+cic:/Coq/ZArith/BinInt/ZL0.con
+cic:/Coq/ZArith/BinInt/ZPminus.con
+cic:/Coq/ZArith/BinInt/Z_eq_mult.con
+cic:/Coq/ZArith/BinInt/Z_ind.con
+cic:/Coq/ZArith/BinInt/Z_of_N.con
+cic:/Coq/ZArith/BinInt/Z_of_nat.con
+cic:/Coq/ZArith/BinInt/Z_rec.con
+cic:/Coq/ZArith/BinInt/Z_rect.con
+cic:/Coq/ZArith/BinInt/Zabs.con
+cic:/Coq/ZArith/BinInt/Zabs_N.con
+cic:/Coq/ZArith/BinInt/Zabs_nat.con
+cic:/Coq/ZArith/BinInt/Zcompare.con
+cic:/Coq/ZArith/BinInt/Zdouble.con
+cic:/Coq/ZArith/BinInt/Zdouble_minus_one.con
+cic:/Coq/ZArith/BinInt/Zdouble_plus_one.con
+cic:/Coq/ZArith/BinInt/Zeq_minus.con
+cic:/Coq/ZArith/BinInt/Zge.con
+cic:/Coq/ZArith/BinInt/Zgt.con
+cic:/Coq/ZArith/BinInt/Zind.con
+cic:/Coq/ZArith/BinInt/Zle.con
+cic:/Coq/ZArith/BinInt/Zlt.con
+cic:/Coq/ZArith/BinInt/Zminus.con
+cic:/Coq/ZArith/BinInt/Zminus_0_l_reverse.con
+cic:/Coq/ZArith/BinInt/Zminus_0_r.con
+cic:/Coq/ZArith/BinInt/Zminus_diag.con
+cic:/Coq/ZArith/BinInt/Zminus_diag_reverse.con
+cic:/Coq/ZArith/BinInt/Zminus_eq.con
+cic:/Coq/ZArith/BinInt/Zminus_plus.con
+cic:/Coq/ZArith/BinInt/Zminus_plus_simpl_l.con
+cic:/Coq/ZArith/BinInt/Zminus_plus_simpl_l_reverse.con
+cic:/Coq/ZArith/BinInt/Zminus_plus_simpl_r.con
+cic:/Coq/ZArith/BinInt/Zminus_succ_l.con
+cic:/Coq/ZArith/BinInt/Zmult.con
+cic:/Coq/ZArith/BinInt/Zmult_0_l.con
+cic:/Coq/ZArith/BinInt/Zmult_0_r.con
+cic:/Coq/ZArith/BinInt/Zmult_0_r_reverse.con
+cic:/Coq/ZArith/BinInt/Zmult_1_inversion_l.con
+cic:/Coq/ZArith/BinInt/Zmult_1_l.con
+cic:/Coq/ZArith/BinInt/Zmult_1_r.con
+cic:/Coq/ZArith/BinInt/Zmult_assoc.con
+cic:/Coq/ZArith/BinInt/Zmult_assoc_reverse.con
+cic:/Coq/ZArith/BinInt/Zmult_comm.con
+cic:/Coq/ZArith/BinInt/Zmult_integral.con
+cic:/Coq/ZArith/BinInt/Zmult_integral_l.con
+cic:/Coq/ZArith/BinInt/Zmult_minus_distr_l.con
+cic:/Coq/ZArith/BinInt/Zmult_minus_distr_r.con
+cic:/Coq/ZArith/BinInt/Zmult_opp_comm.con
+cic:/Coq/ZArith/BinInt/Zmult_opp_opp.con
+cic:/Coq/ZArith/BinInt/Zmult_permute.con
+cic:/Coq/ZArith/BinInt/Zmult_plus_distr_l.con
+cic:/Coq/ZArith/BinInt/Zmult_plus_distr_r.con
+cic:/Coq/ZArith/BinInt/Zmult_reg_l.con
+cic:/Coq/ZArith/BinInt/Zmult_reg_r.con
+cic:/Coq/ZArith/BinInt/Zmult_succ_l.con
+cic:/Coq/ZArith/BinInt/Zmult_succ_l_reverse.con
+cic:/Coq/ZArith/BinInt/Zmult_succ_r.con
+cic:/Coq/ZArith/BinInt/Zmult_succ_r_reverse.con
+cic:/Coq/ZArith/BinInt/Zne.con
+cic:/Coq/ZArith/BinInt/Zneg_plus_distr.con
+cic:/Coq/ZArith/BinInt/Zneg_xI.con
+cic:/Coq/ZArith/BinInt/Zneg_xO.con
+cic:/Coq/ZArith/BinInt/Zopp.con
+cic:/Coq/ZArith/BinInt/Zopp_eq_mult_neg_1.con
+cic:/Coq/ZArith/BinInt/Zopp_inj.con
+cic:/Coq/ZArith/BinInt/Zopp_involutive.con
+cic:/Coq/ZArith/BinInt/Zopp_mult_distr_l.con
+cic:/Coq/ZArith/BinInt/Zopp_mult_distr_l_reverse.con
+cic:/Coq/ZArith/BinInt/Zopp_mult_distr_r.con
+cic:/Coq/ZArith/BinInt/Zopp_neg.con
+cic:/Coq/ZArith/BinInt/Zopp_plus_distr.con
+cic:/Coq/ZArith/BinInt/Zplus'.con
+cic:/Coq/ZArith/BinInt/Zplus.con
+cic:/Coq/ZArith/BinInt/Zplus_0_l.con
+cic:/Coq/ZArith/BinInt/Zplus_0_r.con
+cic:/Coq/ZArith/BinInt/Zplus_0_r_reverse.con
+cic:/Coq/ZArith/BinInt/Zplus_0_simpl_l.con
+cic:/Coq/ZArith/BinInt/Zplus_0_simpl_l_reverse.con
+cic:/Coq/ZArith/BinInt/Zplus_assoc.con
+cic:/Coq/ZArith/BinInt/Zplus_assoc_reverse.con
+cic:/Coq/ZArith/BinInt/Zplus_comm.con
+cic:/Coq/ZArith/BinInt/Zplus_diag_eq_mult_2.con
+cic:/Coq/ZArith/BinInt/Zplus_eq_compat.con
+cic:/Coq/ZArith/BinInt/Zplus_minus.con
+cic:/Coq/ZArith/BinInt/Zplus_minus_eq.con
+cic:/Coq/ZArith/BinInt/Zplus_opp_expand.con
+cic:/Coq/ZArith/BinInt/Zplus_opp_l.con
+cic:/Coq/ZArith/BinInt/Zplus_opp_r.con
+cic:/Coq/ZArith/BinInt/Zplus_permute.con
+cic:/Coq/ZArith/BinInt/Zplus_reg_l.con
+cic:/Coq/ZArith/BinInt/Zplus_succ_comm.con
+cic:/Coq/ZArith/BinInt/Zplus_succ_l.con
+cic:/Coq/ZArith/BinInt/Zplus_succ_r.con
+cic:/Coq/ZArith/BinInt/Zpos_plus_distr.con
+cic:/Coq/ZArith/BinInt/Zpos_succ_morphism.con
+cic:/Coq/ZArith/BinInt/Zpos_xI.con
+cic:/Coq/ZArith/BinInt/Zpos_xO.con
+cic:/Coq/ZArith/BinInt/Zpred'.con
+cic:/Coq/ZArith/BinInt/Zpred'_succ'.con
+cic:/Coq/ZArith/BinInt/Zpred.con
+cic:/Coq/ZArith/BinInt/Zpred_succ.con
+cic:/Coq/ZArith/BinInt/Zsgn.con
+cic:/Coq/ZArith/BinInt/Zsucc'.con
+cic:/Coq/ZArith/BinInt/Zsucc'_discr.con
+cic:/Coq/ZArith/BinInt/Zsucc.con
+cic:/Coq/ZArith/BinInt/Zsucc_discr.con
+cic:/Coq/ZArith/BinInt/Zsucc_eq_compat.con
+cic:/Coq/ZArith/BinInt/Zsucc_inj.con
+cic:/Coq/ZArith/BinInt/Zsucc_inj_contrapositive.con
+cic:/Coq/ZArith/BinInt/Zsucc_pred.con
+cic:/Coq/ZArith/BinInt/weak_Zmult_plus_distr_r.con
+cic:/Coq/ZArith/BinInt/weak_assoc.con
+cic:/Coq/ZArith/Wf_Z/ZL4_inf.con
+cic:/Coq/ZArith/Wf_Z/Z_lt_induction.con
+cic:/Coq/ZArith/Wf_Z/Z_lt_rec.con
+cic:/Coq/ZArith/Wf_Z/Z_of_nat_complete.con
+cic:/Coq/ZArith/Wf_Z/Z_of_nat_complete_inf.con
+cic:/Coq/ZArith/Wf_Z/Z_of_nat_prop.con
+cic:/Coq/ZArith/Wf_Z/Z_of_nat_set.con
+cic:/Coq/ZArith/Wf_Z/natlike_ind.con
+cic:/Coq/ZArith/Wf_Z/natlike_rec.con
+cic:/Coq/ZArith/Wf_Z/natlike_rec2.con
+cic:/Coq/ZArith/Wf_Z/natlike_rec3.con
+cic:/Coq/ZArith/ZArith_dec/Dcompare_inf.con
+cic:/Coq/ZArith/ZArith_dec/Z_dec'.con
+cic:/Coq/ZArith/ZArith_dec/Z_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_eq_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_ge_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_ge_lt_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_gt_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_gt_le_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_le_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_le_gt_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_le_lt_eq_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_lt_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_lt_ge_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_lt_le_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_noteq_dec.con
+cic:/Coq/ZArith/ZArith_dec/Z_notzerop.con
+cic:/Coq/ZArith/ZArith_dec/Z_zerop.con
+cic:/Coq/ZArith/ZArith_dec/Zcompare_rec.con
+cic:/Coq/ZArith/ZArith_dec/Zlt_cotrans.con
+cic:/Coq/ZArith/ZArith_dec/Zlt_cotrans_neg.con
+cic:/Coq/ZArith/ZArith_dec/Zlt_cotrans_pos.con
+cic:/Coq/ZArith/ZArith_dec/not_Zeq_inf.con
+cic:/Coq/ZArith/Zabs/Zabs_Zmult.con
+cic:/Coq/ZArith/Zabs/Zabs_Zopp.con
+cic:/Coq/ZArith/Zabs/Zabs_Zsgn.con
+cic:/Coq/ZArith/Zabs/Zabs_dec.con
+cic:/Coq/ZArith/Zabs/Zabs_eq.con
+cic:/Coq/ZArith/Zabs/Zabs_eq_case.con
+cic:/Coq/ZArith/Zabs/Zabs_ind.con
+cic:/Coq/ZArith/Zabs/Zabs_intro.con
+cic:/Coq/ZArith/Zabs/Zabs_nat_lt.con
+cic:/Coq/ZArith/Zabs/Zabs_non_eq.con
+cic:/Coq/ZArith/Zabs/Zabs_pos.con
+cic:/Coq/ZArith/Zabs/Zabs_triangle.con
+cic:/Coq/ZArith/Zabs/Zsgn_Zabs.con
+cic:/Coq/ZArith/Zbinary/Pdiv2.con
+cic:/Coq/ZArith/Zbinary/Z_div2_value.con
+cic:/Coq/ZArith/Zbinary/Z_to_binary.con
+cic:/Coq/ZArith/Zbinary/Z_to_binary_Sn.con
+cic:/Coq/ZArith/Zbinary/Z_to_binary_Sn_z.con
+cic:/Coq/ZArith/Zbinary/Z_to_binary_to_Z.con
+cic:/Coq/ZArith/Zbinary/Z_to_two_compl.con
+cic:/Coq/ZArith/Zbinary/Z_to_two_compl_Sn.con
+cic:/Coq/ZArith/Zbinary/Z_to_two_compl_Sn_z.con
+cic:/Coq/ZArith/Zbinary/Z_to_two_compl_to_Z.con
+cic:/Coq/ZArith/Zbinary/Zdiv2_two_power_nat.con
+cic:/Coq/ZArith/Zbinary/Zeven_bit_value.con
+cic:/Coq/ZArith/Zbinary/Zge_minus_two_power_nat_S.con
+cic:/Coq/ZArith/Zbinary/Zlt_two_power_nat_S.con
+cic:/Coq/ZArith/Zbinary/Zmod2.con
+cic:/Coq/ZArith/Zbinary/Zmod2_twice.con
+cic:/Coq/ZArith/Zbinary/Zodd_bit_value.con
+cic:/Coq/ZArith/Zbinary/binary_to_Z_to_binary.con
+cic:/Coq/ZArith/Zbinary/binary_value.con
+cic:/Coq/ZArith/Zbinary/binary_value_Sn.con
+cic:/Coq/ZArith/Zbinary/binary_value_pos.con
+cic:/Coq/ZArith/Zbinary/binary_value_pos_subproof.con
+cic:/Coq/ZArith/Zbinary/bit_value.con
+cic:/Coq/ZArith/Zbinary/two_compl_to_Z_to_two_compl.con
+cic:/Coq/ZArith/Zbinary/two_compl_value.con
+cic:/Coq/ZArith/Zbinary/two_compl_value_Sn.con
+cic:/Coq/ZArith/Zbool/Z_eq_bool.con
+cic:/Coq/ZArith/Zbool/Z_ge_lt_bool.con
+cic:/Coq/ZArith/Zbool/Z_gt_le_bool.con
+cic:/Coq/ZArith/Zbool/Z_le_gt_bool.con
+cic:/Coq/ZArith/Zbool/Z_lt_ge_bool.con
+cic:/Coq/ZArith/Zbool/Z_noteq_bool.con
+cic:/Coq/ZArith/Zbool/Zeq_bool.con
+cic:/Coq/ZArith/Zbool/Zeven_odd_bool.con
+cic:/Coq/ZArith/Zbool/Zge_bool.con
+cic:/Coq/ZArith/Zbool/Zge_cases.con
+cic:/Coq/ZArith/Zbool/Zge_is_le_bool.con
+cic:/Coq/ZArith/Zbool/Zgt_bool.con
+cic:/Coq/ZArith/Zbool/Zgt_cases.con
+cic:/Coq/ZArith/Zbool/Zgt_is_le_bool.con
+cic:/Coq/ZArith/Zbool/Zle_bool.con
+cic:/Coq/ZArith/Zbool/Zle_bool_antisym.con
+cic:/Coq/ZArith/Zbool/Zle_bool_imp_le.con
+cic:/Coq/ZArith/Zbool/Zle_bool_plus_mono.con
+cic:/Coq/ZArith/Zbool/Zle_bool_refl.con
+cic:/Coq/ZArith/Zbool/Zle_bool_total.con
+cic:/Coq/ZArith/Zbool/Zle_bool_trans.con
+cic:/Coq/ZArith/Zbool/Zle_cases.con
+cic:/Coq/ZArith/Zbool/Zle_imp_le_bool.con
+cic:/Coq/ZArith/Zbool/Zle_is_le_bool.con
+cic:/Coq/ZArith/Zbool/Zlt_bool.con
+cic:/Coq/ZArith/Zbool/Zlt_cases.con
+cic:/Coq/ZArith/Zbool/Zlt_is_le_bool.con
+cic:/Coq/ZArith/Zbool/Zneq_bool.con
+cic:/Coq/ZArith/Zbool/Zone_min_pos.con
+cic:/Coq/ZArith/Zbool/Zone_pos.con
+cic:/Coq/ZArith/Zcompare/Zcompare_Eq_eq.con
+cic:/Coq/ZArith/Zcompare/Zcompare_Eq_iff_eq.con
+cic:/Coq/ZArith/Zcompare/Zcompare_Gt_Lt_antisym.con
+cic:/Coq/ZArith/Zcompare/Zcompare_Gt_not_Lt.con
+cic:/Coq/ZArith/Zcompare/Zcompare_Gt_spec.con
+cic:/Coq/ZArith/Zcompare/Zcompare_Gt_trans.con
+cic:/Coq/ZArith/Zcompare/Zcompare_antisym.con
+cic:/Coq/ZArith/Zcompare/Zcompare_egal_dec.con
+cic:/Coq/ZArith/Zcompare/Zcompare_elim.con
+cic:/Coq/ZArith/Zcompare/Zcompare_eq_case.con
+cic:/Coq/ZArith/Zcompare/Zcompare_mult_compat.con
+cic:/Coq/ZArith/Zcompare/Zcompare_opp.con
+cic:/Coq/ZArith/Zcompare/Zcompare_plus_compat.con
+cic:/Coq/ZArith/Zcompare/Zcompare_refl.con
+cic:/Coq/ZArith/Zcompare/Zcompare_succ_Gt.con
+cic:/Coq/ZArith/Zcompare/Zcompare_succ_compat.con
+cic:/Coq/ZArith/Zcompare/Zge_compare.con
+cic:/Coq/ZArith/Zcompare/Zgt_compare.con
+cic:/Coq/ZArith/Zcompare/Zle_compare.con
+cic:/Coq/ZArith/Zcompare/Zlt_compare.con
+cic:/Coq/ZArith/Zcompare/Zmult_compare_compat_l.con
+cic:/Coq/ZArith/Zcompare/Zmult_compare_compat_r.con
+cic:/Coq/ZArith/Zcompare/Zplus_compare_compat.con
+cic:/Coq/ZArith/Zcompare/rename.con
+cic:/Coq/ZArith/Zcompare/weak_Zcompare_Zplus_compatible.con
+cic:/Coq/ZArith/Zcompare/weaken_Zcompare_Zplus_compatible.con
+cic:/Coq/ZArith/Zcomplements/Z_lt_abs_induction.con
+cic:/Coq/ZArith/Zcomplements/Z_lt_abs_induction_subproof.con
+cic:/Coq/ZArith/Zcomplements/Z_lt_abs_rec.con
+cic:/Coq/ZArith/Zcomplements/Z_lt_abs_rec_subproof.con
+cic:/Coq/ZArith/Zcomplements/Zcase_sign.con
+cic:/Coq/ZArith/Zcomplements/Zlength.con
+cic:/Coq/ZArith/Zcomplements/Zlength_aux.con
+cic:/Coq/ZArith/Zcomplements/Zlength_cons.con
+cic:/Coq/ZArith/Zcomplements/Zlength_correct.con
+cic:/Coq/ZArith/Zcomplements/Zlength_correct_subproof.con
+cic:/Coq/ZArith/Zcomplements/Zlength_nil.con
+cic:/Coq/ZArith/Zcomplements/Zlength_nil_inv.con
+cic:/Coq/ZArith/Zcomplements/floor.con
+cic:/Coq/ZArith/Zcomplements/floor_gt0.con
+cic:/Coq/ZArith/Zcomplements/floor_ok.con
+cic:/Coq/ZArith/Zcomplements/floor_pos.con
+cic:/Coq/ZArith/Zcomplements/sqr_pos.con
+cic:/Coq/ZArith/Zcomplements/two_or_two_plus_one.con
+cic:/Coq/ZArith/Zdiv/Z_div_POS_ge0.con
+cic:/Coq/ZArith/Zdiv/Z_div_exact_1.con
+cic:/Coq/ZArith/Zdiv/Z_div_exact_2.con
+cic:/Coq/ZArith/Zdiv/Z_div_ge.con
+cic:/Coq/ZArith/Zdiv/Z_div_ge0.con
+cic:/Coq/ZArith/Zdiv/Z_div_ge0_subproof.con
+cic:/Coq/ZArith/Zdiv/Z_div_lt.con
+cic:/Coq/ZArith/Zdiv/Z_div_mod.con
+cic:/Coq/ZArith/Zdiv/Z_div_mod_POS.con
+cic:/Coq/ZArith/Zdiv/Z_div_mod_eq.con
+cic:/Coq/ZArith/Zdiv/Z_div_mult.con
+cic:/Coq/ZArith/Zdiv/Z_div_plus.con
+cic:/Coq/ZArith/Zdiv/Z_div_same.con
+cic:/Coq/ZArith/Zdiv/Z_mod_lt.con
+cic:/Coq/ZArith/Zdiv/Z_mod_plus.con
+cic:/Coq/ZArith/Zdiv/Z_mod_same.con
+cic:/Coq/ZArith/Zdiv/Z_mod_zero_opp.con
+cic:/Coq/ZArith/Zdiv/Z_mult_div_ge.con
+cic:/Coq/ZArith/Zdiv/Zdiv.con
+cic:/Coq/ZArith/Zdiv/Zdiv_eucl.con
+cic:/Coq/ZArith/Zdiv/Zdiv_eucl_POS.con
+cic:/Coq/ZArith/Zdiv/Zdiv_eucl_exist.con
+cic:/Coq/ZArith/Zdiv/Zdiv_eucl_extended.con
+cic:/Coq/ZArith/Zdiv/Zmod.con
+cic:/Coq/ZArith/Zeven/Z_modulo_2.con
+cic:/Coq/ZArith/Zeven/Zdiv2.con
+cic:/Coq/ZArith/Zeven/Zeven.con
+cic:/Coq/ZArith/Zeven/Zeven_Sn.con
+cic:/Coq/ZArith/Zeven/Zeven_bool.con
+cic:/Coq/ZArith/Zeven/Zeven_dec.con
+cic:/Coq/ZArith/Zeven/Zeven_div2.con
+cic:/Coq/ZArith/Zeven/Zeven_not_Zodd.con
+cic:/Coq/ZArith/Zeven/Zeven_odd_dec.con
+cic:/Coq/ZArith/Zeven/Zeven_pred.con
+cic:/Coq/ZArith/Zeven/Zodd.con
+cic:/Coq/ZArith/Zeven/Zodd_Sn.con
+cic:/Coq/ZArith/Zeven/Zodd_bool.con
+cic:/Coq/ZArith/Zeven/Zodd_dec.con
+cic:/Coq/ZArith/Zeven/Zodd_div2.con
+cic:/Coq/ZArith/Zeven/Zodd_div2_neg.con
+cic:/Coq/ZArith/Zeven/Zodd_not_Zeven.con
+cic:/Coq/ZArith/Zeven/Zodd_pred.con
+cic:/Coq/ZArith/Zeven/Zsplit2.con
+cic:/Coq/ZArith/Zlogarithm/Is_power.con
+cic:/Coq/ZArith/Zlogarithm/Is_power_correct.con
+cic:/Coq/ZArith/Zlogarithm/Is_power_or.con
+cic:/Coq/ZArith/Zlogarithm/N_digits.con
+cic:/Coq/ZArith/Zlogarithm/ZERO_le_N_digits.con
+cic:/Coq/ZArith/Zlogarithm/log_inf.con
+cic:/Coq/ZArith/Zlogarithm/log_inf_correct.con
+cic:/Coq/ZArith/Zlogarithm/log_inf_correct1.con
+cic:/Coq/ZArith/Zlogarithm/log_inf_correct2.con
+cic:/Coq/ZArith/Zlogarithm/log_inf_le_log_sup.con
+cic:/Coq/ZArith/Zlogarithm/log_inf_shift_nat.con
+cic:/Coq/ZArith/Zlogarithm/log_near.con
+cic:/Coq/ZArith/Zlogarithm/log_near_correct1.con
+cic:/Coq/ZArith/Zlogarithm/log_near_correct2.con
+cic:/Coq/ZArith/Zlogarithm/log_near_correct2_subproof.con
+cic:/Coq/ZArith/Zlogarithm/log_sup.con
+cic:/Coq/ZArith/Zlogarithm/log_sup_correct1.con
+cic:/Coq/ZArith/Zlogarithm/log_sup_correct2.con
+cic:/Coq/ZArith/Zlogarithm/log_sup_le_Slog_inf.con
+cic:/Coq/ZArith/Zlogarithm/log_sup_log_inf.con
+cic:/Coq/ZArith/Zlogarithm/log_sup_shift_nat.con
+cic:/Coq/ZArith/Zmin/Zle_min_l.con
+cic:/Coq/ZArith/Zmin/Zle_min_r.con
+cic:/Coq/ZArith/Zmin/Zmax.con
+cic:/Coq/ZArith/Zmin/Zmax1.con
+cic:/Coq/ZArith/Zmin/Zmax2.con
+cic:/Coq/ZArith/Zmin/Zmin.con
+cic:/Coq/ZArith/Zmin/Zmin_SS.con
+cic:/Coq/ZArith/Zmin/Zmin_case.con
+cic:/Coq/ZArith/Zmin/Zmin_n_n.con
+cic:/Coq/ZArith/Zmin/Zmin_or.con
+cic:/Coq/ZArith/Zmin/Zmin_plus.con
+cic:/Coq/ZArith/Zmisc/iter.con
+cic:/Coq/ZArith/Zmisc/iter_nat.con
+cic:/Coq/ZArith/Zmisc/iter_nat_invariant.con
+cic:/Coq/ZArith/Zmisc/iter_nat_of_P.con
+cic:/Coq/ZArith/Zmisc/iter_nat_plus.con
+cic:/Coq/ZArith/Zmisc/iter_pos.con
+cic:/Coq/ZArith/Zmisc/iter_pos_invariant.con
+cic:/Coq/ZArith/Zmisc/iter_pos_plus.con
+cic:/Coq/ZArith/Znat/Zpos_eq_Z_of_nat_o_nat_of_P.con
+cic:/Coq/ZArith/Znat/inj_S.con
+cic:/Coq/ZArith/Znat/inj_eq.con
+cic:/Coq/ZArith/Znat/inj_ge.con
+cic:/Coq/ZArith/Znat/inj_gt.con
+cic:/Coq/ZArith/Znat/inj_le.con
+cic:/Coq/ZArith/Znat/inj_lt.con
+cic:/Coq/ZArith/Znat/inj_minus1.con
+cic:/Coq/ZArith/Znat/inj_minus2.con
+cic:/Coq/ZArith/Znat/inj_mult.con
+cic:/Coq/ZArith/Znat/inj_neq.con
+cic:/Coq/ZArith/Znat/inj_plus.con
+cic:/Coq/ZArith/Znat/intro_Z.con
+cic:/Coq/ZArith/Znat/neq.con
+cic:/Coq/ZArith/Znumtheory/Bezout_ind.con
+cic:/Coq/ZArith/Znumtheory/Euclid_ind.con
+cic:/Coq/ZArith/Znumtheory/Euclid_rec.con
+cic:/Coq/ZArith/Znumtheory/Euclid_rect.con
+cic:/Coq/ZArith/Znumtheory/Gauss.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_0.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_1.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_1_subproof.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_1_subproof0.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_1_subproof1.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_antisym.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_bounds.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_bounds_subproof.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_bounds_subproof0.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_bounds_subproof1.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_bounds_subproof2.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_dec.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_dec_subproof.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_dec_subproof0.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_factor_l.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_factor_r.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_ind.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_minus_l.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_mod.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_mult_l.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_mult_r.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_opp_l.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_opp_l_rev.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_opp_r.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_opp_r_rev.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_plus_r.con
+cic:/Coq/ZArith/Znumtheory/Zdivide_refl.con
+cic:/Coq/ZArith/Znumtheory/Zgcd.con
+cic:/Coq/ZArith/Znumtheory/Zgcd_is_gcd.con
+cic:/Coq/ZArith/Znumtheory/Zgcd_is_pos.con
+cic:/Coq/ZArith/Znumtheory/Zgcd_pos.con
+cic:/Coq/ZArith/Znumtheory/Zgcd_pos_subproof.con
+cic:/Coq/ZArith/Znumtheory/Zgcd_pos_subproof0.con
+cic:/Coq/ZArith/Znumtheory/Zgcd_spec.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_0.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_bezout.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_for_euclid.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_for_euclid2.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_ind.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_minus.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_mult.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_opp.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_rec.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_rect.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_rel_prime.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_rel_prime_subproof.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_rel_prime_subproof0.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_rel_prime_subproof1.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_sym.con
+cic:/Coq/ZArith/Znumtheory/Zis_gcd_uniqueness_apart_sign.con
+cic:/Coq/ZArith/Znumtheory/Zmod_divide.con
+cic:/Coq/ZArith/Znumtheory/Zmult_divide_compat_l.con
+cic:/Coq/ZArith/Znumtheory/Zmult_divide_compat_r.con
+cic:/Coq/ZArith/Znumtheory/Zmult_one.con
+cic:/Coq/ZArith/Znumtheory/Zone_divide.con
+cic:/Coq/ZArith/Znumtheory/bezout_rel_prime.con
+cic:/Coq/ZArith/Znumtheory/euclid.con
+cic:/Coq/ZArith/Znumtheory/euclid_rec.con
+cic:/Coq/ZArith/Znumtheory/euclid_subproof.con
+cic:/Coq/ZArith/Znumtheory/euclid_subproof0.con
+cic:/Coq/ZArith/Znumtheory/euclid_subproof1.con
+cic:/Coq/ZArith/Znumtheory/euclid_subproof2.con
+cic:/Coq/ZArith/Znumtheory/prime_divisors.con
+cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof.con
+cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof0.con
+cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof1.con
+cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof2.con
+cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof3.con
+cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof4.con
+cic:/Coq/ZArith/Znumtheory/prime_divisors_subproof5.con
+cic:/Coq/ZArith/Znumtheory/prime_ind.con
+cic:/Coq/ZArith/Znumtheory/prime_mult.con
+cic:/Coq/ZArith/Znumtheory/prime_rec.con
+cic:/Coq/ZArith/Znumtheory/prime_rect.con
+cic:/Coq/ZArith/Znumtheory/prime_rel_prime.con
+cic:/Coq/ZArith/Znumtheory/rel_prime.con
+cic:/Coq/ZArith/Znumtheory/rel_prime_bezout.con
+cic:/Coq/ZArith/Znumtheory/rel_prime_cross_prod.con
+cic:/Coq/ZArith/Znumtheory/rel_prime_cross_prod_subproof.con
+cic:/Coq/ZArith/Znumtheory/rel_prime_mult.con
+cic:/Coq/ZArith/Zorder/Zeq_le.con
+cic:/Coq/ZArith/Zorder/Zeq_plus_swap.con
+cic:/Coq/ZArith/Zorder/Zge_iff_le.con
+cic:/Coq/ZArith/Zorder/Zge_le.con
+cic:/Coq/ZArith/Zorder/Zge_trans.con
+cic:/Coq/ZArith/Zorder/Zge_trans_succ.con
+cic:/Coq/ZArith/Zorder/Zgt_0_le_0_pred.con
+cic:/Coq/ZArith/Zorder/Zgt_asym.con
+cic:/Coq/ZArith/Zorder/Zgt_iff_lt.con
+cic:/Coq/ZArith/Zorder/Zgt_irrefl.con
+cic:/Coq/ZArith/Zorder/Zgt_le_succ.con
+cic:/Coq/ZArith/Zorder/Zgt_le_trans.con
+cic:/Coq/ZArith/Zorder/Zgt_lt.con
+cic:/Coq/ZArith/Zorder/Zgt_not_le.con
+cic:/Coq/ZArith/Zorder/Zgt_pos_0.con
+cic:/Coq/ZArith/Zorder/Zgt_square_simpl.con
+cic:/Coq/ZArith/Zorder/Zgt_succ.con
+cic:/Coq/ZArith/Zorder/Zgt_succ_gt_or_eq.con
+cic:/Coq/ZArith/Zorder/Zgt_succ_le.con
+cic:/Coq/ZArith/Zorder/Zgt_succ_pred.con
+cic:/Coq/ZArith/Zorder/Zgt_trans.con
+cic:/Coq/ZArith/Zorder/Zle_0_1.con
+cic:/Coq/ZArith/Zorder/Zle_0_nat.con
+cic:/Coq/ZArith/Zorder/Zle_0_pos.con
+cic:/Coq/ZArith/Zorder/Zle_antisym.con
+cic:/Coq/ZArith/Zorder/Zle_ge.con
+cic:/Coq/ZArith/Zorder/Zle_gt_trans.con
+cic:/Coq/ZArith/Zorder/Zle_le_succ.con
+cic:/Coq/ZArith/Zorder/Zle_lt_or_eq.con
+cic:/Coq/ZArith/Zorder/Zle_lt_succ.con
+cic:/Coq/ZArith/Zorder/Zle_lt_trans.con
+cic:/Coq/ZArith/Zorder/Zle_neg_pos.con
+cic:/Coq/ZArith/Zorder/Zle_not_gt.con
+cic:/Coq/ZArith/Zorder/Zle_not_lt.con
+cic:/Coq/ZArith/Zorder/Zle_or_lt.con
+cic:/Coq/ZArith/Zorder/Zle_plus_swap.con
+cic:/Coq/ZArith/Zorder/Zle_pred.con
+cic:/Coq/ZArith/Zorder/Zle_refl.con
+cic:/Coq/ZArith/Zorder/Zle_succ.con
+cic:/Coq/ZArith/Zorder/Zle_succ_le.con
+cic:/Coq/ZArith/Zorder/Zle_trans.con
+cic:/Coq/ZArith/Zorder/Zlt_0_1.con
+cic:/Coq/ZArith/Zorder/Zlt_0_le_0_pred.con
+cic:/Coq/ZArith/Zorder/Zlt_O_minus_lt.con
+cic:/Coq/ZArith/Zorder/Zlt_asym.con
+cic:/Coq/ZArith/Zorder/Zlt_gt.con
+cic:/Coq/ZArith/Zorder/Zlt_gt_succ.con
+cic:/Coq/ZArith/Zorder/Zlt_irrefl.con
+cic:/Coq/ZArith/Zorder/Zlt_le_succ.con
+cic:/Coq/ZArith/Zorder/Zlt_le_trans.con
+cic:/Coq/ZArith/Zorder/Zlt_le_weak.con
+cic:/Coq/ZArith/Zorder/Zlt_lt_succ.con
+cic:/Coq/ZArith/Zorder/Zlt_minus_simpl_swap.con
+cic:/Coq/ZArith/Zorder/Zlt_neg_0.con
+cic:/Coq/ZArith/Zorder/Zlt_not_eq.con
+cic:/Coq/ZArith/Zorder/Zlt_not_le.con
+cic:/Coq/ZArith/Zorder/Zlt_plus_swap.con
+cic:/Coq/ZArith/Zorder/Zlt_pred.con
+cic:/Coq/ZArith/Zorder/Zlt_square_simpl.con
+cic:/Coq/ZArith/Zorder/Zlt_succ.con
+cic:/Coq/ZArith/Zorder/Zlt_succ_gt.con
+cic:/Coq/ZArith/Zorder/Zlt_succ_le.con
+cic:/Coq/ZArith/Zorder/Zlt_succ_pred.con
+cic:/Coq/ZArith/Zorder/Zlt_trans.con
+cic:/Coq/ZArith/Zorder/Zmult_ge_compat.con
+cic:/Coq/ZArith/Zorder/Zmult_ge_compat_l.con
+cic:/Coq/ZArith/Zorder/Zmult_ge_compat_r.con
+cic:/Coq/ZArith/Zorder/Zmult_ge_reg_r.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_0_compat.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_0_le_0_compat.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_0_le_compat_r.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_0_lt_0_reg_r.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_0_lt_compat_l.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_0_lt_compat_r.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_0_lt_reg_r.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_0_reg_l.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_compat_l.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_compat_r.con
+cic:/Coq/ZArith/Zorder/Zmult_gt_reg_r.con
+cic:/Coq/ZArith/Zorder/Zmult_le_0_compat.con
+cic:/Coq/ZArith/Zorder/Zmult_le_0_reg_r.con
+cic:/Coq/ZArith/Zorder/Zmult_le_compat.con
+cic:/Coq/ZArith/Zorder/Zmult_le_compat_l.con
+cic:/Coq/ZArith/Zorder/Zmult_le_compat_r.con
+cic:/Coq/ZArith/Zorder/Zmult_le_reg_r.con
+cic:/Coq/ZArith/Zorder/Zmult_lt_0_le_compat_r.con
+cic:/Coq/ZArith/Zorder/Zmult_lt_0_le_reg_r.con
+cic:/Coq/ZArith/Zorder/Zmult_lt_0_reg_r.con
+cic:/Coq/ZArith/Zorder/Zmult_lt_O_compat.con
+cic:/Coq/ZArith/Zorder/Zmult_lt_compat_l.con
+cic:/Coq/ZArith/Zorder/Zmult_lt_compat_r.con
+cic:/Coq/ZArith/Zorder/Zmult_lt_reg_r.con
+cic:/Coq/ZArith/Zorder/Znot_ge_lt.con
+cic:/Coq/ZArith/Zorder/Znot_gt_le.con
+cic:/Coq/ZArith/Zorder/Znot_le_gt.con
+cic:/Coq/ZArith/Zorder/Znot_le_succ.con
+cic:/Coq/ZArith/Zorder/Znot_lt_ge.con
+cic:/Coq/ZArith/Zorder/Zplus_gt_compat_l.con
+cic:/Coq/ZArith/Zorder/Zplus_gt_compat_r.con
+cic:/Coq/ZArith/Zorder/Zplus_gt_reg_l.con
+cic:/Coq/ZArith/Zorder/Zplus_gt_reg_r.con
+cic:/Coq/ZArith/Zorder/Zplus_le_0_compat.con
+cic:/Coq/ZArith/Zorder/Zplus_le_compat.con
+cic:/Coq/ZArith/Zorder/Zplus_le_compat_l.con
+cic:/Coq/ZArith/Zorder/Zplus_le_compat_r.con
+cic:/Coq/ZArith/Zorder/Zplus_le_lt_compat.con
+cic:/Coq/ZArith/Zorder/Zplus_le_reg_l.con
+cic:/Coq/ZArith/Zorder/Zplus_le_reg_r.con
+cic:/Coq/ZArith/Zorder/Zplus_lt_compat.con
+cic:/Coq/ZArith/Zorder/Zplus_lt_compat_l.con
+cic:/Coq/ZArith/Zorder/Zplus_lt_compat_r.con
+cic:/Coq/ZArith/Zorder/Zplus_lt_le_compat.con
+cic:/Coq/ZArith/Zorder/Zplus_lt_reg_l.con
+cic:/Coq/ZArith/Zorder/Zplus_lt_reg_r.con
+cic:/Coq/ZArith/Zorder/Zsucc_gt_compat.con
+cic:/Coq/ZArith/Zorder/Zsucc_gt_reg.con
+cic:/Coq/ZArith/Zorder/Zsucc_le_compat.con
+cic:/Coq/ZArith/Zorder/Zsucc_le_reg.con
+cic:/Coq/ZArith/Zorder/Zsucc_lt_compat.con
+cic:/Coq/ZArith/Zorder/Zsucc_lt_reg.con
+cic:/Coq/ZArith/Zorder/Ztrichotomy.con
+cic:/Coq/ZArith/Zorder/Ztrichotomy_inf.con
+cic:/Coq/ZArith/Zorder/dec_Zge.con
+cic:/Coq/ZArith/Zorder/dec_Zgt.con
+cic:/Coq/ZArith/Zorder/dec_Zle.con
+cic:/Coq/ZArith/Zorder/dec_Zlt.con
+cic:/Coq/ZArith/Zorder/dec_Zne.con
+cic:/Coq/ZArith/Zorder/dec_eq.con
+cic:/Coq/ZArith/Zorder/not_Zeq.con
+cic:/Coq/ZArith/Zpower/Zdiv_rest.con
+cic:/Coq/ZArith/Zpower/Zdiv_rest_aux.con
+cic:/Coq/ZArith/Zpower/Zdiv_rest_correct.con
+cic:/Coq/ZArith/Zpower/Zdiv_rest_correct1.con
+cic:/Coq/ZArith/Zpower/Zdiv_rest_correct2.con
+cic:/Coq/ZArith/Zpower/Zdiv_rest_proofs_ind.con
+cic:/Coq/ZArith/Zpower/Zdiv_rest_proofs_rec.con
+cic:/Coq/ZArith/Zpower/Zdiv_rest_proofs_rect.con
+cic:/Coq/ZArith/Zpower/Zlt_lt_double.con
+cic:/Coq/ZArith/Zpower/Zpower.con
+cic:/Coq/ZArith/Zpower/Zpower_exp.con
+cic:/Coq/ZArith/Zpower/Zpower_nat.con
+cic:/Coq/ZArith/Zpower/Zpower_nat_is_exp.con
+cic:/Coq/ZArith/Zpower/Zpower_pos.con
+cic:/Coq/ZArith/Zpower/Zpower_pos_is_exp.con
+cic:/Coq/ZArith/Zpower/Zpower_pos_nat.con
+cic:/Coq/ZArith/Zpower/shift.con
+cic:/Coq/ZArith/Zpower/shift_nat.con
+cic:/Coq/ZArith/Zpower/shift_nat_correct.con
+cic:/Coq/ZArith/Zpower/shift_nat_plus.con
+cic:/Coq/ZArith/Zpower/shift_pos.con
+cic:/Coq/ZArith/Zpower/shift_pos_correct.con
+cic:/Coq/ZArith/Zpower/shift_pos_nat.con
+cic:/Coq/ZArith/Zpower/two_p.con
+cic:/Coq/ZArith/Zpower/two_p_S.con
+cic:/Coq/ZArith/Zpower/two_p_gt_ZERO.con
+cic:/Coq/ZArith/Zpower/two_p_is_exp.con
+cic:/Coq/ZArith/Zpower/two_p_pred.con
+cic:/Coq/ZArith/Zpower/two_power_nat.con
+cic:/Coq/ZArith/Zpower/two_power_nat_S.con
+cic:/Coq/ZArith/Zpower/two_power_nat_correct.con
+cic:/Coq/ZArith/Zpower/two_power_pos.con
+cic:/Coq/ZArith/Zpower/two_power_pos_correct.con
+cic:/Coq/ZArith/Zpower/two_power_pos_is_exp.con
+cic:/Coq/ZArith/Zpower/two_power_pos_nat.con
+cic:/Coq/ZArith/Zsqrt/Zsqrt.con
+cic:/Coq/ZArith/Zsqrt/Zsqrt_interval.con
+cic:/Coq/ZArith/Zsqrt/Zsqrt_plain.con
+cic:/Coq/ZArith/Zsqrt/sqrt_data_ind.con
+cic:/Coq/ZArith/Zsqrt/sqrt_data_rec.con
+cic:/Coq/ZArith/Zsqrt/sqrt_data_rect.con
+cic:/Coq/ZArith/Zsqrt/sqrtrempos.con
+cic:/Coq/ZArith/Zwf/Zwf.con
+cic:/Coq/ZArith/Zwf/Zwf_up.con
+cic:/Coq/ZArith/Zwf/Zwf_up_well_founded.con
+cic:/Coq/ZArith/Zwf/Zwf_well_founded.con
+cic:/Coq/ZArith/auxiliary/Zegal_left.con
+cic:/Coq/ZArith/auxiliary/Zge_left.con
+cic:/Coq/ZArith/auxiliary/Zgt_left.con
+cic:/Coq/ZArith/auxiliary/Zgt_left_gt.con
+cic:/Coq/ZArith/auxiliary/Zgt_left_rev.con
+cic:/Coq/ZArith/auxiliary/Zle_left.con
+cic:/Coq/ZArith/auxiliary/Zle_left_rev.con
+cic:/Coq/ZArith/auxiliary/Zle_mult_approx.con
+cic:/Coq/ZArith/auxiliary/Zlt_left.con
+cic:/Coq/ZArith/auxiliary/Zlt_left_lt.con
+cic:/Coq/ZArith/auxiliary/Zlt_left_rev.con
+cic:/Coq/ZArith/auxiliary/Zmult_le_approx.con
+cic:/Coq/ZArith/auxiliary/Zne_left.con
+cic:/Coq/ZArith/auxiliary/Zred_factor0.con
+cic:/Coq/ZArith/auxiliary/Zred_factor1.con
+cic:/Coq/ZArith/auxiliary/Zred_factor2.con
+cic:/Coq/ZArith/auxiliary/Zred_factor3.con
+cic:/Coq/ZArith/auxiliary/Zred_factor4.con
+cic:/Coq/ZArith/auxiliary/Zred_factor5.con
+cic:/Coq/ZArith/auxiliary/Zred_factor6.con
+cic:/Coq/field/Field_Compl/appT.con
+cic:/Coq/field/Field_Compl/assoc_2nd.con
+cic:/Coq/field/Field_Compl/field_rel_option_ind.con
+cic:/Coq/field/Field_Compl/field_rel_option_rec.con
+cic:/Coq/field/Field_Compl/field_rel_option_rect.con
+cic:/Coq/field/Field_Compl/fstT.con
+cic:/Coq/field/Field_Compl/listT_ind.con
+cic:/Coq/field/Field_Compl/listT_rec.con
+cic:/Coq/field/Field_Compl/listT_rect.con
+cic:/Coq/field/Field_Compl/mem.con
+cic:/Coq/field/Field_Compl/prodT_ind.con
+cic:/Coq/field/Field_Compl/prodT_rec.con
+cic:/Coq/field/Field_Compl/prodT_rect.con
+cic:/Coq/field/Field_Compl/sndT.con
+cic:/Coq/field/Field_Theory/A.con
+cic:/Coq/field/Field_Theory/Adiv.con
+cic:/Coq/field/Field_Theory/Aeq.con
+cic:/Coq/field/Field_Theory/Ainv.con
+cic:/Coq/field/Field_Theory/AinvT_r.con
+cic:/Coq/field/Field_Theory/Aminus.con
+cic:/Coq/field/Field_Theory/Amult.con
+cic:/Coq/field/Field_Theory/AmultT_1l.con
+cic:/Coq/field/Field_Theory/AmultT_1r.con
+cic:/Coq/field/Field_Theory/AmultT_AplusT_distr.con
+cic:/Coq/field/Field_Theory/AmultT_Ol.con
+cic:/Coq/field/Field_Theory/AmultT_Or.con
+cic:/Coq/field/Field_Theory/AmultT_assoc.con
+cic:/Coq/field/Field_Theory/AmultT_sym.con
+cic:/Coq/field/Field_Theory/Aone.con
+cic:/Coq/field/Field_Theory/Aopp.con
+cic:/Coq/field/Field_Theory/Aplus.con
+cic:/Coq/field/Field_Theory/AplusT_AoppT_r.con
+cic:/Coq/field/Field_Theory/AplusT_Ol.con
+cic:/Coq/field/Field_Theory/AplusT_assoc.con
+cic:/Coq/field/Field_Theory/AplusT_sym.con
+cic:/Coq/field/Field_Theory/Azero.con
+cic:/Coq/field/Field_Theory/ExprA_ind.con
+cic:/Coq/field/Field_Theory/ExprA_rec.con
+cic:/Coq/field/Field_Theory/ExprA_rect.con
+cic:/Coq/field/Field_Theory/Field_Theory_ind.con
+cic:/Coq/field/Field_Theory/Field_Theory_rec.con
+cic:/Coq/field/Field_Theory/Field_Theory_rect.con
+cic:/Coq/field/Field_Theory/RT.con
+cic:/Coq/field/Field_Theory/Rmult_neq_0_reg.con
+cic:/Coq/field/Field_Theory/Th_inv_def.con
+cic:/Coq/field/Field_Theory/assoc.con
+cic:/Coq/field/Field_Theory/assoc_correct.con
+cic:/Coq/field/Field_Theory/assoc_mult.con
+cic:/Coq/field/Field_Theory/assoc_mult_correct.con
+cic:/Coq/field/Field_Theory/assoc_mult_correct1.con
+cic:/Coq/field/Field_Theory/assoc_plus_correct.con
+cic:/Coq/field/Field_Theory/distrib.con
+cic:/Coq/field/Field_Theory/distrib_EAopp.con
+cic:/Coq/field/Field_Theory/distrib_correct.con
+cic:/Coq/field/Field_Theory/distrib_main.con
+cic:/Coq/field/Field_Theory/distrib_mult_left.con
+cic:/Coq/field/Field_Theory/distrib_mult_left_correct.con
+cic:/Coq/field/Field_Theory/distrib_mult_right.con
+cic:/Coq/field/Field_Theory/distrib_mult_right_correct.con
+cic:/Coq/field/Field_Theory/eqExprA.con
+cic:/Coq/field/Field_Theory/eqExprA_O.con
+cic:/Coq/field/Field_Theory/eq_nat_dec.con
+cic:/Coq/field/Field_Theory/interp_ExprA.con
+cic:/Coq/field/Field_Theory/inverse_correct.con
+cic:/Coq/field/Field_Theory/inverse_simplif.con
+cic:/Coq/field/Field_Theory/merge_mult.con
+cic:/Coq/field/Field_Theory/merge_mult_correct.con
+cic:/Coq/field/Field_Theory/merge_mult_correct1.con
+cic:/Coq/field/Field_Theory/merge_plus.con
+cic:/Coq/field/Field_Theory/merge_plus_correct.con
+cic:/Coq/field/Field_Theory/merge_plus_correct1.con
+cic:/Coq/field/Field_Theory/monom_remove.con
+cic:/Coq/field/Field_Theory/monom_remove_correct.con
+cic:/Coq/field/Field_Theory/monom_simplif.con
+cic:/Coq/field/Field_Theory/monom_simplif_correct.con
+cic:/Coq/field/Field_Theory/monom_simplif_rem.con
+cic:/Coq/field/Field_Theory/monom_simplif_rem_correct.con
+cic:/Coq/field/Field_Theory/mult_eq.con
+cic:/Coq/field/Field_Theory/mult_of_list.con
+cic:/Coq/field/Field_Theory/multiply.con
+cic:/Coq/field/Field_Theory/multiply_aux.con
+cic:/Coq/field/Field_Theory/multiply_aux_correct.con
+cic:/Coq/field/Field_Theory/multiply_correct.con
+cic:/Coq/field/Field_Theory/r_AmultT_mult.con
+cic:/Coq/field/Field_Theory/r_AplusT_plus.con
+cic:/Coq/fourier/Fourier_util/Rfourier_eqLR_to_le.con
+cic:/Coq/fourier/Fourier_util/Rfourier_eqRL_to_le.con
+cic:/Coq/fourier/Fourier_util/Rfourier_ge_to_le.con
+cic:/Coq/fourier/Fourier_util/Rfourier_gt_to_lt.con
+cic:/Coq/fourier/Fourier_util/Rfourier_le.con
+cic:/Coq/fourier/Fourier_util/Rfourier_le_le.con
+cic:/Coq/fourier/Fourier_util/Rfourier_le_lt.con
+cic:/Coq/fourier/Fourier_util/Rfourier_lt.con
+cic:/Coq/fourier/Fourier_util/Rfourier_lt_le.con
+cic:/Coq/fourier/Fourier_util/Rfourier_lt_lt.con
+cic:/Coq/fourier/Fourier_util/Rfourier_not_ge_lt.con
+cic:/Coq/fourier/Fourier_util/Rfourier_not_gt_le.con
+cic:/Coq/fourier/Fourier_util/Rfourier_not_le_gt.con
+cic:/Coq/fourier/Fourier_util/Rfourier_not_lt_ge.con
+cic:/Coq/fourier/Fourier_util/Rle_mult_inv_pos.con
+cic:/Coq/fourier/Fourier_util/Rle_not_lt.con
+cic:/Coq/fourier/Fourier_util/Rle_zero_1.con
+cic:/Coq/fourier/Fourier_util/Rle_zero_pos_plus1.con
+cic:/Coq/fourier/Fourier_util/Rlt_mult_inv_pos.con
+cic:/Coq/fourier/Fourier_util/Rlt_not_le.con
+cic:/Coq/fourier/Fourier_util/Rlt_zero_1.con
+cic:/Coq/fourier/Fourier_util/Rlt_zero_pos_plus1.con
+cic:/Coq/fourier/Fourier_util/Rnot_le_le.con
+cic:/Coq/fourier/Fourier_util/Rnot_lt0.con
+cic:/Coq/fourier/Fourier_util/Rnot_lt_lt.con
+cic:/Coq/omega/OmegaLemmas/OMEGA1.con
+cic:/Coq/omega/OmegaLemmas/OMEGA10.con
+cic:/Coq/omega/OmegaLemmas/OMEGA11.con
+cic:/Coq/omega/OmegaLemmas/OMEGA12.con
+cic:/Coq/omega/OmegaLemmas/OMEGA13.con
+cic:/Coq/omega/OmegaLemmas/OMEGA14.con
+cic:/Coq/omega/OmegaLemmas/OMEGA15.con
+cic:/Coq/omega/OmegaLemmas/OMEGA16.con
+cic:/Coq/omega/OmegaLemmas/OMEGA17.con
+cic:/Coq/omega/OmegaLemmas/OMEGA18.con
+cic:/Coq/omega/OmegaLemmas/OMEGA19.con
+cic:/Coq/omega/OmegaLemmas/OMEGA2.con
+cic:/Coq/omega/OmegaLemmas/OMEGA20.con
+cic:/Coq/omega/OmegaLemmas/OMEGA3.con
+cic:/Coq/omega/OmegaLemmas/OMEGA4.con
+cic:/Coq/omega/OmegaLemmas/OMEGA5.con
+cic:/Coq/omega/OmegaLemmas/OMEGA6.con
+cic:/Coq/omega/OmegaLemmas/OMEGA7.con
+cic:/Coq/omega/OmegaLemmas/OMEGA8.con
+cic:/Coq/omega/OmegaLemmas/OMEGA9.con
+cic:/Coq/omega/OmegaLemmas/fast_OMEGA10.con
+cic:/Coq/omega/OmegaLemmas/fast_OMEGA11.con
+cic:/Coq/omega/OmegaLemmas/fast_OMEGA12.con
+cic:/Coq/omega/OmegaLemmas/fast_OMEGA13.con
+cic:/Coq/omega/OmegaLemmas/fast_OMEGA14.con
+cic:/Coq/omega/OmegaLemmas/fast_OMEGA15.con
+cic:/Coq/omega/OmegaLemmas/fast_OMEGA16.con
+cic:/Coq/omega/OmegaLemmas/fast_Zmult_Zopp_left.con
+cic:/Coq/omega/OmegaLemmas/fast_Zmult_assoc_r.con
+cic:/Coq/omega/OmegaLemmas/fast_Zmult_plus_distr.con
+cic:/Coq/omega/OmegaLemmas/fast_Zmult_sym.con
+cic:/Coq/omega/OmegaLemmas/fast_Zopp_Zmult_r.con
+cic:/Coq/omega/OmegaLemmas/fast_Zopp_Zopp.con
+cic:/Coq/omega/OmegaLemmas/fast_Zopp_Zplus.con
+cic:/Coq/omega/OmegaLemmas/fast_Zopp_one.con
+cic:/Coq/omega/OmegaLemmas/fast_Zplus_assoc_l.con
+cic:/Coq/omega/OmegaLemmas/fast_Zplus_assoc_r.con
+cic:/Coq/omega/OmegaLemmas/fast_Zplus_permute.con
+cic:/Coq/omega/OmegaLemmas/fast_Zplus_sym.con
+cic:/Coq/omega/OmegaLemmas/fast_Zred_factor0.con
+cic:/Coq/omega/OmegaLemmas/fast_Zred_factor1.con
+cic:/Coq/omega/OmegaLemmas/fast_Zred_factor2.con
+cic:/Coq/omega/OmegaLemmas/fast_Zred_factor3.con
+cic:/Coq/omega/OmegaLemmas/fast_Zred_factor4.con
+cic:/Coq/omega/OmegaLemmas/fast_Zred_factor5.con
+cic:/Coq/omega/OmegaLemmas/fast_Zred_factor6.con
+cic:/Coq/omega/OmegaLemmas/new_var.con
+cic:/Coq/ring/ArithRing/NatTheory.con
+cic:/Coq/ring/ArithRing/S_to_plus_one.con
+cic:/Coq/ring/ArithRing/nateq.con
+cic:/Coq/ring/ArithRing/nateq_prop.con
+cic:/Coq/ring/NArithRing/NTheory.con
+cic:/Coq/ring/NArithRing/Neq.con
+cic:/Coq/ring/NArithRing/Neq_prop.con
+cic:/Coq/ring/Quote/index_eq.con
+cic:/Coq/ring/Quote/index_eq_prop.con
+cic:/Coq/ring/Quote/index_ind.con
+cic:/Coq/ring/Quote/index_lt.con
+cic:/Coq/ring/Quote/index_rec.con
+cic:/Coq/ring/Quote/index_rect.con
+cic:/Coq/ring/Quote/varmap_find.con
+cic:/Coq/ring/Quote/varmap_ind.con
+cic:/Coq/ring/Quote/varmap_rec.con
+cic:/Coq/ring/Quote/varmap_rect.con
+cic:/Coq/ring/Ring/BoolTheory.con
+cic:/Coq/ring/Ring_abstract/abstract_sum_ind.con
+cic:/Coq/ring/Ring_abstract/abstract_sum_merge.con
+cic:/Coq/ring/Ring_abstract/abstract_sum_merge_ok.con
+cic:/Coq/ring/Ring_abstract/abstract_sum_prod.con
+cic:/Coq/ring/Ring_abstract/abstract_sum_prod_ok.con
+cic:/Coq/ring/Ring_abstract/abstract_sum_rec.con
+cic:/Coq/ring/Ring_abstract/abstract_sum_rect.con
+cic:/Coq/ring/Ring_abstract/abstract_sum_scalar.con
+cic:/Coq/ring/Ring_abstract/abstract_sum_scalar_ok.con
+cic:/Coq/ring/Ring_abstract/abstract_varlist_insert.con
+cic:/Coq/ring/Ring_abstract/abstract_varlist_insert_ok.con
+cic:/Coq/ring/Ring_abstract/apolynomial_ind.con
+cic:/Coq/ring/Ring_abstract/apolynomial_normalize.con
+cic:/Coq/ring/Ring_abstract/apolynomial_normalize_ok.con
+cic:/Coq/ring/Ring_abstract/apolynomial_rec.con
+cic:/Coq/ring/Ring_abstract/apolynomial_rect.con
+cic:/Coq/ring/Ring_abstract/aspolynomial_ind.con
+cic:/Coq/ring/Ring_abstract/aspolynomial_normalize.con
+cic:/Coq/ring/Ring_abstract/aspolynomial_normalize_ok.con
+cic:/Coq/ring/Ring_abstract/aspolynomial_rec.con
+cic:/Coq/ring/Ring_abstract/aspolynomial_rect.con
+cic:/Coq/ring/Ring_abstract/iacs_aux.con
+cic:/Coq/ring/Ring_abstract/iacs_aux_ok.con
+cic:/Coq/ring/Ring_abstract/interp_acs.con
+cic:/Coq/ring/Ring_abstract/interp_ap.con
+cic:/Coq/ring/Ring_abstract/interp_asp.con
+cic:/Coq/ring/Ring_abstract/interp_sacs.con
+cic:/Coq/ring/Ring_abstract/isacs_aux.con
+cic:/Coq/ring/Ring_abstract/isacs_aux_ok.con
+cic:/Coq/ring/Ring_abstract/minus_sum_scalar.con
+cic:/Coq/ring/Ring_abstract/minus_sum_scalar_ok.con
+cic:/Coq/ring/Ring_abstract/minus_varlist_insert.con
+cic:/Coq/ring/Ring_abstract/minus_varlist_insert_ok.con
+cic:/Coq/ring/Ring_abstract/plus_sum_scalar.con
+cic:/Coq/ring/Ring_abstract/plus_sum_scalar_ok.con
+cic:/Coq/ring/Ring_abstract/plus_varlist_insert.con
+cic:/Coq/ring/Ring_abstract/plus_varlist_insert_ok.con
+cic:/Coq/ring/Ring_abstract/signed_sum_ind.con
+cic:/Coq/ring/Ring_abstract/signed_sum_merge.con
+cic:/Coq/ring/Ring_abstract/signed_sum_merge_ok.con
+cic:/Coq/ring/Ring_abstract/signed_sum_opp.con
+cic:/Coq/ring/Ring_abstract/signed_sum_opp_ok.con
+cic:/Coq/ring/Ring_abstract/signed_sum_prod.con
+cic:/Coq/ring/Ring_abstract/signed_sum_prod_ok.con
+cic:/Coq/ring/Ring_abstract/signed_sum_rec.con
+cic:/Coq/ring/Ring_abstract/signed_sum_rect.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_ind.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_merge.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_merge_ok.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_prod.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_prod_ok.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_rec.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_rect.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_scalar.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_scalar2.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_scalar2_ok.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_scalar3.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_scalar3_ok.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_scalar_ok.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_simplify.con
+cic:/Coq/ring/Ring_normalize/canonical_sum_simplify_ok.con
+cic:/Coq/ring/Ring_normalize/ics_aux.con
+cic:/Coq/ring/Ring_normalize/ics_aux_ok.con
+cic:/Coq/ring/Ring_normalize/index_eq_prop.con
+cic:/Coq/ring/Ring_normalize/interp_cs.con
+cic:/Coq/ring/Ring_normalize/interp_m.con
+cic:/Coq/ring/Ring_normalize/interp_m_ok.con
+cic:/Coq/ring/Ring_normalize/interp_p.con
+cic:/Coq/ring/Ring_normalize/interp_sp.con
+cic:/Coq/ring/Ring_normalize/interp_var.con
+cic:/Coq/ring/Ring_normalize/interp_vl.con
+cic:/Coq/ring/Ring_normalize/ivl_aux.con
+cic:/Coq/ring/Ring_normalize/ivl_aux_ok.con
+cic:/Coq/ring/Ring_normalize/monom_insert.con
+cic:/Coq/ring/Ring_normalize/monom_insert_ok.con
+cic:/Coq/ring/Ring_normalize/polynomial_ind.con
+cic:/Coq/ring/Ring_normalize/polynomial_normalize.con
+cic:/Coq/ring/Ring_normalize/polynomial_normalize_ok.con
+cic:/Coq/ring/Ring_normalize/polynomial_rec.con
+cic:/Coq/ring/Ring_normalize/polynomial_rect.con
+cic:/Coq/ring/Ring_normalize/polynomial_simplify.con
+cic:/Coq/ring/Ring_normalize/polynomial_simplify_ok.con
+cic:/Coq/ring/Ring_normalize/spolynomial_ind.con
+cic:/Coq/ring/Ring_normalize/spolynomial_normalize.con
+cic:/Coq/ring/Ring_normalize/spolynomial_normalize_ok.con
+cic:/Coq/ring/Ring_normalize/spolynomial_of.con
+cic:/Coq/ring/Ring_normalize/spolynomial_of_ok.con
+cic:/Coq/ring/Ring_normalize/spolynomial_rec.con
+cic:/Coq/ring/Ring_normalize/spolynomial_rect.con
+cic:/Coq/ring/Ring_normalize/spolynomial_simplify.con
+cic:/Coq/ring/Ring_normalize/spolynomial_simplify_ok.con
+cic:/Coq/ring/Ring_normalize/varlist_eq.con
+cic:/Coq/ring/Ring_normalize/varlist_eq_prop.con
+cic:/Coq/ring/Ring_normalize/varlist_ind.con
+cic:/Coq/ring/Ring_normalize/varlist_insert.con
+cic:/Coq/ring/Ring_normalize/varlist_insert_ok.con
+cic:/Coq/ring/Ring_normalize/varlist_lt.con
+cic:/Coq/ring/Ring_normalize/varlist_merge.con
+cic:/Coq/ring/Ring_normalize/varlist_merge_ok.con
+cic:/Coq/ring/Ring_normalize/varlist_rec.con
+cic:/Coq/ring/Ring_normalize/varlist_rect.con
+cic:/Coq/ring/Ring_theory/Ring_Theory_ind.con
+cic:/Coq/ring/Ring_theory/Ring_Theory_rec.con
+cic:/Coq/ring/Ring_theory/Ring_Theory_rect.con
+cic:/Coq/ring/Ring_theory/SR_distr_left.con
+cic:/Coq/ring/Ring_theory/SR_distr_left2.con
+cic:/Coq/ring/Ring_theory/SR_distr_right.con
+cic:/Coq/ring/Ring_theory/SR_distr_right2.con
+cic:/Coq/ring/Ring_theory/SR_eq_prop.con
+cic:/Coq/ring/Ring_theory/SR_mult_assoc.con
+cic:/Coq/ring/Ring_theory/SR_mult_assoc2.con
+cic:/Coq/ring/Ring_theory/SR_mult_comm.con
+cic:/Coq/ring/Ring_theory/SR_mult_one_left.con
+cic:/Coq/ring/Ring_theory/SR_mult_one_left2.con
+cic:/Coq/ring/Ring_theory/SR_mult_one_right.con
+cic:/Coq/ring/Ring_theory/SR_mult_one_right2.con
+cic:/Coq/ring/Ring_theory/SR_mult_permute.con
+cic:/Coq/ring/Ring_theory/SR_mult_zero_left.con
+cic:/Coq/ring/Ring_theory/SR_mult_zero_left2.con
+cic:/Coq/ring/Ring_theory/SR_mult_zero_right.con
+cic:/Coq/ring/Ring_theory/SR_mult_zero_right2.con
+cic:/Coq/ring/Ring_theory/SR_plus_assoc.con
+cic:/Coq/ring/Ring_theory/SR_plus_assoc2.con
+cic:/Coq/ring/Ring_theory/SR_plus_comm.con
+cic:/Coq/ring/Ring_theory/SR_plus_permute.con
+cic:/Coq/ring/Ring_theory/SR_plus_reg_left.con
+cic:/Coq/ring/Ring_theory/SR_plus_reg_right.con
+cic:/Coq/ring/Ring_theory/SR_plus_zero_left.con
+cic:/Coq/ring/Ring_theory/SR_plus_zero_left2.con
+cic:/Coq/ring/Ring_theory/SR_plus_zero_right.con
+cic:/Coq/ring/Ring_theory/SR_plus_zero_right2.con
+cic:/Coq/ring/Ring_theory/Semi_Ring_Theory_ind.con
+cic:/Coq/ring/Ring_theory/Semi_Ring_Theory_of.con
+cic:/Coq/ring/Ring_theory/Semi_Ring_Theory_rec.con
+cic:/Coq/ring/Ring_theory/Semi_Ring_Theory_rect.con
+cic:/Coq/ring/Ring_theory/Th_distr_left.con
+cic:/Coq/ring/Ring_theory/Th_distr_left2.con
+cic:/Coq/ring/Ring_theory/Th_distr_right.con
+cic:/Coq/ring/Ring_theory/Th_distr_right2.con
+cic:/Coq/ring/Ring_theory/Th_eq_prop.con
+cic:/Coq/ring/Ring_theory/Th_mult_assoc.con
+cic:/Coq/ring/Ring_theory/Th_mult_assoc2.con
+cic:/Coq/ring/Ring_theory/Th_mult_one_left.con
+cic:/Coq/ring/Ring_theory/Th_mult_one_left2.con
+cic:/Coq/ring/Ring_theory/Th_mult_one_right.con
+cic:/Coq/ring/Ring_theory/Th_mult_one_right2.con
+cic:/Coq/ring/Ring_theory/Th_mult_opp_opp.con
+cic:/Coq/ring/Ring_theory/Th_mult_opp_opp2.con
+cic:/Coq/ring/Ring_theory/Th_mult_permute.con
+cic:/Coq/ring/Ring_theory/Th_mult_sym.con
+cic:/Coq/ring/Ring_theory/Th_mult_zero_left.con
+cic:/Coq/ring/Ring_theory/Th_mult_zero_left2.con
+cic:/Coq/ring/Ring_theory/Th_mult_zero_right.con
+cic:/Coq/ring/Ring_theory/Th_mult_zero_right2.con
+cic:/Coq/ring/Ring_theory/Th_opp_def.con
+cic:/Coq/ring/Ring_theory/Th_opp_def2.con
+cic:/Coq/ring/Ring_theory/Th_opp_mult_left.con
+cic:/Coq/ring/Ring_theory/Th_opp_mult_left2.con
+cic:/Coq/ring/Ring_theory/Th_opp_mult_right.con
+cic:/Coq/ring/Ring_theory/Th_opp_mult_right2.con
+cic:/Coq/ring/Ring_theory/Th_opp_opp.con
+cic:/Coq/ring/Ring_theory/Th_opp_opp2.con
+cic:/Coq/ring/Ring_theory/Th_opp_zero.con
+cic:/Coq/ring/Ring_theory/Th_plus_assoc.con
+cic:/Coq/ring/Ring_theory/Th_plus_assoc2.con
+cic:/Coq/ring/Ring_theory/Th_plus_comm.con
+cic:/Coq/ring/Ring_theory/Th_plus_opp_opp.con
+cic:/Coq/ring/Ring_theory/Th_plus_permute.con
+cic:/Coq/ring/Ring_theory/Th_plus_permute_opp.con
+cic:/Coq/ring/Ring_theory/Th_plus_reg_left.con
+cic:/Coq/ring/Ring_theory/Th_plus_reg_right.con
+cic:/Coq/ring/Ring_theory/Th_plus_zero_left.con
+cic:/Coq/ring/Ring_theory/Th_plus_zero_left2.con
+cic:/Coq/ring/Ring_theory/Th_plus_zero_right.con
+cic:/Coq/ring/Ring_theory/Th_plus_zero_right2.con
+cic:/Coq/ring/Ring_theory/aux1.con
+cic:/Coq/ring/Ring_theory/aux2.con
+cic:/Coq/ring/Setoid_ring_normalize/Amult_ext.con
+cic:/Coq/ring/Setoid_ring_normalize/Aopp_ext.con
+cic:/Coq/ring/Setoid_ring_normalize/Aplus_ext.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_ind.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_merge.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_merge_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_prod.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_prod_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_rec.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_rect.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar2.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar2_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar3.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar3_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_scalar_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_simplify.con
+cic:/Coq/ring/Setoid_ring_normalize/canonical_sum_simplify_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/ics_aux.con
+cic:/Coq/ring/Setoid_ring_normalize/ics_aux_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/index_eq_prop.con
+cic:/Coq/ring/Setoid_ring_normalize/interp_m.con
+cic:/Coq/ring/Setoid_ring_normalize/interp_m_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/interp_setcs.con
+cic:/Coq/ring/Setoid_ring_normalize/interp_setp.con
+cic:/Coq/ring/Setoid_ring_normalize/interp_setsp.con
+cic:/Coq/ring/Setoid_ring_normalize/interp_var.con
+cic:/Coq/ring/Setoid_ring_normalize/interp_vl.con
+cic:/Coq/ring/Setoid_ring_normalize/ivl_aux.con
+cic:/Coq/ring/Setoid_ring_normalize/ivl_aux_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/monom_insert.con
+cic:/Coq/ring/Setoid_ring_normalize/monom_insert_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/setoid_eq_ext1.con
+cic:/Coq/ring/Setoid_ring_normalize/setoid_eq_ext2.con
+cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_ind.con
+cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_normalize.con
+cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_normalize_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_rec.con
+cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_rect.con
+cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_simplify.con
+cic:/Coq/ring/Setoid_ring_normalize/setpolynomial_simplify_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_ind.con
+cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_normalize.con
+cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_normalize_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_of.con
+cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_of_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_rec.con
+cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_rect.con
+cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_simplify.con
+cic:/Coq/ring/Setoid_ring_normalize/setspolynomial_simplify_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_eq.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_eq_prop.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_ind.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_insert.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_insert_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_lt.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_merge.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_merge_ok.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_rec.con
+cic:/Coq/ring/Setoid_ring_normalize/varlist_rect.con
+cic:/Coq/ring/Setoid_ring_theory/Amult_ext.con
+cic:/Coq/ring/Setoid_ring_theory/Aopp_ext.con
+cic:/Coq/ring/Setoid_ring_theory/Aplus_ext.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_distr_left.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_distr_left2.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_distr_right.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_distr_right2.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_eq_prop.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_assoc.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_assoc2.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_comm.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_one_left.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_one_left2.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_one_right.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_one_right2.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_permute.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_zero_left.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_zero_left2.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_zero_right.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_mult_zero_right2.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_assoc.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_assoc2.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_comm.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_permute.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_reg_left.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_reg_right.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_zero_left.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_zero_left2.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_zero_right.con
+cic:/Coq/ring/Setoid_ring_theory/SSR_plus_zero_right2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_distr_left.con
+cic:/Coq/ring/Setoid_ring_theory/STh_distr_left2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_distr_right.con
+cic:/Coq/ring/Setoid_ring_theory/STh_distr_right2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_eq_prop.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_assoc.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_assoc2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_one_left.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_one_left2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_one_right.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_one_right2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_opp_opp.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_opp_opp2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_permute.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_sym.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_zero_left.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_zero_left2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_zero_right.con
+cic:/Coq/ring/Setoid_ring_theory/STh_mult_zero_right2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_opp_def.con
+cic:/Coq/ring/Setoid_ring_theory/STh_opp_def2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_opp_mult_left.con
+cic:/Coq/ring/Setoid_ring_theory/STh_opp_mult_left2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_opp_mult_right.con
+cic:/Coq/ring/Setoid_ring_theory/STh_opp_mult_right2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_opp_opp.con
+cic:/Coq/ring/Setoid_ring_theory/STh_opp_opp2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_opp_zero.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_assoc.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_assoc2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_comm.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_opp_opp.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_permute.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_permute_opp.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_reg_left.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_reg_right.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_zero_left.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_zero_left2.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_zero_right.con
+cic:/Coq/ring/Setoid_ring_theory/STh_plus_zero_right2.con
+cic:/Coq/ring/Setoid_ring_theory/Saux1.con
+cic:/Coq/ring/Setoid_ring_theory/Saux2.con
+cic:/Coq/ring/Setoid_ring_theory/Semi_Setoid_Ring_Theory_ind.con
+cic:/Coq/ring/Setoid_ring_theory/Semi_Setoid_Ring_Theory_of.con
+cic:/Coq/ring/Setoid_ring_theory/Semi_Setoid_Ring_Theory_rec.con
+cic:/Coq/ring/Setoid_ring_theory/Semi_Setoid_Ring_Theory_rect.con
+cic:/Coq/ring/Setoid_ring_theory/Setoid_Ring_Theory_ind.con
+cic:/Coq/ring/Setoid_ring_theory/Setoid_Ring_Theory_rec.con
+cic:/Coq/ring/Setoid_ring_theory/Setoid_Ring_Theory_rect.con
+cic:/Coq/ring/Setoid_ring_theory/setoid_eq_ext1.con
+cic:/Coq/ring/Setoid_ring_theory/setoid_eq_ext2.con
+cic:/Coq/ring/ZArithRing/ZTheory.con
+cic:/Coq/ring/ZArithRing/Zeq.con
+cic:/Coq/ring/ZArithRing/Zeq_prop.con
+cic:/Coq/romega/ReflOmegaCore/PropList_ind.con
+cic:/Coq/romega/ReflOmegaCore/PropList_rec.con
+cic:/Coq/romega/ReflOmegaCore/PropList_rect.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA10.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA10_stable.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA11.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA11_stable.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA12.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA12_stable.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA13.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA13_stable.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA15.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA15_stable.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA16.con
+cic:/Coq/romega/ReflOmegaCore/T_OMEGA16_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tminus_def.con
+cic:/Coq/romega/ReflOmegaCore/Tminus_def_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_assoc_r.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_assoc_r_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_assoc_reduced.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_assoc_reduced_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_opp_left.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_opp_left_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_plus_distr.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_plus_distr_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_sym.con
+cic:/Coq/romega/ReflOmegaCore/Tmult_sym_stable.con
+cic:/Coq/romega/ReflOmegaCore/Topp_mult_r.con
+cic:/Coq/romega/ReflOmegaCore/Topp_mult_r_stable.con
+cic:/Coq/romega/ReflOmegaCore/Topp_one.con
+cic:/Coq/romega/ReflOmegaCore/Topp_one_stable.con
+cic:/Coq/romega/ReflOmegaCore/Topp_opp.con
+cic:/Coq/romega/ReflOmegaCore/Topp_opp_stable.con
+cic:/Coq/romega/ReflOmegaCore/Topp_plus.con
+cic:/Coq/romega/ReflOmegaCore/Topp_plus_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tplus_assoc_l.con
+cic:/Coq/romega/ReflOmegaCore/Tplus_assoc_l_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tplus_assoc_r.con
+cic:/Coq/romega/ReflOmegaCore/Tplus_assoc_r_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tplus_permute.con
+cic:/Coq/romega/ReflOmegaCore/Tplus_permute_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tplus_sym.con
+cic:/Coq/romega/ReflOmegaCore/Tplus_sym_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor0.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor0_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor1.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor1_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor2.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor2_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor3.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor3_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor4.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor4_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor5.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor5_stable.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor6.con
+cic:/Coq/romega/ReflOmegaCore/Tred_factor6_stable.con
+cic:/Coq/romega/ReflOmegaCore/Zlt_left_inv.con
+cic:/Coq/romega/ReflOmegaCore/Zne_left_2.con
+cic:/Coq/romega/ReflOmegaCore/absurd.con
+cic:/Coq/romega/ReflOmegaCore/add_norm.con
+cic:/Coq/romega/ReflOmegaCore/add_norm_stable.con
+cic:/Coq/romega/ReflOmegaCore/append_goal.con
+cic:/Coq/romega/ReflOmegaCore/append_valid.con
+cic:/Coq/romega/ReflOmegaCore/apply_both.con
+cic:/Coq/romega/ReflOmegaCore/apply_both_stable.con
+cic:/Coq/romega/ReflOmegaCore/apply_left.con
+cic:/Coq/romega/ReflOmegaCore/apply_left_stable.con
+cic:/Coq/romega/ReflOmegaCore/apply_oper_1.con
+cic:/Coq/romega/ReflOmegaCore/apply_oper_1_valid.con
+cic:/Coq/romega/ReflOmegaCore/apply_oper_2.con
+cic:/Coq/romega/ReflOmegaCore/apply_oper_2_valid.con
+cic:/Coq/romega/ReflOmegaCore/apply_right.con
+cic:/Coq/romega/ReflOmegaCore/apply_right_stable.con
+cic:/Coq/romega/ReflOmegaCore/bool_ind2.con
+cic:/Coq/romega/ReflOmegaCore/co_valid1.con
+cic:/Coq/romega/ReflOmegaCore/compose_term_stable.con
+cic:/Coq/romega/ReflOmegaCore/concl_to_hyp.con
+cic:/Coq/romega/ReflOmegaCore/constant_neg.con
+cic:/Coq/romega/ReflOmegaCore/constant_neg_valid.con
+cic:/Coq/romega/ReflOmegaCore/constant_not_nul.con
+cic:/Coq/romega/ReflOmegaCore/constant_not_nul_valid.con
+cic:/Coq/romega/ReflOmegaCore/constant_nul.con
+cic:/Coq/romega/ReflOmegaCore/constant_nul_valid.con
+cic:/Coq/romega/ReflOmegaCore/contradiction.con
+cic:/Coq/romega/ReflOmegaCore/contradiction_valid.con
+cic:/Coq/romega/ReflOmegaCore/decidability.con
+cic:/Coq/romega/ReflOmegaCore/decidable_correct.con
+cic:/Coq/romega/ReflOmegaCore/decompose_solve.con
+cic:/Coq/romega/ReflOmegaCore/decompose_solve_valid.con
+cic:/Coq/romega/ReflOmegaCore/destructure_hyps.con
+cic:/Coq/romega/ReflOmegaCore/destructure_hyps_valid.con
+cic:/Coq/romega/ReflOmegaCore/direction_ind.con
+cic:/Coq/romega/ReflOmegaCore/direction_rec.con
+cic:/Coq/romega/ReflOmegaCore/direction_rect.con
+cic:/Coq/romega/ReflOmegaCore/divide_and_approx.con
+cic:/Coq/romega/ReflOmegaCore/divide_and_approx_valid.con
+cic:/Coq/romega/ReflOmegaCore/do_concl_to_hyp.con
+cic:/Coq/romega/ReflOmegaCore/do_normalize.con
+cic:/Coq/romega/ReflOmegaCore/do_normalize_list.con
+cic:/Coq/romega/ReflOmegaCore/do_normalize_list_valid.con
+cic:/Coq/romega/ReflOmegaCore/do_normalize_valid.con
+cic:/Coq/romega/ReflOmegaCore/do_omega.con
+cic:/Coq/romega/ReflOmegaCore/do_reduce_lhyps.con
+cic:/Coq/romega/ReflOmegaCore/e_step_ind.con
+cic:/Coq/romega/ReflOmegaCore/e_step_rec.con
+cic:/Coq/romega/ReflOmegaCore/e_step_rect.con
+cic:/Coq/romega/ReflOmegaCore/eq_Z.con
+cic:/Coq/romega/ReflOmegaCore/eq_Z_false.con
+cic:/Coq/romega/ReflOmegaCore/eq_Z_true.con
+cic:/Coq/romega/ReflOmegaCore/eq_nat.con
+cic:/Coq/romega/ReflOmegaCore/eq_nat_false.con
+cic:/Coq/romega/ReflOmegaCore/eq_nat_true.con
+cic:/Coq/romega/ReflOmegaCore/eq_pos.con
+cic:/Coq/romega/ReflOmegaCore/eq_pos_false.con
+cic:/Coq/romega/ReflOmegaCore/eq_pos_true.con
+cic:/Coq/romega/ReflOmegaCore/eq_term.con
+cic:/Coq/romega/ReflOmegaCore/eq_term_false.con
+cic:/Coq/romega/ReflOmegaCore/eq_term_true.con
+cic:/Coq/romega/ReflOmegaCore/exact_divide.con
+cic:/Coq/romega/ReflOmegaCore/exact_divide_valid.con
+cic:/Coq/romega/ReflOmegaCore/execute_goal.con
+cic:/Coq/romega/ReflOmegaCore/execute_omega.con
+cic:/Coq/romega/ReflOmegaCore/extract_hyp_neg.con
+cic:/Coq/romega/ReflOmegaCore/extract_hyp_pos.con
+cic:/Coq/romega/ReflOmegaCore/extract_valid.con
+cic:/Coq/romega/ReflOmegaCore/fusion.con
+cic:/Coq/romega/ReflOmegaCore/fusion_cancel.con
+cic:/Coq/romega/ReflOmegaCore/fusion_cancel_stable.con
+cic:/Coq/romega/ReflOmegaCore/fusion_right.con
+cic:/Coq/romega/ReflOmegaCore/fusion_stable.con
+cic:/Coq/romega/ReflOmegaCore/goal_to_hyps.con
+cic:/Coq/romega/ReflOmegaCore/goal_valid.con
+cic:/Coq/romega/ReflOmegaCore/h_step_ind.con
+cic:/Coq/romega/ReflOmegaCore/h_step_rec.con
+cic:/Coq/romega/ReflOmegaCore/h_step_rect.con
+cic:/Coq/romega/ReflOmegaCore/hyps_to_goal.con
+cic:/Coq/romega/ReflOmegaCore/interp_full.con
+cic:/Coq/romega/ReflOmegaCore/interp_full_false.con
+cic:/Coq/romega/ReflOmegaCore/interp_full_goal.con
+cic:/Coq/romega/ReflOmegaCore/interp_goal_concl.con
+cic:/Coq/romega/ReflOmegaCore/interp_hyps.con
+cic:/Coq/romega/ReflOmegaCore/interp_list_goal.con
+cic:/Coq/romega/ReflOmegaCore/interp_list_hyps.con
+cic:/Coq/romega/ReflOmegaCore/interp_proposition.con
+cic:/Coq/romega/ReflOmegaCore/interp_term.con
+cic:/Coq/romega/ReflOmegaCore/list_goal_to_hyps.con
+cic:/Coq/romega/ReflOmegaCore/list_hyps_to_goal.con
+cic:/Coq/romega/ReflOmegaCore/map_cons.con
+cic:/Coq/romega/ReflOmegaCore/map_cons_val.con
+cic:/Coq/romega/ReflOmegaCore/merge_eq.con
+cic:/Coq/romega/ReflOmegaCore/merge_eq_valid.con
+cic:/Coq/romega/ReflOmegaCore/move_right.con
+cic:/Coq/romega/ReflOmegaCore/move_right_stable.con
+cic:/Coq/romega/ReflOmegaCore/move_right_valid.con
+cic:/Coq/romega/ReflOmegaCore/negate_contradict.con
+cic:/Coq/romega/ReflOmegaCore/negate_contradict_inv.con
+cic:/Coq/romega/ReflOmegaCore/negate_contradict_inv_valid.con
+cic:/Coq/romega/ReflOmegaCore/negate_contradict_valid.con
+cic:/Coq/romega/ReflOmegaCore/normalize_goal.con
+cic:/Coq/romega/ReflOmegaCore/normalize_hyps.con
+cic:/Coq/romega/ReflOmegaCore/normalize_hyps_goal.con
+cic:/Coq/romega/ReflOmegaCore/normalize_hyps_valid.con
+cic:/Coq/romega/ReflOmegaCore/not_exact_divide.con
+cic:/Coq/romega/ReflOmegaCore/not_exact_divide_valid.con
+cic:/Coq/romega/ReflOmegaCore/nthProp.con
+cic:/Coq/romega/ReflOmegaCore/nth_hyps.con
+cic:/Coq/romega/ReflOmegaCore/nth_valid.con
+cic:/Coq/romega/ReflOmegaCore/omega_tactic.con
+cic:/Coq/romega/ReflOmegaCore/omega_valid.con
+cic:/Coq/romega/ReflOmegaCore/p_apply_left.con
+cic:/Coq/romega/ReflOmegaCore/p_apply_left_stable.con
+cic:/Coq/romega/ReflOmegaCore/p_apply_right.con
+cic:/Coq/romega/ReflOmegaCore/p_apply_right_stable.con
+cic:/Coq/romega/ReflOmegaCore/p_invert.con
+cic:/Coq/romega/ReflOmegaCore/p_invert_stable.con
+cic:/Coq/romega/ReflOmegaCore/p_rewrite.con
+cic:/Coq/romega/ReflOmegaCore/p_rewrite_stable.con
+cic:/Coq/romega/ReflOmegaCore/p_step_ind.con
+cic:/Coq/romega/ReflOmegaCore/p_step_rec.con
+cic:/Coq/romega/ReflOmegaCore/p_step_rect.con
+cic:/Coq/romega/ReflOmegaCore/prop_stable.con
+cic:/Coq/romega/ReflOmegaCore/proposition_ind.con
+cic:/Coq/romega/ReflOmegaCore/proposition_rec.con
+cic:/Coq/romega/ReflOmegaCore/proposition_rect.con
+cic:/Coq/romega/ReflOmegaCore/reduce.con
+cic:/Coq/romega/ReflOmegaCore/reduce_lhyps.con
+cic:/Coq/romega/ReflOmegaCore/reduce_lhyps_valid.con
+cic:/Coq/romega/ReflOmegaCore/reduce_stable.con
+cic:/Coq/romega/ReflOmegaCore/relation_ind2.con
+cic:/Coq/romega/ReflOmegaCore/rewrite.con
+cic:/Coq/romega/ReflOmegaCore/rewrite_stable.con
+cic:/Coq/romega/ReflOmegaCore/scalar_norm.con
+cic:/Coq/romega/ReflOmegaCore/scalar_norm_add.con
+cic:/Coq/romega/ReflOmegaCore/scalar_norm_add_stable.con
+cic:/Coq/romega/ReflOmegaCore/scalar_norm_stable.con
+cic:/Coq/romega/ReflOmegaCore/split_ineq.con
+cic:/Coq/romega/ReflOmegaCore/split_ineq_valid.con
+cic:/Coq/romega/ReflOmegaCore/state.con
+cic:/Coq/romega/ReflOmegaCore/state_valid.con
+cic:/Coq/romega/ReflOmegaCore/step_ind.con
+cic:/Coq/romega/ReflOmegaCore/step_rec.con
+cic:/Coq/romega/ReflOmegaCore/step_rect.con
+cic:/Coq/romega/ReflOmegaCore/sum.con
+cic:/Coq/romega/ReflOmegaCore/sum1.con
+cic:/Coq/romega/ReflOmegaCore/sum2.con
+cic:/Coq/romega/ReflOmegaCore/sum3.con
+cic:/Coq/romega/ReflOmegaCore/sum4.con
+cic:/Coq/romega/ReflOmegaCore/sum5.con
+cic:/Coq/romega/ReflOmegaCore/sum_valid.con
+cic:/Coq/romega/ReflOmegaCore/t_fusion_ind.con
+cic:/Coq/romega/ReflOmegaCore/t_fusion_rec.con
+cic:/Coq/romega/ReflOmegaCore/t_fusion_rect.con
+cic:/Coq/romega/ReflOmegaCore/t_omega_ind.con
+cic:/Coq/romega/ReflOmegaCore/t_omega_rec.con
+cic:/Coq/romega/ReflOmegaCore/t_omega_rect.con
+cic:/Coq/romega/ReflOmegaCore/term_ind.con
+cic:/Coq/romega/ReflOmegaCore/term_rec.con
+cic:/Coq/romega/ReflOmegaCore/term_rect.con
+cic:/Coq/romega/ReflOmegaCore/term_stable.con
+cic:/Coq/romega/ReflOmegaCore/to_contradict.con
+cic:/Coq/romega/ReflOmegaCore/to_contradict_valid.con
+cic:/Coq/romega/ReflOmegaCore/valid1.con
+cic:/Coq/romega/ReflOmegaCore/valid2.con
+cic:/Coq/romega/ReflOmegaCore/valid_goal.con
+cic:/Coq/romega/ReflOmegaCore/valid_hyps.con
+cic:/Coq/romega/ReflOmegaCore/valid_lhyps.con
+cic:/Coq/romega/ReflOmegaCore/valid_list_goal.con
+cic:/Coq/romega/ReflOmegaCore/valid_list_hyps.con
diff --git a/daemons/whelp/searchEngine.conf.xml.sample b/daemons/whelp/searchEngine.conf.xml.sample
new file mode 100644 (file)
index 0000000..6d64602
--- /dev/null
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<helm_registry>
+  <section name="db">
+    <key name="host">mowgli.cs.unibo.it</key>
+    <key name="user">helm</key>
+    <key name="database">mowgli</key>
+  </section>
+  <section name="getter">
+    <!-- CSC: it was like that before!
+    <key name="mode">remote</key>
+    <key name="url">http://localhost:58081/</key> -->
+    <key name="cache_dir">/tmp/helm/cache</key>
+    <key name="dtd_dir">/projects/helm/xml/dtd</key>
+    <key name="port">58081</key>
+    <key name="log_level">180</key>
+    <key name="log_file">/projects/helm/daemons/log/http_getter.log</key>
+    <key name="prefix">
+      theory:/  file:///projects/helm/library/theories/
+    </key>
+    <key name="prefix">
+      xslt:/    file:///projects/helm/xml/stylesheets_ccorn/
+    </key>
+    <key name="prefix">
+      xslt:/    file:///projects/helm/xml/stylesheets_hanane/
+    </key>
+    <key name="prefix">
+      xslt:/    file:///projects/helm/xml/on-line/xslt/
+    </key>
+    <key name="prefix">
+      xslt:/    file:///projects/helm/nuprl/NuPRL/nuprl_stylesheets/
+    </key>
+    <key name="prefix">
+      nuprl:/   http://www.cs.uwyo.edu/~nuprl/helm-library/
+    </key>
+    <key name="prefix">
+      cic:/     file:///projects/helm/library/coq_contribs/
+    </key>
+    <key name="prefix">
+      xslt:/    file:///projects/helm/xml/stylesheets/
+    </key>
+    <key name="prefix">
+      xslt:/    file:///projects/helm/xml/stylesheets/generated/
+    </key>
+    <key name="prefix">
+      theory:/residual_theory_in_lambda_calculus/
+      http://helm.cs.unibo.it/~sacerdot/huet_lambda_calculus_mowgli/residual_theory_in_lambda_calculus/
+    </key>
+    <key name="prefix">
+      theory:/IDA/
+      http://mowgli.cs.unibo.it/~sacerdot/ida/IDA/
+    </key>
+  </section>
+  <section name="search_engine">
+    <key name="html_dir">html</key>
+    <key name="port">58085</key>
+    <key name="results_per_page">10</key>
+    <!-- file from which restore CicEnvironment status -->
+    <key name="environment_dump">foo.env</key>
+    <key name="notations">/projects/helm/daemons/matita/core_notation.moo</key>
+    <key name="interpretations">/projects/helm/daemons/matita/coq.moo</key>
+  </section>
+</helm_registry>
diff --git a/daemons/whelp/searchEngine.ml b/daemons/whelp/searchEngine.ml
new file mode 100644 (file)
index 0000000..c42c010
--- /dev/null
@@ -0,0 +1,505 @@
+(* Copyright (C) 2002-2005, HELM Team.
+ * 
+ * This file is part of HELM, an Hypertextual, Electronic
+ * Library of Mathematics, developed at the Computer Science
+ * Department, University of Bologna, Italy.
+ * 
+ * HELM is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * HELM is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HELM; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA  02111-1307, USA.
+ * 
+ * For details, see the HELM World-Wide-Web page,
+ * http://cs.unibo.it/helm/.
+ *)
+
+open Printf
+
+let debug = true
+let debug_print s = if debug then prerr_endline s
+let _ = Http_common.debug := false
+
+exception Chat_unfinished
+exception Unbound_identifier of string
+exception Invalid_action of string  (* invalid action for "/search" method *)
+
+  (** raised by elim when a MutInd is required but not found *)
+exception Not_a_MutInd
+
+let daemon_name = "Whelp"
+let configuration_file = "/projects/helm/etc/whelp.conf.xml"
+
+let placeholders = [
+  "ACTION"; "ADVANCED"; "ADVANCED_CHECKED"; "CHOICES"; "CURRENT_CHOICES";
+  "EXPRESSION"; "ID"; "IDEN"; "ID_TO_URIS"; "INTERPRETATIONS";
+  "INTERPRETATIONS_LABELS"; "MSG"; "NEW_ALIASES"; "NEXT_LINK"; "NO_CHOICES";
+  "PAGE"; "PAGES"; "PAGELIST"; "PREV_LINK"; "QUERY_KIND"; "QUERY_SUMMARY"; "RESULTS";
+  "SEARCH_ENGINE_URL"; "SIMPLE_CHECKED"; "TITLE";
+]
+
+let tag =
+  let regexps = Hashtbl.create 25 in
+  List.iter
+    (fun tag -> Hashtbl.add regexps tag (Pcre.regexp (sprintf "@%s@" tag)))
+    placeholders;
+  fun name ->
+    try
+      Hashtbl.find regexps name
+    with Not_found -> assert false
+
+  (* First of all we load the configuration *)
+let _ = Helm_registry.load_from configuration_file
+let port = Helm_registry.get_int "search_engine.port"
+let pages_dir = Helm_registry.get "search_engine.html_dir"
+
+let moogle_TPL = pages_dir ^ "/moogle.html"
+let choices_TPL = pages_dir ^ "/moogle_chat.html"
+
+let my_own_url =
+ let ic = Unix.open_process_in "hostname -f" in
+ let hostname = input_line ic in
+ ignore (Unix.close_process_in ic);
+ sprintf "http://%s:%d" hostname port
+let _ = Helm_registry.set "search_engine.my_own_url" my_own_url
+
+let bad_request body outchan =
+  Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request)) ~body
+    outchan
+
+  (** chain application of Pcre substitutions *)
+let rec apply_substs substs line =
+  match substs with
+  | [] -> line
+  | (rex, templ) :: rest -> apply_substs rest (Pcre.replace ~rex ~templ line)
+  (** fold like function on files *)
+let fold_file f init fname =
+  let inchan = open_in fname in
+  let rec fold_lines' value =
+    try 
+      let line = input_line inchan in 
+      fold_lines' (f value line)
+    with End_of_file -> value
+  in
+  let res = (try fold_lines' init with e -> (close_in inchan; raise e)) in
+  close_in inchan;
+  res
+  (** iter like function on files *)
+let iter_file f = fold_file (fun _ line -> f line) ()
+let javascript_quote s =
+ let rex = Pcre.regexp "'" in
+ let rex' = Pcre.regexp "\"" in
+  Pcre.replace ~rex ~templ:"\\'"
+   (Pcre.replace ~rex:rex' ~templ:"\\\"" s)
+let string_tail s =
+  let len = String.length s in
+  String.sub s 1 (len-1)
+let nonvar uri =
+  let s = UriManager.string_of_uri uri in
+  let len = String.length s in
+  let suffix = String.sub s (len-4) 4 in
+  not (suffix  = ".var")
+
+let add_param_substs params =
+  List.map
+    (fun (key,value) ->
+      let key' = (Pcre.extract ~pat:"param\\.(.*)" key).(1) in
+      Pcre.regexp ("@" ^ key' ^ "@"), value)
+    (List.filter
+      (fun ((key,_) as p) -> Pcre.pmatch ~pat:"^param\\." key)
+      params)
+
+let page_RE = Pcre.regexp "&param\\.page=\\d+"
+let identifier_RE = Pcre.regexp "^\\s*(\\w|')+\\s*$"
+let qualified_mutind_RE =
+ Pcre.regexp "^\\s*cic:(/(\\w|')+)+\\.ind#xpointer\\(1/\\d+\\)\\s*$"
+
+let query_kind_of_req (req: Http_types.request) =
+  match req#path with
+  | "/match" -> "Match"
+  | "/hint" -> "Hint"
+  | "/locate" -> "Locate"
+  | "/elim" -> "Elim"
+  | "/instance" -> "Instance"
+  | _ -> ""
+
+  (* given a uri with a query part in input try to find in it a string
+   * "&param_name=..." (where param_name is given). If found its value will be
+   * set to param_value. If not, a trailing "&param_name=param_value" (where
+   * both are given) is added to the input string *)
+let patch_param param_name param_value url =
+  let rex = Pcre.regexp (sprintf "&%s=[^&]*" (Pcre.quote param_name)) in
+  if Pcre.pmatch ~rex url then
+    Pcre.replace ~rex ~templ:(sprintf "%s=%s" param_name param_value) url
+  else
+    sprintf "%s&%s=%s" url param_name param_value
+
+  (** HTML encoding, e.g.: "<" -> "&lt;" *)
+let html_encode = Netencoding.Html.encode_from_latin1
+
+let fold_n_to_m f n m acc =
+ let rec aux acc =
+  function
+     i when i <= m -> aux (f i acc) (i + 1)
+   | _ -> acc
+ in
+  aux acc n
+
+let send_results results
+  ?(id_to_uris = DisambiguateTypes.empty_environment) 
+   (req: Http_types.request) outchan
+  =
+  let query_kind = query_kind_of_req req in
+  let interp = try req#param "interp" with Http_types.Param_not_found _ -> "" in
+  let page_link anchor page =
+    try
+      let this = req#param "this" in
+      let target =
+        (patch_param "param.interp" interp
+           (patch_param "param.page" (string_of_int page)
+              this))
+      in
+      let target = Pcre.replace ~pat:"&" ~templ:"&amp;" target in
+      sprintf "<a href=\"%s\">%s</a>" target anchor
+    with Http_types.Param_not_found _ -> ""
+  in
+  Http_daemon.send_basic_headers ~code:(`Code 200) outchan ;
+  Http_daemon.send_header "Content-Type" "text/xml" outchan;
+  Http_daemon.send_CRLF outchan ;
+  let subst =
+    match results with
+    | `Results results ->
+        let page = try int_of_string (req#param "page") with _ -> 1 in
+        let results_no = List.length results in
+        let results_per_page =
+          Helm_registry.get_int "search_engine.results_per_page"
+        in
+        let pages =
+          if results_no mod results_per_page = 0 then
+            results_no / results_per_page
+          else
+            results_no / results_per_page + 1
+        in
+        let pages = if pages = 0 then 1 else pages in
+        let additional_pages = 3 in
+        let (summary, results) = MooglePp.theory_of_result page results in
+        [ tag "PAGE", string_of_int page;
+          tag "PAGES", string_of_int pages ^ " Pages";
+          tag "PAGELIST",
+          (let inf = page - additional_pages in
+           let sup = page + additional_pages in
+           let superinf = inf - (sup - pages) in
+           let supersup = sup + (1 - inf) in
+           let n,m =
+            if inf >= 1 && sup <= pages then
+             inf,sup
+            else if inf < 1 then
+             1, (if supersup <= pages then supersup else pages)
+            else (* sup > pages *)
+             (if superinf >= 1 then superinf else 1),pages
+           in
+            fold_n_to_m
+             (fun n acc -> acc ^ " " ^
+                          (if n = page then string_of_int n
+                           else page_link (string_of_int n) n))
+             n m "");
+          tag "PREV_LINK", (if page > 1 then page_link "Prev" (page-1) else "");
+          tag "NEXT_LINK",
+            (if page < pages then page_link "Next" (page+1) else "");
+          tag "QUERY_KIND", query_kind;
+          tag "QUERY_SUMMARY", summary;
+          tag "RESULTS", results ]
+    | `Error msg ->
+        [ tag "PAGE", "1";
+          tag "PAGES", "1 Page";
+          tag "PAGELIST", "";
+          tag "PREV_LINK", "";
+          tag "NEXT_LINK", "";
+          tag "QUERY_KIND", query_kind;
+          tag "QUERY_SUMMARY", "error";
+          tag "RESULTS", msg ]
+  in
+  let advanced =
+    try
+      req#param "advanced"
+    with Http_types.Param_not_found _ -> "no"
+  in
+  let subst =
+    (tag "SEARCH_ENGINE_URL", my_own_url) ::
+    (tag "ADVANCED", advanced) ::
+    (tag "EXPRESSION", html_encode (req#param "expression")) ::
+    add_param_substs req#params @
+    (if advanced = "no" then
+      [ tag "SIMPLE_CHECKED", "checked='true'";
+        tag "ADVANCED_CHECKED", "" ]
+    else
+      [ tag "SIMPLE_CHECKED", "";
+        tag "ADVANCED_CHECKED", "checked='true'" ]) @
+    subst
+  in
+  iter_file
+    (fun line ->
+      let new_aliases = DisambiguatePp.pp_environment id_to_uris in
+      let processed_line =
+        apply_substs
+          (* CSC: Bug here: this is a string, not an array! *)
+          ((tag "NEW_ALIASES", "'" ^ javascript_quote new_aliases ^ "'") ::
+            subst) 
+          line
+      in
+      output_string outchan (processed_line ^ "\n"))
+    moogle_TPL
+
+let exec_action dbd (req: Http_types.request) outchan =
+  let term_str = req#param "expression" in
+  try
+    if req#path = "/elim" &&
+     not (Pcre.pmatch ~rex:identifier_RE term_str ||
+          Pcre.pmatch ~rex:qualified_mutind_RE term_str) then
+      raise Not_a_MutInd;
+    let (context, metasenv) = ([], []) in
+    let id_to_uris_raw = 
+      try req#param "aliases" 
+      with Http_types.Param_not_found _ -> ""
+    in
+    let parse_interpretation_choices choices =
+      List.map int_of_string (Pcre.split ~pat:" " choices) in
+    let parse_choices choices_raw =
+      let choices = Pcre.split ~pat:";" choices_raw in
+      List.fold_left
+        (fun f x ->
+           match Pcre.split ~pat:"\\s" x with
+             | ""::id::tail
+             | id::tail when id<>"" ->
+                 (fun id' ->
+                    if id = id' then
+                      Some (List.map 
+                        (fun u -> UriManager.uri_of_string
+                          (Netencoding.Url.decode u)) 
+                        tail)
+                    else
+                      f id')
+             | _ -> failwith "Can't parse choices")
+        (fun _ -> None)
+        choices
+    in
+    let id_to_uris = DisambiguatePp.parse_environment id_to_uris_raw in
+    let id_to_choices =
+      try
+        parse_choices (req#param "choices")
+      with Http_types.Param_not_found _ -> (fun _ -> None)
+    in
+    let interpretation_choices =
+      try
+        let choices_raw = req#param "interpretation_choices" in
+        if choices_raw = "" then None 
+        else Some (parse_interpretation_choices choices_raw)
+      with Http_types.Param_not_found _ -> None
+    in 
+    let module Chat: DisambiguateTypes.Callbacks =
+      struct
+        let interactive_user_uri_choice ~selection_mode ?ok
+          ?enable_button_for_non_vars ~(title: string) ~(msg: string)
+          ~(id: string) (choices: UriManager.uri list)
+        =
+          match id_to_choices id with
+          | Some choices -> choices
+          | None -> List.filter nonvar choices
+
+        let interactive_interpretation_choice interpretations =
+          match interpretation_choices with
+          | Some l -> l
+          | None ->
+              let html_interpretations =
+                MooglePp.html_of_interpretations interpretations
+              in
+              Http_daemon.send_basic_headers ~code:(`Code 200) outchan ;
+              Http_daemon.send_CRLF outchan ;
+              let advanced =
+                try
+                  req#param "advanced"
+                with Http_types.Param_not_found _ -> "no"
+              in
+              let query_kind = query_kind_of_req req in
+              iter_file
+                (fun line ->
+                   let processed_line =
+                     apply_substs
+                       [ tag "SEARCH_ENGINE_URL", my_own_url;
+                         tag "ADVANCED", advanced;
+                         tag "INTERPRETATIONS", html_interpretations;
+                         tag "CURRENT_CHOICES", req#param "choices";
+                         tag "EXPRESSION", html_encode (req#param "expression");
+                         tag "QUERY_KIND", query_kind;
+                         tag "QUERY_SUMMARY", "disambiguation";
+                         tag "ACTION", string_tail req#path ]
+                       line
+                   in
+                   output_string outchan (processed_line ^ "\n"))
+                choices_TPL;
+              raise Chat_unfinished
+
+        let input_or_locate_uri ~title ?id () =
+          match id with
+          | Some id -> raise (Unbound_identifier id)
+          | None -> assert false
+      end
+    in
+    let module Disambiguate' = Disambiguate.Make(Chat) in
+    let ast = Grammar.Entry.parse CicNotationParser.term (Stream.of_string term_str) in
+    let (id_to_uris, metasenv, term) =
+      match
+        Disambiguate'.disambiguate_term ~dbd ~context ~metasenv
+          ~aliases:id_to_uris ast
+      with
+      | [id_to_uris,metasenv,term,_] -> id_to_uris,metasenv,term
+      | _ -> assert false
+    in
+    let uris =
+      match req#path with
+      | "/match" -> MetadataQuery.match_term ~dbd term
+      | "/instance" -> MetadataQuery.instance ~dbd term
+      | "/hint" ->
+          let status = ProofEngineTypes.initial_status term metasenv in
+          let intros = PrimitiveTactics.intros_tac () in
+          let subgoals = ProofEngineTypes.apply_tactic intros status in
+          (match subgoals with
+          | proof, [goal] ->
+              let (uri,metasenv,bo,ty) = proof in
+              List.map fst (MetadataQuery.experimental_hint ~dbd (proof, goal))
+          | _ -> assert false)
+      | "/elim" ->
+          let uri =
+            match term with
+            | Cic.MutInd (uri, typeno, _) ->
+                UriManager.uri_of_uriref uri typeno None 
+            | _ -> raise Not_a_MutInd
+          in
+          MetadataQuery.elim ~dbd uri
+      | _ -> assert false
+    in
+    let uris = List.map UriManager.string_of_uri uris in
+    send_results ~id_to_uris (`Results uris) req outchan
+  with
+  | Not_a_MutInd ->
+      send_results (`Error (MooglePp.pp_error "Not an inductive type"
+        ("elim requires as input an identifier corresponding to an inductive"
+         ^ " type")))
+        req outchan
+
+let callback dbd (req: Http_types.request) outchan =
+  try
+    debug_print (sprintf "Received request: %s" req#path);
+    (match req#path with
+    | "/getpage" ->
+          (* TODO implement "is_permitted" *)
+        (let is_permitted page = not (Pcre.pmatch ~pat:"/" page) in
+        let page = req#param "url" in
+        let fname = sprintf "%s/%s" pages_dir page in
+        let preprocess =
+          (try
+            bool_of_string (req#param "preprocess")
+          with Invalid_argument _ | Http_types.Param_not_found _ -> false)
+        in
+        (match page with
+        | page when is_permitted page && Sys.file_exists fname ->
+            Http_daemon.send_basic_headers ~code:(`Code 200) outchan;
+            Http_daemon.send_header "Content-Type" "text/html" outchan;
+            Http_daemon.send_CRLF outchan;
+            if preprocess then begin
+              iter_file
+                (fun line ->
+                  output_string outchan
+                    ((apply_substs
+                       ((tag "SEARCH_ENGINE_URL", my_own_url) ::
+                        (tag "ADVANCED", "no") ::
+                        (tag "RESULTS", "") ::
+                        add_param_substs req#params)
+                       line) ^
+                    "\n"))
+                fname
+            end else
+              Http_daemon.send_file ~src:(Http_types.FileSrc fname) outchan
+        | page -> Http_daemon.respond_forbidden ~url:page outchan))
+    | "/help" -> Http_daemon.respond ~body:daemon_name outchan
+    | "/locate" ->
+        let initial_expression =
+          try req#param "expression" with Http_types.Param_not_found _ -> ""
+        in
+        let expression =
+          Pcre.replace ~pat:"\\s*$"
+            (Pcre.replace ~pat:"^\\s*" initial_expression)
+        in
+        if expression = "" then
+          send_results (`Results []) req outchan
+        else begin
+          let results = MetadataQuery.locate ~dbd expression in
+          let results = List.map UriManager.string_of_uri results in
+          send_results (`Results results) req outchan
+        end
+    | "/hint"
+    | "/elim"
+    | "/instance"
+    | "/match" -> exec_action dbd req outchan
+    | invalid_request ->
+        Http_daemon.respond_error ~code:(`Status (`Client_error `Bad_request))
+          outchan);
+    debug_print (sprintf "%s done!" req#path)
+  with
+  | Chat_unfinished -> ()
+  | Http_types.Param_not_found attr_name ->
+      bad_request (sprintf "Parameter '%s' is missing" attr_name) outchan
+  | CicNotationParser.Parse_error (_, msg) ->
+      send_results (`Error (MooglePp.pp_error "Parse error" msg)) req outchan
+  | Unbound_identifier id ->
+      send_results (`Error (MooglePp.pp_error "Unbound identifier" id)) req
+        outchan
+  | exn ->
+      let exn_string = Printexc.to_string exn in
+      debug_print exn_string;
+      let msg = MooglePp.pp_error "Uncaught exception" exn_string in
+      send_results (`Error msg) req outchan
+
+let restore_environment () =
+  match
+    Helm_registry.get_opt Helm_registry.string "search_engine.environment_dump"
+  with
+  | None -> ()
+  | Some fname ->
+      printf "Restoring Cic environment from %s ... " fname; flush stdout;
+      let ic = open_in fname in
+      CicEnvironment.restore_from_channel ic;
+      close_in ic;
+      printf "done!\n"; flush stdout
+
+let read_notation () =
+ CicNotation.load_notation (Helm_registry.get "search_engine.notations");
+ CicNotation.load_notation (Helm_registry.get "search_engine.interpretations")
+
+let _ =
+  printf "%s started and listening on port %d\n" daemon_name port;
+  printf "Current directory is %s\n" (Sys.getcwd ());
+  printf "HTML directory is %s\n" pages_dir;
+  flush stdout;
+  Unix.putenv "http_proxy" "";
+  let dbd =
+    Mysql.quick_connect
+      ~host:(Helm_registry.get "db.host")
+      ~database:(Helm_registry.get "db.database")
+      ~user:(Helm_registry.get "db.user")
+      ()
+  in
+  restore_environment ();
+  read_notation ();
+  Http_daemon.start' ~port (callback dbd);
+  printf "%s is terminating, bye!\n" daemon_name
+