First version of WWW gateway with embedded Tcl.
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 20 Oct 1995 14:02:40 +0000 (14:02 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 20 Oct 1995 14:02:40 +0000 (14:02 +0000)
www/Makefile
www/egwindex.html [new file with mode: 0644]
www/egwscript [new file with mode: 0644]
www/whtml.c [new file with mode: 0644]
www/winterp.c [new file with mode: 0644]
www/winterp.h [new file with mode: 0644]
www/wsh.c
www/wtcl.c [new file with mode: 0644]

index 36772bd..4420d24 100644 (file)
@@ -2,18 +2,24 @@
 # Europagate, 1995
 #
 # $Log: Makefile,v $
-# Revision 1.1  1995/10/20 11:49:24  adam
+# Revision 1.2  1995/10/20 14:02:40  adam
+# First version of WWW gateway with embedded Tcl.
+#
+# Revision 1.1  1995/10/20  11:49:24  adam
 # First version of www gateway.
 #
 SHELL=/bin/sh
 INCLUDE=-I../include
 #CFLAGS=-g -Wall -pedantic -ansi
 OLIB=../lib/libres+log.a
+TCLLIB=/usr/local/lib/libtcl7.5.a
+WSCRIPTS=egwscript
+HSCRIPTS=egwindex.html
 TPROG1=egwcgi
 TPROG2=egwsh
 TPROG3=wtest
 P1=wcgi.o
-P2=wproto.o wsh.o
+P2=wproto.o winterp.o wsh.o wtcl.o whtml.o
 P3=wproto.o wtest.o
 CPP=$(CC) -E
 DEFS=$(INCLUDE)
@@ -22,23 +28,31 @@ HTTPDDIR=/usr/local/etc/httpd
 CGIBIN=$(HTTPDDIR)/cgi-bin
 HTDOCS=$(HTTPDDIR)/htdocs
 
-all: $(TPROG1) $(TPROG2) $(TPROG3)
+all: $(TPROG1) $(TPROG2)
 
 $(TPROG1): $(P1)
        $(CC) $(CFLAGS) -o $(TPROG1) $(P1) $(OLIB)
 
 $(TPROG2): $(P2)
-       $(CC) $(CFLAGS) -o $(TPROG2) $(P2) $(OLIB)
+       $(CC) $(CFLAGS) -o $(TPROG2) $(P2) $(OLIB) $(TCLLIB) -lm
 
 $(TPROG3): $(P3)
        $(CC) $(CFLAGS) -o $(TPROG3) $(P3) $(OLIB)
 
-install: $(TPROG1) $(TPROG2) $(TPROG3)
-       @for x in $(TPROG1) $(TPROG2) $(TPROG3); do \
+install: $(TPROG1) $(TPROG2)
+       @for x in $(TPROG1) $(TPROG2); do \
                echo Installing $$x; \
                cp $$x $(CGIBIN); \
                chmod +x $(CGIBIN)/$$x; \
        done
+       @for x in $(WSCRIPTS); do \
+               echo Installing $$x; \
+               cp $$x $(CGIBIN); \
+       done
+       @for x in $(HSCRIPTS); do \
+               echo Installing $$x; \
+               cp $$x $(HTDOCS); \
+       done
 
 .c.o:
        $(CC) -c $(DEFS) $(CFLAGS) $<
diff --git a/www/egwindex.html b/www/egwindex.html
new file mode 100644 (file)
index 0000000..b7b1d17
--- /dev/null
@@ -0,0 +1,11 @@
+<html>
+<head>
+<title>Europagate WWW index</title>
+</head>
+<body>
+<h2>Europagate WWW index, $Id: egwindex.html,v 1.1 1995/10/20 14:02:41 adam Exp $</h2>
+<p>
+egwcgi ref: <a href="http://localhost/cgi-bin/egwcgi/egwsh/egwscript">egwcgi</a>
+</body>
+</html>
+
diff --git a/www/egwscript b/www/egwscript
new file mode 100644 (file)
index 0000000..94303b7
--- /dev/null
@@ -0,0 +1,11 @@
+<html>
+<head><title>Europgate WWW gateway test script $Id: egwscript,v 1.1 1995/10/20 14:02:41 adam Exp $</title></head>
+<body>
+howdi
+{
+       set f [open mylog a+]
+       puts $f "Hello world"
+       close $f
+}
+</body>
+</html>
diff --git a/www/whtml.c b/www/whtml.c
new file mode 100644 (file)
index 0000000..3c1e080
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Log: whtml.c,v $
+ * Revision 1.1  1995/10/20 14:02:41  adam
+ * First version of WWW gateway with embedded Tcl.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "wproto.h"
+#include "winterp.h"
+
+static void *do_create (void *args);
+static int do_exec (WCLIENT wcl, const char *fname, char *parms, void *mydata);
+
+static struct w_interp_type w_interp_t = {
+    "html",
+    do_create,
+    do_exec
+};
+
+W_Interp_Type w_interp_html = &w_interp_t;
+
+static char *mod = "whtml";
+
+static void *do_create (void *args)
+{
+    return NULL;
+}
+
+static int do_exec (WCLIENT wcl, const char *fname, char *parms, void *mydata)
+{
+    int c;
+    FILE *inf = fopen (fname, "r");
+
+    gw_log (GW_LOG_DEBUG, mod, "executing %s", fname);
+    if (!inf)
+    {
+        gw_log (GW_LOG_WARN|GW_LOG_ERRNO, mod, "open %s", fname);
+        return -1;
+    }
+    while ((c = getc (inf)) != EOF)
+        wo_putc (wcl, c);
+    fclose (inf);
+    return 0;
+}
diff --git a/www/winterp.c b/www/winterp.c
new file mode 100644 (file)
index 0000000..61b0388
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Log: winterp.c,v $
+ * Revision 1.1  1995/10/20 14:02:41  adam
+ * First version of WWW gateway with embedded Tcl.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "wproto.h"
+#include "winterp.h"
+
+static char *mod = "winterp";
+
+W_Interp w_interp_create (W_Interp_Type type, void *args)
+{
+    W_Interp p = malloc (sizeof(*p));
+    gw_log (GW_LOG_DEBUG, mod, "Creating w_interp: %s", type->name);
+    if (!p)
+    {
+        gw_log (GW_LOG_FATAL, mod, "Out of memory in w_interp_create");
+        exit (1);
+    }
+    p->ctrl = type;
+    p->mydata = (*p->ctrl->create)(args);
+    return p;
+}
diff --git a/www/winterp.h b/www/winterp.h
new file mode 100644 (file)
index 0000000..272446d
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Log: winterp.h,v $
+ * Revision 1.1  1995/10/20 14:02:42  adam
+ * First version of WWW gateway with embedded Tcl.
+ *
+ */
+
+#ifndef WINTERP_H
+#define WINTERP_H
+
+#include "wproto.h"
+
+typedef struct w_interp_type {
+    char  *name;
+    void  *(*create)(void *args);
+    int   (*exec)(WCLIENT wcl, const char *fname, char *parms, void *private);
+} *W_Interp_Type;
+
+typedef struct w_interp {
+    void         *mydata;
+    W_Interp_Type ctrl;
+} *W_Interp;
+    
+W_Interp w_interp_create (W_Interp_Type type, void *args);
+#define w_interp_exec(w,c,f,p) (*(w)->ctrl->exec)((c),(f),(p), (w)->mydata)
+#define w_interp_name(w) ((w)->ctrl.name)
+
+W_Interp_Type w_interp_tcl;
+W_Interp_Type w_interp_html;
+
+#endif
index f36d42e..4bd4257 100644 (file)
--- a/www/wsh.c
+++ b/www/wsh.c
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wsh.c,v $
- * Revision 1.1  1995/10/20 11:49:28  adam
+ * Revision 1.2  1995/10/20 14:02:42  adam
+ * First version of WWW gateway with embedded Tcl.
+ *
+ * Revision 1.1  1995/10/20  11:49:28  adam
  * First version of www gateway.
  *
  */
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <strings.h>
+#include <string.h>
 #include <assert.h>
 #include <unistd.h>
 #include <ctype.h>
 
-#include "wproto.h"
+#include "winterp.h"
 
-#define TIMEOUT_SHORT 300
+#define TIMEOUT_SHORT 60
 #define TIMEOUT_MEDIUM 1800
 #define TIMEOUT_LONG 7200
 
@@ -64,8 +67,9 @@ static char *mod = "wsh";
 
 int main (int argc, char **argv)
 {
-    char *argument, *p, parms[512];
+    char *script, *p, parms[512];
     int timeout = TIMEOUT_SHORT;
+    W_Interp tcl_interp, html_interp;
 
     chdir("/usr/local/etc/httpd/cgi-bin");
     gw_log_init ("egw");
@@ -78,20 +82,28 @@ int main (int argc, char **argv)
        gw_log (GW_LOG_FATAL, mod, "init");
        exit(1);
     }
+    tcl_interp = w_interp_create (w_interp_tcl, NULL);
+    html_interp = w_interp_create (w_interp_html, NULL);
     while (wproto_process(wcl, timeout) > 0)
     {
        wo_clear(wcl, "text/html");
-       wo_printf(wcl, "<HTML><TITLE>INDEX</TITLE>\n");
        strcpy(parms, wcl->wf_parms);
-       argument = p = parms;
+       script = p = parms;
        while (*p && *p != '/')
            p++;
        if (*p == '/')
            *(p++) = '\0';
-       gw_log (GW_LOG_DEBUG, mod, "command: %s", argument);
-        wo_printf (wcl, "<BODY>hej - %s</BODY>\n", argument);
+       gw_log (GW_LOG_DEBUG, mod, "script: %s", script);
+       gw_log (GW_LOG_DEBUG, mod, "parms: %s", p);
+        if (w_interp_exec (tcl_interp, wcl, script, p))
+        {
+            wo_printf (wcl, "<html><head><title>wsh error</title></head>\n");
+            wo_printf (wcl, "<body>Couldn't execute script %s</body></html>",
+                       script);
+        }
        wo_finish(wcl);
     }
     wproto_terminate(wcl);
     return 0;
 }
