<?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>24726</bug_id>
          
          <creation_ts>2009-03-20 14:23:17 -0700</creation_ts>
          <short_desc>hit testing doesn&apos;t work right when the click is on anonymous content</short_desc>
          <delta_ts>2009-03-24 14:25:32 -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>HTML Editing</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>InRadar</keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Darin Adler">darin</reporter>
          <assigned_to name="Darin Adler">darin</assigned_to>
          <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>114553</commentid>
    <comment_count>0</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-20 14:23:17 -0700</bug_when>
    <thetext>When looking at a bug affecting Apple’s Mail application I discovered that hit testing doesn’t work when the item hit (or the nearest item) is anonymous content. While I can’t share the Mail test case here, we can make other test cases.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114561</commentid>
    <comment_count>1</comment_count>
      <attachid>28802</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-20 14:54:57 -0700</bug_when>
    <thetext>Created attachment 28802
first cut at a test, made by Eric</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114570</commentid>
    <comment_count>2</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-20 15:22:55 -0700</bug_when>
    <thetext>rdar://problem/6696992</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114574</commentid>
    <comment_count>3</comment_count>
      <attachid>28805</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-20 15:48:56 -0700</bug_when>
    <thetext>Created attachment 28805
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114587</commentid>
    <comment_count>4</comment_count>
      <attachid>28805</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2009-03-20 16:28:44 -0700</bug_when>
    <thetext>Comment on attachment 28805
patch

&gt; Index: WebCore/rendering/RenderObject.cpp
&gt; ===================================================================
&gt; --- WebCore/rendering/RenderObject.cpp	(revision 41868)
&gt; +++ WebCore/rendering/RenderObject.cpp	(working copy)

&gt; +VisiblePosition RenderObject::createVisiblePosition(int offset, EAffinity affinity)
&gt; +{
&gt; +    // If is is a non-anonymous renderer, then it&apos;s simple.
&gt; +    if (Node* node = this-&gt;node())
&gt; +        return VisiblePosition(node, offset, affinity);
&gt; +
&gt; +    // Find a nearby non-anonymous renderer.
&gt; +    RenderObject* child = this;
&gt; +    while (RenderObject* parent = child-&gt;parent()) {

I think you need to check here that the parent is of the same editability as the child like in positionForPointRespectingEditingBoundaries.

&gt; +        // Find non-anonymous content after.
&gt; +        RenderObject* renderer = child;
&gt; +        while ((renderer = renderer-&gt;nextInPreOrder(parent))) {
&gt; +            if (Node* node = renderer-&gt;node())
&gt; +                return VisiblePosition(node, 0, DOWNSTREAM);
&gt; +        }

Maybe add the following test cases to test the rest of this? 
-Editable element with generated content only at the beginning
-Editable element with only generated content inside

&gt; +        // Find non-anonymous content before.
&gt; +        renderer = child;
&gt; +        while ((renderer = renderer-&gt;previousInPreOrder())) {
&gt; +            if (renderer == parent)
&gt; +                break;
&gt; +            if (Node* node = renderer-&gt;node())
&gt; +                return VisiblePosition(node, numeric_limits&lt;int&gt;::max(), DOWNSTREAM);
&gt; +        }
&gt; +
&gt; +        // Use the parent itself unless it too is anonymous.
&gt; +        if (Node* node = parent-&gt;node())
&gt; +            return VisiblePosition(node, 0, DOWNSTREAM);
&gt; +
&gt; +        // Repeat at the next level up.
&gt; +        child = parent;
&gt; +    }
&gt; +

Is this actually possible? If so, would be good to have a test case. Maybe this even deserves an ASSERT(false)?

&gt; +    // Everything was anonymous. Give up.
&gt; +    return VisiblePosition();
&gt; +}
&gt; +
&gt; +VisiblePosition RenderObject::createVisiblePosition(const Position&amp; position)
&gt; +{
&gt; +    if (position.container)
&gt; +        return VisiblePosition(position);
&gt; +
&gt; +    ASSERT(!node());
&gt; +    return createVisiblePosition(0, DOWNSTREAM);
&gt; +}


&gt; Index: LayoutTests/editing/selection/hit-test-anonymous.html
&gt; ===================================================================
&gt; --- LayoutTests/editing/selection/hit-test-anonymous.html	(revision 0)
&gt; +++ LayoutTests/editing/selection/hit-test-anonymous.html	(revision 0)
&gt; @@ -0,0 +1,74 @@
&gt; +&lt;head&gt;
&gt; +&lt;style&gt;
&gt; +span:before {
&gt; +    content: &quot;&lt;before&gt; &quot;;
&gt; +}
&gt; +span:after {
&gt; +    content: &quot; &lt;after&gt;&quot;;
&gt; +}
&gt; +&lt;/style&gt;
&gt; +&lt;script&gt;

Not a big deal, but LayoutTests/editing/selection/resources/js-test-selection-shared.js already has equivalents to the first three of these methods. Although it&apos;s DOM-based in it&apos;s asserts rather than string-based and it assumes you pull in js-test-pre.js.

&gt; +    function nodeAsString(node)
&gt; +    {
&gt; +        if (node &amp;&amp; node.nodeType == Node.TEXT_NODE)
&gt; +            return &quot;text in &quot; + nodeAsString(node.parentNode);
&gt; +        if (node &amp;&amp; node.nodeType == Node.ELEMENT_NODE) {
&gt; +            var id;
&gt; +            if (id = node.getAttribute(&quot;id&quot;))
&gt; +                return id;
&gt; +        }
&gt; +        return node;
&gt; +    }
&gt; +    function selectionAsString()
&gt; +    {
&gt; +        return &quot;(&quot; + nodeAsString(getSelection().anchorNode)
&gt; +            + &quot;, &quot; + getSelection().anchorOffset
&gt; +            + &quot;), (&quot; + nodeAsString(getSelection().focusNode)
&gt; +            + &quot;, &quot; + getSelection().focusOffset + &quot;)&quot;;        
&gt; +    }
&gt; +    function checkSelection(step, expected)
&gt; +    {
&gt; +        if (selectionAsString() !== expected) {
&gt; +            document.getElementById(&quot;result&quot;).innerHTML = &quot;FAIL: After step &quot; + step + &quot; selection was &quot; + selectionAsString();
&gt; +            return true;
&gt; +        }
&gt; +        return false;
&gt; +    }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114591</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-20 16:41:20 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; I think you need to check here that the parent is of the same editability as
&gt; the child like in positionForPointRespectingEditingBoundaries.

I don&apos;t think I do in practice. Everything has to be anonymous. I think you’ll have some non-anonymous nodes anywhere you’d have an editability transition.

By the way, what do you think we’d do when the parent’s editability differed from the child?

&gt; Maybe add the following test cases to test the rest of this? 
&gt; -Editable element with generated content only at the beginning
&gt; -Editable element with only generated content inside

We’d have to add tons more test cases to test all of these. I can try to make more, but I think this fix can go in before we add tests to cover every single one of the cases.

