<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>25822</bug_id>
          
          <creation_ts>2009-05-15 07:52:25 -0700</creation_ts>
          <short_desc>DOM normalize does not remove empty text node between element nodes</short_desc>
          <delta_ts>2009-05-18 14:16:27 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kai Brüning">kai</reporter>
          <assigned_to name="Darin Adler">darin</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>121515</commentid>
    <comment_count>0</comment_count>
    <who name="Kai Brüning">kai</who>
    <bug_when>2009-05-15 07:52:25 -0700</bug_when>
    <thetext>The DOM node normalize() function does not remove empty text nodes which are not adjacent to other text nodes nor the only child node.
That is, empty text nodes between element nodes or at the start or end of the child list are not removed.
This is clearly in contradiction to the DOM level 2 core specification.
Note also that it works in FireFox (tested with 3.0.10).
A test case is attached, a patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121516</commentid>
    <comment_count>1</comment_count>
      <attachid>30384</attachid>
    <who name="Kai Brüning">kai</who>
    <bug_when>2009-05-15 07:53:19 -0700</bug_when>
    <thetext>Created attachment 30384
Test case for this bug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121527</commentid>
    <comment_count>2</comment_count>
      <attachid>30390</attachid>
    <who name="Kai Brüning">kai</who>
    <bug_when>2009-05-15 09:23:19 -0700</bug_when>
    <thetext>Created attachment 30390
Patch to fix this bug

I do not have a Tiger machine to run layout tests, but I made sure that the set of failed layout tests under Leopard did not change by the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121537</commentid>
    <comment_count>3</comment_count>
      <attachid>30390</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-15 10:26:11 -0700</bug_when>
    <thetext>Comment on attachment 30390
Patch to fix this bug

