Index: include/extern.h
===================================================================
--- include/extern.h	(.../trunk)	(revision 1)
+++ include/extern.h	(.../branches/doorpatch-dos)	(revision 5)
@@ -2380,6 +2380,14 @@
 E int FDECL(resist, (struct monst *,CHAR_P,int,int));
 E void NDECL(makewish);
 
+#ifdef BBSDOOR
+/* ### bbsdoor.c ### */
+E int NDECL(doormode_active);
+E void FDECL(parse_dropfile,(const char *));
+E void NDECL(start_doormode);
+E int NDECL(door_getc);
+#endif
+
 #endif /* !MAKEDEFS_C && !LEV_LEX_C */
 
 #undef E
Index: include/pcconf.h
===================================================================
--- include/pcconf.h	(.../trunk)	(revision 1)
+++ include/pcconf.h	(.../branches/doorpatch-dos)	(revision 5)
@@ -66,7 +66,11 @@
 /* #define SCREEN_DJGPPFAST */	/* Use djgpp fast screen routines	*/
 # endif
 
+# if defined(TERMLIB) && !defined(NO_TERMS)
+/* #define BBSDOOR */      /* Run as FOSSIL-using BBS door */
+# endif
 
+
 /* # define PC9800 */	/* Allows NetHack to run on NEC PC-9800 machines */
 			/* Yamamoto Keizo */
 
@@ -88,9 +92,11 @@
 # undef SCREEN_BIOS
 # undef SCREEN_DJGPPFAST
 # undef SCREEN_VGA
-# undef TERMLIB
-# define ANSI_DEFAULT
+# ifndef BBSDOOR
+#  undef TERMLIB
+#  define ANSI_DEFAULT
 # endif
+# endif
 
 # define RANDOM		/* have Berkeley random(3) */
 
Index: include/patchlevel.h
===================================================================
--- include/patchlevel.h	(.../trunk)	(revision 1)
+++ include/patchlevel.h	(.../branches/doorpatch-dos)	(revision 5)
@@ -24,6 +24,9 @@
 #define COPYRIGHT_BANNER_C \
 "         See license for details."
 
+#define COPYRIGHT_BANNER_D \
+"         Modified for door use by Ingo Korb."
+
 /*
  * If two or more successive releases have compatible data files, define
  * this with the version number of the oldest such release so that the
Index: include/hack.h
===================================================================
--- include/hack.h	(.../trunk)	(revision 1)
+++ include/hack.h	(.../branches/doorpatch-dos)	(revision 5)
@@ -120,6 +120,10 @@
 #include "extern.h"
 #include "winprocs.h"
 
+#ifdef BBSDOOR
+#define putchar(x) putchar_(x)
+#endif
+
 #ifdef USE_TRAMPOLI
 #include "wintty.h"
 #undef WINTTY_H
Index: include/wintty.h
===================================================================
--- include/wintty.h	(.../trunk)	(revision 1)
+++ include/wintty.h	(.../branches/doorpatch-dos)	(revision 5)
@@ -216,6 +216,12 @@
 E char * NDECL(tty_get_color_string);
 #endif
 
+#ifdef BBSDOOR
+/* ### bbsdoor.c ### */
+/* actually putchar_ due to #define hacks */
+E int putchar(int);
+#endif
+
 /* other defs that really should go away (they're tty specific) */
 E void NDECL(tty_start_screen);
 E void NDECL(tty_end_screen);
