Add tag soup HTML parser tests to mochitest suite. b=458563 r+sr=mrbkap
☠☠ backed out by 4d8a77b9c497 ☠ ☠
authorMats Palmgren <mats.palmgren@bredband.net>
Sat, 01 Nov 2008 21:27:18 +0100
changeset 21177 2c00478d356a7fea6b01d457732bcf4567d3c74d
parent 21176 a59bd50cd9c8ac9c1326badf78828c0684ae5946
child 21178 040c59e7d039323e26e9dfefe853faaa2234e506
child 21179 4d8a77b9c497d9d79e60dbea357ecb7a948e0d3b
push id3381
push usermpalmgren@mozilla.com
push dateSat, 01 Nov 2008 20:28:01 +0000
treeherdermozilla-central@2c00478d356a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs458563
milestone1.9.1b2pre
Add tag soup HTML parser tests to mochitest suite. b=458563 r+sr=mrbkap
parser/htmlparser/tests/mochitest/Makefile.in
parser/htmlparser/tests/mochitest/htmltagsoup_dat1.txt
parser/htmlparser/tests/mochitest/parser_datreader.js
parser/htmlparser/tests/mochitest/test_htmltagsoup.html
--- a/parser/htmlparser/tests/mochitest/Makefile.in
+++ b/parser/htmlparser/tests/mochitest/Makefile.in
@@ -45,17 +45,19 @@ include $(DEPTH)/config/autoconf.mk
 include $(topsrcdir)/config/rules.mk
 
 _TEST_FILES =	parser_datreader.js \
 		parser_web_testrunner.js \
 		html5lib_tree_dat1.txt \
 		html5lib_tree_dat2.txt \
 		html5lib_tree_dat3.txt \
 		html5_tree_construction_exceptions.js \
+		htmltagsoup_dat1.txt \
 		test_html5_tree_construction.html \
+		test_htmltagsoup.html \
 	 	test_bug339350.xhtml \
 		test_bug358797.html \
 		test_bug396568.html \
 		test_bug418464.html \
 		test_compatmode.html \
 		regressions.txt \
 		$(NULL)
 
