<?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>50788</bug_id>
          
          <creation_ts>2010-12-09 15:11:53 -0800</creation_ts>
          <short_desc>Implement IME support for Mac in WebKit2</short_desc>
          <delta_ts>2010-12-10 16:08:05 -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>WebKit2</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Enrica Casucci">enrica</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>ap</cc>
    
    <cc>buildbot</cc>
    
    <cc>eric</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>319739</commentid>
    <comment_count>0</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2010-12-09 15:11:53 -0800</bug_when>
    <thetext>Tracking the work needed to support Input methods on Mac.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319743</commentid>
    <comment_count>1</comment_count>
      <attachid>76126</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2010-12-09 15:25:11 -0800</bug_when>
    <thetext>Created attachment 76126
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319788</commentid>
    <comment_count>2</comment_count>
      <attachid>76126</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2010-12-09 16:40:46 -0800</bug_when>
    <thetext>Comment on attachment 76126
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=76126&amp;action=review

&gt; WebCore/ChangeLog:11
&gt; +        (WebCore::KeypressCommand::KeypressCommand): Removed ASSERT in constructor,
&gt; +        since it is now used for more than one command.

This patch expands the set of messages encoded in KeypressCommand, changing it into a strange &quot;Objective-C invocation with one string argument&quot;. Losing the semantic meaning of the class is not great.

On the other hand, I can&apos;t even easily describe its previous semantic meaning anyway. Something that can be sent when handling a key, which is any message without arguments or insertText, but nothing else.

&gt; WebKit2/ChangeLog:11
&gt; +        to the WebProcess. These calls all have a timeout of 1 second.

Unfortunately, attributedSubstringFromRange can legitimately take a lot of time if the client asks for the whole document. AppKit has been known to do that in some cases.

So, please test behavior with large documents, especially when adding attributedSubstringFromRange.

&gt; WebKit2/ChangeLog:44
&gt; +        (-[WKView conversationIdentifier]): Added.

Actually, moved.

&gt; WebKit2/UIProcess/API/mac/PageClientImpl.mm:231
&gt; +    commandsList = [m_wkView _interceptKeyEvent:event.nativeEvent()
&gt; +                                 hasComposition:hasComposition 
&gt; +                                 selectionStart:selectionStart
&gt; +                                   selectionEnd:selectionEnd
&gt; +                                     underlines:underlines];

Can these be combined in a single argument with a helpful name, something like StateForTextInput? The method doesn&apos;t really need any of these, so passing them into it can confuse the reader.

&gt; WebKit2/UIProcess/API/mac/WKView.mm:476
&gt; +    _data-&gt; _hasMarkedText = hasComposition;

Extra space here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319862</commentid>
    <comment_count>3</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2010-12-09 18:44:03 -0800</bug_when>
    <thetext>Attachment 76126 did not build on win:
Build output: http://queues.webkit.org/results/6996019</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319873</commentid>
    <comment_count>4</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2010-12-09 19:20:21 -0800</bug_when>
    <thetext>&gt; &gt; WebKit2/ChangeLog:11
&gt; &gt; +        to the WebProcess. These calls all have a timeout of 1 second.
&gt; 
&gt; Unfortunately, attributedSubstringFromRange can legitimately take a lot of time if the client asks for the whole document. AppKit has been known to do that in some cases.
&gt; 
&gt; So, please test behavior with large documents, especially when adding attributedSubstringFromRange.
I will, I can change the timeout for every call, and I can increase it for this particular one when implemented.
 
&gt; &gt; WebKit2/UIProcess/API/mac/PageClientImpl.mm:231
&gt; &gt; +    commandsList = [m_wkView _interceptKeyEvent:event.nativeEvent()
&gt; &gt; +                                 hasComposition:hasComposition 
&gt; &gt; +                                 selectionStart:selectionStart
&gt; &gt; +                                   selectionEnd:selectionEnd
&gt; &gt; +                                     underlines:underlines];
&gt; 
&gt; Can these be combined in a single argument with a helpful name, something like StateForTextInput? The method doesn&apos;t really need any of these, so passing them into it can confuse the reader.

I agree, the number of parameters grew while I was implementing and it is confusing now. I&apos;ll change it.
 
&gt; &gt; WebKit2/UIProcess/API/mac/WKView.mm:476
&gt; &gt; +    _data-&gt; _hasMarkedText = hasComposition;
&gt; 
&gt; Extra space here.
I&apos;ll fix it.
Thanks for the review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319874</commentid>
    <comment_count>5</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2010-12-09 19:21:41 -0800</bug_when>
    <thetext>I&apos;ve noticed the windows build is broken by this patch. I&apos;ll fix it before landing it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320360</commentid>
    <comment_count>6</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2010-12-10 13:25:06 -0800</bug_when>
    <thetext>Committed revision 73796.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320478</commentid>
    <comment_count>7</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-10 16:07:13 -0800</bug_when>
    <thetext>I wonder if this broke editing/execCommand/4920488.html?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320481</commentid>
    <comment_count>8</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-10 16:08:05 -0800</bug_when>
    <thetext>Or it might have been bug 50710.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76126</attachid>
            <date>2010-12-09 15:25:11 -0800</date>
            <delta_ts>2010-12-09 16:40:46 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>IMEsupport.txt</filename>
            <type>text/plain</type>
            <size>50529</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzY1MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMTAtMTItMDkgIEVucmljYSBDYXN1Y2NpICA8ZW5yaWNhQGFwcGxl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJ
