<?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>22996</bug_id>
          
          <creation_ts>2008-12-25 19:19:14 -0800</creation_ts>
          <short_desc>RenderTextControl unecessarily combines multi/single line text control rendering</short_desc>
          <delta_ts>2008-12-28 13:13:31 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>XML</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>
          
          <blocked>20393</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Nikolas Zimmermann">zimmermann</reporter>
          <assigned_to name="Nikolas Zimmermann">zimmermann</assigned_to>
          <cc>darin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>103426</commentid>
    <comment_count>0</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-25 19:19:14 -0800</bug_when>
    <thetext>As the summary says, RenderTextControl is quite bloated. It has several problems:
it&apos;s tied to HTMLInputElement/HTMLTextAreaElement - making it hard to reuse it for WML at the moment.
The memory usage for multi-line controls is unnecessarily high, all member variables related to popup menus / search fields are not needed for these controls.

I&apos;ve created a patch splitting up RenderTextControl in RenderTextControlSingleLine / RenderTextControlMultiLine, I&apos;d love to hear some comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103427</commentid>
    <comment_count>1</comment_count>
      <attachid>26249</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-25 19:20:46 -0800</bug_when>
    <thetext>Created attachment 26249
Initial patch

Initial patch implementing the split-up. Only touches a few lines of HTMLInput/TextAreaElement - the rest is all about splitting up RenderTextControl.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103435</commentid>
    <comment_count>2</comment_count>
      <attachid>26249</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-12-25 23:31:10 -0800</bug_when>
    <thetext>Comment on attachment 26249
Initial patch

This looks like a good approach.

Please be careful about the copyright. Some files have only the Torch Mobile copyright, so please be sure there&apos;s nothing that came from the existing code there.

&gt; -    RenderTextControl(Node*, bool multiLine);
&gt; +    RenderTextControl(Node*);

I think it would be better to have the constructor be protected since RenderTextControl an abstract base class now.

&gt; +    virtual void forwardEvent(Event*);

This RenderTextControl member function should be protected and non-virtual. There&apos;s no caller that needs to call this on a RenderTextControl*, so there&apos;s no need to make it a public virtual function rather than a protected non-virtual one.

&gt; +    void updateInnerTextValue(const String&amp;);

Why not name this setInnerTextValue?

&gt; +    virtual void processStyleChange() { }

I&apos;m not sure the name processStyleChange clearly distinguishes this new function from styleDidChange. Why can&apos;t the derived class override styleDidChange instead? If there&apos;s a good reason, maybe this new function&apos;s name could reflect that reason. Maybe it&apos;s the precise timing of the call, and it could reflect that?

&gt; +    void createSubtreeIfNeeded(Node* innerBlock);

I think Element* is a better type to use here than Node*.

&gt; +    bool nodeAtPoint(const HitTestRequest&amp;, HitTestResult&amp;, int x, int y, int tx, int ty, HitTestAction, Node* innerBlock);

I think it&apos;s too subtle to have this non-virtual helper function have the same name as the virtual function, and differ only in the extra parameter. I think we should find a different name for it. Also, I think that the innerBlock argument should be a TextControlInnerElement*, not a Node*.

&gt; +    bool m_edited : 1;
&gt; +    bool m_userEdited : 1;

It&apos;s inconsistent to change these to bit fields (implying we think the 8 bits per bool memory is precious enough that we want the slower bigger code -- or maybe it&apos;s 32 bits per bool?), but to put the different bits in the derived classes (implying we don&apos;t care about the extra 32 bits it costs to have two different sets of bit fields). I think it would be better to be consistent.

&gt; +void RenderTextControlMultiLine::forwardEvent(Event* evt)

Is there a good reason to abbreviate the name &quot;event&quot;? I&apos;d prefer not to.

&gt; +    if (evt-&gt;type() == eventNames().blurEvent || evt-&gt;type() == eventNames().focusEvent)
&gt; +        return;
&gt; +
&gt; +    RenderTextControl::forwardEvent(evt);

Could this behavior go in the base class? We never want to forward these blur and focus events.

&gt; +void RenderTextControlMultiLine::calcExtraLineHeight(int lineHeight)

I&apos;m not sure I&apos;m happy with the name &quot;calc&quot; for a function that mutates the object. This function doesn&apos;t &quot;calculate extra line height&quot;. Frankly, I don&apos;t know what it does, because I don&apos;t see any code calling it!

&gt; +private:
&gt; +    virtual int preferredWidth(float charWidth) const;

It&apos;s a little strange to call this &quot;preferredWidth&quot; when actually the preferredWidth includes the padding. We should look for a name that makes that more explicit.

&gt; +class RenderTextControlSingleLine : public RenderTextControl
&gt; +                                  , private PopupMenuClient {

We haven&apos;t done this formatting in most places in WebKit the past and I&apos;d prefer not to do it unless we have consensus we should do it this way. It seems this case fit fine on one line.

&gt;      RenderTextControl* renderer = static_cast&lt;RenderTextControl*&gt;(node()-&gt;shadowAncestorNode()-&gt;renderer());
&gt; -    
&gt; -    return RenderBlock::nodeAtPoint(request, result, x, y, tx, ty, renderer-&gt;placeholderIsVisible() ? HitTestBlockBackground : hitTestAction);
&gt; +
&gt; +    bool placeholderIsVisible = false;
&gt; +    if (renderer-&gt;isTextField())
&gt; +        placeholderIsVisible = static_cast&lt;RenderTextControlSingleLine*&gt;(renderer)-&gt;placeholderIsVisible();
&gt; +
&gt; +    return RenderBlock::nodeAtPoint(request, result, x, y, tx, ty, placeholderIsVisible ? HitTestBlockBackground : hitTestAction);

It seems to me that the line that sets up the renderer local variable doesn&apos;t need to cast to RenderTextControl* -- it can just use RenderObject*.

&gt; -        if (input &amp;&amp; input-&gt;renderer() &amp;&amp; static_cast&lt;RenderTextControl*&gt;(input-&gt;renderer())-&gt;popupIsVisible())
&gt; -            static_cast&lt;RenderTextControl*&gt;(input-&gt;renderer())-&gt;hidePopup();
&gt; -        else if (input-&gt;maxResults() &gt; 0)
&gt; -            static_cast&lt;RenderTextControl*&gt;(input-&gt;renderer())-&gt;showPopup();
&gt; +        RenderTextControlSingleLine* renderer = static_cast&lt;RenderTextControlSingleLine*&gt;(input-&gt;renderer());
&gt; +        ASSERT(renderer);

I understand that the old code had unnecessary null checking of the renderer, but I&apos;m not sure an assertion is all that helpful. Clearly the shadow DOM wouldn&apos;t exist if the renderer didn&apos;t exist, and I don&apos;t think the assert adds much.

&gt; +        if (renderer-&gt;popupIsVisible())
&gt; +            renderer-&gt;hidePopup();
&gt; +        else if (input-&gt;maxResults() &gt; 0) {
&gt; +            ASSERT(!renderer-&gt;popupIsVisible());
&gt; +            renderer-&gt;showPopup();
&gt; +        }

This assertion you added seems non-helpful. I suggest just leaving it out.

review- because of the non-called calcExtraLineHeight function</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103475</commentid>
    <comment_count>3</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-26 10:45:01 -0800</bug_when>
    <thetext>Hey Darin,

forgot to say merry x-mas :-)
&gt; This looks like a good approach.
That&apos;s good to hear, I was posting this patch in this early state, to get exactly the kind of comments you&apos;ve provided - glad you took the time to check that big patch.
 
&gt; Please be careful about the copyright. Some files have only the Torch Mobile
&gt; copyright, so please be sure there&apos;s nothing that came from the existing code
&gt; there.
IIRC only the new headers contain TorchMobile-only copyright? I thought that&apos;s ok, even if some methods existed in the other header before. If not, I can readd the Apple copyright in the new headers as well.
 
&gt; &gt; -    RenderTextControl(Node*, bool multiLine);
&gt; &gt; +    RenderTextControl(Node*);
&gt; 
&gt; I think it would be better to have the constructor be protected since
&gt; RenderTextControl an abstract base class now.
Good catch!
 
&gt; &gt; +    virtual void forwardEvent(Event*);
&gt; 
&gt; This RenderTextControl member function should be protected and non-virtual.
&gt; There&apos;s no caller that needs to call this on a RenderTextControl*, so there&apos;s
&gt; no need to make it a public virtual function rather than a protected
&gt; non-virtual one.
Right, my fault.

&gt; &gt; +    void updateInnerTextValue(const String&amp;);
&gt; 
&gt; Why not name this setInnerTextValue?
Agreed.
 
&gt; &gt; +    virtual void processStyleChange() { }
&gt; 
&gt; I&apos;m not sure the name processStyleChange clearly distinguishes this new
&gt; function from styleDidChange. Why can&apos;t the derived class override
&gt; styleDidChange instead? If there&apos;s a good reason, maybe this new function&apos;s
&gt; name could reflect that reason. Maybe it&apos;s the precise timing of the call, and
&gt; it could reflect that?
It affects timing, &apos;processStyleChange&apos; has to be called after the base class didStyleChange method has been called. I tried just reimplementing styleDidChange in the subclasses, and it failed.. Though as this was some days ago, I&apos;m going to retry it. Maybe it turns out overriding styleDidChange() works fine.

&gt; 
&gt; &gt; +    void createSubtreeIfNeeded(Node* innerBlock);
&gt; 
&gt; I think Element* is a better type to use here than Node*.
Then we could directly use TextControlInnerElement, no?

&gt; 
&gt; &gt; +    bool nodeAtPoint(const HitTestRequest&amp;, HitTestResult&amp;, int x, int y, int tx, int ty, HitTestAction, Node* innerBlock);
&gt; 
&gt; I think it&apos;s too subtle to have this non-virtual helper function have the same
&gt; name as the virtual function, and differ only in the extra parameter. I think
&gt; we should find a different name for it. Also, I think that the innerBlock
&gt; argument should be a TextControlInnerElement*, not a Node*.
You&apos;re right, I didn&apos;t like the solution as well. Will think about this.

&gt; 
&gt; &gt; +    bool m_edited : 1;
&gt; &gt; +    bool m_userEdited : 1;
&gt; 
&gt; It&apos;s inconsistent to change these to bit fields (implying we think the 8 bits
&gt; per bool memory is precious enough that we want the slower bigger code -- or
&gt; maybe it&apos;s 32 bits per bool?), but to put the different bits in the derived
&gt; classes (implying we don&apos;t care about the extra 32 bits it costs to have two
&gt; different sets of bit fields). I think it would be better to be consistent.
I _think_ it&apos;s 32 bit per bool, but I&apos;d need to check it as well. I&apos;ll revert the bitfield change.
 
&gt; &gt; +void RenderTextControlMultiLine::forwardEvent(Event* evt)
&gt; 
&gt; Is there a good reason to abbreviate the name &quot;event&quot;? I&apos;d prefer not to.
No reason, but &apos;Event* evt&apos; is used all over WebCore, just like &quot;Document* doc&quot;.
I&apos;m all for changing this!
 
&gt; &gt; +    if (evt-&gt;type() == eventNames().blurEvent || evt-&gt;type() == eventNames().focusEvent)
&gt; &gt; +        return;
&gt; &gt; +
&gt; &gt; +    RenderTextControl::forwardEvent(evt);
&gt; 
&gt; Could this behavior go in the base class? We never want to forward these blur
&gt; and focus events.
Well RenderTextControlSingleLine::forwardEvent() handles blur/focus events?
So I don&apos;t think that logic can go in the base class.

&gt; 
&gt; &gt; +void RenderTextControlMultiLine::calcExtraLineHeight(int lineHeight)
&gt; 
&gt; I&apos;m not sure I&apos;m happy with the name &quot;calc&quot; for a function that mutates the
&gt; object. This function doesn&apos;t &quot;calculate extra line height&quot;. Frankly, I don&apos;t
&gt; know what it does, because I don&apos;t see any code calling it!
RenderTextControl::calcHeight() uses this helper function. It&apos;s named in a really bad way - it was 5 am ;-) What it does, is restricting the passed lineHeight parameter, to the maximum possible line height (result/cancel button in a search field, may enlarge the lineHeight) and then it adds this contrained lineHeight to the m_height parameter. Text area elements multiply this lineHeight with the number of rows. Hm, could you suggest a better name?

&gt; &gt; +private:
&gt; &gt; +    virtual int preferredWidth(float charWidth) const;
&gt; 
&gt; It&apos;s a little strange to call this &quot;preferredWidth&quot; when actually the
&gt; preferredWidth includes the padding. We should look for a name that makes that
&gt; more explicit.
How about preferredAbsoluteWidth(IncludingPadding) ?
 
&gt; &gt; +class RenderTextControlSingleLine : public RenderTextControl
&gt; &gt; +                                  , private PopupMenuClient {
&gt; 
&gt; We haven&apos;t done this formatting in most places in WebKit the past and I&apos;d
&gt; prefer not to do it unless we have consensus we should do it this way. It seems
&gt; this case fit fine on one line.
Okay, fine with me.

&gt; 
&gt; &gt;      RenderTextControl* renderer = static_cast&lt;RenderTextControl*&gt;(node()-&gt;shadowAncestorNode()-&gt;renderer());
&gt; &gt; -    
&gt; &gt; -    return RenderBlock::nodeAtPoint(request, result, x, y, tx, ty, renderer-&gt;placeholderIsVisible() ? HitTestBlockBackground : hitTestAction);
&gt; &gt; +
&gt; &gt; +    bool placeholderIsVisible = false;
&gt; &gt; +    if (renderer-&gt;isTextField())
&gt; &gt; +        placeholderIsVisible = static_cast&lt;RenderTextControlSingleLine*&gt;(renderer)-&gt;placeholderIsVisible();
&gt; &gt; +
&gt; &gt; +    return RenderBlock::nodeAtPoint(request, result, x, y, tx, ty, placeholderIsVisible ? HitTestBlockBackground : hitTestAction);
&gt; 
&gt; It seems to me that the line that sets up the renderer local variable doesn&apos;t
&gt; need to cast to RenderTextControl* -- it can just use RenderObject*.
Oh it was meant to save the cast below, I&apos;ll change that.
 
&gt; &gt; -        if (input &amp;&amp; input-&gt;renderer() &amp;&amp; static_cast&lt;RenderTextControl*&gt;(input-&gt;renderer())-&gt;popupIsVisible())
&gt; &gt; -            static_cast&lt;RenderTextControl*&gt;(input-&gt;renderer())-&gt;hidePopup();
&gt; &gt; -        else if (input-&gt;maxResults() &gt; 0)
&gt; &gt; -            static_cast&lt;RenderTextControl*&gt;(input-&gt;renderer())-&gt;showPopup();
&gt; &gt; +        RenderTextControlSingleLine* renderer = static_cast&lt;RenderTextControlSingleLine*&gt;(input-&gt;renderer());
&gt; &gt; +        ASSERT(renderer);
&gt; 
&gt; I understand that the old code had unnecessary null checking of the renderer,
&gt; but I&apos;m not sure an assertion is all that helpful. Clearly the shadow DOM
&gt; wouldn&apos;t exist if the renderer didn&apos;t exist, and I don&apos;t think the assert adds
&gt; much.
Ok, most added ASSERTS just helped me while doing the split-up patch. I needed to be sure, I was interpreting the code correctly. Those can go away, you&apos;re right.

&gt; 
&gt; &gt; +        if (renderer-&gt;popupIsVisible())
&gt; &gt; +            renderer-&gt;hidePopup();
&gt; &gt; +        else if (input-&gt;maxResults() &gt; 0) {
&gt; &gt; +            ASSERT(!renderer-&gt;popupIsVisible());
&gt; &gt; +            renderer-&gt;showPopup();
&gt; &gt; +        }
&gt; 
&gt; This assertion you added seems non-helpful. I suggest just leaving it out.
Ok.

&gt; 
&gt; review- because of the non-called calcExtraLineHeight function
&gt; 
Thanks a lot for the helpful comments!

Have a nice day,
Niko
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103479</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-12-26 11:07:28 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; &gt; &gt; +    virtual void processStyleChange() { }
&gt; &gt; 
&gt; &gt; I&apos;m not sure the name processStyleChange clearly distinguishes this new
&gt; &gt; function from styleDidChange. Why can&apos;t the derived class override
&gt; &gt; styleDidChange instead? If there&apos;s a good reason, maybe this new function&apos;s
&gt; &gt; name could reflect that reason. Maybe it&apos;s the precise timing of the call, and
&gt; &gt; it could reflect that?
&gt;
&gt; It affects timing, &apos;processStyleChange&apos; has to be called after the base class
&gt; didStyleChange method has been called. I tried just reimplementing
&gt; styleDidChange in the subclasses, and it failed.. Though as this was some days
&gt; ago, I&apos;m going to retry it. Maybe it turns out overriding styleDidChange()
&gt; works fine.

We can address this by changing the name if there is some order dependency. Once we understand what the dependency is then we can easily come up with a clear name.

&gt; &gt; &gt; +    void createSubtreeIfNeeded(Node* innerBlock);
&gt; &gt; 
&gt; &gt; I think Element* is a better type to use here than Node*.
&gt;
&gt; Then we could directly use TextControlInnerElement, no?

I&apos;m not sure the argument here is always a TextControlInnerElement. I think that in at least one case it&apos;s not. Maybe I read the code wrong.

&gt; &gt; &gt; +    bool m_edited : 1;
&gt; &gt; &gt; +    bool m_userEdited : 1;
&gt; &gt; 
&gt; &gt; It&apos;s inconsistent to change these to bit fields (implying we think the 8 bits
&gt; &gt; per bool memory is precious enough that we want the slower bigger code -- or
&gt; &gt; maybe it&apos;s 32 bits per bool?), but to put the different bits in the derived
&gt; &gt; classes (implying we don&apos;t care about the extra 32 bits it costs to have two
&gt; &gt; different sets of bit fields). I think it would be better to be consistent.
&gt;
&gt; I _think_ it&apos;s 32 bit per bool, but I&apos;d need to check it as well. I&apos;ll revert
&gt; the bitfield change.

Under gcc on Mac OS X it&apos;s 8 bits per bool.

&gt; &gt; &gt; +void RenderTextControlMultiLine::forwardEvent(Event* evt)
&gt; &gt; 
&gt; &gt; Is there a good reason to abbreviate the name &quot;event&quot;? I&apos;d prefer not to.
&gt;
&gt; No reason, but &apos;Event* evt&apos; is used all over WebCore, just like &quot;Document*
&gt; doc&quot;.
&gt; I&apos;m all for changing this!

I never use &quot;doc&quot; or &quot;evt&quot; myself; no reason to abbreviate document and event in my opinion. But I do see both in many places. I did a quick grep and found &quot;doc&quot; in about 1000 places and &quot;evt&quot; in about 300 places. But &quot;document&quot; is used in about 3000 places and &quot;event&quot; is used in about 1200 places. So I think the abbreviations are losing out over time. (Although the full words get a boost from things like public APIs and comments, so the numbers aren&apos;t entirely fair.)

&gt; &gt; &gt; +    if (evt-&gt;type() == eventNames().blurEvent || evt-&gt;type() == eventNames().focusEvent)
&gt; &gt; &gt; +        return;
&gt; &gt; &gt; +
&gt; &gt; &gt; +    RenderTextControl::forwardEvent(evt);
&gt; &gt; 
&gt; &gt; Could this behavior go in the base class? We never want to forward these blur
&gt; &gt; and focus events.
&gt;
&gt; Well RenderTextControlSingleLine::forwardEvent() handles blur/focus events?
&gt; So I don&apos;t think that logic can go in the base class.

Well, RenderTextControlSingleLine handles them and never calls the base class. So there&apos;s no harm in doing this check in the base class. And I think my comment is true -- we never want to forward these blur and focus events to the shadow nodes in either case.

It&apos;s a bit faster to not do this work in the base class, but it seems slightly cleaner to me to have the checks there.

&gt; &gt; &gt; +void RenderTextControlMultiLine::calcExtraLineHeight(int lineHeight)
&gt; &gt; 
&gt; &gt; I&apos;m not sure I&apos;m happy with the name &quot;calc&quot; for a function that mutates the
&gt; &gt; object. This function doesn&apos;t &quot;calculate extra line height&quot;. Frankly, I don&apos;t
&gt; &gt; know what it does, because I don&apos;t see any code calling it!
&gt;
&gt; RenderTextControl::calcHeight() uses this helper function. It&apos;s named in a
&gt; really bad way - it was 5 am ;-) What it does, is restricting the passed
&gt; lineHeight parameter, to the maximum possible line height (result/cancel button
&gt; in a search field, may enlarge the lineHeight) and then it adds this contrained
&gt; lineHeight to the m_height parameter. Text area elements multiply this
&gt; lineHeight with the number of rows. Hm, could you suggest a better name?

I think adjustControlHeightBasedOnLineHeight might be a good name if a bit long; or maybe leave out the word &quot;Control&quot;. The word &quot;adjust&quot; seems consistent with both looking at and modifying m_height.

&gt; &gt; &gt; +private:
&gt; &gt; &gt; +    virtual int preferredWidth(float charWidth) const;
&gt; &gt; 
&gt; &gt; It&apos;s a little strange to call this &quot;preferredWidth&quot; when actually the
&gt; &gt; preferredWidth includes the padding. We should look for a name that makes that
&gt; &gt; more explicit.
&gt;
&gt; How about preferredAbsoluteWidth(IncludingPadding) ?

I looked it up and the box inside the padding is called the content box, I suggest the name preferredContentWidth.

I don&apos;t think the word &quot;absolute&quot; is helpful here. We normally use that to distinguish document-relative coordinates from parent-relative coordinates.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103564</commentid>
    <comment_count>5</comment_count>
      <attachid>26272</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-27 16:36:38 -0800</bug_when>
    <thetext>Created attachment 26272
Updated patch

I think all of Darins issues are resolved with this new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103566</commentid>
    <comment_count>6</comment_count>
      <attachid>26272</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-12-27 21:38:16 -0800</bug_when>
    <thetext>Comment on attachment 26272
Updated patch

&gt; -using namespace std;
&gt; +using std::max;
&gt; +using std::min;

Why that change? I like the old way better.

&gt; +    return m_width - paddingLeft() - paddingRight() - borderLeft() - borderRight() -
&gt; +           m_innerText-&gt;renderer()-&gt;paddingLeft() - m_innerText-&gt;renderer()-&gt;paddingRight();

We normally put the operator in the continuation line, and just indent one normal level rather than lining up, so it would be:

    return m_width - paddingLeft() - paddingRight() - borderLeft() - borderRight()
        - m_innerText-&gt;renderer()-&gt;paddingLeft() - m_innerText-&gt;renderer()-&gt;paddingRight();

The operator at the beginning of the line helps make it clear it&apos;s a continuation.

&gt; +        ASSERT(ec == 0);

We should probably write these as ASSERT(!ec) in the future.

The history would probably work a little better if RenderTextControlSingleLine.h/cpp and RenderTextControlMultipleLine.h/cpp started out with &quot;svn cp&quot; of the RenderTextControl.h/cpp files. In fact I could then have reviewed the patch a little more carefully if that diff was in there.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103585</commentid>
    <comment_count>7</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-28 05:49:08 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 26272 [review])
&gt; &gt; -using namespace std;
&gt; &gt; +using std::max;
&gt; &gt; +using std::min;
&gt; 
&gt; Why that change? I like the old way better.
I prefer not to include all of &apos;std&apos; namespace, but I&apos;ll leave it as is.
 
&gt; &gt; +    return m_width - paddingLeft() - paddingRight() - borderLeft() - borderRight() -
&gt; &gt; +           m_innerText-&gt;renderer()-&gt;paddingLeft() - m_innerText-&gt;renderer()-&gt;paddingRight();
&gt; 
&gt; We normally put the operator in the continuation line, and just indent one
&gt; normal level rather than lining up, so it would be:
&gt; 
&gt;     return m_width - paddingLeft() - paddingRight() - borderLeft() -
&gt; borderRight()
&gt;         - m_innerText-&gt;renderer()-&gt;paddingLeft() -
&gt; m_innerText-&gt;renderer()-&gt;paddingRight();
&gt; 
&gt; The operator at the beginning of the line helps make it clear it&apos;s a
&gt; continuation. 
Fixed.

&gt; &gt; +        ASSERT(ec == 0);
&gt; 
&gt; We should probably write these as ASSERT(!ec) in the future.
Funny, I never questioned this style.. ASSERT(!ec) is much nicer. Fixed. Hm, thinking of &apos;ec&apos; it&apos;s also an unecessary abbrevation, though it&apos;s handy &amp; small. Though that&apos;s another topic.
 
&gt; The history would probably work a little better if
&gt; RenderTextControlSingleLine.h/cpp and RenderTextControlMultipleLine.h/cpp
&gt; started out with &quot;svn cp&quot; of the RenderTextControl.h/cpp files. In fact I could
&gt; then have reviewed the patch a little more carefully if that diff was in there.
Ok, I&apos;ll keep that in mind during the next split-up patches.

&gt; r=me
Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103586</commentid>
    <comment_count>8</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-28 05:54:42 -0800</bug_when>
    <thetext>Landed in r39490.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103607</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-12-28 11:13:23 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; I prefer not to include all of &apos;std&apos; namespace, but I&apos;ll leave it as is.

I can understand the preference. It was my initial thought too. But I&apos;ve since changed my mind. I think we should use &quot;using namespace std&quot; unless it creates a troublesome ambiguity -- then we can go to individual using statements instead.

&gt; Hm,
&gt; thinking of &apos;ec&apos; it&apos;s also an unecessary abbrevation, though it&apos;s handy &amp;
&gt; small.

What would you prefer? Maybe &quot;exception&quot; or &quot;exceptionCode&quot;?

&gt; &gt; The history would probably work a little better if
&gt; &gt; RenderTextControlSingleLine.h/cpp and RenderTextControlMultipleLine.h/cpp
&gt; &gt; started out with &quot;svn cp&quot; of the RenderTextControl.h/cpp files. In fact I could
&gt; &gt; then have reviewed the patch a little more carefully if that diff was in there.
&gt;
&gt; Ok, I&apos;ll keep that in mind during the next split-up patches.

It&apos;s something you can do even after the fact. Just move the file aside, &quot;svn cp&quot;, and then overwrite with your new file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103620</commentid>
    <comment_count>10</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-28 12:04:44 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; &gt; Hm,
&gt; &gt; thinking of &apos;ec&apos; it&apos;s also an unecessary abbrevation, though it&apos;s handy &amp;
&gt; &gt; small.
&gt; 
&gt; What would you prefer? Maybe &quot;exception&quot; or &quot;exceptionCode&quot;?
Both sound fine IMHO - can we reuse the WebCore-rename script for changes like this? I&apos;ve never looked at it so far.
 
&gt; &gt; &gt; The history would probably work a little better if
&gt; &gt; &gt; RenderTextControlSingleLine.h/cpp and RenderTextControlMultipleLine.h/cpp
&gt; &gt; &gt; started out with &quot;svn cp&quot; of the RenderTextControl.h/cpp files. In fact I could
&gt; &gt; &gt; then have reviewed the patch a little more carefully if that diff was in there.
&gt; &gt;
&gt; &gt; Ok, I&apos;ll keep that in mind during the next split-up patches.
&gt; 
&gt; It&apos;s something you can do even after the fact. Just move the file aside, &quot;svn
&gt; cp&quot;, and then overwrite with your new file.
Ouch, I didn&apos;t know that - I guess it&apos;s too late now to fix this, as I already landed it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103622</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-12-28 12:08:34 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; &gt; What would you prefer? Maybe &quot;exception&quot; or &quot;exceptionCode&quot;?
&gt;
&gt; Both sound fine IMHO - can we reuse the WebCore-rename script for changes like
&gt; this? I&apos;ve never looked at it so far.

We definitely could. But I worry a bit at replacing &quot;ec&quot; with &quot;exceptionCode&quot; because it&apos;s so much longer.

&gt; &gt; It&apos;s something you can do even after the fact. Just move the file aside, &quot;svn
&gt; &gt; cp&quot;, and then overwrite with your new file.
&gt;
&gt; Ouch, I didn&apos;t know that - I guess it&apos;s too late now to fix this, as I already
&gt; landed it?

Yes, too late for this time around.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103632</commentid>
    <comment_count>12</comment_count>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-28 13:13:31 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; We definitely could. But I worry a bit at replacing &quot;ec&quot; with &quot;exceptionCode&quot;
&gt; because it&apos;s so much longer.
That&apos;s true - hm maybe we should special case it in the style rules ;-)</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26249</attachid>
            <date>2008-12-25 19:20:46 -0800</date>
            <delta_ts>2008-12-27 16:36:38 -0800</delta_ts>
            <desc>Initial patch</desc>
            <filename>Render.diff</filename>
            <type>text/plain</type>
            <size>112575</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDM5NDc0
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTM1IEBACisyMDA4LTEy
LTI1ICBOaWtvbGFzIFppbW1lcm1hbm4gIDxuaWtvbGFzLnppbW1lcm1hbm5AdG9yY2htb2JpbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZp
eGVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI5OTYKKworICAg
ICAgICBSZW5kZXJUZXh0Q29udHJvbCBoZWF2aWx5IGRlcGVuZHMgb24gSFRNTElucHV0RWxlbWVu
dCAmIEhUTUxUZXh0QXJlYUVsZW1lbnQuCisgICAgICAgIEl0IGhhbmRsZSBtdWx0aSAmIHNpbmds
ZSBsaW5lIHRleHQgY29udHJvbCByZW5kZXJpbmcgaW4gb25lIGNsYXNzLiBTcGxpdCB1cAorICAg
ICAgICBpbiB0d28gbmV3IGNsYXNzZXM6IFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZSAmIFJl
bmRlclRleHRDb250cm9sTXVsdGlMaW5lLgorCisgICAgICAgIFRoaXMgaGFzIHNldmVyYWwgYmVu
ZWZpdHMgLSBjb2RlIGlzIG1vcmUgcmVhZGFibGUgbm93LCB0aGUgbWVtb3J5IHVzYWdlCisgICAg
ICAgIGZvciBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZSBpcyByZWR1Y2VkLCBhcyBhbGwgc3R1
ZmYgcmVsYXRlZCB0byBzZWFyY2ggZmllbGRzCisgICAgICAgIGxpdmVzIGluIFJlbmRlclRleHRD
b250cm9sU2luZ2xlTGluZSwgYW5kIGl0J3MgZWFzaWVyIHRvIGludHJvZHVjZSBhbgorICAgICAg
ICBhYnN0cmFjdGlvbiBmb3IgaW5wdXQvdGV4dGFyZWEtbGlrZSBlbGVtZW50cyBpbiBvdGhlciBs
YW5ndWFnZXMuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAgICAgICAgKiBXZWJDb3Jl
Lm9yZGVyOgorICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAqIFdlYkNvcmUudmNwcm9q
L1dlYkNvcmUudmNwcm9qOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvajoKKyAgICAgICAgKiBXZWJDb3JlU291cmNlcy5ia2w6CisgICAgICAgICogaHRtbC9IVE1M
SW5wdXRFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6OmNy
ZWF0ZVJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQ6OmRlZmF1
bHRFdmVudEhhbmRsZXIpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudDo6dXBk
YXRlUGxhY2Vob2xkZXJWaXNpYmlsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1dEVs
ZW1lbnQ6OmFkZFNlYXJjaFJlc3VsdCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1MSW5wdXRFbGVt
ZW50OjpvblNlYXJjaCk6CisgICAgICAgICogaHRtbC9IVE1MVGV4dEFyZWFFbGVtZW50LmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkhUTUxUZXh0QXJlYUVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkhUTUxUZXh0QXJlYUVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRs
ZXIpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbC5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6UmVuZGVyVGV4dENvbnRyb2wpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6On5SZW5kZXJUZXh0Q29udHJvbCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6c3R5bGVEaWRDaGFuZ2UpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OmFkanVzdElubmVyVGV4dFN0eWxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sOjpjcmVhdGVTdWJ0cmVlSWZOZWVkZWQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OnRleHRCbG9ja0hlaWdodCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6dGV4dEJsb2NrV2lkdGgpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OnVwZGF0ZUZyb21FbGVtZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sOjp1cGRhdGVJbm5lclRleHRWYWx1
ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6c2V0U2VsZWN0aW9uUmFu
Z2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OnZpc2libGVQb3NpdGlv
bkZvckluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sOjppbmRleEZv
clZpc2libGVQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6
c3VidHJlZUhhc0NoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6
OnNjcm9sbGJhclRoaWNrbmVzcyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJv
bDo6Y2FsY0hlaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6bm9k
ZUF0UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OmNhbGNQcmVm
V2lkdGhzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sOjpmb3J3YXJkRXZl
bnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OnNlbGVjdGlvbkNoYW5n
ZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OmlubmVyVGV4dEVsZW1l
bnQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbC5oOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6Omhhc0NvbnRyb2xDbGlwKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRleHRDb250cm9sOjpjYW5IYXZlQ2hpbGRyZW4pOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OmF2b2lkc0Zsb2F0cyk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUZXh0Q29udHJvbDo6aXNFZGl0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2w6OnNldEVkaXRlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29u
dHJvbDo6cHJvY2Vzc1N0eWxlQ2hhbmdlKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4
dENvbnRyb2xNdWx0aUxpbmUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRl
eHRDb250cm9sTXVsdGlMaW5lOjpSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6flJlbmRlclRleHRDb250cm9s
TXVsdGlMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sTXVsdGlMaW5l
OjpzdWJ0cmVlSGFzQ2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJv
bE11bHRpTGluZTo6bGF5b3V0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9s
TXVsdGlMaW5lOjpub2RlQXRQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29u
dHJvbE11bHRpTGluZTo6Zm9yd2FyZEV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRl
eHRDb250cm9sTXVsdGlMaW5lOjpwcmVmZXJyZWRXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6Y2FsY0V4dHJhTGluZUhlaWdodCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6YmFzZWxpbmVQb3NpdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6dXBkYXRlRnJv
bUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6
OmNhY2hlU2VsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sTXVs
dGlMaW5lOjpjcmVhdGVJbm5lclRleHRTdHlsZSk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRl
clRleHRDb250cm9sTXVsdGlMaW5lLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2xNdWx0aUxpbmU6OmlzVGV4dEFyZWEpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5l
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6flJlbmRl
clRleHRDb250cm9sU2luZ2xlTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmU6OnBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6dXBkYXRlUGxhY2Vob2xkZXJWaXNp
YmlsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6
YWRkU2VhcmNoUmVzdWx0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZTo6c3RvcFNlYXJjaEV2ZW50VGltZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzaG93UG9wdXApOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpoaWRlUG9wdXApOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzdWJ0cmVlSGFzQ2hhbmdlZCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnBhaW50KToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6bGF5b3V0KToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6bm9kZUF0UG9pbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpmb3J3YXJkRXZlbnQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpwcm9jZXNz
U3R5bGVDaGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVM
aW5lOjpjYXBzTG9ja1N0YXRlTWF5SGF2ZUNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjp0ZXh0QmxvY2tXaWR0aCk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnByZWZlcnJlZFdpZHRoKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y2FsY0V4dHJhTGluZUhl
aWdodCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNy
ZWF0ZVN1YnRyZWVJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6OnVwZGF0ZUZyb21FbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRleHRDb250cm9sU2luZ2xlTGluZTo6Y2FjaGVTZWxlY3Rpb24pOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjcmVhdGVJbm5lclRleHRTdHlsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZUlubmVy
QmxvY2tTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmU6OmNyZWF0ZVJlc3VsdHNCdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
ZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZUNhbmNlbEJ1dHRvblN0eWxlKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6dXBkYXRlQ2FuY2VsQnV0dG9u
VmlzaWJpbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmU6OmF1dG9zYXZlTmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmU6OnN0YXJ0U2VhcmNoRXZlbnRUaW1lcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNlYXJjaEV2ZW50VGltZXJGaXJlZCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnZhbHVlQ2hhbmdlZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6Oml0ZW1UZXh0KToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6aXRlbUlzRW5h
YmxlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6Oml0
ZW1TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
Om1lbnVTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmU6OmNsaWVudEluc2V0TGVmdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6OmNsaWVudEluc2V0UmlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjbGllbnRQYWRkaW5nTGVmdCk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNsaWVudFBhZGRpbmdSaWdodCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6Omxpc3RTaXplKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6c2VsZWN0ZWRJ
bmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6Oml0
ZW1Jc1NlcGFyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmU6Oml0ZW1Jc0xhYmVsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9s
U2luZ2xlTGluZTo6aXRlbUlzU2VsZWN0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lOjpzZXRUZXh0RnJvbUl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpmb250U2VsZWN0b3IpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpob3N0V2luZG93KToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y3JlYXRlU2Nyb2xsYmFyKToK
KyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmg6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpoYXNDb250
cm9sQ2xpcCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
OmlzVGV4dEZpZWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xl
TGluZTo6cGxhY2Vob2xkZXJJc1Zpc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lOjpwb3B1cElzVmlzaWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNob3VsZFBvcE92ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjp2YWx1ZVNob3VsZENoYW5nZU9uSG90
VHJhY2spOgorICAgICAgICAqIHJlbmRlcmluZy9UZXh0Q29udHJvbElubmVyRWxlbWVudHMuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xJbm5lckJsb2NrOjpub2RlQXRQ
b2ludCk6CisgICAgICAgIChXZWJDb3JlOjpTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25FbGVtZW50
OjpkZWZhdWx0RXZlbnRIYW5kbGVyKToKKwogMjAwOC0xMi0yNSAgQWxleGV5IFByb3NrdXJ5YWtv
diAgPGFwQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCklu
ZGV4OiBHTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBHTlVtYWtlZmlsZS5hbQkocmV2aXNp
b24gMzk0NzQpCisrKyBHTlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5KQpAQCAtMTU2Miw2ICsx
NTYyLDEwIEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
VGV4dC5oIFwKIAlXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbC5jcHAgXAogCVdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sLmggXAorCVdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmNwcCBcCisJV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuaCBcCisJV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lLmNwcCBcCisJV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4dENv
bnRyb2xTaW5nbGVMaW5lLmggXAogCVdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHRGcmFnbWVu
dC5jcHAgXAogCVdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHRGcmFnbWVudC5oIFwKIAlXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZS5jcHAgXApJbmRleDogV2ViQ29yZS5vcmRlcgo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlLm9yZGVyCShyZXZpc2lvbiAzOTQ3NCkKKysrIFdlYkNvcmUub3Jk
ZXIJKHdvcmtpbmcgY29weSkKQEAgLTc5MjQsNyArNzkyNCw3IEBAIF9fWk43V2ViQ29yZTExRnJh
bWVMb2FkZXIxN3N0b3BGb3JVc2VyQ2EKIC1bRE9NRWxlbWVudChXZWJQcml2YXRlKSBpc0ZvY3Vz
ZWRdCiBfX1pON1dlYkNvcmUxNFJlbmRlclRoZW1lTWFjMjhwYWludFNlYXJjaEZpZWxkQ2FuY2Vs
QnV0dG9uRVBOU18xMlJlbmRlck9iamVjdEVSS05TMV85UGFpbnRJbmZvRVJLTlNfN0ludFJlY3RF
CiBfX1pON1dlYkNvcmUxNkhUTUxJbnB1dEVsZW1lbnQxNWFkZFNlYXJjaFJlc3VsdEV2Ci1fX1pO
N1dlYkNvcmUxN1JlbmRlclRleHRDb250cm9sMTVhZGRTZWFyY2hSZXN1bHRFdgorX19aTjdXZWJD
b3JlMjdSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUxNWFkZFNlYXJjaFJlc3VsdEV2CiBfX1pO
N1dlYkNvcmUxNkhUTUxJbnB1dEVsZW1lbnQ4b25TZWFyY2hFdgogX19aTjdXZWJDb3JlMTdSZW5k
ZXJUZXh0Q29udHJvbDIwc3RvcFNlYXJjaEV2ZW50VGltZXJFdgogX19aTjdXZWJDb3JlMTNDaGFy
YWN0ZXJEYXRhMTJzZXROb2RlVmFsdWVFUktOU182U3RyaW5nRVJpCkluZGV4OiBXZWJDb3JlLnBy
bwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlLnBybwkocmV2aXNpb24gMzk0NzQpCisrKyBXZWJDb3Jl
LnBybwkod29ya2luZyBjb3B5KQpAQCAtOTc3LDYgKzk3Nyw4IEBAIFNPVVJDRVMgKz0gXAogICAg
IHJlbmRlcmluZy9SZW5kZXJUYWJsZVJvdy5jcHAgXAogICAgIHJlbmRlcmluZy9SZW5kZXJUYWJs
ZVNlY3Rpb24uY3BwIFwKICAgICByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wuY3BwIFwKKyAg
ICByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuY3BwIFwKKyAgICByZW5kZXJp
bmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmNwcCBcCiAgICAgcmVuZGVyaW5nL1JlbmRl
clRleHQuY3BwIFwKICAgICByZW5kZXJpbmcvUmVuZGVyVGV4dEZyYWdtZW50LmNwcCBcCiAgICAg
cmVuZGVyaW5nL1JlbmRlclRoZW1lLmNwcCBcCkluZGV4OiBXZWJDb3JlU291cmNlcy5ia2wKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZVNvdXJjZXMuYmtsCShyZXZpc2lvbiAzOTQ3NCkKKysrIFdlYkNv
cmVTb3VyY2VzLmJrbAkod29ya2luZyBjb3B5KQpAQCAtOTAwLDYgKzkwMCw4IEBAIFRoaXMgZmls
ZSBjb250YWlucyB0aGUgbGlzdCBvZiBmaWxlcyBuZWUKICAgICAgICAgcmVuZGVyaW5nL1JlbmRl
clRhYmxlU2VjdGlvbi5jcHAKICAgICAgICAgcmVuZGVyaW5nL1JlbmRlclRleHQuY3BwCiAgICAg
ICAgIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbC5jcHAKKyAgICAgICAgcmVuZGVyaW5nL1Jl
bmRlclRleHRDb250cm9sTXVsdGlMaW5lLmNwcAorICAgICAgICByZW5kZXJpbmcvUmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lLmNwcAogICAgICAgICByZW5kZXJpbmcvUmVuZGVyVGV4dEZyYWdt
ZW50LmNwcAogICAgICAgICByZW5kZXJpbmcvUmVuZGVyVGhlbWUuY3BwCiAgICAgICAgIHJlbmRl
cmluZy9SZW5kZXJUcmVlQXNUZXh0LmNwcApJbmRleDogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52
Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlz
aW9uIDM5NDc0KQorKysgV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29w
eSkKQEAgLTk3NzQsNiArOTc3NCwzOCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUN
CisJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxp
bmUuY3BwIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVs
ZWFzZV9QR098V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xD
b21waWxlclRvb2wiDQorCQkJCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSJ0cnVlIg0KKwkJ
CQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUN
CisJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxp
bmUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXHJlbmRlcmluZ1xSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuY3BwIg0KKwkJCQk+DQor
CQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZV9QR098V2luMzIiDQor
CQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJ
CQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSJ0cnVlIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxl
Q29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRo
PSIuLlxyZW5kZXJpbmdcUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmgiDQorCQkJCT4NCisJ
CQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcUmVu
ZGVyVGV4dEZyYWdtZW50LmNwcCINCiAJCQkJPg0KIAkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCklu
ZGV4OiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAzOTQ3NCkKKysrIFdlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNTMsNiArNTMs
MTAgQEAKIAkJMDgyMDNBQTAwRUQ4QzM1MzAwQjhCNjFBIC8qIFdNTEFjY2Vzc0VsZW1lbnQuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4MjAzQTlFMEVE
OEMzNTMwMEI4QjYxQSAvKiBXTUxBY2Nlc3NFbGVtZW50LmggKi87IH07CiAJCTA4Mzk0NzZDMEVD
RTRCRDYwMDAyNzM1MCAvKiBXTUxFbGVtZW50RmFjdG9yeS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOEZCODRCMDBFQ0UzNzMzMDBEQzA2NEUgLyog
V01MRWxlbWVudEZhY3RvcnkuY3BwICovOyB9OwogCQkwODM5NDc2RDBFQ0U0QkQ2MDAwMjczNTAg
LyogV01MRWxlbWVudEZhY3RvcnkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDA4RkI4NEIxMEVDRTM3MzMwMERDMDY0RSAvKiBXTUxFbGVtZW50RmFjdG9y
eS5oICovOyB9OworCQkwODNEQUVBNjBGMDFBN0ZCMDAzNDI3NTQgLyogUmVuZGVyVGV4dENvbnRy
b2xNdWx0aUxpbmUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gMDgzREFFQTIwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRDb250cm9sTXVsdGlM
aW5lLmNwcCAqLzsgfTsKKwkJMDgzREFFQTcwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRD
b250cm9sTXVsdGlMaW5lLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAwODNEQUVBMzBGMDFBN0ZCMDAzNDI3NTQgLyogUmVuZGVyVGV4dENvbnRyb2xNdWx0
aUxpbmUuaCAqLzsgfTsKKwkJMDgzREFFQTgwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRD
b250cm9sU2luZ2xlTGluZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAwODNEQUVBNDBGMDFBN0ZCMDAzNDI3NTQgLyogUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lLmNwcCAqLzsgfTsKKwkJMDgzREFFQTkwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRl
clRleHRDb250cm9sU2luZ2xlTGluZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gMDgzREFFQTUwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRDb250
cm9sU2luZ2xlTGluZS5oICovOyB9OwogCQkwODREQkFBMTBFRDM5RDM2MDAzOEMyMjYgLyogV01M
VmFyaWFibGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDA4NERCQTlEMEVEMzlEMzUwMDM4QzIyNiAvKiBXTUxWYXJpYWJsZXMuY3BwICovOyB9Owog
CQkwODREQkFBMjBFRDM5RDM2MDAzOEMyMjYgLyogV01MVmFyaWFibGVzLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODREQkE5RTBFRDM5RDM2MDAzOEMy
MjYgLyogV01MVmFyaWFibGVzLmggKi87IH07CiAJCTA4NUI5MkJBMEVGREU3M0QwMEU2MTIzQyAv
KiBGb3JtRGF0YUJ1aWxkZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMDg1QjkyQjgwRUZERTczRDAwRTYxMjNDIC8qIEZvcm1EYXRhQnVpbGRlci5j
cHAgKi87IH07CkBAIC00ODY3LDYgKzQ4NzEsMTAgQEAKIAkJMDgxRDgxMzAwRUUwRTc0RDAwRDcz
Njg5IC8qIFdNTFRpbWVyRWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBXTUxUaW1lckVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMDgyMDNB
OUQwRUQ4QzM1MzAwQjhCNjFBIC8qIFdNTEFjY2Vzc0VsZW1lbnQuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gV01MQWNjZXNzRWxlbWVudC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTA4MjAzQTlFMEVEOEMzNTMwMEI4QjYxQSAvKiBXTUxBY2Nlc3NF
bGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdNTEFjY2Vzc0VsZW1l
bnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDgzREFFQTIwRjAxQTdGQjAwMzQy
NzU0IC8qIFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDgzREFFQTMwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRl
clRleHRDb250cm9sTXVsdGlMaW5lLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCTA4M0RBRUE0MEYwMUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyVGV4dENv
bnRyb2xTaW5nbGVMaW5lLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDgzREFF
QTUwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMDg0REJBOUQwRUQzOUQzNTAwMzhDMjI2
IC8qIFdNTFZhcmlhYmxlcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBXTUxWYXJpYWJsZXMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwODREQkE5
RTBFRDM5RDM2MDAzOEMyMjYgLyogV01MVmFyaWFibGVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFdNTFZhcmlhYmxlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQkwODVCOTJCODBFRkRFNzNEMDBFNjEyM0MgLyogRm9ybURhdGFCdWlsZGVyLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZvcm1EYXRhQnVpbGRlci5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xNDAzOSw2ICsxNDA0NywxMCBAQAogCQkJCUJDRUE0
ODREMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJUZXh0LmggKi8sCiAJCQkJQUI2N0QxQTYwOTdG
M0FFMzAwRjkzOTJFIC8qIFJlbmRlclRleHRDb250cm9sLmNwcCAqLywKIAkJCQlBQjY3RDFBNzA5
N0YzQUUzMDBGOTM5MkUgLyogUmVuZGVyVGV4dENvbnRyb2wuaCAqLywKKwkJCQkwODNEQUVBMjBG
MDFBN0ZCMDAzNDI3NTQgLyogUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuY3BwICovLAorCQkJ
CTA4M0RBRUEzMEYwMUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZS5o
ICovLAorCQkJCTA4M0RBRUE0MEYwMUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmUuY3BwICovLAorCQkJCTA4M0RBRUE1MEYwMUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJU
ZXh0Q29udHJvbFNpbmdsZUxpbmUuaCAqLywKIAkJCQlCQ0VBNDg0RTA5N0Q5MzAyMDA5NEM5RTQg
LyogUmVuZGVyVGV4dEZyYWdtZW50LmNwcCAqLywKIAkJCQlCQ0VBNDg0RjA5N0Q5MzAyMDA5NEM5
RTQgLyogUmVuZGVyVGV4dEZyYWdtZW50LmggKi8sCiAJCQkJQkNFQTQ4NEEwOTdEOTMwMjAwOTRD
OUU0IC8qIFJlbmRlclRoZW1lLmNwcCAqLywKQEAgLTE1OTk4LDYgKzE2MDEwLDggQEAKIAkJCQlB
OERGNEFFRjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVTZWN0aW9uLmggaW4gSGVhZGVy
cyAqLywKIAkJCQlCQ0VBNDg4QzA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGV4dC5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJQUI2N0QxQTkwOTdGM0FFMzAwRjkzOTJFIC8qIFJlbmRlclRleHRDb250
cm9sLmggaW4gSGVhZGVycyAqLywKKwkJCQkwODNEQUVBNzBGMDFBN0ZCMDAzNDI3NTQgLyogUmVu
ZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuaCBpbiBIZWFkZXJzICovLAorCQkJCTA4M0RBRUE5MEYw
MUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUJDRUE0ODhFMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJUZXh0RnJhZ21lbnQu
aCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODhBMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJU
aGVtZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4ODcwOTdEOTMwMjAwOTRDOUU0IC8qIFJl
bmRlclRoZW1lTWFjLmggaW4gSGVhZGVycyAqLywKQEAgLTE3OTkyLDYgKzE4MDA2LDggQEAKIAkJ
CQlBOERGNEFFRDA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVTZWN0aW9uLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUJDRUE0ODhCMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJUZXh0LmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCUFCNjdEMUE4MDk3RjNBRTMwMEY5MzkyRSAvKiBSZW5kZXJU
ZXh0Q29udHJvbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwODNEQUVBNjBGMDFBN0ZCMDAzNDI3
NTQgLyogUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJ
MDgzREFFQTgwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg4RDA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVy
VGV4dEZyYWdtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0ODg5MDk3RDkzMDIwMDk0
QzlFNCAvKiBSZW5kZXJUaGVtZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg4ODA5N0Q5
MzAyMDA5NEM5RTQgLyogUmVuZGVyVGhlbWVNYWMubW0gaW4gU291cmNlcyAqLywKSW5kZXg6IGh0
bWwvSFRNTElucHV0RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MSW5wdXRFbGVt
ZW50LmNwcAkocmV2aXNpb24gMzk0NzQpCisrKyBodG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01MSw3ICs1MSw3IEBACiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIK
ICNpbmNsdWRlICJSZW5kZXJTbGlkZXIuaCIKICNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCi0jaW5j
bHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmUuaCIKICNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgogI2luY2x1ZGUgIlNlbGVjdGlv
bkNvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJUZXh0QnJlYWtJdGVyYXRvci5oIgpAQCAtNzU4LDcg
Kzc1OCw3IEBAIFJlbmRlck9iamVjdCAqSFRNTElucHV0RWxlbWVudDo6Y3JlYXRlUmUKICAgICAg
ICAgY2FzZSBQQVNTV09SRDoKICAgICAgICAgY2FzZSBTRUFSQ0g6CiAgICAgICAgIGNhc2UgVEVY
VDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJUZXh0Q29udHJvbCh0aGlz
LCBmYWxzZSk7ICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZSh0aGlzKTsKICAgICB9CiAgICAgQVNTRVJUKGZhbHNl
KTsKICAgICByZXR1cm4gMDsKQEAgLTE0MzQsNyArMTQzNCw3IEBAIHZvaWQgSFRNTElucHV0RWxl
bWVudDo6ZGVmYXVsdEV2ZW50SGFuZGwKICAgICB9CiAKICAgICBpZiAoaXNUZXh0RmllbGQoKSAm
JiByZW5kZXJlcigpICYmIChldnQtPmlzTW91c2VFdmVudCgpIHx8IGV2dC0+aXNEcmFnRXZlbnQo
KSB8fCBldnQtPmlzV2hlZWxFdmVudCgpIHx8IGV2dC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5i
bHVyRXZlbnQgfHwgZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmZvY3VzRXZlbnQpKQotICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbCo+KHJlbmRlcmVyKCkpLT5mb3J3YXJk
RXZlbnQoZXZ0KTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVM
aW5lKj4ocmVuZGVyZXIoKSktPmZvcndhcmRFdmVudChldnQpOwogCiAgICAgaWYgKGlucHV0VHlw
ZSgpID09IFJBTkdFICYmIHJlbmRlcmVyKCkpIHsKICAgICAgICAgUmVuZGVyU2xpZGVyKiBzbGlk
ZXIgPSBzdGF0aWNfY2FzdDxSZW5kZXJTbGlkZXIqPihyZW5kZXJlcigpKTsKQEAgLTE2MDQsNyAr
MTYwNCw3IEBAIHZvaWQgSFRNTElucHV0RWxlbWVudDo6dXBkYXRlUGxhY2Vob2xkZXIKICAgICAg
ICAgJiYgIWdldEF0dHJpYnV0ZShwbGFjZWhvbGRlckF0dHIpLmlzRW1wdHkoKTsKIAogICAgIGlm
ICgob2xkUGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUgIT0gbV9wbGFjZWhvbGRlclNob3VsZEJl
VmlzaWJsZSB8fCBwbGFjZWhvbGRlclZhbHVlQ2hhbmdlZCkgJiYgcmVuZGVyZXIoKSkKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihyZW5kZXJlcigpKS0+dXBkYXRlUGxh
Y2Vob2xkZXJWaXNpYmlsaXR5KCk7CisgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRDb250
cm9sU2luZ2xlTGluZSo+KHJlbmRlcmVyKCkpLT51cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHko
KTsKIH0KIAogU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnQ6OmNvbnN0cmFpblZhbHVlKGNvbnN0IFN0
cmluZyYgcHJvcG9zZWRWYWx1ZSwgaW50IG1heExlbikgY29uc3QKQEAgLTE2MzMsMTQgKzE2MzMs
MTQgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50OjphZGRTZWFyY2hSZXN1bHQoKQogewogICAgIEFT
U0VSVChpc1NlYXJjaEZpZWxkKCkpOwogICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICBzdGF0
aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbCo+KHJlbmRlcmVyKCkpLT5hZGRTZWFyY2hSZXN1bHQo
KTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lKj4ocmVu
ZGVyZXIoKSktPmFkZFNlYXJjaFJlc3VsdCgpOwogfQogCiB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6
Om9uU2VhcmNoKCkKIHsKICAgICBBU1NFUlQoaXNTZWFyY2hGaWVsZCgpKTsKICAgICBpZiAocmVu
ZGVyZXIoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihyZW5kZXJl
cigpKS0+c3RvcFNlYXJjaEV2ZW50VGltZXIoKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lKj4ocmVuZGVyZXIoKSktPnN0b3BTZWFyY2hFdmVudFRpbWVy
KCk7CiAgICAgZGlzcGF0Y2hFdmVudEZvclR5cGUoZXZlbnROYW1lcygpLnNlYXJjaEV2ZW50LCB0
cnVlLCBmYWxzZSk7CiB9CiAKSW5kZXg6IGh0bWwvSFRNTFRleHRBcmVhRWxlbWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gaHRtbC9IVE1MVGV4dEFyZWFFbGVtZW50LmNwcAkocmV2aXNpb24gMzk0NzQp
CisrKyBodG1sL0hUTUxUZXh0QXJlYUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3
ICszNiw3IEBACiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiUGFnZS5oIgogI2lu
Y2x1ZGUgIlJlbmRlclN0eWxlLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKKyNp
bmNsdWRlICJSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZS5oIgogI2luY2x1ZGUgIlNlbGVjdGlv
bi5oIgogI2luY2x1ZGUgIlRleHQuaCIKICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CkBA
IC0xOTIsNyArMTkyLDcgQEAgdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50OjpwYXJzZU1hcHBlZEF0
dAogCiBSZW5kZXJPYmplY3QqIEhUTUxUZXh0QXJlYUVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqKQogewotICAgIHJldHVybiBuZXcgKGFyZW5h
KSBSZW5kZXJUZXh0Q29udHJvbCh0aGlzLCB0cnVlKTsKKyAgICByZXR1cm4gbmV3IChhcmVuYSkg
UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUodGhpcyk7CiB9CiAKIGJvb2wgSFRNTFRleHRBcmVh
RWxlbWVudDo6YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGluZywgYm9vbCkKQEAg
LTI0NSw3ICsyNDUsNyBAQCB2b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnQ6OnVwZGF0ZUZvY3VzQXBw
CiB2b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQqIGV2
ZW50KQogewogICAgIGlmIChyZW5kZXJlcigpICYmIChldmVudC0+aXNNb3VzZUV2ZW50KCkgfHwg
ZXZlbnQtPmlzRHJhZ0V2ZW50KCkgfHwgZXZlbnQtPmlzV2hlZWxFdmVudCgpIHx8IGV2ZW50LT50
eXBlKCkgPT0gZXZlbnROYW1lcygpLmJsdXJFdmVudCkpCi0gICAgICAgIHN0YXRpY19jYXN0PFJl
bmRlclRleHRDb250cm9sKj4ocmVuZGVyZXIoKSktPmZvcndhcmRFdmVudChldmVudCk7CisgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lKj4ocmVuZGVyZXIoKSkt
PmZvcndhcmRFdmVudChldmVudCk7CiAKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0
YXRlOjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2ZW50KTsKIH0KSW5kZXg6IHJlbmRlcmluZy9SZW5k
ZXJUZXh0Q29udHJvbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRleHRDb250
cm9sLmNwcAkocmV2aXNpb24gMzk0NzQpCisrKyByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKEMp
IDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICAgICAgICAg
IChDKSAyMDA4IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8v
d3d3LnRvcmNobW9iaWxlLmNvbS8pICAKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjIsMzcgKzIz
LDIxIEBACiAjaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKIAogI2luY2x1ZGUgIkNoYXJh
Y3Rlck5hbWVzLmgiCi0jaW5jbHVkZSAiQ1NTU3R5bGVTZWxlY3Rvci5oIgotI2luY2x1ZGUgIkRv
Y3VtZW50LmgiCiAjaW5jbHVkZSAiRWRpdG9yLmgiCi0jaW5jbHVkZSAiRWRpdG9yQ2xpZW50Lmgi
Ci0jaW5jbHVkZSAiRXZlbnQuaCIKICNpbmNsdWRlICJFdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAi
Rm9udFNlbGVjdG9yLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZVZpZXcu
aCIKICNpbmNsdWRlICJIVE1MQlJFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTElucHV0RWxlbWVu
dC5oIgorI2luY2x1ZGUgIkhUTUxGb3JtQ29udHJvbEVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1M
TmFtZXMuaCIKLSNpbmNsdWRlICJIVE1MVGV4dEFyZWFFbGVtZW50LmgiCiAjaW5jbHVkZSAiSGl0
VGVzdFJlc3VsdC5oIgotI2luY2x1ZGUgIkxvY2FsaXplZFN0cmluZ3MuaCIKLSNpbmNsdWRlICJN
b3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50LmgiCi0jaW5jbHVk
ZSAiUmVuZGVyU2Nyb2xsYmFyLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKICNpbmNsdWRl
ICJTY3JvbGxiYXJUaGVtZS5oIgotI2luY2x1ZGUgIlNlYXJjaFBvcHVwTWVudS5oIgogI2luY2x1
ZGUgIlNlbGVjdGlvbkNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJTZXR0aW5ncy5oIgotI2luY2x1
ZGUgIlRleHQuaCIKICNpbmNsdWRlICJUZXh0Q29udHJvbElubmVyRWxlbWVudHMuaCIKKyNpbmNs
dWRlICJUZXh0LmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiaHRtbGVk
aXRpbmcuaCIKLSNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCi0jaW5jbHVkZSA8bWF0aC5oPgog
Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgc3RkOjptYXg7Cit1c2luZyBzdGQ6Om1pbjsK
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC04MCw1MCArNjUsMzAgQEAgc3RhdGljIENvbG9y
IGRpc2FibGVkVGV4dENvbG9yKGNvbnN0IENvbAogICAgIHJldHVybiBkaXNhYmxlZENvbG9yOwog
fQogCi1SZW5kZXJUZXh0Q29udHJvbDo6UmVuZGVyVGV4dENvbnRyb2woTm9kZSogbm9kZSwgYm9v
bCBtdWx0aUxpbmUpCitSZW5kZXJUZXh0Q29udHJvbDo6UmVuZGVyVGV4dENvbnRyb2woTm9kZSog
bm9kZSkKICAgICA6IFJlbmRlckJsb2NrKG5vZGUpCi0gICAgLCBtX2RpcnR5KGZhbHNlKQotICAg
ICwgbV9tdWx0aUxpbmUobXVsdGlMaW5lKQotICAgICwgbV9wbGFjZWhvbGRlclZpc2libGUoZmFs
c2UpCisgICAgLCBtX2VkaXRlZChmYWxzZSkKICAgICAsIG1fdXNlckVkaXRlZChmYWxzZSkKLSAg
ICAsIG1fc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yKGZhbHNlKQotICAgICwgbV9zZWFyY2hQ
b3B1cCgwKQotICAgICwgbV9zZWFyY2hQb3B1cElzVmlzaWJsZShmYWxzZSkKLSAgICAsIG1fc2Vh
cmNoRXZlbnRUaW1lcih0aGlzLCAmUmVuZGVyVGV4dENvbnRyb2w6OnNlYXJjaEV2ZW50VGltZXJG
aXJlZCkKIHsKIH0KIAogUmVuZGVyVGV4dENvbnRyb2w6On5SZW5kZXJUZXh0Q29udHJvbCgpCiB7
Ci0gICAgaWYgKG1fc2VhcmNoUG9wdXApIHsKLSAgICAgICAgbV9zZWFyY2hQb3B1cC0+ZGlzY29u
bmVjdENsaWVudCgpOwotICAgICAgICBtX3NlYXJjaFBvcHVwID0gMDsKLSAgICB9Ci0gICAgaWYg
KG1fbXVsdGlMaW5lICYmIG5vZGUoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVh
RWxlbWVudCo+KG5vZGUoKSktPnJlbmRlcmVyV2lsbEJlRGVzdHJveWVkKCk7CiAgICAgLy8gVGhl
IGNoaWxkcmVuIHJlbmRlcmVycyBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQgYnkgZGVzdHJv
eUxlZnRvdmVyQ2hpbGRyZW4KLSAgICBpZiAobV9pbm5lckJsb2NrKQotICAgICAgICBtX2lubmVy
QmxvY2stPmRldGFjaCgpOwotICAgIGVsc2UgaWYgKG1faW5uZXJUZXh0KQorICAgIGlmIChtX2lu
bmVyVGV4dCkKICAgICAgICAgbV9pbm5lclRleHQtPmRldGFjaCgpOwogfQogCiB2b2lkIFJlbmRl
clRleHRDb250cm9sOjpzdHlsZURpZENoYW5nZShSZW5kZXJTdHlsZTo6RGlmZiBkaWZmLCBjb25z
dCBSZW5kZXJTdHlsZSogb2xkU3R5bGUpCiB7CiAgICAgUmVuZGVyQmxvY2s6OnN0eWxlRGlkQ2hh
bmdlKGRpZmYsIG9sZFN0eWxlKTsKLSAgICBpZiAobV9pbm5lckJsb2NrKSB7Ci0gICAgICAgIC8v
IFdlIG1heSBoYXZlIHNldCB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgaW4gdGhlIG9sZCBzdHls
ZSBpbiBsYXlvdXQoKS4gUmVzZXQgdGhlbSBub3cgdG8gYXZvaWQKLSAgICAgICAgLy8gZ2V0dGlu
ZyBhIHNwdXJpb3VzIGxheW91dCBoaW50LgotICAgICAgICBtX2lubmVyQmxvY2stPnJlbmRlcmVy
KCktPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgoKSk7Ci0gICAgICAgIG1faW5uZXJCbG9jay0+
cmVuZGVyZXIoKS0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKCkpOwotICAgICAgICBtX2lubmVy
QmxvY2stPnJlbmRlcmVyKCktPnNldFN0eWxlKGNyZWF0ZUlubmVyQmxvY2tTdHlsZShzdHlsZSgp
KSk7Ci0gICAgfQorICAgIHByb2Nlc3NTdHlsZUNoYW5nZSgpOwogCiAgICAgaWYgKG1faW5uZXJU
ZXh0KSB7CiAgICAgICAgIFJlbmRlckJsb2NrKiB0ZXh0QmxvY2tSZW5kZXJlciA9IHN0YXRpY19j
YXN0PFJlbmRlckJsb2NrKj4obV9pbm5lclRleHQtPnJlbmRlcmVyKCkpOwogICAgICAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IHRleHRCbG9ja1N0eWxlID0gY3JlYXRlSW5uZXJUZXh0U3R5bGUoc3R5
bGUoKSk7Ci0gICAgICAgIC8vIFdlIG1heSBoYXZlIHNldCB0aGUgd2lkdGggYW5kIHRoZSBoZWln
aHQgaW4gdGhlIG9sZCBzdHlsZSBpbiBsYXlvdXQoKS4gUmVzZXQgdGhlbSBub3cgdG8gYXZvaWQK
LSAgICAgICAgLy8gZ2V0dGluZyBhIHNwdXJpb3VzIGxheW91dCBoaW50LgorICAgICAgICAvLyBX
ZSBtYXkgaGF2ZSBzZXQgdGhlIHdpZHRoIGFuZCB0aGUgaGVpZ2h0IGluIHRoZSBvbGQgc3R5bGUg
aW4gbGF5b3V0KCkuCisgICAgICAgIC8vIFJlc2V0IHRoZW0gbm93IHRvIGF2b2lkIGdldHRpbmcg
YSBzcHVyaW91cyBsYXlvdXQgaGludC4KICAgICAgICAgdGV4dEJsb2NrUmVuZGVyZXItPnN0eWxl
KCktPnNldEhlaWdodChMZW5ndGgoKSk7CiAgICAgICAgIHRleHRCbG9ja1JlbmRlcmVyLT5zdHls
ZSgpLT5zZXRXaWR0aChMZW5ndGgoKSk7CiAgICAgICAgIHRleHRCbG9ja1JlbmRlcmVyLT5zZXRT
dHlsZSh0ZXh0QmxvY2tTdHlsZSk7CkBAIC0xMzIsMjE0ICs5Nyw4NCBAQCB2b2lkIFJlbmRlclRl
eHRDb250cm9sOjpzdHlsZURpZENoYW5nZShSCiAgICAgICAgICAgICAgICAgbi0+cmVuZGVyZXIo
KS0+c2V0U3R5bGUodGV4dEJsb2NrU3R5bGUpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICht
X3Jlc3VsdHNCdXR0b24gJiYgbV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpKQotICAgICAgICBt
X3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCktPnNldFN0eWxlKGNyZWF0ZVJlc3VsdHNCdXR0b25T
dHlsZShzdHlsZSgpKSk7Ci0KLSAgICBpZiAobV9jYW5jZWxCdXR0b24gJiYgbV9jYW5jZWxCdXR0
b24tPnJlbmRlcmVyKCkpCi0gICAgICAgIG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5zZXRT
dHlsZShjcmVhdGVDYW5jZWxCdXR0b25TdHlsZShzdHlsZSgpKSk7CiAKICAgICBzZXRIYXNPdmVy
Zmxvd0NsaXAoZmFsc2UpOwogICAgIHNldFJlcGxhY2VkKGlzSW5saW5lKCkpOwogfQogCi1QYXNz
UmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJUZXh0Q29udHJvbDo6Y3JlYXRlSW5uZXJCbG9ja1N0
eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxlKQotewotICAgIFJlZlB0cjxSZW5kZXJT
dHlsZT4gaW5uZXJCbG9ja1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOwotCi0gICAgaW5u
ZXJCbG9ja1N0eWxlLT5pbmhlcml0RnJvbShzdGFydFN0eWxlKTsKLSAgICBpbm5lckJsb2NrU3R5
bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAgIGlubmVyQmxvY2tTdHlsZS0+c2V0RGlyZWN0aW9u
KExUUik7Ci0gICAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgc2hhZG93IGRvbSB0byBiZSBlZGl0YWJs
ZSwgc28gd2Ugc2V0IHRoaXMgYmxvY2sgdG8gcmVhZC1vbmx5IGluIGNhc2UgdGhlIGlucHV0IGl0
c2VsZiBpcyBlZGl0YWJsZS4KLSAgICBpbm5lckJsb2NrU3R5bGUtPnNldFVzZXJNb2RpZnkoUkVB
RF9PTkxZKTsKLQotICAgIHJldHVybiBpbm5lckJsb2NrU3R5bGUucmVsZWFzZSgpOwotfQotCi1Q
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJUZXh0Q29udHJvbDo6Y3JlYXRlSW5uZXJUZXh0
U3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpCit2b2lkIFJlbmRlclRleHRDb250
cm9sOjphZGp1c3RJbm5lclRleHRTdHlsZShjb25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSwg
UmVuZGVyU3R5bGUqIHRleHRCbG9ja1N0eWxlKSBjb25zdAogewogICAgIEhUTUxGb3JtQ29udHJv
bEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRm9ybUNvbnRyb2xFbGVtZW50Kj4o
bm9kZSgpKTsKLSAgICBib29sIHBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlID0gIW1fbXVsdGlM
aW5lICYmIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihlbGVtZW50KS0+cGxhY2Vob2xk
ZXJTaG91bGRCZVZpc2libGUoKTsKIAotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gdGV4dEJsb2Nr
U3R5bGU7Ci0gICAgaWYgKHBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKSB7Ci0gICAgICAgIFJl
bmRlclN0eWxlKiBwc2V1ZG9TdHlsZSA9IGdldENhY2hlZFBzZXVkb1N0eWxlKFJlbmRlclN0eWxl
OjpJTlBVVF9QTEFDRUhPTERFUik7Ci0gICAgICAgIHRleHRCbG9ja1N0eWxlID0gUmVuZGVyU3R5
bGU6OmNsb25lKHBzZXVkb1N0eWxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICB0ZXh0QmxvY2tT
dHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsgICAKLSAgICAgICAgdGV4dEJsb2NrU3R5bGUt
PmluaGVyaXRGcm9tKHN0YXJ0U3R5bGUpOwotICAgIH0KLSAgICAKICAgICAvLyBUaGUgaW5uZXIg
YmxvY2ssIGlmIHByZXNlbnQsIGFsd2F5cyBoYXMgaXRzIGRpcmVjdGlvbiBzZXQgdG8gTFRSLAog
ICAgIC8vIHNvIHdlIG5lZWQgdG8gaW5oZXJpdCB0aGUgZGlyZWN0aW9uIGZyb20gdGhlIGVsZW1l
bnQuCiAgICAgdGV4dEJsb2NrU3R5bGUtPnNldERpcmVjdGlvbihzdHlsZSgpLT5kaXJlY3Rpb24o
KSk7CiAgICAgdGV4dEJsb2NrU3R5bGUtPnNldFVzZXJNb2RpZnkoZWxlbWVudC0+aXNSZWFkT25s
eUNvbnRyb2woKSB8fCBlbGVtZW50LT5kaXNhYmxlZCgpID8gUkVBRF9PTkxZIDogUkVBRF9XUklU
RV9QTEFJTlRFWFRfT05MWSk7Ci0gICAgaWYgKG1faW5uZXJCbG9jaykKLSAgICAgICAgdGV4dEJs
b2NrU3R5bGUtPnNldERpc3BsYXkoSU5MSU5FX0JMT0NLKTsKLSAgICBlbHNlCi0gICAgICAgIHRl
eHRCbG9ja1N0eWxlLT5zZXREaXNwbGF5KEJMT0NLKTsKLQotICAgIGlmIChtX211bHRpTGluZSkg
ewotICAgICAgICAvLyBGb3J3YXJkIG92ZXJmbG93IHByb3BlcnRpZXMuCi0gICAgICAgIHRleHRC
bG9ja1N0eWxlLT5zZXRPdmVyZmxvd1goc3RhcnRTdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lC
TEUgPyBPQVVUTyA6IHN0YXJ0U3R5bGUtPm92ZXJmbG93WCgpKTsKLSAgICAgICAgdGV4dEJsb2Nr
U3R5bGUtPnNldE92ZXJmbG93WShzdGFydFN0eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSA/
IE9BVVRPIDogc3RhcnRTdHlsZS0+b3ZlcmZsb3dZKCkpOwotCi0gICAgICAgIC8vIFNldCB3b3Jk
IHdyYXAgcHJvcGVydHkgYmFzZWQgb24gd3JhcCBhdHRyaWJ1dGUuCi0gICAgICAgIGlmICghc3Rh
dGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KGVsZW1lbnQpLT5zaG91bGRXcmFwVGV4dCgp
KSB7Ci0gICAgICAgICAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0V2hpdGVTcGFjZShQUkUpOwotICAg
ICAgICAgICAgdGV4dEJsb2NrU3R5bGUtPnNldFdvcmRXcmFwKE5vcm1hbFdvcmRXcmFwKTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRXaGl0ZVNwYWNl
KFBSRV9XUkFQKTsKLSAgICAgICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRXb3JkV3JhcChCcmVh
a1dvcmRXcmFwKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRleHRCbG9ja1N0
eWxlLT5zZXRXaGl0ZVNwYWNlKFBSRSk7Ci0gICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRXb3Jk
V3JhcChOb3JtYWxXb3JkV3JhcCk7Ci0gICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRPdmVyZmxv
d1goT0hJRERFTik7Ci0gICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRPdmVyZmxvd1koT0hJRERF
Tik7Ci0gICAgICAgIAotICAgICAgICAvLyBEbyBub3QgYWxsb3cgbGluZS1oZWlnaHQgdG8gYmUg
c21hbGxlciB0aGFuIG91ciBkZWZhdWx0LgotICAgICAgICBpZiAodGV4dEJsb2NrU3R5bGUtPmZv
bnQoKS5saW5lU3BhY2luZygpID4gbGluZUhlaWdodCh0cnVlLCB0cnVlKSkKLSAgICAgICAgICAg
IHRleHRCbG9ja1N0eWxlLT5zZXRMaW5lSGVpZ2h0KExlbmd0aCgtMTAwLjBmLCBQZXJjZW50KSk7
Ci0gICAgfQotCi0gICAgaWYgKCFtX211bHRpTGluZSkgewotICAgICAgICAvLyBXZSdyZSBhZGRp
bmcgb25lIGV4dHJhIHBpeGVsIG9mIHBhZGRpbmcgdG8gbWF0Y2ggV2luSUUuCi0gICAgICAgIHRl
eHRCbG9ja1N0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgoMSwgRml4ZWQpKTsKLSAgICAgICAg
dGV4dEJsb2NrU3R5bGUtPnNldFBhZGRpbmdSaWdodChMZW5ndGgoMSwgRml4ZWQpKTsKLSAgICB9
IGVsc2UgewotICAgICAgICAvLyBXZSdyZSBhZGRpbmcgdGhyZWUgZXh0cmEgcGl4ZWxzIG9mIHBh
ZGRpbmcgdG8gbGluZSB0ZXh0YXJlYXMgdXAgd2l0aCB0ZXh0IGZpZWxkcy4KLSAgICAgICAgdGV4
dEJsb2NrU3R5bGUtPnNldFBhZGRpbmdMZWZ0KExlbmd0aCgzLCBGaXhlZCkpOwotICAgICAgICB0
ZXh0QmxvY2tTdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aCgzLCBGaXhlZCkpOwotICAgIH0K
LSAgICAKLSAgICAvLyBXaGVuIHRoZSBwbGFjZWhvbGRlciBpcyBnb2luZyB0byBiZSBkaXNwbGF5
ZWQsIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSB0ZXh0IHNlY3VyaXR5IHRvIGJlICJub25lIi4K
LSAgICAvLyBBZnRlciB0aGlzLCB1cGRhdGVGcm9tRWxlbWVudCB3aWxsIGltbWVkaWF0ZWx5IHVw
ZGF0ZSB0aGUgdGV4dCBkaXNwbGF5ZWQuCi0gICAgLy8gV2hlbiB0aGUgcGxhY2Vob2xkZXIgaXMg
bm8gbG9uZ2VyIHZpc2libGUsIHVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJsaXR5IHdpbGwgcmVzZXQg
dGhlIHN0eWxlLCAKLSAgICAvLyBhbmQgdGhlIHRleHQgc2VjdXJpdHkgbW9kZSB3aWxsIGJlIHNl
dCBiYWNrIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBjb3JyZWN0bHkuCi0gICAgaWYgKCFtX211bHRp
TGluZSAmJiBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZWxlbWVudCktPnBsYWNlaG9s
ZGVyU2hvdWxkQmVWaXNpYmxlKCkpCi0gICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRUZXh0U2Vj
dXJpdHkoVFNOT05FKTsKIAogICAgIGlmICghZWxlbWVudC0+aXNFbmFibGVkKCkpCiAgICAgICAg
IHRleHRCbG9ja1N0eWxlLT5zZXRDb2xvcihkaXNhYmxlZFRleHRDb2xvcih0ZXh0QmxvY2tTdHls
ZS0+Y29sb3IoKSwgc3RhcnRTdHlsZS0+YmFja2dyb3VuZENvbG9yKCkpKTsKLQotICAgIHJldHVy
biB0ZXh0QmxvY2tTdHlsZS5yZWxlYXNlKCk7CiB9CiAKLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+
IFJlbmRlclRleHRDb250cm9sOjpjcmVhdGVSZXN1bHRzQnV0dG9uU3R5bGUoY29uc3QgUmVuZGVy
U3R5bGUqIHN0YXJ0U3R5bGUpCit2b2lkIFJlbmRlclRleHRDb250cm9sOjpjcmVhdGVTdWJ0cmVl
SWZOZWVkZWQoTm9kZSogaW5uZXJCbG9jaykKIHsKLSAgICBBU1NFUlQoIW1fbXVsdGlMaW5lKTsK
LSAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnQqPihub2RlKCkpOwotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gcmVzdWx0c0Jsb2NrU3R5bGU7
Ci0gICAgaWYgKGlucHV0LT5tYXhSZXN1bHRzKCkgPCAwKQotICAgICAgICByZXN1bHRzQmxvY2tT
dHlsZSA9IGdldENhY2hlZFBzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpTRUFSQ0hfREVDT1JBVElP
Tik7Ci0gICAgZWxzZSBpZiAoIWlucHV0LT5tYXhSZXN1bHRzKCkpCi0gICAgICAgIHJlc3VsdHNC
bG9ja1N0eWxlID0gZ2V0Q2FjaGVkUHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OlNFQVJDSF9SRVNV
TFRTX0RFQ09SQVRJT04pOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0c0Jsb2NrU3R5bGUgPSBn
ZXRDYWNoZWRQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6U0VBUkNIX1JFU1VMVFNfQlVUVE9OKTsK
LQotICAgIGlmICghcmVzdWx0c0Jsb2NrU3R5bGUpCi0gICAgICAgIHJlc3VsdHNCbG9ja1N0eWxl
ID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOwotCi0gICAgaWYgKHN0YXJ0U3R5bGUpCi0gICAgICAg
IHJlc3VsdHNCbG9ja1N0eWxlLT5pbmhlcml0RnJvbShzdGFydFN0eWxlKTsKLQotICAgIHJldHVy
biByZXN1bHRzQmxvY2tTdHlsZS5yZWxlYXNlKCk7CisgICAgaWYgKCFtX2lubmVyVGV4dCkgewor
ICAgICAgICAvLyBDcmVhdGUgdGhlIHRleHQgYmxvY2sgZWxlbWVudAorICAgICAgICAvLyBGb3Ig
bm9uLXNlYXJjaCBmaWVsZHMsIHRoZXJlIGlzIG5vIGludGVybWVkaWF0ZSBpbm5lckJsb2NrIGFz
IHRoZSBzaGFkb3cgbm9kZS4KKyAgICAgICAgLy8gbV9pbm5lclRleHQgd2lsbCBiZSB0aGUgc2hh
ZG93IG5vZGUgaW4gdGhhdCBjYXNlLiAgICAgICAgCisgICAgICAgIFJlbmRlclN0eWxlKiBwYXJl
bnRTdHlsZSA9IGlubmVyQmxvY2sgPyBpbm5lckJsb2NrLT5yZW5kZXJlcigpLT5zdHlsZSgpIDog
c3R5bGUoKTsKKyAgICAgICAgbV9pbm5lclRleHQgPSBuZXcgVGV4dENvbnRyb2xJbm5lclRleHRF
bGVtZW50KGRvY3VtZW50KCksIGlubmVyQmxvY2sgPyAwIDogbm9kZSgpKTsKKyAgICAgICAgbV9p
bm5lclRleHQtPmF0dGFjaElubmVyRWxlbWVudChpbm5lckJsb2NrID8gaW5uZXJCbG9jayA6IG5v
ZGUoKSwgY3JlYXRlSW5uZXJUZXh0U3R5bGUocGFyZW50U3R5bGUpLCByZW5kZXJBcmVuYSgpKTsK
KyAgICB9CiB9CiAKLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlclRleHRDb250cm9sOjpj
cmVhdGVDYW5jZWxCdXR0b25TdHlsZShjb25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSkKK2lu
dCBSZW5kZXJUZXh0Q29udHJvbDo6dGV4dEJsb2NrSGVpZ2h0KCkgY29uc3QKIHsKLSAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IGNhbmNlbEJsb2NrU3R5bGU7Ci0gICAgCi0gICAgaWYgKFJlZlB0cjxS
ZW5kZXJTdHlsZT4gcHNldWRvU3R5bGUgPSBnZXRDYWNoZWRQc2V1ZG9TdHlsZShSZW5kZXJTdHls
ZTo6U0VBUkNIX0NBTkNFTF9CVVRUT04pKQotICAgICAgICAvLyBXZSBtYXkgYmUgc2hhcmluZyBz
dHlsZSB3aXRoIGFub3RoZXIgc2VhcmNoIGZpZWxkLCBidXQgd2UgbXVzdCBub3Qgc2hhcmUgdGhl
IGNhbmNlbCBidXR0b24gc3R5bGUuCi0gICAgICAgIGNhbmNlbEJsb2NrU3R5bGUgPSBSZW5kZXJT
dHlsZTo6Y2xvbmUocHNldWRvU3R5bGUuZ2V0KCkpOwotICAgIGVsc2UKLSAgICAgICAgY2FuY2Vs
QmxvY2tTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKLQotICAgIGlmIChzdGFydFN0eWxl
KQotICAgICAgICBjYW5jZWxCbG9ja1N0eWxlLT5pbmhlcml0RnJvbShzdGFydFN0eWxlKTsKLQot
ICAgIHVwZGF0ZUNhbmNlbEJ1dHRvblZpc2liaWxpdHkoY2FuY2VsQmxvY2tTdHlsZS5nZXQoKSk7
Ci0KLSAgICByZXR1cm4gY2FuY2VsQmxvY2tTdHlsZS5yZWxlYXNlKCk7CisgICAgcmV0dXJuIG1f
aGVpZ2h0IC0gcGFkZGluZ1RvcCgpIC0gcGFkZGluZ0JvdHRvbSgpIC0gYm9yZGVyVG9wKCkgLSBi
b3JkZXJCb3R0b20oKTsKIH0KIAotdm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6Y3JlYXRlU3VidHJl
ZUlmTmVlZGVkKCkKK2ludCBSZW5kZXJUZXh0Q29udHJvbDo6dGV4dEJsb2NrV2lkdGgoKSBjb25z
dAogewotICAgIGJvb2wgaXNTZWFyY2hGaWVsZCA9ICFtX211bHRpTGluZSAmJiBzdGF0aWNfY2Fz
dDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+aXNTZWFyY2hGaWVsZCgpOwotICAgIGlmIChp
c1NlYXJjaEZpZWxkICYmICFtX2lubmVyQmxvY2spIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBp
bm5lciBibG9jayBlbGVtZW50Ci0gICAgICAgIG1faW5uZXJCbG9jayA9IG5ldyBUZXh0Q29udHJv
bElubmVyRWxlbWVudChkb2N1bWVudCgpLCBub2RlKCkpOwotICAgICAgICBtX2lubmVyQmxvY2st
PmF0dGFjaElubmVyRWxlbWVudChub2RlKCksIGNyZWF0ZUlubmVyQmxvY2tTdHlsZShzdHlsZSgp
KSwgcmVuZGVyQXJlbmEoKSk7Ci0gICAgfQotICAgIGlmIChpc1NlYXJjaEZpZWxkICYmICFtX3Jl
c3VsdHNCdXR0b24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZWFyY2ggcmVzdWx0cyBidXR0
b24gZWxlbWVudAotICAgICAgICBtX3Jlc3VsdHNCdXR0b24gPSBuZXcgU2VhcmNoRmllbGRSZXN1
bHRzQnV0dG9uRWxlbWVudChkb2N1bWVudCgpKTsKLSAgICAgICAgbV9yZXN1bHRzQnV0dG9uLT5h
dHRhY2hJbm5lckVsZW1lbnQobV9pbm5lckJsb2NrLmdldCgpLCBjcmVhdGVSZXN1bHRzQnV0dG9u
U3R5bGUobV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT5zdHlsZSgpKSwgcmVuZGVyQXJlbmEoKSk7
Ci0gICAgfQotICAgIGlmICghbV9pbm5lclRleHQpIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSB0
ZXh0IGJsb2NrIGVsZW1lbnQKLSAgICAgICAgLy8gRm9yIG5vbi1zZWFyY2ggZmllbGRzLCB0aGVy
ZSBpcyBubyBpbnRlcm1lZGlhdGUgbV9pbm5lckJsb2NrIGFzIHRoZSBzaGFkb3cgbm9kZS4KLSAg
ICAgICAgLy8gbV9pbm5lclRleHQgd2lsbCBiZSB0aGUgc2hhZG93IG5vZGUgaW4gdGhhdCBjYXNl
LgotICAgICAgICAKLSAgICAgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gc3R5bGUoKTsK
LSAgICAgICAgaWYgKG1faW5uZXJCbG9jaykKLSAgICAgICAgICAgIHBhcmVudFN0eWxlID0gbV9p
bm5lckJsb2NrLT5yZW5kZXJlcigpLT5zdHlsZSgpOwotICAgICAgICBtX2lubmVyVGV4dCA9IG5l
dyBUZXh0Q29udHJvbElubmVyVGV4dEVsZW1lbnQoZG9jdW1lbnQoKSwgbV9pbm5lckJsb2NrID8g
MCA6IG5vZGUoKSk7Ci0gICAgICAgIG1faW5uZXJUZXh0LT5hdHRhY2hJbm5lckVsZW1lbnQobV9p
bm5lckJsb2NrID8gbV9pbm5lckJsb2NrLmdldCgpIDogbm9kZSgpLCBjcmVhdGVJbm5lclRleHRT
dHlsZShwYXJlbnRTdHlsZSksIHJlbmRlckFyZW5hKCkpOwotICAgIH0KLSAgICBpZiAoaXNTZWFy
Y2hGaWVsZCAmJiAhbV9jYW5jZWxCdXR0b24pIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYW5j
ZWwgYnV0dG9uIGVsZW1lbnQKLSAgICAgICAgbV9jYW5jZWxCdXR0b24gPSBuZXcgU2VhcmNoRmll
bGRDYW5jZWxCdXR0b25FbGVtZW50KGRvY3VtZW50KCkpOwotICAgICAgICBtX2NhbmNlbEJ1dHRv
bi0+YXR0YWNoSW5uZXJFbGVtZW50KG1faW5uZXJCbG9jay5nZXQoKSwgY3JlYXRlQ2FuY2VsQnV0
dG9uU3R5bGUobV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT5zdHlsZSgpKSwgcmVuZGVyQXJlbmEo
KSk7Ci0gICAgfQorICAgIHJldHVybiBtX3dpZHRoIC0gcGFkZGluZ0xlZnQoKSAtIHBhZGRpbmdS
aWdodCgpIC0gYm9yZGVyTGVmdCgpIC0gYm9yZGVyUmlnaHQoKSAtCisgICAgICAgICAgIG1faW5u
ZXJUZXh0LT5yZW5kZXJlcigpLT5wYWRkaW5nTGVmdCgpIC0gbV9pbm5lclRleHQtPnJlbmRlcmVy
KCktPnBhZGRpbmdSaWdodCgpOwogfQogCiB2b2lkIFJlbmRlclRleHRDb250cm9sOjp1cGRhdGVG
cm9tRWxlbWVudCgpCiB7CiAgICAgSFRNTEZvcm1Db250cm9sRWxlbWVudCogZWxlbWVudCA9IHN0
YXRpY19jYXN0PEhUTUxGb3JtQ29udHJvbEVsZW1lbnQqPihub2RlKCkpOworICAgIG1faW5uZXJU
ZXh0LT5yZW5kZXJlcigpLT5zdHlsZSgpLT5zZXRVc2VyTW9kaWZ5KGVsZW1lbnQtPmlzUmVhZE9u
bHlDb250cm9sKCkgfHwgZWxlbWVudC0+ZGlzYWJsZWQoKSA/IFJFQURfT05MWSA6IFJFQURfV1JJ
VEVfUExBSU5URVhUX09OTFkpOworfQogCi0gICAgYm9vbCBwbGFjZWhvbGRlclNob3VsZEJlVmlz
aWJsZSA9ICFtX211bHRpTGluZSAmJiBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZWxl
bWVudCktPnBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCk7Ci0gICAgYm9vbCBwbGFjZWhvbGRl
clZpc2liaWxpdHlTaG91bGRDaGFuZ2UgPSBtX3BsYWNlaG9sZGVyVmlzaWJsZSAhPSBwbGFjZWhv
bGRlclNob3VsZEJlVmlzaWJsZTsKLSAgICBtX3BsYWNlaG9sZGVyVmlzaWJsZSA9IHBsYWNlaG9s
ZGVyU2hvdWxkQmVWaXNpYmxlOwordm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6dXBkYXRlSW5uZXJU
ZXh0VmFsdWUoY29uc3QgU3RyaW5nJiBpbm5lclRleHRWYWx1ZSkKK3sKKyAgICBTdHJpbmcgdmFs
dWU7CiAKLSAgICBjcmVhdGVTdWJ0cmVlSWZOZWVkZWQoKTsKKyAgICBpZiAoaW5uZXJUZXh0VmFs
dWUuaXNOdWxsKCkpCisgICAgICAgIHZhbHVlID0gIiI7CisgICAgZWxzZSB7CisgICAgICAgIHZh
bHVlID0gaW5uZXJUZXh0VmFsdWU7IAorICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xc
JywgYmFja3NsYXNoQXNDdXJyZW5jeVN5bWJvbCgpKTsKKyAgICB9CiAKLSAgICBpZiAobV9jYW5j
ZWxCdXR0b24gJiYgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCkpCi0gICAgICAgIHVwZGF0ZUNh
bmNlbEJ1dHRvblZpc2liaWxpdHkobV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPnN0eWxlKCkp
OworICAgIGlmICh2YWx1ZSAhPSB0ZXh0KCkgfHwgIW1faW5uZXJUZXh0LT5oYXNDaGlsZE5vZGVz
KCkpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IHRleHQoKSkgeworICAgICAgICAgICAgaWYgKEZy
YW1lKiBmcmFtZSA9IGRvY3VtZW50KCktPmZyYW1lKCkpCisgICAgICAgICAgICAgICAgZnJhbWUt
PmVkaXRvcigpLT5jbGVhclVuZG9SZWRvT3BlcmF0aW9ucygpOworICAgICAgICB9CiAKLSAgICBt
X2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+c2V0VXNlck1vZGlmeShlbGVtZW50LT5p
c1JlYWRPbmx5Q29udHJvbCgpIHx8IGVsZW1lbnQtPmRpc2FibGVkKCkgPyBSRUFEX09OTFkgOiBS
RUFEX1dSSVRFX1BMQUlOVEVYVF9PTkxZKTsKLSAgICAKLSAgICBpZiAobV9wbGFjZWhvbGRlclZp
c2libGUpIHsKLSAgICAgICAgRXhjZXB0aW9uQ29kZSBlYzsKLSAgICAgICAgbV9pbm5lclRleHQt
PnNldElubmVyVGV4dChzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZWxlbWVudCktPmdl
dEF0dHJpYnV0ZShwbGFjZWhvbGRlckF0dHIpLCBlYyk7Ci0gICAgfSBlbHNlIGlmICghZWxlbWVu
dC0+dmFsdWVNYXRjaGVzUmVuZGVyZXIoKSB8fCBtX211bHRpTGluZSB8fCBwbGFjZWhvbGRlclZp
c2liaWxpdHlTaG91bGRDaGFuZ2UpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICBp
ZiAobV9tdWx0aUxpbmUpCi0gICAgICAgICAgICB2YWx1ZSA9IHN0YXRpY19jYXN0PEhUTUxUZXh0
QXJlYUVsZW1lbnQqPihlbGVtZW50KS0+dmFsdWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgdmFsdWUgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZWxlbWVudCktPnZhbHVl
KCk7Ci0gICAgICAgIGlmICh2YWx1ZS5pc051bGwoKSkKLSAgICAgICAgICAgIHZhbHVlID0gIiI7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFwnLCBi
YWNrc2xhc2hBc0N1cnJlbmN5U3ltYm9sKCkpOwotICAgICAgICBpZiAodmFsdWUgIT0gdGV4dCgp
IHx8ICFtX2lubmVyVGV4dC0+aGFzQ2hpbGROb2RlcygpKSB7Ci0gICAgICAgICAgICBpZiAodmFs
dWUgIT0gdGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3Vt
ZW50KCktPmZyYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lLT5lZGl0b3IoKS0+Y2xl
YXJVbmRvUmVkb09wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEV4Y2Vw
dGlvbkNvZGUgZWMgPSAwOwotICAgICAgICAgICAgbV9pbm5lclRleHQtPnNldElubmVyVGV4dCh2
YWx1ZSwgZWMpOwotICAgICAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKCJcbiIpIHx8IHZhbHVl
LmVuZHNXaXRoKCJcciIpKQotICAgICAgICAgICAgICAgIG1faW5uZXJUZXh0LT5hcHBlbmRDaGls
ZChuZXcgSFRNTEJSRWxlbWVudChiclRhZywgZG9jdW1lbnQoKSksIGVjKTsKLSAgICAgICAgICAg
IG1fZGlydHkgPSBmYWxzZTsKLSAgICAgICAgICAgIG1fdXNlckVkaXRlZCA9IGZhbHNlOworICAg
ICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICAgICAgbV9pbm5lclRleHQtPnNldElubmVy
VGV4dCh2YWx1ZSwgZWMpOworICAgICAgICBBU1NFUlQoZWMgPT0gMCk7CisKKyAgICAgICAgaWYg
KHZhbHVlLmVuZHNXaXRoKCJcbiIpIHx8IHZhbHVlLmVuZHNXaXRoKCJcciIpKSB7CisgICAgICAg
ICAgICBtX2lubmVyVGV4dC0+YXBwZW5kQ2hpbGQobmV3IEhUTUxCUkVsZW1lbnQoYnJUYWcsIGRv
Y3VtZW50KCkpLCBlYyk7CisgICAgICAgICAgICBBU1NFUlQoZWMgPT0gMCk7CiAgICAgICAgIH0K
LSAgICAgICAgZWxlbWVudC0+c2V0VmFsdWVNYXRjaGVzUmVuZGVyZXIoKTsKKworICAgICAgICBt
X2VkaXRlZCA9IGZhbHNlOworICAgICAgICBtX3VzZXJFZGl0ZWQgPSBmYWxzZTsKICAgICB9CiAK
LSAgICBpZiAobV9zZWFyY2hQb3B1cElzVmlzaWJsZSkKLSAgICAgICAgbV9zZWFyY2hQb3B1cC0+
dXBkYXRlRnJvbUVsZW1lbnQoKTsKKyAgICBzdGF0aWNfY2FzdDxIVE1MRm9ybUNvbnRyb2xFbGVt
ZW50Kj4obm9kZSgpKS0+c2V0VmFsdWVNYXRjaGVzUmVuZGVyZXIoKTsKIH0KIAogdm9pZCBSZW5k
ZXJUZXh0Q29udHJvbDo6c2V0VXNlckVkaXRlZChib29sIGlzVXNlckVkaXRlZCkKQEAgLTM4Nywx
MCArMjIyLDcgQEAgdm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6c2V0U2VsZWN0aW9uUmFuZwogICAg
IGRvY3VtZW50KCktPnVwZGF0ZUxheW91dCgpOwogCiAgICAgaWYgKHN0eWxlKCktPnZpc2liaWxp
dHkoKSA9PSBISURERU4gfHwgIW1faW5uZXJUZXh0IHx8ICFtX2lubmVyVGV4dC0+cmVuZGVyZXIo
KSB8fCAhbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPmhlaWdodCgpKSB7Ci0gICAgICAgIGlmICht
X211bHRpTGluZSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQq
Pihub2RlKCkpLT5jYWNoZVNlbGVjdGlvbihzdGFydCwgZW5kKTsKLSAgICAgICAgZWxzZQotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmNhY2hlU2Vs
ZWN0aW9uKHN0YXJ0LCBlbmQpOworICAgICAgICBjYWNoZVNlbGVjdGlvbihzdGFydCwgZW5kKTsK
ICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBWaXNpYmxlUG9zaXRpb24gc3RhcnRQb3NpdGlv
biA9IHZpc2libGVQb3NpdGlvbkZvckluZGV4KHN0YXJ0KTsKQEAgLTQyNyw5ICsyNTksMTQgQEAg
VmlzaWJsZVBvc2l0aW9uIFJlbmRlclRleHRDb250cm9sOjp2aXNpYgogICAgIEV4Y2VwdGlvbkNv
ZGUgZWMgPSAwOwogICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBSYW5nZTo6Y3JlYXRlKGRvY3Vt
ZW50KCkpOwogICAgIHJhbmdlLT5zZWxlY3ROb2RlQ29udGVudHMobV9pbm5lclRleHQuZ2V0KCks
IGVjKTsKKyAgICBBU1NFUlQoZWMgPT0gMCk7CiAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXQocmFu
Z2UuZ2V0KCkpOwogICAgIGl0LmFkdmFuY2UoaW5kZXggLSAxKTsKLSAgICByZXR1cm4gVmlzaWJs
ZVBvc2l0aW9uKGl0LnJhbmdlKCktPmVuZENvbnRhaW5lcihlYyksIGl0LnJhbmdlKCktPmVuZE9m
ZnNldChlYyksIFVQU1RSRUFNKTsKKyAgICBOb2RlKiBlbmRDb250YWluZXIgPSBpdC5yYW5nZSgp
LT5lbmRDb250YWluZXIoZWMpOworICAgIEFTU0VSVChlYyA9PSAwKTsKKyAgICBpbnQgZW5kT2Zm
c2V0ID0gaXQucmFuZ2UoKS0+ZW5kT2Zmc2V0KGVjKTsKKyAgICBBU1NFUlQoZWMgPT0gMCk7Cisg
ICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihlbmRDb250YWluZXIsIGVuZE9mZnNldCwgVVBTVFJF
QU0pOwogfQogCiBpbnQgUmVuZGVyVGV4dENvbnRyb2w6OmluZGV4Rm9yVmlzaWJsZVBvc2l0aW9u
KGNvbnN0IFZpc2libGVQb3NpdGlvbiYgcG9zKQpAQCAtNDQwLDUwICsyNzcsMTYgQEAgaW50IFJl
bmRlclRleHRDb250cm9sOjppbmRleEZvclZpc2libGVQbwogICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwogICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBSYW5nZTo6Y3JlYXRlKGRvY3VtZW50KCkp
OwogICAgIHJhbmdlLT5zZXRTdGFydChtX2lubmVyVGV4dC5nZXQoKSwgMCwgZWMpOworICAgIEFT
U0VSVChlYyA9PSAwKTsKICAgICByYW5nZS0+c2V0RW5kKGluZGV4UG9zaXRpb24ubm9kZSgpLCBp
bmRleFBvc2l0aW9uLm9mZnNldCgpLCBlYyk7CisgICAgQVNTRVJUKGVjID09IDApOwogICAgIHJl
dHVybiBUZXh0SXRlcmF0b3I6OnJhbmdlTGVuZ3RoKHJhbmdlLmdldCgpKTsKIH0KIAotdm9pZCBS
ZW5kZXJUZXh0Q29udHJvbDo6dXBkYXRlQ2FuY2VsQnV0dG9uVmlzaWJpbGl0eShSZW5kZXJTdHls
ZSogc3R5bGUpCi17Ci0gICAgQVNTRVJUKCFtX211bHRpTGluZSk7Ci0gICAgSFRNTElucHV0RWxl
bWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKLSAg
ICBpZiAoaW5wdXQtPnZhbHVlKCkuaXNFbXB0eSgpKQotICAgICAgICBzdHlsZS0+c2V0VmlzaWJp
bGl0eShISURERU4pOwotICAgIGVsc2UKLSAgICAgICAgc3R5bGUtPnNldFZpc2liaWxpdHkoVklT
SUJMRSk7Ci19Ci0KIHZvaWQgUmVuZGVyVGV4dENvbnRyb2w6OnN1YnRyZWVIYXNDaGFuZ2VkKCkK
IHsKLSAgICBib29sIHdhc0RpcnR5ID0gbV9kaXJ0eTsKLSAgICBtX2RpcnR5ID0gdHJ1ZTsKKyAg
ICBtX2VkaXRlZCA9IHRydWU7CiAgICAgbV91c2VyRWRpdGVkID0gdHJ1ZTsKLSAgICBIVE1MRm9y
bUNvbnRyb2xFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEZvcm1Db250cm9sRWxl
bWVudCo+KG5vZGUoKSk7Ci0gICAgaWYgKG1fbXVsdGlMaW5lKSB7Ci0gICAgICAgIGVsZW1lbnQt
PnNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKGZhbHNlKTsKLSAgICAgICAgaWYgKGVsZW1lbnQtPmZv
Y3VzZWQoKSkKLSAgICAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFt
ZSgpKQotICAgICAgICAgICAgICAgIGZyYW1lLT50ZXh0RGlkQ2hhbmdlSW5UZXh0QXJlYShlbGVt
ZW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dCA9IHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihlbGVtZW50KTsKLSAgICAgICAgaW5wdXQtPnNl
dFZhbHVlRnJvbVJlbmRlcmVyKGlucHV0LT5jb25zdHJhaW5WYWx1ZSh0ZXh0KCkpKTsKLSAgICAg
ICAgaWYgKG1fY2FuY2VsQnV0dG9uICYmIG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpKQotICAg
ICAgICAgICAgdXBkYXRlQ2FuY2VsQnV0dG9uVmlzaWJpbGl0eShtX2NhbmNlbEJ1dHRvbi0+cmVu
ZGVyZXIoKS0+c3R5bGUoKSk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGluY3JlbWVudGFsIGF0dHJp
YnV0ZSBpcyBzZXQsIHRoZW4gZGlzcGF0Y2ggdGhlIHNlYXJjaCBldmVudAotICAgICAgICBpZiAo
IWlucHV0LT5nZXRBdHRyaWJ1dGUoaW5jcmVtZW50YWxBdHRyKS5pc051bGwoKSkKLSAgICAgICAg
ICAgIHN0YXJ0U2VhcmNoRXZlbnRUaW1lcigpOwotCi0gICAgICAgIGlmICghd2FzRGlydHkpIHsK
LSAgICAgICAgICAgIGlmIChpbnB1dC0+Zm9jdXNlZCgpKQotICAgICAgICAgICAgICAgIGlmIChG
cmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAgICAgICAgICAgICAgICBm
cmFtZS0+dGV4dEZpZWxkRGlkQmVnaW5FZGl0aW5nKGlucHV0KTsKLSAgICAgICAgfQotICAgICAg
ICBpZiAoaW5wdXQtPmZvY3VzZWQoKSkKLSAgICAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBk
b2N1bWVudCgpLT5mcmFtZSgpKQotICAgICAgICAgICAgICAgIGZyYW1lLT50ZXh0RGlkQ2hhbmdl
SW5UZXh0RmllbGQoaW5wdXQpOwotICAgIH0KIH0KIAogU3RyaW5nIFJlbmRlclRleHRDb250cm9s
OjpmaW5pc2hUZXh0KFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCkgY29uc3QKQEAgLTUwNSwxMSArMzA4
LDYgQEAgU3RyaW5nIFJlbmRlclRleHRDb250cm9sOjpmaW5pc2hUZXh0KFZlYwogICAgIHJldHVy
biBTdHJpbmc6OmFkb3B0KHJlc3VsdCk7CiB9CiAKLUhUTUxFbGVtZW50KiBSZW5kZXJUZXh0Q29u
dHJvbDo6aW5uZXJUZXh0RWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1faW5uZXJUZXh0
LmdldCgpOwotfQotCiBTdHJpbmcgUmVuZGVyVGV4dENvbnRyb2w6OnRleHQoKQogewogICAgIGlm
ICghbV9pbm5lclRleHQpCkBAIC02MjIsODggKzQyMCwzNyBAQCBTdHJpbmcgUmVuZGVyVGV4dENv
bnRyb2w6OnRleHRXaXRoSGFyZExpCiAgICAgcmV0dXJuIGZpbmlzaFRleHQocmVzdWx0KTsKIH0K
IAoraW50IFJlbmRlclRleHRDb250cm9sOjpzY3JvbGxiYXJUaGlja25lc3MoKSBjb25zdAorewor
ICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgZ2V0IHRoZSBzaXplIG9mIHRoZSBzY3JvbGxiYXIgZnJv
bSB0aGUgUmVuZGVyVGhlbWUgaW5zdGVhZC4KKyAgICByZXR1cm4gU2Nyb2xsYmFyVGhlbWU6Om5h
dGl2ZVRoZW1lKCktPnNjcm9sbGJhclRoaWNrbmVzcygpOworfQorCiB2b2lkIFJlbmRlclRleHRD
b250cm9sOjpjYWxjSGVpZ2h0KCkKIHsKLSAgICBpbnQgcm93cyA9IDE7Ci0gICAgaWYgKG1fbXVs
dGlMaW5lKQotICAgICAgICByb3dzID0gc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+
KG5vZGUoKSktPnJvd3MoKTsKLQotICAgIGludCBsaW5lID0gbV9pbm5lclRleHQtPnJlbmRlcmVy
KCktPmxpbmVIZWlnaHQodHJ1ZSwgdHJ1ZSk7Ci0gICAgaW50IHRvQWRkID0gcGFkZGluZ1RvcCgp
ICsgcGFkZGluZ0JvdHRvbSgpICsgYm9yZGVyVG9wKCkgKyBib3JkZXJCb3R0b20oKTsKLQotICAg
IGludCBpbm5lclRvQWRkID0gbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPmJvcmRlclRvcCgpICsg
bV9pbm5lclRleHQtPnJlbmRlcmVyKCktPmJvcmRlckJvdHRvbSgpICsKLSAgICAgICAgICAgICAg
ICAgICAgIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5wYWRkaW5nVG9wKCkgKyBtX2lubmVyVGV4
dC0+cmVuZGVyZXIoKS0+cGFkZGluZ0JvdHRvbSgpICsKLSAgICAgICAgICAgICAgICAgICAgIG1f
aW5uZXJUZXh0LT5yZW5kZXJlcigpLT5tYXJnaW5Ub3AoKSArIG1faW5uZXJUZXh0LT5yZW5kZXJl
cigpLT5tYXJnaW5Cb3R0b20oKTsKLSAgICAKLSAgICBpZiAobV9yZXN1bHRzQnV0dG9uICYmIG1f
cmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJC
bG9jayo+KG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSktPmNhbGNIZWlnaHQoKTsKLSAgICAg
ICAgaW5uZXJUb0FkZCA9IG1heChpbm5lclRvQWRkLAotICAgICAgICAgICAgICAgICAgICAgICAg
IG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+Ym9yZGVyVG9wKCkgKyBtX3Jlc3VsdHNCdXR0
b24tPnJlbmRlcmVyKCktPmJvcmRlckJvdHRvbSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAg
ICBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCktPnBhZGRpbmdUb3AoKSArIG1fcmVzdWx0c0J1
dHRvbi0+cmVuZGVyZXIoKS0+cGFkZGluZ0JvdHRvbSgpICsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCktPm1hcmdpblRvcCgpICsgbV9yZXN1bHRz
QnV0dG9uLT5yZW5kZXJlcigpLT5tYXJnaW5Cb3R0b20oKSk7Ci0gICAgICAgIGxpbmUgPSBtYXgo
bGluZSwgbV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpLT5oZWlnaHQoKSk7Ci0gICAgfQotICAg
IGlmIChtX2NhbmNlbEJ1dHRvbiAmJiBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSkgewotICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJCbG9jayo+KG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigp
KS0+Y2FsY0hlaWdodCgpOwotICAgICAgICBpbm5lclRvQWRkID0gbWF4KGlubmVyVG9BZGQsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPmJvcmRl
clRvcCgpICsgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPmJvcmRlckJvdHRvbSgpICsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKS0+cGFkZGlu
Z1RvcCgpICsgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPnBhZGRpbmdCb3R0b20oKSArCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPm1hcmdp
blRvcCgpICsgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPm1hcmdpbkJvdHRvbSgpKTsKLSAg
ICAgICAgbGluZSA9IG1heChsaW5lLCBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKS0+aGVpZ2h0
KCkpOwotICAgIH0KLSAgICB0b0FkZCArPSBpbm5lclRvQWRkOworICAgIG1faGVpZ2h0ID0gbV9p
bm5lclRleHQtPnJlbmRlcmVyKCktPmJvcmRlclRvcCgpICsgbV9pbm5lclRleHQtPnJlbmRlcmVy
KCktPmJvcmRlckJvdHRvbSgpICsKKyAgICAgICAgICAgICAgIG1faW5uZXJUZXh0LT5yZW5kZXJl
cigpLT5wYWRkaW5nVG9wKCkgKyBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+cGFkZGluZ0JvdHRv
bSgpICsKKyAgICAgICAgICAgICAgIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5tYXJnaW5Ub3Ao
KSArIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5tYXJnaW5Cb3R0b20oKTsKKworICAgIGNhbGNF
eHRyYUxpbmVIZWlnaHQobV9pbm5lclRleHQtPnJlbmRlcmVyKCktPmxpbmVIZWlnaHQodHJ1ZSwg
dHJ1ZSkpOworICAgIG1faGVpZ2h0ICs9IHBhZGRpbmdUb3AoKSArIHBhZGRpbmdCb3R0b20oKSAr
IGJvcmRlclRvcCgpICsgYm9yZGVyQm90dG9tKCk7CiAKLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxk
IGdldCB0aGUgc2l6ZSBvZiB0aGUgc2Nyb2xsYmFyIGZyb20gdGhlIFJlbmRlclRoZW1lIGluc3Rl
YWQuCi0gICAgaW50IHNjcm9sbGJhclNpemUgPSAwOwogICAgIC8vIFdlIGFyZSBhYmxlIHRvIGhh
dmUgYSBob3Jpem9udGFsIHNjcm9sbGJhciBpZiB0aGUgb3ZlcmZsb3cgc3R5bGUgaXMgc2Nyb2xs
LCBvciBpZiBpdHMgYXV0byBhbmQgdGhlcmUncyBubyB3b3JkIHdyYXAuCiAgICAgaWYgKG1faW5u
ZXJUZXh0LT5yZW5kZXJlcigpLT5zdHlsZSgpLT5vdmVyZmxvd1goKSA9PSBPU0NST0xMIHx8ICAo
bV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnN0eWxlKCktPm92ZXJmbG93WCgpID09IE9BVVRPICYm
IG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5zdHlsZSgpLT53b3JkV3JhcCgpID09IE5vcm1hbFdv
cmRXcmFwKSkKLSAgICAgICAgc2Nyb2xsYmFyU2l6ZSA9IFNjcm9sbGJhclRoZW1lOjpuYXRpdmVU
aGVtZSgpLT5zY3JvbGxiYXJUaGlja25lc3MoKTsKLQotICAgIG1faGVpZ2h0ID0gbGluZSAqIHJv
d3MgKyB0b0FkZCArIHNjcm9sbGJhclNpemU7CisgICAgICAgIG1faGVpZ2h0ICs9IHNjcm9sbGJh
clRoaWNrbmVzcygpOwogCiAgICAgUmVuZGVyQmxvY2s6OmNhbGNIZWlnaHQoKTsKIH0KIAotaW50
IFJlbmRlclRleHRDb250cm9sOjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgYiwgYm9vbCBpc1Jvb3RM
aW5lQm94KSBjb25zdAotewotICAgIGlmIChtX211bHRpTGluZSkKLSAgICAgICAgcmV0dXJuIGhl
aWdodCgpICsgbWFyZ2luVG9wKCkgKyBtYXJnaW5Cb3R0b20oKTsKLSAgICByZXR1cm4gUmVuZGVy
QmxvY2s6OmJhc2VsaW5lUG9zaXRpb24oYiwgaXNSb290TGluZUJveCk7Ci19Ci0KLWJvb2wgUmVu
ZGVyVGV4dENvbnRyb2w6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0
LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhp
dFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbikKK2Jvb2wgUmVuZGVyVGV4dENvbnRyb2w6Om5vZGVB
dFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1
bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFj
dGlvbiwgTm9kZSogaW5uZXJCbG9jaykKIHsKLSAgICAvLyBJZiB3ZSdyZSB3aXRoaW4gdGhlIHRl
eHQgY29udHJvbCwgd2Ugd2FudCB0byBhY3QgYXMgaWYgd2UndmUgaGl0IHRoZSBpbm5lciB0ZXh0
IGJsb2NrIGVsZW1lbnQsIGluIGNhc2UgdGhlIHBvaW50Ci0gICAgLy8gd2FzIG9uIHRoZSBjb250
cm9sIGJ1dCBub3Qgb24gdGhlIGlubmVyIGVsZW1lbnQgKHNlZSBSYWRhciA0NjE3ODQxKS4KLQot
ICAgIC8vIEluIGEgc2VhcmNoIGZpZWxkLCB3ZSB3YW50IHRvIGFjdCBhcyBpZiB3ZSd2ZSBoaXQg
dGhlIHJlc3VsdHMgYmxvY2sgaWYgd2UncmUgdG8gdGhlIGxlZnQgb2YgdGhlIGlubmVyIHRleHQg
YmxvY2ssCi0gICAgLy8gYW5kIGFjdCBhcyBpZiB3ZSd2ZSBoaXQgdGhlIGNsb3NlIGJsb2NrIGlm
IHdlJ3JlIHRvIHRoZSByaWdodCBvZiB0aGUgaW5uZXIgdGV4dCBibG9jay4KLQogICAgIGlmIChS
ZW5kZXJCbG9jazo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIGhp
dFRlc3RBY3Rpb24pICYmCi0gICAgICAgIChyZXN1bHQuaW5uZXJOb2RlKCkgPT0gZWxlbWVudCgp
IHx8IHJlc3VsdC5pbm5lck5vZGUoKSA9PSBtX2lubmVyQmxvY2spKSB7Ci0gICAgICAgIEludFBv
aW50IGxvY2FsUG9pbnQgPSBJbnRQb2ludCh4IC0gdHggLSBtX3gsIHkgLSB0eSAtIG1feSk7Ci0g
ICAgICAgIGlmIChtX2lubmVyQmxvY2spIHsKLSAgICAgICAgICAgIGludCB0ZXh0TGVmdCA9IHR4
ICsgbV94ICsgbV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT54UG9zKCkgKyBtX2lubmVyVGV4dC0+
cmVuZGVyZXIoKS0+eFBvcygpOwotICAgICAgICAgICAgaW50IHRleHRSaWdodCA9IHRleHRMZWZ0
ICsgbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPndpZHRoKCk7Ci0gICAgICAgICAgICBpZiAobV9y
ZXN1bHRzQnV0dG9uICYmIG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSAmJiB4IDwgdGV4dExl
ZnQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG1fcmVzdWx0c0J1dHRv
bi5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQoSW50UG9pbnQo
bG9jYWxQb2ludC54KCkgLSBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+eFBvcygpIC0gbV9pbm5l
ckJsb2NrLT5yZW5kZXJlcigpLT54UG9zKCkgLSBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCkt
PnhQb3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBs
b2NhbFBvaW50LnkoKSAtIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT55UG9zKCkgLSBtX2lubmVy
QmxvY2stPnJlbmRlcmVyKCktPnlQb3MoKSAtIG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+
eVBvcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IAot
ICAgICAgICAgICAgaWYgKG1fY2FuY2VsQnV0dG9uICYmIG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJl
cigpICYmIHggPiB0ZXh0UmlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJO
b2RlKG1fY2FuY2VsQnV0dG9uLmdldCgpKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0TG9j
YWxQb2ludChJbnRQb2ludChsb2NhbFBvaW50LngoKSAtIG1faW5uZXJUZXh0LT5yZW5kZXJlcigp
LT54UG9zKCkgLSBtX2lubmVyQmxvY2stPnJlbmRlcmVyKCktPnhQb3MoKSAtIG1fY2FuY2VsQnV0
dG9uLT5yZW5kZXJlcigpLT54UG9zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbG9jYWxQb2ludC55KCkgLSBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+
eVBvcygpIC0gbV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT55UG9zKCkgLSBtX2NhbmNlbEJ1dHRv
bi0+cmVuZGVyZXIoKS0+eVBvcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEhpdCB0aGUgaW5u
ZXIgdGV4dCBibG9jay4KKyAgICAgICAgKHJlc3VsdC5pbm5lck5vZGUoKSA9PSBlbGVtZW50KCkg
fHwgKGlubmVyQmxvY2sgJiYgcmVzdWx0LmlubmVyTm9kZSgpID09IGlubmVyQmxvY2spKSkgewor
ICAgICAgICAvLyBIaXQgdGhlIGlubmVyIHRleHQgYmxvY2sKICAgICAgICAgcmVzdWx0LnNldElu
bmVyTm9kZShtX2lubmVyVGV4dC5nZXQoKSk7Ci0gICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50
KEludFBvaW50KGxvY2FsUG9pbnQueCgpIC0gbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnhQb3Mo
KSAtIChtX2lubmVyQmxvY2suZ2V0KCkgPyBtX2lubmVyQmxvY2stPnJlbmRlcmVyKCktPnhQb3Mo
KSA6IDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvaW50
LnkoKSAtIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT55UG9zKCkgLSAobV9pbm5lckJsb2NrLmdl
dCgpID8gbV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT55UG9zKCkgOiAwKSkpOwotICAgICAgICAK
KyAgICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQoSW50UG9pbnQoeCAtIHR4IC0gbV94IC0gbV9p
bm5lclRleHQtPnJlbmRlcmVyKCktPnhQb3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgeSAtIHR5IC0gbV95IC0gbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnlQb3Mo
KSkpOworCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNzE3LDc2ICs0NjQsNiBA
QCBJbnRSZWN0IFJlbmRlclRleHRDb250cm9sOjpjb250cm9sQ2xpcFJlCiAgICAgcmV0dXJuIGNs
aXBSZWN0OwogfQogCi12b2lkIFJlbmRlclRleHRDb250cm9sOjpsYXlvdXQoKQotewotICAgIGlu
dCBvbGRIZWlnaHQgPSBtX2hlaWdodDsKLSAgICBjYWxjSGVpZ2h0KCk7Ci0gICAgYm9vbCByZWxh
eW91dENoaWxkcmVuID0gb2xkSGVpZ2h0ICE9IG1faGVpZ2h0OwotCi0gICAgLy8gU2V0IHRoZSB0
ZXh0IGJsb2NrJ3MgaGVpZ2h0Ci0gICAgaW50IHRleHRCbG9ja0hlaWdodCA9IG1faGVpZ2h0IC0g
cGFkZGluZ1RvcCgpIC0gcGFkZGluZ0JvdHRvbSgpIC0gYm9yZGVyVG9wKCkgLSBib3JkZXJCb3R0
b20oKTsKLSAgICBpbnQgY3VycmVudFRleHRCbG9ja0hlaWdodCA9IG1faW5uZXJUZXh0LT5yZW5k
ZXJlcigpLT5oZWlnaHQoKTsKLSAgICBpZiAobV9tdWx0aUxpbmUgfHwgbV9pbm5lckJsb2NrIHx8
IGN1cnJlbnRUZXh0QmxvY2tIZWlnaHQgPiBtX2hlaWdodCkgewotICAgICAgICBpZiAodGV4dEJs
b2NrSGVpZ2h0ICE9IGN1cnJlbnRUZXh0QmxvY2tIZWlnaHQpCi0gICAgICAgICAgICByZWxheW91
dENoaWxkcmVuID0gdHJ1ZTsKLSAgICAgICAgbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnN0eWxl
KCktPnNldEhlaWdodChMZW5ndGgodGV4dEJsb2NrSGVpZ2h0LCBGaXhlZCkpOwotICAgIH0KLSAg
ICBpZiAobV9pbm5lckJsb2NrKSB7Ci0gICAgICAgIGlmICh0ZXh0QmxvY2tIZWlnaHQgIT0gbV9p
bm5lckJsb2NrLT5yZW5kZXJlcigpLT5oZWlnaHQoKSkKLSAgICAgICAgICAgIHJlbGF5b3V0Q2hp
bGRyZW4gPSB0cnVlOwotICAgICAgICBtX2lubmVyQmxvY2stPnJlbmRlcmVyKCktPnN0eWxlKCkt
PnNldEhlaWdodChMZW5ndGgodGV4dEJsb2NrSGVpZ2h0LCBGaXhlZCkpOwotICAgIH0KLQotICAg
IGludCBvbGRXaWR0aCA9IG1fd2lkdGg7Ci0gICAgY2FsY1dpZHRoKCk7Ci0gICAgaWYgKG9sZFdp
ZHRoICE9IG1fd2lkdGgpCi0gICAgICAgIHJlbGF5b3V0Q2hpbGRyZW4gPSB0cnVlOwotCi0gICAg
aW50IHNlYXJjaEV4dHJhc1dpZHRoID0gMDsKLSAgICBpZiAobV9yZXN1bHRzQnV0dG9uICYmIG1f
cmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSkgewotICAgICAgICBtX3Jlc3VsdHNCdXR0b24tPnJl
bmRlcmVyKCktPmNhbGNXaWR0aCgpOwotICAgICAgICBzZWFyY2hFeHRyYXNXaWR0aCArPSBtX3Jl
c3VsdHNCdXR0b24tPnJlbmRlcmVyKCktPndpZHRoKCk7Ci0gICAgfQotICAgIGlmIChtX2NhbmNl
bEJ1dHRvbiAmJiBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSkgewotICAgICAgICBtX2NhbmNl
bEJ1dHRvbi0+cmVuZGVyZXIoKS0+Y2FsY1dpZHRoKCk7Ci0gICAgICAgIHNlYXJjaEV4dHJhc1dp
ZHRoICs9IG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT53aWR0aCgpOwotICAgIH0KLQotICAg
IC8vIFNldCB0aGUgdGV4dCBibG9jaydzIHdpZHRoCi0gICAgaW50IHRleHRCbG9ja1dpZHRoID0g
bV93aWR0aCAtIHBhZGRpbmdMZWZ0KCkgLSBwYWRkaW5nUmlnaHQoKSAtIGJvcmRlckxlZnQoKSAt
IGJvcmRlclJpZ2h0KCkgLQotICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5uZXJUZXh0LT5y
ZW5kZXJlcigpLT5wYWRkaW5nTGVmdCgpIC0gbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnBhZGRp
bmdSaWdodCgpIC0gc2VhcmNoRXh0cmFzV2lkdGg7Ci0gICAgaWYgKHRleHRCbG9ja1dpZHRoICE9
IG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT53aWR0aCgpKQotICAgICAgICByZWxheW91dENoaWxk
cmVuID0gdHJ1ZTsKLSAgICBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+c2V0V2lk
dGgoTGVuZ3RoKHRleHRCbG9ja1dpZHRoLCBGaXhlZCkpOwotICAgIGlmIChtX2lubmVyQmxvY2sp
IHsKLSAgICAgICAgaW50IGlubmVyQmxvY2tXaWR0aCA9IG1fd2lkdGggLSBwYWRkaW5nTGVmdCgp
IC0gcGFkZGluZ1JpZ2h0KCkgLSBib3JkZXJMZWZ0KCkgLSBib3JkZXJSaWdodCgpOwotICAgICAg
ICBpZiAoaW5uZXJCbG9ja1dpZHRoICE9IG1faW5uZXJCbG9jay0+cmVuZGVyZXIoKS0+d2lkdGgo
KSkKLSAgICAgICAgICAgIHJlbGF5b3V0Q2hpbGRyZW4gPSB0cnVlOwotICAgICAgICBtX2lubmVy
QmxvY2stPnJlbmRlcmVyKCktPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChpbm5lckJsb2NrV2lk
dGgsIEZpeGVkKSk7Ci0gICAgfQotCi0gICAgUmVuZGVyQmxvY2s6OmxheW91dEJsb2NrKHJlbGF5
b3V0Q2hpbGRyZW4pOwotICAgIAotICAgIC8vIEZvciB0ZXh0IGZpZWxkcywgY2VudGVyIHRoZSBp
bm5lciB0ZXh0IHZlcnRpY2FsbHkKLSAgICAvLyBEb24ndCBkbyB0aGlzIGZvciBzZWFyY2ggZmll
bGRzLCBzaW5jZSB3ZSBkb24ndCBob25vciBoZWlnaHQgZm9yIHRoZW0KLSAgICBpZiAoIW1fbXVs
dGlMaW5lKSB7Ci0gICAgICAgIGN1cnJlbnRUZXh0QmxvY2tIZWlnaHQgPSBtX2lubmVyVGV4dC0+
cmVuZGVyZXIoKS0+aGVpZ2h0KCk7Ci0gICAgICAgIGlmICghbV9pbm5lckJsb2NrICYmIGN1cnJl
bnRUZXh0QmxvY2tIZWlnaHQgPCBtX2hlaWdodCkKLSAgICAgICAgICAgIG1faW5uZXJUZXh0LT5y
ZW5kZXJlcigpLT5zZXRQb3MobV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnhQb3MoKSwgKG1faGVp
Z2h0IC0gY3VycmVudFRleHRCbG9ja0hlaWdodCkgLyAyKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVu
ZGVyVGV4dENvbnRyb2w6OnBhaW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0
eSkKLXsKLSAgICBSZW5kZXJCbG9jazo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOwotICAgIGlm
IChwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUJsb2NrQmFja2dyb3VuZCAmJiBtX3Nob3Vs
ZERyYXdDYXBzTG9ja0luZGljYXRvcikgewotICAgICAgICBJbnRSZWN0IGNvbnRlbnRzUmVjdCA9
IGNvbnRlbnRCb3goKTsKLSAgICAgICAgLy8gQ29udmVydCB0aGUgcmVjdCBpbnRvIHRoZSBjb29y
ZHMgdXNlZCBmb3IgcGFpbnRpbmcgdGhlIGNvbnRlbnQKLSAgICAgICAgY29udGVudHNSZWN0Lm1v
dmUodHggKyB4UG9zKCksIHR5ICsgeVBvcygpKTsKLSAgICAgICAgdGhlbWUoKS0+cGFpbnRDYXBz
TG9ja0luZGljYXRvcih0aGlzLCBwYWludEluZm8sIGNvbnRlbnRzUmVjdCk7Ci0gICAgfQotfSAK
LQogdm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6Y2FsY1ByZWZXaWR0aHMoKQogewogICAgIEFTU0VS
VChwcmVmV2lkdGhzRGlydHkoKSk7CkBAIC04MDEsMjcgKzQ3OCw3IEBAIHZvaWQgUmVuZGVyVGV4
dENvbnRyb2w6OmNhbGNQcmVmV2lkdGhzKCkKICAgICAgICAgLy8gKHVzaW5nICIwIiBhcyB0aGUg
bm9taW5hbCBjaGFyYWN0ZXIpLgogICAgICAgICBjb25zdCBVQ2hhciBjaCA9ICcwJzsKICAgICAg
ICAgZmxvYXQgY2hhcldpZHRoID0gc3R5bGUoKS0+Zm9udCgpLmZsb2F0V2lkdGgoVGV4dFJ1bigm
Y2gsIDEsIGZhbHNlLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7Ci0gICAgICAgIGludCBm
YWN0b3I7Ci0gICAgICAgIGludCBzY3JvbGxiYXJTaXplID0gMDsKLSAgICAgICAgaWYgKG1fbXVs
dGlMaW5lKSB7Ci0gICAgICAgICAgICBmYWN0b3IgPSBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFF
bGVtZW50Kj4obm9kZSgpKS0+Y29scygpOwotICAgICAgICAgICAgLy8gRklYTUU6IFdlIHNob3Vs
ZCBnZXQgdGhlIHNpemUgb2YgdGhlIHNjcm9sbGJhciBmcm9tIHRoZSBSZW5kZXJUaGVtZSBpbnN0
ZWFkLgotICAgICAgICAgICAgaWYgKG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5zdHlsZSgpLT5v
dmVyZmxvd1koKSAhPSBPSElEREVOKQotICAgICAgICAgICAgICAgIHNjcm9sbGJhclNpemUgPSBT
Y3JvbGxiYXJUaGVtZTo6bmF0aXZlVGhlbWUoKS0+c2Nyb2xsYmFyVGhpY2tuZXNzKCk7Ci0gICAg
ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWN0b3IgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50Kj4obm9kZSgpKS0+c2l6ZSgpOwotICAgICAgICAgICAgaWYgKGZhY3RvciA8PSAwKQot
ICAgICAgICAgICAgICAgIGZhY3RvciA9IDIwOwotICAgICAgICB9Ci0gICAgICAgIG1fbWF4UHJl
ZldpZHRoID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsZihjaGFyV2lkdGggKiBmYWN0b3IpKSArIHNj
cm9sbGJhclNpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5uZXJUZXh0LT5yZW5k
ZXJlcigpLT5wYWRkaW5nTGVmdCgpICsgbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnBhZGRpbmdS
aWdodCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAobV9yZXN1bHRzQnV0dG9uICYm
IG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSkKLSAgICAgICAgICAgIG1fbWF4UHJlZldpZHRo
ICs9IG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+Ym9yZGVyTGVmdCgpICsgbV9yZXN1bHRz
QnV0dG9uLT5yZW5kZXJlcigpLT5ib3JkZXJSaWdodCgpICsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+cGFkZGluZ0xlZnQoKSArIG1f
cmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+cGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgIGlmICht
X2NhbmNlbEJ1dHRvbiAmJiBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSkKLSAgICAgICAgICAg
IG1fbWF4UHJlZldpZHRoICs9IG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5ib3JkZXJMZWZ0
KCkgKyBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKS0+Ym9yZGVyUmlnaHQoKSArCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKS0+cGFkZGlu
Z0xlZnQoKSArIG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5wYWRkaW5nUmlnaHQoKTsKKyAg
ICAgICAgbV9tYXhQcmVmV2lkdGggPSBwcmVmZXJyZWRXaWR0aChjaGFyV2lkdGgpICsgbV9pbm5l
clRleHQtPnJlbmRlcmVyKCktPnBhZGRpbmdMZWZ0KCkgKyBtX2lubmVyVGV4dC0+cmVuZGVyZXIo
KS0+cGFkZGluZ1JpZ2h0KCk7CiAgICAgfQogCiAgICAgaWYgKHN0eWxlKCktPm1pbldpZHRoKCku
aXNGaXhlZCgpICYmIHN0eWxlKCktPm1pbldpZHRoKCkudmFsdWUoKSA+IDApIHsKQEAgLTg0Nywz
NyArNTA0LDIwIEBAIHZvaWQgUmVuZGVyVGV4dENvbnRyb2w6OmNhbGNQcmVmV2lkdGhzKCkKIAog
dm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6Zm9yd2FyZEV2ZW50KEV2ZW50KiBldnQpCiB7Ci0gICAg
aWYgKGV2dC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5ibHVyRXZlbnQpIHsKLSAgICAgICAgUmVu
ZGVyT2JqZWN0KiBpbm5lclJlbmRlcmVyID0gbV9pbm5lclRleHQtPnJlbmRlcmVyKCk7Ci0gICAg
ICAgIGlmIChpbm5lclJlbmRlcmVyKSB7Ci0gICAgICAgICAgICBSZW5kZXJMYXllciogaW5uZXJM
YXllciA9IGlubmVyUmVuZGVyZXItPmxheWVyKCk7Ci0gICAgICAgICAgICBpZiAoaW5uZXJMYXll
ciAmJiAhbV9tdWx0aUxpbmUpCi0gICAgICAgICAgICAgICAgaW5uZXJMYXllci0+c2Nyb2xsVG9P
ZmZzZXQoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gaW5uZXJMYXllci0+c2Nyb2xsV2lk
dGgoKSA6IDAsIDApOwotICAgICAgICB9Ci0gICAgICAgIGNhcHNMb2NrU3RhdGVNYXlIYXZlQ2hh
bmdlZCgpOwotICAgIH0gZWxzZSBpZiAoZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmZvY3Vz
RXZlbnQpCi0gICAgICAgIGNhcHNMb2NrU3RhdGVNYXlIYXZlQ2hhbmdlZCgpOwotICAgIGVsc2Ug
ewotICAgICAgICBGbG9hdFBvaW50IGxvY2FsUG9pbnQgPSBtX2lubmVyVGV4dC0+cmVuZGVyZXIo
KS0+YWJzb2x1dGVUb0xvY2FsKEZsb2F0UG9pbnQoc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2
dCktPnBhZ2VYKCksIHN0YXRpY19jYXN0PE1vdXNlRXZlbnQqPihldnQpLT5wYWdlWSgpKSwgZmFs
c2UsIHRydWUpOwotICAgICAgICBpZiAoZXZ0LT5pc01vdXNlRXZlbnQoKSAmJiBtX3Jlc3VsdHNC
dXR0b24gJiYgbG9jYWxQb2ludC54KCkgPCBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+Ym9yZGVy
Qm94KCkueCgpKQotICAgICAgICAgICAgbV9yZXN1bHRzQnV0dG9uLT5kZWZhdWx0RXZlbnRIYW5k
bGVyKGV2dCk7Ci0gICAgICAgIGVsc2UgaWYgKGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYgbV9jYW5j
ZWxCdXR0b24gJiYgbG9jYWxQb2ludC54KCkgPiBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+Ym9y
ZGVyQm94KCkucmlnaHQoKSkKLSAgICAgICAgICAgIG1fY2FuY2VsQnV0dG9uLT5kZWZhdWx0RXZl
bnRIYW5kbGVyKGV2dCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1faW5uZXJUZXh0LT5k
ZWZhdWx0RXZlbnRIYW5kbGVyKGV2dCk7Ci0gICAgfQorICAgIEFTU0VSVChtX2lubmVyVGV4dCk7
CisgICAgbV9pbm5lclRleHQtPmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0KTsKIH0KIAogdm9pZCBS
ZW5kZXJUZXh0Q29udHJvbDo6c2VsZWN0aW9uQ2hhbmdlZChib29sIHVzZXJUcmlnZ2VyZWQpCiB7
Ci0gICAgSFRNTEZvcm1Db250cm9sRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxG
b3JtQ29udHJvbEVsZW1lbnQqPihub2RlKCkpOwotICAgIGlmIChtX211bHRpTGluZSkKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KGVsZW1lbnQpLT5jYWNoZVNlbGVj
dGlvbihzZWxlY3Rpb25TdGFydCgpLCBzZWxlY3Rpb25FbmQoKSk7Ci0gICAgZWxzZQotICAgICAg
ICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZWxlbWVudCktPmNhY2hlU2VsZWN0aW9u
KHNlbGVjdGlvblN0YXJ0KCksIHNlbGVjdGlvbkVuZCgpKTsKLSAgICBpZiAoRnJhbWUqIGZyYW1l
ID0gZG9jdW1lbnQoKS0+ZnJhbWUoKSkKLSAgICAgICAgaWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+
aXNSYW5nZSgpICYmIHVzZXJUcmlnZ2VyZWQpCisgICAgY2FjaGVTZWxlY3Rpb24oc2VsZWN0aW9u
U3RhcnQoKSwgc2VsZWN0aW9uRW5kKCkpOworCisgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3Vt
ZW50KCktPmZyYW1lKCkpIHsKKyAgICAgICAgaWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+aXNSYW5n
ZSgpICYmIHVzZXJUcmlnZ2VyZWQpIHsKKyAgICAgICAgICAgIEhUTUxGb3JtQ29udHJvbEVsZW1l
bnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRm9ybUNvbnRyb2xFbGVtZW50Kj4obm9kZSgp
KTsKICAgICAgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoRXZlbnRGb3JUeXBlKGV2ZW50TmFtZXMo
KS5zZWxlY3RFdmVudCwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lk
IFJlbmRlclRleHRDb250cm9sOjphZGRGb2N1c1JpbmdSZWN0cyhHcmFwaGljc0NvbnRleHQqIGdy
YXBoaWNzQ29udGV4dCwgaW50IHR4LCBpbnQgdHkpCkBAIC05MzIsMjE0ICs1NzIsNiBAQCB2b2lk
IFJlbmRlclRleHRDb250cm9sOjpzZXRTY3JvbGxUb3AoaW50CiAgICAgICAgIG1faW5uZXJUZXh0
LT5zZXRTY3JvbGxUb3AobmV3VG9wKTsKIH0KIAotY29uc3QgQXRvbWljU3RyaW5nJiBSZW5kZXJU
ZXh0Q29udHJvbDo6YXV0b3NhdmVOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8RWxlbWVudCo+KG5vZGUoKSktPmdldEF0dHJpYnV0ZShhdXRvc2F2ZUF0dHIpOwotfQotCi12
b2lkIFJlbmRlclRleHRDb250cm9sOjphZGRTZWFyY2hSZXN1bHQoKQotewotICAgIEFTU0VSVCgh
bV9tdWx0aUxpbmUpOwotCi0gICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2Fz
dDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKLSAgICBpZiAoaW5wdXQtPm1heFJlc3VsdHMo
KSA8PSAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcgdmFsdWUgPSBpbnB1dC0+dmFs
dWUoKTsKLSAgICBpZiAodmFsdWUuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBT
ZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudCgpLT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0
dGluZ3MgfHwgc2V0dGluZ3MtPnByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KG1fcmVjZW50U2VhcmNoZXMu
c2l6ZSgpKTsKLSAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKQotICAgICAg
ICBpZiAobV9yZWNlbnRTZWFyY2hlc1tpXSA9PSB2YWx1ZSkKLSAgICAgICAgICAgIG1fcmVjZW50
U2VhcmNoZXMucmVtb3ZlKGkpOwotCi0gICAgbV9yZWNlbnRTZWFyY2hlcy5pbnNlcnQoMCwgdmFs
dWUpOwotICAgIHdoaWxlIChzdGF0aWNfY2FzdDxpbnQ+KG1fcmVjZW50U2VhcmNoZXMuc2l6ZSgp
KSA+IGlucHV0LT5tYXhSZXN1bHRzKCkpCi0gICAgICAgIG1fcmVjZW50U2VhcmNoZXMucmVtb3Zl
TGFzdCgpOwotCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lID0gYXV0b3NhdmVOYW1lKCk7
Ci0gICAgaWYgKCFtX3NlYXJjaFBvcHVwKQotICAgICAgICBtX3NlYXJjaFBvcHVwID0gU2VhcmNo
UG9wdXBNZW51OjpjcmVhdGUodGhpcyk7Ci0gICAgbV9zZWFyY2hQb3B1cC0+c2F2ZVJlY2VudFNl
YXJjaGVzKG5hbWUsIG1fcmVjZW50U2VhcmNoZXMpOwotfQotCi12b2lkIFJlbmRlclRleHRDb250
cm9sOjpzaG93UG9wdXAoKQotewotICAgIGlmIChtX3NlYXJjaFBvcHVwSXNWaXNpYmxlKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBpZiAoIW1fc2VhcmNoUG9wdXApCi0gICAgICAgIG1fc2VhcmNo
UG9wdXAgPSBTZWFyY2hQb3B1cE1lbnU6OmNyZWF0ZSh0aGlzKTsKLQotICAgIGlmICghbV9zZWFy
Y2hQb3B1cC0+ZW5hYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgbV9zZWFyY2hQ
b3B1cElzVmlzaWJsZSA9IHRydWU7Ci0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUgPSBh
dXRvc2F2ZU5hbWUoKTsKLSAgICBtX3NlYXJjaFBvcHVwLT5sb2FkUmVjZW50U2VhcmNoZXMobmFt
ZSwgbV9yZWNlbnRTZWFyY2hlcyk7Ci0KLSAgICAvLyBUcmltIHRoZSByZWNlbnQgc2VhcmNoZXMg
bGlzdCBpZiB0aGUgbWF4aW11bSBzaXplIGhhcyBjaGFuZ2VkIHNpbmNlIHdlIGxhc3Qgc2F2ZWQu
Ci0gICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVt
ZW50Kj4obm9kZSgpKTsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihtX3JlY2VudFNlYXJjaGVz
LnNpemUoKSkgPiBpbnB1dC0+bWF4UmVzdWx0cygpKSB7Ci0gICAgICAgIGRvCi0gICAgICAgICAg
ICBtX3JlY2VudFNlYXJjaGVzLnJlbW92ZUxhc3QoKTsKLSAgICAgICAgd2hpbGUgKHN0YXRpY19j
YXN0PGludD4obV9yZWNlbnRTZWFyY2hlcy5zaXplKCkpID4gaW5wdXQtPm1heFJlc3VsdHMoKSk7
Ci0gICAgICAgIG1fc2VhcmNoUG9wdXAtPnNhdmVSZWNlbnRTZWFyY2hlcyhuYW1lLCBtX3JlY2Vu
dFNlYXJjaGVzKTsKLSAgICB9Ci0KLSAgICBtX3NlYXJjaFBvcHVwLT5zaG93KGFic29sdXRlQm91
bmRpbmdCb3hSZWN0KHRydWUpLCBkb2N1bWVudCgpLT52aWV3KCksIC0xKTsKLX0KLQotdm9pZCBS
ZW5kZXJUZXh0Q29udHJvbDo6aGlkZVBvcHVwKCkKLXsKLSAgICBpZiAobV9zZWFyY2hQb3B1cCkK
LSAgICAgICAgbV9zZWFyY2hQb3B1cC0+aGlkZSgpOwotICAgIG1fc2VhcmNoUG9wdXBJc1Zpc2li
bGUgPSBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6dmFsdWVDaGFuZ2VkKHVu
c2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzKQotewotICAgIEFTU0VSVChzdGF0aWNf
Y2FzdDxpbnQ+KGxpc3RJbmRleCkgPCBsaXN0U2l6ZSgpKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50
KiBpbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpOwotICAgIGlm
IChzdGF0aWNfY2FzdDxpbnQ+KGxpc3RJbmRleCkgPT0gKGxpc3RTaXplKCkgLSAxKSkgewotICAg
ICAgICBpZiAoZmlyZUV2ZW50cykgewotICAgICAgICAgICAgbV9yZWNlbnRTZWFyY2hlcy5jbGVh
cigpOwotICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lID0gYXV0b3NhdmVOYW1l
KCk7Ci0gICAgICAgICAgICBpZiAoIW5hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKCFtX3NlYXJjaFBvcHVwKQotICAgICAgICAgICAgICAgICAgICBtX3NlYXJjaFBvcHVwID0g
U2VhcmNoUG9wdXBNZW51OjpjcmVhdGUodGhpcyk7Ci0gICAgICAgICAgICAgICAgbV9zZWFyY2hQ
b3B1cC0+c2F2ZVJlY2VudFNlYXJjaGVzKG5hbWUsIG1fcmVjZW50U2VhcmNoZXMpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5wdXQtPnNldFZhbHVl
KGl0ZW1UZXh0KGxpc3RJbmRleCkpOwotICAgICAgICBpZiAoZmlyZUV2ZW50cykKLSAgICAgICAg
ICAgIGlucHV0LT5vblNlYXJjaCgpOwotICAgICAgICBpbnB1dC0+c2VsZWN0KCk7Ci0gICAgfQot
fQotCi1TdHJpbmcgUmVuZGVyVGV4dENvbnRyb2w6Oml0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRl
eCkgY29uc3QKLXsKLSAgICBpbnQgc2l6ZSA9IGxpc3RTaXplKCk7Ci0gICAgaWYgKHNpemUgPT0g
MSkgewotICAgICAgICBBU1NFUlQoIWxpc3RJbmRleCk7Ci0gICAgICAgIHJldHVybiBzZWFyY2hN
ZW51Tm9SZWNlbnRTZWFyY2hlc1RleHQoKTsKLSAgICB9Ci0gICAgaWYgKCFsaXN0SW5kZXgpCi0g
ICAgICAgIHJldHVybiBzZWFyY2hNZW51UmVjZW50U2VhcmNoZXNUZXh0KCk7Ci0gICAgaWYgKGl0
ZW1Jc1NlcGFyYXRvcihsaXN0SW5kZXgpKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0gICAg
aWYgKHN0YXRpY19jYXN0PGludD4obGlzdEluZGV4KSA9PSAoc2l6ZSAtIDEpKQotICAgICAgICBy
ZXR1cm4gc2VhcmNoTWVudUNsZWFyUmVjZW50U2VhcmNoZXNUZXh0KCk7Ci0gICAgcmV0dXJuIG1f
cmVjZW50U2VhcmNoZXNbbGlzdEluZGV4IC0gMV07Ci19Ci0KLWJvb2wgUmVuZGVyVGV4dENvbnRy
b2w6Oml0ZW1Jc0VuYWJsZWQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAotewotICAgICBpZiAo
IWxpc3RJbmRleCB8fCBpdGVtSXNTZXBhcmF0b3IobGlzdEluZGV4KSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1Qb3B1cE1lbnVTdHlsZSBSZW5kZXJUZXh0
Q29udHJvbDo6aXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbWVudVN0eWxlKCk7Ci19Ci0KLVBvcHVwTWVudVN0eWxlIFJlbmRlclRleHRDb250cm9sOjpt
ZW51U3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiBQb3B1cE1lbnVTdHlsZShzdHlsZSgpLT5j
b2xvcigpLCBzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+Zm9udCgpLCBzdHls
ZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSk7Ci19Ci0KLUhvc3RXaW5kb3cqIFJlbmRlclRl
eHRDb250cm9sOjpob3N0V2luZG93KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZG9jdW1lbnQoKS0+
dmlldygpLT5ob3N0V2luZG93KCk7Ci19Ci0KLVBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBSZW5kZXJU
ZXh0Q29udHJvbDo6Y3JlYXRlU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCogY2xpZW50LCBTY3Jv
bGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJv
bFNpemUpCi17Ci0gICAgUmVmUHRyPFNjcm9sbGJhcj4gd2lkZ2V0OwotICAgIGJvb2wgaGFzQ3Vz
dG9tU2Nyb2xsYmFyU3R5bGUgPSBzdHlsZSgpLT5oYXNQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6
U0NST0xMQkFSKTsKLSAgICBpZiAoaGFzQ3VzdG9tU2Nyb2xsYmFyU3R5bGUpCi0gICAgICAgIHdp
ZGdldCA9IFJlbmRlclNjcm9sbGJhcjo6Y3JlYXRlQ3VzdG9tU2Nyb2xsYmFyKGNsaWVudCwgb3Jp
ZW50YXRpb24sIHRoaXMpOwotICAgIGVsc2UKLSAgICAgICAgd2lkZ2V0ID0gU2Nyb2xsYmFyOjpj
cmVhdGVOYXRpdmVTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgY29udHJvbFNpemUpOwot
ICAgIHJldHVybiB3aWRnZXQucmVsZWFzZSgpOwotfQotCi1pbnQgUmVuZGVyVGV4dENvbnRyb2w6
OmNsaWVudEluc2V0TGVmdCgpIGNvbnN0Ci17Ci0gICAgLy8gSW5zZXQgdGhlIG1lbnUgYnkgdGhl
IHJhZGl1cyBvZiB0aGUgY2FwIG9uIHRoZSBsZWZ0IHNvIHRoYXQKLSAgICAvLyBpdCBvbmx5IHJ1
bnMgYWxvbmcgdGhlIHN0cmFpZ2h0IHBhcnQgb2YgdGhlIGJlemVsLgotICAgIHJldHVybiBoZWln
aHQoKSAvIDI7Ci19Ci0KLWludCBSZW5kZXJUZXh0Q29udHJvbDo6Y2xpZW50SW5zZXRSaWdodCgp
IGNvbnN0Ci17Ci0gICAgLy8gSW5zZXQgdGhlIG1lbnUgYnkgdGhlIHJhZGl1cyBvZiB0aGUgY2Fw
IG9uIHRoZSByaWdodCBzbyB0aGF0Ci0gICAgLy8gaXQgb25seSBydW5zIGFsb25nIHRoZSBzdHJh
aWdodCBwYXJ0IG9mIHRoZSBiZXplbCAodW5sZXNzIGl0IG5lZWRzCi0gICAgLy8gdG8gYmUgd2lk
ZXIpLgotICAgIHJldHVybiBoZWlnaHQoKSAvIDI7Ci19Ci0KLWludCBSZW5kZXJUZXh0Q29udHJv
bDo6Y2xpZW50UGFkZGluZ0xlZnQoKSBjb25zdAotewotICAgIGludCBwYWRkaW5nID0gcGFkZGlu
Z0xlZnQoKTsKLSAgICBpZiAobV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpKQotICAgICAgICBw
YWRkaW5nICs9IG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+d2lkdGgoKTsgCi0gICAgcmV0
dXJuIHBhZGRpbmc7Ci19Ci0KLWludCBSZW5kZXJUZXh0Q29udHJvbDo6Y2xpZW50UGFkZGluZ1Jp
Z2h0KCkgY29uc3QKLXsKLSAgICBpbnQgcGFkZGluZyA9IHBhZGRpbmdSaWdodCgpOwotICAgIGlm
IChtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSkKLSAgICAgICAgcGFkZGluZyArPSBtX2NhbmNl
bEJ1dHRvbi0+cmVuZGVyZXIoKS0+d2lkdGgoKTsgCi0gICAgcmV0dXJuIHBhZGRpbmc7Ci19Ci0K
LWludCBSZW5kZXJUZXh0Q29udHJvbDo6bGlzdFNpemUoKSBjb25zdAotewotICAgIC8vIElmIHRo
ZXJlIGFyZSBubyByZWNlbnQgc2VhcmNoZXMsIHRoZW4gb3VyIG1lbnUgd2lsbCBoYXZlIDEgIk5v
IHJlY2VudCBzZWFyY2hlcyIgaXRlbS4KLSAgICBpZiAoIW1fcmVjZW50U2VhcmNoZXMuc2l6ZSgp
KQotICAgICAgICByZXR1cm4gMTsKLSAgICAvLyBPdGhlcndpc2UsIGxlYXZlIHJvb20gaW4gdGhl
IG1lbnUgZm9yIGEgaGVhZGVyLCBhIHNlcGFyYXRvciwgYW5kIHRoZSAiQ2xlYXIgcmVjZW50IHNl
YXJjaGVzIiBpdGVtLgotICAgIHJldHVybiBtX3JlY2VudFNlYXJjaGVzLnNpemUoKSArIDM7Ci19
Ci0KLWludCBSZW5kZXJUZXh0Q29udHJvbDo6c2VsZWN0ZWRJbmRleCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIC0xOwotfQotCi1ib29sIFJlbmRlclRleHRDb250cm9sOjppdGVtSXNTZXBhcmF0b3Io
dW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAotewotICAgLy8gVGhlIHNlcGFyYXRvciB3aWxsIGJl
IHRoZSBzZWNvbmQgdG8gbGFzdCBpdGVtIGluIG91ciBsaXN0LgotICAgcmV0dXJuIHN0YXRpY19j
YXN0PGludD4obGlzdEluZGV4KSA9PSAobGlzdFNpemUoKSAtIDIpOwotfQotCi1ib29sIFJlbmRl
clRleHRDb250cm9sOjppdGVtSXNMYWJlbCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGxpc3RJbmRleCA9PSAwOwotfQotCi1ib29sIFJlbmRlclRleHRDb250cm9sOjpp
dGVtSXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi12b2lkIFJlbmRlclRleHRDb250cm9sOjpzZXRUZXh0RnJvbUl0ZW0odW5zaWdu
ZWQgbGlzdEluZGV4KQotewotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2Rl
KCkpLT5zZXRWYWx1ZShpdGVtVGV4dChsaXN0SW5kZXgpKTsKLX0KLQogYm9vbCBSZW5kZXJUZXh0
Q29udHJvbDo6c2Nyb2xsKFNjcm9sbERpcmVjdGlvbiBkaXJlY3Rpb24sIFNjcm9sbEdyYW51bGFy
aXR5IGdyYW51bGFyaXR5LCBmbG9hdCBtdWx0aXBsaWVyKQogewogICAgIFJlbmRlckxheWVyKiBs
YXllciA9IG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5sYXllcigpOwpAQCAtMTE0OCwzMiArNTgw
LDYgQEAgYm9vbCBSZW5kZXJUZXh0Q29udHJvbDo6c2Nyb2xsKFNjcm9sbERpcgogICAgIHJldHVy
biBSZW5kZXJPYmplY3Q6OnNjcm9sbChkaXJlY3Rpb24sIGdyYW51bGFyaXR5LCBtdWx0aXBsaWVy
KTsKIH0KIAotdm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6c2VhcmNoRXZlbnRUaW1lckZpcmVkKFRp
bWVyPFJlbmRlclRleHRDb250cm9sPiopCi17Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudCo+KG5vZGUoKSktPm9uU2VhcmNoKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dENvbnRyb2w6
OnN0b3BTZWFyY2hFdmVudFRpbWVyKCkKLXsKLSAgICBtX3NlYXJjaEV2ZW50VGltZXIuc3RvcCgp
OwotfQotCi12b2lkIFJlbmRlclRleHRDb250cm9sOjpzdGFydFNlYXJjaEV2ZW50VGltZXIoKQot
ewotICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRleHQoKS5sZW5ndGgoKTsKLQotICAgIC8vIElmIHRo
ZXJlJ3Mgbm8gdGV4dCwgZmlyZSB0aGUgZXZlbnQgcmlnaHQgYXdheS4KLSAgICBpZiAoIWxlbmd0
aCkgewotICAgICAgICBtX3NlYXJjaEV2ZW50VGltZXIuc3RvcCgpOwotICAgICAgICBzdGF0aWNf
Y2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+b25TZWFyY2goKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIC8vIEFmdGVyIHR5cGluZyB0aGUgZmlyc3Qga2V5LCB3ZSB3YWl0
IDAuNSBzZWNvbmRzLgotICAgIC8vIEFmdGVyIHRoZSBzZWNvbmQga2V5LCAwLjQgc2Vjb25kcywg
dGhlbiAwLjMsIHRoZW4gMC4yIGZyb20gdGhlbiBvbi4KLSAgICBtX3NlYXJjaEV2ZW50VGltZXIu
c3RhcnRPbmVTaG90KG1heCgwLjIsIDAuNiAtIDAuMSAqIGxlbmd0aCkpOwotfQotCiBib29sIFJl
bmRlclRleHRDb250cm9sOjppc1Njcm9sbGFibGUoKSBjb25zdAogewogICAgIGlmIChtX2lubmVy
VGV4dCAmJiBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+aXNTY3JvbGxhYmxlKCkpCkBAIC0xMTgx
LDQyICs1ODcsOSBAQCBib29sIFJlbmRlclRleHRDb250cm9sOjppc1Njcm9sbGFibGUoKSBjCiAg
ICAgcmV0dXJuIFJlbmRlck9iamVjdDo6aXNTY3JvbGxhYmxlKCk7CiB9CiAKLUZvbnRTZWxlY3Rv
ciogUmVuZGVyVGV4dENvbnRyb2w6OmZvbnRTZWxlY3RvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IGRvY3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19Ci0KLXZvaWQg
UmVuZGVyVGV4dENvbnRyb2w6OnVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eSgpCi17Ci0gICAg
UmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gbV9pbm5lckJsb2NrID8gbV9pbm5lckJsb2NrLT5y
ZW5kZXJlcigpLT5zdHlsZSgpIDogc3R5bGUoKTsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHRl
eHRCbG9ja1N0eWxlID0gY3JlYXRlSW5uZXJUZXh0U3R5bGUocGFyZW50U3R5bGUpOwotICAgIG1f
aW5uZXJUZXh0LT5yZW5kZXJlcigpLT5zZXRTdHlsZSh0ZXh0QmxvY2tTdHlsZSk7Ci0gICAgZm9y
IChOb2RlKiBuID0gbV9pbm5lclRleHQtPmZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPnRyYXZlcnNl
TmV4dE5vZGUobV9pbm5lclRleHQuZ2V0KCkpKSB7Ci0gICAgICAgIGlmIChuLT5yZW5kZXJlcigp
KQotICAgICAgICAgICAgbi0+cmVuZGVyZXIoKS0+c2V0U3R5bGUodGV4dEJsb2NrU3R5bGUpOwot
ICAgIH0KLSAgICB1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlclRleHRDb250
cm9sOjpjYXBzTG9ja1N0YXRlTWF5SGF2ZUNoYW5nZWQoKQorSFRNTEVsZW1lbnQqIFJlbmRlclRl
eHRDb250cm9sOjppbm5lclRleHRFbGVtZW50KCkgY29uc3QKIHsKLSAgICAvLyBPbmx5IGRyYXcg
dGhlIGNhcHMgbG9jayBpbmRpY2F0b3IgaWYgdGhlc2UgdGhpbmdzIGFyZSB0cnVlOgotICAgIC8v
IDEpIFRoZSBmaWVsZCBpcyBhIHBhc3N3b3JkIGZpZWxkCi0gICAgLy8gMikgVGhlIGZyYW1lIGlz
IGFjdGl2ZQotICAgIC8vIDMpIFRoZSBlbGVtZW50IGlzIGZvY3VzZWQKLSAgICAvLyA0KSBUaGUg
Y2FwcyBsb2NrIGlzIG9uCi0KLSAgICBib29sIHNob3VsZERyYXdDYXBzTG9ja0luZGljYXRvciA9
IGZhbHNlOwotICAgIGlmIChOb2RlKiBuID0gbm9kZSgpKQotICAgICAgICBpZiAoRG9jdW1lbnQq
IGQgPSBkb2N1bWVudCgpKQotICAgICAgICAgICAgaWYgKEZyYW1lKiBmID0gZC0+ZnJhbWUoKSkK
LSAgICAgICAgICAgICAgICBzaG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0b3IgPSAhbV9tdWx0aUxp
bmUgJiYgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG4pLT5pbnB1dFR5cGUoKSA9PSBI
VE1MSW5wdXRFbGVtZW50OjpQQVNTV09SRCAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZi0+c2VsZWN0aW9uKCktPmlzRm9jdXNlZEFuZEFjdGl2ZSgp
ICYmIGQtPmZvY3VzZWROb2RlKCkgPT0gbiAmJiBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OmN1cnJl
bnRDYXBzTG9ja1N0YXRlKCk7Ci0KLSAgICBpZiAoc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9y
ICE9IG1fc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yKSB7Ci0gICAgICAgIG1fc2hvdWxkRHJh
d0NhcHNMb2NrSW5kaWNhdG9yID0gc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yOwotICAgICAg
ICByZXBhaW50KCk7Ci0gICAgfQorICAgIHJldHVybiBtX2lubmVyVGV4dC5nZXQoKTsKIH0KIAog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9s
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sLmgJKHJldmlzaW9u
IDM5NDc0KQorKysgcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sLmgJKHdvcmtpbmcgY29weSkK
QEAgLTEsNSArMSw2IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5zCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICAgICAgICAgIChDKSAyMDA4IFRvcmNo
IE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxl
LmNvbS8pIAogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yMSw0NSArMjIsMzEgQEAKICNpZm5kZWYg
UmVuZGVyVGV4dENvbnRyb2xfaAogI2RlZmluZSBSZW5kZXJUZXh0Q29udHJvbF9oCiAKLSNpbmNs
dWRlICJQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgotI2luY2x1
ZGUgIlRpbWVyLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgRm9udFNlbGVjdG9y
OwotY2xhc3MgU2VhcmNoRmllbGRDYW5jZWxCdXR0b25FbGVtZW50OwotY2xhc3MgU2VhcmNoRmll
bGRSZXN1bHRzQnV0dG9uRWxlbWVudDsKLWNsYXNzIFNlYXJjaFBvcHVwTWVudTsKIGNsYXNzIFNl
bGVjdGlvbjsKLWNsYXNzIFRleHRDb250cm9sSW5uZXJFbGVtZW50OwogY2xhc3MgVGV4dENvbnRy
b2xJbm5lclRleHRFbGVtZW50OwogCi1jbGFzcyBSZW5kZXJUZXh0Q29udHJvbCA6IHB1YmxpYyBS
ZW5kZXJCbG9jaywgcHJpdmF0ZSBQb3B1cE1lbnVDbGllbnQgeworY2xhc3MgUmVuZGVyVGV4dENv
bnRyb2wgOiBwdWJsaWMgUmVuZGVyQmxvY2sgewogcHVibGljOgotICAgIFJlbmRlclRleHRDb250
cm9sKE5vZGUqLCBib29sIG11bHRpTGluZSk7CisgICAgUmVuZGVyVGV4dENvbnRyb2woTm9kZSop
OwogICAgIHZpcnR1YWwgflJlbmRlclRleHRDb250cm9sKCk7CiAKICAgICB2aXJ0dWFsIGNvbnN0
IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyVGV4dENvbnRyb2wiOyB9
Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzQ29udHJvbENsaXAoKSBjb25zdCB7IHJldHVybiBtX2Nh
bmNlbEJ1dHRvbjsgfQorICAgIHZpcnR1YWwgYm9vbCBoYXNDb250cm9sQ2xpcCgpIGNvbnN0IHsg
cmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBJbnRSZWN0IGNvbnRyb2xDbGlwUmVjdChpbnQg
dHgsIGludCB0eSkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIGNhbGNIZWlnaHQoKTsKICAgICB2
aXJ0dWFsIHZvaWQgY2FsY1ByZWZXaWR0aHMoKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlTGVm
dG92ZXJBbm9ueW1vdXNCbG9jayhSZW5kZXJCbG9jayopIHsgfQogICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVGcm9tRWxlbWVudCgpOwogICAgIHZpcnR1YWwgYm9vbCBjYW5IYXZlQ2hpbGRyZW4oKSBj
b25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgaW50IGJhc2VsaW5lUG9zaXRpb24o
Ym9vbCBmaXJzdExpbmUsIGJvb2wgaXNSb290TGluZUJveCkgY29uc3Q7Ci0gICAgdmlydHVhbCBi
b29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGlu
dCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24pOwotICAgIHZpcnR1YWwg
dm9pZCBsYXlvdXQoKTsKICAgICB2aXJ0dWFsIGJvb2wgYXZvaWRzRmxvYXRzKCkgY29uc3QgeyBy
ZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mLCBpbnQgdHgs
IGludCB0eSk7Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGlzRWRpdGVkKCkgY29uc3QgeyByZXR1
cm4gbV9kaXJ0eTsgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRFZGl0ZWQoYm9vbCBpc0VkaXRlZCkg
eyBtX2RpcnR5ID0gaXNFZGl0ZWQ7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNUZXh0RmllbGQoKSBj
b25zdCB7IHJldHVybiAhbV9tdWx0aUxpbmU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNUZXh0QXJl
YSgpIGNvbnN0IHsgcmV0dXJuIG1fbXVsdGlMaW5lOyB9CiAgICAgCisgICAgdmlydHVhbCBib29s
IGlzRWRpdGVkKCkgY29uc3QgeyByZXR1cm4gbV9lZGl0ZWQ7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
c2V0RWRpdGVkKGJvb2wgaXNFZGl0ZWQpIHsgbV9lZGl0ZWQgPSBpc0VkaXRlZDsgfQorCiAgICAg
Ym9vbCBpc1VzZXJFZGl0ZWQoKSBjb25zdCB7IHJldHVybiBtX3VzZXJFZGl0ZWQ7IH0KICAgICB2
b2lkIHNldFVzZXJFZGl0ZWQoYm9vbCBpc1VzZXJFZGl0ZWQpOwogCkBAIC03MSwxMCArNTgsOSBA
QCBwdWJsaWM6CiAgICAgdm9pZCBzZXRTZWxlY3Rpb25SYW5nZShpbnQgc3RhcnQsIGludCBlbmQp
OwogICAgIFNlbGVjdGlvbiBzZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKSBjb25zdDsKIAot
ICAgIHZvaWQgc3VidHJlZUhhc0NoYW5nZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3VidHJlZUhh
c0NoYW5nZWQoKTsKICAgICBTdHJpbmcgdGV4dCgpOwogICAgIFN0cmluZyB0ZXh0V2l0aEhhcmRM
aW5lQnJlYWtzKCk7Ci0gICAgdm9pZCBmb3J3YXJkRXZlbnQoRXZlbnQqKTsKICAgICB2b2lkIHNl
bGVjdGlvbkNoYW5nZWQoYm9vbCB1c2VyVHJpZ2dlcmVkKTsKIAogICAgIHZpcnR1YWwgdm9pZCBh
ZGRGb2N1c1JpbmdSZWN0cyhHcmFwaGljc0NvbnRleHQqLCBpbnQgdHgsIGludCB0eSk7CkBAIC05
NSw3NiArODEsMzYgQEAgcHVibGljOgogICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlUG9zaXRp
b25Gb3JJbmRleChpbnQgaW5kZXgpOwogICAgIGludCBpbmRleEZvclZpc2libGVQb3NpdGlvbihj
b25zdCBWaXNpYmxlUG9zaXRpb24mKTsKIAotICAgIHZvaWQgYWRkU2VhcmNoUmVzdWx0KCk7Cisg
ICAgdmlydHVhbCB2b2lkIGZvcndhcmRFdmVudChFdmVudCopOwogCi0gICAgYm9vbCBwb3B1cElz
VmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2VhcmNoUG9wdXBJc1Zpc2libGU7IH0KLSAgICB2
b2lkIHNob3dQb3B1cCgpOwotICAgIHZvaWQgaGlkZVBvcHVwKCk7Citwcm90ZWN0ZWQ6CisgICAg
aW50IHNjcm9sbGJhclRoaWNrbmVzcygpIGNvbnN0OworICAgIHZvaWQgYWRqdXN0SW5uZXJUZXh0
U3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUsIFJlbmRlclN0eWxlKiB0ZXh0Qmxv
Y2tTdHlsZSkgY29uc3Q7CisgICAgdm9pZCB1cGRhdGVJbm5lclRleHRWYWx1ZShjb25zdCBTdHJp
bmcmKTsKIAotICAgIHZvaWQgc3RvcFNlYXJjaEV2ZW50VGltZXIoKTsKLSAgICAKLSAgICBib29s
IHBsYWNlaG9sZGVySXNWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gbV9wbGFjZWhvbGRlclZpc2li
bGU7IH0KLSAgICB2b2lkIHVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eSgpOworICAgIHZpcnR1
YWwgdm9pZCBwcm9jZXNzU3R5bGVDaGFuZ2UoKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc3R5bGVE
aWRDaGFuZ2UoUmVuZGVyU3R5bGU6OkRpZmYsIGNvbnN0IFJlbmRlclN0eWxlKiBvbGRTdHlsZSk7
CiAKLSAgICB2aXJ0dWFsIHZvaWQgY2Fwc0xvY2tTdGF0ZU1heUhhdmVDaGFuZ2VkKCk7CisgICAg
dm9pZCBjcmVhdGVTdWJ0cmVlSWZOZWVkZWQoTm9kZSogaW5uZXJCbG9jayk7CisgICAgYm9vbCBu
b2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwg
aW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uLCBOb2RlKiBpbm5lckJsb2NrKTsK
IAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBzdHlsZURpZENoYW5nZShSZW5kZXJTdHls
ZTo6RGlmZiwgY29uc3QgUmVuZGVyU3R5bGUqIG9sZFN0eWxlKTsKKyAgICBpbnQgdGV4dEJsb2Nr
V2lkdGgoKSBjb25zdDsKKyAgICBpbnQgdGV4dEJsb2NrSGVpZ2h0KCkgY29uc3Q7CiAKLXByaXZh
dGU6Ci0gICAgLy8gUG9wdXBNZW51Q2xpZW50IG1ldGhvZHMKLSAgICB2aXJ0dWFsIHZvaWQgdmFs
dWVDaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzID0gdHJ1ZSk7Ci0g
ICAgdmlydHVhbCBTdHJpbmcgaXRlbVRleHQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAg
ICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5hYmxlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Owot
ICAgIHZpcnR1YWwgUG9wdXBNZW51U3R5bGUgaXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3Q7Ci0gICAgdmlydHVhbCBQb3B1cE1lbnVTdHlsZSBtZW51U3R5bGUoKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIGludCBjbGllbnRJbnNldExlZnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBj
bGllbnRJbnNldFJpZ2h0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgY2xpZW50UGFkZGluZ0xl
ZnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBjbGllbnRQYWRkaW5nUmlnaHQoKSBjb25zdDsK
LSAgICB2aXJ0dWFsIGludCBsaXN0U2l6ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IHNlbGVj
dGVkSW5kZXgoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVuc2ln
bmVkIGxpc3RJbmRleCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGl0ZW1Jc0xhYmVsKHVuc2ln
bmVkIGxpc3RJbmRleCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIGl0ZW1Jc1NlbGVjdGVkKHVu
c2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNldFRleHRGcm9tSXRl
bSh1bnNpZ25lZCBsaXN0SW5kZXgpOwotICAgIHZpcnR1YWwgYm9vbCBzaG91bGRQb3BPdmVyKCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgdmFsdWVTaG91bGRDaGFu
Z2VPbkhvdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIEZvbnRT
ZWxlY3RvciogZm9udFNlbGVjdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBIb3N0V2luZG93KiBo
b3N0V2luZG93KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPFNjcm9sbGJhcj4gY3Jl
YXRlU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCosIFNjcm9sbGJhck9yaWVudGF0aW9uLCBTY3Jv
bGxiYXJDb250cm9sU2l6ZSk7Ci0KLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBjcmVhdGVJ
bm5lckJsb2NrU3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpOwotICAgIFBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IGNyZWF0ZUlubmVyVGV4dFN0eWxlKGNvbnN0IFJlbmRlclN0eWxl
KiBzdGFydFN0eWxlKTsKLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBjcmVhdGVDYW5jZWxC
dXR0b25TdHlsZShjb25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSk7Ci0gICAgUGFzc1JlZlB0
cjxSZW5kZXJTdHlsZT4gY3JlYXRlUmVzdWx0c0J1dHRvblN0eWxlKGNvbnN0IFJlbmRlclN0eWxl
KiBzdGFydFN0eWxlKTsKLQotICAgIHZvaWQgY3JlYXRlU3VidHJlZUlmTmVlZGVkKCk7Ci0gICAg
dm9pZCB1cGRhdGVDYW5jZWxCdXR0b25WaXNpYmlsaXR5KFJlbmRlclN0eWxlKik7Ci0gICAgY29u
c3QgQXRvbWljU3RyaW5nJiBhdXRvc2F2ZU5hbWUoKSBjb25zdDsKLSAgICB2b2lkIHN0YXJ0U2Vh
cmNoRXZlbnRUaW1lcigpOwotICAgIHZvaWQgc2VhcmNoRXZlbnRUaW1lckZpcmVkKFRpbWVyPFJl
bmRlclRleHRDb250cm9sPiopOwotICAgIFN0cmluZyBmaW5pc2hUZXh0KFZlY3RvcjxVQ2hhcj4m
KSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBwcmVmZXJyZWRXaWR0aChmbG9hdCBjaGFyV2lkdGgp
IGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgY2FsY0V4dHJhTGluZUhlaWdodChpbnQgbGlu
ZUhlaWdodCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBjYWNoZVNlbGVjdGlvbihpbnQgc3RhcnQs
IGludCBlbmQpID0gMDsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGNyZWF0
ZUlubmVyVGV4dFN0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxlKSBjb25zdCA9IDA7
CiAKICAgICBmcmllbmQgY2xhc3MgVGV4dEl0ZXJhdG9yOwogICAgIEhUTUxFbGVtZW50KiBpbm5l
clRleHRFbGVtZW50KCkgY29uc3Q7CiAKLSAgICBSZWZQdHI8VGV4dENvbnRyb2xJbm5lckVsZW1l
bnQ+IG1faW5uZXJCbG9jazsKLSAgICBSZWZQdHI8VGV4dENvbnRyb2xJbm5lclRleHRFbGVtZW50
PiBtX2lubmVyVGV4dDsKLSAgICBSZWZQdHI8U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uRWxlbWVu
dD4gbV9yZXN1bHRzQnV0dG9uOwotICAgIFJlZlB0cjxTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbkVs
ZW1lbnQ+IG1fY2FuY2VsQnV0dG9uOwotCi0gICAgYm9vbCBtX2RpcnR5OwotICAgIGJvb2wgbV9t
dWx0aUxpbmU7Ci0gICAgYm9vbCBtX3BsYWNlaG9sZGVyVmlzaWJsZTsKLSAgICBib29sIG1fdXNl
ckVkaXRlZDsKLSAgICBib29sIG1fc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yOwotICAgIAot
ICAgIFJlZlB0cjxTZWFyY2hQb3B1cE1lbnU+IG1fc2VhcmNoUG9wdXA7Ci0gICAgYm9vbCBtX3Nl
YXJjaFBvcHVwSXNWaXNpYmxlOwotICAgIG11dGFibGUgVmVjdG9yPFN0cmluZz4gbV9yZWNlbnRT
ZWFyY2hlczsKK3ByaXZhdGU6CisgICAgU3RyaW5nIGZpbmlzaFRleHQoVmVjdG9yPFVDaGFyPiYp
IGNvbnN0OwogCi0gICAgVGltZXI8UmVuZGVyVGV4dENvbnRyb2w+IG1fc2VhcmNoRXZlbnRUaW1l
cjsKKyAgICBib29sIG1fZWRpdGVkIDogMTsKKyAgICBib29sIG1fdXNlckVkaXRlZCA6IDE7Cisg
ICAgUmVmUHRyPFRleHRDb250cm9sSW5uZXJUZXh0RWxlbWVudD4gbV9pbm5lclRleHQ7CiB9Owog
CiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRy
b2xNdWx0aUxpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJv
bE11bHRpTGluZS5jcHAJKHJldmlzaW9uIDApCisrKyByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRy
b2xNdWx0aUxpbmUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE1MyBAQAorLyoqCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogICAgICAgICAgIChDKSAyMDA4IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pIAorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIlJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmgiCisKKyNpbmNsdWRlICJF
dmVudC5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2lu
Y2x1ZGUgIkhUTUxUZXh0QXJlYUVsZW1lbnQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitS
ZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUoTm9k
ZSogbm9kZSkKKyAgICA6IFJlbmRlclRleHRDb250cm9sKG5vZGUpCit7Cit9CisKK1JlbmRlclRl
eHRDb250cm9sTXVsdGlMaW5lOjp+UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUoKQoreworICAg
IGlmIChub2RlKCkpCisgICAgICAgIHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihu
b2RlKCkpLT5yZW5kZXJlcldpbGxCZURlc3Ryb3llZCgpOworfQorCit2b2lkIFJlbmRlclRleHRD
b250cm9sTXVsdGlMaW5lOjpzdWJ0cmVlSGFzQ2hhbmdlZCgpCit7CisgICAgUmVuZGVyVGV4dENv
bnRyb2w6OnN1YnRyZWVIYXNDaGFuZ2VkKCk7CisKKyAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50
KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEZvcm1Db250cm9sRWxlbWVudCo+KG5vZGUoKSk7
CisgICAgZWxlbWVudC0+c2V0VmFsdWVNYXRjaGVzUmVuZGVyZXIoZmFsc2UpOworCisgICAgaWYg
KGVsZW1lbnQtPmZvY3VzZWQoKSkgeworICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jdW1l
bnQoKS0+ZnJhbWUoKSkKKyAgICAgICAgICAgIGZyYW1lLT50ZXh0RGlkQ2hhbmdlSW5UZXh0QXJl
YShlbGVtZW50KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6
OmxheW91dCgpCit7CisgICAgaW50IG9sZEhlaWdodCA9IG1faGVpZ2h0OworICAgIGNhbGNIZWln
aHQoKTsKKworICAgIGludCBvbGRXaWR0aCA9IG1fd2lkdGg7CisgICAgY2FsY1dpZHRoKCk7CisK
KyAgICBib29sIHJlbGF5b3V0Q2hpbGRyZW4gPSBvbGRIZWlnaHQgIT0gbV9oZWlnaHQgfHwgb2xk
V2lkdGggIT0gbV93aWR0aDsKKyAgICBSZW5kZXJPYmplY3QqIGlubmVyVGV4dFJlbmRlcmVyID0g
aW5uZXJUZXh0RWxlbWVudCgpLT5yZW5kZXJlcigpOworCisgICAgLy8gU2V0IHRoZSB0ZXh0IGJs
b2NrIGhlaWdodAorICAgIGludCBkZXNpcmVkSGVpZ2h0ID0gdGV4dEJsb2NrSGVpZ2h0KCk7Cisg
ICAgaWYgKGRlc2lyZWRIZWlnaHQgIT0gaW5uZXJUZXh0UmVuZGVyZXItPmhlaWdodCgpKQorICAg
ICAgICByZWxheW91dENoaWxkcmVuID0gdHJ1ZTsKKyAgICBpbm5lclRleHRSZW5kZXJlci0+c3R5
bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChkZXNpcmVkSGVpZ2h0LCBGaXhlZCkpOworCisgICAgLy8g
U2V0IHRoZSB0ZXh0IGJsb2NrIHdpZHRoCisgICAgaW50IGRlc2lyZWRXaWR0aCA9IHRleHRCbG9j
a1dpZHRoKCk7CisgICAgaWYgKGRlc2lyZWRXaWR0aCAhPSBpbm5lclRleHRSZW5kZXJlci0+d2lk
dGgoKSkKKyAgICAgICAgcmVsYXlvdXRDaGlsZHJlbiA9IHRydWU7CisgICAgaW5uZXJUZXh0UmVu
ZGVyZXItPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChkZXNpcmVkV2lkdGgsIEZpeGVkKSk7CisK
KyAgICBSZW5kZXJCbG9jazo6bGF5b3V0QmxvY2socmVsYXlvdXRDaGlsZHJlbik7Cit9CisKK2Jv
b2wgUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RS
ZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50
IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbikKK3sKKyAgICByZXR1cm4g
UmVuZGVyVGV4dENvbnRyb2w6Om5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgs
IHR5LCBoaXRUZXN0QWN0aW9uLCAwKTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbE11bHRp
TGluZTo6Zm9yd2FyZEV2ZW50KEV2ZW50KiBldnQpCit7CisgICAgaWYgKGV2dC0+dHlwZSgpID09
IGV2ZW50TmFtZXMoKS5ibHVyRXZlbnQgfHwgZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmZv
Y3VzRXZlbnQpCisgICAgICAgIHJldHVybjsKKworICAgIFJlbmRlclRleHRDb250cm9sOjpmb3J3
YXJkRXZlbnQoZXZ0KTsKK30KKworaW50IFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lOjpwcmVm
ZXJyZWRXaWR0aChmbG9hdCBjaGFyV2lkdGgpIGNvbnN0Cit7CisgICAgaW50IGZhY3RvciA9IHN0
YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5jb2xzKCk7CisgICAgcmV0
dXJuIHN0YXRpY19jYXN0PGludD4oY2VpbGYoY2hhcldpZHRoICogZmFjdG9yKSkgKyBzY3JvbGxi
YXJUaGlja25lc3MoKTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6Y2Fs
Y0V4dHJhTGluZUhlaWdodChpbnQgbGluZUhlaWdodCkKK3sKKyAgICBtX2hlaWdodCArPSBsaW5l
SGVpZ2h0ICogc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUoKSktPnJvd3Mo
KTsKK30KKworaW50IFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lOjpiYXNlbGluZVBvc2l0aW9u
KGJvb2wsIGJvb2wpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhlaWdodCgpICsgbWFyZ2luVG9wKCkg
KyBtYXJnaW5Cb3R0b20oKTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6
dXBkYXRlRnJvbUVsZW1lbnQoKQoreworICAgIGNyZWF0ZVN1YnRyZWVJZk5lZWRlZCgwKTsKKyAg
ICBSZW5kZXJUZXh0Q29udHJvbDo6dXBkYXRlRnJvbUVsZW1lbnQoKTsKKworICAgIHVwZGF0ZUlu
bmVyVGV4dFZhbHVlKHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT52
YWx1ZSgpKTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6Y2FjaGVTZWxl
Y3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgIHN0YXRpY19jYXN0PEhUTUxUZXh0QXJl
YUVsZW1lbnQqPihub2RlKCkpLT5jYWNoZVNlbGVjdGlvbihzdGFydCwgZW5kKTsKK30KKworUGFz
c1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6OmNyZWF0ZUlu
bmVyVGV4dFN0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxlKSBjb25zdAoreworICAg
IFJlZlB0cjxSZW5kZXJTdHlsZT4gdGV4dEJsb2NrU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRl
KCk7CisgICAgdGV4dEJsb2NrU3R5bGUtPmluaGVyaXRGcm9tKHN0YXJ0U3R5bGUpOworCisgICAg
YWRqdXN0SW5uZXJUZXh0U3R5bGUoc3RhcnRTdHlsZSwgdGV4dEJsb2NrU3R5bGUuZ2V0KCkpOwor
CisgICAgLy8gRm9yd2FyZCBvdmVyZmxvdyBwcm9wZXJ0aWVzLgorICAgIHRleHRCbG9ja1N0eWxl
LT5zZXRPdmVyZmxvd1goc3RhcnRTdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgPyBPQVVU
TyA6IHN0YXJ0U3R5bGUtPm92ZXJmbG93WCgpKTsKKyAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0T3Zl
cmZsb3dZKHN0YXJ0U3R5bGUtPm92ZXJmbG93WSgpID09IE9WSVNJQkxFID8gT0FVVE8gOiBzdGFy
dFN0eWxlLT5vdmVyZmxvd1koKSk7CisKKyAgICAvLyBTZXQgd29yZCB3cmFwIHByb3BlcnR5IGJh
c2VkIG9uIHdyYXAgYXR0cmlidXRlLgorICAgIGlmIChzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFF
bGVtZW50Kj4obm9kZSgpKS0+c2hvdWxkV3JhcFRleHQoKSkgeworICAgICAgICB0ZXh0QmxvY2tT
dHlsZS0+c2V0V2hpdGVTcGFjZShQUkVfV1JBUCk7CisgICAgICAgIHRleHRCbG9ja1N0eWxlLT5z
ZXRXb3JkV3JhcChCcmVha1dvcmRXcmFwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0Qmxv
Y2tTdHlsZS0+c2V0V2hpdGVTcGFjZShQUkUpOworICAgICAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0
V29yZFdyYXAoTm9ybWFsV29yZFdyYXApOworICAgIH0KKworICAgIHRleHRCbG9ja1N0eWxlLT5z
ZXREaXNwbGF5KEJMT0NLKTsKKworICAgIC8vIFdlJ3JlIGFkZGluZyB0aHJlZSBleHRyYSBwaXhl
bHMgb2YgcGFkZGluZyB0byBsaW5lIHRleHRhcmVhcyB1cCB3aXRoIHRleHQgZmllbGRzLgorICAg
IHRleHRCbG9ja1N0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgoMywgRml4ZWQpKTsKKyAgICB0
ZXh0QmxvY2tTdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aCgzLCBGaXhlZCkpOworCisgICAg
cmV0dXJuIHRleHRCbG9ja1N0eWxlLnJlbGVhc2UoKTsKK30KKworfQpJbmRleDogcmVuZGVyaW5n
L1JlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1Jl
bmRlclRleHRDb250cm9sTXVsdGlMaW5lLmgJKHJldmlzaW9uIDApCisrKyByZW5kZXJpbmcvUmVu
ZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1NCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUb3JjaCBNb2JpbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKSAKKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgUmVuZGVy
VGV4dENvbnRyb2xNdWx0aUxpbmVfaAorI2RlZmluZSBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGlu
ZV9oCisKKyNpbmNsdWRlICJSZW5kZXJUZXh0Q29udHJvbC5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lIDogcHVibGljIFJlbmRlclRl
eHRDb250cm9sIHsKK3B1YmxpYzoKKyAgICBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZShOb2Rl
Kik7CisgICAgdmlydHVhbCB+UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUoKTsKKworICAgIHZp
cnR1YWwgYm9vbCBpc1RleHRBcmVhKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmly
dHVhbCB2b2lkIHN1YnRyZWVIYXNDaGFuZ2VkKCk7CisgICAgdmlydHVhbCB2b2lkIGxheW91dCgp
OworCisgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0Jiwg
SGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rp
b24pOworICAgIHZpcnR1YWwgdm9pZCBmb3J3YXJkRXZlbnQoRXZlbnQqKTsKKworcHJpdmF0ZToK
KyAgICB2aXJ0dWFsIGludCBwcmVmZXJyZWRXaWR0aChmbG9hdCBjaGFyV2lkdGgpIGNvbnN0Owor
ICAgIHZpcnR1YWwgdm9pZCBjYWxjRXh0cmFMaW5lSGVpZ2h0KGludCBsaW5lSGVpZ2h0KTsKKyAg
ICB2aXJ0dWFsIGludCBiYXNlbGluZVBvc2l0aW9uKGJvb2wgZmlyc3RMaW5lLCBib29sIGlzUm9v
dExpbmVCb3gpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7
CisgICAgdmlydHVhbCB2b2lkIGNhY2hlU2VsZWN0aW9uKGludCBzdGFydCwgaW50IGVuZCk7CisK
KyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGNyZWF0ZUlubmVyVGV4dFN0eWxl
KGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxlKSBjb25zdDsKK307CisKK30KKworI2VuZGlm
CkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmNwcAkocmV2aXNp
b24gMCkKKysrIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDc1NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIw
MDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICAgICAgICAgIChDKSAyMDA4
IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNo
bW9iaWxlLmNvbS8pIAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJlbmRlclRl
eHRDb250cm9sU2luZ2xlTGluZS5oIgorCisjaW5jbHVkZSAiQ1NTU3R5bGVTZWxlY3Rvci5oIgor
I2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZy
YW1lVmlldy5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKKyNpbmNsdWRlICJIVE1MSW5w
dXRFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiTG9jYWxpemVk
U3RyaW5ncy5oIgorI2luY2x1ZGUgIk1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUtl
eWJvYXJkRXZlbnQuaCIKKyNpbmNsdWRlICJSZW5kZXJTY3JvbGxiYXIuaCIKKyNpbmNsdWRlICJS
ZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIlNlYXJjaFBvcHVwTWVudS5oIgorI2luY2x1ZGUgIlNl
bGVjdGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgIlRl
eHRDb250cm9sSW5uZXJFbGVtZW50cy5oIgorCit1c2luZyBzdGQ6Om1heDsKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCitSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZShOb2RlKiBub2RlKQor
ICAgIDogUmVuZGVyVGV4dENvbnRyb2wobm9kZSkKKyAgICAsIG1fcGxhY2Vob2xkZXJWaXNpYmxl
KGZhbHNlKQorICAgICwgbV9zZWFyY2hQb3B1cElzVmlzaWJsZShmYWxzZSkKKyAgICAsIG1fc2hv
dWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yKGZhbHNlKQorICAgICwgbV9zZWFyY2hFdmVudFRpbWVy
KHRoaXMsICZSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNlYXJjaEV2ZW50VGltZXJGaXJl
ZCkKKyAgICAsIG1fc2VhcmNoUG9wdXAoMCkKK3sKK30KKworUmVuZGVyVGV4dENvbnRyb2xTaW5n
bGVMaW5lOjp+UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lKCkKK3sKKyAgICBpZiAobV9zZWFy
Y2hQb3B1cCkgeworICAgICAgICBtX3NlYXJjaFBvcHVwLT5kaXNjb25uZWN0Q2xpZW50KCk7Cisg
ICAgICAgIG1fc2VhcmNoUG9wdXAgPSAwOworICAgIH0KKyAKKyAgICBpZiAobV9pbm5lckJsb2Nr
KQorICAgICAgICBtX2lubmVyQmxvY2stPmRldGFjaCgpOworfQorCitib29sIFJlbmRlclRleHRD
b250cm9sU2luZ2xlTGluZTo6cGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUoKSBjb25zdAorewor
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+cGxhY2Vo
b2xkZXJTaG91bGRCZVZpc2libGUoKTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmU6OnVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eSgpCit7CisgICAgUmVuZGVyU3R5bGUq
IHBhcmVudFN0eWxlID0gbV9pbm5lckJsb2NrID8gbV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT5z
dHlsZSgpIDogc3R5bGUoKTsKKworICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gdGV4dEJsb2NrU3R5
bGUgPSBjcmVhdGVJbm5lclRleHRTdHlsZShwYXJlbnRTdHlsZSk7CisgICAgSFRNTEVsZW1lbnQq
IGlubmVyVGV4dCA9IGlubmVyVGV4dEVsZW1lbnQoKTsKKyAgICBpbm5lclRleHQtPnJlbmRlcmVy
KCktPnNldFN0eWxlKHRleHRCbG9ja1N0eWxlKTsKKworICAgIGZvciAoTm9kZSogbiA9IGlubmVy
VGV4dC0+Zmlyc3RDaGlsZCgpOyBuOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZShpbm5lclRleHQp
KSB7CisgICAgICAgIGlmIChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbi0+cmVuZGVyZXIoKSkK
KyAgICAgICAgICAgIHJlbmRlcmVyLT5zZXRTdHlsZSh0ZXh0QmxvY2tTdHlsZSk7CisgICAgfQor
CisgICAgdXBkYXRlRnJvbUVsZW1lbnQoKTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmU6OmFkZFNlYXJjaFJlc3VsdCgpCit7CisgICAgSFRNTElucHV0RWxlbWVudCogaW5w
dXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKKyAgICBpZiAoaW5w
dXQtPm1heFJlc3VsdHMoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBTdHJpbmcgdmFs
dWUgPSBpbnB1dC0+dmFsdWUoKTsKKyAgICBpZiAodmFsdWUuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBTZXR0aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudCgpLT5zZXR0aW5ncygp
OworICAgIGlmICghc2V0dGluZ3MgfHwgc2V0dGluZ3MtPnByaXZhdGVCcm93c2luZ0VuYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KG1f
cmVjZW50U2VhcmNoZXMuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0g
MDsgLS1pKSB7CisgICAgICAgIGlmIChtX3JlY2VudFNlYXJjaGVzW2ldID09IHZhbHVlKQorICAg
ICAgICAgICAgbV9yZWNlbnRTZWFyY2hlcy5yZW1vdmUoaSk7CisgICAgfQorCisgICAgbV9yZWNl
bnRTZWFyY2hlcy5pbnNlcnQoMCwgdmFsdWUpOworICAgIHdoaWxlIChzdGF0aWNfY2FzdDxpbnQ+
KG1fcmVjZW50U2VhcmNoZXMuc2l6ZSgpKSA+IGlucHV0LT5tYXhSZXN1bHRzKCkpCisgICAgICAg
IG1fcmVjZW50U2VhcmNoZXMucmVtb3ZlTGFzdCgpOworCisgICAgY29uc3QgQXRvbWljU3RyaW5n
JiBuYW1lID0gYXV0b3NhdmVOYW1lKCk7CisgICAgaWYgKCFtX3NlYXJjaFBvcHVwKQorICAgICAg
ICBtX3NlYXJjaFBvcHVwID0gU2VhcmNoUG9wdXBNZW51OjpjcmVhdGUodGhpcyk7CisKKyAgICBt
X3NlYXJjaFBvcHVwLT5zYXZlUmVjZW50U2VhcmNoZXMobmFtZSwgbV9yZWNlbnRTZWFyY2hlcyk7
Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzdG9wU2VhcmNoRXZlbnRU
aW1lcigpCit7CisgICAgbV9zZWFyY2hFdmVudFRpbWVyLnN0b3AoKTsKK30KKwordm9pZCBSZW5k
ZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNob3dQb3B1cCgpCit7CisgICAgaWYgKG1fc2VhcmNo
UG9wdXBJc1Zpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9zZWFyY2hQb3B1
cCkKKyAgICAgICAgbV9zZWFyY2hQb3B1cCA9IFNlYXJjaFBvcHVwTWVudTo6Y3JlYXRlKHRoaXMp
OworCisgICAgaWYgKCFtX3NlYXJjaFBvcHVwLT5lbmFibGVkKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fc2VhcmNoUG9wdXBJc1Zpc2libGUgPSB0cnVlOworCisgICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lID0gYXV0b3NhdmVOYW1lKCk7CisgICAgbV9zZWFyY2hQb3B1cC0+bG9hZFJl
Y2VudFNlYXJjaGVzKG5hbWUsIG1fcmVjZW50U2VhcmNoZXMpOworCisgICAgLy8gVHJpbSB0aGUg
cmVjZW50IHNlYXJjaGVzIGxpc3QgaWYgdGhlIG1heGltdW0gc2l6ZSBoYXMgY2hhbmdlZCBzaW5j
ZSB3ZSBsYXN0IHNhdmVkLgorICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0ID0gc3RhdGljX2Nh
c3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSk7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4o
bV9yZWNlbnRTZWFyY2hlcy5zaXplKCkpID4gaW5wdXQtPm1heFJlc3VsdHMoKSkgeworICAgICAg
ICBkbyB7CisgICAgICAgICAgICBtX3JlY2VudFNlYXJjaGVzLnJlbW92ZUxhc3QoKTsKKyAgICAg
ICAgfSB3aGlsZSAoc3RhdGljX2Nhc3Q8aW50PihtX3JlY2VudFNlYXJjaGVzLnNpemUoKSkgPiBp
bnB1dC0+bWF4UmVzdWx0cygpKTsKKworICAgICAgICBtX3NlYXJjaFBvcHVwLT5zYXZlUmVjZW50
U2VhcmNoZXMobmFtZSwgbV9yZWNlbnRTZWFyY2hlcyk7CisgICAgfQorCisgICAgbV9zZWFyY2hQ
b3B1cC0+c2hvdyhhYnNvbHV0ZUJvdW5kaW5nQm94UmVjdCh0cnVlKSwgZG9jdW1lbnQoKS0+dmll
dygpLCAtMSk7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpoaWRlUG9w
dXAoKQoreworICAgIGlmIChtX3NlYXJjaFBvcHVwKQorICAgICAgICBtX3NlYXJjaFBvcHVwLT5o
aWRlKCk7CisKKyAgICBtX3NlYXJjaFBvcHVwSXNWaXNpYmxlID0gZmFsc2U7Cit9CisKK3ZvaWQg
UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzdWJ0cmVlSGFzQ2hhbmdlZCgpCit7CisgICAg
Ym9vbCB3YXNFZGl0ZWQgPSBpc0VkaXRlZCgpOworICAgIFJlbmRlclRleHRDb250cm9sOjpzdWJ0
cmVlSGFzQ2hhbmdlZCgpOworCisgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNf
Y2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKKyAgICBpbnB1dC0+c2V0VmFsdWVGcm9t
UmVuZGVyZXIoaW5wdXQtPmNvbnN0cmFpblZhbHVlKHRleHQoKSkpOworCisgICAgaWYgKFJlbmRl
ck9iamVjdCogY2FuY2VsQnV0dG9uUmVuZGVyZXIgPSBtX2NhbmNlbEJ1dHRvbiA/IG1fY2FuY2Vs
QnV0dG9uLT5yZW5kZXJlcigpIDogMCkKKyAgICAgICAgdXBkYXRlQ2FuY2VsQnV0dG9uVmlzaWJp
bGl0eShjYW5jZWxCdXR0b25SZW5kZXJlci0+c3R5bGUoKSk7CisKKyAgICAvLyBJZiB0aGUgaW5j
cmVtZW50YWwgYXR0cmlidXRlIGlzIHNldCwgdGhlbiBkaXNwYXRjaCB0aGUgc2VhcmNoIGV2ZW50
CisgICAgaWYgKCFpbnB1dC0+Z2V0QXR0cmlidXRlKGluY3JlbWVudGFsQXR0cikuaXNOdWxsKCkp
CisgICAgICAgIHN0YXJ0U2VhcmNoRXZlbnRUaW1lcigpOworCisgICAgaWYgKCF3YXNFZGl0ZWQg
JiYgaW5wdXQtPmZvY3VzZWQoKSkgeworICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jdW1l
bnQoKS0+ZnJhbWUoKSkKKyAgICAgICAgICAgIGZyYW1lLT50ZXh0RmllbGREaWRCZWdpbkVkaXRp
bmcoaW5wdXQpOworICAgIH0KKworICAgIGlmIChpbnB1dC0+Zm9jdXNlZCgpKSB7CisgICAgICAg
IGlmIChGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpKQorICAgICAgICAgICAgZnJh
bWUtPnRleHREaWRDaGFuZ2VJblRleHRGaWVsZChpbnB1dCk7CisgICAgfQorfQorCit2b2lkIFJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGlu
dCB0eCwgaW50IHR5KQoreworICAgIFJlbmRlclRleHRDb250cm9sOjpwYWludChwYWludEluZm8s
IHR4LCB0eSk7CisKKyAgICBpZiAocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VCbG9ja0Jh
Y2tncm91bmQgJiYgbV9zaG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0b3IpIHsKKyAgICAgICAgSW50
UmVjdCBjb250ZW50c1JlY3QgPSBjb250ZW50Qm94KCk7CisKKyAgICAgICAgLy8gQ29udmVydCB0
aGUgcmVjdCBpbnRvIHRoZSBjb29yZHMgdXNlZCBmb3IgcGFpbnRpbmcgdGhlIGNvbnRlbnQKKyAg
ICAgICAgY29udGVudHNSZWN0Lm1vdmUodHggKyB4UG9zKCksIHR5ICsgeVBvcygpKTsKKyAgICAg
ICAgdGhlbWUoKS0+cGFpbnRDYXBzTG9ja0luZGljYXRvcih0aGlzLCBwYWludEluZm8sIGNvbnRl
bnRzUmVjdCk7CisgICAgfQorfQorCit2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6
bGF5b3V0KCkKK3sKKyAgICBpbnQgb2xkSGVpZ2h0ID0gbV9oZWlnaHQ7CisgICAgY2FsY0hlaWdo
dCgpOworCisgICAgaW50IG9sZFdpZHRoID0gbV93aWR0aDsKKyAgICBjYWxjV2lkdGgoKTsKKwor
ICAgIGJvb2wgcmVsYXlvdXRDaGlsZHJlbiA9IG9sZEhlaWdodCAhPSBtX2hlaWdodCB8fCBvbGRX
aWR0aCAhPSBtX3dpZHRoOworCisgICAgUmVuZGVyT2JqZWN0KiBpbm5lclRleHRSZW5kZXJlciA9
IGlubmVyVGV4dEVsZW1lbnQoKS0+cmVuZGVyZXIoKTsKKyAgICBSZW5kZXJPYmplY3QqIGlubmVy
QmxvY2tSZW5kZXJlciA9IG1faW5uZXJCbG9jayA/IG1faW5uZXJCbG9jay0+cmVuZGVyZXIoKSA6
IDA7CisKKyAgICAvLyBTZXQgdGhlIHRleHQgYmxvY2sgaGVpZ2h0CisgICAgaW50IGRlc2lyZWRI
ZWlnaHQgPSB0ZXh0QmxvY2tIZWlnaHQoKTsKKyAgICBpbnQgY3VycmVudEhlaWdodCA9IGlubmVy
VGV4dFJlbmRlcmVyLT5oZWlnaHQoKTsKKworICAgIGlmIChtX2lubmVyQmxvY2sgfHwgY3VycmVu
dEhlaWdodCA+IG1faGVpZ2h0KSB7CisgICAgICAgIGlmIChkZXNpcmVkSGVpZ2h0ICE9IGN1cnJl
bnRIZWlnaHQpCisgICAgICAgICAgICByZWxheW91dENoaWxkcmVuID0gdHJ1ZTsKKyAgICAgICAg
aW5uZXJUZXh0UmVuZGVyZXItPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgoZGVzaXJlZEhlaWdo
dCwgRml4ZWQpKTsKKyAgICB9CisKKyAgICBpZiAobV9pbm5lckJsb2NrKSB7CisgICAgICAgIEFT
U0VSVChpbm5lckJsb2NrUmVuZGVyZXIpOworICAgICAgICBpZiAoZGVzaXJlZEhlaWdodCAhPSBp
bm5lckJsb2NrUmVuZGVyZXItPmhlaWdodCgpKQorICAgICAgICAgICAgcmVsYXlvdXRDaGlsZHJl
biA9IHRydWU7CisgICAgICAgIGlubmVyQmxvY2tSZW5kZXJlci0+c3R5bGUoKS0+c2V0SGVpZ2h0
KExlbmd0aChkZXNpcmVkSGVpZ2h0LCBGaXhlZCkpOworICAgIH0KKworICAgIC8vIFNldCB0aGUg
dGV4dCBibG9jayB3aWR0aAorICAgIGludCBkZXNpcmVkV2lkdGggPSB0ZXh0QmxvY2tXaWR0aCgp
OworICAgIGlmIChkZXNpcmVkV2lkdGggIT0gaW5uZXJUZXh0UmVuZGVyZXItPndpZHRoKCkpCisg
ICAgICAgIHJlbGF5b3V0Q2hpbGRyZW4gPSB0cnVlOworICAgIGlubmVyVGV4dFJlbmRlcmVyLT5z
dHlsZSgpLT5zZXRXaWR0aChMZW5ndGgoZGVzaXJlZFdpZHRoLCBGaXhlZCkpOworCisgICAgaWYg
KG1faW5uZXJCbG9jaykgeworICAgICAgICBpbnQgaW5uZXJCbG9ja1dpZHRoID0gbV93aWR0aCAt
IHBhZGRpbmdMZWZ0KCkgLSBwYWRkaW5nUmlnaHQoKSAtIGJvcmRlckxlZnQoKSAtIGJvcmRlclJp
Z2h0KCk7CisgICAgICAgIGlmIChpbm5lckJsb2NrV2lkdGggIT0gaW5uZXJCbG9ja1JlbmRlcmVy
LT53aWR0aCgpKQorICAgICAgICAgICAgcmVsYXlvdXRDaGlsZHJlbiA9IHRydWU7CisgICAgICAg
IGlubmVyQmxvY2tSZW5kZXJlci0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKGlubmVyQmxvY2tX
aWR0aCwgRml4ZWQpKTsKKyAgICB9CisKKyAgICBSZW5kZXJCbG9jazo6bGF5b3V0QmxvY2socmVs
YXlvdXRDaGlsZHJlbik7CisKKyAgICAvLyBGb3IgdGV4dCBmaWVsZHMsIGNlbnRlciB0aGUgaW5u
ZXIgdGV4dCB2ZXJ0aWNhbGx5CisgICAgLy8gRG9uJ3QgZG8gdGhpcyBmb3Igc2VhcmNoIGZpZWxk
cywgc2luY2Ugd2UgZG9uJ3QgaG9ub3IgaGVpZ2h0IGZvciB0aGVtCisgICAgaWYgKCFtX2lubmVy
QmxvY2spIHsKKyAgICAgICAgY3VycmVudEhlaWdodCA9IGlubmVyVGV4dFJlbmRlcmVyLT5oZWln
aHQoKTsKKyAgICAgICAgaWYgKGN1cnJlbnRIZWlnaHQgPCBtX2hlaWdodCkKKyAgICAgICAgICAg
IGlubmVyVGV4dFJlbmRlcmVyLT5zZXRQb3MoaW5uZXJUZXh0UmVuZGVyZXItPnhQb3MoKSwgKG1f
aGVpZ2h0IC0gY3VycmVudEhlaWdodCkgLyAyKTsKKyAgICB9Cit9CisKK2Jvb2wgUmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lOjpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVx
dWVzdCwgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5
LCBIaXRUZXN0QWN0aW9uIGhpdFRlc3RBY3Rpb24pCit7CisgICAgLy8gSWYgd2UncmUgd2l0aGlu
IHRoZSB0ZXh0IGNvbnRyb2wsIHdlIHdhbnQgdG8gYWN0IGFzIGlmIHdlJ3ZlIGhpdCB0aGUgaW5u
ZXIgdGV4dCBibG9jayBlbGVtZW50LCBpbiBjYXNlIHRoZSBwb2ludAorICAgIC8vIHdhcyBvbiB0
aGUgY29udHJvbCBidXQgbm90IG9uIHRoZSBpbm5lciBlbGVtZW50IChzZWUgUmFkYXIgNDYxNzg0
MSkuCisKKyAgICAvLyBJbiBhIHNlYXJjaCBmaWVsZCwgd2Ugd2FudCB0byBhY3QgYXMgaWYgd2Un
dmUgaGl0IHRoZSByZXN1bHRzIGJsb2NrIGlmIHdlJ3JlIHRvIHRoZSBsZWZ0IG9mIHRoZSBpbm5l
ciB0ZXh0IGJsb2NrLAorICAgIC8vIGFuZCBhY3QgYXMgaWYgd2UndmUgaGl0IHRoZSBjbG9zZSBi
bG9jayBpZiB3ZSdyZSB0byB0aGUgcmlnaHQgb2YgdGhlIGlubmVyIHRleHQgYmxvY2suCisKKyAg
ICBpZiAoIVJlbmRlclRleHRDb250cm9sOjpub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgs
IHksIHR4LCB0eSwgaGl0VGVzdEFjdGlvbiwgbV9pbm5lckJsb2NrLmdldCgpKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFtX2lubmVyQmxvY2spCisgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgTm9kZSogaW5uZXJOb2RlID0gMDsKKyAgICBSZW5kZXJPYmplY3QqIGlubmVy
QmxvY2tSZW5kZXJlciA9IG1faW5uZXJCbG9jay0+cmVuZGVyZXIoKTsKKyAgICBSZW5kZXJPYmpl
Y3QqIGlubmVyVGV4dFJlbmRlcmVyID0gaW5uZXJUZXh0RWxlbWVudCgpLT5yZW5kZXJlcigpOwor
CisgICAgSW50UG9pbnQgbG9jYWxQb2ludCA9IHJlc3VsdC5sb2NhbFBvaW50KCk7CisgICAgbG9j
YWxQb2ludC5tb3ZlKC1pbm5lckJsb2NrUmVuZGVyZXItPnhQb3MoKSwgLWlubmVyQmxvY2tSZW5k
ZXJlci0+eVBvcygpKTsKKworICAgIGludCB0ZXh0TGVmdCA9IHR4ICsgbV94ICsgaW5uZXJCbG9j
a1JlbmRlcmVyLT54UG9zKCkgKyBpbm5lclRleHRSZW5kZXJlci0+eFBvcygpOworICAgIGlmICht
X3Jlc3VsdHNCdXR0b24gJiYgbV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpICYmIHggPCB0ZXh0
TGVmdCkKKyAgICAgICAgaW5uZXJOb2RlID0gbV9yZXN1bHRzQnV0dG9uLmdldCgpOworCisgICAg
aWYgKCFpbm5lck5vZGUpIHsKKyAgICAgICAgaW50IHRleHRSaWdodCA9IHRleHRMZWZ0ICsgaW5u
ZXJUZXh0UmVuZGVyZXItPndpZHRoKCk7CisgICAgICAgIGlmIChtX2NhbmNlbEJ1dHRvbiAmJiBt
X2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSAmJiB4ID4gdGV4dFJpZ2h0KQorICAgICAgICAgICAg
aW5uZXJOb2RlID0gbV9jYW5jZWxCdXR0b24uZ2V0KCk7CisgICAgfQorCisgICAgaWYgKGlubmVy
Tm9kZSkgeworICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKGlubmVyTm9kZSk7CisgICAgICAg
IGxvY2FsUG9pbnQubW92ZSgtaW5uZXJOb2RlLT5yZW5kZXJlcigpLT54UG9zKCksIC1pbm5lck5v
ZGUtPnJlbmRlcmVyKCktPnlQb3MoKSk7CisgICAgfQorCisgICAgcmVzdWx0LnNldExvY2FsUG9p
bnQobG9jYWxQb2ludCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENv
bnRyb2xTaW5nbGVMaW5lOjpmb3J3YXJkRXZlbnQoRXZlbnQqIGV2dCkKK3sKKyAgICBib29sIGZp
bmlzaGVkID0gZmFsc2U7CisgICAgUmVuZGVyT2JqZWN0KiBpbm5lclRleHRSZW5kZXJlciA9IGlu
bmVyVGV4dEVsZW1lbnQoKS0+cmVuZGVyZXIoKTsKKworICAgIGlmIChldnQtPnR5cGUoKSA9PSBl
dmVudE5hbWVzKCkuYmx1ckV2ZW50KSB7CisgICAgICAgIGlmIChpbm5lclRleHRSZW5kZXJlcikg
eworICAgICAgICAgICAgaWYgKFJlbmRlckxheWVyKiBpbm5lckxheWVyID0gaW5uZXJUZXh0UmVu
ZGVyZXItPmxheWVyKCkpCisgICAgICAgICAgICAgICAgaW5uZXJMYXllci0+c2Nyb2xsVG9PZmZz
ZXQoc3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMID8gaW5uZXJMYXllci0+c2Nyb2xsV2lkdGgo
KSA6IDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgZmluaXNoZWQgPSB0cnVlOworICAgIH0g
ZWxzZSBpZiAoZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmZvY3VzRXZlbnQpCisgICAgICAg
IGZpbmlzaGVkID0gdHJ1ZTsKKworICAgIGlmIChmaW5pc2hlZCkgeworICAgICAgICBjYXBzTG9j
a1N0YXRlTWF5SGF2ZUNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlm
ICghZXZ0LT5pc01vdXNlRXZlbnQoKSkgeworICAgICAgICBSZW5kZXJUZXh0Q29udHJvbDo6Zm9y
d2FyZEV2ZW50KGV2dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBGbG9hdFBvaW50
IGxvY2FsUG9pbnQgPSBpbm5lclRleHRSZW5kZXJlci0+YWJzb2x1dGVUb0xvY2FsKEZsb2F0UG9p
bnQoc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2dCktPnBhZ2VYKCksIHN0YXRpY19jYXN0PE1v
dXNlRXZlbnQqPihldnQpLT5wYWdlWSgpKSwgZmFsc2UsIHRydWUpOworICAgIGlmIChtX3Jlc3Vs
dHNCdXR0b24gJiYgbG9jYWxQb2ludC54KCkgPCBpbm5lclRleHRSZW5kZXJlci0+Ym9yZGVyQm94
KCkueCgpKQorICAgICAgICBtX3Jlc3VsdHNCdXR0b24tPmRlZmF1bHRFdmVudEhhbmRsZXIoZXZ0
KTsKKyAgICBlbHNlIGlmIChtX2NhbmNlbEJ1dHRvbiAmJiBsb2NhbFBvaW50LngoKSA+IGlubmVy
VGV4dFJlbmRlcmVyLT5ib3JkZXJCb3goKS5yaWdodCgpKQorICAgICAgICBtX2NhbmNlbEJ1dHRv
bi0+ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOworICAgIGVsc2UKKyAgICAgICAgUmVuZGVyVGV4
dENvbnRyb2w6OmZvcndhcmRFdmVudChldnQpOworfQorCit2b2lkIFJlbmRlclRleHRDb250cm9s
U2luZ2xlTGluZTo6cHJvY2Vzc1N0eWxlQ2hhbmdlKCkKK3sKKyAgICBpZiAoUmVuZGVyT2JqZWN0
KiBpbm5lckJsb2NrUmVuZGVyZXIgPSBtX2lubmVyQmxvY2sgPyBtX2lubmVyQmxvY2stPnJlbmRl
cmVyKCkgOiAwKSB7CisgICAgICAgIC8vIFdlIG1heSBoYXZlIHNldCB0aGUgd2lkdGggYW5kIHRo
ZSBoZWlnaHQgaW4gdGhlIG9sZCBzdHlsZSBpbiBsYXlvdXQoKS4KKyAgICAgICAgLy8gUmVzZXQg
dGhlbSBub3cgdG8gYXZvaWQgZ2V0dGluZyBhIHNwdXJpb3VzIGxheW91dCBoaW50LgorICAgICAg
ICBpbm5lckJsb2NrUmVuZGVyZXItPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgoKSk7CisgICAg
ICAgIGlubmVyQmxvY2tSZW5kZXJlci0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKCkpOworICAg
ICAgICBpbm5lckJsb2NrUmVuZGVyZXItPnNldFN0eWxlKGNyZWF0ZUlubmVyQmxvY2tTdHlsZShz
dHlsZSgpKSk7CisgICAgfQorCisgICAgaWYgKFJlbmRlck9iamVjdCogcmVzdWx0c1JlbmRlcmVy
ID0gbV9yZXN1bHRzQnV0dG9uID8gbV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpIDogMCkKKyAg
ICAgICAgcmVzdWx0c1JlbmRlcmVyLT5zZXRTdHlsZShjcmVhdGVSZXN1bHRzQnV0dG9uU3R5bGUo
c3R5bGUoKSkpOworCisgICAgaWYgKFJlbmRlck9iamVjdCogY2FuY2VsUmVuZGVyZXIgPSBtX2Nh
bmNlbEJ1dHRvbiA/IG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpIDogMCkKKyAgICAgICAgY2Fu
Y2VsUmVuZGVyZXItPnNldFN0eWxlKGNyZWF0ZUNhbmNlbEJ1dHRvblN0eWxlKHN0eWxlKCkpKTsK
K30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNhcHNMb2NrU3RhdGVNYXlI
YXZlQ2hhbmdlZCgpCit7CisgICAgaWYgKCFub2RlKCkgfHwgIWRvY3VtZW50KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIE9ubHkgZHJhdyB0aGUgY2FwcyBsb2NrIGluZGljYXRvciBpZiB0
aGVzZSB0aGluZ3MgYXJlIHRydWU6CisgICAgLy8gMSkgVGhlIGZpZWxkIGlzIGEgcGFzc3dvcmQg
ZmllbGQKKyAgICAvLyAyKSBUaGUgZnJhbWUgaXMgYWN0aXZlCisgICAgLy8gMykgVGhlIGVsZW1l
bnQgaXMgZm9jdXNlZAorICAgIC8vIDQpIFRoZSBjYXBzIGxvY2sgaXMgb24KKyAgICBib29sIHNo
b3VsZERyYXdDYXBzTG9ja0luZGljYXRvciA9IGZhbHNlOworCisgICAgaWYgKEZyYW1lKiBmcmFt
ZSA9IGRvY3VtZW50KCktPmZyYW1lKCkpCisgICAgICAgIHNob3VsZERyYXdDYXBzTG9ja0luZGlj
YXRvciA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5pbnB1dFR5cGUo
KSA9PSBIVE1MSW5wdXRFbGVtZW50OjpQQVNTV09SRAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAmJiBmcmFtZS0+c2VsZWN0aW9uKCktPmlzRm9jdXNlZEFuZEFjdGl2ZSgp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50KCktPmZv
Y3VzZWROb2RlKCkgPT0gbm9kZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICYmIFBsYXRmb3JtS2V5Ym9hcmRFdmVudDo6Y3VycmVudENhcHNMb2NrU3RhdGUoKTsKKwor
ICAgIGlmIChzaG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0b3IgIT0gbV9zaG91bGREcmF3Q2Fwc0xv
Y2tJbmRpY2F0b3IpIHsKKyAgICAgICAgbV9zaG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0b3IgPSBz
aG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0b3I7CisgICAgICAgIHJlcGFpbnQoKTsKKyAgICB9Cit9
CisKK2ludCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnRleHRCbG9ja1dpZHRoKCkgY29u
c3QKK3sKKyAgICBpbnQgd2lkdGggPSBSZW5kZXJUZXh0Q29udHJvbDo6dGV4dEJsb2NrV2lkdGgo
KTsKKworICAgIGlmIChSZW5kZXJPYmplY3QqIHJlc3VsdHNSZW5kZXJlciA9IG1fcmVzdWx0c0J1
dHRvbiA/IG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSA6IDApIHsKKyAgICAgICAgcmVzdWx0
c1JlbmRlcmVyLT5jYWxjV2lkdGgoKTsKKyAgICAgICAgd2lkdGggLT0gcmVzdWx0c1JlbmRlcmVy
LT53aWR0aCgpOworICAgIH0KKworICAgIGlmIChSZW5kZXJPYmplY3QqIGNhbmNlbFJlbmRlcmVy
ID0gbV9jYW5jZWxCdXR0b24gPyBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSA6IDApIHsKKyAg
ICAgICAgY2FuY2VsUmVuZGVyZXItPmNhbGNXaWR0aCgpOworICAgICAgICB3aWR0aCAtPSBjYW5j
ZWxSZW5kZXJlci0+d2lkdGgoKTsKKyAgICB9CisKKyAgICByZXR1cm4gd2lkdGg7Cit9CisKK2lu
dCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnByZWZlcnJlZFdpZHRoKGZsb2F0IGNoYXJX
aWR0aCkgY29uc3QKK3sKKyAgICBpbnQgZmFjdG9yID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudCo+KG5vZGUoKSktPnNpemUoKTsKKyAgICBpZiAoZmFjdG9yIDw9IDApCisgICAgICAgIGZh
Y3RvciA9IDIwOworCisgICAgaW50IHJlc3VsdCA9IHN0YXRpY19jYXN0PGludD4oY2VpbGYoY2hh
cldpZHRoICogZmFjdG9yKSk7CisKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiByZXN1bHRzUmVuZGVy
ZXIgPSBtX3Jlc3VsdHNCdXR0b24gPyBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCkgOiAwKQor
ICAgICAgICByZXN1bHQgKz0gcmVzdWx0c1JlbmRlcmVyLT5ib3JkZXJMZWZ0KCkgKyByZXN1bHRz
UmVuZGVyZXItPmJvcmRlclJpZ2h0KCkgKworICAgICAgICAgICAgICAgICAgcmVzdWx0c1JlbmRl
cmVyLT5wYWRkaW5nTGVmdCgpICsgcmVzdWx0c1JlbmRlcmVyLT5wYWRkaW5nUmlnaHQoKTsKKwor
ICAgIGlmIChSZW5kZXJPYmplY3QqIGNhbmNlbFJlbmRlcmVyID0gbV9jYW5jZWxCdXR0b24gPyBt
X2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSA6IDApCisgICAgICAgIHJlc3VsdCArPSBjYW5jZWxS
ZW5kZXJlci0+Ym9yZGVyTGVmdCgpICsgY2FuY2VsUmVuZGVyZXItPmJvcmRlclJpZ2h0KCkgKwor
ICAgICAgICAgICAgICAgICAgY2FuY2VsUmVuZGVyZXItPnBhZGRpbmdMZWZ0KCkgKyBjYW5jZWxS
ZW5kZXJlci0+cGFkZGluZ1JpZ2h0KCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lk
IFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y2FsY0V4dHJhTGluZUhlaWdodChpbnQgbGlu
ZUhlaWdodCkKK3sKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiByZXN1bHRzUmVuZGVyZXIgPSBtX3Jl
c3VsdHNCdXR0b24gPyBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCkgOiAwKSB7CisgICAgICAg
IHN0YXRpY19jYXN0PFJlbmRlckJsb2NrKj4ocmVzdWx0c1JlbmRlcmVyKS0+Y2FsY0hlaWdodCgp
OworICAgICAgICBtX2hlaWdodCA9IG1heChtX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgcmVzdWx0c1JlbmRlcmVyLT5ib3JkZXJUb3AoKSArIHJlc3VsdHNSZW5kZXJlci0+Ym9yZGVy
Qm90dG9tKCkgKworICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzUmVuZGVyZXItPnBhZGRp
bmdUb3AoKSArIHJlc3VsdHNSZW5kZXJlci0+cGFkZGluZ0JvdHRvbSgpICsKKyAgICAgICAgICAg
ICAgICAgICAgICAgcmVzdWx0c1JlbmRlcmVyLT5tYXJnaW5Ub3AoKSArIHJlc3VsdHNSZW5kZXJl
ci0+bWFyZ2luQm90dG9tKCkpOworICAgICAgICBsaW5lSGVpZ2h0ID0gbWF4KGxpbmVIZWlnaHQs
IHJlc3VsdHNSZW5kZXJlci0+aGVpZ2h0KCkpOworICAgIH0KKworICAgIGlmIChSZW5kZXJPYmpl
Y3QqIGNhbmNlbFJlbmRlcmVyID0gbV9jYW5jZWxCdXR0b24gPyBtX2NhbmNlbEJ1dHRvbi0+cmVu
ZGVyZXIoKSA6IDApIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyQmxvY2sqPihjYW5jZWxS
ZW5kZXJlciktPmNhbGNIZWlnaHQoKTsKKyAgICAgICAgbV9oZWlnaHQgPSBtYXgobV9oZWlnaHQs
CisgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFJlbmRlcmVyLT5ib3JkZXJUb3AoKSArIGNh
bmNlbFJlbmRlcmVyLT5ib3JkZXJCb3R0b20oKSArCisgICAgICAgICAgICAgICAgICAgICAgIGNh
bmNlbFJlbmRlcmVyLT5wYWRkaW5nVG9wKCkgKyBjYW5jZWxSZW5kZXJlci0+cGFkZGluZ0JvdHRv
bSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsUmVuZGVyZXItPm1hcmdpblRvcCgp
ICsgY2FuY2VsUmVuZGVyZXItPm1hcmdpbkJvdHRvbSgpKTsKKyAgICAgICAgbGluZUhlaWdodCA9
IG1heChsaW5lSGVpZ2h0LCBjYW5jZWxSZW5kZXJlci0+aGVpZ2h0KCkpOworICAgIH0KKworICAg
IG1faGVpZ2h0ICs9IGxpbmVIZWlnaHQ7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5n
bGVMaW5lOjpjcmVhdGVTdWJ0cmVlSWZOZWVkZWQoKQoreworICAgIGlmICghc3RhdGljX2Nhc3Q8
SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPmlzU2VhcmNoRmllbGQoKSkgeworICAgICAgICBS
ZW5kZXJUZXh0Q29udHJvbDo6Y3JlYXRlU3VidHJlZUlmTmVlZGVkKG1faW5uZXJCbG9jay5nZXQo
KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1faW5uZXJCbG9jaykgewor
ICAgICAgICAvLyBDcmVhdGUgdGhlIGlubmVyIGJsb2NrIGVsZW1lbnQKKyAgICAgICAgbV9pbm5l
ckJsb2NrID0gbmV3IFRleHRDb250cm9sSW5uZXJFbGVtZW50KGRvY3VtZW50KCksIG5vZGUoKSk7
CisgICAgICAgIG1faW5uZXJCbG9jay0+YXR0YWNoSW5uZXJFbGVtZW50KG5vZGUoKSwgY3JlYXRl
SW5uZXJCbG9ja1N0eWxlKHN0eWxlKCkpLCByZW5kZXJBcmVuYSgpKTsKKyAgICB9CisKKyAgICBp
ZiAoIW1fcmVzdWx0c0J1dHRvbikgeworICAgICAgICAvLyBDcmVhdGUgdGhlIHNlYXJjaCByZXN1
bHRzIGJ1dHRvbiBlbGVtZW50CisgICAgICAgIG1fcmVzdWx0c0J1dHRvbiA9IG5ldyBTZWFyY2hG
aWVsZFJlc3VsdHNCdXR0b25FbGVtZW50KGRvY3VtZW50KCkpOworICAgICAgICBtX3Jlc3VsdHNC
dXR0b24tPmF0dGFjaElubmVyRWxlbWVudChtX2lubmVyQmxvY2suZ2V0KCksIGNyZWF0ZVJlc3Vs
dHNCdXR0b25TdHlsZShtX2lubmVyQmxvY2stPnJlbmRlcmVyKCktPnN0eWxlKCkpLCByZW5kZXJB
cmVuYSgpKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgaW5uZXJUZXh0IGVsZW1lbnQgYmVmb3Jl
IGFkZGluZyB0aGUgY2FuY2VsIGJ1dHRvbgorICAgIFJlbmRlclRleHRDb250cm9sOjpjcmVhdGVT
dWJ0cmVlSWZOZWVkZWQobV9pbm5lckJsb2NrLmdldCgpKTsKKworICAgIGlmICghbV9jYW5jZWxC
dXR0b24pIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBjYW5jZWwgYnV0dG9uIGVsZW1lbnQKKyAg
ICAgICAgbV9jYW5jZWxCdXR0b24gPSBuZXcgU2VhcmNoRmllbGRDYW5jZWxCdXR0b25FbGVtZW50
KGRvY3VtZW50KCkpOworICAgICAgICBtX2NhbmNlbEJ1dHRvbi0+YXR0YWNoSW5uZXJFbGVtZW50
KG1faW5uZXJCbG9jay5nZXQoKSwgY3JlYXRlQ2FuY2VsQnV0dG9uU3R5bGUobV9pbm5lckJsb2Nr
LT5yZW5kZXJlcigpLT5zdHlsZSgpKSwgcmVuZGVyQXJlbmEoKSk7CisgICAgfQorfQorCit2b2lk
IFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6dXBkYXRlRnJvbUVsZW1lbnQoKQoreworICAg
IGNyZWF0ZVN1YnRyZWVJZk5lZWRlZCgpOworICAgIFJlbmRlclRleHRDb250cm9sOjp1cGRhdGVG
cm9tRWxlbWVudCgpOworCisgICAgYm9vbCBwbGFjZWhvbGRlclZpc2liaWxpdHlTaG91bGRDaGFu
Z2UgPSBtX3BsYWNlaG9sZGVyVmlzaWJsZSAhPSBwbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSgp
OworICAgIG1fcGxhY2Vob2xkZXJWaXNpYmxlID0gcGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUo
KTsKKworICAgIGlmIChSZW5kZXJPYmplY3QqIGNhbmNlbEJ1dHRvblJlbmRlcmVyID0gbV9jYW5j
ZWxCdXR0b24gPyBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSA6IDApCisgICAgICAgIHVwZGF0
ZUNhbmNlbEJ1dHRvblZpc2liaWxpdHkoY2FuY2VsQnV0dG9uUmVuZGVyZXItPnN0eWxlKCkpOwor
CisgICAgSFRNTElucHV0RWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnQqPihub2RlKCkpOworCisgICAgaWYgKG1fcGxhY2Vob2xkZXJWaXNpYmxlKSB7CisgICAg
ICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgICAgICBpbm5lclRleHRFbGVtZW50KCktPnNl
dElubmVyVGV4dChlbGVtZW50LT5nZXRBdHRyaWJ1dGUocGxhY2Vob2xkZXJBdHRyKSwgZWMpOwor
ICAgICAgICBBU1NFUlQoZWMgPT0gMCk7CisgICAgfSBlbHNlIGlmICghZWxlbWVudC0+dmFsdWVN
YXRjaGVzUmVuZGVyZXIoKSB8fCBwbGFjZWhvbGRlclZpc2liaWxpdHlTaG91bGRDaGFuZ2UpCisg
ICAgICAgIHVwZGF0ZUlubmVyVGV4dFZhbHVlKGVsZW1lbnQtPnZhbHVlKCkpOworCisgICAgaWYg
KG1fc2VhcmNoUG9wdXBJc1Zpc2libGUpCisgICAgICAgIG1fc2VhcmNoUG9wdXAtPnVwZGF0ZUZy
b21FbGVtZW50KCk7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjYWNo
ZVNlbGVjdGlvbihpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICAgc3RhdGljX2Nhc3Q8SFRNTElu
cHV0RWxlbWVudCo+KG5vZGUoKSktPmNhY2hlU2VsZWN0aW9uKHN0YXJ0LCBlbmQpOworfQorCitQ
YXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0
ZUlubmVyVGV4dFN0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxlKSBjb25zdAorewor
ICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gdGV4dEJsb2NrU3R5bGU7CisgICAgaWYgKHBsYWNlaG9s
ZGVyU2hvdWxkQmVWaXNpYmxlKCkpIHsKKyAgICAgICAgUmVuZGVyU3R5bGUqIHBzZXVkb1N0eWxl
ID0gZ2V0Q2FjaGVkUHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OklOUFVUX1BMQUNFSE9MREVSKTsK
KyAgICAgICAgdGV4dEJsb2NrU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUocHNldWRvU3R5bGUp
OworICAgIH0gZWxzZSB7CisgICAgICAgIHRleHRCbG9ja1N0eWxlID0gUmVuZGVyU3R5bGU6OmNy
ZWF0ZSgpOyAgIAorICAgICAgICB0ZXh0QmxvY2tTdHlsZS0+aW5oZXJpdEZyb20oc3RhcnRTdHls
ZSk7CisgICAgfQorCisgICAgYWRqdXN0SW5uZXJUZXh0U3R5bGUoc3RhcnRTdHlsZSwgdGV4dEJs
b2NrU3R5bGUuZ2V0KCkpOworCisgICAgdGV4dEJsb2NrU3R5bGUtPnNldFdoaXRlU3BhY2UoUFJF
KTsKKyAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0V29yZFdyYXAoTm9ybWFsV29yZFdyYXApOworICAg
IHRleHRCbG9ja1N0eWxlLT5zZXRPdmVyZmxvd1goT0hJRERFTik7CisgICAgdGV4dEJsb2NrU3R5
bGUtPnNldE92ZXJmbG93WShPSElEREVOKTsKKworICAgIC8vIERvIG5vdCBhbGxvdyBsaW5lLWhl
aWdodCB0byBiZSBzbWFsbGVyIHRoYW4gb3VyIGRlZmF1bHQuCisgICAgaWYgKHRleHRCbG9ja1N0
eWxlLT5mb250KCkubGluZVNwYWNpbmcoKSA+IGxpbmVIZWlnaHQodHJ1ZSwgdHJ1ZSkpCisgICAg
ICAgIHRleHRCbG9ja1N0eWxlLT5zZXRMaW5lSGVpZ2h0KExlbmd0aCgtMTAwLjBmLCBQZXJjZW50
KSk7CisKKyAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0RGlzcGxheShtX2lubmVyQmxvY2sgPyBJTkxJ
TkVfQkxPQ0sgOiBCTE9DSyk7CisKKyAgICAvLyBXZSdyZSBhZGRpbmcgb25lIGV4dHJhIHBpeGVs
IG9mIHBhZGRpbmcgdG8gbWF0Y2ggV2luSUUuCisgICAgdGV4dEJsb2NrU3R5bGUtPnNldFBhZGRp
bmdMZWZ0KExlbmd0aCgxLCBGaXhlZCkpOworICAgIHRleHRCbG9ja1N0eWxlLT5zZXRQYWRkaW5n
UmlnaHQoTGVuZ3RoKDEsIEZpeGVkKSk7CisKKyAgICAvLyBXaGVuIHRoZSBwbGFjZWhvbGRlciBp
cyBnb2luZyB0byBiZSBkaXNwbGF5ZWQsIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZSB0ZXh0IHNl
Y3VyaXR5IHRvIGJlICJub25lIi4KKyAgICAvLyBBZnRlciB0aGlzLCB1cGRhdGVGcm9tRWxlbWVu
dCB3aWxsIGltbWVkaWF0ZWx5IHVwZGF0ZSB0aGUgdGV4dCBkaXNwbGF5ZWQuCisgICAgLy8gV2hl
biB0aGUgcGxhY2Vob2xkZXIgaXMgbm8gbG9uZ2VyIHZpc2libGUsIHVwZGF0ZVBsYWNlaG9sZGVy
VmlzaWJsaXR5IHdpbGwgcmVzZXQgdGhlIHN0eWxlLCAKKyAgICAvLyBhbmQgdGhlIHRleHQgc2Vj
dXJpdHkgbW9kZSB3aWxsIGJlIHNldCBiYWNrIHRvIHRoZSBjb21wdXRlZCB2YWx1ZSBjb3JyZWN0
bHkuCisgICAgaWYgKHBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCkpCisgICAgICAgIHRleHRC
bG9ja1N0eWxlLT5zZXRUZXh0U2VjdXJpdHkoVFNOT05FKTsKKworICAgIHJldHVybiB0ZXh0Qmxv
Y2tTdHlsZS5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlclRl
eHRDb250cm9sU2luZ2xlTGluZTo6Y3JlYXRlSW5uZXJCbG9ja1N0eWxlKGNvbnN0IFJlbmRlclN0
eWxlKiBzdGFydFN0eWxlKSBjb25zdAoreworICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gaW5uZXJC
bG9ja1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAgIGlubmVyQmxvY2tTdHlsZS0+
aW5oZXJpdEZyb20oc3RhcnRTdHlsZSk7CisKKyAgICBpbm5lckJsb2NrU3R5bGUtPnNldERpc3Bs
YXkoQkxPQ0spOworICAgIGlubmVyQmxvY2tTdHlsZS0+c2V0RGlyZWN0aW9uKExUUik7CisKKyAg
ICAvLyBXZSBkb24ndCB3YW50IHRoZSBzaGFkb3cgZG9tIHRvIGJlIGVkaXRhYmxlLCBzbyB3ZSBz
ZXQgdGhpcyBibG9jayB0byByZWFkLW9ubHkgaW4gY2FzZSB0aGUgaW5wdXQgaXRzZWxmIGlzIGVk
aXRhYmxlLgorICAgIGlubmVyQmxvY2tTdHlsZS0+c2V0VXNlck1vZGlmeShSRUFEX09OTFkpOwor
CisgICAgcmV0dXJuIGlubmVyQmxvY2tTdHlsZS5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8
UmVuZGVyU3R5bGU+IFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y3JlYXRlUmVzdWx0c0J1
dHRvblN0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxlKSBjb25zdAoreworICAgIEhU
TUxJbnB1dEVsZW1lbnQqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5v
ZGUoKSk7CisKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHJlc3VsdHNCbG9ja1N0eWxlOworICAg
IGlmIChpbnB1dC0+bWF4UmVzdWx0cygpIDwgMCkKKyAgICAgICAgcmVzdWx0c0Jsb2NrU3R5bGUg
PSBnZXRDYWNoZWRQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6U0VBUkNIX0RFQ09SQVRJT04pOwor
ICAgIGVsc2UgaWYgKCFpbnB1dC0+bWF4UmVzdWx0cygpKQorICAgICAgICByZXN1bHRzQmxvY2tT
dHlsZSA9IGdldENhY2hlZFBzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpTRUFSQ0hfUkVTVUxUU19E
RUNPUkFUSU9OKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdHNCbG9ja1N0eWxlID0gZ2V0Q2Fj
aGVkUHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OlNFQVJDSF9SRVNVTFRTX0JVVFRPTik7CisKKyAg
ICBpZiAoIXJlc3VsdHNCbG9ja1N0eWxlKQorICAgICAgICByZXN1bHRzQmxvY2tTdHlsZSA9IFJl
bmRlclN0eWxlOjpjcmVhdGUoKTsKKworICAgIGlmIChzdGFydFN0eWxlKQorICAgICAgICByZXN1
bHRzQmxvY2tTdHlsZS0+aW5oZXJpdEZyb20oc3RhcnRTdHlsZSk7CisKKyAgICByZXR1cm4gcmVz
dWx0c0Jsb2NrU3R5bGUucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBS
ZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZUNhbmNlbEJ1dHRvblN0eWxlKGNvbnN0
IFJlbmRlclN0eWxlKiBzdGFydFN0eWxlKSBjb25zdAoreworICAgIFJlZlB0cjxSZW5kZXJTdHls
ZT4gY2FuY2VsQmxvY2tTdHlsZTsKKyAgICAKKyAgICBpZiAoUmVmUHRyPFJlbmRlclN0eWxlPiBw
c2V1ZG9TdHlsZSA9IGdldENhY2hlZFBzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpTRUFSQ0hfQ0FO
Q0VMX0JVVFRPTikpCisgICAgICAgIC8vIFdlIG1heSBiZSBzaGFyaW5nIHN0eWxlIHdpdGggYW5v
dGhlciBzZWFyY2ggZmllbGQsIGJ1dCB3ZSBtdXN0IG5vdCBzaGFyZSB0aGUgY2FuY2VsIGJ1dHRv
biBzdHlsZS4KKyAgICAgICAgY2FuY2VsQmxvY2tTdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9uZShw
c2V1ZG9TdHlsZS5nZXQoKSk7CisgICAgZWxzZQorICAgICAgICBjYW5jZWxCbG9ja1N0eWxlID0g
UmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworCisgICAgaWYgKHN0YXJ0U3R5bGUpCisgICAgICAgIGNh
bmNlbEJsb2NrU3R5bGUtPmluaGVyaXRGcm9tKHN0YXJ0U3R5bGUpOworCisgICAgdXBkYXRlQ2Fu
Y2VsQnV0dG9uVmlzaWJpbGl0eShjYW5jZWxCbG9ja1N0eWxlLmdldCgpKTsKKyAgICByZXR1cm4g
Y2FuY2VsQmxvY2tTdHlsZS5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lOjp1cGRhdGVDYW5jZWxCdXR0b25WaXNpYmlsaXR5KFJlbmRlclN0eWxlKiBzdHls
ZSkgY29uc3QKK3sKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dCA9IHN0YXRpY19jYXN0PEhU
TUxJbnB1dEVsZW1lbnQqPihub2RlKCkpOworICAgIHN0eWxlLT5zZXRWaXNpYmlsaXR5KGlucHV0
LT52YWx1ZSgpLmlzRW1wdHkoKSA/IEhJRERFTiA6IFZJU0lCTEUpOworfQorCitjb25zdCBBdG9t
aWNTdHJpbmcmIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6YXV0b3NhdmVOYW1lKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUoKSktPmdldEF0dHJp
YnV0ZShhdXRvc2F2ZUF0dHIpOworfQorCit2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGlu
ZTo6c3RhcnRTZWFyY2hFdmVudFRpbWVyKCkKK3sKKyAgICB1bnNpZ25lZCBsZW5ndGggPSB0ZXh0
KCkubGVuZ3RoKCk7CisKKyAgICAvLyBJZiB0aGVyZSdzIG5vIHRleHQsIGZpcmUgdGhlIGV2ZW50
IHJpZ2h0IGF3YXkuCisgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgc3RvcFNlYXJjaEV2ZW50
VGltZXIoKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSkt
Pm9uU2VhcmNoKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBBZnRlciB0eXBp
bmcgdGhlIGZpcnN0IGtleSwgd2Ugd2FpdCAwLjUgc2Vjb25kcy4KKyAgICAvLyBBZnRlciB0aGUg
c2Vjb25kIGtleSwgMC40IHNlY29uZHMsIHRoZW4gMC4zLCB0aGVuIDAuMiBmcm9tIHRoZW4gb24u
CisgICAgbV9zZWFyY2hFdmVudFRpbWVyLnN0YXJ0T25lU2hvdChtYXgoMC4yLCAwLjYgLSAwLjEg
KiBsZW5ndGgpKTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNlYXJj
aEV2ZW50VGltZXJGaXJlZChUaW1lcjxSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU+KikKK3sK
KyAgICBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+b25TZWFyY2goKTsK
K30KKworLy8gUG9wdXBNZW51Q2xpZW50IG1ldGhvZHMKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lOjp2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBib29sIGZpcmVFdmVu
dHMpCit7CisgICAgQVNTRVJUKHN0YXRpY19jYXN0PGludD4obGlzdEluZGV4KSA8IGxpc3RTaXpl
KCkpOworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0
RWxlbWVudCo+KG5vZGUoKSk7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4obGlzdEluZGV4KSA9
PSAobGlzdFNpemUoKSAtIDEpKSB7CisgICAgICAgIGlmIChmaXJlRXZlbnRzKSB7CisgICAgICAg
ICAgICBtX3JlY2VudFNlYXJjaGVzLmNsZWFyKCk7CisgICAgICAgICAgICBjb25zdCBBdG9taWNT
dHJpbmcmIG5hbWUgPSBhdXRvc2F2ZU5hbWUoKTsKKyAgICAgICAgICAgIGlmICghbmFtZS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1fc2VhcmNoUG9wdXApCisgICAgICAgICAg
ICAgICAgICAgIG1fc2VhcmNoUG9wdXAgPSBTZWFyY2hQb3B1cE1lbnU6OmNyZWF0ZSh0aGlzKTsK
KyAgICAgICAgICAgICAgICBtX3NlYXJjaFBvcHVwLT5zYXZlUmVjZW50U2VhcmNoZXMobmFtZSwg
bV9yZWNlbnRTZWFyY2hlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2Ug
eworICAgICAgICBpbnB1dC0+c2V0VmFsdWUoaXRlbVRleHQobGlzdEluZGV4KSk7CisgICAgICAg
IGlmIChmaXJlRXZlbnRzKQorICAgICAgICAgICAgaW5wdXQtPm9uU2VhcmNoKCk7CisgICAgICAg
IGlucHV0LT5zZWxlY3QoKTsKKyAgICB9Cit9CisKK1N0cmluZyBSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmU6Oml0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICBpbnQg
c2l6ZSA9IGxpc3RTaXplKCk7CisgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICBBU1NFUlQo
IWxpc3RJbmRleCk7CisgICAgICAgIHJldHVybiBzZWFyY2hNZW51Tm9SZWNlbnRTZWFyY2hlc1Rl
eHQoKTsKKyAgICB9CisgICAgaWYgKCFsaXN0SW5kZXgpCisgICAgICAgIHJldHVybiBzZWFyY2hN
ZW51UmVjZW50U2VhcmNoZXNUZXh0KCk7CisgICAgaWYgKGl0ZW1Jc1NlcGFyYXRvcihsaXN0SW5k
ZXgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisgICAgaWYgKHN0YXRpY19jYXN0PGludD4o
bGlzdEluZGV4KSA9PSAoc2l6ZSAtIDEpKQorICAgICAgICByZXR1cm4gc2VhcmNoTWVudUNsZWFy
UmVjZW50U2VhcmNoZXNUZXh0KCk7CisgICAgcmV0dXJuIG1fcmVjZW50U2VhcmNoZXNbbGlzdElu
ZGV4IC0gMV07Cit9CisKK2Jvb2wgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjppdGVtSXNF
bmFibGVkKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICAgaWYgKCFsaXN0SW5kZXgg
fHwgaXRlbUlzU2VwYXJhdG9yKGxpc3RJbmRleCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworUG9wdXBNZW51U3R5bGUgUmVuZGVyVGV4dENvbnRyb2xTaW5n
bGVMaW5lOjppdGVtU3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAoreworICAgIHJldHVy
biBtZW51U3R5bGUoKTsKK30KKworUG9wdXBNZW51U3R5bGUgUmVuZGVyVGV4dENvbnRyb2xTaW5n
bGVMaW5lOjptZW51U3R5bGUoKSBjb25zdAoreworICAgIHJldHVybiBQb3B1cE1lbnVTdHlsZShz
dHlsZSgpLT5jb2xvcigpLCBzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+Zm9u
dCgpLCBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSk7Cit9CisKK2ludCBSZW5kZXJU
ZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNsaWVudEluc2V0TGVmdCgpIGNvbnN0Cit7CisgICAgLy8g
SW5zZXQgdGhlIG1lbnUgYnkgdGhlIHJhZGl1cyBvZiB0aGUgY2FwIG9uIHRoZSBsZWZ0IHNvIHRo
YXQKKyAgICAvLyBpdCBvbmx5IHJ1bnMgYWxvbmcgdGhlIHN0cmFpZ2h0IHBhcnQgb2YgdGhlIGJl
emVsLgorICAgIHJldHVybiBoZWlnaHQoKSAvIDI7Cit9CisKK2ludCBSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6OmNsaWVudEluc2V0UmlnaHQoKSBjb25zdAoreworICAgIC8vIEluc2V0IHRo
ZSBtZW51IGJ5IHRoZSByYWRpdXMgb2YgdGhlIGNhcCBvbiB0aGUgcmlnaHQgc28gdGhhdAorICAg
IC8vIGl0IG9ubHkgcnVucyBhbG9uZyB0aGUgc3RyYWlnaHQgcGFydCBvZiB0aGUgYmV6ZWwgKHVu
bGVzcyBpdCBuZWVkcworICAgIC8vIHRvIGJlIHdpZGVyKS4KKyAgICByZXR1cm4gaGVpZ2h0KCkg
LyAyOworfQorCitpbnQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjbGllbnRQYWRkaW5n
TGVmdCgpIGNvbnN0Cit7CisgICAgaW50IHBhZGRpbmcgPSBjbGllbnRQYWRkaW5nTGVmdCgpOwor
CisgICAgaWYgKFJlbmRlck9iamVjdCogcmVzdWx0c1JlbmRlcmVyID0gbV9yZXN1bHRzQnV0dG9u
ID8gbV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpIDogMCkKKyAgICAgICAgcGFkZGluZyArPSBy
ZXN1bHRzUmVuZGVyZXItPndpZHRoKCk7CisKKyAgICByZXR1cm4gcGFkZGluZzsKK30KKworaW50
IFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y2xpZW50UGFkZGluZ1JpZ2h0KCkgY29uc3QK
K3sKKyAgICBpbnQgcGFkZGluZyA9IGNsaWVudFBhZGRpbmdSaWdodCgpOworCisgICAgaWYgKFJl
bmRlck9iamVjdCogY2FuY2VsUmVuZGVyZXIgPSBtX2NhbmNlbEJ1dHRvbiA/IG1fY2FuY2VsQnV0
dG9uLT5yZW5kZXJlcigpIDogMCkKKyAgICAgICAgcGFkZGluZyArPSBjYW5jZWxSZW5kZXJlci0+
d2lkdGgoKTsKKworICAgIHJldHVybiBwYWRkaW5nOworfQorCitpbnQgUmVuZGVyVGV4dENvbnRy
b2xTaW5nbGVMaW5lOjpsaXN0U2l6ZSgpIGNvbnN0Cit7CisgICAgLy8gSWYgdGhlcmUgYXJlIG5v
IHJlY2VudCBzZWFyY2hlcywgdGhlbiBvdXIgbWVudSB3aWxsIGhhdmUgMSAiTm8gcmVjZW50IHNl
YXJjaGVzIiBpdGVtLgorICAgIGlmICghbV9yZWNlbnRTZWFyY2hlcy5zaXplKCkpCisgICAgICAg
IHJldHVybiAxOworICAgIC8vIE90aGVyd2lzZSwgbGVhdmUgcm9vbSBpbiB0aGUgbWVudSBmb3Ig
YSBoZWFkZXIsIGEgc2VwYXJhdG9yLCBhbmQgdGhlICJDbGVhciByZWNlbnQgc2VhcmNoZXMiIGl0
ZW0uCisgICAgcmV0dXJuIG1fcmVjZW50U2VhcmNoZXMuc2l6ZSgpICsgMzsKK30KKworaW50IFJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6c2VsZWN0ZWRJbmRleCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIC0xOworfQorCitib29sIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6aXRlbUlz
U2VwYXJhdG9yKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgIC8vIFRoZSBzZXBhcmF0
b3Igd2lsbCBiZSB0aGUgc2Vjb25kIHRvIGxhc3QgaXRlbSBpbiBvdXIgbGlzdC4KKyAgIHJldHVy
biBzdGF0aWNfY2FzdDxpbnQ+KGxpc3RJbmRleCkgPT0gKGxpc3RTaXplKCkgLSAyKTsKK30KKwor
Ym9vbCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6Oml0ZW1Jc0xhYmVsKHVuc2lnbmVkIGxp
c3RJbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4gbGlzdEluZGV4ID09IDA7Cit9CisKK2Jvb2wg
UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjppdGVtSXNTZWxlY3RlZCh1bnNpZ25lZCkgY29u
c3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5n
bGVMaW5lOjpzZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQgbGlzdEluZGV4KQoreworICAgIHN0YXRp
Y19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5zZXRWYWx1ZShpdGVtVGV4dChsaXN0
SW5kZXgpKTsKK30KKworRm9udFNlbGVjdG9yKiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
OmZvbnRTZWxlY3RvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGRvY3VtZW50KCktPnN0eWxlU2Vs
ZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Cit9CisKK0hvc3RXaW5kb3cqIFJlbmRlclRleHRDb250
cm9sU2luZ2xlTGluZTo6aG9zdFdpbmRvdygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGRvY3VtZW50
KCktPnZpZXcoKS0+aG9zdFdpbmRvdygpOworfQorCitQYXNzUmVmUHRyPFNjcm9sbGJhcj4gUmVu
ZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjcmVhdGVTY3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50
KiBjbGllbnQsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250
cm9sU2l6ZSBjb250cm9sU2l6ZSkKK3sKKyAgICBSZWZQdHI8U2Nyb2xsYmFyPiB3aWRnZXQ7Cisg
ICAgYm9vbCBoYXNDdXN0b21TY3JvbGxiYXJTdHlsZSA9IHN0eWxlKCktPmhhc1BzZXVkb1N0eWxl
KFJlbmRlclN0eWxlOjpTQ1JPTExCQVIpOworICAgIGlmIChoYXNDdXN0b21TY3JvbGxiYXJTdHls
ZSkKKyAgICAgICAgd2lkZ2V0ID0gUmVuZGVyU2Nyb2xsYmFyOjpjcmVhdGVDdXN0b21TY3JvbGxi
YXIoY2xpZW50LCBvcmllbnRhdGlvbiwgdGhpcyk7CisgICAgZWxzZQorICAgICAgICB3aWRnZXQg
PSBTY3JvbGxiYXI6OmNyZWF0ZU5hdGl2ZVNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBj
b250cm9sU2l6ZSk7CisgICAgcmV0dXJuIHdpZGdldC5yZWxlYXNlKCk7Cit9CisKK30KSW5kZXg6
IHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBy
ZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmgJKHJldmlzaW9uIDApCisrKyBy
ZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmgJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRvcmNoIE1vYmlsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisj
aWZuZGVmIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZV9oCisjZGVmaW5lIFJlbmRlclRleHRD
b250cm9sU2luZ2xlTGluZV9oCisKKyNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIKKyNpbmNs
dWRlICJSZW5kZXJUZXh0Q29udHJvbC5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworY2xhc3MgU2VhcmNoRmllbGRDYW5jZWxCdXR0b25FbGVtZW50OworY2xh
c3MgU2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uRWxlbWVudDsKK2NsYXNzIFNlYXJjaFBvcHVwTWVu
dTsKK2NsYXNzIFRleHRDb250cm9sSW5uZXJFbGVtZW50OworCitjbGFzcyBSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmUgOiBwdWJsaWMgUmVuZGVyVGV4dENvbnRyb2wKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAsIHByaXZhdGUgUG9wdXBNZW51Q2xpZW50IHsKK3B1YmxpYzoK
KyAgICBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUoTm9kZSopOworICAgIHZpcnR1YWwgflJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZSgpOworCisgICAgdmlydHVhbCBib29sIGhhc0NvbnRy
b2xDbGlwKCkgY29uc3QgeyByZXR1cm4gbV9jYW5jZWxCdXR0b247IH0KKyAgICB2aXJ0dWFsIGJv
b2wgaXNUZXh0RmllbGQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICBib29sIHBsYWNl
aG9sZGVySXNWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gbV9wbGFjZWhvbGRlclZpc2libGU7IH0K
KyAgICBib29sIHBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCkgY29uc3Q7CisgICAgdm9pZCB1
cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHkoKTsKKworICAgIHZvaWQgYWRkU2VhcmNoUmVzdWx0
KCk7CisgICAgdm9pZCBzdG9wU2VhcmNoRXZlbnRUaW1lcigpOworCisgICAgYm9vbCBwb3B1cElz
VmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2VhcmNoUG9wdXBJc1Zpc2libGU7IH0KKyAgICB2
b2lkIHNob3dQb3B1cCgpOworICAgIHZpcnR1YWwgdm9pZCBoaWRlUG9wdXAoKTsgLy8gUG9wdXBN
ZW51Q2xpZW50IG1ldGhvZAorCisgICAgdmlydHVhbCB2b2lkIHN1YnRyZWVIYXNDaGFuZ2VkKCk7
CisgICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKKyAg
ICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQo
Y29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQg
dHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbik7CisgICAgdmlydHVhbCB2b2lkIGZvcndhcmRFdmVu
dChFdmVudCopOworCitwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzU3R5bGVDaGFu
Z2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2Fwc0xvY2tTdGF0ZU1heUhhdmVDaGFuZ2VkKCk7CisK
KyAgICBpbnQgdGV4dEJsb2NrV2lkdGgoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBwcmVmZXJy
ZWRXaWR0aChmbG9hdCBjaGFyV2lkdGgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBjYWxjRXh0
cmFMaW5lSGVpZ2h0KGludCBsaW5lSGVpZ2h0KTsKKworICAgIHZvaWQgY3JlYXRlU3VidHJlZUlm
TmVlZGVkKCk7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7CisgICAgdmly
dHVhbCB2b2lkIGNhY2hlU2VsZWN0aW9uKGludCBzdGFydCwgaW50IGVuZCk7CisKKyAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGNyZWF0ZUlubmVyVGV4dFN0eWxlKGNvbnN0IFJl
bmRlclN0eWxlKiBzdGFydFN0eWxlKSBjb25zdDsKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxl
PiBjcmVhdGVJbm5lckJsb2NrU3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpIGNv
bnN0OworICAgIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IGNyZWF0ZVJlc3VsdHNCdXR0b25TdHls
ZShjb25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSkgY29uc3Q7CisgICAgUGFzc1JlZlB0cjxS
ZW5kZXJTdHlsZT4gY3JlYXRlQ2FuY2VsQnV0dG9uU3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0
YXJ0U3R5bGUpIGNvbnN0OworCisgICAgdm9pZCB1cGRhdGVDYW5jZWxCdXR0b25WaXNpYmlsaXR5
KFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBhdXRvc2F2ZU5h
bWUoKSBjb25zdDsKKworICAgIHZvaWQgc3RhcnRTZWFyY2hFdmVudFRpbWVyKCk7CisgICAgdm9p
ZCBzZWFyY2hFdmVudFRpbWVyRmlyZWQoVGltZXI8UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5l
PiopOworCitwcml2YXRlOgorICAgIC8vIFBvcHVwTWVudUNsaWVudCBtZXRob2RzCisgICAgdmly
dHVhbCB2b2lkIHZhbHVlQ2hhbmdlZCh1bnNpZ25lZCBsaXN0SW5kZXgsIGJvb2wgZmlyZUV2ZW50
cyA9IHRydWUpOworICAgIHZpcnR1YWwgU3RyaW5nIGl0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRl
eCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGl0ZW1Jc0VuYWJsZWQodW5zaWduZWQgbGlzdElu
ZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIFBvcHVwTWVudVN0eWxlIGl0ZW1TdHlsZSh1bnNpZ25l
ZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgUG9wdXBNZW51U3R5bGUgbWVudVN0eWxl
KCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgY2xpZW50SW5zZXRMZWZ0KCkgY29uc3Q7CisgICAg
dmlydHVhbCBpbnQgY2xpZW50SW5zZXRSaWdodCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGNs
aWVudFBhZGRpbmdMZWZ0KCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgY2xpZW50UGFkZGluZ1Jp
Z2h0KCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgbGlzdFNpemUoKSBjb25zdDsKKyAgICB2aXJ0
dWFsIGludCBzZWxlY3RlZEluZGV4KCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGl0ZW1Jc1Nl
cGFyYXRvcih1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpdGVt
SXNMYWJlbCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpdGVt
SXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBz
aG91bGRQb3BPdmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wg
dmFsdWVTaG91bGRDaGFuZ2VPbkhvdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0VGV4dEZyb21JdGVtKHVuc2lnbmVkIGxpc3RJbmRleCk7CisgICAg
dmlydHVhbCBGb250U2VsZWN0b3IqIGZvbnRTZWxlY3RvcigpIGNvbnN0OworICAgIHZpcnR1YWwg
SG9zdFdpbmRvdyogaG9zdFdpbmRvdygpIGNvbnN0OworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxT
Y3JvbGxiYXI+IGNyZWF0ZVNjcm9sbGJhcihTY3JvbGxiYXJDbGllbnQqLCBTY3JvbGxiYXJPcmll
bnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUpOworCitwcml2YXRlOgorICAgIGJvb2wgbV9w
bGFjZWhvbGRlclZpc2libGUgOiAxOworICAgIGJvb2wgbV9zZWFyY2hQb3B1cElzVmlzaWJsZSA6
IDE7CisgICAgYm9vbCBtX3Nob3VsZERyYXdDYXBzTG9ja0luZGljYXRvciA6IDE7CisKKyAgICBS
ZWZQdHI8VGV4dENvbnRyb2xJbm5lckVsZW1lbnQ+IG1faW5uZXJCbG9jazsKKyAgICBSZWZQdHI8
U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uRWxlbWVudD4gbV9yZXN1bHRzQnV0dG9uOworICAgIFJl
ZlB0cjxTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbkVsZW1lbnQ+IG1fY2FuY2VsQnV0dG9uOworCisg
ICAgVGltZXI8UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lPiBtX3NlYXJjaEV2ZW50VGltZXI7
CisgICAgUmVmUHRyPFNlYXJjaFBvcHVwTWVudT4gbV9zZWFyY2hQb3B1cDsKKyAgICBtdXRhYmxl
IFZlY3RvcjxTdHJpbmc+IG1fcmVjZW50U2VhcmNoZXM7Cit9OworCit9CisKKyNlbmRpZgpJbmRl
eDogcmVuZGVyaW5nL1RleHRDb250cm9sSW5uZXJFbGVtZW50cy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
cmVuZGVyaW5nL1RleHRDb250cm9sSW5uZXJFbGVtZW50cy5jcHAJKHJldmlzaW9uIDM5NDc0KQor
KysgcmVuZGVyaW5nL1RleHRDb250cm9sSW5uZXJFbGVtZW50cy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJIVE1M
VGV4dEFyZWFFbGVtZW50LmgiCiAjaW5jbHVkZSAiTW91c2VFdmVudC5oIgotI2luY2x1ZGUgIlJl
bmRlclRleHRDb250cm9sLmgiCisjaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5l
LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNDksOCArNDksMTIgQEAgcHVibGljOgog
Ym9vbCBSZW5kZXJUZXh0Q29udHJvbElubmVyQmxvY2s6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRl
c3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwg
aW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbikKIHsKICAgICBSZW5k
ZXJUZXh0Q29udHJvbCogcmVuZGVyZXIgPSBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbCo+
KG5vZGUoKS0+c2hhZG93QW5jZXN0b3JOb2RlKCktPnJlbmRlcmVyKCkpOwotICAgIAotICAgIHJl
dHVybiBSZW5kZXJCbG9jazo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwg
dHksIHJlbmRlcmVyLT5wbGFjZWhvbGRlcklzVmlzaWJsZSgpID8gSGl0VGVzdEJsb2NrQmFja2dy
b3VuZCA6IGhpdFRlc3RBY3Rpb24pOworCisgICAgYm9vbCBwbGFjZWhvbGRlcklzVmlzaWJsZSA9
IGZhbHNlOworICAgIGlmIChyZW5kZXJlci0+aXNUZXh0RmllbGQoKSkKKyAgICAgICAgcGxhY2Vo
b2xkZXJJc1Zpc2libGUgPSBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUq
PihyZW5kZXJlciktPnBsYWNlaG9sZGVySXNWaXNpYmxlKCk7CisKKyAgICByZXR1cm4gUmVuZGVy
QmxvY2s6Om5vZGVBdFBvaW50KHJlcXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5LCBwbGFjZWhv
bGRlcklzVmlzaWJsZSA/IEhpdFRlc3RCbG9ja0JhY2tncm91bmQgOiBoaXRUZXN0QWN0aW9uKTsK
IH0KIAogVGV4dENvbnRyb2xJbm5lckVsZW1lbnQ6OlRleHRDb250cm9sSW5uZXJFbGVtZW50KERv
Y3VtZW50KiBkb2MsIE5vZGUqIHNoYWRvd1BhcmVudCkKQEAgLTEyNCwxMCArMTI4LDE0IEBAIHZv
aWQgU2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uRWxlbWVudDo6ZGUKICAgICBpZiAoZXZ0LT50eXBl
KCkgPT0gZXZlbnROYW1lcygpLm1vdXNlZG93bkV2ZW50ICYmIGV2dC0+aXNNb3VzZUV2ZW50KCkg
JiYgc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2dCktPmJ1dHRvbigpID09IExlZnRCdXR0b24p
IHsKICAgICAgICAgaW5wdXQtPmZvY3VzKCk7CiAgICAgICAgIGlucHV0LT5zZWxlY3QoKTsKLSAg
ICAgICAgaWYgKGlucHV0ICYmIGlucHV0LT5yZW5kZXJlcigpICYmIHN0YXRpY19jYXN0PFJlbmRl
clRleHRDb250cm9sKj4oaW5wdXQtPnJlbmRlcmVyKCkpLT5wb3B1cElzVmlzaWJsZSgpKQotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihpbnB1dC0+cmVuZGVyZXIo
KSktPmhpZGVQb3B1cCgpOwotICAgICAgICBlbHNlIGlmIChpbnB1dC0+bWF4UmVzdWx0cygpID4g
MCkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRDb250cm9sKj4oaW5wdXQtPnJl
bmRlcmVyKCkpLT5zaG93UG9wdXAoKTsKKyAgICAgICAgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVM
aW5lKiByZW5kZXJlciA9IHN0YXRpY19jYXN0PFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZSo+
KGlucHV0LT5yZW5kZXJlcigpKTsKKyAgICAgICAgQVNTRVJUKHJlbmRlcmVyKTsKKyAgICAgICAg
aWYgKHJlbmRlcmVyLT5wb3B1cElzVmlzaWJsZSgpKQorICAgICAgICAgICAgcmVuZGVyZXItPmhp
ZGVQb3B1cCgpOworICAgICAgICBlbHNlIGlmIChpbnB1dC0+bWF4UmVzdWx0cygpID4gMCkgewor
ICAgICAgICAgICAgQVNTRVJUKCFyZW5kZXJlci0+cG9wdXBJc1Zpc2libGUoKSk7CisgICAgICAg
ICAgICByZW5kZXJlci0+c2hvd1BvcHVwKCk7CisgICAgICAgIH0KICAgICAgICAgZXZ0LT5zZXRE
ZWZhdWx0SGFuZGxlZCgpOwogICAgIH0KICAgICBpZiAoIWV2dC0+ZGVmYXVsdEhhbmRsZWQoKSkK
</data>
<flag name="review"
          id="12417"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26272</attachid>
            <date>2008-12-27 16:36:38 -0800</date>
            <delta_ts>2008-12-27 21:38:16 -0800</delta_ts>
            <desc>Updated patch</desc>
            <filename>Render.diff</filename>
            <type>text/plain</type>
            <size>112858</size>
            <attacher name="Nikolas Zimmermann">zimmermann</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDM5NDg2
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTM0IEBACisyMDA4LTEy
LTI1ICBOaWtvbGFzIFppbW1lcm1hbm4gIDxuaWtvbGFzLnppbW1lcm1hbm5AdG9yY2htb2JpbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZp
eGVzOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI5OTYKKworICAg
ICAgICBSZW5kZXJUZXh0Q29udHJvbCBoZWF2aWx5IGRlcGVuZHMgb24gSFRNTElucHV0RWxlbWVu
dCAmIEhUTUxUZXh0QXJlYUVsZW1lbnQuCisgICAgICAgIEl0IGhhbmRsZXMgbXVsdGkgJiBzaW5n
bGUgbGluZSB0ZXh0IGNvbnRyb2wgcmVuZGVyaW5nIGluIG9uZSBjbGFzcy4gU3BsaXQgdXAKKyAg
ICAgICAgaW4gdHdvIG5ldyBjbGFzc2VzOiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUgJiBS
ZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZS4KKworICAgICAgICBUaGlzIGhhcyBzZXZlcmFsIGJl
bmVmaXRzIC0gY29kZSBpcyBtb3JlIHJlYWRhYmxlIG5vdywgdGhlIG1lbW9yeSB1c2FnZQorICAg
ICAgICBmb3IgUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUgaXMgcmVkdWNlZCwgYXMgYWxsIHN0
dWZmIHJlbGF0ZWQgdG8gc2VhcmNoIGZpZWxkcworICAgICAgICBsaXZlcyBpbiBSZW5kZXJUZXh0
Q29udHJvbFNpbmdsZUxpbmUsIGFuZCBpdCdzIGVhc2llciB0byBpbnRyb2R1Y2UgYW4KKyAgICAg
ICAgYWJzdHJhY3Rpb24gZm9yIGlucHV0L3RleHRhcmVhLWxpa2UgZWxlbWVudHMgZm9yIG90aGVy
IEhUTUwgZmxhdm91cnMgbGlrZSBXTUwuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbToKKyAg
ICAgICAgKiBXZWJDb3JlLm9yZGVyOgorICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAq
IFdlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBXZWJDb3JlU291cmNlcy5ia2w6CisgICAg
ICAgICogaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJ
bnB1dEVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxJbnB1
dEVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTElu
cHV0RWxlbWVudDo6dXBkYXRlUGxhY2Vob2xkZXJWaXNpYmlsaXR5KToKKyAgICAgICAgKFdlYkNv
cmU6OkhUTUxJbnB1dEVsZW1lbnQ6OmFkZFNlYXJjaFJlc3VsdCk6CisgICAgICAgIChXZWJDb3Jl
OjpIVE1MSW5wdXRFbGVtZW50OjpvblNlYXJjaCk6CisgICAgICAgICogaHRtbC9IVE1MVGV4dEFy
ZWFFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUZXh0QXJlYUVsZW1lbnQ6OmNy
ZWF0ZVJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxUZXh0QXJlYUVsZW1lbnQ6OmRl
ZmF1bHRFdmVudEhhbmRsZXIpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJv
bC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6UmVuZGVyVGV4dENv
bnRyb2wpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6On5SZW5kZXJUZXh0
Q29udHJvbCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6c3R5bGVEaWRD
aGFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OmFkanVzdElubmVy
VGV4dFN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sOjpjcmVhdGVT
dWJ0cmVlSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OnRl
eHRCbG9ja0hlaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6dGV4
dEJsb2NrV2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OnVwZGF0
ZUZyb21FbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sOjpzZXRJ
bm5lclRleHRWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6c2V0
U2VsZWN0aW9uUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OnZp
c2libGVQb3NpdGlvbkZvckluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250
cm9sOjppbmRleEZvclZpc2libGVQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
ZXh0Q29udHJvbDo6c3VidHJlZUhhc0NoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2w6OnNjcm9sbGJhclRoaWNrbmVzcyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUZXh0Q29udHJvbDo6Y2FsY0hlaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0
Q29udHJvbDo6aGl0SW5uZXJUZXh0QmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4
dENvbnRyb2w6OmZvcndhcmRFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29u
dHJvbDo6Y2FsY1ByZWZXaWR0aHMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRy
b2w6OnNlbGVjdGlvbkNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRy
b2w6OmlubmVyVGV4dEVsZW1lbnQpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29u
dHJvbC5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6Omhhc0NvbnRyb2xD
bGlwKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sOjpjYW5IYXZlQ2hpbGRy
ZW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OmF2b2lkc0Zsb2F0cyk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbDo6aXNFZGl0ZWQpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2w6OnNldEVkaXRlZCk6CisgICAgICAgICogcmVu
ZGVyaW5nL1JlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6UmVuZGVyVGV4dENvbnRyb2xNdWx0
aUxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6On5S
ZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0
Q29udHJvbE11bHRpTGluZTo6c3VidHJlZUhhc0NoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6OmxheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6bm9kZUF0UG9pbnQpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6OmZvcndhcmRFdmVudCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6cHJlZmVycmVkQ29udGVudFdpZHRo
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lOjphZGp1c3RD
b250cm9sSGVpZ2h0QmFzZWRPbkxpbmVIZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2xNdWx0aUxpbmU6OmJhc2VsaW5lUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6OnVwZGF0ZUZyb21FbGVtZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lOjpjYWNoZVNlbGVjdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6Y3JlYXRlSW5u
ZXJUZXh0U3R5bGUpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbE11bHRp
TGluZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sTXVsdGlM
aW5lOjppc1RleHRBcmVhKToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZSk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6On5SZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpw
bGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0
Q29udHJvbFNpbmdsZUxpbmU6OnVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmFkZFNlYXJjaFJlc3VsdCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnN0b3BTZWFy
Y2hFdmVudFRpbWVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xl
TGluZTo6c2hvd1BvcHVwKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZTo6aGlkZVBvcHVwKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9s
U2luZ2xlTGluZTo6c3VidHJlZUhhc0NoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lOjpwYWludCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
ZXh0Q29udHJvbFNpbmdsZUxpbmU6OmxheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
ZXh0Q29udHJvbFNpbmdsZUxpbmU6Om5vZGVBdFBvaW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Zm9yd2FyZEV2ZW50KToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6c3R5bGVEaWRDaGFuZ2UpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjYXBzTG9ja1N0YXRlTWF5
SGF2ZUNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVM
aW5lOjp0ZXh0QmxvY2tXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6OnByZWZlcnJlZENvbnRlbnRXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmFkanVzdENvbnRyb2xIZWlnaHRCYXNlZE9uTGlu
ZUhlaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
OmNyZWF0ZVN1YnRyZWVJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmU6OnVwZGF0ZUZyb21FbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y2FjaGVTZWxlY3Rpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjcmVhdGVJbm5lclRleHRTdHlsZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZUlu
bmVyQmxvY2tTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmU6OmNyZWF0ZVJlc3VsdHNCdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZUNhbmNlbEJ1dHRvblN0eWxlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6dXBkYXRlQ2FuY2VsQnV0
dG9uVmlzaWJpbGl0eSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmU6OmF1dG9zYXZlTmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6OnN0YXJ0U2VhcmNoRXZlbnRUaW1lcik6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNlYXJjaEV2ZW50VGltZXJGaXJlZCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnZhbHVlQ2hhbmdlZCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6Oml0ZW1UZXh0
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6aXRlbUlz
RW5hYmxlZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
Oml0ZW1TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmU6Om1lbnVTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmds
ZUxpbmU6OmNsaWVudEluc2V0TGVmdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmU6OmNsaWVudEluc2V0UmlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjbGllbnRQYWRkaW5nTGVmdCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNsaWVudFBhZGRpbmdSaWdodCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6Omxpc3RTaXpl
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6c2VsZWN0
ZWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
Oml0ZW1Jc1NlcGFyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmU6Oml0ZW1Jc0xhYmVsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250
cm9sU2luZ2xlTGluZTo6aXRlbUlzU2VsZWN0ZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzZXRUZXh0RnJvbUl0ZW0pOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpmb250U2VsZWN0b3IpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpob3N0V2luZG93KToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y3JlYXRlU2Nyb2xsYmFy
KToKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpoYXND
b250cm9sQ2xpcCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmU6OmlzVGV4dEZpZWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZTo6cGxhY2Vob2xkZXJJc1Zpc2libGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lOjpwb3B1cElzVmlzaWJsZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNob3VsZFBvcE92ZXIpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjp2YWx1ZVNob3VsZENoYW5nZU9u
SG90VHJhY2spOgorICAgICAgICAqIHJlbmRlcmluZy9UZXh0Q29udHJvbElubmVyRWxlbWVudHMu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGV4dENvbnRyb2xJbm5lckJsb2NrOjpub2Rl
QXRQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25FbGVt
ZW50OjpkZWZhdWx0RXZlbnRIYW5kbGVyKToKKwogMjAwOC0xMi0yNiAgWmFsYW4gQnVqdGFzICA8
emJ1anRhc0BnbWFpbC5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCklu
ZGV4OiBHTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBHTlVtYWtlZmlsZS5hbQkocmV2aXNp
b24gMzk0ODYpCisrKyBHTlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5KQpAQCAtMTU2Miw2ICsx
NTYyLDEwIEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
VGV4dC5oIFwKIAlXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbC5jcHAgXAogCVdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sLmggXAorCVdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmNwcCBcCisJV2ViQ29yZS9yZW5kZXJpbmcvUmVu
ZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuaCBcCisJV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lLmNwcCBcCisJV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGV4dENv
bnRyb2xTaW5nbGVMaW5lLmggXAogCVdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHRGcmFnbWVu
dC5jcHAgXAogCVdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRleHRGcmFnbWVudC5oIFwKIAlXZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJUaGVtZS5jcHAgXApJbmRleDogV2ViQ29yZS5vcmRlcgo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlLm9yZGVyCShyZXZpc2lvbiAzOTQ4NikKKysrIFdlYkNvcmUub3Jk
ZXIJKHdvcmtpbmcgY29weSkKQEAgLTc5MjQsNyArNzkyNCw3IEBAIF9fWk43V2ViQ29yZTExRnJh
bWVMb2FkZXIxN3N0b3BGb3JVc2VyQ2EKIC1bRE9NRWxlbWVudChXZWJQcml2YXRlKSBpc0ZvY3Vz
ZWRdCiBfX1pON1dlYkNvcmUxNFJlbmRlclRoZW1lTWFjMjhwYWludFNlYXJjaEZpZWxkQ2FuY2Vs
QnV0dG9uRVBOU18xMlJlbmRlck9iamVjdEVSS05TMV85UGFpbnRJbmZvRVJLTlNfN0ludFJlY3RF
CiBfX1pON1dlYkNvcmUxNkhUTUxJbnB1dEVsZW1lbnQxNWFkZFNlYXJjaFJlc3VsdEV2Ci1fX1pO
N1dlYkNvcmUxN1JlbmRlclRleHRDb250cm9sMTVhZGRTZWFyY2hSZXN1bHRFdgorX19aTjdXZWJD
b3JlMjdSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUxNWFkZFNlYXJjaFJlc3VsdEV2CiBfX1pO
N1dlYkNvcmUxNkhUTUxJbnB1dEVsZW1lbnQ4b25TZWFyY2hFdgogX19aTjdXZWJDb3JlMTdSZW5k
ZXJUZXh0Q29udHJvbDIwc3RvcFNlYXJjaEV2ZW50VGltZXJFdgogX19aTjdXZWJDb3JlMTNDaGFy
YWN0ZXJEYXRhMTJzZXROb2RlVmFsdWVFUktOU182U3RyaW5nRVJpCkluZGV4OiBXZWJDb3JlLnBy
bwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlLnBybwkocmV2aXNpb24gMzk0ODYpCisrKyBXZWJDb3Jl
LnBybwkod29ya2luZyBjb3B5KQpAQCAtOTc3LDYgKzk3Nyw4IEBAIFNPVVJDRVMgKz0gXAogICAg
IHJlbmRlcmluZy9SZW5kZXJUYWJsZVJvdy5jcHAgXAogICAgIHJlbmRlcmluZy9SZW5kZXJUYWJs
ZVNlY3Rpb24uY3BwIFwKICAgICByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wuY3BwIFwKKyAg
ICByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuY3BwIFwKKyAgICByZW5kZXJp
bmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmNwcCBcCiAgICAgcmVuZGVyaW5nL1JlbmRl
clRleHQuY3BwIFwKICAgICByZW5kZXJpbmcvUmVuZGVyVGV4dEZyYWdtZW50LmNwcCBcCiAgICAg
cmVuZGVyaW5nL1JlbmRlclRoZW1lLmNwcCBcCkluZGV4OiBXZWJDb3JlU291cmNlcy5ia2wKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZVNvdXJjZXMuYmtsCShyZXZpc2lvbiAzOTQ4NikKKysrIFdlYkNv
cmVTb3VyY2VzLmJrbAkod29ya2luZyBjb3B5KQpAQCAtOTAwLDYgKzkwMCw4IEBAIFRoaXMgZmls
ZSBjb250YWlucyB0aGUgbGlzdCBvZiBmaWxlcyBuZWUKICAgICAgICAgcmVuZGVyaW5nL1JlbmRl
clRhYmxlU2VjdGlvbi5jcHAKICAgICAgICAgcmVuZGVyaW5nL1JlbmRlclRleHQuY3BwCiAgICAg
ICAgIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbC5jcHAKKyAgICAgICAgcmVuZGVyaW5nL1Jl
bmRlclRleHRDb250cm9sTXVsdGlMaW5lLmNwcAorICAgICAgICByZW5kZXJpbmcvUmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lLmNwcAogICAgICAgICByZW5kZXJpbmcvUmVuZGVyVGV4dEZyYWdt
ZW50LmNwcAogICAgICAgICByZW5kZXJpbmcvUmVuZGVyVGhlbWUuY3BwCiAgICAgICAgIHJlbmRl
cmluZy9SZW5kZXJUcmVlQXNUZXh0LmNwcApJbmRleDogV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52
Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlz
aW9uIDM5NDg2KQorKysgV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29w
eSkKQEAgLTk3NzQsNiArOTc3NCwzOCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUN
CisJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxp
bmUuY3BwIg0KKwkJCQk+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVs
ZWFzZV9QR098V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xD
b21waWxlclRvb2wiDQorCQkJCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSJ0cnVlIg0KKwkJ
CQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUN
CisJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxp
bmUuaCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9
Ii4uXHJlbmRlcmluZ1xSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuY3BwIg0KKwkJCQk+DQor
CQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZV9QR098V2luMzIiDQor
CQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJ
CQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSJ0cnVlIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxl
Q29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRo
PSIuLlxyZW5kZXJpbmdcUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmgiDQorCQkJCT4NCisJ
CQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxyZW5kZXJpbmdcUmVu
ZGVyVGV4dEZyYWdtZW50LmNwcCINCiAJCQkJPg0KIAkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCklu
ZGV4OiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAzOTQ4NikKKysrIFdlYkNv
cmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtNTMsNiArNTMs
MTAgQEAKIAkJMDgyMDNBQTAwRUQ4QzM1MzAwQjhCNjFBIC8qIFdNTEFjY2Vzc0VsZW1lbnQuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDA4MjAzQTlFMEVE
OEMzNTMwMEI4QjYxQSAvKiBXTUxBY2Nlc3NFbGVtZW50LmggKi87IH07CiAJCTA4Mzk0NzZDMEVD
RTRCRDYwMDAyNzM1MCAvKiBXTUxFbGVtZW50RmFjdG9yeS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwOEZCODRCMDBFQ0UzNzMzMDBEQzA2NEUgLyog
V01MRWxlbWVudEZhY3RvcnkuY3BwICovOyB9OwogCQkwODM5NDc2RDBFQ0U0QkQ2MDAwMjczNTAg
LyogV01MRWxlbWVudEZhY3RvcnkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDA4RkI4NEIxMEVDRTM3MzMwMERDMDY0RSAvKiBXTUxFbGVtZW50RmFjdG9y
eS5oICovOyB9OworCQkwODNEQUVBNjBGMDFBN0ZCMDAzNDI3NTQgLyogUmVuZGVyVGV4dENvbnRy
b2xNdWx0aUxpbmUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gMDgzREFFQTIwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRDb250cm9sTXVsdGlM
aW5lLmNwcCAqLzsgfTsKKwkJMDgzREFFQTcwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRD
b250cm9sTXVsdGlMaW5lLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAwODNEQUVBMzBGMDFBN0ZCMDAzNDI3NTQgLyogUmVuZGVyVGV4dENvbnRyb2xNdWx0
aUxpbmUuaCAqLzsgfTsKKwkJMDgzREFFQTgwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRD
b250cm9sU2luZ2xlTGluZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAwODNEQUVBNDBGMDFBN0ZCMDAzNDI3NTQgLyogUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lLmNwcCAqLzsgfTsKKwkJMDgzREFFQTkwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRl
clRleHRDb250cm9sU2luZ2xlTGluZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gMDgzREFFQTUwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRDb250
cm9sU2luZ2xlTGluZS5oICovOyB9OwogCQkwODREQkFBMTBFRDM5RDM2MDAzOEMyMjYgLyogV01M
VmFyaWFibGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDA4NERCQTlEMEVEMzlEMzUwMDM4QzIyNiAvKiBXTUxWYXJpYWJsZXMuY3BwICovOyB9Owog
CQkwODREQkFBMjBFRDM5RDM2MDAzOEMyMjYgLyogV01MVmFyaWFibGVzLmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwODREQkE5RTBFRDM5RDM2MDAzOEMy
MjYgLyogV01MVmFyaWFibGVzLmggKi87IH07CiAJCTA4NUI5MkJBMEVGREU3M0QwMEU2MTIzQyAv
KiBGb3JtRGF0YUJ1aWxkZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMDg1QjkyQjgwRUZERTczRDAwRTYxMjNDIC8qIEZvcm1EYXRhQnVpbGRlci5j
cHAgKi87IH07CkBAIC00ODY3LDYgKzQ4NzEsMTAgQEAKIAkJMDgxRDgxMzAwRUUwRTc0RDAwRDcz
Njg5IC8qIFdNTFRpbWVyRWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBXTUxUaW1lckVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMDgyMDNB
OUQwRUQ4QzM1MzAwQjhCNjFBIC8qIFdNTEFjY2Vzc0VsZW1lbnQuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gV01MQWNjZXNzRWxlbWVudC5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCTA4MjAzQTlFMEVEOEMzNTMwMEI4QjYxQSAvKiBXTUxBY2Nlc3NF
bGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdNTEFjY2Vzc0VsZW1l
bnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDgzREFFQTIwRjAxQTdGQjAwMzQy
NzU0IC8qIFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDgzREFFQTMwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRl
clRleHRDb250cm9sTXVsdGlMaW5lLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCTA4M0RBRUE0MEYwMUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxp
bmUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyVGV4dENv
bnRyb2xTaW5nbGVMaW5lLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMDgzREFF
QTUwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMDg0REJBOUQwRUQzOUQzNTAwMzhDMjI2
IC8qIFdNTFZhcmlhYmxlcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBXTUxWYXJpYWJsZXMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwODREQkE5
RTBFRDM5RDM2MDAzOEMyMjYgLyogV01MVmFyaWFibGVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFdNTFZhcmlhYmxlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQkwODVCOTJCODBFRkRFNzNEMDBFNjEyM0MgLyogRm9ybURhdGFCdWlsZGVyLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZvcm1EYXRhQnVpbGRlci5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xNDAzOSw2ICsxNDA0NywxMCBAQAogCQkJCUJDRUE0
ODREMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJUZXh0LmggKi8sCiAJCQkJQUI2N0QxQTYwOTdG
M0FFMzAwRjkzOTJFIC8qIFJlbmRlclRleHRDb250cm9sLmNwcCAqLywKIAkJCQlBQjY3RDFBNzA5
N0YzQUUzMDBGOTM5MkUgLyogUmVuZGVyVGV4dENvbnRyb2wuaCAqLywKKwkJCQkwODNEQUVBMjBG
MDFBN0ZCMDAzNDI3NTQgLyogUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuY3BwICovLAorCQkJ
CTA4M0RBRUEzMEYwMUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZS5o
ICovLAorCQkJCTA4M0RBRUE0MEYwMUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmUuY3BwICovLAorCQkJCTA4M0RBRUE1MEYwMUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJU
ZXh0Q29udHJvbFNpbmdsZUxpbmUuaCAqLywKIAkJCQlCQ0VBNDg0RTA5N0Q5MzAyMDA5NEM5RTQg
LyogUmVuZGVyVGV4dEZyYWdtZW50LmNwcCAqLywKIAkJCQlCQ0VBNDg0RjA5N0Q5MzAyMDA5NEM5
RTQgLyogUmVuZGVyVGV4dEZyYWdtZW50LmggKi8sCiAJCQkJQkNFQTQ4NEEwOTdEOTMwMjAwOTRD
OUU0IC8qIFJlbmRlclRoZW1lLmNwcCAqLywKQEAgLTE1OTk4LDYgKzE2MDEwLDggQEAKIAkJCQlB
OERGNEFFRjA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVTZWN0aW9uLmggaW4gSGVhZGVy
cyAqLywKIAkJCQlCQ0VBNDg4QzA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVyVGV4dC5oIGluIEhl
YWRlcnMgKi8sCiAJCQkJQUI2N0QxQTkwOTdGM0FFMzAwRjkzOTJFIC8qIFJlbmRlclRleHRDb250
cm9sLmggaW4gSGVhZGVycyAqLywKKwkJCQkwODNEQUVBNzBGMDFBN0ZCMDAzNDI3NTQgLyogUmVu
ZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuaCBpbiBIZWFkZXJzICovLAorCQkJCTA4M0RBRUE5MEYw
MUE3RkIwMDM0Mjc1NCAvKiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUJDRUE0ODhFMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJUZXh0RnJhZ21lbnQu
aCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUE0ODhBMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJU
aGVtZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFQTQ4ODcwOTdEOTMwMjAwOTRDOUU0IC8qIFJl
bmRlclRoZW1lTWFjLmggaW4gSGVhZGVycyAqLywKQEAgLTE3OTkyLDYgKzE4MDA2LDggQEAKIAkJ
CQlBOERGNEFFRDA5ODBDNDJDMDA1Mjk4MUIgLyogUmVuZGVyVGFibGVTZWN0aW9uLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCUJDRUE0ODhCMDk3RDkzMDIwMDk0QzlFNCAvKiBSZW5kZXJUZXh0LmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCUFCNjdEMUE4MDk3RjNBRTMwMEY5MzkyRSAvKiBSZW5kZXJU
ZXh0Q29udHJvbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQkwODNEQUVBNjBGMDFBN0ZCMDAzNDI3
NTQgLyogUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJ
MDgzREFFQTgwRjAxQTdGQjAwMzQyNzU0IC8qIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg4RDA5N0Q5MzAyMDA5NEM5RTQgLyogUmVuZGVy
VGV4dEZyYWdtZW50LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUE0ODg5MDk3RDkzMDIwMDk0
QzlFNCAvKiBSZW5kZXJUaGVtZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VBNDg4ODA5N0Q5
MzAyMDA5NEM5RTQgLyogUmVuZGVyVGhlbWVNYWMubW0gaW4gU291cmNlcyAqLywKSW5kZXg6IGh0
bWwvSFRNTElucHV0RWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gaHRtbC9IVE1MSW5wdXRFbGVt
ZW50LmNwcAkocmV2aXNpb24gMzk0ODYpCisrKyBodG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01MSw3ICs1MSw3IEBACiAjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIK
ICNpbmNsdWRlICJSZW5kZXJTbGlkZXIuaCIKICNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCi0jaW5j
bHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmUuaCIKICNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgogI2luY2x1ZGUgIlNlbGVjdGlv
bkNvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJUZXh0QnJlYWtJdGVyYXRvci5oIgpAQCAtNzU4LDcg
Kzc1OCw3IEBAIFJlbmRlck9iamVjdCAqSFRNTElucHV0RWxlbWVudDo6Y3JlYXRlUmUKICAgICAg
ICAgY2FzZSBQQVNTV09SRDoKICAgICAgICAgY2FzZSBTRUFSQ0g6CiAgICAgICAgIGNhc2UgVEVY
VDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJUZXh0Q29udHJvbCh0aGlz
LCBmYWxzZSk7ICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG5ldyAoYXJlbmEpIFJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZSh0aGlzKTsKICAgICB9CiAgICAgQVNTRVJUKGZhbHNl
KTsKICAgICByZXR1cm4gMDsKQEAgLTE0MzQsNyArMTQzNCw3IEBAIHZvaWQgSFRNTElucHV0RWxl
bWVudDo6ZGVmYXVsdEV2ZW50SGFuZGwKICAgICB9CiAKICAgICBpZiAoaXNUZXh0RmllbGQoKSAm
JiByZW5kZXJlcigpICYmIChldnQtPmlzTW91c2VFdmVudCgpIHx8IGV2dC0+aXNEcmFnRXZlbnQo
KSB8fCBldnQtPmlzV2hlZWxFdmVudCgpIHx8IGV2dC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5i
bHVyRXZlbnQgfHwgZXZ0LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmZvY3VzRXZlbnQpKQotICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbCo+KHJlbmRlcmVyKCkpLT5mb3J3YXJk
RXZlbnQoZXZ0KTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVM
aW5lKj4ocmVuZGVyZXIoKSktPmZvcndhcmRFdmVudChldnQpOwogCiAgICAgaWYgKGlucHV0VHlw
ZSgpID09IFJBTkdFICYmIHJlbmRlcmVyKCkpIHsKICAgICAgICAgUmVuZGVyU2xpZGVyKiBzbGlk
ZXIgPSBzdGF0aWNfY2FzdDxSZW5kZXJTbGlkZXIqPihyZW5kZXJlcigpKTsKQEAgLTE2MDQsNyAr
MTYwNCw3IEBAIHZvaWQgSFRNTElucHV0RWxlbWVudDo6dXBkYXRlUGxhY2Vob2xkZXIKICAgICAg
ICAgJiYgIWdldEF0dHJpYnV0ZShwbGFjZWhvbGRlckF0dHIpLmlzRW1wdHkoKTsKIAogICAgIGlm
ICgob2xkUGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUgIT0gbV9wbGFjZWhvbGRlclNob3VsZEJl
VmlzaWJsZSB8fCBwbGFjZWhvbGRlclZhbHVlQ2hhbmdlZCkgJiYgcmVuZGVyZXIoKSkKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihyZW5kZXJlcigpKS0+dXBkYXRlUGxh
Y2Vob2xkZXJWaXNpYmlsaXR5KCk7CisgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRDb250
cm9sU2luZ2xlTGluZSo+KHJlbmRlcmVyKCkpLT51cGRhdGVQbGFjZWhvbGRlclZpc2liaWxpdHko
KTsKIH0KIAogU3RyaW5nIEhUTUxJbnB1dEVsZW1lbnQ6OmNvbnN0cmFpblZhbHVlKGNvbnN0IFN0
cmluZyYgcHJvcG9zZWRWYWx1ZSwgaW50IG1heExlbikgY29uc3QKQEAgLTE2MzMsMTQgKzE2MzMs
MTQgQEAgdm9pZCBIVE1MSW5wdXRFbGVtZW50OjphZGRTZWFyY2hSZXN1bHQoKQogewogICAgIEFT
U0VSVChpc1NlYXJjaEZpZWxkKCkpOwogICAgIGlmIChyZW5kZXJlcigpKQotICAgICAgICBzdGF0
aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbCo+KHJlbmRlcmVyKCkpLT5hZGRTZWFyY2hSZXN1bHQo
KTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lKj4ocmVu
ZGVyZXIoKSktPmFkZFNlYXJjaFJlc3VsdCgpOwogfQogCiB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6
Om9uU2VhcmNoKCkKIHsKICAgICBBU1NFUlQoaXNTZWFyY2hGaWVsZCgpKTsKICAgICBpZiAocmVu
ZGVyZXIoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihyZW5kZXJl
cigpKS0+c3RvcFNlYXJjaEV2ZW50VGltZXIoKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVy
VGV4dENvbnRyb2xTaW5nbGVMaW5lKj4ocmVuZGVyZXIoKSktPnN0b3BTZWFyY2hFdmVudFRpbWVy
KCk7CiAgICAgZGlzcGF0Y2hFdmVudEZvclR5cGUoZXZlbnROYW1lcygpLnNlYXJjaEV2ZW50LCB0
cnVlLCBmYWxzZSk7CiB9CiAKSW5kZXg6IGh0bWwvSFRNTFRleHRBcmVhRWxlbWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gaHRtbC9IVE1MVGV4dEFyZWFFbGVtZW50LmNwcAkocmV2aXNpb24gMzk0ODYp
CisrKyBodG1sL0hUTUxUZXh0QXJlYUVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3
ICszNiw3IEBACiAjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCiAjaW5jbHVkZSAiUGFnZS5oIgogI2lu
Y2x1ZGUgIlJlbmRlclN0eWxlLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKKyNp
bmNsdWRlICJSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZS5oIgogI2luY2x1ZGUgIlNlbGVjdGlv
bi5oIgogI2luY2x1ZGUgIlRleHQuaCIKICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CkBA
IC0xOTIsNyArMTkyLDcgQEAgdm9pZCBIVE1MVGV4dEFyZWFFbGVtZW50OjpwYXJzZU1hcHBlZEF0
dAogCiBSZW5kZXJPYmplY3QqIEhUTUxUZXh0QXJlYUVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqKQogewotICAgIHJldHVybiBuZXcgKGFyZW5h
KSBSZW5kZXJUZXh0Q29udHJvbCh0aGlzLCB0cnVlKTsKKyAgICByZXR1cm4gbmV3IChhcmVuYSkg
UmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUodGhpcyk7CiB9CiAKIGJvb2wgSFRNTFRleHRBcmVh
RWxlbWVudDo6YXBwZW5kRm9ybURhdGEoRm9ybURhdGFMaXN0JiBlbmNvZGluZywgYm9vbCkKQEAg
LTI0NSw3ICsyNDUsNyBAQCB2b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnQ6OnVwZGF0ZUZvY3VzQXBw
CiB2b2lkIEhUTUxUZXh0QXJlYUVsZW1lbnQ6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnQqIGV2
ZW50KQogewogICAgIGlmIChyZW5kZXJlcigpICYmIChldmVudC0+aXNNb3VzZUV2ZW50KCkgfHwg
ZXZlbnQtPmlzRHJhZ0V2ZW50KCkgfHwgZXZlbnQtPmlzV2hlZWxFdmVudCgpIHx8IGV2ZW50LT50
eXBlKCkgPT0gZXZlbnROYW1lcygpLmJsdXJFdmVudCkpCi0gICAgICAgIHN0YXRpY19jYXN0PFJl
bmRlclRleHRDb250cm9sKj4ocmVuZGVyZXIoKSktPmZvcndhcmRFdmVudChldmVudCk7CisgICAg
ICAgIHN0YXRpY19jYXN0PFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lKj4ocmVuZGVyZXIoKSkt
PmZvcndhcmRFdmVudChldmVudCk7CiAKICAgICBIVE1MRm9ybUNvbnRyb2xFbGVtZW50V2l0aFN0
YXRlOjpkZWZhdWx0RXZlbnRIYW5kbGVyKGV2ZW50KTsKIH0KSW5kZXg6IHJlbmRlcmluZy9SZW5k
ZXJUZXh0Q29udHJvbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRleHRDb250
cm9sLmNwcAkocmV2aXNpb24gMzk0ODYpCisrKyByZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2wu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNiBAQAogLyoqCiAgKiBDb3B5cmlnaHQgKEMp
IDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICAgICAgICAg
IChDKSAyMDA4IFRvcmNoIE1vYmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8v
d3d3LnRvcmNobW9iaWxlLmNvbS8pICAKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjIsMzcgKzIz
LDIyIEBACiAjaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKIAogI2luY2x1ZGUgIkNoYXJh
Y3Rlck5hbWVzLmgiCi0jaW5jbHVkZSAiQ1NTU3R5bGVTZWxlY3Rvci5oIgotI2luY2x1ZGUgIkRv
Y3VtZW50LmgiCiAjaW5jbHVkZSAiRWRpdG9yLmgiCi0jaW5jbHVkZSAiRWRpdG9yQ2xpZW50Lmgi
CiAjaW5jbHVkZSAiRXZlbnQuaCIKICNpbmNsdWRlICJFdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAi
Rm9udFNlbGVjdG9yLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZVZpZXcu
aCIKICNpbmNsdWRlICJIVE1MQlJFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTElucHV0RWxlbWVu
dC5oIgorI2luY2x1ZGUgIkhUTUxGb3JtQ29udHJvbEVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1M
TmFtZXMuaCIKLSNpbmNsdWRlICJIVE1MVGV4dEFyZWFFbGVtZW50LmgiCiAjaW5jbHVkZSAiSGl0
VGVzdFJlc3VsdC5oIgotI2luY2x1ZGUgIkxvY2FsaXplZFN0cmluZ3MuaCIKLSNpbmNsdWRlICJN
b3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50LmgiCi0jaW5jbHVk
ZSAiUmVuZGVyU2Nyb2xsYmFyLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKICNpbmNsdWRl
ICJTY3JvbGxiYXJUaGVtZS5oIgotI2luY2x1ZGUgIlNlYXJjaFBvcHVwTWVudS5oIgogI2luY2x1
ZGUgIlNlbGVjdGlvbkNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJTZXR0aW5ncy5oIgotI2luY2x1
ZGUgIlRleHQuaCIKICNpbmNsdWRlICJUZXh0Q29udHJvbElubmVyRWxlbWVudHMuaCIKKyNpbmNs
dWRlICJUZXh0LmgiCiAjaW5jbHVkZSAiVGV4dEl0ZXJhdG9yLmgiCi0jaW5jbHVkZSAiaHRtbGVk
aXRpbmcuaCIKLSNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCi0jaW5jbHVkZSA8bWF0aC5oPgog
Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgc3RkOjptYXg7Cit1c2luZyBzdGQ6Om1pbjsK
IAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC04MCw1MCArNjYsMjkgQEAgc3RhdGljIENvbG9y
IGRpc2FibGVkVGV4dENvbG9yKGNvbnN0IENvbAogICAgIHJldHVybiBkaXNhYmxlZENvbG9yOwog
fQogCi1SZW5kZXJUZXh0Q29udHJvbDo6UmVuZGVyVGV4dENvbnRyb2woTm9kZSogbm9kZSwgYm9v
bCBtdWx0aUxpbmUpCitSZW5kZXJUZXh0Q29udHJvbDo6UmVuZGVyVGV4dENvbnRyb2woTm9kZSog
bm9kZSkKICAgICA6IFJlbmRlckJsb2NrKG5vZGUpCi0gICAgLCBtX2RpcnR5KGZhbHNlKQotICAg
ICwgbV9tdWx0aUxpbmUobXVsdGlMaW5lKQotICAgICwgbV9wbGFjZWhvbGRlclZpc2libGUoZmFs
c2UpCisgICAgLCBtX2VkaXRlZChmYWxzZSkKICAgICAsIG1fdXNlckVkaXRlZChmYWxzZSkKLSAg
ICAsIG1fc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yKGZhbHNlKQotICAgICwgbV9zZWFyY2hQ
b3B1cCgwKQotICAgICwgbV9zZWFyY2hQb3B1cElzVmlzaWJsZShmYWxzZSkKLSAgICAsIG1fc2Vh
cmNoRXZlbnRUaW1lcih0aGlzLCAmUmVuZGVyVGV4dENvbnRyb2w6OnNlYXJjaEV2ZW50VGltZXJG
aXJlZCkKIHsKIH0KIAogUmVuZGVyVGV4dENvbnRyb2w6On5SZW5kZXJUZXh0Q29udHJvbCgpCiB7
Ci0gICAgaWYgKG1fc2VhcmNoUG9wdXApIHsKLSAgICAgICAgbV9zZWFyY2hQb3B1cC0+ZGlzY29u
bmVjdENsaWVudCgpOwotICAgICAgICBtX3NlYXJjaFBvcHVwID0gMDsKLSAgICB9Ci0gICAgaWYg
KG1fbXVsdGlMaW5lICYmIG5vZGUoKSkKLSAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVh
RWxlbWVudCo+KG5vZGUoKSktPnJlbmRlcmVyV2lsbEJlRGVzdHJveWVkKCk7CiAgICAgLy8gVGhl
IGNoaWxkcmVuIHJlbmRlcmVycyBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQgYnkgZGVzdHJv
eUxlZnRvdmVyQ2hpbGRyZW4KLSAgICBpZiAobV9pbm5lckJsb2NrKQotICAgICAgICBtX2lubmVy
QmxvY2stPmRldGFjaCgpOwotICAgIGVsc2UgaWYgKG1faW5uZXJUZXh0KQorICAgIGlmIChtX2lu
bmVyVGV4dCkKICAgICAgICAgbV9pbm5lclRleHQtPmRldGFjaCgpOwogfQogCiB2b2lkIFJlbmRl
clRleHRDb250cm9sOjpzdHlsZURpZENoYW5nZShSZW5kZXJTdHlsZTo6RGlmZiBkaWZmLCBjb25z
dCBSZW5kZXJTdHlsZSogb2xkU3R5bGUpCiB7CiAgICAgUmVuZGVyQmxvY2s6OnN0eWxlRGlkQ2hh
bmdlKGRpZmYsIG9sZFN0eWxlKTsKLSAgICBpZiAobV9pbm5lckJsb2NrKSB7Ci0gICAgICAgIC8v
IFdlIG1heSBoYXZlIHNldCB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgaW4gdGhlIG9sZCBzdHls
ZSBpbiBsYXlvdXQoKS4gUmVzZXQgdGhlbSBub3cgdG8gYXZvaWQKLSAgICAgICAgLy8gZ2V0dGlu
ZyBhIHNwdXJpb3VzIGxheW91dCBoaW50LgotICAgICAgICBtX2lubmVyQmxvY2stPnJlbmRlcmVy
KCktPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgoKSk7Ci0gICAgICAgIG1faW5uZXJCbG9jay0+
cmVuZGVyZXIoKS0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKCkpOwotICAgICAgICBtX2lubmVy
QmxvY2stPnJlbmRlcmVyKCktPnNldFN0eWxlKGNyZWF0ZUlubmVyQmxvY2tTdHlsZShzdHlsZSgp
KSk7Ci0gICAgfQogCiAgICAgaWYgKG1faW5uZXJUZXh0KSB7CiAgICAgICAgIFJlbmRlckJsb2Nr
KiB0ZXh0QmxvY2tSZW5kZXJlciA9IHN0YXRpY19jYXN0PFJlbmRlckJsb2NrKj4obV9pbm5lclRl
eHQtPnJlbmRlcmVyKCkpOwogICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHRleHRCbG9ja1N0
eWxlID0gY3JlYXRlSW5uZXJUZXh0U3R5bGUoc3R5bGUoKSk7Ci0gICAgICAgIC8vIFdlIG1heSBo
YXZlIHNldCB0aGUgd2lkdGggYW5kIHRoZSBoZWlnaHQgaW4gdGhlIG9sZCBzdHlsZSBpbiBsYXlv
dXQoKS4gUmVzZXQgdGhlbSBub3cgdG8gYXZvaWQKLSAgICAgICAgLy8gZ2V0dGluZyBhIHNwdXJp
b3VzIGxheW91dCBoaW50LgorICAgICAgICAvLyBXZSBtYXkgaGF2ZSBzZXQgdGhlIHdpZHRoIGFu
ZCB0aGUgaGVpZ2h0IGluIHRoZSBvbGQgc3R5bGUgaW4gbGF5b3V0KCkuCisgICAgICAgIC8vIFJl
c2V0IHRoZW0gbm93IHRvIGF2b2lkIGdldHRpbmcgYSBzcHVyaW91cyBsYXlvdXQgaGludC4KICAg
ICAgICAgdGV4dEJsb2NrUmVuZGVyZXItPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgoKSk7CiAg
ICAgICAgIHRleHRCbG9ja1JlbmRlcmVyLT5zdHlsZSgpLT5zZXRXaWR0aChMZW5ndGgoKSk7CiAg
ICAgICAgIHRleHRCbG9ja1JlbmRlcmVyLT5zZXRTdHlsZSh0ZXh0QmxvY2tTdHlsZSk7CkBAIC0x
MzIsMjE0ICs5Nyw4NCBAQCB2b2lkIFJlbmRlclRleHRDb250cm9sOjpzdHlsZURpZENoYW5nZShS
CiAgICAgICAgICAgICAgICAgbi0+cmVuZGVyZXIoKS0+c2V0U3R5bGUodGV4dEJsb2NrU3R5bGUp
OwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChtX3Jlc3VsdHNCdXR0b24gJiYgbV9yZXN1bHRz
QnV0dG9uLT5yZW5kZXJlcigpKQotICAgICAgICBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCkt
PnNldFN0eWxlKGNyZWF0ZVJlc3VsdHNCdXR0b25TdHlsZShzdHlsZSgpKSk7Ci0KLSAgICBpZiAo
bV9jYW5jZWxCdXR0b24gJiYgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCkpCi0gICAgICAgIG1f
Y2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5zZXRTdHlsZShjcmVhdGVDYW5jZWxCdXR0b25TdHls
ZShzdHlsZSgpKSk7CiAKICAgICBzZXRIYXNPdmVyZmxvd0NsaXAoZmFsc2UpOwogICAgIHNldFJl
cGxhY2VkKGlzSW5saW5lKCkpOwogfQogCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJU
ZXh0Q29udHJvbDo6Y3JlYXRlSW5uZXJCbG9ja1N0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFy
dFN0eWxlKQotewotICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gaW5uZXJCbG9ja1N0eWxlID0gUmVu
ZGVyU3R5bGU6OmNyZWF0ZSgpOwotCi0gICAgaW5uZXJCbG9ja1N0eWxlLT5pbmhlcml0RnJvbShz
dGFydFN0eWxlKTsKLSAgICBpbm5lckJsb2NrU3R5bGUtPnNldERpc3BsYXkoQkxPQ0spOwotICAg
IGlubmVyQmxvY2tTdHlsZS0+c2V0RGlyZWN0aW9uKExUUik7Ci0gICAgLy8gV2UgZG9uJ3Qgd2Fu
dCB0aGUgc2hhZG93IGRvbSB0byBiZSBlZGl0YWJsZSwgc28gd2Ugc2V0IHRoaXMgYmxvY2sgdG8g
cmVhZC1vbmx5IGluIGNhc2UgdGhlIGlucHV0IGl0c2VsZiBpcyBlZGl0YWJsZS4KLSAgICBpbm5l
ckJsb2NrU3R5bGUtPnNldFVzZXJNb2RpZnkoUkVBRF9PTkxZKTsKLQotICAgIHJldHVybiBpbm5l
ckJsb2NrU3R5bGUucmVsZWFzZSgpOwotfQotCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5k
ZXJUZXh0Q29udHJvbDo6Y3JlYXRlSW5uZXJUZXh0U3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0
YXJ0U3R5bGUpCit2b2lkIFJlbmRlclRleHRDb250cm9sOjphZGp1c3RJbm5lclRleHRTdHlsZShj
b25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRleHRCbG9ja1N0eWxl
KSBjb25zdAogewogICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNf
Y2FzdDxIVE1MRm9ybUNvbnRyb2xFbGVtZW50Kj4obm9kZSgpKTsKLSAgICBib29sIHBsYWNlaG9s
ZGVyU2hvdWxkQmVWaXNpYmxlID0gIW1fbXVsdGlMaW5lICYmIHN0YXRpY19jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPihlbGVtZW50KS0+cGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUoKTsKIAotICAg
IFJlZlB0cjxSZW5kZXJTdHlsZT4gdGV4dEJsb2NrU3R5bGU7Ci0gICAgaWYgKHBsYWNlaG9sZGVy
U2hvdWxkQmVWaXNpYmxlKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBwc2V1ZG9TdHlsZSA9IGdl
dENhY2hlZFBzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpJTlBVVF9QTEFDRUhPTERFUik7Ci0gICAg
ICAgIHRleHRCbG9ja1N0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKHBzZXVkb1N0eWxlKTsKLSAg
ICB9IGVsc2UgewotICAgICAgICB0ZXh0QmxvY2tTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUo
KTsgICAKLSAgICAgICAgdGV4dEJsb2NrU3R5bGUtPmluaGVyaXRGcm9tKHN0YXJ0U3R5bGUpOwot
ICAgIH0KLSAgICAKICAgICAvLyBUaGUgaW5uZXIgYmxvY2ssIGlmIHByZXNlbnQsIGFsd2F5cyBo
YXMgaXRzIGRpcmVjdGlvbiBzZXQgdG8gTFRSLAogICAgIC8vIHNvIHdlIG5lZWQgdG8gaW5oZXJp
dCB0aGUgZGlyZWN0aW9uIGZyb20gdGhlIGVsZW1lbnQuCiAgICAgdGV4dEJsb2NrU3R5bGUtPnNl
dERpcmVjdGlvbihzdHlsZSgpLT5kaXJlY3Rpb24oKSk7CiAgICAgdGV4dEJsb2NrU3R5bGUtPnNl
dFVzZXJNb2RpZnkoZWxlbWVudC0+aXNSZWFkT25seUNvbnRyb2woKSB8fCBlbGVtZW50LT5kaXNh
YmxlZCgpID8gUkVBRF9PTkxZIDogUkVBRF9XUklURV9QTEFJTlRFWFRfT05MWSk7Ci0gICAgaWYg
KG1faW5uZXJCbG9jaykKLSAgICAgICAgdGV4dEJsb2NrU3R5bGUtPnNldERpc3BsYXkoSU5MSU5F
X0JMT0NLKTsKLSAgICBlbHNlCi0gICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXREaXNwbGF5KEJM
T0NLKTsKLQotICAgIGlmIChtX211bHRpTGluZSkgewotICAgICAgICAvLyBGb3J3YXJkIG92ZXJm
bG93IHByb3BlcnRpZXMuCi0gICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRPdmVyZmxvd1goc3Rh
cnRTdHlsZS0+b3ZlcmZsb3dYKCkgPT0gT1ZJU0lCTEUgPyBPQVVUTyA6IHN0YXJ0U3R5bGUtPm92
ZXJmbG93WCgpKTsKLSAgICAgICAgdGV4dEJsb2NrU3R5bGUtPnNldE92ZXJmbG93WShzdGFydFN0
eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSA/IE9BVVRPIDogc3RhcnRTdHlsZS0+b3ZlcmZs
b3dZKCkpOwotCi0gICAgICAgIC8vIFNldCB3b3JkIHdyYXAgcHJvcGVydHkgYmFzZWQgb24gd3Jh
cCBhdHRyaWJ1dGUuCi0gICAgICAgIGlmICghc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVu
dCo+KGVsZW1lbnQpLT5zaG91bGRXcmFwVGV4dCgpKSB7Ci0gICAgICAgICAgICB0ZXh0QmxvY2tT
dHlsZS0+c2V0V2hpdGVTcGFjZShQUkUpOwotICAgICAgICAgICAgdGV4dEJsb2NrU3R5bGUtPnNl
dFdvcmRXcmFwKE5vcm1hbFdvcmRXcmFwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg
IHRleHRCbG9ja1N0eWxlLT5zZXRXaGl0ZVNwYWNlKFBSRV9XUkFQKTsKLSAgICAgICAgICAgIHRl
eHRCbG9ja1N0eWxlLT5zZXRXb3JkV3JhcChCcmVha1dvcmRXcmFwKTsKLSAgICAgICAgfQotICAg
IH0gZWxzZSB7Ci0gICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRXaGl0ZVNwYWNlKFBSRSk7Ci0g
ICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRXb3JkV3JhcChOb3JtYWxXb3JkV3JhcCk7Ci0gICAg
ICAgIHRleHRCbG9ja1N0eWxlLT5zZXRPdmVyZmxvd1goT0hJRERFTik7Ci0gICAgICAgIHRleHRC
bG9ja1N0eWxlLT5zZXRPdmVyZmxvd1koT0hJRERFTik7Ci0gICAgICAgIAotICAgICAgICAvLyBE
byBub3QgYWxsb3cgbGluZS1oZWlnaHQgdG8gYmUgc21hbGxlciB0aGFuIG91ciBkZWZhdWx0Lgot
ICAgICAgICBpZiAodGV4dEJsb2NrU3R5bGUtPmZvbnQoKS5saW5lU3BhY2luZygpID4gbGluZUhl
aWdodCh0cnVlLCB0cnVlKSkKLSAgICAgICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRMaW5lSGVp
Z2h0KExlbmd0aCgtMTAwLjBmLCBQZXJjZW50KSk7Ci0gICAgfQotCi0gICAgaWYgKCFtX211bHRp
TGluZSkgewotICAgICAgICAvLyBXZSdyZSBhZGRpbmcgb25lIGV4dHJhIHBpeGVsIG9mIHBhZGRp
bmcgdG8gbWF0Y2ggV2luSUUuCi0gICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRQYWRkaW5nTGVm
dChMZW5ndGgoMSwgRml4ZWQpKTsKLSAgICAgICAgdGV4dEJsb2NrU3R5bGUtPnNldFBhZGRpbmdS
aWdodChMZW5ndGgoMSwgRml4ZWQpKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXZSdyZSBh
ZGRpbmcgdGhyZWUgZXh0cmEgcGl4ZWxzIG9mIHBhZGRpbmcgdG8gbGluZSB0ZXh0YXJlYXMgdXAg
d2l0aCB0ZXh0IGZpZWxkcy4KLSAgICAgICAgdGV4dEJsb2NrU3R5bGUtPnNldFBhZGRpbmdMZWZ0
KExlbmd0aCgzLCBGaXhlZCkpOwotICAgICAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0UGFkZGluZ1Jp
Z2h0KExlbmd0aCgzLCBGaXhlZCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBXaGVuIHRoZSBwbGFj
ZWhvbGRlciBpcyBnb2luZyB0byBiZSBkaXNwbGF5ZWQsIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRo
ZSB0ZXh0IHNlY3VyaXR5IHRvIGJlICJub25lIi4KLSAgICAvLyBBZnRlciB0aGlzLCB1cGRhdGVG
cm9tRWxlbWVudCB3aWxsIGltbWVkaWF0ZWx5IHVwZGF0ZSB0aGUgdGV4dCBkaXNwbGF5ZWQuCi0g
ICAgLy8gV2hlbiB0aGUgcGxhY2Vob2xkZXIgaXMgbm8gbG9uZ2VyIHZpc2libGUsIHVwZGF0ZVBs
YWNlaG9sZGVyVmlzaWJsaXR5IHdpbGwgcmVzZXQgdGhlIHN0eWxlLCAKLSAgICAvLyBhbmQgdGhl
IHRleHQgc2VjdXJpdHkgbW9kZSB3aWxsIGJlIHNldCBiYWNrIHRvIHRoZSBjb21wdXRlZCB2YWx1
ZSBjb3JyZWN0bHkuCi0gICAgaWYgKCFtX211bHRpTGluZSAmJiBzdGF0aWNfY2FzdDxIVE1MSW5w
dXRFbGVtZW50Kj4oZWxlbWVudCktPnBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCkpCi0gICAg
ICAgIHRleHRCbG9ja1N0eWxlLT5zZXRUZXh0U2VjdXJpdHkoVFNOT05FKTsKIAogICAgIGlmICgh
ZWxlbWVudC0+aXNFbmFibGVkKCkpCiAgICAgICAgIHRleHRCbG9ja1N0eWxlLT5zZXRDb2xvcihk
aXNhYmxlZFRleHRDb2xvcih0ZXh0QmxvY2tTdHlsZS0+Y29sb3IoKSwgc3RhcnRTdHlsZS0+YmFj
a2dyb3VuZENvbG9yKCkpKTsKLQotICAgIHJldHVybiB0ZXh0QmxvY2tTdHlsZS5yZWxlYXNlKCk7
CiB9CiAKLVBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IFJlbmRlclRleHRDb250cm9sOjpjcmVhdGVS
ZXN1bHRzQnV0dG9uU3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpCit2b2lkIFJl
bmRlclRleHRDb250cm9sOjpjcmVhdGVTdWJ0cmVlSWZOZWVkZWQoVGV4dENvbnRyb2xJbm5lckVs
ZW1lbnQqIGlubmVyQmxvY2spCiB7Ci0gICAgQVNTRVJUKCFtX211bHRpTGluZSk7Ci0gICAgSFRN
TElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9k
ZSgpKTsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHJlc3VsdHNCbG9ja1N0eWxlOwotICAgIGlm
IChpbnB1dC0+bWF4UmVzdWx0cygpIDwgMCkKLSAgICAgICAgcmVzdWx0c0Jsb2NrU3R5bGUgPSBn
ZXRDYWNoZWRQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6U0VBUkNIX0RFQ09SQVRJT04pOwotICAg
IGVsc2UgaWYgKCFpbnB1dC0+bWF4UmVzdWx0cygpKQotICAgICAgICByZXN1bHRzQmxvY2tTdHls
ZSA9IGdldENhY2hlZFBzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpTRUFSQ0hfUkVTVUxUU19ERUNP
UkFUSU9OKTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdHNCbG9ja1N0eWxlID0gZ2V0Q2FjaGVk
UHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OlNFQVJDSF9SRVNVTFRTX0JVVFRPTik7Ci0KLSAgICBp
ZiAoIXJlc3VsdHNCbG9ja1N0eWxlKQotICAgICAgICByZXN1bHRzQmxvY2tTdHlsZSA9IFJlbmRl
clN0eWxlOjpjcmVhdGUoKTsKLQotICAgIGlmIChzdGFydFN0eWxlKQotICAgICAgICByZXN1bHRz
QmxvY2tTdHlsZS0+aW5oZXJpdEZyb20oc3RhcnRTdHlsZSk7Ci0KLSAgICByZXR1cm4gcmVzdWx0
c0Jsb2NrU3R5bGUucmVsZWFzZSgpOworICAgIGlmICghbV9pbm5lclRleHQpIHsKKyAgICAgICAg
Ly8gQ3JlYXRlIHRoZSB0ZXh0IGJsb2NrIGVsZW1lbnQKKyAgICAgICAgLy8gRm9yIG5vbi1zZWFy
Y2ggZmllbGRzLCB0aGVyZSBpcyBubyBpbnRlcm1lZGlhdGUgaW5uZXJCbG9jayBhcyB0aGUgc2hh
ZG93IG5vZGUuCisgICAgICAgIC8vIG1faW5uZXJUZXh0IHdpbGwgYmUgdGhlIHNoYWRvdyBub2Rl
IGluIHRoYXQgY2FzZS4gICAgICAgIAorICAgICAgICBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUg
PSBpbm5lckJsb2NrID8gaW5uZXJCbG9jay0+cmVuZGVyZXIoKS0+c3R5bGUoKSA6IHN0eWxlKCk7
CisgICAgICAgIG1faW5uZXJUZXh0ID0gbmV3IFRleHRDb250cm9sSW5uZXJUZXh0RWxlbWVudChk
b2N1bWVudCgpLCBpbm5lckJsb2NrID8gMCA6IG5vZGUoKSk7CisgICAgICAgIG1faW5uZXJUZXh0
LT5hdHRhY2hJbm5lckVsZW1lbnQoaW5uZXJCbG9jayA/IGlubmVyQmxvY2sgOiBub2RlKCksIGNy
ZWF0ZUlubmVyVGV4dFN0eWxlKHBhcmVudFN0eWxlKSwgcmVuZGVyQXJlbmEoKSk7CisgICAgfQog
fQogCi1QYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJUZXh0Q29udHJvbDo6Y3JlYXRlQ2Fu
Y2VsQnV0dG9uU3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpCitpbnQgUmVuZGVy
VGV4dENvbnRyb2w6OnRleHRCbG9ja0hlaWdodCgpIGNvbnN0CiB7Ci0gICAgUmVmUHRyPFJlbmRl
clN0eWxlPiBjYW5jZWxCbG9ja1N0eWxlOwotICAgIAotICAgIGlmIChSZWZQdHI8UmVuZGVyU3R5
bGU+IHBzZXVkb1N0eWxlID0gZ2V0Q2FjaGVkUHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OlNFQVJD
SF9DQU5DRUxfQlVUVE9OKSkKLSAgICAgICAgLy8gV2UgbWF5IGJlIHNoYXJpbmcgc3R5bGUgd2l0
aCBhbm90aGVyIHNlYXJjaCBmaWVsZCwgYnV0IHdlIG11c3Qgbm90IHNoYXJlIHRoZSBjYW5jZWwg
YnV0dG9uIHN0eWxlLgotICAgICAgICBjYW5jZWxCbG9ja1N0eWxlID0gUmVuZGVyU3R5bGU6OmNs
b25lKHBzZXVkb1N0eWxlLmdldCgpKTsKLSAgICBlbHNlCi0gICAgICAgIGNhbmNlbEJsb2NrU3R5
bGUgPSBSZW5kZXJTdHlsZTo6Y3JlYXRlKCk7Ci0KLSAgICBpZiAoc3RhcnRTdHlsZSkKLSAgICAg
ICAgY2FuY2VsQmxvY2tTdHlsZS0+aW5oZXJpdEZyb20oc3RhcnRTdHlsZSk7Ci0KLSAgICB1cGRh
dGVDYW5jZWxCdXR0b25WaXNpYmlsaXR5KGNhbmNlbEJsb2NrU3R5bGUuZ2V0KCkpOwotCi0gICAg
cmV0dXJuIGNhbmNlbEJsb2NrU3R5bGUucmVsZWFzZSgpOworICAgIHJldHVybiBtX2hlaWdodCAt
IHBhZGRpbmdUb3AoKSAtIHBhZGRpbmdCb3R0b20oKSAtIGJvcmRlclRvcCgpIC0gYm9yZGVyQm90
dG9tKCk7CiB9CiAKLXZvaWQgUmVuZGVyVGV4dENvbnRyb2w6OmNyZWF0ZVN1YnRyZWVJZk5lZWRl
ZCgpCitpbnQgUmVuZGVyVGV4dENvbnRyb2w6OnRleHRCbG9ja1dpZHRoKCkgY29uc3QKIHsKLSAg
ICBib29sIGlzU2VhcmNoRmllbGQgPSAhbV9tdWx0aUxpbmUgJiYgc3RhdGljX2Nhc3Q8SFRNTElu
cHV0RWxlbWVudCo+KG5vZGUoKSktPmlzU2VhcmNoRmllbGQoKTsKLSAgICBpZiAoaXNTZWFyY2hG
aWVsZCAmJiAhbV9pbm5lckJsb2NrKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgaW5uZXIgYmxv
Y2sgZWxlbWVudAotICAgICAgICBtX2lubmVyQmxvY2sgPSBuZXcgVGV4dENvbnRyb2xJbm5lckVs
ZW1lbnQoZG9jdW1lbnQoKSwgbm9kZSgpKTsKLSAgICAgICAgbV9pbm5lckJsb2NrLT5hdHRhY2hJ
bm5lckVsZW1lbnQobm9kZSgpLCBjcmVhdGVJbm5lckJsb2NrU3R5bGUoc3R5bGUoKSksIHJlbmRl
ckFyZW5hKCkpOwotICAgIH0KLSAgICBpZiAoaXNTZWFyY2hGaWVsZCAmJiAhbV9yZXN1bHRzQnV0
dG9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgc2VhcmNoIHJlc3VsdHMgYnV0dG9uIGVsZW1l
bnQKLSAgICAgICAgbV9yZXN1bHRzQnV0dG9uID0gbmV3IFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRv
bkVsZW1lbnQoZG9jdW1lbnQoKSk7Ci0gICAgICAgIG1fcmVzdWx0c0J1dHRvbi0+YXR0YWNoSW5u
ZXJFbGVtZW50KG1faW5uZXJCbG9jay5nZXQoKSwgY3JlYXRlUmVzdWx0c0J1dHRvblN0eWxlKG1f
aW5uZXJCbG9jay0+cmVuZGVyZXIoKS0+c3R5bGUoKSksIHJlbmRlckFyZW5hKCkpOwotICAgIH0K
LSAgICBpZiAoIW1faW5uZXJUZXh0KSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgdGV4dCBibG9j
ayBlbGVtZW50Ci0gICAgICAgIC8vIEZvciBub24tc2VhcmNoIGZpZWxkcywgdGhlcmUgaXMgbm8g
aW50ZXJtZWRpYXRlIG1faW5uZXJCbG9jayBhcyB0aGUgc2hhZG93IG5vZGUuCi0gICAgICAgIC8v
IG1faW5uZXJUZXh0IHdpbGwgYmUgdGhlIHNoYWRvdyBub2RlIGluIHRoYXQgY2FzZS4KLSAgICAg
ICAgCi0gICAgICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IHN0eWxlKCk7Ci0gICAgICAg
IGlmIChtX2lubmVyQmxvY2spCi0gICAgICAgICAgICBwYXJlbnRTdHlsZSA9IG1faW5uZXJCbG9j
ay0+cmVuZGVyZXIoKS0+c3R5bGUoKTsKLSAgICAgICAgbV9pbm5lclRleHQgPSBuZXcgVGV4dENv
bnRyb2xJbm5lclRleHRFbGVtZW50KGRvY3VtZW50KCksIG1faW5uZXJCbG9jayA/IDAgOiBub2Rl
KCkpOwotICAgICAgICBtX2lubmVyVGV4dC0+YXR0YWNoSW5uZXJFbGVtZW50KG1faW5uZXJCbG9j
ayA/IG1faW5uZXJCbG9jay5nZXQoKSA6IG5vZGUoKSwgY3JlYXRlSW5uZXJUZXh0U3R5bGUocGFy
ZW50U3R5bGUpLCByZW5kZXJBcmVuYSgpKTsKLSAgICB9Ci0gICAgaWYgKGlzU2VhcmNoRmllbGQg
JiYgIW1fY2FuY2VsQnV0dG9uKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgY2FuY2VsIGJ1dHRv
biBlbGVtZW50Ci0gICAgICAgIG1fY2FuY2VsQnV0dG9uID0gbmV3IFNlYXJjaEZpZWxkQ2FuY2Vs
QnV0dG9uRWxlbWVudChkb2N1bWVudCgpKTsKLSAgICAgICAgbV9jYW5jZWxCdXR0b24tPmF0dGFj
aElubmVyRWxlbWVudChtX2lubmVyQmxvY2suZ2V0KCksIGNyZWF0ZUNhbmNlbEJ1dHRvblN0eWxl
KG1faW5uZXJCbG9jay0+cmVuZGVyZXIoKS0+c3R5bGUoKSksIHJlbmRlckFyZW5hKCkpOwotICAg
IH0KKyAgICByZXR1cm4gbV93aWR0aCAtIHBhZGRpbmdMZWZ0KCkgLSBwYWRkaW5nUmlnaHQoKSAt
IGJvcmRlckxlZnQoKSAtIGJvcmRlclJpZ2h0KCkgLQorICAgICAgICAgICBtX2lubmVyVGV4dC0+
cmVuZGVyZXIoKS0+cGFkZGluZ0xlZnQoKSAtIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5wYWRk
aW5nUmlnaHQoKTsKIH0KIAogdm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6dXBkYXRlRnJvbUVsZW1l
bnQoKQogewogICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2Fz
dDxIVE1MRm9ybUNvbnRyb2xFbGVtZW50Kj4obm9kZSgpKTsKKyAgICBtX2lubmVyVGV4dC0+cmVu
ZGVyZXIoKS0+c3R5bGUoKS0+c2V0VXNlck1vZGlmeShlbGVtZW50LT5pc1JlYWRPbmx5Q29udHJv
bCgpIHx8IGVsZW1lbnQtPmRpc2FibGVkKCkgPyBSRUFEX09OTFkgOiBSRUFEX1dSSVRFX1BMQUlO
VEVYVF9PTkxZKTsKK30KIAotICAgIGJvb2wgcGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUgPSAh
bV9tdWx0aUxpbmUgJiYgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGVsZW1lbnQpLT5w
bGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSgpOwotICAgIGJvb2wgcGxhY2Vob2xkZXJWaXNpYmls
aXR5U2hvdWxkQ2hhbmdlID0gbV9wbGFjZWhvbGRlclZpc2libGUgIT0gcGxhY2Vob2xkZXJTaG91
bGRCZVZpc2libGU7Ci0gICAgbV9wbGFjZWhvbGRlclZpc2libGUgPSBwbGFjZWhvbGRlclNob3Vs
ZEJlVmlzaWJsZTsKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2w6OnNldElubmVyVGV4dFZhbHVlKGNv
bnN0IFN0cmluZyYgaW5uZXJUZXh0VmFsdWUpCit7CisgICAgU3RyaW5nIHZhbHVlOwogCi0gICAg
Y3JlYXRlU3VidHJlZUlmTmVlZGVkKCk7CisgICAgaWYgKGlubmVyVGV4dFZhbHVlLmlzTnVsbCgp
KQorICAgICAgICB2YWx1ZSA9ICIiOworICAgIGVsc2UgeworICAgICAgICB2YWx1ZSA9IGlubmVy
VGV4dFZhbHVlOyAKKyAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdcXCcsIGJhY2tzbGFz
aEFzQ3VycmVuY3lTeW1ib2woKSk7CisgICAgfQogCi0gICAgaWYgKG1fY2FuY2VsQnV0dG9uICYm
IG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpKQotICAgICAgICB1cGRhdGVDYW5jZWxCdXR0b25W
aXNpYmlsaXR5KG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5zdHlsZSgpKTsKKyAgICBpZiAo
dmFsdWUgIT0gdGV4dCgpIHx8ICFtX2lubmVyVGV4dC0+aGFzQ2hpbGROb2RlcygpKSB7CisgICAg
ICAgIGlmICh2YWx1ZSAhPSB0ZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChGcmFtZSogZnJhbWUg
PSBkb2N1bWVudCgpLT5mcmFtZSgpKQorICAgICAgICAgICAgICAgIGZyYW1lLT5lZGl0b3IoKS0+
Y2xlYXJVbmRvUmVkb09wZXJhdGlvbnMoKTsKKyAgICAgICAgfQogCi0gICAgbV9pbm5lclRleHQt
PnJlbmRlcmVyKCktPnN0eWxlKCktPnNldFVzZXJNb2RpZnkoZWxlbWVudC0+aXNSZWFkT25seUNv
bnRyb2woKSB8fCBlbGVtZW50LT5kaXNhYmxlZCgpID8gUkVBRF9PTkxZIDogUkVBRF9XUklURV9Q
TEFJTlRFWFRfT05MWSk7Ci0gICAgCi0gICAgaWYgKG1fcGxhY2Vob2xkZXJWaXNpYmxlKSB7Ci0g
ICAgICAgIEV4Y2VwdGlvbkNvZGUgZWM7Ci0gICAgICAgIG1faW5uZXJUZXh0LT5zZXRJbm5lclRl
eHQoc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGVsZW1lbnQpLT5nZXRBdHRyaWJ1dGUo
cGxhY2Vob2xkZXJBdHRyKSwgZWMpOwotICAgIH0gZWxzZSBpZiAoIWVsZW1lbnQtPnZhbHVlTWF0
Y2hlc1JlbmRlcmVyKCkgfHwgbV9tdWx0aUxpbmUgfHwgcGxhY2Vob2xkZXJWaXNpYmlsaXR5U2hv
dWxkQ2hhbmdlKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLSAgICAgICAgaWYgKG1fbXVsdGlM
aW5lKQotICAgICAgICAgICAgdmFsdWUgPSBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50
Kj4oZWxlbWVudCktPnZhbHVlKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHZhbHVlID0g
c3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KGVsZW1lbnQpLT52YWx1ZSgpOwotICAgICAg
ICBpZiAodmFsdWUuaXNOdWxsKCkpCi0gICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAgICBl
bHNlCi0gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xcJywgYmFja3NsYXNoQXND
dXJyZW5jeVN5bWJvbCgpKTsKLSAgICAgICAgaWYgKHZhbHVlICE9IHRleHQoKSB8fCAhbV9pbm5l
clRleHQtPmhhc0NoaWxkTm9kZXMoKSkgewotICAgICAgICAgICAgaWYgKHZhbHVlICE9IHRleHQo
KSkgewotICAgICAgICAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFt
ZSgpKQotICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZWRpdG9yKCktPmNsZWFyVW5kb1JlZG9P
cGVyYXRpb25zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFeGNlcHRpb25Db2RlIGVj
ID0gMDsKLSAgICAgICAgICAgIG1faW5uZXJUZXh0LT5zZXRJbm5lclRleHQodmFsdWUsIGVjKTsK
LSAgICAgICAgICAgIGlmICh2YWx1ZS5lbmRzV2l0aCgiXG4iKSB8fCB2YWx1ZS5lbmRzV2l0aCgi
XHIiKSkKLSAgICAgICAgICAgICAgICBtX2lubmVyVGV4dC0+YXBwZW5kQ2hpbGQobmV3IEhUTUxC
UkVsZW1lbnQoYnJUYWcsIGRvY3VtZW50KCkpLCBlYyk7Ci0gICAgICAgICAgICBtX2RpcnR5ID0g
ZmFsc2U7Ci0gICAgICAgICAgICBtX3VzZXJFZGl0ZWQgPSBmYWxzZTsKKyAgICAgICAgRXhjZXB0
aW9uQ29kZSBlYyA9IDA7CisgICAgICAgIG1faW5uZXJUZXh0LT5zZXRJbm5lclRleHQodmFsdWUs
IGVjKTsKKyAgICAgICAgQVNTRVJUKGVjID09IDApOworCisgICAgICAgIGlmICh2YWx1ZS5lbmRz
V2l0aCgiXG4iKSB8fCB2YWx1ZS5lbmRzV2l0aCgiXHIiKSkgeworICAgICAgICAgICAgbV9pbm5l
clRleHQtPmFwcGVuZENoaWxkKG5ldyBIVE1MQlJFbGVtZW50KGJyVGFnLCBkb2N1bWVudCgpKSwg
ZWMpOworICAgICAgICAgICAgQVNTRVJUKGVjID09IDApOwogICAgICAgICB9Ci0gICAgICAgIGVs
ZW1lbnQtPnNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCk7CisKKyAgICAgICAgbV9lZGl0ZWQgPSBm
YWxzZTsKKyAgICAgICAgbV91c2VyRWRpdGVkID0gZmFsc2U7CiAgICAgfQogCi0gICAgaWYgKG1f
c2VhcmNoUG9wdXBJc1Zpc2libGUpCi0gICAgICAgIG1fc2VhcmNoUG9wdXAtPnVwZGF0ZUZyb21F
bGVtZW50KCk7CisgICAgc3RhdGljX2Nhc3Q8SFRNTEZvcm1Db250cm9sRWxlbWVudCo+KG5vZGUo
KSktPnNldFZhbHVlTWF0Y2hlc1JlbmRlcmVyKCk7CiB9CiAKIHZvaWQgUmVuZGVyVGV4dENvbnRy
b2w6OnNldFVzZXJFZGl0ZWQoYm9vbCBpc1VzZXJFZGl0ZWQpCkBAIC0zODcsMTAgKzIyMiw3IEBA
IHZvaWQgUmVuZGVyVGV4dENvbnRyb2w6OnNldFNlbGVjdGlvblJhbmcKICAgICBkb2N1bWVudCgp
LT51cGRhdGVMYXlvdXQoKTsKIAogICAgIGlmIChzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gSElE
REVOIHx8ICFtX2lubmVyVGV4dCB8fCAhbV9pbm5lclRleHQtPnJlbmRlcmVyKCkgfHwgIW1faW5u
ZXJUZXh0LT5yZW5kZXJlcigpLT5oZWlnaHQoKSkgewotICAgICAgICBpZiAobV9tdWx0aUxpbmUp
Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+
Y2FjaGVTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5jYWNoZVNlbGVjdGlvbihzdGFy
dCwgZW5kKTsKKyAgICAgICAgY2FjaGVTZWxlY3Rpb24oc3RhcnQsIGVuZCk7CiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAgICAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0UG9zaXRpb24gPSB2aXNpYmxl
UG9zaXRpb25Gb3JJbmRleChzdGFydCk7CkBAIC00MjcsOSArMjU5LDE0IEBAIFZpc2libGVQb3Np
dGlvbiBSZW5kZXJUZXh0Q29udHJvbDo6dmlzaWIKICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsK
ICAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gUmFuZ2U6OmNyZWF0ZShkb2N1bWVudCgpKTsKICAg
ICByYW5nZS0+c2VsZWN0Tm9kZUNvbnRlbnRzKG1faW5uZXJUZXh0LmdldCgpLCBlYyk7CisgICAg
QVNTRVJUKGVjID09IDApOwogICAgIENoYXJhY3Rlckl0ZXJhdG9yIGl0KHJhbmdlLmdldCgpKTsK
ICAgICBpdC5hZHZhbmNlKGluZGV4IC0gMSk7Ci0gICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihp
dC5yYW5nZSgpLT5lbmRDb250YWluZXIoZWMpLCBpdC5yYW5nZSgpLT5lbmRPZmZzZXQoZWMpLCBV
UFNUUkVBTSk7CisgICAgTm9kZSogZW5kQ29udGFpbmVyID0gaXQucmFuZ2UoKS0+ZW5kQ29udGFp
bmVyKGVjKTsKKyAgICBBU1NFUlQoZWMgPT0gMCk7CisgICAgaW50IGVuZE9mZnNldCA9IGl0LnJh
bmdlKCktPmVuZE9mZnNldChlYyk7CisgICAgQVNTRVJUKGVjID09IDApOworICAgIHJldHVybiBW
aXNpYmxlUG9zaXRpb24oZW5kQ29udGFpbmVyLCBlbmRPZmZzZXQsIFVQU1RSRUFNKTsKIH0KIAog
aW50IFJlbmRlclRleHRDb250cm9sOjppbmRleEZvclZpc2libGVQb3NpdGlvbihjb25zdCBWaXNp
YmxlUG9zaXRpb24mIHBvcykKQEAgLTQ0MCw1MCArMjc3LDE2IEBAIGludCBSZW5kZXJUZXh0Q29u
dHJvbDo6aW5kZXhGb3JWaXNpYmxlUG8KICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKICAgICBS
ZWZQdHI8UmFuZ2U+IHJhbmdlID0gUmFuZ2U6OmNyZWF0ZShkb2N1bWVudCgpKTsKICAgICByYW5n
ZS0+c2V0U3RhcnQobV9pbm5lclRleHQuZ2V0KCksIDAsIGVjKTsKKyAgICBBU1NFUlQoZWMgPT0g
MCk7CiAgICAgcmFuZ2UtPnNldEVuZChpbmRleFBvc2l0aW9uLm5vZGUoKSwgaW5kZXhQb3NpdGlv
bi5vZmZzZXQoKSwgZWMpOworICAgIEFTU0VSVChlYyA9PSAwKTsKICAgICByZXR1cm4gVGV4dEl0
ZXJhdG9yOjpyYW5nZUxlbmd0aChyYW5nZS5nZXQoKSk7CiB9CiAKLXZvaWQgUmVuZGVyVGV4dENv
bnRyb2w6OnVwZGF0ZUNhbmNlbEJ1dHRvblZpc2liaWxpdHkoUmVuZGVyU3R5bGUqIHN0eWxlKQot
ewotICAgIEFTU0VSVCghbV9tdWx0aUxpbmUpOwotICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0
ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSk7Ci0gICAgaWYgKGlucHV0
LT52YWx1ZSgpLmlzRW1wdHkoKSkKLSAgICAgICAgc3R5bGUtPnNldFZpc2liaWxpdHkoSElEREVO
KTsKLSAgICBlbHNlCi0gICAgICAgIHN0eWxlLT5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOwotfQot
CiB2b2lkIFJlbmRlclRleHRDb250cm9sOjpzdWJ0cmVlSGFzQ2hhbmdlZCgpCiB7Ci0gICAgYm9v
bCB3YXNEaXJ0eSA9IG1fZGlydHk7Ci0gICAgbV9kaXJ0eSA9IHRydWU7CisgICAgbV9lZGl0ZWQg
PSB0cnVlOwogICAgIG1fdXNlckVkaXRlZCA9IHRydWU7Ci0gICAgSFRNTEZvcm1Db250cm9sRWxl
bWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxGb3JtQ29udHJvbEVsZW1lbnQqPihub2Rl
KCkpOwotICAgIGlmIChtX211bHRpTGluZSkgewotICAgICAgICBlbGVtZW50LT5zZXRWYWx1ZU1h
dGNoZXNSZW5kZXJlcihmYWxzZSk7Ci0gICAgICAgIGlmIChlbGVtZW50LT5mb2N1c2VkKCkpCi0g
ICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQoKS0+ZnJhbWUoKSkKLSAgICAg
ICAgICAgICAgICBmcmFtZS0+dGV4dERpZENoYW5nZUluVGV4dEFyZWEoZWxlbWVudCk7Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50Kj4oZWxlbWVudCk7Ci0gICAgICAgIGlucHV0LT5zZXRWYWx1ZUZyb21S
ZW5kZXJlcihpbnB1dC0+Y29uc3RyYWluVmFsdWUodGV4dCgpKSk7Ci0gICAgICAgIGlmIChtX2Nh
bmNlbEJ1dHRvbiAmJiBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHVw
ZGF0ZUNhbmNlbEJ1dHRvblZpc2liaWxpdHkobV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPnN0
eWxlKCkpOwotCi0gICAgICAgIC8vIElmIHRoZSBpbmNyZW1lbnRhbCBhdHRyaWJ1dGUgaXMgc2V0
LCB0aGVuIGRpc3BhdGNoIHRoZSBzZWFyY2ggZXZlbnQKLSAgICAgICAgaWYgKCFpbnB1dC0+Z2V0
QXR0cmlidXRlKGluY3JlbWVudGFsQXR0cikuaXNOdWxsKCkpCi0gICAgICAgICAgICBzdGFydFNl
YXJjaEV2ZW50VGltZXIoKTsKLQotICAgICAgICBpZiAoIXdhc0RpcnR5KSB7Ci0gICAgICAgICAg
ICBpZiAoaW5wdXQtPmZvY3VzZWQoKSkKLSAgICAgICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1l
ID0gZG9jdW1lbnQoKS0+ZnJhbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnRleHRG
aWVsZERpZEJlZ2luRWRpdGluZyhpbnB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0
LT5mb2N1c2VkKCkpCi0gICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQoKS0+
ZnJhbWUoKSkKLSAgICAgICAgICAgICAgICBmcmFtZS0+dGV4dERpZENoYW5nZUluVGV4dEZpZWxk
KGlucHV0KTsKLSAgICB9CiB9CiAKIFN0cmluZyBSZW5kZXJUZXh0Q29udHJvbDo6ZmluaXNoVGV4
dChWZWN0b3I8VUNoYXI+JiByZXN1bHQpIGNvbnN0CkBAIC01MDUsMTEgKzMwOCw2IEBAIFN0cmlu
ZyBSZW5kZXJUZXh0Q29udHJvbDo6ZmluaXNoVGV4dChWZWMKICAgICByZXR1cm4gU3RyaW5nOjph
ZG9wdChyZXN1bHQpOwogfQogCi1IVE1MRWxlbWVudCogUmVuZGVyVGV4dENvbnRyb2w6OmlubmVy
VGV4dEVsZW1lbnQoKSBjb25zdAotewotICAgIHJldHVybiBtX2lubmVyVGV4dC5nZXQoKTsKLX0K
LQogU3RyaW5nIFJlbmRlclRleHRDb250cm9sOjp0ZXh0KCkKIHsKICAgICBpZiAoIW1faW5uZXJU
ZXh0KQpAQCAtNjIyLDkyICs0MjAsNDAgQEAgU3RyaW5nIFJlbmRlclRleHRDb250cm9sOjp0ZXh0
V2l0aEhhcmRMaQogICAgIHJldHVybiBmaW5pc2hUZXh0KHJlc3VsdCk7CiB9CiAKK2ludCBSZW5k
ZXJUZXh0Q29udHJvbDo6c2Nyb2xsYmFyVGhpY2tuZXNzKCkgY29uc3QKK3sKKyAgICAvLyBGSVhN
RTogV2Ugc2hvdWxkIGdldCB0aGUgc2l6ZSBvZiB0aGUgc2Nyb2xsYmFyIGZyb20gdGhlIFJlbmRl
clRoZW1lIGluc3RlYWQuCisgICAgcmV0dXJuIFNjcm9sbGJhclRoZW1lOjpuYXRpdmVUaGVtZSgp
LT5zY3JvbGxiYXJUaGlja25lc3MoKTsKK30KKwogdm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6Y2Fs
Y0hlaWdodCgpCiB7Ci0gICAgaW50IHJvd3MgPSAxOwotICAgIGlmIChtX211bHRpTGluZSkKLSAg
ICAgICAgcm93cyA9IHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5y
b3dzKCk7Ci0KLSAgICBpbnQgbGluZSA9IG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5saW5lSGVp
Z2h0KHRydWUsIHRydWUpOwotICAgIGludCB0b0FkZCA9IHBhZGRpbmdUb3AoKSArIHBhZGRpbmdC
b3R0b20oKSArIGJvcmRlclRvcCgpICsgYm9yZGVyQm90dG9tKCk7Ci0KLSAgICBpbnQgaW5uZXJU
b0FkZCA9IG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5ib3JkZXJUb3AoKSArIG1faW5uZXJUZXh0
LT5yZW5kZXJlcigpLT5ib3JkZXJCb3R0b20oKSArCi0gICAgICAgICAgICAgICAgICAgICBtX2lu
bmVyVGV4dC0+cmVuZGVyZXIoKS0+cGFkZGluZ1RvcCgpICsgbV9pbm5lclRleHQtPnJlbmRlcmVy
KCktPnBhZGRpbmdCb3R0b20oKSArCi0gICAgICAgICAgICAgICAgICAgICBtX2lubmVyVGV4dC0+
cmVuZGVyZXIoKS0+bWFyZ2luVG9wKCkgKyBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+bWFyZ2lu
Qm90dG9tKCk7Ci0gICAgCi0gICAgaWYgKG1fcmVzdWx0c0J1dHRvbiAmJiBtX3Jlc3VsdHNCdXR0
b24tPnJlbmRlcmVyKCkpIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyQmxvY2sqPihtX3Jl
c3VsdHNCdXR0b24tPnJlbmRlcmVyKCkpLT5jYWxjSGVpZ2h0KCk7Ci0gICAgICAgIGlubmVyVG9B
ZGQgPSBtYXgoaW5uZXJUb0FkZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3Jlc3VsdHNC
dXR0b24tPnJlbmRlcmVyKCktPmJvcmRlclRvcCgpICsgbV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJl
cigpLT5ib3JkZXJCb3R0b20oKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9yZXN1bHRz
QnV0dG9uLT5yZW5kZXJlcigpLT5wYWRkaW5nVG9wKCkgKyBtX3Jlc3VsdHNCdXR0b24tPnJlbmRl
cmVyKCktPnBhZGRpbmdCb3R0b20oKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9yZXN1
bHRzQnV0dG9uLT5yZW5kZXJlcigpLT5tYXJnaW5Ub3AoKSArIG1fcmVzdWx0c0J1dHRvbi0+cmVu
ZGVyZXIoKS0+bWFyZ2luQm90dG9tKCkpOwotICAgICAgICBsaW5lID0gbWF4KGxpbmUsIG1fcmVz
dWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+aGVpZ2h0KCkpOwotICAgIH0KLSAgICBpZiAobV9jYW5j
ZWxCdXR0b24gJiYgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCkpIHsKLSAgICAgICAgc3RhdGlj
X2Nhc3Q8UmVuZGVyQmxvY2sqPihtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSktPmNhbGNIZWln
aHQoKTsKLSAgICAgICAgaW5uZXJUb0FkZCA9IG1heChpbm5lclRvQWRkLAotICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5ib3JkZXJUb3AoKSArIG1f
Y2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5ib3JkZXJCb3R0b20oKSArCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPnBhZGRpbmdUb3AoKSArIG1f
Y2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5wYWRkaW5nQm90dG9tKCkgKwotICAgICAgICAgICAg
ICAgICAgICAgICAgIG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5tYXJnaW5Ub3AoKSArIG1f
Y2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpLT5tYXJnaW5Cb3R0b20oKSk7Ci0gICAgICAgIGxpbmUg
PSBtYXgobGluZSwgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPmhlaWdodCgpKTsKLSAgICB9
Ci0gICAgdG9BZGQgKz0gaW5uZXJUb0FkZDsKKyAgICBtX2hlaWdodCA9IG1faW5uZXJUZXh0LT5y
ZW5kZXJlcigpLT5ib3JkZXJUb3AoKSArIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5ib3JkZXJC
b3R0b20oKSArCisgICAgICAgICAgICAgICBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+cGFkZGlu
Z1RvcCgpICsgbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnBhZGRpbmdCb3R0b20oKSArCisgICAg
ICAgICAgICAgICBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+bWFyZ2luVG9wKCkgKyBtX2lubmVy
VGV4dC0+cmVuZGVyZXIoKS0+bWFyZ2luQm90dG9tKCk7CisKKyAgICBhZGp1c3RDb250cm9sSGVp
Z2h0QmFzZWRPbkxpbmVIZWlnaHQobV9pbm5lclRleHQtPnJlbmRlcmVyKCktPmxpbmVIZWlnaHQo
dHJ1ZSwgdHJ1ZSkpOworICAgIG1faGVpZ2h0ICs9IHBhZGRpbmdUb3AoKSArIHBhZGRpbmdCb3R0
b20oKSArIGJvcmRlclRvcCgpICsgYm9yZGVyQm90dG9tKCk7CiAKLSAgICAvLyBGSVhNRTogV2Ug
c2hvdWxkIGdldCB0aGUgc2l6ZSBvZiB0aGUgc2Nyb2xsYmFyIGZyb20gdGhlIFJlbmRlclRoZW1l
IGluc3RlYWQuCi0gICAgaW50IHNjcm9sbGJhclNpemUgPSAwOwogICAgIC8vIFdlIGFyZSBhYmxl
IHRvIGhhdmUgYSBob3Jpem9udGFsIHNjcm9sbGJhciBpZiB0aGUgb3ZlcmZsb3cgc3R5bGUgaXMg
c2Nyb2xsLCBvciBpZiBpdHMgYXV0byBhbmQgdGhlcmUncyBubyB3b3JkIHdyYXAuCiAgICAgaWYg
KG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5zdHlsZSgpLT5vdmVyZmxvd1goKSA9PSBPU0NST0xM
IHx8ICAobV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnN0eWxlKCktPm92ZXJmbG93WCgpID09IE9B
VVRPICYmIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5zdHlsZSgpLT53b3JkV3JhcCgpID09IE5v
cm1hbFdvcmRXcmFwKSkKLSAgICAgICAgc2Nyb2xsYmFyU2l6ZSA9IFNjcm9sbGJhclRoZW1lOjpu
YXRpdmVUaGVtZSgpLT5zY3JvbGxiYXJUaGlja25lc3MoKTsKLQotICAgIG1faGVpZ2h0ID0gbGlu
ZSAqIHJvd3MgKyB0b0FkZCArIHNjcm9sbGJhclNpemU7CisgICAgICAgIG1faGVpZ2h0ICs9IHNj
cm9sbGJhclRoaWNrbmVzcygpOwogCiAgICAgUmVuZGVyQmxvY2s6OmNhbGNIZWlnaHQoKTsKIH0K
IAotaW50IFJlbmRlclRleHRDb250cm9sOjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgYiwgYm9vbCBp
c1Jvb3RMaW5lQm94KSBjb25zdAordm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6aGl0SW5uZXJUZXh0
QmxvY2soSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5
KQogewotICAgIGlmIChtX211bHRpTGluZSkKLSAgICAgICAgcmV0dXJuIGhlaWdodCgpICsgbWFy
Z2luVG9wKCkgKyBtYXJnaW5Cb3R0b20oKTsKLSAgICByZXR1cm4gUmVuZGVyQmxvY2s6OmJhc2Vs
aW5lUG9zaXRpb24oYiwgaXNSb290TGluZUJveCk7Ci19Ci0KLWJvb2wgUmVuZGVyVGV4dENvbnRy
b2w6Om5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiByZXF1ZXN0LCBIaXRUZXN0UmVz
dWx0JiByZXN1bHQsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24g
aGl0VGVzdEFjdGlvbikKLXsKLSAgICAvLyBJZiB3ZSdyZSB3aXRoaW4gdGhlIHRleHQgY29udHJv
bCwgd2Ugd2FudCB0byBhY3QgYXMgaWYgd2UndmUgaGl0IHRoZSBpbm5lciB0ZXh0IGJsb2NrIGVs
ZW1lbnQsIGluIGNhc2UgdGhlIHBvaW50Ci0gICAgLy8gd2FzIG9uIHRoZSBjb250cm9sIGJ1dCBu
b3Qgb24gdGhlIGlubmVyIGVsZW1lbnQgKHNlZSBSYWRhciA0NjE3ODQxKS4KLQotICAgIC8vIElu
IGEgc2VhcmNoIGZpZWxkLCB3ZSB3YW50IHRvIGFjdCBhcyBpZiB3ZSd2ZSBoaXQgdGhlIHJlc3Vs
dHMgYmxvY2sgaWYgd2UncmUgdG8gdGhlIGxlZnQgb2YgdGhlIGlubmVyIHRleHQgYmxvY2ssCi0g
ICAgLy8gYW5kIGFjdCBhcyBpZiB3ZSd2ZSBoaXQgdGhlIGNsb3NlIGJsb2NrIGlmIHdlJ3JlIHRv
IHRoZSByaWdodCBvZiB0aGUgaW5uZXIgdGV4dCBibG9jay4KLQotICAgIGlmIChSZW5kZXJCbG9j
azo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIGhpdFRlc3RBY3Rp
b24pICYmCi0gICAgICAgIChyZXN1bHQuaW5uZXJOb2RlKCkgPT0gZWxlbWVudCgpIHx8IHJlc3Vs
dC5pbm5lck5vZGUoKSA9PSBtX2lubmVyQmxvY2spKSB7Ci0gICAgICAgIEludFBvaW50IGxvY2Fs
UG9pbnQgPSBJbnRQb2ludCh4IC0gdHggLSBtX3gsIHkgLSB0eSAtIG1feSk7Ci0gICAgICAgIGlm
IChtX2lubmVyQmxvY2spIHsKLSAgICAgICAgICAgIGludCB0ZXh0TGVmdCA9IHR4ICsgbV94ICsg
bV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT54UG9zKCkgKyBtX2lubmVyVGV4dC0+cmVuZGVyZXIo
KS0+eFBvcygpOwotICAgICAgICAgICAgaW50IHRleHRSaWdodCA9IHRleHRMZWZ0ICsgbV9pbm5l
clRleHQtPnJlbmRlcmVyKCktPndpZHRoKCk7Ci0gICAgICAgICAgICBpZiAobV9yZXN1bHRzQnV0
dG9uICYmIG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSAmJiB4IDwgdGV4dExlZnQpIHsKLSAg
ICAgICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG1fcmVzdWx0c0J1dHRvbi5nZXQoKSk7
Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldExvY2FsUG9pbnQoSW50UG9pbnQobG9jYWxQb2lu
dC54KCkgLSBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+eFBvcygpIC0gbV9pbm5lckJsb2NrLT5y
ZW5kZXJlcigpLT54UG9zKCkgLSBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCktPnhQb3MoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvaW50
LnkoKSAtIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT55UG9zKCkgLSBtX2lubmVyQmxvY2stPnJl
bmRlcmVyKCktPnlQb3MoKSAtIG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+eVBvcygpKSk7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IAotICAgICAgICAg
ICAgaWYgKG1fY2FuY2VsQnV0dG9uICYmIG1fY2FuY2VsQnV0dG9uLT5yZW5kZXJlcigpICYmIHgg
PiB0ZXh0UmlnaHQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0SW5uZXJOb2RlKG1fY2Fu
Y2VsQnV0dG9uLmdldCgpKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuc2V0TG9jYWxQb2ludChJ
bnRQb2ludChsb2NhbFBvaW50LngoKSAtIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT54UG9zKCkg
LSBtX2lubmVyQmxvY2stPnJlbmRlcmVyKCktPnhQb3MoKSAtIG1fY2FuY2VsQnV0dG9uLT5yZW5k
ZXJlcigpLT54UG9zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbG9jYWxQb2ludC55KCkgLSBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+eVBvcygpIC0g
bV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT55UG9zKCkgLSBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVy
ZXIoKS0+eVBvcygpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEhpdCB0aGUgaW5uZXIgdGV4dCBi
bG9jay4KLSAgICAgICAgcmVzdWx0LnNldElubmVyTm9kZShtX2lubmVyVGV4dC5nZXQoKSk7Ci0g
ICAgICAgIHJlc3VsdC5zZXRMb2NhbFBvaW50KEludFBvaW50KGxvY2FsUG9pbnQueCgpIC0gbV9p
bm5lclRleHQtPnJlbmRlcmVyKCktPnhQb3MoKSAtIChtX2lubmVyQmxvY2suZ2V0KCkgPyBtX2lu
bmVyQmxvY2stPnJlbmRlcmVyKCktPnhQb3MoKSA6IDApLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBsb2NhbFBvaW50LnkoKSAtIG1faW5uZXJUZXh0LT5yZW5kZXJlcigp
LT55UG9zKCkgLSAobV9pbm5lckJsb2NrLmdldCgpID8gbV9pbm5lckJsb2NrLT5yZW5kZXJlcigp
LT55UG9zKCkgOiAwKSkpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQor
ICAgIHJlc3VsdC5zZXRJbm5lck5vZGUobV9pbm5lclRleHQuZ2V0KCkpOworICAgIHJlc3VsdC5z
ZXRMb2NhbFBvaW50KEludFBvaW50KHggLSB0eCAtIG1feCAtIG1faW5uZXJUZXh0LT5yZW5kZXJl
cigpLT54UG9zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtIHR5IC0g
bV95IC0gbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPnlQb3MoKSkpOworfQogCi0gICAgcmV0dXJu
IGZhbHNlOwordm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6Zm9yd2FyZEV2ZW50KEV2ZW50KiBldmVu
dCkKK3sKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkuYmx1ckV2ZW50IHx8
IGV2ZW50LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmZvY3VzRXZlbnQpCisgICAgICAgIHJldHVy
bjsKKyAgICBtX2lubmVyVGV4dC0+ZGVmYXVsdEV2ZW50SGFuZGxlcihldmVudCk7CiB9CiAKIElu
dFJlY3QgUmVuZGVyVGV4dENvbnRyb2w6OmNvbnRyb2xDbGlwUmVjdChpbnQgdHgsIGludCB0eSkg
Y29uc3QKQEAgLTcxNyw3NiArNDYzLDYgQEAgSW50UmVjdCBSZW5kZXJUZXh0Q29udHJvbDo6Y29u
dHJvbENsaXBSZQogICAgIHJldHVybiBjbGlwUmVjdDsKIH0KIAotdm9pZCBSZW5kZXJUZXh0Q29u
dHJvbDo6bGF5b3V0KCkKLXsKLSAgICBpbnQgb2xkSGVpZ2h0ID0gbV9oZWlnaHQ7Ci0gICAgY2Fs
Y0hlaWdodCgpOwotICAgIGJvb2wgcmVsYXlvdXRDaGlsZHJlbiA9IG9sZEhlaWdodCAhPSBtX2hl
aWdodDsKLQotICAgIC8vIFNldCB0aGUgdGV4dCBibG9jaydzIGhlaWdodAotICAgIGludCB0ZXh0
QmxvY2tIZWlnaHQgPSBtX2hlaWdodCAtIHBhZGRpbmdUb3AoKSAtIHBhZGRpbmdCb3R0b20oKSAt
IGJvcmRlclRvcCgpIC0gYm9yZGVyQm90dG9tKCk7Ci0gICAgaW50IGN1cnJlbnRUZXh0QmxvY2tI
ZWlnaHQgPSBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+aGVpZ2h0KCk7Ci0gICAgaWYgKG1fbXVs
dGlMaW5lIHx8IG1faW5uZXJCbG9jayB8fCBjdXJyZW50VGV4dEJsb2NrSGVpZ2h0ID4gbV9oZWln
aHQpIHsKLSAgICAgICAgaWYgKHRleHRCbG9ja0hlaWdodCAhPSBjdXJyZW50VGV4dEJsb2NrSGVp
Z2h0KQotICAgICAgICAgICAgcmVsYXlvdXRDaGlsZHJlbiA9IHRydWU7Ci0gICAgICAgIG1faW5u
ZXJUZXh0LT5yZW5kZXJlcigpLT5zdHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKHRleHRCbG9ja0hl
aWdodCwgRml4ZWQpKTsKLSAgICB9Ci0gICAgaWYgKG1faW5uZXJCbG9jaykgewotICAgICAgICBp
ZiAodGV4dEJsb2NrSGVpZ2h0ICE9IG1faW5uZXJCbG9jay0+cmVuZGVyZXIoKS0+aGVpZ2h0KCkp
Ci0gICAgICAgICAgICByZWxheW91dENoaWxkcmVuID0gdHJ1ZTsKLSAgICAgICAgbV9pbm5lckJs
b2NrLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKHRleHRCbG9ja0hlaWdo
dCwgRml4ZWQpKTsKLSAgICB9Ci0KLSAgICBpbnQgb2xkV2lkdGggPSBtX3dpZHRoOwotICAgIGNh
bGNXaWR0aCgpOwotICAgIGlmIChvbGRXaWR0aCAhPSBtX3dpZHRoKQotICAgICAgICByZWxheW91
dENoaWxkcmVuID0gdHJ1ZTsKLQotICAgIGludCBzZWFyY2hFeHRyYXNXaWR0aCA9IDA7Ci0gICAg
aWYgKG1fcmVzdWx0c0J1dHRvbiAmJiBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCkpIHsKLSAg
ICAgICAgbV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpLT5jYWxjV2lkdGgoKTsKLSAgICAgICAg
c2VhcmNoRXh0cmFzV2lkdGggKz0gbV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpLT53aWR0aCgp
OwotICAgIH0KLSAgICBpZiAobV9jYW5jZWxCdXR0b24gJiYgbV9jYW5jZWxCdXR0b24tPnJlbmRl
cmVyKCkpIHsKLSAgICAgICAgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCktPmNhbGNXaWR0aCgp
OwotICAgICAgICBzZWFyY2hFeHRyYXNXaWR0aCArPSBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIo
KS0+d2lkdGgoKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHRleHQgYmxvY2sncyB3aWR0aAot
ICAgIGludCB0ZXh0QmxvY2tXaWR0aCA9IG1fd2lkdGggLSBwYWRkaW5nTGVmdCgpIC0gcGFkZGlu
Z1JpZ2h0KCkgLSBib3JkZXJMZWZ0KCkgLSBib3JkZXJSaWdodCgpIC0KLSAgICAgICAgICAgICAg
ICAgICAgICAgICBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+cGFkZGluZ0xlZnQoKSAtIG1faW5u
ZXJUZXh0LT5yZW5kZXJlcigpLT5wYWRkaW5nUmlnaHQoKSAtIHNlYXJjaEV4dHJhc1dpZHRoOwot
ICAgIGlmICh0ZXh0QmxvY2tXaWR0aCAhPSBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+d2lkdGgo
KSkKLSAgICAgICAgcmVsYXlvdXRDaGlsZHJlbiA9IHRydWU7Ci0gICAgbV9pbm5lclRleHQtPnJl
bmRlcmVyKCktPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aCh0ZXh0QmxvY2tXaWR0aCwgRml4ZWQp
KTsKLSAgICBpZiAobV9pbm5lckJsb2NrKSB7Ci0gICAgICAgIGludCBpbm5lckJsb2NrV2lkdGgg
PSBtX3dpZHRoIC0gcGFkZGluZ0xlZnQoKSAtIHBhZGRpbmdSaWdodCgpIC0gYm9yZGVyTGVmdCgp
IC0gYm9yZGVyUmlnaHQoKTsKLSAgICAgICAgaWYgKGlubmVyQmxvY2tXaWR0aCAhPSBtX2lubmVy
QmxvY2stPnJlbmRlcmVyKCktPndpZHRoKCkpCi0gICAgICAgICAgICByZWxheW91dENoaWxkcmVu
ID0gdHJ1ZTsKLSAgICAgICAgbV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT5zdHlsZSgpLT5zZXRX
aWR0aChMZW5ndGgoaW5uZXJCbG9ja1dpZHRoLCBGaXhlZCkpOwotICAgIH0KLQotICAgIFJlbmRl
ckJsb2NrOjpsYXlvdXRCbG9jayhyZWxheW91dENoaWxkcmVuKTsKLSAgICAKLSAgICAvLyBGb3Ig
dGV4dCBmaWVsZHMsIGNlbnRlciB0aGUgaW5uZXIgdGV4dCB2ZXJ0aWNhbGx5Ci0gICAgLy8gRG9u
J3QgZG8gdGhpcyBmb3Igc2VhcmNoIGZpZWxkcywgc2luY2Ugd2UgZG9uJ3QgaG9ub3IgaGVpZ2h0
IGZvciB0aGVtCi0gICAgaWYgKCFtX211bHRpTGluZSkgewotICAgICAgICBjdXJyZW50VGV4dEJs
b2NrSGVpZ2h0ID0gbV9pbm5lclRleHQtPnJlbmRlcmVyKCktPmhlaWdodCgpOwotICAgICAgICBp
ZiAoIW1faW5uZXJCbG9jayAmJiBjdXJyZW50VGV4dEJsb2NrSGVpZ2h0IDwgbV9oZWlnaHQpCi0g
ICAgICAgICAgICBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+c2V0UG9zKG1faW5uZXJUZXh0LT5y
ZW5kZXJlcigpLT54UG9zKCksIChtX2hlaWdodCAtIGN1cnJlbnRUZXh0QmxvY2tIZWlnaHQpIC8g
Mik7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlclRleHRDb250cm9sOjpwYWludChQYWludEluZm8m
IHBhaW50SW5mbywgaW50IHR4LCBpbnQgdHkpCi17Ci0gICAgUmVuZGVyQmxvY2s6OnBhaW50KHBh
aW50SW5mbywgdHgsIHR5KTsKLSAgICBpZiAocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VC
bG9ja0JhY2tncm91bmQgJiYgbV9zaG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0b3IpIHsKLSAgICAg
ICAgSW50UmVjdCBjb250ZW50c1JlY3QgPSBjb250ZW50Qm94KCk7Ci0gICAgICAgIC8vIENvbnZl
cnQgdGhlIHJlY3QgaW50byB0aGUgY29vcmRzIHVzZWQgZm9yIHBhaW50aW5nIHRoZSBjb250ZW50
Ci0gICAgICAgIGNvbnRlbnRzUmVjdC5tb3ZlKHR4ICsgeFBvcygpLCB0eSArIHlQb3MoKSk7Ci0g
ICAgICAgIHRoZW1lKCktPnBhaW50Q2Fwc0xvY2tJbmRpY2F0b3IodGhpcywgcGFpbnRJbmZvLCBj
b250ZW50c1JlY3QpOwotICAgIH0KLX0gCi0KIHZvaWQgUmVuZGVyVGV4dENvbnRyb2w6OmNhbGNQ
cmVmV2lkdGhzKCkKIHsKICAgICBBU1NFUlQocHJlZldpZHRoc0RpcnR5KCkpOwpAQCAtODAxLDI3
ICs0NzcsNyBAQCB2b2lkIFJlbmRlclRleHRDb250cm9sOjpjYWxjUHJlZldpZHRocygpCiAgICAg
ICAgIC8vICh1c2luZyAiMCIgYXMgdGhlIG5vbWluYWwgY2hhcmFjdGVyKS4KICAgICAgICAgY29u
c3QgVUNoYXIgY2ggPSAnMCc7CiAgICAgICAgIGZsb2F0IGNoYXJXaWR0aCA9IHN0eWxlKCktPmZv
bnQoKS5mbG9hdFdpZHRoKFRleHRSdW4oJmNoLCAxLCBmYWxzZSwgMCwgMCwgZmFsc2UsIGZhbHNl
LCBmYWxzZSkpOwotICAgICAgICBpbnQgZmFjdG9yOwotICAgICAgICBpbnQgc2Nyb2xsYmFyU2l6
ZSA9IDA7Ci0gICAgICAgIGlmIChtX211bHRpTGluZSkgewotICAgICAgICAgICAgZmFjdG9yID0g
c3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUoKSktPmNvbHMoKTsKLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgZ2V0IHRoZSBzaXplIG9mIHRoZSBzY3JvbGxiYXIg
ZnJvbSB0aGUgUmVuZGVyVGhlbWUgaW5zdGVhZC4KLSAgICAgICAgICAgIGlmIChtX2lubmVyVGV4
dC0+cmVuZGVyZXIoKS0+c3R5bGUoKS0+b3ZlcmZsb3dZKCkgIT0gT0hJRERFTikKLSAgICAgICAg
ICAgICAgICBzY3JvbGxiYXJTaXplID0gU2Nyb2xsYmFyVGhlbWU6Om5hdGl2ZVRoZW1lKCktPnNj
cm9sbGJhclRoaWNrbmVzcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmFjdG9y
ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPnNpemUoKTsKLSAgICAg
ICAgICAgIGlmIChmYWN0b3IgPD0gMCkKLSAgICAgICAgICAgICAgICBmYWN0b3IgPSAyMDsKLSAg
ICAgICAgfQotICAgICAgICBtX21heFByZWZXaWR0aCA9IHN0YXRpY19jYXN0PGludD4oY2VpbGYo
Y2hhcldpZHRoICogZmFjdG9yKSkgKyBzY3JvbGxiYXJTaXplICsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+cGFkZGluZ0xlZnQoKSArIG1faW5uZXJU
ZXh0LT5yZW5kZXJlcigpLT5wYWRkaW5nUmlnaHQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAg
ICAgaWYgKG1fcmVzdWx0c0J1dHRvbiAmJiBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCkpCi0g
ICAgICAgICAgICBtX21heFByZWZXaWR0aCArPSBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCkt
PmJvcmRlckxlZnQoKSArIG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+Ym9yZGVyUmlnaHQo
KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Jlc3VsdHNCdXR0b24tPnJlbmRl
cmVyKCktPnBhZGRpbmdMZWZ0KCkgKyBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCktPnBhZGRp
bmdSaWdodCgpOwotICAgICAgICBpZiAobV9jYW5jZWxCdXR0b24gJiYgbV9jYW5jZWxCdXR0b24t
PnJlbmRlcmVyKCkpCi0gICAgICAgICAgICBtX21heFByZWZXaWR0aCArPSBtX2NhbmNlbEJ1dHRv
bi0+cmVuZGVyZXIoKS0+Ym9yZGVyTGVmdCgpICsgbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCkt
PmJvcmRlclJpZ2h0KCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jYW5jZWxC
dXR0b24tPnJlbmRlcmVyKCktPnBhZGRpbmdMZWZ0KCkgKyBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVy
ZXIoKS0+cGFkZGluZ1JpZ2h0KCk7CisgICAgICAgIG1fbWF4UHJlZldpZHRoID0gcHJlZmVycmVk
Q29udGVudFdpZHRoKGNoYXJXaWR0aCkgKyBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+cGFkZGlu
Z0xlZnQoKSArIG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5wYWRkaW5nUmlnaHQoKTsKICAgICB9
CiAKICAgICBpZiAoc3R5bGUoKS0+bWluV2lkdGgoKS5pc0ZpeGVkKCkgJiYgc3R5bGUoKS0+bWlu
V2lkdGgoKS52YWx1ZSgpID4gMCkgewpAQCAtODQ1LDM5ICs1MDEsMTYgQEAgdm9pZCBSZW5kZXJU
ZXh0Q29udHJvbDo6Y2FsY1ByZWZXaWR0aHMoKQogICAgIHNldFByZWZXaWR0aHNEaXJ0eShmYWxz
ZSk7CiB9CiAKLXZvaWQgUmVuZGVyVGV4dENvbnRyb2w6OmZvcndhcmRFdmVudChFdmVudCogZXZ0
KQotewotICAgIGlmIChldnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkuYmx1ckV2ZW50KSB7Ci0g
ICAgICAgIFJlbmRlck9iamVjdCogaW5uZXJSZW5kZXJlciA9IG1faW5uZXJUZXh0LT5yZW5kZXJl
cigpOwotICAgICAgICBpZiAoaW5uZXJSZW5kZXJlcikgewotICAgICAgICAgICAgUmVuZGVyTGF5
ZXIqIGlubmVyTGF5ZXIgPSBpbm5lclJlbmRlcmVyLT5sYXllcigpOwotICAgICAgICAgICAgaWYg
KGlubmVyTGF5ZXIgJiYgIW1fbXVsdGlMaW5lKQotICAgICAgICAgICAgICAgIGlubmVyTGF5ZXIt
PnNjcm9sbFRvT2Zmc2V0KHN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCA/IGlubmVyTGF5ZXIt
PnNjcm9sbFdpZHRoKCkgOiAwLCAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXBzTG9ja1N0YXRl
TWF5SGF2ZUNoYW5nZWQoKTsKLSAgICB9IGVsc2UgaWYgKGV2dC0+dHlwZSgpID09IGV2ZW50TmFt
ZXMoKS5mb2N1c0V2ZW50KQotICAgICAgICBjYXBzTG9ja1N0YXRlTWF5SGF2ZUNoYW5nZWQoKTsK
LSAgICBlbHNlIHsKLSAgICAgICAgRmxvYXRQb2ludCBsb2NhbFBvaW50ID0gbV9pbm5lclRleHQt
PnJlbmRlcmVyKCktPmFic29sdXRlVG9Mb2NhbChGbG9hdFBvaW50KHN0YXRpY19jYXN0PE1vdXNl
RXZlbnQqPihldnQpLT5wYWdlWCgpLCBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZ0KS0+cGFn
ZVkoKSksIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgaWYgKGV2dC0+aXNNb3VzZUV2ZW50KCkgJiYg
bV9yZXN1bHRzQnV0dG9uICYmIGxvY2FsUG9pbnQueCgpIDwgbV9pbm5lclRleHQtPnJlbmRlcmVy
KCktPmJvcmRlckJveCgpLngoKSkKLSAgICAgICAgICAgIG1fcmVzdWx0c0J1dHRvbi0+ZGVmYXVs
dEV2ZW50SGFuZGxlcihldnQpOwotICAgICAgICBlbHNlIGlmIChldnQtPmlzTW91c2VFdmVudCgp
ICYmIG1fY2FuY2VsQnV0dG9uICYmIGxvY2FsUG9pbnQueCgpID4gbV9pbm5lclRleHQtPnJlbmRl
cmVyKCktPmJvcmRlckJveCgpLnJpZ2h0KCkpCi0gICAgICAgICAgICBtX2NhbmNlbEJ1dHRvbi0+
ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX2lu
bmVyVGV4dC0+ZGVmYXVsdEV2ZW50SGFuZGxlcihldnQpOwotICAgIH0KLX0KLQogdm9pZCBSZW5k
ZXJUZXh0Q29udHJvbDo6c2VsZWN0aW9uQ2hhbmdlZChib29sIHVzZXJUcmlnZ2VyZWQpCiB7Ci0g
ICAgSFRNTEZvcm1Db250cm9sRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxGb3Jt
Q29udHJvbEVsZW1lbnQqPihub2RlKCkpOwotICAgIGlmIChtX211bHRpTGluZSkKLSAgICAgICAg
c3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KGVsZW1lbnQpLT5jYWNoZVNlbGVjdGlv
bihzZWxlY3Rpb25TdGFydCgpLCBzZWxlY3Rpb25FbmQoKSk7Ci0gICAgZWxzZQotICAgICAgICBz
dGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4oZWxlbWVudCktPmNhY2hlU2VsZWN0aW9uKHNl
bGVjdGlvblN0YXJ0KCksIHNlbGVjdGlvbkVuZCgpKTsKLSAgICBpZiAoRnJhbWUqIGZyYW1lID0g
ZG9jdW1lbnQoKS0+ZnJhbWUoKSkKLSAgICAgICAgaWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+aXNS
YW5nZSgpICYmIHVzZXJUcmlnZ2VyZWQpCisgICAgY2FjaGVTZWxlY3Rpb24oc2VsZWN0aW9uU3Rh
cnQoKSwgc2VsZWN0aW9uRW5kKCkpOworCisgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50
KCktPmZyYW1lKCkpIHsKKyAgICAgICAgaWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+aXNSYW5nZSgp
ICYmIHVzZXJUcmlnZ2VyZWQpIHsKKyAgICAgICAgICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnQq
IGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRm9ybUNvbnRyb2xFbGVtZW50Kj4obm9kZSgpKTsK
ICAgICAgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoRXZlbnRGb3JUeXBlKGV2ZW50TmFtZXMoKS5z
ZWxlY3RFdmVudCwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIFJl
bmRlclRleHRDb250cm9sOjphZGRGb2N1c1JpbmdSZWN0cyhHcmFwaGljc0NvbnRleHQqIGdyYXBo
aWNzQ29udGV4dCwgaW50IHR4LCBpbnQgdHkpCkBAIC05MzIsMjE0ICs1NjUsNiBAQCB2b2lkIFJl
bmRlclRleHRDb250cm9sOjpzZXRTY3JvbGxUb3AoaW50CiAgICAgICAgIG1faW5uZXJUZXh0LT5z
ZXRTY3JvbGxUb3AobmV3VG9wKTsKIH0KIAotY29uc3QgQXRvbWljU3RyaW5nJiBSZW5kZXJUZXh0
Q29udHJvbDo6YXV0b3NhdmVOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
RWxlbWVudCo+KG5vZGUoKSktPmdldEF0dHJpYnV0ZShhdXRvc2F2ZUF0dHIpOwotfQotCi12b2lk
IFJlbmRlclRleHRDb250cm9sOjphZGRTZWFyY2hSZXN1bHQoKQotewotICAgIEFTU0VSVCghbV9t
dWx0aUxpbmUpOwotCi0gICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxI
VE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKLSAgICBpZiAoaW5wdXQtPm1heFJlc3VsdHMoKSA8
PSAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcgdmFsdWUgPSBpbnB1dC0+dmFsdWUo
KTsKLSAgICBpZiAodmFsdWUuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBTZXR0
aW5ncyogc2V0dGluZ3MgPSBkb2N1bWVudCgpLT5zZXR0aW5ncygpOwotICAgIGlmICghc2V0dGlu
Z3MgfHwgc2V0dGluZ3MtPnByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaW50IHNpemUgPSBzdGF0aWNfY2FzdDxpbnQ+KG1fcmVjZW50U2VhcmNoZXMuc2l6
ZSgpKTsKLSAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gMDsgLS1pKQotICAgICAgICBp
ZiAobV9yZWNlbnRTZWFyY2hlc1tpXSA9PSB2YWx1ZSkKLSAgICAgICAgICAgIG1fcmVjZW50U2Vh
cmNoZXMucmVtb3ZlKGkpOwotCi0gICAgbV9yZWNlbnRTZWFyY2hlcy5pbnNlcnQoMCwgdmFsdWUp
OwotICAgIHdoaWxlIChzdGF0aWNfY2FzdDxpbnQ+KG1fcmVjZW50U2VhcmNoZXMuc2l6ZSgpKSA+
IGlucHV0LT5tYXhSZXN1bHRzKCkpCi0gICAgICAgIG1fcmVjZW50U2VhcmNoZXMucmVtb3ZlTGFz
dCgpOwotCi0gICAgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lID0gYXV0b3NhdmVOYW1lKCk7Ci0g
ICAgaWYgKCFtX3NlYXJjaFBvcHVwKQotICAgICAgICBtX3NlYXJjaFBvcHVwID0gU2VhcmNoUG9w
dXBNZW51OjpjcmVhdGUodGhpcyk7Ci0gICAgbV9zZWFyY2hQb3B1cC0+c2F2ZVJlY2VudFNlYXJj
aGVzKG5hbWUsIG1fcmVjZW50U2VhcmNoZXMpOwotfQotCi12b2lkIFJlbmRlclRleHRDb250cm9s
OjpzaG93UG9wdXAoKQotewotICAgIGlmIChtX3NlYXJjaFBvcHVwSXNWaXNpYmxlKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpZiAoIW1fc2VhcmNoUG9wdXApCi0gICAgICAgIG1fc2VhcmNoUG9w
dXAgPSBTZWFyY2hQb3B1cE1lbnU6OmNyZWF0ZSh0aGlzKTsKLQotICAgIGlmICghbV9zZWFyY2hQ
b3B1cC0+ZW5hYmxlZCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgbV9zZWFyY2hQb3B1
cElzVmlzaWJsZSA9IHRydWU7Ci0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUgPSBhdXRv
c2F2ZU5hbWUoKTsKLSAgICBtX3NlYXJjaFBvcHVwLT5sb2FkUmVjZW50U2VhcmNoZXMobmFtZSwg
bV9yZWNlbnRTZWFyY2hlcyk7Ci0KLSAgICAvLyBUcmltIHRoZSByZWNlbnQgc2VhcmNoZXMgbGlz
dCBpZiB0aGUgbWF4aW11bSBzaXplIGhhcyBjaGFuZ2VkIHNpbmNlIHdlIGxhc3Qgc2F2ZWQuCi0g
ICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50
Kj4obm9kZSgpKTsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8aW50PihtX3JlY2VudFNlYXJjaGVzLnNp
emUoKSkgPiBpbnB1dC0+bWF4UmVzdWx0cygpKSB7Ci0gICAgICAgIGRvCi0gICAgICAgICAgICBt
X3JlY2VudFNlYXJjaGVzLnJlbW92ZUxhc3QoKTsKLSAgICAgICAgd2hpbGUgKHN0YXRpY19jYXN0
PGludD4obV9yZWNlbnRTZWFyY2hlcy5zaXplKCkpID4gaW5wdXQtPm1heFJlc3VsdHMoKSk7Ci0g
ICAgICAgIG1fc2VhcmNoUG9wdXAtPnNhdmVSZWNlbnRTZWFyY2hlcyhuYW1lLCBtX3JlY2VudFNl
YXJjaGVzKTsKLSAgICB9Ci0KLSAgICBtX3NlYXJjaFBvcHVwLT5zaG93KGFic29sdXRlQm91bmRp
bmdCb3hSZWN0KHRydWUpLCBkb2N1bWVudCgpLT52aWV3KCksIC0xKTsKLX0KLQotdm9pZCBSZW5k
ZXJUZXh0Q29udHJvbDo6aGlkZVBvcHVwKCkKLXsKLSAgICBpZiAobV9zZWFyY2hQb3B1cCkKLSAg
ICAgICAgbV9zZWFyY2hQb3B1cC0+aGlkZSgpOwotICAgIG1fc2VhcmNoUG9wdXBJc1Zpc2libGUg
PSBmYWxzZTsKLX0KLQotdm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6dmFsdWVDaGFuZ2VkKHVuc2ln
bmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlRXZlbnRzKQotewotICAgIEFTU0VSVChzdGF0aWNfY2Fz
dDxpbnQ+KGxpc3RJbmRleCkgPCBsaXN0U2l6ZSgpKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50KiBp
bnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpOwotICAgIGlmIChz
dGF0aWNfY2FzdDxpbnQ+KGxpc3RJbmRleCkgPT0gKGxpc3RTaXplKCkgLSAxKSkgewotICAgICAg
ICBpZiAoZmlyZUV2ZW50cykgewotICAgICAgICAgICAgbV9yZWNlbnRTZWFyY2hlcy5jbGVhcigp
OwotICAgICAgICAgICAgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lID0gYXV0b3NhdmVOYW1lKCk7
Ci0gICAgICAgICAgICBpZiAoIW5hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYg
KCFtX3NlYXJjaFBvcHVwKQotICAgICAgICAgICAgICAgICAgICBtX3NlYXJjaFBvcHVwID0gU2Vh
cmNoUG9wdXBNZW51OjpjcmVhdGUodGhpcyk7Ci0gICAgICAgICAgICAgICAgbV9zZWFyY2hQb3B1
cC0+c2F2ZVJlY2VudFNlYXJjaGVzKG5hbWUsIG1fcmVjZW50U2VhcmNoZXMpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5wdXQtPnNldFZhbHVlKGl0
ZW1UZXh0KGxpc3RJbmRleCkpOwotICAgICAgICBpZiAoZmlyZUV2ZW50cykKLSAgICAgICAgICAg
IGlucHV0LT5vblNlYXJjaCgpOwotICAgICAgICBpbnB1dC0+c2VsZWN0KCk7Ci0gICAgfQotfQot
Ci1TdHJpbmcgUmVuZGVyVGV4dENvbnRyb2w6Oml0ZW1UZXh0KHVuc2lnbmVkIGxpc3RJbmRleCkg
Y29uc3QKLXsKLSAgICBpbnQgc2l6ZSA9IGxpc3RTaXplKCk7Ci0gICAgaWYgKHNpemUgPT0gMSkg
ewotICAgICAgICBBU1NFUlQoIWxpc3RJbmRleCk7Ci0gICAgICAgIHJldHVybiBzZWFyY2hNZW51
Tm9SZWNlbnRTZWFyY2hlc1RleHQoKTsKLSAgICB9Ci0gICAgaWYgKCFsaXN0SW5kZXgpCi0gICAg
ICAgIHJldHVybiBzZWFyY2hNZW51UmVjZW50U2VhcmNoZXNUZXh0KCk7Ci0gICAgaWYgKGl0ZW1J
c1NlcGFyYXRvcihsaXN0SW5kZXgpKQotICAgICAgICByZXR1cm4gU3RyaW5nKCk7Ci0gICAgaWYg
KHN0YXRpY19jYXN0PGludD4obGlzdEluZGV4KSA9PSAoc2l6ZSAtIDEpKQotICAgICAgICByZXR1
cm4gc2VhcmNoTWVudUNsZWFyUmVjZW50U2VhcmNoZXNUZXh0KCk7Ci0gICAgcmV0dXJuIG1fcmVj
ZW50U2VhcmNoZXNbbGlzdEluZGV4IC0gMV07Ci19Ci0KLWJvb2wgUmVuZGVyVGV4dENvbnRyb2w6
Oml0ZW1Jc0VuYWJsZWQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdAotewotICAgICBpZiAoIWxp
c3RJbmRleCB8fCBpdGVtSXNTZXBhcmF0b3IobGlzdEluZGV4KSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1Qb3B1cE1lbnVTdHlsZSBSZW5kZXJUZXh0Q29u
dHJvbDo6aXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bWVudVN0eWxlKCk7Ci19Ci0KLVBvcHVwTWVudVN0eWxlIFJlbmRlclRleHRDb250cm9sOjptZW51
U3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiBQb3B1cE1lbnVTdHlsZShzdHlsZSgpLT5jb2xv
cigpLCBzdHlsZSgpLT5iYWNrZ3JvdW5kQ29sb3IoKSwgc3R5bGUoKS0+Zm9udCgpLCBzdHlsZSgp
LT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSk7Ci19Ci0KLUhvc3RXaW5kb3cqIFJlbmRlclRleHRD
b250cm9sOjpob3N0V2luZG93KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZG9jdW1lbnQoKS0+dmll
dygpLT5ob3N0V2luZG93KCk7Ci19Ci0KLVBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBSZW5kZXJUZXh0
Q29udHJvbDo6Y3JlYXRlU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCogY2xpZW50LCBTY3JvbGxi
YXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNp
emUpCi17Ci0gICAgUmVmUHRyPFNjcm9sbGJhcj4gd2lkZ2V0OwotICAgIGJvb2wgaGFzQ3VzdG9t
U2Nyb2xsYmFyU3R5bGUgPSBzdHlsZSgpLT5oYXNQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6U0NS
T0xMQkFSKTsKLSAgICBpZiAoaGFzQ3VzdG9tU2Nyb2xsYmFyU3R5bGUpCi0gICAgICAgIHdpZGdl
dCA9IFJlbmRlclNjcm9sbGJhcjo6Y3JlYXRlQ3VzdG9tU2Nyb2xsYmFyKGNsaWVudCwgb3JpZW50
YXRpb24sIHRoaXMpOwotICAgIGVsc2UKLSAgICAgICAgd2lkZ2V0ID0gU2Nyb2xsYmFyOjpjcmVh
dGVOYXRpdmVTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgY29udHJvbFNpemUpOwotICAg
IHJldHVybiB3aWRnZXQucmVsZWFzZSgpOwotfQotCi1pbnQgUmVuZGVyVGV4dENvbnRyb2w6OmNs
aWVudEluc2V0TGVmdCgpIGNvbnN0Ci17Ci0gICAgLy8gSW5zZXQgdGhlIG1lbnUgYnkgdGhlIHJh
ZGl1cyBvZiB0aGUgY2FwIG9uIHRoZSBsZWZ0IHNvIHRoYXQKLSAgICAvLyBpdCBvbmx5IHJ1bnMg
YWxvbmcgdGhlIHN0cmFpZ2h0IHBhcnQgb2YgdGhlIGJlemVsLgotICAgIHJldHVybiBoZWlnaHQo
KSAvIDI7Ci19Ci0KLWludCBSZW5kZXJUZXh0Q29udHJvbDo6Y2xpZW50SW5zZXRSaWdodCgpIGNv
bnN0Ci17Ci0gICAgLy8gSW5zZXQgdGhlIG1lbnUgYnkgdGhlIHJhZGl1cyBvZiB0aGUgY2FwIG9u
IHRoZSByaWdodCBzbyB0aGF0Ci0gICAgLy8gaXQgb25seSBydW5zIGFsb25nIHRoZSBzdHJhaWdo
dCBwYXJ0IG9mIHRoZSBiZXplbCAodW5sZXNzIGl0IG5lZWRzCi0gICAgLy8gdG8gYmUgd2lkZXIp
LgotICAgIHJldHVybiBoZWlnaHQoKSAvIDI7Ci19Ci0KLWludCBSZW5kZXJUZXh0Q29udHJvbDo6
Y2xpZW50UGFkZGluZ0xlZnQoKSBjb25zdAotewotICAgIGludCBwYWRkaW5nID0gcGFkZGluZ0xl
ZnQoKTsKLSAgICBpZiAobV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpKQotICAgICAgICBwYWRk
aW5nICs9IG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKS0+d2lkdGgoKTsgCi0gICAgcmV0dXJu
IHBhZGRpbmc7Ci19Ci0KLWludCBSZW5kZXJUZXh0Q29udHJvbDo6Y2xpZW50UGFkZGluZ1JpZ2h0
KCkgY29uc3QKLXsKLSAgICBpbnQgcGFkZGluZyA9IHBhZGRpbmdSaWdodCgpOwotICAgIGlmICht
X2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSkKLSAgICAgICAgcGFkZGluZyArPSBtX2NhbmNlbEJ1
dHRvbi0+cmVuZGVyZXIoKS0+d2lkdGgoKTsgCi0gICAgcmV0dXJuIHBhZGRpbmc7Ci19Ci0KLWlu
dCBSZW5kZXJUZXh0Q29udHJvbDo6bGlzdFNpemUoKSBjb25zdAotewotICAgIC8vIElmIHRoZXJl
IGFyZSBubyByZWNlbnQgc2VhcmNoZXMsIHRoZW4gb3VyIG1lbnUgd2lsbCBoYXZlIDEgIk5vIHJl
Y2VudCBzZWFyY2hlcyIgaXRlbS4KLSAgICBpZiAoIW1fcmVjZW50U2VhcmNoZXMuc2l6ZSgpKQot
ICAgICAgICByZXR1cm4gMTsKLSAgICAvLyBPdGhlcndpc2UsIGxlYXZlIHJvb20gaW4gdGhlIG1l
bnUgZm9yIGEgaGVhZGVyLCBhIHNlcGFyYXRvciwgYW5kIHRoZSAiQ2xlYXIgcmVjZW50IHNlYXJj
aGVzIiBpdGVtLgotICAgIHJldHVybiBtX3JlY2VudFNlYXJjaGVzLnNpemUoKSArIDM7Ci19Ci0K
LWludCBSZW5kZXJUZXh0Q29udHJvbDo6c2VsZWN0ZWRJbmRleCgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIC0xOwotfQotCi1ib29sIFJlbmRlclRleHRDb250cm9sOjppdGVtSXNTZXBhcmF0b3IodW5z
aWduZWQgbGlzdEluZGV4KSBjb25zdAotewotICAgLy8gVGhlIHNlcGFyYXRvciB3aWxsIGJlIHRo
ZSBzZWNvbmQgdG8gbGFzdCBpdGVtIGluIG91ciBsaXN0LgotICAgcmV0dXJuIHN0YXRpY19jYXN0
PGludD4obGlzdEluZGV4KSA9PSAobGlzdFNpemUoKSAtIDIpOwotfQotCi1ib29sIFJlbmRlclRl
eHRDb250cm9sOjppdGVtSXNMYWJlbCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGxpc3RJbmRleCA9PSAwOwotfQotCi1ib29sIFJlbmRlclRleHRDb250cm9sOjppdGVt
SXNTZWxlY3RlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi12b2lkIFJlbmRlclRleHRDb250cm9sOjpzZXRUZXh0RnJvbUl0ZW0odW5zaWduZWQg
bGlzdEluZGV4KQotewotICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkp
LT5zZXRWYWx1ZShpdGVtVGV4dChsaXN0SW5kZXgpKTsKLX0KLQogYm9vbCBSZW5kZXJUZXh0Q29u
dHJvbDo6c2Nyb2xsKFNjcm9sbERpcmVjdGlvbiBkaXJlY3Rpb24sIFNjcm9sbEdyYW51bGFyaXR5
IGdyYW51bGFyaXR5LCBmbG9hdCBtdWx0aXBsaWVyKQogewogICAgIFJlbmRlckxheWVyKiBsYXll
ciA9IG1faW5uZXJUZXh0LT5yZW5kZXJlcigpLT5sYXllcigpOwpAQCAtMTE0OCwzMiArNTczLDYg
QEAgYm9vbCBSZW5kZXJUZXh0Q29udHJvbDo6c2Nyb2xsKFNjcm9sbERpcgogICAgIHJldHVybiBS
ZW5kZXJPYmplY3Q6OnNjcm9sbChkaXJlY3Rpb24sIGdyYW51bGFyaXR5LCBtdWx0aXBsaWVyKTsK
IH0KIAotdm9pZCBSZW5kZXJUZXh0Q29udHJvbDo6c2VhcmNoRXZlbnRUaW1lckZpcmVkKFRpbWVy
PFJlbmRlclRleHRDb250cm9sPiopCi17Ci0gICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVu
dCo+KG5vZGUoKSktPm9uU2VhcmNoKCk7Ci19Ci0KLXZvaWQgUmVuZGVyVGV4dENvbnRyb2w6OnN0
b3BTZWFyY2hFdmVudFRpbWVyKCkKLXsKLSAgICBtX3NlYXJjaEV2ZW50VGltZXIuc3RvcCgpOwot
fQotCi12b2lkIFJlbmRlclRleHRDb250cm9sOjpzdGFydFNlYXJjaEV2ZW50VGltZXIoKQotewot
ICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRleHQoKS5sZW5ndGgoKTsKLQotICAgIC8vIElmIHRoZXJl
J3Mgbm8gdGV4dCwgZmlyZSB0aGUgZXZlbnQgcmlnaHQgYXdheS4KLSAgICBpZiAoIWxlbmd0aCkg
ewotICAgICAgICBtX3NlYXJjaEV2ZW50VGltZXIuc3RvcCgpOwotICAgICAgICBzdGF0aWNfY2Fz
dDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+b25TZWFyY2goKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIC8vIEFmdGVyIHR5cGluZyB0aGUgZmlyc3Qga2V5LCB3ZSB3YWl0IDAu
NSBzZWNvbmRzLgotICAgIC8vIEFmdGVyIHRoZSBzZWNvbmQga2V5LCAwLjQgc2Vjb25kcywgdGhl
biAwLjMsIHRoZW4gMC4yIGZyb20gdGhlbiBvbi4KLSAgICBtX3NlYXJjaEV2ZW50VGltZXIuc3Rh
cnRPbmVTaG90KG1heCgwLjIsIDAuNiAtIDAuMSAqIGxlbmd0aCkpOwotfQotCiBib29sIFJlbmRl
clRleHRDb250cm9sOjppc1Njcm9sbGFibGUoKSBjb25zdAogewogICAgIGlmIChtX2lubmVyVGV4
dCAmJiBtX2lubmVyVGV4dC0+cmVuZGVyZXIoKS0+aXNTY3JvbGxhYmxlKCkpCkBAIC0xMTgxLDQy
ICs1ODAsOSBAQCBib29sIFJlbmRlclRleHRDb250cm9sOjppc1Njcm9sbGFibGUoKSBjCiAgICAg
cmV0dXJuIFJlbmRlck9iamVjdDo6aXNTY3JvbGxhYmxlKCk7CiB9CiAKLUZvbnRTZWxlY3Rvciog
UmVuZGVyVGV4dENvbnRyb2w6OmZvbnRTZWxlY3RvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRv
Y3VtZW50KCktPnN0eWxlU2VsZWN0b3IoKS0+Zm9udFNlbGVjdG9yKCk7Ci19Ci0KLXZvaWQgUmVu
ZGVyVGV4dENvbnRyb2w6OnVwZGF0ZVBsYWNlaG9sZGVyVmlzaWJpbGl0eSgpCi17Ci0gICAgUmVu
ZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gbV9pbm5lckJsb2NrID8gbV9pbm5lckJsb2NrLT5yZW5k
ZXJlcigpLT5zdHlsZSgpIDogc3R5bGUoKTsKLSAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IHRleHRC
bG9ja1N0eWxlID0gY3JlYXRlSW5uZXJUZXh0U3R5bGUocGFyZW50U3R5bGUpOwotICAgIG1faW5u
ZXJUZXh0LT5yZW5kZXJlcigpLT5zZXRTdHlsZSh0ZXh0QmxvY2tTdHlsZSk7Ci0gICAgZm9yIChO
b2RlKiBuID0gbV9pbm5lclRleHQtPmZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPnRyYXZlcnNlTmV4
dE5vZGUobV9pbm5lclRleHQuZ2V0KCkpKSB7Ci0gICAgICAgIGlmIChuLT5yZW5kZXJlcigpKQot
ICAgICAgICAgICAgbi0+cmVuZGVyZXIoKS0+c2V0U3R5bGUodGV4dEJsb2NrU3R5bGUpOwotICAg
IH0KLSAgICB1cGRhdGVGcm9tRWxlbWVudCgpOwotfQotCi12b2lkIFJlbmRlclRleHRDb250cm9s
OjpjYXBzTG9ja1N0YXRlTWF5SGF2ZUNoYW5nZWQoKQorSFRNTEVsZW1lbnQqIFJlbmRlclRleHRD
b250cm9sOjppbm5lclRleHRFbGVtZW50KCkgY29uc3QKIHsKLSAgICAvLyBPbmx5IGRyYXcgdGhl
IGNhcHMgbG9jayBpbmRpY2F0b3IgaWYgdGhlc2UgdGhpbmdzIGFyZSB0cnVlOgotICAgIC8vIDEp
IFRoZSBmaWVsZCBpcyBhIHBhc3N3b3JkIGZpZWxkCi0gICAgLy8gMikgVGhlIGZyYW1lIGlzIGFj
dGl2ZQotICAgIC8vIDMpIFRoZSBlbGVtZW50IGlzIGZvY3VzZWQKLSAgICAvLyA0KSBUaGUgY2Fw
cyBsb2NrIGlzIG9uCi0KLSAgICBib29sIHNob3VsZERyYXdDYXBzTG9ja0luZGljYXRvciA9IGZh
bHNlOwotICAgIGlmIChOb2RlKiBuID0gbm9kZSgpKQotICAgICAgICBpZiAoRG9jdW1lbnQqIGQg
PSBkb2N1bWVudCgpKQotICAgICAgICAgICAgaWYgKEZyYW1lKiBmID0gZC0+ZnJhbWUoKSkKLSAg
ICAgICAgICAgICAgICBzaG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0b3IgPSAhbV9tdWx0aUxpbmUg
JiYgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG4pLT5pbnB1dFR5cGUoKSA9PSBIVE1M
SW5wdXRFbGVtZW50OjpQQVNTV09SRCAmJiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZi0+c2VsZWN0aW9uKCktPmlzRm9jdXNlZEFuZEFjdGl2ZSgpICYm
IGQtPmZvY3VzZWROb2RlKCkgPT0gbiAmJiBQbGF0Zm9ybUtleWJvYXJkRXZlbnQ6OmN1cnJlbnRD
YXBzTG9ja1N0YXRlKCk7Ci0KLSAgICBpZiAoc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yICE9
IG1fc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yKSB7Ci0gICAgICAgIG1fc2hvdWxkRHJhd0Nh
cHNMb2NrSW5kaWNhdG9yID0gc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yOwotICAgICAgICBy
ZXBhaW50KCk7Ci0gICAgfQorICAgIHJldHVybiBtX2lubmVyVGV4dC5nZXQoKTsKIH0KIAogfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sLmgJKHJldmlzaW9uIDM5
NDg2KQorKysgcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sLmgJKHdvcmtpbmcgY29weSkKQEAg
LTEsNSArMSw2IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC5zCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICAgICAgICAgIChDKSAyMDA4IFRvcmNoIE1v
YmlsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNv
bS8pIAogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yMSw0NSArMjIsMzEgQEAKICNpZm5kZWYgUmVu
ZGVyVGV4dENvbnRyb2xfaAogI2RlZmluZSBSZW5kZXJUZXh0Q29udHJvbF9oCiAKLSNpbmNsdWRl
ICJQb3B1cE1lbnVDbGllbnQuaCIKICNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgotI2luY2x1ZGUg
IlRpbWVyLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgRm9udFNlbGVjdG9yOwot
Y2xhc3MgU2VhcmNoRmllbGRDYW5jZWxCdXR0b25FbGVtZW50OwotY2xhc3MgU2VhcmNoRmllbGRS
ZXN1bHRzQnV0dG9uRWxlbWVudDsKLWNsYXNzIFNlYXJjaFBvcHVwTWVudTsKIGNsYXNzIFNlbGVj
dGlvbjsKIGNsYXNzIFRleHRDb250cm9sSW5uZXJFbGVtZW50OwogY2xhc3MgVGV4dENvbnRyb2xJ
bm5lclRleHRFbGVtZW50OwogCi1jbGFzcyBSZW5kZXJUZXh0Q29udHJvbCA6IHB1YmxpYyBSZW5k
ZXJCbG9jaywgcHJpdmF0ZSBQb3B1cE1lbnVDbGllbnQgeworY2xhc3MgUmVuZGVyVGV4dENvbnRy
b2wgOiBwdWJsaWMgUmVuZGVyQmxvY2sgewogcHVibGljOgotICAgIFJlbmRlclRleHRDb250cm9s
KE5vZGUqLCBib29sIG11bHRpTGluZSk7CiAgICAgdmlydHVhbCB+UmVuZGVyVGV4dENvbnRyb2wo
KTsKIAogICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJu
ICJSZW5kZXJUZXh0Q29udHJvbCI7IH0KLQotICAgIHZpcnR1YWwgYm9vbCBoYXNDb250cm9sQ2xp
cCgpIGNvbnN0IHsgcmV0dXJuIG1fY2FuY2VsQnV0dG9uOyB9CisgICAgdmlydHVhbCBib29sIGhh
c0NvbnRyb2xDbGlwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIEludFJl
Y3QgY29udHJvbENsaXBSZWN0KGludCB0eCwgaW50IHR5KSBjb25zdDsKICAgICB2aXJ0dWFsIHZv
aWQgY2FsY0hlaWdodCgpOwogICAgIHZpcnR1YWwgdm9pZCBjYWxjUHJlZldpZHRocygpOwogICAg
IHZpcnR1YWwgdm9pZCByZW1vdmVMZWZ0b3ZlckFub255bW91c0Jsb2NrKFJlbmRlckJsb2NrKikg
eyB9CiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUZyb21FbGVtZW50KCk7CiAgICAgdmlydHVhbCBi
b29sIGNhbkhhdmVDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVh
bCBpbnQgYmFzZWxpbmVQb3NpdGlvbihib29sIGZpcnN0TGluZSwgYm9vbCBpc1Jvb3RMaW5lQm94
KSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgbm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVl
c3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVz
dEFjdGlvbik7Ci0gICAgdmlydHVhbCB2b2lkIGxheW91dCgpOwogICAgIHZpcnR1YWwgYm9vbCBh
dm9pZHNGbG9hdHMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCB2b2lkIHBh
aW50KFBhaW50SW5mbyYsIGludCB0eCwgaW50IHR5KTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wg
aXNFZGl0ZWQoKSBjb25zdCB7IHJldHVybiBtX2RpcnR5OyB9Ci0gICAgdmlydHVhbCB2b2lkIHNl
dEVkaXRlZChib29sIGlzRWRpdGVkKSB7IG1fZGlydHkgPSBpc0VkaXRlZDsgfQotICAgIHZpcnR1
YWwgYm9vbCBpc1RleHRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuICFtX211bHRpTGluZTsgfQotICAg
IHZpcnR1YWwgYm9vbCBpc1RleHRBcmVhKCkgY29uc3QgeyByZXR1cm4gbV9tdWx0aUxpbmU7IH0K
ICAgICAKKyAgICB2aXJ0dWFsIGJvb2wgaXNFZGl0ZWQoKSBjb25zdCB7IHJldHVybiBtX2VkaXRl
ZDsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRFZGl0ZWQoYm9vbCBpc0VkaXRlZCkgeyBtX2VkaXRl
ZCA9IGlzRWRpdGVkOyB9CisKICAgICBib29sIGlzVXNlckVkaXRlZCgpIGNvbnN0IHsgcmV0dXJu
IG1fdXNlckVkaXRlZDsgfQogICAgIHZvaWQgc2V0VXNlckVkaXRlZChib29sIGlzVXNlckVkaXRl
ZCk7CiAKQEAgLTcxLDEwICs1OCw5IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldFNlbGVjdGlvblJh
bmdlKGludCBzdGFydCwgaW50IGVuZCk7CiAgICAgU2VsZWN0aW9uIHNlbGVjdGlvbihpbnQgc3Rh
cnQsIGludCBlbmQpIGNvbnN0OwogCi0gICAgdm9pZCBzdWJ0cmVlSGFzQ2hhbmdlZCgpOworICAg
IHZpcnR1YWwgdm9pZCBzdWJ0cmVlSGFzQ2hhbmdlZCgpOwogICAgIFN0cmluZyB0ZXh0KCk7CiAg
ICAgU3RyaW5nIHRleHRXaXRoSGFyZExpbmVCcmVha3MoKTsKLSAgICB2b2lkIGZvcndhcmRFdmVu
dChFdmVudCopOwogICAgIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChib29sIHVzZXJUcmlnZ2VyZWQp
OwogCiAgICAgdmlydHVhbCB2b2lkIGFkZEZvY3VzUmluZ1JlY3RzKEdyYXBoaWNzQ29udGV4dCos
IGludCB0eCwgaW50IHR5KTsKQEAgLTk1LDc2ICs4MSwzNiBAQCBwdWJsaWM6CiAgICAgVmlzaWJs
ZVBvc2l0aW9uIHZpc2libGVQb3NpdGlvbkZvckluZGV4KGludCBpbmRleCk7CiAgICAgaW50IGlu
ZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwogCi0gICAgdm9p
ZCBhZGRTZWFyY2hSZXN1bHQoKTsKK3Byb3RlY3RlZDoKKyAgICBSZW5kZXJUZXh0Q29udHJvbChO
b2RlKik7CiAKLSAgICBib29sIHBvcHVwSXNWaXNpYmxlKCkgY29uc3QgeyByZXR1cm4gbV9zZWFy
Y2hQb3B1cElzVmlzaWJsZTsgfQotICAgIHZvaWQgc2hvd1BvcHVwKCk7Ci0gICAgdm9pZCBoaWRl
UG9wdXAoKTsKKyAgICBpbnQgc2Nyb2xsYmFyVGhpY2tuZXNzKCkgY29uc3Q7CisgICAgdm9pZCBh
ZGp1c3RJbm5lclRleHRTdHlsZShjb25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSwgUmVuZGVy
U3R5bGUqIHRleHRCbG9ja1N0eWxlKSBjb25zdDsKKyAgICB2b2lkIHNldElubmVyVGV4dFZhbHVl
KGNvbnN0IFN0cmluZyYpOwogCi0gICAgdm9pZCBzdG9wU2VhcmNoRXZlbnRUaW1lcigpOwotICAg
IAotICAgIGJvb2wgcGxhY2Vob2xkZXJJc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiBtX3BsYWNl
aG9sZGVyVmlzaWJsZTsgfQotICAgIHZvaWQgdXBkYXRlUGxhY2Vob2xkZXJWaXNpYmlsaXR5KCk7
CisgICAgdmlydHVhbCB2b2lkIHN0eWxlRGlkQ2hhbmdlKFJlbmRlclN0eWxlOjpEaWZmLCBjb25z
dCBSZW5kZXJTdHlsZSogb2xkU3R5bGUpOwogCi0gICAgdmlydHVhbCB2b2lkIGNhcHNMb2NrU3Rh
dGVNYXlIYXZlQ2hhbmdlZCgpOworICAgIHZvaWQgY3JlYXRlU3VidHJlZUlmTmVlZGVkKFRleHRD
b250cm9sSW5uZXJFbGVtZW50KiBpbm5lckJsb2NrKTsKKyAgICB2b2lkIGhpdElubmVyVGV4dEJs
b2NrKEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5KTsKKyAgICB2
b2lkIGZvcndhcmRFdmVudChFdmVudCopOwogCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lk
IHN0eWxlRGlkQ2hhbmdlKFJlbmRlclN0eWxlOjpEaWZmLCBjb25zdCBSZW5kZXJTdHlsZSogb2xk
U3R5bGUpOworICAgIGludCB0ZXh0QmxvY2tXaWR0aCgpIGNvbnN0OworICAgIGludCB0ZXh0Qmxv
Y2tIZWlnaHQoKSBjb25zdDsKIAotcHJpdmF0ZToKLSAgICAvLyBQb3B1cE1lbnVDbGllbnQgbWV0
aG9kcwotICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQodW5zaWduZWQgbGlzdEluZGV4LCBi
b29sIGZpcmVFdmVudHMgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIFN0cmluZyBpdGVtVGV4dCh1bnNp
Z25lZCBsaXN0SW5kZXgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBpdGVtSXNFbmFibGVkKHVu
c2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7Ci0gICAgdmlydHVhbCBQb3B1cE1lbnVTdHlsZSBpdGVt
U3R5bGUodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAgICB2aXJ0dWFsIFBvcHVwTWVudVN0
eWxlIG1lbnVTdHlsZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IGNsaWVudEluc2V0TGVmdCgp
IGNvbnN0OwotICAgIHZpcnR1YWwgaW50IGNsaWVudEluc2V0UmlnaHQoKSBjb25zdDsKLSAgICB2
aXJ0dWFsIGludCBjbGllbnRQYWRkaW5nTGVmdCgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IGNs
aWVudFBhZGRpbmdSaWdodCgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IGxpc3RTaXplKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCBpbnQgc2VsZWN0ZWRJbmRleCgpIGNvbnN0OwotICAgIHZpcnR1YWwg
Ym9vbCBpdGVtSXNTZXBhcmF0b3IodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAgICB2aXJ0
dWFsIGJvb2wgaXRlbUlzTGFiZWwodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAgICB2aXJ0
dWFsIGJvb2wgaXRlbUlzU2VsZWN0ZWQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKLSAgICB2
aXJ0dWFsIHZvaWQgc2V0VGV4dEZyb21JdGVtKHVuc2lnbmVkIGxpc3RJbmRleCk7Ci0gICAgdmly
dHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIHZp
cnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5nZU9uSG90VHJhY2soKSBjb25zdCB7IHJldHVybiBm
YWxzZTsgfQotICAgIHZpcnR1YWwgRm9udFNlbGVjdG9yKiBmb250U2VsZWN0b3IoKSBjb25zdDsK
LSAgICB2aXJ0dWFsIEhvc3RXaW5kb3cqIGhvc3RXaW5kb3coKSBjb25zdDsKLSAgICB2aXJ0dWFs
IFBhc3NSZWZQdHI8U2Nyb2xsYmFyPiBjcmVhdGVTY3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50Kiwg
U2Nyb2xsYmFyT3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xTaXplKTsKLQotICAgIFBhc3NS
ZWZQdHI8UmVuZGVyU3R5bGU+IGNyZWF0ZUlubmVyQmxvY2tTdHlsZShjb25zdCBSZW5kZXJTdHls
ZSogc3RhcnRTdHlsZSk7Ci0gICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gY3JlYXRlSW5uZXJU
ZXh0U3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpOwotICAgIFBhc3NSZWZQdHI8
UmVuZGVyU3R5bGU+IGNyZWF0ZUNhbmNlbEJ1dHRvblN0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBz
dGFydFN0eWxlKTsKLSAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBjcmVhdGVSZXN1bHRzQnV0
dG9uU3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpOwotCi0gICAgdm9pZCBjcmVh
dGVTdWJ0cmVlSWZOZWVkZWQoKTsKLSAgICB2b2lkIHVwZGF0ZUNhbmNlbEJ1dHRvblZpc2liaWxp
dHkoUmVuZGVyU3R5bGUqKTsKLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIGF1dG9zYXZlTmFtZSgp
IGNvbnN0OwotICAgIHZvaWQgc3RhcnRTZWFyY2hFdmVudFRpbWVyKCk7Ci0gICAgdm9pZCBzZWFy
Y2hFdmVudFRpbWVyRmlyZWQoVGltZXI8UmVuZGVyVGV4dENvbnRyb2w+Kik7Ci0gICAgU3RyaW5n
IGZpbmlzaFRleHQoVmVjdG9yPFVDaGFyPiYpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHByZWZl
cnJlZENvbnRlbnRXaWR0aChmbG9hdCBjaGFyV2lkdGgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFs
IHZvaWQgYWRqdXN0Q29udHJvbEhlaWdodEJhc2VkT25MaW5lSGVpZ2h0KGludCBsaW5lSGVpZ2h0
KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNhY2hlU2VsZWN0aW9uKGludCBzdGFydCwgaW50IGVu
ZCkgPSAwOworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gY3JlYXRlSW5uZXJU
ZXh0U3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpIGNvbnN0ID0gMDsKIAogICAg
IGZyaWVuZCBjbGFzcyBUZXh0SXRlcmF0b3I7CiAgICAgSFRNTEVsZW1lbnQqIGlubmVyVGV4dEVs
ZW1lbnQoKSBjb25zdDsKIAotICAgIFJlZlB0cjxUZXh0Q29udHJvbElubmVyRWxlbWVudD4gbV9p
bm5lckJsb2NrOwotICAgIFJlZlB0cjxUZXh0Q29udHJvbElubmVyVGV4dEVsZW1lbnQ+IG1faW5u
ZXJUZXh0OwotICAgIFJlZlB0cjxTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25FbGVtZW50PiBtX3Jl
c3VsdHNCdXR0b247Ci0gICAgUmVmUHRyPFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uRWxlbWVudD4g
bV9jYW5jZWxCdXR0b247Citwcml2YXRlOgorICAgIFN0cmluZyBmaW5pc2hUZXh0KFZlY3RvcjxV
Q2hhcj4mKSBjb25zdDsKIAotICAgIGJvb2wgbV9kaXJ0eTsKLSAgICBib29sIG1fbXVsdGlMaW5l
OwotICAgIGJvb2wgbV9wbGFjZWhvbGRlclZpc2libGU7CisgICAgYm9vbCBtX2VkaXRlZDsKICAg
ICBib29sIG1fdXNlckVkaXRlZDsKLSAgICBib29sIG1fc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNh
dG9yOwotICAgIAotICAgIFJlZlB0cjxTZWFyY2hQb3B1cE1lbnU+IG1fc2VhcmNoUG9wdXA7Ci0g
ICAgYm9vbCBtX3NlYXJjaFBvcHVwSXNWaXNpYmxlOwotICAgIG11dGFibGUgVmVjdG9yPFN0cmlu
Zz4gbV9yZWNlbnRTZWFyY2hlczsKLQotICAgIFRpbWVyPFJlbmRlclRleHRDb250cm9sPiBtX3Nl
YXJjaEV2ZW50VGltZXI7CisgICAgUmVmUHRyPFRleHRDb250cm9sSW5uZXJUZXh0RWxlbWVudD4g
bV9pbm5lclRleHQ7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiByZW5kZXJp
bmcvUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmlu
Zy9SZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZS5jcHAJKHJldmlzaW9uIDApCisrKyByZW5kZXJp
bmcvUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDE1OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogICAgICAgICAgIChDKSAyMDA4IFRvcmNoIE1vYmlsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8pIAorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJlbmRlclRleHRDb250cm9sTXVsdGlMaW5l
LmgiCisKKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNs
dWRlICJIaXRUZXN0UmVzdWx0LmgiCisjaW5jbHVkZSAiSFRNTFRleHRBcmVhRWxlbWVudC5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1JlbmRlclRleHRDb250cm9sTXVsdGlMaW5lOjpSZW5k
ZXJUZXh0Q29udHJvbE11bHRpTGluZShOb2RlKiBub2RlKQorICAgIDogUmVuZGVyVGV4dENvbnRy
b2wobm9kZSkKK3sKK30KKworUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6On5SZW5kZXJUZXh0
Q29udHJvbE11bHRpTGluZSgpCit7CisgICAgaWYgKG5vZGUoKSkKKyAgICAgICAgc3RhdGljX2Nh
c3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+KG5vZGUoKSktPnJlbmRlcmVyV2lsbEJlRGVzdHJveWVk
KCk7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6OnN1YnRyZWVIYXNDaGFu
Z2VkKCkKK3sKKyAgICBSZW5kZXJUZXh0Q29udHJvbDo6c3VidHJlZUhhc0NoYW5nZWQoKTsKKwor
ICAgIEhUTUxGb3JtQ29udHJvbEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MRm9y
bUNvbnRyb2xFbGVtZW50Kj4obm9kZSgpKTsKKyAgICBlbGVtZW50LT5zZXRWYWx1ZU1hdGNoZXNS
ZW5kZXJlcihmYWxzZSk7CisKKyAgICBpZiAoZWxlbWVudC0+Zm9jdXNlZCgpKSB7CisgICAgICAg
IGlmIChGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgpKQorICAgICAgICAgICAgZnJh
bWUtPnRleHREaWRDaGFuZ2VJblRleHRBcmVhKGVsZW1lbnQpOworICAgIH0KK30KKwordm9pZCBS
ZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6bGF5b3V0KCkKK3sKKyAgICBpbnQgb2xkSGVpZ2h0
ID0gbV9oZWlnaHQ7CisgICAgY2FsY0hlaWdodCgpOworCisgICAgaW50IG9sZFdpZHRoID0gbV93
aWR0aDsKKyAgICBjYWxjV2lkdGgoKTsKKworICAgIGJvb2wgcmVsYXlvdXRDaGlsZHJlbiA9IG9s
ZEhlaWdodCAhPSBtX2hlaWdodCB8fCBvbGRXaWR0aCAhPSBtX3dpZHRoOworICAgIFJlbmRlck9i
amVjdCogaW5uZXJUZXh0UmVuZGVyZXIgPSBpbm5lclRleHRFbGVtZW50KCktPnJlbmRlcmVyKCk7
CisKKyAgICAvLyBTZXQgdGhlIHRleHQgYmxvY2sgaGVpZ2h0CisgICAgaW50IGRlc2lyZWRIZWln
aHQgPSB0ZXh0QmxvY2tIZWlnaHQoKTsKKyAgICBpZiAoZGVzaXJlZEhlaWdodCAhPSBpbm5lclRl
eHRSZW5kZXJlci0+aGVpZ2h0KCkpCisgICAgICAgIHJlbGF5b3V0Q2hpbGRyZW4gPSB0cnVlOwor
ICAgIGlubmVyVGV4dFJlbmRlcmVyLT5zdHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKGRlc2lyZWRI
ZWlnaHQsIEZpeGVkKSk7CisKKyAgICAvLyBTZXQgdGhlIHRleHQgYmxvY2sgd2lkdGgKKyAgICBp
bnQgZGVzaXJlZFdpZHRoID0gdGV4dEJsb2NrV2lkdGgoKTsKKyAgICBpZiAoZGVzaXJlZFdpZHRo
ICE9IGlubmVyVGV4dFJlbmRlcmVyLT53aWR0aCgpKQorICAgICAgICByZWxheW91dENoaWxkcmVu
ID0gdHJ1ZTsKKyAgICBpbm5lclRleHRSZW5kZXJlci0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3Ro
KGRlc2lyZWRXaWR0aCwgRml4ZWQpKTsKKworICAgIFJlbmRlckJsb2NrOjpsYXlvdXRCbG9jayhy
ZWxheW91dENoaWxkcmVuKTsKK30KKworYm9vbCBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQm
IHJlc3VsdCwgaW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiBoaXRU
ZXN0QWN0aW9uKQoreworICAgIGlmICghUmVuZGVyVGV4dENvbnRyb2w6Om5vZGVBdFBvaW50KHJl
cXVlc3QsIHJlc3VsdCwgeCwgeSwgdHgsIHR5LCBoaXRUZXN0QWN0aW9uKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaWYgKHJlc3VsdC5pbm5lck5vZGUoKSA9PSBlbGVtZW50KCkpIHsK
KyAgICAgICAgaGl0SW5uZXJUZXh0QmxvY2socmVzdWx0LCB4LCB5LCB0eCwgdHkpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVu
ZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6OmZvcndhcmRFdmVudChFdmVudCogZXZlbnQpCit7Cisg
ICAgUmVuZGVyVGV4dENvbnRyb2w6OmZvcndhcmRFdmVudChldmVudCk7Cit9CisKK2ludCBSZW5k
ZXJUZXh0Q29udHJvbE11bHRpTGluZTo6cHJlZmVycmVkQ29udGVudFdpZHRoKGZsb2F0IGNoYXJX
aWR0aCkgY29uc3QKK3sKKyAgICBpbnQgZmFjdG9yID0gc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVh
RWxlbWVudCo+KG5vZGUoKSktPmNvbHMoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihj
ZWlsZihjaGFyV2lkdGggKiBmYWN0b3IpKSArIHNjcm9sbGJhclRoaWNrbmVzcygpOworfQorCit2
b2lkIFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lOjphZGp1c3RDb250cm9sSGVpZ2h0QmFzZWRP
bkxpbmVIZWlnaHQoaW50IGxpbmVIZWlnaHQpCit7CisgICAgbV9oZWlnaHQgKz0gbGluZUhlaWdo
dCAqIHN0YXRpY19jYXN0PEhUTUxUZXh0QXJlYUVsZW1lbnQqPihub2RlKCkpLT5yb3dzKCk7Cit9
CisKK2ludCBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZTo6YmFzZWxpbmVQb3NpdGlvbihib29s
LCBib29sKSBjb25zdAoreworICAgIHJldHVybiBoZWlnaHQoKSArIG1hcmdpblRvcCgpICsgbWFy
Z2luQm90dG9tKCk7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6OnVwZGF0
ZUZyb21FbGVtZW50KCkKK3sKKyAgICBjcmVhdGVTdWJ0cmVlSWZOZWVkZWQoMCk7CisgICAgUmVu
ZGVyVGV4dENvbnRyb2w6OnVwZGF0ZUZyb21FbGVtZW50KCk7CisKKyAgICBzZXRJbm5lclRleHRW
YWx1ZShzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50Kj4obm9kZSgpKS0+dmFsdWUoKSk7
Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmU6OmNhY2hlU2VsZWN0aW9uKGlu
dCBzdGFydCwgaW50IGVuZCkKK3sKKyAgICBzdGF0aWNfY2FzdDxIVE1MVGV4dEFyZWFFbGVtZW50
Kj4obm9kZSgpKS0+Y2FjaGVTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Cit9CisKK1Bhc3NSZWZQdHI8
UmVuZGVyU3R5bGU+IFJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lOjpjcmVhdGVJbm5lclRleHRT
dHlsZShjb25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSkgY29uc3QKK3sKKyAgICBSZWZQdHI8
UmVuZGVyU3R5bGU+IHRleHRCbG9ja1N0eWxlID0gUmVuZGVyU3R5bGU6OmNyZWF0ZSgpOworICAg
IHRleHRCbG9ja1N0eWxlLT5pbmhlcml0RnJvbShzdGFydFN0eWxlKTsKKworICAgIGFkanVzdElu
bmVyVGV4dFN0eWxlKHN0YXJ0U3R5bGUsIHRleHRCbG9ja1N0eWxlLmdldCgpKTsKKworICAgIC8v
IEZvcndhcmQgb3ZlcmZsb3cgcHJvcGVydGllcy4KKyAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0T3Zl
cmZsb3dYKHN0YXJ0U3R5bGUtPm92ZXJmbG93WCgpID09IE9WSVNJQkxFID8gT0FVVE8gOiBzdGFy
dFN0eWxlLT5vdmVyZmxvd1goKSk7CisgICAgdGV4dEJsb2NrU3R5bGUtPnNldE92ZXJmbG93WShz
dGFydFN0eWxlLT5vdmVyZmxvd1koKSA9PSBPVklTSUJMRSA/IE9BVVRPIDogc3RhcnRTdHlsZS0+
b3ZlcmZsb3dZKCkpOworCisgICAgLy8gU2V0IHdvcmQgd3JhcCBwcm9wZXJ0eSBiYXNlZCBvbiB3
cmFwIGF0dHJpYnV0ZS4KKyAgICBpZiAoc3RhdGljX2Nhc3Q8SFRNTFRleHRBcmVhRWxlbWVudCo+
KG5vZGUoKSktPnNob3VsZFdyYXBUZXh0KCkpIHsKKyAgICAgICAgdGV4dEJsb2NrU3R5bGUtPnNl
dFdoaXRlU3BhY2UoUFJFX1dSQVApOworICAgICAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0V29yZFdy
YXAoQnJlYWtXb3JkV3JhcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dEJsb2NrU3R5bGUt
PnNldFdoaXRlU3BhY2UoUFJFKTsKKyAgICAgICAgdGV4dEJsb2NrU3R5bGUtPnNldFdvcmRXcmFw
KE5vcm1hbFdvcmRXcmFwKTsKKyAgICB9CisKKyAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0RGlzcGxh
eShCTE9DSyk7CisKKyAgICAvLyBXZSdyZSBhZGRpbmcgdGhyZWUgZXh0cmEgcGl4ZWxzIG9mIHBh
ZGRpbmcgdG8gbGluZSB0ZXh0YXJlYXMgdXAgd2l0aCB0ZXh0IGZpZWxkcy4KKyAgICB0ZXh0Qmxv
Y2tTdHlsZS0+c2V0UGFkZGluZ0xlZnQoTGVuZ3RoKDMsIEZpeGVkKSk7CisgICAgdGV4dEJsb2Nr
U3R5bGUtPnNldFBhZGRpbmdSaWdodChMZW5ndGgoMywgRml4ZWQpKTsKKworICAgIHJldHVybiB0
ZXh0QmxvY2tTdHlsZS5yZWxlYXNlKCk7Cit9CisKK30KSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJU
ZXh0Q29udHJvbE11bHRpTGluZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUZXh0
Q29udHJvbE11bHRpTGluZS5oCShyZXZpc2lvbiAwKQorKysgcmVuZGVyaW5nL1JlbmRlclRleHRD
b250cm9sTXVsdGlMaW5lLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDggVG9yY2ggTW9iaWxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4g
KGh0dHA6Ly93d3cudG9yY2htb2JpbGUuY29tLykgCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFJlbmRlclRleHRDb250
cm9sTXVsdGlMaW5lX2gKKyNkZWZpbmUgUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmVfaAorCisj
aW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBSZW5kZXJUZXh0Q29udHJvbE11bHRpTGluZSA6IHB1YmxpYyBSZW5kZXJUZXh0Q29udHJv
bCB7CitwdWJsaWM6CisgICAgUmVuZGVyVGV4dENvbnRyb2xNdWx0aUxpbmUoTm9kZSopOworICAg
IHZpcnR1YWwgflJlbmRlclRleHRDb250cm9sTXVsdGlMaW5lKCk7CisKKyAgICB2aXJ0dWFsIGJv
b2wgaXNUZXh0QXJlYSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZpcnR1YWwgdm9p
ZCBzdWJ0cmVlSGFzQ2hhbmdlZCgpOworICAgIHZpcnR1YWwgdm9pZCBsYXlvdXQoKTsKKworICAg
IHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RS
ZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uKTsKKyAg
ICB2b2lkIGZvcndhcmRFdmVudChFdmVudCopOworCitwcml2YXRlOgorICAgIHZpcnR1YWwgaW50
IHByZWZlcnJlZENvbnRlbnRXaWR0aChmbG9hdCBjaGFyV2lkdGgpIGNvbnN0OworICAgIHZpcnR1
YWwgdm9pZCBhZGp1c3RDb250cm9sSGVpZ2h0QmFzZWRPbkxpbmVIZWlnaHQoaW50IGxpbmVIZWln
aHQpOworICAgIHZpcnR1YWwgaW50IGJhc2VsaW5lUG9zaXRpb24oYm9vbCBmaXJzdExpbmUsIGJv
b2wgaXNSb290TGluZUJveCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRnJvbUVs
ZW1lbnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2FjaGVTZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQg
ZW5kKTsKKworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gY3JlYXRlSW5uZXJU
ZXh0U3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpIGNvbnN0OworfTsKKworfQor
CisjZW5kaWYKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIHJlbmRlcmluZy9SZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUuY3Bw
CShyZXZpc2lvbiAwKQorKysgcmVuZGVyaW5nL1JlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5j
cHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzU5IEBACisvKioKKyAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgICAgICAgICAg
KEMpIDIwMDggVG9yY2ggTW9iaWxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gKGh0dHA6Ly93
d3cudG9yY2htb2JpbGUuY29tLykgCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmgiCisKKyNpbmNsdWRlICJDU1NTdHlsZVNlbGVj
dG9yLmgiCisjaW5jbHVkZSAiRXZlbnQuaCIKKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCisjaW5j
bHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJIaXRUZXN0
UmVzdWx0LmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxO
YW1lcy5oIgorI2luY2x1ZGUgIkxvY2FsaXplZFN0cmluZ3MuaCIKKyNpbmNsdWRlICJNb3VzZUV2
ZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50LmgiCisjaW5jbHVkZSAiUmVu
ZGVyU2Nyb2xsYmFyLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNpbmNsdWRlICJTZWFy
Y2hQb3B1cE1lbnUuaCIKKyNpbmNsdWRlICJTZWxlY3Rpb25Db250cm9sbGVyLmgiCisjaW5jbHVk
ZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJUZXh0Q29udHJvbElubmVyRWxlbWVudHMuaCIKKwor
dXNpbmcgc3RkOjptYXg7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNwYWNl
IEhUTUxOYW1lczsKKworUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmUoTm9kZSogbm9kZSkKKyAgICA6IFJlbmRlclRleHRDb250cm9sKG5vZGUp
CisgICAgLCBtX3BsYWNlaG9sZGVyVmlzaWJsZShmYWxzZSkKKyAgICAsIG1fc2VhcmNoUG9wdXBJ
c1Zpc2libGUoZmFsc2UpCisgICAgLCBtX3Nob3VsZERyYXdDYXBzTG9ja0luZGljYXRvcihmYWxz
ZSkKKyAgICAsIG1fc2VhcmNoRXZlbnRUaW1lcih0aGlzLCAmUmVuZGVyVGV4dENvbnRyb2xTaW5n
bGVMaW5lOjpzZWFyY2hFdmVudFRpbWVyRmlyZWQpCisgICAgLCBtX3NlYXJjaFBvcHVwKDApCit7
Cit9CisKK1JlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6flJlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZSgpCit7CisgICAgaWYgKG1fc2VhcmNoUG9wdXApIHsKKyAgICAgICAgbV9zZWFyY2hQ
b3B1cC0+ZGlzY29ubmVjdENsaWVudCgpOworICAgICAgICBtX3NlYXJjaFBvcHVwID0gMDsKKyAg
ICB9CisgCisgICAgaWYgKG1faW5uZXJCbG9jaykKKyAgICAgICAgbV9pbm5lckJsb2NrLT5kZXRh
Y2goKTsKK30KKworYm9vbCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnBsYWNlaG9sZGVy
U2hvdWxkQmVWaXNpYmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTElu
cHV0RWxlbWVudCo+KG5vZGUoKSktPnBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxlKCk7Cit9CisK
K3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjp1cGRhdGVQbGFjZWhvbGRlclZpc2li
aWxpdHkoKQoreworICAgIFJlbmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IG1faW5uZXJCbG9jayA/
IG1faW5uZXJCbG9jay0+cmVuZGVyZXIoKS0+c3R5bGUoKSA6IHN0eWxlKCk7CisKKyAgICBSZWZQ
dHI8UmVuZGVyU3R5bGU+IHRleHRCbG9ja1N0eWxlID0gY3JlYXRlSW5uZXJUZXh0U3R5bGUocGFy
ZW50U3R5bGUpOworICAgIEhUTUxFbGVtZW50KiBpbm5lclRleHQgPSBpbm5lclRleHRFbGVtZW50
KCk7CisgICAgaW5uZXJUZXh0LT5yZW5kZXJlcigpLT5zZXRTdHlsZSh0ZXh0QmxvY2tTdHlsZSk7
CisKKyAgICBmb3IgKE5vZGUqIG4gPSBpbm5lclRleHQtPmZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4t
PnRyYXZlcnNlTmV4dE5vZGUoaW5uZXJUZXh0KSkgeworICAgICAgICBpZiAoUmVuZGVyT2JqZWN0
KiByZW5kZXJlciA9IG4tPnJlbmRlcmVyKCkpCisgICAgICAgICAgICByZW5kZXJlci0+c2V0U3R5
bGUodGV4dEJsb2NrU3R5bGUpOworICAgIH0KKworICAgIHVwZGF0ZUZyb21FbGVtZW50KCk7Cit9
CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjphZGRTZWFyY2hSZXN1bHQoKQor
eworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxl
bWVudCo+KG5vZGUoKSk7CisgICAgaWYgKGlucHV0LT5tYXhSZXN1bHRzKCkgPD0gMCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgU3RyaW5nIHZhbHVlID0gaW5wdXQtPnZhbHVlKCk7CisgICAgaWYg
KHZhbHVlLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU2V0dGluZ3MqIHNldHRp
bmdzID0gZG9jdW1lbnQoKS0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXNldHRpbmdzIHx8IHNldHRp
bmdzLT5wcml2YXRlQnJvd3NpbmdFbmFibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlu
dCBzaXplID0gc3RhdGljX2Nhc3Q8aW50PihtX3JlY2VudFNlYXJjaGVzLnNpemUoKSk7CisgICAg
Zm9yIChpbnQgaSA9IHNpemUgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICBpZiAobV9yZWNl
bnRTZWFyY2hlc1tpXSA9PSB2YWx1ZSkKKyAgICAgICAgICAgIG1fcmVjZW50U2VhcmNoZXMucmVt
b3ZlKGkpOworICAgIH0KKworICAgIG1fcmVjZW50U2VhcmNoZXMuaW5zZXJ0KDAsIHZhbHVlKTsK
KyAgICB3aGlsZSAoc3RhdGljX2Nhc3Q8aW50PihtX3JlY2VudFNlYXJjaGVzLnNpemUoKSkgPiBp
bnB1dC0+bWF4UmVzdWx0cygpKQorICAgICAgICBtX3JlY2VudFNlYXJjaGVzLnJlbW92ZUxhc3Qo
KTsKKworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSA9IGF1dG9zYXZlTmFtZSgpOworICAg
IGlmICghbV9zZWFyY2hQb3B1cCkKKyAgICAgICAgbV9zZWFyY2hQb3B1cCA9IFNlYXJjaFBvcHVw
TWVudTo6Y3JlYXRlKHRoaXMpOworCisgICAgbV9zZWFyY2hQb3B1cC0+c2F2ZVJlY2VudFNlYXJj
aGVzKG5hbWUsIG1fcmVjZW50U2VhcmNoZXMpOworfQorCit2b2lkIFJlbmRlclRleHRDb250cm9s
U2luZ2xlTGluZTo6c3RvcFNlYXJjaEV2ZW50VGltZXIoKQoreworICAgIG1fc2VhcmNoRXZlbnRU
aW1lci5zdG9wKCk7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzaG93
UG9wdXAoKQoreworICAgIGlmIChtX3NlYXJjaFBvcHVwSXNWaXNpYmxlKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoIW1fc2VhcmNoUG9wdXApCisgICAgICAgIG1fc2VhcmNoUG9wdXAgPSBT
ZWFyY2hQb3B1cE1lbnU6OmNyZWF0ZSh0aGlzKTsKKworICAgIGlmICghbV9zZWFyY2hQb3B1cC0+
ZW5hYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3NlYXJjaFBvcHVwSXNWaXNpYmxl
ID0gdHJ1ZTsKKworICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSA9IGF1dG9zYXZlTmFtZSgp
OworICAgIG1fc2VhcmNoUG9wdXAtPmxvYWRSZWNlbnRTZWFyY2hlcyhuYW1lLCBtX3JlY2VudFNl
YXJjaGVzKTsKKworICAgIC8vIFRyaW0gdGhlIHJlY2VudCBzZWFyY2hlcyBsaXN0IGlmIHRoZSBt
YXhpbXVtIHNpemUgaGFzIGNoYW5nZWQgc2luY2Ugd2UgbGFzdCBzYXZlZC4KKyAgICBIVE1MSW5w
dXRFbGVtZW50KiBpbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkp
OworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KG1fcmVjZW50U2VhcmNoZXMuc2l6ZSgpKSA+IGlu
cHV0LT5tYXhSZXN1bHRzKCkpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgbV9yZWNlbnRT
ZWFyY2hlcy5yZW1vdmVMYXN0KCk7CisgICAgICAgIH0gd2hpbGUgKHN0YXRpY19jYXN0PGludD4o
bV9yZWNlbnRTZWFyY2hlcy5zaXplKCkpID4gaW5wdXQtPm1heFJlc3VsdHMoKSk7CisKKyAgICAg
ICAgbV9zZWFyY2hQb3B1cC0+c2F2ZVJlY2VudFNlYXJjaGVzKG5hbWUsIG1fcmVjZW50U2VhcmNo
ZXMpOworICAgIH0KKworICAgIG1fc2VhcmNoUG9wdXAtPnNob3coYWJzb2x1dGVCb3VuZGluZ0Jv
eFJlY3QodHJ1ZSksIGRvY3VtZW50KCktPnZpZXcoKSwgLTEpOworfQorCit2b2lkIFJlbmRlclRl
eHRDb250cm9sU2luZ2xlTGluZTo6aGlkZVBvcHVwKCkKK3sKKyAgICBpZiAobV9zZWFyY2hQb3B1
cCkKKyAgICAgICAgbV9zZWFyY2hQb3B1cC0+aGlkZSgpOworCisgICAgbV9zZWFyY2hQb3B1cElz
VmlzaWJsZSA9IGZhbHNlOworfQorCit2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6
c3VidHJlZUhhc0NoYW5nZWQoKQoreworICAgIGJvb2wgd2FzRWRpdGVkID0gaXNFZGl0ZWQoKTsK
KyAgICBSZW5kZXJUZXh0Q29udHJvbDo6c3VidHJlZUhhc0NoYW5nZWQoKTsKKworICAgIEhUTUxJ
bnB1dEVsZW1lbnQqIGlucHV0ID0gc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUo
KSk7CisgICAgaW5wdXQtPnNldFZhbHVlRnJvbVJlbmRlcmVyKGlucHV0LT5jb25zdHJhaW5WYWx1
ZSh0ZXh0KCkpKTsKKworICAgIGlmIChSZW5kZXJPYmplY3QqIGNhbmNlbEJ1dHRvblJlbmRlcmVy
ID0gbV9jYW5jZWxCdXR0b24gPyBtX2NhbmNlbEJ1dHRvbi0+cmVuZGVyZXIoKSA6IDApCisgICAg
ICAgIHVwZGF0ZUNhbmNlbEJ1dHRvblZpc2liaWxpdHkoY2FuY2VsQnV0dG9uUmVuZGVyZXItPnN0
eWxlKCkpOworCisgICAgLy8gSWYgdGhlIGluY3JlbWVudGFsIGF0dHJpYnV0ZSBpcyBzZXQsIHRo
ZW4gZGlzcGF0Y2ggdGhlIHNlYXJjaCBldmVudAorICAgIGlmICghaW5wdXQtPmdldEF0dHJpYnV0
ZShpbmNyZW1lbnRhbEF0dHIpLmlzTnVsbCgpKQorICAgICAgICBzdGFydFNlYXJjaEV2ZW50VGlt
ZXIoKTsKKworICAgIGlmICghd2FzRWRpdGVkICYmIGlucHV0LT5mb2N1c2VkKCkpIHsKKyAgICAg
ICAgaWYgKEZyYW1lKiBmcmFtZSA9IGRvY3VtZW50KCktPmZyYW1lKCkpCisgICAgICAgICAgICBm
cmFtZS0+dGV4dEZpZWxkRGlkQmVnaW5FZGl0aW5nKGlucHV0KTsKKyAgICB9CisKKyAgICBpZiAo
aW5wdXQtPmZvY3VzZWQoKSkgeworICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jdW1lbnQo
KS0+ZnJhbWUoKSkKKyAgICAgICAgICAgIGZyYW1lLT50ZXh0RGlkQ2hhbmdlSW5UZXh0RmllbGQo
aW5wdXQpOworICAgIH0KK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnBh
aW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgdHgsIGludCB0eSkKK3sKKyAgICBSZW5kZXJU
ZXh0Q29udHJvbDo6cGFpbnQocGFpbnRJbmZvLCB0eCwgdHkpOworCisgICAgaWYgKHBhaW50SW5m
by5waGFzZSA9PSBQYWludFBoYXNlQmxvY2tCYWNrZ3JvdW5kICYmIG1fc2hvdWxkRHJhd0NhcHNM
b2NrSW5kaWNhdG9yKSB7CisgICAgICAgIEludFJlY3QgY29udGVudHNSZWN0ID0gY29udGVudEJv
eCgpOworCisgICAgICAgIC8vIENvbnZlcnQgdGhlIHJlY3QgaW50byB0aGUgY29vcmRzIHVzZWQg
Zm9yIHBhaW50aW5nIHRoZSBjb250ZW50CisgICAgICAgIGNvbnRlbnRzUmVjdC5tb3ZlKHR4ICsg
eFBvcygpLCB0eSArIHlQb3MoKSk7CisgICAgICAgIHRoZW1lKCktPnBhaW50Q2Fwc0xvY2tJbmRp
Y2F0b3IodGhpcywgcGFpbnRJbmZvLCBjb250ZW50c1JlY3QpOworICAgIH0KK30KKwordm9pZCBS
ZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmxheW91dCgpCit7CisgICAgaW50IG9sZEhlaWdo
dCA9IG1faGVpZ2h0OworICAgIGNhbGNIZWlnaHQoKTsKKworICAgIGludCBvbGRXaWR0aCA9IG1f
d2lkdGg7CisgICAgY2FsY1dpZHRoKCk7CisKKyAgICBib29sIHJlbGF5b3V0Q2hpbGRyZW4gPSBv
bGRIZWlnaHQgIT0gbV9oZWlnaHQgfHwgb2xkV2lkdGggIT0gbV93aWR0aDsKKworICAgIFJlbmRl
ck9iamVjdCogaW5uZXJUZXh0UmVuZGVyZXIgPSBpbm5lclRleHRFbGVtZW50KCktPnJlbmRlcmVy
KCk7CisgICAgUmVuZGVyT2JqZWN0KiBpbm5lckJsb2NrUmVuZGVyZXIgPSBtX2lubmVyQmxvY2sg
PyBtX2lubmVyQmxvY2stPnJlbmRlcmVyKCkgOiAwOworCisgICAgLy8gU2V0IHRoZSB0ZXh0IGJs
b2NrIGhlaWdodAorICAgIGludCBkZXNpcmVkSGVpZ2h0ID0gdGV4dEJsb2NrSGVpZ2h0KCk7Cisg
ICAgaW50IGN1cnJlbnRIZWlnaHQgPSBpbm5lclRleHRSZW5kZXJlci0+aGVpZ2h0KCk7CisKKyAg
ICBpZiAobV9pbm5lckJsb2NrIHx8IGN1cnJlbnRIZWlnaHQgPiBtX2hlaWdodCkgeworICAgICAg
ICBpZiAoZGVzaXJlZEhlaWdodCAhPSBjdXJyZW50SGVpZ2h0KQorICAgICAgICAgICAgcmVsYXlv
dXRDaGlsZHJlbiA9IHRydWU7CisgICAgICAgIGlubmVyVGV4dFJlbmRlcmVyLT5zdHlsZSgpLT5z
ZXRIZWlnaHQoTGVuZ3RoKGRlc2lyZWRIZWlnaHQsIEZpeGVkKSk7CisgICAgfQorCisgICAgaWYg
KG1faW5uZXJCbG9jaykgeworICAgICAgICBBU1NFUlQoaW5uZXJCbG9ja1JlbmRlcmVyKTsKKyAg
ICAgICAgaWYgKGRlc2lyZWRIZWlnaHQgIT0gaW5uZXJCbG9ja1JlbmRlcmVyLT5oZWlnaHQoKSkK
KyAgICAgICAgICAgIHJlbGF5b3V0Q2hpbGRyZW4gPSB0cnVlOworICAgICAgICBpbm5lckJsb2Nr
UmVuZGVyZXItPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgoZGVzaXJlZEhlaWdodCwgRml4ZWQp
KTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIHRleHQgYmxvY2sgd2lkdGgKKyAgICBpbnQgZGVz
aXJlZFdpZHRoID0gdGV4dEJsb2NrV2lkdGgoKTsKKyAgICBpZiAoZGVzaXJlZFdpZHRoICE9IGlu
bmVyVGV4dFJlbmRlcmVyLT53aWR0aCgpKQorICAgICAgICByZWxheW91dENoaWxkcmVuID0gdHJ1
ZTsKKyAgICBpbm5lclRleHRSZW5kZXJlci0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKGRlc2ly
ZWRXaWR0aCwgRml4ZWQpKTsKKworICAgIGlmIChtX2lubmVyQmxvY2spIHsKKyAgICAgICAgaW50
IGlubmVyQmxvY2tXaWR0aCA9IG1fd2lkdGggLSBwYWRkaW5nTGVmdCgpIC0gcGFkZGluZ1JpZ2h0
KCkgLSBib3JkZXJMZWZ0KCkgLSBib3JkZXJSaWdodCgpOworICAgICAgICBpZiAoaW5uZXJCbG9j
a1dpZHRoICE9IGlubmVyQmxvY2tSZW5kZXJlci0+d2lkdGgoKSkKKyAgICAgICAgICAgIHJlbGF5
b3V0Q2hpbGRyZW4gPSB0cnVlOworICAgICAgICBpbm5lckJsb2NrUmVuZGVyZXItPnN0eWxlKCkt
PnNldFdpZHRoKExlbmd0aChpbm5lckJsb2NrV2lkdGgsIEZpeGVkKSk7CisgICAgfQorCisgICAg
UmVuZGVyQmxvY2s6OmxheW91dEJsb2NrKHJlbGF5b3V0Q2hpbGRyZW4pOworCisgICAgLy8gRm9y
IHRleHQgZmllbGRzLCBjZW50ZXIgdGhlIGlubmVyIHRleHQgdmVydGljYWxseQorICAgIC8vIERv
bid0IGRvIHRoaXMgZm9yIHNlYXJjaCBmaWVsZHMsIHNpbmNlIHdlIGRvbid0IGhvbm9yIGhlaWdo
dCBmb3IgdGhlbQorICAgIGlmICghbV9pbm5lckJsb2NrKSB7CisgICAgICAgIGN1cnJlbnRIZWln
aHQgPSBpbm5lclRleHRSZW5kZXJlci0+aGVpZ2h0KCk7CisgICAgICAgIGlmIChjdXJyZW50SGVp
Z2h0IDwgbV9oZWlnaHQpCisgICAgICAgICAgICBpbm5lclRleHRSZW5kZXJlci0+c2V0UG9zKGlu
bmVyVGV4dFJlbmRlcmVyLT54UG9zKCksIChtX2hlaWdodCAtIGN1cnJlbnRIZWlnaHQpIC8gMik7
CisgICAgfQorfQorCitib29sIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6bm9kZUF0UG9p
bnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwg
aW50IHgsIGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9u
KQoreworICAgIC8vIElmIHdlJ3JlIHdpdGhpbiB0aGUgdGV4dCBjb250cm9sLCB3ZSB3YW50IHRv
IGFjdCBhcyBpZiB3ZSd2ZSBoaXQgdGhlIGlubmVyIHRleHQgYmxvY2sgZWxlbWVudCwgaW4gY2Fz
ZSB0aGUgcG9pbnQKKyAgICAvLyB3YXMgb24gdGhlIGNvbnRyb2wgYnV0IG5vdCBvbiB0aGUgaW5u
ZXIgZWxlbWVudCAoc2VlIFJhZGFyIDQ2MTc4NDEpLgorCisgICAgLy8gSW4gYSBzZWFyY2ggZmll
bGQsIHdlIHdhbnQgdG8gYWN0IGFzIGlmIHdlJ3ZlIGhpdCB0aGUgcmVzdWx0cyBibG9jayBpZiB3
ZSdyZSB0byB0aGUgbGVmdCBvZiB0aGUgaW5uZXIgdGV4dCBibG9jaywKKyAgICAvLyBhbmQgYWN0
IGFzIGlmIHdlJ3ZlIGhpdCB0aGUgY2xvc2UgYmxvY2sgaWYgd2UncmUgdG8gdGhlIHJpZ2h0IG9m
IHRoZSBpbm5lciB0ZXh0IGJsb2NrLgorCisgICAgaWYgKCFSZW5kZXJUZXh0Q29udHJvbDo6bm9k
ZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5LCB0eCwgdHksIGhpdFRlc3RBY3Rpb24pKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAocmVzdWx0LmlubmVyTm9kZSgpICE9IGVs
ZW1lbnQoKSAmJiByZXN1bHQuaW5uZXJOb2RlKCkgIT0gbV9pbm5lckJsb2NrLmdldCgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBoaXRJbm5lclRleHRCbG9jayhyZXN1bHQsIHgsIHks
IHR4LCB0eSk7CisKKyAgICBpZiAoIW1faW5uZXJCbG9jaykKKyAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICBOb2RlKiBpbm5lck5vZGUgPSAwOworICAgIFJlbmRlck9iamVjdCogaW5uZXJCbG9j
a1JlbmRlcmVyID0gbV9pbm5lckJsb2NrLT5yZW5kZXJlcigpOworICAgIFJlbmRlck9iamVjdCog
aW5uZXJUZXh0UmVuZGVyZXIgPSBpbm5lclRleHRFbGVtZW50KCktPnJlbmRlcmVyKCk7CisKKyAg
ICBJbnRQb2ludCBsb2NhbFBvaW50ID0gcmVzdWx0LmxvY2FsUG9pbnQoKTsKKyAgICBsb2NhbFBv
aW50Lm1vdmUoLWlubmVyQmxvY2tSZW5kZXJlci0+eFBvcygpLCAtaW5uZXJCbG9ja1JlbmRlcmVy
LT55UG9zKCkpOworCisgICAgaW50IHRleHRMZWZ0ID0gdHggKyBtX3ggKyBpbm5lckJsb2NrUmVu
ZGVyZXItPnhQb3MoKSArIGlubmVyVGV4dFJlbmRlcmVyLT54UG9zKCk7CisgICAgaWYgKG1fcmVz
dWx0c0J1dHRvbiAmJiBtX3Jlc3VsdHNCdXR0b24tPnJlbmRlcmVyKCkgJiYgeCA8IHRleHRMZWZ0
KQorICAgICAgICBpbm5lck5vZGUgPSBtX3Jlc3VsdHNCdXR0b24uZ2V0KCk7CisKKyAgICBpZiAo
IWlubmVyTm9kZSkgeworICAgICAgICBpbnQgdGV4dFJpZ2h0ID0gdGV4dExlZnQgKyBpbm5lclRl
eHRSZW5kZXJlci0+d2lkdGgoKTsKKyAgICAgICAgaWYgKG1fY2FuY2VsQnV0dG9uICYmIG1fY2Fu
Y2VsQnV0dG9uLT5yZW5kZXJlcigpICYmIHggPiB0ZXh0UmlnaHQpCisgICAgICAgICAgICBpbm5l
ck5vZGUgPSBtX2NhbmNlbEJ1dHRvbi5nZXQoKTsKKyAgICB9CisKKyAgICBpZiAoaW5uZXJOb2Rl
KSB7CisgICAgICAgIHJlc3VsdC5zZXRJbm5lck5vZGUoaW5uZXJOb2RlKTsKKyAgICAgICAgbG9j
YWxQb2ludC5tb3ZlKC1pbm5lck5vZGUtPnJlbmRlcmVyKCktPnhQb3MoKSwgLWlubmVyTm9kZS0+
cmVuZGVyZXIoKS0+eVBvcygpKTsKKyAgICB9CisKKyAgICByZXN1bHQuc2V0TG9jYWxQb2ludChs
b2NhbFBvaW50KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6OmZvcndhcmRFdmVudChFdmVudCogZXZlbnQpCit7CisgICAgUmVuZGVyT2Jq
ZWN0KiBpbm5lclRleHRSZW5kZXJlciA9IGlubmVyVGV4dEVsZW1lbnQoKS0+cmVuZGVyZXIoKTsK
KworICAgIGlmIChldmVudC0+dHlwZSgpID09IGV2ZW50TmFtZXMoKS5ibHVyRXZlbnQpIHsKKyAg
ICAgICAgaWYgKGlubmVyVGV4dFJlbmRlcmVyKSB7CisgICAgICAgICAgICBpZiAoUmVuZGVyTGF5
ZXIqIGlubmVyTGF5ZXIgPSBpbm5lclRleHRSZW5kZXJlci0+bGF5ZXIoKSkKKyAgICAgICAgICAg
ICAgICBpbm5lckxheWVyLT5zY3JvbGxUb09mZnNldChzdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBS
VEwgPyBpbm5lckxheWVyLT5zY3JvbGxXaWR0aCgpIDogMCwgMCk7CisgICAgICAgIH0KKworICAg
ICAgICBjYXBzTG9ja1N0YXRlTWF5SGF2ZUNoYW5nZWQoKTsKKyAgICB9IGVsc2UgaWYgKGV2ZW50
LT50eXBlKCkgPT0gZXZlbnROYW1lcygpLmZvY3VzRXZlbnQpCisgICAgICAgIGNhcHNMb2NrU3Rh
dGVNYXlIYXZlQ2hhbmdlZCgpOworCisgICAgaWYgKCFldmVudC0+aXNNb3VzZUV2ZW50KCkpIHsK
KyAgICAgICAgUmVuZGVyVGV4dENvbnRyb2w6OmZvcndhcmRFdmVudChldmVudCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBGbG9hdFBvaW50IGxvY2FsUG9pbnQgPSBpbm5lclRleHRS
ZW5kZXJlci0+YWJzb2x1dGVUb0xvY2FsKEZsb2F0UG9pbnQoc3RhdGljX2Nhc3Q8TW91c2VFdmVu
dCo+KGV2ZW50KS0+cGFnZVgoKSwgc3RhdGljX2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50KS0+cGFn
ZVkoKSksIGZhbHNlLCB0cnVlKTsKKyAgICBpZiAobV9yZXN1bHRzQnV0dG9uICYmIGxvY2FsUG9p
bnQueCgpIDwgaW5uZXJUZXh0UmVuZGVyZXItPmJvcmRlckJveCgpLngoKSkKKyAgICAgICAgbV9y
ZXN1bHRzQnV0dG9uLT5kZWZhdWx0RXZlbnRIYW5kbGVyKGV2ZW50KTsKKyAgICBlbHNlIGlmICht
X2NhbmNlbEJ1dHRvbiAmJiBsb2NhbFBvaW50LngoKSA+IGlubmVyVGV4dFJlbmRlcmVyLT5ib3Jk
ZXJCb3goKS5yaWdodCgpKQorICAgICAgICBtX2NhbmNlbEJ1dHRvbi0+ZGVmYXVsdEV2ZW50SGFu
ZGxlcihldmVudCk7CisgICAgZWxzZQorICAgICAgICBSZW5kZXJUZXh0Q29udHJvbDo6Zm9yd2Fy
ZEV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnN0
eWxlRGlkQ2hhbmdlKFJlbmRlclN0eWxlOjpEaWZmIGRpZmYsIGNvbnN0IFJlbmRlclN0eWxlKiBv
bGRTdHlsZSkKK3sKKyAgICBSZW5kZXJUZXh0Q29udHJvbDo6c3R5bGVEaWRDaGFuZ2UoZGlmZiwg
b2xkU3R5bGUpOworCisgICAgaWYgKFJlbmRlck9iamVjdCogaW5uZXJCbG9ja1JlbmRlcmVyID0g
bV9pbm5lckJsb2NrID8gbV9pbm5lckJsb2NrLT5yZW5kZXJlcigpIDogMCkgeworICAgICAgICAv
LyBXZSBtYXkgaGF2ZSBzZXQgdGhlIHdpZHRoIGFuZCB0aGUgaGVpZ2h0IGluIHRoZSBvbGQgc3R5
bGUgaW4gbGF5b3V0KCkuCisgICAgICAgIC8vIFJlc2V0IHRoZW0gbm93IHRvIGF2b2lkIGdldHRp
bmcgYSBzcHVyaW91cyBsYXlvdXQgaGludC4KKyAgICAgICAgaW5uZXJCbG9ja1JlbmRlcmVyLT5z
dHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKCkpOworICAgICAgICBpbm5lckJsb2NrUmVuZGVyZXIt
PnN0eWxlKCktPnNldFdpZHRoKExlbmd0aCgpKTsKKyAgICAgICAgaW5uZXJCbG9ja1JlbmRlcmVy
LT5zZXRTdHlsZShjcmVhdGVJbm5lckJsb2NrU3R5bGUoc3R5bGUoKSkpOworICAgIH0KKworICAg
IGlmIChSZW5kZXJPYmplY3QqIHJlc3VsdHNSZW5kZXJlciA9IG1fcmVzdWx0c0J1dHRvbiA/IG1f
cmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSA6IDApCisgICAgICAgIHJlc3VsdHNSZW5kZXJlci0+
c2V0U3R5bGUoY3JlYXRlUmVzdWx0c0J1dHRvblN0eWxlKHN0eWxlKCkpKTsKKworICAgIGlmIChS
ZW5kZXJPYmplY3QqIGNhbmNlbFJlbmRlcmVyID0gbV9jYW5jZWxCdXR0b24gPyBtX2NhbmNlbEJ1
dHRvbi0+cmVuZGVyZXIoKSA6IDApCisgICAgICAgIGNhbmNlbFJlbmRlcmVyLT5zZXRTdHlsZShj
cmVhdGVDYW5jZWxCdXR0b25TdHlsZShzdHlsZSgpKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENv
bnRyb2xTaW5nbGVMaW5lOjpjYXBzTG9ja1N0YXRlTWF5SGF2ZUNoYW5nZWQoKQoreworICAgIGlm
ICghbm9kZSgpIHx8ICFkb2N1bWVudCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBPbmx5
IGRyYXcgdGhlIGNhcHMgbG9jayBpbmRpY2F0b3IgaWYgdGhlc2UgdGhpbmdzIGFyZSB0cnVlOgor
ICAgIC8vIDEpIFRoZSBmaWVsZCBpcyBhIHBhc3N3b3JkIGZpZWxkCisgICAgLy8gMikgVGhlIGZy
YW1lIGlzIGFjdGl2ZQorICAgIC8vIDMpIFRoZSBlbGVtZW50IGlzIGZvY3VzZWQKKyAgICAvLyA0
KSBUaGUgY2FwcyBsb2NrIGlzIG9uCisgICAgYm9vbCBzaG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0
b3IgPSBmYWxzZTsKKworICAgIGlmIChGcmFtZSogZnJhbWUgPSBkb2N1bWVudCgpLT5mcmFtZSgp
KQorICAgICAgICBzaG91bGREcmF3Q2Fwc0xvY2tJbmRpY2F0b3IgPSBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+aW5wdXRUeXBlKCkgPT0gSFRNTElucHV0RWxlbWVudDo6
UEFTU1dPUkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZnJhbWUt
PnNlbGVjdGlvbigpLT5pc0ZvY3VzZWRBbmRBY3RpdmUoKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpID09IG5vZGUoKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBQbGF0Zm9ybUtleWJvYXJk
RXZlbnQ6OmN1cnJlbnRDYXBzTG9ja1N0YXRlKCk7CisKKyAgICBpZiAoc2hvdWxkRHJhd0NhcHNM
b2NrSW5kaWNhdG9yICE9IG1fc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yKSB7CisgICAgICAg
IG1fc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNhdG9yID0gc2hvdWxkRHJhd0NhcHNMb2NrSW5kaWNh
dG9yOworICAgICAgICByZXBhaW50KCk7CisgICAgfQorfQorCitpbnQgUmVuZGVyVGV4dENvbnRy
b2xTaW5nbGVMaW5lOjp0ZXh0QmxvY2tXaWR0aCgpIGNvbnN0Cit7CisgICAgaW50IHdpZHRoID0g
UmVuZGVyVGV4dENvbnRyb2w6OnRleHRCbG9ja1dpZHRoKCk7CisKKyAgICBpZiAoUmVuZGVyT2Jq
ZWN0KiByZXN1bHRzUmVuZGVyZXIgPSBtX3Jlc3VsdHNCdXR0b24gPyBtX3Jlc3VsdHNCdXR0b24t
PnJlbmRlcmVyKCkgOiAwKSB7CisgICAgICAgIHJlc3VsdHNSZW5kZXJlci0+Y2FsY1dpZHRoKCk7
CisgICAgICAgIHdpZHRoIC09IHJlc3VsdHNSZW5kZXJlci0+d2lkdGgoKTsKKyAgICB9CisKKyAg
ICBpZiAoUmVuZGVyT2JqZWN0KiBjYW5jZWxSZW5kZXJlciA9IG1fY2FuY2VsQnV0dG9uID8gbV9j
YW5jZWxCdXR0b24tPnJlbmRlcmVyKCkgOiAwKSB7CisgICAgICAgIGNhbmNlbFJlbmRlcmVyLT5j
YWxjV2lkdGgoKTsKKyAgICAgICAgd2lkdGggLT0gY2FuY2VsUmVuZGVyZXItPndpZHRoKCk7Cisg
ICAgfQorCisgICAgcmV0dXJuIHdpZHRoOworfQorCitpbnQgUmVuZGVyVGV4dENvbnRyb2xTaW5n
bGVMaW5lOjpwcmVmZXJyZWRDb250ZW50V2lkdGgoZmxvYXQgY2hhcldpZHRoKSBjb25zdAorewor
ICAgIGludCBmYWN0b3IgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+
c2l6ZSgpOworICAgIGlmIChmYWN0b3IgPD0gMCkKKyAgICAgICAgZmFjdG9yID0gMjA7CisKKyAg
ICBpbnQgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsZihjaGFyV2lkdGggKiBmYWN0b3Ip
KTsKKworICAgIGlmIChSZW5kZXJPYmplY3QqIHJlc3VsdHNSZW5kZXJlciA9IG1fcmVzdWx0c0J1
dHRvbiA/IG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSA6IDApCisgICAgICAgIHJlc3VsdCAr
PSByZXN1bHRzUmVuZGVyZXItPmJvcmRlckxlZnQoKSArIHJlc3VsdHNSZW5kZXJlci0+Ym9yZGVy
UmlnaHQoKSArCisgICAgICAgICAgICAgICAgICByZXN1bHRzUmVuZGVyZXItPnBhZGRpbmdMZWZ0
KCkgKyByZXN1bHRzUmVuZGVyZXItPnBhZGRpbmdSaWdodCgpOworCisgICAgaWYgKFJlbmRlck9i
amVjdCogY2FuY2VsUmVuZGVyZXIgPSBtX2NhbmNlbEJ1dHRvbiA/IG1fY2FuY2VsQnV0dG9uLT5y
ZW5kZXJlcigpIDogMCkKKyAgICAgICAgcmVzdWx0ICs9IGNhbmNlbFJlbmRlcmVyLT5ib3JkZXJM
ZWZ0KCkgKyBjYW5jZWxSZW5kZXJlci0+Ym9yZGVyUmlnaHQoKSArCisgICAgICAgICAgICAgICAg
ICBjYW5jZWxSZW5kZXJlci0+cGFkZGluZ0xlZnQoKSArIGNhbmNlbFJlbmRlcmVyLT5wYWRkaW5n
UmlnaHQoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRy
b2xTaW5nbGVMaW5lOjphZGp1c3RDb250cm9sSGVpZ2h0QmFzZWRPbkxpbmVIZWlnaHQoaW50IGxp
bmVIZWlnaHQpCit7CisgICAgaWYgKFJlbmRlck9iamVjdCogcmVzdWx0c1JlbmRlcmVyID0gbV9y
ZXN1bHRzQnV0dG9uID8gbV9yZXN1bHRzQnV0dG9uLT5yZW5kZXJlcigpIDogMCkgeworICAgICAg
ICBzdGF0aWNfY2FzdDxSZW5kZXJCbG9jayo+KHJlc3VsdHNSZW5kZXJlciktPmNhbGNIZWlnaHQo
KTsKKyAgICAgICAgbV9oZWlnaHQgPSBtYXgobV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAg
ICAgIHJlc3VsdHNSZW5kZXJlci0+Ym9yZGVyVG9wKCkgKyByZXN1bHRzUmVuZGVyZXItPmJvcmRl
ckJvdHRvbSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1JlbmRlcmVyLT5wYWRk
aW5nVG9wKCkgKyByZXN1bHRzUmVuZGVyZXItPnBhZGRpbmdCb3R0b20oKSArCisgICAgICAgICAg
ICAgICAgICAgICAgIHJlc3VsdHNSZW5kZXJlci0+bWFyZ2luVG9wKCkgKyByZXN1bHRzUmVuZGVy
ZXItPm1hcmdpbkJvdHRvbSgpKTsKKyAgICAgICAgbGluZUhlaWdodCA9IG1heChsaW5lSGVpZ2h0
LCByZXN1bHRzUmVuZGVyZXItPmhlaWdodCgpKTsKKyAgICB9CisKKyAgICBpZiAoUmVuZGVyT2Jq
ZWN0KiBjYW5jZWxSZW5kZXJlciA9IG1fY2FuY2VsQnV0dG9uID8gbV9jYW5jZWxCdXR0b24tPnJl
bmRlcmVyKCkgOiAwKSB7CisgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckJsb2NrKj4oY2FuY2Vs
UmVuZGVyZXIpLT5jYWxjSGVpZ2h0KCk7CisgICAgICAgIG1faGVpZ2h0ID0gbWF4KG1faGVpZ2h0
LAorICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxSZW5kZXJlci0+Ym9yZGVyVG9wKCkgKyBj
YW5jZWxSZW5kZXJlci0+Ym9yZGVyQm90dG9tKCkgKworICAgICAgICAgICAgICAgICAgICAgICBj
YW5jZWxSZW5kZXJlci0+cGFkZGluZ1RvcCgpICsgY2FuY2VsUmVuZGVyZXItPnBhZGRpbmdCb3R0
b20oKSArCisgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFJlbmRlcmVyLT5tYXJnaW5Ub3Ao
KSArIGNhbmNlbFJlbmRlcmVyLT5tYXJnaW5Cb3R0b20oKSk7CisgICAgICAgIGxpbmVIZWlnaHQg
PSBtYXgobGluZUhlaWdodCwgY2FuY2VsUmVuZGVyZXItPmhlaWdodCgpKTsKKyAgICB9CisKKyAg
ICBtX2hlaWdodCArPSBsaW5lSGVpZ2h0OworfQorCit2b2lkIFJlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZTo6Y3JlYXRlU3VidHJlZUlmTmVlZGVkKCkKK3sKKyAgICBpZiAoIXN0YXRpY19jYXN0
PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5pc1NlYXJjaEZpZWxkKCkpIHsKKyAgICAgICAg
UmVuZGVyVGV4dENvbnRyb2w6OmNyZWF0ZVN1YnRyZWVJZk5lZWRlZChtX2lubmVyQmxvY2suZ2V0
KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtX2lubmVyQmxvY2spIHsK
KyAgICAgICAgLy8gQ3JlYXRlIHRoZSBpbm5lciBibG9jayBlbGVtZW50CisgICAgICAgIG1faW5u
ZXJCbG9jayA9IG5ldyBUZXh0Q29udHJvbElubmVyRWxlbWVudChkb2N1bWVudCgpLCBub2RlKCkp
OworICAgICAgICBtX2lubmVyQmxvY2stPmF0dGFjaElubmVyRWxlbWVudChub2RlKCksIGNyZWF0
ZUlubmVyQmxvY2tTdHlsZShzdHlsZSgpKSwgcmVuZGVyQXJlbmEoKSk7CisgICAgfQorCisgICAg
aWYgKCFtX3Jlc3VsdHNCdXR0b24pIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBzZWFyY2ggcmVz
dWx0cyBidXR0b24gZWxlbWVudAorICAgICAgICBtX3Jlc3VsdHNCdXR0b24gPSBuZXcgU2VhcmNo
RmllbGRSZXN1bHRzQnV0dG9uRWxlbWVudChkb2N1bWVudCgpKTsKKyAgICAgICAgbV9yZXN1bHRz
QnV0dG9uLT5hdHRhY2hJbm5lckVsZW1lbnQobV9pbm5lckJsb2NrLmdldCgpLCBjcmVhdGVSZXN1
bHRzQnV0dG9uU3R5bGUobV9pbm5lckJsb2NrLT5yZW5kZXJlcigpLT5zdHlsZSgpKSwgcmVuZGVy
QXJlbmEoKSk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGlubmVyVGV4dCBlbGVtZW50IGJlZm9y
ZSBhZGRpbmcgdGhlIGNhbmNlbCBidXR0b24KKyAgICBSZW5kZXJUZXh0Q29udHJvbDo6Y3JlYXRl
U3VidHJlZUlmTmVlZGVkKG1faW5uZXJCbG9jay5nZXQoKSk7CisKKyAgICBpZiAoIW1fY2FuY2Vs
QnV0dG9uKSB7CisgICAgICAgIC8vIENyZWF0ZSB0aGUgY2FuY2VsIGJ1dHRvbiBlbGVtZW50Cisg
ICAgICAgIG1fY2FuY2VsQnV0dG9uID0gbmV3IFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uRWxlbWVu
dChkb2N1bWVudCgpKTsKKyAgICAgICAgbV9jYW5jZWxCdXR0b24tPmF0dGFjaElubmVyRWxlbWVu
dChtX2lubmVyQmxvY2suZ2V0KCksIGNyZWF0ZUNhbmNlbEJ1dHRvblN0eWxlKG1faW5uZXJCbG9j
ay0+cmVuZGVyZXIoKS0+c3R5bGUoKSksIHJlbmRlckFyZW5hKCkpOworICAgIH0KK30KKwordm9p
ZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnVwZGF0ZUZyb21FbGVtZW50KCkKK3sKKyAg
ICBjcmVhdGVTdWJ0cmVlSWZOZWVkZWQoKTsKKyAgICBSZW5kZXJUZXh0Q29udHJvbDo6dXBkYXRl
RnJvbUVsZW1lbnQoKTsKKworICAgIGJvb2wgcGxhY2Vob2xkZXJWaXNpYmlsaXR5U2hvdWxkQ2hh
bmdlID0gbV9wbGFjZWhvbGRlclZpc2libGUgIT0gcGxhY2Vob2xkZXJTaG91bGRCZVZpc2libGUo
KTsKKyAgICBtX3BsYWNlaG9sZGVyVmlzaWJsZSA9IHBsYWNlaG9sZGVyU2hvdWxkQmVWaXNpYmxl
KCk7CisKKyAgICBpZiAoUmVuZGVyT2JqZWN0KiBjYW5jZWxCdXR0b25SZW5kZXJlciA9IG1fY2Fu
Y2VsQnV0dG9uID8gbV9jYW5jZWxCdXR0b24tPnJlbmRlcmVyKCkgOiAwKQorICAgICAgICB1cGRh
dGVDYW5jZWxCdXR0b25WaXNpYmlsaXR5KGNhbmNlbEJ1dHRvblJlbmRlcmVyLT5zdHlsZSgpKTsK
KworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50Kj4obm9kZSgpKTsKKworICAgIGlmIChtX3BsYWNlaG9sZGVyVmlzaWJsZSkgeworICAg
ICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICAgICAgaW5uZXJUZXh0RWxlbWVudCgpLT5z
ZXRJbm5lclRleHQoZWxlbWVudC0+Z2V0QXR0cmlidXRlKHBsYWNlaG9sZGVyQXR0ciksIGVjKTsK
KyAgICAgICAgQVNTRVJUKGVjID09IDApOworICAgIH0gZWxzZSBpZiAoIWVsZW1lbnQtPnZhbHVl
TWF0Y2hlc1JlbmRlcmVyKCkgfHwgcGxhY2Vob2xkZXJWaXNpYmlsaXR5U2hvdWxkQ2hhbmdlKQor
ICAgICAgICBzZXRJbm5lclRleHRWYWx1ZShlbGVtZW50LT52YWx1ZSgpKTsKKworICAgIGlmICht
X3NlYXJjaFBvcHVwSXNWaXNpYmxlKQorICAgICAgICBtX3NlYXJjaFBvcHVwLT51cGRhdGVGcm9t
RWxlbWVudCgpOworfQorCit2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y2FjaGVT
ZWxlY3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPihub2RlKCkpLT5jYWNoZVNlbGVjdGlvbihzdGFydCwgZW5kKTsKK30KKworUGFz
c1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjcmVhdGVJ
bm5lclRleHRTdHlsZShjb25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSkgY29uc3QKK3sKKyAg
ICBSZWZQdHI8UmVuZGVyU3R5bGU+IHRleHRCbG9ja1N0eWxlOworICAgIGlmIChwbGFjZWhvbGRl
clNob3VsZEJlVmlzaWJsZSgpKSB7CisgICAgICAgIFJlbmRlclN0eWxlKiBwc2V1ZG9TdHlsZSA9
IGdldENhY2hlZFBzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpJTlBVVF9QTEFDRUhPTERFUik7Cisg
ICAgICAgIHRleHRCbG9ja1N0eWxlID0gUmVuZGVyU3R5bGU6OmNsb25lKHBzZXVkb1N0eWxlKTsK
KyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0QmxvY2tTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVh
dGUoKTsgICAKKyAgICAgICAgdGV4dEJsb2NrU3R5bGUtPmluaGVyaXRGcm9tKHN0YXJ0U3R5bGUp
OworICAgIH0KKworICAgIGFkanVzdElubmVyVGV4dFN0eWxlKHN0YXJ0U3R5bGUsIHRleHRCbG9j
a1N0eWxlLmdldCgpKTsKKworICAgIHRleHRCbG9ja1N0eWxlLT5zZXRXaGl0ZVNwYWNlKFBSRSk7
CisgICAgdGV4dEJsb2NrU3R5bGUtPnNldFdvcmRXcmFwKE5vcm1hbFdvcmRXcmFwKTsKKyAgICB0
ZXh0QmxvY2tTdHlsZS0+c2V0T3ZlcmZsb3dYKE9ISURERU4pOworICAgIHRleHRCbG9ja1N0eWxl
LT5zZXRPdmVyZmxvd1koT0hJRERFTik7CisKKyAgICAvLyBEbyBub3QgYWxsb3cgbGluZS1oZWln
aHQgdG8gYmUgc21hbGxlciB0aGFuIG91ciBkZWZhdWx0LgorICAgIGlmICh0ZXh0QmxvY2tTdHls
ZS0+Zm9udCgpLmxpbmVTcGFjaW5nKCkgPiBsaW5lSGVpZ2h0KHRydWUsIHRydWUpKQorICAgICAg
ICB0ZXh0QmxvY2tTdHlsZS0+c2V0TGluZUhlaWdodChMZW5ndGgoLTEwMC4wZiwgUGVyY2VudCkp
OworCisgICAgdGV4dEJsb2NrU3R5bGUtPnNldERpc3BsYXkobV9pbm5lckJsb2NrID8gSU5MSU5F
X0JMT0NLIDogQkxPQ0spOworCisgICAgLy8gV2UncmUgYWRkaW5nIG9uZSBleHRyYSBwaXhlbCBv
ZiBwYWRkaW5nIHRvIG1hdGNoIFdpbklFLgorICAgIHRleHRCbG9ja1N0eWxlLT5zZXRQYWRkaW5n
TGVmdChMZW5ndGgoMSwgRml4ZWQpKTsKKyAgICB0ZXh0QmxvY2tTdHlsZS0+c2V0UGFkZGluZ1Jp
Z2h0KExlbmd0aCgxLCBGaXhlZCkpOworCisgICAgLy8gV2hlbiB0aGUgcGxhY2Vob2xkZXIgaXMg
Z29pbmcgdG8gYmUgZGlzcGxheWVkLCB0ZW1wb3JhcmlseSBvdmVycmlkZSB0aGUgdGV4dCBzZWN1
cml0eSB0byBiZSAibm9uZSIuCisgICAgLy8gQWZ0ZXIgdGhpcywgdXBkYXRlRnJvbUVsZW1lbnQg
d2lsbCBpbW1lZGlhdGVseSB1cGRhdGUgdGhlIHRleHQgZGlzcGxheWVkLgorICAgIC8vIFdoZW4g
dGhlIHBsYWNlaG9sZGVyIGlzIG5vIGxvbmdlciB2aXNpYmxlLCB1cGRhdGVQbGFjZWhvbGRlclZp
c2libGl0eSB3aWxsIHJlc2V0IHRoZSBzdHlsZSwgCisgICAgLy8gYW5kIHRoZSB0ZXh0IHNlY3Vy
aXR5IG1vZGUgd2lsbCBiZSBzZXQgYmFjayB0byB0aGUgY29tcHV0ZWQgdmFsdWUgY29ycmVjdGx5
LgorICAgIGlmIChwbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSgpKQorICAgICAgICB0ZXh0Qmxv
Y2tTdHlsZS0+c2V0VGV4dFNlY3VyaXR5KFRTTk9ORSk7CisKKyAgICByZXR1cm4gdGV4dEJsb2Nr
U3R5bGUucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBSZW5kZXJUZXh0
Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZUlubmVyQmxvY2tTdHlsZShjb25zdCBSZW5kZXJTdHls
ZSogc3RhcnRTdHlsZSkgY29uc3QKK3sKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IGlubmVyQmxv
Y2tTdHlsZSA9IFJlbmRlclN0eWxlOjpjcmVhdGUoKTsKKyAgICBpbm5lckJsb2NrU3R5bGUtPmlu
aGVyaXRGcm9tKHN0YXJ0U3R5bGUpOworCisgICAgaW5uZXJCbG9ja1N0eWxlLT5zZXREaXNwbGF5
KEJMT0NLKTsKKyAgICBpbm5lckJsb2NrU3R5bGUtPnNldERpcmVjdGlvbihMVFIpOworCisgICAg
Ly8gV2UgZG9uJ3Qgd2FudCB0aGUgc2hhZG93IGRvbSB0byBiZSBlZGl0YWJsZSwgc28gd2Ugc2V0
IHRoaXMgYmxvY2sgdG8gcmVhZC1vbmx5IGluIGNhc2UgdGhlIGlucHV0IGl0c2VsZiBpcyBlZGl0
YWJsZS4KKyAgICBpbm5lckJsb2NrU3R5bGUtPnNldFVzZXJNb2RpZnkoUkVBRF9PTkxZKTsKKwor
ICAgIHJldHVybiBpbm5lckJsb2NrU3R5bGUucmVsZWFzZSgpOworfQorCitQYXNzUmVmUHRyPFJl
bmRlclN0eWxlPiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNyZWF0ZVJlc3VsdHNCdXR0
b25TdHlsZShjb25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSkgY29uc3QKK3sKKyAgICBIVE1M
SW5wdXRFbGVtZW50KiBpbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2Rl
KCkpOworCisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiByZXN1bHRzQmxvY2tTdHlsZTsKKyAgICBp
ZiAoaW5wdXQtPm1heFJlc3VsdHMoKSA8IDApCisgICAgICAgIHJlc3VsdHNCbG9ja1N0eWxlID0g
Z2V0Q2FjaGVkUHNldWRvU3R5bGUoUmVuZGVyU3R5bGU6OlNFQVJDSF9ERUNPUkFUSU9OKTsKKyAg
ICBlbHNlIGlmICghaW5wdXQtPm1heFJlc3VsdHMoKSkKKyAgICAgICAgcmVzdWx0c0Jsb2NrU3R5
bGUgPSBnZXRDYWNoZWRQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6U0VBUkNIX1JFU1VMVFNfREVD
T1JBVElPTik7CisgICAgZWxzZQorICAgICAgICByZXN1bHRzQmxvY2tTdHlsZSA9IGdldENhY2hl
ZFBzZXVkb1N0eWxlKFJlbmRlclN0eWxlOjpTRUFSQ0hfUkVTVUxUU19CVVRUT04pOworCisgICAg
aWYgKCFyZXN1bHRzQmxvY2tTdHlsZSkKKyAgICAgICAgcmVzdWx0c0Jsb2NrU3R5bGUgPSBSZW5k
ZXJTdHlsZTo6Y3JlYXRlKCk7CisKKyAgICBpZiAoc3RhcnRTdHlsZSkKKyAgICAgICAgcmVzdWx0
c0Jsb2NrU3R5bGUtPmluaGVyaXRGcm9tKHN0YXJ0U3R5bGUpOworCisgICAgcmV0dXJuIHJlc3Vs
dHNCbG9ja1N0eWxlLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gUmVu
ZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpjcmVhdGVDYW5jZWxCdXR0b25TdHlsZShjb25zdCBS
ZW5kZXJTdHlsZSogc3RhcnRTdHlsZSkgY29uc3QKK3sKKyAgICBSZWZQdHI8UmVuZGVyU3R5bGU+
IGNhbmNlbEJsb2NrU3R5bGU7CisgICAgCisgICAgaWYgKFJlZlB0cjxSZW5kZXJTdHlsZT4gcHNl
dWRvU3R5bGUgPSBnZXRDYWNoZWRQc2V1ZG9TdHlsZShSZW5kZXJTdHlsZTo6U0VBUkNIX0NBTkNF
TF9CVVRUT04pKQorICAgICAgICAvLyBXZSBtYXkgYmUgc2hhcmluZyBzdHlsZSB3aXRoIGFub3Ro
ZXIgc2VhcmNoIGZpZWxkLCBidXQgd2UgbXVzdCBub3Qgc2hhcmUgdGhlIGNhbmNlbCBidXR0b24g
c3R5bGUuCisgICAgICAgIGNhbmNlbEJsb2NrU3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUocHNl
dWRvU3R5bGUuZ2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgY2FuY2VsQmxvY2tTdHlsZSA9IFJl
bmRlclN0eWxlOjpjcmVhdGUoKTsKKworICAgIGlmIChzdGFydFN0eWxlKQorICAgICAgICBjYW5j
ZWxCbG9ja1N0eWxlLT5pbmhlcml0RnJvbShzdGFydFN0eWxlKTsKKworICAgIHVwZGF0ZUNhbmNl
bEJ1dHRvblZpc2liaWxpdHkoY2FuY2VsQmxvY2tTdHlsZS5nZXQoKSk7CisgICAgcmV0dXJuIGNh
bmNlbEJsb2NrU3R5bGUucmVsZWFzZSgpOworfQorCit2b2lkIFJlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZTo6dXBkYXRlQ2FuY2VsQnV0dG9uVmlzaWJpbGl0eShSZW5kZXJTdHlsZSogc3R5bGUp
IGNvbnN0Cit7CisgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXQgPSBzdGF0aWNfY2FzdDxIVE1M
SW5wdXRFbGVtZW50Kj4obm9kZSgpKTsKKyAgICBzdHlsZS0+c2V0VmlzaWJpbGl0eShpbnB1dC0+
dmFsdWUoKS5pc0VtcHR5KCkgPyBISURERU4gOiBWSVNJQkxFKTsKK30KKworY29uc3QgQXRvbWlj
U3RyaW5nJiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmF1dG9zYXZlTmFtZSgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKCkpLT5nZXRBdHRyaWJ1
dGUoYXV0b3NhdmVBdHRyKTsKK30KKwordm9pZCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6
OnN0YXJ0U2VhcmNoRXZlbnRUaW1lcigpCit7CisgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dCgp
Lmxlbmd0aCgpOworCisgICAgLy8gSWYgdGhlcmUncyBubyB0ZXh0LCBmaXJlIHRoZSBldmVudCBy
aWdodCBhd2F5LgorICAgIGlmICghbGVuZ3RoKSB7CisgICAgICAgIHN0b3BTZWFyY2hFdmVudFRp
bWVyKCk7CisgICAgICAgIHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihub2RlKCkpLT5v
blNlYXJjaCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQWZ0ZXIgdHlwaW5n
IHRoZSBmaXJzdCBrZXksIHdlIHdhaXQgMC41IHNlY29uZHMuCisgICAgLy8gQWZ0ZXIgdGhlIHNl
Y29uZCBrZXksIDAuNCBzZWNvbmRzLCB0aGVuIDAuMywgdGhlbiAwLjIgZnJvbSB0aGVuIG9uLgor
ICAgIG1fc2VhcmNoRXZlbnRUaW1lci5zdGFydE9uZVNob3QobWF4KDAuMiwgMC42IC0gMC4xICog
bGVuZ3RoKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpzZWFyY2hF
dmVudFRpbWVyRmlyZWQoVGltZXI8UmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lPiopCit7Cisg
ICAgc3RhdGljX2Nhc3Q8SFRNTElucHV0RWxlbWVudCo+KG5vZGUoKSktPm9uU2VhcmNoKCk7Cit9
CisKKy8vIFBvcHVwTWVudUNsaWVudCBtZXRob2RzCit2b2lkIFJlbmRlclRleHRDb250cm9sU2lu
Z2xlTGluZTo6dmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxpc3RJbmRleCwgYm9vbCBmaXJlRXZlbnRz
KQoreworICAgIEFTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KGxpc3RJbmRleCkgPCBsaXN0U2l6ZSgp
KTsKKyAgICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVs
ZW1lbnQqPihub2RlKCkpOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KGxpc3RJbmRleCkgPT0g
KGxpc3RTaXplKCkgLSAxKSkgeworICAgICAgICBpZiAoZmlyZUV2ZW50cykgeworICAgICAgICAg
ICAgbV9yZWNlbnRTZWFyY2hlcy5jbGVhcigpOworICAgICAgICAgICAgY29uc3QgQXRvbWljU3Ry
aW5nJiBuYW1lID0gYXV0b3NhdmVOYW1lKCk7CisgICAgICAgICAgICBpZiAoIW5hbWUuaXNFbXB0
eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtX3NlYXJjaFBvcHVwKQorICAgICAgICAgICAg
ICAgICAgICBtX3NlYXJjaFBvcHVwID0gU2VhcmNoUG9wdXBNZW51OjpjcmVhdGUodGhpcyk7Cisg
ICAgICAgICAgICAgICAgbV9zZWFyY2hQb3B1cC0+c2F2ZVJlY2VudFNlYXJjaGVzKG5hbWUsIG1f
cmVjZW50U2VhcmNoZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsK
KyAgICAgICAgaW5wdXQtPnNldFZhbHVlKGl0ZW1UZXh0KGxpc3RJbmRleCkpOworICAgICAgICBp
ZiAoZmlyZUV2ZW50cykKKyAgICAgICAgICAgIGlucHV0LT5vblNlYXJjaCgpOworICAgICAgICBp
bnB1dC0+c2VsZWN0KCk7CisgICAgfQorfQorCitTdHJpbmcgUmVuZGVyVGV4dENvbnRyb2xTaW5n
bGVMaW5lOjppdGVtVGV4dCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Cit7CisgICAgaW50IHNp
emUgPSBsaXN0U2l6ZSgpOworICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgQVNTRVJUKCFs
aXN0SW5kZXgpOworICAgICAgICByZXR1cm4gc2VhcmNoTWVudU5vUmVjZW50U2VhcmNoZXNUZXh0
KCk7CisgICAgfQorICAgIGlmICghbGlzdEluZGV4KQorICAgICAgICByZXR1cm4gc2VhcmNoTWVu
dVJlY2VudFNlYXJjaGVzVGV4dCgpOworICAgIGlmIChpdGVtSXNTZXBhcmF0b3IobGlzdEluZGV4
KSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KGxp
c3RJbmRleCkgPT0gKHNpemUgLSAxKSkKKyAgICAgICAgcmV0dXJuIHNlYXJjaE1lbnVDbGVhclJl
Y2VudFNlYXJjaGVzVGV4dCgpOworICAgIHJldHVybiBtX3JlY2VudFNlYXJjaGVzW2xpc3RJbmRl
eCAtIDFdOworfQorCitib29sIFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6aXRlbUlzRW5h
YmxlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Cit7CisgICAgIGlmICghbGlzdEluZGV4IHx8
IGl0ZW1Jc1NlcGFyYXRvcihsaXN0SW5kZXgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
cmV0dXJuIHRydWU7Cit9CisKK1BvcHVwTWVudVN0eWxlIFJlbmRlclRleHRDb250cm9sU2luZ2xl
TGluZTo6aXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bWVudVN0eWxlKCk7Cit9CisKK1BvcHVwTWVudVN0eWxlIFJlbmRlclRleHRDb250cm9sU2luZ2xl
TGluZTo6bWVudVN0eWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gUG9wdXBNZW51U3R5bGUoc3R5
bGUoKS0+Y29sb3IoKSwgc3R5bGUoKS0+YmFja2dyb3VuZENvbG9yKCksIHN0eWxlKCktPmZvbnQo
KSwgc3R5bGUoKS0+dmlzaWJpbGl0eSgpID09IFZJU0lCTEUpOworfQorCitpbnQgUmVuZGVyVGV4
dENvbnRyb2xTaW5nbGVMaW5lOjpjbGllbnRJbnNldExlZnQoKSBjb25zdAoreworICAgIC8vIElu
c2V0IHRoZSBtZW51IGJ5IHRoZSByYWRpdXMgb2YgdGhlIGNhcCBvbiB0aGUgbGVmdCBzbyB0aGF0
CisgICAgLy8gaXQgb25seSBydW5zIGFsb25nIHRoZSBzdHJhaWdodCBwYXJ0IG9mIHRoZSBiZXpl
bC4KKyAgICByZXR1cm4gaGVpZ2h0KCkgLyAyOworfQorCitpbnQgUmVuZGVyVGV4dENvbnRyb2xT
aW5nbGVMaW5lOjpjbGllbnRJbnNldFJpZ2h0KCkgY29uc3QKK3sKKyAgICAvLyBJbnNldCB0aGUg
bWVudSBieSB0aGUgcmFkaXVzIG9mIHRoZSBjYXAgb24gdGhlIHJpZ2h0IHNvIHRoYXQKKyAgICAv
LyBpdCBvbmx5IHJ1bnMgYWxvbmcgdGhlIHN0cmFpZ2h0IHBhcnQgb2YgdGhlIGJlemVsICh1bmxl
c3MgaXQgbmVlZHMKKyAgICAvLyB0byBiZSB3aWRlcikuCisgICAgcmV0dXJuIGhlaWdodCgpIC8g
MjsKK30KKworaW50IFJlbmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6Y2xpZW50UGFkZGluZ0xl
ZnQoKSBjb25zdAoreworICAgIGludCBwYWRkaW5nID0gY2xpZW50UGFkZGluZ0xlZnQoKTsKKwor
ICAgIGlmIChSZW5kZXJPYmplY3QqIHJlc3VsdHNSZW5kZXJlciA9IG1fcmVzdWx0c0J1dHRvbiA/
IG1fcmVzdWx0c0J1dHRvbi0+cmVuZGVyZXIoKSA6IDApCisgICAgICAgIHBhZGRpbmcgKz0gcmVz
dWx0c1JlbmRlcmVyLT53aWR0aCgpOworCisgICAgcmV0dXJuIHBhZGRpbmc7Cit9CisKK2ludCBS
ZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OmNsaWVudFBhZGRpbmdSaWdodCgpIGNvbnN0Cit7
CisgICAgaW50IHBhZGRpbmcgPSBjbGllbnRQYWRkaW5nUmlnaHQoKTsKKworICAgIGlmIChSZW5k
ZXJPYmplY3QqIGNhbmNlbFJlbmRlcmVyID0gbV9jYW5jZWxCdXR0b24gPyBtX2NhbmNlbEJ1dHRv
bi0+cmVuZGVyZXIoKSA6IDApCisgICAgICAgIHBhZGRpbmcgKz0gY2FuY2VsUmVuZGVyZXItPndp
ZHRoKCk7CisKKyAgICByZXR1cm4gcGFkZGluZzsKK30KKworaW50IFJlbmRlclRleHRDb250cm9s
U2luZ2xlTGluZTo6bGlzdFNpemUoKSBjb25zdAoreworICAgIC8vIElmIHRoZXJlIGFyZSBubyBy
ZWNlbnQgc2VhcmNoZXMsIHRoZW4gb3VyIG1lbnUgd2lsbCBoYXZlIDEgIk5vIHJlY2VudCBzZWFy
Y2hlcyIgaXRlbS4KKyAgICBpZiAoIW1fcmVjZW50U2VhcmNoZXMuc2l6ZSgpKQorICAgICAgICBy
ZXR1cm4gMTsKKyAgICAvLyBPdGhlcndpc2UsIGxlYXZlIHJvb20gaW4gdGhlIG1lbnUgZm9yIGEg
aGVhZGVyLCBhIHNlcGFyYXRvciwgYW5kIHRoZSAiQ2xlYXIgcmVjZW50IHNlYXJjaGVzIiBpdGVt
LgorICAgIHJldHVybiBtX3JlY2VudFNlYXJjaGVzLnNpemUoKSArIDM7Cit9CisKK2ludCBSZW5k
ZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6OnNlbGVjdGVkSW5kZXgoKSBjb25zdAoreworICAgIHJl
dHVybiAtMTsKK30KKworYm9vbCBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU6Oml0ZW1Jc1Nl
cGFyYXRvcih1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0Cit7CisgICAvLyBUaGUgc2VwYXJhdG9y
IHdpbGwgYmUgdGhlIHNlY29uZCB0byBsYXN0IGl0ZW0gaW4gb3VyIGxpc3QuCisgICByZXR1cm4g
c3RhdGljX2Nhc3Q8aW50PihsaXN0SW5kZXgpID09IChsaXN0U2l6ZSgpIC0gMik7Cit9CisKK2Jv
b2wgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjppdGVtSXNMYWJlbCh1bnNpZ25lZCBsaXN0
SW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGxpc3RJbmRleCA9PSAwOworfQorCitib29sIFJl
bmRlclRleHRDb250cm9sU2luZ2xlTGluZTo6aXRlbUlzU2VsZWN0ZWQodW5zaWduZWQpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRleHRDb250cm9sU2luZ2xl
TGluZTo6c2V0VGV4dEZyb21JdGVtKHVuc2lnbmVkIGxpc3RJbmRleCkKK3sKKyAgICBzdGF0aWNf
Y2FzdDxIVE1MSW5wdXRFbGVtZW50Kj4obm9kZSgpKS0+c2V0VmFsdWUoaXRlbVRleHQobGlzdElu
ZGV4KSk7Cit9CisKK0ZvbnRTZWxlY3RvciogUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lOjpm
b250U2VsZWN0b3IoKSBjb25zdAoreworICAgIHJldHVybiBkb2N1bWVudCgpLT5zdHlsZVNlbGVj
dG9yKCktPmZvbnRTZWxlY3RvcigpOworfQorCitIb3N0V2luZG93KiBSZW5kZXJUZXh0Q29udHJv
bFNpbmdsZUxpbmU6Omhvc3RXaW5kb3coKSBjb25zdAoreworICAgIHJldHVybiBkb2N1bWVudCgp
LT52aWV3KCktPmhvc3RXaW5kb3coKTsKK30KKworUGFzc1JlZlB0cjxTY3JvbGxiYXI+IFJlbmRl
clRleHRDb250cm9sU2luZ2xlTGluZTo6Y3JlYXRlU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCog
Y2xpZW50LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJv
bFNpemUgY29udHJvbFNpemUpCit7CisgICAgUmVmUHRyPFNjcm9sbGJhcj4gd2lkZ2V0OworICAg
IGJvb2wgaGFzQ3VzdG9tU2Nyb2xsYmFyU3R5bGUgPSBzdHlsZSgpLT5oYXNQc2V1ZG9TdHlsZShS
ZW5kZXJTdHlsZTo6U0NST0xMQkFSKTsKKyAgICBpZiAoaGFzQ3VzdG9tU2Nyb2xsYmFyU3R5bGUp
CisgICAgICAgIHdpZGdldCA9IFJlbmRlclNjcm9sbGJhcjo6Y3JlYXRlQ3VzdG9tU2Nyb2xsYmFy
KGNsaWVudCwgb3JpZW50YXRpb24sIHRoaXMpOworICAgIGVsc2UKKyAgICAgICAgd2lkZ2V0ID0g
U2Nyb2xsYmFyOjpjcmVhdGVOYXRpdmVTY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgY29u
dHJvbFNpemUpOworICAgIHJldHVybiB3aWRnZXQucmVsZWFzZSgpOworfQorCit9CkluZGV4OiBy
ZW5kZXJpbmcvUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVu
ZGVyaW5nL1JlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5oCShyZXZpc2lvbiAwKQorKysgcmVu
ZGVyaW5nL1JlbmRlclRleHRDb250cm9sU2luZ2xlTGluZS5oCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUb3JjaCBNb2JpbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLiAoaHR0cDovL3d3dy50b3JjaG1vYmlsZS5jb20vKQorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lm
bmRlZiBSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmVfaAorI2RlZmluZSBSZW5kZXJUZXh0Q29u
dHJvbFNpbmdsZUxpbmVfaAorCisjaW5jbHVkZSAiUG9wdXBNZW51Q2xpZW50LmgiCisjaW5jbHVk
ZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uRWxlbWVudDsKK2NsYXNz
IFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvbkVsZW1lbnQ7CitjbGFzcyBTZWFyY2hQb3B1cE1lbnU7
CitjbGFzcyBUZXh0Q29udHJvbElubmVyRWxlbWVudDsKKworY2xhc3MgUmVuZGVyVGV4dENvbnRy
b2xTaW5nbGVMaW5lIDogcHVibGljIFJlbmRlclRleHRDb250cm9sLCBwcml2YXRlIFBvcHVwTWVu
dUNsaWVudCB7CitwdWJsaWM6CisgICAgUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5lKE5vZGUq
KTsKKyAgICB2aXJ0dWFsIH5SZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmUoKTsKKworICAgIHZp
cnR1YWwgYm9vbCBoYXNDb250cm9sQ2xpcCgpIGNvbnN0IHsgcmV0dXJuIG1fY2FuY2VsQnV0dG9u
OyB9CisgICAgdmlydHVhbCBib29sIGlzVGV4dEZpZWxkKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQorCisgICAgYm9vbCBwbGFjZWhvbGRlcklzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGxh
Y2Vob2xkZXJWaXNpYmxlOyB9CisgICAgYm9vbCBwbGFjZWhvbGRlclNob3VsZEJlVmlzaWJsZSgp
IGNvbnN0OworICAgIHZvaWQgdXBkYXRlUGxhY2Vob2xkZXJWaXNpYmlsaXR5KCk7CisKKyAgICB2
b2lkIGFkZFNlYXJjaFJlc3VsdCgpOworICAgIHZvaWQgc3RvcFNlYXJjaEV2ZW50VGltZXIoKTsK
KworICAgIGJvb2wgcG9wdXBJc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiBtX3NlYXJjaFBvcHVw
SXNWaXNpYmxlOyB9CisgICAgdm9pZCBzaG93UG9wdXAoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaGlk
ZVBvcHVwKCk7IC8vIFBvcHVwTWVudUNsaWVudCBtZXRob2QKKworICAgIHZpcnR1YWwgdm9pZCBz
dWJ0cmVlSGFzQ2hhbmdlZCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mLCBp
bnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIGxheW91dCgpOworCisgICAgdmlydHVh
bCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYs
IGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24pOworICAgIHZvaWQg
Zm9yd2FyZEV2ZW50KEV2ZW50Kik7CisKK3ByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkIGNhcHNM
b2NrU3RhdGVNYXlIYXZlQ2hhbmdlZCgpOworCisgICAgaW50IHRleHRCbG9ja1dpZHRoKCkgY29u
c3Q7CisgICAgdmlydHVhbCBpbnQgcHJlZmVycmVkQ29udGVudFdpZHRoKGZsb2F0IGNoYXJXaWR0
aCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdENvbnRyb2xIZWlnaHRCYXNlZE9uTGlu
ZUhlaWdodChpbnQgbGluZUhlaWdodCk7CisKKyAgICB2b2lkIGNyZWF0ZVN1YnRyZWVJZk5lZWRl
ZCgpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVGcm9tRWxlbWVudCgpOworICAgIHZpcnR1YWwg
dm9pZCBjYWNoZVNlbGVjdGlvbihpbnQgc3RhcnQsIGludCBlbmQpOworICAgIHZpcnR1YWwgdm9p
ZCBzdHlsZURpZENoYW5nZShSZW5kZXJTdHlsZTo6RGlmZiwgY29uc3QgUmVuZGVyU3R5bGUqIG9s
ZFN0eWxlKTsKKworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gY3JlYXRlSW5u
ZXJUZXh0U3R5bGUoY29uc3QgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUpIGNvbnN0OworICAgIFBh
c3NSZWZQdHI8UmVuZGVyU3R5bGU+IGNyZWF0ZUlubmVyQmxvY2tTdHlsZShjb25zdCBSZW5kZXJT
dHlsZSogc3RhcnRTdHlsZSkgY29uc3Q7CisgICAgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gY3Jl
YXRlUmVzdWx0c0J1dHRvblN0eWxlKGNvbnN0IFJlbmRlclN0eWxlKiBzdGFydFN0eWxlKSBjb25z
dDsKKyAgICBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBjcmVhdGVDYW5jZWxCdXR0b25TdHlsZShj
b25zdCBSZW5kZXJTdHlsZSogc3RhcnRTdHlsZSkgY29uc3Q7CisKKyAgICB2b2lkIHVwZGF0ZUNh
bmNlbEJ1dHRvblZpc2liaWxpdHkoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICBjb25zdCBBdG9t
aWNTdHJpbmcmIGF1dG9zYXZlTmFtZSgpIGNvbnN0OworCisgICAgdm9pZCBzdGFydFNlYXJjaEV2
ZW50VGltZXIoKTsKKyAgICB2b2lkIHNlYXJjaEV2ZW50VGltZXJGaXJlZChUaW1lcjxSZW5kZXJU
ZXh0Q29udHJvbFNpbmdsZUxpbmU+Kik7CisKK3ByaXZhdGU6CisgICAgLy8gUG9wdXBNZW51Q2xp
ZW50IG1ldGhvZHMKKyAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKHVuc2lnbmVkIGxpc3RJ
bmRleCwgYm9vbCBmaXJlRXZlbnRzID0gdHJ1ZSk7CisgICAgdmlydHVhbCBTdHJpbmcgaXRlbVRl
eHQodW5zaWduZWQgbGlzdEluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXRlbUlzRW5h
YmxlZCh1bnNpZ25lZCBsaXN0SW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgUG9wdXBNZW51U3R5
bGUgaXRlbVN0eWxlKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7CisgICAgdmlydHVhbCBQb3B1
cE1lbnVTdHlsZSBtZW51U3R5bGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBjbGllbnRJbnNl
dExlZnQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBjbGllbnRJbnNldFJpZ2h0KCkgY29uc3Q7
CisgICAgdmlydHVhbCBpbnQgY2xpZW50UGFkZGluZ0xlZnQoKSBjb25zdDsKKyAgICB2aXJ0dWFs
IGludCBjbGllbnRQYWRkaW5nUmlnaHQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBsaXN0U2l6
ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHNlbGVjdGVkSW5kZXgoKSBjb25zdDsKKyAgICB2
aXJ0dWFsIGJvb2wgaXRlbUlzU2VwYXJhdG9yKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7Cisg
ICAgdmlydHVhbCBib29sIGl0ZW1Jc0xhYmVsKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7Cisg
ICAgdmlydHVhbCBib29sIGl0ZW1Jc1NlbGVjdGVkKHVuc2lnbmVkIGxpc3RJbmRleCkgY29uc3Q7
CisgICAgdmlydHVhbCBib29sIHNob3VsZFBvcE92ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsg
fQorICAgIHZpcnR1YWwgYm9vbCB2YWx1ZVNob3VsZENoYW5nZU9uSG90VHJhY2soKSBjb25zdCB7
IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRUZXh0RnJvbUl0ZW0odW5zaWdu
ZWQgbGlzdEluZGV4KTsKKyAgICB2aXJ0dWFsIEZvbnRTZWxlY3RvciogZm9udFNlbGVjdG9yKCkg
Y29uc3Q7CisgICAgdmlydHVhbCBIb3N0V2luZG93KiBob3N0V2luZG93KCkgY29uc3Q7CisgICAg
dmlydHVhbCBQYXNzUmVmUHRyPFNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKFNjcm9sbGJhckNs
aWVudCosIFNjcm9sbGJhck9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSk7CisKK3By
aXZhdGU6CisgICAgYm9vbCBtX3BsYWNlaG9sZGVyVmlzaWJsZTsKKyAgICBib29sIG1fc2VhcmNo
UG9wdXBJc1Zpc2libGU7CisgICAgYm9vbCBtX3Nob3VsZERyYXdDYXBzTG9ja0luZGljYXRvcjsK
KworICAgIFJlZlB0cjxUZXh0Q29udHJvbElubmVyRWxlbWVudD4gbV9pbm5lckJsb2NrOworICAg
IFJlZlB0cjxTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25FbGVtZW50PiBtX3Jlc3VsdHNCdXR0b247
CisgICAgUmVmUHRyPFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uRWxlbWVudD4gbV9jYW5jZWxCdXR0
b247CisKKyAgICBUaW1lcjxSZW5kZXJUZXh0Q29udHJvbFNpbmdsZUxpbmU+IG1fc2VhcmNoRXZl
bnRUaW1lcjsKKyAgICBSZWZQdHI8U2VhcmNoUG9wdXBNZW51PiBtX3NlYXJjaFBvcHVwOworICAg
IFZlY3RvcjxTdHJpbmc+IG1fcmVjZW50U2VhcmNoZXM7Cit9OworCit9CisKKyNlbmRpZgpJbmRl
eDogcmVuZGVyaW5nL1RleHRDb250cm9sSW5uZXJFbGVtZW50cy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
cmVuZGVyaW5nL1RleHRDb250cm9sSW5uZXJFbGVtZW50cy5jcHAJKHJldmlzaW9uIDM5NDg2KQor
KysgcmVuZGVyaW5nL1RleHRDb250cm9sSW5uZXJFbGVtZW50cy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJIVE1M
VGV4dEFyZWFFbGVtZW50LmgiCiAjaW5jbHVkZSAiTW91c2VFdmVudC5oIgotI2luY2x1ZGUgIlJl
bmRlclRleHRDb250cm9sLmgiCisjaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2xTaW5nbGVMaW5l
LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNDgsOSArNDgsMTMgQEAgcHVibGljOgog
CiBib29sIFJlbmRlclRleHRDb250cm9sSW5uZXJCbG9jazo6bm9kZUF0UG9pbnQoY29uc3QgSGl0
VGVzdFJlcXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IHgsIGludCB5
LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uKQogewotICAgIFJl
bmRlclRleHRDb250cm9sKiByZW5kZXJlciA9IHN0YXRpY19jYXN0PFJlbmRlclRleHRDb250cm9s
Kj4obm9kZSgpLT5zaGFkb3dBbmNlc3Rvck5vZGUoKS0+cmVuZGVyZXIoKSk7Ci0gICAgCi0gICAg
cmV0dXJuIFJlbmRlckJsb2NrOjpub2RlQXRQb2ludChyZXF1ZXN0LCByZXN1bHQsIHgsIHksIHR4
LCB0eSwgcmVuZGVyZXItPnBsYWNlaG9sZGVySXNWaXNpYmxlKCkgPyBIaXRUZXN0QmxvY2tCYWNr
Z3JvdW5kIDogaGl0VGVzdEFjdGlvbik7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5v
ZGUoKS0+c2hhZG93QW5jZXN0b3JOb2RlKCktPnJlbmRlcmVyKCk7CisKKyAgICBib29sIHBsYWNl
aG9sZGVySXNWaXNpYmxlID0gZmFsc2U7CisgICAgaWYgKHJlbmRlcmVyLT5pc1RleHRGaWVsZCgp
KQorICAgICAgICBwbGFjZWhvbGRlcklzVmlzaWJsZSA9IHN0YXRpY19jYXN0PFJlbmRlclRleHRD
b250cm9sU2luZ2xlTGluZSo+KHJlbmRlcmVyKS0+cGxhY2Vob2xkZXJJc1Zpc2libGUoKTsKKwor
ICAgIHJldHVybiBSZW5kZXJCbG9jazo6bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCB4LCB5
LCB0eCwgdHksIHBsYWNlaG9sZGVySXNWaXNpYmxlID8gSGl0VGVzdEJsb2NrQmFja2dyb3VuZCA6
IGhpdFRlc3RBY3Rpb24pOwogfQogCiBUZXh0Q29udHJvbElubmVyRWxlbWVudDo6VGV4dENvbnRy
b2xJbm5lckVsZW1lbnQoRG9jdW1lbnQqIGRvYywgTm9kZSogc2hhZG93UGFyZW50KQpAQCAtMTI0
LDEwICsxMjgsMTEgQEAgdm9pZCBTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b25FbGVtZW50OjpkZQog
ICAgIGlmIChldnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQgJiYgZXZ0
LT5pc01vdXNlRXZlbnQoKSAmJiBzdGF0aWNfY2FzdDxNb3VzZUV2ZW50Kj4oZXZ0KS0+YnV0dG9u
KCkgPT0gTGVmdEJ1dHRvbikgewogICAgICAgICBpbnB1dC0+Zm9jdXMoKTsKICAgICAgICAgaW5w
dXQtPnNlbGVjdCgpOwotICAgICAgICBpZiAoaW5wdXQgJiYgaW5wdXQtPnJlbmRlcmVyKCkgJiYg
c3RhdGljX2Nhc3Q8UmVuZGVyVGV4dENvbnRyb2wqPihpbnB1dC0+cmVuZGVyZXIoKSktPnBvcHVw
SXNWaXNpYmxlKCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbCo+
KGlucHV0LT5yZW5kZXJlcigpKS0+aGlkZVBvcHVwKCk7CisgICAgICAgIFJlbmRlclRleHRDb250
cm9sU2luZ2xlTGluZSogcmVuZGVyZXIgPSBzdGF0aWNfY2FzdDxSZW5kZXJUZXh0Q29udHJvbFNp
bmdsZUxpbmUqPihpbnB1dC0+cmVuZGVyZXIoKSk7CisgICAgICAgIGlmIChyZW5kZXJlci0+cG9w
dXBJc1Zpc2libGUoKSkKKyAgICAgICAgICAgIHJlbmRlcmVyLT5oaWRlUG9wdXAoKTsKICAgICAg
ICAgZWxzZSBpZiAoaW5wdXQtPm1heFJlc3VsdHMoKSA+IDApCi0gICAgICAgICAgICBzdGF0aWNf
Y2FzdDxSZW5kZXJUZXh0Q29udHJvbCo+KGlucHV0LT5yZW5kZXJlcigpKS0+c2hvd1BvcHVwKCk7
CisgICAgICAgICAgICByZW5kZXJlci0+c2hvd1BvcHVwKCk7CiAgICAgICAgIGV2dC0+c2V0RGVm
YXVsdEhhbmRsZWQoKTsKICAgICB9CiAgICAgaWYgKCFldnQtPmRlZmF1bHRIYW5kbGVkKCkpCg==
</data>
<flag name="review"
          id="12432"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>