Index: doc/bbsdoor.txt
===================================================================
--- doc/bbsdoor.txt	(.../trunk)	(revision 0)
+++ doc/bbsdoor.txt	(.../branches/doorpatch-dos)	(revision 5)
@@ -0,0 +1,52 @@
+BBS-Door-Mode for Nethack v0.1
+------------------------------
+
+This patch adds a BBS door mode to the MS-DOS port of Nethack 3.4.3.
+To use it, you should recompile Nethack with the TERMLIB and BBSDOOR
+configuration options in pcconf.h enabled. You should probably set
+SUPPRESS_GRAPHICS = Y in the Makefile.
+
+I also recommend to add the bones directory patch from
+http://www.iki.fi/jslahti/nethack.html to the sources to enable better
+separation of users.
+
+A FOSSIL driver is required. It is also strongly recommended to use
+OPTIONS=!rawio,!BIOS,!IBMgraphics
+in the defaults.nh to force the game to assume an 80x24 screen.
+
+To execute nethack from within your BBS, write a DOOR.SYS file somewhere
+and run "nethack -B<path-to-door.sys>" from within the nethack directory.
+
+The game will save automatically if the carrier is dropped, but it does
+not enforce any specified user time limits. There is no way short of
+Control-Break to influence the running game from the system console.
+If you want to watch what the user is doing you should use ANSI.SYS or
+something compatible.
+
+For slightly more separation between multiple users, add the patch mentioned
+above and use a setup similiar to this:
+
+\nethack
+   Directory containing nethack.exe, nhdat etc.
+\nethack\foo, \nethack\bar, ...
+   One directory for each user (use whatever unique naming scheme you can
+   think of), containing a defaults.nh with
+ HACKDIR=\nethack
+ LEVELDIR=\nethack\foo
+ SAVEDIR=\nethack\foo
+   in it. This way multiple BBS users can use the same character name
+   without collisions. If you want to enforce unique character names, you
+   can also add
+ OPTIONS=name:User the Whatever
+   to this file.
+
+Start Nethack like this:
+
+set NETHACKOPTIONS=@\nethack\foo\defaults.nh
+nethack -B<path-to-door.sys>
+
+It will read the user-specific options file, store the in-progress data files
+and saves to the user-directory, but everything else (log, records, bones)
+will be shared among all users.
+
+2006-07-18, Ingo Korb
Index: src/options.c
===================================================================
--- src/options.c	(.../trunk)	(revision 1)
+++ src/options.c	(.../branches/doorpatch-dos)	(revision 5)
@@ -186,7 +186,11 @@
 	{"timed_delay", (boolean *)0, FALSE, SET_IN_GAME},
 #endif
 	{"tombstone",&flags.tombstone, TRUE, SET_IN_GAME},
+#ifdef BBSDOOR
+	{"toptenwin",&flags.toptenwin, TRUE, SET_IN_FILE},
+#else
 	{"toptenwin",&flags.toptenwin, FALSE, SET_IN_GAME},
+#endif
 	{"travel", &iflags.travelcmd, TRUE, SET_IN_GAME},
 #ifdef WIN32CON
 	{"use_inverse",   &iflags.wc_inverse, TRUE, SET_IN_GAME},		/*WC*/
Index: win/tty/wintty.c
===================================================================
--- win/tty/wintty.c	(.../trunk)	(revision 1)
+++ win/tty/wintty.c	(.../branches/doorpatch-dos)	(revision 5)
@@ -310,6 +310,7 @@
     tty_putstr(BASE_WINDOW, 0, COPYRIGHT_BANNER_A);
     tty_putstr(BASE_WINDOW, 0, COPYRIGHT_BANNER_B);
     tty_putstr(BASE_WINDOW, 0, COPYRIGHT_BANNER_C);
+    tty_putstr(BASE_WINDOW, 0, COPYRIGHT_BANNER_D);
     tty_putstr(BASE_WINDOW, 0, "");
     tty_display_nhwindow(BASE_WINDOW, FALSE);
 }
Index: sys/share/pcsys.c
===================================================================
--- sys/share/pcsys.c	(.../trunk)	(revision 1)
+++ sys/share/pcsys.c	(.../branches/doorpatch-dos)	(revision 5)
@@ -408,7 +408,7 @@
 	return;
 }
 
-#ifndef WIN32CON
+#if !defined(WIN32CON) && !defined(BBSDOOR)
 void
 msmsg VA_DECL(const char *, fmt)
 	VA_START(fmt);
Index: sys/share/pctty.c
===================================================================
--- sys/share/pctty.c	(.../trunk)	(revision 1)
+++ sys/share/pctty.c	(.../branches/doorpatch-dos)	(revision 5)
@@ -48,6 +48,9 @@
 void
 setftty()
 {
+#ifdef BBSDOOR
+	start_doormode();
+#endif
 	start_screen();
 }
 
Index: sys/share/pcmain.c
===================================================================
--- sys/share/pcmain.c	(.../trunk)	(revision 1)
+++ sys/share/pcmain.c	(.../branches/doorpatch-dos)	(revision 5)
@@ -576,6 +576,11 @@
 		case '@':
 			flags.randomall = 1;
 			break;