&gt; -    for (; node; node = node-&gt;traverseNextNodePostOrder()) {
&gt; +    for (; node; ) {

Should be changed a while, then.

&gt; +        } else {
&gt; +            node = node-&gt;traverseNextNodePostOrder();

WebKit style doesn&apos;t use braces around single lines. Typically we&apos;d use &quot;early continue&quot; in a case like this:

    if (type != TEXT_NODE) {
        node = node-&gt;traverseNextNodePostOrder();
        continue;
    }

I&apos;d really like to see a more thorough set of test cases. Adding a test for only the single case that shows the current bug seems too minimal.

r=me as is -- none of my requested changes are mandatory</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121575</commentid>
    <comment_count>4</comment_count>
      <attachid>30400</attachid>
    <who name="Kai Brüning">kai</who>
    <bug_when>2009-05-15 13:51:35 -0700</bug_when>
    <thetext>Created attachment 30400
Path with suggested code changes

I integrated the code-level suggestions of Darin.
Adding more test will take a little longer; guess I expected tests for the other cases to already exist.
Should this be one file per tested case or is it ok to combine several cases into one test file?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121576</commentid>
    <comment_count>5</comment_count>
    <who name="Kai Brüning">kai</who>
    <bug_when>2009-05-15 13:56:36 -0700</bug_when>
    <thetext>One additional remark: I am a little puzzled by the fact that the original code carefully and specifically handled the &quot;single empty text node child&quot; case, but ignored the mixed empty text node/elements case. I just would feel better knowing the rationale behind that code.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121578</commentid>
    <comment_count>6</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-15 14:15:23 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Should this be one file per tested case or is it ok to combine several cases
&gt; into one test file?

A single test file is better. The key to making a good test is making sure you can understand what its testing and see what&apos;s failing and what&apos;s working.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121579</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-15 14:16:11 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; One additional remark: I am a little puzzled by the fact that the original code
&gt; carefully and specifically handled the &quot;single empty text node child&quot; case, but
&gt; ignored the mixed empty text node/elements case. I just would feel better
&gt; knowing the rationale behind that code.

You can look at the ChangeLog to see if there are any comments that make it clear. I doubt there was any rationale -- it was probably a simple mistake. I trust test cases more than I trust code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121683</commentid>
    <comment_count>8</comment_count>
      <attachid>30421</attachid>
    <who name="Kai Brüning">kai</who>
    <bug_when>2009-05-17 06:54:19 -0700</bug_when>
    <thetext>Created attachment 30421
Patch with more thorough set of test cases

I extended the test case to (hopefully) test the full range of the normalize() functionality. To express this, I renamed it to &quot;normalize.html&quot;. The test lives inside &quot;dom&quot;, therefore I consider the term &quot;normalize&quot; well defined. Please advice if a longer name is necessary.

Having these tests and after learning that document-&gt;textNodesMerged() does adjust DOMRanges to the changed text nodes and nothing more, I changed the code of Node::normalize() a little more to make it more concise and less historic.

Concerning rationale of the old code, I checked the ChangeLogs and found the entry about the addition of the &quot;single empty text node child&quot; case. It is indeed rather inexpressively, just stating the addition of this case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121685</commentid>
    <comment_count>9</comment_count>
      <attachid>30421</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-17 08:51:13 -0700</bug_when>
    <thetext>Comment on attachment 30421
Patch with more thorough set of test cases

&gt; +        // Merge non-empty text nodes.
&gt; +        while (1) {
&gt; +            Node* nextSibling = node-&gt;nextSibling();
&gt; +            if (!nextSibling || !nextSibling-&gt;isTextNode()) {
&gt; +                node = node-&gt;traverseNextNodePostOrder();
&gt; +                break;
&gt; +            }

I think it would be clearer to have the node = node-&gt;traverseNextNodePostOrder() line outside the if statement. I also would prefer to have a while condition instead of just while (1).

Here&apos;s how I&apos;d write it:

    while (Node* nextSibling = node-&gt;nextSibling()) {
        if (!nextSiblng-&gt;isTextNode())
            break;
        ...
    }

    node = node-&gt;traverseNextNodePostOrder();

Patch looks good, r=me even without that change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121686</commentid>
    <comment_count>10</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-17 09:02:47 -0700</bug_when>
    <thetext>I&apos;ll take care of landing this. I think I&apos;ll tweak the test a bit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121694</commentid>
    <comment_count>11</comment_count>
    <who name="Kai Brüning">kai</who>
    <bug_when>2009-05-17 11:11:22 -0700</bug_when>
    <thetext>&gt; I&apos;ll take care of landing this. I think I&apos;ll tweak the test a bit.

Great. Please tweak the code, too, as you suggested. I agree that both changes make it clearer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121830</commentid>
    <comment_count>12</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-05-18 14:16:27 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/43809</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>30384</attachid>
            <date>2009-05-15 07:53:19 -0700</date>
            <delta_ts>2009-05-15 07:53:19 -0700</delta_ts>
            <desc>Test case for this bug</desc>
            <filename>normalize-empty-textnode.html</filename>
            <type>text/html</type>
            <size>884</size>
            <attacher name="Kai Brüning">kai</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPgoJPHRpdGxlPk5vcm1hbGl6ZSBFbXB0eSBUZXh0bm9kZTwvdGl0bGU+Cjwv
aGVhZD4KPGJvZHk+CjxkaXYgaWQ9ImRlc2NyaXB0aW9uIj5UaGlzIHRlc3QgY2hlY2tzIHRvIHNl
ZSBpZiBub3JtYWxpemUgcmVtb3ZlcyBlbXB0eSB0ZXh0IG5vZGVzIGJldHdlZW4gZWxlbWVudCBu
b2Rlcy48L2Rpdj4KPGRpdiBpZD0idGVzdCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PGI+dGV4dDwv
Yj50ZXh0PGk+dGV4dDwvaT48L2Rpdj4KPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+Cgo8c2NyaXB0
PgoKaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikKICAgIGxheW91dFRlc3RDb250cm9s
bGVyLmR1bXBBc1RleHQoKTsKCmZ1bmN0aW9uIGxvZyhtZXNzYWdlKSB7CiAgICB2YXIgY29uc29s
ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb25zb2xlIik7CiAgICBjb25zb2xlLmFwcGVu
ZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG1lc3NhZ2UpKTsKICAgIGNvbnNvbGUuYXBw
ZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSk7Cn0KCnZhciB0ZXN0RGl2ID0g
ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3QiKTsKdmFyIG1pZGRsZVRleHROb2RlID0gdGVz
dERpdi5jaGlsZE5vZGVzWzFdOwptaWRkbGVUZXh0Tm9kZS5kYXRhID0gIiI7CnRlc3REaXYubm9y
bWFsaXplKCk7CgppZiAodGVzdERpdi5jaGlsZE5vZGVzWzFdICE9IG1pZGRsZVRleHROb2RlICYm
IHRlc3REaXYuY2hpbGROb2Rlcy5sZW5ndGggPT0gMikKICAgIGxvZygiUEFTU0VEIik7CmVsc2UK
ICAgIGxvZygiRkFJTCwgdGhlIGVtcHR5IHRleHQgbm9kZSBoYXMgbm90IGJlZW4gcmVtb3ZlZCIp
OwoKPC9zY3JpcHQ+CjwvYm9keT4KPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30390</attachid>
            <date>2009-05-15 09:23:19 -0700</date>
            <delta_ts>2009-05-15 13:51:35 -0700</delta_ts>
            <desc>Patch to fix this bug</desc>
            <filename>normalizePatch.txt</filename>
            <type>text/plain</type>
            <size>5729</size>
            <attacher name="Kai Brüning">kai</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0Mzc2OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMDktMDUtMTUgIEthaSBCcsO8bmluZyAgPGthaUBncmFudXMubmV0
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGJ1ZyAy
NTgyMjogRE9NIG5vcm1hbGl6ZSBkb2VzIG5vdCByZW1vdmUgZW1wdHkgdGV4dCBub2RlIGJldHdl
ZW4gZWxlbWVudCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjU4MjIKKworICAgICAgICBUZXN0OiBmYXN0L2RvbS9ub3JtYWxpemUtZW1wdHkt
dGV4dG5vZGUuaHRtbAorCisgICAgICAgICogZG9tL05vZGUuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6Tm9kZTo6bm9ybWFsaXplKTogY2hhbmdlZCB0byByZW1vdmUgZW1wdHkgdGV4dCBub2RlcyB3
aGljaCBjYW4gbm90IGJlIGpvaW5lZAorCiAyMDA5LTA1LTE1ICBBbGV4ZXkgUHJvc2t1cnlha292
ICA8YXBAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlciwgQnJh
ZHkgRWlkc29uIGFuZCBFcmljIENhcmxzb24uCkluZGV4OiBXZWJDb3JlL2RvbS9Ob2RlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9Ob2RlLmNwcAkocmV2aXNpb24gNDM3NjYpCisrKyBX
ZWJDb3JlL2RvbS9Ob2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTY2LDMwICs1NjYsMzMgQEAg
dm9pZCBOb2RlOjpub3JtYWxpemUoKQogICAgIFJlZlB0cjxOb2RlPiBub2RlID0gdGhpczsKICAg
ICB3aGlsZSAoTm9kZSogZmlyc3RDaGlsZCA9IG5vZGUtPmZpcnN0Q2hpbGQoKSkKICAgICAgICAg
bm9kZSA9IGZpcnN0Q2hpbGQ7Ci0gICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJz
ZU5leHROb2RlUG9zdE9yZGVyKCkpIHsKKyAgICBmb3IgKDsgbm9kZTsgKSB7CiAgICAgICAgIE5v
ZGVUeXBlIHR5cGUgPSBub2RlLT5ub2RlVHlwZSgpOwogICAgICAgICBpZiAodHlwZSA9PSBFTEVN
RU5UX05PREUpCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZS5nZXQoKSkt
Pm5vcm1hbGl6ZUF0dHJpYnV0ZXMoKTsKIAotICAgICAgICBOb2RlKiBmaXJzdENoaWxkID0gbm9k
ZS0+Zmlyc3RDaGlsZCgpOwotICAgICAgICBpZiAoZmlyc3RDaGlsZCAmJiAhZmlyc3RDaGlsZC0+
bmV4dFNpYmxpbmcoKSAmJiBmaXJzdENoaWxkLT5pc1RleHROb2RlKCkpIHsKLSAgICAgICAgICAg
IFRleHQqIHRleHQgPSBzdGF0aWNfY2FzdDxUZXh0Kj4oZmlyc3RDaGlsZCk7Ci0gICAgICAgICAg
ICBpZiAoIXRleHQtPmxlbmd0aCgpKSB7Ci0gICAgICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSBl
YzsKLSAgICAgICAgICAgICAgICB0ZXh0LT5yZW1vdmUoZWMpOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0KICAgICAgICAgaWYgKG5vZGUgPT0gdGhpcykKICAgICAgICAgICAgIGJyZWFrOwog
CiAgICAgICAgIGlmICh0eXBlID09IFRFWFRfTk9ERSkgeworICAgICAgICAgICAgLy8gVGhlIGZv
bGxvd2luZyBsb29wIGNvdWxkIHByb2JhYmx5IGJlIGZ1cnRoZXIgc2ltcGx5ZmllZCwgYnV0IHdo
ZW4gZml4aW5nIGJ1ZyAjMjU4MjIgSQorICAgICAgICAgICAgLy8gdHJpZWQgdG8gZG8gbWluaW1h
bCBjaGFuZ2VzLiBTcGVjaWZpY2FsbHkgdGhpcyBzb2x1dGlvbiBsZWF2ZXMgdGhlIGNhbGwgb2YK
KyAgICAgICAgICAgIC8vIGRvY3VtZW50KCktPnRleHROb2Rlc01lcmdlZCgpIHdoZW4gYW4gZW1w
dHkgdGV4dCBub2RlIGlzIG1lcmdlZCB3aXRoIGFub3RoZXIgdGV4dCBub2RlCisgICAgICAgICAg
ICAvLyBhcyBiZWZvcmUuCiAgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAg
IFRleHQqIHRleHQgPSBzdGF0aWNfY2FzdDxUZXh0Kj4obm9kZS5nZXQoKSk7CiAgICAgICAgICAg
ICAgICAgTm9kZSogbmV4dFNpYmxpbmcgPSBub2RlLT5uZXh0U2libGluZygpOwotICAgICAgICAg
ICAgICAgIGlmICghbmV4dFNpYmxpbmcgfHwgIW5leHRTaWJsaW5nLT5pc1RleHROb2RlKCkpCisg
ICAgICAgICAgICAgICAgaWYgKCFuZXh0U2libGluZyB8fCAhbmV4dFNpYmxpbmctPmlzVGV4dE5v
ZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc2luZ2xlIGVtcHR5IHRleHQg
bm9kZXMuIENhcmUgbXVzdCBiZSB0YWtlbiB0byBnZXQgdGhlIG5leHQKKyAgICAgICAgICAgICAg
ICAgICAgLy8gbm9kZSBiZWZvcmUgcmVtb3ZpbmcgdGhlIGN1cnJlbnQgbm9kZS4KKyAgICAgICAg
ICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGVQb3N0T3JkZXIoKTsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0LT5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgRXhjZXB0aW9uQ29kZSBlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQt
PnJlbW92ZShlYyk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY2hp
bGQgYW5kIHRoZSBuZXh0IG9uZSBhcmUgYm90aCB0ZXh0IG5vZGVzLiBNZXJnZSB0aGVtLgotICAg
ICAgICAgICAgICAgIFRleHQqIHRleHQgPSBzdGF0aWNfY2FzdDxUZXh0Kj4obm9kZS5nZXQoKSk7
CiAgICAgICAgICAgICAgICAgUmVmUHRyPFRleHQ+IG5leHRUZXh0ID0gc3RhdGljX2Nhc3Q8VGV4
dCo+KG5leHRTaWJsaW5nKTsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSB0ZXh0
LT5sZW5ndGgoKTsKICAgICAgICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVjOwpAQCAtNTk3LDYg
KzYwMCw4IEBAIHZvaWQgTm9kZTo6bm9ybWFsaXplKCkKICAgICAgICAgICAgICAgICBkb2N1bWVu
dCgpLT50ZXh0Tm9kZXNNZXJnZWQobmV4dFRleHQuZ2V0KCksIG9mZnNldCk7CiAgICAgICAgICAg
ICAgICAgbmV4dFRleHQtPnJlbW92ZShlYyk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZVBvc3RPcmRlcigp
OwogICAgICAgICB9CiAgICAgfQogfQpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNDM3NjkpCisrKyBMYXlv
dXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0w
NS0xNSAgS2FpIEJyw7xuaW5nICA8a2FpQGdyYW51cy5uZXQ+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUZXN0IGNhc2UgZm9yIGJ1ZyAy
NTgyMjogRE9NIG5vcm1hbGl6ZSBkb2VzIG5vdCByZW1vdmUgZW1wdHkgdGV4dCBub2RlIGJldHdl
ZW4gZWxlbWVudCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjU4MjIKKworICAgICAgICAqIGZhc3QvZG9tL25vcm1hbGl6ZS1lbXB0eS10ZXh0
bm9kZS1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGZhc3QvZG9tL25vcm1hbGl6ZS1l
bXB0eS10ZXh0bm9kZS5odG1sOiBBZGRlZC4KKwogMjAwOS0wNS0xNSAgRXJpYyBTZWlkZWwgIDxl
cmljQHdlYmtpdC5vcmc+CiAKICAgICAgICAgTWFyayBSb3dlIHNheXMgc2tpcHBpbmcgdGVzdHMg
ZG9lc24ndCBuZWVkIHJldmlldy4gOikKSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvZG9tL25vcm1h
bGl6ZS1lbXB0eS10ZXh0bm9kZS1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVz
dHMvZmFzdC9kb20vbm9ybWFsaXplLWVtcHR5LXRleHRub2RlLWV4cGVjdGVkLnR4dAkocmV2aXNp
b24gMCkKKysrIExheW91dFRlc3RzL2Zhc3QvZG9tL25vcm1hbGl6ZS1lbXB0eS10ZXh0bm9kZS1l
eHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMyBAQAorVGhpcyB0ZXN0IGNoZWNr
cyB0byBzZWUgaWYgbm9ybWFsaXplIHJlbW92ZXMgZW1wdHkgdGV4dCBub2RlcyBiZXR3ZWVuIGVs
ZW1lbnQgbm9kZXMuCitQQVNTRUQKKwpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9kb20vbm9ybWFs
aXplLWVtcHR5LXRleHRub2RlLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9k
b20vbm9ybWFsaXplLWVtcHR5LXRleHRub2RlLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRU
ZXN0cy9mYXN0L2RvbS9ub3JtYWxpemUtZW1wdHktdGV4dG5vZGUuaHRtbAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwzMyBAQAorPGh0bWw+Cis8aGVhZD4KKwk8dGl0bGU+Tm9ybWFsaXplIEVtcHR5
IFRleHRub2RlPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBpZD0iZGVzY3JpcHRpb24i
PlRoaXMgdGVzdCBjaGVja3MgdG8gc2VlIGlmIG5vcm1hbGl6ZSByZW1vdmVzIGVtcHR5IHRleHQg
bm9kZXMgYmV0d2VlbiBlbGVtZW50IG5vZGVzLjwvZGl2PgorPGRpdiBpZD0idGVzdCIgc3R5bGU9
ImRpc3BsYXk6bm9uZSI+PGI+dGV4dDwvYj50ZXh0PGk+dGV4dDwvaT48L2Rpdj4KKzxkaXYgaWQ9
ImNvbnNvbGUiPjwvZGl2PgorCis8c2NyaXB0PgorCitpZiAod2luZG93LmxheW91dFRlc3RDb250
cm9sbGVyKQorICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKworZnVuY3Rp
b24gbG9nKG1lc3NhZ2UpIHsKKyAgICB2YXIgY29uc29sZSA9IGRvY3VtZW50LmdldEVsZW1lbnRC
eUlkKCJjb25zb2xlIik7CisgICAgY29uc29sZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVU
ZXh0Tm9kZShtZXNzYWdlKSk7CisgICAgY29uc29sZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVh
dGVFbGVtZW50KCdicicpKTsKK30KKwordmFyIHRlc3REaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50
QnlJZCgidGVzdCIpOwordmFyIG1pZGRsZVRleHROb2RlID0gdGVzdERpdi5jaGlsZE5vZGVzWzFd
OworbWlkZGxlVGV4dE5vZGUuZGF0YSA9ICIiOwordGVzdERpdi5ub3JtYWxpemUoKTsKKworaWYg
KHRlc3REaXYuY2hpbGROb2Rlc1sxXSAhPSBtaWRkbGVUZXh0Tm9kZSAmJiB0ZXN0RGl2LmNoaWxk
Tm9kZXMubGVuZ3RoID09IDIpCisgICAgbG9nKCJQQVNTRUQiKTsKK2Vsc2UKKyAgICBsb2coIkZB
SUwsIHRoZSBlbXB0eSB0ZXh0IG5vZGUgaGFzIG5vdCBiZWVuIHJlbW92ZWQiKTsKKworPC9zY3Jp
cHQ+Cis8L2JvZHk+Cis8L2h0bWw+CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0cy9m
YXN0L2RvbS9ub3JtYWxpemUtZW1wdHktdGV4dG5vZGUuaHRtbApfX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBz
dm46bWltZS10eXBlCiAgICsgdGV4dC9odG1sCgo=
</data>
<flag name="review"
          id="15318"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30400</attachid>
            <date>2009-05-15 13:51:35 -0700</date>
            <delta_ts>2009-05-17 06:54:19 -0700</delta_ts>
            <desc>Path with suggested code changes</desc>
            <filename>normalizePatch.txt</filename>
            <type>text/plain</type>
            <size>6211</size>
            <attacher name="Kai Brüning">kai</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0Mzc2OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMDktMDUtMTUgIEthaSBCcsO8bmluZyAgPGthaUBncmFudXMubmV0
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGJ1ZyAy
NTgyMjogRE9NIG5vcm1hbGl6ZSBkb2VzIG5vdCByZW1vdmUgZW1wdHkgdGV4dCBub2RlIGJldHdl
ZW4gZWxlbWVudCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjU4MjIKKworICAgICAgICBUZXN0OiBmYXN0L2RvbS9ub3JtYWxpemUtZW1wdHkt
dGV4dG5vZGUuaHRtbAorCisgICAgICAgICogZG9tL05vZGUuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6Tm9kZTo6bm9ybWFsaXplKTogY2hhbmdlZCB0byByZW1vdmUgZW1wdHkgdGV4dCBub2RlcyB3
aGljaCBjYW4gbm90IGJlIGpvaW5lZAorCiAyMDA5LTA1LTE1ICBBbGV4ZXkgUHJvc2t1cnlha292
ICA8YXBAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlciwgQnJh
ZHkgRWlkc29uIGFuZCBFcmljIENhcmxzb24uCkluZGV4OiBXZWJDb3JlL2RvbS9Ob2RlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9Ob2RlLmNwcAkocmV2aXNpb24gNDM3NjYpCisrKyBX
ZWJDb3JlL2RvbS9Ob2RlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTY2LDM3ICs1NjYsNDMgQEAg
dm9pZCBOb2RlOjpub3JtYWxpemUoKQogICAgIFJlZlB0cjxOb2RlPiBub2RlID0gdGhpczsKICAg
ICB3aGlsZSAoTm9kZSogZmlyc3RDaGlsZCA9IG5vZGUtPmZpcnN0Q2hpbGQoKSkKICAgICAgICAg
bm9kZSA9IGZpcnN0Q2hpbGQ7Ci0gICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJz
ZU5leHROb2RlUG9zdE9yZGVyKCkpIHsKKyAgICB3aGlsZSAobm9kZSkgewogICAgICAgICBOb2Rl
VHlwZSB0eXBlID0gbm9kZS0+bm9kZVR5cGUoKTsKICAgICAgICAgaWYgKHR5cGUgPT0gRUxFTUVO
VF9OT0RFKQogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUuZ2V0KCkpLT5u
b3JtYWxpemVBdHRyaWJ1dGVzKCk7CiAKLSAgICAgICAgTm9kZSogZmlyc3RDaGlsZCA9IG5vZGUt
PmZpcnN0Q2hpbGQoKTsKLSAgICAgICAgaWYgKGZpcnN0Q2hpbGQgJiYgIWZpcnN0Q2hpbGQtPm5l
eHRTaWJsaW5nKCkgJiYgZmlyc3RDaGlsZC0+aXNUZXh0Tm9kZSgpKSB7Ci0gICAgICAgICAgICBU
ZXh0KiB0ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCo+KGZpcnN0Q2hpbGQpOwotICAgICAgICAgICAg
aWYgKCF0ZXh0LT5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWM7
Ci0gICAgICAgICAgICAgICAgdGV4dC0+cmVtb3ZlKGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotCiAgICAgICAgIGlmIChub2RlID09IHRoaXMpCiAgICAgICAgICAgICBicmVhazsKIAot
ICAgICAgICBpZiAodHlwZSA9PSBURVhUX05PREUpIHsKLSAgICAgICAgICAgIHdoaWxlICgxKSB7
Ci0gICAgICAgICAgICAgICAgTm9kZSogbmV4dFNpYmxpbmcgPSBub2RlLT5uZXh0U2libGluZygp
OwotICAgICAgICAgICAgICAgIGlmICghbmV4dFNpYmxpbmcgfHwgIW5leHRTaWJsaW5nLT5pc1Rl
eHROb2RlKCkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIC8v
IEN1cnJlbnQgY2hpbGQgYW5kIHRoZSBuZXh0IG9uZSBhcmUgYm90aCB0ZXh0IG5vZGVzLiBNZXJn
ZSB0aGVtLgotICAgICAgICAgICAgICAgIFRleHQqIHRleHQgPSBzdGF0aWNfY2FzdDxUZXh0Kj4o
bm9kZS5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgUmVmUHRyPFRleHQ+IG5leHRUZXh0ID0gc3Rh
dGljX2Nhc3Q8VGV4dCo+KG5leHRTaWJsaW5nKTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBv
ZmZzZXQgPSB0ZXh0LT5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVj
OwotICAgICAgICAgICAgICAgIHRleHQtPmFwcGVuZERhdGEobmV4dFRleHQtPmRhdGEoKSwgZWMp
OwotICAgICAgICAgICAgICAgIGRvY3VtZW50KCktPnRleHROb2Rlc01lcmdlZChuZXh0VGV4dC5n
ZXQoKSwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBuZXh0VGV4dC0+cmVtb3ZlKGVjKTsKKyAg
ICAgICAgaWYgKHR5cGUgIT0gVEVYVF9OT0RFKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+
dHJhdmVyc2VOZXh0Tm9kZVBvc3RPcmRlcigpOworICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbG9vcCBjb3VsZCBwcm9i
YWJseSBiZSBmdXJ0aGVyIHNpbXBseWZpZWQsIGJ1dCB3aGVuIGZpeGluZyBidWcgIzI1ODIyIEkK
KyAgICAgICAgLy8gdHJpZWQgdG8gZG8gbWluaW1hbCBjaGFuZ2VzLiBTcGVjaWZpY2FsbHkgdGhp
cyBzb2x1dGlvbiBsZWF2ZXMgdGhlIGNhbGwgb2YKKyAgICAgICAgLy8gZG9jdW1lbnQoKS0+dGV4
dE5vZGVzTWVyZ2VkKCkgd2hlbiBhbiBlbXB0eSB0ZXh0IG5vZGUgaXMgbWVyZ2VkIHdpdGggYW5v
dGhlciB0ZXh0IG5vZGUKKyAgICAgICAgLy8gYXMgYmVmb3JlLgorICAgICAgICB3aGlsZSAoMSkg
eworICAgICAgICAgICAgVGV4dCogdGV4dCA9IHN0YXRpY19jYXN0PFRleHQqPihub2RlLmdldCgp
KTsKKyAgICAgICAgICAgIE5vZGUqIG5leHRTaWJsaW5nID0gbm9kZS0+bmV4dFNpYmxpbmcoKTsK
KyAgICAgICAgICAgIGlmICghbmV4dFNpYmxpbmcgfHwgIW5leHRTaWJsaW5nLT5pc1RleHROb2Rl
KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc2luZ2xlIGVtcHR5IHRleHQgbm9kZXMu
IENhcmUgbXVzdCBiZSB0YWtlbiB0byBnZXQgdGhlIG5leHQKKyAgICAgICAgICAgICAgICAvLyBu
b2RlIGJlZm9yZSByZW1vdmluZyB0aGUgY3VycmVudCBub2RlLgorICAgICAgICAgICAgICAgIG5v
ZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlUG9zdE9yZGVyKCk7CisgICAgICAgICAgICAgICAg
aWYgKCF0ZXh0LT5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25Db2Rl
IGVjOworICAgICAgICAgICAgICAgICAgICB0ZXh0LT5yZW1vdmUoZWMpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IC8vIEN1cnJlbnQgY2hpbGQgYW5kIHRoZSBuZXh0IG9uZSBhcmUgYm90aCB0ZXh0IG5vZGVzLiBN
ZXJnZSB0aGVtLgorICAgICAgICAgICAgUmVmUHRyPFRleHQ+IG5leHRUZXh0ID0gc3RhdGljX2Nh
c3Q8VGV4dCo+KG5leHRTaWJsaW5nKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG9mZnNldCA9IHRl
eHQtPmxlbmd0aCgpOworICAgICAgICAgICAgRXhjZXB0aW9uQ29kZSBlYzsKKyAgICAgICAgICAg
IHRleHQtPmFwcGVuZERhdGEobmV4dFRleHQtPmRhdGEoKSwgZWMpOworICAgICAgICAgICAgZG9j
dW1lbnQoKS0+dGV4dE5vZGVzTWVyZ2VkKG5leHRUZXh0LmdldCgpLCBvZmZzZXQpOworICAgICAg
ICAgICAgbmV4dFRleHQtPnJlbW92ZShlYyk7CiAgICAgICAgIH0KICAgICB9CiB9CkluZGV4OiBM
YXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0Mzc2OSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5
KQpAQCAtMSwzICsxLDEzIEBACisyMDA5LTA1LTE1ICBLYWkgQnLDvG5pbmcgIDxrYWlAZ3JhbnVz
Lm5ldD4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKyAgICAgICAgCisg
ICAgICAgIFRlc3QgY2FzZSBmb3IgYnVnIDI1ODIyOiBET00gbm9ybWFsaXplIGRvZXMgbm90IHJl
bW92ZSBlbXB0eSB0ZXh0IG5vZGUgYmV0d2VlbiBlbGVtZW50IG5vZGVzCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTgyMgorCisgICAgICAgICogZmFz
dC9kb20vbm9ybWFsaXplLWVtcHR5LXRleHRub2RlLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAg
ICAgICogZmFzdC9kb20vbm9ybWFsaXplLWVtcHR5LXRleHRub2RlLmh0bWw6IEFkZGVkLgorCiAy
MDA5LTA1LTE1ICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBNYXJr
IFJvd2Ugc2F5cyBza2lwcGluZyB0ZXN0cyBkb2Vzbid0IG5lZWQgcmV2aWV3LiA6KQpJbmRleDog
TGF5b3V0VGVzdHMvZmFzdC9kb20vbm9ybWFsaXplLWVtcHR5LXRleHRub2RlLWV4cGVjdGVkLnR4
dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2RvbS9ub3JtYWxpemUtZW1wdHktdGV4
dG5vZGUtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9kb20v
bm9ybWFsaXplLWVtcHR5LXRleHRub2RlLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwzIEBACitUaGlzIHRlc3QgY2hlY2tzIHRvIHNlZSBpZiBub3JtYWxpemUgcmVtb3ZlcyBl
bXB0eSB0ZXh0IG5vZGVzIGJldHdlZW4gZWxlbWVudCBub2Rlcy4KK1BBU1NFRAorCkluZGV4OiBM
YXlvdXRUZXN0cy9mYXN0L2RvbS9ub3JtYWxpemUtZW1wdHktdGV4dG5vZGUuaHRtbAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2RvbS9ub3JtYWxpemUtZW1wdHktdGV4dG5vZGUuaHRt
bAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Zhc3QvZG9tL25vcm1hbGl6ZS1lbXB0eS10
ZXh0bm9kZS5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDMzIEBACis8aHRtbD4KKzxoZWFk
PgorCTx0aXRsZT5Ob3JtYWxpemUgRW1wdHkgVGV4dG5vZGU8L3RpdGxlPgorPC9oZWFkPgorPGJv
ZHk+Cis8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+VGhpcyB0ZXN0IGNoZWNrcyB0byBzZWUgaWYgbm9y
bWFsaXplIHJlbW92ZXMgZW1wdHkgdGV4dCBub2RlcyBiZXR3ZWVuIGVsZW1lbnQgbm9kZXMuPC9k
aXY+Cis8ZGl2IGlkPSJ0ZXN0IiBzdHlsZT0iZGlzcGxheTpub25lIj48Yj50ZXh0PC9iPnRleHQ8
aT50ZXh0PC9pPjwvZGl2PgorPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+CisKKzxzY3JpcHQ+CisK
K2lmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAgbGF5b3V0VGVzdENvbnRyb2xs
ZXIuZHVtcEFzVGV4dCgpOworCitmdW5jdGlvbiBsb2cobWVzc2FnZSkgeworICAgIHZhciBjb25z
b2xlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnNvbGUiKTsKKyAgICBjb25zb2xlLmFw
cGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG1lc3NhZ2UpKTsKKyAgICBjb25zb2xl
LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJykpOworfQorCit2YXIgdGVz
dERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0Iik7Cit2YXIgbWlkZGxlVGV4dE5v
ZGUgPSB0ZXN0RGl2LmNoaWxkTm9kZXNbMV07CittaWRkbGVUZXh0Tm9kZS5kYXRhID0gIiI7Cit0
ZXN0RGl2Lm5vcm1hbGl6ZSgpOworCitpZiAodGVzdERpdi5jaGlsZE5vZGVzWzFdICE9IG1pZGRs
ZVRleHROb2RlICYmIHRlc3REaXYuY2hpbGROb2Rlcy5sZW5ndGggPT0gMikKKyAgICBsb2coIlBB
U1NFRCIpOworZWxzZQorICAgIGxvZygiRkFJTCwgdGhlIGVtcHR5IHRleHQgbm9kZSBoYXMgbm90
IGJlZW4gcmVtb3ZlZCIpOworCis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KClByb3BlcnR5
IGNoYW5nZXMgb246IExheW91dFRlc3RzL2Zhc3QvZG9tL25vcm1hbGl6ZS1lbXB0eS10ZXh0bm9k
ZS5odG1sCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjptaW1lLXR5cGUKICAgKyB0ZXh0L2h0bWwKCg==
</data>
<flag name="review"
          id="15327"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30421</attachid>
            <date>2009-05-17 06:54:19 -0700</date>
            <delta_ts>2009-05-17 08:51:13 -0700</delta_ts>
            <desc>Patch with more thorough set of test cases</desc>
            <filename>normalizePatch.txt</filename>
            <type>text/plain</type>
            <size>11443</size>
            <attacher name="Kai Brüning">kai</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0Mzc2OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMDktMDUtMTcgIEthaSBCcsO8bmluZyAgPGthaUBncmFudXMubmV0
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGJ1ZyAy
NTgyMjogRE9NIG5vcm1hbGl6ZSBkb2VzIG5vdCByZW1vdmUgZW1wdHkgdGV4dCBub2RlIGJldHdl
ZW4gZWxlbWVudCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjU4MjIKKworICAgICAgICBUZXN0OiBmYXN0L2RvbS9ub3JtYWxpemUuaHRtbAor
CisgICAgICAgICogZG9tL05vZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6bm9ybWFs
aXplKTogY2hhbmdlZCB0byByZW1vdmUgYW55IGVtcHR5IHRleHQgbm9kZXMKKwogMjAwOS0wNS0x
NSAgQWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgRGFyaW4gQWRsZXIsIEJyYWR5IEVpZHNvbiBhbmQgRXJpYyBDYXJsc29uLgpJbmRleDog
V2ViQ29yZS9kb20vTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vTm9kZS5jcHAJ
KHJldmlzaW9uIDQzNzY2KQorKysgV2ViQ29yZS9kb20vTm9kZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTU2MSw0MiArNTYxLDUyIEBAIHZvaWQgTm9kZTo6cmVtb3ZlKEV4Y2VwdGlvbkNvZGUmIGVj
KQogdm9pZCBOb2RlOjpub3JtYWxpemUoKQogewogICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnRy
ZWUgYmVuZWF0aCB1cywgbm9ybWFsaXppbmcgYWxsIG5vZGVzLiBUaGlzIG1lYW5zIHRoYXQKLSAg
ICAvLyBhbnkgdHdvIGFkamFjZW50IHRleHQgbm9kZXMgYXJlIG1lcmdlZCB0b2dldGhlci4KKyAg
ICAvLyBhbnkgdHdvIGFkamFjZW50IHRleHQgbm9kZXMgYXJlIG1lcmdlZCB0b2dldGhlciBhbmQg
YW55IGVtcHR5IHRleHQgbm9kZXMgYXJlIHJlbW92ZWQuCiAKICAgICBSZWZQdHI8Tm9kZT4gbm9k
ZSA9IHRoaXM7CiAgICAgd2hpbGUgKE5vZGUqIGZpcnN0Q2hpbGQgPSBub2RlLT5maXJzdENoaWxk
KCkpCiAgICAgICAgIG5vZGUgPSBmaXJzdENoaWxkOwotICAgIGZvciAoOyBub2RlOyBub2RlID0g
bm9kZS0+dHJhdmVyc2VOZXh0Tm9kZVBvc3RPcmRlcigpKSB7CisgICAgd2hpbGUgKG5vZGUpIHsK
ICAgICAgICAgTm9kZVR5cGUgdHlwZSA9IG5vZGUtPm5vZGVUeXBlKCk7CiAgICAgICAgIGlmICh0
eXBlID09IEVMRU1FTlRfTk9ERSkKICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVsZW1lbnQqPihu
b2RlLmdldCgpKS0+bm9ybWFsaXplQXR0cmlidXRlcygpOwogCi0gICAgICAgIE5vZGUqIGZpcnN0
Q2hpbGQgPSBub2RlLT5maXJzdENoaWxkKCk7Ci0gICAgICAgIGlmIChmaXJzdENoaWxkICYmICFm
aXJzdENoaWxkLT5uZXh0U2libGluZygpICYmIGZpcnN0Q2hpbGQtPmlzVGV4dE5vZGUoKSkgewot
ICAgICAgICAgICAgVGV4dCogdGV4dCA9IHN0YXRpY19jYXN0PFRleHQqPihmaXJzdENoaWxkKTsK
LSAgICAgICAgICAgIGlmICghdGV4dC0+bGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBFeGNl
cHRpb25Db2RlIGVjOwotICAgICAgICAgICAgICAgIHRleHQtPnJlbW92ZShlYyk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBpZiAobm9kZSA9PSB0aGlzKQogICAgICAgICAg
ICAgYnJlYWs7CiAKLSAgICAgICAgaWYgKHR5cGUgPT0gVEVYVF9OT0RFKSB7Ci0gICAgICAgICAg
ICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgIE5vZGUqIG5leHRTaWJsaW5nID0gbm9kZS0+
bmV4dFNpYmxpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5leHRTaWJsaW5nIHx8ICFuZXh0
U2libGluZy0+aXNUZXh0Tm9kZSgpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgICAgICAvLyBDdXJyZW50IGNoaWxkIGFuZCB0aGUgbmV4dCBvbmUgYXJlIGJvdGggdGV4
dCBub2Rlcy4gTWVyZ2UgdGhlbS4KLSAgICAgICAgICAgICAgICBUZXh0KiB0ZXh0ID0gc3RhdGlj
X2Nhc3Q8VGV4dCo+KG5vZGUuZ2V0KCkpOwotICAgICAgICAgICAgICAgIFJlZlB0cjxUZXh0PiBu
ZXh0VGV4dCA9IHN0YXRpY19jYXN0PFRleHQqPihuZXh0U2libGluZyk7CisgICAgICAgIGlmICh0
eXBlICE9IFRFWFRfTk9ERSkgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4
dE5vZGVQb3N0T3JkZXIoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBUZXh0KiB0ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCo+KG5vZGUuZ2V0KCkp
OworICAgICAgICAKKyAgICAgICAgLy8gUmVtb3ZlIGVtcHR5IHRleHQgbm9kZXMuCisgICAgICAg
IGlmICghdGV4dC0+bGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIC8vIENhcmUgbXVzdCBiZSB0YWtl
biB0byBnZXQgdGhlIG5leHQgbm9kZSBiZWZvcmUgcmVtb3ZpbmcgdGhlIGN1cnJlbnQgbm9kZS4K
KyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlUG9zdE9yZGVyKCk7Cisg
ICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVjOworICAgICAgICAgICAgdGV4dC0+cmVtb3ZlKGVj
KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWVyZ2Ug
bm9uLWVtcHR5IHRleHQgbm9kZXMuCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBO
b2RlKiBuZXh0U2libGluZyA9IG5vZGUtPm5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICBpZiAo
IW5leHRTaWJsaW5nIHx8ICFuZXh0U2libGluZy0+aXNUZXh0Tm9kZSgpKSB7CisgICAgICAgICAg
ICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGVQb3N0T3JkZXIoKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEN1cnJlbnQgY2hp
bGQgYW5kIHRoZSBuZXh0IG9uZSBhcmUgYm90aCBub24tZW1wdHkgdGV4dCBub2Rlcy4gTWVyZ2Ug
dGhlbS4KKyAgICAgICAgICAgIFJlZlB0cjxUZXh0PiBuZXh0VGV4dCA9IHN0YXRpY19jYXN0PFRl
eHQqPihuZXh0U2libGluZyk7CisgICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVjOworICAgICAg
ICAgICAgLy8gRm9yIGNvbnNpc3RlbmN5IGVtcHR5IG5vZGVzIGFyZSBhbHdheXMgcmVtb3ZlZCB3
aXRob3V0IG1lcmdpbmcgdGhlbS4KKyAgICAgICAgICAgIGlmIChuZXh0VGV4dC0+bGVuZ3RoKCkp
IHsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSB0ZXh0LT5sZW5ndGgoKTsKLSAg
ICAgICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVjOwogICAgICAgICAgICAgICAgIHRleHQtPmFw
cGVuZERhdGEobmV4dFRleHQtPmRhdGEoKSwgZWMpOwogICAgICAgICAgICAgICAgIGRvY3VtZW50
KCktPnRleHROb2Rlc01lcmdlZChuZXh0VGV4dC5nZXQoKSwgb2Zmc2V0KTsKLSAgICAgICAgICAg
ICAgICBuZXh0VGV4dC0+cmVtb3ZlKGVjKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5l
eHRUZXh0LT5yZW1vdmUoZWMpOwogICAgICAgICB9CiAgICAgfQogfQpJbmRleDogTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNp
b24gNDM3NjkpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSwxNSBAQAorMjAwOS0wNS0xNyAgS2FpIEJyw7xuaW5nICA8a2FpQGdyYW51cy5uZXQ+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBU
ZXN0IGNhc2UgZm9yIGJ1ZyAyNTgyMjogRE9NIG5vcm1hbGl6ZSBkb2VzIG5vdCByZW1vdmUgZW1w
dHkgdGV4dCBub2RlIGJldHdlZW4gZWxlbWVudCBub2RlcworICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjU4MjIKKyAgICAgICAgCisgICAgICAgIFRoZSB0
ZXN0IGNhc2Ugc3RyaXZlcyB0byB0ZXN0IHRoZSB3aG9sZSBmdW5jdGlvbmFsaXR5IG9mIG5vcm1h
bGl6ZSgpLgorCisgICAgICAgICogZmFzdC9kb20vbm9ybWFsaXplLWV4cGVjdGVkLnR4dDogQWRk
ZWQuCisgICAgICAgICogZmFzdC9kb20vbm9ybWFsaXplLmh0bWw6IEFkZGVkLgorCiAyMDA5LTA1
LTE1ICBFcmljIFNlaWRlbCAgPGVyaWNAd2Via2l0Lm9yZz4KIAogICAgICAgICBNYXJrIFJvd2Ug
c2F5cyBza2lwcGluZyB0ZXN0cyBkb2Vzbid0IG5lZWQgcmV2aWV3LiA6KQpJbmRleDogTGF5b3V0
VGVzdHMvZmFzdC9kb20vbm9ybWFsaXplLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlv
dXRUZXN0cy9mYXN0L2RvbS9ub3JtYWxpemUtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysg
TGF5b3V0VGVzdHMvZmFzdC9kb20vbm9ybWFsaXplLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwxMiBAQAorU2V2ZXJhbCB0ZXN0cyBvZiB0aGUgRE9NIG5vcm1hbGl6ZSgpIGZ1
bmN0aW9uLgordGVzdDEgKHR3byBub24tZW1wdHkgdGV4dCBub2Rlcyk6IFBBU1NFRAordGVzdDIg
KHRocmVlIG5vbi1lbXB0eSB0ZXh0IG5vZGVzKTogUEFTU0VECit0ZXN0MyAobm9uLWVtcHR5IHRl
eHQgbm9kZXMgbWl4ZWQgd2l0aCBlbGVtZW50cyk6IFBBU1NFRAordGVzdDQgKHNpbmdsZSBlbXB0
eSB0ZXh0IG5vZGUpOiBQQVNTRUQKK3Rlc3Q1IChlbXB0eSB0ZXh0IG5vZGUgYmV0d2VlbiBlbGVt
ZW50cyk6IFBBU1NFRAordGVzdDYgKGVtcHR5IHRleHQgbm9kZXMgYmVmb3JlIG5vbi1lbXB0eSBu
b2RlKTogUEFTU0VECit0ZXN0NyAoZW1wdHkgdGV4dCBub2RlcyBhZnRlciBub24tZW1wdHkgbm9k
ZSk6IFBBU1NFRAordGVzdDggKGVtcHR5IHRleHQgbm9kZXMgYmV0d2VlbiBub24tZW1wdHkgbm9k
ZXMpOiBQQVNTRUQKK3Rlc3Q5IChlbXB0eSBhbmQgbm9uLWVtcHR5IHRleHQgbm9kZXMgbWl4ZWQg
d2l0aCBlbGVtZW50cyk6IFBBU1NFRAordGVzdDEwIChtaXhlZCBjYXNlcyBpbmNsdWRpbmcgZGVl
cGVyIG5lc3RlZCB0ZXh0IG5vZGVzKTogUEFTU0VECisKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qv
ZG9tL25vcm1hbGl6ZS5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvZG9tL25v
cm1hbGl6ZS5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9kb20vbm9ybWFs
aXplLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTg2IEBACis8aHRtbD4KKzxoZWFkPgor
CTx0aXRsZT5UZXN0IG9mIERPTSBub3JtYWxpemUoKTwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4K
KzxkaXYgaWQ9ImRlc2NyaXB0aW9uIj5TZXZlcmFsIHRlc3RzIG9mIHRoZSBET00gbm9ybWFsaXpl
KCkgZnVuY3Rpb24uPC9kaXY+CisKKzxkaXYgaWQ9InRlc3RzIiBzdHlsZT0iZGlzcGxheTpub25l
Ij4KKwk8ZGl2IG5hbWU9InRlc3QxIiBkZXNjcmlwdGlvbj0idHdvIG5vbi1lbXB0eSB0ZXh0IG5v
ZGVzIj5zb21lIHRleHQ8L2Rpdj4KKwk8ZGl2IG5hbWU9InRlc3QyIiBkZXNjcmlwdGlvbj0idGhy
ZWUgbm9uLWVtcHR5IHRleHQgbm9kZXMiPnNvbWUgbW9yZSB0ZXh0PC9kaXY+CisJPGRpdiBuYW1l
PSJ0ZXN0MyIgZGVzY3JpcHRpb249Im5vbi1lbXB0eSB0ZXh0IG5vZGVzIG1peGVkIHdpdGggZWxl
bWVudHMiPjxiPjwvYj5zb21lIG1vcmU8Yj48L2I+IHRleHQ8L2Rpdj4KKwk8ZGl2IG5hbWU9InRl
c3Q0IiBkZXNjcmlwdGlvbj0ic2luZ2xlIGVtcHR5IHRleHQgbm9kZSI+dGV4dDwvZGl2PgorCTxk
aXYgbmFtZT0idGVzdDUiIGRlc2NyaXB0aW9uPSJlbXB0eSB0ZXh0IG5vZGUgYmV0d2VlbiBlbGVt
ZW50cyI+PGI+PC9iPnRleHQ8aT48L2k+PC9kaXY+CisKKwk8ZGl2IG5hbWU9InRlc3Q2IiBkZXNj
cmlwdGlvbj0iZW1wdHkgdGV4dCBub2RlcyBiZWZvcmUgbm9uLWVtcHR5IG5vZGUiPnRleHQ8L2Rp
dj4KKwk8ZGl2IG5hbWU9InRlc3Q3IiBkZXNjcmlwdGlvbj0iZW1wdHkgdGV4dCBub2RlcyBhZnRl
ciBub24tZW1wdHkgbm9kZSI+dGV4dDwvZGl2PgorCTxkaXYgbmFtZT0idGVzdDgiIGRlc2NyaXB0
aW9uPSJlbXB0eSB0ZXh0IG5vZGVzIGJldHdlZW4gbm9uLWVtcHR5IG5vZGVzIj5zb21lIHRleHQ8
L2Rpdj4KKwkKKwk8ZGl2IG5hbWU9InRlc3Q5IiBkZXNjcmlwdGlvbj0iZW1wdHkgYW5kIG5vbi1l
bXB0eSB0ZXh0IG5vZGVzIG1peGVkIHdpdGggZWxlbWVudHMiPjxiPjwvYj5zb21lIG1vcmU8Yj48
L2I+IHRleHQ8L2Rpdj4KKwk8ZGl2IG5hbWU9InRlc3QxMCIgZGVzY3JpcHRpb249Im1peGVkIGNh
c2VzIGluY2x1ZGluZyBkZWVwZXIgbmVzdGVkIHRleHQgbm9kZXMiPjxiPnRleHQ8L2I+dGV4dCA8
Yj50ZXh0PGk+dGV4dDwvaT48L2I+IHRleHQ8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGlkPSJjb25z
b2xlIj48L2Rpdj4KKworPHNjcmlwdD4KKworCitpZiAod2luZG93LmxheW91dFRlc3RDb250cm9s
bGVyKQorICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKworZnVuY3Rpb24g
bG9nTGluZShtZXNzYWdlKSB7CisgICAgdmFyIGNvbnNvbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50
QnlJZCgiY29uc29sZSIpOworICAgIGNvbnNvbGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRl
VGV4dE5vZGUobWVzc2FnZSkpOworICAgIGNvbnNvbGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3Jl
YXRlRWxlbWVudCgnYnInKSk7Cit9CisKK2Z1bmN0aW9uIGxvZyhtZXNzYWdlKSB7CisgICAgdmFy
IGNvbnNvbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29uc29sZSIpOworICAgIGNvbnNv
bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobWVzc2FnZSkpOworfQorCisK
K2Z1bmN0aW9uIHByZXBhcmVfdGVzdDEodGVzdERpdikgeworCXRlc3REaXYuZmlyc3RDaGlsZC5z
cGxpdFRleHQoNCk7CisJcmV0dXJuIHRlc3REaXYuY2hpbGROb2Rlcy5sZW5ndGggPT0gMjsKK30K
K2Z1bmN0aW9uIGNoZWNrX3Rlc3QxKHRlc3REaXYpIHsKKwlyZXR1cm4gdGVzdERpdi5jaGlsZE5v
ZGVzLmxlbmd0aCA9PSAxOworfQorCitmdW5jdGlvbiBwcmVwYXJlX3Rlc3QyKHRlc3REaXYpIHsK
Kwl0ZXN0RGl2LmZpcnN0Q2hpbGQuc3BsaXRUZXh0KDkpOworCXRlc3REaXYuZmlyc3RDaGlsZC5z
cGxpdFRleHQoNCk7CisJcmV0dXJuIHRlc3REaXYuY2hpbGROb2Rlcy5sZW5ndGggPT0gMzsKK30K
K2Z1bmN0aW9uIGNoZWNrX3Rlc3QyKHRlc3REaXYpIHsKKwlyZXR1cm4gdGVzdERpdi5jaGlsZE5v
ZGVzLmxlbmd0aCA9PSAxOworfQorCitmdW5jdGlvbiBwcmVwYXJlX3Rlc3QzKHRlc3REaXYpIHsK
Kwl0ZXN0RGl2LmNoaWxkTm9kZXNbMV0uc3BsaXRUZXh0KDQpOworCXRlc3REaXYuY2hpbGROb2Rl
c1s0XS5zcGxpdFRleHQoMyk7CisJcmV0dXJuIHRlc3REaXYuY2hpbGROb2Rlcy5sZW5ndGggPT0g
NjsKK30KK2Z1bmN0aW9uIGNoZWNrX3Rlc3QzKHRlc3REaXYpIHsKKwlyZXR1cm4gdGVzdERpdi5j
aGlsZE5vZGVzLmxlbmd0aCA9PSA0OworfQorCitmdW5jdGlvbiBwcmVwYXJlX3Rlc3Q0KHRlc3RE
aXYpIHsKKwl0ZXN0RGl2LmNoaWxkTm9kZXNbMF0uZGF0YSA9ICIiOworCXJldHVybiB0ZXN0RGl2
LmNoaWxkTm9kZXMubGVuZ3RoID09IDE7Cit9CitmdW5jdGlvbiBjaGVja190ZXN0NCh0ZXN0RGl2
KSB7CisJcmV0dXJuIHRlc3REaXYuY2hpbGROb2Rlcy5sZW5ndGggPT0gMDsKK30KKworZnVuY3Rp
b24gcHJlcGFyZV90ZXN0NSh0ZXN0RGl2KSB7CisJdGVzdERpdi5jaGlsZE5vZGVzWzFdLmRhdGEg
PSAiIjsKKwlyZXR1cm4gdGVzdERpdi5jaGlsZE5vZGVzLmxlbmd0aCA9PSAzOworfQorZnVuY3Rp
b24gY2hlY2tfdGVzdDUodGVzdERpdikgeworCXJldHVybiB0ZXN0RGl2LmNoaWxkTm9kZXMubGVu
Z3RoID09IDI7Cit9CisKK2Z1bmN0aW9uIHByZXBhcmVfdGVzdDYodGVzdERpdikgeworCXRlc3RE
aXYuY2hpbGROb2Rlc1swXS5zcGxpdFRleHQoMCk7CisJdGVzdERpdi5jaGlsZE5vZGVzWzBdLnNw
bGl0VGV4dCgwKTsKKwlyZXR1cm4gdGVzdERpdi5jaGlsZE5vZGVzLmxlbmd0aCA9PSAzOworfQor
ZnVuY3Rpb24gY2hlY2tfdGVzdDYodGVzdERpdikgeworCXJldHVybiB0ZXN0RGl2LmNoaWxkTm9k
ZXMubGVuZ3RoID09IDE7Cit9CisKK2Z1bmN0aW9uIHByZXBhcmVfdGVzdDcodGVzdERpdikgewor
CXRlc3REaXYuY2hpbGROb2Rlc1swXS5zcGxpdFRleHQoNCk7CisJdGVzdERpdi5jaGlsZE5vZGVz
WzBdLnNwbGl0VGV4dCg0KTsKKwl0ZXN0RGl2LmNoaWxkTm9kZXNbMF0uc3BsaXRUZXh0KDQpOwor
CXJldHVybiB0ZXN0RGl2LmNoaWxkTm9kZXMubGVuZ3RoID09IDQ7Cit9CitmdW5jdGlvbiBjaGVj
a190ZXN0Nyh0ZXN0RGl2KSB7CisJcmV0dXJuIHRlc3REaXYuY2hpbGROb2Rlcy5sZW5ndGggPT0g
MTsKK30KKworZnVuY3Rpb24gcHJlcGFyZV90ZXN0OCh0ZXN0RGl2KSB7CisJdGVzdERpdi5jaGls
ZE5vZGVzWzBdLnNwbGl0VGV4dCg0KTsKKwl0ZXN0RGl2LmNoaWxkTm9kZXNbMF0uc3BsaXRUZXh0
KDQpOworCXJldHVybiB0ZXN0RGl2LmNoaWxkTm9kZXMubGVuZ3RoID09IDM7Cit9CitmdW5jdGlv
biBjaGVja190ZXN0OCh0ZXN0RGl2KSB7CisJcmV0dXJuIHRlc3REaXYuY2hpbGROb2Rlcy5sZW5n
dGggPT0gMTsKK30KKworZnVuY3Rpb24gcHJlcGFyZV90ZXN0OSh0ZXN0RGl2KSB7CisJdGVzdERp
di5jaGlsZE5vZGVzWzFdLnNwbGl0VGV4dCg0KTsKKwl0ZXN0RGl2LmNoaWxkTm9kZXNbMV0uc3Bs
aXRUZXh0KDApOwkvLyBlbXB0eSB0ZXh0IG5vZGUgYmVmb3JlIG90aGVyIHRleHQgbm9kZXMKKwl0
ZXN0RGl2LmNoaWxkTm9kZXNbNV0uc3BsaXRUZXh0KDMpOworCXRlc3REaXYuY2hpbGROb2Rlc1s1
XS5zcGxpdFRleHQoMyk7CS8vIGVtcHR5IHRleHQgbm9kZSBiZXR3ZWVuIG90aGVyIHRleHQgbm9k
ZXMKKwl0ZXN0RGl2LmNoaWxkTm9kZXNbN10uc3BsaXRUZXh0KDIpOwkvLyBlbXB0eSB0ZXh0IG5v
ZGUgYWZ0ZXIgb3RoZXIgdGV4dCBub2RlcworCXJldHVybiB0ZXN0RGl2LmNoaWxkTm9kZXMubGVu
Z3RoID09IDk7Cit9CitmdW5jdGlvbiBjaGVja190ZXN0OSh0ZXN0RGl2KSB7CisJcmV0dXJuIHRl
c3REaXYuY2hpbGROb2Rlcy5sZW5ndGggPT0gNDsKK30KKworZnVuY3Rpb24gcHJlcGFyZV90ZXN0
MTAodGVzdERpdikgeworCXRlc3REaXYuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnNwbGl0
VGV4dCgyKTsKKwl0ZXN0RGl2LmNoaWxkTm9kZXNbMV0uc3BsaXRUZXh0KDQpOworCXRlc3REaXYu
Y2hpbGROb2Rlc1szXS5jaGlsZE5vZGVzWzBdLmRhdGEgPSAiIjsJLy8gZW1wdHkgZmlyc3QgdGV4
dCBub2RlIG9mIHRoZSBzZWNvbmQgYm9sZCBub2RlCisJdGVzdERpdi5jaGlsZE5vZGVzWzNdLmNo
aWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5kYXRhID0gIiI7CS8vIGVtcHR5IHRleHQgbm9kZSBv
ZiB0aGUgaXRhbGljIG5vZGUKKwl0ZXN0RGl2LmNoaWxkTm9kZXNbNF0uc3BsaXRUZXh0KDEpOwor
CXJldHVybiB0ZXN0RGl2LmNoaWxkTm9kZXMubGVuZ3RoID09IDY7Cit9CitmdW5jdGlvbiBjaGVj
a190ZXN0MTAodGVzdERpdikgeworCXJldHVybiB0ZXN0RGl2LmNoaWxkTm9kZXMubGVuZ3RoID09
IDQKKwkJJiYgdGVzdERpdi5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMubGVuZ3RoID09IDEJCS8v
IGZpcnN0IGJvbGQgbm9kZSBtdXN0IGhhdmUgc2luZ2xlIHRleHQgbm9kZSBjaGlsZAorCQkmJiB0
ZXN0RGl2LmNoaWxkTm9kZXNbMl0uY2hpbGROb2Rlcy5sZW5ndGggPT0gMQkJLy8gZmlyc3QgYm9s
ZCBub2RlIG11c3QgaGF2ZSBzaW5nbGUgaXRhbGljIG5vZGUgY2hpbGQKKwkJJiYgdGVzdERpdi5j
aGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGggPT0gMDsJLy8gaXRh
bGljIG5vZGUgbXVzdCBiZSBlbXB0eQorfQorCisKK2Z1bmN0aW9uIHJ1blRlc3QodGVzdERpdiwg
dGVzdE5hbWUpIHsKKworCWlmIChzZWxmWyJwcmVwYXJlXyIrdGVzdE5hbWVdKHRlc3REaXYpKSB7
CisJCXZhciBvbGRIVE1MID0gdGVzdERpdi5pbm5lckhUTUw7CisJCXRlc3REaXYubm9ybWFsaXpl
KCk7CisJCWlmICh0ZXN0RGl2LmlubmVySFRNTCAhPSBvbGRIVE1MKSB7CisJCQlsb2coIkZBSUxF
RDogaW5uZXJIVE1MIGNoYW5nZWQgZnJvbSBcIiIgKyBvbGRIVE1MICsgIlwiIHRvIFwiIiArIHRl
c3REaXYuaW5uZXJIVE1MICsgIlwiIik7CisJCX0gZWxzZSB7CisJCQlpZiAoc2VsZlsiY2hlY2tf
Iit0ZXN0TmFtZV0odGVzdERpdikpCisJCQkJbG9nKCJQQVNTRUQiKTsKKwkJCWVsc2UKKwkJCQls
b2coIkZBSUxFRCIpOworCQl9CQkKKwl9IGVsc2UgeworCSAgICBsb2coIkZBSUxFRCBpbiB0ZXN0
IHByZXBhcmF0aW9uIik7CisJfQorfQorCit0cnkgeworCisJdmFyIHRlc3RzID0gZG9jdW1lbnQu
Z2V0RWxlbWVudEJ5SWQoInRlc3RzIikuY2hpbGROb2RlczsKKwlmb3IgKCBpID0gMDsgaSA8IHRl
c3RzLmxlbmd0aDsgaSsrICkgeworCQl2YXIgdGVzdERpdiA9IHRlc3RzW2ldOworCQkvLyBTa2lw
IGZvcm1hdHRpbmcgdGV4dCBub2RlcworCQlpZiAodGVzdERpdi5ub2RlVHlwZSA9PSAxLypFTEVN
RU5UX05PREUqLykgeworCQkJdmFyIHRlc3ROYW1lID0gdGVzdERpdi5nZXRBdHRyaWJ1dGUoIm5h
bWUiKTsKKwkJCQorCQkJbG9nKHRlc3ROYW1lICsgIiAoIiArIHRlc3REaXYuZ2V0QXR0cmlidXRl
KCJkZXNjcmlwdGlvbiIpICsgIik6ICIpOworCQkJCisJCQl0cnkgeworCQkJCXJ1blRlc3QodGVz
dERpdiwgdGVzdE5hbWUpOworCQkJfSBjYXRjaChlKSB7CisJCQkJbG9nKCJGQUlMRUQgd2l0aCBl
eGNlcHRpb246ICIgKyBlKTsKKwkJCX0KKwkJCQorCQkJbG9nTGluZSgiIikKKwkJfQorCX0KKwor
fSBjYXRjaChlKSB7CisgICAgbG9nTGluZSgiRkFJTEVELCBleGNlcHRpb24gdGhyb3duIGR1cmlu
ZyB0ZXN0czogIiArIGUpOworfQorCis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KClByb3Bl
cnR5IGNoYW5nZXMgb246IExheW91dFRlc3RzL2Zhc3QvZG9tL25vcm1hbGl6ZS5odG1sCl9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18KQWRkZWQ6IHN2bjptaW1lLXR5cGUKICAgKyB0ZXh0L2h0bWwKCg==
</data>
<flag name="review"
          id="15338"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>