<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<?xml version="1.0" encoding="utf-8"?>
<HTML>
<BODY>

<!-- more atttribute with ordered list-->
<ol>
<li><i>Italic</i></li><li> Plain </li><li><i>Italic</i></li><li> Plain</li><li><b> Bold </b></li><br>
<li><b>Bold</b></li> <li><i>Italic</i></li> <li>Plain</li> <li><i>Italic</i></li> <li>Plain</li> <li><b>Bold</b></li><br>
</ol>

<!-- some spcial cases -->
<ol><li><p>p element without end tag; closed by next p start tag<p>closes previous p element with missing end tag</p></li><li><p>break element without end tag<br>break element without combined start and end tags<br></p></li><li><p><img height="19" width="19" src="../../test/testFiles/assets/surprised.png" align="right"></li><br><li><a href="http://www.google.com">dummy link 1; attribute "href" contains potentially troublesome characters</a><br/></li><li><a href='> " />'>dummy link 2; attribute 'href' contains potentially troublesome characters</a><br></li><li><A target=_self HRef>dummy link 3; mixed case for element and attribute name; unquoted attribute value; implied attribute value</a></li><li><u>underlined text</u></li><br><li><i>italicized text</i></li><br><li><b>bold text</b></li><br><li><font size="20" face="Verdana" color="#cc0066">larger, colored text with another font</font><br><u><b><i><font size="20" face="Verdana" color="#cc0066"><span>multiple formatting elements on the same span</span></font></i></b></u></li><br><li>&lt;&apos;&#38;&gt;&amp;&nbsp;&#x00A0;&quot;</li></p></li>
</ol>

</BODY>
</HTML> 
