<?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>77992</bug_id>
          
          <creation_ts>2012-02-07 08:35:24 -0800</creation_ts>
          <short_desc>Initial upstreaming of input handling for BlackBerry port</short_desc>
          <delta_ts>2012-02-08 09:01:56 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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>73144</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Nima Ghanavatian">nima.ghanavatian</reporter>
          <assigned_to name="Nima Ghanavatian">nima.ghanavatian</assigned_to>
          <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>551015</commentid>
    <comment_count>0</comment_count>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-07 08:35:24 -0800</bug_when>
    <thetext>This is the initial upstreaming of InputHandler.cpp and InputHandler.h for the BlackBerry port.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551018</commentid>
    <comment_count>1</comment_count>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-07 08:38:05 -0800</bug_when>
    <thetext>blocks master bug 73144</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551030</commentid>
    <comment_count>2</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-07 08:54:49 -0800</bug_when>
    <thetext>Assign to Nima.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551199</commentid>
    <comment_count>3</comment_count>
      <attachid>125892</attachid>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-07 11:54:42 -0800</bug_when>
    <thetext>Created attachment 125892
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551264</commentid>
    <comment_count>4</comment_count>
      <attachid>125892</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-07 12:57:51 -0800</bug_when>
    <thetext>Comment on attachment 125892
Patch

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

Looks good, but still needs some cleanup.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:2
&gt; + * Copyright (C) 2009, 2010, 2011 Research In Motion Limited. All rights reserved.

Need to add 2012.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:176
&gt; +

Don&apos;t need the empty line.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:218
&gt; +        return InputTypeTextArea;

This looks a bit strange since right after we always return InputTypeTextArea. Maybe better to update the comment below and remove the if.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:368
&gt; +

Extra empty line maybe not needed.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:371
&gt; +    textInField = textInField.substring(std::max(0, (int)textInField.length() - MaxLearnTextDataSize), textInField.length());

can use static_cast&lt;int&gt; here.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:388
&gt; +

Why the empty line?

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:583
&gt; +    WebCore::IntRect actualScreenRect = WebCore::IntRect(mainFrameView-&gt;scrollPosition(), m_webPage-&gt;actualVisibleSize());

Can be moved into the if section.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:1154
&gt; +        bool* selecteds = 0;

Strange name again.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:1405
&gt; +    extractedText-&gt;text = spannableTextInRange(0, elementText().length(), flags);

Too many empty lines IMHO.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:1501
&gt; +    // Remove all markers.

Maybe not needed.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.cpp:1677
&gt; +        // the start of the inserted texted.

texted?

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.h:2
&gt; + * Copyright (C) 2009, 2010, 2011 Research In Motion Limited. All rights reserved.

Need to add 2012

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.h:41
&gt; +class VisibleSelection;

I dont think you need the above two.

&gt; Source/WebKit/blackberry/WebKitSupport/InputHandler.h:96
&gt; +    void setPopupListIndexes(int size, bool* selecteds);

Not so nice param name selecteds</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551555</commentid>
    <comment_count>5</comment_count>
      <attachid>125955</attachid>
    <who name="Nima Ghanavatian">nima.ghanavatian</who>
    <bug_when>2012-02-07 16:50:10 -0800</bug_when>
    <thetext>Created attachment 125955
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552153</commentid>
    <comment_count>6</comment_count>
      <attachid>125955</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-08 08:41:51 -0800</bug_when>
    <thetext>Comment on attachment 125955
Patch

Looks great.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552179</commentid>
    <comment_count>7</comment_count>
      <attachid>125955</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-08 09:01:50 -0800</bug_when>
    <thetext>Comment on attachment 125955
Patch

Clearing flags on attachment: 125955

Committed r107095: &lt;http://trac.webkit.org/changeset/107095&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552180</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-08 09:01:56 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125892</attachid>
            <date>2012-02-07 11:54:42 -0800</date>
            <delta_ts>2012-02-07 16:50:06 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77992-20120207145215.patch</filename>
            <type>text/plain</type>
            <size>73012</size>
            <attacher name="Nima Ghanavatian">nima.ghanavatian</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2NjgxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDZmYzlhZGY3YTBiZjM4NDI4
MjI4ZTdjNjM2YWY3NzJiYzU3MTE0MzYuLmM1MWQ2NzZhZGVlMzZlYmZiYWIyNWNmZmUxNjU0Y2E3
NjMxMDQxN2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTItMDItMDcgIE5pbWEgR2hh
bmF2YXRpYW4gIDxuZ2hhbmF2YXRpYW5AcmltLmNvbT4KKworICAgICAgICBJbml0aWFsIHVwc3Ry
ZWFtaW5nIG9mIGlucHV0IGhhbmRsaW5nIGZvciBCbGFja0JlcnJ5IHBvcnQKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTkyCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1
cHBvcnQvSW5wdXRIYW5kbGVyLmNwcDogQWRkZWQuCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJL
aXRTdXBwb3J0L0lucHV0SGFuZGxlci5oOiBBZGRlZC4KKwogMjAxMi0wMS0xMSAgSmFja3kgSmlh
bmcgIDx6aGFqaWFuZ0ByaW0uY29tPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XSBBU1NFUlQgZmFp
bHVyZSBpbiBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRlbnRzKCkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L0lucHV0SGFuZGxl
ci5jcHAgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9JbnB1dEhhbmRs
ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmIwYjRlNGYxMTg1YzA4MGVjYTQ3ZDRhNzlkODJlZjBhNjdlMTIy
OTMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3Vw
cG9ydC9JbnB1dEhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsMTc0OCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3
YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiSW5wdXRIYW5kbGVyLmgiCisKKyNpbmNsdWRlICJCYWNraW5nU3RvcmUuaCIK
KyNpbmNsdWRlICJCYWNraW5nU3RvcmVDbGllbnQuaCIKKyNpbmNsdWRlICJDU1NTdHlsZURlY2xh
cmF0aW9uLmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkNocm9tZS5oIgorI2lu
Y2x1ZGUgIkRPTVN1cHBvcnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkRv
Y3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmgiCisj
aW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRl
ICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5jbHVkZSAi
SFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTE9wdEdyb3VwRWxlbWVudC5oIgorI2luY2x1ZGUg
IkhUTUxPcHRpb25FbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFNlbGVjdEVsZW1lbnQuaCIKKyNp
bmNsdWRlICJIVE1MVGV4dEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQu
aCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2ZW50Lmgi
CisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlJhbmdlLmgiCisjaW5jbHVkZSAi
UmVuZGVyTGF5ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJNZW51TGlzdC5oIgorI2luY2x1ZGUgIlJl
bmRlclBhcnQuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisjaW5jbHVkZSAiUmVuZGVyVGV4
dENvbnRyb2wuaCIKKyNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIKKyNpbmNsdWRlICJTY29wZVBv
aW50ZXIuaCIKKyNpbmNsdWRlICJTZWxlY3Rpb25IYW5kbGVyLmgiCisjaW5jbHVkZSAiVGV4dEl0
ZXJhdG9yLmgiCisjaW5jbHVkZSAiV2ViUGFnZUNsaWVudC5oIgorI2luY2x1ZGUgIldlYlBhZ2Vf
cC5oIgorI2luY2x1ZGUgIldlYlNldHRpbmdzLmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxh
dGZvcm1LZXlib2FyZEV2ZW50Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTWlzYy5o
PgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVNldHRpbmdzLmg+CisjaW5jbHVkZSA8aW1m
L2V2ZW50cy5oPgorI2luY2x1ZGUgPHN5cy9rZXljb2Rlcy5oPgorCisjZGVmaW5lIEVOQUJMRV9J
TlBVVF9MT0cgMAorI2RlZmluZSBFTkFCTEVfRk9DVVNfTE9HIDAKKworI2lmIEVOQUJMRV9JTlBV
VF9MT0cKKyNkZWZpbmUgSW5wdXRMb2coc2V2ZXJpdHksIGZvcm1hdCwgLi4uKSBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKHNldmVyaXR5LCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQor
I2Vsc2UKKyNkZWZpbmUgSW5wdXRMb2coc2V2ZXJpdHksIGZvcm1hdCwgLi4uKQorI2VuZGlmIC8v
IEVOQUJMRV9JTlBVVF9MT0cKKworI2lmIEVOQUJMRV9GT0NVU19MT0cKKyNkZWZpbmUgRm9jdXNM
b2coc2V2ZXJpdHksIGZvcm1hdCwgLi4uKSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlz
KHNldmVyaXR5LCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgRm9jdXNM
b2coc2V2ZXJpdHksIGZvcm1hdCwgLi4uKQorI2VuZGlmIC8vIEVOQUJMRV9GT0NVU19MT0cKKwor
c3RhdGljIGNvbnN0IGludCBNYXhMZWFyblRleHREYXRhU2l6ZSA9IDUwMDsKKwordXNpbmcgbmFt
ZXNwYWNlIEJsYWNrQmVycnk6OlBsYXRmb3JtOwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisK
K25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBQcm9j
ZXNzaW5nQ2hhbmdlR3VhcmQgeworcHVibGljOgorICAgIFByb2Nlc3NpbmdDaGFuZ2VHdWFyZChJ
bnB1dEhhbmRsZXIqIGlucHV0SGFuZGxlcikKKyAgICAgICAgOiBtX2lucHV0SGFuZGxlcihpbnB1
dEhhbmRsZXIpCisgICAgICAgICwgbV9zYXZlZFByb2Nlc3NpbmdDaGFuZ2UoZmFsc2UpCisgICAg
eworICAgICAgICBBU1NFUlQobV9pbnB1dEhhbmRsZXIpOworCisgICAgICAgIG1fc2F2ZWRQcm9j
ZXNzaW5nQ2hhbmdlID0gbV9pbnB1dEhhbmRsZXItPnByb2Nlc3NpbmdDaGFuZ2UoKTsKKyAgICAg
ICAgbV9pbnB1dEhhbmRsZXItPnNldFByb2Nlc3NpbmdDaGFuZ2UodHJ1ZSk7CisgICAgfQorCisg
ICAgflByb2Nlc3NpbmdDaGFuZ2VHdWFyZCgpCisgICAgeworICAgICAgICBtX2lucHV0SGFuZGxl
ci0+c2V0UHJvY2Vzc2luZ0NoYW5nZShtX3NhdmVkUHJvY2Vzc2luZ0NoYW5nZSk7CisgICAgfQor
Citwcml2YXRlOgorICAgIElucHV0SGFuZGxlciogbV9pbnB1dEhhbmRsZXI7CisgICAgYm9vbCBt
X3NhdmVkUHJvY2Vzc2luZ0NoYW5nZTsKK307CisKK0lucHV0SGFuZGxlcjo6SW5wdXRIYW5kbGVy
KFdlYlBhZ2VQcml2YXRlKiBwYWdlKQorICAgIDogbV93ZWJQYWdlKHBhZ2UpCisgICAgLCBtX2N1
cnJlbnRGb2N1c0VsZW1lbnQoMCkKKyAgICAsIG1fcHJvY2Vzc2luZ0NoYW5nZShmYWxzZSkKKyAg
ICAsIG1fbmF2aWdhdGlvbk1vZGUoZmFsc2UpCisgICAgLCBtX2N1cnJlbnRGb2N1c0VsZW1lbnRU
eXBlKFRleHRFZGl0KQorICAgICwgbV9jdXJyZW50Rm9jdXNFbGVtZW50VGV4dEVkaXRNYXNrKERF
RkFVTFRfU1RZTEUpCisgICAgLCBtX2NvbXBvc2luZ1RleHRTdGFydCgwKQorICAgICwgbV9jb21w
b3NpbmdUZXh0RW5kKDApCit7Cit9CisKK0lucHV0SGFuZGxlcjo6fklucHV0SGFuZGxlcigpCit7
Cit9CisKK3N0YXRpYyBCbGFja0JlcnJ5SW5wdXRUeXBlIGNvbnZlcnRJbnB1dFR5cGUoY29uc3Qg
SFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtZW50KQoreworICAgIGlmIChpbnB1dEVsZW1lbnQt
PmlzUGFzc3dvcmRGaWVsZCgpKQorICAgICAgICByZXR1cm4gSW5wdXRUeXBlUGFzc3dvcmQ7Cisg
ICAgaWYgKGlucHV0RWxlbWVudC0+aXNTZWFyY2hGaWVsZCgpKQorICAgICAgICByZXR1cm4gSW5w
dXRUeXBlU2VhcmNoOworICAgIGlmIChpbnB1dEVsZW1lbnQtPmlzRW1haWxGaWVsZCgpKQorICAg
ICAgICByZXR1cm4gSW5wdXRUeXBlRW1haWw7CisgICAgaWYgKGlucHV0RWxlbWVudC0+aXNNb250
aENvbnRyb2woKSkKKyAgICAgICAgcmV0dXJuIElucHV0VHlwZU1vbnRoOworICAgIGlmIChpbnB1
dEVsZW1lbnQtPmlzTnVtYmVyRmllbGQoKSkKKyAgICAgICAgcmV0dXJuIElucHV0VHlwZU51bWJl
cjsKKyAgICBpZiAoaW5wdXRFbGVtZW50LT5pc1RlbGVwaG9uZUZpZWxkKCkpCisgICAgICAgIHJl
dHVybiBJbnB1dFR5cGVUZWxlcGhvbmU7CisgICAgaWYgKGlucHV0RWxlbWVudC0+aXNVUkxGaWVs
ZCgpKQorICAgICAgICByZXR1cm4gSW5wdXRUeXBlVVJMOworI2lmIEVOQUJMRShJTlBVVF9DT0xP
UikKKyAgICBpZiAoaW5wdXRFbGVtZW50LT5pc0NvbG9yQ29udHJvbCgpKQorICAgICAgICByZXR1
cm4gSW5wdXRUeXBlQ29sb3I7CisjZW5kaWYKKyAgICBpZiAoaW5wdXRFbGVtZW50LT5pc0RhdGVD
b250cm9sKCkpCisgICAgICAgIHJldHVybiBJbnB1dFR5cGVEYXRlOworICAgIGlmIChpbnB1dEVs
ZW1lbnQtPmlzRGF0ZVRpbWVDb250cm9sKCkpCisgICAgICAgIHJldHVybiBJbnB1dFR5cGVEYXRl
VGltZTsKKyAgICBpZiAoaW5wdXRFbGVtZW50LT5pc0RhdGVUaW1lTG9jYWxDb250cm9sKCkpCisg
ICAgICAgIHJldHVybiBJbnB1dFR5cGVEYXRlVGltZUxvY2FsOworICAgIGlmIChpbnB1dEVsZW1l
bnQtPmlzVGltZUNvbnRyb2woKSkKKyAgICAgICAgcmV0dXJuIElucHV0VHlwZVRpbWU7CisgICAg
Ly8gRklYTUU6IG1pc3NpbmcgV0VFSyBwb3B1cCBzZWxlY3RvcgorCisgICAgcmV0dXJuIElucHV0
VHlwZVRleHQ7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRTdHlsZShCbGFja0JlcnJ5SW5wdXRUeXBl
IHR5cGUsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgc3dpdGNoICh0eXBlKSB7Cisg
ICAgY2FzZSBJbnB1dFR5cGVUZXh0OgorICAgIGNhc2UgSW5wdXRUeXBlU2VhcmNoOgorICAgICAg
ICB7CisgICAgICAgICAgICAvLyBSZWd1bGFyIGlucHV0IG1vZGUsIGRpc2FibGUgaGVscCBpZiBh
dXRvY29tcGxldGUgaXMgb2ZmLgorICAgICAgICAgICAgaW50IGltZk1hc2sgPSAwOworICAgICAg
ICAgICAgaWYgKERPTVN1cHBvcnQ6OmVsZW1lbnRTdXBwb3J0c0F1dG9jb21wbGV0ZShlbGVtZW50
KSA9PSBET01TdXBwb3J0OjpPZmYpCisgICAgICAgICAgICAgICAgaW1mTWFzayA9IE5PX0FVVE9f
VEVYVCB8IE5PX1BSRURJQ1RJT047CisgICAgICAgICAgICBlbHNlIGlmIChET01TdXBwb3J0Ojpl
bGVtZW50U3VwcG9ydHNBdXRvY29tcGxldGUoZWxlbWVudCkgIT0gRE9NU3VwcG9ydDo6T24KKyAg
ICAgICAgICAgICAgICAgICAgICYmIERPTVN1cHBvcnQ6OmVsZW1lbnRJZE9yTmFtZUluZGljYXRl
c05vQXV0b2NvbXBsZXRlKGVsZW1lbnQpKQorICAgICAgICAgICAgICAgIGltZk1hc2sgPSBOT19B
VVRPX1RFWFQgfCBOT19QUkVESUNUSU9OOworCisgICAgICAgICAgICAvLyBEaXNhYmxlIGF1dG9j
b3JyZWN0aW9uIGlmIGl0J3Mgc3BlY2lmaWNhbGx5IG9mZiwgb2YgaWYgaXQgaXMgaW4gZGVmYXVs
dCBtb2RlCisgICAgICAgICAgICAvLyBhbmQgd2UgaGF2ZSBkaXNhYmxlZCBhdXRvIHRleHQgYW5k
IHByZWRpY3Rpb24uCisgICAgICAgICAgICBpZiAoRE9NU3VwcG9ydDo6ZWxlbWVudFN1cHBvcnRz
QXV0b2NvcnJlY3QoZWxlbWVudCkgPT0gRE9NU3VwcG9ydDo6T2ZmCisgICAgICAgICAgICAgICAg
fHwgKGltZk1hc2sgJiYgRE9NU3VwcG9ydDo6ZWxlbWVudFN1cHBvcnRzQXV0b2NvcnJlY3QoZWxl
bWVudCkgPT0gRE9NU3VwcG9ydDo6RGVmYXVsdCkpCisKKyAgICAgICAgICAgICAgICBpbWZNYXNr
IHw9IE5PX0FVVE9fQ09SUkVDVElPTjsKKworICAgICAgICAgICAgaWYgKGltZk1hc2spCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGltZk1hc2s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgIGNhc2UgSW5wdXRUeXBlSXNJbmRleDoKKyAgICBjYXNlIElucHV0VHlwZVBhc3N3b3Jk
OgorICAgIGNhc2UgSW5wdXRUeXBlRW1haWw6CisgICAgY2FzZSBJbnB1dFR5cGVOdW1iZXI6Cisg
ICAgY2FzZSBJbnB1dFR5cGVUZWxlcGhvbmU6CisgICAgY2FzZSBJbnB1dFR5cGVVUkw6CisgICAg
ICAgIC8vIERpc2FibGUgc3BlY2lhbCBoYW5kbGluZy4KKyAgICAgICAgcmV0dXJuIE5PX0FVVE9f
VEVYVCB8IE5PX1BSRURJQ1RJT04gfCBOT19BVVRPX0NPUlJFQ1RJT047CisgICAgY2FzZSBJbnB1
dFR5cGVUZXh0QXJlYToKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAg
cmV0dXJuIERFRkFVTFRfU1RZTEU7Cit9CisKK1dURjo6U3RyaW5nIElucHV0SGFuZGxlcjo6ZWxl
bWVudFRleHQoKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1
cm4gV1RGOjpTdHJpbmcoKTsKKworICAgIHJldHVybiBET01TdXBwb3J0OjppbnB1dEVsZW1lbnRU
ZXh0KG1fY3VycmVudEZvY3VzRWxlbWVudC5nZXQoKSk7Cit9CisKK0JsYWNrQmVycnlJbnB1dFR5
cGUgSW5wdXRIYW5kbGVyOjplbGVtZW50VHlwZShFbGVtZW50KiBlbGVtZW50KSBjb25zdAorewor
ICAgIC8vIDxpc0luZGV4PiBpcyBidW5kbGVkIHdpdGggaW5wdXQgc28gd2UgbmVlZCB0byBjaGVj
ayB0aGUgZm9ybUNvbnRyb2xOYW1lCisgICAgLy8gZmlyc3QgdG8gZGlmZmVyZW50aWF0ZSBpdCBm
cm9tIGlucHV0IHdoaWNoIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzCisgICAgLy8gaXNJbmRl
eCBoYXMgYmVlbiBkZXByZWNhdGVkLgorICAgIGlmIChlbGVtZW50LT5mb3JtQ29udHJvbE5hbWUo
KSA9PSBIVE1MTmFtZXM6OmlzaW5kZXhUYWcpCisgICAgICAgIHJldHVybiBJbnB1dFR5cGVJc0lu
ZGV4OworCisgICAgaWYgKGNvbnN0IEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbWVudCA9IHN0
YXRpY19jYXN0PGNvbnN0IEhUTUxJbnB1dEVsZW1lbnQqPihlbGVtZW50LT50b0lucHV0RWxlbWVu
dCgpKSkKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRJbnB1dFR5cGUoaW5wdXRFbGVtZW50KTsKKwor
ICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6dGV4dGFyZWFUYWcpKQorICAg
ICAgICByZXR1cm4gSW5wdXRUeXBlVGV4dEFyZWE7CisKKyAgICAvLyBEZWZhdWx0IHRvIElucHV0
VHlwZVRleHRBcmVhIGZvciBjb250ZW50IGVkaXRhYmxlIGZpZWxkcy4KKyAgICByZXR1cm4gSW5w
dXRUeXBlVGV4dEFyZWE7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpub2RlRm9jdXNlZChOb2Rl
KiBub2RlKQoreworICAgIGlmIChpc0FjdGl2ZVRleHRFZGl0KCkgJiYgbV9jdXJyZW50Rm9jdXNF
bGVtZW50ID09IG5vZGUpIHsKKyAgICAgICAgc2V0TmF2aWdhdGlvbk1vZGUodHJ1ZSk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobm9kZSAmJiBub2RlLT5pc0VsZW1lbnROb2Rl
KCkpIHsKKyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihu
b2RlKTsKKyAgICAgICAgaWYgKERPTVN1cHBvcnQ6OmlzRWxlbWVudFR5cGVQbHVnaW4oZWxlbWVu
dCkpIHsKKyAgICAgICAgICAgIHNldFBsdWdpbkZvY3VzZWQoZWxlbWVudCk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoRE9NU3VwcG9ydDo6aXNUZXh0QmFz
ZWRDb250ZW50RWRpdGFibGVFbGVtZW50KGVsZW1lbnQpKSB7CisgICAgICAgICAgICAvLyBGb2N1
c2VkIG5vZGUgaXMgYSB0ZXh0IGJhc2VkIGlucHV0IGZpZWxkLCB0ZXh0YXJlYSBvciBjb250ZW50
IGVkaXRhYmxlIGZpZWxkLgorICAgICAgICAgICAgc2V0RWxlbWVudEZvY3VzZWQoZWxlbWVudCk7
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNBY3Rp
dmVUZXh0RWRpdCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+aXNDb250ZW50RWRpdGFibGUo
KSkgeworICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBoYW5kbGVyIGZvciBjb250ZW50IGVk
aXRhYmxlIGZpZWxkcy4gVGhlIGZvY3VzIG5vZGUgaXMgdGhlIHRvcCBtb3N0CisgICAgICAgIC8v
IGZpZWxkIHRoYXQgaXMgY29udGVudCBlZGl0YWJsZSwgaG93ZXZlciwgYnkgZW5hYmxpbmcgLyBk
aXNhYmxpbmcgZGVzaWdubW9kZSBhbmQKKyAgICAgICAgLy8gY29udGVudCBlZGl0YWJsZSwgaXQg
aXMgcG9zc2libGUgdGhyb3VnaCBqYXZhc2NyaXB0IG9yIHNlbGVjdGlvbiB0byB0cmlnZ2VyIHRo
ZSBmb2N1cyBub2RlIHRvCisgICAgICAgIC8vIGNoYW5nZSBldmVuIHdoaWxlIG1haW50YWluaW5n
IGVkaXRpbmcgb24gdGhlIHNhbWUgc2VsZWN0aW9uIHBvaW50LiBJZiB0aGUgZm9jdXMgZWxlbWVu
dAorICAgICAgICAvLyBpc24ndCBjb250ZW50RWRpdGFibGUsIGJ1dCB0aGUgY3VycmVudCBzZWxl
Y3Rpb24gaXMsIGRvbid0IHNlbmQgYSBjaGFuZ2Ugbm90aWZpY2F0aW9uLgorCisgICAgICAgIC8v
IFdoZW4gcHJvY2Vzc2luZyBjaGFuZ2VzIHNlbGVjdGlvbiBjaGFuZ2VzIG9jY3VyIHRoYXQgbWF5
IHJlc2V0IHRoZSBmb2N1cyBlbGVtZW50CisgICAgICAgIC8vIGFuZCBjb3VsZCBwb3RlbnRpYWxs
eSBjYXVzZSBhIGNyYXNoIGFzIG1fY3VycmVudEZvY3VzRWxlbWVudCBzaG91bGQgbm90IGJlCisg
ICAgICAgIC8vIGNoYW5nZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgYW4gRWRpdG9yQ29tbWFuZC4K
KyAgICAgICAgaWYgKHByb2Nlc3NpbmdDaGFuZ2UoKSkKKyAgICAgICAgICAgIHJldHVybjsKKwor
ICAgICAgICBGcmFtZSogZnJhbWUgPSBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCkt
PmZyYW1lKCk7CisgICAgICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICAgICAgLy8gVGVzdCB0aGUg
Y3VycmVudCBzZWxlY3Rpb24gdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbnRlbnQgaW4gZm9jdXMg
aXMgc3RpbGwgY29udGVudAorICAgICAgICAvLyBlZGl0YWJsZS4gVGhpcyBtYXkgbWVhbiBKYXZh
c2NyaXB0IHRyaWdnZXJlZCBhIGZvY3VzIGNoYW5nZSBieSBtb2RpZnlpbmcgdGhlCisgICAgICAg
IC8vIHRvcCBsZXZlbCBwYXJlbnQgb2YgdGhpcyBvYmplY3QncyBjb250ZW50IGVkaXRhYmxlIHN0
YXRlIHdpdGhvdXQgYWN0dWFsbHkgbW9kaWZ5aW5nCisgICAgICAgIC8vIHRoaXMgcGFydGljdWxh
ciBvYmplY3QuCisgICAgICAgIC8vIEV4YW1wbGUgc2l0ZTogaHRtbDVkZW1vcy5jb20vY29udGVu
dEVkaXRhYmxlIC0gYmx1ciBldmVudCB0cmlnZ2VycyBmb2N1cyBjaGFuZ2UuCisgICAgICAgIGlm
IChmcmFtZSA9PSBtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpICYmIGZyYW1lLT5zZWxl
Y3Rpb24oKS0+c3RhcnQoKS5hbmNob3JOb2RlKCkKKyAgICAgICAgICAgICYmIGZyYW1lLT5zZWxl
Y3Rpb24oKS0+c3RhcnQoKS5hbmNob3JOb2RlKCktPmlzQ29udGVudEVkaXRhYmxlKCkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vIHZhbGlkIGZvY3VzIGVsZW1l
bnQgZm91bmQgZm9yIGhhbmRsaW5nLgorICAgIHNldEVsZW1lbnRVbmZvY3VzZWQoKTsKK30KKwor
dm9pZCBJbnB1dEhhbmRsZXI6OnNldFBsdWdpbkZvY3VzZWQoRWxlbWVudCogZWxlbWVudCkKK3sK
KyAgICBBU1NFUlQoRE9NU3VwcG9ydDo6aXNFbGVtZW50VHlwZVBsdWdpbihlbGVtZW50KSk7CisK
KyAgICBpZiAoaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICBzZXRFbGVtZW50VW5mb2N1c2Vk
KCk7CisKKyAgICBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUeXBlID0gUGx1Z2luOworICAgIG1fY3Vy
cmVudEZvY3VzRWxlbWVudCA9IGVsZW1lbnQ7Cit9CisKK3N0YXRpYyBib29sIGNvbnZlcnRTdHJp
bmdUb1djaGFyKGNvbnN0IFN0cmluZyYgc3RyaW5nLCB3Y2hhcl90KiBkZXN0LCBpbnQgZGVzdENh
cGFjaXR5LCBpbnQqIGRlc3RMZW5ndGgpCit7CisgICAgQVNTRVJUKGRlc3QpOworCisgICAgaWYg
KCFzdHJpbmcubGVuZ3RoKCkpIHsKKyAgICAgICAgZGVzdExlbmd0aCA9IDA7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKworICAgIFVFcnJvckNvZGUgZWMgPSBVX1pFUk9fRVJST1I7Cisg
ICAgLy8gd2NoYXJfdCBzdHJpbmdzIHNlbnQgdG8gSU1GIGFyZSAzMiBiaXQgc28gY2FzdGluZyB0
byBVQ2hhcjMyIGlzIHNhZmUuCisgICAgdV9zdHJUb1VURjMyKHJlaW50ZXJwcmV0X2Nhc3Q8VUNo
YXIzMio+KGRlc3QpLCBkZXN0Q2FwYWNpdHksIGRlc3RMZW5ndGgsIHN0cmluZy5jaGFyYWN0ZXJz
KCksIHN0cmluZy5sZW5ndGgoKSwgJmVjKTsKKyAgICBpZiAoZWMpIHsKKyAgICAgICAgSW5wdXRM
b2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIklucHV0SGFuZGxlcjo6Y29u
dmVydFN0cmluZ1RvV2NoYXIgRXJyb3IgY29udmVydGluZyBzdHJpbmcgZWMgKCVkKS4iLCBlYyk7
CisgICAgICAgIGRlc3RMZW5ndGggPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjb252ZXJ0U3RyaW5nVG9XY2hhclZl
Y3Rvcihjb25zdCBTdHJpbmcmIHN0cmluZywgV1RGOjpWZWN0b3I8d2NoYXJfdD4mIHdjaGFyU3Ry
aW5nKQoreworICAgIEFTU0VSVCh3Y2hhclN0cmluZy5pc0VtcHR5KCkpOworCisgICAgaW50IGxl
bmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKKyAgICBpZiAoIWxlbmd0aCkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisKKyAgICBpZiAoIXdjaGFyU3RyaW5nLnRyeVJlc2VydmVDYXBhY2l0eShsZW5ndGgg
KyAxKSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJJbnB1dEhhbmRsZXI6OmNvbnZlcnRTdHJpbmdU
b1djaGFyVmVjdG9yIENhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmluZy5cbiIpOworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IGRlc3RMZW5ndGggPSAwOworICAg
IGlmICghY29udmVydFN0cmluZ1RvV2NoYXIoc3RyaW5nLCB3Y2hhclN0cmluZy5kYXRhKCksIGxl
bmd0aCArIDEsICZkZXN0TGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgd2No
YXJTdHJpbmcucmVzaXplKGRlc3RMZW5ndGgpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0
aWMgU3RyaW5nIGNvbnZlcnRTcGFubmFibGVTdHJpbmdUb1N0cmluZyhzcGFubmFibGVfc3RyaW5n
X3QqIHNyYykKK3sKKyAgICBpZiAoIXNyYyB8fCAhc3JjLT5zdHIgfHwgIXNyYy0+bGVuZ3RoKQor
ICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBXVEY6OlZlY3RvcjxVQ2hhcj4gZGVzdDsK
KyAgICBpbnQgZGVzdENhcGFjaXR5ID0gKHNyYy0+bGVuZ3RoICogMikgKyAxOworICAgIGlmICgh
ZGVzdC50cnlSZXNlcnZlQ2FwYWNpdHkoZGVzdENhcGFjaXR5KSkgeworICAgICAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdh
cm4sICJJbnB1dEhhbmRsZXI6OmNvbnZlcnRTcGFubmFibGVTdHJpbmdUb1N0cmluZyBDYW5ub3Qg
YWxsb2NhdGUgbWVtb3J5IGZvciBzdHJpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZygp
OworICAgIH0KKworICAgIGludCBkZXN0TGVuZ3RoID0gMDsKKyAgICBVRXJyb3JDb2RlIGVjID0g
VV9aRVJPX0VSUk9SOworICAgIC8vIHdjaGFyX3Qgc3RyaW5ncyBzZW50IGZyb20gSU1GIGFyZSAz
MiBiaXQgc28gY2FzdGluZyB0byBVQ2hhcjMyIGlzIHNhZmUuCisgICAgdV9zdHJGcm9tVVRGMzIo
ZGVzdC5kYXRhKCksIGRlc3RDYXBhY2l0eSwgJmRlc3RMZW5ndGgsIHJlaW50ZXJwcmV0X2Nhc3Q8
VUNoYXIzMio+KHNyYy0+c3RyKSwgc3JjLT5sZW5ndGgsICZlYyk7CisgICAgaWYgKGVjKSB7Cisg
ICAgICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1
dEhhbmRsZXI6OmNvbnZlcnRTcGFubmFibGVTdHJpbmdUb1N0cmluZyBFcnJvciBjb252ZXJ0aW5n
IHN0cmluZyBlYyAoJWQpLiIsIGVjKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgIH0K
KyAgICBkZXN0LnJlc2l6ZShkZXN0TGVuZ3RoKTsKKyAgICByZXR1cm4gU3RyaW5nKGRlc3QuZGF0
YSgpLCBkZXN0TGVuZ3RoKTsKK30KKwordm9pZCBJbnB1dEhhbmRsZXI6OnNlbmRMZWFyblRleHRE
ZXRhaWxzKGNvbnN0IFdURjo6U3RyaW5nJiBzdHJpbmcpCit7CisgICAgVmVjdG9yPHdjaGFyX3Q+
IHdjaGFyU3RyaW5nOworICAgIGlmICghY29udmVydFN0cmluZ1RvV2NoYXJWZWN0b3Ioc3RyaW5n
LCB3Y2hhclN0cmluZykgfHwgd2NoYXJTdHJpbmcuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX3dlYlBhZ2UtPm1fY2xpZW50LT5pbnB1dExlYXJuVGV4dCh3Y2hhclN0cmluZy5k
YXRhKCksIHdjaGFyU3RyaW5nLnNpemUoKSk7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpsZWFy
blRleHQoKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBEbyBub3Qgc2VuZCAob3IgY2FsY3VsYXRlKSB0aGUgdGV4dCB3aGVuIHRoZSBm
aWVsZCBpcyBOT19QUkVESUNUSU9OIG9yIE5PX0FVVE9fVEVYVC4KKyAgICBpZiAobV9jdXJyZW50
Rm9jdXNFbGVtZW50VGV4dEVkaXRNYXNrICYgTk9fUFJFRElDVElPTiB8fCBtX2N1cnJlbnRGb2N1
c0VsZW1lbnRUZXh0RWRpdE1hc2sgJiBOT19BVVRPX1RFWFQpCisgICAgICAgIHJldHVybjsKKwor
CisgICAgU3RyaW5nIHRleHRJbkZpZWxkKGVsZW1lbnRUZXh0KCkpOworICAgIHRleHRJbkZpZWxk
ID0gdGV4dEluRmllbGQuc3Vic3RyaW5nKHN0ZDo6bWF4KDAsIChpbnQpdGV4dEluRmllbGQubGVu
Z3RoKCkgLSBNYXhMZWFyblRleHREYXRhU2l6ZSksIHRleHRJbkZpZWxkLmxlbmd0aCgpKTsKKyAg
ICB0ZXh0SW5GaWVsZC5yZW1vdmUoMCwgdGV4dEluRmllbGQuZmluZCgiICIpKTsKKworICAgIC8v
IEJ1aWxkIHVwIHRoZSA1MDAgY2hhcmFjdGVyIHN0cmluZ3MgaW4gd29yZCBjaHVua3MuCisgICAg
Ly8gU3BlYyBzYXlzIDEwMDAsIGJ1dCBtZW1vcnkgY29ycnVwdGlvbiBoYXMgYmVlbiBvYnNlcnZl
ZC4KKyAgICBBU1NFUlQodGV4dEluRmllbGQubGVuZ3RoKCkgPD0gTWF4TGVhcm5UZXh0RGF0YVNp
emUpOworCisgICAgaWYgKHRleHRJbkZpZWxkLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgSW5wdXRMb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIklucHV0
SGFuZGxlcjo6bGVhcm5UZXh0ICVzIiwgdGV4dEluRmllbGQubGF0aW4xKCkuZGF0YSgpKTsKKyAg
ICBzZW5kTGVhcm5UZXh0RGV0YWlscyh0ZXh0SW5GaWVsZCk7Cit9CisKK3ZvaWQgSW5wdXRIYW5k
bGVyOjpzZXRFbGVtZW50VW5mb2N1c2VkKGJvb2wgcmVmb2N1c09jY3VyaW5nKQoreworICAgIGlm
IChpc0FjdGl2ZVRleHRFZGl0KCkpIHsKKworICAgICAgICBGb2N1c0xvZyhCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVyOjpzZXRFbGVtZW50VW5mb2N1c2Vk
Iik7CisKKyAgICAgICAgLy8gUGFzcyBhbnkgdGV4dCBpbnRvIHRoZSBmaWVsZCB0byBJTUYgdG8g
bGVhcm4uCisgICAgICAgIGxlYXJuVGV4dCgpOworCisgICAgICAgIC8vIEVuZCBhbnkgY29tcG9z
aXRpb24gdGhhdCBpcyBpbiBwcm9ncmVzcy4KKyAgICAgICAgZmluaXNoQ29tcG9zaXRpb24oKTsK
KworICAgICAgICAvLyBTZW5kIGNoYW5nZSBub3RpZmljYXRpb25zLiBPbmx5IGNhbmNlbCBuYXZp
Z2F0aW9uIG1vZGUgaWYgd2UgYXJlIG5vdAorICAgICAgICAvLyByZWZvY3VzaW5nIHRvIGF2b2lk
IGZsYXNoaW5nIHRoZSBrZXlib2FyZCB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIHR3bworICAgICAg
ICAvLyBpbnB1dCBmaWVsZHMuCisgICAgICAgIHNldE5hdmlnYXRpb25Nb2RlKGZhbHNlLCAhcmVm
b2N1c09jY3VyaW5nKTsKKyAgICAgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+aW5wdXRGb2N1c0xv
c3QoKTsKKyAgICAgICAgbV93ZWJQYWdlLT5tX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGlvblBv
c2l0aW9uQ2hhbmdlZCgpOworICAgIH0KKworICAgIC8vIENsZWFyIHRoZSBub2RlIGRldGFpbHMu
CisgICAgbV9jdXJyZW50Rm9jdXNFbGVtZW50ID0gMDsKKyAgICBtX2N1cnJlbnRGb2N1c0VsZW1l
bnRUeXBlID0gVGV4dEVkaXQ7Cit9CisKK2Jvb2wgSW5wdXRIYW5kbGVyOjpzaG91bGRBY2NlcHRJ
bnB1dEZvY3VzKCkKK3sKKyAgICAvLyBJZiB0aGUgRFJUIGlzIHJ1bm5pbmcsIGFsd2F5cyBhY2Nl
cHQgZm9jdXMuCisgICAgaWYgKG1fd2ViUGFnZS0+bV9kdW1wUmVuZGVyVHJlZSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICBpZiAoQmxhY2tCZXJyeTo6UGxhdGZvcm06OlNldHRpbmdzOjpn
ZXQoKS0+YWx3YXlzU2hvd0tleWJvYXJkT25Gb2N1cygpKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIEZyYW1lKiBtYWluRnJhbWUgPSBtX3dlYlBhZ2UtPm1fcGFnZS0+bWFpbkZyYW1lKCk7
CisgICAgRnJhbWUqIGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1l
KCk7CisgICAgaWYgKG1haW5GcmFtZSAmJiBtYWluRnJhbWUtPmRvY3VtZW50KCkgJiYgZm9jdXNl
ZEZyYW1lICYmIGZvY3VzZWRGcmFtZS0+ZG9jdW1lbnQoKSkgeworICAgICAgICAvLyBBbnkgdXNl
ciBhY3Rpb24gc2hvdWxkIGJlIHJlc3BlY3RlZC4gTW91c2Ugd2lsbCBiZSBkb3duIHdoZW4gdG91
Y2ggaXMKKyAgICAgICAgLy8gdXNlZCB0byBmb2N1cy4KKyAgICAgICAgaWYgKGZvY3VzZWRGcmFt
ZS0+ZXZlbnRIYW5kbGVyKCktPm1vdXNlUHJlc3NlZCgpKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBtYWluIGZyYW1lIGlzIG5vdCBzdGlsbCBs
b2FkaW5nLgorICAgICAgICBpZiAobWFpbkZyYW1lLT5sb2FkZXIoKS0+aXNMb2FkaW5nKCkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBmb2N1
c2VkIGZyYW1lIGlzIGxvYWRlZC4KKyAgICAgICAgaWYgKCFmb2N1c2VkRnJhbWUtPmxvYWRlcigp
LT5mcmFtZUhhc0xvYWRlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAg
IC8vIE1ha2Ugc3VyZSB0aGUgZm9jdXNlZCBmcmFtZSBpcyBub3QgcHJvY2Vzc2luZyBsb2FkIGV2
ZW50cy4KKyAgICAgICAgcmV0dXJuICFmb2N1c2VkRnJhbWUtPmRvY3VtZW50KCktPnByb2Nlc3Np
bmdMb2FkRXZlbnQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIElucHV0
SGFuZGxlcjo6c2V0RWxlbWVudEZvY3VzZWQoRWxlbWVudCogZWxlbWVudCkKK3sKKyAgICBBU1NF
UlQoRE9NU3VwcG9ydDo6aXNUZXh0QmFzZWRDb250ZW50RWRpdGFibGVFbGVtZW50KGVsZW1lbnQp
KTsKKyAgICBBU1NFUlQoZWxlbWVudC0+ZG9jdW1lbnQoKSAmJiBlbGVtZW50LT5kb2N1bWVudCgp
LT5mcmFtZSgpKTsKKworICAgIGlmICghc2hvdWxkQWNjZXB0SW5wdXRGb2N1cygpKSB7CisgICAg
ICAgIC8vIFJlbW92ZSB0aGUgZm9jdXMgZnJvbSB0aGlzIGVsZW1lbnQuCisgICAgICAgIGVsZW1l
bnQtPmJsdXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENsZWFyIHRoZSBl
eGlzdGluZyBmb2N1cyBub2RlIGRldGFpbHMuCisgICAgc2V0RWxlbWVudFVuZm9jdXNlZCh0cnVl
IC8qcmVmb2N1c09jY3VyaW5nKi8pOworCisgICAgLy8gTWFyayB0aGlzIGVsZW1lbnQgYXMgYWN0
aXZlIGFuZCBhZGQgdG8gZnJhbWUgc2V0LgorICAgIG1fY3VycmVudEZvY3VzRWxlbWVudCA9IGVs
ZW1lbnQ7CisgICAgbV9jdXJyZW50Rm9jdXNFbGVtZW50VHlwZSA9IFRleHRFZGl0OworCisgICAg
Ly8gU2VuZCBkZXRhaWxzIHRvIHRoZSBjbGllbnQgYWJvdXQgdGhpcyBlbGVtZW50LgorICAgIEJs
YWNrQmVycnlJbnB1dFR5cGUgdHlwZSA9IGVsZW1lbnRUeXBlKGVsZW1lbnQpOworICAgIG1fY3Vy
cmVudEZvY3VzRWxlbWVudFRleHRFZGl0TWFzayA9IGlucHV0U3R5bGUodHlwZSwgZWxlbWVudCk7
CisKKyAgICBGb2N1c0xvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiSW5w
dXRIYW5kbGVyOjpzZXRFbGVtZW50Rm9jdXNlZCwgVHlwZT0lZCwgU3R5bGU9JWQiLCB0eXBlLCBt
X2N1cnJlbnRGb2N1c0VsZW1lbnRUZXh0RWRpdE1hc2spOworCisgICAgbV93ZWJQYWdlLT5tX2Ns
aWVudC0+aW5wdXRGb2N1c0dhaW5lZCh0eXBlLCBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUZXh0RWRp
dE1hc2spOworICAgIG1fbmF2aWdhdGlvbk1vZGUgPSB0cnVlOworCisgICAgaGFuZGxlSW5wdXRM
b2NhbGVDaGFuZ2VkKG1fd2ViUGFnZS0+bV93ZWJTZXR0aW5ncy0+aXNXcml0aW5nRGlyZWN0aW9u
UlRMKCkpOworfQorCitib29sIElucHV0SGFuZGxlcjo6b3BlbkRhdGVQb3B1cChIVE1MSW5wdXRF
bGVtZW50KiBlbGVtZW50LCBCbGFja0JlcnJ5SW5wdXRUeXBlIHR5cGUpCit7CisgICAgaWYgKCFl
bGVtZW50IHx8IGVsZW1lbnQtPmRpc2FibGVkKCkgfHwgIURPTVN1cHBvcnQ6OmlzRGF0ZVRpbWVJ
bnB1dEZpZWxkKGVsZW1lbnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaXNB
Y3RpdmVUZXh0RWRpdCgpKQorICAgICAgICBjbGVhckN1cnJlbnRGb2N1c0VsZW1lbnQoKTsKKwor
ICAgIG1fY3VycmVudEZvY3VzRWxlbWVudCA9IGVsZW1lbnQ7CisgICAgbV9jdXJyZW50Rm9jdXNF
bGVtZW50VHlwZSA9IFRleHRQb3B1cDsKKworICAgIFdURjo6U3RyaW5nIHZhbHVlID0gZWxlbWVu
dC0+dmFsdWUoKTsKKyAgICBXVEY6OlN0cmluZyBtaW4gPSBlbGVtZW50LT5nZXRBdHRyaWJ1dGUo
SFRNTE5hbWVzOjptaW5BdHRyKS5zdHJpbmcoKTsKKyAgICBXVEY6OlN0cmluZyBtYXggPSBlbGVt
ZW50LT5nZXRBdHRyaWJ1dGUoSFRNTE5hbWVzOjptYXhBdHRyKS5zdHJpbmcoKTsKKyAgICBkb3Vi
bGUgc3RlcCA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZShIVE1MTmFtZXM6OnN0ZXBBdHRyKS50b0Rv
dWJsZSgpOworICAgIG1fd2ViUGFnZS0+bV9jbGllbnQtPm9wZW5EYXRlVGltZVBvcHVwKHR5cGUs
IHZhbHVlLCBtaW4sIG1heCwgc3RlcCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSW5w
dXRIYW5kbGVyOjpvcGVuQ29sb3JQb3B1cChIVE1MSW5wdXRFbGVtZW50KiBlbGVtZW50KQorewor
ICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50LT5kaXNhYmxlZCgpIHx8ICFET01TdXBwb3J0Ojpp
c0NvbG9ySW5wdXRGaWVsZChlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKGlzQWN0aXZlVGV4dEVkaXQoKSkKKyAgICAgICAgY2xlYXJDdXJyZW50Rm9jdXNFbGVtZW50
KCk7CisKKyAgICBtX2N1cnJlbnRGb2N1c0VsZW1lbnQgPSBlbGVtZW50OworICAgIG1fY3VycmVu
dEZvY3VzRWxlbWVudFR5cGUgPSBUZXh0UG9wdXA7CisKKyAgICBtX3dlYlBhZ2UtPm1fY2xpZW50
LT5vcGVuQ29sb3JQb3B1cChlbGVtZW50LT52YWx1ZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
Kwordm9pZCBJbnB1dEhhbmRsZXI6OnNldElucHV0VmFsdWUoY29uc3QgV1RGOjpTdHJpbmcmIHZh
bHVlKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0UG9wdXAoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTElu
cHV0RWxlbWVudCo+KG1fY3VycmVudEZvY3VzRWxlbWVudC5nZXQoKSk7CisgICAgaW5wdXRFbGVt
ZW50LT5zZXRWYWx1ZSh2YWx1ZSk7CisgICAgY2xlYXJDdXJyZW50Rm9jdXNFbGVtZW50KCk7Cit9
CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpub2RlVGV4dENoYW5nZWQoY29uc3QgTm9kZSogbm9kZSkK
K3sKKyAgICBpZiAocHJvY2Vzc2luZ0NoYW5nZSgpIHx8ICFub2RlKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAobm9kZSAhPSBtX2N1cnJlbnRGb2N1c0VsZW1lbnQpCisgICAgICAgIHJldHVy
bjsKKworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJ
bnB1dEhhbmRsZXI6Om5vZGVUZXh0Q2hhbmdlZCIpOworCisgICAgbV93ZWJQYWdlLT5tX2NsaWVu
dC0+aW5wdXRUZXh0Q2hhbmdlZCgpOworCisgICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGVkIHRl
eHQgbWFya2VycyBhcyB0aGUgcHJldmlvdXMgY2FsbCB0cmlnZ2VyZWQgYW4gZW5kIHRvCisgICAg
Ly8gdGhlIGNvbXBvc2l0aW9uLgorICAgIHJlbW92ZUF0dHJpYnV0ZWRUZXh0TWFya2VyKCk7Cit9
CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjplbnN1cmVGb2N1c1RleHRFbGVtZW50VmlzaWJsZShDYXJl
dFNjcm9sbFR5cGUgc2Nyb2xsVHlwZSkKK3sKKyAgICBpZiAoIW1fY3VycmVudEZvY3VzRWxlbWVu
dCB8fCAhbV9uYXZpZ2F0aW9uTW9kZSB8fCAhbV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVu
dCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIUJsYWNrQmVycnk6OlBsYXRmb3JtOjpT
ZXR0aW5nczo6Z2V0KCktPmFsbG93Q2VudGVyU2Nyb2xsQWRqdXN0bWVudEZvcklucHV0RmllbGRz
KCkgJiYgc2Nyb2xsVHlwZSAhPSBFZGdlSWZOZWVkZWQpCisgICAgICAgIHJldHVybjsKKworICAg
IEZyYW1lKiBlbGVtZW50RnJhbWUgPSBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCkt
PmZyYW1lKCk7CisgICAgaWYgKCFlbGVtZW50RnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAg
IEZyYW1lKiBtYWluRnJhbWUgPSBtX3dlYlBhZ2UtPm1haW5GcmFtZSgpOworICAgIGlmICghbWFp
bkZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBGcmFtZVZpZXcqIG1haW5GcmFtZVZpZXcg
PSBtYWluRnJhbWUtPnZpZXcoKTsKKyAgICBpZiAoIW1haW5GcmFtZVZpZXcpCisgICAgICAgIHJl
dHVybjsKKworICAgIFdlYkNvcmU6OkludFJlY3Qgc2VsZWN0aW9uRm9jdXNSZWN0OworICAgIHN3
aXRjaCAoZWxlbWVudEZyYW1lLT5zZWxlY3Rpb24oKS0+c2VsZWN0aW9uVHlwZSgpKSB7CisgICAg
Y2FzZSBWaXNpYmxlU2VsZWN0aW9uOjpDYXJldFNlbGVjdGlvbjoKKyAgICAgICAgc2VsZWN0aW9u
Rm9jdXNSZWN0ID0gZWxlbWVudEZyYW1lLT5zZWxlY3Rpb24oKS0+YWJzb2x1dGVDYXJldEJvdW5k
cygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZpc2libGVTZWxlY3Rpb246OlJhbmdlU2Vs
ZWN0aW9uOiB7CisgICAgICAgIFBvc2l0aW9uIHNlbGVjdGlvblBvc2l0aW9uOworICAgICAgICBp
ZiAobV93ZWJQYWdlLT5tX3NlbGVjdGlvbkhhbmRsZXItPmxhc3RVcGRhdGVkRW5kUG9pbnRJc1Zh
bGlkKCkpCisgICAgICAgICAgICBzZWxlY3Rpb25Qb3NpdGlvbiA9IGVsZW1lbnRGcmFtZS0+c2Vs
ZWN0aW9uKCktPmVuZCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWxlY3Rpb25Qb3Np
dGlvbiA9IGVsZW1lbnRGcmFtZS0+c2VsZWN0aW9uKCktPnN0YXJ0KCk7CisgICAgICAgIHNlbGVj
dGlvbkZvY3VzUmVjdCA9IFZpc2libGVQb3NpdGlvbihzZWxlY3Rpb25Qb3NpdGlvbikuYWJzb2x1
dGVDYXJldEJvdW5kcygpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBWaXNpYmxl
U2VsZWN0aW9uOjpOb1NlbGVjdGlvbjoKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlu
dCBmb250SGVpZ2h0ID0gc2VsZWN0aW9uRm9jdXNSZWN0LmhlaWdodCgpOworCisgICAgaWYgKGVs
ZW1lbnRGcmFtZSAhPSBtYWluRnJhbWUpIHsgLy8gRWxlbWVudCBpcyBpbiBhIHN1YmZyYW1lLgor
ICAgICAgICAvLyBSZW1vdmUgYW55IHNjcm9sbCBvZmZzZXQgd2l0aGluIHRoZSBzdWJmcmFtZSB0
byBnZXQgdGhlIHBvaW50IHJlbGF0aXZlIHRvIHRoZSBtYWluIGZyYW1lLgorICAgICAgICBzZWxl
Y3Rpb25Gb2N1c1JlY3QubW92ZSgtZWxlbWVudEZyYW1lLT52aWV3KCktPnNjcm9sbFBvc2l0aW9u
KCkueCgpLCAtZWxlbWVudEZyYW1lLT52aWV3KCktPnNjcm9sbFBvc2l0aW9uKCkueSgpKTsKKwor
ICAgICAgICAvLyBBZGp1c3QgdGhlIHNlbGVjdGlvbiByZWN0IGJhc2VkIG9uIHRoZSBmcmFtZSBv
ZmZzZXQgaW4gcmVsYXRpb24gdG8gdGhlIG1haW4gZnJhbWUgaWYgaXQncyBhIHN1YmZyYW1lLgor
ICAgICAgICBpZiAoZWxlbWVudEZyYW1lLT5vd25lclJlbmRlcmVyKCkpIHsKKyAgICAgICAgICAg
IFdlYkNvcmU6OkludFBvaW50IGZyYW1lT2Zmc2V0ID0gZWxlbWVudEZyYW1lLT5vd25lclJlbmRl
cmVyKCktPmFic29sdXRlQ29udGVudEJveCgpLmxvY2F0aW9uKCk7CisgICAgICAgICAgICBzZWxl
Y3Rpb25Gb2N1c1JlY3QubW92ZShmcmFtZU9mZnNldC54KCksIGZyYW1lT2Zmc2V0LnkoKSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBXZWJDb3JlOjpJbnRSZWN0IGFjdHVhbFNjcmVlblJlY3Qg
PSBXZWJDb3JlOjpJbnRSZWN0KG1haW5GcmFtZVZpZXctPnNjcm9sbFBvc2l0aW9uKCksIG1fd2Vi
UGFnZS0+YWN0dWFsVmlzaWJsZVNpemUoKSk7CisgICAgUG9zaXRpb24gc3RhcnQgPSBlbGVtZW50
RnJhbWUtPnNlbGVjdGlvbigpLT5zdGFydCgpOworICAgIGlmIChzdGFydC5hbmNob3JOb2RlKCkg
JiYgc3RhcnQuYW5jaG9yTm9kZSgpLT5yZW5kZXJlcigpKSB7CisgICAgICAgIGlmIChSZW5kZXJM
YXllciogbGF5ZXIgPSBzdGFydC5hbmNob3JOb2RlKCktPnJlbmRlcmVyKCktPmVuY2xvc2luZ0xh
eWVyKCkpIHsKKyAgICAgICAgICAgIFNjcm9sbEFsaWdubWVudCBob3Jpem9udGFsU2Nyb2xsQWxp
Z25tZW50ID0gU2Nyb2xsQWxpZ25tZW50OjphbGlnblRvRWRnZUlmTmVlZGVkOworICAgICAgICAg
ICAgU2Nyb2xsQWxpZ25tZW50IHZlcnRpY2FsU2Nyb2xsQWxpZ25tZW50ID0gU2Nyb2xsQWxpZ25t
ZW50OjphbGlnblRvRWRnZUlmTmVlZGVkOworCisgICAgICAgICAgICBpZiAoc2Nyb2xsVHlwZSAh
PSBFZGdlSWZOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGlnbiB0aGUgc2VsZWN0aW9u
IHJlY3QgaWYgcG9zc2libGUgc28gdGhhdCB3ZSBzaG93IHRoZSBmaWVsZCdzCisgICAgICAgICAg
ICAgICAgLy8gb3V0bGluZSBpZiB0aGUgY2FyZXQgaXMgYXQgdGhlIGVkZ2Ugb2YgdGhlIGZpZWxk
LgorICAgICAgICAgICAgICAgIGlmIChSZW5kZXJPYmplY3QqIGZvY3VzZWRSZW5kZXJlciA9IG1f
Y3VycmVudEZvY3VzRWxlbWVudC0+cmVuZGVyZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBX
ZWJDb3JlOjpJbnRSZWN0IG5vZGVPdXRsaW5lQm91bmRzID0gZm9jdXNlZFJlbmRlcmVyLT5hYnNv
bHV0ZU91dGxpbmVCb3VuZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgV2ViQ29yZTo6SW50UmVj
dCBjYXJldEF0RWRnZVJlY3QgPSByZWN0Rm9yQ2FyZXQoMCk7CisgICAgICAgICAgICAgICAgICAg
IGludCBwYWRkaW5nWCA9IGFicyhjYXJldEF0RWRnZVJlY3QueCgpIC0gbm9kZU91dGxpbmVCb3Vu
ZHMueCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBhZGRpbmdZID0gYWJzKGNhcmV0QXRF
ZGdlUmVjdC55KCkgLSBub2RlT3V0bGluZUJvdW5kcy55KCkpOworCisgICAgICAgICAgICAgICAg
ICAgIGlmIChzZWxlY3Rpb25Gb2N1c1JlY3QueCgpIC0gcGFkZGluZ1ggPT0gbm9kZU91dGxpbmVC
b3VuZHMueCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRm9jdXNSZWN0LnNl
dFgobm9kZU91dGxpbmVCb3VuZHMueCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAo
c2VsZWN0aW9uRm9jdXNSZWN0Lm1heFgoKSArIHBhZGRpbmdYID09IG5vZGVPdXRsaW5lQm91bmRz
Lm1heFgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkZvY3VzUmVjdC5zZXRY
KG5vZGVPdXRsaW5lQm91bmRzLm1heFgoKSAtIHNlbGVjdGlvbkZvY3VzUmVjdC53aWR0aCgpKTsK
KyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkZvY3VzUmVjdC55KCkgLSBwYWRkaW5n
WSA9PSBub2RlT3V0bGluZUJvdW5kcy55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxl
Y3Rpb25Gb2N1c1JlY3Quc2V0WShub2RlT3V0bGluZUJvdW5kcy55KCkgLSBzZWxlY3Rpb25Gb2N1
c1JlY3QuaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzZWxlY3Rpb25G
b2N1c1JlY3QubWF4WSgpICsgcGFkZGluZ1kgPT0gbm9kZU91dGxpbmVCb3VuZHMubWF4WSgpKQor
ICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRm9jdXNSZWN0LnNldFkobm9kZU91dGxp
bmVCb3VuZHMubWF4WSgpIC0gc2VsZWN0aW9uRm9jdXNSZWN0LmhlaWdodCgpKTsKKworICAgICAg
ICAgICAgICAgICAgICAvLyBJZiB0aGUgZWRpdGluZyBwb2ludCBpcyBvbiB0aGUgbGVmdCBoYW5k
IHNpZGUgb2YgdGhlIHNjcmVlbiB3aGVuIHRoZSBub2RlJ3MKKyAgICAgICAgICAgICAgICAgICAg
Ly8gcmVjdCBpcyBlZGdlIGFsaWduZWQsIGVkZ2UgYWxpZ24gdGhlIG5vZGUgcmVjdC4KKyAgICAg
ICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkZvY3VzUmVjdC54KCkgLSBjYXJldEF0RWRnZVJl
Y3QueCgpIDwgYWN0dWFsU2NyZWVuUmVjdC53aWR0aCgpIC8gMikKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHNlbGVjdGlvbkZvY3VzUmVjdC5zZXRYKG5vZGVPdXRsaW5lQm91bmRzLngoKSk7Cisg
ICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250
YWxTY3JvbGxBbGlnbm1lbnQgPSBTY3JvbGxBbGlnbm1lbnQ6OmFsaWduQ2VudGVySWZOZWVkZWQ7
CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmVydGljYWxTY3JvbGxBbGln
bm1lbnQgPSAoc2Nyb2xsVHlwZSA9PSBDZW50ZXJBbHdheXMpID8gU2Nyb2xsQWxpZ25tZW50Ojph
bGlnbkNlbnRlckFsd2F5cyA6IFNjcm9sbEFsaWdubWVudDo6YWxpZ25DZW50ZXJJZk5lZWRlZDsK
KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUGFkIHRoZSByZWN0IHRvIGltcHJvdmUg
dGhlIHZpc3VhbCBhcHBlYXJhbmNlLgorICAgICAgICAgICAgc2VsZWN0aW9uRm9jdXNSZWN0Lmlu
ZmxhdGUoNCAvKiBwYWRkaW5nIGluIHBpeGVscyAqLyk7CisgICAgICAgICAgICBXZWJDb3JlOjpJ
bnRSZWN0IHJldmVhbFJlY3QgPSBsYXllci0+Z2V0UmVjdFRvRXhwb3NlKGFjdHVhbFNjcmVlblJl
Y3QsIHNlbGVjdGlvbkZvY3VzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFNjcm9sbEFsaWdubWVu
dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdmVydGljYWxTY3JvbGxBbGlnbm1lbnQpOworCisgICAgICAgICAgICBtYWlu
RnJhbWVWaWV3LT5zZXRTY3JvbGxQb3NpdGlvbihyZXZlYWxSZWN0LmxvY2F0aW9uKCkpOworICAg
ICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIHRleHQgaXMgdG9vIHNtYWxsLCB6b29tIGlu
IHRvIG1ha2UgaXQgYSBtaW5pbXVtIHNpemUuCisgICAgc3RhdGljIGNvbnN0IGludCBzX21pbmlt
dW1UZXh0SGVpZ2h0SW5QaXhlbHMgPSA2OworICAgIGlmIChmb250SGVpZ2h0ICYmIGZvbnRIZWln
aHQgPCBzX21pbmltdW1UZXh0SGVpZ2h0SW5QaXhlbHMpCisgICAgICAgIG1fd2ViUGFnZS0+em9v
bUFib3V0UG9pbnQoc19taW5pbXVtVGV4dEhlaWdodEluUGl4ZWxzIC8gZm9udEhlaWdodCwgbV93
ZWJQYWdlLT5jZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK3ZvaWQgSW5wdXRI
YW5kbGVyOjplbnN1cmVGb2N1c1BsdWdpbkVsZW1lbnRWaXNpYmxlKCkKK3sKKyAgICBpZiAoIWlz
QWN0aXZlUGx1Z2luKCkgfHwgIW1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgRnJhbWUqIGVsZW1lbnRGcmFtZSA9IG1fY3VycmVudEZvY3Vz
RWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWVsZW1lbnRGcmFtZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgRnJhbWUqIG1haW5GcmFtZSA9IG1fd2ViUGFnZS0+bWFpbkZy
YW1lKCk7CisgICAgaWYgKCFtYWluRnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIEZyYW1l
VmlldyogbWFpbkZyYW1lVmlldyA9IG1haW5GcmFtZS0+dmlldygpOworICAgIGlmICghbWFpbkZy
YW1lVmlldykKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViQ29yZTo6SW50UmVjdCBzZWxlY3Rp
b25Gb2N1c1JlY3Q7CisKKyAgICBSZW5kZXJXaWRnZXQqIHJlbmRlcldpZGdldCA9IHN0YXRpY19j
YXN0PFJlbmRlcldpZGdldCo+KG1fY3VycmVudEZvY3VzRWxlbWVudC0+cmVuZGVyZXIoKSk7Cisg
ICAgaWYgKHJlbmRlcldpZGdldCkgeworICAgICAgICBQbHVnaW5WaWV3KiBwbHVnaW5WaWV3ID0g
c3RhdGljX2Nhc3Q8UGx1Z2luVmlldyo+KHJlbmRlcldpZGdldC0+d2lkZ2V0KCkpOworCisgICAg
ICAgIGlmIChwbHVnaW5WaWV3KQorICAgICAgICAgICAgc2VsZWN0aW9uRm9jdXNSZWN0ID0gcGx1
Z2luVmlldy0+ZW5zdXJlVmlzaWJsZVJlY3QoKTsKKyAgICB9CisKKyAgICBpZiAoc2VsZWN0aW9u
Rm9jdXNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklYTUU6IFdl
IG1heSBuZWVkIHRvIHNjcm9sbCB0aGUgc3ViZnJhbWUgKHJlY3Vyc2l2ZWx5KSBpbiB0aGUgZnV0
dXJlLiBSZXZpc2l0IHRoaXMuLi4KKyAgICBpZiAoZWxlbWVudEZyYW1lICE9IG1haW5GcmFtZSkg
eyAvLyBFbGVtZW50IGlzIGluIGEgc3ViZnJhbWUuCisgICAgICAgIC8vIFJlbW92ZSBhbnkgc2Ny
b2xsIG9mZnNldCB3aXRoaW4gdGhlIHN1YmZyYW1lIHRvIGdldCB0aGUgcG9pbnQgcmVsYXRpdmUg
dG8gdGhlIG1haW4gZnJhbWUuCisgICAgICAgIHNlbGVjdGlvbkZvY3VzUmVjdC5tb3ZlKC1lbGVt
ZW50RnJhbWUtPnZpZXcoKS0+c2Nyb2xsUG9zaXRpb24oKS54KCksIC1lbGVtZW50RnJhbWUtPnZp
ZXcoKS0+c2Nyb2xsUG9zaXRpb24oKS55KCkpOworCisgICAgICAgIC8vIEFkanVzdCB0aGUgc2Vs
ZWN0aW9uIHJlY3QgYmFzZWQgb24gdGhlIGZyYW1lIG9mZnNldCBpbiByZWxhdGlvbiB0byB0aGUg
bWFpbiBmcmFtZSBpZiBpdCdzIGEgc3ViZnJhbWUuCisgICAgICAgIGlmIChlbGVtZW50RnJhbWUt
Pm93bmVyUmVuZGVyZXIoKSkgeworICAgICAgICAgICAgV2ViQ29yZTo6SW50UG9pbnQgZnJhbWVP
ZmZzZXQgPSBlbGVtZW50RnJhbWUtPm93bmVyUmVuZGVyZXIoKS0+YWJzb2x1dGVDb250ZW50Qm94
KCkubG9jYXRpb24oKTsKKyAgICAgICAgICAgIHNlbGVjdGlvbkZvY3VzUmVjdC5tb3ZlKGZyYW1l
T2Zmc2V0LngoKSwgZnJhbWVPZmZzZXQueSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFdl
YkNvcmU6OkludFJlY3QgYWN0dWFsU2NyZWVuUmVjdCA9IFdlYkNvcmU6OkludFJlY3QobWFpbkZy
YW1lVmlldy0+c2Nyb2xsUG9zaXRpb24oKSwgbV93ZWJQYWdlLT5hY3R1YWxWaXNpYmxlU2l6ZSgp
KTsKKyAgICBpZiAoYWN0dWFsU2NyZWVuUmVjdC5jb250YWlucyhzZWxlY3Rpb25Gb2N1c1JlY3Qp
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDYWxjdWxhdGUgYSBwb2ludCBzdWNoIHRoYXQg
dGhlIGNlbnRlciBvZiB0aGUgcmVxdWVzdGVkIHJlY3RhbmdsZQorICAgIC8vIGlzIGF0IHRoZSBj
ZW50ZXIgb2YgdGhlIHNjcmVlbi4gRklYTUU6IElmIHRoZSBlbGVtZW50IHdhcyBwYXJ0aWFsbHkg
b24gc2NyZWVuCisgICAgLy8gd2UgbWlnaHQgd2FudCB0byBqdXN0IGJyaW5nIHRoZSBvZmZzY3Jl
ZW4gcG9ydGlvbiBpbnRvIHZpZXcsIHNvbWVvbmUgbmVlZHMKKyAgICAvLyB0byBkZWNpZGUgaWYg
dGhhdCdzIHRoZSBiZWhhdmlvciB3ZSB3YW50IG9yIG5vdC4KKyAgICBXZWJDb3JlOjpJbnRQb2lu
dCBwb3Moc2VsZWN0aW9uRm9jdXNSZWN0LmNlbnRlcigpLngoKSAtIGFjdHVhbFNjcmVlblJlY3Qu
d2lkdGgoKSAvIDIsCisgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkZvY3VzUmVjdC5jZW50ZXIo
KS55KCkgLSBhY3R1YWxTY3JlZW5SZWN0LmhlaWdodCgpIC8gMik7CisKKyAgICBtYWluRnJhbWVW
aWV3LT5zZXRTY3JvbGxQb3NpdGlvbihwb3MpOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6ZW5z
dXJlRm9jdXNFbGVtZW50VmlzaWJsZShib29sIGNlbnRlckluVmlldykKK3sKKyAgICBpZiAoaXNB
Y3RpdmVQbHVnaW4oKSkKKyAgICAgICAgZW5zdXJlRm9jdXNQbHVnaW5FbGVtZW50VmlzaWJsZSgp
OworICAgIGVsc2UKKyAgICAgICAgZW5zdXJlRm9jdXNUZXh0RWxlbWVudFZpc2libGUoY2VudGVy
SW5WaWV3ID8gQ2VudGVyQWx3YXlzIDogQ2VudGVySWZOZWVkZWQpOworfQorCit2b2lkIElucHV0
SGFuZGxlcjo6ZnJhbWVVbmxvYWRlZChGcmFtZSogZnJhbWUpCit7CisgICAgaWYgKCFpc0FjdGl2
ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2N1cnJlbnRGb2N1c0Vs
ZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkgIT0gZnJhbWUpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEZvY3VzTG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhh
bmRsZXI6OmZyYW1lVW5sb2FkZWQiKTsKKworICAgIHNldEVsZW1lbnRVbmZvY3VzZWQoZmFsc2Ug
LypyZWZvY3VzT2NjdXJpbmcqLyk7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpzZXROYXZpZ2F0
aW9uTW9kZShib29sIGFjdGl2ZSwgYm9vbCBzZW5kTWVzc2FnZSkKK3sKKyAgICBpZiAoYWN0aXZl
ICYmICFpc0FjdGl2ZVRleHRFZGl0KCkpIHsKKyAgICAgICAgaWYgKCFtX25hdmlnYXRpb25Nb2Rl
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFdlIGNhbid0IGJlIGFjdGl2ZSBp
ZiB0aGVyZSBpcyBubyBlbGVtZW50LiBTZW5kIG91dCBub3RpZmljYXRpb24gdGhhdCB3ZQorICAg
ICAgICAvLyBhcmVuJ3QgaW4gbmF2aWdhdGlvbiBtb2RlLgorICAgICAgICBhY3RpdmUgPSBmYWxz
ZTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBzZW5kIHRoZSBjaGFuZ2UgaWYgaXQncyBzZXR0aW5n
IHRoZSBldmVudCBzZXR0aW5nIG5hdmlnYXRpb25Nb2RlIHRydWUKKyAgICAvLyBpZiB3ZSBhcmUg
YWxyZWFkeSBpbiBuYXZpZ2F0aW9uIG1vZGUgYW5kIHRoaXMgaXMgYSBuYXZpZ2F0aW9uIG1vdmUg
ZXZlbnQuCisgICAgLy8gV2UgbmVlZCB0byBzZW5kIHRoZSBldmVudCB3aGVuIGl0J3MgdHJpZ2dl
cmVkIGJ5IGEgdG91Y2ggZXZlbnQgb3IgbW91c2UKKyAgICAvLyBldmVudCB0byBhbGxvdyBkaXNw
bGF5IG9mIHRoZSBWS0IsIGJ1dCBkbyBub3Qgd2FudCB0byBzZW5kIGl0IHdoZW4gaXQncworICAg
IC8vIHRyaWdnZXJlZCBieSBhIG5hdmlnYXRpb24gZXZlbnQgYXMgaXQgaGFzIG5vIGVmZmVjdC4K
KyAgICAvLyBUb3VjaCBldmVudHMgYXJlIHNpbXVsYXRlZCBhcyBtb3VzZSBldmVudHMgc28gbW91
c2VQcmVzc2VkIHdpbGwgYmUgYWN0aXZlCisgICAgLy8gd2hlbiBpdCBpcyBhIHJlLWVudHJ5IGV2
ZW50LgorICAgIC8vIFNlZSBSSU0gQnVncyAjMzY5ICYgIzg3OC4KKyAgICBpZiAoYWN0aXZlICYm
IGFjdGl2ZSA9PSBtX25hdmlnYXRpb25Nb2RlICYmICFtX3dlYlBhZ2UtPm1fbWFpbkZyYW1lLT5l
dmVudEhhbmRsZXIoKS0+bW91c2VQcmVzc2VkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
bmF2aWdhdGlvbk1vZGUgPSBhY3RpdmU7CisKKyAgICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVyOjpzZXROYXZpZ2F0aW9uTW9kZSAlcywg
JXMiLCBhY3RpdmUgPyAidHJ1ZSIgOiAiZmFsc2UiLCBzZW5kTWVzc2FnZSA/ICJtZXNzYWdlIHNl
bnQiIDogIm1lc3NhZ2Ugbm90IHNlbnQiKTsKKworICAgIGlmIChzZW5kTWVzc2FnZSkKKyAgICAg
ICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+aW5wdXRTZXROYXZpZ2F0aW9uTW9kZShhY3RpdmUpOwor
fQorCitib29sIElucHV0SGFuZGxlcjo6c2VsZWN0aW9uQXRTdGFydE9mRWxlbWVudCgpCit7Cisg
ICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IEFTU0VSVChtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCkgJiYgbV9jdXJyZW50Rm9j
dXNFbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKTsKKworICAgIGlmICghc2VsZWN0aW9uU3Rh
cnQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jv
b2wgSW5wdXRIYW5kbGVyOjpzZWxlY3Rpb25BdEVuZE9mRWxlbWVudCgpCit7CisgICAgaWYgKCFp
c0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVCht
X2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCkgJiYgbV9jdXJyZW50Rm9jdXNFbGVtZW50
LT5kb2N1bWVudCgpLT5mcmFtZSgpKTsKKworICAgIHJldHVybiBzZWxlY3Rpb25TdGFydCgpID09
IHN0YXRpY19jYXN0PGludD4oZWxlbWVudFRleHQoKS5sZW5ndGgoKSk7Cit9CisKK2ludCBJbnB1
dEhhbmRsZXI6OnNlbGVjdGlvblN0YXJ0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2VsZWN0aW9u
UG9zaXRpb24odHJ1ZSk7Cit9CisKK2ludCBJbnB1dEhhbmRsZXI6OnNlbGVjdGlvbkVuZCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIHNlbGVjdGlvblBvc2l0aW9uKGZhbHNlKTsKK30KKworaW50IElu
cHV0SGFuZGxlcjo6c2VsZWN0aW9uUG9zaXRpb24oYm9vbCBzdGFydCkgY29uc3QKK3sKKyAgICBp
ZiAoIW1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKSB8fCAhbV9jdXJyZW50Rm9jdXNF
bGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlm
IChIVE1MVGV4dEZvcm1Db250cm9sRWxlbWVudCogY29udHJvbEVsZW1lbnQgPSBET01TdXBwb3J0
Ojp0b1RleHRDb250cm9sRWxlbWVudChtX2N1cnJlbnRGb2N1c0VsZW1lbnQuZ2V0KCkpKQorICAg
ICAgICByZXR1cm4gc3RhcnQgPyBjb250cm9sRWxlbWVudC0+c2VsZWN0aW9uU3RhcnQoKSA6IGNv
bnRyb2xFbGVtZW50LT5zZWxlY3Rpb25FbmQoKTsKKworICAgIEZyYW1lU2VsZWN0aW9uIGNhcmV0
U2VsZWN0aW9uOworICAgIGNhcmV0U2VsZWN0aW9uLnNldFNlbGVjdGlvbihtX2N1cnJlbnRGb2N1
c0VsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCktPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKSk7
CisgICAgUmVmUHRyPFJhbmdlPiByYW5nZVNlbGVjdGlvbiA9IGNhcmV0U2VsZWN0aW9uLnNlbGVj
dGlvbigpLnRvTm9ybWFsaXplZFJhbmdlKCk7CisgICAgaWYgKCFyYW5nZVNlbGVjdGlvbikKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgc2VsZWN0aW9uUG9pbnRJbk5vZGUgPSBzdGFydCA/
IHJhbmdlU2VsZWN0aW9uLT5zdGFydE9mZnNldCgpIDogcmFuZ2VTZWxlY3Rpb24tPmVuZE9mZnNl
dCgpOworICAgIE5vZGUqIGNvbnRhaW5lck5vZGUgPSBzdGFydCA/IHJhbmdlU2VsZWN0aW9uLT5z
dGFydENvbnRhaW5lcigpIDogcmFuZ2VTZWxlY3Rpb24tPmVuZENvbnRhaW5lcigpOworCisgICAg
RXhjZXB0aW9uQ29kZSBlYzsKKyAgICBSZWZQdHI8UmFuZ2U+IHJhbmdlRm9yTm9kZSA9IHJhbmdl
T2ZDb250ZW50cyhtX2N1cnJlbnRGb2N1c0VsZW1lbnQuZ2V0KCkpOworICAgIHJhbmdlRm9yTm9k
ZS0+c2V0RW5kKGNvbnRhaW5lck5vZGUsIHNlbGVjdGlvblBvaW50SW5Ob2RlLCBlYyk7CisgICAg
QVNTRVJUKCFlYyk7CisKKyAgICByZXR1cm4gVGV4dEl0ZXJhdG9yOjpyYW5nZUxlbmd0aChyYW5n
ZUZvck5vZGUuZ2V0KCkpOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6c2VsZWN0aW9uQ2hhbmdl
ZCgpCit7CisgICAgLy8gVGhpcyBtZXRob2QgY2FuIGdldCBjYWxsZWQgZHVyaW5nIFdlYlBhZ2Ug
c2h1dGRvd24gcHJvY2Vzcy4KKyAgICAvLyBJZiB0aGF0IGlzIHRoZSBjYXNlLCBqdXN0IGJhaWwg
b3V0IHNpbmNlIHRoZSBjbGllbnQgaXMgbm90CisgICAgLy8gaW4gYSBzYWZlIHN0YXRlIG9mIHRy
dXN0IHRvIHJlcXVlc3QgYW55dGhpbmcgZWxzZSBmcm9tIGl0LgorICAgIGlmICghbV93ZWJQYWdl
LT5tX21haW5GcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFpc0FjdGl2ZVRleHRF
ZGl0KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwcm9jZXNzaW5nQ2hhbmdlKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFNjcm9sbCB0aGUgZmllbGQgaWYgbmVjZXNzYXJ5LiBU
aGlzIG11c3QgYmUgZG9uZSBldmVuIGlmIHdlIGFyZSBwcm9jZXNzaW5nCisgICAgLy8gYSBjaGFu
Z2UgYXMgdGhlIHRleHQgY2hhbmdlIG1heSBoYXZlIG1vdmVkIHRoZSBjYXJldC4gSU1GIGRvZXNu
J3QgcmVxdWlyZQorICAgIC8vIHRoZSB1cGRhdGUsIGJ1dCB0aGUgdXNlciBuZWVkcyB0byBzZWUg
dGhlIGNhcmV0LgorICAgIGVuc3VyZUZvY3VzVGV4dEVsZW1lbnRWaXNpYmxlKEVkZ2VJZk5lZWRl
ZCk7CisKKyAgICBBU1NFUlQobV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpICYmIG1f
Y3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7CisKKyAgICBpbnQgbmV3
U2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCgpOworICAgIGludCBuZXdTZWxlY3Rpb25F
bmQgPSBzZWxlY3Rpb25FbmQoKTsKKworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OnNlbGVjdGlvbkNoYW5nZWQgc2VsZWN0aW9u
U3RhcnQ9JXUsIHNlbGVjdGlvbkVuZD0ldSIsIG5ld1NlbGVjdGlvblN0YXJ0LCBuZXdTZWxlY3Rp
b25FbmQpOworCisgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+aW5wdXRTZWxlY3Rpb25DaGFuZ2Vk
KG5ld1NlbGVjdGlvblN0YXJ0LCBuZXdTZWxlY3Rpb25FbmQpOworCisgICAgLy8gUmVtb3ZlIHRo
ZSBhdHRyaWJ1dGVkIHRleHQgbWFya2VycyBhcyB0aGUgcHJldmlvdXMgY2FsbCB0cmlnZ2VyZWQg
YW4gZW5kIHRvCisgICAgLy8gdGhlIGNvbXBvc2l0aW9uLgorICAgIHJlbW92ZUF0dHJpYnV0ZWRU
ZXh0TWFya2VyKCk7Cit9CisKK2Jvb2wgSW5wdXRIYW5kbGVyOjpzZXRDdXJzb3JQb3NpdGlvbihp
bnQgbG9jYXRpb24pCit7CisgICAgcmV0dXJuIHNldFNlbGVjdGlvbihsb2NhdGlvbiwgbG9jYXRp
b24pOworfQorCitib29sIElucHV0SGFuZGxlcjo6c2V0U2VsZWN0aW9uKGludCBzdGFydCwgaW50
IGVuZCwgYm9vbCBjaGFuZ2VJc1BhcnRPZkNvbXBvc2l0aW9uKQoreworICAgIGlmICghaXNBY3Rp
dmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBBU1NFUlQobV9jdXJy
ZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9j
dW1lbnQoKS0+ZnJhbWUoKSk7CisKKyAgICBQcm9jZXNzaW5nQ2hhbmdlR3VhcmQgZ3VhcmQodGhp
cyk7CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiA9IERPTVN1cHBvcnQ6OnZp
c2libGVTZWxlY3Rpb25Gb3JSYW5nZUlucHV0RWxlbWVudChtX2N1cnJlbnRGb2N1c0VsZW1lbnQu
Z2V0KCksIHN0YXJ0LCBlbmQpOworICAgIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQo
KS0+ZnJhbWUoKS0+c2VsZWN0aW9uKCktPnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24sIGNoYW5n
ZUlzUGFydE9mQ29tcG9zaXRpb24gPyAwIDogRnJhbWVTZWxlY3Rpb246OkNsb3NlVHlwaW5nIHwg
RnJhbWVTZWxlY3Rpb246OkNsZWFyVHlwaW5nU3R5bGUpOworCisgICAgSW5wdXRMb2coQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIklucHV0SGFuZGxlcjo6c2V0U2VsZWN0aW9u
IHNlbGVjdGlvblN0YXJ0PSV1LCBzZWxlY3Rpb25FbmQ9JXUiLCBzdGFydCwgZW5kKTsKKworICAg
IHJldHVybiBzdGFydCA9PSBzZWxlY3Rpb25TdGFydCgpICYmIGVuZCA9PSBzZWxlY3Rpb25FbmQo
KTsKK30KKworV2ViQ29yZTo6SW50UmVjdCBJbnB1dEhhbmRsZXI6OnJlY3RGb3JDYXJldChpbnQg
aW5kZXgpCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiBX
ZWJDb3JlOjpJbnRSZWN0KCk7CisKKyAgICBBU1NFUlQobV9jdXJyZW50Rm9jdXNFbGVtZW50LT5k
b2N1bWVudCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7
CisKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gZWxlbWVudFRleHQoKS5sZW5ndGgoKSkg
eworICAgICAgICAvLyBJbnZhbGlkIHJlcXVlc3QuCisgICAgICAgIHJldHVybiBXZWJDb3JlOjpJ
bnRSZWN0KCk7CisgICAgfQorCisgICAgRnJhbWVTZWxlY3Rpb24gY2FyZXRTZWxlY3Rpb247Cisg
ICAgY2FyZXRTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKERPTVN1cHBvcnQ6OnZpc2libGVTZWxlY3Rp
b25Gb3JSYW5nZUlucHV0RWxlbWVudChtX2N1cnJlbnRGb2N1c0VsZW1lbnQuZ2V0KCksIGluZGV4
LCBpbmRleCkudmlzaWJsZVN0YXJ0KCkpOworICAgIGNhcmV0U2VsZWN0aW9uLm1vZGlmeShGcmFt
ZVNlbGVjdGlvbjo6QWx0ZXJhdGlvbkV4dGVuZCwgRGlyZWN0aW9uRm9yd2FyZCwgQ2hhcmFjdGVy
R3JhbnVsYXJpdHkpOworICAgIHJldHVybiBjYXJldFNlbGVjdGlvbi5zZWxlY3Rpb24oKS52aXNp
YmxlU3RhcnQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRzKCk7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVy
OjpjYW5jZWxTZWxlY3Rpb24oKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVu
dCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7CisKKyAg
ICBpbnQgc2VsZWN0aW9uU3RhcnRQb3NpdGlvbiA9IHNlbGVjdGlvblN0YXJ0KCk7CisgICAgUHJv
Y2Vzc2luZ0NoYW5nZUd1YXJkIGd1YXJkKHRoaXMpOworICAgIHNldEN1cnNvclBvc2l0aW9uKHNl
bGVjdGlvblN0YXJ0UG9zaXRpb24pOworfQorCitib29sIElucHV0SGFuZGxlcjo6aGFuZGxlS2V5
Ym9hcmRJbnB1dChjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudCYga2V5
Ym9hcmRFdmVudCwgYm9vbCBjaGFuZ2VJc1BhcnRPZkNvbXBvc2l0aW9uKQoreworICAgIElucHV0
TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6Omhh
bmRsZUtleWJvYXJkSW5wdXQgcmVjZWl2ZWQgY2hhcmFjdGVyPSVsYywgdHlwZT0lZCIsIGtleWJv
YXJkRXZlbnQuY2hhcmFjdGVyKCksIGtleWJvYXJkRXZlbnQudHlwZSgpKTsKKworICAgIC8vIElm
IHdlIGFyZW4ndCBzcGVjaWZpY2FsbHkgcGFydCBvZiBhIGNvbXBvc2l0aW9uLCBmYWlsLCBJTUYg
c2hvdWxkIG5ldmVyIHNlbmQga2V5IGlucHV0CisgICAgLy8gd2hpbGUgY29tcG9zaW5nIHRleHQu
IElmIElNRiBoYXMgZmFpbGVkLCB3ZSBzaG91bGQgaGF2ZSBhbHJlYWR5IGZpbmlzaGVkIHRoZQor
ICAgIC8vIGNvbXBvc2l0aW9uIG1hbnVhbGx5LgorICAgIGlmICghY2hhbmdlSXNQYXJ0T2ZDb21w
b3NpdGlvbiAmJiBjb21wb3NpdGlvbkFjdGl2ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBQcm9jZXNzaW5nQ2hhbmdlR3VhcmQgZ3VhcmQodGhpcyk7CisKKyAgICB1bnNpZ25lZCBh
ZGp1c3RlZE1vZGlmaWVycyA9IGtleWJvYXJkRXZlbnQubW9kaWZpZXJzKCk7CisgICAgaWYgKFdU
Rjo6aXNBU0NJSVVwcGVyKGtleWJvYXJkRXZlbnQuY2hhcmFjdGVyKCkpKQorICAgICAgICBhZGp1
c3RlZE1vZGlmaWVycyB8PSBLRVlNT0RfU0hJRlQ7CisKKyAgICBBU1NFUlQobV93ZWJQYWdlLT5t
X3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpKTsKKyAgICBib29sIGtleWJvYXJkRXZlbnRIYW5kbGVk
ID0gZmFsc2U7CisgICAgaWYgKEZyYW1lKiBmb2N1c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPm1fcGFn
ZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRGcmFtZSgpKSB7CisgICAgICAgIGJvb2wgaXNL
ZXlDaGFyID0ga2V5Ym9hcmRFdmVudC50eXBlKCkgPT0gQmxhY2tCZXJyeTo6UGxhdGZvcm06Oktl
eWJvYXJkRXZlbnQ6OktleUNoYXI7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpLZXli
b2FyZEV2ZW50OjpUeXBlIHR5cGUgPSBrZXlib2FyZEV2ZW50LnR5cGUoKTsKKworICAgICAgICAv
LyBJZiB0aGlzIGlzIGEgS2V5Q2hhciB0eXBlIHRoZW4gd2UgaGFuZGxlIGl0IGFzIGEga2V5ZG93
biBmb2xsb3dlZCBieSBhIGtleSB1cC4KKyAgICAgICAgaWYgKGlzS2V5Q2hhcikKKyAgICAgICAg
ICAgIHR5cGUgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudDo6S2V5RG93bjsK
KworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudCBhZGp1c3RlZEtl
eWJvYXJkRXZlbnQoa2V5Ym9hcmRFdmVudC5jaGFyYWN0ZXIoKSwgdHlwZSwgYWRqdXN0ZWRNb2Rp
ZmllcnMpOworICAgICAgICBrZXlib2FyZEV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZXZl
bnRIYW5kbGVyKCktPmtleUV2ZW50KFBsYXRmb3JtS2V5Ym9hcmRFdmVudChhZGp1c3RlZEtleWJv
YXJkRXZlbnQpKTsKKworICAgICAgICBpZiAoaXNLZXlDaGFyKSB7CisgICAgICAgICAgICB0eXBl
ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OktleWJvYXJkRXZlbnQ6OktleVVwOworICAgICAgICAg
ICAgYWRqdXN0ZWRLZXlib2FyZEV2ZW50ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OktleWJvYXJk
RXZlbnQoa2V5Ym9hcmRFdmVudC5jaGFyYWN0ZXIoKSwgdHlwZSwgYWRqdXN0ZWRNb2RpZmllcnMp
OworICAgICAgICAgICAga2V5Ym9hcmRFdmVudEhhbmRsZWQgPSBmb2N1c2VkRnJhbWUtPmV2ZW50
SGFuZGxlcigpLT5rZXlFdmVudChQbGF0Zm9ybUtleWJvYXJkRXZlbnQoYWRqdXN0ZWRLZXlib2Fy
ZEV2ZW50KSkgfHwga2V5Ym9hcmRFdmVudEhhbmRsZWQ7CisgICAgICAgIH0KKworICAgICAgICBp
ZiAoIWNoYW5nZUlzUGFydE9mQ29tcG9zaXRpb24gJiYgdHlwZSA9PSBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6S2V5Ym9hcmRFdmVudDo6S2V5VXApCisgICAgICAgICAgICBlbnN1cmVGb2N1c1RleHRF
bGVtZW50VmlzaWJsZShFZGdlSWZOZWVkZWQpOworICAgIH0KKyAgICByZXR1cm4ga2V5Ym9hcmRF
dmVudEhhbmRsZWQ7Cit9CisKK2Jvb2wgSW5wdXRIYW5kbGVyOjpoYW5kbGVOYXZpZ2F0aW9uTW92
ZSh1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIsIGJvb2wgc2hpZnREb3duLCBib29sIGFsdERvd24s
IGJvb2wgY2FuRXhpdEZpZWxkKQoreworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OmhhbmRsZU5hdmlnYXRpb25Nb3ZlIHJlY2Vp
dmVkIGNoYXJhY3Rlcj0lbGMiLCBjaGFyYWN0ZXIpOworCisgICAgYm9vbCBldmVudEhhbmRsZWQg
PSBmYWxzZTsKKyAgICBBU1NFUlQobV93ZWJQYWdlLT5tX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigp
KTsKKyAgICBpZiAoRnJhbWUqIGZvY3VzZWRGcmFtZSA9IG1fd2ViUGFnZS0+bV9wYWdlLT5mb2N1
c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCkpIHsKKyAgICAgICAgLy8gSWYgYWx0IGlzIGRv
d24sIGRvIG5vdCBicmVhayBvdXQgb2YgdGhlIGZpZWxkLgorICAgICAgICBpZiAoY2FuRXhpdEZp
ZWxkICYmICFhbHREb3duKSB7CisgICAgICAgICAgICBpZiAoKGNoYXJhY3RlciA9PSBLRVlDT0RF
X0xFRlQgfHwgY2hhcmFjdGVyID09IEtFWUNPREVfVVApICYmIHNlbGVjdGlvbkF0U3RhcnRPZkVs
ZW1lbnQoKQorICAgICAgICAgICAgICAgIHx8IChjaGFyYWN0ZXIgPT0gS0VZQ09ERV9SSUdIVCB8
fCBjaGFyYWN0ZXIgPT0gS0VZQ09ERV9ET1dOKSAmJiBzZWxlY3Rpb25BdEVuZE9mRWxlbWVudCgp
KSB7CisgICAgICAgICAgICAgICAgc2V0TmF2aWdhdGlvbk1vZGUoZmFsc2UpOworICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
c3dpdGNoIChjaGFyYWN0ZXIpIHsKKyAgICAgICAgY2FzZSBLRVlDT0RFX0xFRlQ6CisgICAgICAg
ICAgICBpZiAoYWx0RG93biAmJiBzaGlmdERvd24pCisgICAgICAgICAgICAgICAgZXZlbnRIYW5k
bGVkID0gZm9jdXNlZEZyYW1lLT5lZGl0b3IoKS0+Y29tbWFuZCgiTW92ZVRvQmVnaW5uaW5nT2ZM
aW5lQW5kTW9kaWZ5U2VsZWN0aW9uIikuZXhlY3V0ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAo
YWx0RG93bikKKyAgICAgICAgICAgICAgICBldmVudEhhbmRsZWQgPSBmb2N1c2VkRnJhbWUtPmVk
aXRvcigpLT5jb21tYW5kKCJNb3ZlVG9CZWdpbm5pbmdPZkxpbmUiKS5leGVjdXRlKCk7CisgICAg
ICAgICAgICBlbHNlIGlmIChzaGlmdERvd24pCisgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVk
ID0gZm9jdXNlZEZyYW1lLT5lZGl0b3IoKS0+Y29tbWFuZCgiTW92ZUxlZnRBbmRNb2RpZnlTZWxl
Y3Rpb24iKS5leGVjdXRlKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXZl
bnRIYW5kbGVkID0gZm9jdXNlZEZyYW1lLT5lZGl0b3IoKS0+Y29tbWFuZCgiTW92ZUxlZnQiKS5l
eGVjdXRlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRVlDT0RFX1JJR0hU
OgorICAgICAgICAgICAgaWYgKGFsdERvd24gJiYgc2hpZnREb3duKQorICAgICAgICAgICAgICAg
IGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoIk1vdmVUb0Vu
ZE9mTGluZUFuZE1vZGlmeVNlbGVjdGlvbiIpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGVsc2Ug
aWYgKGFsdERvd24pCisgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVkID0gZm9jdXNlZEZyYW1l
LT5lZGl0b3IoKS0+Y29tbWFuZCgiTW92ZVRvRW5kT2ZMaW5lIikuZXhlY3V0ZSgpOworICAgICAg
ICAgICAgZWxzZSBpZiAoc2hpZnREb3duKQorICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9
IGZvY3VzZWRGcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoIk1vdmVSaWdodEFuZE1vZGlmeVNlbGVj
dGlvbiIpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBldmVu
dEhhbmRsZWQgPSBmb2N1c2VkRnJhbWUtPmVkaXRvcigpLT5jb21tYW5kKCJNb3ZlUmlnaHQiKS5l
eGVjdXRlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRVlDT0RFX1VQOgor
ICAgICAgICAgICAgaWYgKGFsdERvd24gJiYgc2hpZnREb3duKQorICAgICAgICAgICAgICAgIGV2
ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoIk1vdmVUb0JlZ2lu
bmluZ09mRG9jdW1lbnRBbmRNb2RpZnlTZWxlY3Rpb24iKS5leGVjdXRlKCk7CisgICAgICAgICAg
ICBlbHNlIGlmIChhbHREb3duKQorICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IGZvY3Vz
ZWRGcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoIk1vdmVUb0JlZ2lubmluZ09mRG9jdW1lbnQiKS5l
eGVjdXRlKCk7CisgICAgICAgICAgICBlbHNlIGlmIChzaGlmdERvd24pCisgICAgICAgICAgICAg
ICAgZXZlbnRIYW5kbGVkID0gZm9jdXNlZEZyYW1lLT5lZGl0b3IoKS0+Y29tbWFuZCgiTW92ZVVw
QW5kTW9kaWZ5U2VsZWN0aW9uIikuZXhlY3V0ZSgpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQo
Ik1vdmVVcCIpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtF
WUNPREVfRE9XTjoKKyAgICAgICAgICAgIGlmIChhbHREb3duICYmIHNoaWZ0RG93bikKKyAgICAg
ICAgICAgICAgICBldmVudEhhbmRsZWQgPSBmb2N1c2VkRnJhbWUtPmVkaXRvcigpLT5jb21tYW5k
KCJNb3ZlVG9FbmRPZkRvY3VtZW50QW5kTW9kaWZ5U2VsZWN0aW9uIikuZXhlY3V0ZSgpOworICAg
ICAgICAgICAgZWxzZSBpZiAoYWx0RG93bikKKyAgICAgICAgICAgICAgICBldmVudEhhbmRsZWQg
PSBmb2N1c2VkRnJhbWUtPmVkaXRvcigpLT5jb21tYW5kKCJNb3ZlVG9FbmRPZkRvY3VtZW50Iiku
ZXhlY3V0ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoc2hpZnREb3duKQorICAgICAgICAgICAg
ICAgIGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoIk1vdmVE
b3duQW5kTW9kaWZ5U2VsZWN0aW9uIikuZXhlY3V0ZSgpOworICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRpdG9yKCktPmNvbW1h
bmQoIk1vdmVEb3duIikuZXhlY3V0ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0K
KyAgICB9CisgICAgcmV0dXJuIGV2ZW50SGFuZGxlZDsKK30KKworYm9vbCBJbnB1dEhhbmRsZXI6
OmRlbGV0ZVNlbGVjdGlvbigpCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRv
Y3VtZW50KCkgJiYgbV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKTsK
KyAgICBGcmFtZSogZnJhbWUgPSBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPmZy
YW1lKCk7CisKKyAgICBpZiAoZnJhbWUtPnNlbGVjdGlvbigpLT5zZWxlY3Rpb25UeXBlKCkgIT0g
VmlzaWJsZVNlbGVjdGlvbjo6UmFuZ2VTZWxlY3Rpb24pCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIEFTU0VSVChmcmFtZS0+ZWRpdG9yKCkpOworICAgIHJldHVybiBmcmFtZS0+ZWRpdG9y
KCktPmNvbW1hbmQoIkRlbGV0ZUJhY2t3YXJkIikuZXhlY3V0ZSgpOworfQorCit2b2lkIElucHV0
SGFuZGxlcjo6aW5zZXJ0VGV4dChjb25zdCBXVEY6OlN0cmluZyYgc3RyaW5nKQoreworICAgIGlm
ICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9j
dXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+
ZG9jdW1lbnQoKS0+ZnJhbWUoKSAmJiBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCkt
PmZyYW1lKCktPmVkaXRvcigpKTsKKyAgICBFZGl0b3IqIGVkaXRvciA9IG1fY3VycmVudEZvY3Vz
RWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+ZWRpdG9yKCk7CisKKyAgICBlZGl0b3ItPmNv
bW1hbmQoIkluc2VydFRleHQiKS5leGVjdXRlKHN0cmluZyk7Cit9CisKK3ZvaWQgSW5wdXRIYW5k
bGVyOjpjbGVhckZpZWxkKCkKK3sKKyAgICBpZiAoIWlzQWN0aXZlVGV4dEVkaXQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQVNTRVJUKG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQo
KSAmJiBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkgJiYgbV9jdXJy
ZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpLT5lZGl0b3IoKSk7CisgICAgRWRp
dG9yKiBlZGl0b3IgPSBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkt
PmVkaXRvcigpOworCisgICAgZWRpdG9yLT5jb21tYW5kKCJTZWxlY3RBbGwiKS5leGVjdXRlKCk7
CisgICAgZWRpdG9yLT5jb21tYW5kKCJEZWxldGVCYWNrd2FyZCIpLmV4ZWN1dGUoKTsKK30KKwor
Ym9vbCBJbnB1dEhhbmRsZXI6OmV4ZWN1dGVUZXh0RWRpdENvbW1hbmQoY29uc3QgV1RGOjpTdHJp
bmcmIGNvbW1hbmROYW1lKQoreworICAgIEFTU0VSVChtX3dlYlBhZ2UtPmZvY3VzZWRPck1haW5G
cmFtZSgpICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPmVkaXRvcigpKTsKKyAg
ICBFZGl0b3IqIGVkaXRvciA9IG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPmVkaXRv
cigpOworCisgICAgcmV0dXJuIGVkaXRvci0+Y29tbWFuZChjb21tYW5kTmFtZSkuZXhlY3V0ZSgp
OworfQorCit2b2lkIElucHV0SGFuZGxlcjo6Y3V0KCkKK3sKKyAgICBleGVjdXRlVGV4dEVkaXRD
b21tYW5kKCJDdXQiKTsKK30KKwordm9pZCBJbnB1dEhhbmRsZXI6OmNvcHkoKQoreworICAgIGV4
ZWN1dGVUZXh0RWRpdENvbW1hbmQoIkNvcHkiKTsKK30KKwordm9pZCBJbnB1dEhhbmRsZXI6OnBh
c3RlKCkKK3sKKyAgICBleGVjdXRlVGV4dEVkaXRDb21tYW5kKCJQYXN0ZSIpOworfQorCit2b2lk
IElucHV0SGFuZGxlcjo6YWRkQXR0cmlidXRlZFRleHRNYXJrZXIoaW50IHN0YXJ0LCBpbnQgZW5k
LCBjb25zdCBBdHRyaWJ1dGVUZXh0U3R5bGUmIHN0eWxlKQoreworICAgIGlmICgoZW5kIC0gc3Rh
cnQpIDwgMSB8fCBlbmQgPiBzdGF0aWNfY2FzdDxpbnQ+KGVsZW1lbnRUZXh0KCkubGVuZ3RoKCkp
KQorICAgICAgICByZXR1cm47CisKKyAgICBSZWZQdHI8UmFuZ2U+IG1hcmtlclJhbmdlID0gRE9N
U3VwcG9ydDo6dmlzaWJsZVNlbGVjdGlvbkZvclJhbmdlSW5wdXRFbGVtZW50KG1fY3VycmVudEZv
Y3VzRWxlbWVudC5nZXQoKSwgc3RhcnQsIGVuZCkudG9Ob3JtYWxpemVkUmFuZ2UoKTsKKyAgICBt
X2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPm1hcmtlcnMoKS0+YWRkTWFya2VyKG1h
cmtlclJhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6QXR0cmlidXRlVGV4dCwgV1RGOjpTdHJp
bmcoIklucHV0IE1hcmtlciIpLCBzdHlsZSk7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpyZW1v
dmVBdHRyaWJ1dGVkVGV4dE1hcmtlcigpCit7CisgICAgLy8gUmVtb3ZlIGFsbCBhdHRyaWJ1dGUg
dGV4dCBtYXJrZXJzLgorICAgIGlmIChtX2N1cnJlbnRGb2N1c0VsZW1lbnQgJiYgbV9jdXJyZW50
Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpKQorICAgICAgICBtX2N1cnJlbnRGb2N1c0VsZW1lbnQt
PmRvY3VtZW50KCktPm1hcmtlcnMoKS0+cmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtlcjo6QXR0
cmlidXRlVGV4dCk7CisKKyAgICBtX2NvbXBvc2luZ1RleHRTdGFydCA9IDA7CisgICAgbV9jb21w
b3NpbmdUZXh0RW5kID0gMDsKK30KKwordm9pZCBJbnB1dEhhbmRsZXI6OmhhbmRsZUlucHV0TG9j
YWxlQ2hhbmdlZChib29sIGlzUlRMKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1
bWVudCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7Cisg
ICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG1fY3VycmVudEZvY3VzRWxlbWVudC0+cmVuZGVy
ZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyKQorICAgICAgICByZXR1cm47CisKKyAgICBFZGl0b3Iq
IGVkaXRvciA9IG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+ZWRp
dG9yKCk7CisgICAgQVNTRVJUKGVkaXRvcik7CisgICAgaWYgKChyZW5kZXJlci0+c3R5bGUoKS0+
ZGlyZWN0aW9uKCkgPT0gUlRMKSAhPSBpc1JUTCkKKyAgICAgICAgZWRpdG9yLT5zZXRCYXNlV3Jp
dGluZ0RpcmVjdGlvbihpc1JUTCA/IFJpZ2h0VG9MZWZ0V3JpdGluZ0RpcmVjdGlvbiA6IExlZnRU
b1JpZ2h0V3JpdGluZ0RpcmVjdGlvbik7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpjbGVhckN1
cnJlbnRGb2N1c0VsZW1lbnQoKQoreworICAgIGlmIChtX2N1cnJlbnRGb2N1c0VsZW1lbnQpCisg
ICAgICAgIG1fY3VycmVudEZvY3VzRWxlbWVudC0+Ymx1cigpOworfQorCitib29sIElucHV0SGFu
ZGxlcjo6d2lsbE9wZW5Qb3B1cEZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICAvLyBUaGlzIG1l
dGhvZCBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggSW5wdXRIYW5kbGVyOjpkaWROb2Rl
T3BlblBvcHVwLgorICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
QVNTRVJUKCFub2RlLT5pc0luU2hhZG93VHJlZSgpKTsKKworICAgIGlmIChub2RlLT5oYXNUYWdO
YW1lKEhUTUxOYW1lczo6c2VsZWN0VGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6
b3B0aW9uVGFnKSkgeworICAgICAgICAvLyBXZSBvcGVuIGxpc3QgcG9wdXBzIGZvciBvcHRpb25z
IGFuZCBzZWxlY3RzLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobm9k
ZS0+aXNFbGVtZW50Tm9kZSgpKSB7CisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNf
Y2FzdDxFbGVtZW50Kj4obm9kZSk7CisgICAgICAgIGlmIChET01TdXBwb3J0Ojppc1BvcHVwSW5w
dXRGaWVsZChlbGVtZW50KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJbnB1dEhhbmRsZXI6OmRpZE5vZGVPcGVuUG9wdXAo
Tm9kZSogbm9kZSkKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGtlcHQgc3luY2hyb25p
emVkIHdpdGggSW5wdXRIYW5kbGVyOjp3aWxsT3BlblBvcHVwRm9yTm9kZS4KKyAgICBpZiAoIW5v
ZGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVCghbm9kZS0+aXNJblNoYWRv
d1RyZWUoKSk7CisKKyAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnNlbGVjdFRh
ZykpCisgICAgICAgIHJldHVybiBvcGVuU2VsZWN0UG9wdXAoc3RhdGljX2Nhc3Q8SFRNTFNlbGVj
dEVsZW1lbnQqPihub2RlKSk7CisKKyAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6
Om9wdGlvblRhZykpIHsKKyAgICAgICAgSFRNTE9wdGlvbkVsZW1lbnQqIG9wdGlvbkVsZW1lbnQg
PSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KG5vZGUpOworICAgICAgICByZXR1cm4g
b3BlblNlbGVjdFBvcHVwKG9wdGlvbkVsZW1lbnQtPm93bmVyU2VsZWN0RWxlbWVudCgpKTsKKyAg
ICB9CisKKyAgICBpZiAoSFRNTElucHV0RWxlbWVudCogZWxlbWVudCA9IG5vZGUtPnRvSW5wdXRF
bGVtZW50KCkpIHsKKyAgICAgICAgaWYgKERPTVN1cHBvcnQ6OmlzRGF0ZVRpbWVJbnB1dEZpZWxk
KGVsZW1lbnQpKQorICAgICAgICAgICAgcmV0dXJuIG9wZW5EYXRlUG9wdXAoZWxlbWVudCwgZWxl
bWVudFR5cGUoZWxlbWVudCkpOworCisgICAgICAgIGlmIChET01TdXBwb3J0Ojppc0NvbG9ySW5w
dXRGaWVsZChlbGVtZW50KSkKKyAgICAgICAgICAgIHJldHVybiBvcGVuQ29sb3JQb3B1cChlbGVt
ZW50KTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIElucHV0SGFuZGxlcjo6
b3BlblNlbGVjdFBvcHVwKEhUTUxTZWxlY3RFbGVtZW50KiBzZWxlY3QpCit7CisgICAgaWYgKCFz
ZWxlY3QgfHwgc2VsZWN0LT5kaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBpZiAoaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICBjbGVhckN1cnJlbnRGb2N1c0VsZW1l
bnQoKTsKKworICAgIG1fY3VycmVudEZvY3VzRWxlbWVudCA9IHNlbGVjdDsKKyAgICBtX2N1cnJl
bnRGb2N1c0VsZW1lbnRUeXBlID0gU2VsZWN0UG9wdXA7CisgICAgY29uc3QgV1RGOjpWZWN0b3I8
SFRNTEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gc2VsZWN0LT5saXN0SXRlbXMoKTsKKyAgICBpbnQg
c2l6ZSA9IGxpc3RJdGVtcy5zaXplKCk7CisgICAgaWYgKCFzaXplKSB7CisgICAgICAgIFNjb3Bl
QXJyYXk8V2ViU3RyaW5nPiBsYWJlbHM7CisgICAgICAgIGJvb2wqIGVuYWJsZWRzID0gMDsKKyAg
ICAgICAgaW50KiBpdGVtVHlwZXMgPSAwOworICAgICAgICBib29sKiBzZWxlY3RlZHMgPSAwOwor
ICAgICAgICBtX3dlYlBhZ2UtPm1fY2xpZW50LT5vcGVuUG9wdXBMaXN0KGZhbHNlLCBzaXplLCBs
YWJlbHMsIGVuYWJsZWRzLCBpdGVtVHlwZXMsIHNlbGVjdGVkcyk7CisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKworICAgIGJvb2wgbXVsdGlwbGUgPSBzZWxlY3QtPm11bHRpcGxlKCk7CisK
KyAgICBTY29wZUFycmF5PFdlYlN0cmluZz4gbGFiZWxzOworICAgIGxhYmVscy5yZXNldChuZXcg
V2ViU3RyaW5nW3NpemVdKTsKKyAgICBib29sKiBlbmFibGVkcyA9IG5ldyBib29sW3NpemVdOwor
ICAgIGludCogaXRlbVR5cGVzID0gbmV3IGludFtzaXplXTsKKyAgICBib29sKiBzZWxlY3RlZHMg
PSBuZXcgYm9vbFtzaXplXTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7
CisgICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpvcHRpb25U
YWcpKSB7CisgICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVudCogb3B0aW9uID0gc3RhdGljX2Nh
c3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0pOworICAgICAgICAgICAgbGFiZWxz
W2ldID0gb3B0aW9uLT50ZXh0SW5kZW50ZWRUb1Jlc3BlY3RHcm91cExhYmVsKCk7CisgICAgICAg
ICAgICBlbmFibGVkc1tpXSA9IG9wdGlvbi0+ZGlzYWJsZWQoKSA/IDAgOiAxOworICAgICAgICAg
ICAgc2VsZWN0ZWRzW2ldID0gb3B0aW9uLT5zZWxlY3RlZCgpOworICAgICAgICAgICAgaXRlbVR5
cGVzW2ldID0gVHlwZU9wdGlvbjsKKyAgICAgICAgfSBlbHNlIGlmIChsaXN0SXRlbXNbaV0tPmhh
c1RhZ05hbWUoSFRNTE5hbWVzOjpvcHRncm91cFRhZykpIHsKKyAgICAgICAgICAgIEhUTUxPcHRH
cm91cEVsZW1lbnQqIG9wdEdyb3VwID0gc3RhdGljX2Nhc3Q8SFRNTE9wdEdyb3VwRWxlbWVudCo+
KGxpc3RJdGVtc1tpXSk7CisgICAgICAgICAgICBsYWJlbHNbaV0gPSBvcHRHcm91cC0+Z3JvdXBM
YWJlbFRleHQoKTsKKyAgICAgICAgICAgIGVuYWJsZWRzW2ldID0gb3B0R3JvdXAtPmRpc2FibGVk
KCkgPyAwIDogMTsKKyAgICAgICAgICAgIHNlbGVjdGVkc1tpXSA9IGZhbHNlOworICAgICAgICAg
ICAgaXRlbVR5cGVzW2ldID0gVHlwZUdyb3VwOworICAgICAgICB9IGVsc2UgaWYgKGxpc3RJdGVt
c1tpXS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmhyVGFnKSkgeworICAgICAgICAgICAgZW5hYmxl
ZHNbaV0gPSBmYWxzZTsKKyAgICAgICAgICAgIHNlbGVjdGVkc1tpXSA9IGZhbHNlOworICAgICAg
ICAgICAgaXRlbVR5cGVzW2ldID0gVHlwZVNlcGFyYXRvcjsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIG1fd2ViUGFnZS0+bV9jbGllbnQtPm9wZW5Qb3B1cExpc3QobXVsdGlwbGUsIHNpemUsIGxh
YmVscywgZW5hYmxlZHMsIGl0ZW1UeXBlcywgc2VsZWN0ZWRzKTsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKwordm9pZCBJbnB1dEhhbmRsZXI6OnNldFBvcHVwTGlzdEluZGV4KGludCBpbmRleCkKK3sK
KyAgICBpZiAoaW5kZXggPT0gLTIpIC8vIEFiYW5kb24KKyAgICAgICAgcmV0dXJuIGNsZWFyQ3Vy
cmVudEZvY3VzRWxlbWVudCgpOworCisgICAgaWYgKCFpc0FjdGl2ZVNlbGVjdFBvcHVwKCkpCisg
ICAgICAgIHJldHVybiBjbGVhckN1cnJlbnRGb2N1c0VsZW1lbnQoKTsKKworICAgIFJlbmRlck9i
amVjdCogcmVuZGVyZXIgPSBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPnJlbmRlcmVyKCk7CisgICAg
aWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLT5pc01lbnVMaXN0KCkpIHsKKyAgICAgICAgUmVuZGVy
TWVudUxpc3QqIHJlbmRlck1lbnUgPSB0b1JlbmRlck1lbnVMaXN0KHJlbmRlcmVyKTsKKyAgICAg
ICAgcmVuZGVyTWVudS0+aGlkZVBvcHVwKCk7CisgICAgfQorCisgICAgSFRNTFNlbGVjdEVsZW1l
bnQqIHNlbGVjdEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG1fY3Vy
cmVudEZvY3VzRWxlbWVudC5nZXQoKSk7CisgICAgaW50IG9wdGlvbkluZGV4ID0gc2VsZWN0RWxl
bWVudC0+bGlzdFRvT3B0aW9uSW5kZXgoaW5kZXgpOworICAgIHNlbGVjdEVsZW1lbnQtPm9wdGlv
blNlbGVjdGVkQnlVc2VyKG9wdGlvbkluZGV4LCB0cnVlIC8qIGRlc2VsZWN0ID0gdHJ1ZSAqLywg
dHJ1ZSAvKiBmaXJlT25DaGFuZ2VOb3cgPSBmYWxzZSAqLyk7CisgICAgY2xlYXJDdXJyZW50Rm9j
dXNFbGVtZW50KCk7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpzZXRQb3B1cExpc3RJbmRleGVz
KGludCBzaXplLCBib29sKiBzZWxlY3RlZHMpCit7CisgICAgaWYgKCFpc0FjdGl2ZVNlbGVjdFBv
cHVwKCkpCisgICAgICAgIHJldHVybiBjbGVhckN1cnJlbnRGb2N1c0VsZW1lbnQoKTsKKworICAg
IGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgSFRNTFNlbGVjdEVsZW1lbnQq
IHNlbGVjdEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MU2VsZWN0RWxlbWVudCo+KG1fY3VycmVu
dEZvY3VzRWxlbWVudC5nZXQoKSk7CisgICAgY29uc3QgV1RGOjpWZWN0b3I8SFRNTEVsZW1lbnQq
PiYgaXRlbXMgPSBzZWxlY3RFbGVtZW50LT5saXN0SXRlbXMoKTsKKyAgICBpZiAoaXRlbXMuc2l6
ZSgpICE9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc2l6ZSkpCisgICAgICAgIHJldHVybjsK
KworICAgIEhUTUxPcHRpb25FbGVtZW50KiBvcHRpb247CisgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1zW2ldLT5oYXNUYWdOYW1lKEhUTUxOYW1l
czo6b3B0aW9uVGFnKSkgeworICAgICAgICAgICAgb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9w
dGlvbkVsZW1lbnQqPihpdGVtc1tpXSk7CisgICAgICAgICAgICBvcHRpb24tPnNldFNlbGVjdGVk
U3RhdGUoc2VsZWN0ZWRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZvcmNlIHJl
cGFpbnQgYmVjYXVzZSB3ZSBkbyBub3Qgc2VuZCBtb3VzZSBldmVudHMgdG8gdGhlIHNlbGVjdCBl
bGVtZW50CisgICAgLy8gYW5kIHRoZSBlbGVtZW50IGRvZXNuJ3QgYXV0b21hdGljYWxseSByZXBh
aW50IGl0c2VsZi4KKyAgICBzZWxlY3RFbGVtZW50LT5kaXNwYXRjaEZvcm1Db250cm9sQ2hhbmdl
RXZlbnQoKTsKKyAgICBzZWxlY3RFbGVtZW50LT5yZW5kZXJlcigpLT5yZXBhaW50KCk7CisgICAg
Y2xlYXJDdXJyZW50Rm9jdXNFbGVtZW50KCk7Cit9CisKK2Jvb2wgSW5wdXRIYW5kbGVyOjpzZXRC
YXRjaEVkaXRpbmdBY3RpdmUoYm9vbCBhY3RpdmUpCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRF
ZGl0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChtX2N1cnJlbnRGb2N1
c0VsZW1lbnQtPmRvY3VtZW50KCkpOworICAgIEFTU0VSVChtX2N1cnJlbnRGb2N1c0VsZW1lbnQt
PmRvY3VtZW50KCktPmZyYW1lKCkpOworCisgICAgLy8gRklYTUUgc3dpdGNoIHRoaXMgdG8gbV9j
dXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpIHdoZW4gd2UgaGF2ZSBzZXBh
cmF0ZQorICAgIC8vIGJhY2tpbmdzdG9yZSBmb3IgZWFjaCBmcmFtZS4KKyAgICBCYWNraW5nU3Rv
cmVDbGllbnQqIGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lID0gbV93ZWJQYWdlLT5iYWNraW5n
U3RvcmVDbGllbnRGb3JGcmFtZShtX3dlYlBhZ2UtPm1haW5GcmFtZSgpKTsKKyAgICBBU1NFUlQo
YmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUpOworCisgICAgLy8gRW5hYmxlIC8gRGlzYWJsZSB0
aGUgYmFja2luZ3N0b3JlIHRvIHByZXZlbnQgdmlzdWFsIHVwZGF0ZXMuCisgICAgaWYgKCFhY3Rp
dmUpCisgICAgICAgIGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lLT5iYWNraW5nU3RvcmUoKS0+
cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6OlJlbmRlckFu
ZEJsaXQpOworICAgIGVsc2UKKyAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUtPmJh
Y2tpbmdTdG9yZSgpLT5zdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBJbnB1dEhhbmRsZXI6OmNhcmV0UG9zaXRpb24oKSBj
b25zdAoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm4gLTE7
CisKKyAgICAvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiB0aGUg
c3RhcnQgb2YgdGhlIHNlbGVjdGlvbiBpZgorICAgIC8vIGEgc2VsZWN0aW9uIGlzIGFwcGxpZWQu
CisgICAgcmV0dXJuIHNlbGVjdGlvblN0YXJ0KCk7Cit9CisKK2ludCByZWxhdGl2ZUxlZnRPZmZz
ZXQoaW50IGNhcmV0UG9zaXRpb24sIGludCBsZWZ0T2Zmc2V0KQoreworICAgIEFTU0VSVChjYXJl
dFBvc2l0aW9uID49IDApOworCisgICAgcmV0dXJuIHN0ZDo6bWF4KDAsIGNhcmV0UG9zaXRpb24g
LSBsZWZ0T2Zmc2V0KTsKK30KKworaW50IHJlbGF0aXZlUmlnaHRPZmZzZXQoaW50IGNhcmV0UG9z
aXRpb24sIHVuc2lnbmVkIHRvdGFsTGVuZ3RoT2ZUZXh0LCBpbnQgcmlnaHRPZmZzZXQpCit7Cisg
ICAgQVNTRVJUKGNhcmV0UG9zaXRpb24gPj0gMCk7CisgICAgQVNTRVJUKHRvdGFsTGVuZ3RoT2ZU
ZXh0IDwgSU5UX01BWCk7CisKKyAgICByZXR1cm4gc3RkOjptaW4oY2FyZXRQb3NpdGlvbiArIHJp
Z2h0T2Zmc2V0LCBzdGF0aWNfY2FzdDxpbnQ+KHRvdGFsTGVuZ3RoT2ZUZXh0KSk7Cit9CisKK2Jv
b2wgSW5wdXRIYW5kbGVyOjpkZWxldGVUZXh0UmVsYXRpdmVUb0N1cnNvcihpbnQgbGVmdE9mZnNl
dCwgaW50IHJpZ2h0T2Zmc2V0KQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpIHx8IGNv
bXBvc2l0aW9uQWN0aXZlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFByb2Nlc3Np
bmdDaGFuZ2VHdWFyZCBndWFyZCh0aGlzKTsKKworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OmRlbGV0ZVRleHRSZWxhdGl2ZVRv
Q3Vyc29yIGxlZnQgJWQgcmlnaHQgJWQiLCBsZWZ0T2Zmc2V0LCByaWdodE9mZnNldCk7CisKKyAg
ICBpbnQgY2FyZXRPZmZzZXQgPSBjYXJldFBvc2l0aW9uKCk7CisgICAgaW50IHN0YXJ0ID0gcmVs
YXRpdmVMZWZ0T2Zmc2V0KGNhcmV0T2Zmc2V0LCBsZWZ0T2Zmc2V0KTsKKyAgICBpbnQgZW5kID0g
cmVsYXRpdmVSaWdodE9mZnNldChjYXJldE9mZnNldCwgZWxlbWVudFRleHQoKS5sZW5ndGgoKSwg
cmlnaHRPZmZzZXQpOworICAgIGlmICghZGVsZXRlVGV4dChzdGFydCwgZW5kKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgLy8gU2Nyb2xsIHRoZSBmaWVsZCBpZiBuZWNlc3NhcnkuIFRo
ZSBhdXRvbWF0aWMgdXBkYXRlIGlzIHN1cHByZXNzZWQKKyAgICAvLyBieSB0aGUgcHJvY2Vzc2lu
ZyBjaGFuZ2UgZ3VhcmQuCisgICAgZW5zdXJlRm9jdXNUZXh0RWxlbWVudFZpc2libGUoRWRnZUlm
TmVlZGVkKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElucHV0SGFuZGxlcjo6ZGVs
ZXRlVGV4dChpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFByb2Nlc3NpbmdDaGFuZ2VHdWFyZCBn
dWFyZCh0aGlzKTsKKworICAgIGlmICghc2V0U2VsZWN0aW9uKHN0YXJ0LCBlbmQsIHRydWUgLypj
aGFuZ2VJc1BhcnRPZkNvbXBvc2l0aW9uKi8pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiSW5wdXRIYW5k
bGVyOjpkZWxldGVUZXh0IHN0YXJ0ICVkIGVuZCAlZCIsIHN0YXJ0LCBlbmQpOworCisgICAgcmV0
dXJuIGRlbGV0ZVNlbGVjdGlvbigpOworfQorCitzcGFubmFibGVfc3RyaW5nX3QqIElucHV0SGFu
ZGxlcjo6c3Bhbm5hYmxlVGV4dEluUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQzMl90IGZs
YWdzKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIGlmIChzdGFydCA9PSBlbmQpCisgICAgICAgIHJldHVybiAwOworCisgICAgQVNTRVJU
KGVuZCA+IHN0YXJ0KTsKKyAgICBpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7CisKKyAgICBXVEY6
OlN0cmluZyB0ZXh0U3RyaW5nID0gZWxlbWVudFRleHQoKS5zdWJzdHJpbmcoc3RhcnQsIGxlbmd0
aCk7CisKKyAgICBzcGFubmFibGVfc3RyaW5nX3QqIHBzdCA9IChzcGFubmFibGVfc3RyaW5nX3Qq
KW1hbGxvYyhzaXplb2Yoc3Bhbm5hYmxlX3N0cmluZ190KSk7CisgICAgaWYgKCFwc3QpIHsKKyAg
ICAgICAgSW5wdXRMb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIklucHV0
SGFuZGxlcjo6c3Bhbm5hYmxlVGV4dEluUmFuZ2UgZXJyb3IgYWxsb2NhdGluZyBzcGFubmFibGUg
c3RyaW5nLiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwc3QtPnN0ciA9ICh3
Y2hhcl90KiltYWxsb2Moc2l6ZW9mKHdjaGFyX3QpICogKGxlbmd0aCArIDEpKTsKKyAgICBpZiAo
IXBzdC0+c3RyKSB7CisgICAgICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dM
ZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OnNwYW5uYWJsZVRleHRJblJhbmdlIENhbm5vdCBhbGxv
Y2F0ZSBtZW1vcnkgZm9yIHN0cmluZy5cbiIpOworICAgICAgICBmcmVlKHBzdCk7CisgICAgICAg
IHJldHVybiAwOworICAgIH0KKworICAgIGludCBzdHJpbmdMZW5ndGggPSAwOworICAgIGlmICgh
Y29udmVydFN0cmluZ1RvV2NoYXIodGV4dFN0cmluZywgcHN0LT5zdHIsIGxlbmd0aCArIDEsICZz
dHJpbmdMZW5ndGgpKSB7CisgICAgICAgIGZyZWUocHN0LT5zdHIpOworICAgICAgICBmcmVlKHBz
dCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHBzdC0+bGVuZ3RoID0gc3RyaW5n
TGVuZ3RoOworICAgIHBzdC0+c3BhbnNfY291bnQgPSAwOworICAgIHBzdC0+c3BhbnMgPSAwOwor
ICAgIHJldHVybiBwc3Q7Cit9CisKK3NwYW5uYWJsZV9zdHJpbmdfdCogSW5wdXRIYW5kbGVyOjpz
ZWxlY3RlZFRleHQoaW50MzJfdCBmbGFncykKK3sKKyAgICBpZiAoIWlzQWN0aXZlVGV4dEVkaXQo
KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gc3Bhbm5hYmxlVGV4dEluUmFuZ2Uo
c2VsZWN0aW9uU3RhcnQoKSwgc2VsZWN0aW9uRW5kKCksIGZsYWdzKTsKK30KKworc3Bhbm5hYmxl
X3N0cmluZ190KiBJbnB1dEhhbmRsZXI6OnRleHRCZWZvcmVDdXJzb3IoaW50MzJfdCBsZW5ndGgs
IGludDMyX3QgZmxhZ3MpCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAg
IHJldHVybiAwOworCisgICAgaW50IGNhcmV0T2Zmc2V0ID0gY2FyZXRQb3NpdGlvbigpOworICAg
IGludCBzdGFydCA9IHJlbGF0aXZlTGVmdE9mZnNldChjYXJldE9mZnNldCwgbGVuZ3RoKTsKKyAg
ICBpbnQgZW5kID0gY2FyZXRPZmZzZXQ7CisKKyAgICByZXR1cm4gc3Bhbm5hYmxlVGV4dEluUmFu
Z2Uoc3RhcnQsIGVuZCwgZmxhZ3MpOworfQorCitzcGFubmFibGVfc3RyaW5nX3QqIElucHV0SGFu
ZGxlcjo6dGV4dEFmdGVyQ3Vyc29yKGludDMyX3QgbGVuZ3RoLCBpbnQzMl90IGZsYWdzKQorewor
ICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlu
dCBjYXJldE9mZnNldCA9IGNhcmV0UG9zaXRpb24oKTsKKyAgICBpbnQgc3RhcnQgPSBjYXJldE9m
ZnNldDsKKyAgICBpbnQgZW5kID0gcmVsYXRpdmVSaWdodE9mZnNldChjYXJldE9mZnNldCwgZWxl
bWVudFRleHQoKS5sZW5ndGgoKSwgbGVuZ3RoKTsKKworICAgIHJldHVybiBzcGFubmFibGVUZXh0
SW5SYW5nZShzdGFydCwgZW5kLCBmbGFncyk7Cit9CisKK2V4dHJhY3RlZF90ZXh0X3QqIElucHV0
SGFuZGxlcjo6ZXh0cmFjdGVkVGV4dFJlcXVlc3QoZXh0cmFjdGVkX3RleHRfcmVxdWVzdF90KiBy
ZXF1ZXN0LCBpbnQzMl90IGZsYWdzKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGV4dHJhY3RlZF90ZXh0X3QqIGV4dHJhY3RlZFRleHQg
PSAoZXh0cmFjdGVkX3RleHRfdCAqKW1hbGxvYyhzaXplb2YoZXh0cmFjdGVkX3RleHRfdCkpOwor
CisgICAgLy8gJ2ZsYWdzJyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGV4dCBpcyBiZWluZyBtb25p
dG9yZWQuIFRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkLgorCisgICAgLy8gRklYTUUgYWRkIHNt
YXJ0IGxpbWl0aW5nIGJhc2VkIG9uIHRoZSBoaW50IHNpemVzLiBDdXJyZW50bHkgcmV0dXJuIGFs
bCB0ZXh0LgorCisgICAgZXh0cmFjdGVkVGV4dC0+dGV4dCA9IHNwYW5uYWJsZVRleHRJblJhbmdl
KDAsIGVsZW1lbnRUZXh0KCkubGVuZ3RoKCksIGZsYWdzKTsKKworICAgIC8vIEZJWE1FIGNvbmZp
cm0gdGhlc2Ugc2hvdWxkIGJlIDAgb24gdGhpcyByZXF1ZXN0ZWQuIFRleHQgY2hhbmdlcyB3aWxs
IGxpa2VseSByZXF1aXJlCisgICAgLy8gdGhlIGVuZCBiZSB0aGUgbGVuZ3RoLgorICAgIGV4dHJh
Y3RlZFRleHQtPnBhcnRpYWxfc3RhcnRfb2Zmc2V0ID0gMDsKKyAgICBleHRyYWN0ZWRUZXh0LT5w
YXJ0aWFsX2VuZF9vZmZzZXQgPSAwOworICAgIGV4dHJhY3RlZFRleHQtPnN0YXJ0X29mZnNldCA9
IDA7CisKKyAgICAvLyBBZGp1c3Qgc2VsZWN0aW9uIHZhbHVlcyByZWxhdGl2ZSB0byB0aGUgc3Rh
cnQgb2Zmc2V0LCB3aGljaCBtYXkgYmUgYSBzdWJzZXQKKyAgICAvLyBvZiB0aGUgdGV4dCBpbiB0
aGUgZmllbGQuCisgICAgZXh0cmFjdGVkVGV4dC0+c2VsZWN0aW9uX3N0YXJ0ID0gc2VsZWN0aW9u
U3RhcnQoKSAtIGV4dHJhY3RlZFRleHQtPnN0YXJ0X29mZnNldDsKKyAgICBleHRyYWN0ZWRUZXh0
LT5zZWxlY3Rpb25fZW5kID0gc2VsZWN0aW9uRW5kKCkgLSBleHRyYWN0ZWRUZXh0LT5zdGFydF9v
ZmZzZXQ7CisKKyAgICAvLyBzZWxlY3Rpb25BY3RpdmUgaXMgbm90IGxpbWl0ZWQgdG8gaW5zaWRl
IHRoZSBleHRyYWN0ZWQgdGV4dC4KKyAgICBib29sIHNlbGVjdGlvbkFjdGl2ZSA9IGV4dHJhY3Rl
ZFRleHQtPnNlbGVjdGlvbl9zdGFydCAhPSBleHRyYWN0ZWRUZXh0LT5zZWxlY3Rpb25fZW5kOwor
ICAgIGJvb2wgc2luZ2xlTGluZSA9IG1fY3VycmVudEZvY3VzRWxlbWVudC0+aGFzVGFnTmFtZShI
VE1MTmFtZXM6OmlucHV0VGFnKTsKKworICAgIC8vIEZJWE1FIGZsYWdzIGhhcyB0d28gdmFsdWVz
IGluIGRvYywgZW51bSBub3QgaW4gaGVhZGVyIHlldC4KKyAgICBleHRyYWN0ZWRUZXh0LT5mbGFn
cyA9IHNlbGVjdGlvbkFjdGl2ZSAmIHNpbmdsZUxpbmU7CisKKyAgICByZXR1cm4gZXh0cmFjdGVk
VGV4dDsKK30KKworc3RhdGljIHZvaWQgYWRkQ29tcG9zaXRpb25UZXh0U3R5bGVUb0F0dHJpYnV0
ZVRleHRTdHlsZShBdHRyaWJ1dGVUZXh0U3R5bGUmIHN0eWxlKQoreworICAgIHN0eWxlLnNldFVu
ZGVybGluZShBdHRyaWJ1dGVUZXh0U3R5bGU6OlN0YW5kYXJkVW5kZXJsaW5lKTsKK30KKworc3Rh
dGljIHZvaWQgYWRkQWN0aXZlVGV4dFN0eWxlVG9BdHRyaWJ1dGVUZXh0U3R5bGUoQXR0cmlidXRl
VGV4dFN0eWxlJiBzdHlsZSkKK3sKKyAgICBzdHlsZS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3Io
ImJsdWUiKSk7CisgICAgc3R5bGUuc2V0VGV4dENvbG9yKENvbG9yKCJ3aGl0ZSIpKTsKK30KKwor
c3RhdGljIEF0dHJpYnV0ZVRleHRTdHlsZSBjb21wb3NpdGlvblRleHRTdHlsZSgpCit7CisgICAg
QXR0cmlidXRlVGV4dFN0eWxlIHN0eWxlOworICAgIGFkZENvbXBvc2l0aW9uVGV4dFN0eWxlVG9B
dHRyaWJ1dGVUZXh0U3R5bGUoc3R5bGUpOworICAgIHJldHVybiBzdHlsZTsKK30KKworc3RhdGlj
IEF0dHJpYnV0ZVRleHRTdHlsZSB0ZXh0U3R5bGVGcm9tTWFzayhpbnQ2NF90IG1hc2spCit7Cisg
ICAgQXR0cmlidXRlVGV4dFN0eWxlIHN0eWxlOworICAgIGlmIChtYXNrICYgQ09NUE9TRURfVEVY
VF9BVFRSSUIpCisgICAgICAgIGFkZENvbXBvc2l0aW9uVGV4dFN0eWxlVG9BdHRyaWJ1dGVUZXh0
U3R5bGUoc3R5bGUpOworCisgICAgaWYgKG1hc2sgJiBBQ1RJVkVfUkVHSU9OX0FUVFJJQikKKyAg
ICAgICAgYWRkQWN0aXZlVGV4dFN0eWxlVG9BdHRyaWJ1dGVUZXh0U3R5bGUoc3R5bGUpOworCisg
ICAgcmV0dXJuIHN0eWxlOworfQorCitib29sIElucHV0SGFuZGxlcjo6cmVtb3ZlQ29tcG9zZWRU
ZXh0KCkKK3sKKyAgICBpZiAoY29tcG9zaXRpb25BY3RpdmUoKSkgeworICAgICAgICBpZiAoIWRl
bGV0ZVRleHQobV9jb21wb3NpbmdUZXh0U3RhcnQsIG1fY29tcG9zaW5nVGV4dEVuZCkpIHsKKyAg
ICAgICAgICAgIC8vIENvdWxkIG5vdCByZW1vdmUgdGhlIGV4aXN0aW5nIGNvbXBvc2l0aW9uIHJl
Z2lvbi4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZW1v
dmVBdHRyaWJ1dGVkVGV4dE1hcmtlcigpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQor
CitpbnQzMl90IElucHV0SGFuZGxlcjo6c2V0Q29tcG9zaW5nUmVnaW9uKGludDMyX3Qgc3RhcnQs
IGludDMyX3QgZW5kKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICBy
ZXR1cm4gLTE7CisKKyAgICBpZiAoIXJlbW92ZUNvbXBvc2VkVGV4dCgpKSB7CisgICAgICAgIC8v
IENvdWxkIG5vdCByZW1vdmUgdGhlIGV4aXN0aW5nIGNvbXBvc2l0aW9uIHJlZ2lvbi4KKyAgICAg
ICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1fY29tcG9zaW5nVGV4dFN0YXJ0ID0gc3RhcnQ7
CisgICAgbV9jb21wb3NpbmdUZXh0RW5kID0gZW5kOworCisgICAgaWYgKGNvbXBvc2l0aW9uQWN0
aXZlKCkpCisgICAgICAgIGFkZEF0dHJpYnV0ZWRUZXh0TWFya2VyKHN0YXJ0LCBlbmQsIGNvbXBv
c2l0aW9uVGV4dFN0eWxlKCkpOworCisgICAgSW5wdXRMb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkxvZ0xldmVsSW5mbywgIklucHV0SGFuZGxlcjo6c2V0Q29tcG9zaW5nUmVnaW9uIHN0YXJ0ICVk
IGVuZCAlZCIsIHN0YXJ0LCBlbmQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgSW5w
dXRIYW5kbGVyOjpmaW5pc2hDb21wb3NpdGlvbigpCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRF
ZGl0KCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIEZJWE1FIGlmIG5vIGNvbXBvc2l0
aW9uIGlzIGFjdGl2ZSwgc2hvdWxkIHdlIHJldHVybiBmYWlsdXJlIC0xPworICAgIGlmICghY29t
cG9zaXRpb25BY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBSZW1vdmUgYWxs
IG1hcmtlcnMuCisgICAgcmVtb3ZlQXR0cmlidXRlZFRleHRNYXJrZXIoKTsKKworICAgIElucHV0
TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OmZp
bmlzaENvbXBvc2l0aW9uIGNvbXBsZXRlZCIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3NwYW5f
dCogSW5wdXRIYW5kbGVyOjpmaXJzdFNwYW5JblN0cmluZyhzcGFubmFibGVfc3RyaW5nX3QqIHNw
YW5uYWJsZVN0cmluZywgU3Bhbm5hYmxlU3RyaW5nQXR0cmlidXRlIGF0dHJpYikKK3sKKyAgICBz
cGFuX3QqIHNwYW4gPSBzcGFubmFibGVTdHJpbmctPnNwYW5zOworICAgIGZvciAodW5zaWduZWQg
aW50IGkgPSAwOyBpIDwgc3Bhbm5hYmxlU3RyaW5nLT5zcGFuc19jb3VudDsgaSsrKSB7CisgICAg
ICAgIGlmIChzcGFuLT5hdHRyaWJ1dGVzX21hc2sgJiBhdHRyaWIpCisgICAgICAgICAgICByZXR1
cm4gc3BhbjsKKyAgICAgICAgc3BhbisrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiti
b29sIElucHV0SGFuZGxlcjo6aXNUcmFpbGluZ1NpbmdsZUNoYXJhY3RlcihzcGFuX3QqIHNwYW4s
IHVuc2lnbmVkIHN0cmluZ0xlbmd0aCwgdW5zaWduZWQgY29tcG9zaW5nVGV4dExlbmd0aCkKK3sK
KyAgICAvLyBNYWtlIHN1cmUgdGhlIG5ldyBzdHJpbmcgaXMgb25lIGNoYXJhY3RlciBsYXJnZXIg
dGhhbiB0aGUgb2xkLgorICAgIGlmIChjb21wb3NpbmdUZXh0TGVuZ3RoICE9IHN0cmluZ0xlbmd0
aCAtIDEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghc3BhbikKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgLy8gSGFzIG9ubHkgMSBjaGFyYWN0ZXIgY2hhbmdlZD8KKyAg
ICBpZiAoc3Bhbi0+c3RhcnQgPT0gc3Bhbi0+ZW5kKSB7CisgICAgICAgIC8vIElzIHRoaXMgY2hh
cmFjdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nPworICAgICAgICBpZiAoc3Bh
bi0+c3RhcnQgPT0gc3RyaW5nTGVuZ3RoIC0gMSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICAvLyBSZXR1cm4gYWZ0ZXIgdGhlIGZpcnN0IGNoYW5nZWRfYXR0cmliIGlzIGZv
dW5kLgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJbnB1dEhhbmRsZXI6OnNldFRleHQo
c3Bhbm5hYmxlX3N0cmluZ190KiBzcGFubmFibGVTdHJpbmcpCit7CisgICAgaWYgKCFpc0FjdGl2
ZVRleHRFZGl0KCkgfHwgIXNwYW5uYWJsZVN0cmluZykKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgQVNTRVJUKG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKSAmJiBtX2N1cnJl
bnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkpOworICAgIEZyYW1lKiBmcmFtZSA9
IG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKworICAgIEVkaXRv
ciogZWRpdG9yID0gZnJhbWUtPmVkaXRvcigpOworICAgIEFTU0VSVChlZGl0b3IpOworCisgICAg
Ly8gRGlzYWJsZSBzZWxlY3Rpb25IYW5kbGVyJ3MgYWN0aXZlIHNlbGVjdGlvbiBhcyB3ZSB3aWxs
IGJlIHJlc2V0dGluZyBhbmQgdGhlc2UKKyAgICAvLyBjaGFuZ2VzIHNob3VsZCBub3QgYmUgaGFu
ZGxlZCBhcyBub3RpZmljYXRpb24gZXZlbnQuCisgICAgbV93ZWJQYWdlLT5tX3NlbGVjdGlvbkhh
bmRsZXItPnNldFNlbGVjdGlvbkFjdGl2ZShmYWxzZSk7CisKKyAgICBTdHJpbmcgdGV4dFRvSW5z
ZXJ0ID0gY29udmVydFNwYW5uYWJsZVN0cmluZ1RvU3RyaW5nKHNwYW5uYWJsZVN0cmluZyk7Cisg
ICAgaW50IHRleHRMZW5ndGggPSB0ZXh0VG9JbnNlcnQubGVuZ3RoKCk7CisKKyAgICBzcGFuX3Qq
IGNoYW5nZWRTcGFuID0gZmlyc3RTcGFuSW5TdHJpbmcoc3Bhbm5hYmxlU3RyaW5nLCBDSEFOR0VE
X0FUVFJJQik7CisgICAgaW50IGNvbXBvc2luZ1RleHRTdGFydCA9IG1fY29tcG9zaW5nVGV4dFN0
YXJ0OworICAgIGludCBjb21wb3NpbmdUZXh0RW5kID0gbV9jb21wb3NpbmdUZXh0RW5kOworICAg
IGludCBjb21wb3NpbmdUZXh0TGVuZ3RoID0gY29tcG9zaXRpb25MZW5ndGgoKTsKKyAgICByZW1v
dmVBdHRyaWJ1dGVkVGV4dE1hcmtlcigpOworCisgICAgaWYgKGlzVHJhaWxpbmdTaW5nbGVDaGFy
YWN0ZXIoY2hhbmdlZFNwYW4sIHRleHRMZW5ndGgsIGNvbXBvc2luZ1RleHRMZW5ndGgpKSB7Cisg
ICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0ZXh0IGlzIGJlaW5nIGNvbXBvc2VkLgor
ICAgICAgICBpZiAoZmlyc3RTcGFuSW5TdHJpbmcoc3Bhbm5hYmxlU3RyaW5nLCBDT01QT1NFRF9U
RVhUX0FUVFJJQikpCisgICAgICAgICAgICByZXR1cm4gZWRpdG9yLT5jb21tYW5kKCJJbnNlcnRU
ZXh0IikuZXhlY3V0ZSh0ZXh0VG9JbnNlcnQucmlnaHQoMSkpOworICAgICAgICByZXR1cm4gaGFu
ZGxlS2V5Ym9hcmRJbnB1dChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudCh0ZXh0
VG9JbnNlcnRbdGV4dExlbmd0aCAtIDFdLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRF
dmVudDo6S2V5Q2hhciwgMCksIGZhbHNlIC8qIGNoYW5nZUlzUGFydE9mQ29tcG9zaXRpb24gKi8p
OworICAgIH0KKworICAgIC8vIElmIG5vIHNwYW5zIGhhdmUgY2hhbmdlZCwgdHJlYXQgaXQgYXMg
YSBkZWxldGUgb3BlcmF0aW9uLgorICAgIGlmICghY2hhbmdlZFNwYW4pIHsKKyAgICAgICAgLy8g
SWYgdGhlIGNvbXBvc2l0aW9uIGxlbmd0aCBpcyB0aGUgc2FtZSBhcyBvdXIgc3RyaW5nIGxlbmd0
aCwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgorICAgICAgICBpZiAoY29tcG9z
aW5nVGV4dExlbmd0aCA9PSB0ZXh0TGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICAgICAgaWYgKGNvbXBvc2luZ1RleHRMZW5ndGggLSB0ZXh0TGVuZ3RoID09IDEpCisgICAg
ICAgICAgICByZXR1cm4gZWRpdG9yLT5jb21tYW5kKCJEZWxldGVCYWNrd2FyZCIpLmV4ZWN1dGUo
KTsKKyAgICB9CisKKyAgICBpZiAoY29tcG9zaW5nVGV4dExlbmd0aCAmJiAhc2V0U2VsZWN0aW9u
KGNvbXBvc2luZ1RleHRTdGFydCwgY29tcG9zaW5nVGV4dEVuZCwgdHJ1ZSAvKiBjaGFuZ2VJc1Bh
cnRPZkNvbXBvc2l0aW9uICovKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYg
dGhlcmUgaXMgbm8gdGV4dCB0byBhZGQganVzdCBkZWxldGUuCisgICAgaWYgKCF0ZXh0TGVuZ3Ro
KSB7CisgICAgICAgIGlmIChzZWxlY3Rpb25BY3RpdmUoKSkKKyAgICAgICAgICAgIHJldHVybiBl
ZGl0b3ItPmNvbW1hbmQoIkRlbGV0ZUJhY2t3YXJkIikuZXhlY3V0ZSgpOworCisgICAgICAgIC8v
IE5vdGhpbmcgdG8gZG8uCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIElucHV0
TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJzZXRUZXh0IHNwYW5uYWJs
ZVN0cmluZyBpcyAlcywgJWQgXG4iLCB0ZXh0VG9JbnNlcnQubGF0aW4xKCkuZGF0YSgpLCB0ZXh0
TGVuZ3RoKTsKKworICAgIC8vIFRyaWdnZXJpbmcgYW4gaW5zZXJ0IG9mIHRoZSB0ZXh0IHdpdGgg
YSBzcGFjZSBjaGFyYWN0ZXIgdHJhaWxpbmcKKyAgICAvLyBjYXVzZXMgbmV3IHRleHQgdG8gYWRv
cHQgdGhlIHByZXZpb3VzIHRleHQgc3R5bGUuCisgICAgLy8gUmVtb3ZlIGl0IGFuZCBhcHBseSBp
dCBhcyBhIGtleXByZXNzIGxhdGVyLgorICAgIC8vIFVwc3RyZWFtIFdlYmtpdCBidWcgY3JlYXRl
ZCBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzA4MjMKKyAgICBib29s
IHJlcXVpcmVzU3BhY2VLZXlQcmVzcyA9IGZhbHNlOworICAgIGlmICh0ZXh0TGVuZ3RoID4gMCAm
JiB0ZXh0VG9JbnNlcnRbdGV4dExlbmd0aCAtIDFdID09IDMyIC8qIHNwYWNlICovKSB7CisgICAg
ICAgIHJlcXVpcmVzU3BhY2VLZXlQcmVzcyA9IHRydWU7CisgICAgICAgIHRleHRMZW5ndGgtLTsK
KyAgICAgICAgdGV4dFRvSW5zZXJ0LnJlbW92ZSh0ZXh0TGVuZ3RoLCAxKTsKKyAgICB9CisKKyAg
ICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiSW5wdXRIYW5k
bGVyOjpzZXRUZXh0IFJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkIFRleHQgYmVmb3JlICVzIiwgZWxl
bWVudFRleHQoKS5sYXRpbjEoKS5kYXRhKCkpOworCisgICAgaWYgKHRleHRMZW5ndGggPT0gMSAm
JiAhc3Bhbm5hYmxlU3RyaW5nLT5zcGFuc19jb3VudCkgeworICAgICAgICAvLyBIYW5kbGUgc2lu
Z2xlIGtleSBub24tYXR0cmlidXRlZCBlbnRyeSBhcyBrZXkgcHJlc3MgcmF0aGVyIHRoYW4gaW5z
ZXJ0IHRvIGFsbG93CisgICAgICAgIC8vIHRyaWdnZXJpbmcgb2YgamF2YXNjcmlwdCBldmVudHMu
CisKKyAgICAgICAgcmV0dXJuIGhhbmRsZUtleWJvYXJkSW5wdXQoQmxhY2tCZXJyeTo6UGxhdGZv
cm06OktleWJvYXJkRXZlbnQodGV4dFRvSW5zZXJ0WzBdLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
S2V5Ym9hcmRFdmVudDo6S2V5Q2hhciwgMCksIHRydWUgLyogY2hhbmdlSXNQYXJ0T2ZDb21wb3Np
dGlvbiAqLyk7CisgICAgfQorCisgICAgLy8gUGVyZm9ybSB0aGUgdGV4dCBjaGFuZ2UgYXMgYSBz
aW5nbGUgY29tbWFuZCBpZiB0aGVyZSBpcyBvbmUuCisgICAgaWYgKCF0ZXh0VG9JbnNlcnQuaXNF
bXB0eSgpICYmICFlZGl0b3ItPmNvbW1hbmQoIkluc2VydFRleHQiKS5leGVjdXRlKHRleHRUb0lu
c2VydCkpIHsKKyAgICAgICAgSW5wdXRMb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVs
V2FybiwgIklucHV0SGFuZGxlcjo6c2V0VGV4dCBGYWlsZWQgdG8gaW5zZXJ0IHRleHQgJXMiLCB0
ZXh0VG9JbnNlcnQubGF0aW4xKCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJ
bnB1dEhhbmRsZXI6OnNldFRleHQgUmVxdWVzdCBiZWluZyBwcm9jZXNzZWQgVGV4dCBhZnRlciBp
bnNlcnQgJXMiLCBlbGVtZW50VGV4dCgpLmxhdGluMSgpLmRhdGEoKSk7CisKKyAgICBpZiAocmVx
dWlyZXNTcGFjZUtleVByZXNzKQorICAgICAgICBoYW5kbGVLZXlib2FyZElucHV0KEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpLZXlib2FyZEV2ZW50KDMyIC8qIHNwYWNlICovLCBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6S2V5Ym9hcmRFdmVudDo6S2V5Q2hhciwgMCksIHRydWUgLyogY2hhbmdlSXNQYXJ0
T2ZDb21wb3NpdGlvbiAqLyk7CisKKyAgICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
TG9nTGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVyOjpzZXRUZXh0IFRleHQgYWZ0ZXIgJXMiLCBlbGVt
ZW50VGV4dCgpLmxhdGluMSgpLmRhdGEoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBJbnB1dEhhbmRsZXI6OnNldFRleHRBdHRyaWJ1dGVzKGludCBpbnNlcnRpb25Qb2ludCwgc3Bh
bm5hYmxlX3N0cmluZ190KiBzcGFubmFibGVTdHJpbmcpCit7CisgICAgLy8gQXBwbHkgdGhlIGF0
dHJpYnV0ZXMgdG8gdGhlIGZpZWxkLgorICAgIHNwYW5fdCogc3BhbiA9IHNwYW5uYWJsZVN0cmlu
Zy0+c3BhbnM7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzcGFubmFibGVTdHJp
bmctPnNwYW5zX2NvdW50OyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHN0YXJ0UG9zaXRp
b24gPSBpbnNlcnRpb25Qb2ludCArIHNwYW4tPnN0YXJ0OworICAgICAgICAvLyBUaGUgZW5kIHBv
aW50IGluY2x1ZGVzIHRoZSBjaGFyYWN0ZXIgdGhhdCBpdCBpcyBiZWZvcmUuIEllLCAwLCAwCisg
ICAgICAgIC8vIGFwcGxpZXMgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBhcyB0aGUgZW5kIHBvaW50
IGluY2x1ZGVzIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAgLy8gYXQgdGhlIHBvc2l0aW9uLiBUaGlz
IG1lYW5zIHRoZSBlbmRQb3NpdGlvbiBpcyBhbHdheXMgKzEuCisgICAgICAgIHVuc2lnbmVkIGlu
dCBlbmRQb3NpdGlvbiA9IGluc2VydGlvblBvaW50ICsgc3Bhbi0+ZW5kICsgMTsKKyAgICAgICAg
aWYgKGVuZFBvc2l0aW9uIDwgc3RhcnRQb3NpdGlvbiB8fCBlbmRQb3NpdGlvbiA+IGVsZW1lbnRU
ZXh0KCkubGVuZ3RoKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYg
KCFzcGFuLT5hdHRyaWJ1dGVzX21hc2spCisgICAgICAgICAgICBjb250aW51ZTsgLy8gTm90aGlu
ZyB0byBkby4KKworICAgICAgICAvLyBNSVNTUEVMTEVEX1dPUkRfQVRUUklCIGlzIHByZXNlbnQg
YXMgYW4gb3B0aW9uLCBidXQgaXQgaXMgbm90IGN1cnJlbnRseQorICAgICAgICAvLyB1c2VkIGJ5
IElNRi4gV2hlbiB0aGV5IGFkZCBzdXBwb3J0IGZvciBvbiB0aGUgZmx5IHNwZWxsIGNoZWNraW5n
IHdlIGNhbgorICAgICAgICAvLyB1c2UgaXQgdG8gYXBwbHkgc3BlbGxpbmcgbWFya2VycyBhbmQg
ZGlzYWJsZSBjb250aW51b3VzIHNwZWxsIGNoZWNraW5nLgorCisgICAgICAgIElucHV0TG9nKEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OnNldFRleHRB
dHRyaWJ1dGVzIGFkZGluZyBtYXJrZXIgJWQgdG8gJWQgLSAlZCIsIHN0YXJ0UG9zaXRpb24sIGVu
ZFBvc2l0aW9uLCBzcGFuLT5hdHRyaWJ1dGVzX21hc2spOworICAgICAgICBhZGRBdHRyaWJ1dGVk
VGV4dE1hcmtlcihzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwgdGV4dFN0eWxlRnJvbU1hc2so
c3Bhbi0+YXR0cmlidXRlc19tYXNrKSk7CisKKyAgICAgICAgc3BhbisrOworICAgIH0KKworICAg
IElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRs
ZXI6OnNldFRleHRBdHRyaWJ1dGVzIGF0dHJpYnV0ZSBjb3VudCAlZCIsIHNwYW5uYWJsZVN0cmlu
Zy0+c3BhbnNfY291bnQpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSW5wdXRIYW5k
bGVyOjpzZXRSZWxhdGl2ZUN1cnNvclBvc2l0aW9uKGludCBpbnNlcnRpb25Qb2ludCwgaW50IHJl
bGF0aXZlQ3Vyc29yUG9zaXRpb24pCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIDEgcGxhY2UgY3Vyc29yIGF0IGVuZCBvZiBp
bnNlcnRpb24gdGV4dC4KKyAgICBpZiAocmVsYXRpdmVDdXJzb3JQb3NpdGlvbiA9PSAxKSB7Cisg
ICAgICAgIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+c2VsZWN0
aW9uKCktPnJldmVhbFNlbGVjdGlvbihTY3JvbGxBbGlnbm1lbnQ6OmFsaWduVG9FZGdlSWZOZWVk
ZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpbnQgY3Vyc29yUG9zaXRp
b24gPSAwOworICAgIGlmIChyZWxhdGl2ZUN1cnNvclBvc2l0aW9uIDw9IDApIHsKKyAgICAgICAg
Ly8gWmVybyA9IGluc2VydGlvblBvaW50CisgICAgICAgIC8vIE5lZ2F0aXZlIHZhbHVlLCBtb3Zl
IHRoZSBjdXJzb3IgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgY2hhcmFjdGVycyBiZWZvcmUKKyAg
ICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBpbnNlcnRlZCB0ZXh0ZWQuCisgICAgICAgIGN1cnNv
clBvc2l0aW9uID0gaW5zZXJ0aW9uUG9pbnQgKyByZWxhdGl2ZUN1cnNvclBvc2l0aW9uOworICAg
IH0gZWxzZSB7CisgICAgICAgIC8vIFBvc2l0aXZlIHZhbHVlLCBtb3ZlIHRoZSBjdXJzb3IgdGhl
IHJlcXVlc3RlZCBudW1iZXIgb2YgY2hhcmFjdGVycyBhZnRlcgorICAgICAgICAvLyB0aGUgZW5k
IG9mIHRoZSBpbnNlcnRlZCB0ZXh0IG1pbnVzIDEuCisgICAgICAgIGN1cnNvclBvc2l0aW9uID0g
Y2FyZXRQb3NpdGlvbigpICsgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbiAtIDE7CisgICAgfQorCisg
ICAgaWYgKGN1cnNvclBvc2l0aW9uIDwgMCB8fCBjdXJzb3JQb3NpdGlvbiA+IChpbnQpZWxlbWVu
dFRleHQoKS5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSW5wdXRMb2co
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIklucHV0SGFuZGxlcjo6c2V0UmVs
YXRpdmVDdXJzb3JQb3NpdGlvbiBjdXJzb3IgcG9zaXRpb24gJWQiLCBjdXJzb3JQb3NpdGlvbik7
CisKKyAgICByZXR1cm4gc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zaXRpb24pOworfQorCiti
b29sIElucHV0SGFuZGxlcjo6c2V0U3Bhbm5hYmxlVGV4dEFuZFJlbGF0aXZlQ3Vyc29yKHNwYW5u
YWJsZV9zdHJpbmdfdCogc3Bhbm5hYmxlU3RyaW5nLCBpbnQgcmVsYXRpdmVDdXJzb3JQb3NpdGlv
biwgYm9vbCBtYXJrVGV4dEFzQ29tcG9zaW5nKQoreworICAgIElucHV0TG9nKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OnNldFNwYW5uYWJsZVRleHRB
bmRSZWxhdGl2ZUN1cnNvciglZCwgJWQsICVkKVxuIiwgc3Bhbm5hYmxlU3RyaW5nLT5sZW5ndGgs
IHJlbGF0aXZlQ3Vyc29yUG9zaXRpb24sIG1hcmtUZXh0QXNDb21wb3NpbmcpOworICAgIGludCBp
bnNlcnRpb25Qb2ludCA9IGNvbXBvc2l0aW9uQWN0aXZlKCkgPyBtX2NvbXBvc2luZ1RleHRTdGFy
dCA6IHNlbGVjdGlvblN0YXJ0KCk7CisKKyAgICBQcm9jZXNzaW5nQ2hhbmdlR3VhcmQgZ3VhcmQo
dGhpcyk7CisKKyAgICBpZiAoIXNldFRleHQoc3Bhbm5hYmxlU3RyaW5nKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaWYgKCFzZXRUZXh0QXR0cmlidXRlcyhpbnNlcnRpb25Qb2ludCwg
c3Bhbm5hYmxlU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFzZXRS
ZWxhdGl2ZUN1cnNvclBvc2l0aW9uKGluc2VydGlvblBvaW50LCByZWxhdGl2ZUN1cnNvclBvc2l0
aW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1hcmtUZXh0QXNDb21wb3Np
bmcpIHsKKyAgICAgICAgbV9jb21wb3NpbmdUZXh0U3RhcnQgPSBpbnNlcnRpb25Qb2ludDsKKyAg
ICAgICAgbV9jb21wb3NpbmdUZXh0RW5kID0gaW5zZXJ0aW9uUG9pbnQgKyBzcGFubmFibGVTdHJp
bmctPmxlbmd0aDsKKyAgICB9CisKKyAgICAvLyBTY3JvbGwgdGhlIGZpZWxkIGlmIG5lY2Vzc2Fy
eS4gVGhlIGF1dG9tYXRpYyB1cGRhdGUgaXMgc3VwcHJlc3NlZAorICAgIC8vIGJ5IHRoZSBwcm9j
ZXNzaW5nIGNoYW5nZSBndWFyZC4KKyAgICBlbnN1cmVGb2N1c1RleHRFbGVtZW50VmlzaWJsZShF
ZGdlSWZOZWVkZWQpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludDMyX3QgSW5wdXRIYW5k
bGVyOjpzZXRDb21wb3NpbmdUZXh0KHNwYW5uYWJsZV9zdHJpbmdfdCogc3Bhbm5hYmxlU3RyaW5n
LCBpbnQzMl90IHJlbGF0aXZlQ3Vyc29yUG9zaXRpb24pCit7CisgICAgaWYgKCFpc0FjdGl2ZVRl
eHRFZGl0KCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICghc3Bhbm5hYmxlU3RyaW5n
KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6TG9nTGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVyOjpzZXRDb21wb3NpbmdUZXh0IGF0IHJlbGF0
aXZlQ3Vyc29yUG9zaXRpb246ICVkIiwgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbik7CisKKyAgICBy
ZXR1cm4gc2V0U3Bhbm5hYmxlVGV4dEFuZFJlbGF0aXZlQ3Vyc29yKHNwYW5uYWJsZVN0cmluZywg
cmVsYXRpdmVDdXJzb3JQb3NpdGlvbiwgdHJ1ZSAvKiBtYXJrVGV4dEFzQ29tcG9zaW5nICovKSA/
IDAgOiAtMTsKK30KKworaW50MzJfdCBJbnB1dEhhbmRsZXI6OmNvbW1pdFRleHQoc3Bhbm5hYmxl
X3N0cmluZ190KiBzcGFubmFibGVTdHJpbmcsIGludDMyX3QgcmVsYXRpdmVDdXJzb3JQb3NpdGlv
bikKK3sKKyAgICBpZiAoIWlzQWN0aXZlVGV4dEVkaXQoKSkKKyAgICAgICAgcmV0dXJuIC0xOwor
CisgICAgaWYgKCFzcGFubmFibGVTdHJpbmcpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIElu
cHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6
OmNvbW1pdFRleHQiKTsKKworICAgIHJldHVybiBzZXRTcGFubmFibGVUZXh0QW5kUmVsYXRpdmVD
dXJzb3Ioc3Bhbm5hYmxlU3RyaW5nLCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uLCBmYWxzZSAvKiBt
YXJrVGV4dEFzQ29tcG9zaW5nICovKSA/IDAgOiAtMTsKK30KKworfQorfQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvSW5wdXRIYW5kbGVyLmggYi9T
b3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9JbnB1dEhhbmRsZXIuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi4zOWQyNTYwNjgxOGM0Y2E3MzBjMmQzNTE3NWJiZTFhOGIyMGEyZWFmCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvSW5wdXRI
YW5kbGVyLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIw
MTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAg
MDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBJbnB1dEhhbmRsZXJfaAorI2RlZmluZSBJ
bnB1dEhhbmRsZXJfaAorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtSW5wdXRFdmVudHMu
aD4KKworI2luY2x1ZGUgPGltZi9pbnB1dF9kYXRhLmg+CisKKyNpbmNsdWRlIDx3dGYvUmVmUHRy
Lmg+CisKK25hbWVzcGFjZSBXVEYgeworY2xhc3MgU3RyaW5nOworfQorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CitjbGFzcyBBdHRyaWJ1dGVUZXh0U3R5bGU7CitjbGFzcyBFbGVtZW50OworY2xhc3Mg
RnJhbWU7CitjbGFzcyBIVE1MSW5wdXRFbGVtZW50OworY2xhc3MgSFRNTFNlbGVjdEVsZW1lbnQ7
CitjbGFzcyBJbnRSZWN0OworY2xhc3MgTm9kZTsKK2NsYXNzIFJhbmdlOworY2xhc3MgVmlzaWJs
ZVNlbGVjdGlvbjsKK30KKworbmFtZXNwYWNlIEJsYWNrQmVycnkgeworCituYW1lc3BhY2UgUGxh
dGZvcm0geworY2xhc3MgS2V5Ym9hcmRFdmVudDsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisK
K2NsYXNzIFdlYlBhZ2VQcml2YXRlOworCitjbGFzcyBJbnB1dEhhbmRsZXIgeworcHVibGljOgor
ICAgIElucHV0SGFuZGxlcihXZWJQYWdlUHJpdmF0ZSopOworICAgIH5JbnB1dEhhbmRsZXIoKTsK
KworICAgIGVudW0gRm9jdXNFbGVtZW50VHlwZSB7IFRleHRFZGl0LCBUZXh0UG9wdXAgLyogRGF0
ZS9UaW1lICYgQ29sb3IgKi8sIFNlbGVjdFBvcHVwLCBQbHVnaW4gfTsKKyAgICBlbnVtIENhcmV0
U2Nyb2xsVHlwZSB7IENlbnRlckFsd2F5cywgQ2VudGVySWZOZWVkZWQsIEVkZ2VJZk5lZWRlZCB9
OworCisgICAgdm9pZCBub2RlRm9jdXNlZChXZWJDb3JlOjpOb2RlKik7CisgICAgdm9pZCBub2Rl
VGV4dENoYW5nZWQoY29uc3QgV2ViQ29yZTo6Tm9kZSopOworICAgIHZvaWQgc2VsZWN0aW9uQ2hh
bmdlZCgpOworICAgIHZvaWQgZnJhbWVVbmxvYWRlZChXZWJDb3JlOjpGcmFtZSopOworCisgICAg
Ym9vbCBoYW5kbGVLZXlib2FyZElucHV0KGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpLZXli
b2FyZEV2ZW50JiwgYm9vbCBjaGFuZ2VJc1BhcnRPZkNvbXBvc2l0aW9uID0gZmFsc2UpOworICAg
IGJvb2wgaGFuZGxlTmF2aWdhdGlvbk1vdmUoY29uc3QgdW5zaWduZWQgc2hvcnQgY2hhcmFjdGVy
LCBib29sIHNoaWZ0RG93biwgYm9vbCBhbHREb3duLCBib29sIGNhbkV4aXRGaWVsZCA9IHRydWUp
OworCisgICAgYm9vbCBkZWxldGVTZWxlY3Rpb24oKTsKKyAgICB2b2lkIGluc2VydFRleHQoY29u
c3QgV1RGOjpTdHJpbmcmKTsKKyAgICB2b2lkIGNsZWFyRmllbGQoKTsKKworICAgIHZvaWQgY3V0
KCk7CisgICAgdm9pZCBjb3B5KCk7CisgICAgdm9pZCBwYXN0ZSgpOworCisgICAgdm9pZCBjYW5j
ZWxTZWxlY3Rpb24oKTsKKworICAgIHZvaWQgc2V0SW5wdXRWYWx1ZShjb25zdCBXVEY6OlN0cmlu
ZyYpOworCisgICAgYm9vbCBpc0lucHV0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIGlzQWN0aXZlVGV4
dEVkaXQoKTsgfQorICAgIGJvb2wgaXNNdWx0aWxpbmVJbnB1dE1vZGUoKSBjb25zdCB7IHJldHVy
biBpc0FjdGl2ZVRleHRFZGl0KCkgJiYgZWxlbWVudFR5cGUobV9jdXJyZW50Rm9jdXNFbGVtZW50
LmdldCgpKSA9PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW5wdXRUeXBlVGV4dEFyZWE7IH0KKwor
ICAgIHZvaWQgc2V0TmF2aWdhdGlvbk1vZGUoYm9vbCBhY3RpdmUsIGJvb2wgc2VuZE1lc3NhZ2Ug
PSB0cnVlKTsKKworICAgIHZvaWQgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZShib29sIGNlbnRl
ckZpZWxkSW5EaXNwbGF5ID0gdHJ1ZSk7CisgICAgdm9pZCBoYW5kbGVJbnB1dExvY2FsZUNoYW5n
ZWQoYm9vbCBpc1JUTCk7CisKKyAgICAvKiBQb3B1cE1lbnUgTWV0aG9kcyAqLworICAgIGJvb2wg
d2lsbE9wZW5Qb3B1cEZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAgIGJvb2wgZGlkTm9kZU9w
ZW5Qb3B1cChXZWJDb3JlOjpOb2RlKik7CisgICAgYm9vbCBvcGVuTGluZUlucHV0UG9wdXAoV2Vi
Q29yZTo6SFRNTElucHV0RWxlbWVudCopOworICAgIGJvb2wgb3BlblNlbGVjdFBvcHVwKFdlYkNv
cmU6OkhUTUxTZWxlY3RFbGVtZW50Kik7CisgICAgdm9pZCBzZXRQb3B1cExpc3RJbmRleChpbnQp
OworICAgIHZvaWQgc2V0UG9wdXBMaXN0SW5kZXhlcyhpbnQgc2l6ZSwgYm9vbCogc2VsZWN0ZWRz
KTsKKworICAgIGJvb2wgcHJvY2Vzc2luZ0NoYW5nZSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvY2Vz
c2luZ0NoYW5nZTsgfQorICAgIHZvaWQgc2V0UHJvY2Vzc2luZ0NoYW5nZShib29sIHByb2Nlc3Np
bmdDaGFuZ2UpIHsgbV9wcm9jZXNzaW5nQ2hhbmdlID0gcHJvY2Vzc2luZ0NoYW5nZTsgfQorCisg
ICAgV1RGOjpTdHJpbmcgZWxlbWVudFRleHQoKTsKKworICAgIC8vIElNRiBkcml2ZW4gY2FsbHMu
CisgICAgYm9vbCBzZXRCYXRjaEVkaXRpbmdBY3RpdmUoYm9vbCk7CisgICAgYm9vbCBzZXRTZWxl
Y3Rpb24oaW50IHN0YXJ0LCBpbnQgZW5kLCBib29sIGNoYW5nZUlzUGFydE9mQ29tcG9zaXRpb24g
PSBmYWxzZSk7CisgICAgaW50IGNhcmV0UG9zaXRpb24oKSBjb25zdDsKKyAgICBib29sIGRlbGV0
ZVRleHRSZWxhdGl2ZVRvQ3Vyc29yKGludCBsZWZ0T2Zmc2V0LCBpbnQgcmlnaHRPZmZzZXQpOwor
CisgICAgc3Bhbm5hYmxlX3N0cmluZ190KiBzZWxlY3RlZFRleHQoaW50MzJfdCBmbGFncyk7Cisg
ICAgc3Bhbm5hYmxlX3N0cmluZ190KiB0ZXh0QmVmb3JlQ3Vyc29yKGludDMyX3QgbGVuZ3RoLCBp
bnQzMl90IGZsYWdzKTsKKyAgICBzcGFubmFibGVfc3RyaW5nX3QqIHRleHRBZnRlckN1cnNvcihp
bnQzMl90IGxlbmd0aCwgaW50MzJfdCBmbGFncyk7CisgICAgZXh0cmFjdGVkX3RleHRfdCogZXh0
cmFjdGVkVGV4dFJlcXVlc3QoZXh0cmFjdGVkX3RleHRfcmVxdWVzdF90KiwgaW50MzJfdCBmbGFn
cyk7CisKKyAgICBpbnQzMl90IHNldENvbXBvc2luZ1JlZ2lvbihpbnQzMl90IHN0YXJ0LCBpbnQz
Ml90IGVuZCk7CisgICAgaW50MzJfdCBmaW5pc2hDb21wb3NpdGlvbigpOworICAgIGludDMyX3Qg
c2V0Q29tcG9zaW5nVGV4dChzcGFubmFibGVfc3RyaW5nX3QqLCBpbnQzMl90IHJlbGF0aXZlQ3Vy
c29yUG9zaXRpb24pOworICAgIGludDMyX3QgY29tbWl0VGV4dChzcGFubmFibGVfc3RyaW5nX3Qq
LCBpbnQzMl90IHJlbGF0aXZlQ3Vyc29yUG9zaXRpb24pOworCisgICAgYm9vbCBzaG91bGRBY2Nl
cHRJbnB1dEZvY3VzKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBzZXRFbGVtZW50Rm9jdXNlZChX
ZWJDb3JlOjpFbGVtZW50Kik7CisgICAgdm9pZCBzZXRQbHVnaW5Gb2N1c2VkKFdlYkNvcmU6OkVs
ZW1lbnQqKTsKKyAgICB2b2lkIHNldEVsZW1lbnRVbmZvY3VzZWQoYm9vbCByZWZvY3VzT2NjdXJp
bmcgPSBmYWxzZSk7CisKKyAgICB2b2lkIGVuc3VyZUZvY3VzVGV4dEVsZW1lbnRWaXNpYmxlKENh
cmV0U2Nyb2xsVHlwZSA9IENlbnRlckFsd2F5cyk7CisgICAgdm9pZCBlbnN1cmVGb2N1c1BsdWdp
bkVsZW1lbnRWaXNpYmxlKCk7CisKKyAgICB2b2lkIGNsZWFyQ3VycmVudEZvY3VzRWxlbWVudCgp
OworCisgICAgYm9vbCBzZWxlY3Rpb25BdFN0YXJ0T2ZFbGVtZW50KCk7CisgICAgYm9vbCBzZWxl
Y3Rpb25BdEVuZE9mRWxlbWVudCgpOworCisgICAgV2ViQ29yZTo6SW50UmVjdCByZWN0Rm9yQ2Fy
ZXQoaW50IGluZGV4KTsKKworICAgIGJvb2wgaXNBY3RpdmVUZXh0RWRpdCgpIGNvbnN0IHsgcmV0
dXJuIG1fY3VycmVudEZvY3VzRWxlbWVudCAmJiBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUeXBlID09
IFRleHRFZGl0OyB9CisgICAgYm9vbCBpc0FjdGl2ZVRleHRQb3B1cCgpIGNvbnN0IHsgcmV0dXJu
IG1fY3VycmVudEZvY3VzRWxlbWVudCAmJiBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUeXBlID09IFRl
eHRQb3B1cDsgfQorICAgIGJvb2wgaXNBY3RpdmVTZWxlY3RQb3B1cCgpIGNvbnN0IHsgcmV0dXJu
IG1fY3VycmVudEZvY3VzRWxlbWVudCAmJiBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUeXBlID09IFNl
bGVjdFBvcHVwOyB9CisgICAgYm9vbCBpc0FjdGl2ZVBsdWdpbigpIGNvbnN0IHsgcmV0dXJuIG1f
Y3VycmVudEZvY3VzRWxlbWVudCAmJiBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUeXBlID09IFBsdWdp
bjsgfQorCisgICAgYm9vbCBvcGVuRGF0ZVBvcHVwKFdlYkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQq
LCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6QmxhY2tCZXJyeUlucHV0VHlwZSk7CisgICAgYm9vbCBv
cGVuQ29sb3JQb3B1cChXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50Kik7CisKKyAgICBib29sIGV4
ZWN1dGVUZXh0RWRpdENvbW1hbmQoY29uc3QgV1RGOjpTdHJpbmcmKTsKKworICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpCbGFja0JlcnJ5SW5wdXRUeXBlIGVsZW1lbnRUeXBlKFdlYkNvcmU6OkVs
ZW1lbnQqKSBjb25zdDsKKworICAgIGludCBzZWxlY3Rpb25TdGFydCgpIGNvbnN0OworICAgIGlu
dCBzZWxlY3Rpb25FbmQoKSBjb25zdDsKKyAgICBpbnQgc2VsZWN0aW9uUG9zaXRpb24oYm9vbCBz
dGFydCkgY29uc3Q7CisgICAgYm9vbCBzZWxlY3Rpb25BY3RpdmUoKSBjb25zdCB7IHJldHVybiBz
ZWxlY3Rpb25TdGFydCgpICE9IHNlbGVjdGlvbkVuZCgpOyB9CisKKyAgICBib29sIGNvbXBvc2l0
aW9uQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gY29tcG9zaXRpb25MZW5ndGgoKTsgfQorICAgIHVu
c2lnbmVkIGNvbXBvc2l0aW9uTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9jb21wb3NpbmdUZXh0
RW5kIC0gbV9jb21wb3NpbmdUZXh0U3RhcnQ7IH0KKworICAgIHNwYW5uYWJsZV9zdHJpbmdfdCog
c3Bhbm5hYmxlVGV4dEluUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQzMl90IGZsYWdzKTsK
KworICAgIHZvaWQgYWRkQXR0cmlidXRlZFRleHRNYXJrZXIoaW50IHN0YXJ0LCBpbnQgZW5kLCBj
b25zdCBXZWJDb3JlOjpBdHRyaWJ1dGVUZXh0U3R5bGUmKTsKKyAgICB2b2lkIHJlbW92ZUF0dHJp
YnV0ZWRUZXh0TWFya2VyKCk7CisKKyAgICBib29sIGRlbGV0ZVRleHQoaW50IHN0YXJ0LCBpbnQg
ZW5kKTsKKyAgICBib29sIHNldFRleHRBdHRyaWJ1dGVzKGludCBpbnNlcnRpb25Qb2ludCwgc3Bh
bm5hYmxlX3N0cmluZ190Kik7CisgICAgYm9vbCBzZXRUZXh0KHNwYW5uYWJsZV9zdHJpbmdfdCop
OworICAgIGJvb2wgc2V0U3Bhbm5hYmxlVGV4dEFuZFJlbGF0aXZlQ3Vyc29yKHNwYW5uYWJsZV9z
dHJpbmdfdCosIGludCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uLCBib29sIG1hcmtUZXh0QXNDb21w
b3NpbmcpOworICAgIGJvb2wgcmVtb3ZlQ29tcG9zZWRUZXh0KCk7CisgICAgYm9vbCBzZXRSZWxh
dGl2ZUN1cnNvclBvc2l0aW9uKGludCBpbnNlcnRpb25Qb2ludCwgaW50IHJlbGF0aXZlQ3Vyc29y
UG9zaXRpb24pOworICAgIGJvb2wgc2V0Q3Vyc29yUG9zaXRpb24oaW50IGxvY2F0aW9uKTsKKwor
ICAgIHNwYW5fdCogZmlyc3RTcGFuSW5TdHJpbmcoc3Bhbm5hYmxlX3N0cmluZ190KiwgU3Bhbm5h
YmxlU3RyaW5nQXR0cmlidXRlKTsKKyAgICBib29sIGlzVHJhaWxpbmdTaW5nbGVDaGFyYWN0ZXIo
c3Bhbl90KiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKKworICAgIHZvaWQgbGVhcm5UZXh0KCk7Cisg
ICAgdm9pZCBzZW5kTGVhcm5UZXh0RGV0YWlscyhjb25zdCBXVEY6OlN0cmluZyYpOworCisgICAg
V2ViUGFnZVByaXZhdGUqIG1fd2ViUGFnZTsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpFbGVtZW50
PiBtX2N1cnJlbnRGb2N1c0VsZW1lbnQ7CisKKyAgICBib29sIG1fcHJvY2Vzc2luZ0NoYW5nZTsK
KyAgICBib29sIG1fbmF2aWdhdGlvbk1vZGU7CisgICAgRm9jdXNFbGVtZW50VHlwZSBtX2N1cnJl
bnRGb2N1c0VsZW1lbnRUeXBlOworICAgIGludCBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUZXh0RWRp
dE1hc2s7CisKKyAgICBpbnQgbV9jb21wb3NpbmdUZXh0U3RhcnQ7CisgICAgaW50IG1fY29tcG9z
aW5nVGV4dEVuZDsKK307CisKK30KK30KKworI2VuZGlmIC8vIElucHV0SGFuZGxlcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125955</attachid>
            <date>2012-02-07 16:50:10 -0800</date>
            <delta_ts>2012-02-08 09:01:50 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77992-20120207194743.patch</filename>
            <type>text/plain</type>
            <size>72996</size>
            <attacher name="Nima Ghanavatian">nima.ghanavatian</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2NjgxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDZmYzlhZGY3YTBiZjM4NDI4
MjI4ZTdjNjM2YWY3NzJiYzU3MTE0MzYuLmM1MWQ2NzZhZGVlMzZlYmZiYWIyNWNmZmUxNjU0Y2E3
NjMxMDQxN2QgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTItMDItMDcgIE5pbWEgR2hh
bmF2YXRpYW4gIDxuZ2hhbmF2YXRpYW5AcmltLmNvbT4KKworICAgICAgICBJbml0aWFsIHVwc3Ry
ZWFtaW5nIG9mIGlucHV0IGhhbmRsaW5nIGZvciBCbGFja0JlcnJ5IHBvcnQKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc3OTkyCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBibGFja2JlcnJ5L1dlYktpdFN1
cHBvcnQvSW5wdXRIYW5kbGVyLmNwcDogQWRkZWQuCisgICAgICAgICogYmxhY2tiZXJyeS9XZWJL
aXRTdXBwb3J0L0lucHV0SGFuZGxlci5oOiBBZGRlZC4KKwogMjAxMi0wMS0xMSAgSmFja3kgSmlh
bmcgIDx6aGFqaWFuZ0ByaW0uY29tPgogCiAgICAgICAgIFtCbGFja0JlcnJ5XSBBU1NFUlQgZmFp
bHVyZSBpbiBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRlbnRzKCkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L0lucHV0SGFuZGxl
ci5jcHAgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9JbnB1dEhhbmRs
ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmFkNTU1ZGFlNzU0YzRiNjhjMGExN2FhN2YzNzdlZGVlMmJkMjRk
NGUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3Vw
cG9ydC9JbnB1dEhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsMTc0NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl
IFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiSW5wdXRIYW5kbGVyLmgiCisKKyNpbmNsdWRlICJCYWNraW5nU3Rv
cmUuaCIKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVDbGllbnQuaCIKKyNpbmNsdWRlICJDU1NTdHls
ZURlY2xhcmF0aW9uLmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkNocm9tZS5o
IgorI2luY2x1ZGUgIkRPTVN1cHBvcnQuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1
ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRNYXJrZXJDb250cm9sbGVy
LmgiCisjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNp
bmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJIVE1MSW5wdXRFbGVtZW50LmgiCisjaW5j
bHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSFRNTE9wdEdyb3VwRWxlbWVudC5oIgorI2lu
Y2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTFNlbGVjdEVsZW1lbnQu
aCIKKyNpbmNsdWRlICJIVE1MVGV4dEFyZWFFbGVtZW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVt
ZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1LZXlib2FyZEV2
ZW50LmgiCisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlJhbmdlLmgiCisjaW5j
bHVkZSAiUmVuZGVyTGF5ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJNZW51TGlzdC5oIgorI2luY2x1
ZGUgIlJlbmRlclBhcnQuaCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisjaW5jbHVkZSAiUmVu
ZGVyVGV4dENvbnRyb2wuaCIKKyNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIKKyNpbmNsdWRlICJT
Y29wZVBvaW50ZXIuaCIKKyNpbmNsdWRlICJTZWxlY3Rpb25IYW5kbGVyLmgiCisjaW5jbHVkZSAi
VGV4dEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiV2ViUGFnZUNsaWVudC5oIgorI2luY2x1ZGUgIldl
YlBhZ2VfcC5oIgorI2luY2x1ZGUgIldlYlNldHRpbmdzLmgiCisKKyNpbmNsdWRlIDxCbGFja0Jl
cnJ5UGxhdGZvcm1LZXlib2FyZEV2ZW50Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3Jt
TWlzYy5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVNldHRpbmdzLmg+CisjaW5jbHVk
ZSA8aW1mL2V2ZW50cy5oPgorI2luY2x1ZGUgPHN5cy9rZXljb2Rlcy5oPgorCisjZGVmaW5lIEVO
QUJMRV9JTlBVVF9MT0cgMAorI2RlZmluZSBFTkFCTEVfRk9DVVNfTE9HIDAKKworI2lmIEVOQUJM
RV9JTlBVVF9MT0cKKyNkZWZpbmUgSW5wdXRMb2coc2V2ZXJpdHksIGZvcm1hdCwgLi4uKSBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKHNldmVyaXR5LCBmb3JtYXQsICMjIF9fVkFfQVJH
U19fKQorI2Vsc2UKKyNkZWZpbmUgSW5wdXRMb2coc2V2ZXJpdHksIGZvcm1hdCwgLi4uKQorI2Vu
ZGlmIC8vIEVOQUJMRV9JTlBVVF9MT0cKKworI2lmIEVOQUJMRV9GT0NVU19MT0cKKyNkZWZpbmUg
Rm9jdXNMb2coc2V2ZXJpdHksIGZvcm1hdCwgLi4uKSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9n
QWx3YXlzKHNldmVyaXR5LCBmb3JtYXQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUg
Rm9jdXNMb2coc2V2ZXJpdHksIGZvcm1hdCwgLi4uKQorI2VuZGlmIC8vIEVOQUJMRV9GT0NVU19M
T0cKKworc3RhdGljIGNvbnN0IGludCBNYXhMZWFyblRleHREYXRhU2l6ZSA9IDUwMDsKKwordXNp
bmcgbmFtZXNwYWNlIEJsYWNrQmVycnk6OlBsYXRmb3JtOwordXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFz
cyBQcm9jZXNzaW5nQ2hhbmdlR3VhcmQgeworcHVibGljOgorICAgIFByb2Nlc3NpbmdDaGFuZ2VH
dWFyZChJbnB1dEhhbmRsZXIqIGlucHV0SGFuZGxlcikKKyAgICAgICAgOiBtX2lucHV0SGFuZGxl
cihpbnB1dEhhbmRsZXIpCisgICAgICAgICwgbV9zYXZlZFByb2Nlc3NpbmdDaGFuZ2UoZmFsc2Up
CisgICAgeworICAgICAgICBBU1NFUlQobV9pbnB1dEhhbmRsZXIpOworCisgICAgICAgIG1fc2F2
ZWRQcm9jZXNzaW5nQ2hhbmdlID0gbV9pbnB1dEhhbmRsZXItPnByb2Nlc3NpbmdDaGFuZ2UoKTsK
KyAgICAgICAgbV9pbnB1dEhhbmRsZXItPnNldFByb2Nlc3NpbmdDaGFuZ2UodHJ1ZSk7CisgICAg
fQorCisgICAgflByb2Nlc3NpbmdDaGFuZ2VHdWFyZCgpCisgICAgeworICAgICAgICBtX2lucHV0
SGFuZGxlci0+c2V0UHJvY2Vzc2luZ0NoYW5nZShtX3NhdmVkUHJvY2Vzc2luZ0NoYW5nZSk7Cisg
ICAgfQorCitwcml2YXRlOgorICAgIElucHV0SGFuZGxlciogbV9pbnB1dEhhbmRsZXI7CisgICAg
Ym9vbCBtX3NhdmVkUHJvY2Vzc2luZ0NoYW5nZTsKK307CisKK0lucHV0SGFuZGxlcjo6SW5wdXRI
YW5kbGVyKFdlYlBhZ2VQcml2YXRlKiBwYWdlKQorICAgIDogbV93ZWJQYWdlKHBhZ2UpCisgICAg
LCBtX2N1cnJlbnRGb2N1c0VsZW1lbnQoMCkKKyAgICAsIG1fcHJvY2Vzc2luZ0NoYW5nZShmYWxz
ZSkKKyAgICAsIG1fbmF2aWdhdGlvbk1vZGUoZmFsc2UpCisgICAgLCBtX2N1cnJlbnRGb2N1c0Vs
ZW1lbnRUeXBlKFRleHRFZGl0KQorICAgICwgbV9jdXJyZW50Rm9jdXNFbGVtZW50VGV4dEVkaXRN
YXNrKERFRkFVTFRfU1RZTEUpCisgICAgLCBtX2NvbXBvc2luZ1RleHRTdGFydCgwKQorICAgICwg
bV9jb21wb3NpbmdUZXh0RW5kKDApCit7Cit9CisKK0lucHV0SGFuZGxlcjo6fklucHV0SGFuZGxl
cigpCit7Cit9CisKK3N0YXRpYyBCbGFja0JlcnJ5SW5wdXRUeXBlIGNvbnZlcnRJbnB1dFR5cGUo
Y29uc3QgSFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtZW50KQoreworICAgIGlmIChpbnB1dEVs
ZW1lbnQtPmlzUGFzc3dvcmRGaWVsZCgpKQorICAgICAgICByZXR1cm4gSW5wdXRUeXBlUGFzc3dv
cmQ7CisgICAgaWYgKGlucHV0RWxlbWVudC0+aXNTZWFyY2hGaWVsZCgpKQorICAgICAgICByZXR1
cm4gSW5wdXRUeXBlU2VhcmNoOworICAgIGlmIChpbnB1dEVsZW1lbnQtPmlzRW1haWxGaWVsZCgp
KQorICAgICAgICByZXR1cm4gSW5wdXRUeXBlRW1haWw7CisgICAgaWYgKGlucHV0RWxlbWVudC0+
aXNNb250aENvbnRyb2woKSkKKyAgICAgICAgcmV0dXJuIElucHV0VHlwZU1vbnRoOworICAgIGlm
IChpbnB1dEVsZW1lbnQtPmlzTnVtYmVyRmllbGQoKSkKKyAgICAgICAgcmV0dXJuIElucHV0VHlw
ZU51bWJlcjsKKyAgICBpZiAoaW5wdXRFbGVtZW50LT5pc1RlbGVwaG9uZUZpZWxkKCkpCisgICAg
ICAgIHJldHVybiBJbnB1dFR5cGVUZWxlcGhvbmU7CisgICAgaWYgKGlucHV0RWxlbWVudC0+aXNV
UkxGaWVsZCgpKQorICAgICAgICByZXR1cm4gSW5wdXRUeXBlVVJMOworI2lmIEVOQUJMRShJTlBV
VF9DT0xPUikKKyAgICBpZiAoaW5wdXRFbGVtZW50LT5pc0NvbG9yQ29udHJvbCgpKQorICAgICAg
ICByZXR1cm4gSW5wdXRUeXBlQ29sb3I7CisjZW5kaWYKKyAgICBpZiAoaW5wdXRFbGVtZW50LT5p
c0RhdGVDb250cm9sKCkpCisgICAgICAgIHJldHVybiBJbnB1dFR5cGVEYXRlOworICAgIGlmIChp
bnB1dEVsZW1lbnQtPmlzRGF0ZVRpbWVDb250cm9sKCkpCisgICAgICAgIHJldHVybiBJbnB1dFR5
cGVEYXRlVGltZTsKKyAgICBpZiAoaW5wdXRFbGVtZW50LT5pc0RhdGVUaW1lTG9jYWxDb250cm9s
KCkpCisgICAgICAgIHJldHVybiBJbnB1dFR5cGVEYXRlVGltZUxvY2FsOworICAgIGlmIChpbnB1
dEVsZW1lbnQtPmlzVGltZUNvbnRyb2woKSkKKyAgICAgICAgcmV0dXJuIElucHV0VHlwZVRpbWU7
CisgICAgLy8gRklYTUU6IG1pc3NpbmcgV0VFSyBwb3B1cCBzZWxlY3RvcgorCisgICAgcmV0dXJu
IElucHV0VHlwZVRleHQ7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRTdHlsZShCbGFja0JlcnJ5SW5w
dXRUeXBlIHR5cGUsIGNvbnN0IEVsZW1lbnQqIGVsZW1lbnQpCit7CisgICAgc3dpdGNoICh0eXBl
KSB7CisgICAgY2FzZSBJbnB1dFR5cGVUZXh0OgorICAgIGNhc2UgSW5wdXRUeXBlU2VhcmNoOgor
ICAgICAgICB7CisgICAgICAgICAgICAvLyBSZWd1bGFyIGlucHV0IG1vZGUsIGRpc2FibGUgaGVs
cCBpZiBhdXRvY29tcGxldGUgaXMgb2ZmLgorICAgICAgICAgICAgaW50IGltZk1hc2sgPSAwOwor
ICAgICAgICAgICAgaWYgKERPTVN1cHBvcnQ6OmVsZW1lbnRTdXBwb3J0c0F1dG9jb21wbGV0ZShl
bGVtZW50KSA9PSBET01TdXBwb3J0OjpPZmYpCisgICAgICAgICAgICAgICAgaW1mTWFzayA9IE5P
X0FVVE9fVEVYVCB8IE5PX1BSRURJQ1RJT047CisgICAgICAgICAgICBlbHNlIGlmIChET01TdXBw
b3J0OjplbGVtZW50U3VwcG9ydHNBdXRvY29tcGxldGUoZWxlbWVudCkgIT0gRE9NU3VwcG9ydDo6
T24KKyAgICAgICAgICAgICAgICAgICAgICYmIERPTVN1cHBvcnQ6OmVsZW1lbnRJZE9yTmFtZUlu
ZGljYXRlc05vQXV0b2NvbXBsZXRlKGVsZW1lbnQpKQorICAgICAgICAgICAgICAgIGltZk1hc2sg
PSBOT19BVVRPX1RFWFQgfCBOT19QUkVESUNUSU9OOworCisgICAgICAgICAgICAvLyBEaXNhYmxl
IGF1dG9jb3JyZWN0aW9uIGlmIGl0J3Mgc3BlY2lmaWNhbGx5IG9mZiwgb2YgaWYgaXQgaXMgaW4g
ZGVmYXVsdCBtb2RlCisgICAgICAgICAgICAvLyBhbmQgd2UgaGF2ZSBkaXNhYmxlZCBhdXRvIHRl
eHQgYW5kIHByZWRpY3Rpb24uCisgICAgICAgICAgICBpZiAoRE9NU3VwcG9ydDo6ZWxlbWVudFN1
cHBvcnRzQXV0b2NvcnJlY3QoZWxlbWVudCkgPT0gRE9NU3VwcG9ydDo6T2ZmCisgICAgICAgICAg
ICAgICAgfHwgKGltZk1hc2sgJiYgRE9NU3VwcG9ydDo6ZWxlbWVudFN1cHBvcnRzQXV0b2NvcnJl
Y3QoZWxlbWVudCkgPT0gRE9NU3VwcG9ydDo6RGVmYXVsdCkpCisgICAgICAgICAgICAgICAgaW1m
TWFzayB8PSBOT19BVVRPX0NPUlJFQ1RJT047CisKKyAgICAgICAgICAgIGlmIChpbWZNYXNrKQor
ICAgICAgICAgICAgICAgIHJldHVybiBpbWZNYXNrOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICBjYXNlIElucHV0VHlwZUlzSW5kZXg6CisgICAgY2FzZSBJbnB1dFR5cGVQYXNz
d29yZDoKKyAgICBjYXNlIElucHV0VHlwZUVtYWlsOgorICAgIGNhc2UgSW5wdXRUeXBlTnVtYmVy
OgorICAgIGNhc2UgSW5wdXRUeXBlVGVsZXBob25lOgorICAgIGNhc2UgSW5wdXRUeXBlVVJMOgor
ICAgICAgICAvLyBEaXNhYmxlIHNwZWNpYWwgaGFuZGxpbmcuCisgICAgICAgIHJldHVybiBOT19B
VVRPX1RFWFQgfCBOT19QUkVESUNUSU9OIHwgTk9fQVVUT19DT1JSRUNUSU9OOworICAgIGNhc2Ug
SW5wdXRUeXBlVGV4dEFyZWE6CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIHJldHVybiBERUZBVUxUX1NUWUxFOworfQorCitXVEY6OlN0cmluZyBJbnB1dEhhbmRsZXI6
OmVsZW1lbnRUZXh0KCkKK3sKKyAgICBpZiAoIWlzQWN0aXZlVGV4dEVkaXQoKSkKKyAgICAgICAg
cmV0dXJuIFdURjo6U3RyaW5nKCk7CisKKyAgICByZXR1cm4gRE9NU3VwcG9ydDo6aW5wdXRFbGVt
ZW50VGV4dChtX2N1cnJlbnRGb2N1c0VsZW1lbnQuZ2V0KCkpOworfQorCitCbGFja0JlcnJ5SW5w
dXRUeXBlIElucHV0SGFuZGxlcjo6ZWxlbWVudFR5cGUoRWxlbWVudCogZWxlbWVudCkgY29uc3QK
K3sKKyAgICAvLyA8aXNJbmRleD4gaXMgYnVuZGxlZCB3aXRoIGlucHV0IHNvIHdlIG5lZWQgdG8g
Y2hlY2sgdGhlIGZvcm1Db250cm9sTmFtZQorICAgIC8vIGZpcnN0IHRvIGRpZmZlcmVudGlhdGUg
aXQgZnJvbSBpbnB1dCB3aGljaCBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcworICAgIC8vIGlz
SW5kZXggaGFzIGJlZW4gZGVwcmVjYXRlZC4KKyAgICBpZiAoZWxlbWVudC0+Zm9ybUNvbnRyb2xO
YW1lKCkgPT0gSFRNTE5hbWVzOjppc2luZGV4VGFnKQorICAgICAgICByZXR1cm4gSW5wdXRUeXBl
SXNJbmRleDsKKworICAgIGlmIChjb25zdCBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW1lbnQg
PSBzdGF0aWNfY2FzdDxjb25zdCBIVE1MSW5wdXRFbGVtZW50Kj4oZWxlbWVudC0+dG9JbnB1dEVs
ZW1lbnQoKSkpCisgICAgICAgIHJldHVybiBjb252ZXJ0SW5wdXRUeXBlKGlucHV0RWxlbWVudCk7
CisKKyAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnRleHRhcmVhVGFnKSkK
KyAgICAgICAgcmV0dXJuIElucHV0VHlwZVRleHRBcmVhOworCisgICAgLy8gRGVmYXVsdCB0byBJ
bnB1dFR5cGVUZXh0QXJlYSBmb3IgY29udGVudCBlZGl0YWJsZSBmaWVsZHMuCisgICAgcmV0dXJu
IElucHV0VHlwZVRleHRBcmVhOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6bm9kZUZvY3VzZWQo
Tm9kZSogbm9kZSkKK3sKKyAgICBpZiAoaXNBY3RpdmVUZXh0RWRpdCgpICYmIG1fY3VycmVudEZv
Y3VzRWxlbWVudCA9PSBub2RlKSB7CisgICAgICAgIHNldE5hdmlnYXRpb25Nb2RlKHRydWUpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG5vZGUgJiYgbm9kZS0+aXNFbGVtZW50
Tm9kZSgpKSB7CisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50
Kj4obm9kZSk7CisgICAgICAgIGlmIChET01TdXBwb3J0Ojppc0VsZW1lbnRUeXBlUGx1Z2luKGVs
ZW1lbnQpKSB7CisgICAgICAgICAgICBzZXRQbHVnaW5Gb2N1c2VkKGVsZW1lbnQpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERPTVN1cHBvcnQ6OmlzVGV4
dEJhc2VkQ29udGVudEVkaXRhYmxlRWxlbWVudChlbGVtZW50KSkgeworICAgICAgICAgICAgLy8g
Rm9jdXNlZCBub2RlIGlzIGEgdGV4dCBiYXNlZCBpbnB1dCBmaWVsZCwgdGV4dGFyZWEgb3IgY29u
dGVudCBlZGl0YWJsZSBmaWVsZC4KKyAgICAgICAgICAgIHNldEVsZW1lbnRGb2N1c2VkKGVsZW1l
bnQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlz
QWN0aXZlVGV4dEVkaXQoKSAmJiBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmlzQ29udGVudEVkaXRh
YmxlKCkpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgaGFuZGxlciBmb3IgY29udGVu
dCBlZGl0YWJsZSBmaWVsZHMuIFRoZSBmb2N1cyBub2RlIGlzIHRoZSB0b3AgbW9zdAorICAgICAg
ICAvLyBmaWVsZCB0aGF0IGlzIGNvbnRlbnQgZWRpdGFibGUsIGhvd2V2ZXIsIGJ5IGVuYWJsaW5n
IC8gZGlzYWJsaW5nIGRlc2lnbm1vZGUgYW5kCisgICAgICAgIC8vIGNvbnRlbnQgZWRpdGFibGUs
IGl0IGlzIHBvc3NpYmxlIHRocm91Z2ggamF2YXNjcmlwdCBvciBzZWxlY3Rpb24gdG8gdHJpZ2dl
ciB0aGUgZm9jdXMgbm9kZSB0bworICAgICAgICAvLyBjaGFuZ2UgZXZlbiB3aGlsZSBtYWludGFp
bmluZyBlZGl0aW5nIG9uIHRoZSBzYW1lIHNlbGVjdGlvbiBwb2ludC4gSWYgdGhlIGZvY3VzIGVs
ZW1lbnQKKyAgICAgICAgLy8gaXNuJ3QgY29udGVudEVkaXRhYmxlLCBidXQgdGhlIGN1cnJlbnQg
c2VsZWN0aW9uIGlzLCBkb24ndCBzZW5kIGEgY2hhbmdlIG5vdGlmaWNhdGlvbi4KKworICAgICAg
ICAvLyBXaGVuIHByb2Nlc3NpbmcgY2hhbmdlcyBzZWxlY3Rpb24gY2hhbmdlcyBvY2N1ciB0aGF0
IG1heSByZXNldCB0aGUgZm9jdXMgZWxlbWVudAorICAgICAgICAvLyBhbmQgY291bGQgcG90ZW50
aWFsbHkgY2F1c2UgYSBjcmFzaCBhcyBtX2N1cnJlbnRGb2N1c0VsZW1lbnQgc2hvdWxkIG5vdCBi
ZQorICAgICAgICAvLyBjaGFuZ2VkIGR1cmluZyBwcm9jZXNzaW5nIG9mIGFuIEVkaXRvckNvbW1h
bmQuCisgICAgICAgIGlmIChwcm9jZXNzaW5nQ2hhbmdlKCkpCisgICAgICAgICAgICByZXR1cm47
CisKKyAgICAgICAgRnJhbWUqIGZyYW1lID0gbV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVu
dCgpLT5mcmFtZSgpOworICAgICAgICBBU1NFUlQoZnJhbWUpOworCisgICAgICAgIC8vIFRlc3Qg
dGhlIGN1cnJlbnQgc2VsZWN0aW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb250ZW50IGluIGZv
Y3VzIGlzIHN0aWxsIGNvbnRlbnQKKyAgICAgICAgLy8gZWRpdGFibGUuIFRoaXMgbWF5IG1lYW4g
SmF2YXNjcmlwdCB0cmlnZ2VyZWQgYSBmb2N1cyBjaGFuZ2UgYnkgbW9kaWZ5aW5nIHRoZQorICAg
ICAgICAvLyB0b3AgbGV2ZWwgcGFyZW50IG9mIHRoaXMgb2JqZWN0J3MgY29udGVudCBlZGl0YWJs
ZSBzdGF0ZSB3aXRob3V0IGFjdHVhbGx5IG1vZGlmeWluZworICAgICAgICAvLyB0aGlzIHBhcnRp
Y3VsYXIgb2JqZWN0LgorICAgICAgICAvLyBFeGFtcGxlIHNpdGU6IGh0bWw1ZGVtb3MuY29tL2Nv
bnRlbnRFZGl0YWJsZSAtIGJsdXIgZXZlbnQgdHJpZ2dlcnMgZm9jdXMgY2hhbmdlLgorICAgICAg
ICBpZiAoZnJhbWUgPT0gbV93ZWJQYWdlLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBmcmFtZS0+
c2VsZWN0aW9uKCktPnN0YXJ0KCkuYW5jaG9yTm9kZSgpCisgICAgICAgICAgICAmJiBmcmFtZS0+
c2VsZWN0aW9uKCktPnN0YXJ0KCkuYW5jaG9yTm9kZSgpLT5pc0NvbnRlbnRFZGl0YWJsZSgpKQor
ICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBObyB2YWxpZCBmb2N1cyBl
bGVtZW50IGZvdW5kIGZvciBoYW5kbGluZy4KKyAgICBzZXRFbGVtZW50VW5mb2N1c2VkKCk7Cit9
CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpzZXRQbHVnaW5Gb2N1c2VkKEVsZW1lbnQqIGVsZW1lbnQp
Cit7CisgICAgQVNTRVJUKERPTVN1cHBvcnQ6OmlzRWxlbWVudFR5cGVQbHVnaW4oZWxlbWVudCkp
OworCisgICAgaWYgKGlzQWN0aXZlVGV4dEVkaXQoKSkKKyAgICAgICAgc2V0RWxlbWVudFVuZm9j
dXNlZCgpOworCisgICAgbV9jdXJyZW50Rm9jdXNFbGVtZW50VHlwZSA9IFBsdWdpbjsKKyAgICBt
X2N1cnJlbnRGb2N1c0VsZW1lbnQgPSBlbGVtZW50OworfQorCitzdGF0aWMgYm9vbCBjb252ZXJ0
U3RyaW5nVG9XY2hhcihjb25zdCBTdHJpbmcmIHN0cmluZywgd2NoYXJfdCogZGVzdCwgaW50IGRl
c3RDYXBhY2l0eSwgaW50KiBkZXN0TGVuZ3RoKQoreworICAgIEFTU0VSVChkZXN0KTsKKworICAg
IGlmICghc3RyaW5nLmxlbmd0aCgpKSB7CisgICAgICAgIGRlc3RMZW5ndGggPSAwOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBVRXJyb3JDb2RlIGVjID0gVV9aRVJPX0VSUk9S
OworICAgIC8vIHdjaGFyX3Qgc3RyaW5ncyBzZW50IHRvIElNRiBhcmUgMzIgYml0IHNvIGNhc3Rp
bmcgdG8gVUNoYXIzMiBpcyBzYWZlLgorICAgIHVfc3RyVG9VVEYzMihyZWludGVycHJldF9jYXN0
PFVDaGFyMzIqPihkZXN0KSwgZGVzdENhcGFjaXR5LCBkZXN0TGVuZ3RoLCBzdHJpbmcuY2hhcmFj
dGVycygpLCBzdHJpbmcubGVuZ3RoKCksICZlYyk7CisgICAgaWYgKGVjKSB7CisgICAgICAgIElu
cHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6
OmNvbnZlcnRTdHJpbmdUb1djaGFyIEVycm9yIGNvbnZlcnRpbmcgc3RyaW5nIGVjICglZCkuIiwg
ZWMpOworICAgICAgICBkZXN0TGVuZ3RoID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgY29udmVydFN0cmluZ1RvV2No
YXJWZWN0b3IoY29uc3QgU3RyaW5nJiBzdHJpbmcsIFdURjo6VmVjdG9yPHdjaGFyX3Q+JiB3Y2hh
clN0cmluZykKK3sKKyAgICBBU1NFUlQod2NoYXJTdHJpbmcuaXNFbXB0eSgpKTsKKworICAgIGlu
dCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7CisgICAgaWYgKCFsZW5ndGgpCisgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgaWYgKCF3Y2hhclN0cmluZy50cnlSZXNlcnZlQ2FwYWNpdHkobGVu
Z3RoICsgMSkpIHsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZ0Fsd2F5cyhCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxXYXJuLCAiSW5wdXRIYW5kbGVyOjpjb252ZXJ0U3Ry
aW5nVG9XY2hhclZlY3RvciBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzdHJpbmcuXG4iKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludCBkZXN0TGVuZ3RoID0gMDsK
KyAgICBpZiAoIWNvbnZlcnRTdHJpbmdUb1djaGFyKHN0cmluZywgd2NoYXJTdHJpbmcuZGF0YSgp
LCBsZW5ndGggKyAxLCAmZGVzdExlbmd0aCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IHdjaGFyU3RyaW5nLnJlc2l6ZShkZXN0TGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
c3RhdGljIFN0cmluZyBjb252ZXJ0U3Bhbm5hYmxlU3RyaW5nVG9TdHJpbmcoc3Bhbm5hYmxlX3N0
cmluZ190KiBzcmMpCit7CisgICAgaWYgKCFzcmMgfHwgIXNyYy0+c3RyIHx8ICFzcmMtPmxlbmd0
aCkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisgICAgV1RGOjpWZWN0b3I8VUNoYXI+IGRl
c3Q7CisgICAgaW50IGRlc3RDYXBhY2l0eSA9IChzcmMtPmxlbmd0aCAqIDIpICsgMTsKKyAgICBp
ZiAoIWRlc3QudHJ5UmVzZXJ2ZUNhcGFjaXR5KGRlc3RDYXBhY2l0eSkpIHsKKyAgICAgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OmxvZ0Fsd2F5cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2
ZWxXYXJuLCAiSW5wdXRIYW5kbGVyOjpjb252ZXJ0U3Bhbm5hYmxlU3RyaW5nVG9TdHJpbmcgQ2Fu
bm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RyaW5nLlxuIik7CisgICAgICAgIHJldHVybiBTdHJp
bmcoKTsKKyAgICB9CisKKyAgICBpbnQgZGVzdExlbmd0aCA9IDA7CisgICAgVUVycm9yQ29kZSBl
YyA9IFVfWkVST19FUlJPUjsKKyAgICAvLyB3Y2hhcl90IHN0cmluZ3Mgc2VudCBmcm9tIElNRiBh
cmUgMzIgYml0IHNvIGNhc3RpbmcgdG8gVUNoYXIzMiBpcyBzYWZlLgorICAgIHVfc3RyRnJvbVVU
RjMyKGRlc3QuZGF0YSgpLCBkZXN0Q2FwYWNpdHksICZkZXN0TGVuZ3RoLCByZWludGVycHJldF9j
YXN0PFVDaGFyMzIqPihzcmMtPnN0ciksIHNyYy0+bGVuZ3RoLCAmZWMpOworICAgIGlmIChlYykg
eworICAgICAgICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAi
SW5wdXRIYW5kbGVyOjpjb252ZXJ0U3Bhbm5hYmxlU3RyaW5nVG9TdHJpbmcgRXJyb3IgY29udmVy
dGluZyBzdHJpbmcgZWMgKCVkKS4iLCBlYyk7CisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAg
ICB9CisgICAgZGVzdC5yZXNpemUoZGVzdExlbmd0aCk7CisgICAgcmV0dXJuIFN0cmluZyhkZXN0
LmRhdGEoKSwgZGVzdExlbmd0aCk7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpzZW5kTGVhcm5U
ZXh0RGV0YWlscyhjb25zdCBXVEY6OlN0cmluZyYgc3RyaW5nKQoreworICAgIFZlY3Rvcjx3Y2hh
cl90PiB3Y2hhclN0cmluZzsKKyAgICBpZiAoIWNvbnZlcnRTdHJpbmdUb1djaGFyVmVjdG9yKHN0
cmluZywgd2NoYXJTdHJpbmcpIHx8IHdjaGFyU3RyaW5nLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+aW5wdXRMZWFyblRleHQod2NoYXJTdHJp
bmcuZGF0YSgpLCB3Y2hhclN0cmluZy5zaXplKCkpOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6
bGVhcm5UZXh0KCkKK3sKKyAgICBpZiAoIWlzQWN0aXZlVGV4dEVkaXQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gRG8gbm90IHNlbmQgKG9yIGNhbGN1bGF0ZSkgdGhlIHRleHQgd2hlbiB0
aGUgZmllbGQgaXMgTk9fUFJFRElDVElPTiBvciBOT19BVVRPX1RFWFQuCisgICAgaWYgKG1fY3Vy
cmVudEZvY3VzRWxlbWVudFRleHRFZGl0TWFzayAmIE5PX1BSRURJQ1RJT04gfHwgbV9jdXJyZW50
Rm9jdXNFbGVtZW50VGV4dEVkaXRNYXNrICYgTk9fQVVUT19URVhUKQorICAgICAgICByZXR1cm47
CisKKyAgICBTdHJpbmcgdGV4dEluRmllbGQoZWxlbWVudFRleHQoKSk7CisgICAgdGV4dEluRmll
bGQgPSB0ZXh0SW5GaWVsZC5zdWJzdHJpbmcoc3RkOjptYXgoMCwgc3RhdGljX2Nhc3Q8aW50Pih0
ZXh0SW5GaWVsZC5sZW5ndGgoKSkgLSBNYXhMZWFyblRleHREYXRhU2l6ZSksIHRleHRJbkZpZWxk
Lmxlbmd0aCgpKTsKKyAgICB0ZXh0SW5GaWVsZC5yZW1vdmUoMCwgdGV4dEluRmllbGQuZmluZCgi
ICIpKTsKKworICAgIC8vIEJ1aWxkIHVwIHRoZSA1MDAgY2hhcmFjdGVyIHN0cmluZ3MgaW4gd29y
ZCBjaHVua3MuCisgICAgLy8gU3BlYyBzYXlzIDEwMDAsIGJ1dCBtZW1vcnkgY29ycnVwdGlvbiBo
YXMgYmVlbiBvYnNlcnZlZC4KKyAgICBBU1NFUlQodGV4dEluRmllbGQubGVuZ3RoKCkgPD0gTWF4
TGVhcm5UZXh0RGF0YVNpemUpOworCisgICAgaWYgKHRleHRJbkZpZWxkLmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgSW5wdXRMb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xl
dmVsSW5mbywgIklucHV0SGFuZGxlcjo6bGVhcm5UZXh0ICVzIiwgdGV4dEluRmllbGQubGF0aW4x
KCkuZGF0YSgpKTsKKyAgICBzZW5kTGVhcm5UZXh0RGV0YWlscyh0ZXh0SW5GaWVsZCk7Cit9CisK
K3ZvaWQgSW5wdXRIYW5kbGVyOjpzZXRFbGVtZW50VW5mb2N1c2VkKGJvb2wgcmVmb2N1c09jY3Vy
aW5nKQoreworICAgIGlmIChpc0FjdGl2ZVRleHRFZGl0KCkpIHsKKyAgICAgICAgRm9jdXNMb2co
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIklucHV0SGFuZGxlcjo6c2V0RWxl
bWVudFVuZm9jdXNlZCIpOworCisgICAgICAgIC8vIFBhc3MgYW55IHRleHQgaW50byB0aGUgZmll
bGQgdG8gSU1GIHRvIGxlYXJuLgorICAgICAgICBsZWFyblRleHQoKTsKKworICAgICAgICAvLyBF
bmQgYW55IGNvbXBvc2l0aW9uIHRoYXQgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICAgIGZpbmlzaENv
bXBvc2l0aW9uKCk7CisKKyAgICAgICAgLy8gU2VuZCBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4gT25s
eSBjYW5jZWwgbmF2aWdhdGlvbiBtb2RlIGlmIHdlIGFyZSBub3QKKyAgICAgICAgLy8gcmVmb2N1
c2luZyB0byBhdm9pZCBmbGFzaGluZyB0aGUga2V5Ym9hcmQgd2hlbiBzd2l0Y2hpbmcgYmV0d2Vl
biB0d28KKyAgICAgICAgLy8gaW5wdXQgZmllbGRzLgorICAgICAgICBzZXROYXZpZ2F0aW9uTW9k
ZShmYWxzZSwgIXJlZm9jdXNPY2N1cmluZyk7CisgICAgICAgIG1fd2ViUGFnZS0+bV9jbGllbnQt
PmlucHV0Rm9jdXNMb3N0KCk7CisgICAgICAgIG1fd2ViUGFnZS0+bV9zZWxlY3Rpb25IYW5kbGVy
LT5zZWxlY3Rpb25Qb3NpdGlvbkNoYW5nZWQoKTsKKyAgICB9CisKKyAgICAvLyBDbGVhciB0aGUg
bm9kZSBkZXRhaWxzLgorICAgIG1fY3VycmVudEZvY3VzRWxlbWVudCA9IDA7CisgICAgbV9jdXJy
ZW50Rm9jdXNFbGVtZW50VHlwZSA9IFRleHRFZGl0OworfQorCitib29sIElucHV0SGFuZGxlcjo6
c2hvdWxkQWNjZXB0SW5wdXRGb2N1cygpCit7CisgICAgLy8gSWYgdGhlIERSVCBpcyBydW5uaW5n
LCBhbHdheXMgYWNjZXB0IGZvY3VzLgorICAgIGlmIChtX3dlYlBhZ2UtPm1fZHVtcFJlbmRlclRy
ZWUpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpTZXR0aW5nczo6Z2V0KCktPmFsd2F5c1Nob3dLZXlib2FyZE9uRm9jdXMoKSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICBGcmFtZSogbWFpbkZyYW1lID0gbV93ZWJQYWdlLT5tX3BhZ2Ut
Pm1haW5GcmFtZSgpOworICAgIEZyYW1lKiBmb2N1c2VkRnJhbWUgPSBtX3dlYlBhZ2UtPmZvY3Vz
ZWRPck1haW5GcmFtZSgpOworICAgIGlmIChtYWluRnJhbWUgJiYgbWFpbkZyYW1lLT5kb2N1bWVu
dCgpICYmIGZvY3VzZWRGcmFtZSAmJiBmb2N1c2VkRnJhbWUtPmRvY3VtZW50KCkpIHsKKyAgICAg
ICAgLy8gQW55IHVzZXIgYWN0aW9uIHNob3VsZCBiZSByZXNwZWN0ZWQuIE1vdXNlIHdpbGwgYmUg
ZG93biB3aGVuIHRvdWNoIGlzCisgICAgICAgIC8vIHVzZWQgdG8gZm9jdXMuCisgICAgICAgIGlm
IChmb2N1c2VkRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5tb3VzZVByZXNzZWQoKSkKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbWFpbiBmcmFtZSBp
cyBub3Qgc3RpbGwgbG9hZGluZy4KKyAgICAgICAgaWYgKG1haW5GcmFtZS0+bG9hZGVyKCktPmlz
TG9hZGluZygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIE1ha2Ug
c3VyZSB0aGUgZm9jdXNlZCBmcmFtZSBpcyBsb2FkZWQuCisgICAgICAgIGlmICghZm9jdXNlZEZy
YW1lLT5sb2FkZXIoKS0+ZnJhbWVIYXNMb2FkZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGZvY3VzZWQgZnJhbWUgaXMgbm90IHByb2Nl
c3NpbmcgbG9hZCBldmVudHMuCisgICAgICAgIHJldHVybiAhZm9jdXNlZEZyYW1lLT5kb2N1bWVu
dCgpLT5wcm9jZXNzaW5nTG9hZEV2ZW50KCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30K
Kwordm9pZCBJbnB1dEhhbmRsZXI6OnNldEVsZW1lbnRGb2N1c2VkKEVsZW1lbnQqIGVsZW1lbnQp
Cit7CisgICAgQVNTRVJUKERPTVN1cHBvcnQ6OmlzVGV4dEJhc2VkQ29udGVudEVkaXRhYmxlRWxl
bWVudChlbGVtZW50KSk7CisgICAgQVNTRVJUKGVsZW1lbnQtPmRvY3VtZW50KCkgJiYgZWxlbWVu
dC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7CisKKyAgICBpZiAoIXNob3VsZEFjY2VwdElucHV0Rm9j
dXMoKSkgeworICAgICAgICAvLyBSZW1vdmUgdGhlIGZvY3VzIGZyb20gdGhpcyBlbGVtZW50Lgor
ICAgICAgICBlbGVtZW50LT5ibHVyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAv
LyBDbGVhciB0aGUgZXhpc3RpbmcgZm9jdXMgbm9kZSBkZXRhaWxzLgorICAgIHNldEVsZW1lbnRV
bmZvY3VzZWQodHJ1ZSAvKnJlZm9jdXNPY2N1cmluZyovKTsKKworICAgIC8vIE1hcmsgdGhpcyBl
bGVtZW50IGFzIGFjdGl2ZSBhbmQgYWRkIHRvIGZyYW1lIHNldC4KKyAgICBtX2N1cnJlbnRGb2N1
c0VsZW1lbnQgPSBlbGVtZW50OworICAgIG1fY3VycmVudEZvY3VzRWxlbWVudFR5cGUgPSBUZXh0
RWRpdDsKKworICAgIC8vIFNlbmQgZGV0YWlscyB0byB0aGUgY2xpZW50IGFib3V0IHRoaXMgZWxl
bWVudC4KKyAgICBCbGFja0JlcnJ5SW5wdXRUeXBlIHR5cGUgPSBlbGVtZW50VHlwZShlbGVtZW50
KTsKKyAgICBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUZXh0RWRpdE1hc2sgPSBpbnB1dFN0eWxlKHR5
cGUsIGVsZW1lbnQpOworCisgICAgRm9jdXNMb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xl
dmVsSW5mbywgIklucHV0SGFuZGxlcjo6c2V0RWxlbWVudEZvY3VzZWQsIFR5cGU9JWQsIFN0eWxl
PSVkIiwgdHlwZSwgbV9jdXJyZW50Rm9jdXNFbGVtZW50VGV4dEVkaXRNYXNrKTsKKworICAgIG1f
d2ViUGFnZS0+bV9jbGllbnQtPmlucHV0Rm9jdXNHYWluZWQodHlwZSwgbV9jdXJyZW50Rm9jdXNF
bGVtZW50VGV4dEVkaXRNYXNrKTsKKyAgICBtX25hdmlnYXRpb25Nb2RlID0gdHJ1ZTsKKworICAg
IGhhbmRsZUlucHV0TG9jYWxlQ2hhbmdlZChtX3dlYlBhZ2UtPm1fd2ViU2V0dGluZ3MtPmlzV3Jp
dGluZ0RpcmVjdGlvblJUTCgpKTsKK30KKworYm9vbCBJbnB1dEhhbmRsZXI6Om9wZW5EYXRlUG9w
dXAoSFRNTElucHV0RWxlbWVudCogZWxlbWVudCwgQmxhY2tCZXJyeUlucHV0VHlwZSB0eXBlKQor
eworICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50LT5kaXNhYmxlZCgpIHx8ICFET01TdXBwb3J0
Ojppc0RhdGVUaW1lSW5wdXRGaWVsZChlbGVtZW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKGlzQWN0aXZlVGV4dEVkaXQoKSkKKyAgICAgICAgY2xlYXJDdXJyZW50Rm9jdXNF
bGVtZW50KCk7CisKKyAgICBtX2N1cnJlbnRGb2N1c0VsZW1lbnQgPSBlbGVtZW50OworICAgIG1f
Y3VycmVudEZvY3VzRWxlbWVudFR5cGUgPSBUZXh0UG9wdXA7CisKKyAgICBXVEY6OlN0cmluZyB2
YWx1ZSA9IGVsZW1lbnQtPnZhbHVlKCk7CisgICAgV1RGOjpTdHJpbmcgbWluID0gZWxlbWVudC0+
Z2V0QXR0cmlidXRlKEhUTUxOYW1lczo6bWluQXR0cikuc3RyaW5nKCk7CisgICAgV1RGOjpTdHJp
bmcgbWF4ID0gZWxlbWVudC0+Z2V0QXR0cmlidXRlKEhUTUxOYW1lczo6bWF4QXR0cikuc3RyaW5n
KCk7CisgICAgZG91YmxlIHN0ZXAgPSBlbGVtZW50LT5nZXRBdHRyaWJ1dGUoSFRNTE5hbWVzOjpz
dGVwQXR0cikudG9Eb3VibGUoKTsKKyAgICBtX3dlYlBhZ2UtPm1fY2xpZW50LT5vcGVuRGF0ZVRp
bWVQb3B1cCh0eXBlLCB2YWx1ZSwgbWluLCBtYXgsIHN0ZXApOworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIElucHV0SGFuZGxlcjo6b3BlbkNvbG9yUG9wdXAoSFRNTElucHV0RWxlbWVudCog
ZWxlbWVudCkKK3sKKyAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC0+ZGlzYWJsZWQoKSB8fCAh
RE9NU3VwcG9ydDo6aXNDb2xvcklucHV0RmllbGQoZWxlbWVudCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIGlmIChpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIGNsZWFyQ3VycmVu
dEZvY3VzRWxlbWVudCgpOworCisgICAgbV9jdXJyZW50Rm9jdXNFbGVtZW50ID0gZWxlbWVudDsK
KyAgICBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUeXBlID0gVGV4dFBvcHVwOworCisgICAgbV93ZWJQ
YWdlLT5tX2NsaWVudC0+b3BlbkNvbG9yUG9wdXAoZWxlbWVudC0+dmFsdWUoKSk7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpzZXRJbnB1dFZhbHVlKGNvbnN0IFdU
Rjo6U3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBpZiAoIWlzQWN0aXZlVGV4dFBvcHVwKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbWVudCA9IHN0YXRp
Y19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihtX2N1cnJlbnRGb2N1c0VsZW1lbnQuZ2V0KCkpOwor
ICAgIGlucHV0RWxlbWVudC0+c2V0VmFsdWUodmFsdWUpOworICAgIGNsZWFyQ3VycmVudEZvY3Vz
RWxlbWVudCgpOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6bm9kZVRleHRDaGFuZ2VkKGNvbnN0
IE5vZGUqIG5vZGUpCit7CisgICAgaWYgKHByb2Nlc3NpbmdDaGFuZ2UoKSB8fCAhbm9kZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKG5vZGUgIT0gbV9jdXJyZW50Rm9jdXNFbGVtZW50KQor
ICAgICAgICByZXR1cm47CisKKyAgICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9n
TGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVyOjpub2RlVGV4dENoYW5nZWQiKTsKKworICAgIG1fd2Vi
UGFnZS0+bV9jbGllbnQtPmlucHV0VGV4dENoYW5nZWQoKTsKKworICAgIC8vIFJlbW92ZSB0aGUg
YXR0cmlidXRlZCB0ZXh0IG1hcmtlcnMgYXMgdGhlIHByZXZpb3VzIGNhbGwgdHJpZ2dlcmVkIGFu
IGVuZCB0bworICAgIC8vIHRoZSBjb21wb3NpdGlvbi4KKyAgICByZW1vdmVBdHRyaWJ1dGVkVGV4
dE1hcmtlcigpOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6ZW5zdXJlRm9jdXNUZXh0RWxlbWVu
dFZpc2libGUoQ2FyZXRTY3JvbGxUeXBlIHNjcm9sbFR5cGUpCit7CisgICAgaWYgKCFtX2N1cnJl
bnRGb2N1c0VsZW1lbnQgfHwgIW1fbmF2aWdhdGlvbk1vZGUgfHwgIW1fY3VycmVudEZvY3VzRWxl
bWVudC0+ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6U2V0dGluZ3M6OmdldCgpLT5hbGxvd0NlbnRlclNjcm9sbEFkanVzdG1lbnRG
b3JJbnB1dEZpZWxkcygpICYmIHNjcm9sbFR5cGUgIT0gRWRnZUlmTmVlZGVkKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBGcmFtZSogZWxlbWVudEZyYW1lID0gbV9jdXJyZW50Rm9jdXNFbGVtZW50
LT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAgIGlmICghZWxlbWVudEZyYW1lKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBGcmFtZSogbWFpbkZyYW1lID0gbV93ZWJQYWdlLT5tYWluRnJhbWUoKTsK
KyAgICBpZiAoIW1haW5GcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWVWaWV3KiBt
YWluRnJhbWVWaWV3ID0gbWFpbkZyYW1lLT52aWV3KCk7CisgICAgaWYgKCFtYWluRnJhbWVWaWV3
KQorICAgICAgICByZXR1cm47CisKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHNlbGVjdGlvbkZvY3Vz
UmVjdDsKKyAgICBzd2l0Y2ggKGVsZW1lbnRGcmFtZS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvblR5
cGUoKSkgeworICAgIGNhc2UgVmlzaWJsZVNlbGVjdGlvbjo6Q2FyZXRTZWxlY3Rpb246CisgICAg
ICAgIHNlbGVjdGlvbkZvY3VzUmVjdCA9IGVsZW1lbnRGcmFtZS0+c2VsZWN0aW9uKCktPmFic29s
dXRlQ2FyZXRCb3VuZHMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBWaXNpYmxlU2VsZWN0
aW9uOjpSYW5nZVNlbGVjdGlvbjogeworICAgICAgICBQb3NpdGlvbiBzZWxlY3Rpb25Qb3NpdGlv
bjsKKyAgICAgICAgaWYgKG1fd2ViUGFnZS0+bV9zZWxlY3Rpb25IYW5kbGVyLT5sYXN0VXBkYXRl
ZEVuZFBvaW50SXNWYWxpZCgpKQorICAgICAgICAgICAgc2VsZWN0aW9uUG9zaXRpb24gPSBlbGVt
ZW50RnJhbWUtPnNlbGVjdGlvbigpLT5lbmQoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
c2VsZWN0aW9uUG9zaXRpb24gPSBlbGVtZW50RnJhbWUtPnNlbGVjdGlvbigpLT5zdGFydCgpOwor
ICAgICAgICBzZWxlY3Rpb25Gb2N1c1JlY3QgPSBWaXNpYmxlUG9zaXRpb24oc2VsZWN0aW9uUG9z
aXRpb24pLmFic29sdXRlQ2FyZXRCb3VuZHMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg
IGNhc2UgVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb246CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBpbnQgZm9udEhlaWdodCA9IHNlbGVjdGlvbkZvY3VzUmVjdC5oZWlnaHQoKTsK
KworICAgIGlmIChlbGVtZW50RnJhbWUgIT0gbWFpbkZyYW1lKSB7IC8vIEVsZW1lbnQgaXMgaW4g
YSBzdWJmcmFtZS4KKyAgICAgICAgLy8gUmVtb3ZlIGFueSBzY3JvbGwgb2Zmc2V0IHdpdGhpbiB0
aGUgc3ViZnJhbWUgdG8gZ2V0IHRoZSBwb2ludCByZWxhdGl2ZSB0byB0aGUgbWFpbiBmcmFtZS4K
KyAgICAgICAgc2VsZWN0aW9uRm9jdXNSZWN0Lm1vdmUoLWVsZW1lbnRGcmFtZS0+dmlldygpLT5z
Y3JvbGxQb3NpdGlvbigpLngoKSwgLWVsZW1lbnRGcmFtZS0+dmlldygpLT5zY3JvbGxQb3NpdGlv
bigpLnkoKSk7CisKKyAgICAgICAgLy8gQWRqdXN0IHRoZSBzZWxlY3Rpb24gcmVjdCBiYXNlZCBv
biB0aGUgZnJhbWUgb2Zmc2V0IGluIHJlbGF0aW9uIHRvIHRoZSBtYWluIGZyYW1lIGlmIGl0J3Mg
YSBzdWJmcmFtZS4KKyAgICAgICAgaWYgKGVsZW1lbnRGcmFtZS0+b3duZXJSZW5kZXJlcigpKSB7
CisgICAgICAgICAgICBXZWJDb3JlOjpJbnRQb2ludCBmcmFtZU9mZnNldCA9IGVsZW1lbnRGcmFt
ZS0+b3duZXJSZW5kZXJlcigpLT5hYnNvbHV0ZUNvbnRlbnRCb3goKS5sb2NhdGlvbigpOworICAg
ICAgICAgICAgc2VsZWN0aW9uRm9jdXNSZWN0Lm1vdmUoZnJhbWVPZmZzZXQueCgpLCBmcmFtZU9m
ZnNldC55KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgUG9zaXRpb24gc3RhcnQgPSBlbGVt
ZW50RnJhbWUtPnNlbGVjdGlvbigpLT5zdGFydCgpOworICAgIGlmIChzdGFydC5hbmNob3JOb2Rl
KCkgJiYgc3RhcnQuYW5jaG9yTm9kZSgpLT5yZW5kZXJlcigpKSB7CisgICAgICAgIGlmIChSZW5k
ZXJMYXllciogbGF5ZXIgPSBzdGFydC5hbmNob3JOb2RlKCktPnJlbmRlcmVyKCktPmVuY2xvc2lu
Z0xheWVyKCkpIHsKKyAgICAgICAgICAgIFdlYkNvcmU6OkludFJlY3QgYWN0dWFsU2NyZWVuUmVj
dCA9IFdlYkNvcmU6OkludFJlY3QobWFpbkZyYW1lVmlldy0+c2Nyb2xsUG9zaXRpb24oKSwgbV93
ZWJQYWdlLT5hY3R1YWxWaXNpYmxlU2l6ZSgpKTsKKyAgICAgICAgICAgIFNjcm9sbEFsaWdubWVu
dCBob3Jpem9udGFsU2Nyb2xsQWxpZ25tZW50ID0gU2Nyb2xsQWxpZ25tZW50OjphbGlnblRvRWRn
ZUlmTmVlZGVkOworICAgICAgICAgICAgU2Nyb2xsQWxpZ25tZW50IHZlcnRpY2FsU2Nyb2xsQWxp
Z25tZW50ID0gU2Nyb2xsQWxpZ25tZW50OjphbGlnblRvRWRnZUlmTmVlZGVkOworCisgICAgICAg
ICAgICBpZiAoc2Nyb2xsVHlwZSAhPSBFZGdlSWZOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAv
LyBBbGlnbiB0aGUgc2VsZWN0aW9uIHJlY3QgaWYgcG9zc2libGUgc28gdGhhdCB3ZSBzaG93IHRo
ZSBmaWVsZCdzCisgICAgICAgICAgICAgICAgLy8gb3V0bGluZSBpZiB0aGUgY2FyZXQgaXMgYXQg
dGhlIGVkZ2Ugb2YgdGhlIGZpZWxkLgorICAgICAgICAgICAgICAgIGlmIChSZW5kZXJPYmplY3Qq
IGZvY3VzZWRSZW5kZXJlciA9IG1fY3VycmVudEZvY3VzRWxlbWVudC0+cmVuZGVyZXIoKSkgewor
ICAgICAgICAgICAgICAgICAgICBXZWJDb3JlOjpJbnRSZWN0IG5vZGVPdXRsaW5lQm91bmRzID0g
Zm9jdXNlZFJlbmRlcmVyLT5hYnNvbHV0ZU91dGxpbmVCb3VuZHMoKTsKKyAgICAgICAgICAgICAg
ICAgICAgV2ViQ29yZTo6SW50UmVjdCBjYXJldEF0RWRnZVJlY3QgPSByZWN0Rm9yQ2FyZXQoMCk7
CisgICAgICAgICAgICAgICAgICAgIGludCBwYWRkaW5nWCA9IGFicyhjYXJldEF0RWRnZVJlY3Qu
eCgpIC0gbm9kZU91dGxpbmVCb3VuZHMueCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBh
ZGRpbmdZID0gYWJzKGNhcmV0QXRFZGdlUmVjdC55KCkgLSBub2RlT3V0bGluZUJvdW5kcy55KCkp
OworCisgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25Gb2N1c1JlY3QueCgpIC0gcGFk
ZGluZ1ggPT0gbm9kZU91dGxpbmVCb3VuZHMueCgpKQorICAgICAgICAgICAgICAgICAgICAgICAg
c2VsZWN0aW9uRm9jdXNSZWN0LnNldFgobm9kZU91dGxpbmVCb3VuZHMueCgpKTsKKyAgICAgICAg
ICAgICAgICAgICAgZWxzZSBpZiAoc2VsZWN0aW9uRm9jdXNSZWN0Lm1heFgoKSArIHBhZGRpbmdY
ID09IG5vZGVPdXRsaW5lQm91bmRzLm1heFgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNl
bGVjdGlvbkZvY3VzUmVjdC5zZXRYKG5vZGVPdXRsaW5lQm91bmRzLm1heFgoKSAtIHNlbGVjdGlv
bkZvY3VzUmVjdC53aWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkZv
Y3VzUmVjdC55KCkgLSBwYWRkaW5nWSA9PSBub2RlT3V0bGluZUJvdW5kcy55KCkpCisgICAgICAg
ICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Gb2N1c1JlY3Quc2V0WShub2RlT3V0bGluZUJvdW5k
cy55KCkgLSBzZWxlY3Rpb25Gb2N1c1JlY3QuaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAg
ICBlbHNlIGlmIChzZWxlY3Rpb25Gb2N1c1JlY3QubWF4WSgpICsgcGFkZGluZ1kgPT0gbm9kZU91
dGxpbmVCb3VuZHMubWF4WSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRm9j
dXNSZWN0LnNldFkobm9kZU91dGxpbmVCb3VuZHMubWF4WSgpIC0gc2VsZWN0aW9uRm9jdXNSZWN0
LmhlaWdodCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZWRpdGluZyBwb2lu
dCBpcyBvbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIHNjcmVlbiB3aGVuIHRoZSBub2RlJ3MK
KyAgICAgICAgICAgICAgICAgICAgLy8gcmVjdCBpcyBlZGdlIGFsaWduZWQsIGVkZ2UgYWxpZ24g
dGhlIG5vZGUgcmVjdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkZvY3VzUmVj
dC54KCkgLSBjYXJldEF0RWRnZVJlY3QueCgpIDwgYWN0dWFsU2NyZWVuUmVjdC53aWR0aCgpIC8g
MikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkZvY3VzUmVjdC5zZXRYKG5vZGVP
dXRsaW5lQm91bmRzLngoKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGhvcml6b250YWxTY3JvbGxBbGlnbm1lbnQgPSBTY3JvbGxBbGlnbm1lbnQ6
OmFsaWduQ2VudGVySWZOZWVkZWQ7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgdmVydGljYWxTY3JvbGxBbGlnbm1lbnQgPSAoc2Nyb2xsVHlwZSA9PSBDZW50ZXJBbHdheXMp
ID8gU2Nyb2xsQWxpZ25tZW50OjphbGlnbkNlbnRlckFsd2F5cyA6IFNjcm9sbEFsaWdubWVudDo6
YWxpZ25DZW50ZXJJZk5lZWRlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUGFk
IHRoZSByZWN0IHRvIGltcHJvdmUgdGhlIHZpc3VhbCBhcHBlYXJhbmNlLgorICAgICAgICAgICAg
c2VsZWN0aW9uRm9jdXNSZWN0LmluZmxhdGUoNCAvKiBwYWRkaW5nIGluIHBpeGVscyAqLyk7Cisg
ICAgICAgICAgICBXZWJDb3JlOjpJbnRSZWN0IHJldmVhbFJlY3QgPSBsYXllci0+Z2V0UmVjdFRv
RXhwb3NlKGFjdHVhbFNjcmVlblJlY3QsIHNlbGVjdGlvbkZvY3VzUmVjdCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9y
aXpvbnRhbFNjcm9sbEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxTY3JvbGxBbGlnbm1lbnQp
OworCisgICAgICAgICAgICBtYWluRnJhbWVWaWV3LT5zZXRTY3JvbGxQb3NpdGlvbihyZXZlYWxS
ZWN0LmxvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIHRleHQg
aXMgdG9vIHNtYWxsLCB6b29tIGluIHRvIG1ha2UgaXQgYSBtaW5pbXVtIHNpemUuCisgICAgc3Rh
dGljIGNvbnN0IGludCBzX21pbmltdW1UZXh0SGVpZ2h0SW5QaXhlbHMgPSA2OworICAgIGlmIChm
b250SGVpZ2h0ICYmIGZvbnRIZWlnaHQgPCBzX21pbmltdW1UZXh0SGVpZ2h0SW5QaXhlbHMpCisg
ICAgICAgIG1fd2ViUGFnZS0+em9vbUFib3V0UG9pbnQoc19taW5pbXVtVGV4dEhlaWdodEluUGl4
ZWxzIC8gZm9udEhlaWdodCwgbV93ZWJQYWdlLT5jZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3Qo
KSk7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjplbnN1cmVGb2N1c1BsdWdpbkVsZW1lbnRWaXNp
YmxlKCkKK3sKKyAgICBpZiAoIWlzQWN0aXZlUGx1Z2luKCkgfHwgIW1fY3VycmVudEZvY3VzRWxl
bWVudC0+ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWUqIGVsZW1lbnRG
cmFtZSA9IG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKTsKKyAgICBp
ZiAoIWVsZW1lbnRGcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWUqIG1haW5GcmFt
ZSA9IG1fd2ViUGFnZS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCFtYWluRnJhbWUpCisgICAgICAg
IHJldHVybjsKKworICAgIEZyYW1lVmlldyogbWFpbkZyYW1lVmlldyA9IG1haW5GcmFtZS0+dmll
dygpOworICAgIGlmICghbWFpbkZyYW1lVmlldykKKyAgICAgICAgcmV0dXJuOworCisgICAgV2Vi
Q29yZTo6SW50UmVjdCBzZWxlY3Rpb25Gb2N1c1JlY3Q7CisKKyAgICBSZW5kZXJXaWRnZXQqIHJl
bmRlcldpZGdldCA9IHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCo+KG1fY3VycmVudEZvY3VzRWxl
bWVudC0+cmVuZGVyZXIoKSk7CisgICAgaWYgKHJlbmRlcldpZGdldCkgeworICAgICAgICBQbHVn
aW5WaWV3KiBwbHVnaW5WaWV3ID0gc3RhdGljX2Nhc3Q8UGx1Z2luVmlldyo+KHJlbmRlcldpZGdl
dC0+d2lkZ2V0KCkpOworCisgICAgICAgIGlmIChwbHVnaW5WaWV3KQorICAgICAgICAgICAgc2Vs
ZWN0aW9uRm9jdXNSZWN0ID0gcGx1Z2luVmlldy0+ZW5zdXJlVmlzaWJsZVJlY3QoKTsKKyAgICB9
CisKKyAgICBpZiAoc2VsZWN0aW9uRm9jdXNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gRklYTUU6IFdlIG1heSBuZWVkIHRvIHNjcm9sbCB0aGUgc3ViZnJhbWUgKHJl
Y3Vyc2l2ZWx5KSBpbiB0aGUgZnV0dXJlLiBSZXZpc2l0IHRoaXMuLi4KKyAgICBpZiAoZWxlbWVu
dEZyYW1lICE9IG1haW5GcmFtZSkgeyAvLyBFbGVtZW50IGlzIGluIGEgc3ViZnJhbWUuCisgICAg
ICAgIC8vIFJlbW92ZSBhbnkgc2Nyb2xsIG9mZnNldCB3aXRoaW4gdGhlIHN1YmZyYW1lIHRvIGdl
dCB0aGUgcG9pbnQgcmVsYXRpdmUgdG8gdGhlIG1haW4gZnJhbWUuCisgICAgICAgIHNlbGVjdGlv
bkZvY3VzUmVjdC5tb3ZlKC1lbGVtZW50RnJhbWUtPnZpZXcoKS0+c2Nyb2xsUG9zaXRpb24oKS54
KCksIC1lbGVtZW50RnJhbWUtPnZpZXcoKS0+c2Nyb2xsUG9zaXRpb24oKS55KCkpOworCisgICAg
ICAgIC8vIEFkanVzdCB0aGUgc2VsZWN0aW9uIHJlY3QgYmFzZWQgb24gdGhlIGZyYW1lIG9mZnNl
dCBpbiByZWxhdGlvbiB0byB0aGUgbWFpbiBmcmFtZSBpZiBpdCdzIGEgc3ViZnJhbWUuCisgICAg
ICAgIGlmIChlbGVtZW50RnJhbWUtPm93bmVyUmVuZGVyZXIoKSkgeworICAgICAgICAgICAgV2Vi
Q29yZTo6SW50UG9pbnQgZnJhbWVPZmZzZXQgPSBlbGVtZW50RnJhbWUtPm93bmVyUmVuZGVyZXIo
KS0+YWJzb2x1dGVDb250ZW50Qm94KCkubG9jYXRpb24oKTsKKyAgICAgICAgICAgIHNlbGVjdGlv
bkZvY3VzUmVjdC5tb3ZlKGZyYW1lT2Zmc2V0LngoKSwgZnJhbWVPZmZzZXQueSgpKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIFdlYkNvcmU6OkludFJlY3QgYWN0dWFsU2NyZWVuUmVjdCA9IFdl
YkNvcmU6OkludFJlY3QobWFpbkZyYW1lVmlldy0+c2Nyb2xsUG9zaXRpb24oKSwgbV93ZWJQYWdl
LT5hY3R1YWxWaXNpYmxlU2l6ZSgpKTsKKyAgICBpZiAoYWN0dWFsU2NyZWVuUmVjdC5jb250YWlu
cyhzZWxlY3Rpb25Gb2N1c1JlY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBDYWxjdWxh
dGUgYSBwb2ludCBzdWNoIHRoYXQgdGhlIGNlbnRlciBvZiB0aGUgcmVxdWVzdGVkIHJlY3Rhbmds
ZQorICAgIC8vIGlzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4gRklYTUU6IElmIHRoZSBl
bGVtZW50IHdhcyBwYXJ0aWFsbHkgb24gc2NyZWVuCisgICAgLy8gd2UgbWlnaHQgd2FudCB0byBq
dXN0IGJyaW5nIHRoZSBvZmZzY3JlZW4gcG9ydGlvbiBpbnRvIHZpZXcsIHNvbWVvbmUgbmVlZHMK
KyAgICAvLyB0byBkZWNpZGUgaWYgdGhhdCdzIHRoZSBiZWhhdmlvciB3ZSB3YW50IG9yIG5vdC4K
KyAgICBXZWJDb3JlOjpJbnRQb2ludCBwb3Moc2VsZWN0aW9uRm9jdXNSZWN0LmNlbnRlcigpLngo
KSAtIGFjdHVhbFNjcmVlblJlY3Qud2lkdGgoKSAvIDIsCisgICAgICAgICAgICAgICAgIHNlbGVj
dGlvbkZvY3VzUmVjdC5jZW50ZXIoKS55KCkgLSBhY3R1YWxTY3JlZW5SZWN0LmhlaWdodCgpIC8g
Mik7CisKKyAgICBtYWluRnJhbWVWaWV3LT5zZXRTY3JvbGxQb3NpdGlvbihwb3MpOworfQorCit2
b2lkIElucHV0SGFuZGxlcjo6ZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZShib29sIGNlbnRlcklu
VmlldykKK3sKKyAgICBpZiAoaXNBY3RpdmVQbHVnaW4oKSkKKyAgICAgICAgZW5zdXJlRm9jdXNQ
bHVnaW5FbGVtZW50VmlzaWJsZSgpOworICAgIGVsc2UKKyAgICAgICAgZW5zdXJlRm9jdXNUZXh0
RWxlbWVudFZpc2libGUoY2VudGVySW5WaWV3ID8gQ2VudGVyQWx3YXlzIDogQ2VudGVySWZOZWVk
ZWQpOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6ZnJhbWVVbmxvYWRlZChGcmFtZSogZnJhbWUp
Cit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmIChtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkgIT0gZnJhbWUp
CisgICAgICAgIHJldHVybjsKKworICAgIEZvY3VzTG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpM
b2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OmZyYW1lVW5sb2FkZWQiKTsKKworICAgIHNldEVs
ZW1lbnRVbmZvY3VzZWQoZmFsc2UgLypyZWZvY3VzT2NjdXJpbmcqLyk7Cit9CisKK3ZvaWQgSW5w
dXRIYW5kbGVyOjpzZXROYXZpZ2F0aW9uTW9kZShib29sIGFjdGl2ZSwgYm9vbCBzZW5kTWVzc2Fn
ZSkKK3sKKyAgICBpZiAoYWN0aXZlICYmICFpc0FjdGl2ZVRleHRFZGl0KCkpIHsKKyAgICAgICAg
aWYgKCFtX25hdmlnYXRpb25Nb2RlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8v
IFdlIGNhbid0IGJlIGFjdGl2ZSBpZiB0aGVyZSBpcyBubyBlbGVtZW50LiBTZW5kIG91dCBub3Rp
ZmljYXRpb24gdGhhdCB3ZQorICAgICAgICAvLyBhcmVuJ3QgaW4gbmF2aWdhdGlvbiBtb2RlLgor
ICAgICAgICBhY3RpdmUgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBzZW5kIHRoZSBj
aGFuZ2UgaWYgaXQncyBzZXR0aW5nIHRoZSBldmVudCBzZXR0aW5nIG5hdmlnYXRpb25Nb2RlIHRy
dWUKKyAgICAvLyBpZiB3ZSBhcmUgYWxyZWFkeSBpbiBuYXZpZ2F0aW9uIG1vZGUgYW5kIHRoaXMg
aXMgYSBuYXZpZ2F0aW9uIG1vdmUgZXZlbnQuCisgICAgLy8gV2UgbmVlZCB0byBzZW5kIHRoZSBl
dmVudCB3aGVuIGl0J3MgdHJpZ2dlcmVkIGJ5IGEgdG91Y2ggZXZlbnQgb3IgbW91c2UKKyAgICAv
LyBldmVudCB0byBhbGxvdyBkaXNwbGF5IG9mIHRoZSBWS0IsIGJ1dCBkbyBub3Qgd2FudCB0byBz
ZW5kIGl0IHdoZW4gaXQncworICAgIC8vIHRyaWdnZXJlZCBieSBhIG5hdmlnYXRpb24gZXZlbnQg
YXMgaXQgaGFzIG5vIGVmZmVjdC4KKyAgICAvLyBUb3VjaCBldmVudHMgYXJlIHNpbXVsYXRlZCBh
cyBtb3VzZSBldmVudHMgc28gbW91c2VQcmVzc2VkIHdpbGwgYmUgYWN0aXZlCisgICAgLy8gd2hl
biBpdCBpcyBhIHJlLWVudHJ5IGV2ZW50LgorICAgIC8vIFNlZSBSSU0gQnVncyAjMzY5ICYgIzg3
OC4KKyAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZSA9PSBtX25hdmlnYXRpb25Nb2RlICYmICFtX3dl
YlBhZ2UtPm1fbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKS0+bW91c2VQcmVzc2VkKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fbmF2aWdhdGlvbk1vZGUgPSBhY3RpdmU7CisKKyAgICBJbnB1
dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVyOjpz
ZXROYXZpZ2F0aW9uTW9kZSAlcywgJXMiLCBhY3RpdmUgPyAidHJ1ZSIgOiAiZmFsc2UiLCBzZW5k
TWVzc2FnZSA/ICJtZXNzYWdlIHNlbnQiIDogIm1lc3NhZ2Ugbm90IHNlbnQiKTsKKworICAgIGlm
IChzZW5kTWVzc2FnZSkKKyAgICAgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+aW5wdXRTZXROYXZp
Z2F0aW9uTW9kZShhY3RpdmUpOworfQorCitib29sIElucHV0SGFuZGxlcjo6c2VsZWN0aW9uQXRT
dGFydE9mRWxlbWVudCgpCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3Vt
ZW50KCkgJiYgbV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKTsKKwor
ICAgIGlmICghc2VsZWN0aW9uU3RhcnQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSW5wdXRIYW5kbGVyOjpzZWxlY3Rpb25BdEVuZE9mRWxl
bWVudCgpCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIEFTU0VSVChtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCkgJiYg
bV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKTsKKworICAgIHJldHVy
biBzZWxlY3Rpb25TdGFydCgpID09IHN0YXRpY19jYXN0PGludD4oZWxlbWVudFRleHQoKS5sZW5n
dGgoKSk7Cit9CisKK2ludCBJbnB1dEhhbmRsZXI6OnNlbGVjdGlvblN0YXJ0KCkgY29uc3QKK3sK
KyAgICByZXR1cm4gc2VsZWN0aW9uUG9zaXRpb24odHJ1ZSk7Cit9CisKK2ludCBJbnB1dEhhbmRs
ZXI6OnNlbGVjdGlvbkVuZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNlbGVjdGlvblBvc2l0aW9u
KGZhbHNlKTsKK30KKworaW50IElucHV0SGFuZGxlcjo6c2VsZWN0aW9uUG9zaXRpb24oYm9vbCBz
dGFydCkgY29uc3QKK3sKKyAgICBpZiAoIW1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQo
KSB8fCAhbV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIGlmIChIVE1MVGV4dEZvcm1Db250cm9sRWxlbWVudCogY29udHJv
bEVsZW1lbnQgPSBET01TdXBwb3J0Ojp0b1RleHRDb250cm9sRWxlbWVudChtX2N1cnJlbnRGb2N1
c0VsZW1lbnQuZ2V0KCkpKQorICAgICAgICByZXR1cm4gc3RhcnQgPyBjb250cm9sRWxlbWVudC0+
c2VsZWN0aW9uU3RhcnQoKSA6IGNvbnRyb2xFbGVtZW50LT5zZWxlY3Rpb25FbmQoKTsKKworICAg
IEZyYW1lU2VsZWN0aW9uIGNhcmV0U2VsZWN0aW9uOworICAgIGNhcmV0U2VsZWN0aW9uLnNldFNl
bGVjdGlvbihtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCktPnNlbGVj
dGlvbigpLT5zZWxlY3Rpb24oKSk7CisgICAgUmVmUHRyPFJhbmdlPiByYW5nZVNlbGVjdGlvbiA9
IGNhcmV0U2VsZWN0aW9uLnNlbGVjdGlvbigpLnRvTm9ybWFsaXplZFJhbmdlKCk7CisgICAgaWYg
KCFyYW5nZVNlbGVjdGlvbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgc2VsZWN0aW9u
UG9pbnRJbk5vZGUgPSBzdGFydCA/IHJhbmdlU2VsZWN0aW9uLT5zdGFydE9mZnNldCgpIDogcmFu
Z2VTZWxlY3Rpb24tPmVuZE9mZnNldCgpOworICAgIE5vZGUqIGNvbnRhaW5lck5vZGUgPSBzdGFy
dCA/IHJhbmdlU2VsZWN0aW9uLT5zdGFydENvbnRhaW5lcigpIDogcmFuZ2VTZWxlY3Rpb24tPmVu
ZENvbnRhaW5lcigpOworCisgICAgRXhjZXB0aW9uQ29kZSBlYzsKKyAgICBSZWZQdHI8UmFuZ2U+
IHJhbmdlRm9yTm9kZSA9IHJhbmdlT2ZDb250ZW50cyhtX2N1cnJlbnRGb2N1c0VsZW1lbnQuZ2V0
KCkpOworICAgIHJhbmdlRm9yTm9kZS0+c2V0RW5kKGNvbnRhaW5lck5vZGUsIHNlbGVjdGlvblBv
aW50SW5Ob2RlLCBlYyk7CisgICAgQVNTRVJUKCFlYyk7CisKKyAgICByZXR1cm4gVGV4dEl0ZXJh
dG9yOjpyYW5nZUxlbmd0aChyYW5nZUZvck5vZGUuZ2V0KCkpOworfQorCit2b2lkIElucHV0SGFu
ZGxlcjo6c2VsZWN0aW9uQ2hhbmdlZCgpCit7CisgICAgLy8gVGhpcyBtZXRob2QgY2FuIGdldCBj
YWxsZWQgZHVyaW5nIFdlYlBhZ2Ugc2h1dGRvd24gcHJvY2Vzcy4KKyAgICAvLyBJZiB0aGF0IGlz
IHRoZSBjYXNlLCBqdXN0IGJhaWwgb3V0IHNpbmNlIHRoZSBjbGllbnQgaXMgbm90CisgICAgLy8g
aW4gYSBzYWZlIHN0YXRlIG9mIHRydXN0IHRvIHJlcXVlc3QgYW55dGhpbmcgZWxzZSBmcm9tIGl0
LgorICAgIGlmICghbV93ZWJQYWdlLT5tX21haW5GcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChw
cm9jZXNzaW5nQ2hhbmdlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFNjcm9sbCB0aGUg
ZmllbGQgaWYgbmVjZXNzYXJ5LiBUaGlzIG11c3QgYmUgZG9uZSBldmVuIGlmIHdlIGFyZSBwcm9j
ZXNzaW5nCisgICAgLy8gYSBjaGFuZ2UgYXMgdGhlIHRleHQgY2hhbmdlIG1heSBoYXZlIG1vdmVk
IHRoZSBjYXJldC4gSU1GIGRvZXNuJ3QgcmVxdWlyZQorICAgIC8vIHRoZSB1cGRhdGUsIGJ1dCB0
aGUgdXNlciBuZWVkcyB0byBzZWUgdGhlIGNhcmV0LgorICAgIGVuc3VyZUZvY3VzVGV4dEVsZW1l
bnRWaXNpYmxlKEVkZ2VJZk5lZWRlZCk7CisKKyAgICBBU1NFUlQobV9jdXJyZW50Rm9jdXNFbGVt
ZW50LT5kb2N1bWVudCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJh
bWUoKSk7CisKKyAgICBpbnQgbmV3U2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCgpOwor
ICAgIGludCBuZXdTZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQoKTsKKworICAgIElucHV0TG9n
KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OnNlbGVj
dGlvbkNoYW5nZWQgc2VsZWN0aW9uU3RhcnQ9JXUsIHNlbGVjdGlvbkVuZD0ldSIsIG5ld1NlbGVj
dGlvblN0YXJ0LCBuZXdTZWxlY3Rpb25FbmQpOworCisgICAgbV93ZWJQYWdlLT5tX2NsaWVudC0+
aW5wdXRTZWxlY3Rpb25DaGFuZ2VkKG5ld1NlbGVjdGlvblN0YXJ0LCBuZXdTZWxlY3Rpb25FbmQp
OworCisgICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGVkIHRleHQgbWFya2VycyBhcyB0aGUgcHJl
dmlvdXMgY2FsbCB0cmlnZ2VyZWQgYW4gZW5kIHRvCisgICAgLy8gdGhlIGNvbXBvc2l0aW9uLgor
ICAgIHJlbW92ZUF0dHJpYnV0ZWRUZXh0TWFya2VyKCk7Cit9CisKK2Jvb2wgSW5wdXRIYW5kbGVy
OjpzZXRDdXJzb3JQb3NpdGlvbihpbnQgbG9jYXRpb24pCit7CisgICAgcmV0dXJuIHNldFNlbGVj
dGlvbihsb2NhdGlvbiwgbG9jYXRpb24pOworfQorCitib29sIElucHV0SGFuZGxlcjo6c2V0U2Vs
ZWN0aW9uKGludCBzdGFydCwgaW50IGVuZCwgYm9vbCBjaGFuZ2VJc1BhcnRPZkNvbXBvc2l0aW9u
KQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBBU1NFUlQobV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpICYmIG1fY3Vy
cmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7CisKKyAgICBQcm9jZXNzaW5n
Q2hhbmdlR3VhcmQgZ3VhcmQodGhpcyk7CisKKyAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1NlbGVj
dGlvbiA9IERPTVN1cHBvcnQ6OnZpc2libGVTZWxlY3Rpb25Gb3JSYW5nZUlucHV0RWxlbWVudCht
X2N1cnJlbnRGb2N1c0VsZW1lbnQuZ2V0KCksIHN0YXJ0LCBlbmQpOworICAgIG1fY3VycmVudEZv
Y3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+c2VsZWN0aW9uKCktPnNldFNlbGVjdGlv
bihuZXdTZWxlY3Rpb24sIGNoYW5nZUlzUGFydE9mQ29tcG9zaXRpb24gPyAwIDogRnJhbWVTZWxl
Y3Rpb246OkNsb3NlVHlwaW5nIHwgRnJhbWVTZWxlY3Rpb246OkNsZWFyVHlwaW5nU3R5bGUpOwor
CisgICAgSW5wdXRMb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIklucHV0
SGFuZGxlcjo6c2V0U2VsZWN0aW9uIHNlbGVjdGlvblN0YXJ0PSV1LCBzZWxlY3Rpb25FbmQ9JXUi
LCBzdGFydCwgZW5kKTsKKworICAgIHJldHVybiBzdGFydCA9PSBzZWxlY3Rpb25TdGFydCgpICYm
IGVuZCA9PSBzZWxlY3Rpb25FbmQoKTsKK30KKworV2ViQ29yZTo6SW50UmVjdCBJbnB1dEhhbmRs
ZXI6OnJlY3RGb3JDYXJldChpbnQgaW5kZXgpCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0
KCkpCisgICAgICAgIHJldHVybiBXZWJDb3JlOjpJbnRSZWN0KCk7CisKKyAgICBBU1NFUlQobV9j
dXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+
ZG9jdW1lbnQoKS0+ZnJhbWUoKSk7CisKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gZWxl
bWVudFRleHQoKS5sZW5ndGgoKSkgeworICAgICAgICAvLyBJbnZhbGlkIHJlcXVlc3QuCisgICAg
ICAgIHJldHVybiBXZWJDb3JlOjpJbnRSZWN0KCk7CisgICAgfQorCisgICAgRnJhbWVTZWxlY3Rp
b24gY2FyZXRTZWxlY3Rpb247CisgICAgY2FyZXRTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKERPTVN1
cHBvcnQ6OnZpc2libGVTZWxlY3Rpb25Gb3JSYW5nZUlucHV0RWxlbWVudChtX2N1cnJlbnRGb2N1
c0VsZW1lbnQuZ2V0KCksIGluZGV4LCBpbmRleCkudmlzaWJsZVN0YXJ0KCkpOworICAgIGNhcmV0
U2VsZWN0aW9uLm1vZGlmeShGcmFtZVNlbGVjdGlvbjo6QWx0ZXJhdGlvbkV4dGVuZCwgRGlyZWN0
aW9uRm9yd2FyZCwgQ2hhcmFjdGVyR3JhbnVsYXJpdHkpOworICAgIHJldHVybiBjYXJldFNlbGVj
dGlvbi5zZWxlY3Rpb24oKS52aXNpYmxlU3RhcnQoKS5hYnNvbHV0ZUNhcmV0Qm91bmRzKCk7Cit9
CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpjYW5jZWxTZWxlY3Rpb24oKQoreworICAgIGlmICghaXNB
Y3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9jdXJyZW50
Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1l
bnQoKS0+ZnJhbWUoKSk7CisKKyAgICBpbnQgc2VsZWN0aW9uU3RhcnRQb3NpdGlvbiA9IHNlbGVj
dGlvblN0YXJ0KCk7CisgICAgUHJvY2Vzc2luZ0NoYW5nZUd1YXJkIGd1YXJkKHRoaXMpOworICAg
IHNldEN1cnNvclBvc2l0aW9uKHNlbGVjdGlvblN0YXJ0UG9zaXRpb24pOworfQorCitib29sIElu
cHV0SGFuZGxlcjo6aGFuZGxlS2V5Ym9hcmRJbnB1dChjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6S2V5Ym9hcmRFdmVudCYga2V5Ym9hcmRFdmVudCwgYm9vbCBjaGFuZ2VJc1BhcnRPZkNvbXBv
c2l0aW9uKQoreworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbElu
Zm8sICJJbnB1dEhhbmRsZXI6OmhhbmRsZUtleWJvYXJkSW5wdXQgcmVjZWl2ZWQgY2hhcmFjdGVy
PSVsYywgdHlwZT0lZCIsIGtleWJvYXJkRXZlbnQuY2hhcmFjdGVyKCksIGtleWJvYXJkRXZlbnQu
dHlwZSgpKTsKKworICAgIC8vIElmIHdlIGFyZW4ndCBzcGVjaWZpY2FsbHkgcGFydCBvZiBhIGNv
bXBvc2l0aW9uLCBmYWlsLCBJTUYgc2hvdWxkIG5ldmVyIHNlbmQga2V5IGlucHV0CisgICAgLy8g
d2hpbGUgY29tcG9zaW5nIHRleHQuIElmIElNRiBoYXMgZmFpbGVkLCB3ZSBzaG91bGQgaGF2ZSBh
bHJlYWR5IGZpbmlzaGVkIHRoZQorICAgIC8vIGNvbXBvc2l0aW9uIG1hbnVhbGx5LgorICAgIGlm
ICghY2hhbmdlSXNQYXJ0T2ZDb21wb3NpdGlvbiAmJiBjb21wb3NpdGlvbkFjdGl2ZSgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQcm9jZXNzaW5nQ2hhbmdlR3VhcmQgZ3VhcmQodGhp
cyk7CisKKyAgICB1bnNpZ25lZCBhZGp1c3RlZE1vZGlmaWVycyA9IGtleWJvYXJkRXZlbnQubW9k
aWZpZXJzKCk7CisgICAgaWYgKFdURjo6aXNBU0NJSVVwcGVyKGtleWJvYXJkRXZlbnQuY2hhcmFj
dGVyKCkpKQorICAgICAgICBhZGp1c3RlZE1vZGlmaWVycyB8PSBLRVlNT0RfU0hJRlQ7CisKKyAg
ICBBU1NFUlQobV93ZWJQYWdlLT5tX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpKTsKKyAgICBib29s
IGtleWJvYXJkRXZlbnRIYW5kbGVkID0gZmFsc2U7CisgICAgaWYgKEZyYW1lKiBmb2N1c2VkRnJh
bWUgPSBtX3dlYlBhZ2UtPm1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRGcmFtZSgp
KSB7CisgICAgICAgIGJvb2wgaXNLZXlDaGFyID0ga2V5Ym9hcmRFdmVudC50eXBlKCkgPT0gQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OktleWJvYXJkRXZlbnQ6OktleUNoYXI7CisgICAgICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpLZXlib2FyZEV2ZW50OjpUeXBlIHR5cGUgPSBrZXlib2FyZEV2ZW50
LnR5cGUoKTsKKworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgS2V5Q2hhciB0eXBlIHRoZW4gd2Ug
aGFuZGxlIGl0IGFzIGEga2V5ZG93biBmb2xsb3dlZCBieSBhIGtleSB1cC4KKyAgICAgICAgaWYg
KGlzS2V5Q2hhcikKKyAgICAgICAgICAgIHR5cGUgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5
Ym9hcmRFdmVudDo6S2V5RG93bjsKKworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5
Ym9hcmRFdmVudCBhZGp1c3RlZEtleWJvYXJkRXZlbnQoa2V5Ym9hcmRFdmVudC5jaGFyYWN0ZXIo
KSwgdHlwZSwgYWRqdXN0ZWRNb2RpZmllcnMpOworICAgICAgICBrZXlib2FyZEV2ZW50SGFuZGxl
ZCA9IGZvY3VzZWRGcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmtleUV2ZW50KFBsYXRmb3JtS2V5Ym9h
cmRFdmVudChhZGp1c3RlZEtleWJvYXJkRXZlbnQpKTsKKworICAgICAgICBpZiAoaXNLZXlDaGFy
KSB7CisgICAgICAgICAgICB0eXBlID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OktleWJvYXJkRXZl
bnQ6OktleVVwOworICAgICAgICAgICAgYWRqdXN0ZWRLZXlib2FyZEV2ZW50ID0gQmxhY2tCZXJy
eTo6UGxhdGZvcm06OktleWJvYXJkRXZlbnQoa2V5Ym9hcmRFdmVudC5jaGFyYWN0ZXIoKSwgdHlw
ZSwgYWRqdXN0ZWRNb2RpZmllcnMpOworICAgICAgICAgICAga2V5Ym9hcmRFdmVudEhhbmRsZWQg
PSBmb2N1c2VkRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5rZXlFdmVudChQbGF0Zm9ybUtleWJvYXJk
RXZlbnQoYWRqdXN0ZWRLZXlib2FyZEV2ZW50KSkgfHwga2V5Ym9hcmRFdmVudEhhbmRsZWQ7Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoIWNoYW5nZUlzUGFydE9mQ29tcG9zaXRpb24gJiYgdHlw
ZSA9PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudDo6S2V5VXApCisgICAgICAg
ICAgICBlbnN1cmVGb2N1c1RleHRFbGVtZW50VmlzaWJsZShFZGdlSWZOZWVkZWQpOworICAgIH0K
KyAgICByZXR1cm4ga2V5Ym9hcmRFdmVudEhhbmRsZWQ7Cit9CisKK2Jvb2wgSW5wdXRIYW5kbGVy
OjpoYW5kbGVOYXZpZ2F0aW9uTW92ZSh1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIsIGJvb2wgc2hp
ZnREb3duLCBib29sIGFsdERvd24sIGJvb2wgY2FuRXhpdEZpZWxkKQoreworICAgIElucHV0TG9n
KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OmhhbmRs
ZU5hdmlnYXRpb25Nb3ZlIHJlY2VpdmVkIGNoYXJhY3Rlcj0lbGMiLCBjaGFyYWN0ZXIpOworCisg
ICAgYm9vbCBldmVudEhhbmRsZWQgPSBmYWxzZTsKKyAgICBBU1NFUlQobV93ZWJQYWdlLT5tX3Bh
Z2UtPmZvY3VzQ29udHJvbGxlcigpKTsKKyAgICBpZiAoRnJhbWUqIGZvY3VzZWRGcmFtZSA9IG1f
d2ViUGFnZS0+bV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCkpIHsKKyAg
ICAgICAgLy8gSWYgYWx0IGlzIGRvd24sIGRvIG5vdCBicmVhayBvdXQgb2YgdGhlIGZpZWxkLgor
ICAgICAgICBpZiAoY2FuRXhpdEZpZWxkICYmICFhbHREb3duKSB7CisgICAgICAgICAgICBpZiAo
KGNoYXJhY3RlciA9PSBLRVlDT0RFX0xFRlQgfHwgY2hhcmFjdGVyID09IEtFWUNPREVfVVApICYm
IHNlbGVjdGlvbkF0U3RhcnRPZkVsZW1lbnQoKQorICAgICAgICAgICAgICAgIHx8IChjaGFyYWN0
ZXIgPT0gS0VZQ09ERV9SSUdIVCB8fCBjaGFyYWN0ZXIgPT0gS0VZQ09ERV9ET1dOKSAmJiBzZWxl
Y3Rpb25BdEVuZE9mRWxlbWVudCgpKSB7CisgICAgICAgICAgICAgICAgc2V0TmF2aWdhdGlvbk1v
ZGUoZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjaGFyYWN0ZXIpIHsKKyAgICAgICAgY2FzZSBL
RVlDT0RFX0xFRlQ6CisgICAgICAgICAgICBpZiAoYWx0RG93biAmJiBzaGlmdERvd24pCisgICAg
ICAgICAgICAgICAgZXZlbnRIYW5kbGVkID0gZm9jdXNlZEZyYW1lLT5lZGl0b3IoKS0+Y29tbWFu
ZCgiTW92ZVRvQmVnaW5uaW5nT2ZMaW5lQW5kTW9kaWZ5U2VsZWN0aW9uIikuZXhlY3V0ZSgpOwor
ICAgICAgICAgICAgZWxzZSBpZiAoYWx0RG93bikKKyAgICAgICAgICAgICAgICBldmVudEhhbmRs
ZWQgPSBmb2N1c2VkRnJhbWUtPmVkaXRvcigpLT5jb21tYW5kKCJNb3ZlVG9CZWdpbm5pbmdPZkxp
bmUiKS5leGVjdXRlKCk7CisgICAgICAgICAgICBlbHNlIGlmIChzaGlmdERvd24pCisgICAgICAg
ICAgICAgICAgZXZlbnRIYW5kbGVkID0gZm9jdXNlZEZyYW1lLT5lZGl0b3IoKS0+Y29tbWFuZCgi
TW92ZUxlZnRBbmRNb2RpZnlTZWxlY3Rpb24iKS5leGVjdXRlKCk7CisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVkID0gZm9jdXNlZEZyYW1lLT5lZGl0b3IoKS0+
Y29tbWFuZCgiTW92ZUxlZnQiKS5leGVjdXRlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBLRVlDT0RFX1JJR0hUOgorICAgICAgICAgICAgaWYgKGFsdERvd24gJiYgc2hpZnRE
b3duKQorICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRpdG9y
KCktPmNvbW1hbmQoIk1vdmVUb0VuZE9mTGluZUFuZE1vZGlmeVNlbGVjdGlvbiIpLmV4ZWN1dGUo
KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGFsdERvd24pCisgICAgICAgICAgICAgICAgZXZlbnRI
YW5kbGVkID0gZm9jdXNlZEZyYW1lLT5lZGl0b3IoKS0+Y29tbWFuZCgiTW92ZVRvRW5kT2ZMaW5l
IikuZXhlY3V0ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoc2hpZnREb3duKQorICAgICAgICAg
ICAgICAgIGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoIk1v
dmVSaWdodEFuZE1vZGlmeVNlbGVjdGlvbiIpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICBldmVudEhhbmRsZWQgPSBmb2N1c2VkRnJhbWUtPmVkaXRvcigpLT5j
b21tYW5kKCJNb3ZlUmlnaHQiKS5leGVjdXRlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBLRVlDT0RFX1VQOgorICAgICAgICAgICAgaWYgKGFsdERvd24gJiYgc2hpZnREb3du
KQorICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRpdG9yKCkt
PmNvbW1hbmQoIk1vdmVUb0JlZ2lubmluZ09mRG9jdW1lbnRBbmRNb2RpZnlTZWxlY3Rpb24iKS5l
eGVjdXRlKCk7CisgICAgICAgICAgICBlbHNlIGlmIChhbHREb3duKQorICAgICAgICAgICAgICAg
IGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoIk1vdmVUb0Jl
Z2lubmluZ09mRG9jdW1lbnQiKS5leGVjdXRlKCk7CisgICAgICAgICAgICBlbHNlIGlmIChzaGlm
dERvd24pCisgICAgICAgICAgICAgICAgZXZlbnRIYW5kbGVkID0gZm9jdXNlZEZyYW1lLT5lZGl0
b3IoKS0+Y29tbWFuZCgiTW92ZVVwQW5kTW9kaWZ5U2VsZWN0aW9uIikuZXhlY3V0ZSgpOworICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFt
ZS0+ZWRpdG9yKCktPmNvbW1hbmQoIk1vdmVVcCIpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIEtFWUNPREVfRE9XTjoKKyAgICAgICAgICAgIGlmIChhbHREb3du
ICYmIHNoaWZ0RG93bikKKyAgICAgICAgICAgICAgICBldmVudEhhbmRsZWQgPSBmb2N1c2VkRnJh
bWUtPmVkaXRvcigpLT5jb21tYW5kKCJNb3ZlVG9FbmRPZkRvY3VtZW50QW5kTW9kaWZ5U2VsZWN0
aW9uIikuZXhlY3V0ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoYWx0RG93bikKKyAgICAgICAg
ICAgICAgICBldmVudEhhbmRsZWQgPSBmb2N1c2VkRnJhbWUtPmVkaXRvcigpLT5jb21tYW5kKCJN
b3ZlVG9FbmRPZkRvY3VtZW50IikuZXhlY3V0ZSgpOworICAgICAgICAgICAgZWxzZSBpZiAoc2hp
ZnREb3duKQorICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRGcmFtZS0+ZWRp
dG9yKCktPmNvbW1hbmQoIk1vdmVEb3duQW5kTW9kaWZ5U2VsZWN0aW9uIikuZXhlY3V0ZSgpOwor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlZCA9IGZvY3VzZWRG
cmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoIk1vdmVEb3duIikuZXhlY3V0ZSgpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGV2ZW50SGFuZGxlZDsKK30K
KworYm9vbCBJbnB1dEhhbmRsZXI6OmRlbGV0ZVNlbGVjdGlvbigpCit7CisgICAgaWYgKCFpc0Fj
dGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChtX2N1
cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCkgJiYgbV9jdXJyZW50Rm9jdXNFbGVtZW50LT5k
b2N1bWVudCgpLT5mcmFtZSgpKTsKKyAgICBGcmFtZSogZnJhbWUgPSBtX2N1cnJlbnRGb2N1c0Vs
ZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCk7CisKKyAgICBpZiAoZnJhbWUtPnNlbGVjdGlvbigp
LT5zZWxlY3Rpb25UeXBlKCkgIT0gVmlzaWJsZVNlbGVjdGlvbjo6UmFuZ2VTZWxlY3Rpb24pCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChmcmFtZS0+ZWRpdG9yKCkpOworICAg
IHJldHVybiBmcmFtZS0+ZWRpdG9yKCktPmNvbW1hbmQoIkRlbGV0ZUJhY2t3YXJkIikuZXhlY3V0
ZSgpOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6aW5zZXJ0VGV4dChjb25zdCBXVEY6OlN0cmlu
ZyYgc3RyaW5nKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBBU1NFUlQobV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpICYmIG1f
Y3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKSAmJiBtX2N1cnJlbnRGb2N1
c0VsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCktPmVkaXRvcigpKTsKKyAgICBFZGl0b3IqIGVk
aXRvciA9IG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+ZnJhbWUoKS0+ZWRpdG9y
KCk7CisKKyAgICBlZGl0b3ItPmNvbW1hbmQoIkluc2VydFRleHQiKS5leGVjdXRlKHN0cmluZyk7
Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVyOjpjbGVhckZpZWxkKCkKK3sKKyAgICBpZiAoIWlzQWN0
aXZlVGV4dEVkaXQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKG1fY3VycmVudEZv
Y3VzRWxlbWVudC0+ZG9jdW1lbnQoKSAmJiBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50
KCktPmZyYW1lKCkgJiYgbV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpLT5mcmFtZSgp
LT5lZGl0b3IoKSk7CisgICAgRWRpdG9yKiBlZGl0b3IgPSBtX2N1cnJlbnRGb2N1c0VsZW1lbnQt
PmRvY3VtZW50KCktPmZyYW1lKCktPmVkaXRvcigpOworCisgICAgZWRpdG9yLT5jb21tYW5kKCJT
ZWxlY3RBbGwiKS5leGVjdXRlKCk7CisgICAgZWRpdG9yLT5jb21tYW5kKCJEZWxldGVCYWNrd2Fy
ZCIpLmV4ZWN1dGUoKTsKK30KKworYm9vbCBJbnB1dEhhbmRsZXI6OmV4ZWN1dGVUZXh0RWRpdENv
bW1hbmQoY29uc3QgV1RGOjpTdHJpbmcmIGNvbW1hbmROYW1lKQoreworICAgIEFTU0VSVChtX3dl
YlBhZ2UtPmZvY3VzZWRPck1haW5GcmFtZSgpICYmIG1fd2ViUGFnZS0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCktPmVkaXRvcigpKTsKKyAgICBFZGl0b3IqIGVkaXRvciA9IG1fd2ViUGFnZS0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCktPmVkaXRvcigpOworCisgICAgcmV0dXJuIGVkaXRvci0+Y29tbWFuZChj
b21tYW5kTmFtZSkuZXhlY3V0ZSgpOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6Y3V0KCkKK3sK
KyAgICBleGVjdXRlVGV4dEVkaXRDb21tYW5kKCJDdXQiKTsKK30KKwordm9pZCBJbnB1dEhhbmRs
ZXI6OmNvcHkoKQoreworICAgIGV4ZWN1dGVUZXh0RWRpdENvbW1hbmQoIkNvcHkiKTsKK30KKwor
dm9pZCBJbnB1dEhhbmRsZXI6OnBhc3RlKCkKK3sKKyAgICBleGVjdXRlVGV4dEVkaXRDb21tYW5k
KCJQYXN0ZSIpOworfQorCit2b2lkIElucHV0SGFuZGxlcjo6YWRkQXR0cmlidXRlZFRleHRNYXJr
ZXIoaW50IHN0YXJ0LCBpbnQgZW5kLCBjb25zdCBBdHRyaWJ1dGVUZXh0U3R5bGUmIHN0eWxlKQor
eworICAgIGlmICgoZW5kIC0gc3RhcnQpIDwgMSB8fCBlbmQgPiBzdGF0aWNfY2FzdDxpbnQ+KGVs
ZW1lbnRUZXh0KCkubGVuZ3RoKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICBSZWZQdHI8UmFu
Z2U+IG1hcmtlclJhbmdlID0gRE9NU3VwcG9ydDo6dmlzaWJsZVNlbGVjdGlvbkZvclJhbmdlSW5w
dXRFbGVtZW50KG1fY3VycmVudEZvY3VzRWxlbWVudC5nZXQoKSwgc3RhcnQsIGVuZCkudG9Ob3Jt
YWxpemVkUmFuZ2UoKTsKKyAgICBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPm1h
cmtlcnMoKS0+YWRkTWFya2VyKG1hcmtlclJhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6QXR0
cmlidXRlVGV4dCwgV1RGOjpTdHJpbmcoIklucHV0IE1hcmtlciIpLCBzdHlsZSk7Cit9CisKK3Zv
aWQgSW5wdXRIYW5kbGVyOjpyZW1vdmVBdHRyaWJ1dGVkVGV4dE1hcmtlcigpCit7CisgICAgLy8g
UmVtb3ZlIGFsbCBhdHRyaWJ1dGUgdGV4dCBtYXJrZXJzLgorICAgIGlmIChtX2N1cnJlbnRGb2N1
c0VsZW1lbnQgJiYgbV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpKQorICAgICAgICBt
X2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPm1hcmtlcnMoKS0+cmVtb3ZlTWFya2Vy
cyhEb2N1bWVudE1hcmtlcjo6QXR0cmlidXRlVGV4dCk7CisKKyAgICBtX2NvbXBvc2luZ1RleHRT
dGFydCA9IDA7CisgICAgbV9jb21wb3NpbmdUZXh0RW5kID0gMDsKK30KKwordm9pZCBJbnB1dEhh
bmRsZXI6OmhhbmRsZUlucHV0TG9jYWxlQ2hhbmdlZChib29sIGlzUlRMKQoreworICAgIGlmICgh
aXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9jdXJy
ZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpICYmIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9j
dW1lbnQoKS0+ZnJhbWUoKSk7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG1fY3VycmVu
dEZvY3VzRWxlbWVudC0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBFZGl0b3IqIGVkaXRvciA9IG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9j
dW1lbnQoKS0+ZnJhbWUoKS0+ZWRpdG9yKCk7CisgICAgQVNTRVJUKGVkaXRvcik7CisgICAgaWYg
KChyZW5kZXJlci0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMKSAhPSBpc1JUTCkKKyAgICAg
ICAgZWRpdG9yLT5zZXRCYXNlV3JpdGluZ0RpcmVjdGlvbihpc1JUTCA/IFJpZ2h0VG9MZWZ0V3Jp
dGluZ0RpcmVjdGlvbiA6IExlZnRUb1JpZ2h0V3JpdGluZ0RpcmVjdGlvbik7Cit9CisKK3ZvaWQg
SW5wdXRIYW5kbGVyOjpjbGVhckN1cnJlbnRGb2N1c0VsZW1lbnQoKQoreworICAgIGlmIChtX2N1
cnJlbnRGb2N1c0VsZW1lbnQpCisgICAgICAgIG1fY3VycmVudEZvY3VzRWxlbWVudC0+Ymx1cigp
OworfQorCitib29sIElucHV0SGFuZGxlcjo6d2lsbE9wZW5Qb3B1cEZvck5vZGUoTm9kZSogbm9k
ZSkKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGgg
SW5wdXRIYW5kbGVyOjpkaWROb2RlT3BlblBvcHVwLgorICAgIGlmICghbm9kZSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKCFub2RlLT5pc0luU2hhZG93VHJlZSgpKTsKKwor
ICAgIGlmIChub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6c2VsZWN0VGFnKSB8fCBub2RlLT5o
YXNUYWdOYW1lKEhUTUxOYW1lczo6b3B0aW9uVGFnKSkgeworICAgICAgICAvLyBXZSBvcGVuIGxp
c3QgcG9wdXBzIGZvciBvcHRpb25zIGFuZCBzZWxlY3RzLgorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICBpZiAobm9kZS0+aXNFbGVtZW50Tm9kZSgpKSB7CisgICAgICAgIEVsZW1l
bnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7CisgICAgICAgIGlmIChE
T01TdXBwb3J0Ojppc1BvcHVwSW5wdXRGaWVsZChlbGVtZW50KSkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJbnB1dEhhbmRs
ZXI6OmRpZE5vZGVPcGVuUG9wdXAoTm9kZSogbm9kZSkKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCBt
dXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggSW5wdXRIYW5kbGVyOjp3aWxsT3BlblBvcHVw
Rm9yTm9kZS4KKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFT
U0VSVCghbm9kZS0+aXNJblNoYWRvd1RyZWUoKSk7CisKKyAgICBpZiAobm9kZS0+aGFzVGFnTmFt
ZShIVE1MTmFtZXM6OnNlbGVjdFRhZykpCisgICAgICAgIHJldHVybiBvcGVuU2VsZWN0UG9wdXAo
c3RhdGljX2Nhc3Q8SFRNTFNlbGVjdEVsZW1lbnQqPihub2RlKSk7CisKKyAgICBpZiAobm9kZS0+
aGFzVGFnTmFtZShIVE1MTmFtZXM6Om9wdGlvblRhZykpIHsKKyAgICAgICAgSFRNTE9wdGlvbkVs
ZW1lbnQqIG9wdGlvbkVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MT3B0aW9uRWxlbWVudCo+KG5v
ZGUpOworICAgICAgICByZXR1cm4gb3BlblNlbGVjdFBvcHVwKG9wdGlvbkVsZW1lbnQtPm93bmVy
U2VsZWN0RWxlbWVudCgpKTsKKyAgICB9CisKKyAgICBpZiAoSFRNTElucHV0RWxlbWVudCogZWxl
bWVudCA9IG5vZGUtPnRvSW5wdXRFbGVtZW50KCkpIHsKKyAgICAgICAgaWYgKERPTVN1cHBvcnQ6
OmlzRGF0ZVRpbWVJbnB1dEZpZWxkKGVsZW1lbnQpKQorICAgICAgICAgICAgcmV0dXJuIG9wZW5E
YXRlUG9wdXAoZWxlbWVudCwgZWxlbWVudFR5cGUoZWxlbWVudCkpOworCisgICAgICAgIGlmIChE
T01TdXBwb3J0Ojppc0NvbG9ySW5wdXRGaWVsZChlbGVtZW50KSkKKyAgICAgICAgICAgIHJldHVy
biBvcGVuQ29sb3JQb3B1cChlbGVtZW50KTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQor
Citib29sIElucHV0SGFuZGxlcjo6b3BlblNlbGVjdFBvcHVwKEhUTUxTZWxlY3RFbGVtZW50KiBz
ZWxlY3QpCit7CisgICAgaWYgKCFzZWxlY3QgfHwgc2VsZWN0LT5kaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICBj
bGVhckN1cnJlbnRGb2N1c0VsZW1lbnQoKTsKKworICAgIG1fY3VycmVudEZvY3VzRWxlbWVudCA9
IHNlbGVjdDsKKyAgICBtX2N1cnJlbnRGb2N1c0VsZW1lbnRUeXBlID0gU2VsZWN0UG9wdXA7Cisg
ICAgY29uc3QgV1RGOjpWZWN0b3I8SFRNTEVsZW1lbnQqPiYgbGlzdEl0ZW1zID0gc2VsZWN0LT5s
aXN0SXRlbXMoKTsKKyAgICBpbnQgc2l6ZSA9IGxpc3RJdGVtcy5zaXplKCk7CisgICAgaWYgKCFz
aXplKSB7CisgICAgICAgIFNjb3BlQXJyYXk8V2ViU3RyaW5nPiBsYWJlbHM7CisgICAgICAgIGJv
b2wqIGVuYWJsZWRzID0gMDsKKyAgICAgICAgaW50KiBpdGVtVHlwZXMgPSAwOworICAgICAgICBi
b29sKiBzZWxlY3RlZHMgPSAwOworICAgICAgICBtX3dlYlBhZ2UtPm1fY2xpZW50LT5vcGVuUG9w
dXBMaXN0KGZhbHNlLCBzaXplLCBsYWJlbHMsIGVuYWJsZWRzLCBpdGVtVHlwZXMsIHNlbGVjdGVk
cyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgbXVsdGlwbGUgPSBz
ZWxlY3QtPm11bHRpcGxlKCk7CisKKyAgICBTY29wZUFycmF5PFdlYlN0cmluZz4gbGFiZWxzOwor
ICAgIGxhYmVscy5yZXNldChuZXcgV2ViU3RyaW5nW3NpemVdKTsKKyAgICBib29sKiBlbmFibGVk
cyA9IG5ldyBib29sW3NpemVdOworICAgIGludCogaXRlbVR5cGVzID0gbmV3IGludFtzaXplXTsK
KyAgICBib29sKiBzZWxlY3RlZHMgPSBuZXcgYm9vbFtzaXplXTsKKworICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05h
bWUoSFRNTE5hbWVzOjpvcHRpb25UYWcpKSB7CisgICAgICAgICAgICBIVE1MT3B0aW9uRWxlbWVu
dCogb3B0aW9uID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihsaXN0SXRlbXNbaV0p
OworICAgICAgICAgICAgbGFiZWxzW2ldID0gb3B0aW9uLT50ZXh0SW5kZW50ZWRUb1Jlc3BlY3RH
cm91cExhYmVsKCk7CisgICAgICAgICAgICBlbmFibGVkc1tpXSA9IG9wdGlvbi0+ZGlzYWJsZWQo
KSA/IDAgOiAxOworICAgICAgICAgICAgc2VsZWN0ZWRzW2ldID0gb3B0aW9uLT5zZWxlY3RlZCgp
OworICAgICAgICAgICAgaXRlbVR5cGVzW2ldID0gVHlwZU9wdGlvbjsKKyAgICAgICAgfSBlbHNl
IGlmIChsaXN0SXRlbXNbaV0tPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpvcHRncm91cFRhZykpIHsK
KyAgICAgICAgICAgIEhUTUxPcHRHcm91cEVsZW1lbnQqIG9wdEdyb3VwID0gc3RhdGljX2Nhc3Q8
SFRNTE9wdEdyb3VwRWxlbWVudCo+KGxpc3RJdGVtc1tpXSk7CisgICAgICAgICAgICBsYWJlbHNb
aV0gPSBvcHRHcm91cC0+Z3JvdXBMYWJlbFRleHQoKTsKKyAgICAgICAgICAgIGVuYWJsZWRzW2ld
ID0gb3B0R3JvdXAtPmRpc2FibGVkKCkgPyAwIDogMTsKKyAgICAgICAgICAgIHNlbGVjdGVkc1tp
XSA9IGZhbHNlOworICAgICAgICAgICAgaXRlbVR5cGVzW2ldID0gVHlwZUdyb3VwOworICAgICAg
ICB9IGVsc2UgaWYgKGxpc3RJdGVtc1tpXS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmhyVGFnKSkg
eworICAgICAgICAgICAgZW5hYmxlZHNbaV0gPSBmYWxzZTsKKyAgICAgICAgICAgIHNlbGVjdGVk
c1tpXSA9IGZhbHNlOworICAgICAgICAgICAgaXRlbVR5cGVzW2ldID0gVHlwZVNlcGFyYXRvcjsK
KyAgICAgICAgfQorICAgIH0KKworICAgIG1fd2ViUGFnZS0+bV9jbGllbnQtPm9wZW5Qb3B1cExp
c3QobXVsdGlwbGUsIHNpemUsIGxhYmVscywgZW5hYmxlZHMsIGl0ZW1UeXBlcywgc2VsZWN0ZWRz
KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJbnB1dEhhbmRsZXI6OnNldFBvcHVwTGlz
dEluZGV4KGludCBpbmRleCkKK3sKKyAgICBpZiAoaW5kZXggPT0gLTIpIC8vIEFiYW5kb24KKyAg
ICAgICAgcmV0dXJuIGNsZWFyQ3VycmVudEZvY3VzRWxlbWVudCgpOworCisgICAgaWYgKCFpc0Fj
dGl2ZVNlbGVjdFBvcHVwKCkpCisgICAgICAgIHJldHVybiBjbGVhckN1cnJlbnRGb2N1c0VsZW1l
bnQoKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBtX2N1cnJlbnRGb2N1c0VsZW1l
bnQtPnJlbmRlcmVyKCk7CisgICAgaWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLT5pc01lbnVMaXN0
KCkpIHsKKyAgICAgICAgUmVuZGVyTWVudUxpc3QqIHJlbmRlck1lbnUgPSB0b1JlbmRlck1lbnVM
aXN0KHJlbmRlcmVyKTsKKyAgICAgICAgcmVuZGVyTWVudS0+aGlkZVBvcHVwKCk7CisgICAgfQor
CisgICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1M
U2VsZWN0RWxlbWVudCo+KG1fY3VycmVudEZvY3VzRWxlbWVudC5nZXQoKSk7CisgICAgaW50IG9w
dGlvbkluZGV4ID0gc2VsZWN0RWxlbWVudC0+bGlzdFRvT3B0aW9uSW5kZXgoaW5kZXgpOworICAg
IHNlbGVjdEVsZW1lbnQtPm9wdGlvblNlbGVjdGVkQnlVc2VyKG9wdGlvbkluZGV4LCB0cnVlIC8q
IGRlc2VsZWN0ID0gdHJ1ZSAqLywgdHJ1ZSAvKiBmaXJlT25DaGFuZ2VOb3cgPSBmYWxzZSAqLyk7
CisgICAgY2xlYXJDdXJyZW50Rm9jdXNFbGVtZW50KCk7Cit9CisKK3ZvaWQgSW5wdXRIYW5kbGVy
OjpzZXRQb3B1cExpc3RJbmRleGVzKGludCBzaXplLCBib29sKiBzZWxlY3RlZHMpCit7CisgICAg
aWYgKCFpc0FjdGl2ZVNlbGVjdFBvcHVwKCkpCisgICAgICAgIHJldHVybiBjbGVhckN1cnJlbnRG
b2N1c0VsZW1lbnQoKTsKKworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgSFRNTFNlbGVjdEVsZW1lbnQqIHNlbGVjdEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MU2Vs
ZWN0RWxlbWVudCo+KG1fY3VycmVudEZvY3VzRWxlbWVudC5nZXQoKSk7CisgICAgY29uc3QgV1RG
OjpWZWN0b3I8SFRNTEVsZW1lbnQqPiYgaXRlbXMgPSBzZWxlY3RFbGVtZW50LT5saXN0SXRlbXMo
KTsKKyAgICBpZiAoaXRlbXMuc2l6ZSgpICE9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oc2l6
ZSkpCisgICAgICAgIHJldHVybjsKKworICAgIEhUTUxPcHRpb25FbGVtZW50KiBvcHRpb247Cisg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1zW2ld
LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6b3B0aW9uVGFnKSkgeworICAgICAgICAgICAgb3B0aW9u
ID0gc3RhdGljX2Nhc3Q8SFRNTE9wdGlvbkVsZW1lbnQqPihpdGVtc1tpXSk7CisgICAgICAgICAg
ICBvcHRpb24tPnNldFNlbGVjdGVkU3RhdGUoc2VsZWN0ZWRzW2ldKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIEZvcmNlIHJlcGFpbnQgYmVjYXVzZSB3ZSBkbyBub3Qgc2VuZCBtb3VzZSBl
dmVudHMgdG8gdGhlIHNlbGVjdCBlbGVtZW50CisgICAgLy8gYW5kIHRoZSBlbGVtZW50IGRvZXNu
J3QgYXV0b21hdGljYWxseSByZXBhaW50IGl0c2VsZi4KKyAgICBzZWxlY3RFbGVtZW50LT5kaXNw
YXRjaEZvcm1Db250cm9sQ2hhbmdlRXZlbnQoKTsKKyAgICBzZWxlY3RFbGVtZW50LT5yZW5kZXJl
cigpLT5yZXBhaW50KCk7CisgICAgY2xlYXJDdXJyZW50Rm9jdXNFbGVtZW50KCk7Cit9CisKK2Jv
b2wgSW5wdXRIYW5kbGVyOjpzZXRCYXRjaEVkaXRpbmdBY3RpdmUoYm9vbCBhY3RpdmUpCit7Cisg
ICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IEFTU0VSVChtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCkpOworICAgIEFTU0VSVCht
X2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkpOworCisgICAgLy8gRklY
TUUgc3dpdGNoIHRoaXMgdG8gbV9jdXJyZW50Rm9jdXNFbGVtZW50LT5kb2N1bWVudCgpLT5mcmFt
ZSgpIHdoZW4gd2UgaGF2ZSBzZXBhcmF0ZQorICAgIC8vIGJhY2tpbmdzdG9yZSBmb3IgZWFjaCBm
cmFtZS4KKyAgICBCYWNraW5nU3RvcmVDbGllbnQqIGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1l
ID0gbV93ZWJQYWdlLT5iYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShtX3dlYlBhZ2UtPm1haW5G
cmFtZSgpKTsKKyAgICBBU1NFUlQoYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUpOworCisgICAg
Ly8gRW5hYmxlIC8gRGlzYWJsZSB0aGUgYmFja2luZ3N0b3JlIHRvIHByZXZlbnQgdmlzdWFsIHVw
ZGF0ZXMuCisgICAgaWYgKCFhY3RpdmUpCisgICAgICAgIGJhY2tpbmdTdG9yZUNsaWVudEZvckZy
YW1lLT5iYWNraW5nU3RvcmUoKS0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhC
YWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQpOworICAgIGVsc2UKKyAgICAgICAgYmFja2luZ1N0
b3JlQ2xpZW50Rm9yRnJhbWUtPmJhY2tpbmdTdG9yZSgpLT5zdXNwZW5kU2NyZWVuQW5kQmFja2lu
Z1N0b3JlVXBkYXRlcygpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBJbnB1dEhhbmRs
ZXI6OmNhcmV0UG9zaXRpb24oKSBjb25zdAoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgp
KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGV4
cGVjdGVkIHRvIHJldHVybiB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiBpZgorICAgIC8vIGEg
c2VsZWN0aW9uIGlzIGFwcGxpZWQuCisgICAgcmV0dXJuIHNlbGVjdGlvblN0YXJ0KCk7Cit9CisK
K2ludCByZWxhdGl2ZUxlZnRPZmZzZXQoaW50IGNhcmV0UG9zaXRpb24sIGludCBsZWZ0T2Zmc2V0
KQoreworICAgIEFTU0VSVChjYXJldFBvc2l0aW9uID49IDApOworCisgICAgcmV0dXJuIHN0ZDo6
bWF4KDAsIGNhcmV0UG9zaXRpb24gLSBsZWZ0T2Zmc2V0KTsKK30KKworaW50IHJlbGF0aXZlUmln
aHRPZmZzZXQoaW50IGNhcmV0UG9zaXRpb24sIHVuc2lnbmVkIHRvdGFsTGVuZ3RoT2ZUZXh0LCBp
bnQgcmlnaHRPZmZzZXQpCit7CisgICAgQVNTRVJUKGNhcmV0UG9zaXRpb24gPj0gMCk7CisgICAg
QVNTRVJUKHRvdGFsTGVuZ3RoT2ZUZXh0IDwgSU5UX01BWCk7CisKKyAgICByZXR1cm4gc3RkOjpt
aW4oY2FyZXRQb3NpdGlvbiArIHJpZ2h0T2Zmc2V0LCBzdGF0aWNfY2FzdDxpbnQ+KHRvdGFsTGVu
Z3RoT2ZUZXh0KSk7Cit9CisKK2Jvb2wgSW5wdXRIYW5kbGVyOjpkZWxldGVUZXh0UmVsYXRpdmVU
b0N1cnNvcihpbnQgbGVmdE9mZnNldCwgaW50IHJpZ2h0T2Zmc2V0KQoreworICAgIGlmICghaXNB
Y3RpdmVUZXh0RWRpdCgpIHx8IGNvbXBvc2l0aW9uQWN0aXZlKCkpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIFByb2Nlc3NpbmdDaGFuZ2VHdWFyZCBndWFyZCh0aGlzKTsKKworICAgIElu
cHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6
OmRlbGV0ZVRleHRSZWxhdGl2ZVRvQ3Vyc29yIGxlZnQgJWQgcmlnaHQgJWQiLCBsZWZ0T2Zmc2V0
LCByaWdodE9mZnNldCk7CisKKyAgICBpbnQgY2FyZXRPZmZzZXQgPSBjYXJldFBvc2l0aW9uKCk7
CisgICAgaW50IHN0YXJ0ID0gcmVsYXRpdmVMZWZ0T2Zmc2V0KGNhcmV0T2Zmc2V0LCBsZWZ0T2Zm
c2V0KTsKKyAgICBpbnQgZW5kID0gcmVsYXRpdmVSaWdodE9mZnNldChjYXJldE9mZnNldCwgZWxl
bWVudFRleHQoKS5sZW5ndGgoKSwgcmlnaHRPZmZzZXQpOworICAgIGlmICghZGVsZXRlVGV4dChz
dGFydCwgZW5kKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gU2Nyb2xsIHRoZSBm
aWVsZCBpZiBuZWNlc3NhcnkuIFRoZSBhdXRvbWF0aWMgdXBkYXRlIGlzIHN1cHByZXNzZWQKKyAg
ICAvLyBieSB0aGUgcHJvY2Vzc2luZyBjaGFuZ2UgZ3VhcmQuCisgICAgZW5zdXJlRm9jdXNUZXh0
RWxlbWVudFZpc2libGUoRWRnZUlmTmVlZGVkKTsKKworICAgIHJldHVybiB0cnVlOworfQorCiti
b29sIElucHV0SGFuZGxlcjo6ZGVsZXRlVGV4dChpbnQgc3RhcnQsIGludCBlbmQpCit7CisgICAg
aWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFBy
b2Nlc3NpbmdDaGFuZ2VHdWFyZCBndWFyZCh0aGlzKTsKKworICAgIGlmICghc2V0U2VsZWN0aW9u
KHN0YXJ0LCBlbmQsIHRydWUgLypjaGFuZ2VJc1BhcnRPZkNvbXBvc2l0aW9uKi8pKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9n
TGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVyOjpkZWxldGVUZXh0IHN0YXJ0ICVkIGVuZCAlZCIsIHN0
YXJ0LCBlbmQpOworCisgICAgcmV0dXJuIGRlbGV0ZVNlbGVjdGlvbigpOworfQorCitzcGFubmFi
bGVfc3RyaW5nX3QqIElucHV0SGFuZGxlcjo6c3Bhbm5hYmxlVGV4dEluUmFuZ2UoaW50IHN0YXJ0
LCBpbnQgZW5kLCBpbnQzMl90IGZsYWdzKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgp
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzdGFydCA9PSBlbmQpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgQVNTRVJUKGVuZCA+IHN0YXJ0KTsKKyAgICBpbnQgbGVuZ3RoID0gZW5k
IC0gc3RhcnQ7CisKKyAgICBXVEY6OlN0cmluZyB0ZXh0U3RyaW5nID0gZWxlbWVudFRleHQoKS5z
dWJzdHJpbmcoc3RhcnQsIGxlbmd0aCk7CisKKyAgICBzcGFubmFibGVfc3RyaW5nX3QqIHBzdCA9
IChzcGFubmFibGVfc3RyaW5nX3QqKW1hbGxvYyhzaXplb2Yoc3Bhbm5hYmxlX3N0cmluZ190KSk7
CisgICAgaWYgKCFwc3QpIHsKKyAgICAgICAgSW5wdXRMb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkxvZ0xldmVsSW5mbywgIklucHV0SGFuZGxlcjo6c3Bhbm5hYmxlVGV4dEluUmFuZ2UgZXJyb3Ig
YWxsb2NhdGluZyBzcGFubmFibGUgc3RyaW5nLiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9
CisKKyAgICBwc3QtPnN0ciA9ICh3Y2hhcl90KiltYWxsb2Moc2l6ZW9mKHdjaGFyX3QpICogKGxl
bmd0aCArIDEpKTsKKyAgICBpZiAoIXBzdC0+c3RyKSB7CisgICAgICAgIElucHV0TG9nKEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OnNwYW5uYWJsZVRl
eHRJblJhbmdlIENhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cmluZy5cbiIpOworICAgICAg
ICBmcmVlKHBzdCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBzdHJpbmdM
ZW5ndGggPSAwOworICAgIGlmICghY29udmVydFN0cmluZ1RvV2NoYXIodGV4dFN0cmluZywgcHN0
LT5zdHIsIGxlbmd0aCArIDEsICZzdHJpbmdMZW5ndGgpKSB7CisgICAgICAgIGZyZWUocHN0LT5z
dHIpOworICAgICAgICBmcmVlKHBzdCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAg
IHBzdC0+bGVuZ3RoID0gc3RyaW5nTGVuZ3RoOworICAgIHBzdC0+c3BhbnNfY291bnQgPSAwOwor
ICAgIHBzdC0+c3BhbnMgPSAwOworICAgIHJldHVybiBwc3Q7Cit9CisKK3NwYW5uYWJsZV9zdHJp
bmdfdCogSW5wdXRIYW5kbGVyOjpzZWxlY3RlZFRleHQoaW50MzJfdCBmbGFncykKK3sKKyAgICBp
ZiAoIWlzQWN0aXZlVGV4dEVkaXQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4g
c3Bhbm5hYmxlVGV4dEluUmFuZ2Uoc2VsZWN0aW9uU3RhcnQoKSwgc2VsZWN0aW9uRW5kKCksIGZs
YWdzKTsKK30KKworc3Bhbm5hYmxlX3N0cmluZ190KiBJbnB1dEhhbmRsZXI6OnRleHRCZWZvcmVD
dXJzb3IoaW50MzJfdCBsZW5ndGgsIGludDMyX3QgZmxhZ3MpCit7CisgICAgaWYgKCFpc0FjdGl2
ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaW50IGNhcmV0T2Zmc2V0ID0g
Y2FyZXRQb3NpdGlvbigpOworICAgIGludCBzdGFydCA9IHJlbGF0aXZlTGVmdE9mZnNldChjYXJl
dE9mZnNldCwgbGVuZ3RoKTsKKyAgICBpbnQgZW5kID0gY2FyZXRPZmZzZXQ7CisKKyAgICByZXR1
cm4gc3Bhbm5hYmxlVGV4dEluUmFuZ2Uoc3RhcnQsIGVuZCwgZmxhZ3MpOworfQorCitzcGFubmFi
bGVfc3RyaW5nX3QqIElucHV0SGFuZGxlcjo6dGV4dEFmdGVyQ3Vyc29yKGludDMyX3QgbGVuZ3Ro
LCBpbnQzMl90IGZsYWdzKQoreworICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIGludCBjYXJldE9mZnNldCA9IGNhcmV0UG9zaXRpb24oKTsKKyAg
ICBpbnQgc3RhcnQgPSBjYXJldE9mZnNldDsKKyAgICBpbnQgZW5kID0gcmVsYXRpdmVSaWdodE9m
ZnNldChjYXJldE9mZnNldCwgZWxlbWVudFRleHQoKS5sZW5ndGgoKSwgbGVuZ3RoKTsKKworICAg
IHJldHVybiBzcGFubmFibGVUZXh0SW5SYW5nZShzdGFydCwgZW5kLCBmbGFncyk7Cit9CisKK2V4
dHJhY3RlZF90ZXh0X3QqIElucHV0SGFuZGxlcjo6ZXh0cmFjdGVkVGV4dFJlcXVlc3QoZXh0cmFj
dGVkX3RleHRfcmVxdWVzdF90KiByZXF1ZXN0LCBpbnQzMl90IGZsYWdzKQoreworICAgIGlmICgh
aXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGV4dHJhY3RlZF90
ZXh0X3QqIGV4dHJhY3RlZFRleHQgPSAoZXh0cmFjdGVkX3RleHRfdCAqKW1hbGxvYyhzaXplb2Yo
ZXh0cmFjdGVkX3RleHRfdCkpOworCisgICAgLy8gJ2ZsYWdzJyBpbmRpY2F0ZXMgd2hldGhlciB0
aGUgdGV4dCBpcyBiZWluZyBtb25pdG9yZWQuIFRoaXMgaXMgbm90IGN1cnJlbnRseSB1c2VkLgor
CisgICAgLy8gRklYTUUgYWRkIHNtYXJ0IGxpbWl0aW5nIGJhc2VkIG9uIHRoZSBoaW50IHNpemVz
LiBDdXJyZW50bHkgcmV0dXJuIGFsbCB0ZXh0LgorCisgICAgZXh0cmFjdGVkVGV4dC0+dGV4dCA9
IHNwYW5uYWJsZVRleHRJblJhbmdlKDAsIGVsZW1lbnRUZXh0KCkubGVuZ3RoKCksIGZsYWdzKTsK
KworICAgIC8vIEZJWE1FIGNvbmZpcm0gdGhlc2Ugc2hvdWxkIGJlIDAgb24gdGhpcyByZXF1ZXN0
ZWQuIFRleHQgY2hhbmdlcyB3aWxsIGxpa2VseSByZXF1aXJlCisgICAgLy8gdGhlIGVuZCBiZSB0
aGUgbGVuZ3RoLgorICAgIGV4dHJhY3RlZFRleHQtPnBhcnRpYWxfc3RhcnRfb2Zmc2V0ID0gMDsK
KyAgICBleHRyYWN0ZWRUZXh0LT5wYXJ0aWFsX2VuZF9vZmZzZXQgPSAwOworICAgIGV4dHJhY3Rl
ZFRleHQtPnN0YXJ0X29mZnNldCA9IDA7CisKKyAgICAvLyBBZGp1c3Qgc2VsZWN0aW9uIHZhbHVl
cyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2Zmc2V0LCB3aGljaCBtYXkgYmUgYSBzdWJzZXQKKyAg
ICAvLyBvZiB0aGUgdGV4dCBpbiB0aGUgZmllbGQuCisgICAgZXh0cmFjdGVkVGV4dC0+c2VsZWN0
aW9uX3N0YXJ0ID0gc2VsZWN0aW9uU3RhcnQoKSAtIGV4dHJhY3RlZFRleHQtPnN0YXJ0X29mZnNl
dDsKKyAgICBleHRyYWN0ZWRUZXh0LT5zZWxlY3Rpb25fZW5kID0gc2VsZWN0aW9uRW5kKCkgLSBl
eHRyYWN0ZWRUZXh0LT5zdGFydF9vZmZzZXQ7CisKKyAgICAvLyBzZWxlY3Rpb25BY3RpdmUgaXMg
bm90IGxpbWl0ZWQgdG8gaW5zaWRlIHRoZSBleHRyYWN0ZWQgdGV4dC4KKyAgICBib29sIHNlbGVj
dGlvbkFjdGl2ZSA9IGV4dHJhY3RlZFRleHQtPnNlbGVjdGlvbl9zdGFydCAhPSBleHRyYWN0ZWRU
ZXh0LT5zZWxlY3Rpb25fZW5kOworICAgIGJvb2wgc2luZ2xlTGluZSA9IG1fY3VycmVudEZvY3Vz
RWxlbWVudC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmlucHV0VGFnKTsKKworICAgIC8vIEZJWE1F
IGZsYWdzIGhhcyB0d28gdmFsdWVzIGluIGRvYywgZW51bSBub3QgaW4gaGVhZGVyIHlldC4KKyAg
ICBleHRyYWN0ZWRUZXh0LT5mbGFncyA9IHNlbGVjdGlvbkFjdGl2ZSAmIHNpbmdsZUxpbmU7CisK
KyAgICByZXR1cm4gZXh0cmFjdGVkVGV4dDsKK30KKworc3RhdGljIHZvaWQgYWRkQ29tcG9zaXRp
b25UZXh0U3R5bGVUb0F0dHJpYnV0ZVRleHRTdHlsZShBdHRyaWJ1dGVUZXh0U3R5bGUmIHN0eWxl
KQoreworICAgIHN0eWxlLnNldFVuZGVybGluZShBdHRyaWJ1dGVUZXh0U3R5bGU6OlN0YW5kYXJk
VW5kZXJsaW5lKTsKK30KKworc3RhdGljIHZvaWQgYWRkQWN0aXZlVGV4dFN0eWxlVG9BdHRyaWJ1
dGVUZXh0U3R5bGUoQXR0cmlidXRlVGV4dFN0eWxlJiBzdHlsZSkKK3sKKyAgICBzdHlsZS5zZXRC
YWNrZ3JvdW5kQ29sb3IoQ29sb3IoImJsdWUiKSk7CisgICAgc3R5bGUuc2V0VGV4dENvbG9yKENv
bG9yKCJ3aGl0ZSIpKTsKK30KKworc3RhdGljIEF0dHJpYnV0ZVRleHRTdHlsZSBjb21wb3NpdGlv
blRleHRTdHlsZSgpCit7CisgICAgQXR0cmlidXRlVGV4dFN0eWxlIHN0eWxlOworICAgIGFkZENv
bXBvc2l0aW9uVGV4dFN0eWxlVG9BdHRyaWJ1dGVUZXh0U3R5bGUoc3R5bGUpOworICAgIHJldHVy
biBzdHlsZTsKK30KKworc3RhdGljIEF0dHJpYnV0ZVRleHRTdHlsZSB0ZXh0U3R5bGVGcm9tTWFz
ayhpbnQ2NF90IG1hc2spCit7CisgICAgQXR0cmlidXRlVGV4dFN0eWxlIHN0eWxlOworICAgIGlm
IChtYXNrICYgQ09NUE9TRURfVEVYVF9BVFRSSUIpCisgICAgICAgIGFkZENvbXBvc2l0aW9uVGV4
dFN0eWxlVG9BdHRyaWJ1dGVUZXh0U3R5bGUoc3R5bGUpOworCisgICAgaWYgKG1hc2sgJiBBQ1RJ
VkVfUkVHSU9OX0FUVFJJQikKKyAgICAgICAgYWRkQWN0aXZlVGV4dFN0eWxlVG9BdHRyaWJ1dGVU
ZXh0U3R5bGUoc3R5bGUpOworCisgICAgcmV0dXJuIHN0eWxlOworfQorCitib29sIElucHV0SGFu
ZGxlcjo6cmVtb3ZlQ29tcG9zZWRUZXh0KCkKK3sKKyAgICBpZiAoY29tcG9zaXRpb25BY3RpdmUo
KSkgeworICAgICAgICBpZiAoIWRlbGV0ZVRleHQobV9jb21wb3NpbmdUZXh0U3RhcnQsIG1fY29t
cG9zaW5nVGV4dEVuZCkpIHsKKyAgICAgICAgICAgIC8vIENvdWxkIG5vdCByZW1vdmUgdGhlIGV4
aXN0aW5nIGNvbXBvc2l0aW9uIHJlZ2lvbi4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgICAgICByZW1vdmVBdHRyaWJ1dGVkVGV4dE1hcmtlcigpOworICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCitpbnQzMl90IElucHV0SGFuZGxlcjo6c2V0Q29tcG9zaW5n
UmVnaW9uKGludDMyX3Qgc3RhcnQsIGludDMyX3QgZW5kKQoreworICAgIGlmICghaXNBY3RpdmVU
ZXh0RWRpdCgpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIXJlbW92ZUNvbXBvc2Vk
VGV4dCgpKSB7CisgICAgICAgIC8vIENvdWxkIG5vdCByZW1vdmUgdGhlIGV4aXN0aW5nIGNvbXBv
c2l0aW9uIHJlZ2lvbi4KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1fY29tcG9z
aW5nVGV4dFN0YXJ0ID0gc3RhcnQ7CisgICAgbV9jb21wb3NpbmdUZXh0RW5kID0gZW5kOworCisg
ICAgaWYgKGNvbXBvc2l0aW9uQWN0aXZlKCkpCisgICAgICAgIGFkZEF0dHJpYnV0ZWRUZXh0TWFy
a2VyKHN0YXJ0LCBlbmQsIGNvbXBvc2l0aW9uVGV4dFN0eWxlKCkpOworCisgICAgSW5wdXRMb2co
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIklucHV0SGFuZGxlcjo6c2V0Q29t
cG9zaW5nUmVnaW9uIHN0YXJ0ICVkIGVuZCAlZCIsIHN0YXJ0LCBlbmQpOworCisgICAgcmV0dXJu
IDA7Cit9CisKK2ludDMyX3QgSW5wdXRIYW5kbGVyOjpmaW5pc2hDb21wb3NpdGlvbigpCit7Cisg
ICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8v
IEZJWE1FIGlmIG5vIGNvbXBvc2l0aW9uIGlzIGFjdGl2ZSwgc2hvdWxkIHdlIHJldHVybiBmYWls
dXJlIC0xPworICAgIGlmICghY29tcG9zaXRpb25BY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICAvLyBSZW1vdmUgYWxsIG1hcmtlcnMuCisgICAgcmVtb3ZlQXR0cmlidXRlZFRleHRN
YXJrZXIoKTsKKworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbElu
Zm8sICJJbnB1dEhhbmRsZXI6OmZpbmlzaENvbXBvc2l0aW9uIGNvbXBsZXRlZCIpOworCisgICAg
cmV0dXJuIDA7Cit9CisKK3NwYW5fdCogSW5wdXRIYW5kbGVyOjpmaXJzdFNwYW5JblN0cmluZyhz
cGFubmFibGVfc3RyaW5nX3QqIHNwYW5uYWJsZVN0cmluZywgU3Bhbm5hYmxlU3RyaW5nQXR0cmli
dXRlIGF0dHJpYikKK3sKKyAgICBzcGFuX3QqIHNwYW4gPSBzcGFubmFibGVTdHJpbmctPnNwYW5z
OworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc3Bhbm5hYmxlU3RyaW5nLT5zcGFu
c19jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzcGFuLT5hdHRyaWJ1dGVzX21hc2sgJiBhdHRy
aWIpCisgICAgICAgICAgICByZXR1cm4gc3BhbjsKKyAgICAgICAgc3BhbisrOworICAgIH0KKwor
ICAgIHJldHVybiAwOworfQorCitib29sIElucHV0SGFuZGxlcjo6aXNUcmFpbGluZ1NpbmdsZUNo
YXJhY3RlcihzcGFuX3QqIHNwYW4sIHVuc2lnbmVkIHN0cmluZ0xlbmd0aCwgdW5zaWduZWQgY29t
cG9zaW5nVGV4dExlbmd0aCkKK3sKKyAgICAvLyBNYWtlIHN1cmUgdGhlIG5ldyBzdHJpbmcgaXMg
b25lIGNoYXJhY3RlciBsYXJnZXIgdGhhbiB0aGUgb2xkLgorICAgIGlmIChjb21wb3NpbmdUZXh0
TGVuZ3RoICE9IHN0cmluZ0xlbmd0aCAtIDEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGlmICghc3BhbikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSGFzIG9ubHkgMSBj
aGFyYWN0ZXIgY2hhbmdlZD8KKyAgICBpZiAoc3Bhbi0+c3RhcnQgPT0gc3Bhbi0+ZW5kKSB7Cisg
ICAgICAgIC8vIElzIHRoaXMgY2hhcmFjdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3Ry
aW5nPworICAgICAgICBpZiAoc3Bhbi0+c3RhcnQgPT0gc3RyaW5nTGVuZ3RoIC0gMSkKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBSZXR1cm4gYWZ0ZXIgdGhlIGZpcnN0
IGNoYW5nZWRfYXR0cmliIGlzIGZvdW5kLgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJ
bnB1dEhhbmRsZXI6OnNldFRleHQoc3Bhbm5hYmxlX3N0cmluZ190KiBzcGFubmFibGVTdHJpbmcp
Cit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkgfHwgIXNwYW5uYWJsZVN0cmluZykKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKG1fY3VycmVudEZvY3VzRWxlbWVudC0+
ZG9jdW1lbnQoKSAmJiBtX2N1cnJlbnRGb2N1c0VsZW1lbnQtPmRvY3VtZW50KCktPmZyYW1lKCkp
OworICAgIEZyYW1lKiBmcmFtZSA9IG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1lbnQoKS0+
ZnJhbWUoKTsKKworICAgIEVkaXRvciogZWRpdG9yID0gZnJhbWUtPmVkaXRvcigpOworICAgIEFT
U0VSVChlZGl0b3IpOworCisgICAgLy8gRGlzYWJsZSBzZWxlY3Rpb25IYW5kbGVyJ3MgYWN0aXZl
IHNlbGVjdGlvbiBhcyB3ZSB3aWxsIGJlIHJlc2V0dGluZyBhbmQgdGhlc2UKKyAgICAvLyBjaGFu
Z2VzIHNob3VsZCBub3QgYmUgaGFuZGxlZCBhcyBub3RpZmljYXRpb24gZXZlbnQuCisgICAgbV93
ZWJQYWdlLT5tX3NlbGVjdGlvbkhhbmRsZXItPnNldFNlbGVjdGlvbkFjdGl2ZShmYWxzZSk7CisK
KyAgICBTdHJpbmcgdGV4dFRvSW5zZXJ0ID0gY29udmVydFNwYW5uYWJsZVN0cmluZ1RvU3RyaW5n
KHNwYW5uYWJsZVN0cmluZyk7CisgICAgaW50IHRleHRMZW5ndGggPSB0ZXh0VG9JbnNlcnQubGVu
Z3RoKCk7CisKKyAgICBzcGFuX3QqIGNoYW5nZWRTcGFuID0gZmlyc3RTcGFuSW5TdHJpbmcoc3Bh
bm5hYmxlU3RyaW5nLCBDSEFOR0VEX0FUVFJJQik7CisgICAgaW50IGNvbXBvc2luZ1RleHRTdGFy
dCA9IG1fY29tcG9zaW5nVGV4dFN0YXJ0OworICAgIGludCBjb21wb3NpbmdUZXh0RW5kID0gbV9j
b21wb3NpbmdUZXh0RW5kOworICAgIGludCBjb21wb3NpbmdUZXh0TGVuZ3RoID0gY29tcG9zaXRp
b25MZW5ndGgoKTsKKyAgICByZW1vdmVBdHRyaWJ1dGVkVGV4dE1hcmtlcigpOworCisgICAgaWYg
KGlzVHJhaWxpbmdTaW5nbGVDaGFyYWN0ZXIoY2hhbmdlZFNwYW4sIHRleHRMZW5ndGgsIGNvbXBv
c2luZ1RleHRMZW5ndGgpKSB7CisgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0ZXh0
IGlzIGJlaW5nIGNvbXBvc2VkLgorICAgICAgICBpZiAoZmlyc3RTcGFuSW5TdHJpbmcoc3Bhbm5h
YmxlU3RyaW5nLCBDT01QT1NFRF9URVhUX0FUVFJJQikpCisgICAgICAgICAgICByZXR1cm4gZWRp
dG9yLT5jb21tYW5kKCJJbnNlcnRUZXh0IikuZXhlY3V0ZSh0ZXh0VG9JbnNlcnQucmlnaHQoMSkp
OworICAgICAgICByZXR1cm4gaGFuZGxlS2V5Ym9hcmRJbnB1dChCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6S2V5Ym9hcmRFdmVudCh0ZXh0VG9JbnNlcnRbdGV4dExlbmd0aCAtIDFdLCBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudDo6S2V5Q2hhciwgMCksIGZhbHNlIC8qIGNoYW5nZUlz
UGFydE9mQ29tcG9zaXRpb24gKi8pOworICAgIH0KKworICAgIC8vIElmIG5vIHNwYW5zIGhhdmUg
Y2hhbmdlZCwgdHJlYXQgaXQgYXMgYSBkZWxldGUgb3BlcmF0aW9uLgorICAgIGlmICghY2hhbmdl
ZFNwYW4pIHsKKyAgICAgICAgLy8gSWYgdGhlIGNvbXBvc2l0aW9uIGxlbmd0aCBpcyB0aGUgc2Ft
ZSBhcyBvdXIgc3RyaW5nIGxlbmd0aCwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5n
LgorICAgICAgICBpZiAoY29tcG9zaW5nVGV4dExlbmd0aCA9PSB0ZXh0TGVuZ3RoKQorICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKGNvbXBvc2luZ1RleHRMZW5ndGggLSB0
ZXh0TGVuZ3RoID09IDEpCisgICAgICAgICAgICByZXR1cm4gZWRpdG9yLT5jb21tYW5kKCJEZWxl
dGVCYWNrd2FyZCIpLmV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICBpZiAoY29tcG9zaW5nVGV4dExl
bmd0aCAmJiAhc2V0U2VsZWN0aW9uKGNvbXBvc2luZ1RleHRTdGFydCwgY29tcG9zaW5nVGV4dEVu
ZCwgdHJ1ZSAvKiBjaGFuZ2VJc1BhcnRPZkNvbXBvc2l0aW9uICovKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gSWYgdGhlcmUgaXMgbm8gdGV4dCB0byBhZGQganVzdCBkZWxldGUu
CisgICAgaWYgKCF0ZXh0TGVuZ3RoKSB7CisgICAgICAgIGlmIChzZWxlY3Rpb25BY3RpdmUoKSkK
KyAgICAgICAgICAgIHJldHVybiBlZGl0b3ItPmNvbW1hbmQoIkRlbGV0ZUJhY2t3YXJkIikuZXhl
Y3V0ZSgpOworCisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8uCisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbElu
Zm8sICJzZXRUZXh0IHNwYW5uYWJsZVN0cmluZyBpcyAlcywgJWQgXG4iLCB0ZXh0VG9JbnNlcnQu
bGF0aW4xKCkuZGF0YSgpLCB0ZXh0TGVuZ3RoKTsKKworICAgIC8vIFRyaWdnZXJpbmcgYW4gaW5z
ZXJ0IG9mIHRoZSB0ZXh0IHdpdGggYSBzcGFjZSBjaGFyYWN0ZXIgdHJhaWxpbmcKKyAgICAvLyBj
YXVzZXMgbmV3IHRleHQgdG8gYWRvcHQgdGhlIHByZXZpb3VzIHRleHQgc3R5bGUuCisgICAgLy8g
UmVtb3ZlIGl0IGFuZCBhcHBseSBpdCBhcyBhIGtleXByZXNzIGxhdGVyLgorICAgIC8vIFVwc3Ry
ZWFtIFdlYmtpdCBidWcgY3JlYXRlZCBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NzA4MjMKKyAgICBib29sIHJlcXVpcmVzU3BhY2VLZXlQcmVzcyA9IGZhbHNlOworICAg
IGlmICh0ZXh0TGVuZ3RoID4gMCAmJiB0ZXh0VG9JbnNlcnRbdGV4dExlbmd0aCAtIDFdID09IDMy
IC8qIHNwYWNlICovKSB7CisgICAgICAgIHJlcXVpcmVzU3BhY2VLZXlQcmVzcyA9IHRydWU7Cisg
ICAgICAgIHRleHRMZW5ndGgtLTsKKyAgICAgICAgdGV4dFRvSW5zZXJ0LnJlbW92ZSh0ZXh0TGVu
Z3RoLCAxKTsKKyAgICB9CisKKyAgICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9n
TGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVyOjpzZXRUZXh0IFJlcXVlc3QgYmVpbmcgcHJvY2Vzc2Vk
IFRleHQgYmVmb3JlICVzIiwgZWxlbWVudFRleHQoKS5sYXRpbjEoKS5kYXRhKCkpOworCisgICAg
aWYgKHRleHRMZW5ndGggPT0gMSAmJiAhc3Bhbm5hYmxlU3RyaW5nLT5zcGFuc19jb3VudCkgewor
ICAgICAgICAvLyBIYW5kbGUgc2luZ2xlIGtleSBub24tYXR0cmlidXRlZCBlbnRyeSBhcyBrZXkg
cHJlc3MgcmF0aGVyIHRoYW4gaW5zZXJ0IHRvIGFsbG93CisgICAgICAgIC8vIHRyaWdnZXJpbmcg
b2YgamF2YXNjcmlwdCBldmVudHMuCisKKyAgICAgICAgcmV0dXJuIGhhbmRsZUtleWJvYXJkSW5w
dXQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OktleWJvYXJkRXZlbnQodGV4dFRvSW5zZXJ0WzBdLCBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudDo6S2V5Q2hhciwgMCksIHRydWUgLyog
Y2hhbmdlSXNQYXJ0T2ZDb21wb3NpdGlvbiAqLyk7CisgICAgfQorCisgICAgLy8gUGVyZm9ybSB0
aGUgdGV4dCBjaGFuZ2UgYXMgYSBzaW5nbGUgY29tbWFuZCBpZiB0aGVyZSBpcyBvbmUuCisgICAg
aWYgKCF0ZXh0VG9JbnNlcnQuaXNFbXB0eSgpICYmICFlZGl0b3ItPmNvbW1hbmQoIkluc2VydFRl
eHQiKS5leGVjdXRlKHRleHRUb0luc2VydCkpIHsKKyAgICAgICAgSW5wdXRMb2coQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkxvZ0xldmVsV2FybiwgIklucHV0SGFuZGxlcjo6c2V0VGV4dCBGYWlsZWQg
dG8gaW5zZXJ0IHRleHQgJXMiLCB0ZXh0VG9JbnNlcnQubGF0aW4xKCkuZGF0YSgpKTsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpMb2dMZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OnNldFRleHQgUmVxdWVzdCBiZWluZyBw
cm9jZXNzZWQgVGV4dCBhZnRlciBpbnNlcnQgJXMiLCBlbGVtZW50VGV4dCgpLmxhdGluMSgpLmRh
dGEoKSk7CisKKyAgICBpZiAocmVxdWlyZXNTcGFjZUtleVByZXNzKQorICAgICAgICBoYW5kbGVL
ZXlib2FyZElucHV0KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpLZXlib2FyZEV2ZW50KDMyIC8qIHNw
YWNlICovLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudDo6S2V5Q2hhciwgMCks
IHRydWUgLyogY2hhbmdlSXNQYXJ0T2ZDb21wb3NpdGlvbiAqLyk7CisKKyAgICBJbnB1dExvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVyOjpzZXRUZXh0
IFRleHQgYWZ0ZXIgJXMiLCBlbGVtZW50VGV4dCgpLmxhdGluMSgpLmRhdGEoKSk7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJbnB1dEhhbmRsZXI6OnNldFRleHRBdHRyaWJ1dGVzKGlu
dCBpbnNlcnRpb25Qb2ludCwgc3Bhbm5hYmxlX3N0cmluZ190KiBzcGFubmFibGVTdHJpbmcpCit7
CisgICAgLy8gQXBwbHkgdGhlIGF0dHJpYnV0ZXMgdG8gdGhlIGZpZWxkLgorICAgIHNwYW5fdCog
c3BhbiA9IHNwYW5uYWJsZVN0cmluZy0+c3BhbnM7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9
IDA7IGkgPCBzcGFubmFibGVTdHJpbmctPnNwYW5zX2NvdW50OyBpKyspIHsKKyAgICAgICAgdW5z
aWduZWQgaW50IHN0YXJ0UG9zaXRpb24gPSBpbnNlcnRpb25Qb2ludCArIHNwYW4tPnN0YXJ0Owor
ICAgICAgICAvLyBUaGUgZW5kIHBvaW50IGluY2x1ZGVzIHRoZSBjaGFyYWN0ZXIgdGhhdCBpdCBp
cyBiZWZvcmUuIEllLCAwLCAwCisgICAgICAgIC8vIGFwcGxpZXMgdG8gdGhlIGZpcnN0IGNoYXJh
Y3RlciBhcyB0aGUgZW5kIHBvaW50IGluY2x1ZGVzIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAgLy8g
YXQgdGhlIHBvc2l0aW9uLiBUaGlzIG1lYW5zIHRoZSBlbmRQb3NpdGlvbiBpcyBhbHdheXMgKzEu
CisgICAgICAgIHVuc2lnbmVkIGludCBlbmRQb3NpdGlvbiA9IGluc2VydGlvblBvaW50ICsgc3Bh
bi0+ZW5kICsgMTsKKyAgICAgICAgaWYgKGVuZFBvc2l0aW9uIDwgc3RhcnRQb3NpdGlvbiB8fCBl
bmRQb3NpdGlvbiA+IGVsZW1lbnRUZXh0KCkubGVuZ3RoKCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgaWYgKCFzcGFuLT5hdHRyaWJ1dGVzX21hc2spCisgICAgICAgICAg
ICBjb250aW51ZTsgLy8gTm90aGluZyB0byBkby4KKworICAgICAgICAvLyBNSVNTUEVMTEVEX1dP
UkRfQVRUUklCIGlzIHByZXNlbnQgYXMgYW4gb3B0aW9uLCBidXQgaXQgaXMgbm90IGN1cnJlbnRs
eQorICAgICAgICAvLyB1c2VkIGJ5IElNRi4gV2hlbiB0aGV5IGFkZCBzdXBwb3J0IGZvciBvbiB0
aGUgZmx5IHNwZWxsIGNoZWNraW5nIHdlIGNhbgorICAgICAgICAvLyB1c2UgaXQgdG8gYXBwbHkg
c3BlbGxpbmcgbWFya2VycyBhbmQgZGlzYWJsZSBjb250aW51b3VzIHNwZWxsIGNoZWNraW5nLgor
CisgICAgICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJ
bnB1dEhhbmRsZXI6OnNldFRleHRBdHRyaWJ1dGVzIGFkZGluZyBtYXJrZXIgJWQgdG8gJWQgLSAl
ZCIsIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uLCBzcGFuLT5hdHRyaWJ1dGVzX21hc2spOwor
ICAgICAgICBhZGRBdHRyaWJ1dGVkVGV4dE1hcmtlcihzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlv
biwgdGV4dFN0eWxlRnJvbU1hc2soc3Bhbi0+YXR0cmlidXRlc19tYXNrKSk7CisKKyAgICAgICAg
c3BhbisrOworICAgIH0KKworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dM
ZXZlbEluZm8sICJJbnB1dEhhbmRsZXI6OnNldFRleHRBdHRyaWJ1dGVzIGF0dHJpYnV0ZSBjb3Vu
dCAlZCIsIHNwYW5uYWJsZVN0cmluZy0+c3BhbnNfY291bnQpOworCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Jvb2wgSW5wdXRIYW5kbGVyOjpzZXRSZWxhdGl2ZUN1cnNvclBvc2l0aW9uKGludCBp
bnNlcnRpb25Qb2ludCwgaW50IHJlbGF0aXZlQ3Vyc29yUG9zaXRpb24pCit7CisgICAgaWYgKCFp
c0FjdGl2ZVRleHRFZGl0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIDEgcGxh
Y2UgY3Vyc29yIGF0IGVuZCBvZiBpbnNlcnRpb24gdGV4dC4KKyAgICBpZiAocmVsYXRpdmVDdXJz
b3JQb3NpdGlvbiA9PSAxKSB7CisgICAgICAgIG1fY3VycmVudEZvY3VzRWxlbWVudC0+ZG9jdW1l
bnQoKS0+ZnJhbWUoKS0+c2VsZWN0aW9uKCktPnJldmVhbFNlbGVjdGlvbihTY3JvbGxBbGlnbm1l
bnQ6OmFsaWduVG9FZGdlSWZOZWVkZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisK
KyAgICBpbnQgY3Vyc29yUG9zaXRpb24gPSAwOworICAgIGlmIChyZWxhdGl2ZUN1cnNvclBvc2l0
aW9uIDw9IDApIHsKKyAgICAgICAgLy8gWmVybyA9IGluc2VydGlvblBvaW50CisgICAgICAgIC8v
IE5lZ2F0aXZlIHZhbHVlLCBtb3ZlIHRoZSBjdXJzb3IgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2Yg
Y2hhcmFjdGVycyBiZWZvcmUKKyAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBpbnNlcnRlZCB0
ZXh0LgorICAgICAgICBjdXJzb3JQb3NpdGlvbiA9IGluc2VydGlvblBvaW50ICsgcmVsYXRpdmVD
dXJzb3JQb3NpdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBQb3NpdGl2ZSB2YWx1ZSwg
bW92ZSB0aGUgY3Vyc29yIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWZ0ZXIK
KyAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgaW5zZXJ0ZWQgdGV4dCBtaW51cyAxLgorICAgICAg
ICBjdXJzb3JQb3NpdGlvbiA9IGNhcmV0UG9zaXRpb24oKSArIHJlbGF0aXZlQ3Vyc29yUG9zaXRp
b24gLSAxOworICAgIH0KKworICAgIGlmIChjdXJzb3JQb3NpdGlvbiA8IDAgfHwgY3Vyc29yUG9z
aXRpb24gPiAoaW50KWVsZW1lbnRUZXh0KCkubGVuZ3RoKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIElucHV0TG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJJ
bnB1dEhhbmRsZXI6OnNldFJlbGF0aXZlQ3Vyc29yUG9zaXRpb24gY3Vyc29yIHBvc2l0aW9uICVk
IiwgY3Vyc29yUG9zaXRpb24pOworCisgICAgcmV0dXJuIHNldEN1cnNvclBvc2l0aW9uKGN1cnNv
clBvc2l0aW9uKTsKK30KKworYm9vbCBJbnB1dEhhbmRsZXI6OnNldFNwYW5uYWJsZVRleHRBbmRS
ZWxhdGl2ZUN1cnNvcihzcGFubmFibGVfc3RyaW5nX3QqIHNwYW5uYWJsZVN0cmluZywgaW50IHJl
bGF0aXZlQ3Vyc29yUG9zaXRpb24sIGJvb2wgbWFya1RleHRBc0NvbXBvc2luZykKK3sKKyAgICBJ
bnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiSW5wdXRIYW5kbGVy
OjpzZXRTcGFubmFibGVUZXh0QW5kUmVsYXRpdmVDdXJzb3IoJWQsICVkLCAlZClcbiIsIHNwYW5u
YWJsZVN0cmluZy0+bGVuZ3RoLCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uLCBtYXJrVGV4dEFzQ29t
cG9zaW5nKTsKKyAgICBpbnQgaW5zZXJ0aW9uUG9pbnQgPSBjb21wb3NpdGlvbkFjdGl2ZSgpID8g
bV9jb21wb3NpbmdUZXh0U3RhcnQgOiBzZWxlY3Rpb25TdGFydCgpOworCisgICAgUHJvY2Vzc2lu
Z0NoYW5nZUd1YXJkIGd1YXJkKHRoaXMpOworCisgICAgaWYgKCFzZXRUZXh0KHNwYW5uYWJsZVN0
cmluZykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghc2V0VGV4dEF0dHJpYnV0
ZXMoaW5zZXJ0aW9uUG9pbnQsIHNwYW5uYWJsZVN0cmluZykpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmICghc2V0UmVsYXRpdmVDdXJzb3JQb3NpdGlvbihpbnNlcnRpb25Qb2ludCwg
cmVsYXRpdmVDdXJzb3JQb3NpdGlvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
IChtYXJrVGV4dEFzQ29tcG9zaW5nKSB7CisgICAgICAgIG1fY29tcG9zaW5nVGV4dFN0YXJ0ID0g
aW5zZXJ0aW9uUG9pbnQ7CisgICAgICAgIG1fY29tcG9zaW5nVGV4dEVuZCA9IGluc2VydGlvblBv
aW50ICsgc3Bhbm5hYmxlU3RyaW5nLT5sZW5ndGg7CisgICAgfQorCisgICAgLy8gU2Nyb2xsIHRo
ZSBmaWVsZCBpZiBuZWNlc3NhcnkuIFRoZSBhdXRvbWF0aWMgdXBkYXRlIGlzIHN1cHByZXNzZWQK
KyAgICAvLyBieSB0aGUgcHJvY2Vzc2luZyBjaGFuZ2UgZ3VhcmQuCisgICAgZW5zdXJlRm9jdXNU
ZXh0RWxlbWVudFZpc2libGUoRWRnZUlmTmVlZGVkKTsKKworICAgIHJldHVybiB0cnVlOworfQor
CitpbnQzMl90IElucHV0SGFuZGxlcjo6c2V0Q29tcG9zaW5nVGV4dChzcGFubmFibGVfc3RyaW5n
X3QqIHNwYW5uYWJsZVN0cmluZywgaW50MzJfdCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKQorewor
ICAgIGlmICghaXNBY3RpdmVUZXh0RWRpdCgpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBp
ZiAoIXNwYW5uYWJsZVN0cmluZykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgSW5wdXRMb2co
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIklucHV0SGFuZGxlcjo6c2V0Q29t
cG9zaW5nVGV4dCBhdCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uOiAlZCIsIHJlbGF0aXZlQ3Vyc29y
UG9zaXRpb24pOworCisgICAgcmV0dXJuIHNldFNwYW5uYWJsZVRleHRBbmRSZWxhdGl2ZUN1cnNv
cihzcGFubmFibGVTdHJpbmcsIHJlbGF0aXZlQ3Vyc29yUG9zaXRpb24sIHRydWUgLyogbWFya1Rl
eHRBc0NvbXBvc2luZyAqLykgPyAwIDogLTE7Cit9CisKK2ludDMyX3QgSW5wdXRIYW5kbGVyOjpj
b21taXRUZXh0KHNwYW5uYWJsZV9zdHJpbmdfdCogc3Bhbm5hYmxlU3RyaW5nLCBpbnQzMl90IHJl
bGF0aXZlQ3Vyc29yUG9zaXRpb24pCit7CisgICAgaWYgKCFpc0FjdGl2ZVRleHRFZGl0KCkpCisg
ICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICghc3Bhbm5hYmxlU3RyaW5nKQorICAgICAgICBy
ZXR1cm4gLTE7CisKKyAgICBJbnB1dExvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxJ
bmZvLCAiSW5wdXRIYW5kbGVyOjpjb21taXRUZXh0Iik7CisKKyAgICByZXR1cm4gc2V0U3Bhbm5h
YmxlVGV4dEFuZFJlbGF0aXZlQ3Vyc29yKHNwYW5uYWJsZVN0cmluZywgcmVsYXRpdmVDdXJzb3JQ
b3NpdGlvbiwgZmFsc2UgLyogbWFya1RleHRBc0NvbXBvc2luZyAqLykgPyAwIDogLTE7Cit9CisK
K30KK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0
L0lucHV0SGFuZGxlci5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQv
SW5wdXRIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYmE3ZWIzZTdiMTY2N2RlNGQ4OWRkNTYyMGRjODZl
MDU2MTViNzk4OAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9X
ZWJLaXRTdXBwb3J0L0lucHV0SGFuZGxlci5oCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhl
IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYg
SW5wdXRIYW5kbGVyX2gKKyNkZWZpbmUgSW5wdXRIYW5kbGVyX2gKKworI2luY2x1ZGUgPEJsYWNr
QmVycnlQbGF0Zm9ybUlucHV0RXZlbnRzLmg+CisKKyNpbmNsdWRlIDxpbWYvaW5wdXRfZGF0YS5o
PgorCisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgV1RGIHsKK2NsYXNzIFN0
cmluZzsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgQXR0cmlidXRlVGV4dFN0eWxl
OworY2xhc3MgRWxlbWVudDsKK2NsYXNzIEZyYW1lOworY2xhc3MgSFRNTElucHV0RWxlbWVudDsK
K2NsYXNzIEhUTUxTZWxlY3RFbGVtZW50OworY2xhc3MgSW50UmVjdDsKK2NsYXNzIE5vZGU7Cit9
CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKKworbmFtZXNwYWNlIFBsYXRmb3JtIHsKK2NsYXNz
IEtleWJvYXJkRXZlbnQ7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJQYWdl
UHJpdmF0ZTsKKworY2xhc3MgSW5wdXRIYW5kbGVyIHsKK3B1YmxpYzoKKyAgICBJbnB1dEhhbmRs
ZXIoV2ViUGFnZVByaXZhdGUqKTsKKyAgICB+SW5wdXRIYW5kbGVyKCk7CisKKyAgICBlbnVtIEZv
Y3VzRWxlbWVudFR5cGUgeyBUZXh0RWRpdCwgVGV4dFBvcHVwIC8qIERhdGUvVGltZSAmIENvbG9y
ICovLCBTZWxlY3RQb3B1cCwgUGx1Z2luIH07CisgICAgZW51bSBDYXJldFNjcm9sbFR5cGUgeyBD
ZW50ZXJBbHdheXMsIENlbnRlcklmTmVlZGVkLCBFZGdlSWZOZWVkZWQgfTsKKworICAgIHZvaWQg
bm9kZUZvY3VzZWQoV2ViQ29yZTo6Tm9kZSopOworICAgIHZvaWQgbm9kZVRleHRDaGFuZ2VkKGNv
bnN0IFdlYkNvcmU6Ok5vZGUqKTsKKyAgICB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKTsKKyAgICB2
b2lkIGZyYW1lVW5sb2FkZWQoV2ViQ29yZTo6RnJhbWUqKTsKKworICAgIGJvb2wgaGFuZGxlS2V5
Ym9hcmRJbnB1dChjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudCYsIGJv
b2wgY2hhbmdlSXNQYXJ0T2ZDb21wb3NpdGlvbiA9IGZhbHNlKTsKKyAgICBib29sIGhhbmRsZU5h
dmlnYXRpb25Nb3ZlKGNvbnN0IHVuc2lnbmVkIHNob3J0IGNoYXJhY3RlciwgYm9vbCBzaGlmdERv
d24sIGJvb2wgYWx0RG93biwgYm9vbCBjYW5FeGl0RmllbGQgPSB0cnVlKTsKKworICAgIGJvb2wg
ZGVsZXRlU2VsZWN0aW9uKCk7CisgICAgdm9pZCBpbnNlcnRUZXh0KGNvbnN0IFdURjo6U3RyaW5n
Jik7CisgICAgdm9pZCBjbGVhckZpZWxkKCk7CisKKyAgICB2b2lkIGN1dCgpOworICAgIHZvaWQg
Y29weSgpOworICAgIHZvaWQgcGFzdGUoKTsKKworICAgIHZvaWQgY2FuY2VsU2VsZWN0aW9uKCk7
CisKKyAgICB2b2lkIHNldElucHV0VmFsdWUoY29uc3QgV1RGOjpTdHJpbmcmKTsKKworICAgIGJv
b2wgaXNJbnB1dE1vZGUoKSBjb25zdCB7IHJldHVybiBpc0FjdGl2ZVRleHRFZGl0KCk7IH0KKyAg
ICBib29sIGlzTXVsdGlsaW5lSW5wdXRNb2RlKCkgY29uc3QgeyByZXR1cm4gaXNBY3RpdmVUZXh0
RWRpdCgpICYmIGVsZW1lbnRUeXBlKG1fY3VycmVudEZvY3VzRWxlbWVudC5nZXQoKSkgPT0gQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OklucHV0VHlwZVRleHRBcmVhOyB9CisKKyAgICB2b2lkIHNldE5h
dmlnYXRpb25Nb2RlKGJvb2wgYWN0aXZlLCBib29sIHNlbmRNZXNzYWdlID0gdHJ1ZSk7CisKKyAg
ICB2b2lkIGVuc3VyZUZvY3VzRWxlbWVudFZpc2libGUoYm9vbCBjZW50ZXJGaWVsZEluRGlzcGxh
eSA9IHRydWUpOworICAgIHZvaWQgaGFuZGxlSW5wdXRMb2NhbGVDaGFuZ2VkKGJvb2wgaXNSVEwp
OworCisgICAgLy8gUG9wdXBNZW51IG1ldGhvZHMuCisgICAgYm9vbCB3aWxsT3BlblBvcHVwRm9y
Tm9kZShXZWJDb3JlOjpOb2RlKik7CisgICAgYm9vbCBkaWROb2RlT3BlblBvcHVwKFdlYkNvcmU6
Ok5vZGUqKTsKKyAgICBib29sIG9wZW5MaW5lSW5wdXRQb3B1cChXZWJDb3JlOjpIVE1MSW5wdXRF
bGVtZW50Kik7CisgICAgYm9vbCBvcGVuU2VsZWN0UG9wdXAoV2ViQ29yZTo6SFRNTFNlbGVjdEVs
ZW1lbnQqKTsKKyAgICB2b2lkIHNldFBvcHVwTGlzdEluZGV4KGludCk7CisgICAgdm9pZCBzZXRQ
b3B1cExpc3RJbmRleGVzKGludCBzaXplLCBib29sKiBzZWxlY3RlZHMpOworCisgICAgYm9vbCBw
cm9jZXNzaW5nQ2hhbmdlKCkgY29uc3QgeyByZXR1cm4gbV9wcm9jZXNzaW5nQ2hhbmdlOyB9Cisg
ICAgdm9pZCBzZXRQcm9jZXNzaW5nQ2hhbmdlKGJvb2wgcHJvY2Vzc2luZ0NoYW5nZSkgeyBtX3By
b2Nlc3NpbmdDaGFuZ2UgPSBwcm9jZXNzaW5nQ2hhbmdlOyB9CisKKyAgICBXVEY6OlN0cmluZyBl
bGVtZW50VGV4dCgpOworCisgICAgLy8gSU1GIGRyaXZlbiBjYWxscy4KKyAgICBib29sIHNldEJh
dGNoRWRpdGluZ0FjdGl2ZShib29sKTsKKyAgICBib29sIHNldFNlbGVjdGlvbihpbnQgc3RhcnQs
IGludCBlbmQsIGJvb2wgY2hhbmdlSXNQYXJ0T2ZDb21wb3NpdGlvbiA9IGZhbHNlKTsKKyAgICBp
bnQgY2FyZXRQb3NpdGlvbigpIGNvbnN0OworICAgIGJvb2wgZGVsZXRlVGV4dFJlbGF0aXZlVG9D
dXJzb3IoaW50IGxlZnRPZmZzZXQsIGludCByaWdodE9mZnNldCk7CisKKyAgICBzcGFubmFibGVf
c3RyaW5nX3QqIHNlbGVjdGVkVGV4dChpbnQzMl90IGZsYWdzKTsKKyAgICBzcGFubmFibGVfc3Ry
aW5nX3QqIHRleHRCZWZvcmVDdXJzb3IoaW50MzJfdCBsZW5ndGgsIGludDMyX3QgZmxhZ3MpOwor
ICAgIHNwYW5uYWJsZV9zdHJpbmdfdCogdGV4dEFmdGVyQ3Vyc29yKGludDMyX3QgbGVuZ3RoLCBp
bnQzMl90IGZsYWdzKTsKKyAgICBleHRyYWN0ZWRfdGV4dF90KiBleHRyYWN0ZWRUZXh0UmVxdWVz
dChleHRyYWN0ZWRfdGV4dF9yZXF1ZXN0X3QqLCBpbnQzMl90IGZsYWdzKTsKKworICAgIGludDMy
X3Qgc2V0Q29tcG9zaW5nUmVnaW9uKGludDMyX3Qgc3RhcnQsIGludDMyX3QgZW5kKTsKKyAgICBp
bnQzMl90IGZpbmlzaENvbXBvc2l0aW9uKCk7CisgICAgaW50MzJfdCBzZXRDb21wb3NpbmdUZXh0
KHNwYW5uYWJsZV9zdHJpbmdfdCosIGludDMyX3QgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbik7Cisg
ICAgaW50MzJfdCBjb21taXRUZXh0KHNwYW5uYWJsZV9zdHJpbmdfdCosIGludDMyX3QgcmVsYXRp
dmVDdXJzb3JQb3NpdGlvbik7CisKKyAgICBib29sIHNob3VsZEFjY2VwdElucHV0Rm9jdXMoKTsK
KworcHJpdmF0ZToKKyAgICB2b2lkIHNldEVsZW1lbnRGb2N1c2VkKFdlYkNvcmU6OkVsZW1lbnQq
KTsKKyAgICB2b2lkIHNldFBsdWdpbkZvY3VzZWQoV2ViQ29yZTo6RWxlbWVudCopOworICAgIHZv
aWQgc2V0RWxlbWVudFVuZm9jdXNlZChib29sIHJlZm9jdXNPY2N1cmluZyA9IGZhbHNlKTsKKwor
ICAgIHZvaWQgZW5zdXJlRm9jdXNUZXh0RWxlbWVudFZpc2libGUoQ2FyZXRTY3JvbGxUeXBlID0g
Q2VudGVyQWx3YXlzKTsKKyAgICB2b2lkIGVuc3VyZUZvY3VzUGx1Z2luRWxlbWVudFZpc2libGUo
KTsKKworICAgIHZvaWQgY2xlYXJDdXJyZW50Rm9jdXNFbGVtZW50KCk7CisKKyAgICBib29sIHNl
bGVjdGlvbkF0U3RhcnRPZkVsZW1lbnQoKTsKKyAgICBib29sIHNlbGVjdGlvbkF0RW5kT2ZFbGVt
ZW50KCk7CisKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHJlY3RGb3JDYXJldChpbnQgaW5kZXgpOwor
CisgICAgYm9vbCBpc0FjdGl2ZVRleHRFZGl0KCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50Rm9j
dXNFbGVtZW50ICYmIG1fY3VycmVudEZvY3VzRWxlbWVudFR5cGUgPT0gVGV4dEVkaXQ7IH0KKyAg
ICBib29sIGlzQWN0aXZlVGV4dFBvcHVwKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50Rm9jdXNF
bGVtZW50ICYmIG1fY3VycmVudEZvY3VzRWxlbWVudFR5cGUgPT0gVGV4dFBvcHVwOyB9CisgICAg
Ym9vbCBpc0FjdGl2ZVNlbGVjdFBvcHVwKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50Rm9jdXNF
bGVtZW50ICYmIG1fY3VycmVudEZvY3VzRWxlbWVudFR5cGUgPT0gU2VsZWN0UG9wdXA7IH0KKyAg
ICBib29sIGlzQWN0aXZlUGx1Z2luKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50Rm9jdXNFbGVt
ZW50ICYmIG1fY3VycmVudEZvY3VzRWxlbWVudFR5cGUgPT0gUGx1Z2luOyB9CisKKyAgICBib29s
IG9wZW5EYXRlUG9wdXAoV2ViQ29yZTo6SFRNTElucHV0RWxlbWVudCosIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpCbGFja0JlcnJ5SW5wdXRUeXBlKTsKKyAgICBib29sIG9wZW5Db2xvclBvcHVwKFdl
YkNvcmU6OkhUTUxJbnB1dEVsZW1lbnQqKTsKKworICAgIGJvb2wgZXhlY3V0ZVRleHRFZGl0Q29t
bWFuZChjb25zdCBXVEY6OlN0cmluZyYpOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkJs
YWNrQmVycnlJbnB1dFR5cGUgZWxlbWVudFR5cGUoV2ViQ29yZTo6RWxlbWVudCopIGNvbnN0Owor
CisgICAgaW50IHNlbGVjdGlvblN0YXJ0KCkgY29uc3Q7CisgICAgaW50IHNlbGVjdGlvbkVuZCgp
IGNvbnN0OworICAgIGludCBzZWxlY3Rpb25Qb3NpdGlvbihib29sIHN0YXJ0KSBjb25zdDsKKyAg
ICBib29sIHNlbGVjdGlvbkFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIHNlbGVjdGlvblN0YXJ0KCkg
IT0gc2VsZWN0aW9uRW5kKCk7IH0KKworICAgIGJvb2wgY29tcG9zaXRpb25BY3RpdmUoKSBjb25z
dCB7IHJldHVybiBjb21wb3NpdGlvbkxlbmd0aCgpOyB9CisgICAgdW5zaWduZWQgY29tcG9zaXRp
b25MZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2NvbXBvc2luZ1RleHRFbmQgLSBtX2NvbXBvc2lu
Z1RleHRTdGFydDsgfQorCisgICAgc3Bhbm5hYmxlX3N0cmluZ190KiBzcGFubmFibGVUZXh0SW5S
YW5nZShpbnQgc3RhcnQsIGludCBlbmQsIGludDMyX3QgZmxhZ3MpOworCisgICAgdm9pZCBhZGRB
dHRyaWJ1dGVkVGV4dE1hcmtlcihpbnQgc3RhcnQsIGludCBlbmQsIGNvbnN0IFdlYkNvcmU6OkF0
dHJpYnV0ZVRleHRTdHlsZSYpOworICAgIHZvaWQgcmVtb3ZlQXR0cmlidXRlZFRleHRNYXJrZXIo
KTsKKworICAgIGJvb2wgZGVsZXRlVGV4dChpbnQgc3RhcnQsIGludCBlbmQpOworICAgIGJvb2wg
c2V0VGV4dEF0dHJpYnV0ZXMoaW50IGluc2VydGlvblBvaW50LCBzcGFubmFibGVfc3RyaW5nX3Qq
KTsKKyAgICBib29sIHNldFRleHQoc3Bhbm5hYmxlX3N0cmluZ190Kik7CisgICAgYm9vbCBzZXRT
cGFubmFibGVUZXh0QW5kUmVsYXRpdmVDdXJzb3Ioc3Bhbm5hYmxlX3N0cmluZ190KiwgaW50IHJl
bGF0aXZlQ3Vyc29yUG9zaXRpb24sIGJvb2wgbWFya1RleHRBc0NvbXBvc2luZyk7CisgICAgYm9v
bCByZW1vdmVDb21wb3NlZFRleHQoKTsKKyAgICBib29sIHNldFJlbGF0aXZlQ3Vyc29yUG9zaXRp
b24oaW50IGluc2VydGlvblBvaW50LCBpbnQgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbik7CisgICAg
Ym9vbCBzZXRDdXJzb3JQb3NpdGlvbihpbnQgbG9jYXRpb24pOworCisgICAgc3Bhbl90KiBmaXJz
dFNwYW5JblN0cmluZyhzcGFubmFibGVfc3RyaW5nX3QqLCBTcGFubmFibGVTdHJpbmdBdHRyaWJ1
dGUpOworICAgIGJvb2wgaXNUcmFpbGluZ1NpbmdsZUNoYXJhY3RlcihzcGFuX3QqLCB1bnNpZ25l
ZCwgdW5zaWduZWQpOworCisgICAgdm9pZCBsZWFyblRleHQoKTsKKyAgICB2b2lkIHNlbmRMZWFy
blRleHREZXRhaWxzKGNvbnN0IFdURjo6U3RyaW5nJik7CisKKyAgICBXZWJQYWdlUHJpdmF0ZSog
bV93ZWJQYWdlOworCisgICAgUmVmUHRyPFdlYkNvcmU6OkVsZW1lbnQ+IG1fY3VycmVudEZvY3Vz
RWxlbWVudDsKKworICAgIGJvb2wgbV9wcm9jZXNzaW5nQ2hhbmdlOworICAgIGJvb2wgbV9uYXZp
Z2F0aW9uTW9kZTsKKyAgICBGb2N1c0VsZW1lbnRUeXBlIG1fY3VycmVudEZvY3VzRWxlbWVudFR5
cGU7CisgICAgaW50IG1fY3VycmVudEZvY3VzRWxlbWVudFRleHRFZGl0TWFzazsKKworICAgIGlu
dCBtX2NvbXBvc2luZ1RleHRTdGFydDsKKyAgICBpbnQgbV9jb21wb3NpbmdUZXh0RW5kOworfTsK
KworfQorfQorCisjZW5kaWYgLy8gSW5wdXRIYW5kbGVyX2gK
</data>

          </attachment>
      

    </bug>

</bugzilla>