&gt; &gt; +        // Find non-anonymous content before.
&gt; &gt; +        renderer = child;
&gt; &gt; +        while ((renderer = renderer-&gt;previousInPreOrder())) {
&gt; &gt; +            if (renderer == parent)
&gt; &gt; +                break;
&gt; &gt; +            if (Node* node = renderer-&gt;node())
&gt; &gt; +                return VisiblePosition(node, numeric_limits&lt;int&gt;::max(), DOWNSTREAM);
&gt; &gt; +        }
&gt; &gt; +
&gt; &gt; +        // Use the parent itself unless it too is anonymous.
&gt; &gt; +        if (Node* node = parent-&gt;node())
&gt; &gt; +            return VisiblePosition(node, 0, DOWNSTREAM);
&gt; &gt; +
&gt; &gt; +        // Repeat at the next level up.
&gt; &gt; +        child = parent;
&gt; &gt; +    }
&gt; 
&gt; Is this actually possible? If so, would be good to have a test case. Maybe this
&gt; even deserves an ASSERT(false)?

Sure, I have no idea which of these pathological cases really exist and which don’t. Making test cases for these are extremely challenging. We can add more test cases after I land the initial patch.

&gt; Not a big deal, but
&gt; LayoutTests/editing/selection/resources/js-test-selection-shared.js already has
&gt; equivalents to the first three of these methods. Although it&apos;s DOM-based in
&gt; it&apos;s asserts rather than string-based and it assumes you pull in
&gt; js-test-pre.js.

And these exact three function came from yet another test. I’d be happy to see lots of other high-quality tests and refactoring to include this test. But at the moment I’m satisfied having at least one test to demonstrate the need for this fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114597</commentid>
    <comment_count>6</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2009-03-20 16:49:29 -0700</bug_when>
    <thetext>Yeah, it occurred to me afterwards that we probably can&apos;t cross an editability boundary here since we stop at the first non-anonymous node we see. Maybe it&apos;s worth adding a comment to that effect for the next guy who messes with this code?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114601</commentid>
    <comment_count>7</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-20 16:55:22 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; Yeah, it occurred to me afterwards that we probably can&apos;t cross an editability
&gt; boundary here since we stop at the first non-anonymous node we see. Maybe it&apos;s
&gt; worth adding a comment to that effect for the next guy who messes with this
&gt; code?

Will do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114895</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-23 17:51:42 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/41928</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115043</commentid>
    <comment_count>9</comment_count>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2009-03-24 14:18:30 -0700</bug_when>
    <thetext>Do we know which commit originally caused this regression?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115047</commentid>
    <comment_count>10</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-24 14:23:45 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; Do we know which commit originally caused this regression?

I don&apos;t know which one.

The cause was presumably indirect. We had this latent bug for a long time and I think it was changes to higher levels of the editing code that made it start to matter.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115048</commentid>
    <comment_count>11</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-03-24 14:25:32 -0700</bug_when>
    <thetext>Yes http://trac.webkit.org/changeset/41191 was the commit which would have exposed this latent bug to these more common circumstances.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>28802</attachid>
            <date>2009-03-20 14:54:57 -0700</date>
            <delta_ts>2009-03-20 15:48:56 -0700</delta_ts>
            <desc>first cut at a test, made by Eric</desc>
            <filename>anonymous-content-hit-test.html</filename>
            <type>text/html</type>
            <size>196</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">PHN0eWxlPgpzcGFuOmJlZm9yZSB7CiAgICBjb250ZW50OiAiQkVGT1JFIjsKfQpzcGFuOmFmdGVy
IHsKICAgIGNvbnRlbnQ6ICJBRlRFUiI7Cn0KPC9zdHlsZT4KPGRpdiBjb250ZW50RWRpdGFibGUg
c3R5bGU9InBhZGRpbmc6NDBweDsgYm9yZGVyOiAxcHggc29saWQgYmx1ZSI+CiAgICA8c3Bhbj5D
bGljayBiZWxvdzwvc3Bhbj4KPC9kaXY+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28805</attachid>
            <date>2009-03-20 15:48:56 -0700</date>
            <delta_ts>2009-03-23 16:50:20 -0700</delta_ts>
            <desc>patch</desc>
            <filename>HitTestAnonymousPatch.txt</filename>
            <type>text/plain</type>
            <size>19737</size>
            <attacher name="Darin Adler">darin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MTg2OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzQgQEAKKzIwMDktMDMtMjAgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEJ1ZyAy