bXBsZW1lbnQgSU1FIHN1cHBvcnQgZm9yIE1hYy4KKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzc2
NjA1ODk+IFdlYktpdDI6IEltcGxlbWVudCBJTUUgc3VwcG9ydCBmb3IgTWFjLgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA3ODgKKworICAgICAgICAq
IGRvbS9LZXlib2FyZEV2ZW50Lmg6CisgICAgICAgIChXZWJDb3JlOjpLZXlwcmVzc0NvbW1hbmQ6
OktleXByZXNzQ29tbWFuZCk6IFJlbW92ZWQgQVNTRVJUIGluIGNvbnN0cnVjdG9yLAorICAgICAg
ICBzaW5jZSBpdCBpcyBub3cgdXNlZCBmb3IgbW9yZSB0aGFuIG9uZSBjb21tYW5kLgorCiAyMDEw
LTEyLTA5ICBEYW4gQmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgRGF2ZSBIeWF0dC4KSW5kZXg6IFdlYkNvcmUvZG9tL0tleWJvYXJkRXZlbnQuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2RvbS9LZXlib2FyZEV2ZW50LmgJKHJldmlzaW9uIDczNTgzKQor
KysgV2ViQ29yZS9kb20vS2V5Ym9hcmRFdmVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw3ICsz
NSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBzdHJ1Y3QgS2V5cHJlc3NDb21tYW5kIHsK
ICAgICAgICAgS2V5cHJlc3NDb21tYW5kKCkgeyB9CiAgICAgICAgIEtleXByZXNzQ29tbWFuZChj
b25zdCBTdHJpbmcmIGNvbW1hbmROYW1lKSA6IGNvbW1hbmROYW1lKGNvbW1hbmROYW1lKSB7IH0K
LSAgICAgICAgS2V5cHJlc3NDb21tYW5kKGNvbnN0IFN0cmluZyYgY29tbWFuZE5hbWUsIGNvbnN0
IFN0cmluZyYgdGV4dCkgOiBjb21tYW5kTmFtZShjb21tYW5kTmFtZSksIHRleHQodGV4dCkgeyBB
U1NFUlQoY29tbWFuZE5hbWUgPT0gImluc2VydFRleHQ6IiB8fCBjb21tYW5kTmFtZSA9PSAiaW5z
ZXJ0VGV4dCIpOyB9CisgICAgICAgIEtleXByZXNzQ29tbWFuZChjb25zdCBTdHJpbmcmIGNvbW1h
bmROYW1lLCBjb25zdCBTdHJpbmcmIHRleHQpIDogY29tbWFuZE5hbWUoY29tbWFuZE5hbWUpLCB0
ZXh0KHRleHQpIHsgfQogCiAgICAgICAgIFN0cmluZyBjb21tYW5kTmFtZTsKICAgICAgICAgU3Ry
aW5nIHRleHQ7CkluZGV4OiBXZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQy
L0NoYW5nZUxvZwkocmV2aXNpb24gNzM2MjUpCisrKyBXZWJLaXQyL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDgxIEBACisyMDEwLTEyLTA5ICBFbnJpY2EgQ2FzdWNjaSAgPGVu
cmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgSW1wbGVtZW50IElNRSBzdXBwb3J0IGZvciBNYWMuCisgICAgICAgIDxyZGFyOi8v
cHJvYmxlbS83NjYwNTg5PiBXZWJLaXQyOiBJbXBsZW1lbnQgSU1FIHN1cHBvcnQgZm9yIE1hYy4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwNzg4Cisg
ICAgICAgICAgICAKKyAgICAgICAgVGhpcyBwYXRjaCBhZGRlcyBzdXBwb3J0IGZvciBpbnB1dCBt
ZXRob2RzIGluIFdlYktpdDIuCisgICAgICAgIEluIG9yZGVyIHRvIHN1cHBvcnQgSU1FLCBpdCB3
YXMgbmVjZXNzYXJ5IHRvIGFkZCBzeW5jaHJvbm91cyBjYWxscyBmcm9tIHRoZSBVSVByb2Nlc3MK
KyAgICAgICAgdG8gdGhlIFdlYlByb2Nlc3MuIFRoZXNlIGNhbGxzIGFsbCBoYXZlIGEgdGltZW91
dCBvZiAxIHNlY29uZC4KKyAgICAgICAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gc3RpbGwg
dXNlcyB0aGUgTlNUZXh0SW5wdXQgcHJvdG9jb2wsIGJ1dCB0aGUgcGxhbiBpcyB0byBtb3ZlCisg
ICAgICAgIHRvIHRoZSBOU1RleHRJbnB1dENsaWVudCBwcm90b2NvbC4gVGhpcyBoYXMgbm90IGJl
ZW4gZG9uZSB5ZXQgZm9yIGVhc2Ugb2YgY29tcGFyaXNvbiB3aXRoCisgICAgICAgIFdlYktpdC4g
YXR0cmlidXRlZFN1YnN0cmluZ0Zyb21SYW5nZSBpcyB0aGUgb25seSBtZXRob2QgdGhhdCBoYXMg
bm90IGJlZW4gaW1wbGVtZW50ZWQsIGJlY2F1c2UKKyAgICAgICAgSSBoYXZlIG5vdCB5ZXQgZGVj
aWRlZCB3aGF0IGlzIHRoZSBiZXN0IHdheSB0byBzZW5kIGFuIE5TQXR0cmlidXRlZFN0cmluZyBh
Y3Jvc3MgdGhlIHByb2Nlc3MKKyAgICAgICAgYm91bmRhcnkuCisKKyAgICAgICAgKiBQbGF0Zm9y
bS9Db3JlSVBDL0hhbmRsZU1lc3NhZ2UuaDoKKyAgICAgICAgKENvcmVJUEM6OmNhbGxNZW1iZXJG
dW5jdGlvbik6IEFkZGVkIHRlbXBsYXRlIGZvciBtZW1iZXIgZnVuY3Rpb24uCisgICAgICAgIHdp
dGggZm91ciByZXBseSBhcmd1bWVudHMuCisgICAgICAgICogU2NyaXB0cy93ZWJraXQyL21lc3Nh
Z2VzLnB5OiBBZGRlZCBDb21wb3NpdGlvblVuZGVybGluZSBhbmQgcmVsZXZhbnQgaGVhZGVyLgor
ICAgICAgICAqIFNoYXJlZC9XZWJDb3JlQXJndW1lbnRDb2RlcnMuaDoKKyAgICAgICAgKENvcmVJ
UEM6Oik6IEFkZGVkIGVuY29kZXIvZGVjb2RlciBmb3IgQ29tcG9zaXRpb25VbmRlcmxpbmUuCisg
ICAgICAgICogVUlQcm9jZXNzL0FQSS9tYWMvUGFnZUNsaWVudEltcGwuaDogQWRkZWQgcGFyYW1l
dGVycyB0byBpbnRlcmNlcHRLZXlFdmVudCBhbmQgc2VsZWN0aW9uQ2hhbmdlZC4KKyAgICAgICAg
KiBVSVByb2Nlc3MvQVBJL21hYy9QYWdlQ2xpZW50SW1wbC5tbToKKyAgICAgICAgKFdlYktpdDo6
UGFnZUNsaWVudEltcGw6OnNlbGVjdGlvbkNoYW5nZWQpOiBBZGRlZCBwYXJhbWV0ZXJzLgorICAg
ICAgICAoV2ViS2l0OjpQYWdlQ2xpZW50SW1wbDo6aW50ZXJjZXB0S2V5RXZlbnQpOiBBZGRlZCBw
YXJhbWV0ZXJzLgorICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvbWFjL1dLVmlldy5tbToKKyAgICAg
ICAgKC1bV0tWaWV3IGluaXRXaXRoRnJhbWU6cGFnZU5hbWVzcGFjZVJlZjpwYWdlR3JvdXBSZWY6
XSk6IEFkZGVkIGluaXRpYWxpemF0aW9uIG9mIG5ldyBwcml2YXRlIG1lbWJlcnMuCisgICAgICAg
ICgtW1dLVmlldyBpbnNlcnRUZXh0Ol0pOgorICAgICAgICAoLVtXS1ZpZXcgX3NlbGVjdGlvbkNo
YW5nZWQ6aXNFZGl0YWJsZTppc1Bhc3N3b3JkOmhhc01hcmtlZFRleHQ6cmFuZ2U6XSk6IEFkZGVk
IHBhcmFtZXRlcnMuCisgICAgICAgICgtW1dLVmlldyBfaW50ZXJjZXB0S2V5RXZlbnQ6aGFzQ29t
cG9zaXRpb246c3RhcnQ6ZW5kOmxpbmVzOldlYkNvcmU6Ol0pOiBBZGRlZCBwYXJhbWV0ZXJzLgor
ICAgICAgICAoLVtXS1ZpZXcga2V5RG93bjpdKTogTW9kaWZpZWQgdG8gcmVzZXQgc3RhdGUgb24g
ZWFjaCBrZXlEb3duLgorICAgICAgICAoLVtXS1ZpZXcgc2VsZWN0ZWRSYW5nZV0pOiBBZGRlZC4K
KyAgICAgICAgKC1bV0tWaWV3IGhhc01hcmtlZFRleHRdKTogQWRkZWQuCisgICAgICAgICgtW1dL
VmlldyB1bm1hcmtUZXh0XSk6IEFkZGVkLgorICAgICAgICAoLVtXS1ZpZXcgdmFsaWRBdHRyaWJ1
dGVzRm9yTWFya2VkVGV4dF0pOiBBZGRlZC4KKyAgICAgICAgKGV4dHJhY3RVbmRlcmxpbmVzKTog
QWRkZWQuCisgICAgICAgICgtW1dLVmlldyBzZXRNYXJrZWRUZXh0OnNlbGVjdGVkUmFuZ2U6XSk6
IEFkZGVkLgorICAgICAgICAoLVtXS1ZpZXcgbWFya2VkUmFuZ2VdKTogQWRkZWQuCisgICAgICAg
ICgtW1dLVmlldyBhdHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdlOl0pOiBBZGRlZC4KKyAgICAg
ICAgKC1bV0tWaWV3IGNoYXJhY3RlckluZGV4Rm9yUG9pbnQ6XSk6IEFkZGVkLgorICAgICAgICAo
LVtXS1ZpZXcgZmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2U6XSk6IEFkZGVkLgorICAgICAgICAo
LVtXS1ZpZXcgY29udmVyc2F0aW9uSWRlbnRpZmllcl0pOiBBZGRlZC4KKyAgICAgICAgKiBVSVBy
b2Nlc3MvQVBJL21hYy9XS1ZpZXdJbnRlcm5hbC5oOiBBZGRlZCBwYXJhbWV0ZXJzIHRvIF9pbnRl
cmNlcHRLZXlFdmVudCBhbmQgX3NlbGVjdGlvbkNoYW5nZWQuCisgICAgICAgICogVUlQcm9jZXNz
L1BhZ2VDbGllbnQuaDogQWRkZWQgcGFyYW1ldGVycyB0byBpbnRlcnByZXRLZXlFdmVudCBhbmQg
c2VsZWN0aW9uQ2hhbmdlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcDoK
KyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpnZXRNYXJrZWRSYW5nZSk6IEFkZGVkLgor
ICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OmNoYXJhY3RlckluZGV4Rm9yUG9pbnQpOiBB
ZGRlZC4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZVByb3h5OjpmaXJzdFJlY3RGb3JDaGFyYWN0
ZXJSYW5nZSk6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6OmludGVycHJl
dEtleUV2ZW50KTogQWRkaXRpb25hbCBwYXJhbWV0ZXJzLgorICAgICAgICAoV2ViS2l0OjpXZWJQ
YWdlUHJveHk6OmRpZFNlbGVjdGlvbkNoYW5nZSk6IEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3Ig
TWFjIHBsYXRmb3JtLgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaDogQWRkZWQg
bmV3IG1ldGhvZHMgYW5kIHBhcmFtZXRlcnMgdG8gZGlkU2VsZWN0aW9uQ2hhbmdlCisgICAgICAg
IGFuZCBpbnRlcnByZXRLZXlFdmVudC4KKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5
Lm1lc3NhZ2VzLmluOiBBZGRlZCBwYXJhbWV0ZXJzIHRvIGludGVycHJldEtleUV2ZW50IGFuZCBz
ZWxlY3Rpb25DaGFuZ2VkIG1lc3NhZ2VzLgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJQcm9jZXNz
UHJveHkuaDoKKyAgICAgICAgKFdlYktpdDo6V2ViUHJvY2Vzc1Byb3h5OjpzZW5kU3luYyk6IEFk
ZGVkIHN1cHBvcnQgZm9yIHN5bmNocm9ub3VzIG1lc3NhZ2VzLgorICAgICAgICBUaGUgZGVmYXVs
dCB0aW1lb3V0IGlzIDEgc2Vjb25kLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViQ29yZVN1cHBv
cnQvV2ViRWRpdG9yQ2xpZW50LmNwcDogcmVzcG9uZFRvQ2hhbmdlZFNlbGVjdGlvbiBpcyBub3cK
KyAgICAgICAgb25seSBmb3Igbm9uIE1hYyBwbGF0Zm9ybS4KKyAgICAgICAgKiBXZWJQcm9jZXNz
L1dlYkNvcmVTdXBwb3J0L21hYy9XZWJFZGl0b3JDbGllbnRNYWMubW06CisgICAgICAgIChXZWJL
aXQ6OldlYkVkaXRvckNsaWVudDo6cmVzcG9uZFRvQ2hhbmdlZFNlbGVjdGlvbik6IEFkZGVkIGlt
cGxlbWVudGF0aW9uIGZvciBNYWMgcGxhdGZvcm0uCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQ
YWdlL1dlYlBhZ2UuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlOjpkaWRSZWNlaXZlU3lu
Y01lc3NhZ2UpOiBBZGRlZC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5o
OiBBZGRlZCBuZXcgbWV0aG9kcyBhbmQgc3VwcG9ydCBmb3Igc3luY2hyb25vdXMgbWVzc2FnZXMu
CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW46IEFkZGVk
IG5ldyBtZXNzYWdlcy4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1dlYlBhZ2VN
YWMubW06CisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2U6OmludGVyY2VwdEVkaXRpbmdLZXlib2Fy
ZEV2ZW50KTogQWRkZWQgcGFyYW1ldGVycy4KKyAgICAgICAgKFdlYktpdDo6V2ViUGFnZTo6Y29u
dmVydFJhbmdlVG9QbGF0Zm9ybVJhbmdlKTogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6OldlYlBh
Z2U6OmdldE1hcmtlZFJhbmdlKTogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6OmNoYXJhY3RlclJh
bmdlQXRQb2ludCk6IEFkZGVkLgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlOjpjaGFyYWN0ZXJJ
bmRleEZvclBvaW50KTogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6OmNvbnZlcnRUb1JhbmdlKTog
QWRkZWQuCisgICAgICAgIChXZWJLaXQ6OldlYlBhZ2U6OmZpcnN0UmVjdEZvckNoYXJhY3RlclJh
bmdlKTogQWRkZWQuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQcm9jZXNzLmNwcDoKKyAgICAg
ICAgKFdlYktpdDo6V2ViUHJvY2Vzczo6ZGlkUmVjZWl2ZVN5bmNNZXNzYWdlKTogQWRkZWQuCisg
ICAgICAgICogV2ViUHJvY2Vzcy9XZWJQcm9jZXNzLmg6IEFkZGVkIGRpZFJlY2VpdmVTeW5jTWVz
c2FnZS4KKwogMjAxMC0xMi0wOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUuY29t
PgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBXZWJLaXQyL1BsYXRm
b3JtL0xvZ2dpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvUGxhdGZvcm0vTG9nZ2luZy5j
cHAJKHJldmlzaW9uIDczNTgzKQorKysgV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogCiBXVEZMb2dDaGFubmVsIExvZ1Nlc3Npb25T
dGF0ZSA9IHsgMHgwMDAwMDAwMSwgIldlYktpdDJMb2dMZXZlbCIsIFdURkxvZ0NoYW5uZWxPbiB9
OwogV1RGTG9nQ2hhbm5lbCBMb2dDb250ZXh0TWVudSAgPSB7IDB4MDAwMDAwMDIsICJXZWJLaXQy
TG9nTGV2ZWwiLCBXVEZMb2dDaGFubmVsT24gfTsKK1dURkxvZ0NoYW5uZWwgTG9nVGV4dElucHV0
ICAgID0geyAweDAwMDAwMDAzLCAiV2ViS2l0MkxvZ0xldmVsIiwgV1RGTG9nQ2hhbm5lbE9uIH07
CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0aWFsaXplTG9nQ2hhbm5lbChXVEZMb2dDaGFubmVs
KiBjaGFubmVsKQogewpJbmRleDogV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViS2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmgJKHJldmlzaW9uIDczNTgzKQorKysgV2Vi
S2l0Mi9QbGF0Zm9ybS9Mb2dnaW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYgKzM4LDcgQEAg
RVhURVJOX0NfQkVHSU4KIAogZXh0ZXJuIFdURkxvZ0NoYW5uZWwgTG9nQ29udGV4dE1lbnU7CiBl
eHRlcm4gV1RGTG9nQ2hhbm5lbCBMb2dTZXNzaW9uU3RhdGU7CitleHRlcm4gV1RGTG9nQ2hhbm5l
bCBMb2dUZXh0SW5wdXQ7CiAKIHZvaWQgaW5pdGlhbGl6ZUxvZ0NoYW5uZWxzSWZOZWNlc3Nhcnko
dm9pZCk7CiAKSW5kZXg6IFdlYktpdDIvUGxhdGZvcm0vQ29yZUlQQy9IYW5kbGVNZXNzYWdlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0Mi9QbGF0Zm9ybS9Db3JlSVBDL0hhbmRsZU1lc3NhZ2UuaAko
cmV2aXNpb24gNzM1ODMpCisrKyBXZWJLaXQyL1BsYXRmb3JtL0NvcmVJUEMvSGFuZGxlTWVzc2Fn
ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMDMsNiArMTAzLDEyIEBAIHZvaWQgY2FsbE1lbWJlckZ1
bmN0aW9uKGNvbnN0IEFyZ3VtZW50czIKICAgICAob2JqZWN0LT4qZnVuY3Rpb24pKGFyZ3MuYXJn
dW1lbnQxLCBhcmdzLmFyZ3VtZW50Mik7CiB9CiAKK3RlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVu
YW1lIE1GLCB0eXBlbmFtZSBQMSwgdHlwZW5hbWUgUDIsIHR5cGVuYW1lIFIxLCB0eXBlbmFtZSBS
MiwgdHlwZW5hbWUgUjMsIHR5cGVuYW1lIFI0Pgordm9pZCBjYWxsTWVtYmVyRnVuY3Rpb24oY29u
c3QgQXJndW1lbnRzMjxQMSwgUDI+JiBhcmdzLCBBcmd1bWVudHM0PFIxLCBSMiwgUjMsIFI0PiYg
cmVwbHlBcmdzLCBDKiBvYmplY3QsIE1GIGZ1bmN0aW9uKQoreworICAgIChvYmplY3QtPipmdW5j
dGlvbikoYXJncy5hcmd1bWVudDEsIGFyZ3MuYXJndW1lbnQyLCByZXBseUFyZ3MuYXJndW1lbnQx
LCByZXBseUFyZ3MuYXJndW1lbnQyLCByZXBseUFyZ3MuYXJndW1lbnQzLCByZXBseUFyZ3MuYXJn
dW1lbnQ0KTsKK30KKyAgICAKIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE1GLCB0eXBl
bmFtZSBQMSwgdHlwZW5hbWUgUDIsIHR5cGVuYW1lIFIxPgogdm9pZCBjYWxsTWVtYmVyRnVuY3Rp
b24oY29uc3QgQXJndW1lbnRzMjxQMSwgUDI+JiBhcmdzLCBBcmd1bWVudHMxPFIxPiYgcmVwbHlB
cmdzLCBDKiBvYmplY3QsIE1GIGZ1bmN0aW9uKQogewpJbmRleDogV2ViS2l0Mi9TY3JpcHRzL3dl
YmtpdDIvbWVzc2FnZXMucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9TY3JpcHRzL3dlYmtpdDIv
bWVzc2FnZXMucHkJKHJldmlzaW9uIDczNTgzKQorKysgV2ViS2l0Mi9TY3JpcHRzL3dlYmtpdDIv
bWVzc2FnZXMucHkJKHdvcmtpbmcgY29weSkKQEAgLTI1MCw2ICsyNTAsNyBAQCBkZWYgbWVzc2Fn
ZV90b19zdHJ1Y3RfZGVjbGFyYXRpb24obWVzc2FnCiBkZWYgc3RydWN0X29yX2NsYXNzKG5hbWVz
cGFjZSwgdHlwZSk6CiAgICAgc3RydWN0cyA9IGZyb3plbnNldChbCiAgICAgICAgICdXZWJDb3Jl
OjpLZXlwcmVzc0NvbW1hbmQnLAorICAgICAgICAnV2ViQ29yZTo6Q29tcG9zaXRpb25VbmRlcmxp
bmUnLAogICAgICAgICAnV2ViQ29yZTo6UGx1Z2luSW5mbycsCiAgICAgICAgICdXZWJDb3JlOjpW
aWV3cG9ydEFyZ3VtZW50cycsCiAgICAgICAgICdXZWJDb3JlOjpXaW5kb3dGZWF0dXJlcycsCkBA
IC00MTEsNiArNDEyLDcgQEAgZGVmIGhlYWRlcnNfZm9yX3R5cGUodHlwZSk6CiAgICAgICAgICdX
VEY6OlN0cmluZyc6ICc8d3RmL3RleHQvV1RGU3RyaW5nLmg+JywKICAgICAgICAgJ1dlYkNvcmU6
OktleXByZXNzQ29tbWFuZCc6ICc8V2ViQ29yZS9LZXlib2FyZEV2ZW50Lmg+JywKICAgICAgICAg
J1dlYkNvcmU6OlBsdWdpbkluZm8nOiAnPFdlYkNvcmUvUGx1Z2luRGF0YS5oPicsCisgICAgICAg
ICdXZWJDb3JlOjpDb21wb3NpdGlvblVuZGVybGluZSc6ICc8V2ViQ29yZS9FZGl0b3IuaD4nLAog
ICAgICAgICAnV2ViS2l0OjpXZWJLZXlib2FyZEV2ZW50JzogJyJXZWJFdmVudC5oIicsCiAgICAg
ICAgICdXZWJLaXQ6OldlYk1vdXNlRXZlbnQnOiAnIldlYkV2ZW50LmgiJywKICAgICAgICAgJ1dl
YktpdDo6V2ViV2hlZWxFdmVudCc6ICciV2ViRXZlbnQuaCInLApJbmRleDogV2ViS2l0Mi9TaGFy
ZWQvV2ViQ29yZUFyZ3VtZW50Q29kZXJzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9TaGFyZWQv
V2ViQ29yZUFyZ3VtZW50Q29kZXJzLmgJKHJldmlzaW9uIDczNTgzKQorKysgV2ViS2l0Mi9TaGFy
ZWQvV2ViQ29yZUFyZ3VtZW50Q29kZXJzLmgJKHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDcg
QEAKICNpbmNsdWRlIDxXZWJDb3JlL0F1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlLmg+CiAjaW5jbHVk
ZSA8V2ViQ29yZS9DcmVkZW50aWFsLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9DdXJzb3IuaD4KKyNp
bmNsdWRlIDxXZWJDb3JlL0VkaXRvci5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRmxvYXRSZWN0Lmg+
CiAjaW5jbHVkZSA8V2ViQ29yZS9JbnRSZWN0Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9LZXlib2Fy
ZEV2ZW50Lmg+CkBAIC0zMDEsNiArMzAyLDIyIEBAIHRlbXBsYXRlPD4gc3RydWN0IEFyZ3VtZW50
Q29kZXI8V2ViQ29yZToKICAgICB9CiB9OwogI2VuZGlmCisKK3RlbXBsYXRlPD4gc3RydWN0IEFy
Z3VtZW50Q29kZXI8V2ViQ29yZTo6Q29tcG9zaXRpb25VbmRlcmxpbmU+IHsKKyAgICBzdGF0aWMg
dm9pZCBlbmNvZGUoQXJndW1lbnRFbmNvZGVyKiBlbmNvZGVyLCBjb25zdCBXZWJDb3JlOjpDb21w
b3NpdGlvblVuZGVybGluZSYgdW5kZXJsaW5lKQorICAgIHsKKyAgICAgICAgZW5jb2Rlci0+ZW5j
b2RlKENvcmVJUEM6OkluKHVuZGVybGluZS5zdGFydE9mZnNldCwgdW5kZXJsaW5lLmVuZE9mZnNl
dCwgdW5kZXJsaW5lLnRoaWNrLCB1bmRlcmxpbmUuY29sb3IucmdiKCkpKTsKKyAgICB9CisgICAg
CisgICAgc3RhdGljIGJvb2wgZGVjb2RlKEFyZ3VtZW50RGVjb2RlciogZGVjb2RlciwgV2ViQ29y
ZTo6Q29tcG9zaXRpb25VbmRlcmxpbmUmIHVuZGVybGluZSkKKyAgICB7CisgICAgICAgIHVfaW50
MzJfdCByZ2I7CisgICAgICAgIGlmICghZGVjb2Rlci0+ZGVjb2RlKENvcmVJUEM6Ok91dCh1bmRl
cmxpbmUuc3RhcnRPZmZzZXQsIHVuZGVybGluZS5lbmRPZmZzZXQsIHVuZGVybGluZS50aGljaywg
cmdiKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHVuZGVybGluZS5jb2xv
ciA9IHJnYjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfTsKICAgICAKIH0gLy8gbmFt
ZXNwYWNlIENvcmVJUEMKIApJbmRleDogV2ViS2l0Mi9VSVByb2Nlc3MvUGFnZUNsaWVudC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdDIvVUlQcm9jZXNzL1BhZ2VDbGllbnQuaAkocmV2aXNpb24gNzM1
ODMpCisrKyBXZWJLaXQyL1VJUHJvY2Vzcy9QYWdlQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAg
LTY5LDEzICs2OSwxNSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGNsZWFyQWxsRWRpdENv
bW1hbmRzKCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRFZGl0Q29tbWFuZFN0YXRlKGNvbnN0
IFN0cmluZyYgY29tbWFuZE5hbWUsIGJvb2wgaXNFbmFibGVkLCBpbnQgc3RhdGUpID0gMDsKICNp
ZiBQTEFURk9STShNQUMpCi0gICAgdmlydHVhbCB2b2lkIGludGVyY2VwdEtleUV2ZW50KGNvbnN0
IE5hdGl2ZVdlYktleWJvYXJkRXZlbnQmLCBWZWN0b3I8V2ViQ29yZTo6S2V5cHJlc3NDb21tYW5k
PiYpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW50ZXJjZXB0S2V5RXZlbnQoY29uc3QgTmF0aXZl
V2ViS2V5Ym9hcmRFdmVudCYsIGJvb2wsIFZlY3RvcjxXZWJDb3JlOjpLZXlwcmVzc0NvbW1hbmQ+
JiwgdWludDMyX3QsIHVpbnQzMl90LCBWZWN0b3I8V2ViQ29yZTo6Q29tcG9zaXRpb25VbmRlcmxp
bmU+JikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKGJvb2wsIGJvb2ws
IGJvb2wsIGJvb2wsIHVpbnQ2NF90LCB1aW50NjRfdCkgPSAwOworI2Vsc2UKKyAgICB2aXJ0dWFs
IHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChib29sLCBib29sLCBib29sLCBib29sKSA9IDA7CiAjZW5k
aWYKICAgICB2aXJ0dWFsIFdlYkNvcmU6OkZsb2F0UmVjdCBjb252ZXJ0VG9EZXZpY2VTcGFjZShj
b25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmKSA9IDA7CiAgICAgdmlydHVhbCBXZWJDb3JlOjpGbG9h
dFJlY3QgY29udmVydFRvVXNlclNwYWNlKGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYpID0gMDsK
IAogICAgIHZpcnR1YWwgdm9pZCBkaWROb3RIYW5kbGVLZXlFdmVudChjb25zdCBOYXRpdmVXZWJL
ZXlib2FyZEV2ZW50JikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKGJv
b2wsIGJvb2wsIGJvb2wsIGJvb2wpID0gMDsKIAogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxXZWJQ
b3B1cE1lbnVQcm94eT4gY3JlYXRlUG9wdXBNZW51UHJveHkoKSA9IDA7CiAgICAgdmlydHVhbCBQ
YXNzUmVmUHRyPFdlYkNvbnRleHRNZW51UHJveHk+IGNyZWF0ZUNvbnRleHRNZW51UHJveHkoV2Vi
UGFnZVByb3h5KikgPSAwOwpJbmRleDogV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuY3BwCShyZXZp
c2lvbiA3MzU4MykKKysrIFdlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQ2MSw2ICs0NjEsMjUgQEAgdm9pZCBXZWJQYWdlUHJveHk6OndpbmRvd0Fu
ZFZpZXdGcmFtZXNDaAogCiAgICAgcHJvY2VzcygpLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlOjpX
aW5kb3dBbmRWaWV3RnJhbWVzQ2hhbmdlZCh3aW5kb3dGcmFtZUluU2NyZWVuQ29vcmRpbmF0ZXMs
IHZpZXdGcmFtZUluV2luZG93Q29vcmRpbmF0ZXMpLCBtX3BhZ2VJRCk7CiB9CisKK3ZvaWQgV2Vi
UGFnZVByb3h5OjpnZXRNYXJrZWRSYW5nZSh1aW50NjRfdCYgbG9jYXRpb24sIHVpbnQ2NF90JiBs
ZW5ndGgpCit7CisgICAgcHJvY2VzcygpLT5zZW5kU3luYyhNZXNzYWdlczo6V2ViUGFnZTo6R2V0
TWFya2VkUmFuZ2UoKSwgTWVzc2FnZXM6OldlYlBhZ2U6OkdldE1hcmtlZFJhbmdlOjpSZXBseShs
b2NhdGlvbiwgbGVuZ3RoKSwgbV9wYWdlSUQpOworfQorICAgIAordWludDY0X3QgV2ViUGFnZVBy
b3h5OjpjaGFyYWN0ZXJJbmRleEZvclBvaW50KGNvbnN0IEludFBvaW50IHBvaW50KQoreworICAg
IHVpbnQ2NF90IHJlc3VsdDsKKyAgICBwcm9jZXNzKCktPnNlbmRTeW5jKE1lc3NhZ2VzOjpXZWJQ
YWdlOjpDaGFyYWN0ZXJJbmRleEZvclBvaW50KHBvaW50KSwgTWVzc2FnZXM6OldlYlBhZ2U6OkNo
YXJhY3RlckluZGV4Rm9yUG9pbnQ6OlJlcGx5KHJlc3VsdCksIG1fcGFnZUlEKTsKKyAgICByZXR1
cm4gcmVzdWx0OworfQorCitXZWJDb3JlOjpJbnRSZWN0IFdlYlBhZ2VQcm94eTo6Zmlyc3RSZWN0
Rm9yQ2hhcmFjdGVyUmFuZ2UodWludDY0X3QgbG9jYXRpb24sIHVpbnQ2NF90IGxlbmd0aCkKK3sK
KyAgICBJbnRSZWN0IHJlc3VsdFJlY3Q7CisgICAgcHJvY2VzcygpLT5zZW5kU3luYyhNZXNzYWdl
czo6V2ViUGFnZTo6Rmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2UobG9jYXRpb24sIGxlbmd0aCks
IE1lc3NhZ2VzOjpXZWJQYWdlOjpGaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZTo6UmVwbHkocmVz
dWx0UmVjdCksIG1fcGFnZUlEKTsKKyAgICByZXR1cm4gcmVzdWx0UmVjdDsKK30gICAgCiAjZW5k
aWYKIAogI2lmIEVOQUJMRShUSUxFRF9CQUNLSU5HX1NUT1JFKQpAQCAtNzI2LDkgKzc0NSw5IEBA
IHZvaWQgV2ViUGFnZVByb3h5OjpkaWRSZWNlaXZlU3luY01lc3NhZ2UKIH0KIAogI2lmIFBMQVRG
T1JNKE1BQykKLXZvaWQgV2ViUGFnZVByb3h5OjppbnRlcnByZXRLZXlFdmVudCh1aW50MzJfdCB0
eXBlLCBWZWN0b3I8S2V5cHJlc3NDb21tYW5kPiYgY29tbWFuZHNMaXN0KQordm9pZCBXZWJQYWdl
UHJveHk6OmludGVycHJldEtleUV2ZW50KHVpbnQzMl90IHR5cGUsIGJvb2wgaGFzQ29tcG9zaXRp
b24sIFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+JiBjb21tYW5kc0xpc3QsIHVpbnQzMl90IHNlbGVj
dGlvblN0YXJ0LCB1aW50MzJfdCBzZWxlY3Rpb25FbmQsIFZlY3RvcjxDb21wb3NpdGlvblVuZGVy
bGluZT4mIHVuZGVybGluZXMpCiB7Ci0gICAgbV9wYWdlQ2xpZW50LT5pbnRlcmNlcHRLZXlFdmVu
dChtX2tleUV2ZW50UXVldWUuZmlyc3QoKSwgY29tbWFuZHNMaXN0KTsKKyAgICBtX3BhZ2VDbGll
bnQtPmludGVyY2VwdEtleUV2ZW50KG1fa2V5RXZlbnRRdWV1ZS5maXJzdCgpLCBoYXNDb21wb3Np
dGlvbiwgY29tbWFuZHNMaXN0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kLCB1bmRlcmxp
bmVzKTsKIH0KICNlbmRpZgogCkBAIC0xMjI5LDEwICsxMjQ4LDE3IEBAIHZvaWQgV2ViUGFnZVBy
b3h5OjpiYWNrRm9yd2FyZEZvcndhcmRMaXMKIH0KIAogLy8gU2VsZWN0aW9uIGNoYW5nZSBzdXBw
b3J0CisjaWYgUExBVEZPUk0oTUFDKQordm9pZCBXZWJQYWdlUHJveHk6OmRpZFNlbGVjdGlvbkNo
YW5nZShib29sIGlzTm9uZSwgYm9vbCBpc0NvbnRlbnRFZGl0YWJsZSwgYm9vbCBpc1Bhc3N3b3Jk
RmllbGQsIGJvb2wgaGFzQ29tcG9zaXRpb24sIHVpbnQ2NF90IGxvY2F0aW9uLCB1aW50NjRfdCBs
ZW5ndGgpCit7CisgICAgbV9wYWdlQ2xpZW50LT5zZWxlY3Rpb25DaGFuZ2VkKGlzTm9uZSwgaXND
b250ZW50RWRpdGFibGUsIGlzUGFzc3dvcmRGaWVsZCwgaGFzQ29tcG9zaXRpb24sIGxvY2F0aW9u
LCBsZW5ndGgpOworfQorI2Vsc2UgICAgCiB2b2lkIFdlYlBhZ2VQcm94eTo6ZGlkU2VsZWN0aW9u
Q2hhbmdlKGJvb2wgaXNOb25lLCBib29sIGlzQ29udGVudEVkaXRhYmxlLCBib29sIGlzUGFzc3dv
cmRGaWVsZCwgYm9vbCBoYXNDb21wb3NpdGlvbikKIHsKICAgICBtX3BhZ2VDbGllbnQtPnNlbGVj
dGlvbkNoYW5nZWQoaXNOb25lLCBpc0NvbnRlbnRFZGl0YWJsZSwgaXNQYXNzd29yZEZpZWxkLCBo
YXNDb21wb3NpdGlvbik7CiB9CisjZW5kaWYKICAgICAKIC8vIFVuZG8gbWFuYWdlbWVudAogCklu
ZGV4OiBXZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAkocmV2aXNpb24gNzM1ODMpCisrKyBXZWJLaXQy
L1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAkod29ya2luZyBjb3B5KQpAQCAtNDQsNiArNDQsNyBA
QAogI2luY2x1ZGUgIldlYlBvbGljeUNsaWVudC5oIgogI2luY2x1ZGUgIldlYlVJQ2xpZW50Lmgi
CiAjaW5jbHVkZSA8V2ViQ29yZS9FZGl0QWN0aW9uLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9FZGl0
b3IuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lTG9hZGVyVHlwZXMuaD4KICNpbmNsdWRlIDxX
ZWJDb3JlL0tleWJvYXJkRXZlbnQuaD4KICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgpAQCAtMTcw
LDYgKzE3MSwxMiBAQCBwdWJsaWM6CiAjaWYgUExBVEZPUk0oTUFDKQogICAgIHZvaWQgdXBkYXRl
V2luZG93SXNWaXNpYmxlKGJvb2wgd2luZG93SXNWaXNpYmxlKTsKICAgICB2b2lkIHdpbmRvd0Fu
ZFZpZXdGcmFtZXNDaGFuZ2VkKGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHdpbmRvd0ZyYW1lSW5T
Y3JlZW5Db29yZGluYXRlcywgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgdmlld0ZyYW1lSW5XaW5k
b3dDb29yZGluYXRlcyk7CisgICAgdm9pZCBnZXRNYXJrZWRSYW5nZSh1aW50NjRfdCYgbG9jYXRp
b24sIHVpbnQ2NF90JiBsZW5ndGgpOworICAgIHVpbnQ2NF90IGNoYXJhY3RlckluZGV4Rm9yUG9p
bnQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQpOworICAgIFdlYkNvcmU6OkludFJlY3QgZmlyc3RS
ZWN0Rm9yQ2hhcmFjdGVyUmFuZ2UodWludDY0X3QsIHVpbnQ2NF90KTsKKyAgICB2b2lkIGRpZFNl
bGVjdGlvbkNoYW5nZShib29sLCBib29sLCBib29sLCBib29sLCB1aW50NjRfdCwgdWludDY0X3Qp
OworI2Vsc2UKKyAgICB2b2lkIGRpZFNlbGVjdGlvbkNoYW5nZShib29sLCBib29sLCBib29sLCBi
b29sKTsKICNlbmRpZgogCiAjaWYgRU5BQkxFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCkBAIC0yMzYs
NyArMjQzLDYgQEAgcHVibGljOgogICAgIHZvaWQgYWRkRWRpdENvbW1hbmQoV2ViRWRpdENvbW1h
bmRQcm94eSopOwogICAgIHZvaWQgcmVtb3ZlRWRpdENvbW1hbmQoV2ViRWRpdENvbW1hbmRQcm94
eSopOwogICAgIHZvaWQgcmVnaXN0ZXJFZGl0Q29tbWFuZChQYXNzUmVmUHRyPFdlYkVkaXRDb21t
YW5kUHJveHk+LCBVbmRvT3JSZWRvKTsKLSAgICB2b2lkIGRpZFNlbGVjdGlvbkNoYW5nZShib29s
LCBib29sLCBib29sLCBib29sKTsKIAogICAgIFdlYlByb2Nlc3NQcm94eSogcHJvY2VzcygpIGNv
bnN0OwogICAgIFdlYlBhZ2VOYW1lc3BhY2UqIHBhZ2VOYW1lc3BhY2UoKSBjb25zdCB7IHJldHVy
biBtX3BhZ2VOYW1lc3BhY2UuZ2V0KCk7IH0KQEAgLTM0Nyw3ICszNTMsNyBAQCBwcml2YXRlOgog
CiAjaWYgUExBVEZPUk0oTUFDKQogICAgIC8vIEtleWJvYXJkIGhhbmRsaW5nCi0gICAgdm9pZCBp
bnRlcnByZXRLZXlFdmVudCh1aW50MzJfdCBldmVudFR5cGUsIFZlY3RvcjxXZWJDb3JlOjpLZXlw
cmVzc0NvbW1hbmQ+Jik7CisgICAgdm9pZCBpbnRlcnByZXRLZXlFdmVudCh1aW50MzJfdCBldmVu
dFR5cGUsIGJvb2wgaGFzQ29tcG9zaXRpb24sIFZlY3RvcjxXZWJDb3JlOjpLZXlwcmVzc0NvbW1h
bmQ+JiwgdWludDMyX3Qgc2VsZWN0aW9uU3RhcnQsIHVpbnQzMl90IHNlbGVjdGlvbkVuZCwgVmVj
dG9yPFdlYkNvcmU6OkNvbXBvc2l0aW9uVW5kZXJsaW5lPiYgdW5kZXJsaW5lcyk7CiAjZW5kaWYK
ICAgICAKICAgICAvLyBGaW5kLgpJbmRleDogV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5
Lm1lc3NhZ2VzLmluCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94
eS5tZXNzYWdlcy5pbgkocmV2aXNpb24gNzM1ODMpCisrKyBXZWJLaXQyL1VJUHJvY2Vzcy9XZWJQ
YWdlUHJveHkubWVzc2FnZXMuaW4JKHdvcmtpbmcgY29weSkKQEAgLTEwMSw3ICsxMDEsNyBAQCBt
ZXNzYWdlcyAtPiBXZWJQYWdlUHJveHkgewogCiAjaWYgUExBVEZPUk0oTUFDKQogICAgICMgS2V5
Ym9hcmQgc3VwcG9ydAotICAgIEludGVycHJldEtleUV2ZW50KHVpbnQzMl90IHR5cGUpIC0+IChW
ZWN0b3I8V2ViQ29yZTo6S2V5cHJlc3NDb21tYW5kPiBjb21tYW5kTmFtZSkKKyAgICBJbnRlcnBy
ZXRLZXlFdmVudCh1aW50MzJfdCB0eXBlLCBib29sIGhhc0NvbXBvc2l0aW9uKSAtPiAoVmVjdG9y
PFdlYkNvcmU6OktleXByZXNzQ29tbWFuZD4gY29tbWFuZE5hbWUsIHVpbnQzMl90IHNlbGVjdGlv
blN0YXJ0LCB1aW50MzJfdCBzZWxlY3Rpb25FbmQsIFZlY3RvcjxXZWJDb3JlOjpDb21wb3NpdGlv
blVuZGVybGluZT4gdW5kZXJsaW5lcykKICNlbmRpZgogICAgIAogICAgICMgQmFja0ZvcndhcmQg
bWVzc2FnZXMuCkBAIC0xMTcsNyArMTE3LDEyIEBAIG1lc3NhZ2VzIC0+IFdlYlBhZ2VQcm94eSB7
CiAgICAgQ2xlYXJBbGxFZGl0Q29tbWFuZHMoKQogICAgIAogICAgICMgU2VsZWN0aW9uIG1lc3Nh
Z2VzLgorI2lmIFBMQVRGT1JNKE1BQykKKyAgICBEaWRTZWxlY3Rpb25DaGFuZ2UoYm9vbCBpc05v
bmUsIGJvb2wgaXNDb250ZW50RWRpdGFibGUsIGJvb2wgaXNQYXNzd29yZEZpZWxkLCBib29sIGhh
c0NvbXBvc2l0aW9uLCB1aW50NjRfdCBsb2NhdGlvbiwgdWludDY0X3QgbGVuZ3RoKQorI2VuZGlm
CisjaWYgIVBMQVRGT1JNKE1BQykKICAgICBEaWRTZWxlY3Rpb25DaGFuZ2UoYm9vbCBpc05vbmUs
IGJvb2wgaXNDb250ZW50RWRpdGFibGUsIGJvb2wgaXNQYXNzd29yZEZpZWxkLCBib29sIGhhc0Nv
bXBvc2l0aW9uKQorI2VuZGlmCiAKICAgICAjIEZpbmQuCiAgICAgRGlkQ291bnRTdHJpbmdNYXRj
aGVzKFdURjo6U3RyaW5nIHN0cmluZywgdWludDMyX3QgbWF0Y2hDb3VudCkKSW5kZXg6IFdlYktp
dDIvVUlQcm9jZXNzL1dlYlByb2Nlc3NQcm94eS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvVUlQ
cm9jZXNzL1dlYlByb2Nlc3NQcm94eS5oCShyZXZpc2lvbiA3MzU4MykKKysrIFdlYktpdDIvVUlQ
cm9jZXNzL1dlYlByb2Nlc3NQcm94eS5oCSh3b3JraW5nIGNvcHkpCkBAIC02NSw2ICs2NSw3IEBA
IHB1YmxpYzoKIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIEUsIHR5cGVuYW1lIFQ+IGJvb2wgc2Vu
ZChFIG1lc3NhZ2VJRCwgdWludDY0X3QgZGVzdGluYXRpb25JRCwgY29uc3QgVCYgYXJndW1lbnRz
KTsKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIHNlbmQoY29uc3QgVCYgbWVzc2FnZSwg
dWludDY0X3QgZGVzdGluYXRpb25JRCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gYm9vbCBz
ZW5kU3luYyhjb25zdCBVJiBtZXNzYWdlLCBjb25zdCB0eXBlbmFtZSBVOjpSZXBseSYgcmVwbHks
IHVpbnQ2NF90IGRlc3RpbmF0aW9uSUQsIGRvdWJsZSB0aW1lb3V0KTsKICAgICAKICAgICBDb3Jl
SVBDOjpDb25uZWN0aW9uKiBjb25uZWN0aW9uKCkgY29uc3QKICAgICB7IApAQCAtMTcwLDYgKzE3
MSwxMiBAQCBib29sIFdlYlByb2Nlc3NQcm94eTo6c2VuZChjb25zdCBUJiBtZXNzCiAgICAgcmV0
dXJuIHNlbmRNZXNzYWdlKENvcmVJUEM6Ok1lc3NhZ2VJRChUOjptZXNzYWdlSUQpLCBhcmd1bWVu
dEVuY29kZXIucmVsZWFzZSgpKTsKIH0KIAordGVtcGxhdGU8dHlwZW5hbWUgVT4gCitib29sIFdl
YlByb2Nlc3NQcm94eTo6c2VuZFN5bmMoY29uc3QgVSYgbWVzc2FnZSwgY29uc3QgdHlwZW5hbWUg
VTo6UmVwbHkmIHJlcGx5LCB1aW50NjRfdCBkZXN0aW5hdGlvbklELCBkb3VibGUgdGltZW91dCA9
IDEpCit7CisgICAgcmV0dXJuIG1fY29ubmVjdGlvbi0+c2VuZFN5bmMobWVzc2FnZSwgcmVwbHks
IGRlc3RpbmF0aW9uSUQsIHRpbWVvdXQpOworfQorICAgIAogfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CiAKICNlbmRpZiAvLyBXZWJQcm9jZXNzUHJveHlfaApJbmRleDogV2ViS2l0Mi9VSVByb2Nlc3Mv
QVBJL21hYy9QYWdlQ2xpZW50SW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvVUlQcm9jZXNz
L0FQSS9tYWMvUGFnZUNsaWVudEltcGwuaAkocmV2aXNpb24gNzM1ODMpCisrKyBXZWJLaXQyL1VJ
UHJvY2Vzcy9BUEkvbWFjL1BhZ2VDbGllbnRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTU4LDEz
ICs1OCwxMyBAQCBwcml2YXRlOgogICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckVkaXRDb21tYW5k
KFBhc3NSZWZQdHI8V2ViRWRpdENvbW1hbmRQcm94eT4sIFdlYlBhZ2VQcm94eTo6VW5kb09yUmVk
byk7CiAgICAgdmlydHVhbCB2b2lkIGNsZWFyQWxsRWRpdENvbW1hbmRzKCk7CiAgICAgdmlydHVh
bCB2b2lkIHNldEVkaXRDb21tYW5kU3RhdGUoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSwgYm9v
bCBpc0VuYWJsZWQsIGludCBzdGF0ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGludGVyY2VwdEtleUV2
ZW50KGNvbnN0IE5hdGl2ZVdlYktleWJvYXJkRXZlbnQmIGV2ZW50LCBWZWN0b3I8V2ViQ29yZTo6
S2V5cHJlc3NDb21tYW5kPiYgY29tbWFuZE5hbWUpOworICAgIHZpcnR1YWwgdm9pZCBpbnRlcmNl
cHRLZXlFdmVudChjb25zdCBOYXRpdmVXZWJLZXlib2FyZEV2ZW50JiBldmVudCwgYm9vbCBoYXND
b21wb3NpdGlvbiwgVmVjdG9yPFdlYkNvcmU6OktleXByZXNzQ29tbWFuZD4mIGNvbW1hbmROYW1l
LCB1aW50MzJfdCBzZWxlY3Rpb25TdGFydCwgdWludDMyX3Qgc2VsZWN0aW9uRW5kLCBWZWN0b3I8
V2ViQ29yZTo6Q29tcG9zaXRpb25VbmRlcmxpbmU+JiB1bmRlcmxpbmVzKTsKIAogICAgIHZpcnR1
YWwgV2ViQ29yZTo6RmxvYXRSZWN0IGNvbnZlcnRUb0RldmljZVNwYWNlKGNvbnN0IFdlYkNvcmU6
OkZsb2F0UmVjdCYpOwogICAgIHZpcnR1YWwgV2ViQ29yZTo6RmxvYXRSZWN0IGNvbnZlcnRUb1Vz
ZXJTcGFjZShjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmKTsKIAogICAgIHZpcnR1YWwgdm9pZCBk
aWROb3RIYW5kbGVLZXlFdmVudChjb25zdCBOYXRpdmVXZWJLZXlib2FyZEV2ZW50Jik7Ci0gICAg
dmlydHVhbCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoYm9vbCwgYm9vbCwgYm9vbCwgYm9vbCk7Cisg
ICAgdmlydHVhbCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoYm9vbCwgYm9vbCwgYm9vbCwgYm9vbCwg
dWludDY0X3QsIHVpbnQ2NF90KTsKIAogICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxXZWJQb3B1cE1l
bnVQcm94eT4gY3JlYXRlUG9wdXBNZW51UHJveHkoKTsKICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8
V2ViQ29udGV4dE1lbnVQcm94eT4gY3JlYXRlQ29udGV4dE1lbnVQcm94eShXZWJQYWdlUHJveHkq
KTsKSW5kZXg6IFdlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvUGFnZUNsaWVudEltcGwubW0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9QYWdlQ2xpZW50SW1wbC5tbQko
cmV2aXNpb24gNzM1ODMpCisrKyBXZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1BhZ2VDbGllbnRJ
bXBsLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xNDcsOSArMTQ3LDkgQEAgdm9pZCBQYWdlQ2xpZW50
SW1wbDo6c2V0Vmlld3BvcnRBcmd1bWVudAogCiB9CiAKLXZvaWQgUGFnZUNsaWVudEltcGw6OnNl
bGVjdGlvbkNoYW5nZWQoYm9vbCBpc05vbmUsIGJvb2wgaXNDb250ZW50RWRpdGFibGUsIGJvb2wg
aXNQYXNzd29yZEZpZWxkLCBib29sIGhhc0NvbXBvc2l0aW9uKQordm9pZCBQYWdlQ2xpZW50SW1w
bDo6c2VsZWN0aW9uQ2hhbmdlZChib29sIGlzTm9uZSwgYm9vbCBpc0NvbnRlbnRFZGl0YWJsZSwg
Ym9vbCBpc1Bhc3N3b3JkRmllbGQsIGJvb2wgaGFzQ29tcG9zaXRpb24sIHVpbnQ2NF90IGxvY2F0
aW9uLCB1aW50NjRfdCBsZW5ndGgpCiB7Ci0gICAgW21fd2tWaWV3IF9zZWxlY3Rpb25DaGFuZ2Vk
OmlzTm9uZSBpc0VkaXRhYmxlOmlzQ29udGVudEVkaXRhYmxlIGlzUGFzc3dvcmQ6aXNQYXNzd29y
ZEZpZWxkIGhhc01hcmtlZFRleHQ6aGFzQ29tcG9zaXRpb25dOworICAgIFttX3drVmlldyBfc2Vs
ZWN0aW9uQ2hhbmdlZDppc05vbmUgaXNFZGl0YWJsZTppc0NvbnRlbnRFZGl0YWJsZSBpc1Bhc3N3
b3JkOmlzUGFzc3dvcmRGaWVsZCBoYXNNYXJrZWRUZXh0Omhhc0NvbXBvc2l0aW9uIHJhbmdlOk5T
TWFrZVJhbmdlKGxvY2F0aW9uLCBsZW5ndGgpXTsKIH0KIAogc3RhdGljIE5TU3RyaW5nKiBuYW1l
Rm9yRWRpdEFjdGlvbihFZGl0QWN0aW9uIGVkaXRBY3Rpb24pCkBAIC0yMjIsOSArMjIyLDEzIEBA
IHZvaWQgUGFnZUNsaWVudEltcGw6OnNldEVkaXRDb21tYW5kU3RhdGUKICAgICBbbV93a1ZpZXcg
X3NldFVzZXJJbnRlcmZhY2VJdGVtU3RhdGU6bnNTdHJpbmdGcm9tV2ViQ29yZVN0cmluZyhjb21t
YW5kTmFtZSkgZW5hYmxlZDppc0VuYWJsZWQgc3RhdGU6bmV3U3RhdGVdOwogfQogCi12b2lkIFBh
Z2VDbGllbnRJbXBsOjppbnRlcmNlcHRLZXlFdmVudChjb25zdCBOYXRpdmVXZWJLZXlib2FyZEV2
ZW50JiBldmVudCwgVmVjdG9yPFdlYkNvcmU6OktleXByZXNzQ29tbWFuZD4mIGNvbW1hbmRzTGlz
dCkKK3ZvaWQgUGFnZUNsaWVudEltcGw6OmludGVyY2VwdEtleUV2ZW50KGNvbnN0IE5hdGl2ZVdl
YktleWJvYXJkRXZlbnQmIGV2ZW50LCBib29sIGhhc0NvbXBvc2l0aW9uLCBWZWN0b3I8V2ViQ29y
ZTo6S2V5cHJlc3NDb21tYW5kPiYgY29tbWFuZHNMaXN0LCB1aW50MzJfdCBzZWxlY3Rpb25TdGFy
dCwgdWludDMyX3Qgc2VsZWN0aW9uRW5kLCBWZWN0b3I8V2ViQ29yZTo6Q29tcG9zaXRpb25VbmRl
cmxpbmU+JiB1bmRlcmxpbmVzKQogewotICAgIGNvbW1hbmRzTGlzdCA9IFttX3drVmlldyBfaW50
ZXJjZXB0S2V5RXZlbnQ6ZXZlbnQubmF0aXZlRXZlbnQoKV07CisgICAgY29tbWFuZHNMaXN0ID0g
W21fd2tWaWV3IF9pbnRlcmNlcHRLZXlFdmVudDpldmVudC5uYXRpdmVFdmVudCgpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb21wb3NpdGlvbjpoYXNDb21wb3NpdGlvbiAK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0OnNlbGVjdGlv
blN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkVuZDpz
ZWxlY3Rpb25FbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxp
bmVzOnVuZGVybGluZXNdOwogfQogCiBGbG9hdFJlY3QgUGFnZUNsaWVudEltcGw6OmNvbnZlcnRU
b0RldmljZVNwYWNlKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKSW5kZXg6IFdlYktpdDIvVUlQcm9j
ZXNzL0FQSS9tYWMvV0tWaWV3Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvVUlQcm9jZXNzL0FQ
SS9tYWMvV0tWaWV3Lm1tCShyZXZpc2lvbiA3MzU4MykKKysrIFdlYktpdDIvVUlQcm9jZXNzL0FQ
SS9tYWMvV0tWaWV3Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw2ICszMyw3IEBACiAjaW1wb3J0
ICJGaW5kSW5kaWNhdG9yLmgiCiAjaW1wb3J0ICJGaW5kSW5kaWNhdG9yV2luZG93LmgiCiAjaW1w
b3J0ICJMYXllckJhY2tlZERyYXdpbmdBcmVhUHJveHkuaCIKKyNpbXBvcnQgIkxvZ2dpbmcuaCIK
ICNpbXBvcnQgIk5hdGl2ZVdlYktleWJvYXJkRXZlbnQuaCIKICNpbXBvcnQgIlBhZ2VDbGllbnRJ
bXBsLmgiCiAjaW1wb3J0ICJSdW5Mb29wLmgiCkBAIC00NSw2ICs0Niw3IEBACiAjaW1wb3J0ICJX
ZWJQcm9jZXNzUHJveHkuaCIKICNpbXBvcnQgIldlYlN5c3RlbUludGVyZmFjZS5oIgogI2ltcG9y
dCA8UXVhcnR6Q29yZS9RdWFydHpDb3JlLmg+CisjaW1wb3J0IDxXZWJDb3JlL0NvbG9yTWFjLmg+
CiAjaW1wb3J0IDxXZWJDb3JlL0Zsb2F0UmVjdC5oPgogI2ltcG9ydCA8V2ViQ29yZS9JbnRSZWN0
Lmg+CiAjaW1wb3J0IDxXZWJDb3JlL0tleWJvYXJkRXZlbnQuaD4KQEAgLTEwMiwxNiArMTA0LDI2
IEBAIEBpbnRlcmZhY2UgV0tWaWV3RGF0YSA6IE5TT2JqZWN0IHsKICAgICAvLyB0aGF0IGhhcyBi
ZWVuIGFscmVhZHkgc2VudCB0byBXZWJDb3JlLgogICAgIE5TRXZlbnQgKl9rZXlEb3duRXZlbnRC
ZWluZ1Jlc2VudDsKICAgICBWZWN0b3I8S2V5cHJlc3NDb21tYW5kPiBfY29tbWFuZHNMaXN0Owor
CiAgICAgQk9PTCBfaXNTZWxlY3Rpb25Ob25lOwogICAgIEJPT0wgX2lzU2VsZWN0aW9uRWRpdGFi
bGU7CiAgICAgQk9PTCBfaXNTZWxlY3Rpb25JblBhc3N3b3JkRmllbGQ7CiAgICAgQk9PTCBfaGFz
TWFya2VkVGV4dDsKKyAgICBWZWN0b3I8Q29tcG9zaXRpb25VbmRlcmxpbmU+IF91bmRlcmxpbmVz
OworICAgIHVuc2lnbmVkIF9zZWxlY3Rpb25TdGFydDsKKyAgICB1bnNpZ25lZCBfc2VsZWN0aW9u
RW5kOworICAgIE5TUmFuZ2UgX3NlbGVjdGVkUmFuZ2U7CiB9CiBAZW5kCiAKIEBpbXBsZW1lbnRh
dGlvbiBXS1ZpZXdEYXRhCiBAZW5kCiAKK0BpbnRlcmZhY2UgTlNPYmplY3QgKE5TVGV4dElucHV0
Q29udGV4dERldGFpbHMpCistIChCT09MKXdhbnRzVG9IYW5kbGVNb3VzZUV2ZW50czsKKy0gKEJP
T0wpaGFuZGxlTW91c2VFdmVudDooTlNFdmVudCAqKWV2ZW50OworQGVuZAorCiBAaW1wbGVtZW50
YXRpb24gV0tWaWV3CiAKIC0gKGlkKWluaXRXaXRoRnJhbWU6KE5TUmVjdClmcmFtZSBwYWdlTmFt
ZXNwYWNlUmVmOihXS1BhZ2VOYW1lc3BhY2VSZWYpcGFnZU5hbWVzcGFjZVJlZiBwYWdlR3JvdXBS
ZWY6KFdLUGFnZUdyb3VwUmVmKXBhZ2VHcm91cFJlZgpAQCAtMTQxLDEwICsxNTMsMTIgQEAgLSAo
aWQpaW5pdFdpdGhGcmFtZTooTlNSZWN0KWZyYW1lIHBhZ2VOYQogCiAgICAgX2RhdGEtPl9tZW51
RW50cmllc0NvdW50ID0gMDsKICAgICBfZGF0YS0+X2lzUGVyZm9ybWluZ1VwZGF0ZSA9IGZhbHNl
OworCiAgICAgX2RhdGEtPl9pc1NlbGVjdGlvbk5vbmUgPSBZRVM7CiAgICAgX2RhdGEtPl9pc1Nl
bGVjdGlvbkVkaXRhYmxlID0gTk87CiAgICAgX2RhdGEtPl9pc1NlbGVjdGlvbkluUGFzc3dvcmRG
aWVsZCA9IE5POwogICAgIF9kYXRhLT5faGFzTWFya2VkVGV4dCA9IE5POworICAgIF9kYXRhLT5f
c2VsZWN0ZWRSYW5nZSA9IE5TTWFrZVJhbmdlKE5TTm90Rm91bmQsIDApOwogCiAgICAgcmV0dXJu
IHNlbGY7CiB9CkBAIC0zMjAsMTIgKzMzNCw5IEBAIC0gKEJPT0wpX3dhbnRzS2V5RG93bkZvckV2
ZW50OihOU0V2ZW50ICoKICAgICAgICAgX2RhdGEtPl9wYWdlLT5oYW5kbGUjI1R5cGUjI0V2ZW50
KHdlYkV2ZW50KTsgXAogICAgIH0KIAotRVZFTlRfSEFORExFUihtb3VzZURvd24sIE1vdXNlKQot
RVZFTlRfSEFORExFUihtb3VzZURyYWdnZWQsIE1vdXNlKQogRVZFTlRfSEFORExFUihtb3VzZUVu
dGVyZWQsIE1vdXNlKQogRVZFTlRfSEFORExFUihtb3VzZUV4aXRlZCwgTW91c2UpCiBFVkVOVF9I
QU5ETEVSKG1vdXNlTW92ZWQsIE1vdXNlKQotRVZFTlRfSEFORExFUihtb3VzZVVwLCBNb3VzZSkK
IEVWRU5UX0hBTkRMRVIob3RoZXJNb3VzZURvd24sIE1vdXNlKQogRVZFTlRfSEFORExFUihvdGhl
ck1vdXNlRHJhZ2dlZCwgTW91c2UpCiBFVkVOVF9IQU5ETEVSKG90aGVyTW91c2VNb3ZlZCwgTW91
c2UpCkBAIC0zMzgsNiArMzQ5LDIyIEBAIEVWRU5UX0hBTkRMRVIoc2Nyb2xsV2hlZWwsIFdoZWVs
KQogCiAjdW5kZWYgRVZFTlRfSEFORExFUgogCisjZGVmaW5lIE1PVVNFX0VWRU5UX0hBTkRMRVIo
U2VsZWN0b3IpIFwKKyAgICAtICh2b2lkKVNlbGVjdG9yOihOU0V2ZW50ICopdGhlRXZlbnQgXAor
ICAgIHsgXAorICAgICAgICBOU0lucHV0TWFuYWdlciAqY3VycmVudElucHV0TWFuYWdlciA9IFtO
U0lucHV0TWFuYWdlciBjdXJyZW50SW5wdXRNYW5hZ2VyXTsgXAorICAgICAgICBpZiAoW2N1cnJl
bnRJbnB1dE1hbmFnZXIgd2FudHNUb0hhbmRsZU1vdXNlRXZlbnRzXSAmJiBbY3VycmVudElucHV0
TWFuYWdlciBoYW5kbGVNb3VzZUV2ZW50OnRoZUV2ZW50XSkgXAorICAgICAgICAgICAgcmV0dXJu
OyBcCisgICAgICAgIFdlYk1vdXNlRXZlbnQgd2ViRXZlbnQgPSBXZWJFdmVudEZhY3Rvcnk6OmNy
ZWF0ZVdlYk1vdXNlRXZlbnQodGhlRXZlbnQsIHNlbGYpOyBcCisgICAgICAgIF9kYXRhLT5fcGFn
ZS0+aGFuZGxlTW91c2VFdmVudCh3ZWJFdmVudCk7IFwKKyAgICB9CisKK01PVVNFX0VWRU5UX0hB
TkRMRVIobW91c2VEb3duKQorTU9VU0VfRVZFTlRfSEFORExFUihtb3VzZURyYWdnZWQpCitNT1VT
RV9FVkVOVF9IQU5ETEVSKG1vdXNlVXApCisKKyN1bmRlZiBNT1VTRV9FVkVOVF9IQU5ETEVSCisK
IC0gKHZvaWQpZG9Db21tYW5kQnlTZWxlY3RvcjooU0VMKXNlbGVjdG9yCiB7CiAgICAgaWYgKHNl
bGVjdG9yICE9IEBzZWxlY3Rvcihub29wOikpCkBAIC0zNDYsNyArMzczLDMzIEBAIC0gKHZvaWQp
ZG9Db21tYW5kQnlTZWxlY3RvcjooU0VMKXNlbGVjdG8KIAogLSAodm9pZClpbnNlcnRUZXh0Oihp
ZClzdHJpbmcKIHsKLSAgICBfZGF0YS0+X2NvbW1hbmRzTGlzdC5hcHBlbmQoS2V5cHJlc3NDb21t
YW5kKCJpbnNlcnRUZXh0Iiwgc3RyaW5nKSk7CisgICAgQk9PTCBpc0F0dHJpYnV0ZWRTdHJpbmcg
PSBbc3RyaW5nIGlzS2luZE9mQ2xhc3M6W05TQXR0cmlidXRlZFN0cmluZyBjbGFzc11dOyAvLyBP
dGhlcndpc2UsIE5TU3RyaW5nCisgICAgCisgICAgTE9HKFRleHRJbnB1dCwgImluc2VydFRleHQ6
XCIlQFwiIiwgaXNBdHRyaWJ1dGVkU3RyaW5nID8gW3N0cmluZyBzdHJpbmddIDogc3RyaW5nKTsK
KyAgICBOU1N0cmluZyAqdGV4dDsKKyAgICBib29sIGlzRnJvbUlucHV0TWV0aG9kID0gX2RhdGEt
Pl9oYXNNYXJrZWRUZXh0OworCisgICAgaWYgKGlzQXR0cmlidXRlZFN0cmluZykgeworICAgICAg
ICB0ZXh0ID0gW3N0cmluZyBzdHJpbmddOworICAgICAgICAvLyBXZSBkZWFsIHdpdGggdGhlIE5T
VGV4dElucHV0UmVwbGFjZW1lbnRSYW5nZUF0dHJpYnV0ZU5hbWUgYXR0cmlidXRlIGZyb20gTlNB
dHRyaWJ1dGVkU3RyaW5nIGhlcmUKKyAgICAgICAgLy8gc2ltcGx5IGJlY2F1c2UgaXQgaXMgdXNl
ZCBieSBhdCBsZWFzdCBvbmUgSW5wdXQgTWV0aG9kIC0tIGl0IGNvcnJlc29uZHMgdG8gdGhlIGtF
dmVudFBhcmFtVGV4dElucHV0U2VuZFJlcGxhY2VSYW5nZQorICAgICAgICAvLyBldmVudCBpbiBU
U00uICBUaGlzIGJlaGF2aW91ciBtYXRjaGVzIHRoYXQgb2YgLVtXZWJIVE1MVmlldyBzZXRNYXJr
ZWRUZXh0OnNlbGVjdGVkUmFuZ2U6XSB3aGVuIGl0IHJlY2VpdmVzIGFuCisgICAgICAgIC8vIE5T
QXR0cmlidXRlZFN0cmluZworICAgICAgICBOU1N0cmluZyAqcmFuZ2VTdHJpbmcgPSBbc3RyaW5n
IGF0dHJpYnV0ZTpOU1RleHRJbnB1dFJlcGxhY2VtZW50UmFuZ2VBdHRyaWJ1dGVOYW1lIGF0SW5k
ZXg6MCBsb25nZXN0RWZmZWN0aXZlUmFuZ2U6TlVMTCBpblJhbmdlOk5TTWFrZVJhbmdlKDAsIFt0
ZXh0IGxlbmd0aF0pXTsKKyAgICAgICAgTE9HKFRleHRJbnB1dCwgIlJlcGxhY2VtZW50UmFuZ2U6
ICVAIiwgcmFuZ2VTdHJpbmcpOworICAgICAgICBpZiAocmFuZ2VTdHJpbmcpCisgICAgICAgICAg
ICBpc0Zyb21JbnB1dE1ldGhvZCA9IFlFUzsKKyAgICB9IGVsc2UKKyAgICAgICAgdGV4dCA9IHN0
cmluZzsKKyAgICAKKyAgICBTdHJpbmcgZXZlbnRUZXh0ID0gdGV4dDsKKyAgICAKKyAgICBpZiAo
IWlzRnJvbUlucHV0TWV0aG9kKQorICAgICAgICBfZGF0YS0+X2NvbW1hbmRzTGlzdC5hcHBlbmQo
S2V5cHJlc3NDb21tYW5kKCJpbnNlcnRUZXh0IiwgdGV4dCkpOworICAgIGVsc2UgeworICAgICAg
ICBldmVudFRleHQucmVwbGFjZShOU0JhY2tUYWJDaGFyYWN0ZXIsIE5TVGFiQ2hhcmFjdGVyKTsg
Ly8gc2FtZSB0aGluZyBpcyBkb25lIGluIEtleUV2ZW50TWFjLm1tIGluIFdlYkNvcmUKKyAgICAg
ICAgX2RhdGEtPl9jb21tYW5kc0xpc3QuYXBwZW5kKEtleXByZXNzQ29tbWFuZCgiaW5zZXJ0VGV4
dCIsIGV2ZW50VGV4dCkpOworICAgIH0KIH0KIAogLSAoQk9PTClfaGFuZGxlU3R5bGVLZXlFcXVp
dmFsZW50OihOU0V2ZW50ICopZXZlbnQKQEAgLTQwOCwyMSArNDYxLDI1IEBAIC0gKHZvaWQpX3Nl
dEV2ZW50QmVpbmdSZXNlbnQ6KE5TRXZlbnQgKikKICAgICBfZGF0YS0+X2tleURvd25FdmVudEJl
aW5nUmVzZW50ID0gW2V2ZW50IHJldGFpbl07CiB9CiAKLS0gKHZvaWQpX3NlbGVjdGlvbkNoYW5n
ZWQ6KEJPT0wpaXNOb25lIGlzRWRpdGFibGU6KEJPT0wpaXNDb250ZW50RWRpdGFibGUgaXNQYXNz
d29yZDooQk9PTClpc1Bhc3N3b3JkRmllbGQgaGFzTWFya2VkVGV4dDooQk9PTCloYXNDb21wb3Np
dGlvbgorLSAodm9pZClfc2VsZWN0aW9uQ2hhbmdlZDooQk9PTClpc05vbmUgaXNFZGl0YWJsZToo
Qk9PTClpc0NvbnRlbnRFZGl0YWJsZSBpc1Bhc3N3b3JkOihCT09MKWlzUGFzc3dvcmRGaWVsZCBo
YXNNYXJrZWRUZXh0OihCT09MKWhhc0NvbXBvc2l0aW9uIHJhbmdlOihOU1JhbmdlKW5ld3Jhbmdl
CiB7CiAgICAgX2RhdGEtPl9pc1NlbGVjdGlvbk5vbmUgPSBpc05vbmU7CiAgICAgX2RhdGEtPl9p
c1NlbGVjdGlvbkVkaXRhYmxlID0gaXNDb250ZW50RWRpdGFibGU7CiAgICAgX2RhdGEtPl9pc1Nl
bGVjdGlvbkluUGFzc3dvcmRGaWVsZCA9IGlzUGFzc3dvcmRGaWVsZDsKICAgICBfZGF0YS0+X2hh
c01hcmtlZFRleHQgPSBoYXNDb21wb3NpdGlvbjsKKyAgICBfZGF0YS0+X3NlbGVjdGVkUmFuZ2Ug
PSBuZXdyYW5nZTsKIH0KIAotLSAoVmVjdG9yPEtleXByZXNzQ29tbWFuZD4mKV9pbnRlcmNlcHRL
ZXlFdmVudDooTlNFdmVudCAqKXRoZUV2ZW50CistIChWZWN0b3I8S2V5cHJlc3NDb21tYW5kPiYp
X2ludGVyY2VwdEtleUV2ZW50OihOU0V2ZW50ICopdGhlRXZlbnQgaGFzQ29tcG9zaXRpb246KEJP
T0wpaGFzQ29tcG9zaXRpb24gc2VsZWN0aW9uU3RhcnQ6KHVuc2lnbmVkKXN0YXJ0IHNlbGVjdGlv
bkVuZDoodW5zaWduZWQpZW5kIHVuZGVybGluZXM6KFZlY3RvcjxXZWJDb3JlOjpDb21wb3NpdGlv
blVuZGVybGluZT4mKWxpbmVzCiB7CiAgICAgX2RhdGEtPl9jb21tYW5kc0xpc3QuY2xlYXIoKTsK
KyAgICBfZGF0YS0+IF9oYXNNYXJrZWRUZXh0ID0gaGFzQ29tcG9zaXRpb247CiAgICAgLy8gaW50
ZXJwcmV0S2V5RXZlbnRzIHdpbGwgdHJpZ2dlciBvbmUgb3IgbW9yZSBjYWxscyB0byBkb0NvbW1h
bmRCeVNlbGVjdG9yIG9yIHNldFRleHQKICAgICAvLyB0aGF0IHdpbGwgcG9wdWxhdGUgdGhlIGNv
bW1hbmRzTGlzdCB2ZWN0b3IuCiAgICAgW3NlbGYgaW50ZXJwcmV0S2V5RXZlbnRzOltOU0FycmF5
IGFycmF5V2l0aE9iamVjdDp0aGVFdmVudF1dOwotICAgIAorICAgIHN0YXJ0ID0gX2RhdGEtPl9z
ZWxlY3Rpb25TdGFydDsKKyAgICBlbmQgPSBfZGF0YS0+X3NlbGVjdGlvbkVuZDsKKyAgICBsaW5l
cyA9IF9kYXRhLT5fdW5kZXJsaW5lczsKICAgICByZXR1cm4gX2RhdGEtPl9jb21tYW5kc0xpc3Q7
CiB9CiAKQEAgLTQzMyw2ICs0OTAsOSBAQCAtICh2b2lkKWtleVVwOihOU0V2ZW50ICopdGhlRXZl
bnQKIAogLSAodm9pZClrZXlEb3duOihOU0V2ZW50ICopdGhlRXZlbnQKIHsKKyAgICBfZGF0YS0+
X3VuZGVybGluZXMuY2xlYXIoKTsKKyAgICBfZGF0YS0+X3NlbGVjdGlvblN0YXJ0ID0gMDsKKyAg
ICBfZGF0YS0+X3NlbGVjdGlvbkVuZCA9IDA7CiAgICAgLy8gV2UgY291bGQgYmUgcmVjZWl2aW5n
IGEga2V5IGRvd24gZnJvbSBBcHBLaXQgaWYgd2UgaGF2ZSByZS1zZW50IGFuIGV2ZW50CiAgICAg
Ly8gdGhhdCBtYXBzIHRvIGFuIGFjdGlvbiB0aGF0IGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZSAo
Zm9yIGV4YW1wbGUgYSBjb3B5IHdoZW4KICAgICAvLyB0aGVyZSBpcyBubyByYW5nZSBzZWxlY3Rp
b24pLgpAQCAtNDQ4LDE3ICs1MDgsMjQgQEAgLSAodm9pZClrZXlEb3duOihOU0V2ZW50ICopdGhl
RXZlbnQKIAogLSAoTlNSYW5nZSlzZWxlY3RlZFJhbmdlCiB7Ci0gICAgcmV0dXJuIE5TTWFrZVJh
bmdlKE5TTm90Rm91bmQsIDApOworICAgIGlmIChfZGF0YS0+X2lzU2VsZWN0aW9uTm9uZSB8fCAh
X2RhdGEtPl9pc1NlbGVjdGlvbkVkaXRhYmxlKQorICAgICAgICByZXR1cm4gTlNNYWtlUmFuZ2Uo
TlNOb3RGb3VuZCwgMCk7CisgICAgCisgICAgTE9HKFRleHRJbnB1dCwgInNlbGVjdGVkUmFuZ2Ug
LT4gKCV1LCAldSkiLCBfZGF0YS0+X3NlbGVjdGVkUmFuZ2UubG9jYXRpb24sIF9kYXRhLT5fc2Vs
ZWN0ZWRSYW5nZS5sZW5ndGgpOworICAgIHJldHVybiBfZGF0YS0+X3NlbGVjdGVkUmFuZ2U7CiB9
CiAKIC0gKEJPT0wpaGFzTWFya2VkVGV4dAogeworICAgIExPRyhUZXh0SW5wdXQsICJoYXNNYXJr
ZWRUZXh0IC0+ICV1IiwgX2RhdGEtPiBfaGFzTWFya2VkVGV4dCk7CiAgICAgcmV0dXJuIF9kYXRh
LT5faGFzTWFya2VkVGV4dDsKIH0KIAogLSAodm9pZCl1bm1hcmtUZXh0CiB7Ci0gICAgLy8gTm90
IGltcGxlbWVudGVkCisgICAgTE9HKFRleHRJbnB1dCwgInVubWFya1RleHQiKTsKKyAgICAKKyAg
ICBfZGF0YS0+X2NvbW1hbmRzTGlzdC5hcHBlbmQoS2V5cHJlc3NDb21tYW5kKCJ1bm1hcmtUZXh0
IikpOwogfQogCiAtIChOU0FycmF5ICopdmFsaWRBdHRyaWJ1dGVzRm9yTWFya2VkVGV4dApAQCAt
NDc1LDQxICs1NDIsOTUgQEAgLSAoTlNBcnJheSAqKXZhbGlkQXR0cmlidXRlc0Zvck1hcmtlZFRl
eAogICAgICAgICAvLyAgICAgTlNCYWNrZ3JvdW5kQ29sb3JBdHRyaWJ1dGVOYW1lLCBOU0xhbmd1
YWdlQXR0cmlidXRlTmFtZS4KICAgICAgICAgQ0ZSZXRhaW4odmFsaWRBdHRyaWJ1dGVzKTsKICAg
ICB9CisgICAgTE9HKFRleHRJbnB1dCwgInZhbGlkQXR0cmlidXRlc0Zvck1hcmtlZFRleHQgLT4g
KC4uLikiKTsKICAgICByZXR1cm4gdmFsaWRBdHRyaWJ1dGVzOwogfQogCitzdGF0aWMgdm9pZCBl
eHRyYWN0VW5kZXJsaW5lcyhOU0F0dHJpYnV0ZWRTdHJpbmcgKnN0cmluZywgVmVjdG9yPENvbXBv
c2l0aW9uVW5kZXJsaW5lPiYgcmVzdWx0KQoreworICAgIGludCBsZW5ndGggPSBbW3N0cmluZyBz
dHJpbmddIGxlbmd0aF07CisgICAgCisgICAgaW50IGkgPSAwOworICAgIHdoaWxlIChpIDwgbGVu
Z3RoKSB7CisgICAgICAgIE5TUmFuZ2UgcmFuZ2U7CisgICAgICAgIE5TRGljdGlvbmFyeSAqYXR0
cnMgPSBbc3RyaW5nIGF0dHJpYnV0ZXNBdEluZGV4OmkgbG9uZ2VzdEVmZmVjdGl2ZVJhbmdlOiZy
YW5nZSBpblJhbmdlOk5TTWFrZVJhbmdlKGksIGxlbmd0aCAtIGkpXTsKKyAgICAgICAgCisgICAg
ICAgIGlmIChOU051bWJlciAqc3R5bGUgPSBbYXR0cnMgb2JqZWN0Rm9yS2V5Ok5TVW5kZXJsaW5l
U3R5bGVBdHRyaWJ1dGVOYW1lXSkgeworICAgICAgICAgICAgQ29sb3IgY29sb3IgPSBDb2xvcjo6
YmxhY2s7CisgICAgICAgICAgICBpZiAoTlNDb2xvciAqY29sb3JBdHRyID0gW2F0dHJzIG9iamVj
dEZvcktleTpOU1VuZGVybGluZUNvbG9yQXR0cmlidXRlTmFtZV0pCisgICAgICAgICAgICAgICAg
Y29sb3IgPSBjb2xvckZyb21OU0NvbG9yKFtjb2xvckF0dHIgY29sb3JVc2luZ0NvbG9yU3BhY2VO
YW1lOk5TRGV2aWNlUkdCQ29sb3JTcGFjZV0pOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChD
b21wb3NpdGlvblVuZGVybGluZShyYW5nZS5sb2NhdGlvbiwgTlNNYXhSYW5nZShyYW5nZSksIGNv
bG9yLCBbc3R5bGUgaW50VmFsdWVdID4gMSkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICBpID0gcmFuZ2UubG9jYXRpb24gKyByYW5nZS5sZW5ndGg7CisgICAgfQorfQorCiAtICh2b2lk
KXNldE1hcmtlZFRleHQ6KGlkKXN0cmluZyBzZWxlY3RlZFJhbmdlOihOU1JhbmdlKW5ld1NlbFJh
bmdlCiB7Ci0gICAgLy8gTm90IGltcGxlbWVudGVkCisgICAgQk9PTCBpc0F0dHJpYnV0ZWRTdHJp
bmcgPSBbc3RyaW5nIGlzS2luZE9mQ2xhc3M6W05TQXR0cmlidXRlZFN0cmluZyBjbGFzc11dOyAv
LyBPdGhlcndpc2UsIE5TU3RyaW5nCisgICAgCisgICAgTE9HKFRleHRJbnB1dCwgInNldE1hcmtl
ZFRleHQ6XCIlQFwiIHNlbGVjdGVkUmFuZ2U6KCV1LCAldSkiLCBpc0F0dHJpYnV0ZWRTdHJpbmcg
PyBbc3RyaW5nIHN0cmluZ10gOiBzdHJpbmcsIG5ld1NlbFJhbmdlLmxvY2F0aW9uLCBuZXdTZWxS
YW5nZS5sZW5ndGgpOworICAgIAorICAgIE5TU3RyaW5nICp0ZXh0ID0gc3RyaW5nOworICAgIAor
ICAgIGlmIChpc0F0dHJpYnV0ZWRTdHJpbmcpIHsKKyAgICAgICAgdGV4dCA9IFtzdHJpbmcgc3Ry
aW5nXTsKKyAgICAgICAgZXh0cmFjdFVuZGVybGluZXMoc3RyaW5nLCBfZGF0YS0+X3VuZGVybGlu
ZXMpOworICAgIH0KKyAgICAKKyAgICBfZGF0YS0+X2NvbW1hbmRzTGlzdC5hcHBlbmQoS2V5cHJl
c3NDb21tYW5kKCJzZXRNYXJrZWRUZXh0IiwgdGV4dCkpOworICAgIF9kYXRhLT5fc2VsZWN0aW9u
U3RhcnQgPSBuZXdTZWxSYW5nZS5sb2NhdGlvbjsKKyAgICBfZGF0YS0+X3NlbGVjdGlvbkVuZCA9
IE5TTWF4UmFuZ2UobmV3U2VsUmFuZ2UpOwogfQogCiAtIChOU1JhbmdlKW1hcmtlZFJhbmdlCiB7
Ci0gICAgLy8gTm90IGltcGxlbWVudGVkCi0gICAgcmV0dXJuIE5TTWFrZVJhbmdlKDAsIDApOwor
ICAgIHVpbnQ2NF90IGxvY2F0aW9uOworICAgIHVpbnQ2NF90IGxlbmd0aDsKKworICAgIF9kYXRh
LT5fcGFnZS0+Z2V0TWFya2VkUmFuZ2UobG9jYXRpb24sIGxlbmd0aCk7CisgICAgTE9HKFRleHRJ
bnB1dCwgIm1hcmtlZFJhbmdlIC0+ICgldSwgJXUpIiwgbG9jYXRpb24sIGxlbmd0aCk7CisgICAg
cmV0dXJuIE5TTWFrZVJhbmdlKGxvY2F0aW9uLCBsZW5ndGgpOwogfQogCiAtIChOU0F0dHJpYnV0
ZWRTdHJpbmcgKilhdHRyaWJ1dGVkU3Vic3RyaW5nRnJvbVJhbmdlOihOU1JhbmdlKW5zUmFuZ2UK
IHsKLSAgICAvLyBOb3QgaW1wbGVtZW50ZWQKKyAgICAvLyBUaGlzIGlzIG5vdCBpbXBsZW1lbnRl
ZCBmb3Igbm93LiBOZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIHNlcmlhbGl6ZSB0aGUgYXR0cmli
dXRlZCBzdHJpbmcgYWNyb3NzIHByb2Nlc3Nlcy4KKyAgICBMT0coVGV4dElucHV0LCAiYXR0cmli
dXRlZFN1YnN0cmluZ0Zyb21SYW5nZSIpOwogICAgIHJldHVybiBuaWw7CiB9CiAKLS0gKE5TSW50
ZWdlciljb252ZXJzYXRpb25JZGVudGlmaWVyCi17Ci0gICAgcmV0dXJuIChOU0ludGVnZXIpc2Vs
ZjsKLX0KLQogLSAoTlNVSW50ZWdlciljaGFyYWN0ZXJJbmRleEZvclBvaW50OihOU1BvaW50KXRo
ZVBvaW50CiB7Ci0gICAgLy8gTm90IGltcGxlbWVudGVkCi0gICAgcmV0dXJuIE5TTm90Rm91bmQ7
CisgICAgTlNXaW5kb3cgKndpbmRvdyA9IFtzZWxmIHdpbmRvd107CisgICAgCisgICAgaWYgKHdp
bmRvdykKKyAgICAgICAgdGhlUG9pbnQgPSBbd2luZG93IGNvbnZlcnRTY3JlZW5Ub0Jhc2U6dGhl
UG9pbnRdOworICAgIHRoZVBvaW50ID0gW3NlbGYgY29udmVydFBvaW50OnRoZVBvaW50IGZyb21W
aWV3Om5pbF07ICAvLyB0aGUgcG9pbnQgaXMgcmVsYXRpdmUgdG8gdGhlIG1haW4gZnJhbWUgCisg
ICAgCisgICAgdWludDY0X3QgcmVzdWx0ID0gX2RhdGEtPl9wYWdlLT5jaGFyYWN0ZXJJbmRleEZv
clBvaW50KEludFBvaW50KHRoZVBvaW50KSk7CisgICAgTE9HKFRleHRJbnB1dCwgImNoYXJhY3Rl
ckluZGV4Rm9yUG9pbnQ6KCVmLCAlZikgLT4gJXUiLCB0aGVQb2ludC54LCB0aGVQb2ludC55LCBy
ZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC0gKE5TUmVjdClmaXJzdFJlY3RGb3JD
aGFyYWN0ZXJSYW5nZTooTlNSYW5nZSl0aGVSYW5nZQogeyAKLSAgICAvLyBOb3QgaW1wbGVtZW50
ZWQKLSAgICByZXR1cm4gTlNNYWtlUmVjdCgwLCAwLCAwLCAwKTsKKyAgICAvLyBKdXN0IHRvIG1h
dGNoIE5TVGV4dFZpZXcncyBiZWhhdmlvci4gUmVncmVzc2lvbiB0ZXN0cyBjYW5ub3QgZGV0ZWN0
IHRoaXM7CisgICAgLy8gdG8gcmVwcm9kdWNlLCB1c2UgYSB0ZXN0IGFwcGxpY2F0aW9uIGZyb20g
aHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDY4MgorICAgIC8vICh0eXBl
IHNvbWV0aGluZzsgdHJ5IHJhbmdlcyAoMSwgLTEpIGFuZCAoMiwgLTEpLgorICAgIGlmICgodGhl
UmFuZ2UubG9jYXRpb24gKyB0aGVSYW5nZS5sZW5ndGggPCB0aGVSYW5nZS5sb2NhdGlvbikgJiYg
KHRoZVJhbmdlLmxvY2F0aW9uICsgdGhlUmFuZ2UubGVuZ3RoICE9IDApKQorICAgICAgICB0aGVS
YW5nZS5sZW5ndGggPSAwOworICAgIAorICAgIE5TUmVjdCByZXN1bHRSZWN0ID0gX2RhdGEtPl9w
YWdlLT5maXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5nZSh0aGVSYW5nZS5sb2NhdGlvbiwgdGhlUmFu
Z2UubGVuZ3RoKTsKKyAgICByZXN1bHRSZWN0ID0gW3NlbGYgY29udmVydFJlY3Q6cmVzdWx0UmVj
dCB0b1ZpZXc6bmlsXTsKKyAgICAKKyAgICBOU1dpbmRvdyAqd2luZG93ID0gW3NlbGYgd2luZG93
XTsKKyAgICBpZiAod2luZG93KQorICAgICAgICByZXN1bHRSZWN0Lm9yaWdpbiA9IFt3aW5kb3cg
Y29udmVydEJhc2VUb1NjcmVlbjpyZXN1bHRSZWN0Lm9yaWdpbl07CisgICAgCisgICAgTE9HKFRl
eHRJbnB1dCwgImZpcnN0UmVjdEZvckNoYXJhY3RlclJhbmdlOigldSwgJXUpIC0+ICglZiwgJWYs
ICVmLCAlZikiLCB0aGVSYW5nZS5sb2NhdGlvbiwgdGhlUmFuZ2UubGVuZ3RoLCByZXN1bHRSZWN0
Lm9yaWdpbi54LCByZXN1bHRSZWN0Lm9yaWdpbi55LCByZXN1bHRSZWN0LnNpemUud2lkdGgsIHJl
c3VsdFJlY3Quc2l6ZS5oZWlnaHQpOworICAgIHJldHVybiByZXN1bHRSZWN0OwogfQogCiAtICh2
b2lkKV91cGRhdGVBY3RpdmVTdGF0ZQpAQCAtNzA2LDYgKzgyNywxMSBAQCAtIChOU1ZpZXcgKilo
aXRUZXN0OihOU1BvaW50KXBvaW50CiAgICAgcmV0dXJuIGhpdFZpZXc7CiB9CiAKKy0gKE5TSW50
ZWdlciljb252ZXJzYXRpb25JZGVudGlmaWVyCit7CisgICAgcmV0dXJuIChOU0ludGVnZXIpc2Vs
ZjsKK30KKwogQGVuZAogCiBAaW1wbGVtZW50YXRpb24gV0tWaWV3IChJbnRlcm5hbCkKSW5kZXg6
IFdlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tWaWV3SW50ZXJuYWwuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLVmlld0ludGVybmFsLmgJKHJldmlzaW9uIDcz
NTgzKQorKysgV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1ZpZXdJbnRlcm5hbC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3IEBACiAgKi8KIAogI2ltcG9ydCAiV0tWaWV3LmgiCisj
aW1wb3J0IDxXZWJDb3JlL0VkaXRvci5oPgogI2ltcG9ydCA8V2ViQ29yZS9LZXlib2FyZEV2ZW50
Lmg+CiAKIG5hbWVzcGFjZSBXZWJLaXQgewpAQCAtMzcsMTEgKzM4LDExIEBAIEBpbnRlcmZhY2Ug
V0tWaWV3IChJbnRlcm5hbCkKIC0gKHZvaWQpX3Rvb2xUaXBDaGFuZ2VkRnJvbTooTlNTdHJpbmcg
KilvbGRUb29sVGlwIHRvOihOU1N0cmluZyAqKW5ld1Rvb2xUaXA7CiAtICh2b2lkKV9zZXRDdXJz
b3I6KE5TQ3Vyc29yICopY3Vyc29yOwogLSAodm9pZClfc2V0VXNlckludGVyZmFjZUl0ZW1TdGF0
ZTooTlNTdHJpbmcgKiljb21tYW5kTmFtZSBlbmFibGVkOihCT09MKWlzRW5hYmxlZCBzdGF0ZToo
aW50KW5ld1N0YXRlOwotLSAoVmVjdG9yPFdlYkNvcmU6OktleXByZXNzQ29tbWFuZD4mKV9pbnRl
cmNlcHRLZXlFdmVudDooTlNFdmVudCAqKXRoZUV2ZW50OworLSAoVmVjdG9yPFdlYkNvcmU6Oktl
eXByZXNzQ29tbWFuZD4mKV9pbnRlcmNlcHRLZXlFdmVudDooTlNFdmVudCAqKXRoZUV2ZW50IGhh
c0NvbXBvc2l0aW9uOihCT09MKWhhc0NvbXBvc2l0aW9uIHNlbGVjdGlvblN0YXJ0Oih1bnNpZ25l
ZClzdGFydCBzZWxlY3Rpb25FbmQ6KHVuc2lnbmVkKWVuZCB1bmRlcmxpbmVzOihWZWN0b3I8V2Vi
Q29yZTo6Q29tcG9zaXRpb25VbmRlcmxpbmU+JilsaW5lczsKIC0gKHZvaWQpX3NldEV2ZW50QmVp
bmdSZXNlbnQ6KE5TRXZlbnQgKilldmVudDsKIC0gKE5TUmVjdClfY29udmVydFRvRGV2aWNlU3Bh
Y2U6KE5TUmVjdClyZWN0OwogLSAoTlNSZWN0KV9jb252ZXJ0VG9Vc2VyU3BhY2U6KE5TUmVjdCly
ZWN0OwotLSAodm9pZClfc2VsZWN0aW9uQ2hhbmdlZDooQk9PTClpc05vbmUgaXNFZGl0YWJsZToo
Qk9PTClpc0NvbnRlbnRFZGl0YWJsZSBpc1Bhc3N3b3JkOihCT09MKWlzUGFzc3dvcmRGaWVsZCBo
YXNNYXJrZWRUZXh0OihCT09MKWhhc0NvbXBvc2l0aW9uOworLSAodm9pZClfc2VsZWN0aW9uQ2hh
bmdlZDooQk9PTClpc05vbmUgaXNFZGl0YWJsZTooQk9PTClpc0NvbnRlbnRFZGl0YWJsZSBpc1Bh
c3N3b3JkOihCT09MKWlzUGFzc3dvcmRGaWVsZCBoYXNNYXJrZWRUZXh0OihCT09MKWhhc0NvbXBv
c2l0aW9uIHJhbmdlOihOU1JhbmdlKW5ld3JhbmdlOwogCiAtICh2b2lkKV9zZXRGaW5kSW5kaWNh
dG9yOihQYXNzUmVmUHRyPFdlYktpdDo6RmluZEluZGljYXRvcj4pZmluZEluZGljYXRvciBmYWRl
T3V0OihCT09MKWZhZGVPdXQ7CiAKSW5kZXg6IFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJQcm9jZXNz
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUHJvY2Vzcy5jcHAJKHJl
dmlzaW9uIDczNTgzKQorKysgV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlByb2Nlc3MuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00NjMsNiArNDYzLDIwIEBAIHZvaWQgV2ViUHJvY2Vzczo6c2h1dGRvd25J
ZlBvc3NpYmxlKCkKICAgICBtX3J1bkxvb3AtPnN0b3AoKTsKIH0KIAorQ29yZUlQQzo6U3luY1Jl
cGx5TW9kZSBXZWJQcm9jZXNzOjpkaWRSZWNlaXZlU3luY01lc3NhZ2UoQ29yZUlQQzo6Q29ubmVj
dGlvbiogY29ubmVjdGlvbiwgQ29yZUlQQzo6TWVzc2FnZUlEIG1lc3NhZ2VJRCwgQ29yZUlQQzo6
QXJndW1lbnREZWNvZGVyKiBhcmd1bWVudHMsIENvcmVJUEM6OkFyZ3VtZW50RW5jb2RlciogcmVw
bHkpCit7ICAgCisgICAgdWludDY0X3QgcGFnZUlEID0gYXJndW1lbnRzLT5kZXN0aW5hdGlvbklE
KCk7CisgICAgaWYgKCFwYWdlSUQpCisgICAgICAgIHJldHVybiBDb3JlSVBDOjpBdXRvbWF0aWNS
ZXBseTsKKyAgICAKKyAgICBXZWJQYWdlKiBwYWdlID0gd2ViUGFnZShwYWdlSUQpOworICAgIGlm
ICghcGFnZSkKKyAgICAgICAgcmV0dXJuIENvcmVJUEM6OkF1dG9tYXRpY1JlcGx5OworICAgIAor
ICAgIHBhZ2UtPmRpZFJlY2VpdmVTeW5jTWVzc2FnZShjb25uZWN0aW9uLCBtZXNzYWdlSUQsIGFy
Z3VtZW50cywgcmVwbHkpOworICAgIHJldHVybiBDb3JlSVBDOjpBdXRvbWF0aWNSZXBseTsKK30K
Kwogdm9pZCBXZWJQcm9jZXNzOjpkaWRSZWNlaXZlTWVzc2FnZShDb3JlSVBDOjpDb25uZWN0aW9u
KiBjb25uZWN0aW9uLCBDb3JlSVBDOjpNZXNzYWdlSUQgbWVzc2FnZUlELCBDb3JlSVBDOjpBcmd1
bWVudERlY29kZXIqIGFyZ3VtZW50cykKIHsKICAgICBpZiAobWVzc2FnZUlELmlzPENvcmVJUEM6
Ok1lc3NhZ2VDbGFzc1dlYlByb2Nlc3M+KCkpIHsKSW5kZXg6IFdlYktpdDIvV2ViUHJvY2Vzcy9X
ZWJQcm9jZXNzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlByb2Nlc3Mu
aAkocmV2aXNpb24gNzM1ODMpCisrKyBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUHJvY2Vzcy5oCSh3
b3JraW5nIGNvcHkpCkBAIC0xMjAsNiArMTIwLDcgQEAgcHJpdmF0ZToKIAogICAgIC8vIENvcmVJ
UEM6OkNvbm5lY3Rpb246OkNsaWVudAogICAgIHZvaWQgZGlkUmVjZWl2ZU1lc3NhZ2UoQ29yZUlQ
Qzo6Q29ubmVjdGlvbiosIENvcmVJUEM6Ok1lc3NhZ2VJRCwgQ29yZUlQQzo6QXJndW1lbnREZWNv
ZGVyKik7CisgICAgQ29yZUlQQzo6U3luY1JlcGx5TW9kZSBkaWRSZWNlaXZlU3luY01lc3NhZ2Uo
Q29yZUlQQzo6Q29ubmVjdGlvbiosIENvcmVJUEM6Ok1lc3NhZ2VJRCwgQ29yZUlQQzo6QXJndW1l
bnREZWNvZGVyKiwgQ29yZUlQQzo6QXJndW1lbnRFbmNvZGVyKik7CiAgICAgdm9pZCBkaWRDbG9z
ZShDb3JlSVBDOjpDb25uZWN0aW9uKik7CiAgICAgdm9pZCBkaWRSZWNlaXZlSW52YWxpZE1lc3Nh
Z2UoQ29yZUlQQzo6Q29ubmVjdGlvbiosIENvcmVJUEM6Ok1lc3NhZ2VJRCk7CiAKSW5kZXg6IFdl
YktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJFZGl0b3JDbGllbnQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJFZGl0b3JDbGll
bnQuY3BwCShyZXZpc2lvbiA3MzU4MykKKysrIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3Vw
cG9ydC9XZWJFZGl0b3JDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNzgsNiArMTc4LDcg
QEAgdm9pZCBXZWJFZGl0b3JDbGllbnQ6OnJlc3BvbmRUb0NoYW5nZWRDbwogICAgIG5vdEltcGxl
bWVudGVkKCk7CiB9CiAKKyNpZiAhUExBVEZPUk0oTUFDKQogdm9pZCBXZWJFZGl0b3JDbGllbnQ6
OnJlc3BvbmRUb0NoYW5nZWRTZWxlY3Rpb24oKQogewogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcg
V2ViVmlld0RpZENoYW5nZVNlbGVjdGlvbk5vdGlmaWNhdGlvbiA9ICJXZWJWaWV3RGlkQ2hhbmdl
U2VsZWN0aW9uTm90aWZpY2F0aW9uIjsKQEAgLTE4Nyw3ICsxODgsOCBAQCB2b2lkIFdlYkVkaXRv
ckNsaWVudDo6cmVzcG9uZFRvQ2hhbmdlZFNlCiAgICAgICAgIHJldHVybjsKICAgICBtX3BhZ2Ut
PnNlbmQoTWVzc2FnZXM6OldlYlBhZ2VQcm94eTo6RGlkU2VsZWN0aW9uQ2hhbmdlKGZyYW1lLT5z
ZWxlY3Rpb24oKS0+aXNOb25lKCksIGZyYW1lLT5zZWxlY3Rpb24oKS0+aXNDb250ZW50RWRpdGFi
bGUoKSwgZnJhbWUtPnNlbGVjdGlvbigpLT5pc0luUGFzc3dvcmRGaWVsZCgpLCBmcmFtZS0+ZWRp
dG9yKCktPmhhc0NvbXBvc2l0aW9uKCkpKTsKIH0KLQorI2VuZGlmCisgICAgCiB2b2lkIFdlYkVk
aXRvckNsaWVudDo6ZGlkRW5kRWRpdGluZygpCiB7CiAgICAgc3RhdGljIGNvbnN0IFN0cmluZyBX
ZWJWaWV3RGlkRW5kRWRpdGluZ05vdGlmaWNhdGlvbiA9ICJXZWJWaWV3RGlkRW5kRWRpdGluZ05v
dGlmaWNhdGlvbiI7CkluZGV4OiBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvbWFj
L1dlYkVkaXRvckNsaWVudE1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQyL1dlYlByb2Nlc3Mv
V2ViQ29yZVN1cHBvcnQvbWFjL1dlYkVkaXRvckNsaWVudE1hYy5tbQkocmV2aXNpb24gNzM1ODMp
CisrKyBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvbWFjL1dlYkVkaXRvckNsaWVu
dE1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtNDAsOCArNDAsMTAgQEAKICNpbmNsdWRlIDxXZWJD
b3JlL0RvY3VtZW50RnJhZ21lbnQuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0RPTURvY3VtZW50RnJh
Z21lbnRJbnRlcm5hbC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRE9NRG9jdW1lbnRJbnRlcm5hbC5o
PgorI2luY2x1ZGUgPFdlYkNvcmUvRm9jdXNDb250cm9sbGVyLmg+CiAjaW5jbHVkZSA8V2ViQ29y
ZS9GcmFtZS5oPgogI2luY2x1ZGUgPFdlYkNvcmUvS2V5Ym9hcmRFdmVudC5oPgorI2luY2x1ZGUg
PFdlYkNvcmUvUGFnZS5oPgogI2luY2x1ZGUgPFdlYktpdC9XZWJSZXNvdXJjZS5oPgogI2luY2x1
ZGUgPFdlYktpdC9XZWJOU1VSTEV4dHJhcy5oPgogI2lmICFkZWZpbmVkKEJVSUxESU5HX09OX1RJ
R0VSKSAmJiAhZGVmaW5lZChCVUlMRElOR19PTl9MRU9QQVJEKSAmJiAhZGVmaW5lZChCVUlMRElO
R19PTl9TTk9XX0xFT1BBUkQpCkBAIC02MSw2ICs2MywxOSBAQCAtIChXZWJDb3JlOjpBcmNoaXZl
UmVzb3VyY2UqKV9jb3JlUmVzb3VyCiAKIG5hbWVzcGFjZSBXZWJLaXQgewogCit2b2lkIFdlYkVk
aXRvckNsaWVudDo6cmVzcG9uZFRvQ2hhbmdlZFNlbGVjdGlvbigpCit7CisgICAgc3RhdGljIGNv
bnN0IFN0cmluZyBXZWJWaWV3RGlkQ2hhbmdlU2VsZWN0aW9uTm90aWZpY2F0aW9uID0gIldlYlZp
ZXdEaWRDaGFuZ2VTZWxlY3Rpb25Ob3RpZmljYXRpb24iOworICAgIG1fcGFnZS0+aW5qZWN0ZWRC
dW5kbGVFZGl0b3JDbGllbnQoKS5kaWRDaGFuZ2VTZWxlY3Rpb24obV9wYWdlLCBXZWJWaWV3RGlk
Q2hhbmdlU2VsZWN0aW9uTm90aWZpY2F0aW9uLmltcGwoKSk7CisgICAgV2ViQ29yZTo6RnJhbWUq
IGZyYW1lID0gbV9wYWdlLT5jb3JlUGFnZSgpLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZy
YW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgIHVpbnQ2NF90IGxv
Y2F0aW9uOworICAgIHVpbnQ2NF90IGxlbmd0aDsKKyAgICBXZWJQYWdlOjpjb252ZXJ0UmFuZ2VU
b1BsYXRmb3JtUmFuZ2UoZnJhbWUsIGZyYW1lLT5zZWxlY3Rpb24oKS0+dG9Ob3JtYWxpemVkUmFu
Z2UoKS5nZXQoKSwgbG9jYXRpb24sIGxlbmd0aCk7CisgICAgbV9wYWdlLT5zZW5kKE1lc3NhZ2Vz
OjpXZWJQYWdlUHJveHk6OkRpZFNlbGVjdGlvbkNoYW5nZShmcmFtZS0+c2VsZWN0aW9uKCktPmlz
Tm9uZSgpLCBmcmFtZS0+c2VsZWN0aW9uKCktPmlzQ29udGVudEVkaXRhYmxlKCksIGZyYW1lLT5z
ZWxlY3Rpb24oKS0+aXNJblBhc3N3b3JkRmllbGQoKSwgZnJhbWUtPmVkaXRvcigpLT5oYXNDb21w
b3NpdGlvbigpLCBsb2NhdGlvbiwgbGVuZ3RoKSk7Cit9CisgICAgCiB2b2lkIFdlYkVkaXRvckNs
aWVudDo6aGFuZGxlS2V5Ym9hcmRFdmVudChLZXlib2FyZEV2ZW50KiBldmVudCkKIHsKICAgICBp
ZiAobV9wYWdlLT5pbnRlcmNlcHRFZGl0aW5nS2V5Ym9hcmRFdmVudChldmVudCwgZmFsc2UpKQpJ
bmRleDogV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5jcHAJKHJldmlzaW9uIDczNTgz
KQorKysgV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTExMTAsNiArMTExMCwxMSBAQCB2b2lkIFdlYlBhZ2U6OmRpZFJlY2VpdmVNZXNzYWdl
KENvcmVJUEM6CiAgICAgZGlkUmVjZWl2ZVdlYlBhZ2VNZXNzYWdlKGNvbm5lY3Rpb24sIG1lc3Nh
Z2VJRCwgYXJndW1lbnRzKTsKIH0KIAorQ29yZUlQQzo6U3luY1JlcGx5TW9kZSBXZWJQYWdlOjpk
aWRSZWNlaXZlU3luY01lc3NhZ2UoQ29yZUlQQzo6Q29ubmVjdGlvbiogY29ubmVjdGlvbiwgQ29y
ZUlQQzo6TWVzc2FnZUlEIG1lc3NhZ2VJRCwgQ29yZUlQQzo6QXJndW1lbnREZWNvZGVyKiBhcmd1
bWVudHMsIENvcmVJUEM6OkFyZ3VtZW50RW5jb2RlciogcmVwbHkpCit7ICAgCisgICAgcmV0dXJu
IGRpZFJlY2VpdmVTeW5jV2ViUGFnZU1lc3NhZ2UoY29ubmVjdGlvbiwgbWVzc2FnZUlELCBhcmd1
bWVudHMsIHJlcGx5KTsKK30KKyAgICAKIEluamVjdGVkQnVuZGxlQmFja0ZvcndhcmRMaXN0KiBX
ZWJQYWdlOjpiYWNrRm9yd2FyZExpc3QoKQogewogICAgIGlmICghbV9iYWNrRm9yd2FyZExpc3Qp
CkluZGV4OiBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5oCShyZXZpc2lvbiA3MzU4MykK
KysrIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuaAkod29ya2luZyBjb3B5KQpA
QCAtMTM5LDYgKzEzOSw3IEBAIHB1YmxpYzoKIAogICAgIC8vIC0tIENhbGxlZCBmcm9tIFdlYlBy
b2Nlc3MuCiAgICAgdm9pZCBkaWRSZWNlaXZlTWVzc2FnZShDb3JlSVBDOjpDb25uZWN0aW9uKiwg
Q29yZUlQQzo6TWVzc2FnZUlELCBDb3JlSVBDOjpBcmd1bWVudERlY29kZXIqKTsKKyAgICBDb3Jl
SVBDOjpTeW5jUmVwbHlNb2RlIGRpZFJlY2VpdmVTeW5jTWVzc2FnZShDb3JlSVBDOjpDb25uZWN0
aW9uKiwgQ29yZUlQQzo6TWVzc2FnZUlELCBDb3JlSVBDOjpBcmd1bWVudERlY29kZXIqLCBDb3Jl
SVBDOjpBcmd1bWVudEVuY29kZXIqKTsKIAogICAgIC8vIC0tIEluamVjdGVkQnVuZGxlIG1ldGhv
ZHMKICAgICB2b2lkIGluaXRpYWxpemVJbmplY3RlZEJ1bmRsZUNvbnRleHRNZW51Q2xpZW50KFdL
QnVuZGxlUGFnZUNvbnRleHRNZW51Q2xpZW50Kik7CkBAIC0yMzUsNyArMjM2LDEzIEBAIHB1Ymxp
YzoKICAgICB9OwogCiAgICAgU2FuZGJveEV4dGVuc2lvblRyYWNrZXImIHNhbmRib3hFeHRlbnNp
b25UcmFja2VyKCkgeyByZXR1cm4gbV9zYW5kYm94RXh0ZW5zaW9uVHJhY2tlcjsgfQotCisjaWYg
UExBVEZPUk0oTUFDKQorICAgIHZvaWQgZ2V0TWFya2VkUmFuZ2UodWludDY0X3QmIGxvY2F0aW9u
LCB1aW50NjRfdCYgbGVuZ3RoKTsKKyAgICB2b2lkIGNoYXJhY3RlckluZGV4Rm9yUG9pbnQoY29u
c3QgV2ViQ29yZTo6SW50UG9pbnQgcG9pbnQsIHVpbnQ2NF90JiByZXN1bHQpOworICAgIHZvaWQg
Zmlyc3RSZWN0Rm9yQ2hhcmFjdGVyUmFuZ2UodWludDY0X3QgbG9jYXRpb24sIHVpbnQ2NF90IGxl
bmd0aCwgV2ViQ29yZTo6SW50UmVjdCYgcmVzdWx0UmVjdCk7CisgICAgc3RhdGljIHZvaWQgY29u
dmVydFJhbmdlVG9QbGF0Zm9ybVJhbmdlKFdlYkNvcmU6OkZyYW1lKiBmcmFtZSwgV2ViQ29yZTo6
UmFuZ2UgKnJhbmdlLCB1aW50NjRfdCYgbG9jYXRpb24sIHVpbnQ2NF90JiBsZW5ndGgpOworI2Vu
ZGlmCisgICAgCiBwcml2YXRlOgogICAgIFdlYlBhZ2UodWludDY0X3QgcGFnZUlELCBjb25zdCBX
ZWJQYWdlQ3JlYXRpb25QYXJhbWV0ZXJzJik7CiAKQEAgLTI0NCw2ICsyNTEsNyBAQCBwcml2YXRl
OgogICAgIHZvaWQgcGxhdGZvcm1Jbml0aWFsaXplKCk7CiAKICAgICB2b2lkIGRpZFJlY2VpdmVX
ZWJQYWdlTWVzc2FnZShDb3JlSVBDOjpDb25uZWN0aW9uKiwgQ29yZUlQQzo6TWVzc2FnZUlELCBD
b3JlSVBDOjpBcmd1bWVudERlY29kZXIqKTsKKyAgICBDb3JlSVBDOjpTeW5jUmVwbHlNb2RlIGRp
ZFJlY2VpdmVTeW5jV2ViUGFnZU1lc3NhZ2UoQ29yZUlQQzo6Q29ubmVjdGlvbiosIENvcmVJUEM6
Ok1lc3NhZ2VJRCwgQ29yZUlQQzo6QXJndW1lbnREZWNvZGVyKiwgQ29yZUlQQzo6QXJndW1lbnRF
bmNvZGVyKik7CiAKICAgICBzdGF0aWMgY29uc3QgY2hhciogaW50ZXJwcmV0S2V5RXZlbnQoY29u
c3QgV2ViQ29yZTo6S2V5Ym9hcmRFdmVudCopOwogICAgIGJvb2wgcGVyZm9ybURlZmF1bHRCZWhh
dmlvckZvcktleUV2ZW50KGNvbnN0IFdlYktleWJvYXJkRXZlbnQmKTsKSW5kZXg6IFdlYktpdDIv
V2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5tZXNzYWdlcy5pbgkocmV2aXNpb24gNzM1
ODMpCisrKyBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLm1lc3NhZ2VzLmluCSh3
b3JraW5nIGNvcHkpCkBAIC05Myw2ICs5Myw5IEBAIG1lc3NhZ2VzIC0+IFdlYlBhZ2UgewogI2lm
IFBMQVRGT1JNKE1BQykKICAgICBTZXRXaW5kb3dJc1Zpc2libGUoYm9vbCB3aW5kb3dJc1Zpc2li
bGUpCiAgICAgV2luZG93QW5kVmlld0ZyYW1lc0NoYW5nZWQoV2ViQ29yZTo6SW50UmVjdCB3aW5k
b3dGcmFtZUluU2NyZWVuQ29vcmRpbmF0ZXMsIFdlYkNvcmU6OkludFJlY3Qgdmlld0ZyYW1lSW5X
aW5kb3dDb29yZGluYXRlcykKKyAgICBHZXRNYXJrZWRSYW5nZSgpIC0+ICh1aW50NjRfdCBsb2Nh
dGlvbiwgdWludDY0X3QgbGVuZ3RoKQorICAgIENoYXJhY3RlckluZGV4Rm9yUG9pbnQoV2ViQ29y
ZTo6SW50UG9pbnQgcG9pbnQpIC0+ICh1aW50NjRfdCByZXN1bHQpCisgICAgRmlyc3RSZWN0Rm9y
Q2hhcmFjdGVyUmFuZ2UodWludDY0X3QgbG9jYXRpb24sIHVpbnQ2NF90IGxlbmd0aCkgLT4gKFdl
YkNvcmU6OkludFJlY3QgcmVzdWx0UmVjdCkKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oUVQpCklu
ZGV4OiBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvV2ViUGFnZU1hYy5tbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvV2ViUGFnZU1hYy5tbQkocmV2
aXNpb24gNzM1ODMpCisrKyBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvV2ViUGFnZU1h
Yy5tbQkod29ya2luZyBjb3B5KQpAQCAtMzMsOSArMzMsMTMgQEAKICNpbmNsdWRlIDxXZWJDb3Jl
L0RvY3VtZW50TG9hZGVyLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Gb2N1c0NvbnRyb2xsZXIuaD4K
ICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZVZpZXcu
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL0hpdFRlc3RSZXN1bHQuaD4KICNpbmNsdWRlIDxXZWJDb3Jl
L0tleWJvYXJkRXZlbnQuaD4KICNpbmNsdWRlIDxXZWJDb3JlL1BhZ2UuaD4KICNpbmNsdWRlIDxX
ZWJDb3JlL1BsYXRmb3JtS2V5Ym9hcmRFdmVudC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2Nyb2xs
Vmlldy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvVGV4dEl0ZXJhdG9yLmg+CiAjaW5jbHVkZSA8V2Vi
Q29yZS9XaW5kb3dzS2V5Ym9hcmRDb2Rlcy5oPgogCiB1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsK
QEAgLTY4LDEyICs3MiwzMSBAQCBib29sIFdlYlBhZ2U6OmludGVyY2VwdEVkaXRpbmdLZXlib2Fy
ZEV2CiAgICAgCiAgICAgYm9vbCBldmVudFdhc0hhbmRsZWQgPSBmYWxzZTsKICAgICAKLSAgICBp
ZiAoc2hvdWxkU2F2ZUNvbW1hbmQgJiYgIWhhc0tleXByZXNzQ29tbWFuZCkgewotICAgICAgICBW
ZWN0b3I8S2V5cHJlc3NDb21tYW5kPiBjb21tYW5kc0xpc3Q7ICAgICAgICAKLSAgICAgICAgaWYg
KCFXZWJQcm9jZXNzOjpzaGFyZWQoKS5jb25uZWN0aW9uKCktPnNlbmRTeW5jKE1lc3NhZ2VzOjpX
ZWJQYWdlUHJveHk6OkludGVycHJldEtleUV2ZW50KGtleUV2ZW50LT50eXBlKCkpLCBNZXNzYWdl
czo6V2ViUGFnZVByb3h5OjpJbnRlcnByZXRLZXlFdmVudDo6UmVwbHkoY29tbWFuZHNMaXN0KSwg
bV9wYWdlSUQpKQorICAgIGlmIChzaG91bGRTYXZlQ29tbWFuZCB8fCAhaGFzS2V5cHJlc3NDb21t
YW5kKSB7CisgICAgICAgIFZlY3RvcjxLZXlwcmVzc0NvbW1hbmQ+IGNvbW1hbmRzTGlzdDsgIAor
ICAgICAgICBWZWN0b3I8Q29tcG9zaXRpb25VbmRlcmxpbmU+IHVuZGVybGluZXM7CisgICAgICAg
IHVuc2lnbmVkIHN0YXJ0OworICAgICAgICB1bnNpZ25lZCBlbmQ7CisgICAgICAgIGlmICghV2Vi
UHJvY2Vzczo6c2hhcmVkKCkuY29ubmVjdGlvbigpLT5zZW5kU3luYyhNZXNzYWdlczo6V2ViUGFn
ZVByb3h5OjpJbnRlcnByZXRLZXlFdmVudChrZXlFdmVudC0+dHlwZSgpLCBmcmFtZS0+ZWRpdG9y
KCktPmhhc0NvbXBvc2l0aW9uKCkpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzOjpXZWJQYWdlUHJveHk6OkludGVycHJl
dEtleUV2ZW50OjpSZXBseShjb21tYW5kc0xpc3QsIHN0YXJ0LCBlbmQsIHVuZGVybGluZXMpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bV9wYWdlSUQsIENvcmVJUEM6OkNvbm5lY3Rpb246Ok5vVGltZW91dCkpCiAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tbWFuZHNMaXN0
LnNpemUoKTsgaSsrKQotICAgICAgICAgICAgZXZ0LT5rZXlwcmVzc0NvbW1hbmRzKCkuYXBwZW5k
KGNvbW1hbmRzTGlzdFtpXSk7CisgICAgICAgIGlmIChjb21tYW5kc0xpc3QuaXNFbXB0eSgpKQor
ICAgICAgICAgICAgcmV0dXJuIGV2ZW50V2FzSGFuZGxlZDsKKyAgICAgICAgCisgICAgICAgIGlm
IChjb21tYW5kc0xpc3RbMF0uY29tbWFuZE5hbWUgPT0gInNldE1hcmtlZFRleHQiKSB7CisgICAg
ICAgICAgICBmcmFtZS0+ZWRpdG9yKCktPnNldENvbXBvc2l0aW9uKGNvbW1hbmRzTGlzdFswXS50
ZXh0LCB1bmRlcmxpbmVzLCBzdGFydCwgZW5kKTsKKyAgICAgICAgICAgIGV2ZW50V2FzSGFuZGxl
ZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZHNMaXN0WzBdLmNvbW1hbmROYW1l
ID09ICJpbnNlcnRUZXh0IiAmJiBmcmFtZS0+ZWRpdG9yKCktPmhhc0NvbXBvc2l0aW9uKCkpIHsK
KyAgICAgICAgICAgIGZyYW1lLT5lZGl0b3IoKS0+Y29uZmlybUNvbXBvc2l0aW9uKGNvbW1hbmRz
TGlzdFswXS50ZXh0KTsKKyAgICAgICAgICAgIGV2ZW50V2FzSGFuZGxlZCA9IHRydWU7CisgICAg
ICAgIH0gZWxzZSBpZiAoY29tbWFuZHNMaXN0WzBdLmNvbW1hbmROYW1lID09ICJ1bm1hcmtUZXh0
IikgeworICAgICAgICAgICAgZnJhbWUtPmVkaXRvcigpLT5jb25maXJtQ29tcG9zaXRpb24oKTsK
KyAgICAgICAgICAgIGV2ZW50V2FzSGFuZGxlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbW1hbmRzTGlzdC5zaXplKCk7IGkr
KykKKyAgICAgICAgICAgICAgICBldnQtPmtleXByZXNzQ29tbWFuZHMoKS5hcHBlbmQoY29tbWFu
ZHNMaXN0W2ldKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHNpemVfdCBzaXpl
ID0gY29tbWFuZHMuc2l6ZSgpOwogICAgICAgICAvLyBBcmUgdGhlcmUgY29tbWFuZHMgdGhhdCB3
b3VsZCBqdXN0IGNhdXNlIHRleHQgaW5zZXJ0aW9uIGlmIGV4ZWN1dGVkIHZpYSBFZGl0b3I/CkBA
IC0xMDEsNiArMTI0LDEyMCBAQCBib29sIFdlYlBhZ2U6OmludGVyY2VwdEVkaXRpbmdLZXlib2Fy
ZEV2CiAgICAgcmV0dXJuIGV2ZW50V2FzSGFuZGxlZDsKIH0KIAordm9pZCBXZWJQYWdlOjpjb252
ZXJ0UmFuZ2VUb1BsYXRmb3JtUmFuZ2UoV2ViQ29yZTo6RnJhbWUqIGZyYW1lLCBXZWJDb3JlOjpS
YW5nZSAqcmFuZ2UsIHVpbnQ2NF90JiBsb2NhdGlvbiwgdWludDY0X3QmIGxlbmd0aCkKK3sKKyAg
ICBsb2NhdGlvbiA9IE5TTm90Rm91bmQ7CisgICAgbGVuZ3RoID0gMDsKKyAgICBpZiAoIXJhbmdl
IHx8ICFyYW5nZS0+c3RhcnRDb250YWluZXIoKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAK
KyAgICBFbGVtZW50KiBzZWxlY3Rpb25Sb290ID0gZnJhbWUtPnNlbGVjdGlvbigpLT5yb290RWRp
dGFibGVFbGVtZW50KCk7CisgICAgRWxlbWVudCogc2NvcGUgPSBzZWxlY3Rpb25Sb290ID8gc2Vs
ZWN0aW9uUm9vdCA6IGZyYW1lLT5kb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKTsKKyAgICAK
KyAgICAvLyBNb3VzZSBldmVudHMgbWF5IGNhdXNlIFRTTSB0byBhdHRlbXB0IHRvIGNyZWF0ZSBh
biBOU1JhbmdlIGZvciBhIHBvcnRpb24gb2YgdGhlIHZpZXcKKyAgICAvLyB0aGF0IGlzIG5vdCBp
bnNpZGUgdGhlIGN1cnJlbnQgZWRpdGFibGUgcmVnaW9uLiAgVGhlc2UgY2hlY2tzIGVuc3VyZSB3
ZSBkb24ndCBwcm9kdWNlCisgICAgLy8gcG90ZW50aWFsbHkgaW52YWxpZCBkYXRhIHdoZW4gcmVz
cG9uZGluZyB0byBzdWNoIHJlcXVlc3RzLgorICAgIGlmIChyYW5nZS0+c3RhcnRDb250YWluZXIo
KSAhPSBzY29wZSAmJiAhcmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCktPmlzRGVzY2VuZGFudE9mKHNj
b3BlKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChyYW5nZS0+ZW5kQ29udGFpbmVyKCkgIT0g
c2NvcGUgJiYgIXJhbmdlLT5lbmRDb250YWluZXIoKS0+aXNEZXNjZW5kYW50T2Yoc2NvcGUpKQor
ICAgICAgICByZXR1cm47CisgICAgICAgICAgICAKKyAgICBSZWZQdHI8UmFuZ2U+IHRlc3RSYW5n
ZSA9IFJhbmdlOjpjcmVhdGUoc2NvcGUtPmRvY3VtZW50KCksIHNjb3BlLCAwLCByYW5nZS0+c3Rh
cnRDb250YWluZXIoKSwgcmFuZ2UtPnN0YXJ0T2Zmc2V0KCkpOworICAgIEFTU0VSVCh0ZXN0UmFu
Z2UtPnN0YXJ0Q29udGFpbmVyKCkgPT0gc2NvcGUpOworICAgIGxvY2F0aW9uID0gVGV4dEl0ZXJh
dG9yOjpyYW5nZUxlbmd0aCh0ZXN0UmFuZ2UuZ2V0KCkpOworICAgICAgICAgICAgCisgICAgRXhj
ZXB0aW9uQ29kZSBlYzsKKyAgICB0ZXN0UmFuZ2UtPnNldEVuZChyYW5nZS0+ZW5kQ29udGFpbmVy
KCksIHJhbmdlLT5lbmRPZmZzZXQoKSwgZWMpOworICAgIEFTU0VSVCh0ZXN0UmFuZ2UtPnN0YXJ0
Q29udGFpbmVyKCkgPT0gc2NvcGUpOworICAgIGxlbmd0aCA9IFRleHRJdGVyYXRvcjo6cmFuZ2VM
ZW5ndGgodGVzdFJhbmdlLmdldCgpKSAtIGxvY2F0aW9uOworfQorICAgIAordm9pZCBXZWJQYWdl
OjpnZXRNYXJrZWRSYW5nZSh1aW50NjRfdCYgbG9jYXRpb24sIHVpbnQ2NF90JiBsZW5ndGgpCit7
CisgICAgbG9jYXRpb24gPSBOU05vdEZvdW5kOworICAgIGxlbmd0aCA9IDA7CisgICAgRnJhbWUq
IGZyYW1lID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7
CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGNvbnZlcnRSYW5n
ZVRvUGxhdGZvcm1SYW5nZShmcmFtZSwgZnJhbWUtPmVkaXRvcigpLT5jb21wb3NpdGlvblJhbmdl
KCkuZ2V0KCksIGxvY2F0aW9uLCBsZW5ndGgpOworfQorCitzdGF0aWMgUmFuZ2UgKmNoYXJhY3Rl
clJhbmdlQXRQb2ludChGcmFtZSogZnJhbWUsIGNvbnN0IEludFBvaW50IHBvaW50KQoreworICAg
IFZpc2libGVQb3NpdGlvbiBwb3NpdGlvbiA9IGZyYW1lLT52aXNpYmxlUG9zaXRpb25Gb3JQb2lu
dChwb2ludCk7CisgICAgaWYgKHBvc2l0aW9uLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gTlVM
TDsKKyAgICAKKyAgICBWaXNpYmxlUG9zaXRpb24gcHJldmlvdXMgPSBwb3NpdGlvbi5wcmV2aW91
cygpOworICAgIGlmIChwcmV2aW91cy5pc05vdE51bGwoKSkgeworICAgICAgICBSYW5nZSAqcHJl
dmlvdXNDaGFyYWN0ZXJSYW5nZSA9IG1ha2VSYW5nZShwcmV2aW91cywgcG9zaXRpb24pLmdldCgp
OworICAgICAgICBOU1JlY3QgcmVjdCA9IGZyYW1lLT5lZGl0b3IoKS0+Zmlyc3RSZWN0Rm9yUmFu
Z2UocHJldmlvdXNDaGFyYWN0ZXJSYW5nZSk7CisgICAgICAgIGlmIChOU1BvaW50SW5SZWN0KHBv
aW50LCByZWN0KSkKKyAgICAgICAgICAgIHJldHVybiBwcmV2aW91c0NoYXJhY3RlclJhbmdlOwor
ICAgIH0KKyAgICAKKyAgICBWaXNpYmxlUG9zaXRpb24gbmV4dCA9IHBvc2l0aW9uLm5leHQoKTsK
KyAgICBpZiAobmV4dC5pc05vdE51bGwoKSkgeworICAgICAgICBSYW5nZSAqbmV4dENoYXJhY3Rl
clJhbmdlID0gbWFrZVJhbmdlKHBvc2l0aW9uLCBuZXh0KS5nZXQoKTsKKyAgICAgICAgTlNSZWN0
IHJlY3QgPSBmcmFtZS0+ZWRpdG9yKCktPmZpcnN0UmVjdEZvclJhbmdlKG5leHRDaGFyYWN0ZXJS
YW5nZSk7CisgICAgICAgIGlmIChOU1BvaW50SW5SZWN0KHBvaW50LCByZWN0KSkKKyAgICAgICAg
ICAgIHJldHVybiBuZXh0Q2hhcmFjdGVyUmFuZ2U7CisgICAgfQorICAgIAorICAgIHJldHVybiBO
VUxMOworfQorICAgIAordm9pZCBXZWJQYWdlOjpjaGFyYWN0ZXJJbmRleEZvclBvaW50KEludFBv
aW50IHBvaW50LCB1aW50NjRfdCYgaW5kZXgpCit7CisgICAgaW5kZXggPSBOU05vdEZvdW5kOwor
ICAgIEZyYW1lKiBmcmFtZSA9IG1fcGFnZS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBmcmFtZS0+ZXZl
bnRIYW5kbGVyKCktPmhpdFRlc3RSZXN1bHRBdFBvaW50KHBvaW50LCBmYWxzZSk7CisgICAgZnJh
bWUgPSByZXN1bHQuaW5uZXJOb25TaGFyZWROb2RlKCkgPyByZXN1bHQuaW5uZXJOb25TaGFyZWRO
b2RlKCktPmRvY3VtZW50KCktPmZyYW1lKCkgOiBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5m
b2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICAKKyAgICBSYW5nZSAqcmFuZ2UgPSBjaGFyYWN0ZXJS
YW5nZUF0UG9pbnQoZnJhbWUsIHJlc3VsdC5wb2ludCgpKTsKKyAgICB1aW50NjRfdCBsZW5ndGg7
CisgICAgaWYgKHJhbmdlKQorICAgICAgICBjb252ZXJ0UmFuZ2VUb1BsYXRmb3JtUmFuZ2UoZnJh
bWUsIHJhbmdlLCBpbmRleCwgbGVuZ3RoKTsKK30KKworc3RhdGljIFBhc3NSZWZQdHI8UmFuZ2U+
IGNvbnZlcnRUb1JhbmdlKEZyYW1lKiBmcmFtZSwgTlNSYW5nZSBuc3JhbmdlKQoreworICAgIGlm
IChuc3JhbmdlLmxvY2F0aW9uID4gSU5UX01BWCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYg
KG5zcmFuZ2UubGVuZ3RoID4gSU5UX01BWCB8fCBuc3JhbmdlLmxvY2F0aW9uICsgbnNyYW5nZS5s
ZW5ndGggPiBJTlRfTUFYKQorICAgICAgICBuc3JhbmdlLmxlbmd0aCA9IElOVF9NQVggLSBuc3Jh
bmdlLmxvY2F0aW9uOworICAgICAgICAKKyAgICAvLyBvdXIgY3JpdGljYWwgYXNzdW1wdGlvbiBp
cyB0aGF0IHdlIGFyZSBvbmx5IGNhbGxlZCBieSBpbnB1dCBtZXRob2RzIHRoYXQKKyAgICAvLyBj
b25jZW50cmF0ZSBvbiBhIGdpdmVuIGFyZWEgY29udGFpbmluZyB0aGUgc2VsZWN0aW9uCisgICAg
Ly8gV2UgaGF2ZSB0byBkbyB0aGlzIGJlY2F1c2Ugb2YgdGV4dCBmaWVsZHMgYW5kIHRleHRhcmVh
cy4gVGhlIERPTSBmb3IgdGhvc2UgaXMgbm90CisgICAgLy8gZGlyZWN0bHkgaW4gdGhlIGRvY3Vt
ZW50IERPTSwgc28gc2VyaWFsaXphdGlvbiBpcyBwcm9ibGVtYXRpYy4gT3VyIHNvbHV0aW9uIGlz
CisgICAgLy8gdG8gdXNlIHRoZSByb290IGVkaXRhYmxlIGVsZW1lbnQgb2YgdGhlIHNlbGVjdGlv
biBzdGFydCBhcyB0aGUgcG9zaXRpb25hbCBiYXNlLgorICAgIC8vIFRoYXQgZml0cyB3aXRoIEFw
cEtpdCdzIGlkZWEgb2YgYW4gaW5wdXQgY29udGV4dC4KKyAgICBFbGVtZW50KiBzZWxlY3Rpb25S
b290ID0gZnJhbWUtPnNlbGVjdGlvbigpLT5yb290RWRpdGFibGVFbGVtZW50KCk7CisgICAgRWxl
bWVudCogc2NvcGUgPSBzZWxlY3Rpb25Sb290ID8gc2VsZWN0aW9uUm9vdCA6IGZyYW1lLT5kb2N1
bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKTsKKyAgICByZXR1cm4gVGV4dEl0ZXJhdG9yOjpyYW5n
ZUZyb21Mb2NhdGlvbkFuZExlbmd0aChzY29wZSwgbnNyYW5nZS5sb2NhdGlvbiwgbnNyYW5nZS5s
ZW5ndGgpOworfQorICAgIAordm9pZCBXZWJQYWdlOjpmaXJzdFJlY3RGb3JDaGFyYWN0ZXJSYW5n
ZSh1aW50NjRfdCBsb2NhdGlvbiwgdWludDY0X3QgbGVuZ3RoLCBXZWJDb3JlOjpJbnRSZWN0JiBy
ZXN1bHRSZWN0KQoreworICAgIEZyYW1lKiBmcmFtZSA9IG1fcGFnZS0+Zm9jdXNDb250cm9sbGVy
KCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIHJlc3VsdFJlY3Quc2V0TG9jYXRpb24oSW50
UG9pbnQoMCwgMCkpOworICAgIHJlc3VsdFJlY3Quc2V0U2l6ZShJbnRTaXplKDAsIDApKTsKKyAg
ICAKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlID0gY29udmVydFRvUmFuZ2UoZnJhbWUsIE5TTWFr
ZVJhbmdlKGxvY2F0aW9uLCBsZW5ndGgpKTsKKyAgICBpZiAocmFuZ2UpIHsKKyAgICAgICAgQVNT
RVJUKHJhbmdlLT5zdGFydENvbnRhaW5lcigpKTsKKyAgICAgICAgQVNTRVJUKHJhbmdlLT5lbmRD
b250YWluZXIoKSk7CisgICAgfQorICAgICAKKyAgICBJbnRSZWN0IHJlY3QgPSBmcmFtZS0+ZWRp
dG9yKCktPmZpcnN0UmVjdEZvclJhbmdlKHJhbmdlLmdldCgpKTsKKyAgICByZXN1bHRSZWN0ID0g
ZnJhbWUtPnZpZXcoKS0+Y29udGVudHNUb1dpbmRvdyhyZWN0KTsKK30KKwogc3RhdGljIGlubGlu
ZSB2b2lkIHNjcm9sbChQYWdlKiBwYWdlLCBTY3JvbGxEaXJlY3Rpb24gZGlyZWN0aW9uLCBTY3Jv
bGxHcmFudWxhcml0eSBncmFudWxhcml0eSkKIHsKICAgICBwYWdlLT5mb2N1c0NvbnRyb2xsZXIo
KS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPmV2ZW50SGFuZGxlcigpLT5zY3JvbGxSZWN1cnNpdmVs
eShkaXJlY3Rpb24sIGdyYW51bGFyaXR5KTsK
</data>
<flag name="review"
          id="67008"
          type_id="1"
          status="+"
          setter="ap"
    />
          </attachment>
      

    </bug>

</bugzilla>