+#ifdef BBSDOOR
+		case 'B':
+		        parse_dropfile(&argv[0][2]);
+		        break;
+#endif
 		default:
 			if ((i = str2role(&argv[0][1])) >= 0) {
 			    flags.initrole = i;
Index: sys/msdos/fossil.c
===================================================================
--- sys/msdos/fossil.c	(.../trunk)	(revision 0)
+++ sys/msdos/fossil.c	(.../branches/doorpatch-dos)	(revision 5)
@@ -0,0 +1,296 @@
+/* Interface to FOSSIL routines for DJGPP */
+/* Cobbled together in 2006 by Ingo Korb */
+/* Use as you like, no copyright claimed. */
+
+#include <dpmi.h>
+#include <go32.h>
+#include <sys/movedata.h>
+
+#include "fossil.h"
+
+#ifndef __tb_size
+#define __tb_size _go32_info_block.size_of_transfer_buffer
+#endif
+
+static int baudrates[] = { 19200, 38400, 300, 600, 1200, 2400, 4800, 9600, -1 };
+
+/*
+ * Sets baud rate rate for given port.
+ * Some FOSSILs support port settings other than 8n1, but this function
+ * does not.
+ *
+ * Returns -1 if rate is invalid.
+ * Returns port status (see fos_status) otherwise.
+ */
+int fos_setbaud(int port, int baud) {
+  __dpmi_regs r;
+  int i;
+
+  for (i=0;i<sizeof(baudrates);i++) {
+    if (baudrates[i] == baud) break;
+  }
+
+  if (baudrates[i] != baud) return -1;
+
+  r.h.ah = 0;
+  r.x.dx = port;
+  r.h.al = (i << 5) + 3;
+  __dpmi_int(0x14, &r);
+  
+  return r.x.ax;
+}
+
+/*
+ * Transmits a single character with wait on given port.
+ *
+ * Returns port status (see fos_status).
+ */
+int fos_putc(int port, unsigned char c) {
+  __dpmi_regs r;
+  
+  r.h.ah = 0x01;
+  r.h.al = c;
+  r.x.dx = port;
+  __dpmi_int(0x14, &r);
+
+  return r.x.ax;
+}
+
+/*
+ * Receives a single character from given port, waiting if neccessary.
+ *
+ * Returns the character
+ */
+unsigned char fos_getc(int port) {
+  __dpmi_regs r;
+  
+  r.h.ah = 0x02;
+  r.x.dx = port;
+  __dpmi_int(0x14, &r);
+
+  return r.h.al;
+}
+
+/*
+ * Requests status for given port.
+ *
+ * Returns status mask:
+ *  0x0008 - A1   - Always 1
+ *  0x0080 - DCD  - carrier detect
+ *  0x0100 - RDA  - Receive Data Available
+ *  0x0200 - OVRN - Input buffer has overrun
+ *  0x2000 - THRE - room is available in output buffer
+ *  0x4000 - TSRE - output buffer is empty
+ */
+int fos_status(int port) {
+  __dpmi_regs r;
+  
+  r.h.ah = 0x03;
+  r.x.dx = port;
+  __dpmi_int(0x14, &r);
+
+  return r.x.ax;
+}
+
+/*
+ * Call FOSSIL initialize function for given port.
+ *
+ * Returns -1 on failure, contents of BX on success.
+ *  BX = (revision << 8) + (maximum_function_number)
+ */
+int fos_init(int port) {
+  __dpmi_regs r;
+
+  r.h.ah = 0x04;
+  r.x.dx = port;
+  __dpmi_int(0x14, &r);
+
+  if (r.x.ax != 0x1954) return -1;
+  return r.x.bx;
+}
+
+/*
+ * Calls FOSSIL deinit function for given port
+ */
+void fos_deinit(int port) {
+  __dpmi_regs r;
+  r.h.ah = 0x05;
+  r.x.dx = port;
+  __dpmi_int(0x14, &r);
+}
+
+/*
+ * Set DTR on given port to raised(1) or low(0)
+ */
+void fos_setdtr(int port, int dtr) {
+  __dpmi_regs r;
+  r.h.ah = 0x06;
+  r.x.dx = port;
+  r.h.al = (dtr?1:0);
+  __dpmi_int(0x14, &r);
+}
+
+/*
+ * Returns timer tick parameters
+ * -unimplemented-
+ */
+
+/*
+ * Flushed output buffer on given port
+ */
+void fos_flushout(int port) {
+  __dpmi_regs r;
+  
+  r.h.ah = 0x08;
+  r.x.dx = port;
+  __dpmi_int(0x14, &r);
+}
+
+/*
+ * Purge pending output on given port
+ */
+void fos_purgeout(int port) {
+  __dpmi_regs r;
+ 
+  r.h.ah = 0x09;
+  r.x.dx = port;
+  __dpmi_int(0x14, &r);
+}
+
+/*
+ * Purge pending input on given port
+ */
+void fos_purgein(int port) {
+  __dpmi_regs r;
+
+  r.h.ah = 0x0a;
+  r.x.dx = port;
+  __dpmi_int(0x14, &r);
+}
+
+/*
+ * Transmit char without waiting on given port
+ *
+ * Return: 1 - character accepted
+ *         0 - character not accepted
+ */
+int fos_putcnw(int port, unsigned char c) {
+  __dpmi_regs r;
+  
+  r.h.ah = 0x0b;
+  r.x.dx = port;
+  r.h.al = c;
+  __dpmi_int(0x14, &r);
+  return r.x.ax;
+}
+
+/*
+ * Read-ahead char on given port
+ *
+ * Returns character or -1 if none available
+ */
+int fos_peekc(int port) {
+  __dpmi_regs r;
+
+  r.h.ah = 0x0c;
+  r.x.dx = port;
+  __dpmi_int(0x14, &r);
+
+  return (r.x.ax == 0xffff ? -1 : r.x.ax);
+}
+
+/*
+ * 0x0d-0x0e: Keyboard functions, not implemented
+ */
+
+/*
+ * Enable/Disable flow control on given port.
+ *
+ * Bitmask for control:
+ *  0x01 - Xon/Xoff for transmit
+ *  0x02 - CTS/RTS
+ *  0x04 - reservedd
+ *  0x08 - Xon/Xoff for receive
+ */
+void fos_flowcontrol(int port, int control) {
+  __dpmi_regs r;
+
+  r.h.ah = 0x0f;
+  r.x.dx = port;
+  /* Fix for unspecified broken FOSSILs */
+  r.h.al = control || (control <<4);
+  __dpmi_int(0x14, &r);
+}
+
+/* 0x10 - Control-C/Control-K-checking - not implemented */
+/* 0x11-0x13,0x15 - Video stuff - not implemented */
+/* 0x14 - Watchdog processing - not implemented */
+/* 0x16 - Timer Tick chain - not implemented */
+/* 0x17 - Reboot system - not implemented */
+
+/*
+ * Reads up to size characters from port into buf
+ *
+ * Returns number of characters actually read.
+ * May read 0 characters if none are available
+ *
+ * I'm too lazy to allocate my own buffer in the
+ * DOS memory area, so size is capped to the size
+ * of the existing GO32 transfer buffer.
+ */
+int fos_readblock(int port, void *buf, int size) {
+  __dpmi_regs r;
+
+  r.h.ah = 0x18;
+  r.x.dx = port;
+  r.x.es = __tb >> 4;
+  r.x.di = __tb & 0x0f;
+  if (size > __tb_size)
+    r.x.cx = __tb_size;
+  else
+    r.x.cx = size;
+  __dpmi_int(0x14, &r);
+
+  dosmemget(__tb, r.x.ax, buf);
+  return r.x.ax;
+}
+
+/*
+ * Writes size characters from buf to port
+ *
+ * Returns number of characters actually written
+ */
+int fos_writeblock(int port, void *buf, int size) {
+  __dpmi_regs r;
+  int n,trans;
+
+  trans = 0;
+  while (size > 0) {
+    if (size < __tb_size)
+      n = size;
+    else
+      n = __tb_size;
+
+    dosmemput(buf, n, __tb);
+
+    r.h.ah = 0x19;
+    r.x.dx = port;
+    r.x.es = __tb >> 4;
+    r.x.di = __tb & 0x0f;
+    r.x.cx = n;
+    __dpmi_int(0x14, &r);
+
+    trans += r.x.ax;
+
+    /* Abort if buffer is full */
+    if (r.x.ax != n) break;
+    
+    size -= r.x.ax;
+    buf  += r.x.ax;
+  }
+
+  return trans;
+}
+
+/* 0x1a - Break handling - not implemented */
+/* 0x1b - Get driver information - not implemented */
Index: sys/msdos/fossil.h
===================================================================
--- sys/msdos/fossil.h	(.../trunk)	(revision 0)
+++ sys/msdos/fossil.h	(.../branches/doorpatch-dos)	(revision 5)
@@ -0,0 +1,34 @@
+/* Interface to FOSSIL routines for DJGPP */
+/* Cobbled together in 2006 by Ingo Korb */
+/* Use as you like, no copyright claimed. */
+
+#ifndef FOSSIL_H
+#define FOSSIL_H
+
+#define FOS_STATUS_DCD 0x80
+#define FOS_STATUS_RDA 0x100
+#define FOS_STATUS_OVRN 0x200
+#define FOS_STATUS_THRE 0x2000
+#define FOS_STATUS_TSRE 0x4000
+
+#define FOS_FLOW_XONOFF_TRAN 0x01
+#define FOS_FLOW_CTSRTS      0x02
+#define FOS_FLOW_XONOFF_RECV 0x08
+
+int fos_setbaud(int port, int baud);
+int fos_putc(int port, unsigned char c);
+unsigned char fos_getc(int port);
+int fos_status(int port);
+int fos_init(int port);
+void fos_deinit(int port);
+void fos_setdtr(int port, int dtr);
+void fos_flushout(int port);
+void fos_purgeout(int port);
+void fos_purgein(int port);
+int fos_putcnw(int port, unsigned char c);
+int fos_peekc(int port);
+void fos_flowcontrol(int port, int control);
+int fos_readblock(int port, void *buf, int size);
+int fos_writeblock(int port, void *buf, int size);
+
+#endif
Index: sys/msdos/msdos.c
===================================================================
--- sys/msdos/msdos.c	(.../trunk)	(revision 1)
+++ sys/msdos/msdos.c	(.../branches/doorpatch-dos)	(revision 5)
@@ -70,6 +70,11 @@
 # ifdef SIMULATE_CURSOR
 	if (iflags.grmode && cursor_flag) DrawCursor();
 # endif
+# ifdef BBSDOOR
+	if (doormode_active()) {
+	  ch = door_getc();
+	} else
+# endif
 	if (iflags.BIOS)
 		ch = BIOSgetch();
 	else
Index: sys/msdos/Makefile.GCC
===================================================================
--- sys/msdos/Makefile.GCC	(.../trunk)	(revision 1)
+++ sys/msdos/Makefile.GCC	(.../branches/doorpatch-dos)	(revision 5)
@@ -127,7 +127,7 @@
 #  Flags.
 #
 ifeq ($(SUPPRESS_GRAPHICS),Y)
-TERMLIB =
+#TERMLIB =
 # Build NetHack suitable for blind players
 
 # Debugging
@@ -318,8 +318,10 @@
 VOBJ23 = $(O)region.o
 
 SOBJ   = $(O)msdos.o    $(O)sound.o   $(O)sys.o      $(O)tty.o	    $(O)unix.o \
-	 $(O)video.o    $(O)vidtxt.o  $(O)pckeys.o
+	 $(O)video.o    $(O)vidtxt.o  $(O)pckeys.o   $(O)fossil.o
 
+XOBJ   = $(O)bbsdoor.o
+
 VVOBJ  = $(O)version.o
 
 VOBJ  = $(VOBJ01) $(VOBJ02) $(VOBJ03) $(VOBJ04) $(VOBJ05) \
@@ -328,7 +330,7 @@
 	$(VOBJ16) $(VOBJ17) $(VOBJ18) $(VOBJ19) $(VOBJ20) \
 	$(VOBJ21) $(VOBJ22) $(VOBJ23)
 
-ALLOBJ = $(VOBJ) $(SOBJ) $(TILOBJ) $(VVOBJ)
+ALLOBJ = $(VOBJ) $(XOBJ) $(SOBJ) $(TILOBJ) $(VVOBJ)
 
 #==========================================
 # Header file macros
@@ -453,7 +455,8 @@
 	@$(subst /,\,del $(GAME).exe)
 
 $(O)$(GAME).lnk: $(ALLOBJ)
-	 echo $(VOBJ01) > $(subst /,\,$@)
+	 echo $(XOBJ)   >  $(subst /,\,$@)
+	 echo $(VOBJ01) >> $(subst /,\,$@)
 	 echo $(VOBJ02) >> $(subst /,\,$@)
 	 echo $(VOBJ03) >> $(subst /,\,$@)
 	 echo $(VOBJ04) >> $(subst /,\,$@)
@@ -1001,7 +1004,11 @@
 $(O)stubvid.o : $(HACK_H) $(MSYS)/pcvideo.h $(MSYS)/video.c
 	$(CC) $(cflags) -I$(MSYS) -DSTUBVIDEO -o$@ $(MSYS)/video.c
 
+$(O)fossil.o : $(MSYS)/fossil.c
 
+$(O)bbsdoor.o : $(MSYS)/bbsdoor.c
+
+
 # src dependencies
 
 #
Index: sys/msdos/bbsdoor.c
===================================================================
--- sys/msdos/bbsdoor.c	(.../trunk)	(revision 0)
+++ sys/msdos/bbsdoor.c	(.../branches/doorpatch-dos)	(revision 5)
@@ -0,0 +1,111 @@
+/* BBS-Door-Mode for Nethack (Dos) */
+/* Written in 2006 by Ingo Korb */
+/* Parts of this code have been copied from the main Nethack sources */
+
+#define NEED_VARARGS /* Uses ... */
+#include "hack.h"
+#include "wintty.h"
+
+#include <dpmi.h>
+#include <errno.h>
+#include "fossil.h"
+
+static int port = -1;          /* Port number/handle */
+static int baudrate = 0;       /* Baud rate */
+
+int doormode_active() {
+  return (port >= 0);
+}
+
+void parse_dropfile(const char *fname) {
+  FILE *fd;
+  int line;
+  char linebuf[1024];
+  
+  fd = fopen(fname,"r");
+  if (!fd)
+    error("Can't open dropfile %s: %s\n",fname,strerror(errno));
+
+  /* Bare-minimum parsing, I don't need more data */
+  line = 0;
+  while (fgets(linebuf, 1024, fd)) {
+    line++;
+    if (line == 1) {
+      /* COM port */
+      sscanf(linebuf,"COM%d:",&port);
+      port--;
+    } else if (line == 2) {
+      /* Baud rate */
+      sscanf(linebuf,"%d",&baudrate);
+    }
+  }
+  fclose(fd);
+}
+
+void cleanup_doormode() {
+  if (port >= 0) {
+    fos_putc(port,'\r');
+    fos_putc(port,'\n');
+    /* Flush doesn't always work as advertised =( */
+    sleep(1);
+    fos_flushout(port);
+    fos_deinit(port);
+  }
+}
+
+void start_doormode() {
+  if (port < 0) return;
+
+  if (fos_init(port) == -1)
+    error("Fossil driver did not respond for port %d\n",port);
+
+  fos_setbaud(port, baudrate);
+  atexit(cleanup_doormode);
+}
+
+int door_getc() {
+  /* ***FIXME*** - User-Timeout */
+  while (1) {
+    int status = fos_status(port);
+    if (status & FOS_STATUS_RDA) break;
+    if (!(status & FOS_STATUS_DCD)) {
+      printf("Carrier dropped.\n");
+      fos_purgeout(port);
+      fos_purgein(port);
+#ifdef __EMX__
+      if (!program_state.done_hup++)
+#endif
+      {
+	if (program_state.something_worth_saving)
+	  (void) dosave0();
+	clearlocks();
+	terminate(EXIT_FAILURE);
+      }
+    }
+    __dpmi_yield();
+  }
+  return fos_getc(port);
+}
+
+#undef putchar
+int putchar_(int c) {
+  if (port >= 0) fos_putc(port,c);
+  return putchar(c);
+}
+
+/* copied and modified from sys/winnt/nttty.c */
+
+/* this is used as a printf() replacement when the window
+ * system isn't initialized yet
+ */
+void
+msmsg VA_DECL(const char *, fmt)
+	char buf[ROWNO * COLNO];	/* worst case scenario */
+	VA_START(fmt);
+	VA_INIT(fmt, const char *);
+	Vsprintf(buf, fmt, VA_ARGS);
+	VA_END();
+	xputs(buf);
+	return;
+}
+