NDcyNjogaGl0IHRlc3RpbmcgZG9lc24ndCB3b3JrIHJpZ2h0IHdoZW4gdGhlIGNsaWNrIGlzIG9u
IGFub255bW91cyBjb250ZW50CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNDcyNgorICAgICAgICByZGFyOi8vcHJvYmxlbS82Njk2OTkyCisKKyAgICAg
ICAgVGVzdDogZWRpdGluZy9zZWxlY3Rpb24vaGl0LXRlc3QtYW5vbnltb3VzLmh0bWwKKworICAg
ICAgICAqIHJlbmRlcmluZy9SZW5kZXJCUi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
Ujo6cG9zaXRpb25Gb3JQb2ludCk6IENhbGwgY3JlYXRlVmlzaWJsZVBvc2l0aW9uIGluc3RlYWQg
b2YKKyAgICAgICAgY3JlYXRpbmcgYSBWaXNpYmxlUG9zaXRpb24gZGlyZWN0bHkuIEl0IHdpbGwg
aGFuZGxlIGZpbmRpbmcgbm9uLWFub255bW91cworICAgICAgICBjb250ZW50IG5lYXJieSBpZiBu
b2RlKCkgaXMgMC4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6cG9zaXRpb25Gb3JQb2ludFJlc3BlY3RpbmdFZGl0aW5nQm91bmRhcmllcyk6
IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6cG9zaXRpb25Gb3JQb2ludFdpdGhJbmxpbmVDaGls
ZHJlbik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OnBvc2l0aW9uRm9y
UG9pbnQpOiBEaXR0by4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQm94LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJveDo6cG9zaXRpb25Gb3JQb2ludCk6IERpdHRvLgorICAgICAg
ICAqIHJlbmRlcmluZy9SZW5kZXJPYmplY3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
T2JqZWN0Ojpwb3NpdGlvbkZvclBvaW50KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJPYmplY3Q6OmNyZWF0ZVZpc2libGVQb3NpdGlvbik6IEFkZGVkLgorICAgICAgICAqIHJlbmRl
cmluZy9SZW5kZXJPYmplY3QuaDogQWRkZWQgY3JlYXRlVmlzaWJsZVBvc2l0aW9uLgorICAgICAg
ICAqIHJlbmRlcmluZy9SZW5kZXJSZXBsYWNlZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJSZXBsYWNlZDo6cG9zaXRpb25Gb3JQb2ludCk6IENhbGwgY3JlYXRlVmlzaWJsZVBvc2l0aW9u
LgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJTVkdJbmxpbmVUZXh0LmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclNWR0lubGluZVRleHQ6OnBvc2l0aW9uRm9yUG9pbnQpOiBEaXR0by4K
KyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUZXh0Ojpwb3NpdGlvbkZvclBvaW50KTogRGl0dG8uCisKIDIwMDktMDMtMjAgIEdlb2Zm
cmV5IEdhcmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0g
V2VpbmlnLgpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQlIuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJSLmNwcAkocmV2aXNpb24gNDE4NjgpCisrKyBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCUi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTk2LDcgKzk2
LDcgQEAgdW5zaWduZWQgUmVuZGVyQlI6OmNhcmV0TWF4UmVuZGVyZWRPZmZzZQogCiBWaXNpYmxl
UG9zaXRpb24gUmVuZGVyQlI6OnBvc2l0aW9uRm9yUG9pbnQoY29uc3QgSW50UG9pbnQmKQogewot
ICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24obm9kZSgpLCAwLCBET1dOU1RSRUFNKTsKKyAgICBy
ZXR1cm4gY3JlYXRlVmlzaWJsZVBvc2l0aW9uKDAsIERPV05TVFJFQU0pOwogfQogCiB9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCShyZXZpc2lv
biA0MTg2OCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzQzNiw4ICszNDM2LDggQEAgc3RhdGljIFZpc2libGVQb3NpdGlvbiBwb3NpdGlv
bkZvclBvaW50UgogICAgIC8vIE90aGVyd2lzZSByZXR1cm4gYmVmb3JlIG9yIGFmdGVyIHRoZSBj
aGlsZCwgZGVwZW5kaW5nIG9uIGlmIHRoZSBjbGljayB3YXMgbGVmdCBvciByaWdodCBvZiB0aGUg
Y2hpbGQKICAgICBpbnQgY2hpbGRNaWRYID0gY2hpbGQtPndpZHRoKCkgLyAyOwogICAgIGlmICh4
SW5DaGlsZENvb3JkcyA8IGNoaWxkTWlkWCkKLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlv
bihhbmNlc3Rvci0+bm9kZSgpLCBjaGlsZE5vZGUtPm5vZGVJbmRleCgpLCBET1dOU1RSRUFNKTsK
LSAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKGFuY2VzdG9yLT5ub2RlKCksIGNoaWxkTm9kZS0+
bm9kZUluZGV4KCkgKyAxLCBVUFNUUkVBTSk7CisgICAgICAgIHJldHVybiBhbmNlc3Rvci0+Y3Jl
YXRlVmlzaWJsZVBvc2l0aW9uKGNoaWxkTm9kZS0+bm9kZUluZGV4KCksIERPV05TVFJFQU0pOwor
ICAgIHJldHVybiBhbmNlc3Rvci0+Y3JlYXRlVmlzaWJsZVBvc2l0aW9uKGNoaWxkTm9kZS0+bm9k
ZUluZGV4KCkgKyAxLCBVUFNUUkVBTSk7CiB9CiAKIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gcG9z
aXRpb25Gb3JQb2ludFdpdGhJbmxpbmVDaGlsZHJlbihSZW5kZXJCbG9jayogYmxvY2ssIGNvbnN0
IEludFBvaW50JiBwb2ludEluQ29udGVudHMpCkBAIC0zNDQ1LDcgKzM0NDUsNyBAQCBzdGF0aWMg
VmlzaWJsZVBvc2l0aW9uIHBvc2l0aW9uRm9yUG9pbnRXCiAgICAgQVNTRVJUKGJsb2NrLT5jaGls
ZHJlbklubGluZSgpKTsKIAogICAgIGlmICghYmxvY2stPmZpcnN0Um9vdEJveCgpKQotICAgICAg
ICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKGJsb2NrLT5ub2RlKCksIDAsIERPV05TVFJFQU0pOwor
ICAgICAgICByZXR1cm4gYmxvY2stPmNyZWF0ZVZpc2libGVQb3NpdGlvbigwLCBET1dOU1RSRUFN
KTsKIAogICAgIElubGluZUJveCogY2xvc2VzdEJveCA9IDA7CiAgICAgLy8gbG9vayBmb3IgdGhl
IGNsb3Nlc3QgbGluZSBib3ggaW4gdGhlIHJvb3QgYm94IHdoaWNoIGlzIGF0IHRoZSBwYXNzZWQt
aW4geSBjb29yZGluYXRlCkBAIC0zNDc4LDcgKzM0NzgsNyBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0
aW9uIHBvc2l0aW9uRm9yUG9pbnRXCiAgICAgLy8gQ2FuJ3QgcmVhY2ggdGhpcy4gIFdlIGhhdmUg
YSByb290IGxpbmUgYm94LCBidXQgaXQgaGFzIG5vIGtpZHMuCiAgICAgLy8gRklYTUU6IFRoaXMg
c2hvdWxkIEFTU0VSVF9OT1RfUkVBQ0hFRCgpLCBidXQgY2xpY2tpbmcgb24gcGxhY2Vob2xkZXIg
dGV4dAogICAgIC8vIHNlZW1zIHRvIGhpdCB0aGlzIGNvZGVwYXRoLgotICAgIHJldHVybiBWaXNp
YmxlUG9zaXRpb24oYmxvY2stPm5vZGUoKSwgMCwgRE9XTlNUUkVBTSk7CisgICAgcmV0dXJuIGJs
b2NrLT5jcmVhdGVWaXNpYmxlUG9zaXRpb24oMCwgRE9XTlNUUkVBTSk7CiB9CiAKIFZpc2libGVQ
b3NpdGlvbiBSZW5kZXJCbG9jazo6cG9zaXRpb25Gb3JQb2ludChjb25zdCBJbnRQb2ludCYgcG9p
bnQpCkBAIC0zNDkzLDkgKzM0OTMsOSBAQCBWaXNpYmxlUG9zaXRpb24gUmVuZGVyQmxvY2s6OnBv
c2l0aW9uRm9yCiAKICAgICBpZiAoaXNSZXBsYWNlZCgpKSB7CiAgICAgICAgIGlmIChwb2ludC55
KCkgPCAwIHx8IHBvaW50LnkoKSA8IGhlaWdodCgpICYmIHBvaW50LngoKSA8IDApCi0gICAgICAg
ICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG5vZGUoKSwgY2FyZXRNaW5PZmZzZXQoKSwgRE9X
TlNUUkVBTSk7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlVmlzaWJsZVBvc2l0aW9uKGNhcmV0
TWluT2Zmc2V0KCksIERPV05TVFJFQU0pOwogICAgICAgICBpZiAocG9pbnQueSgpID49IGhlaWdo
dCgpIHx8IHBvaW50LnkoKSA+PSAwICYmIHBvaW50LngoKSA+PSB3aWR0aCgpKQotICAgICAgICAg
ICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihub2RlKCksIGNhcmV0TWF4T2Zmc2V0KCksIERPV05T
VFJFQU0pOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbihjYXJldE1h
eE9mZnNldCgpLCBET1dOU1RSRUFNKTsKICAgICB9IAogCiAgICAgaWYgKGNoaWxkcmVuSW5saW5l
KCkpIHsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJveC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQm94LmNwcAkocmV2aXNpb24gNDE4NjgpCisrKyBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNjc0LDcg
KzI2NzQsNyBAQCBWaXNpYmxlUG9zaXRpb24gUmVuZGVyQm94Ojpwb3NpdGlvbkZvclBvCiB7CiAg
ICAgLy8gbm8gY2hpbGRyZW4uLi5yZXR1cm4gdGhpcyByZW5kZXIgb2JqZWN0J3MgZWxlbWVudCwg
aWYgdGhlcmUgaXMgb25lLCBhbmQgb2Zmc2V0IDAKICAgICBpZiAoIWZpcnN0Q2hpbGQoKSkKLSAg
ICAgICAgcmV0dXJuIGZpcnN0RGVlcEVkaXRpbmdQb3NpdGlvbkZvck5vZGUobm9kZSgpKTsKKyAg
ICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbihmaXJzdERlZXBFZGl0aW5nUG9zaXRp
b25Gb3JOb2RlKG5vZGUoKSkpOwogCiAgICAgaW50IHhQb3MgPSBwb2ludC54KCk7CiAgICAgaW50
IHlQb3MgPSBwb2ludC55KCk7CkBAIC0yNjg1LDggKzI2ODUsOCBAQCBWaXNpYmxlUG9zaXRpb24g
UmVuZGVyQm94Ojpwb3NpdGlvbkZvclBvCiAgICAgICAgIAogICAgICAgICBpZiAoeFBvcyA8IDAg
fHwgeFBvcyA+IHJpZ2h0IHx8IHlQb3MgPCAwIHx8IHlQb3MgPiBib3R0b20pIHsKICAgICAgICAg
ICAgIGlmICh4UG9zIDw9IHJpZ2h0IC8gMikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RE
ZWVwRWRpdGluZ1Bvc2l0aW9uRm9yTm9kZShub2RlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGxh
c3REZWVwRWRpdGluZ1Bvc2l0aW9uRm9yTm9kZShub2RlKCkpOworICAgICAgICAgICAgICAgIHJl
dHVybiBjcmVhdGVWaXNpYmxlUG9zaXRpb24oZmlyc3REZWVwRWRpdGluZ1Bvc2l0aW9uRm9yTm9k
ZShub2RlKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVWaXNpYmxlUG9zaXRpb24obGFz
dERlZXBFZGl0aW5nUG9zaXRpb25Gb3JOb2RlKG5vZGUoKSkpOwogICAgICAgICB9CiAgICAgfQog
CkBAIC0yNzU3LDcgKzI3NTcsNyBAQCBWaXNpYmxlUG9zaXRpb24gUmVuZGVyQm94Ojpwb3NpdGlv
bkZvclBvCiAgICAgaWYgKGNsb3Nlc3RSZW5kZXJlcikKICAgICAgICAgcmV0dXJuIGNsb3Nlc3RS
ZW5kZXJlci0+cG9zaXRpb25Gb3JDb29yZGluYXRlcyhuZXdYIC0gY2xvc2VzdFJlbmRlcmVyLT54
KCksIG5ld1kgLSBjbG9zZXN0UmVuZGVyZXItPnkoKSk7CiAgICAgCi0gICAgcmV0dXJuIGZpcnN0
RGVlcEVkaXRpbmdQb3NpdGlvbkZvck5vZGUobm9kZSgpKTsKKyAgICByZXR1cm4gY3JlYXRlVmlz
aWJsZVBvc2l0aW9uKGZpcnN0RGVlcEVkaXRpbmdQb3NpdGlvbkZvck5vZGUobm9kZSgpKSk7CiB9
CiAKIGJvb2wgUmVuZGVyQm94OjpzaHJpbmtUb0F2b2lkRmxvYXRzKCkgY29uc3QKSW5kZXg6IFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyT2JqZWN0LmNwcAkocmV2aXNpb24gNDE4NjgpCisrKyBXZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xODk2LDcgKzE4OTYs
NyBAQCBWaXNpYmxlUG9zaXRpb24gUmVuZGVyT2JqZWN0Ojpwb3NpdGlvbkZvCiAKIFZpc2libGVQ
b3NpdGlvbiBSZW5kZXJPYmplY3Q6OnBvc2l0aW9uRm9yUG9pbnQoY29uc3QgSW50UG9pbnQmKQog
ewotICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24obm9kZSgpLCBjYXJldE1pbk9mZnNldCgpLCBE
T1dOU1RSRUFNKTsKKyAgICByZXR1cm4gY3JlYXRlVmlzaWJsZVBvc2l0aW9uKGNhcmV0TWluT2Zm
c2V0KCksIERPV05TVFJFQU0pOwogfQogCiB2b2lkIFJlbmRlck9iamVjdDo6dXBkYXRlRHJhZ1N0
YXRlKGJvb2wgZHJhZ09uKQpAQCAtMjI5OSw2ICsyMjk5LDUyIEBAIFJlbmRlckJveE1vZGVsT2Jq
ZWN0KiBSZW5kZXJPYmplY3Q6Om9mZnMKICAgICByZXR1cm4gY3VyciAmJiBjdXJyLT5pc0JveE1v
ZGVsT2JqZWN0KCkgPyB0b1JlbmRlckJveE1vZGVsT2JqZWN0KGN1cnIpIDogMDsKIH0KIAorVmlz
aWJsZVBvc2l0aW9uIFJlbmRlck9iamVjdDo6Y3JlYXRlVmlzaWJsZVBvc2l0aW9uKGludCBvZmZz
ZXQsIEVBZmZpbml0eSBhZmZpbml0eSkKK3sKKyAgICAvLyBJZiBpcyBpcyBhIG5vbi1hbm9ueW1v
dXMgcmVuZGVyZXIsIHRoZW4gaXQncyBzaW1wbGUuCisgICAgaWYgKE5vZGUqIG5vZGUgPSB0aGlz
LT5ub2RlKCkpCisgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24obm9kZSwgb2Zmc2V0LCBh
ZmZpbml0eSk7CisKKyAgICAvLyBGaW5kIGEgbmVhcmJ5IG5vbi1hbm9ueW1vdXMgcmVuZGVyZXIu
CisgICAgUmVuZGVyT2JqZWN0KiBjaGlsZCA9IHRoaXM7CisgICAgd2hpbGUgKFJlbmRlck9iamVj
dCogcGFyZW50ID0gY2hpbGQtPnBhcmVudCgpKSB7CisgICAgICAgIC8vIEZpbmQgbm9uLWFub255
bW91cyBjb250ZW50IGFmdGVyLgorICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gY2hp
bGQ7CisgICAgICAgIHdoaWxlICgocmVuZGVyZXIgPSByZW5kZXJlci0+bmV4dEluUHJlT3JkZXIo
cGFyZW50KSkpIHsKKyAgICAgICAgICAgIGlmIChOb2RlKiBub2RlID0gcmVuZGVyZXItPm5vZGUo
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG5vZGUsIDAsIERPV05T
VFJFQU0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCBub24tYW5vbnltb3VzIGNvbnRl
bnQgYmVmb3JlLgorICAgICAgICByZW5kZXJlciA9IGNoaWxkOworICAgICAgICB3aGlsZSAoKHJl
bmRlcmVyID0gcmVuZGVyZXItPnByZXZpb3VzSW5QcmVPcmRlcigpKSkgeworICAgICAgICAgICAg
aWYgKHJlbmRlcmVyID09IHBhcmVudCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIGlmIChOb2RlKiBub2RlID0gcmVuZGVyZXItPm5vZGUoKSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG5vZGUsIG51bWVyaWNfbGltaXRzPGludD46Om1heCgpLCBE
T1dOU1RSRUFNKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVzZSB0aGUgcGFyZW50IGl0c2Vs
ZiB1bmxlc3MgaXQgdG9vIGlzIGFub255bW91cy4KKyAgICAgICAgaWYgKE5vZGUqIG5vZGUgPSBw
YXJlbnQtPm5vZGUoKSkKKyAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24obm9kZSwg
MCwgRE9XTlNUUkVBTSk7CisKKyAgICAgICAgLy8gUmVwZWF0IGF0IHRoZSBuZXh0IGxldmVsIHVw
LgorICAgICAgICBjaGlsZCA9IHBhcmVudDsKKyAgICB9CisKKyAgICAvLyBFdmVyeXRoaW5nIHdh
cyBhbm9ueW1vdXMuIEdpdmUgdXAuCisgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbigpOworfQor
CitWaXNpYmxlUG9zaXRpb24gUmVuZGVyT2JqZWN0OjpjcmVhdGVWaXNpYmxlUG9zaXRpb24oY29u
c3QgUG9zaXRpb24mIHBvc2l0aW9uKQoreworICAgIGlmIChwb3NpdGlvbi5jb250YWluZXIpCisg
ICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24ocG9zaXRpb24pOworCisgICAgQVNTRVJUKCFu
b2RlKCkpOworICAgIHJldHVybiBjcmVhdGVWaXNpYmxlUG9zaXRpb24oMCwgRE9XTlNUUkVBTSk7
Cit9CisKICNpZiBFTkFCTEUoU1ZHKQogCiBGbG9hdFJlY3QgUmVuZGVyT2JqZWN0OjpyZWxhdGl2
ZUJCb3goYm9vbCkgY29uc3QKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCShyZXZpc2lv
biA0MTg2OCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlck9iamVjdC5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJS
ZW5kZXJPYmplY3RDaGlsZExpc3QuaCIKICNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorI2luY2x1
ZGUgIlRleHRBZmZpbml0eS5oIgogI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTM4LDYgKzM5LDcgQEAgY2xhc3MgQW5pbWF0aW9uQ29u
dHJvbGxlcjsKIGNsYXNzIEhpdFRlc3RSZXN1bHQ7CiBjbGFzcyBJbmxpbmVCb3g7CiBjbGFzcyBJ
bmxpbmVGbG93Qm94OworY2xhc3MgUG9zaXRpb247CiBjbGFzcyBSZW5kZXJCb3hNb2RlbE9iamVj
dDsKIGNsYXNzIFJlbmRlcklubGluZTsKIGNsYXNzIFJlbmRlckJsb2NrOwpAQCAtNDU4LDYgKzQ2
MCw4IEBAIHB1YmxpYzoKIAogICAgIFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbkZvckNvb3JkaW5h
dGVzKGludCB4LCBpbnQgeSk7CiAgICAgdmlydHVhbCBWaXNpYmxlUG9zaXRpb24gcG9zaXRpb25G
b3JQb2ludChjb25zdCBJbnRQb2ludCYpOworICAgIFZpc2libGVQb3NpdGlvbiBjcmVhdGVWaXNp
YmxlUG9zaXRpb24oaW50IG9mZnNldCwgRUFmZmluaXR5KTsKKyAgICBWaXNpYmxlUG9zaXRpb24g
Y3JlYXRlVmlzaWJsZVBvc2l0aW9uKGNvbnN0IFBvc2l0aW9uJik7CiAKICAgICB2aXJ0dWFsIHZv
aWQgZGlydHlMaW5lc0Zyb21DaGFuZ2VkQ2hpbGQoUmVuZGVyT2JqZWN0Kik7CiAKSW5kZXg6IFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclJlcGxhY2VkLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJSZXBsYWNlZC5jcHAJKHJldmlzaW9uIDQxODY4KQorKysgV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyUmVwbGFjZWQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMDksNyAr
MjA5LDcgQEAgVmlzaWJsZVBvc2l0aW9uIFJlbmRlclJlcGxhY2VkOjpwb3NpdGlvbgogewogICAg
IElubGluZUJveCogYm94ID0gaW5saW5lQm94V3JhcHBlcigpOwogICAgIGlmICghYm94KQotICAg
ICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG5vZGUoKSwgMCwgRE9XTlNUUkVBTSk7CisgICAg
ICAgIHJldHVybiBjcmVhdGVWaXNpYmxlUG9zaXRpb24oMCwgRE9XTlNUUkVBTSk7CiAKICAgICAv
LyBGSVhNRTogVGhpcyBjb2RlIGlzIGJ1Z2d5IGlmIHRoZSByZXBsYWNlZCBlbGVtZW50IGlzIHJl
bGF0aXZlIHBvc2l0aW9uZWQuCiAKQEAgLTIxOSwxNSArMjE5LDE1IEBAIFZpc2libGVQb3NpdGlv
biBSZW5kZXJSZXBsYWNlZDo6cG9zaXRpb24KICAgICBpbnQgYm90dG9tID0gcm9vdC0+bmV4dFJv
b3RCb3goKSA/IHJvb3QtPm5leHRSb290Qm94KCktPnRvcE92ZXJmbG93KCkgOiByb290LT5ib3R0
b21PdmVyZmxvdygpOwogCiAgICAgaWYgKHBvaW50LnkoKSArIHkoKSA8IHRvcCkKLSAgICAgICAg
cmV0dXJuIFZpc2libGVQb3NpdGlvbihub2RlKCksIGNhcmV0TWluT2Zmc2V0KCksIERPV05TVFJF
QU0pOyAvLyBjb29yZGluYXRlcyBhcmUgYWJvdmUKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVZpc2li
bGVQb3NpdGlvbihjYXJldE1pbk9mZnNldCgpLCBET1dOU1RSRUFNKTsgLy8gY29vcmRpbmF0ZXMg
YXJlIGFib3ZlCiAgICAgCiAgICAgaWYgKHBvaW50LnkoKSArIHkoKSA+PSBib3R0b20pCi0gICAg
ICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24obm9kZSgpLCBjYXJldE1heE9mZnNldCgpLCBET1dO
U1RSRUFNKTsgLy8gY29vcmRpbmF0ZXMgYXJlIGJlbG93CisgICAgICAgIHJldHVybiBjcmVhdGVW
aXNpYmxlUG9zaXRpb24oY2FyZXRNYXhPZmZzZXQoKSwgRE9XTlNUUkVBTSk7IC8vIGNvb3JkaW5h
dGVzIGFyZSBiZWxvdwogICAgIAogICAgIGlmIChub2RlKCkpIHsKICAgICAgICAgaWYgKHBvaW50
LngoKSA8PSB3aWR0aCgpIC8gMikKLSAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24o
bm9kZSgpLCAwLCBET1dOU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihu
b2RlKCksIDEsIERPV05TVFJFQU0pOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQ
b3NpdGlvbigwLCBET1dOU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3Np
dGlvbigxLCBET1dOU1RSRUFNKTsKICAgICB9CiAKICAgICByZXR1cm4gUmVuZGVyQm94Ojpwb3Np
dGlvbkZvclBvaW50KHBvaW50KTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNWR0lu
bGluZVRleHQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNWR0lu
bGluZVRleHQuY3BwCShyZXZpc2lvbiA0MTg2OCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
clNWR0lubGluZVRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTIsMTMgKzE1MiwxMyBAQCBW
aXNpYmxlUG9zaXRpb24gUmVuZGVyU1ZHSW5saW5lVGV4dDo6cG9zCiAgICAgU1ZHSW5saW5lVGV4
dEJveCogdGV4dEJveCA9IHN0YXRpY19jYXN0PFNWR0lubGluZVRleHRCb3gqPihmaXJzdFRleHRC
b3goKSk7CiAKICAgICBpZiAoIXRleHRCb3ggfHwgdGV4dExlbmd0aCgpID09IDApCi0gICAgICAg
IHJldHVybiBWaXNpYmxlUG9zaXRpb24obm9kZSgpLCAwLCBET1dOU1RSRUFNKTsKKyAgICAgICAg
cmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbigwLCBET1dOU1RSRUFNKTsKIAogICAgIFNWR1Jv
b3RJbmxpbmVCb3gqIHJvb3RCb3ggPSB0ZXh0Qm94LT5zdmdSb290SW5saW5lQm94KCk7CiAgICAg
UmVuZGVyQmxvY2sqIG9iamVjdCA9IHJvb3RCb3ggPyByb290Qm94LT5ibG9jaygpIDogMDsKIAog
ICAgIGlmICghb2JqZWN0KQotICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG5vZGUoKSwg
MCwgRE9XTlNUUkVBTSk7CisgICAgICAgIHJldHVybiBjcmVhdGVWaXNpYmxlUG9zaXRpb24oMCwg
RE9XTlNUUkVBTSk7CiAKICAgICBpbnQgY2xvc2VzdE9mZnNldEluQm94ID0gMDsKIApAQCAtMTgx
LDcgKzE4MSw3IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJTVkdJbmxpbmVUZXh0Ojpwb3MKICAg
ICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24obm9kZSgpLCBjbG9z
ZXN0T2Zmc2V0SW5Cb3gsIERPV05TVFJFQU0pOworICAgIHJldHVybiBjcmVhdGVWaXNpYmxlUG9z
aXRpb24oY2xvc2VzdE9mZnNldEluQm94LCBET1dOU1RSRUFNKTsKIH0KIAogdm9pZCBSZW5kZXJT
VkdJbmxpbmVUZXh0OjpkZXN0cm95KCkKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRl
eHQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHQuY3BwCShy
ZXZpc2lvbiA0MTg2OCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMTYsNyArMzE2LDcgQEAgSW5saW5lVGV4dEJveCogUmVuZGVyVGV4dDo6
ZmluZE5leHRJbmxpbgogVmlzaWJsZVBvc2l0aW9uIFJlbmRlclRleHQ6OnBvc2l0aW9uRm9yUG9p
bnQoY29uc3QgSW50UG9pbnQmIHBvaW50KQogewogICAgIGlmICghZmlyc3RUZXh0Qm94KCkgfHwg
dGV4dExlbmd0aCgpID09IDApCi0gICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24obm9kZSgp
LCAwLCBET1dOU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbigw
LCBET1dOU1RSRUFNKTsKIAogICAgIC8vIEdldCB0aGUgb2Zmc2V0IGZvciB0aGUgcG9zaXRpb24s
IHNpbmNlIHRoaXMgd2lsbCB0YWtlIHJ0bCB0ZXh0IGludG8gYWNjb3VudC4KICAgICBpbnQgb2Zm
c2V0OwpAQCAtMzI2LDEzICszMjYsMTMgQEAgVmlzaWJsZVBvc2l0aW9uIFJlbmRlclRleHQ6OnBv
c2l0aW9uRm9yUAogICAgICAgICAvLyBhdCB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBs
aW5lIG9yIGFib3ZlCiAgICAgICAgIC8vIGFuZCB0aGUgeCBjb29yZGluYXRlIGlzIHRvIHRoZSBs
ZWZ0IG9mIHRoZSBmaXJzdCB0ZXh0IGJveCBsZWZ0IGVkZ2UKICAgICAgICAgb2Zmc2V0ID0gZmly
c3RUZXh0Qm94KCktPm9mZnNldEZvclBvc2l0aW9uKHBvaW50LngoKSk7Ci0gICAgICAgIHJldHVy
biBWaXNpYmxlUG9zaXRpb24obm9kZSgpLCBvZmZzZXQgKyBmaXJzdFRleHRCb3goKS0+c3RhcnQo
KSwgRE9XTlNUUkVBTSk7CisgICAgICAgIHJldHVybiBjcmVhdGVWaXNpYmxlUG9zaXRpb24ob2Zm
c2V0ICsgZmlyc3RUZXh0Qm94KCktPnN0YXJ0KCksIERPV05TVFJFQU0pOwogICAgIH0KICAgICBp
ZiAobGFzdFRleHRCb3goKSAmJiBwb2ludC55KCkgPj0gbGFzdFRleHRCb3goKS0+cm9vdCgpLT50
b3BPdmVyZmxvdygpICYmIHBvaW50LngoKSA+PSBsYXN0VGV4dEJveCgpLT5tX3ggKyBsYXN0VGV4
dEJveCgpLT5tX3dpZHRoKSB7CiAgICAgICAgIC8vIGF0IHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhl
IGxhc3QgbGluZSBvciBiZWxvdwogICAgICAgICAvLyBhbmQgdGhlIHggY29vcmRpbmF0ZSBpcyB0
byB0aGUgcmlnaHQgb2YgdGhlIGxhc3QgdGV4dCBib3ggcmlnaHQgZWRnZQogICAgICAgICBvZmZz
ZXQgPSBsYXN0VGV4dEJveCgpLT5vZmZzZXRGb3JQb3NpdGlvbihwb2ludC54KCkpOwotICAgICAg
ICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG5vZGUoKSwgb2Zmc2V0ICsgbGFzdFRleHRCb3goKS0+
c3RhcnQoKSwgRE9XTlNUUkVBTSk7CisgICAgICAgIHJldHVybiBjcmVhdGVWaXNpYmxlUG9zaXRp
b24ob2Zmc2V0ICsgbGFzdFRleHRCb3goKS0+c3RhcnQoKSwgRE9XTlNUUkVBTSk7CiAgICAgfQog
CiAgICAgSW5saW5lVGV4dEJveCogbGFzdEJveEFib3ZlID0gMDsKQEAgLTM0NSwyOSArMzQ1LDI5
IEBAIFZpc2libGVQb3NpdGlvbiBSZW5kZXJUZXh0Ojpwb3NpdGlvbkZvclAKICAgICAgICAgICAg
ICAgICBpZiAocG9pbnQueCgpID09IGJveC0+bV94KQogICAgICAgICAgICAgICAgICAgICAvLyB0
aGUgeCBjb29yZGluYXRlIGlzIGVxdWFsIHRvIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhpcyBib3gKICAg
ICAgICAgICAgICAgICAgICAgLy8gdGhlIGFmZmluaXR5IG11c3QgYmUgZG93bnN0cmVhbSBzbyB0
aGUgcG9zaXRpb24gZG9lc24ndCBqdW1wIGJhY2sgdG8gdGhlIHByZXZpb3VzIGxpbmUKLSAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihub2RlKCksIG9mZnNldCArIGJv
eC0+c3RhcnQoKSwgRE9XTlNUUkVBTSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVh
dGVWaXNpYmxlUG9zaXRpb24ob2Zmc2V0ICsgYm94LT5zdGFydCgpLCBET1dOU1RSRUFNKTsKIAog
ICAgICAgICAgICAgICAgIGlmIChwb2ludC54KCkgPCBib3gtPm1feCArIGJveC0+bV93aWR0aCkK
ICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSB4IGNvb3JkaW5hdGUgaXMgdG8gdGhlIGxl
ZnQgb2YgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhpcyBib3gKICAgICAgICAgICAgICAgICAgICAgLy8g
Y2hlY2sgdG8gc2VlIGlmIHBvc2l0aW9uIGdvZXMgaW4gdGhpcyBib3gKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihub2RlKCksIG9mZnNldCArIGJveC0+c3RhcnQo
KSwgb2Zmc2V0ID4gMCA/IFZQX1VQU1RSRUFNX0lGX1BPU1NJQkxFIDogRE9XTlNUUkVBTSk7Cisg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVWaXNpYmxlUG9zaXRpb24ob2Zmc2V0ICsg
Ym94LT5zdGFydCgpLCBvZmZzZXQgPiAwID8gVlBfVVBTVFJFQU1fSUZfUE9TU0lCTEUgOiBET1dO
U1RSRUFNKTsKIAogICAgICAgICAgICAgICAgIGlmICghYm94LT5wcmV2T25MaW5lKCkgJiYgcG9p
bnQueCgpIDwgYm94LT5tX3gpCiAgICAgICAgICAgICAgICAgICAgIC8vIGJveCBpcyBmaXJzdCBv
biBsaW5lCiAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgeCBjb29yZGluYXRlIGlzIHRv
IHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCB0ZXh0IGJveCBsZWZ0IGVkZ2UKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihub2RlKCksIG9mZnNldCArIGJveC0+c3RhcnQo
KSwgRE9XTlNUUkVBTSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVWaXNpYmxl
UG9zaXRpb24ob2Zmc2V0ICsgYm94LT5zdGFydCgpLCBET1dOU1RSRUFNKTsKIAogICAgICAgICAg
ICAgICAgIGlmICghYm94LT5uZXh0T25MaW5lKCkpCiAgICAgICAgICAgICAgICAgICAgIC8vIGJv
eCBpcyBsYXN0IG9uIGxpbmUKICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSB4IGNvb3Jk
aW5hdGUgaXMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBsYXN0IHRleHQgYm94IHJpZ2h0IGVkZ2UKICAg
ICAgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgVmlzaWJsZVBvc2l0aW9uLCB1c2UgVVBTVFJF
QU0gYWZmaW5pdHkgaWYgcG9zc2libGUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZpc2li
bGVQb3NpdGlvbihub2RlKCksIG9mZnNldCArIGJveC0+c3RhcnQoKSwgb2Zmc2V0ID4gMCA/IFZQ
X1VQU1RSRUFNX0lGX1BPU1NJQkxFIDogRE9XTlNUUkVBTSk7CisgICAgICAgICAgICAgICAgICAg
IHJldHVybiBjcmVhdGVWaXNpYmxlUG9zaXRpb24ob2Zmc2V0ICsgYm94LT5zdGFydCgpLCBvZmZz
ZXQgPiAwID8gVlBfVVBTVFJFQU1fSUZfUE9TU0lCTEUgOiBET1dOU1RSRUFNKTsKICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgIGxhc3RCb3hBYm92ZSA9IGJveDsKICAgICAgICAgfQogICAgIH0K
IAotICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24obm9kZSgpLCBsYXN0Qm94QWJvdmUgPyBsYXN0
Qm94QWJvdmUtPnN0YXJ0KCkgKyBsYXN0Qm94QWJvdmUtPmxlbigpIDogMCwgRE9XTlNUUkVBTSk7
CisgICAgcmV0dXJuIGNyZWF0ZVZpc2libGVQb3NpdGlvbihsYXN0Qm94QWJvdmUgPyBsYXN0Qm94
QWJvdmUtPnN0YXJ0KCkgKyBsYXN0Qm94QWJvdmUtPmxlbigpIDogMCwgRE9XTlNUUkVBTSk7CiB9
CiAKIEludFJlY3QgUmVuZGVyVGV4dDo6bG9jYWxDYXJldFJlY3QoSW5saW5lQm94KiBpbmxpbmVC
b3gsIGludCBjYXJldE9mZnNldCwgaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpCkluZGV4OiBM
YXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MTg2OCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5
KQpAQCAtMSwzICsxLDE0IEBACisyMDA5LTAzLTIwICBEYXJpbiBBZGxlciAgPGRhcmluQGFwcGxl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBC
dWcgMjQ3MjY6IGhpdCB0ZXN0aW5nIGRvZXNuJ3Qgd29yayByaWdodCB3aGVuIHRoZSBjbGljayBp
cyBvbiBhbm9ueW1vdXMgY29udGVudAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjQ3MjYKKyAgICAgICAgcmRhcjovL3Byb2JsZW0vNjY5Njk5MgorCisg
ICAgICAgICogZWRpdGluZy9zZWxlY3Rpb24vaGl0LXRlc3QtYW5vbnltb3VzLWV4cGVjdGVkLnR4
dDogQWRkZWQuCisgICAgICAgICogZWRpdGluZy9zZWxlY3Rpb24vaGl0LXRlc3QtYW5vbnltb3Vz
Lmh0bWw6IEFkZGVkLgorCiAyMDA5LTAzLTIwICBCZXRoIERha2luICA8YmRha2luQGFwcGxlLmNv
bT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXZlIEh5YXR0LgpJbmRleDogTGF5b3V0VGVzdHMv
ZWRpdGluZy9zZWxlY3Rpb24vaGl0LXRlc3QtYW5vbnltb3VzLWV4cGVjdGVkLnR4dAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9oaXQtdGVzdC1hbm9ueW1vdXMt
ZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rp
b24vaGl0LXRlc3QtYW5vbnltb3VzLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAgLTAsMCAr
MSw1IEBACitUaGlzIHRlc3RzIGNsaWNraW5nIGluIGFub255bW91cyBjb250ZW50IHRvIHNlZSBp
ZiBhIHNlbGVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4KKworVGhpcyBpcyB0aGUgc2Vs
ZWN0YWJsZSB0ZXh0LgorCitTVUNDRVNTCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBMYXlvdXRUZXN0
cy9lZGl0aW5nL3NlbGVjdGlvbi9oaXQtdGVzdC1hbm9ueW1vdXMtZXhwZWN0ZWQudHh0Cl9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAgKyBuYXRpdmUKCkluZGV4OiBMYXlvdXRUZXN0
cy9lZGl0aW5nL3NlbGVjdGlvbi9oaXQtdGVzdC1hbm9ueW1vdXMuaHRtbAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9oaXQtdGVzdC1hbm9ueW1vdXMuaHRtbAko
cmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2hpdC10ZXN0LWFu
b255bW91cy5odG1sCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc0IEBACis8aGVhZD4KKzxzdHls
ZT4KK3NwYW46YmVmb3JlIHsKKyAgICBjb250ZW50OiAiPGJlZm9yZT4gIjsKK30KK3NwYW46YWZ0
ZXIgeworICAgIGNvbnRlbnQ6ICIgPGFmdGVyPiI7Cit9Cis8L3N0eWxlPgorPHNjcmlwdD4KKyAg
ICBmdW5jdGlvbiBub2RlQXNTdHJpbmcobm9kZSkKKyAgICB7CisgICAgICAgIGlmIChub2RlICYm
IG5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpCisgICAgICAgICAgICByZXR1cm4gInRl
eHQgaW4gIiArIG5vZGVBc1N0cmluZyhub2RlLnBhcmVudE5vZGUpOworICAgICAgICBpZiAobm9k
ZSAmJiBub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CisgICAgICAgICAgICB2
YXIgaWQ7CisgICAgICAgICAgICBpZiAoaWQgPSBub2RlLmdldEF0dHJpYnV0ZSgiaWQiKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGU7
CisgICAgfQorICAgIGZ1bmN0aW9uIHNlbGVjdGlvbkFzU3RyaW5nKCkKKyAgICB7CisgICAgICAg
IHJldHVybiAiKCIgKyBub2RlQXNTdHJpbmcoZ2V0U2VsZWN0aW9uKCkuYW5jaG9yTm9kZSkKKyAg
ICAgICAgICAgICsgIiwgIiArIGdldFNlbGVjdGlvbigpLmFuY2hvck9mZnNldAorICAgICAgICAg
ICAgKyAiKSwgKCIgKyBub2RlQXNTdHJpbmcoZ2V0U2VsZWN0aW9uKCkuZm9jdXNOb2RlKQorICAg
ICAgICAgICAgKyAiLCAiICsgZ2V0U2VsZWN0aW9uKCkuZm9jdXNPZmZzZXQgKyAiKSI7ICAgICAg
ICAKKyAgICB9CisgICAgZnVuY3Rpb24gY2hlY2tTZWxlY3Rpb24oc3RlcCwgZXhwZWN0ZWQpCisg
ICAgeworICAgICAgICBpZiAoc2VsZWN0aW9uQXNTdHJpbmcoKSAhPT0gZXhwZWN0ZWQpIHsKKyAg
ICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXN1bHQiKS5pbm5lckhUTUwgPSAi
RkFJTDogQWZ0ZXIgc3RlcCAiICsgc3RlcCArICIgc2VsZWN0aW9uIHdhcyAiICsgc2VsZWN0aW9u
QXNTdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZnVuY3Rpb24gcnVuVGVzdCgpCisgICAgeworICAg
ICAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICAgICAgbGF5b3V0
VGVzdENvbnRyb2xsZXIuZHVtcEFzVGV4dCgpOworCisgICAgICAgIHZhciBibG9jayA9IGRvY3Vt
ZW50LmdldEVsZW1lbnRCeUlkKCJibG9jayIpOworICAgICAgICB2YXIgeCA9IGJsb2NrLm9mZnNl
dExlZnQgKyA1OworICAgICAgICB2YXIgeSA9IGJsb2NrLm9mZnNldFRvcCArIDU7CisKKyAgICAg
ICAgaWYgKHdpbmRvdy5ldmVudFNlbmRlcikgeworICAgICAgICAgICAgZXZlbnRTZW5kZXIubW91
c2VNb3ZlVG8oeCwgeSk7CisgICAgICAgICAgICBldmVudFNlbmRlci5tb3VzZURvd24oKTsKKyAg
ICAgICAgICAgIGV2ZW50U2VuZGVyLm1vdXNlVXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlm
IChjaGVja1NlbGVjdGlvbigxLCAiKHRleHQgaW4gc3BhbiwgMCksICh0ZXh0IGluIHNwYW4sIDAp
IikpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgeCA9IGJsb2NrLm9mZnNldExlZnQg
KyAyMDA7CisKKyAgICAgICAgaWYgKHdpbmRvdy5ldmVudFNlbmRlcikgeworICAgICAgICAgICAg
ZXZlbnRTZW5kZXIubW91c2VNb3ZlVG8oeCwgeSk7CisgICAgICAgICAgICBldmVudFNlbmRlci5t
b3VzZURvd24oKTsKKyAgICAgICAgICAgIGV2ZW50U2VuZGVyLm1vdXNlVXAoKTsKKyAgICAgICAg
fQorCisgICAgICAgIGlmIChjaGVja1NlbGVjdGlvbigyLCAiKHRleHQgaW4gc3BhbiwgMjQpLCAo
dGV4dCBpbiBzcGFuLCAyNCkiKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBkb2N1
bWVudC5nZXRFbGVtZW50QnlJZCgicmVzdWx0IikuaW5uZXJIVE1MID0gIlNVQ0NFU1MiOworICAg
IH0KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHkgb25sb2FkPSJydW5UZXN0KCkiPgorPHA+VGhp
cyB0ZXN0cyBjbGlja2luZyBpbiBhbm9ueW1vdXMgY29udGVudCB0byBzZWUgaWYgYSBzZWxlY3Rp
b24gaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuPC9wPgorPHAgaWQ9ImJsb2NrIiBjb250ZW50RWRp
dGFibGUgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsdWUiPjxzcGFuIGlkPSJzcGFuIj5UaGlz
IGlzIHRoZSBzZWxlY3RhYmxlIHRleHQuPC9zcGFuPjwvZGl2PgorPHAgaWQ9InJlc3VsdCI+VEVT
VCBESUQgTk9UIFJVTjwvZGl2PgorPC9ib2R5PgoKUHJvcGVydHkgY2hhbmdlcyBvbjogTGF5b3V0
VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vaGl0LXRlc3QtYW5vbnltb3VzLmh0bWwKX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
XwpBZGRlZDogc3ZuOm1pbWUtdHlwZQogICArIHRleHQvaHRtbApBZGRlZDogc3ZuOmVvbC1zdHls
ZQogICArIG5hdGl2ZQoK
</data>
<flag name="review"
          id="14219"
          type_id="1"
          status="+"
          setter="adele"
    />
          </attachment>
      

    </bug>

</bugzilla>