new file mode 100644
--- /dev/null
+++ b/parser/htmlparser/tests/mochitest/htmltagsoup_dat1.txt
@@ -0,0 +1,29222 @@
+#data
+## filename: 100397.html
+<html>
+<head>
+<title>font test</title>
+</head>
+
+<body>
+<font face="Arial">
+This is just a font element: 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</font>
+<H1><font face="Arial">
+01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</font></H1>
+<H2><font face="Arial">
+01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</font></H2>
+<H3><font face="Arial">
+01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</font></H3>
+<H4><font face="Arial">
+01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</font></H4>
+<H5><font face="Arial">
+01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</font></H5>
+<H6><font face="Arial">
+01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</font></H6>
+
+01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ<br>
+
+<font face="Arial">
+This is just a font element: 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+<H1>01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</H1>
+<H2>01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</H2>
+<H3>01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</H3>
+<H4>01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</H4>
+<H5>01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</H5>
+<H6>01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</H6>
+</font>
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+"
+|     "
+"
+|     <title>
+|       "font test"
+|     "
+"
+|   <body>
+|     "
+"
+|     <font>
+|       face="Arial"
+|       "
+| This is just a font element: 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|     "
+"
+|     <h1>
+|       <font>
+|         face="Arial"
+|         "
+| 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|     "
+"
+|     <h2>
+|       <font>
+|         face="Arial"
+|         "
+| 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|     "
+"
+|     <h3>
+|       <font>
+|         face="Arial"
+|         "
+| 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|     "
+"
+|     <h4>
+|       <font>
+|         face="Arial"
+|         "
+| 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|     "
+"
+|     <h5>
+|       <font>
+|         face="Arial"
+|         "
+| 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|     "
+"
+|     <h6>
+|       <font>
+|         face="Arial"
+|         "
+| 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|     "
+| 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|     <br>
+|     "
+"
+|     <font>
+|       face="Arial"
+|       "
+| This is just a font element: 01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+"
+|       <h1>
+|         "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|       "
+"
+|       <h2>
+|         "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|       "
+"
+|       <h3>
+|         "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|       "
+"
+|       <h4>
+|         "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|       "
+"
+|       <h5>
+|         "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|       "
+"
+|       <h6>
+|         "01234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+|       "
+"
+|     "
+"
+
+#data
+## filename: 100466.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<body>
+<DL>
+ <DT style="background-color:red">A line (unclosed)
+ <DL>
+  <DT>Should be indented</DT>
+ </DL>
+</DL>
+
+<DL>
+ <DT>B line (closed)</dt>
+ <DL>
+  <DT>Should be indented</DT>
+ </DL>
+</DL>
+
+</body>
+</html>
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   <head>
+|     "
+"
+|   <body>
+    "
+"
+|     <dl>
+      "
+ "
+|       <dt>
+|         style="background-color: red;"
+|         "A line (unclosed)
+ "
+|       <dl>
+|         "
+  "
+|         <dt>
+          "Should be indented"
+|         "
+ "
+|       "
+"
+|     "
+"
+|     <dl>
+|       "
+ "
+|       <dt>
+|         "B line (closed)"
+|       "
+ "
+|       <dl>
+|         "
+  "
+|         <dt>
+|           "Should be indented"
+|         "
+ "
+|       "
+"
+|     "
+"
+
+#data
+## filename: 102370.html
+<html><head><title>Testcase for bug 102370</title></head>
+<body>
+<dl>
+  <a name="a1">
+    <dd style="background-color:red">First DD
+    <dt>First DT
+  
+  <a name="a2">
+    <dt>Second DT
+    <dd>Second DD
+</dl>
+
+
+</body></html>
+#document
+| <html>
+|   <head>
+|     <title>
+|       "Testcase for bug 102370"
+|   <body>
+|     "
+"
+|     <dl>
+|       "
+  "
+|       <a>
+|         name="a1"
+|         "
+    "
+|         <dd>
+|           style="background-color: red;"
+|           "First DD
+    "
+|         <dt>
+|           "First DT
+  
+  "
+|       <a>
+|         name="a2"
+|         "
+    "
+|         <dt>
+|           "Second DT
+    "
+|         <dd>
+|           "Second DD
+"
+|     "
+"
+
+#data
+## filename: 124788.html
+<html><head></head>
+<body>
+<table>
+<tbody><tr>
+<td colspan="2">
+<br>
+<form>
+sometexthere<textarea>&lt;TR&gt;&lt;/tr&gt;
+&lt;/table&gt;
+&lt;/form&gt;
+&lt;/td&gt;
+&lt;/tr&gt;
+&lt;/table&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+</textarea><table border="0">
+</table></form></td></tr></tbody></table></body></html>
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+"
+|     <table>
+|       "
+"
+|       <tbody>
+|         <tr>
+|           "
+"
+|           <td>
+|             colspan="2"
+|             "
+"
+|             <br>
+|             "
+"
+|             <form>
+|               "
+sometexthere"
+|               <textarea>
+|                 "<TR></tr>
+</table>
+</form>
+</td>
+</tr>
+</table>
+</body>
+</html>
+"
+|               <table>
+|                 border="0"
+|                 "
+"
+
+#data
+## filename: 142965.html
+<html><body>
+<table>
+<p><h3>Please Enter your Homesite Login, E-mail and Password to delete</h3></p>
+<form method="POST">
+<input type=submit>
+</form>
+</table>
+</body></html>
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+| "
+|     <p>
+|     <h3>
+|       "Please Enter your Homesite Login, E-mail and Password to delete"
+|     <p>
+|     "
+| "
+|     <input>
+|       type="submit"
+|     "
+| "
+|     <table>
+|       "
+| "
+|       <form>
+|         method="POST"
+|       "
+| 
+| "
+|     "
+| "
+
+#data
+## filename: 142965_1.html
+<html>
+<body>
+ <table border="1" width="100px">
+  <tr>
+   <p><caption>caption
+   <td>
+    cell
+   </td>
+  </tr>
+ </table>
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+"
+|   <body>
+|     "
+ "
+|     <p>
+|       "caption
+   "
+|     <table>
+|       width="100px"
+|       border="1"
+|       "
+  "
+|       <tbody>
+|         <tr>
+|           "
+   "
+|           <td>
+|             "
+    cell
+   "
+|           "
+  "
+|         "
+ "
+|     "
+"
+
+#data
+## filename: 149877.html
+<HTML>
+<HEAD>
+<META NAME="GENERATOR" Content="Microsoft Developer Studio">
+<META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1">
+<TITLE>Document Title</TITLE>
+</HEAD>
+
+<script>
+ var value = "should ";
+</script>
+<!-- Insert HTML here -->
+<iframe>
+<script language="javascript"> value += "not ";</script>
+</iframe>
+<script>
+ value += "see this content";
+ document.write(value);
+</script>
+
+</HTML>
+#document
+| <html>
+|   <head>
+|     "
+"
+|     "
+"
+|     <meta>
+|       content="Microsoft Developer Studio"
+|       name="GENERATOR"
+|     "
+"
+|     <meta>
+|       content="text/html; charset=iso-8859-1"
+|       http-equiv="Content-Type"
+|     "
+"
+|     <title>
+|       "Document Title"
+|     "
+"
+|     <script>
+|       "
+ var value = "should ";
+"
+|     "
+"
+|     <!--  Insert HTML here  -->
+|     "
+"
+|     <script>
+|       "
+ value += "see this content";
+ document.write(value);
+"
+|   <body>
+|     <iframe>
+|       "
+<script language="javascript"> value += "not ";</script>
+"
+|     "
+should see this content
+"
+
+#data
+## filename: 15204.html
+<html>
+<head><title> &lt </title></head>
+<body>
+<FORM>
+ <TEXTAREA ROWS=8 COLS=50>&lt
+<table       width="100%";  >
+ bgcolor=    #FFFFFF   ; 
+ <tr> &lt
+  <td> a </td>
+ </tr>
+</table>
+</TEXTAREA>
+</FORM>
+<script>
+err()
+</script>
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     <title>
+|       " < "
+|   <body>
+|     "
+| "
+|     <form>
+|       "
+|  "
+|       <textarea>
+|         cols="50"
+|         rows="8"
+|         "<
+| <table       width="100%";  >
+|  bgcolor=    #FFFFFF   ; 
+|  <tr> <
+|   <td> a </td>
+|  </tr>
+| </table>
+| "
+|       "
+| "
+|     "
+| "
+|     <script>
+|       "
+| err()
+| "
+|     "
+| "
+
+#data
+## filename: 17003.html
+<html>
+<body>
+
+<textarea onclick="dump(this.childNodes.length);">
+&gt;<table><tr><td>hellothere</td></tr></table>
+Click on the textarea to see it's number of childNodes...
+(Should be "1" for the child text) 
+</textarea>
+fdfd
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <textarea>
+|       onclick="dump(this.childNodes.length);"
+|       "><table><tr><td>hellothere</td></tr></table>
+| Click on the textarea to see it's number of childNodes...
+| (Should be "1" for the child text) 
+| "
+|     "
+| fdfd
+| "
+
+#data
+## filename: 18308.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><title>parserspace.html</title></head>
+
+<body>
+The head and body tags appear side by side in this test: <br>&lt;/HEAD&gt;&lt;BODY&gt;<br> so you <b>should not</b> see an [object Text] between the ending head and beginning body tags.
+<br><br>
+<script type="text/javascript">
+
+for(i=0; i<3; i++){
+  var oWhat=document.documentElement.childNodes[i].tagName;
+  document.write(oWhat +"<BR>");
+}
+
+</script>
+</body></html>
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   <head>
+|     <title>
+|       "parserspace.html"
+|   <body>
+|     "
+| The head and body tags appear side by side in this test: "
+|     <br>
+|     "</HEAD><BODY>"
+|     <br>
+|     " so you "
+|     <b>
+|       "should not"
+|     " see an [object Text] between the ending head and beginning body tags.
+| "
+|     <br>
+|     <br>
+|     "
+| "
+|     <script>
+|       type="text/javascript"
+|       "
+| for(i=0; i<3; i++){
+|   var oWhat=document.documentElement.childNodes[i].tagName;
+|   document.write(oWhat +"<BR>");
+| }
+| "
+|     "HEAD"
+|     <br>
+|     "BODY"
+|     <br>
+|     "
+| "
+
+#data
+## filename: 183711.html
+<html>
+<head>
+<title>MSN Hotmail - Compose</title>
+
+</head>
+<body>
+	
+<table cellpadding=0 cellspacing=0 bgcolor="#93BEE2" width=100% style="border-left:4px solid #93BEE2;">
+<form name="hiddentext"><input type="hidden" name="sigtext" value=""></form>
+<form name="composeform" method="POST" action="http://lw9fd.law9.hotmail.msn.com/cgi-bin/premail">
+
+</table>
+
+</td>
+
+</tr>
+</form>
+</table>	
+
+<SCRIPT>
+document.write("This is an HTMLFormElement: " + document.composeform.tagName);
+</SCRIPT>
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <title>
+|       "MSN Hotmail - Compose"
+|     "
+| "
+|   <body>
+|     "
+| 	
+| "
+|     <table>
+|       width="100%"
+|       cellspacing="0"
+|       cellpadding="0"
+|       bgcolor="#93bee2"
+|       style="border-left: 4px solid rgb(147, 190, 226);"
+|       "
+| "
+|       <form>
+|         name="hiddentext"
+|       <input>
+|         type="hidden"
+|         value=""
+|         name="sigtext"
+|       "
+| "
+|       <form>
+|         action="http://lw9fd.law9.hotmail.msn.com/cgi-bin/premail"
+|         method="POST"
+|         name="composeform"
+|       "
+| "
+|     "
+| 
+| 
+| 
+| 	
+| "
+|     <script>
+|       "
+| document.write("This is an HTMLFormElement: " + document.composeform.tagName);
+| "
+|     "This is an HTMLFormElement: FORM
+| "
+
+#data
+## filename: 184029.html
+<html>
+<head>
+<title></title>
+
+</head>
+
+
+<body>
+   <iframe xsrc="184029_iframe.html">
+   </iframe>
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <title>
+|     "
+| "
+|   <body>
+|     "
+|    "
+|     <iframe>
+|       xsrc="184029_iframe.html"
+|       "
+|    "
+|     "
+| "
+
+#data
+## filename: 184029_iframe.html
+<SCRIPT>
+   document.write('\<script\>');
+   document.write(' document.write(\'\<iframe\>\');');
+   document.write(' document.write(\'\<script\>\');');
+   document.write(' document.write(\'\</scr\');');
+   document.write(' document.write(\'ipt\>\');');
+   document.write(' document.write(\'\</iframe\>\');');
+   document.write('<\/script>');
+</SCRIPT>
+#document
+| <html>
+|   <head>
+|     <script>
+|       "
+|    document.write('\<script\>');
+|    document.write(' document.write(\'\<iframe\>\');');
+|    document.write(' document.write(\'\<script\>\');');
+|    document.write(' document.write(\'\</scr\');');
+|    document.write(' document.write(\'ipt\>\');');
+|    document.write(' document.write(\'\</iframe\>\');');
+|    document.write('<\/script>');
+| "
+|     <script>
+|       " document.write('<iframe>'); document.write('<script>'); document.write('</scr'); document.write('ipt>'); document.write('</iframe>');"
+|   <body>
+|     <iframe>
+|       "<script></script>"
+
+#data
+## filename: 187790.html
+<html>
+<script language=Javascript>
+document.write("outside of body");
+</script>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     <script>
+|       language="Javascript"
+|       "
+| document.write("outside of body");
+| "
+|   <body>
+|     "outside of body
+| "
+
+#data
+## filename: 19116.html
+<html>
+  <body>
+    <form>
+      <table bgcolor=red>
+        <input>
+        <tr><td><input></td></tr>
+      </table>
+    </form>
+  </body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+|   "
+|   <body>
+|     "
+|     "
+|     <form>
+|       "
+|       "
+|       <input>
+|       "
+|         "
+|       <table>
+|         bgcolor="red"
+|         "
+|         "
+|         <tbody>
+|           <tr>
+|             <td>
+|               <input>
+|           "
+|       "
+|       "
+|     "
+|     "
+|   "
+
+#data
+## filename: 20087.html
+<html><head></head>
+<body><form>
+
+<table>
+<tbody><tr><td> 
+test
+<table><tbody><tr>
+</tr>
+</tbody></table>
+</td></tr>
+</tbody></table>
+
+</form>
+
+
+
+</body></html>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       "
+| "
+|       <table>
+|         "
+| "
+|         <tbody>
+|           <tr>
+|             <td>
+|               " 
+| test
+| "
+|               <table>
+|                 <tbody>
+|                   <tr>
+|                     "
+| "
+|                   "
+| "
+|               "
+| "
+|           "
+| "
+|       "
+| "
+|     "
+| "
+
+#data
+## filename: 22263.html
+<html><head></head>
+  <body><ul>
+	  <li>A
+	  </li><li>B
+	  </li><li>C</li>
+	  
+  </ul>
+</body></html>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       "
+| 	  "
+|       <li>
+|         "A
+| 	  "
+|       <li>
+|         "B
+| 	  "
+|       <li>
+|         "C"
+|       "
+| 	  
+|   "
+|     "
+| "
+
+#data
+## filename: 22480.html
+<html>
+<body>
+<form>
+<input type=text><p>
+<input type=submit>
+</form>This text block should be on the next line
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <form>
+|       "
+| "
+|       <input>
+|         type="text"
+|       <p>
+|         "
+| "
+|         <input>
+|           type="submit"
+|         "
+| This text block should be on the next line
+| "
+
+#data
+## filename: 22596.html
+<html>
+ <body>
+  <h5>H5_1
+   <li>LI_1
+  <h5>H5_2
+   <li>LI_2
+  <h5>H5_3
+   <li>LI_3
+ </body>
+</html>
+
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|   <body>
+|     "
+|   "
+|     <h5>
+|       "H5_1
+|    "
+|       <li>
+|         "LI_1
+|   "
+|     <h5>
+|       "H5_2
+|    "
+|       <li>
+|         "LI_2
+|   "
+|     <h5>
+|       "H5_3
+|    "
+|       <li>
+|         "LI_3
+|  "
+
+#data
+## filename: 24184.html
+<HTML><HEAD>
+<style type="text/css">
+
+span:before { content: "<" attr(class) ">" }
+span:after { content: "</" attr(class) ">" }
+
+span.a {
+	font-size:	130%;
+	color: blue;
+}
+
+span.z {
+	padding-left:	50px;
+	display:	block;
+	color: green;
+}
+
+</style>
+</HEAD>
+
+<BODY><FONT FACE="Arial"><!-- Deleting this font tag fixes the bug -->
+<P>testcase 4</P><!-- Deleting this paragraph or adding a space
+before or after this comment fixes the bug -->
+
+<SPAN CLASS="z">[span class z]</SPAN><br>
+<P><SPAN CLASS="a">[span class a]</SPAN></P> 
+
+<SPAN CLASS="z">[span class z]</SPAN><br>
+<P><SPAN CLASS="a">[span class a]</SPAN></P> 
+
+<SPAN CLASS="z">[span class z]</SPAN><br>
+<P><SPAN CLASS="a">[span class a]</SPAN></P> 
+
+<SPAN CLASS="z">[span class z]</SPAN>
+<P><SPAN CLASS="a">[span class a]</SPAN></P> 
+
+</font></body></html>
+
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     <style>
+|       type="text/css"
+|       "
+| span:before { content: "<" attr(class) ">" }
+| span:after { content: "</" attr(class) ">" }
+| span.a {
+| 	font-size:	130%;
+| 	color: blue;
+| }
+| span.z {
+| 	padding-left:	50px;
+| 	display:	block;
+| 	color: green;
+| }
+| "
+|     "
+| "
+|   <body>
+|     <font>
+|       face="Arial"
+|       <!--  Deleting this font tag fixes the bug  -->
+|       "
+| "
+|       <p>
+|         "testcase 4"
+|       <!--  Deleting this paragraph or adding a space
+| before or after this comment fixes the bug  -->
+|       "
+| "
+|       <span>
+|         class="z"
+|         "[span class z]"
+|       <br>
+|       "
+| "
+|       <p>
+|         <span>
+|           class="a"
+|           "[span class a]"
+|       " 
+| "
+|       <span>
+|         class="z"
+|         "[span class z]"
+|       <br>
+|       "
+| "
+|       <p>
+|         <span>
+|           class="a"
+|           "[span class a]"
+|       " 
+| "
+|       <span>
+|         class="z"
+|         "[span class z]"
+|       <br>
+|       "
+| "
+|       <p>
+|         <span>
+|           class="a"
+|           "[span class a]"
+|       " 
+| "
+|       <span>
+|         class="z"
+|         "[span class z]"
+|       "
+| "
+|       <p>
+|         <span>
+|           class="a"
+|           "[span class a]"
+|       " 
+| "
+
+#data
+## filename: 24462.html
+<HTML>
+ <BODY>
+  <TABLE>
+   <TR>
+    <TD>
+      <B>
+       <FORM>
+        <NOBR>
+         <IMG HEIGHT=30>
+        </NOBR>
+       </FORM>
+       UNSER ANGEBOT
+    </TD>
+    <TD>
+     Foo
+    </TD>
+   </TR>
+  </TABLE>
+ </BODY>
+</HTML>
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|   <body>
+|     "
+|   "
+|     <table>
+|       "
+|    "
+|       <tbody>
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "
+|       "
+|             <b>
+|               "
+|        "
+|             <form>
+|               "
+| "
+|               <b>
+|                 "        "
+|                 <nobr>
+|                   "
+|          "
+|                   <img>
+|                     height="30"
+|                   "
+|         "
+|                 "
+|        "
+|             "
+| "
+|             <b>
+|               "       UNSER ANGEBOT
+|     "
+|           "
+|     "
+|           <td>
+|             "
+|      Foo
+|     "
+|           "
+|    "
+|         "
+|   "
+|     "
+|  "
+
+#data
+## filename: 26347.html
+<html><head><title>Testcase for bug 68674</title></head><body>
+<A HREF="http://www.mozilla.org">www.<STRONG>mozilla.org</A></STRONG>
+STRONG - This text should not be part of the link <BR>
+</body></html>
+#document
+| <html>
+|   <head>
+|     <title>
+|       "Testcase for bug 68674"
+|   <body>
+|     "
+| "
+|     <a>
+|       href="http://www.mozilla.org"
+|       "www."
+|       <strong>
+|         "mozilla.org"
+|     <strong>
+|     "
+| STRONG - This text should not be part of the link "
+|     <br>
+|     "
+| "
+
+#data
+## filename: 26853.html
+<A href=foo.html><B>foo<A href=bar.html>bar</A></B></A>
+<DL><DD><LI>one<DD><LI>two
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="foo.html"
+|       <b>
+|         "foo"
+|     <b>
+|       <a>
+|         href="bar.html"
+|         "bar"
+|     "
+| "
+|     <dl>
+|       <dd>
+|         <li>
+|           "one"
+|       <dd>
+|         <li>
+|           "two"
+
+
+#data
+## filename: 27490.html
+
+<HTML>  
+
+<TABLE BORDER="1">
+<tr>
+  <td>   
+    <b>
+      Test
+  </td>
+</tr>
+  <TD>
+    Test
+  </TD>
+</TR>
+</TABLE>
+
+</html>
+#document
+| <html>
+|   <head>
+|     "  
+| "
+|   <body>
+|     <table>
+|       border="1"
+|       "
+| "
+|       <tbody>
+|         <tr>
+|           "
+|   "
+|           <td>
+|             "   
+|     "
+|             <b>
+|               "
+|       Test
+|   "
+|           "
+| "
+|         "
+|   "
+|         <tr>
+|           <td>
+|             "
+|     Test
+|   "
+|           "
+| "
+|         "
+| "
+|     "
+| "
+
+#data
+## filename: 30487.html
+<html><head></head>
+<body text="#000000">
+
+   		
+
+<font face="geneva, arial, helvetica">
+<font size="-1">
+
+This text, in the body, is in "Font Face A"
+
+<table>
+        <tbody><tr>
+        <td align="center">
+            <font size="5"> 
+           This text, in a table, is in "Font Face B". Immediately following
+this text is a close font tag, and another erroneously placed close font
+tag.              </font>
+            
+        </td>
+        </tr>
+</tbody></table>  This text, back in the body, should be in Font Face A,
+but is not because Mozilla incorrectly heeded the second close-font tag in
+the above table.  </font>
+
+</font></body></html>
+#document
+| <html>
+|   <head>
+|   <body>
+|     text="#000000"
+|     "
+|    		
+| "
+|     <font>
+|       face="geneva, arial, helvetica"
+|       "
+| "
+|       <font>
+|         size="-1"
+|         "
+| This text, in the body, is in "Font Face A"
+| "
+|         <table>
+|           "
+|         "
+|           <tbody>
+|             <tr>
+|               "
+|         "
+|               <td>
+|                 align="center"
+|                 "
+|             "
+|                 <font>
+|                   size="5"
+|                   " 
+|            This text, in a table, is in "Font Face B". Immediately following
+| this text is a close font tag, and another erroneously placed close font
+| tag.              "
+|                 "
+|             
+|         "
+|               "
+|         "
+|             "
+| "
+|         "  This text, back in the body, should be in Font Face A,
+| but is not because Mozilla incorrectly heeded the second close-font tag in
+| the above table.  "
+|       "
+| "
+
+#data
+## filename: 3248.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<HTML lang="en">
+<HEAD>
+  <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+  <META http-equiv="Content-Style-Type" content="text/css">
+  <LINK type="text/css" rel=stylesheet>
+</HEAD>
+
+<BODY>
+
+<OL>
+<LI class=a>Should be green - Linked with <code>LINK</code> HTTP Header.</LI>
+<LI class=c>Should be green - Linked with <code>LINK</code></LI>
+</OL>
+</BODY></HTML>
+
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   lang="en"
+|   <head>
+|     "
+| 
+| "
+|     "
+|   "
+|     <meta>
+|       content="text/html; charset=ISO-8859-1"
+|       http-equiv="Content-Type"
+|     "
+|   "
+|     <meta>
+|       content="text/css"
+|       http-equiv="Content-Style-Type"
+|     "
+|   "
+|     <link>
+|       rel="stylesheet"
+|       type="text/css"
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <ol>
+|       "
+| "
+|       <li>
+|         class="a"
+|         "Should be green - Linked with "
+|         <code>
+|           "LINK"
+|         " HTTP Header."
+|       "
+| "
+|       <li>
+|         class="c"
+|         "Should be green - Linked with "
+|         <code>
+|           "LINK"
+|       "
+| "
+|     "
+| "
+
+#data
+## filename: 32782.html
+<html><head></head>
+<body>
+<br>
+<table border="0" cellpadding="0" cellspacing="0" width="540">
+<tbody><tr>
+<td>***</td></tr><tr><td>***</td></tr>
+</tbody></table>
+</body></html>
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+| "
+|     <br>
+|     "
+| "
+|     <table>
+|       width="540"
+|       cellspacing="0"
+|       cellpadding="0"
+|       border="0"
+|       "
+| "
+|       <tbody>
+|         <tr>
+|           "
+| "
+|           <td>
+|             "***"
+|         <tr>
+|           <td>
+|             "***"
+|         "
+| "
+|     "
+| "
+
+#data
+## filename: 35806.html
+<table border=1>
+<tr><td bgcolor="red>1</td>
+</tr>
+bad text
+<tr><td bgcolor=blue>2</td>
+</tr>
+</table>
+#document
+| <html>
+|   <head>
+|   <body>
+|     "bad text
+| "
+|     <table>
+|       border="1"
+|       "
+| "
+|       <tbody>
+|         <tr>
+|           <td>
+|             bgcolor="red"
+|             "1"
+|           "
+| "
+|         "
+| "
+|         <tr>
+|           <td>
+|             bgcolor="blue"
+|             "2"
+|           "
+| "
+|         "
+| "
+
+#data
+## filename: 40143.html
+<html>
+<body>
+<script>
+
+document.write('<style>')
+
+document.write(".menured { color: red; } \n")
+document.write('</style>')
+</script>
+
+<p class="menured">This should be the only text visible and it should be red</p>
+It is: <script>document.write(document.defaultView.getComputedStyle(document.getElementsByTagName('p')[0], null).color)</script>
+</body></html>
+
+ 
+#document
+| <html>
+|   <head>
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <script>
+|       "
+| document.write('<style>')
+| document.write(".menured { color: red; } \n")
+| document.write('</style>')
+| "
+|     <style>
+|       ".menured { color: red; } 
+| "
+|     "
+| "
+|     <p>
+|       class="menured"
+|       "This should be the only text visible and it should be red"
+|     "
+| It is: "
+|     <script>
+|       "document.write(document.defaultView.getComputedStyle(document.getElementsByTagName('p')[0], null).color)"
+|     "rgb(255, 0, 0)
+|  "
+
+#data
+## filename: 40713.html
+<html>
+ <body>
+ <p>
+ <font face="arial, helvetica" color=red>
+  <table border="1">
+   <tr><td><font size=+1><a href=foo.html>SHOULD BE TIMES ROMAN</a></font></td></tr>
+  </table>
+  <p>
+  <font size='+1'>
+   <b>
+    <a href=foo.html>SHOULD BE HELVETICA
+    </a>
+   </b>
+  </font>
+ </body>
+</html>
+
+
+	
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|   <body>
+|     "
+|  "
+|     <p>
+|       "
+|  "
+|       <font>
+|         face="arial, helvetica"
+|         color="red"
+|         "
+|   "
+|         <table>
+|           border="1"
+|           "
+|    "
+|           <tbody>
+|             <tr>
+|               <td>
+|                 <font>
+|                   size="+1"
+|                   <a>
+|                     href="foo.html"
+|                     "SHOULD BE TIMES ROMAN"
+|             "
+|   "
+|         "
+|   "
+|     <p>
+|       "
+| "
+|       <font>
+|         face="arial, helvetica"
+|         color="red"
+|         "  "
+|         <font>
+|           size="+1"
+|           "
+|    "
+|           <b>
+|             "
+|     "
+|             <a>
+|               href="foo.html"
+|               "SHOULD BE HELVETICA
+|     "
+|             "
+|    "
+|           "
+|   "
+|         "
+|  	"
+
+##todo filename: 40809_CR.html -- parser_datreader.js doesn't grok this content for some reason
+##todo filename: 40809_LF.html -- parser_datreader.js doesn't grok this content for some reason
+
+#data
+## filename: 40855.html
+<html><head></head>
+<body>
+
+<center style="color: green;">
+This should be on all one <!-- new date --> line... but it isn't
+</center>
+<table>
+</table>
+
+</body></html>
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+| "
+|     <center>
+|       style="color: green;"
+|       "
+| This should be on all one "
+|       <!--  new date  -->
+|       " line... but it isn't
+| "
+|     "
+| "
+|     <table>
+|       "
+| "
+|     "
+| "
+
+#data
+## filename: 43678.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><style>P { color:red };</style></head><body><P>Inside P but before TABLE<table><tr><td>cell</td></tr></table>After TABLE but inside P</body></html>
+#document
+<!DOCTYPE HTML>
+| <html>
+|   <head>
+|     <style>
+|       "P { color:red };"
+|   <body>
+|     <p>
+|       "Inside P but before TABLE"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "cell"
+|     "After TABLE but inside P"
+
+#data
+## filename: 44479.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><title>BUTTON in SPAN in SPAN / SPAN in BUTTON in SPAN</title></head>
+
+<body>
+
+<p>BUTTON in SPAN in SPAN</p>
+<span>
+<span>
+<button>
+myButton
+</button>
+</span>
+</span>
+<p>Text after button</p>
+
+<hr>
+
+<p>SPAN in BUTTON in SPAN</p>
+<span>
+<button>
+<span>
+myButton
+</span>
+</button>
+</span>
+<p>Text after button</p>
+
+</body></html>
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   <head>
+|     <title>
+|       "BUTTON in SPAN in SPAN / SPAN in BUTTON in SPAN"
+|   <body>
+|     "
+| "
+|     <p>
+|       "BUTTON in SPAN in SPAN"
+|     "
+| "
+|     <span>
+|       "
+| "
+|       <span>
+|         "
+| "
+|         <button>
+|           "
+| myButton
+| "
+|         "
+| "
+|       "
+| "
+|     "
+| "
+|     <p>
+|       "Text after button"
+|     "
+| "
+|     <hr>
+|     "
+| "
+|     <p>
+|       "SPAN in BUTTON in SPAN"
+|     "
+| "
+|     <span>
+|       "
+| "
+|       <button>
+|         "
+| "
+|         <span>
+|           "
+| myButton
+| "
+|         "
+| "
+|       "
+| "
+|     "
+| "
+|     <p>
+|       "Text after button"
+|     "
+| "
+
+#data
+## filename: 44791.html
+<HTML>
+ <BODY>
+  <p>
+   <form>
+    <table>
+     <strong>Your options on how to apply for the Job are:</strong><br>
+     <li>Fax your resume/statement of qualifications and cover letter
+    </table>
+   </form>
+   <form>
+    <select><option>1<option>2</select>
+    <table>
+     <strong>Your options on how to apply for the Job are:</strong><br>
+     <li>Fax your resume/statement of qualifications and cover letter
+    </table>
+   </form>
+  </BODY>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|   <body>
+|     "
+|   "
+|     <p>
+|       "
+|    "
+|     <form>
+|       "
+|     "
+|       <strong>
+|         "Your options on how to apply for the Job are:"
+|       <br>
+|       "
+|      "
+|       <li>
+|         "Fax your resume/statement of qualifications and cover letter
+|     "
+|       <table>
+|         "
+|      "
+|       "
+|    "
+|     "
+|    "
+|     <form>
+|       "
+|     "
+|       <select>
+|         <option>
+|           "1"
+|         <option>
+|           "2"
+|       "
+|     "
+|       <strong>
+|         "Your options on how to apply for the Job are:"
+|       <br>
+|       "
+|      "
+|       <li>
+|         "Fax your resume/statement of qualifications and cover letter
+|     "
+|       <table>
+|         "
+|      "
+|       "
+|    "
+|     "
+|   "
+
+#data
+## filename: 47535.html
+<HTML>
+<BODY>
+<FORM METHOD=GET>
+<INPUT TYPE=hidden NAME=blah VALUE="a
+b">
+<INPUT TYPE=submit>
+</FORM>
+</BODY>
+</HTML>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <form>
+|       method="GET"
+|       "
+| "
+|       <input>
+|         type="hidden"
+|         value="a
+| b"
+|         name="blah"
+|       "
+| "
+|       <input>
+|         type="submit"
+|       "
+| "
+|     "
+| "
+
+#data
+## filename: 48256.html
+
+<HTML>
+<HEAD>
+<TITLE>Color Inheritance Test</TITLE>
+<STYLE type="text/css">
+
+BODY {background-color: #FFFFFF; color: #000000}
+
+.type-expression, .type-name {font-family: "Times New Roman", Times, serif; color: yellow}
+.type-name {font-variant: small-caps}
+.field-name {font-family: Arial, Helvetica, sans-serif; color: #FF0000}
+
+A * {text-decoration: inherit}
+</STYLE>
+</HEAD>
+
+<BODY>
+<P>P
+ <SPAN class=type-expression>Span O
+  <A href="#Link1">A
+   <SPAN class=type-name>Span I</SPAN>
+  </A>
+ </SPAN>
+</P>
+<P>P
+ <A href="#Link1">A
+  <SPAN class=type-name>Span</SPAN>
+ </A>
+</P>
+
+</BODY>
+</HTML>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <title>
+|       "Color Inheritance Test"
+|     "
+| "
+|     <style>
+|       type="text/css"
+|       "
+| BODY {background-color: #FFFFFF; color: #000000}
+| .type-expression, .type-name {font-family: "Times New Roman", Times, serif; color: yellow}
+| .type-name {font-variant: small-caps}
+| .field-name {font-family: Arial, Helvetica, sans-serif; color: #FF0000}
+| A * {text-decoration: inherit}
+| "
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <p>
+|       "P
+|  "
+|       <span>
+|         class="type-expression"
+|         "Span O
+|   "
+|         <a>
+|           href="#Link1"
+|           "A
+|    "
+|           <span>
+|             class="type-name"
+|             "Span I"
+|           "
+|   "
+|         "
+|  "
+|       "
+| "
+|     "
+| "
+|     <p>
+|       "P
+|  "
+|       <a>
+|         href="#Link1"
+|         "A
+|   "
+|         <span>
+|           class="type-name"
+|           "Span"
+|         "
+|  "
+|       "
+| "
+|     "
+| "
+
+#data
+## filename: 48351.html
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"><head><title>Mozilla Tests: An XHTML Document</title>
+    
+    <style type="text/css">
+       .xhtml { display: none; }
+       strong { color: red; }
+    </style></head>
+
+  <body>
+    <h1>An XHTML Document</h1>
+    <p>This document is being parsed as <span class="xhtml">X</span>HTML. </p>
+    <p> <strong> This should not be emphasised text. </strong></p>
+<strong>    </strong><p><strong> This should be a second paragraph. </strong></p>
+<strong>  </strong></body></html>
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   xml:lang="en"
+|   xmlns="http://www.w3.org/1999/xhtml"
+|   <head>
+|     <title>
+|       "Mozilla Tests: An XHTML Document"
+|     "
+|     
+|     "
+|     <style>
+|       type="text/css"
+|       "
+|        .xhtml { display: none; }
+|        strong { color: red; }
+|     "
+|   <body>
+|     "
+|     "
+|     <h1>
+|       "An XHTML Document"
+|     "
+|     "
+|     <p>
+|       "This document is being parsed as "
+|       <span>
+|         class="xhtml"
+|         "X"
+|       "HTML. "
+|     "
+|     "
+|     <p>
+|       " "
+|       <strong>
+|         " This should not be emphasised text. "
+|     "
+| "
+|     <strong>
+|       "    "
+|     <p>
+|       <strong>
+|         " This should be a second paragraph. "
+|     "
+| "
+|     <strong>
+|       "  "
+
+#data
+## filename: 50050.html
+<HTML>
+<HEAD>
+<STYLE>
+.abs {
+  position: absolute;
+}
+</STYLE>
+<SCRIPT>
+  function showWidth(strName) {
+    dump(getComputedStyle(document.getElementById(strName), 
+null).getPropertyValue('width'));
+  }
+</SCRIPT>
+</HEAD>
+<BODY>
+<DIV CLASS="abs" ID="foo">
+  Single &lt;DIV&gt;
+</DIV><BR><BR>
+<INPUT TYPE="Button" VALUE="Test" onClick="showWidth('foo');">
+<BR>
+<DIV CLASS="abs">
+  <DIV CLASS="abs" ID="bar">
+    Nested &lt;DIV&gt;s
+  </DIV>
+</DIV><BR><BR>
+<INPUT TYPE="Button" VALUE="Test" onClick="showWidth('bar');">
+</BODY>
+</HTML>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <style>
+|       "
+| .abs {
+|   position: absolute;
+| }
+| "
+|     "
+| "
+|     <script>
+|       "
+|   function showWidth(strName) {
+|     dump(getComputedStyle(document.getElementById(strName), 
+| null).getPropertyValue('width'));
+|   }
+| "
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <div>
+|       id="foo"
+|       class="abs"
+|       "
+|   Single <DIV>
+| "
+|     <br>
+|     <br>
+|     "
+| "
+|     <input>
+|       type="Button"
+|       onclick="showWidth('foo');"
+|       value="Test"
+|     "
+| "
+|     <br>
+|     "
+| "
+|     <div>
+|       class="abs"
+|       "
+|   "
+|       <div>
+|         id="bar"
+|         class="abs"
+|         "
+|     Nested <DIV>s
+|   "
+|       "
+| "
+|     <br>
+|     <br>
+|     "
+| "
+|     <input>
+|       type="Button"
+|       onclick="showWidth('bar');"
+|       value="Test"
+|     "
+| "
+
+#data
+## filename: 51161.html
+<html><head>
+<style>
+p { font-size: 24px}
+</style></head>
+<body>
+  <p>text text text text</p>
+ </body></html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     <style>
+|       "
+| p { font-size: 24px}
+| "
+|   <body>
+|     "
+|   "
+|     <p>
+|       "text text text text"
+|     "
+|  "
+
+#data
+## filename: 53112.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+ <head>
+  <title>Mozilla: Stylesheet linking without "type" attribute</title>
+  <style type="text/css">
+   p { color: red; }
+  </style>
+  <link rel="stylesheet">
+ </head>
+ <body>
+  <p class="test">I should be green.</p>
+ </body>
+</html>
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   <head>
+|     "
+| 
+|  "
+|     "
+|   "
+|     <title>
+|       "Mozilla: Stylesheet linking without "type" attribute"
+|     "
+|   "
+|     <style>
+|       type="text/css"
+|       "
+|    p { color: red; }
+|   "
+|     "
+|   "
+|     <link>
+|       rel="stylesheet"
+|     "
+|  "
+|   <body>
+|     "
+|   "
+|     <p>
+|       class="test"
+|       "I should be green."
+|     "
+|  "
+
+#data
+## filename: 54651.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"><html><head><title>Child Selectors Test</title>
+  
+   <style type="text/css">
+
+    DIV P { background: red; color: yellow }
+    LI P { background: green; color: white; }
+
+    DIV P:after { content: ' [[ FAILED ]]'; }
+    LI P:after { content: ' [[ PASSED ]]'; }
+
+    * { padding: 4px; border: 1px solid lime; margin: 4px; } 
+
+   </style></head>
+
+ <body>
+
+  <p>Below this box, every box should be within another. In other
+  words, the only SIBLINGS in this document should be this box and the
+  immediate next one. In particular, LI should allow the inner DIV to
+  nest within it.</p>
+
+  <div>
+   DIV
+   <ol>
+    <li> 
+     LI
+     <div>
+      DIV
+      <p>
+       P
+      </p>
+     </div>
+    </li>
+   </ol>
+  </div>
+
+ </body></html>
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   <head>
+|     <title>
+|       "Child Selectors Test"
+|     "
+|   
+|    "
+|     <style>
+|       type="text/css"
+|       "
+|     DIV P { background: red; color: yellow }
+|     LI P { background: green; color: white; }
+|     DIV P:after { content: ' [[ FAILED ]]'; }
+|     LI P:after { content: ' [[ PASSED ]]'; }
+|     * { padding: 4px; border: 1px solid lime; margin: 4px; } 
+|    "
+|   <body>
+|     "
+|   "
+|     <p>
+|       "Below this box, every box should be within another. In other
+|   words, the only SIBLINGS in this document should be this box and the
+|   immediate next one. In particular, LI should allow the inner DIV to
+|   nest within it."
+|     "
+|   "
+|     <div>
+|       "
+|    DIV
+|    "
+|       <ol>
+|         "
+|     "
+|         <li>
+|           " 
+|      LI
+|      "
+|           <div>
+|             "
+|       DIV
+|       "
+|             <p>
+|               "
+|        P
+|       "
+|             "
+|      "
+|           "
+|     "
+|         "
+|    "
+|       "
+|   "
+|     "
+|  "
+
+#data
+## filename: 54845.html
+<html>
+<head>
+<script>
+function changePage() {
+  dump("Change Page!\n");
+}
+</script>
+</head>
+
+<body>
+Start of Body Content
+<script>
+document.writeln('<FORM name="SelectMenu" method=post action="javascript:changePage();">');
+with (document){
+  writeln('<FORM name="SelectMenu" method=post action="javascript:changePage();">');
+  writeln('script form content');
+}
+</script>
+
+<noscript>
+  <FORM name="SelectMenu" method="post">
+    noscript form content goes here
+  <table border=1>
+   <tr><td>TABLE</td></tr>
+    illegal table content
+  </table>
+
+  </FORM>
+</noscript>
+
+<center>
+<INPUT>
+</center>
+</FORM>
+</body>
+</html>
+
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <script>
+|       "
+| function changePage() {
+|   dump("Change Page!\n");
+| }
+| "
+|     "
+| "
+|   <body>
+|     "
+| Start of Body Content
+| "
+|     <script>
+|       "
+| document.writeln('<FORM name="SelectMenu" method=post action="javascript:changePage();">');
+| with (document){
+|   writeln('<FORM name="SelectMenu" method=post action="javascript:changePage();">');
+|   writeln('script form content');
+| }
+| "
+|     <form>
+|       action="javascript:changePage();"
+|       method="post"
+|       name="SelectMenu"
+|       "
+| 
+| script form content
+| 
+| "
+|       <noscript>
+|         "
+|   <FORM name="SelectMenu" method="post">
+|     noscript form content goes here
+|   <table border=1>
+|    <tr><td>TABLE</td></tr>
+|     illegal table content
+|   </table>
+|   </FORM>
+| "
+|       "
+| "
+|       <center>
+|         "
+| "
+|         <input>
+|         "
+| "
+|       "
+| "
+|     "
+| "
+
+#data
+## filename: 56245_1.html
+<html>
+ <head>
+  <style>
+   font {  background-color:yellow }
+  </style>
+ </head>
+<body>
+<font color=red>italized text<x> unknown
+ <table border=1>
+  <tr>
+   <td>
+    </font>cell 1
+   </td>
+  </tr>
+ </table>
+</body>
+</html>
+
+
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|     "
+|   "
+|     <style>
+|       "
+|    font {  background-color:yellow }
+|   "
+|     "
+|  "
+|   <body>
+|     "
+| "
+|     <font>
+|       color="red"
+|       "italized text"
+|       <x>
+|         " unknown
+|  "
+|         <table>
+|           border="1"
+|           "
+|   "
+|           <tbody>
+|             <tr>
+|               "
+|    "
+|               <td>
+|                 "
+|     cell 1
+|    "
+|               "
+|   "
+|             "
+|  "
+|         "
+| "
+
+#data
+## filename: 56245_2.html
+<HTML>
+<BODY bgColor=#000099>
+<TABLE border=1>
+ <TR>
+  <TD bgcolor="red">
+   Cell-1
+  </TD>
+ </TR>
+ <TR vAlign=top>
+  <TD bgColor="blue">
+   <FORM>
+    <TABLE border=1>
+     <TR vAlign=top>
+      <TD bgcolor="green">
+       Cell-2
+      </TD>
+     </FORM>
+</BODY>
+</HTML>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|   <body>
+|     bgcolor="#000099"
+|     "
+| "
+|     <table>
+|       border="1"
+|       "
+|  "
+|       <tbody>
+|         <tr>
+|           "
+|   "
+|           <td>
+|             bgcolor="red"
+|             "
+|    Cell-1
+|   "
+|           "
+|  "
+|         "
+|  "
+|         <tr>
+|           valign="top"
+|           "
+|   "
+|           <td>
+|             bgcolor="blue"
+|             "
+|    "
+|             <form>
+|               "
+|     "
+|               <table>
+|                 border="1"
+|                 "
+|      "
+|                 <tbody>
+|                   <tr>
+|                     valign="top"
+|                     "
+|       "
+|                     <td>
+|                       bgcolor="green"
+|                       "
+|        Cell-2
+|       "
+|                     "
+|      
+| "
+
+#data
+## filename: 56245_3.html
+<html>
+ <head>
+  <style>
+   font {  background-color:yellow }
+   div  {  color:green }
+   x { background-color:blue; }
+  </style>
+ </head>
+<body>
+<font face="helvetica">
+ red<x> unknown
+ <div>div a
+ </font>
+ div b
+ </div>
+ normal text
+  
+ </table>
+</body>
+</html>
+
+
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|     "
+|   "
+|     <style>
+|       "
+|    font {  background-color:yellow }
+|    div  {  color:green }
+|    x { background-color:blue; }
+|   "
+|     "
+|  "
+|   <body>
+|     "
+| "
+|     <font>
+|       face="helvetica"
+|       "
+|  red"
+|       <x>
+|         " unknown
+|  "
+|     <div>
+|       <font>
+|         face="helvetica"
+|         "div a
+|  "
+|       "
+|  div b
+|  "
+|     "
+|  normal text
+|   
+|  
+| "
+
+#data
+## filename: 58455.html
+<html>
+<head>
+	<title>Computer Market Online</title>
+	<BASE HREF="http://www.computermarket.com.au/">\
+</head>
+<body bgcolor="#ffffff">
+<table>
+<tr><td><a href='prodDetail.asp?id=6007&catid=241'>This shows</a></td></tr>
+<tr><td><a href='prodDetail.asp?id=6007&catid=241'"bgcolor=>This does not show</a></td></tr>
+</table>
+</body>
+</html>x
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| 	"
+|     <title>
+|       "Computer Market Online"
+|     "
+| 	"
+|     <base>
+|       href="http://www.computermarket.com.au/"
+|   <body>
+|     bgcolor="#ffffff"
+|     "\
+| 
+| "
+|     <table>
+|       "
+| "
+|       <tbody>
+|         <tr>
+|           <td>
+|             <a>
+|               href="prodDetail.asp?id=6007&catid=241"
+|               "This shows"
+|         "
+| "
+|         <tr>
+|           <td>
+|             <a>
+|               bgcolor=""
+|               href="prodDetail.asp?id=6007&catid=241"
+|               "This does not show"
+|         "
+| "
+|     "
+| x"
+
+#data
+## filename: 58809.html
+<html>
+ <body>
+  &#039;A&#039<br>
+  &#039A&#039<br>
+  &#039b&#039<br>
+  &#039c&#039<br>
+  &#039d&#039<br>
+  &#039e&#039<br>
+  &#039f&#039<br>
+ </body>
+</html>
+
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|   <body>
+|     "
+|   'A'"
+|     <br>
+|     "
+|   'A'"
+|     <br>
+|     "
+|   'b'"
+|     <br>
+|     "
+|   'c'"
+|     <br>
+|     "
+|   'd'"
+|     <br>
+|     "
+|   'e'"
+|     <br>
+|     "
+|   'f'"
+|     <br>
+|     "
+|  "
+
+#data
+## filename: 6148.html
+<html>
+<head>
+<title>Bug</title>
+</head>
+<body>
+
+BUG:<BR>
+
+<SPAN style="color:blue">&lt;SPAN>
+<DIV style="color:red">&lt;DIV>
+<SPAN style="color:green">&lt;SPAN>
+&lt;/SPAN></SPAN>
+&lt;/DIV></DIV>
+&lt;/SPAN></SPAN>
+
+<HR>
+
+NO BUG:<BR>
+
+<SPAN style="color:blue">&lt;SPAN>
+<DIV style="color:red">&lt;DIV>
+<B style="color:green">&lt;B>
+&lt;/B></B>
+&lt;/DIV></DIV>
+&lt;/SPAN></SPAN>
+
+
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <title>
+|       "Bug"
+|     "
+| "
+|   <body>
+|     "
+| BUG:"
+|     <br>
+|     "
+| "
+|     <span>
+|       style="color: blue;"
+|       "<SPAN>
+| "
+|       <div>
+|         style="color: red;"
+|         "<DIV>
+| "
+|         <span>
+|           style="color: green;"
+|           "<SPAN>
+| </SPAN>"
+|         "
+| </DIV>"
+|       "
+| </SPAN>"
+|     "
+| "
+|     <hr>
+|     "
+| NO BUG:"
+|     <br>
+|     "
+| "
+|     <span>
+|       style="color: blue;"
+|       "<SPAN>
+| "
+|       <div>
+|         style="color: red;"
+|         "<DIV>
+| "
+|         <b>
+|           style="color: green;"
+|           "<B>
+| </B>"
+|         "
+| </DIV>"
+|       "
+| </SPAN>"
+|     "
+| "
+
+#data
+## filename: 65467.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+<head>
+<title>Bug: 65467</title>
+<style type="text/css">
+.one { border: solid 1px navy; padding: 4px; margin: 4px; }
+  </style>
+</head>
+<body>
+
+<pre class="one">
+<dt> The center tag's border "should" go around this text.  </dt>
+</center>
+
+</body>
+</html>
+
+
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   <head>
+|     "
+| 
+| "
+|     "
+| "
+|     <title>
+|       "Bug: 65467"
+|     "
+| "
+|     <style>
+|       type="text/css"
+|       "
+| .one { border: solid 1px navy; padding: 4px; margin: 4px; }
+|   "
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <pre>
+|       class="one"
+|       <dt>
+|         " The center tag's border "should" go around this text.  "
+|       "
+| 
+| "
+
+#data
+## filename: 67569.html
+<html>
+<body>
+ <p>
+  <table>
+   <tr>
+    <td>
+      First line
+	  </p>
+    Second line
+    </td>
+   </tr>
+  </table>
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|   <body>
+|     "
+|  "
+|     <p>
+|       "
+|   "
+|       <table>
+|         "
+|    "
+|         <tbody>
+|           <tr>
+|             "
+|     "
+|             <td>
+|               "
+|       First line
+| 	  
+|     Second line
+|     "
+|             "
+|    "
+|           "
+|   "
+|       "
+| "
+
+#data
+## filename: 67874.html
+<html><body>
+<!--> Did you know that <b>your Browser is <em>buggy</em></b>: it can't parse
+comments correctly. -->
+</body></html>
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+| "
+|     <!--  -->
+|     " Did you know that "
+|     <b>
+|       "your Browser is "
+|       <em>
+|         "buggy"
+|     ": it can't parse
+| comments correctly. -->
+| "
+
+#data
+## filename: 69576.html
+<html>
+<body bgcolor="#ffffff">
+
+Row,Col
+<table border=1>
+ <tr>
+  <td bgcolor=purple>
+   1,1
+  </td>
+  <td bgcolor=blue>
+   1,2
+   <font size="2">
+   <left>
+   <table border="2">
+    <tr>
+     <td bgcolor=green>
+      1,1,1
+     </td>
+     <td bgcolor=yellow>
+      1,1,2</font>
+     </td>
+    </tr>
+    <tr>
+     <td bgcolor=red>
+      1,2,2
+     </td>
+    </tr>
+   </table>
+  </td>
+ </tr>
+</table>
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|   <body>
+|     bgcolor="#ffffff"
+|     "
+| Row,Col
+| "
+|     <table>
+|       border="1"
+|       "
+|  "
+|       <tbody>
+|         <tr>
+|           "
+|   "
+|           <td>
+|             bgcolor="purple"
+|             "
+|    1,1
+|   "
+|           "
+|   "
+|           <td>
+|             bgcolor="blue"
+|             "
+|    1,2
+|    "
+|             <font>
+|               size="2"
+|               "
+|    "
+|               <left>
+|                 "
+|    "
+|                 <table>
+|                   border="2"
+|                   "
+|     "
+|                   <tbody>
+|                     <tr>
+|                       "
+|      "
+|                       <td>
+|                         bgcolor="green"
+|                         "
+|       1,1,1
+|      "
+|                       "
+|      "
+|                       <td>
+|                         bgcolor="yellow"
+|                         "
+|       1,1,2
+|      "
+|                       "
+|     "
+|                     "
+|     "
+|                     <tr>
+|                       "
+|      "
+|                       <td>
+|                         bgcolor="red"
+|                         "
+|       1,2,2
+|      "
+|                       "
+|     "
+|                     "
+|    "
+|                 "
+|   "
+|           "
+|  "
+|         "
+| "
+|     "
+| "
+
+#data
+## filename: 70148.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>testcase</title>
+</head>
+<body style="font-size:30pt">
+  <a href=foo?bar=baz&lang=foo&amptest1=test2>All the stuff after
+  &amp;lang got munched.
+</body>
+</html>
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   xmlns="http://www.w3.org/1999/xhtml"
+|   <head>
+|     "
+| 
+| "
+|     "
+|   "
+|     <title>
+|       "testcase"
+|     "
+| "
+|   <body>
+|     style="font-size: 30pt;"
+|     "
+|   "
+|     <a>
+|       href="foo?bar=baz&lang=foo&amptest1=test2"
+|       "All the stuff after
+|   &lang got munched.
+| "
+
+#data
+## filename: 77352.html
+<html>
+ <body>
+  <font size=+2>
+   size +2
+   <P>
+     PPPP
+   <H6>
+     H6<font size=2>blah</font>
+   </H6>
+   size +2
+ </body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|   <body>
+|     "
+|   "
+|     <font>
+|       size="+2"
+|       "
+|    size +2
+|    "
+|     <p>
+|       "
+| "
+|       <font>
+|         size="+2"
+|         "     PPPP
+|    "
+|     <h6>
+|       "
+| "
+|       <font>
+|         size="+2"
+|         _moz-rs-heading=""
+|         "     H6"
+|         <font>
+|           size="2"
+|           "blah"
+|         "
+|    "
+|     "
+| "
+|     <font>
+|       size="+2"
+|       "   size +2
+|  "
+
+#data
+## filename: 77746.html
+<html><head></head>
+<body><p><b><font color="red">bold red</font></b></p> neither bold nor red
+</body></html>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         <font>
+|           color="red"
+|           "bold red"
+|     " neither bold nor red
+| "
+
+#data
+## filename: 78444.html
+<html>
+<head>
+<base xhref="http://www.coldplay.com">
+<title>coldplay</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+
+<frameset rows="110,438*" cols="*" frameborder="NO" border="0" framespacing="0"> 
+  <frame xsrc="forum_top.htm" scrolling="NO">
+  <frame xsrc="http://coldplay.hypnosismedia.co.uk/cgi-bin/Ultimate.cgi">
+</frameset>
+<noframes><body bgcolor="#FFFFFF">
+
+</body></noframes>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <base>
+|       xhref="http://www.coldplay.com"
+|     "
+| "
+|     <title>
+|       "coldplay"
+|     "
+| "
+|     <meta>
+|       content="text/html; charset=iso-8859-1"
+|       http-equiv="Content-Type"
+|     "
+| "
+|   <frameset>
+|     framespacing="0"
+|     border="0"
+|     frameborder="NO"
+|     cols="*"
+|     rows="110,438*"
+|     " 
+|   "
+|     <frame>
+|       scrolling="NO"
+|       xsrc="forum_top.htm"
+|     "
+|   "
+|     <frame>
+|       xsrc="http://coldplay.hypnosismedia.co.uk/cgi-bin/Ultimate.cgi"
+|     "
+| "
+|   "
+| "
+|   <noframes>
+|     "<body bgcolor="#FFFFFF">
+| </body>"
+|   "
+| "
+
+#data
+## filename: 78848.html
+<html>
+<head>
+<title>Testcase that cause hangup</title>
+</head>
+
+<body>
+
+<table>
+<tr>
+<td>
+
+<table>
+<tr>
+<tr>
+<td>
+
+<table>
+<tr>
+<td>
+<font face="Arial, Verdana, Geneva, MS Sans Serif, Helvetica">
+
+<table>
+<tr>
+<td>
+
+<font face="Verdana, Arial">
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+
+<ul>
+</font>
+</ul>
+
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+
+<ul>
+</font>
+</ul>
+
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+
+<ul>
+</font>
+</ul>
+
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+
+<ul>
+</font>
+</ul>
+
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+
+<ul>
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+<a href=arlz_player.html>Ar1z Video Player</a><br>
+<a href=bs_play.html>BS Player</a> <img xsrc=new_sm.gif><br>
+<a href=cinematograph.html>Cinematograph</a> - also plays DVDs, VCDs and Quicktime<br>
+<a href=dzmovie_play.html>DzMovies Multimedia Player</a><br>
+<a href=fmv.html>FMV Player</a><br>
+<a href=gdivx_play.html>GDivX Player</a> <img xsrc=new_sm.gif><br>
+<a href=home_player.html>Home Player</a><br>
+<a href=mediabox.html>MediaBOX</a><br>
+<a href=media_station.html>Mediastation</a><br>
+<a href=microdvd.html>MicroDVD</a><br>
+<a href=mini_player.html>Mini Player</a><br>
+<a href=multiavi.html>MultiAVI Player</a><br>
+<a href=playa.html>The Playa</a> - "official" (sort-of) DivX player<br>
+<a href=powerdivx.html>PowerDivX NextGen</a><br>
+<a href=radlight_player.html>RadLight Player</a><br>
+<a href=divxmpeg4_play.html>REDZ's DivX (MPEG-4) Player</a><br>
+<a href=revelatex_player.html>Revelatex Media Player</a><br>
+<a href=ripnot.html>Ripnot DivX Player</a><br>
+<a href=sasami_player.html>Sasami Player</a><br>
+<a href=showdivx.html>ShowDivX</a><br>
+<a href=twins_player.html>Twins Video Player</a><br>
+<a href="ultradivx.html">UltraDivX</a> <img xsrc=new_sm.gif><br>
+<a href=vidamp.html>VidAmp</a> - a WinAmp movie playback plugin<br>
+<a href="vidomi.html">Vidomi</a> - can make and playback DivX movie files <img xsrc=new_sm.gif><br>
+<a href=http://www.digital-digest.com/dvd/downloads/zoom_player.html>Zoom Player</a><br><br>
+<a href=mac_divx.html>DivX for the Apple Mac</a><br>
+<a href=be_divx.html>DivX for BeOS</a><br>
+<a href=linux_divx.html>DivX for Linux</a><br><br>
+<a href=http://www.digital-digest.com/dvd/downloads/playback.html>DVD Players</a> - Many DVD players can also playback DivX movies
+</ul>
+
+
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica">
+<font face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"><u>On this site : </u>
+
+<ul>
+</font>
+</ul>
+</font>
+
+
+</td>
+</tr>
+</table>
+
+</td>
+</tr>
+</table>
+
+</td>
+</tr>
+</table>
+
+</td>
+</tr>
+</table>
+
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <title>
+|       "Testcase that cause hangup"
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <table>
+|       "
+| "
+|       <tbody>
+|         <tr>
+|           "
+| "
+|           <td>
+|             "
+| "
+|             <table>
+|               "
+| "
+|               <tbody>
+|                 <tr>
+|                   "
+| "
+|                 <tr>
+|                   "
+| "
+|                   <td>
+|                     "
+| "
+|                     <table>
+|                       "
+| "
+|                       <tbody>
+|                         <tr>
+|                           "
+| "
+|                           <td>
+|                             "
+| "
+|                             <font>
+|                               face="Arial, Verdana, Geneva, MS Sans Serif, Helvetica"
+|                               "
+| "
+|                               <table>
+|                                 "
+| "
+|                                 <tbody>
+|                                   <tr>
+|                                     "
+| "
+|                                     <td>
+|                                       "
+| "
+|                                       <font>
+|                                         face="Verdana, Arial"
+|                                         "
+| "
+|                                         <font>
+|                                           face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                           "
+| "
+|                                       <ul>
+|                                         "
+| "
+|                                         <font>
+|                                           face="Verdana, Arial"
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                           "
+| "
+|                                       "
+| "
+|                                       <font>
+|                                         face="Verdana, Arial"
+|                                         <font>
+|                                           face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                           "
+| "
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             "
+| "
+|                                       <ul>
+|                                         "
+| "
+|                                         <font>
+|                                           face="Verdana, Arial"
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             <font>
+|                                               face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             "
+| "
+|                                       "
+| "
+|                                       <font>
+|                                         face="Verdana, Arial"
+|                                         <font>
+|                                           face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             "
+| "
+|                                             <font>
+|                                               face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                               "
+| "
+|                                               <font>
+|                                                 face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                 "
+| "
+|                                       <ul>
+|                                         "
+| "
+|                                         <font>
+|                                           face="Verdana, Arial"
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             <font>
+|                                               face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                               <font>
+|                                                 face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                 <font>
+|                                                   face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                 "
+| "
+|                                       "
+| "
+|                                       <font>
+|                                         face="Verdana, Arial"
+|                                         <font>
+|                                           face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             <font>
+|                                               face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                               <font>
+|                                                 face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                 "
+| "
+|                                                 <font>
+|                                                   face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                   "
+| "
+|                                       <ul>
+|                                         "
+| "
+|                                         <font>
+|                                           face="Verdana, Arial"
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             <font>
+|                                               face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                               <font>
+|                                                 face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                 <font>
+|                                                   face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                   <font>
+|                                                     face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                   "
+| "
+|                                       "
+| "
+|                                       <font>
+|                                         face="Verdana, Arial"
+|                                         <font>
+|                                           face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             <font>
+|                                               face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                               <font>
+|                                                 face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                 <font>
+|                                                   face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                   "
+| "
+|                                       <ul>
+|                                         "
+| "
+|                                         <font>
+|                                           face="Verdana, Arial"
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             <font>
+|                                               face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                               <font>
+|                                                 face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                 <font>
+|                                                   face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                   <font>
+|                                                     face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                     <font>
+|                                                       face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="arlz_player.html"
+|                                                         "Ar1z Video Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="bs_play.html"
+|                                                         "BS Player"
+|                                                       " "
+|                                                       <img>
+|                                                         xsrc="new_sm.gif"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="cinematograph.html"
+|                                                         "Cinematograph"
+|                                                       " - also plays DVDs, VCDs and Quicktime"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="dzmovie_play.html"
+|                                                         "DzMovies Multimedia Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="fmv.html"
+|                                                         "FMV Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="gdivx_play.html"
+|                                                         "GDivX Player"
+|                                                       " "
+|                                                       <img>
+|                                                         xsrc="new_sm.gif"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="home_player.html"
+|                                                         "Home Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="mediabox.html"
+|                                                         "MediaBOX"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="media_station.html"
+|                                                         "Mediastation"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="microdvd.html"
+|                                                         "MicroDVD"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="mini_player.html"
+|                                                         "Mini Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="multiavi.html"
+|                                                         "MultiAVI Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="playa.html"
+|                                                         "The Playa"
+|                                                       " - "official" (sort-of) DivX player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="powerdivx.html"
+|                                                         "PowerDivX NextGen"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="radlight_player.html"
+|                                                         "RadLight Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="divxmpeg4_play.html"
+|                                                         "REDZ's DivX (MPEG-4) Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="revelatex_player.html"
+|                                                         "Revelatex Media Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="ripnot.html"
+|                                                         "Ripnot DivX Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="sasami_player.html"
+|                                                         "Sasami Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="showdivx.html"
+|                                                         "ShowDivX"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="twins_player.html"
+|                                                         "Twins Video Player"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="ultradivx.html"
+|                                                         "UltraDivX"
+|                                                       " "
+|                                                       <img>
+|                                                         xsrc="new_sm.gif"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="vidamp.html"
+|                                                         "VidAmp"
+|                                                       " - a WinAmp movie playback plugin"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="vidomi.html"
+|                                                         "Vidomi"
+|                                                       " - can make and playback DivX movie files "
+|                                                       <img>
+|                                                         xsrc="new_sm.gif"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="http://www.digital-digest.com/dvd/downloads/zoom_player.html"
+|                                                         "Zoom Player"
+|                                                       <br>
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="mac_divx.html"
+|                                                         "DivX for the Apple Mac"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="be_divx.html"
+|                                                         "DivX for BeOS"
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="linux_divx.html"
+|                                                         "DivX for Linux"
+|                                                       <br>
+|                                                       <br>
+|                                                       "
+| "
+|                                                       <a>
+|                                                         href="http://www.digital-digest.com/dvd/downloads/playback.html"
+|                                                         "DVD Players"
+|                                                       " - Many DVD players can also playback DivX movies
+| "
+|                                       "
+| "
+|                                       <font>
+|                                         face="Verdana, Arial"
+|                                         <font>
+|                                           face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                           <font>
+|                                             face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                             <font>
+|                                               face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                               <font>
+|                                                 face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                 <font>
+|                                                   face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                   <font>
+|                                                     face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                     <font>
+|                                                       face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                       "
+| "
+|                                                       <font>
+|                                                         face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                         <u>
+|                                                           "On this site : "
+|                                                         "
+| "
+|                                                       <ul>
+|                                                         "
+| "
+|                                                         <font>
+|                                                           face="Verdana, Arial, Geneva, MS Sans Serif, Helvetica"
+|                                                         "
+| "
+|                                                       "
+| "
+|                                                     "
+| "
+|                                     "
+| "
+|                                   "
+| "
+|                               "
+| "
+|                           "
+| "
+|                         "
+| "
+|                     "
+| "
+|                   "
+| "
+|                 "
+| "
+|             "
+| "
+|           "
+| "
+|         "
+| "
+|     "
+| "
+
+#data
+## filename: 79492.html
+<html><head>
+<title>PG&E &E: &e. &e; &&e &&e;</title>
+<!-- will render as 'PG . & & -->
+</head><body>
+<p>Title should look like this:</p>
+<p>PG&E &E: &e. &e; &&e &&e;</p>
+<!-- will render as 'PG&E &E: &e. &e; &&e &&e;' -->
+</body>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     <title>
+|       "PG&E &E: &e. &e; &&e &&e;"
+|     "
+| "
+|     <!--  will render as 'PG . & &  -->
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <p>
+|       "Title should look like this:"
+|     "
+| "
+|     <p>
+|       "PG&E &E: &e. &e; &&e &&e;"
+|     "
+| "
+|     <!--  will render as 'PG&E &E: &e. &e; &&e &&e;'  -->
+|     "
+| "
+
+#data
+## filename: 84000.html
+<html>
+<head>
+<title>IMG without attribute</title>
+</head>
+<frameset>
+<frame name="TESTTHIS">
+<frame name="SCODA">
+<noframes>
+<img xsrc="mozilla.gif">
+</noframes>
+</frameset>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <title>
+|       "IMG without attribute"
+|     "
+| "
+|   <frameset>
+|     "
+| "
+|     <frame>
+|       name="TESTTHIS"
+|     "
+| "
+|     <frame>
+|       name="SCODA"
+|     "
+| "
+|     <noframes>
+|       "
+| <img xsrc="mozilla.gif">
+| "
+|     "
+| "
+|   "
+| "
+
+#data
+## filename: 84491.html
+<html>
+ <body>
+  <a href="foo.html">
+   <iframe>
+    <a href="bar.html">
+   </iframe>foo
+  </a>
+ </body>
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|   <body>
+|     "
+|   "
+|     <a>
+|       href="foo.html"
+|       "
+|    "
+|       <iframe>
+|         "
+|     <a href="bar.html">
+|    "
+|       "foo
+|   "
+|     "
+|  "
+
+#data
+## filename: 88746.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html><head><title>Debian Planet</title>
+<meta http-equiv=Content-Type content="text/html; charset=">
+<meta content="Debian Planet" name=AUTHOR>
+<meta content="Copyright (c) 2001 by Debian Planet" name=COPYRIGHT>
+<meta content="Serving FREE beer to the users of the FREE Linux of a FREE world" 
+name=DESCRIPTION>
+<meta content="MSHTML 5.50.4611.1300" name=GENERATOR>
+
+<script language=javascript xsrc="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=41009"></script>
+</head>
+<body>
+<script language=javascript>foo();</script>
+</body>
+</html>
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   <head>
+|     "
+| "
+|     <title>
+|       "Debian Planet"
+|     "
+| "
+|     <meta>
+|       content="text/html; charset="
+|       http-equiv="Content-Type"
+|     "
+| "
+|     <meta>
+|       name="AUTHOR"
+|       content="Debian Planet"
+|     "
+| "
+|     <meta>
+|       name="COPYRIGHT"
+|       content="Copyright (c) 2001 by Debian Planet"
+|     "
+| "
+|     <meta>
+|       name="DESCRIPTION"
+|       content="Serving FREE beer to the users of the FREE Linux of a FREE world"
+|     "
+| "
+|     <meta>
+|       name="GENERATOR"
+|       content="MSHTML 5.50.4611.1300"
+|     "
+| "
+|     <script>
+|       xsrc="http://bugzilla.mozilla.org/showattachment.cgi?attach_id=41009"
+|       language="javascript"
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <script>
+|       language="javascript"
+|       "foo();"
+|     "
+| "
+
+#data
+## filename: 88992.html
+<!DOCTYPE>
+<HTML>
+ <BODY bgcolor=pink>
+<table>&dash;
+ <tr><!-- &dash; --><harish></harish>
+   <td> &amp;
+    <div>div<p><xmp>p<I>I</div></I></xmp>
+   </td>
+  </tr>
+ </table>
+ 
+  <object><i>italic</object>
+  This text doesn't show up.!
+
+ </BODY></HTML>
+#document
+| <html>
+|   <head>
+|     "
+| 
+|  "
+|   <body>
+|     bgcolor="pink"
+|     "
+| "
+|     "&dash;
+|  "
+|     <harish>
+|     "
+|    "
+|     <table>
+|       <tbody>
+|         <tr>
+|           <!--  &dash;  -->
+|           <td>
+|             " &
+|     "
+|             <div>
+|               "div"
+|               <p>
+|                 <xmp>
+|                   "p<I>I</div></I>"
+|                 "
+|    "
+|           "
+|   "
+|         "
+|  "
+|     "
+|  
+|   "
+|     <object>
+|       <i>
+|         "italic"
+|     "
+|   This text doesn't show up.!
+|  "
+
+
+#data
+## filename: 91051.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+This should be visible.
+<p>
+This is a new paragraph.
+
+
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   <head>
+|     "
+| "
+|   <body>
+|     "This should be visible.
+| "
+|     <p>
+|       "
+| This is a new paragraph."
+
+#data
+## filename: 92530.html
+<!-- Tag Soup -->
+<html>
+ <head>
+  <title> Bugscape Bug 5040 </title>
+  <style type="text/css">
+   :table-cell { border: red dotted 10px; }
+  </style>
+ </head>
+ <body>
+  <table>
+   <tr>
+    <td bgcolor=pink>
+     <form>
+      <table border=1>
+       <tr>
+        <td bgcolor=blue>  
+         <table>
+          <span> CONTENT PROMOTED ABOVE INNER TABLE </span>
+          <tr> 
+           <td bgcolor=green> ROW 1 CELL 1 </td>
+          </tr>
+         </table>
+        </td>
+       </tr>
+       <tr> 
+        <td> ROW 2 CELL 1 </td>
+       </tr>
+      </table>
+     </form>
+    </td>
+   </tr>
+  </table>
+ </body>
+</html>
+#document
+| <html>
+|   <head>
+|     <!--  Tag Soup  -->
+|     "
+| 
+|  "
+|     "
+|   "
+|     <title>
+|       " Bugscape Bug 5040 "
+|     "
+|   "
+|     <style>
+|       type="text/css"
+|       "
+|    :table-cell { border: red dotted 10px; }
+|   "
+|     "
+|  "
+|   <body>
+|     "
+|   "
+|     <table>
+|       "
+|    "
+|       <tbody>
+|         <tr>
+|           "
+|     "
+|           <td>
+|             bgcolor="pink"
+|             "
+|      "
+|             <form>
+|               "
+|       "
+|               <table>
+|                 border="1"
+|                 "
+|        "
+|                 <tbody>
+|                   <tr>
+|                     "
+|         "
+|                     <td>
+|                       bgcolor="blue"
+|                       "  
+|          "
+|                       <span>
+|                         " CONTENT PROMOTED ABOVE INNER TABLE "
+|                       "
+|           "
+|                       <table>
+|                         "
+|           "
+|                         <tbody>
+|                           <tr>
+|                             " 
+|            "
+|                             <td>
+|                               bgcolor="green"
+|                               " ROW 1 CELL 1 "
+|                             "
+|           "
+|                           "
+|          "
+|                       "
+|         "
+|                     "
+|        "
+|                   "
+|        "
+|                   <tr>
+|                     " 
+|         "
+|                     <td>
+|                       " ROW 2 CELL 1 "
+|                     "
+|        "
+|                   "
+|       "
+|               "
+|      "
+|             "
+|     "
+|           "
+|    "
+|         "
+|   "
+|     "
+|  "
+
+#data
+## filename: 93365.html
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+ <head>
+  <style>
+    font {
+	  font-size: 20pt;
+	  color: yellow;
+	  background-color: red;
+	}
+  </style>
+ </head>
+ <body>
+<font face="courier">
+
+this text is above a table.
+
+<TABLE border=1><TR><TD>
+this text is inside a table.
+</td></tr></table>
+
+this text is below a table.
+
+</body>
+</html>
+#document
+| <!DOCTYPE HTML>
+| <html>
+|   <head>
+|     "
+| 
+|  "
+|     "
+|   "
+|     <style>
+|       "
+|     font {
+| 	  font-size: 20pt;
+| 	  color: yellow;
+| 	  background-color: red;
+| 	}
+|   "
+|     "
+|  "
+|   <body>
+|     "
+| "
+|     <font>
+|       face="courier"
+|       "
+| this text is above a table.
+| "
+|       <table>
+|         border="1"
+|         <tbody>
+|           <tr>
+|             <td>
+|               "
+| this text is inside a table.
+| "
+|       "
+| this text is below a table.
+| "
+
+#data
+## filename: 94208.html
+<HTML>
+ <BODY>
+  <FONT color=blue> 
+   <B>blue bold,<I>blue bold italic,
+  </FONT>not blue but bold and italic,
+  <FONT COLOR="red">red bold and italic,
+  </B>red and italic but not bold,</I>red not bold not italic</FONT>
+</BODY>
+</HTML>
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|   <body>
+|     "
+|   "
+|     <font>
+|       color="blue"
+|       " 
+|    "
+|       <b>
+|         "blue bold,"
+|         <i>
+|           "blue bold italic,
+|   "
+|     <b>
+|       <i>
+|         "not blue but bold and italic,
+|   "
+|         <font>
+|           color="red"
+|           "red bold and italic,
+|   "
+|     <i>
+|       <font>
+|         color="red"
+|         "red and italic but not bold,"
+|     <font>
+|       color="red"
+|       "red not bold not italic"
+|     "
+| "
+
+#data
+## filename: 96130.html
+<HTML>
+ <style>
+  Z { color:red; }
+ </style>
+<BODY>
+<FONT><X>
+  <TABLE border="2">
+    <Z>Should be above the Table</FONT>
+    <TR>
+     <TD>
+       Cell
+	 </TD>
+    </TR>
+   </TABLE>
+</BODY></HTML>
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|     <style>
+|       "
+|   Z { color:red; }
+|  "
+|     "
+| "
+|   <body>
+|     "
+| "
+|     <font>
+|       <x>
+|         "
+|   "
+|         <z>
+|           "Should be above the Table
+|     "
+|         <table>
+|           border="2"
+|           "
+|     "
+|           <tbody>
+|             <tr>
+|               "
+|      "
+|               <td>
+|                 "
+|        Cell
+| 	 "
+|               "
+|     "
+|             "
+|    "
+|         "
+| "
+
+#data
+## filename: Bug1203.html
+<HTML>
+  <HEAD>
+	  <TITLE>How To Give Good Feedback</TITLE>
+  </HEAD>
+  <BODY bgcolor="EEEEEE"><CENTER>
+  Peters test<BR>
+  <FONT SIZE="+1">Peters test</FONT><BR>
+
+  <TABLE WIDTH="628">
+    <TR>
+      <TD BGCOLOR="FFFFFF">
+        <FONT FACE="geneva,arial" >
+          <FONT FACE='arial,helvetica'>
+            <FONT SIZE='5'>
+              <B><FONT COLOR ='770000'>How To Give Good Feedback</FONT></B>
+            </FONT>
+          </FONT>
+          <BR>
+          <P><FONT SIZE=1>first appeared: Fast Company issue 17 page 144</FONT></P>
+          <P>
+          <FONT SIZE="+1">Improving Performance Reviews</FONT><BR>
+          <HR SIZE=1>
+          So you think you've had it with performance reviews? 
+          A few years ago, Chris Oster's unit at General Motors got so fed up with traditional reviews that it abolished them. 
+      </td>
+    </TR>
+  </TABLE>
+  </BODY>
+</HTML>
+#document
+| <html>
+|   <head>
+|     "
+|   "
+|     "
+| 	  "
+|     <title>
+|       "How To Give Good Feedback"
+|     "
+|   "
+|   <body>
+|     bgcolor="#eeeeee"
+|     <center>
+|       "
+|   Peters test"
+|       <br>
+|       "
+|   "
+|       <font>
+|         size="+1"
+|         "Peters test"
+|       <br>
+|       "
+|   "
+|       <table>
+|         width="628"
+|         "
+|     "
+|         <tbody>
+|           <tr>
+|             "
+|       "
+|             <td>
+|               bgcolor="#ffffff"
+|               "
+|         "
+|               <font>
+|                 face="geneva,arial"
+|                 "
+|           "
+|                 <font>
+|                   face="arial,helvetica"
+|                   "
+|             "
+|                   <font>
+|                     size="5"
+|                     "
+|               "
+|                     <b>
+|                       <font>
+|                         color="#770000"
+|                         "How To Give Good Feedback"
+|                     "
+|             "
+|                   "
+|           "
+|                 "
+|           "
+|                 <br>
+|                 "
+|           "
+|               <p>
+|                 <font>
+|                   face="geneva,arial"
+|                   <font>
+|                     size="1"
+|                     "first appeared: Fast Company issue 17 page 144"
+|               "
+| "
+|               <font>
+|                 face="geneva,arial"
+|                 "          "
+|               <p>
+|                 "
+| "
+|                 <font>
+|                   face="geneva,arial"
+|                   "          "
+|                   <font>
+|                     size="+1"
+|                     "Improving Performance Reviews"
+|                   <br>
+|                   "
+|           "
+|               <hr>
+|                 size="1"
+|               "
+| "
+|               <font>
+|                 face="geneva,arial"
+|                 "          So you think you've had it with performance reviews? 
+|           A few years ago, Chris Oster's unit at General Motors got so fed up with traditional reviews that it abolished them. 
+|       "
+|             "
+|     "
+|           "
+|   "
+|       "
+|   "
+
+#data
+## filename: Bug1220.html
+<HTML>
+  <HEAD>
+    <SCRIPT LANGUAGE='JavaScript'>
+
+      <!--
+      theagent=navigator.userAgent; 
+      pointsize=""; 
+      if (theagent.indexOf('PPC') != -1 || theagent.indexOf('68K') != -1 || theagent.indexOf('SunOS') != -1 || theagent.indexOf('IRIX') != -1 || theagent.indexOf('HP-UX') != -1 || theagent.indexOf('AIX') != -1 || theagent.indexOf('Linux') != -1) {
+      pointsize="POINT-SIZE=\"12\""; 
+      } 
+      //-->
+
+    </SCRIPT>
+  </HEAD>
+  <BODY>
+    <TABLE CELLPADDING=0>
+      <TR>
+        <TD>
+          <IMG>
+        </TD>
+      </TR>
+
+      <SCRIPT LANGUAGE=javascript>
+      <!--
+              function handleTrigger() { }
+      //-->
+      </SCRIPT>
+      <TR>
+        <TD>xxx</TD>
+      </TR>
+    </TABLE>
+  </BODY>
+</HTML>
+#document
+| <html>
+|   <head>
+|     "
+|   "
+|     "
+|     "
+|     <script>
+|       language="JavaScript"
+|       "
+|       <!--
+|       theagent=navigator.userAgent; 
+|       pointsize=""; 
+|       if (theagent.indexOf('PPC') != -1 || theagent.indexOf('68K') != -1 || theagent.indexOf('SunOS') != -1 || theagent.indexOf('IRIX') != -1 || theagent.indexOf('HP-UX') != -1 || theagent.indexOf('AIX') != -1 || theagent.indexOf('Linux') != -1) {
+|       pointsize="POINT-SIZE=\"12\""; 
+|       } 
+|       //-->
+|     "
+|     "
+|   "
+|   <body>
+|     "
+|     "
+|     <table>
+|       cellpadding="0"
+|       "
+|       "
+|       <tbody>
+|         <tr>
+|           "
+|         "
+|           <td>
+|             "
+|           "
+|             <img>
+|             "
+|         "
+|           "
+|       "
+|         "
+|       "
+|         <script>
+|           language="javascript"
+|           "
+|       <!--
+|               function handleTrigger() { }
+|       //-->
+|       "
+|         "
+|       "
+|         <tr>
+|           "
+|         "
+|           <td>
+|             "xxx"
+|           "
+|       "
+|         "
+|     "
+|     "
+|   "
+
+#data
+## filename: Bug1239.html
+<HTML>
+
+
+<title>bug1239</title>
+<span style="background-color:yellow"><a href="bug1259.html">Next...</a></span><br><br>
+
+
+<CENTER>
+  </FONT>
+  <FONT face=arial,helvetica>
+    Centered arial size=1 [BREAK]
+  </CENTER>
+</FONT>
+</FONT>
+            
+<FONT face=arial,helvetica>
+  <B>
+    <FONT size=2>Bold Arial font size=2</B>
+  </FONT> 
+  <P>
+    <FONT color=maroon>Maroon Arial font size=1</FONT>
+    <BR>
+    <FONT size=2>
+      <B>Bold Arial font size=2</B>
+    </FONT> 
+    [ Arial font size=1 ] 
+    <BR clear=all>
+    <FONT size=-2>
+      <CENTER>Centered Arial size=1
+  <P>
+    <CENTER>Centered Arial size=1
+  <P>
+    <FONT size=-1>
+      <B>Bold Arial size=2
+        <BR>
+      </FONT>
+    </B>
+    Centered Arial size=1
+  </P>
+</CENTER>
+</CENTER>
+</FONT>
+</FONT>
+</BODY></HTML>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     <title>
+|       "bug1239"
+|     "
+| "
+|   <body>
+|     <span>
+|       style="background-color: yellow;"
+|       <a>
+|         href="bug1259.html"
+|         "Next..."
+|     <br>
+|     <br>
+|     "
+| "
+|     <center>
+|       "
+|   
+|   "
+|       <font>
+|         face="arial,helvetica"
+|         "
+|     Centered arial size=1 [BREAK]
+|   "
+|     "
+| "
+|     <font>
+|       face="arial,helvetica"
+|     "
+| 
+|             
+| "
+|     <font>
+|       face="arial,helvetica"
+|       "
+|   "
+|       <b>
+|         "
+|     "
+|         <font>
+|           size="2"
+|           "Bold Arial font size=2"
+|       "
+| "
+|       <font>
+|         size="2"
+|         "  "
+|       " 
+|   "
+|     <p>
+|       "
+| "
+|       <font>
+|         face="arial,helvetica"
+|         "    "
+|         <font>
+|           color="maroon"
+|           "Maroon Arial font size=1"
+|         "
+|     "
+|         <br>
+|         "
+|     "
+|         <font>
+|           size="2"
+|           "
+|       "
+|           <b>
+|             "Bold Arial font size=2"
+|           "
+|     "
+|         " 
+|     [ Arial font size=1 ] 
+|     "
+|         <br>
+|           clear="all"
+|         "
+|     "
+|         <font>
+|           size="-2"
+|           "
+|       "
+|     <center>
+|       <font>
+|         face="arial,helvetica"
+|         <font>
+|           size="-2"
+|           "Centered Arial size=1
+|   "
+|       <p>
+|         "
+| "
+|         <font>
+|           face="arial,helvetica"
+|           <font>
+|             size="-2"
+|             "    "
+|       <center>
+|         <font>
+|           face="arial,helvetica"
+|           <font>
+|             size="-2"
+|             "Centered Arial size=1
+|   "
+|         <p>
+|           "
+| "
+|           <font>
+|             face="arial,helvetica"
+|             <font>
+|               size="-2"
+|               "    "
+|               <font>
+|                 size="-1"
+|                 "
+|       "
+|                 <b>
+|                   "Bold Arial size=2
+|         "
+|                   <br>
+|                   "
+|       "
+|               "
+| "
+|               <b>
+|                 "    "
+|               "
+|     Centered Arial size=1
+|   "
+|         "
+| "
+|       "
+| "
+|     "
+| "
+|     <font>
+|       face="arial,helvetica"
+|       <font>
+|         size="-2"
+|       "
+| "
+|     "
+| "
+
+#data
+## filename: Entity.html
+<html> 
+ <head>
+  <META http-equiv="Content-Type" content="text/html; charset=utf-8">
+  <TITLE>Welcome to MSN.com</TITLE>
+ </head>
+ <body>
+  <a href="http://ads.msn.com/ads/adredir.asp?url=http://www.fidelity.com&image=http://ads.msn.com/ads/MSNBTA/FI610001_TR.gif">
+  fidelity
+ </body> 
+</html>
+#document
+| <html>
+|   <head>
+|     " 
+|  "
+|     "
+|   "
+|     <meta>
+|       content="text/html; charset=utf-8"
+|       http-equiv="Content-Type"
+|     "
+|   "
+|     <title>
+|       "Welcome to MSN.com"
+|     "
+|  "
+|   <body>
+|     "
+|   "
+|     <a>
+|       href="http://ads.msn.com/ads/adredir.asp?url=http://www.fidelity.com&image=http://ads.msn.com/ads/MSNBTA/FI610001_TR.gif"
+|       "
+|   fidelity
+|  "
+
+#data
+## filename: Table01.html
+first text
+<table border>
+  <tr>
+	  <td>This is the first cell in the table
+    <td>This is the second cell in the table
+  <tr>
+    <td>This is the third cell in the table
+    <td>This is the fourth cell in the table
+</table>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "first text
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <tbody>
+|         <tr>
+|           "
+| 	  "
+|           <td>
+|             "This is the first cell in the table
+|     "
+|           <td>
+|             "This is the second cell in the table
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "This is the third cell in the table
+|     "
+|           <td>
+|             "This is the fourth cell in the table
+| "
+|     "
+| last text"
+
+#data
+## filename: Table02.html
+nested table, good syntax.
+<table border>
+  <tr>
+	  <td>This is the first cell in the table
+    <td>This is the second cell in the table
+     <TABLE BORDER>
+       <TR>
+         <TD>inner cell
+     </TABLE>
+  <tr>
+    <td>This is the third cell in the table
+    <td>This is the fourth cell in the table
+</table>
+
+#document
+| <html>
+|   <head>
+|   <body>
+|     "nested table, good syntax.
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <tbody>
+|         <tr>
+|           "
+| 	  "
+|           <td>
+|             "This is the first cell in the table
+|     "
+|           <td>
+|             "This is the second cell in the table
+|      "
+|             <table>
+|               border="1"
+|               "
+|        "
+|               <tbody>
+|                 <tr>
+|                   "
+|          "
+|                   <td>
+|                     "inner cell
+|      "
+|             "
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "This is the third cell in the table
+|     "
+|           <td>
+|             "This is the fourth cell in the table
+| "
+
+#data
+## filename: Table03.html
+first text
+<table align=left>
+  <tr>
+	  <td>This is the first cell in the table
+    <td>This is the second cell in the table
+  <tr>
+    <td>This is the third cell in the table
+    <td>This is the fourth cell in the table
+</table>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "first text
+| "
+|     <table>
+|       align="left"
+|       "
+|   "
+|       <tbody>
+|         <tr>
+|           "
+| 	  "
+|           <td>
+|             "This is the first cell in the table
+|     "
+|           <td>
+|             "This is the second cell in the table
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "This is the third cell in the table
+|     "
+|           <td>
+|             "This is the fourth cell in the table
+| "
+|     "
+| last text"
+
+#data
+## filename: Table04.html
+first text
+<ul>
+<li>
+list line 1
+
+<li>
+list line 2
+<table border >
+  <tr>
+	  <td>This is the first cell in the table
+        <p> paragraph in cell.
+    <td>This is the second cell in the table
+        <ul>
+        <li> list item1 in cell
+        <li> list item2 in cell
+        <ul>
+  <tr>
+    <td>This is the third cell in the table
+    <td>This is the fourth cell in the table
+</table>
+
+<li>
+list line 3
+<p>paragraph in list line 3.
+</ul>
+
+table aligned:
+<ul>
+<li>
+list line 1
+
+<li>
+list line 2
+<table border>
+  <tr>
+	  <td>This is the first cell in the table
+        <p> paragraph in cell.
+    <td>This is the second cell in the table
+        <ul>
+        <li> list item1 in cell
+        <li> list item2 in cell
+        <ul>
+  <tr>
+    <td>This is the third cell in the table
+    <td>This is the fourth cell in the table
+</table>
+
+<li>
+list line 3
+<p>paragraph in list line 3.
+</ul>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "first text
+| "
+|     <ul>
+|       "
+| "
+|       <li>
+|         "
+| list line 1
+| "
+|       <li>
+|         "
+| list line 2
+| "
+|         <table>
+|           border="1"
+|           "
+|   "
+|           <tbody>
+|             <tr>
+|               "
+| 	  "
+|               <td>
+|                 "This is the first cell in the table
+|         "
+|                 <p>
+|                   " paragraph in cell.
+|     "
+|               <td>
+|                 "This is the second cell in the table
+|         "
+|                 <ul>
+|                   "
+|         "
+|                   <li>
+|                     " list item1 in cell
+|         "
+|                   <li>
+|                     " list item2 in cell
+|         "
+|                     <ul>
+|                       "
+|   "
+|             <tr>
+|               "
+|     "
+|               <td>
+|                 "This is the third cell in the table
+|     "
+|               <td>
+|                 "This is the fourth cell in the table
+| "
+|         "
+| "
+|       <li>
+|         "
+| list line 3
+| "
+|         <p>
+|           "paragraph in list line 3.
+| "
+|     "
+| table aligned:
+| "
+|     <ul>
+|       "
+| "
+|       <li>
+|         "
+| list line 1
+| "
+|       <li>
+|         "
+| list line 2
+| "
+|         <table>
+|           border="1"
+|           "
+|   "
+|           <tbody>
+|             <tr>
+|               "
+| 	  "
+|               <td>
+|                 "This is the first cell in the table
+|         "
+|                 <p>
+|                   " paragraph in cell.
+|     "
+|               <td>
+|                 "This is the second cell in the table
+|         "
+|                 <ul>
+|                   "
+|         "
+|                   <li>
+|                     " list item1 in cell
+|         "
+|                   <li>
+|                     " list item2 in cell
+|         "
+|                     <ul>
+|                       "
+|   "
+|             <tr>
+|               "
+|     "
+|               <td>
+|                 "This is the third cell in the table
+|     "
+|               <td>
+|                 "This is the fourth cell in the table
+| "
+|         "
+| "
+|       <li>
+|         "
+| list line 3
+| "
+|         <p>
+|           "paragraph in list line 3.
+| "
+|     "
+| last text"
+
+#data
+## filename: Table05.html
+The only syntax for Caption is after table start tag.
+<table border>
+  <caption>caption1</caption>
+  <tr>
+    <td>cell 1-1
+    <td>cell 1-2
+  <tr>
+    <td>cell 2-1
+    <td>cell 2-2
+</table>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "The only syntax for Caption is after table start tag.
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <caption>
+|         "caption1"
+|       "
+|   "
+|       <tbody>
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 1-1
+|     "
+|           <td>
+|             "cell 1-2
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 2-1
+|     "
+|           <td>
+|             "cell 2-2
+| "
+|     "
+| last text"
+
+#data
+## filename: Table05e.html
+Multiple caption elements, all outside td cells.
+<br>Nav 4.0: the first caption is accepted, 
+Others are treated as text, and moved before the table.
+<br>Xena6.0: ignore misplaced caption tag. contents treated as text.
+<table border>
+  TextAA
+  <caption>caption1</caption>TextA
+  <caption>caption2</caption>TextB
+  <tr>
+  <caption>caption3</caption>TextC
+    <td>cell 1-1</td>
+  <caption>caption4</caption>TextD
+    <td>cell 1-2
+  <tr>
+  <caption>caption5</caption>TextE
+    <td>cell 2-1
+    <td>cell 2-2</td>
+  <caption>caption6</caption>TextF
+</table>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Multiple caption elements, all outside td cells.
+| "
+|     <br>
+|     "Nav 4.0: the first caption is accepted, 
+| Others are treated as text, and moved before the table.
+| "
+|     <br>
+|     "Xena6.0: ignore misplaced caption tag. contents treated as text.
+| "
+|     "TextAA
+|   "
+|     "TextA
+|   "
+|     "TextB
+|   "
+|     "TextC
+|     "
+|     "TextD
+|     "
+|     "TextE
+|     "
+|     "TextF
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <caption>
+|         "caption1"
+|       <caption>
+|         "caption2"
+|       <tbody>
+|         <tr>
+|           "
+|   "
+|       <caption>
+|         "caption3"
+|       <tbody>
+|         <tr>
+|           <td>
+|             "cell 1-1"
+|           "
+|   "
+|       <caption>
+|         "caption4"
+|       <tbody>
+|         <tr>
+|           <td>
+|             "cell 1-2
+|   "
+|         <tr>
+|           "
+|   "
+|       <caption>
+|         "caption5"
+|       <tbody>
+|         <tr>
+|           <td>
+|             "cell 2-1
+|     "
+|           <td>
+|             "cell 2-2"
+|           "
+|   "
+|       <caption>
+|         "caption6"
+|     "
+| last text"
+
+#data
+## filename: Table05f.html
+Multiple Captions inside cells, 
+<br>Nav. 4.0: last one takes effect, and close td tr.
+    previous captions are totally ignored.	
+    If there were no caption3, caption2 would take effect.
+<br>Xena 6.0: Ignore misplaced caption tag, contents treated as text.
+<table border>
+  <caption>caption1</caption>
+  <tr>
+    <td>cell 1-1  <caption>caption2</caption>TextA
+    <td>cell 1-2
+  <tr>
+    <td>cell 2-1
+    <td>cell 2-2  <caption>caption3</caption>TextB
+</table>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Multiple Captions inside cells, 
+| "
+|     <br>
+|     "Nav. 4.0: last one takes effect, and close td tr.
+|     previous captions are totally ignored.	
+|     If there were no caption3, caption2 would take effect.
+| "
+|     <br>
+|     "Xena 6.0: Ignore misplaced caption tag, contents treated as text.
+| "
+|     "TextA
+|     "
+|     "TextB
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <caption>
+|         "caption1"
+|       "
+|   "
+|       <tbody>
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 1-1  "
+|       <caption>
+|         "caption2"
+|       <tbody>
+|         <tr>
+|           <td>
+|             "cell 1-2
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 2-1
+|     "
+|           <td>
+|             "cell 2-2  "
+|       <caption>
+|         "caption3"
+|     "
+| last text"
+
+#data
+## filename: Table05g.html
+Captions outside of table are treated as text.
+<caption>caption1</caption>
+<table border>
+  <tr>
+    <td>cell 1-1
+    <td>cell 1-2
+  <tr>
+    <td>cell 2-1
+    <td>cell 2-2
+</table>
+
+<caption>caption2</caption>
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Captions outside of table are treated as text.
+| caption1
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <tbody>
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 1-1
+|     "
+|           <td>
+|             "cell 1-2
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 2-1
+|     "
+|           <td>
+|             "cell 2-2
+| "
+|     "
+| caption2
+| last text"
+
+#data
+## filename: Table05h.html
+tr terminates caption
+<table border>
+  <caption>caption1
+  <tr>
+    <td>cell 1-1
+    <td>cell 1-2
+  <tr>
+    <td>cell 2-1
+    <td>cell 2-2
+</table>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "tr terminates caption
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <caption>
+|         "caption1
+|   "
+|       <tbody>
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 1-1
+|     "
+|           <td>
+|             "cell 1-2
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 2-1
+|     "
+|           <td>
+|             "cell 2-2
+| "
+|     "
+| last text"
+
+#data
+## filename: Table05i.html
+tr terminates Caption, and close open(font)tags in caption. 
+<br>also terminates those tags. In this case, the Font tag.
+<table border>
+  <caption>caption1 <br> text1 <font size=6> text2
+  <tr>
+    <td>cell 1-1
+    <td>cell 1-2
+  <tr>
+    <td>cell 2-1
+    <td>cell 2-2
+</table>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "tr terminates Caption, and close open(font)tags in caption. 
+| "
+|     <br>
+|     "also terminates those tags. In this case, the Font tag.
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <caption>
+|         "caption1 "
+|         <br>
+|         " text1 "
+|         <font>
+|           size="6"
+|           " text2
+|   "
+|       <tbody>
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 1-1
+|     "
+|           <td>
+|             "cell 1-2
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 2-1
+|     "
+|           <td>
+|             "cell 2-2
+| "
+|     "
+| last text"
+
+#data
+## filename: Table05j.html
+TD does NOT terminate Caption. TD's contents are used in caption.
+<table border>
+  <caption>caption1 <br> text1 <font size=6> text2
+    <td>cell 1-1
+    <td>cell 1-2
+  <tr>
+    <td>cell 2-1
+    <td>cell 2-2 no br in caption.
+</table>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "TD does NOT terminate Caption. TD's contents are used in caption.
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <caption>
+|         "caption1 "
+|         <br>
+|         " text1 "
+|         <font>
+|           size="6"
+|           " text2
+|     "
+|       <tbody>
+|         <tr>
+|           <td>
+|             "cell 1-1
+|     "
+|           <td>
+|             "cell 1-2
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "cell 2-1
+|     "
+|           <td>
+|             "cell 2-2 no br in caption.
+| "
+|     "
+| last text"
+
+#data
+## filename: Table06.html
+extra end table tag is ignored.
+<table border>
+  <tr>
+	  <td>This is the first cell in the table
+    <td>This is the second cell in the table
+  <tr>
+    <td>This is the third cell in the table
+    <td>This is the fourth cell in the table
+</table>
+
+</table>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "extra end table tag is ignored.
+| "
+|     <table>
+|       border="1"
+|       "
+|   "
+|       <tbody>
+|         <tr>
+|           "
+| 	  "
+|           <td>
+|             "This is the first cell in the table
+|     "
+|           <td>
+|             "This is the second cell in the table
+|   "
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "This is the third cell in the table
+|     "
+|           <td>
+|             "This is the fourth cell in the table
+| "
+|     "
+| 
+| last text"
+
+#data
+## filename: Table_illegal_1.html
+<html>
+  <head>
+    <title> Bad Content </title>
+  </head>
+  <style>
+    table { 
+   	    border: solid  red;
+	    background-color:yellow;
+          }
+    P { background-color: pink; }
+  </style>
+<body>
+
+ <table >
+   <tr>
+    <td>
+   <P> some text
+    two</td>
+   </tr>
+ </table>
+ <table>
+   <tr>
+   <P>ss
+    <td>three</td>
+   </tr>
+ </table>
+
+ <table>
+   <tr>
+	  <P>one
+    <td>
+     <table>
+	  <P>last
+      <tr>
+	  <P>two
+       <td>
+        <table>
+         <tr>
+	  <P>three
+          <td>
+           <table>
+            <tr>
+             <td>
+	      4TD
+             </td>
+            </tr>
+           </table>
+	  </td>
+	  <P>three last
+	 </tr>
+	</table>
+       </td>
+	  <P>two last
+      </tr>
+     </table>
+    </td>
+	  <P>one last
+   </tr>
+  </table>
+</body>
+</html>
+
+#document
+| <html>
+|   <head>
+|     "
+|   "
+|     "
+|     "
+|     <title>
+|       " Bad Content "
+|     "
+|   "
+|     <style>
+|       "
+|     table { 
+|    	    border: solid  red;
+| 	    background-color:yellow;
+|           }
+|     P { background-color: pink; }
+|   "
+|     "
+| "
+|   <body>
+|     "
+|  "
+|     <table>
+|       "
+|    "
+|       <tbody>
+|         <tr>
+|           "
+|     "
+|           <td>
+|             "
+|    "
+|             <p>
+|               " some text
+|     two"
+|           "
+|    "
+|         "
+|  "
+|     "
+|  "
+|     <p>
+|       "ss
+|     "
+|     <table>
+|       "
+|    "
+|       <tbody>
+|         <tr>
+|           "
+|    "
+|           <td>
+|             "three"
+|           "
+|    "
+|         "
+|  "
+|     "
+|  "
+|     <p>
+|       "one
+|     "
+|     <p>
+|       "one last
+|    "
+|     <table>
+|       "
+|    "
+|       <tbody>
+|         <tr>
+|           "
+| 	  "
+|           <td>
+|             "
+|      "
+|             <p>
+|               "last
+|       "
+|             <p>
+|               "two
+|        "
+|             <p>
+|               "two last
+|       "
+|             <table>
+|               "
+| 	  "
+|               <tbody>
+|                 <tr>
+|                   "
+| 	  "
+|                   <td>
+|                     "
+|         "
+|                     <p>
+|                       "three
+|           "
+|                     <p>
+|                       "three last
+| 	 "
+|                     <table>
+|                       "
+|          "
+|                       <tbody>
+|                         <tr>
+|                           "
+| 	  "
+|                           <td>
+|                             "
+|            "
+|                             <table>
+|                               "
+|             "
+|                               <tbody>
+|                                 <tr>
+|                                   "
+|              "
+|                                   <td>
+|                                     "
+| 	      4TD
+|              "
+|                                   "
+|             "
+|                                 "
+|            "
+|                             "
+| 	  "
+|                           "
+| 	  "
+|                         "
+| 	"
+|                     "
+|        "
+|                   "
+| 	  "
+|                 "
+|      "
+|             "
+|     "
+|           "
+| 	  "
+|         "
+|   "
+|     "
+| "
+
+#data
+## filename: Table_illegal_2.html
+<html>
+  <head>
+    <title> Bad Content </title>
+  </head>
+  <style>
+    body { color:blue; }
+    table { 
+   	    border: solid  red;
+	    background-color:yellow;
+          }
+    P { background-color: pink; color:red;}
+    H1 { background-color:green; }
+  </STYLE>
+<body>
+ <table border=1>
+   <tr><P style="color:red">red<A href="foo.htm">hello</A>there
+    <td>
+     <table border=1         bgcolor=green>
+      <tr>
+       <P style="color:blue"> blue
+       <td>
+        <table border=1>
+         <tr>
+          <td>
+           <table border=1>
+            <tr>
+	     <P style="color:green">green
+             <td>
+              <table border=1>
+               <tr>
+                 <td>
+                  HELLO
+                 </td>
+                </tr>
+              </table>
+             </td>
+	     <P style="color:orange">orange
+            </tr>
+</body>
+</html>
+
+#document
+| <html>
+|   <head>
+|     "
+|   "
+|     "
+|     "
+|     <title>
+|       " Bad Content "
+|     "
+|   "
+|     <style>
+|       "
+|     body { color:blue; }
+|     table { 
+|    	    border: solid  red;
+| 	    background-color:yellow;
+|           }
+|     P { background-color: pink; color:red;}
+|     H1 { background-color:green; }
+|   "
+|     "
+| "
+|   <body>
+|     "
+|  "
+|     <p>
+|       style="color: red;"
+|       "red"
+|       <a>
+|         href="foo.htm"
+|         "hello"
+|       "there
+|     "
+|     <table>
+|       border="1"
+|       "
+|    "
+|       <tbody>
+|         <tr>
+|           <td>
+|             "
+|      "
+|             <p>
+|               style="color: blue;"
+|               " blue
+|        "
+|             <table>
+|               border="1"
+|               bgcolor="green"
+|               "
+|       "
+|               <tbody>
+|                 <tr>
+|                   "
+|        "
+|                   <td>
+|                     "
+|         "
+|                     <table>
+|                       border="1"
+|                       "
+|          "
+|                       <tbody>
+|                         <tr>
+|                           "
+|           "
+|                           <td>
+|                             "
+|            "
+|                             <p>
+|                               style="color: green;"
+|                               "green
+|              "
+|                             <p>
+|                               style="color: orange;"
+|                               "orange
+|             "
+|                             <table>
+|                               border="1"
+|                               "
+|             "
+|                               <tbody>
+|                                 <tr>
+|                                   "
+| 	     "
+|                                   <td>
+|                                     "
+|               "
+|                                     <table>
+|                                       border="1"
+|                                       "
+|                "
+|                                       <tbody>
+|                                         <tr>
+|                                           "
+|                  "
+|                                           <td>
+|                                             "
+|                   HELLO
+|                  "
+|                                           "
+|                 "
+|                                         "
+|               "
+|                                     "
+|              "
+|                                   "
+| 	     "
+|                                 "
+| "
+
+#data
+## filename: acronym1.html
+<html>
+<head>
+<title>test ACRONYM tag</title>
+</head>
+<body>
+test Acronym<br>
+1normal text in body line 1.
+<Acronym>
+A This text is in Acronym
+<br> B line 2 in Acronym
+</Acronym>
+2normal text in body line 2.
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <title>
+|       "test ACRONYM tag"
+|     "
+| "
+|   <body>
+|     "
+| test Acronym"
+|     <br>
+|     "
+| 1normal text in body line 1.
+| "
+|     <acronym>
+|       "
+| A This text is in Acronym
+| "
+|       <br>
+|       " B line 2 in Acronym
+| "
+|     "
+| 2normal text in body line 2.
+| "
+
+#data
+## filename: aname01.html
+
+<body>
+
+<a name="516875">
+
+<B><blockquote>Note!
+
+</blockquote></B>
+
+</a>
+
+
+
+This is from  http://margaux/manual-proxy-20/cfgservr.htm
+
+
+
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+| "
+|     <a>
+|       name="516875"
+|       "
+| "
+|       <b>
+|         <blockquote>
+|           "Note!
+| "
+|       "
+| "
+|     "
+| This is from  http://margaux/manual-proxy-20/cfgservr.htm"
+
+#data
+## filename: atoi01.html
+first text 
+<font size="3"> size '3' </font>
+<font size=" 4"> size '_4' </font>
+<font size=" 5z"> size '_5z' </font>
+<font size=" 4%"> size ' 4%' </font>
+<font size=" 5 "> size '_5_' </font>
+<font size="+2"> size '+2' </font>
+<font size=" +2"> size '_+2' </font>
+<font size="+ 3"> size '+_3' </font>
+<font size=" +3"> size '_+3' </font>
+<font size="-1"> size -1 </font>
+
+last text
+#document
+| <html>
+|   <head>
+|   <body>
+|     "first text 
+| "
+|     <font>
+|       size="3"
+|       " size '3' "
+|     "
+| "
+|     <font>
+|       size=" 4"
+|       " size '_4' "
+|     "
+| "
+|     <font>
+|       size=" 5z"
+|       " size '_5z' "
+|     "
+| "
+|     <font>
+|       size=" 4%"
+|       " size ' 4%' "
+|     "
+| "
+|     <font>
+|       size=" 5 "
+|       " size '_5_' "
+|     "
+| "
+|     <font>
+|       size="+2"
+|       " size '+2' "
+|     "
+| "
+|     <font>
+|       size=" +2"
+|       " size '_+2' "
+|     "
+| "
+|     <font>
+|       size="+ 3"
+|       " size '+_3' "
+|     "
+| "
+|     <font>
+|       size=" +3"
+|       " size '_+3' "
+|     "
+| "
+|     <font>
+|       size="-1"
+|       " size -1 "
+|     "
+| last text"
+
+#data
+## filename: attribute_quote_bug1.html
+<STYLE>
+P { background: teal; }
+</STYLE>
+<P>Same text as in <a href="table1.html>table1.html</a> except it's not
+in the table. This is to see what the bounding boxes for the various
+objects are.</P>
+
+<P>This is the first cell in the table</P>
+<P>This is the second cell in the table</P>
+<P>This is the third cell in the table</P>
+<P>This is the fourth cell in the table</P>
+
+file:/s:/ns/xena/lego/testhtml/attribute_quote_bug1.html
+#document
+| <html>
+|   <head>
+|     <style>
+|       "
+| P { background: teal; }
+| "
+|     "
+| "
+|   <body>
+|     <p>
+|       "Same text as in "
+|       <a>
+|         href="table1.html"
+|         "table1.html"
+|       " except it's not
+| in the table. This is to see what the bounding boxes for the various
+| objects are."
+|     "
+| "
+|     <p>
+|       "This is the first cell in the table"
+|     "
+| "
+|     <p>
+|       "This is the second cell in the table"
+|     "
+| "
+|     <p>
+|       "This is the third cell in the table"
+|     "
+| "
+|     <p>
+|       "This is the fourth cell in the table"
+|     "
+| file:/s:/ns/xena/lego/testhtml/attribute_quote_bug1.html"
+
+#data
+## filename: badscript.html
+<html>
+ <head>
+  <title>script test</title>
+  <script>
+   <!--
+    document.write("</script>");
+    document.write("hello there");
+   //-->
+  </script>
+  <script>
+   document.write("one");
+  <scRipt
+>
+ </head>
+ <body>
+ </body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+|  "
+|     "
+|   "
+|     <title>
+|       "script test"
+|     "
+|   "
+|     <script>
+|       "
+|    <!--
+|     document.write("</script>");
+|     document.write("hello there");
+|    //-->
+|   "
+|   <body>
+|     "hello there
+|   "
+|     <script>
+|       "
+|    document.write("one");
+|   <scRipt
+| >
+|  </head>
+|  <body>
+|  </body>
+| </html>"
+
+
+#data
+## filename: bdo001.html
+<html>
+<head>
+<title>test BDO tag</title>
+</head>
+<body>
+test BDO, bi directional override <br>
+1normal text in body line 1.
+<BDO dir="rtl">
+A This text is in BDO
+<br> B line 2 in BDO
+</BDO>
+2normal text in body line 2.
+</body>
+</html>
+#document
+| <html>
+|   <head>
+|     "
+| "
+|     "
+| "
+|     <title>
+|       "test BDO tag"
+|     "
+| "
+|   <body>
+|     "
+| test BDO, bi directional override "
+|     <br>
+|     "
+| 1normal text in body line 1.
+| "
+|     <bdo>
+|       dir="rtl"
+|       "
+| A This text is in BDO
+| "
+|       <br>
+|       " B line 2 in BDO
+| "
+|     "
+| 2normal text in body line 2.
+| "
+
+##todo filename: bigscript.html -- parser_datreader.js doesn't grok this content for some reason
+
+#data
+## filename: bigtxt.html
+<script>
+ document["balah"].src = eval("balah" + "on.src");
+</script>
+<P>
+RFC788
+                                                                        
+
+                                    
+                                    
+                                    
+                                    
+                                    
+                     SIMPLE MAIL TRANSFER PROTOCOL
+                                    
+                                    
+                                    
+                           Jonathan B. Postel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                             November 1981
+                                    
+                                    
+                                    
+                     Information Sciences Institute
+                   University of Southern California
+                           4676 Admiralty Way
+                   Marina del Rey, California  90291
+
+                             (213) 822-1511
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+                           TABLE OF CONTENTS
+
+   1.  INTRODUCTION .................................................. 1
+
+   2.  THE SMTP MODEL ................................................ 2
+
+   3.  THE SMTP PROCEDURE ............................................ 4
+
+      3.1.  Mail ..................................................... 4
+      3.2.  Forwarding ............................................... 7
+      3.3.  Verifying and Expanding .................................. 8
+      3.4.  Sending and Mailing ..................................... 10
+      3.5.  Opening and Closing ..................................... 12
+      3.6.  Relaying ................................................ 13
+      3.7.  Domains ................................................. 15
+
+   4.  THE SMTP SPECIFICATIONS ...................................... 16
+
+      4.1.  SMTP Commands ........................................... 16
+      4.1.1.  Command Semantics ..................................... 16
+      4.1.2.  Command Syntax ........................................ 23
+      4.2.  SMTP Replies ............................................ 28
+      4.2.1.  Reply Codes by Function Group ......................... 29
+      4.2.2.  Reply Codes in Numeric Order .......................... 30
+      4.3.  Sequencing of Commands and Replies ...................... 31
+      4.4.  State Diagrams .......................................... 33
+      4.5.  Details ................................................. 35
+      4.5.1.  Minimum Implementation ................................ 35
+      4.5.2.  Transparency .......................................... 35
+      4.5.3.  Sizes ................................................. 36
+
+   APPENDIX A:  TCP ................................................. 38
+   APPENDIX B:  NCP ................................................. 39
+   APPENDIX C:  NITS ................................................ 40
+   APPENDIX D:  X.25 ................................................ 41
+   APPENDIX E:  Theory of Reply Codes ............................... 42
+   APPENDIX F:  Scenarios ........................................... 45
+
+   GLOSSARY ......................................................... 58
+
+   REFERENCES ....................................................... 61
+
+
+Network Working Group                                          J. Postel
+Request for Comments: 788                                            ISI
+Replaces: RFC 780, 772                                     November 1981
+
+                     SIMPLE MAIL TRANSFER PROTOCOL
+
+
+1.  INTRODUCTION
+
+   The objective of Simple Mail Transfer Protocol (SMTP) is to transfer
+   mail reliably and efficiently.
+
+   SMTP is independent of the particular transmission subsystem and
+   requires only a reliable ordered data stream channel.  Appendices A,
+   B, C, and D describe the use of SMTP with various transport services.
+   A Glossary provides the definitions of terms as used in this
+   document.
+
+   An important feature of SMTP is its capability to relay mail across
+   transport service environments.  A transport service provides an
+   interprocess communication environment (IPCE).  An IPCE may cover one
+   network, several networks, or a subset of a network.  It is important
+   to realize that transport systems (or IPCEs) are not one-to-one with
+   networks.  A process can communicate directly with another process
+   through any mutually known IPCE.  Mail is an application or use of
+   interprocess communication.  Mail can be communicated between
+   processes in different IPCEs by relaying through a process connected
+   to two (or more) IPCEs.  More specifically, mail can be relayed
+   between hosts on different transport systems by a host on both
+   transport systems.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                          [Page 1]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+2.  THE SMTP MODEL
+
+   The SMTP design is based on the following model of communication:  as
+   the result of a user mail request, the sender-SMTP establishes a
+   full-duplex transmission channel to a receiver-SMTP.  The
+   receiver-SMTP may be either the ultimate destination or an
+   intermediate.  SMTP commands are generated by the sender-SMTP and
+   sent to the receiver-SMTP.  SMTP replies are sent from the
+   receiver-SMTP to the sender-SMTP in response to the commands.
+
+   Once the transmission channel is established, the SMTP-sender sends a
+   MAIL command indicating the sender of the mail.  If the SMTP-receiver
+   can accept mail it responds with an OK reply.  The SMTP-sender then
+   sends a RCPT command identifying a recipient of the mail.  If the
+   SMTP-receiver can accept mail for that recipient it responds with an
+   OK reply; if not, it responds with a reply rejecting that recipient
+   (but not the whole mail transaction).  The SMTP-sender and
+   SMTP-receiver may negotiate several recipients.  When the recipients
+   have been negotiated the SMTP-sender sends the mail data, terminating
+   with a special sequence.  If the SMTP-receiver successfully processes
+   the mail data it responds with an OK reply.  The dialog is purposely
+   lock-step, one-at-a-time.
+
+     -------------------------------------------------------------
+
+   
+               +----------+                +----------+
+   +------+    |          |                |          |
+   | User |<-->|          |      SMTP      |          |
+   +------+    |  Sender- |Commands/Replies| Receiver-|
+   +------+    |   SMTP   |<-------------->|    SMTP  |    +------+
+   | File |<-->|          |    and Mail    |          |<-->| File |
+   |System|    |          |                |          |    |System|
+   +------+    +----------+                +----------+    +------+
+   
+
+                Sender-SMTP                Receiver-SMTP
+
+                           Model for SMTP Use
+
+                                Figure 1
+
+     -------------------------------------------------------------
+
+   The SMTP provides mechanisms for the transmission of mail; directly
+   from the sending user's host to the receiving user's host when the
+
+
+
+[Page 2]                                                          Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   two host are connected to the same transport service, or via one or
+   more relay SMTP-servers when the source and destination hosts are not
+   connected to the same transport service.
+
+   To be able to provide the relay capability the SMTP-server must be
+   supplied with the name of the ultimate destination host as well as
+   the destination mailbox name.
+
+   The argument to the MAIL command is a reverse-path, which specifies
+   who the mail is from.  The argument to the RCPT command is a
+   forward-path, which specifies who the mail is to.  The forward-path
+   is a source route while the reverse-path, is a return route (which
+   may be used to return a message to the sender when an error occurs
+   with a relayed message).
+
+   When the same message is sent to multiple recipients the SMTP
+   encourages the transmission of only one copy of the data for all the
+   recipients at the same destination host.
+
+   The mail commands and replies have a rigid syntax.  Replies also have
+   a numeric code.  In the following, examples appear which use actual
+   commands and replies.  The complete lists of commands and replies
+   appears in Section 4 on specifications.
+
+   Commands and replies are not case sensitive.  That is, a command or
+   reply word may be upper case, lower case, or any mixture of upper and
+   lower case.  Note that this is not true of mailbox user names.  For
+   some hosts the user name is case sensitive, and SMTP implementations
+   must take case to preserve the case of user names as they appear in
+   mailbox arguments.  Host names are not case sensitive.
+
+   Commands and replies are composed of characters from the ASCII
+   character set [1].  Each 7-bit character is transmitted right
+   justified in an 8-bit byte (or octet) with the high order bit cleared
+   to zero.
+
+   When specifying the general form of a command or reply, an argument
+   (or special symbol) will be denoted by a meta-linguistic variable (or
+   constant), for example, "<string>" or "<reverse-path>".  Here the
+   angle brackets indicate these are a meta-linguistic variables.
+   However, some arguments use the angle brackets literally.  For
+   example, an actual reverse-path is enclosed in angle brackets, i.e.,
+   "<Smith@ISIA>" is an instance of <reverse-path> (the angle brackets
+   are actually transmitted in the command or reply).
+
+
+
+
+
+Postel                                                          [Page 3]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+3.  THE SMTP PROCEDURES
+
+   This section presents the procedures used in SMTP in several parts.
+   First comes the basic mail procedure defined as a mail transaction.
+   Following this are descriptions of forwarding mail, verifying mailbox
+   names and expanding mailing lists, sending to terminals instead of or
+   in combination with mailboxes, and the opening and closing exchanges.
+   At the end of this section are comments on relaying, and a note on
+   mail domains.  Throughout this section are examples of partial
+   command and reply sequences, several complete scenarios are presented
+   in Appendix F.
+
+   3.1.  MAIL
+
+      There are three steps to a SMTP mail transaction.  The transaction
+      is started with a MAIL command which gives the sender
+      identification.  A series of one or more RCPT commands follow
+      giving the receiver information.  Then a DATA command gives the
+      mail data.  And finally, the end of mail data indicator confirms
+      the transaction.
+
+         The first step in the procedure is the MAIL command.  The
+         <reverse-path> contains the source mailbox.
+
+            MAIL <SP> FROM:<reverse-path> <CRLF>
+
+         This command tells the the SMTP-receiver that a new mail
+         transaction is starting and to reset all its state tables and
+         buffers including any recipients or mail data.  It gives the
+         reverse-path which can be used to report errors.  If accepted,
+         the receiver-SMTP returns a 250 OK reply.
+
+         The <reverse-path> can contain more than just a mailbox.  The
+         <reverse-path> is a reverse source routing list of hosts and
+         source mailbox.  The first host in the <reverse-path> should be
+         the host sending this command.
+
+         The second step in the procedure is the RCPT command.
+
+            RCPT <SP> TO:<forward-path> <CRLF>
+
+         This command gives a forward-path identifying one recipient.
+         If accepted, the receiver-SMTP returns a 250 OK reply, and
+         stores the forward-path.  If the recipient is unknown the
+         receiver-SMTP returns a 550 Failure reply.  This second step of
+         the procedure can be repeated any number of times.
+
+
+
+[Page 4]                                                          Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+         The <forward-path> can contain more than just a mailbox.  The
+         <forward-path> is a source routing list of hosts and
+         destination mailbox.  The first host in the <forward-path>
+         should be the host receiving this command.
+
+         The third step in the procedure is the DATA command.
+
+            DATA <CRLF>
+
+         If accepted, the receiver-SMTP returns a 354 Intermediate reply
+         and considers all succeeding lines to be the message text.
+         When the end of text is received and stored the SMTP-receiver
+         sends a 250 OK reply.
+
+         Since the mail data is sent on the transmission channel the end
+         of the mail data must be indicated so that the command and
+         reply dialog can be resumed.  SMTP indicates the end of the
+         mail data by sending a line containing only a period.  A
+         transparency procedure is used to prevent this interfering with
+         the user's text (see Section 4.5.2).
+
+            Please note that the mail data includes the memo header
+            items such as Date, Subject, To, Cc, From [2].
+
+         The end of mail data indicator also confirms the mail
+         transaction and tells the receiver-SMTP to now process the
+         stored recipients and mail data.  If accepted, the
+         receiver-SMTP returns a 250 OK reply.  The DATA command should
+         fail only if the mail transaction was incomplete (for example,
+         no recipients), or if resources are not available.
+
+      The above procedure is an example of a SMTP mail transaction.
+      These commands must be used only in the order discussed above.
+      Example 1 (below) illustrates the use of these commands in a mail
+      transaction.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                          [Page 5]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+      -------------------------------------------------------------
+
+                     Example of the SMTP Procedure
+
+         This SMTP example shows mail sent by Smith at host Alpha, to
+         Jones, Green, and Brown at host Beta.  Here we assume that host
+         Alpha contacts host Beta directly.
+
+            S: MAIL FROM:<Smith@Alpha>
+            R: 250 OK
+
+            S: RCPT TO:<Jones@Beta>
+            R: 250 OK
+
+            S: RCPT TO:<Green@Beta>
+            R: 550 No such user here
+
+            S: RCPT TO:<Brown@Beta>
+            R: 250 OK
+
+            S: DATA
+            R: 354 Start mail input; end with <CRLF>.<CRLF>
+            S: Blah blah blah...
+            S: ...etc. etc. etc.
+            S: <CRLF>.<CRLF>
+            R: 250 OK
+
+         The mail has now been accepted for Jones and Brown.  Green did
+         not have a mailbox at host Beta.
+
+                               Example 1
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 6]                                                          Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   3.2.  FORWARDING
+
+      There are some cases where the destination information in the
+      <forward-path> is incorrect, but the receiver-SMTP knows the
+      correct destination.  In such cases, one the following replies
+      should be used to allow the sender to contact the correct
+      destination.
+
+         251 User not local; will forward to <forward-path>
+
+            This reply indicates that the receiver-SMTP knows the user's
+            mailbox is on another host and indicates the correct
+            forward-path to use in the future.  Note that either the
+            host or user or both may be different.  The receiver takes
+            responsibility for delivering the message.
+
+         551 User not local; please try <forward-path>
+
+            This reply indicates that the receiver-SMTP knows the user's
+            mailbox is on another host and indicates the correct
+            forward-path to use.  Note that either the host or user or
+            both may be different.  The receiver refuses to accept mail
+            for this user, and the sender must either redirect the mail
+            according to the information provided or return an error
+            response to the originating user.
+
+      Example 2 illustrates the use of these responses.
+
+      -------------------------------------------------------------
+
+                         Example of Forwarding
+
+         Either
+
+            S: RCPT TO:<Postel@ISI>
+            R: 251 User not local; will forward to <Postel@ISIF>
+
+         Or
+
+            S: RCPT TO:<Paul@ISIB>
+            R: 551 User not local; please try <Mockapetris@ISIF>
+
+                               Example 2
+
+      -------------------------------------------------------------
+
+
+
+
+Postel                                                          [Page 7]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+   3.3.  VERIFYING AND EXPANDING
+
+      SMTP provides as additional features, commands to verify a user
+      name or expand a mailing list.  This is done with the VRFY and
+      EXPN commands, which have a character string arguments.  For the
+      VRFY command, the string is a user name, and the the response may
+      include the full name of the user and must include the mailbox of
+      the user.  For the EXPN command, the string identifies a mailing
+      list, and the multiline response may include the full name of the
+      users and must give the mailboxes on the mailing list.
+
+      The case of verifying a user name is straightforward as shown in
+      example 3.
+
+      -------------------------------------------------------------
+
+                    Example of Verifying a User Name
+
+         Either
+
+            S: VRFY Postel
+            R: 250 Jon Postel <Postel@ISIF>
+
+         Or
+
+            S: VRFY Jones
+            R: 550 String does not match anything.
+
+                               Example 3
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 8]                                                          Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+      The case of expanding a mailbox list requires a multiline reply as
+      shown in example 4.
+
+      -------------------------------------------------------------
+
+                  Example of Expanding a Mailing List
+
+         Either
+
+            S: EXPN Example-People
+            R: 250-Jon Postel <Postel@ISIF>
+            R: 250-Fred Fonebone <Fonebone@ISIQ>
+            R: 250-Sam Q. Smith <SQSmith@ISIQ>
+            R: 250-Quincy Smith <@ISIF,Q-Smith@ISI-VAXA>
+            R: 250-<joe@foo-unix>
+            R: 250 <xyz@bar-unix>
+
+         Or
+
+            S: EXPN Executive-Washroom-List
+            R: 550 Access Denied to You.
+
+                               Example 4
+
+      -------------------------------------------------------------
+
+      The character string arguments of the VRFY and EXPN commands
+      cannot be further restricted due to the variety of implementations
+      of the user name and mailbox list concepts.  On some systems it
+      may be appropriate for the argument of the EXPN command to be a
+      file name for a file containing a mailing list, but again there is
+      a variety of file naming conventions in the internet.
+
+      The VRFY and EXPN commands are not included in the minimum
+      implementation (Section 4.5.1), and are not required to work
+      across relays when they are implemented.
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                          [Page 9]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+   3.4.  SENDING AND MAILING
+
+      The main purpose of SMTP is to deliver messages to user's
+      mailboxes.  A very similar service provided by some hosts is to
+      deliver messages to user's terminals (provided the user is active
+      on the host).  The delivery to the user's mailbox is called
+      "mailing", the delivery to the user's terminal is called
+      "sending".  Because in many hosts the implementation of sending is
+      nearly identical to the implementation of mailing these two
+      functions are combined in SMTP.  However the sending commands are
+      not included in the required minimum implementation
+      (Section 4.5.1).  User's should have the ability to control the
+      writing of messages on their terminals.  Most hosts permit the
+      user's to accept or refuse such messages.
+
+      The following three command are defined to support the sending
+      options, these are used in the mail transaction instead of the
+      MAIL command and inform the receiver-SMTP of the special semantics
+      of this transaction:
+
+         SEND <SP> FROM:<reverse-path> <CRLF>
+
+            The SEND command requires that the mail data be delivered to
+            the user's terminal.  If the user is not active (or not
+            accepting terminal messages) on the host a 450 reply may
+            returned to a RCPT command.  The mail transaction is
+            successful if the message is delivered the terminal.
+
+         SOML <SP> FROM:<reverse-path> <CRLF>
+
+            The Send Or MaiL command requires that the mail data be
+            delivered to the user's terminal if the user is active (and
+            accepting terminal messages) on the host.  If the user is
+            not active (or not accepting terminal messages) then the
+            mail data is entered into the user's mailbox.  The mail
+            transaction is successful if the message is delivered either
+            to the terminal or the mailbox.
+
+         SAML <SP> FROM:<reverse-path> <CRLF>
+
+            The Send And MaiL command requires that the mail data be
+            delivered to the user's terminal if the user is active (and
+            accepting terminal messages) on the host.  In any case the
+            mail data is entered into the user's mailbox.  The mail
+            transaction is successful if the message is delivered the
+            mailbox.
+
+
+
+[Page 10]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+      The same reply codes that are used for the MAIL commands are used
+      for these commands.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 11]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+   3.5.  OPENING AND CLOSING
+
+      At the time the transmission channel is opened there is an
+      exchange to ensure that the hosts are communicating with the hosts
+      they think they are.
+
+      The following two commands are used in transmission channel
+      opening and closing:
+
+         HELO <SP> <host> <CRLF>
+
+         QUIT <CRLF>
+
+      In the HELO command the host sending the command identifies
+      itself; the command may be interpreted as saying "Hello, i am
+      <host>".
+
+      -------------------------------------------------------------
+
+                     Example of Connection Opening
+
+         R: 220 BBN-UNIX Simple Mail Transfer Service Ready
+         S: HELO USC-ISIF
+         R: 250 BBN-UNIX
+
+                               Example 5
+
+      -------------------------------------------------------------
+
+      -------------------------------------------------------------
+
+                     Example of Connection Closing
+
+         S: QUIT
+         R: 221 BBN-UNIX Service closing transmission channel
+
+                               Example 6
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+[Page 12]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   3.6.  RELAYING
+
+      The forward-path may be a source route of the form
+      "@ONE,@TWO,JOE@THREE", where ONE, TWO, and THREE are hosts.  This
+      form is used to emphasize the distinction between an address and a
+      route.  The mailbox is an absolute address, and the route is
+      information about how to get there.  The two concepts should not
+      be confused.
+
+      The elements of the forward-path are moved to the reverse-path as
+      the message is relayed from one server-SMTP to another.  The
+      reverse-path is a reverse source route, (i.e., a source route from
+      the current location of the message to the originator of the
+      message).  When a server-SMTP deletes its identifier from the
+      forward-path and inserts it into the reverse-path, it must use the
+      name it is known by in the environment it is sending into, not the
+      environment the mail came from, in case the server-SMTP is known
+      by different names in different environments.
+
+      Using source routing the receiver-SMTP receives mail to be relayed
+      to another server-SMTP  The receiver-SMTP may accept or reject the
+      task of relaying the mail in the same way it accepts or rejects
+      mail for a local user.  The receiver-SMTP transforms the command
+      arguments by moving its own identifier from the forward-path to
+      the beginning of the reverse-path.  The receiver-SMTP then becomes
+      a sender-SMTP, establishes a transmission channel to the next SMTP
+      in the forward-path, and sends it the mail.
+
+      The first host in the reverse-path should be the host sending the
+      SMTP commands, and the first host in the forward-path should be
+      the host receiving the SMTP commands.
+
+      Notice that the forward-path and reverse-path appear in the SMTP
+      commands and replies, but not necessarily in the message.  That
+      is, there is no need for these paths and especially this syntax to
+      appear in the "To:" , "From:", "CC:", etc. fields of the message
+      header.
+
+      If a server-SMTP has accepted the task of relaying the mail and
+      later finds that the forward-path is incorrect or that the mail
+      cannot be delivered for whatever reason, then it must construct an
+      "undeliverable mail" notification message and send it to the
+      originator of the undeliverable mail (as indicated by the
+      reverse-path).
+
+
+
+
+
+Postel                                                         [Page 13]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+      This notification message must be from the server-SMTP at this
+      host.  Of course, server-SMTPs should not send notification
+      messages about problems with notification messages.  One way to
+      prevent loops in error reporting is to specify a null reverse-path
+      in the MAIL command of a notification message.  When such a
+      message is relayed it is permissible to leave the reverse-path
+      null.  A MAIL command with a null reverse-path appears as follows:
+
+         MAIL FROM:<>
+
+      An undeliverable mail notification message is shown in example 7.
+      This notification is in response to a message originated by JOE at
+      HOSTW and sent via HOSTX to HOSTY with instructions to relay it on
+      to HOSTZ.  What we see in the example is the transaction between
+      HOSTY and HOSTX, which is the first step in the return of the
+      notification message.
+
+      -------------------------------------------------------------
+
+            Example Undeliverable Mail Notification Message
+
+         S: MAIL FROM:<>
+         R: 250 ok
+         S: RCPT TO:<@HOSTX,JOE@HOSTW>
+         R: 250 ok
+         S: DATA
+         R: 354 send the mail data, end with .
+         S: Date: 23 Oct 81
+         S: Sender: SMTP@HOSTY
+         S: Subject: Mail System Problem
+         S:
+         S:   Sorry JOE, your message to SAM@HOSTZ lost.
+         S:   HOSTZ said this:
+         S:    "550 No Such User"
+         S: .
+         R: 250 ok
+
+                               Example 7
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+[Page 14]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   3.7.  DOMAINS
+
+      At some not too distant future time it might be necessary to
+      expand the mailbox format to include a region or name domain
+      identifier.  There is quite a bit of discussion on this at
+      present, and is likely that SMTP will be revised in the future to
+      take into account naming domains.
+
+      The examples in this document do not show mail domains.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 15]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+4.  THE SMTP SPECIFICATIONS
+
+   4.1.  SMTP COMMANDS
+
+      4.1.1.  COMMAND SEMANTICS
+
+         The SMTP commands define the mail transfer or the mail system
+         function requested by the user.  SMTP commands are character
+         strings terminated by <CRLF>.  The command codes themselves are
+         alphabetic characters terminated by <SP> if parameters follow
+         and <CRLF> otherwise.  The syntax of mailboxes must conform to
+         receiver site conventions.  The SMTP commands are discussed
+         below.  The SMTP replies are discussed in the Section 4.2.
+
+         A mail transaction involves several data objects which are
+         communicated as arguments to different commands.  The
+         reverse-path is the argument of the MAIL command, the
+         forward-path is the argument of the RCPT command, and the mail
+         data is the argument of the DATA command.  These arguments or
+         data objects must be transmitted and held pending the
+         confirmation communicated by the end of mail data indication
+         which finalizes the transaction.  The model for this is that
+         distinct buffers are provided to hold the types of data
+         objects, that is, there is a reverse-path buffer, a
+         forward-path buffer, and a mail data buffer.  Specific commands
+         cause information to be appended to a specific buffer, or cause
+         one or more buffers to be cleared.
+
+         HELLO (HELO)
+
+            This command is used to identify the sender-SMTP to the
+            receiver-SMTP.  The argument field contains the host name of
+            the sender-SMTP.
+
+            The receiver-SMTP identifies itself to the sender-SMTP in
+            the connection greeting reply, and in the response to this
+            command.
+
+         MAIL (MAIL)
+
+            This command is used to initiate a mail transaction in which
+            the mail data is delivered to one or more mailboxes.  The
+            argument field contains a reverse-path.
+
+            The reverse-path consists of an optional list of hosts and
+            the sender mailbox.  When the list of hosts is present, it
+
+
+
+[Page 16]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+            is a "reverse" source route and indicates that the mail was
+            relayed through each host on the list (the first host in the
+            list was the most recent relay).  This list is used as a
+            source route to return non-delivery notices to the sender.
+            As each relay host adds itself to the beginning of the list,
+            it must use its name as known in the IPCE to which it is
+            relaying the mail rather than the IPCE from which the mail
+            came (if they are different).  In some types of error
+            reporting messages (for example, undeliverable mail
+            notifications) the reverse-path may be null (see Example 7).
+
+            This command clears the reverse-path buffer, the
+            forward-path buffer, and the mail data buffer; and inserts
+            the reverse-path information from this command into the
+            reverse-path buffer.
+
+         RECIPIENT (RCPT)
+
+            This command is used to identify an individual recipient of
+            the mail data; multiple recipients are specified by multiple
+            use of this command.
+
+            The forward-path consists of an optional list of hosts and a
+            required destination mailbox.  When the list of hosts is
+            present, it is a source route and indicates that the mail
+            must be relayed to the next host on the list.  If the
+            receiver-SMTP is does not implement the relay function it
+            may user the same reply it would for an unknown local user
+            (550).
+
+            When mail is relayed, the relay host must remove itself from
+            the beginning forward-path and put itself at the beginning
+            of the reverse-path.  When mail reaches its ultimate
+            destination (the forward-path contains only a destination
+            mailbox), the receiver-SMTP inserts it into the destination
+            mailbox in accordance with its host mail conventions.
+
+               For example, mail received at relay host A with arguments
+
+                  FROM:<X@Y>
+                  TO:<@A,@B,C@D>
+
+               will be relayed on to host B with arguments
+
+                  FROM:<@A,X@Y>
+                  TO:<@B,C@D>.
+
+
+
+Postel                                                         [Page 17]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+            This command causes its forward-path argument to be appended
+            to the forward-path buffer.
+
+         DATA (DATA)
+
+            The receiver treats the lines following the command as mail
+            data from the sender.  This command causes the mail data
+            from this command to be appended to the mail data buffer.
+            The mail data may contain any of the 128 ASCII character
+            codes.
+
+            The mail data is terminated by a line containing only a
+            period, that is the character sequence "<CRLF>.<CRLF>" (see
+            Section 4.5.2 on Transparency).  This is the end of mail
+            data indication.
+
+            The end of mail data indication requires that the receiver
+            must now process the stored mail transaction information.
+            This processing consumes the information in the reverse-path
+            buffer, the forward-path buffer, and the mail data buffer,
+            and on the completion of this command these buffers are
+            cleared.  If the processing is successful the receiver must
+            send an OK reply.  If the processing fails completely the
+            receiver must send a failure reply.
+
+            When the receiver-SMTP accepts a message either for relaying
+            or for final delivery it inserts at the beginning of the
+            mail data a time stamp line.  The time stamp line indicates
+            the identity of the host that sent the message, and the
+            identity of the host that received the message (and is
+            inserting this time stamp), and the date and time the
+            message was received.  Relayed messages will have multiple
+            time stamp lines.
+
+            When the receiver-SMTP makes the "final delivery" of a
+            message it inserts at the beginning of the mail data a
+            return path line.  The return path line preserves the
+            information in the <reverse-path> from the MAIL command.
+            Here, final delivery means the message leaves the SMTP
+            world.  Normally, this would mean it has been delivered to
+            the destination user, but in some cases it may be further
+            processed and transmitted by another mail system.
+
+            The preceding two paragraphs imply that the final mail data
+
+
+
+
+
+[Page 18]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+            will begin with a  return path line, followed by one or more
+            time stamp lines.  These lines will be followed by the mail
+            data header and body [2].  For example:
+
+               Return-Path: <@GHI,@DEF,@ABC,JOE@ABC>
+               Mail-From: GHI received by JKL at 27-Oct-81 15:27:39-PST
+               Mail-From: DEF received by GHI at 27-Oct-81 15:15:13-PST
+               Mail-From: ABC received by DEF at 27-Oct-81 15:01:59-PST
+               Date: 27-Oct-81 15:01:01-PST
+               From: JOE@ABC
+               Subject: Improved Mailing System Installed
+               To: SAM@JKL
+               
+               This is to inform you that ...
+
+            Special mention is needed of the response and further action
+            required when the processing following the end of mail data
+            indication is partially successful.  This could arise if
+            after accepting several recipients and the mail data, the
+            receiver-SMTP finds that the mail data can be successfully
+            delivered to some of the recipients, but it cannot be to
+            others (for example, due to mailbox space allocation
+            problems).  In such a situation, the response to the DATA
+            command must be an OK reply.  But, the receiver-SMTP must
+            compose and send an "undeliverable mail" notification
+            message to the originator of the message.  Either a single
+            notification which lists all of the recipients that failed
+            to get the message, or separate notification messages must
+            be sent for each failed recipient (see Example 7).  All
+            undeliverable mail notification messages are sent using the
+            MAIL command (even if they result from processing a SEND,
+            SOML, or SAML command).
+
+         SEND (SEND)
+
+            This command is used to initiate a mail transaction in which
+            the mail data is delivered to one or more terminals.  The
+            argument field contains a reverse-path.  This command is
+            successful if the message is delivered to the terminal.
+
+            The reverse-path consists of an optional list of hosts and
+            the sender mailbox.  When the list of hosts is present, it
+            is a "reverse" source route and indicates that the mail was
+            relayed through each host on the list (the first host in the
+            list was the most recent relay).  This list is used as a
+            source route to return non-delivery notices to the sender.
+
+
+
+Postel                                                         [Page 19]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+            As each relay host adds itself to the beginning of the list,
+            it must use its name as known in the IPCE to which it is
+            relaying the mail rather than the IPCE from which the mail
+            came (if they are different).
+
+            This command clears the reverse-path buffer, the
+            forward-path buffer, and the mail data buffer; and inserts
+            the reverse-path information from this command into the
+            reverse-path buffer.
+
+         SEND OR MAIL (SOML)
+
+            This command is used to initiate a mail transaction in which
+            the mail data is delivered to one or more terminals or
+            mailboxes. For each recipient the mail data is delivered to
+            the recipient's terminal if the recipient is active on the
+            host (and accepting terminal messages), otherwise to the
+            recipient's mailbox.  The argument field contains a
+            reverse-path.  This command is successful if the message is
+            delivered to the terminal or the mailbox.
+
+            The reverse-path consists of an optional list of hosts and
+            the sender mailbox.  When the list of hosts is present, it
+            is a "reverse" source route and indicates that the mail was
+            relayed through each host on the list (the first host in the
+            list was the most recent relay).  This list is used as a
+            source route to return non-delivery notices to the sender.
+            As each relay host adds itself to the beginning of the list,
+            it must use its name as known in the IPCE to which it is
+            relaying the mail rather than the IPCE from which the mail
+            came (if they are different).
+
+            This command clears the reverse-path buffer, the
+            forward-path buffer, and the mail data buffer; and inserts
+            the reverse-path information from this command into the
+            reverse-path buffer.
+
+         SEND AND MAIL (SAML)
+
+            This command is used to initiate a mail transaction in which
+            the mail data is delivered to one or more terminals and
+            mailboxes. For each recipient the mail data is delivered to
+            the recipient's terminal if the recipient is active on the
+            host (and accepting terminal messages), and for all
+
+
+
+
+
+[Page 20]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+            recipients to the recipient's mailbox.  The argument field
+            contains a reverse-path.  This command is successful if the
+            message is delivered to the mailbox.
+
+            The reverse-path consists of an optional list of hosts and
+            the sender mailbox.  When the list of hosts is present, it
+            is a "reverse" source route and indicates that the mail was
+            relayed through each host on the list (the first host in the
+            list was the most recent relay).  This list is used as a
+            source route to return non-delivery notices to the sender.
+            As each relay host adds itself to the beginning of the list,
+            it must use its name as known in the IPCE to which it is
+            relaying the mail rather than the IPCE from which the mail
+            came (if they are different).
+
+            This command clears the reverse-path buffer, the
+            forward-path buffer, and the mail data buffer; and inserts
+            the reverse-path information from this command into the
+            reverse-path buffer.
+
+         RESET (RSET)
+
+            This command specifies that the current mail transaction is
+            to be aborted.  Any stored sender, recipients, and mail data
+            must be discarded, and all buffers and state tables cleared.
+            The receiver must send an OK reply.
+
+         VERIFY (VRFY)
+
+            This command asks the receiver to confirm that the argument
+            identifies a user.  If it is a user name, the full name of
+            the user (if known) and the fully specified mailbox are
+            returned.
+
+            This command has no effect on any of the reverse-path
+            buffer, the forward-path buffer, or the mail data buffer.
+
+         EXPAND (EXPN)
+
+            This command asks the receiver to confirm that the argument
+            identifies a mailing list, and if so, to return the
+            membership of that list.  The full name of the users (if
+            known) and the fully specified mailboxes are returned in a
+            multiline reply.
+
+
+
+
+
+Postel                                                         [Page 21]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+            This command has no effect on any of the reverse-path
+            buffer, the forward-path buffer, or the mail data buffer.
+
+         HELP (HELP)
+
+            This command causes the receiver to send helpful information
+            to the sender of the HELP command.  The command may take an
+            argument (e.g., any command name) and return more specific
+            information as a response.
+
+            This command has no effect on any of the reverse-path
+            buffer, the forward-path buffer, or the mail data buffer.
+
+         NOOP (NOOP)
+
+            This command does not affect any parameters or previously
+            entered commands.  It specifies no action other than that
+            the receiver send an OK reply.
+
+            This command has no effect on any of the reverse-path
+            buffer, the forward-path buffer, or the mail data buffer.
+
+         QUIT (QUIT)
+
+            This command specifies that the receiver must send an OK
+            reply, and then close the transmission channel.
+
+            The receiver should not close the transmission channel until
+            it receives and replies to a QUIT command (even if there was
+            an error).  The sender should not close the transmission
+            channel until it send a QUIT command and receives the reply
+            (even if there was an error response to a previous command).
+            If the connection is closed prematurely the receiver should
+            act as if a RSET command had been received (canceling any
+            pending transaction, but not undoing any previously
+            completed transaction), the sender should act as if the
+            command or transaction in progress had received a temporary
+            error (4xx).
+
+         There are restrictions on the order in which these command may
+         be used.
+
+            The first command in a session must be the HELO command.
+            The HELO command may be used later in a session as well.
+
+
+
+
+
+[Page 22]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+            The NOOP, HELP, EXPN, and VRFY commands can be used at any
+            time during a session.
+
+            The MAIL, SEND, SOML, or SAML commands begin a mail
+            transaction.  Once started a mail transaction consists of
+            one of the transaction beginning commands, one or more RCPT
+            commands, and a DATA command, in that order.  A mail
+            transaction may be aborted by the RSET command.  There may
+            be zero or more transactions in a session.
+
+            The last command in a session must be the QUIT command.  The
+            QUIT command can not be used at any other time in a session.
+
+      4.1.2.  COMMAND SYNTAX
+
+         The commands consist of a command code followed by an argument
+         field.  Command codes are four alphabetic characters.  Upper
+         and lower case alphabetic characters are to be treated
+         identically.  Thus, any of the following may represent the mail
+         command:
+
+            MAIL    Mail    mail    MaIl    mAIl
+
+         This also applies to any symbols representing parameter values,
+         such as "TO" or "to" for the forward-path.  Command codes and
+         the argument fields are separated by one or more spaces.
+         However, within the reverse-path and forward-path arguments
+         case is important.  In particular, in some hosts the user
+         "smith" is different from the user "Smith".
+
+         The argument field consists of a variable length character
+         string ending with the character sequence <CRLF>.  The receiver
+         is to take no action until this sequence is received.
+
+         Square brackets denote an optional argument field.  If the
+         option is not taken, the appropriate default is implied.
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 23]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+         The following are the SMTP commands:
+
+            HELO <SP> <host> <CRLF>
+
+            MAIL <SP> FROM:<reverse-path> <CRLF>
+
+            RCPT <SP> TO:<forward-path> <CRLF>
+
+            DATA <CRLF>
+
+            RSET <CRLF>
+
+            SEND <SP> FROM:<reverse-path> <CRLF>
+
+            SOML <SP> FROM:<reverse-path> <CRLF>
+
+            SAML <SP> FROM:<reverse-path> <CRLF>
+
+            VRFY <SP> <string> <CRLF>
+
+            EXPN <SP> <string> <CRLF>
+
+            HELP [<SP> <string>] <CRLF>
+
+            NOOP <CRLF>
+
+            QUIT <CRLF>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 24]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+         The syntax of the above argument fields (using BNF notation
+         where applicable) is given below.  The "..." notation indicates
+         that a field may be repeated one or more times.
+
+            <reverse-path> ::= <path>
+
+            <forward-path> ::= <path>
+
+            <path> ::= "<" ["@" <host> "," ...] <mailbox> ">"
+
+            <host> ::= <a> <string> | "#" <number> | "[" <dotnum> "]"
+
+            <mailbox> ::= <user> "@" <host>
+
+            <user> ::= <string>
+
+            <string> ::= <char> | <char> <string>
+
+            <char> ::= <c> | '\' <c> | '\' <s>
+
+            <dotnum> ::= <snum> "." <snum> "." <snum> "." <snum>
+
+            <number> ::= <d> | <d> <number>
+
+            <snum> ::= three digits representing a decimal integer value
+                      in the range 0 through 255
+
+            <a> ::= any one of the 52 alphabetic characters A through Z
+                      in upper case and a through z in lower case
+
+            <c> ::= any one of the 128 ASCII characters except
+                      <specials>
+
+            <d> ::= any one of the ten digits 0 through 9
+
+            <s> ::= any one of <specials>
+
+            <specials> ::= '<', '>', '(', ')', '\', ',', ';', ':', '@',
+            '"', and the control characters (ASCII codes 0 through 37
+            octal inclusive and 177 octal)
+
+         Note that the backslash, '\', is a quote character, which is
+         used to indicate that the next character is to be used
+         literally (instead of its normal interpretation).  For example,
+         "Joe\,Smith" could be used to indicate a single nine character
+         user field with comma being the fourth character of the field.
+
+
+
+Postel                                                         [Page 25]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+         Hosts are generally known by names which are translated to
+         addresses in each host.  Sometimes a host is not known to the
+         translation function and communication is blocked.  To bypass
+         this barrier two numeric forms are also allowed for host
+         "names".  One form is a decimal integer prefixed by a pound
+         sign, "#", which indicates the number is the address of the
+         host.  Another form is four small decimal integers separated by
+         dots and enclosed by brackets, e.g., "[123.255.37.2]", which
+         indicates a 32-bit ARPA Internet Address in four 8-bit fields.
+
+         The time stamp line and the return path line are formally
+         defined as follows:
+
+         <return-path-line> ::= "Return-Path:" <SP><reverse-path><CRLF>
+
+         <time-stamp-line> ::= "Mail-From:" <SP> <stamp> <CRLF>
+
+            <stamp> ::= [<ptcl>] <from-host> <this-host> <daytime>
+
+            <ptcl> ::= <protocol> <SP> "host" <SP>
+
+            <from-host> ::= <host> <SP>
+
+            <this-host> ::= "received by" <SP> <host> <SP>
+
+            <protocol> ::= "TCP" | "NCP" | "NITS" | "X25" | "INTERNET" |
+                      "ARPANET"
+
+               Note: INTERNET = TCP, ARPANET = NCP, and if the <ptcl> is
+                         not present INTERNET is assumed.
+
+            <daytime> ::= "at" <SP> <date> <SP> <time>
+
+            <date> ::= <dd> "-" <mon> "-" <yy>
+
+            <time> ::= <hh> ":" <mm> ":" <ss> "-" <zone>
+
+            <dd> ::= the one or two decimal integer day of the month in
+                      the range 1 to 31.
+
+            <mon> ::= "JAN" | "FEB" | "MAR" | "APR" | "MAY" | "JUN" |
+                      "JUL" | "AUG" | "SEP" | "OCT" | "NOV" | "DEC"
+
+            <yy> ::= the two decimal integer year of the century in the
+                      range 01 to 99.
+
+
+
+
+[Page 26]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+            <hh> ::= the two decimal integer hour of the day in the
+                      range 00 to 24.
+
+            <mm> ::= the two decimal integer minute of the hour in the
+                      range 00 to 59.
+
+            <ss> ::= the two decimal integer second of the minute in the
+                      range 00 to 59.
+
+            <zone> ::= a time zone designator (as in [2]) or "UT" for
+                      Universal Time (the default).
+
+         Return Path Example:
+
+            Return-Path: <@CHARLIE,@BAKER,JOE@ABLE>
+
+         Mail From Example:
+
+            Mail-From: ABC received by XYZ at 22-OCT-81 09:23:59-PDT
+
+         
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 27]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+   4.2.  SMTP REPLIES
+
+      Replies to SMTP commands are devised to ensure the synchronization
+      of requests and actions in the process of mail transfer, and to
+      guarantee that the sender-SMTP always knows the state of the
+      receiver-SMTP.  Every command must generate exactly one reply.
+
+         The details of the command-reply sequence are made explicit in
+         Section 5.3 on Sequencing and Section 5.4 State Diagrams.
+
+      An SMTP reply consists of a three digit number (transmitted as
+      three alphanumeric characters) followed by some text.  The number
+      is intended for use by automata to determine what state to enter
+      next; the text is meant for the human user.  It is intended that
+      the three digits contain enough encoded information that the
+      sender-SMTP need not examine the text and may either discard it or
+      pass it on to the user, as appropriate.  In particular, the text
+      may be receiver-dependent, so there are likely to be varying texts
+      for each reply code.  A discussion of the theory of reply codes is
+      given in the Appendix E.  Formally, a reply is defined to be the
+      sequence:  a three-digit code, <SP>, one line of text, and <CRLF>,
+      or a multiline reply (as defined in Appendix E).  Only the EXPN
+      and HELP command are expected to result in multiline replies in
+      normal circumstances, however multiline replies are allowed for
+      any command.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 28]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+      4.2.1.  REPLY CODES BY FUNCTION GROUPS
+
+         500 Syntax error, command unrecognized
+            [This may include errors such as command line too long]
+         501 Syntax error in parameters or arguments
+         502 Command not implemented
+         503 Bad sequence of commands
+         504 Command parameter not implemented
+          
+         211 System status, or system help reply
+         214 Help message
+            [Information on how to use the receiver or the meaning of a
+            particular non-standard command; this reply is useful only
+            to the human user]
+          
+         220 <host> Service ready
+         221 <host> Service closing transmission channel
+         421 <host> Service not available, closing transmission channel
+            [This may be a reply to any command if the service knows it
+            must shut down]
+          
+         250 Requested mail action okay, completed
+         251 User not local; will forward to <forward-path>
+         450 Requested mail action not taken: mailbox unavailable
+            [E.g., mailbox busy]
+         550 Requested action not taken: mailbox unavailable
+            [E.g., mailbox not found, no access]
+         451 Requested action aborted: error in processing
+         551 User not local; please try <forward-path>
+         452 Requested action not taken: insufficient system storage
+         552 Requested mail action aborted: exceeded storage allocation
+         553 Requested action not taken: mailbox name not allowed
+            [E.g., mailbox syntax incorrect]
+         354 Start mail input; end with <CRLF>.<CRLF>
+         554 Transaction failed
+         
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 29]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+      4.2.2.  NUMERIC ORDER LIST OF REPLY CODES
+
+         211 System status, or system help reply
+         214 Help message
+            [Information on how to use the receiver or the meaning of a
+            particular non-standard command; this reply is useful only
+            to the human user]
+         220 <host> Service ready
+         221 <host> Service closing transmission channel
+         250 Requested mail action okay, completed
+         251 User not local; will forward to <forward-path>
+          
+         354 Start mail input; end with <CRLF>.<CRLF>
+          
+         421 <host> Service not available, closing transmission channel
+            [This may be a reply to any command if the service knows it
+            must shut down]
+         450 Requested mail action not taken: mailbox unavailable
+            [E.g., mailbox busy]
+         451 Requested action aborted: local error in processing
+         452 Requested action not taken: insufficient system storage
+          
+         500 Syntax error, command unrecognized
+            [This may include errors such as command line too long]
+         501 Syntax error in parameters or arguments
+         502 Command not implemented
+         503 Bad sequence of commands
+         504 Command parameter not implemented
+         550 Requested action not taken: mailbox unavailable
+            [E.g., mailbox not found, no access]
+         551 User not local; please try <forward-path>
+         552 Requested mail action aborted: exceeded storage allocation
+         553 Requested action not taken: mailbox name not allowed
+            [E.g., mailbox syntax incorrect]
+         554 Transaction failed
+         
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 30]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   4.3.  SEQUENCING OF COMMANDS AND REPLIES
+
+      The communication between the sender and receiver is intended to
+      be an alternating dialogue, controlled by the sender.  As such,
+      the sender issues a command and the receiver responds with a
+      reply.  The sender must wait for this response before sending
+      further commands.
+
+      One important reply is the connection greeting.  Normally, a
+      receiver will send a 220 "Awaiting input" reply when the
+      connection is completed.  The sender should wait for this greeting
+      message before sending any commands.
+
+         Note: all the greeting type replies have the official name of
+         the server host as the first word following the reply code.
+
+            For example,
+
+               220 <SP> USC-ISIF <SP> Service ready <CRLF>
+
+      The table below lists alternative success and failure replies for
+      each command.  These must be strictly adhered to; a receiver may
+      substitute text in the replies, but the meaning and action implied
+      by the code numbers and by the specific command reply sequence
+      cannot be altered.
+
+      COMMAND-REPLY SEQUENCES
+
+         Each command is listed with its possible replies.  The prefixes
+         used before the possible replies are "P" for preliminary (not
+         used in SMTP), "I" for intermediate, "S" for success, "F" for
+         failure, and "E" for error.  The 421 reply (service not
+         available, closing transmission channel) may be given to any
+         command if the SMTP-receiver knows it must shut down.  This
+         listing forms the basis for the State Diagrams in Section 4.4.
+
+            CONNECTION ESTABLISHMENT
+               S: 220
+               F: 421
+            HELO
+               S: 250
+               E: 500, 501, 504, 421
+            MAIL
+               S: 250
+               F: 552, 451, 452
+               E: 500, 501, 421
+
+
+
+Postel                                                         [Page 31]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+            RCPT
+               S: 250, 251
+               F: 550, 551, 552, 553, 450, 451, 452
+               E: 500, 501, 421
+            DATA
+               I: 354 -> data -> S: 250
+                                 F: 552, 554, 451, 452
+               F: 451, 554
+               E: 500, 501, 421
+            RSET
+               S: 250
+               E: 500, 501, 504, 421
+            SEND
+               S: 250
+               F: 552, 451, 452
+               E: 500, 501, 502, 421
+            SOML
+               S: 250
+               F: 552, 451, 452
+               E: 500, 501, 502, 421
+            SAML
+               S: 250
+               F: 552, 451, 452
+               E: 500, 501, 502, 421
+            VRFY
+               S: 250
+               F: 550
+               E: 500, 501, 502, 504, 421
+            EXPN
+               S: 250
+               F: 550
+               E: 500, 501, 502, 504, 421
+            HELP
+               S: 211, 214
+               E: 500, 501, 502, 504, 421
+            NOOP
+               S: 250
+               E: 500, 421
+            QUIT
+               S: 221
+               E: 500
+
+
+
+
+
+
+
+
+[Page 32]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   4.4.  STATE DIAGRAMS
+
+      Following are state diagrams for a simple-minded SMTP
+      implementation.  Only the first digit of the reply codes is used.
+      There is one state diagram for each group of SMTP commands.  The
+      command groupings were determined by constructing a model for each
+      command and then collecting together the commands with
+      structurally identical models.
+
+      For each command there are three possible outcomes:  "success"
+      (S), "failure" (F), and "error" (E). In the state diagrams below
+      we use the symbol B for "begin", and the symbol W for "wait for
+      reply".
+
+      First, the diagram that represents most of the SMTP commands:
+
+         
+                                  1,3    +---+
+                             ----------->| E |
+                            |            +---+
+                            |
+         +---+    cmd    +---+    2      +---+
+         | B |---------->| W |---------->| S |
+         +---+           +---+           +---+
+                            |
+                            |     4,5    +---+
+                             ----------->| F |
+                                         +---+
+         
+
+         This diagram models the commands:
+
+            HELO, MAIL, RCPT, RSET, SEND, SOML, SAML, VRFY, EXPN, HELP,
+            NOOP, QUIT.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 33]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+      A more complex diagram models the DATA command:
+
+         
+         +---+   DATA    +---+ 1,2                 +---+
+         | B |---------->| W |-------------------->| E |
+         +---+           +---+        ------------>+---+
+                         3| |4,5     |
+                          | |        |
+            --------------   -----   |
+           |                      |  |             +---+
+           |               ----------     -------->| S |
+           |              |       |      |         +---+
+           |              |  ------------
+           |              | |     |
+           V           1,3| |2    |
+         +---+   data    +---+     --------------->+---+
+         |   |---------->| W |                     | F |
+         +---+           +---+-------------------->+---+
+                              4,5
+
+
+         Note that the "data" here is a series of lines sent from the
+         sender to the receiver with no response expected until the last
+         line is sent.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 34]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   4.5.  DETAILS
+
+      4.5.1.  MINIMUM IMPLEMENTATION
+
+         In order to make SMTP workable, the following minimum
+         implementation is required for all receivers:
+
+            COMMANDS -- HELO
+                        MAIL
+                        RCPT
+                        DATA
+                        RSET
+                        NOOP
+                        QUIT
+
+      4.5.2.  TRANSPARENCY
+
+         Without some provision for data transparency the character
+         sequence "<CRLF>.<CRLF>" ends the the mail text and cannot be
+         sent by the user.  In general, users are not aware of such
+         "forbidden" sequences.  To allow all user composed text to be
+         transmitted transparently the following procedures are used.
+
+            1. Before sending a line of mail text the sender-SMTP checks
+            the first character of the line.  If it is a period, one
+            additional period is inserted at the beginning of the line.
+
+            2. When a line of mail text is received by the receiver-SMTP
+            it checks the the line.  If the line is composed of a single
+            period it is the end of mail.  If the first character is a
+            period and there are other characters on the line, the first
+            character is deleted.
+
+         The mail data may contain any of the 128 ASCII characters.  All
+         characters are to be delivered to the recipients mailbox
+         including format effectors and other control characters.  The
+         7-bit ASCII codes are transmitted right justified in 8-bit
+         bytes (octets) with the high order bits cleared to zero.
+
+            In some systems it may be necessary to transform the data as
+            it is received and stored.  This may be necessary for hosts
+            that use a different character set than ASCII as their local
+            character set, or that store data in records rather than
+            strings.  If such transforms are necessary, they must be
+            reversible -- especially if such transforms are applied to
+            mail being relayed.
+
+
+
+Postel                                                         [Page 35]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+      4.5.3.  SIZES
+
+         There are several objects that have required minimum maximum
+         sizes.  That is every implementation must be able to receive
+         objects of at least these sizes, but must not send objects
+         larger than these sizes.
+
+                                    
+          ****************************************************
+          *                                                  *
+          *  TO THE MAXIMUM EXTENT POSSIBLE, IMPLEMENTATION  *
+          *  TECHNIQUES WHICH IMPOSE NO LIMITS ON THE LENGTH *
+          *  OF THESE OBJECTS SHOULD BE USED.                *
+          *                                                  *
+          ****************************************************
+
+            user
+
+               The maximum total length of a user name is 64 characters.
+
+            host
+
+               The maximum total length of a host name or number is 40
+               characters.
+
+            path
+
+               The maximum total length of a reverse-path or
+               forward-path is 256 characters (including the punctuation
+               and element separators).
+
+            command line
+
+               The maximum total length of a command line including the
+               command word and the <CRLF> is 512 characters.
+
+            reply line
+
+               The maximum total length of a reply line including the
+               reply code and the <CRLF> is 512 characters.
+
+            text line
+
+               The maximum total length of a text line including the
+               <CRLF> is 1000 characters (but not counting the leading
+               dot duplicated for transparency).
+
+
+
+[Page 36]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+            recipients buffer
+
+               The maximum total number of recipients that must be
+               buffered is 100 recipients.
+
+                                    
+          ****************************************************
+          *                                                  *
+          *  TO THE MAXIMUM EXTENT POSSIBLE, IMPLEMENTATION  *
+          *  TECHNIQUES WHICH IMPOSE NO LIMITS ON THE LENGTH *
+          *  OF THESE OBJECTS SHOULD BE USED.                *
+          *                                                  *
+          ****************************************************
+
+         Errors due to exceeding these limits may be reported by using
+         the reply codes, for example:
+
+            500 Line too long.
+
+            501 Path too long
+
+            552 Too many recipients.
+
+            552 Too much mail data.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 37]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+APPENDIX A
+
+   TCP Transport service
+
+      The Transmission Control Protocol [3] is used in the ARPA
+      Internet, and in any network following the US DoD standards for
+      internetwork protocols.
+
+      Connection Establishment
+
+         The SMTP transmission channel is a TCP connection established
+         between the sender process port U and the receiver process port
+         L.  This single full duplex connection is used as the
+         transmission channel.  This protocol is assigned the service
+         port 25 (31 octal), that is L=25.
+
+      Data Transfer
+
+         The TCP connection supports the transmission of 8-bit bytes.
+         The SMTP data is 7-bit ASCII characters.  Each character is
+         transmitted as a 8-bit byte with the high-order bit cleared to
+         zero.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 38]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+APPENDIX B
+
+   NCP Transport service
+
+      The ARPANET Host-to-Host Protocol [4] (implemented by the Network
+      Control Program) may be used in the ARPANET.
+
+      Connection Establishment
+
+         The SMTP transmission channel is established via NCP between
+         the the sender process socket U and receiver process socket L.
+         The Initial Connection Protocol [5] is followed resulting in a
+         pair of simplex connections.  This pair of connections is used
+         as the transmission channel.  This protocol is assigned the
+         contact socket 25 (31 octal), that is L=25.
+
+      Data Transfer
+
+         The NCP data connections are established in 8-bit byte mode.
+         The SMTP data is 7-bit ASCII characters.  Each character is
+         transmitted as a 8-bit byte with the high-order bit cleared to
+         zero.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 39]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+APPENDIX C
+
+   NITS
+
+      The Network Independent Transport Service [6] may be used.
+
+      Connection Establishment
+
+         The SMTP transmission channel is established via NITS between
+         the sender process and receiver process.  The sender process
+         executes the CONNECT primitive, and the waiting receiver
+         process executes the ACCEPT primitive.
+
+      Data Transfer
+
+         The NITS connection supports the transmission of 8-bit bytes.
+         The SMTP data is 7-bit ASCII characters.  Each character is
+         transmitted as a 8-bit byte with the high-order bit cleared to
+         zero.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 40]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+APPENDIX D
+
+   X.25 Transport service
+
+      It may be possible to use the X.25 service [7] as provided by the
+      Public Data Networks directly, but there are indications that it
+      is too error prone to qualify as a reliable channel.  It is
+      suggested that a reliable end-to-end protocol such as TCP be used
+      on top of X.25 connections.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 41]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+APPENDIX E
+
+   Theory of Reply Codes
+
+      The three digits of the reply each have a special significance.
+      The first digit denotes whether the response is good, bad or
+      incomplete.  An unsophisticated sender-SMTP will be able to
+      determine its next action (proceed as planned, redo, retrench,
+      etc.) by simply examining this first digit.  A sender-SMTP that
+      wants to know approximately what kind of error occurred (e.g.,
+      mail system error, command syntax error) may examine the second
+      digit, reserving the third digit for the finest gradation of
+      information.
+
+         There are five values for the first digit of the reply code:
+
+            1yz   Positive Preliminary reply
+
+               The command has been accepted, but the requested action
+               is being held in abeyance, pending confirmation of the
+               information in this reply.  The sender-SMTP should send
+               another command specifying whether to continue or abort
+               the action.
+
+                  [Note: SMTP does not have any commands that allow this
+                  type of reply, and so does not have the continue or
+                  abort commands.]
+
+            2yz   Positive Completion reply
+
+               The requested action has been successfully completed.  A
+               new request may be initiated.
+
+            3yz   Positive Intermediate reply
+
+               The command has been accepted, but the requested action
+               is being held in abeyance, pending receipt of further
+               information.  The sender-SMTP should send another command
+               specifying this information.  This reply is used in
+               command sequence groups.
+
+            4yz   Transient Negative Completion reply
+
+               The command was not accepted and the requested action did
+               not occur.  However, the error condition is temporary and
+               the action may be requested again.  The sender should
+
+
+
+[Page 42]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+               return to the beginning of the command sequence (if any).
+               It is difficult to assign a meaning to "transient" when
+               two different sites (receiver- and sender- SMTPs) must
+               agree on the interpretation.  Each reply in this category
+               might have a different time value, but the sender-SMTP is
+               encouraged to try again.  A rule of thumb to determine if
+               a reply fits into the 4yz or the 5yz category (see below)
+               is that replies are 4yz if they can be repeated without
+               any change in command form or in properties of the sender
+               or receiver.  (E.g., the command is repeated identically
+               and the receiver does not put up a new implementation.)
+
+            5yz   Permanent Negative Completion reply
+
+               The command was not accepted and the requested action did
+               not occur.  The sender-SMTP is discouraged from repeating
+               the exact request (in the same sequence).  Even some
+               "permanent" error conditions can be corrected, so the
+               human user may want to direct the sender-SMTP to
+               reinitiate the command sequence by direct action at some
+               point in the future (e.g., after the spelling has been
+               changed, or the user has altered the account status).
+
+         The second digit encodes responses in specific categories:
+
+            x0z   Syntax -- These replies refer to syntax errors,
+                  syntactically correct commands that don't fit any
+                  functional category, and unimplemented or superfluous
+                  commands.
+
+            x1z   Information --  These are replies to requests for
+                  information, such as status or help.
+
+            x2z   Connections -- These are replies referring to the
+                  transmission channel.
+
+            x3z   Unspecified as yet.
+
+            x4z   Unspecified as yet.
+
+            x5z   Mail system -- These replies indicate the status of
+                  the receiver mail system vis-a-vis the requested
+                  transfer or other mail system action.
+
+         The third digit gives a finer gradation of meaning in each
+         category specified by the second digit.  The list of replies
+
+
+
+Postel                                                         [Page 43]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+         illustrates this.  Each reply text is recommended rather than
+         mandatory, and may even change according to the command with
+         which it is associated.  On the other hand, the reply codes
+         must strictly follow the specifications in this section.
+         Receiver implementations should not invent new codes for
+         slightly different situations from the ones described here, but
+         rather adapt codes already defined.
+
+         For example, a command such as NOOP whose successful execution
+         does not offer the sender-SMTP any new information will return
+         a 250 reply.  The response is 502 when the command requests an
+         unimplemented non-site-specific action.  A refinement of that
+         is the 504 reply for a command that is implemented, but that
+         requests an unimplemented parameter.
+
+      The reply text may be longer than a single line; in these cases
+      the complete text must be marked so the sender-SMTP knows when it
+      can stop reading the reply.  This requires a special format to
+      indicate a multiple line reply.
+
+         The format for multi-line replies requires that every line,
+         except the last, begin with the reply code, followed
+         immediately by a hyphen, "-" (also known as minus), followed by
+         text.  The last line will begin with the reply code, followed
+         immediately by <SP>, optionally some text, and <CRLF>.
+
+            For example:
+                                123-First line
+                                123-Second line
+                                123-234 text beginning with numbers
+                                123 The last line
+
+         The sender-SMTP then simply needs to search for the reply code
+         followed by <SP> at the beginning of a line, and ignore all
+         preceding lines.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 44]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+APPENDIX F
+
+   Scenarios
+
+      This section presents complete scenarios of several types of SMTP
+      sessions.
+
+   A Typical SMTP Transaction Scenario
+
+      This SMTP example shows mail sent by Smith at host USC-ISIF, to
+      Jones, Green, and Brown at host BBN-UNIX.  Here we assume that
+      host USC-ISIF contacts host BBN-UNIX directly.  The mail is
+      accepted for Jones and Brown.  Green does not have a mailbox at
+      host BBN-UNIX.
+
+      -------------------------------------------------------------
+
+         R: 220 BBN-UNIX Simple Mail Transfer Service Ready
+         S: HELO USC-ISIF
+         R: 250 BBN-UNIX
+
+         S: MAIL FROM:<Smith@USC-ISIF>
+         R: 250 OK
+
+         S: RCPT TO:<Jones@BBN-UNIX>
+         R: 250 OK
+
+         S: RCPT TO:<Green@BBN-UNIX>
+         R: 550 No such user here
+
+         S: RCPT TO:<Brown@BBN-UNIX>
+         R: 250 OK
+
+         S: DATA
+         R: 354 Start mail input; end with <CRLF>.<CRLF>
+         S: Blah blah blah...
+         S: ...etc. etc. etc.
+         S: .
+         R: 250 OK
+
+         S: QUIT
+         R: 221 BBN-UNIX Service closing transmission channel
+
+                               Scenario 1
+
+      -------------------------------------------------------------
+
+
+
+Postel                                                         [Page 45]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+   Aborted SMTP Transaction Scenario
+
+      -------------------------------------------------------------
+
+         R: 220 MIT-Multics Simple Mail Transfer Service Ready
+         S: HELO ISI-VAXA
+         R: 250 MIT-Multics
+
+         S: MAIL FROM:<Smith@ISI-VAXA>
+         R: 250 OK
+
+         S: RCPT TO:<Jones@MIT-Multics>
+         R: 250 OK
+
+         S: RCPT TO:<Green@MIT-Multics>
+         R: 550 No such user here
+
+         S: RSET
+         R: 250 OK
+
+         S: QUIT
+         R: 221 MIT-Multics Service closing transmission channel
+
+                               Scenario 2
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 46]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   Relayed Mail Scenario
+
+      -------------------------------------------------------------
+
+         Step 1  --  Source Host to Relay Host
+
+            R: 220 USC-ISIE Simple Mail Transfer Service Ready
+            S: HELO MIT-AI
+            R: 250 USC-ISIE
+
+            S: MAIL FROM:<JQP@MIT-AI>
+            R: 250 OK
+
+            S: RCPT TO:<@ISIE,Jones@BBN-VAX>
+            R: 250 OK
+
+            S: DATA
+            R: 354 Start mail input; end with <CRLF>.<CRLF>
+            S: Date: 2-Nov-81 22:33:44
+            S: From: John Q. Public <JQP at MIT-AI>
+            S: Subject:  The Next Meeting of the Board
+            S: To: Jones at BBN-Vax
+            S:
+            S: Bill:
+            S: The next meeting of the board of directors will be
+            S: on Tuesday.
+            S:                                              John.
+            S: .
+            R: 250 OK
+
+            S: QUIT
+            R: 221 USC-ISIE Service closing transmission channel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 47]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+         Step 2  --  Relay Host to Destination Host
+
+            R: 220 BBN-VAX Simple Mail Transfer Service Ready
+            S: HELO USC-ISIE
+            R: 250 BBN-VAX
+
+            S: MAIL FROM:<@ISIE,JQP@MIT-AI>
+            R: 250 OK
+
+            S: RCPT TO:<Jones@BBN-VAX>
+            R: 250 OK
+
+            S: DATA
+            R: 354 Start mail input; end with <CRLF>.<CRLF>
+            S: Mail-From: NCP host MIT-AI received by USC-ISIE at
+               2-Nov-81 22:40:10
+            S: Date: 2-Nov-81 22:33:44
+            S: From: John Q. Public <JQP at MIT-AI>
+            S: Subject:  The Next Meeting of the Board
+            S: To: Jones at BBN-Vax
+            S:
+            S: Bill:
+            S: The next meeting of the board of directors will be
+            S: on Tuesday.
+            S:                                              John.
+            S: .
+            R: 250 OK
+
+            S: QUIT
+            R: 221 USC-ISIE Service closing transmission channel
+
+                               Scenario 3
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 48]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   Verifying and Sending Scenario
+
+      -------------------------------------------------------------
+
+         R: 220 SU-SCORE Simple Mail Transfer Service Ready
+         S: HELO MIT-MC
+         R: 250 SU-SCORE
+
+         S: VRFY Crispin
+         R: 250 Mark Crispin <Admin.MRC@SU-SCORE>
+
+         S: SEND FROM:<EAK@MIT-MC>
+         R: 250 OK
+
+         S: RCPT TO:<Admin.MRC@SU-SCORE>
+         R: 250 OK
+
+         S: DATA
+         R: 354 Start mail input; end with <CRLF>.<CRLF>
+         S: Blah blah blah...
+         S: ...etc. etc. etc.
+         S: .
+         R: 250 OK
+
+         S: QUIT
+         R: 221 SU-SCORE Service closing transmission channel
+
+                               Scenario 4
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 49]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+   Sending and Mailing Scenarios
+
+      First the user's name is verified, then  an attempt is made to
+      send to the user's terminal.  When that fails, the messages is
+      mailed to the user's mailbox.
+
+      -------------------------------------------------------------
+
+         R: 220 SU-SCORE Simple Mail Transfer Service Ready
+         S: HELO MIT-MC
+         R: 250 SU-SCORE
+
+         S: VRFY Crispin
+         R: 250 Mark Crispin <Admin.MRC@SU-SCORE>
+
+         S: SEND FROM:<EAK@MIT-MC>
+         R: 250 OK
+
+         S: RCPT TO:<Admin.MRC@SU-SCORE>
+         R: 450 User not active now
+
+         S: RSET
+         R: 250 OK
+
+         S: MAIL FROM:<EAK@MIT-MC>
+         R: 250 OK
+
+         S: RCPT TO:<Admin.MRC@SU-SCORE>
+         R: 250 OK
+
+         S: DATA
+         R: 354 Start mail input; end with <CRLF>.<CRLF>
+         S: Blah blah blah...
+         S: ...etc. etc. etc.
+         S: .
+         R: 250 OK
+
+         S: QUIT
+         R: 221 SU-SCORE Service closing transmission channel
+
+                               Scenario 5
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+[Page 50]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+      Doing the preceding scenario more efficiently.
+
+      -------------------------------------------------------------
+
+         R: 220 SU-SCORE Simple Mail Transfer Service Ready
+         S: HELO MIT-MC
+         R: 250 SU-SCORE
+
+         S: VRFY Crispin
+         R: 250 Mark Crispin <Admin.MRC@SU-SCORE>
+
+         S: SOML FROM:<EAK@MIT-MC>
+         R: 250 OK
+
+         S: RCPT TO:<Admin.MRC@SU-SCORE>
+         R: 250 User not active now, so will do mail.
+
+         S: DATA
+         R: 354 Start mail input; end with <CRLF>.<CRLF>
+         S: Blah blah blah...
+         S: ...etc. etc. etc.
+         S: .
+         R: 250 OK
+
+         S: QUIT
+         R: 221 SU-SCORE Service closing transmission channel
+
+                               Scenario 6
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 51]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+   Mailing List Scenario
+
+      First each of two mailing lists are expanded in separate sessions
+      with different hosts.  Then the message is sent to everyone that
+      appeared on either list (but no duplicates) via a relay host.
+
+      -------------------------------------------------------------
+
+         Step 1  --  Expanding the First List
+
+            R: 220 MIT-AI Simple Mail Transfer Service Ready
+            S: HELO SU-SCORE
+            R: 250 MIT-AI
+
+            S: EXPN Example-People
+            R: 250-<ABC@MIT-MC>
+            R: 250-Fred Fonebone <Fonebone@ISIQ>
+            R: 250-Xenon Y. Zither <XYZ@MIT-AI>
+            R: 250-Quincy Smith <@ISIF,Q-Smith@ISI-VAXA>
+            R: 250-<joe@foo-unix>
+            R: 250 <xyz@bar-unix>
+
+            S: QUIT
+            R: 221 MIT-AI Service closing transmission channel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 52]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+         Step 2  --  Expanding the Second List
+
+            R: 220 MIT-MC Simple Mail Transfer Service Ready
+            S: HELO SU-SCORE
+            R: 250 MIT-MC
+
+            S: EXPN Interested-Parties
+            R: 250-Al Calico <ABC@MIT-MC>
+            R: 250-<XYZ@MIT-AI>
+            R: 250-Quincy Smith <@ISIF,Q-Smith@ISI-VAXA>
+            R: 250-<fred@BBN-UNIX>
+            R: 250 <xyz@bar-unix>
+
+            S: QUIT
+            R: 221 MIT-MC Service closing transmission channel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 53]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+         Step 3  --  Mailing to All via a Relay Host
+
+            R: 220 USC-ISIE Simple Mail Transfer Service Ready
+            S: HELO SU-SCORE
+            R: 250 USC-ISIE
+
+            S: MAIL FROM:<Account.Person@SU-SCORE>
+            R: 250 OK
+            S: RCPT TO:<@ISIE,ABC@MIT-MC>
+            R: 250 OK
+            S: RCPT TO:<@ISIE,Fonebone@ISIQ>
+            R: 250 OK
+            S: RCPT TO:<@ISIE,XYZ@MIT-AI>
+            R: 250 OK
+            S: RCPT TO:<@ISIE,@ISIF,Q-Smith@ISI-VAXA>
+            R: 250 OK
+            S: RCPT TO:<@ISIE,joe@FOO-UNIX>
+            R: 250 OK
+            S: RCPT TO:<@ISIE,xyz@BAR-UNIX>
+            R: 250 OK
+            S: RCPT TO:<@ISIE,fred@BBN-UNIX>
+            R: 250 OK
+
+            S: DATA
+            R: 354 Start mail input; end with <CRLF>.<CRLF>
+            S: Blah blah blah...
+            S: ...etc. etc. etc.
+            S: .
+            R: 250 OK
+
+            S: QUIT
+            R: 221 USC-ISIE Service closing transmission channel
+
+                               Scenario 7
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 54]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   Forwarding Scenarios
+
+      -------------------------------------------------------------
+
+         R: 220 USC-ISIF Simple Mail Transfer Service Ready
+         S: HELO LBL-UNIX
+         R: 250 USC-ISIF
+
+         S: MAIL FROM:<mo@LBL-UNIX>
+         R: 250 OK
+
+         S: RCPT TO:<fred@USC-ISIF>
+         R: 251 User not local; will forward to <Jones@USC-ISIA>
+
+         S: DATA
+         R: 354 Start mail input; end with <CRLF>.<CRLF>
+         S: Blah blah blah...
+         S: ...etc. etc. etc.
+         S: .
+         R: 250 OK
+
+         S: QUIT
+         R: 221 USC-ISIF Service closing transmission channel
+
+                               Scenario 8
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Postel                                                         [Page 55]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+      -------------------------------------------------------------
+
+         Step 1  --  Trying the Mailbox at the First Host
+
+            R: 220 USC-ISIF Simple Mail Transfer Service Ready
+            S: HELO LBL-UNIX
+            R: 250 USC-ISIF
+
+            S: MAIL FROM:<mo@LBL-UNIX>
+            R: 250 OK
+
+            S: RCPT TO:<fred@USC-ISIF>
+            R: 251 User not local; will forward to <Jones@USC-ISIA>
+
+            S: RSET
+            R: 250 OK
+
+            S: QUIT
+            R: 221 USC-ISIF Service closing transmission channel
+
+         Step 2  --  Delivering the Mail at the Second Host
+
+            R: 220 USC-ISIA Simple Mail Transfer Service Ready
+            S: HELO LBL-UNIX
+            R: 250 USC-ISIA
+
+            S: MAIL FROM:<mo@LBL-UNIX>
+            R: 250 OK
+
+            S: RCPT TO:<Jones@USC-ISIA>
+            R: OK
+
+            S: DATA
+            R: 354 Start mail input; end with <CRLF>.<CRLF>
+            S: Blah blah blah...
+            S: ...etc. etc. etc.
+            S: .
+            R: 250 OK
+
+            S: QUIT
+            R: 221 USC-ISIA Service closing transmission channel
+
+                               Scenario 9
+
+      -------------------------------------------------------------
+
+
+
+
+[Page 56]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   Too Many Recipients Scenario
+
+      -------------------------------------------------------------
+
+         R: 220 BERKELEY Simple Mail Transfer Service Ready
+         S: HELO USC-ISIF
+         R: 250 BERKELEY
+
+         S: MAIL FROM:<Postel@USC-ISIF>
+         R: 250 OK
+
+         S: RCPT TO:<fabry@BERKELEY>
+         R: 250 OK
+
+         S: RCPT TO:<eric@BERKELEY>
+         R: 552 Recipient storage full, try again in another transaction
+
+         S: DATA
+         R: 354 Start mail input; end with <CRLF>.<CRLF>
+         S: Blah blah blah...
+         S: ...etc. etc. etc.
+         S: .
+         R: 250 OK
+
+         S: MAIL FROM:<Postel@USC-ISIF>
+         R: 250 OK
+
+         S: RCPT TO:<eric@BERKELEY>
+         R: 250 OK
+
+         S: DATA
+         R: 354 Start mail input; end with <CRLF>.<CRLF>
+         S: Blah blah blah...
+         S: ...etc. etc. etc.
+         S: .
+         R: 250 OK
+
+         S: QUIT
+         R: 221 BERKELEY Service closing transmission channel
+
+                              Scenario 10
+
+      -------------------------------------------------------------
+
+
+
+
+
+
+Postel                                                         [Page 57]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+GLOSSARY
+
+   ASCII
+
+      American Standard Code for Information Interchange [1].
+
+   command
+
+      A request for a mail service action sent by the sender-SMTP to the
+      receiver-SMTP.
+
+   end of mail data indication
+
+      A special sequence of characters that indicates the end of the
+      mail data.  In particular, the five characters carriage return,
+      line feed, period, carriage return, line feed, in that order.
+
+   host
+
+      A computer in the internetwork environment on which mailboxes or
+      SMTP processes reside.
+
+   line
+
+      A line of text ending with a <CRLF>.
+
+   mail data
+
+      A sequence of ASCII characters of arbitrary length, which conforms
+      to the standard set in the Standard for the Format of ARPA Network
+      Text Messages (RFC 733 [2]).
+
+   mailbox
+
+      A character string (address) which identifies a user to whom mail
+      is to be sent.  Mailbox normally consists of the host and user
+      specifications.  The standard mailbox naming convention is defined
+      to be "user@host".  Additionally, the "container" in which mail is
+      stored.
+
+   receiver-SMTP process
+
+      A process which transfers mail in cooperation with a sender-SMTP
+      process.  It waits for a connection to be established via the
+      transport service.  It receives SMTP commands from the
+      sender-SMTP, sends replies, and performs the specified operations.
+
+
+
+[Page 58]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+   reply
+
+      A reply is an acknowledgment (positive or negative) sent from
+      receiver to sender via the transmission channel in response to a
+      SMTP command.  The general form of a reply is a completion code
+      (including error codes) followed by a text string.  The codes are
+      for use by programs and the text is usually intended for human
+      users.
+
+   sender-SMTP process
+
+      A process which transfers mail in cooperation with a receiver-SMTP
+      process.  A local language may be used in the user interface
+      command/reply dialogue.  The sender-SMTP initiates the transport
+      service connection.  It initiates SMTP commands, receives replies,
+      and governs the transfer of mail.
+
+   session
+
+      The set of exchanges that occur while the transmission channel is
+      open.
+
+   transaction
+
+      The set of exchanges required for one message to be transmitted
+      for one or more recipients.
+
+   transmission channel
+
+      A full-duplex communication path between a sender-SMTP and a
+      receiver-SMTP for the exchange of commands, replies, and mail
+      text.
+
+   transport service
+
+      Any reliable stream-oriented data communication services.  For
+      example, NCP, TCP, NITS.
+
+   user
+
+      A human being (or a process on behalf of a human being) wishing to
+      obtain mail transfer service.  In addition, a recipient of
+      computer mail.
+
+
+
+
+
+
+Postel                                                         [Page 59]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+   word
+
+      A sequence of printing characters.
+
+   <CRLF>
+
+      The characters carriage return and line feed (in that order).
+
+   <SP>
+
+      The space character.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 60]                                                         Postel
+
+
+                                                                        
+RFC 788                                                    November 1981
+                                           Simple Mail Transfer Protocol
+
+
+
+REFERENCES
+
+   [1]  ASCII
+
+      ASCII, "USA Code for Information Interchange", United States of
+      America Standards Institute, X3.4, 1968.  Also in:  Feinler, E.
+      and J. Postel, eds., "ARPANET Protocol Handbook", NIC 7104, for
+      the Defense Communications Agency by SRI International, Menlo
+      Park, California, Revised January 1978.
+
+   [2]  RFC 733
+
+      Crocker, D., J. Vittal, K. Pogran, and D. Henderson, "Standard for
+      the Format of ARPA Network Text Messages," RFC 733, NIC 41952,
+      November 1977.  Also in:  Feinler, E. and J. Postel, eds.,
+      "ARPANET Protocol Handbook", NIC 7104, for the Defense
+      Communications Agency by SRI International, Menlo Park,
+      California, Revised January 1978.
+
+   [3]  TCP
+
+      Postel, J., ed., "Transmission Control Protocol - DARPA Internet
+      Program Protocol Specification", RFC 793, USC/Information Sciences
+      Institute, September 1981.
+
+   [4]  NCP
+
+      McKenzie,A., "Host/Host Protocol for the ARPA Network", NIC 8246,
+      January 1972.  Also in:  Feinler, E. and J. Postel, eds., "ARPANET
+      Protocol Handbook", NIC 7104, for the Defense Communications
+      Agency by SRI International, Menlo Park, California, Revised
+      January 1978.
+
+   [5]  Initial Connection Protocol
+
+      Postel, J., "Official Initial Connection Protocol", NIC 7101,
+      11 June 1971.  Also in:  Feinler, E. and J. Postel, eds., "ARPANET
+      Protocol Handbook", NIC 7104, for the Defense Communications
+      Agency by SRI International, Menlo Park, California, Revised
+      January 1978.
+
+   [6]  NITS
+
+      PSS/SG3, "A Network Independent Transport Service", Study Group 3,
+      The Post Office PSS Users Group, February 1980.  Available from
+      the DCPU, National Physical Laboratory, Teddington, UK.
+
+
+
+Postel                                                         [Page 61]
+
+
+                                                                        
+November 1981                                                    RFC 788
+Simple Mail Transfer Protocol                                           
+
+
+
+   [7]  X.25
+
+      CCITT, "Recommendation X.25 - Interface Between Data Terminal
+      Equipment (DTE) and Data Circuit-terminating Equipment (DCE) for
+      Terminals Operating in the Packet Mode on Public Data Networks,"
+      CCITT Orange Book, Vol. VIII.2, International Telephone and
+      Telegraph Consultative Committee, Geneva, 1976.
+
+         
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+[Page 62]                                                         Postel
+
+#document
+| <html>
+|   <head>
+|     <script>
+|       "
+|  document["balah"].src = eval("balah" + "on.src");
+| "
+|     "
+| "
+|   <body>
+|     <p>
+|       "
+| RFC788
+|                                                                         
+|                                     
+|                                     
+|                                     
+|                                     
+|                                     
+|                      SIMPLE MAIL TRANSFER PROTOCOL
+|                                     
+|                                     
+|                                     
+|                            Jonathan B. Postel
+|                              November 1981
+|                                     
+|                                     
+|                                     
+|                      Information Sciences Institute
+|                    University of Southern California
+|                            4676 Admiralty Way
+|                    Marina del Rey, California  90291
+|                              (213) 822-1511
+| 
+|                                                                         
+| RFC 788                                                    November 1981
+|                                            Simple Mail Transfer Protocol
+|                            TABLE OF CONTENTS
+|    1.  INTRODUCTION .................................................. 1
+|    2.  THE SMTP MODEL ................................................ 2
+|    3.  THE SMTP PROCEDURE ............................................ 4
+|       3.1.  Mail ..................................................... 4
+|       3.2.  Forwarding ............................................... 7
+|       3.3.  Verifying and Expanding .................................. 8
+|       3.4.  Sending and Mailing ..................................... 10
+|       3.5.  Opening and Closing ..................................... 12
+|       3.6.  Relaying ................................................ 13
+|       3.7.  Domains ................................................. 15
+|    4.  THE SMTP SPECIFICATIONS ...................................... 16
+|       4.1.  SMTP Commands ........................................... 16
+|       4.1.1.  Command Semantics ..................................... 16
+|       4.1.2.  Command Syntax ........................................ 23
+|       4.2.  SMTP Replies ............................................ 28
+|       4.2.1.  Reply Codes by Function Group ......................... 29
+|       4.2.2.  Reply Codes in Numeric Order .......................... 30
+|       4.3.  Sequencing of Commands and Replies ...................... 31
+|       4.4.  State Diagrams .......................................... 33
+|       4.5.  Details ................................................. 35
+|       4.5.1.  Minimum Implementation ................................ 35
+|       4.5.2.  Transparency .......................................... 35
+|       4.5.3.  Sizes ................................................. 36
+|    APPENDIX A:  TCP ................................................. 38
+|    APPENDIX B:  NCP ................................................. 39
+|    APPENDIX C:  NITS ................................................ 40
+|    APPENDIX D:  X.25 ................................................ 41
+|    APPENDIX E:  Theory of Reply Codes ............................... 42
+|    APPENDIX F:  Scenarios ........................................... 45
+|    GLOSSARY ......................................................... 58
+|    REFERENCES ....................................................... 61
+| 
+| Network Working Group                                          J. Postel
+| Request for Comments: 788                                            ISI
+| Replaces: RFC 780, 772                                     November 1981
+|                      SIMPLE MAIL TRANSFER PROTOCOL
+| 1.  INTRODUCTION
+|    The objective of Simple Mail Transfer Protocol (SMTP) is to transfer
+|    mail reliably and efficiently.
+|    SMTP is independent of the particular transmission subsystem and
+|    requires only a reliable ordered data stream channel.  Appendices A,
+|    B, C, and D describe the use of SMTP with various transport services.
+|    A Glossary provides the definitions of terms as used in this
+|    document.
+|    An "
+|       "important feature of SMTP is its capability to relay mail across
+|    transport service environments.  A transport service provides an
+|    interprocess communication environment (IPCE).  An IPCE may cover one
+|    network, several networks, or a subset of a network.  It is important
+|    to realize that transport systems (or IPCEs) are not one-to-one with
+|    networks.  A process can communicate directly with another process
+|    through any mutually known IPCE.  Mail is an application or use of
+|    interprocess communication.  Mail can be communicated between
+|    processes in different IPCEs by relaying through a process connected
+|    to two (or more) IPCEs.  More specifically, mail can be relayed
+|    between hosts on different transport systems by a host on both
+|    transport systems.
+| Postel                                                          [Page 1]
+| 
+|                                                                         
+| November 1981                                                    RFC 788
+| Simple Mail Transfer Protocol                                           
+| 2.  THE SMTP MODEL
+|    The SMTP design is based on the following model of communication:  as
+|    the result of a user mail request, the sender-SMTP establishes a
+|    full-duplex transmission channel to a receiver-SMTP.  The
+|    receiver-SMTP may be either the ultimate destination or an
+|    intermediate.  SMTP commands are generated by the sender-SMTP and
+|    sent to the receiver-SMTP.  SMTP replies are sent from the
+|    receiver-SMTP to the sender-SMTP in response to the commands.
+|    Once the transmission channel is established, the SMTP-sender sends a
+|    MAIL command indicating the sender of the mail.  If the SMTP-receiver
+|    can accept mail it responds with an OK reply.  The SMTP-sender then
+|    sends a RCPT command identifying a recipient of the mail.  If the
+|    SMTP-receiver can accept mail for that recipient it responds with an
+|    OK reply; if not, it responds with a reply rejecting that recipient
+|    (but not the whole mail transaction).  The SMTP-sender and
+|    SMTP-receiver may negotiate several recipients.  When the recipients
+|    have been negotiated the SMTP-sender sends the mail data, terminating
+|    with a special sequence.  If the SMTP-receiver successfully processes
+|    the mail data it responds with an OK reply.  The dialog is purposely
+|    lock-step, one-at-a-time.
+|      -------------------------------------------------------------
+|    
+|                +----------+                +----------+
+|    +------+    |          |                |          |
+|    | User |<-->|          |      SMTP      |          |
+|    +------+    |  Sender- |Commands/Replies| Receiver-|
+|    +------+    |   SMTP   |<-------------->|    SMTP  |    +------+
+|    | File |<-->|          |    and Mail    |          |<-->| File |
+|    |System|    |          |                |          |    |System|
+|    +------+    +----------+                +----------+    +------+
+|    
+|                 Sender-SMTP                Receiver-SMTP
+|                            Model for SMTP Use
+|                                 Figure 1
+|      -------------------------------------------------------------
+|    The SMTP provides mechanisms for the transmission of mail; directly
+|    from the sending user's host to the receiving user's host when the
+| [Page 2]                                                          Postel
+| 
+|                                                                         
+| RFC 788                                                    November 1981
+|                                            Simple Mail Transfer Protocol
+|    two host are connected to the same transport service, or via one or
+|    more relay SMTP-servers when the source and destination hosts are not
+|    connected to the same transport service.
+|    To be able to provide the relay capability the SMTP-server must be
+|    supplied with the name of the ultimate destination host as well as
+|    the destination mailbox name.
+|    The argument to the MAIL command is a reverse-path, which specifies
+|    who the mail is from.  The argument to the RCPT command is a
+|    forward-path, which specifies who the mail is to.  The forward-path
+|    is a source route while the reverse-path, is a return route (which
+|    may be used to return a message to the sender when an error occurs
+|    with a relayed message).
+|    When the same message is sent to multiple recipients the SMTP
+|    encourages the transmission of only one copy of the data for all the
+|    recipients at the same destination host.
+|    The mail commands and replies have a rigid syntax.  Replies also have
+|    a numeric code.  In the following, examples appear which use actual
+|    commands and replies.  The complete lists of commands and replies
+|    appears in Section 4 on specifications.
+|    Commands and replies are not case sensitive.  That is, a command or
+|    reply word may be upper case, lower case, or any mixture of upper and
+|    lower case.  Note that this is not true of mailbox user names.  For
+|    some hosts the user name is case sensitive, and SMTP implementations
+|    must take case to preserve the case of user names as they appear in
+|    mailbox arguments.  Host names are not case sensitive.
+|    Commands and replies are composed of characters from the ASCII
+|    character set [1].  Each 7-bit character is transmitted right
+|    justified in an 8-bit byte (or octet) with the high order bit cleared
+|    to zero.
+|    When specifying the general form of a command or reply, an argument
+|    (or special symbol) will be denoted by a meta-linguistic variable (or
+|    constant), for example, ""
+|       <string>
+|         "" or ""
+|         <reverse-path>
+|           "".  Here the
+|    angle brackets indicate these are a meta-linguistic variables.
+|    However, some arguments use the angle brackets literally.  For
+|    example, an actual reverse-path is enclosed in angle brackets, i.e.,
+|    ""
+|           <smith@isia>
+|             "" is an instance of "
+|             <reverse-path>
+|               " (the angle brackets
+|    are actually transmitted in the command or reply).
+| Postel                                                          [Page 3]
+| 
+|                                                                         
+| November 1981                                                    RFC 788
+| Simple Mail Transfer Protocol                                           
+| 3.  THE SMTP PROCEDURES
+|    This section presents the procedures used in SMTP in several parts.
+|    First comes the basic mail procedure defined as a mail transaction.
+|    Following this are descriptions of forwarding mail, verifying mailbox
+|    names and expanding mailing lists, sending to terminals instead of or
+|    in combination with mailboxes, and the opening and closing exchanges.
+|    At the end of this section are comments on relaying, and a note on
+|    mail domains.  Throughout this section are examples of partial
+|    command and reply sequences, several complete scenarios are presented
+|    in Appendix F.
+|    3.1.  MAIL
+|       There are three steps to a SMTP mail transaction.  The transaction
+|       is started with a MAIL command which gives the sender
+|       identification.  A series of one or more RCPT commands follow
+|       giving the receiver information.  Then a DATA command gives the
+|       mail data.  And finally, the end of mail data indicator confirms
+|       the transaction.
+|          The first step in the procedure is the MAIL command.  The
+|          "
+|               <reverse-path>
+|                 " contains the source mailbox.
+|             MAIL "
+|                 <sp>
+|                   " FROM:"
+|                   <reverse-path>
+|                     " "
+|                     <crlf>
+|                       "
+|          This command tells the the SMTP-receiver that a new mail
+|          transaction is starting and to reset all its state tables and
+|          buffers including any recipients or mail data.  It gives the
+|          reverse-path which can be used to report errors.  If accepted,
+|          the receiver-SMTP returns a 250 OK reply.
+|          The "
+|                       <reverse-path>
+|                         " can contain more than just a mailbox.  The
+|          "
+|                         <reverse-path>
+|                           " is a reverse source routing list of hosts and
+|          source mailbox.  The first host in the "
+|                           <reverse-path>
+|                             " should be
+|          the host sending this command.
+|          The second step in the procedure is the RCPT command.
+|             RCPT "
+|                             <sp>
+|                               " TO:"
+|                               <forward-path>
+|                                 " "
+|                                 <crlf>
+|                                   "
+|          This command gives a forward-path identifying one recipient.
+|          If accepted, the receiver-SMTP returns a 250 OK reply, and
+|          stores the forward-path.  If the recipient is unknown the
+|          receiver-SMTP returns a 550 Failure reply.  This second step of
+|          the procedure can be repeated any number of times.
+| [Page 4]                                                          Postel
+| 
+|                                                                         
+| RFC 788                                                    November 1981
+|                                            Simple Mail Transfer Protocol
+|          The "
+|                                   <forward-path>
+|                                     " can contain more than just a mailbox.  The
+|          "
+|                                     <forward-path>
+|                                       " is a source routing list of hosts and
+|          destination mailbox.  The first host in the "
+|                                       <forward-path>
+|                                         "
+|          should be the host receiving this command.
+|          The third step in the procedure is the DATA command.
+|             DATA "
+|                                         <crlf>
+|                                           "
+|          If accepted, the receiver-SMTP returns a 354 Intermediate reply
+|          and considers all succeeding lines to be the message text.
+|          When the end of text is received and stored the SMTP-receiver
+|          sends a 250 OK reply.
+|          Since the mail data is sent on the transmission channel the end
+|          of the mail data must be indicated so that the command and
+|          reply dialog can be resumed.  SMTP indicates the end of the
+|          mail data by sending a line containing only a period.  A
+|          transparency procedure is used to prevent this interfering with
+|          the user's text (see Section 4.5.2).
+|             Please note that the mail data includes the memo header
+|             items such as Date, Subject, To, Cc, From [2].
+|          The end of mail data indicator also confirms the mail
+|          transaction and tells the receiver-SMTP to now process the
+|          stored recipients and mail data.  If accepted, the
+|          receiver-SMTP returns a 250 OK reply.  The DATA command should
+|          fail only if the mail transaction was incomplete (for example,
+|          no recipients), or if resources are not available.
+|       The above procedure is an example of a SMTP mail transaction.
+|       These commands must be used only in the order discussed above.
+|       Example 1 (below) illustrates the use of these commands in a mail
+|       transaction.
+| Postel                                                          [Page 5]
+| 
+|                                                                         
+| November 1981                                                    RFC 788
+| Simple Mail Transfer Protocol                                           
+|       -------------------------------------------------------------
+|                      Example of the SMTP Procedure
+|          This SMTP example shows mail sent by Smith at host Alpha, to
+|          Jones, Green, and Brown at host Beta.  Here we assume that host
+|          Alpha contacts host Beta directly.
+|             S: MAIL FROM:"
+|                                           <smith@alpha>
+|                                             "
+|             R: 250 OK
+|             S: RCPT TO:"
+|                                             <jones@beta>
+|                                               "
+|             R: 250 OK
+|             S: RCPT TO:"
+|                                               <green@beta>
+|                                                 "
+|             R: 550 No such user here
+|             S: RCPT TO:"
+|                                                 <brown@beta>
+|                                                   "
+|             R: 250 OK
+|             S: DATA
+|             R: 354 Start mail input; end with "
+|                                                   <crlf>
+|                                                     "."
+|                                                     <crlf>
+|                                                       "
+|             S: Blah blah blah...
+|             S: ...etc. etc. etc.
+|             S: "
+|                                                       <crlf>
+|                                                         "."
+|                                                         <crlf>
+|                                                           "
+|             R: 250 OK
+|          The mail has now been accepted for Jones and Brown.  Green did
+|          not have a mailbox at host Beta.
+|                                Example 1
+|       -------------------------------------------------------------
+| [Page 6]                                                          Postel
+| 
+|                                                                         
+| RFC 788                                                    November 1981
+|                                            Simple Mail Transfer Protocol
+|    3.2.  FORWARDING
+|       There are some cases where the destination information in the
+|       "
+|                                                           <forward-path>
+|                                                             " is incorrect, but the receiver-SMTP knows the
+|       correct destination.  In such cases, one the following replies
+|       should be used to allow the sender to contact the correct
+|       destination.
+|          251 User not local; will forward to "
+|                                                             <forward-path>
+|                                                               "
+|             This reply indicates that the receiver-SMTP knows the user's
+|             mailbox is on another host and indicates the correct
+|             forward-path to use in the future.  Note that either the
+|             host or user or both may be different.  The receiver takes
+|             responsibility for delivering the message.
+|          551 User not local; please try "
+|                                                               <forward-path>
+|                                                                 "
+|             This reply indicates that the receiver-SMTP knows the user's
+|             mailbox is on another host and indicates the correct
+|             forward-path to use.  Note that either the host or user or
+|             both may be different.  The receiver refuses to accept mail
+|             for this user, and the sender must either redirect the mail
+|             according to the information provided or return an error
+|             response to the originating user.
+|       Example 2 illustrates the use of these responses.
+|       -------------------------------------------------------------
+|                          Example of Forwarding
+|          Either
+|             S: RCPT TO:"
+|                                                                 <postel@isi>
+|                                                                   "
+|             R: 251 User not local; will forward to "
+|                                                                   <postel@isif>
+|                                                                     "
+|          Or
+|             S: RCPT TO:"
+|                                                                     <paul@isib>
+|                                                                       "
+|             R: 551 User not local; please try "
+|                                                                       <mockapetris@isif>
+|                                                                         "
+|                                Example 2
+|       -------------------------------------------------------------
+| Postel                                                          [Page 7]
+| 
+|                                                                         
+| November 1981                                                    RFC 788
+| Simple Mail Transfer Protocol                                           
+|    3.3.  VERIFYING AND EXPANDING
+|       SMTP provides as additional features, commands to verify a user
+|       name or expand a mailing list.  This is done with the VRFY and
+|       EXPN commands, which have a character string arguments.  For the
+|       VRFY command, the string is a user name, and the the response may
+|       include the full name of the user and must include the mailbox of
+|       the user.  For the EXPN command, the string identifies a mailing
+|       list, and the multiline response may include the full name of the
+|       users and must give the mailboxes on the mailing list.
+|       The case of verifying a user name is straightforward as shown in
+|       example 3.
+|       -------------------------------------------------------------
+|                     Example of Verifying a User Name
+|          Either
+|             S: VRFY Postel
+|             R: 250 Jon Postel "
+|                                                                         <postel@isif>
+|                                                                           "
+|          Or
+|             S: VRFY Jones
+|             R: 550 String does not match anything.
+|                                Example 3
+|       -------------------------------------------------------------
+| [Page 8]                                                          Postel
+| 
+|                                                                         
+| RFC 788                                                    November 1981
+|                                            Simple Mail Transfer Protocol
+|       The case of expanding a mailbox list requires a multiline reply as
+|       shown in example 4.
+|       -------------------------------------------------------------
+|                   Example of Expanding a Mailing List
+|          Either
+|             S: EXPN Example-People
+|             R: 250-Jon Postel "
+|                                                                           <postel@isif>
+|                                                                             "
+|             R: 250-Fred Fonebone "
+|                                                                             <fonebone@isiq>
+|                                                                               "
+|             R: 250-Sam Q. Smith "
+|                                                                               <sqsmith@isiq>
+|                                                                                 "
+|             R: 250-Quincy Smith <@ISIF,Q-Smith@ISI-VAXA>
+|             R: 250-"
+|                                                                                 <joe@foo-unix>
+|                                                                                   "
+|             R: 250 "
+|                                                                                   <xyz@bar-unix>
+|                                                                                     "
+|          Or
+|             S: EXPN Executive-Washroom-List
+|             R: 550 Access Denied to You.
+|                                Example 4
+|       -------------------------------------------------------------
+|       The character string arguments of the VRFY and EXPN commands
+|       cannot be further restricted due to the variety of implementations
+|       of the user name and mailbox list concepts.  On some systems it
+|       may be appropriate for the argument of the EXPN command to be a
+|       file name for a file containing a mailing list, but again there is
+|       a variety of file naming conventions in the internet.
+|       The VRFY and EXPN commands are not included in the minimum
+|       implementation (Section 4.5.1), and are not required to work
+|       across relays when they are implemented.
+| Postel                                                          [Page 9]
+| 
+|                                                                         
+| November 1981                                                    RFC 788
+| Simple Mail Transfer Protocol                                           
+|    3.4.  SENDING AND MAILING
+|       The main purpose of SMTP is to deliver messages to user's
+|       mailboxes.  A very similar service provided by some hosts is to
+|       deliver messages to user's terminals (provided the user is active
+|       on the host).  The delivery to the user's mailbox is called
+|       "mailing", the delivery to the user's terminal is called
+|       "sending".  Because in many hosts the implementation of sending is
+|       nearly identical to the implementation of mailing these two
+|       functions are combined in SMTP.  However the sending commands are
+|       not included in the required minimum implementation
+|       (Section 4.5.1).  User's should have the ability to control the
+|       writing of messages on their terminals.  Most hosts permit the
+|       user's to accept or refuse such messages.
+|       The following three command are defined to support the sending
+|       options, these are used in the mail transaction instead of the
+|       MAIL comm