+
diff --git a/www/wtcl.c b/www/wtcl.c
new file mode 100644 (file)
index 0000000..ebdabb5
--- /dev/null
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * $Log: wtcl.c,v $
+ * Revision 1.1  1995/10/20 14:02:42  adam
+ * First version of WWW gateway with embedded Tcl.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include <tcl.h>
+
+#include "wproto.h"
+#include "winterp.h"
+
+static void *do_create (void *args);
+static int do_exec (WCLIENT wcl, const char *fname, char *parms, void *mydata);
+
+static struct w_interp_type w_interp_t = {
+    "tcl",
+    do_create,
+    do_exec
+};
+
+W_Interp_Type w_interp_tcl = &w_interp_t;
+
+
+static char *mod = "wtcl";
+
+struct tcl_info {
+    Tcl_Interp *interp;
+    char  *fbuf;
+    int    fbuf_size;
+    int    fbuf_ptr;
+};
+
+static void *do_create (void *args)
+{
+    struct tcl_info *p;
+
+    if (!(p = malloc (sizeof(*p))))
+    {
+        gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc: tcl_info");
+        exit (1);
+    }
+    if (!(p->interp = Tcl_CreateInterp ()))
+    {
+        gw_log (GW_LOG_FATAL, mod, "Cannot make Tcl_Interp");
+        exit (1);
+    }
+    p->fbuf_size = 1024;
+    if (!(p->fbuf = malloc (p->fbuf_size)))
+    {
+        gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc: tcl_info fbuf");
+        exit (1);
+    }
+    return p;
+}
+
+static int tcl_exec (WCLIENT wcl, const char *fname, char *parms,
+                     struct tcl_info *p, FILE *inf, int *lineno)
+{
+    int c, escape = 0, level = 0;
+    int r, fbuf_ptr = 0;
+    int local_line = 0;
+
+    gw_log (GW_LOG_DEBUG, mod, "tcl_exec. line %d", *lineno);
+    while (1)
+    {
+        if (fbuf_ptr == p->fbuf_size-1)
+        {
+            char *newb;
+
+            if (!(newb = malloc (p->fbuf_size += 16384)))
+            {
+                gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc: fbuf");
+                exit (1);
+            }
+            memcpy (newb, p->fbuf, fbuf_ptr);
+            free (p->fbuf);
+            p->fbuf = newb;
+        }
+        c = getc (inf);
+        if (c == EOF)
+        {
+            gw_log (GW_LOG_WARN, mod, "Unexpected EOF: unbalanced braces");
+            return -1;
+        }
+        if (c == '\\')
+            escape = 1;
+        else if (c == '{' && !escape)
+        {
+            level++;
+            escape = 0;
+        }
+        else if (c == '}' && !escape)
+        {
+            if (--level < 0)
+                break;
+            escape = 0;
+        }
+        else
+        {
+            if (c == '\n')
+                local_line++;
+            escape = 0;
+        }
+        p->fbuf[fbuf_ptr++] = c;
+    }
+    p->fbuf[fbuf_ptr] = '\0';
+    gw_log (GW_LOG_DEBUG, mod, "Tcl_Eval. %d lines", local_line);
+    r = Tcl_Eval (p->interp, p->fbuf);
+    if (r != TCL_OK)
+    {
+        gw_log (GW_LOG_WARN, mod, "Error in Tcl script starting on line %d",
+                *lineno);
+    }
+    (*lineno) += local_line;
+    return 0;
+}
+
+static int do_exec (WCLIENT wcl, const char *fname, char *parms,
+                    void *mydata)
+{
+    struct tcl_info *p = mydata;
+    int c, escape = 0;
+    int lineno = 1;
+    FILE *inf = fopen (fname, "r");
+
+    gw_log (GW_LOG_DEBUG, mod, "Executing %s", fname);
+    if (!inf)
+    {
+        gw_log (GW_LOG_WARN|GW_LOG_ERRNO, mod, "open %s", fname);
+        return -1;
+    }
+    while ((c = getc(inf)) != EOF)
+    {
+        if (c == '\\')
+            escape = 1;
+        else if (c == '{')
+        {
+            if (escape)
+                wo_putc (wcl, c);
+            else
+            {
+                if (tcl_exec (wcl, fname, parms, p, inf, &lineno))
+                {
+                    fclose (inf);
+                    return -2;
+                }
+            }
+            escape = 0;
+        }
+        else
+        {
+            if (c == '\n')
+                lineno++;
+            escape = 0;
+            wo_putc (wcl, c);
+        }
+    }
+    fclose (inf);
+    return 0;
+}