<?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>52088</bug_id>
          
          <creation_ts>2011-01-07 15:40:19 -0800</creation_ts>
          <short_desc>Split machine stack marking functions into their own class (MachineStackMarker)</short_desc>
          <delta_ts>2011-01-08 19:05:02 -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>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>331066</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-01-07 15:40:19 -0800</bug_when>
    <thetext>Split machine stack marking functions into their own class (MachineStackMarker)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>331077</commentid>
    <comment_count>1</comment_count>
      <attachid>78285</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-01-07 15:49:23 -0800</bug_when>
    <thetext>Created attachment 78285
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>331079</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-07 15:51:48 -0800</bug_when>
    <thetext>Attachment 78285 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/JavaScriptCore/API/APIShims.h&apos;, u&apos;Source/JavaScriptCore/Android.mk&apos;, u&apos;Source/JavaScriptCore/CMakeLists.txt&apos;, u&apos;Source/JavaScriptCore/ChangeLog&apos;, u&apos;Source/JavaScriptCore/GNUmakefile.am&apos;, u&apos;Source/JavaScriptCore/JavaScriptCore.gypi&apos;, u&apos;Source/JavaScriptCore/JavaScriptCore.pro&apos;, u&apos;Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.vcproj&apos;, u&apos;Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj&apos;, u&apos;Source/JavaScriptCore/runtime/Collector.cpp&apos;, u&apos;Source/JavaScriptCore/runtime/Collector.h&apos;, u&apos;Source/JavaScriptCore/runtime/JSGlobalData.h&apos;, u&apos;Source/JavaScriptCore/runtime/MachineStackMarker.cpp&apos;, u&apos;Source/JavaScriptCore/runtime/MachineStackMarker.h&apos;]&quot; exit_code: 1
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:41:  Alphabetical sorting problem.  [build/include_order] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:49:  &quot;stdlib.h&quot; already included at Source/JavaScriptCore/runtime/MachineStackMarker.cpp:28  [build/include] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:68:  Alphabetical sorting problem.  [build/include_order] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:69:  Alphabetical sorting problem.  [build/include_order] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:190:  Use 0 instead of NULL.  [readability/null] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:249:  usword_t is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:278:  Missing spaces around /  [whitespace/operators] [3]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:278:  user_count is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:281:  user_count is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:284:  user_count is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:287:  user_count is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.cpp:290:  user_count is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Source/JavaScriptCore/runtime/MachineStackMarker.h:34:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Total errors found: 13 in 14 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>331081</commentid>
    <comment_count>3</comment_count>
      <attachid>78285</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2011-01-07 15:58:04 -0800</bug_when>
    <thetext>Comment on attachment 78285
Patch

please check the style errors, though if they&apos;re all in existing code you should need to fix before moving.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>331115</commentid>
    <comment_count>4</comment_count>
      <attachid>78285</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-01-07 17:41:50 -0800</bug_when>
    <thetext>Comment on attachment 78285
Patch

Asking the commit queue to land this, since I&apos;m out of time today.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>331330</commentid>
    <comment_count>5</comment_count>
      <attachid>78285</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-01-08 17:28:59 -0800</bug_when>
    <thetext>Comment on attachment 78285
Patch

Rejecting attachment 78285 from commit-queue.

Failed to run &quot;[&apos;./Tools/Scripts/webkit-patch&apos;, &apos;--status-host=queues.webkit.org&apos;, &apos;--bot-id=eseidel-sf-cq&apos;, &apos;apply-attachment&apos;, &apos;--no-update&apos;, &apos;--non-interactive&apos;, 78285]&quot; exit_code: 2
Last 500 characters of output:
e Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
patching file Source/JavaScriptCore/runtime/Collector.cpp
patching file Source/JavaScriptCore/runtime/Collector.h
patching file Source/JavaScriptCore/runtime/JSGlobalData.h
patching file Source/JavaScriptCore/runtime/MachineStackMarker.cpp
patching file Source/JavaScriptCore/runtime/MachineStackMarker.h

Failed to run &quot;[u&apos;/Projects/CommitQueue/Tools/Scripts/svn-apply&apos;, u&apos;--reviewer&apos;, u&apos;Gavin Barraclough&apos;, u&apos;--force&apos;]&quot; exit_code: 1

Full output: http://queues.webkit.org/results/7367064</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>331351</commentid>
    <comment_count>6</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2011-01-08 19:05:02 -0800</bug_when>
    <thetext>Committed r75342: &lt;http://trac.webkit.org/changeset/75342&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>78285</attachid>
            <date>2011-01-07 15:49:23 -0800</date>
            <delta_ts>2011-01-08 17:28:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52088-20110107154922.patch</filename>
            <type>text/plain</type>
            <size>112198</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNzUyODYpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDYgQEAK
KzIwMTEtMDEtMDcgIEdlb2ZmcmV5IEdhcmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTcGxpdCBtYWNoaW5lIHN0
YWNrIG1hcmtpbmcgZnVuY3Rpb25zIGludG8gdGhlaXIgb3duIGNsYXNzIChNYWNoaW5lU3RhY2tN
YXJrZXIpCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01
MjA4OAorCisgICAgICAgICogQVBJL0FQSVNoaW1zLmg6CisgICAgICAgIChKU0M6OkFQSUVudHJ5
U2hpbVdpdGhvdXRMb2NrOjpBUElFbnRyeVNoaW1XaXRob3V0TG9jayk6IE1vdmVkIHJlZ2lzdGVy
VGhyZWFkKCkKKyAgICAgICAgY2FsbCBiZWhpbmQgYW4gI2lmZGVmIGJlY2F1c2Ugd2Ugc2hvdWxk
bid0IGJlIHJlZ2lzdGVyaW5nIHRocmVhZHMgYXQgYWxsCisgICAgICAgIGlmIHdlIGRvbid0IHN1
cHBvcnQgdXNhZ2Ugb24gbXVsdGlwbGUgdGhyZWFkcy4KKworICAgICAgICAqIEFuZHJvaWQubWs6
CisgICAgICAgICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogR05VbWFrZWZpbGUuYW06Cisg
ICAgICAgICogSmF2YVNjcmlwdENvcmUuZ3lwaToKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS5w
cm86CisgICAgICAgICogSmF2YVNjcmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3JlL0phdmFT
Y3JpcHRDb3JlLnZjcHJvajoKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qOiBVcGRhdGVkIHByb2plY3RzLgorCisgICAgICAgICogcnVudGltZS9Db2xs
ZWN0b3IuY3BwOgorICAgICAgICAoSlNDOjpIZWFwOjpIZWFwKToKKyAgICAgICAgKEpTQzo6SGVh
cDo6ZGVzdHJveSk6CisgICAgICAgIChKU0M6OkhlYXA6Om1hcmtSb290cyk6CisgICAgICAgICog
cnVudGltZS9Db2xsZWN0b3IuaDoKKyAgICAgICAgKEpTQzo6SGVhcDo6bWFjaGluZVN0YWNrTWFy
a2VyKTogTW92ZWQgY29kZSB0byBtYWNoaW5lU3RhY2tNYXJrZXIuCisKKyAgICAgICAgKiBydW50
aW1lL0pTR2xvYmFsRGF0YS5oOgorICAgICAgICAoSlNDOjpKU0dsb2JhbERhdGE6Om1ha2VVc2Fi
bGVGcm9tTXVsdGlwbGVUaHJlYWRzKTogUmVtb3ZlZCBhbiB1bm5lY2Vzc2FyeQorICAgICAgICBs
ZXZlbCBvZiBpbmRpcmVjdGlvbiwgdG8gbWFrZSBIZWFwIGxlc3Mgb2YgYSBHb2QgY2xhc3MuCisK
KyAgICAgICAgKiBydW50aW1lL01hY2hpbmVTdGFja01hcmtlci5oOiBDb3BpZWQgZnJvbSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db2xsZWN0b3IuaC4KKyAgICAgICAgKiBydW50aW1l
L01hY2hpbmVTdGFja01hcmtlci5jcHA6IENvcGllZCBmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9ydW50aW1lL0NvbGxlY3Rvci5jcHAuCisgICAgICAgIChKU0M6Ok1hY2hpbmVTdGFja01hcmtl
cjo6TWFjaGluZVN0YWNrTWFya2VyKToKKyAgICAgICAgKEpTQzo6TWFjaGluZVN0YWNrTWFya2Vy
Ojp+TWFjaGluZVN0YWNrTWFya2VyKToKKyAgICAgICAgKEpTQzo6TWFjaGluZVN0YWNrTWFya2Vy
OjptYWtlVXNhYmxlRnJvbU11bHRpcGxlVGhyZWFkcyk6CisgICAgICAgIChKU0M6Ok1hY2hpbmVT
dGFja01hcmtlcjo6cmVnaXN0ZXJUaHJlYWQpOgorICAgICAgICAoSlNDOjpNYWNoaW5lU3RhY2tN
YXJrZXI6OnVucmVnaXN0ZXJUaHJlYWQpOgorICAgICAgICAoSlNDOjpNYWNoaW5lU3RhY2tNYXJr
ZXI6Om1hcmtDdXJyZW50VGhyZWFkQ29uc2VydmF0aXZlbHlJbnRlcm5hbCk6CisgICAgICAgIChK
U0M6Ok1hY2hpbmVTdGFja01hcmtlcjo6bWFya0N1cnJlbnRUaHJlYWRDb25zZXJ2YXRpdmVseSk6
CisgICAgICAgIChKU0M6Ok1hY2hpbmVTdGFja01hcmtlcjo6bWFya090aGVyVGhyZWFkQ29uc2Vy
dmF0aXZlbHkpOgorICAgICAgICAoSlNDOjpNYWNoaW5lU3RhY2tNYXJrZXI6Om1hcmtNYWNoaW5l
U3RhY2tDb25zZXJ2YXRpdmVseSk6IE1vdmVkIGNvZGUgZnJvbSBIZWFwLgorCiAyMDExLTAxLTA3
ICBBZGFtIFJvYmVuICA8YXJvYmVuQGFwcGxlLmNvbT4KIAogICAgICAgICBVcGRhdGUgcmVhY3Qt
dG8tdnNwcm9wcy1jaGFuZ2VzLnB5IGFmdGVyIHI3NDg1NQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL0FuZHJvaWQubWsKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0Fu
ZHJvaWQubWsJKHJldmlzaW9uIDc1Mjc1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0FuZHJv
aWQubWsJKHdvcmtpbmcgY29weSkKQEAgLTEyNSw2ICsxMjUsNyBAQCBMT0NBTF9TUkNfRklMRVMg
Oj0gXAogCXJ1bnRpbWUvSlNXcmFwcGVyT2JqZWN0LmNwcCBcCiAJcnVudGltZS9MaXRlcmFsUGFy
c2VyLmNwcCBcCiAJcnVudGltZS9Mb29rdXAuY3BwIFwKKwlydW50aW1lL01hY2hpbmVTdGFja01h
cmtlci5jcHAgXAogCXJ1bnRpbWUvTWFya1N0YWNrLmNwcCBcCiAJcnVudGltZS9NYXJrU3RhY2tQ
b3NpeC5jcHAgXAogCXJ1bnRpbWUvTWF0aE9iamVjdC5jcHAgXApJbmRleDogU291cmNlL0phdmFT
Y3JpcHRDb3JlL0NNYWtlTGlzdHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9DTWFrZUxpc3RzLnR4dAkocmV2aXNpb24gNzUyNzUpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTEzNSw2ICsxMzUsNyBAQCBT
RVQoSmF2YVNjcmlwdENvcmVfU09VUkNFUwogICAgIHJ1bnRpbWUvSlNab21iaWUuY3BwCiAgICAg
cnVudGltZS9MaXRlcmFsUGFyc2VyLmNwcAogICAgIHJ1bnRpbWUvTG9va3VwLmNwcAorICAgIHJ1
bnRpbWUvTWFjaGluZVN0YWNrTWFya2VyLmNwcAogICAgIHJ1bnRpbWUvTWFya1N0YWNrLmNwcAog
ICAgIHJ1bnRpbWUvTWF0aE9iamVjdC5jcHAKICAgICBydW50aW1lL05hdGl2ZUVycm9yQ29uc3Ry
dWN0b3IuY3BwCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvR05VbWFrZWZpbGUuYW0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL0dOVW1ha2VmaWxlLmFtCShyZXZpc2lv
biA3NTI3NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9HTlVtYWtlZmlsZS5hbQkod29ya2lu
ZyBjb3B5KQpAQCAtMzM2LDYgKzMzNiw4IEBAIGphdmFzY3JpcHRjb3JlX3NvdXJjZXMgKz0gXAog
CVNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0xpdGVyYWxQYXJzZXIuaCBcCiAJU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTG9va3VwLmNwcCBcCiAJU291cmNlL0phdmFTY3JpcHRD
b3JlL3J1bnRpbWUvTG9va3VwLmggXAorCVNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01h
Y2hpbmVTdGFja01hcmtlci5jcHAgXAorCVNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01h
Y2hpbmVTdGFja01hcmtlci5oIFwKIAlTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9NYXJr
U3RhY2suY3BwIFwKIAlTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9NYXJrU3RhY2suaCBc
CiAJU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTWF0aE9iamVjdC5jcHAgXApJbmRleDog
U291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmd5cGkKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmd5cGkJKHJldmlzaW9uIDc1Mjc1
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLmd5cGkJKHdvcmtpbmcg
Y29weSkKQEAgLTI3Niw2ICsyNzYsOCBAQAogICAgICAgICAgICAgJ3J1bnRpbWUvTGl0ZXJhbFBh
cnNlci5oJywKICAgICAgICAgICAgICdydW50aW1lL0xvb2t1cC5jcHAnLAogICAgICAgICAgICAg
J3J1bnRpbWUvTG9va3VwLmgnLAorICAgICAgICAgICAgJ3J1bnRpbWUvTWFjaGluZVN0YWNrTWFy
a2VyLmNwcCcsCisgICAgICAgICAgICAncnVudGltZS9NYWNoaW5lU3RhY2tNYXJrZXIuaCcsCiAg
ICAgICAgICAgICAncnVudGltZS9NYXJrU3RhY2suY3BwJywKICAgICAgICAgICAgICdydW50aW1l
L01hcmtTdGFjay5oJywKICAgICAgICAgICAgICdydW50aW1lL01hcmtTdGFja1dpbi5jcHAnLApJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnBybwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJvCShyZXZpc2lvbiA3
NTI3NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcm8JKHdvcmtp
bmcgY29weSkKQEAgLTE3NCw2ICsxNzQsNyBAQCBTT1VSQ0VTICs9IFwKICAgICBydW50aW1lL0pT
V3JhcHBlck9iamVjdC5jcHAgXAogICAgIHJ1bnRpbWUvTGl0ZXJhbFBhcnNlci5jcHAgXAogICAg
IHJ1bnRpbWUvTG9va3VwLmNwcCBcCisgICAgcnVudGltZS9NYWNoaW5lU3RhY2tNYXJrZXIuY3Bw
IFwKICAgICBydW50aW1lL01hcmtTdGFja1Bvc2l4LmNwcCBcCiAgICAgcnVudGltZS9NYXJrU3Rh
Y2tTeW1iaWFuLmNwcCBcCiAgICAgcnVudGltZS9NYXJrU3RhY2tXaW4uY3BwIFwKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9BUEkvQVBJU2hpbXMuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQVBJL0FQSVNoaW1zLmgJKHJldmlzaW9uIDc1Mjc1KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0FQSS9BUElTaGltcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw4ICsz
OSwxMSBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIDogbV9nbG9iYWxEYXRhKGdsb2JhbERhdGEpCiAg
ICAgICAgICwgbV9lbnRyeUlkZW50aWZpZXJUYWJsZSh3dGZUaHJlYWREYXRhKCkuc2V0Q3VycmVu
dElkZW50aWZpZXJUYWJsZShnbG9iYWxEYXRhLT5pZGVudGlmaWVyVGFibGUpKQogICAgIHsKKyAg
ICAgICAgVU5VU0VEX1BBUkFNKHJlZ2lzdGVyVGhyZWFkKTsKKyNpZiBFTkFCTEUoSlNDX01VTFRJ
UExFX1RIUkVBRFMpCiAgICAgICAgIGlmIChyZWdpc3RlclRocmVhZCkKLSAgICAgICAgICAgIGds
b2JhbERhdGEtPmhlYXAucmVnaXN0ZXJUaHJlYWQoKTsKKyAgICAgICAgICAgIGdsb2JhbERhdGEt
PmhlYXAubWFjaGluZVN0YWNrTWFya2VyKCkucmVnaXN0ZXJUaHJlYWQoKTsKKyNlbmRpZgogICAg
ICAgICBtX2dsb2JhbERhdGEtPmhlYXAuYWN0aXZpdHlDYWxsYmFjaygpLT5zeW5jaHJvbml6ZSgp
OwogICAgICAgICBtX2dsb2JhbERhdGEtPnRpbWVvdXRDaGVja2VyLnN0YXJ0KCk7CiAgICAgfQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9KYXZhU2Ny
aXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS52Y3Byb2oJKHJldmlzaW9uIDc1Mjc1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0ph
dmFTY3JpcHRDb3JlLnZjcHJvai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2oJ
KHdvcmtpbmcgY29weSkKQEAgLTk4Niw2ICs5ODYsMTQgQEAKIAkJCQk+CiAJCQk8L0ZpbGU+CiAJ
CQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5ccnVudGltZVxNYWNoaW5lU3RhY2tNYXJr
ZXIuY3BwIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIu
LlwuLlxydW50aW1lXE1hY2hpbmVTdGFja01hcmtlci5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJ
CTxGaWxlCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxydW50aW1lXE1hcmtTdGFjay5jcHAiCiAJ
CQkJPgogCQkJPC9GaWxlPgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlz
aW9uIDc1Mjc1KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTE2Myw2ICsxNjMsOCBAQAog
CQkxNEFCREY2MDBBNDM3RkVGMDBFQ0NBMDEgLyogSlNDYWxsYmFja09iamVjdC5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNEFCREY1RTBBNDM3RkVG
MDBFQ0NBMDEgLyogSlNDYWxsYmFja09iamVjdC5jcHAgKi87IH07CiAJCTE0QjNFRjA1MTJCQzI0
REQwMEQyOUVGRiAvKiBQYWdlQmxvY2suaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDE0QjNFRjAzMTJCQzI0REQwMEQyOUVGRiAvKiBQYWdlQmxvY2suaCAq
Lzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkxNEIzRUYw
NjEyQkMyNEREMDBEMjlFRkYgLyogUGFnZUJsb2NrLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE0QjNFRjA0MTJCQzI0REQwMEQyOUVGRiAvKiBQYWdl
QmxvY2suY3BwICovOyB9OworCQkxNEI3MjNCMjEyRDdEQTQ2MDAzQkQ1RUQgLyogTWFjaGluZVN0
YWNrTWFya2VyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDE0QjcyMzNGMTJEN0QwREEwMDNCRDVFRCAvKiBNYWNoaW5lU3RhY2tNYXJrZXIuY3BwICov
OyB9OworCQkxNEI3MjNCODEyRDdEQTZGMDAzQkQ1RUQgLyogTWFjaGluZVN0YWNrTWFya2VyLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNEI3MjM0MDEy
RDdEMERBMDAzQkQ1RUQgLyogTWFjaGluZVN0YWNrTWFya2VyLmggKi87IHNldHRpbmdzID0ge0FU
VFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJMTRCOEVDNzIwQTU2NTIwOTAwNjJCRTU0
IC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayBpbiBGcmFtZXdvcmtzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDY1NjBBNENGMDRCM0IzRTcwMDhBRTk1MiAvKiBDb3JlRm91
bmRhdGlvbi5mcmFtZXdvcmsgKi87IH07CiAJCTE0QkQ1OUM1MEEzRThGOUYwMEJBRjU5QyAvKiBK
YXZhU2NyaXB0Q29yZS5mcmFtZXdvcmsgaW4gRnJhbWV3b3JrcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA5MzJGNUJEOTA4MjJBMUM3MDA3MzY5NzUgLyogSmF2YVNjcmlwdENv
cmUuZnJhbWV3b3JrICovOyB9OwogCQkxNEJENUEzMDBBM0U5MUY2MDBCQUY1OUMgLyogSlNDb250
ZXh0UmVmLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDE0QkQ1QTI5MEEzRTkxRjYwMEJBRjU5QyAvKiBKU0NvbnRleHRSZWYuY3BwICovOyB9OwpAQCAt
NzI1LDYgKzcyNyw4IEBACiAJCTE0QUJERjVFMEE0MzdGRUYwMEVDQ0EwMSAvKiBKU0NhbGxiYWNr
T2JqZWN0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTQ2FsbGJh
Y2tPYmplY3QuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxNEIzRUYwMzEyQkMy
NEREMDBEMjlFRkYgLyogUGFnZUJsb2NrLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IFBhZ2VCbG9jay5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkxNEIzRUYwNDEy
QkMyNEREMDBEMjlFRkYgLyogUGFnZUJsb2NrLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IFBhZ2VCbG9jay5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CTE0QjcyMzNGMTJEN0QwREEwMDNCRDVFRCAvKiBNYWNoaW5lU3RhY2tNYXJrZXIuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTWFjaGluZVN0YWNrTWFya2VyLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMTRCNzIzNDAxMkQ3RDBEQTAwM0JENUVEIC8q
IE1hY2hpbmVTdGFja01hcmtlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBN
YWNoaW5lU3RhY2tNYXJrZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTRCOEVD
QTYwQTU2NTM5ODAwNjJCRTU0IC8qIEphdmFTY3JpcHRDb3JlLmV4cCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmV4cG9ydHM7IHBhdGggPSBKYXZhU2NyaXB0Q29yZS5leHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IHRhYldpZHRoID0gNDsgdXNlc1RhYnMgPSAwOyB9OwogCQkxNEJENTlCRjBBM0U4
RjkwMDBCQUY1OUMgLyogdGVzdGFwaSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBleHBs
aWNpdEZpbGVUeXBlID0gImNvbXBpbGVkLm1hY2gtby5leGVjdXRhYmxlIjsgaW5jbHVkZUluSW5k
ZXggPSAwOyBwYXRoID0gdGVzdGFwaTsgc291cmNlVHJlZSA9IEJVSUxUX1BST0RVQ1RTX0RJUjsg
fTsKIAkJMTRCRDVBMjkwQTNFOTFGNjAwQkFGNTlDIC8qIEpTQ29udGV4dFJlZi5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNDb250ZXh0UmVmLmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE2NjcsOCArMTY3MSw2IEBACiAJCTdFRjZFMEJCMEVC
N0ExRUMwMDc5QUZBRiAvKiBydW50aW1lICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQlj
aGlsZHJlbiA9ICgKLQkJCQlEREY3QUJEMjExRjYwRUQyMDAxMDhFMzYgLyogR0NBY3Rpdml0eUNh
bGxiYWNrLmggKi8sCi0JCQkJRERGN0FCRDMxMUY2MEVEMjAwMTA4RTM2IC8qIEdDQWN0aXZpdHlD
YWxsYmFja0NGLmNwcCAqLywKIAkJCQlCQ0Y2MDUxMTBFMjAzRUY4MDBCOUE2NEQgLyogQXJnTGlz
dC5jcHAgKi8sCiAJCQkJQkNGNjA1MTIwRTIwM0VGODAwQjlBNjREIC8qIEFyZ0xpc3QuaCAqLywK
IAkJCQlCQzI1N0RFNTBFMUY1MUM1MDAxNkI2QzkgLyogQXJndW1lbnRzLmNwcCAqLywKQEAgLTE3
MjIsNiArMTcyNCw4IEBACiAJCQkJQkMyNjgwQzEwRTE2RDRFOTAwQTA2RTkyIC8qIEZ1bmN0aW9u
Q29uc3RydWN0b3IuaCAqLywKIAkJCQlGNjkyQTg1QzAyNTU1OTdEMDFGRjYwRjcgLyogRnVuY3Rp
b25Qcm90b3R5cGUuY3BwICovLAogCQkJCUY2OTJBODVEMDI1NTU5N0QwMUZGNjBGNyAvKiBGdW5j
dGlvblByb3RvdHlwZS5oICovLAorCQkJCURERjdBQkQyMTFGNjBFRDIwMDEwOEUzNiAvKiBHQ0Fj
dGl2aXR5Q2FsbGJhY2suaCAqLywKKwkJCQlEREY3QUJEMzExRjYwRUQyMDAxMDhFMzYgLyogR0NB
Y3Rpdml0eUNhbGxiYWNrQ0YuY3BwICovLAogCQkJCURERTgyQUQxMTIwOUQ5NTUwMDVDMTc1NiAv
KiBHQ0hhbmRsZS5jcHAgKi8sCiAJCQkJRERFODJBRDIxMjA5RDk1NTAwNUMxNzU2IC8qIEdDSGFu
ZGxlLmggKi8sCiAJCQkJQkMwMkU5QjgwRTE4NDU0NTAwMEY5Mjk3IC8qIEdldHRlclNldHRlci5j
cHAgKi8sCkBAIC0xNzg1LDYgKzE3ODksOCBAQAogCQkJCUE3RTJFQTY5MEZCNDYwQ0YwMDYwMUYw
NiAvKiBMaXRlcmFsUGFyc2VyLmggKi8sCiAJCQkJRjY5MkE4NjgwMjU1NTk3RDAxRkY2MEY3IC8q
IExvb2t1cC5jcHAgKi8sCiAJCQkJRjY5MkE4NjkwMjU1NTk3RDAxRkY2MEY3IC8qIExvb2t1cC5o
ICovLAorCQkJCTE0QjcyMzNGMTJEN0QwREEwMDNCRDVFRCAvKiBNYWNoaW5lU3RhY2tNYXJrZXIu
Y3BwICovLAorCQkJCTE0QjcyMzQwMTJEN0QwREEwMDNCRDVFRCAvKiBNYWNoaW5lU3RhY2tNYXJr
ZXIuaCAqLywKIAkJCQlBNzRCMzQ5ODEwMkE1RjhFMDAzMkFCOTggLyogTWFya1N0YWNrLmNwcCAq
LywKIAkJCQlBNzc5NTU4RjEwMUE3NEQ1MDAxMTRFNTUgLyogTWFya1N0YWNrLmggKi8sCiAJCQkJ
QTdDNTMwRTMxMDJBMzgxMzAwNUJDNzQxIC8qIE1hcmtTdGFja1Bvc2l4LmNwcCAqLywKQEAgLTE4
NDAsNiArMTg0Niw4IEBACiAJCQkJN0UyQzZDOTgwRDMxQzZCNjAwMkQ0NEUyIC8qIFNjb3BlQ2hh
aW5NYXJrLmggKi8sCiAJCQkJOTMzMDNGRTgwRTZBNzJCNTAwNzg2RTZBIC8qIFNtYWxsU3RyaW5n
cy5jcHAgKi8sCiAJCQkJOTMzMDNGRUEwRTZBNzJDMDAwNzg2RTZBIC8qIFNtYWxsU3RyaW5ncy5o
ICovLAorCQkJCUE3MzBCNjExMTI1MDA2OEYwMDlEMjVCMSAvKiBTdHJpY3RFdmFsQWN0aXZhdGlv
bi5jcHAgKi8sCisJCQkJQTczMEI2MTAxMjUwMDY4RjAwOUQyNUIxIC8qIFN0cmljdEV2YWxBY3Rp
dmF0aW9uLmggKi8sCiAJCQkJQkMxOEMzQzAwRTE2RUUzMzAwQjM0NDYwIC8qIFN0cmluZ0NvbnN0
cnVjdG9yLmNwcCAqLywKIAkJCQlCQzE4QzNDMTBFMTZFRTMzMDBCMzQ0NjAgLyogU3RyaW5nQ29u
c3RydWN0b3IuaCAqLywKIAkJCQlCQzE4QzNDMjBFMTZFRTMzMDBCMzQ0NjAgLyogU3RyaW5nT2Jq
ZWN0LmNwcCAqLywKQEAgLTE4NjUsOCArMTg3Myw2IEBACiAJCQkJMTRCRkNFNjgxMENEQjFGQzAw
MzY0Q0NFIC8qIFdlYWtHQ01hcC5oICovLAogCQkJCTE0MDM1REIwMTBEQkZCMkEwMEZGRkZFNyAv
KiBXZWFrR0NQdHIuaCAqLywKIAkJCQkxNDIwQkU3QTEwQUE2RERCMDBGNDU1RDIgLyogV2Vha1Jh
bmRvbS5oICovLAotCQkJCUE3MzBCNjEwMTI1MDA2OEYwMDlEMjVCMSAvKiBTdHJpY3RFdmFsQWN0
aXZhdGlvbi5oICovLAotCQkJCUE3MzBCNjExMTI1MDA2OEYwMDlEMjVCMSAvKiBTdHJpY3RFdmFs
QWN0aXZhdGlvbi5jcHAgKi8sCiAJCQkpOwogCQkJcGF0aCA9IHJ1bnRpbWU7CiAJCQlzb3VyY2VU
cmVlID0gIjxncm91cD4iOwpAQCAtMjIxNCw2ICsyMjIwLDcgQEAKIAkJCQlBN0UyRUE2QjBGQjQ2
MENGMDA2MDFGMDYgLyogTGl0ZXJhbFBhcnNlci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkMxOEM0
MzYwRTE2RjVDRDAwQjM0NDYwIC8qIExvY2tlci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkMxOEM0
MzcwRTE2RjVDRDAwQjM0NDYwIC8qIExvb2t1cC5oIGluIEhlYWRlcnMgKi8sCisJCQkJMTRCNzIz
QjgxMkQ3REE2RjAwM0JENUVEIC8qIE1hY2hpbmVTdGFja01hcmtlci5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJODZDMzZFRUEwRUUxMjg5RDAwQjNERjU5IC8qIE1hY3JvQXNzZW1ibGVyLmggaW4gSGVh
ZGVycyAqLywKIAkJCQk4NkQzQjJDNjEwMTU2QkRFMDAyODY1RTcgLyogTWFjcm9Bc3NlbWJsZXJB
Uk0uaCBpbiBIZWFkZXJzICovLAogCQkJCTg2QUREMTQ2MEZEREVBOTgwMDA2RUVDMiAvKiBNYWNy
b0Fzc2VtYmxlckFSTXY3LmggaW4gSGVhZGVycyAqLywKQEAgLTI3NjUsNiArMjc3Miw3IEBACiAJ
CQkJMTQ4RjIxQjAxMDdFQzU0MTAwNDJFQzJDIC8qIExleGVyLmNwcCBpbiBTb3VyY2VzICovLAog
CQkJCUE3RTJFQTZDMEZCNDYwQ0YwMDYwMUYwNiAvKiBMaXRlcmFsUGFyc2VyLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTE0NDY5RERFMTA3RUM3RTcwMDY1MDQ0NiAvKiBMb29rdXAuY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJMTRCNzIzQjIxMkQ3REE0NjAwM0JENUVEIC8qIE1hY2hpbmVTdGFja01h
cmtlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk4NkM1NjhFMDExQTIxM0VFMDAwN0Y3RjAgLyog
TWFjcm9Bc3NlbWJsZXJBUk0uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMDZEMzU4QjMwREFBREFB
NDAwM0IxNzRFIC8qIE1haW5UaHJlYWQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMDZEMzU4QjQw
REFBREFBQTAwM0IxNzRFIC8qIE1haW5UaHJlYWRNYWMubW0gaW4gU291cmNlcyAqLywKQEAgLTI3
NzcsNiArMjc4NSw3IEBACiAJCQkJMTQ0NjlERTExMDdFQzdFNzAwNjUwNDQ2IC8qIE5hdGl2ZUVy
cm9yUHJvdG90eXBlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0OEYyMUI3MTA3RUM1NDcwMDQy
RUMyQyAvKiBOb2Rlcy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk2NTVFQjI5QjEwQ0UyNTgxMDAx
QTk5MEUgLyogTm9kZXNDb2RlZ2VuLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTkzODU0QTlBMTJD
OTNEM0IwMERBQUY3NyAvKiBOdWxsUHRyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0NDY5REUy
MTA3RUM3RTcwMDY1MDQ0NiAvKiBOdW1iZXJDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQkxNDQ2OURFMzEwN0VDN0U3MDA2NTA0NDYgLyogTnVtYmVyT2JqZWN0LmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTE0NDY5REU0MTA3RUM3RTcwMDY1MDQ0NiAvKiBOdW1iZXJQcm90b3R5cGUu
Y3BwIGluIFNvdXJjZXMgKi8sCkBAIC0yODEwLDEwICsyODE5LDEwIEBACiAJCQkJODZFQUM0OTcw
RjkzRThEMTAwOEVDOTQ4IC8qIFJlZ2V4SW50ZXJwcmV0ZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJODZFQUM0OTkwRjkzRThEMTAwOEVDOTQ4IC8qIFJlZ2V4SklULmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTE0MjgwODQxMTA3RUMwOTMwMDEzRTdCMiAvKiBSZWdFeHAuY3BwIGluIFNvdXJjZXMg
Ki8sCisJCQkJODY4RDgxQTIxMkM0MjhDRTAwOTNEQzg0IC8qIFJlZ2V4UGF0dGVybi5jcHAgaW4g
U291cmNlcyAqLywKIAkJCQlBMTcxMkIzQjExQzdCMjEyMDA3QTUzMTUgLyogUmVnRXhwQ2FjaGUu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQyODA4NDIxMDdFQzA5MzAwMTNFN0IyIC8qIFJlZ0V4
cENvbnN0cnVjdG9yLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjgwODQzMTA3RUMwOTMwMDEz
RTdCMiAvKiBSZWdFeHBPYmplY3QuY3BwIGluIFNvdXJjZXMgKi8sCi0JCQkJODY4RDgxQTIxMkM0
MjhDRTAwOTNEQzg0IC8qIFJlZ2V4UGF0dGVybi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDI4
MDg0NDEwN0VDMDkzMDAxM0U3QjIgLyogUmVnRXhwUHJvdG90eXBlLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTE0MjgwODNBMTA3RUMwNzUwMDEzRTdCMiAvKiBSZWdpc3RlckZpbGUuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJODZCOTlBQjgxMTdFMzkxRTAwREY1QTkwIC8qIFJvcGVJbXBsLmNwcCBp
biBTb3VyY2VzICovLApAQCAtMjgyMSw5ICsyODMwLDkgQEAKIAkJCQkxNDQ2OURFQTEwN0VDN0U3
MDA2NTA0NDYgLyogU2NvcGVDaGFpbi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwQkYyOEEyOTEx
QTMzREMzMDA2MzhGODQgLyogU2l6ZUxpbWl0cy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5MzMw
NDAyQzBFNkE3NjQwMDA3ODZFNkEgLyogU21hbGxTdHJpbmdzLmNwcCBpbiBTb3VyY2VzICovLAor
CQkJCTg2RDg3REFFMTJCQ0E3RDEwMDhFNzNBMSAvKiBTdGFja0JvdW5kcy5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlBNzMwQjYxMzEyNTAwNjhGMDA5RDI1QjEgLyogU3RyaWN0RXZhbEFjdGl2YXRp
b24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJODY0MzhGQzQxMjY1NTAzRTAwRTBERkNBIC8qIFN0
cmluZ0J1aWxkZXIuY3BwIGluIFNvdXJjZXMgKi8sCi0JCQkJODZEODdEQUUxMkJDQTdEMTAwOEU3
M0ExIC8qIFN0YWNrQm91bmRzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0NDY5REVCMTA3RUM3
RTcwMDY1MDQ0NiAvKiBTdHJpbmdDb25zdHJ1Y3Rvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk4
NjhCRkEwRTExN0NFRkQxMDBCOTA4QjEgLyogU3RyaW5nSW1wbC5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQkxNDQ2OURFQzEwN0VDN0U3MDA2NTA0NDYgLyogU3RyaW5nT2JqZWN0LmNwcCBpbiBTb3Vy
Y2VzICovLApAQCAtMjg0NCw3ICsyODUzLDYgQEAKIAkJCQlFMUVGNzlBQTBDRTk3QkE2MDA4OEQ1
MDAgLyogVVRGOC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk4NjhCRkExNzExN0NGMTk5MDBCOTA4
QjEgLyogV1RGU3RyaW5nLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg2RDA4RDUzMTE3OTM2MTMw
MDZFNUVEMCAvKiBXVEZUaHJlYWREYXRhLmNwcCBpbiBTb3VyY2VzICovLAotCQkJCTkzODU0QTlB
MTJDOTNEM0IwMERBQUY3NyAvKiBOdWxsUHRyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJ
CXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29sbGVjdG9yLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db2xsZWN0b3IuY3BwCShyZXZpc2lvbiA3NTI3
NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbGxlY3Rvci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQ3LDUwICs0Nyw2IEBACiAjaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+
CiAjaW5jbHVkZSA8d3RmL1ZNVGFncy5oPgogCi0jaWYgT1MoREFSV0lOKQotCi0jaW5jbHVkZSA8
bWFjaC9tYWNoX2luaXQuaD4KLSNpbmNsdWRlIDxtYWNoL21hY2hfcG9ydC5oPgotI2luY2x1ZGUg
PG1hY2gvdGFzay5oPgotI2luY2x1ZGUgPG1hY2gvdGhyZWFkX2FjdC5oPgotI2luY2x1ZGUgPG1h
Y2gvdm1fbWFwLmg+Ci0KLSNlbGlmIE9TKFdJTkRPV1MpCi0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+
Ci0jaW5jbHVkZSA8bWFsbG9jLmg+Ci0KLSNlbGlmIE9TKEhBSUtVKQotCi0jaW5jbHVkZSA8T1Mu
aD4KLQotI2VsaWYgT1MoVU5JWCkKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2lmICFPUyhIQUlL
VSkKLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0K
LSNpZiBPUyhTT0xBUklTKQotI2luY2x1ZGUgPHRocmVhZC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxw
dGhyZWFkLmg+Ci0jZW5kaWYKLQotI2lmIEhBVkUoUFRIUkVBRF9OUF9IKQotI2luY2x1ZGUgPHB0
aHJlYWRfbnAuaD4KLSNlbmRpZgotCi0jaWYgT1MoUU5YKQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0j
aW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJy
bm8uaD4KLSNlbmRpZgotCi0jZW5kaWYKLQogI2RlZmluZSBDT0xMRUNUX09OX0VWRVJZX0FMTE9D
QVRJT04gMAogCiB1c2luZyBzdGQ6Om1heDsKQEAgLTEwNiwzOCArNjIsMTAgQEAgY29uc3Qgc2l6
ZV90IEFMTE9DQVRJT05TX1BFUl9DT0xMRUNUSU9OIAogLy8gYSBQSUMgYnJhbmNoIGluIE1hY2gt
TyBiaW5hcmllcywgc2VlIDxyZGFyOi8vcHJvYmxlbS81OTcxMzkxPi4KICNkZWZpbmUgTUlOX0FS
UkFZX1NJWkUgKHN0YXRpY19jYXN0PHNpemVfdD4oMTQpKQogCi0jaWYgRU5BQkxFKEpTQ19NVUxU
SVBMRV9USFJFQURTKQotCi0jaWYgT1MoREFSV0lOKQotdHlwZWRlZiBtYWNoX3BvcnRfdCBQbGF0
Zm9ybVRocmVhZDsKLSNlbGlmIE9TKFdJTkRPV1MpCi10eXBlZGVmIEhBTkRMRSBQbGF0Zm9ybVRo
cmVhZDsKLSNlbmRpZgotCi1jbGFzcyBIZWFwOjpUaHJlYWQgewotcHVibGljOgotICAgIFRocmVh
ZChwdGhyZWFkX3QgcHRocmVhZCwgY29uc3QgUGxhdGZvcm1UaHJlYWQmIHBsYXRUaHJlYWQsIHZv
aWQqIGJhc2UpIAotICAgICAgICA6IHBvc2l4VGhyZWFkKHB0aHJlYWQpCi0gICAgICAgICwgcGxh
dGZvcm1UaHJlYWQocGxhdFRocmVhZCkKLSAgICAgICAgLCBzdGFja0Jhc2UoYmFzZSkKLSAgICB7
Ci0gICAgfQotCi0gICAgVGhyZWFkKiBuZXh0OwotICAgIHB0aHJlYWRfdCBwb3NpeFRocmVhZDsK
LSAgICBQbGF0Zm9ybVRocmVhZCBwbGF0Zm9ybVRocmVhZDsKLSAgICB2b2lkKiBzdGFja0Jhc2U7
Ci19OwotCi0jZW5kaWYKLQogSGVhcDo6SGVhcChKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEpCiAg
ICAgOiBtX21hcmtMaXN0U2V0KDApCi0jaWYgRU5BQkxFKEpTQ19NVUxUSVBMRV9USFJFQURTKQot
ICAgICwgbV9yZWdpc3RlcmVkVGhyZWFkcygwKQotICAgICwgbV9jdXJyZW50VGhyZWFkUmVnaXN0
cmFyKDApCi0jZW5kaWYKICAgICAsIG1fZ2xvYmFsRGF0YShnbG9iYWxEYXRhKQorICAgICwgbV9t
YWNoaW5lU3RhY2tNYXJrZXIodGhpcykKIHsKICAgICBBU1NFUlQoZ2xvYmFsRGF0YSk7CiAgICAg
bWVtc2V0KCZtX2hlYXAsIDAsIHNpemVvZihDb2xsZWN0b3JIZWFwKSk7CkBAIC0xNzEsMTkgKzk5
LDYgQEAgdm9pZCBIZWFwOjpkZXN0cm95KCkKIAogICAgIGZyZWVCbG9ja3MoKTsKIAotI2lmIEVO
QUJMRShKU0NfTVVMVElQTEVfVEhSRUFEUykKLSAgICBpZiAobV9jdXJyZW50VGhyZWFkUmVnaXN0
cmFyKSB7Ci0gICAgICAgIGludCBlcnJvciA9IHB0aHJlYWRfa2V5X2RlbGV0ZShtX2N1cnJlbnRU
aHJlYWRSZWdpc3RyYXIpOwotICAgICAgICBBU1NFUlRfVU5VU0VEKGVycm9yLCAhZXJyb3IpOwot
ICAgIH0KLQotICAgIE11dGV4TG9ja2VyIHJlZ2lzdGVyZWRUaHJlYWRzTG9jayhtX3JlZ2lzdGVy
ZWRUaHJlYWRzTXV0ZXgpOwotICAgIGZvciAoSGVhcDo6VGhyZWFkKiB0ID0gbV9yZWdpc3RlcmVk
VGhyZWFkczsgdDspIHsKLSAgICAgICAgSGVhcDo6VGhyZWFkKiBuZXh0ID0gdC0+bmV4dDsKLSAg
ICAgICAgZGVsZXRlIHQ7Ci0gICAgICAgIHQgPSBuZXh0OwotICAgIH0KLSNlbmRpZgogICAgIG1f
Z2xvYmFsRGF0YSA9IDA7CiB9CiAKQEAgLTM4NSw4MiArMzAwLDYgQEAgdm9pZCBIZWFwOjpzaHJp
bmtCbG9ja3Moc2l6ZV90IG5lZWRlZEJsbwogICAgICAgICBtX2hlYXAuY29sbGVjdG9yQmxvY2so
aSktPm1hcmtlZC5zZXQoSGVhcENvbnN0YW50czo6Y2VsbHNQZXJCbG9jayAtIDEpOwogfQogCi0j
aWYgRU5BQkxFKEpTQ19NVUxUSVBMRV9USFJFQURTKQotCi1zdGF0aWMgaW5saW5lIFBsYXRmb3Jt
VGhyZWFkIGdldEN1cnJlbnRQbGF0Zm9ybVRocmVhZCgpCi17Ci0jaWYgT1MoREFSV0lOKQotICAg
IHJldHVybiBwdGhyZWFkX21hY2hfdGhyZWFkX25wKHB0aHJlYWRfc2VsZigpKTsKLSNlbGlmIE9T
KFdJTkRPV1MpCi0gICAgcmV0dXJuIHB0aHJlYWRfZ2V0dzMydGhyZWFkaGFuZGxlX25wKHB0aHJl
YWRfc2VsZigpKTsKLSNlbmRpZgotfQotCi12b2lkIEhlYXA6Om1ha2VVc2FibGVGcm9tTXVsdGlw
bGVUaHJlYWRzKCkKLXsKLSAgICBpZiAobV9jdXJyZW50VGhyZWFkUmVnaXN0cmFyKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpbnQgZXJyb3IgPSBwdGhyZWFkX2tleV9jcmVhdGUoJm1fY3VycmVu
dFRocmVhZFJlZ2lzdHJhciwgdW5yZWdpc3RlclRocmVhZCk7Ci0gICAgaWYgKGVycm9yKQotICAg
ICAgICBDUkFTSCgpOwotfQotCi12b2lkIEhlYXA6OnJlZ2lzdGVyVGhyZWFkKCkKLXsKLSAgICBB
U1NFUlQoIW1fZ2xvYmFsRGF0YS0+ZXhjbHVzaXZlVGhyZWFkIHx8IG1fZ2xvYmFsRGF0YS0+ZXhj
bHVzaXZlVGhyZWFkID09IGN1cnJlbnRUaHJlYWQoKSk7Ci0KLSAgICBpZiAoIW1fY3VycmVudFRo
cmVhZFJlZ2lzdHJhciB8fCBwdGhyZWFkX2dldHNwZWNpZmljKG1fY3VycmVudFRocmVhZFJlZ2lz
dHJhcikpCi0gICAgICAgIHJldHVybjsKLQotICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMobV9jdXJy
ZW50VGhyZWFkUmVnaXN0cmFyLCB0aGlzKTsKLSAgICBIZWFwOjpUaHJlYWQqIHRocmVhZCA9IG5l
dyBIZWFwOjpUaHJlYWQocHRocmVhZF9zZWxmKCksIGdldEN1cnJlbnRQbGF0Zm9ybVRocmVhZCgp
LCBtX2dsb2JhbERhdGEtPnN0YWNrKCkub3JpZ2luKCkpOwotCi0gICAgTXV0ZXhMb2NrZXIgbG9j
ayhtX3JlZ2lzdGVyZWRUaHJlYWRzTXV0ZXgpOwotCi0gICAgdGhyZWFkLT5uZXh0ID0gbV9yZWdp
c3RlcmVkVGhyZWFkczsKLSAgICBtX3JlZ2lzdGVyZWRUaHJlYWRzID0gdGhyZWFkOwotfQotCi12
b2lkIEhlYXA6OnVucmVnaXN0ZXJUaHJlYWQodm9pZCogcCkKLXsKLSAgICBpZiAocCkKLSAgICAg
ICAgc3RhdGljX2Nhc3Q8SGVhcCo+KHApLT51bnJlZ2lzdGVyVGhyZWFkKCk7Ci19Ci0KLXZvaWQg
SGVhcDo6dW5yZWdpc3RlclRocmVhZCgpCi17Ci0gICAgcHRocmVhZF90IGN1cnJlbnRQb3NpeFRo
cmVhZCA9IHB0aHJlYWRfc2VsZigpOwotCi0gICAgTXV0ZXhMb2NrZXIgbG9jayhtX3JlZ2lzdGVy
ZWRUaHJlYWRzTXV0ZXgpOwotCi0gICAgaWYgKHB0aHJlYWRfZXF1YWwoY3VycmVudFBvc2l4VGhy
ZWFkLCBtX3JlZ2lzdGVyZWRUaHJlYWRzLT5wb3NpeFRocmVhZCkpIHsKLSAgICAgICAgVGhyZWFk
KiB0ID0gbV9yZWdpc3RlcmVkVGhyZWFkczsKLSAgICAgICAgbV9yZWdpc3RlcmVkVGhyZWFkcyA9
IG1fcmVnaXN0ZXJlZFRocmVhZHMtPm5leHQ7Ci0gICAgICAgIGRlbGV0ZSB0OwotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIEhlYXA6OlRocmVhZCogbGFzdCA9IG1fcmVnaXN0ZXJlZFRocmVhZHM7Ci0g
ICAgICAgIEhlYXA6OlRocmVhZCogdDsKLSAgICAgICAgZm9yICh0ID0gbV9yZWdpc3RlcmVkVGhy
ZWFkcy0+bmV4dDsgdDsgdCA9IHQtPm5leHQpIHsKLSAgICAgICAgICAgIGlmIChwdGhyZWFkX2Vx
dWFsKHQtPnBvc2l4VGhyZWFkLCBjdXJyZW50UG9zaXhUaHJlYWQpKSB7Ci0gICAgICAgICAgICAg
ICAgbGFzdC0+bmV4dCA9IHQtPm5leHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBsYXN0ID0gdDsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlQo
dCk7IC8vIElmIHQgaXMgTlVMTCwgd2UgbmV2ZXIgZm91bmQgb3Vyc2VsdmVzIGluIHRoZSBsaXN0
LgotICAgICAgICBkZWxldGUgdDsKLSAgICB9Ci19Ci0KLSNlbHNlIC8vIEVOQUJMRShKU0NfTVVM
VElQTEVfVEhSRUFEUykKLQotdm9pZCBIZWFwOjpyZWdpc3RlclRocmVhZCgpCi17Ci19Ci0KLSNl
bmRpZgotCiBpbmxpbmUgYm9vbCBpc1BvaW50ZXJBbGlnbmVkKHZvaWQqIHApCiB7CiAgICAgcmV0
dXJuICgoKGludHB0cl90KShwKSAmIChzaXplb2YoY2hhciopIC0gMSkpID09IDApOwpAQCAtNTIx
LDIxMiArMzYwLDYgQEAgdm9pZCBIZWFwOjptYXJrQ29uc2VydmF0aXZlbHkoTWFya1N0YWNrJgog
ICAgIH0KIH0KIAotdm9pZCBORVZFUl9JTkxJTkUgSGVhcDo6bWFya0N1cnJlbnRUaHJlYWRDb25z
ZXJ2YXRpdmVseUludGVybmFsKE1hcmtTdGFjayYgbWFya1N0YWNrKQotewotICAgIG1hcmtDb25z
ZXJ2YXRpdmVseShtYXJrU3RhY2ssIG1fZ2xvYmFsRGF0YS0+c3RhY2soKS5jdXJyZW50KCksIG1f
Z2xvYmFsRGF0YS0+c3RhY2soKS5vcmlnaW4oKSk7Ci0gICAgbWFya1N0YWNrLmRyYWluKCk7Ci19
Ci0KLSNpZiBDT01QSUxFUihHQ0MpCi0jZGVmaW5lIFJFR0lTVEVSX0JVRkZFUl9BTElHTk1FTlQg
X19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKHNpemVvZih2b2lkKikpKSkKLSNlbHNlCi0jZGVmaW5l
IFJFR0lTVEVSX0JVRkZFUl9BTElHTk1FTlQKLSNlbmRpZgotCi12b2lkIEhlYXA6Om1hcmtDdXJy
ZW50VGhyZWFkQ29uc2VydmF0aXZlbHkoTWFya1N0YWNrJiBtYXJrU3RhY2spCi17Ci0gICAgLy8g
c2V0am1wIGZvcmNlcyB2b2xhdGlsZSByZWdpc3RlcnMgb250byB0aGUgc3RhY2sKLSAgICBqbXBf
YnVmIHJlZ2lzdGVycyBSRUdJU1RFUl9CVUZGRVJfQUxJR05NRU5UOwotI2lmIENPTVBJTEVSKE1T
VkMpCi0jcHJhZ21hIHdhcm5pbmcocHVzaCkKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0NjEx
KQotI2VuZGlmCi0gICAgc2V0am1wKHJlZ2lzdGVycyk7Ci0jaWYgQ09NUElMRVIoTVNWQykKLSNw
cmFnbWEgd2FybmluZyhwb3ApCi0jZW5kaWYKLQotICAgIG1hcmtDdXJyZW50VGhyZWFkQ29uc2Vy
dmF0aXZlbHlJbnRlcm5hbChtYXJrU3RhY2spOwotfQotCi0jaWYgRU5BQkxFKEpTQ19NVUxUSVBM
RV9USFJFQURTKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3VzcGVuZFRocmVhZChjb25zdCBQbGF0
Zm9ybVRocmVhZCYgcGxhdGZvcm1UaHJlYWQpCi17Ci0jaWYgT1MoREFSV0lOKQotICAgIHRocmVh
ZF9zdXNwZW5kKHBsYXRmb3JtVGhyZWFkKTsKLSNlbGlmIE9TKFdJTkRPV1MpCi0gICAgU3VzcGVu
ZFRocmVhZChwbGF0Zm9ybVRocmVhZCk7Ci0jZWxzZQotI2Vycm9yIE5lZWQgYSB3YXkgdG8gc3Vz
cGVuZCB0aHJlYWRzIG9uIHRoaXMgcGxhdGZvcm0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5l
IHZvaWQgcmVzdW1lVGhyZWFkKGNvbnN0IFBsYXRmb3JtVGhyZWFkJiBwbGF0Zm9ybVRocmVhZCkK
LXsKLSNpZiBPUyhEQVJXSU4pCi0gICAgdGhyZWFkX3Jlc3VtZShwbGF0Zm9ybVRocmVhZCk7Ci0j
ZWxpZiBPUyhXSU5ET1dTKQotICAgIFJlc3VtZVRocmVhZChwbGF0Zm9ybVRocmVhZCk7Ci0jZWxz
ZQotI2Vycm9yIE5lZWQgYSB3YXkgdG8gcmVzdW1lIHRocmVhZHMgb24gdGhpcyBwbGF0Zm9ybQot
I2VuZGlmCi19Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1c3dvcmRfdDsgLy8gd29yZCBzaXpl
LCBhc3N1bWVkIHRvIGJlIGVpdGhlciAzMiBvciA2NCBiaXQKLQotI2lmIE9TKERBUldJTikKLQot
I2lmIENQVShYODYpCi10eXBlZGVmIGkzODZfdGhyZWFkX3N0YXRlX3QgUGxhdGZvcm1UaHJlYWRS
ZWdpc3RlcnM7Ci0jZWxpZiBDUFUoWDg2XzY0KQotdHlwZWRlZiB4ODZfdGhyZWFkX3N0YXRlNjRf
dCBQbGF0Zm9ybVRocmVhZFJlZ2lzdGVyczsKLSNlbGlmIENQVShQUEMpCi10eXBlZGVmIHBwY190
aHJlYWRfc3RhdGVfdCBQbGF0Zm9ybVRocmVhZFJlZ2lzdGVyczsKLSNlbGlmIENQVShQUEM2NCkK
LXR5cGVkZWYgcHBjX3RocmVhZF9zdGF0ZTY0X3QgUGxhdGZvcm1UaHJlYWRSZWdpc3RlcnM7Ci0j
ZWxpZiBDUFUoQVJNKQotdHlwZWRlZiBhcm1fdGhyZWFkX3N0YXRlX3QgUGxhdGZvcm1UaHJlYWRS
ZWdpc3RlcnM7Ci0jZWxzZQotI2Vycm9yIFVua25vd24gQXJjaGl0ZWN0dXJlCi0jZW5kaWYKLQot
I2VsaWYgT1MoV0lORE9XUykgJiYgQ1BVKFg4NikKLXR5cGVkZWYgQ09OVEVYVCBQbGF0Zm9ybVRo
cmVhZFJlZ2lzdGVyczsKLSNlbHNlCi0jZXJyb3IgTmVlZCBhIHRocmVhZCByZWdpc3RlciBzdHJ1
Y3QgZm9yIHRoaXMgcGxhdGZvcm0KLSNlbmRpZgotCi1zdGF0aWMgc2l6ZV90IGdldFBsYXRmb3Jt
VGhyZWFkUmVnaXN0ZXJzKGNvbnN0IFBsYXRmb3JtVGhyZWFkJiBwbGF0Zm9ybVRocmVhZCwgUGxh
dGZvcm1UaHJlYWRSZWdpc3RlcnMmIHJlZ3MpCi17Ci0jaWYgT1MoREFSV0lOKQotCi0jaWYgQ1BV
KFg4NikKLSAgICB1bnNpZ25lZCB1c2VyX2NvdW50ID0gc2l6ZW9mKHJlZ3MpL3NpemVvZihpbnQp
OwotICAgIHRocmVhZF9zdGF0ZV9mbGF2b3JfdCBmbGF2b3IgPSBpMzg2X1RIUkVBRF9TVEFURTsK
LSNlbGlmIENQVShYODZfNjQpCi0gICAgdW5zaWduZWQgdXNlcl9jb3VudCA9IHg4Nl9USFJFQURf
U1RBVEU2NF9DT1VOVDsKLSAgICB0aHJlYWRfc3RhdGVfZmxhdm9yX3QgZmxhdm9yID0geDg2X1RI
UkVBRF9TVEFURTY0OwotI2VsaWYgQ1BVKFBQQykgCi0gICAgdW5zaWduZWQgdXNlcl9jb3VudCA9
IFBQQ19USFJFQURfU1RBVEVfQ09VTlQ7Ci0gICAgdGhyZWFkX3N0YXRlX2ZsYXZvcl90IGZsYXZv
ciA9IFBQQ19USFJFQURfU1RBVEU7Ci0jZWxpZiBDUFUoUFBDNjQpCi0gICAgdW5zaWduZWQgdXNl
cl9jb3VudCA9IFBQQ19USFJFQURfU1RBVEU2NF9DT1VOVDsKLSAgICB0aHJlYWRfc3RhdGVfZmxh
dm9yX3QgZmxhdm9yID0gUFBDX1RIUkVBRF9TVEFURTY0OwotI2VsaWYgQ1BVKEFSTSkKLSAgICB1
bnNpZ25lZCB1c2VyX2NvdW50ID0gQVJNX1RIUkVBRF9TVEFURV9DT1VOVDsKLSAgICB0aHJlYWRf
c3RhdGVfZmxhdm9yX3QgZmxhdm9yID0gQVJNX1RIUkVBRF9TVEFURTsKLSNlbHNlCi0jZXJyb3Ig
VW5rbm93biBBcmNoaXRlY3R1cmUKLSNlbmRpZgotCi0gICAga2Vybl9yZXR1cm5fdCByZXN1bHQg
PSB0aHJlYWRfZ2V0X3N0YXRlKHBsYXRmb3JtVGhyZWFkLCBmbGF2b3IsICh0aHJlYWRfc3RhdGVf
dCkmcmVncywgJnVzZXJfY291bnQpOwotICAgIGlmIChyZXN1bHQgIT0gS0VSTl9TVUNDRVNTKSB7
Ci0gICAgICAgIFdURlJlcG9ydEZhdGFsRXJyb3IoX19GSUxFX18sIF9fTElORV9fLCBXVEZfUFJF
VFRZX0ZVTkNUSU9OLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmF2YVNjcmlwdCBn
YXJiYWdlIGNvbGxlY3Rpb24gZmFpbGVkIGJlY2F1c2UgdGhyZWFkX2dldF9zdGF0ZSByZXR1cm5l
ZCBhbiBlcnJvciAoJWQpLiBUaGlzIGlzIHByb2JhYmx5IHRoZSByZXN1bHQgb2YgcnVubmluZyBp
bnNpZGUgUm9zZXR0YSwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4iLCByZXN1bHQpOwotICAgICAg
ICBDUkFTSCgpOwotICAgIH0KLSAgICByZXR1cm4gdXNlcl9jb3VudCAqIHNpemVvZih1c3dvcmRf
dCk7Ci0vLyBlbmQgT1MoREFSV0lOKQotCi0jZWxpZiBPUyhXSU5ET1dTKSAmJiBDUFUoWDg2KQot
ICAgIHJlZ3MuQ29udGV4dEZsYWdzID0gQ09OVEVYVF9JTlRFR0VSIHwgQ09OVEVYVF9DT05UUk9M
IHwgQ09OVEVYVF9TRUdNRU5UUzsKLSAgICBHZXRUaHJlYWRDb250ZXh0KHBsYXRmb3JtVGhyZWFk
LCAmcmVncyk7Ci0gICAgcmV0dXJuIHNpemVvZihDT05URVhUKTsKLSNlbHNlCi0jZXJyb3IgTmVl
ZCBhIHdheSB0byBnZXQgdGhyZWFkIHJlZ2lzdGVycyBvbiB0aGlzIHBsYXRmb3JtCi0jZW5kaWYK
LX0KLQotc3RhdGljIGlubGluZSB2b2lkKiBvdGhlclRocmVhZFN0YWNrUG9pbnRlcihjb25zdCBQ
bGF0Zm9ybVRocmVhZFJlZ2lzdGVycyYgcmVncykKLXsKLSNpZiBPUyhEQVJXSU4pCi0KLSNpZiBf
X0RBUldJTl9VTklYMDMKLQotI2lmIENQVShYODYpCi0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nh
c3Q8dm9pZCo+KHJlZ3MuX19lc3ApOwotI2VsaWYgQ1BVKFg4Nl82NCkKLSAgICByZXR1cm4gcmVp
bnRlcnByZXRfY2FzdDx2b2lkKj4ocmVncy5fX3JzcCk7Ci0jZWxpZiBDUFUoUFBDKSB8fCBDUFUo
UFBDNjQpCi0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJlZ3MuX19yMSk7Ci0j
ZWxpZiBDUFUoQVJNKQotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihyZWdzLl9f
c3ApOwotI2Vsc2UKLSNlcnJvciBVbmtub3duIEFyY2hpdGVjdHVyZQotI2VuZGlmCi0KLSNlbHNl
IC8vICFfX0RBUldJTl9VTklYMDMKLQotI2lmIENQVShYODYpCi0gICAgcmV0dXJuIHJlaW50ZXJw
cmV0X2Nhc3Q8dm9pZCo+KHJlZ3MuZXNwKTsKLSNlbGlmIENQVShYODZfNjQpCi0gICAgcmV0dXJu
IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJlZ3MucnNwKTsKLSNlbGlmIENQVShQUEMpIHx8IENQ
VShQUEM2NCkKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocmVncy5yMSk7Ci0j
ZWxzZQotI2Vycm9yIFVua25vd24gQXJjaGl0ZWN0dXJlCi0jZW5kaWYKLQotI2VuZGlmIC8vIF9f
REFSV0lOX1VOSVgwMwotCi0vLyBlbmQgT1MoREFSV0lOKQotI2VsaWYgQ1BVKFg4NikgJiYgT1Mo
V0lORE9XUykKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oKHVpbnRwdHJfdCkg
cmVncy5Fc3ApOwotI2Vsc2UKLSNlcnJvciBOZWVkIGEgd2F5IHRvIGdldCB0aGUgc3RhY2sgcG9p
bnRlciBmb3IgYW5vdGhlciB0aHJlYWQgb24gdGhpcyBwbGF0Zm9ybQotI2VuZGlmCi19Ci0KLXZv
aWQgSGVhcDo6bWFya090aGVyVGhyZWFkQ29uc2VydmF0aXZlbHkoTWFya1N0YWNrJiBtYXJrU3Rh
Y2ssIFRocmVhZCogdGhyZWFkKQotewotICAgIHN1c3BlbmRUaHJlYWQodGhyZWFkLT5wbGF0Zm9y
bVRocmVhZCk7Ci0KLSAgICBQbGF0Zm9ybVRocmVhZFJlZ2lzdGVycyByZWdzOwotICAgIHNpemVf
dCByZWdTaXplID0gZ2V0UGxhdGZvcm1UaHJlYWRSZWdpc3RlcnModGhyZWFkLT5wbGF0Zm9ybVRo
cmVhZCwgcmVncyk7Ci0KLSAgICAvLyBtYXJrIHRoZSB0aHJlYWQncyByZWdpc3RlcnMKLSAgICBt
YXJrQ29uc2VydmF0aXZlbHkobWFya1N0YWNrLCBzdGF0aWNfY2FzdDx2b2lkKj4oJnJlZ3MpLCBz
dGF0aWNfY2FzdDx2b2lkKj4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnJlZ3MpICsgcmVnU2l6
ZSkpOwotICAgIG1hcmtTdGFjay5kcmFpbigpOwotCi0gICAgdm9pZCogc3RhY2tQb2ludGVyID0g
b3RoZXJUaHJlYWRTdGFja1BvaW50ZXIocmVncyk7Ci0gICAgbWFya0NvbnNlcnZhdGl2ZWx5KG1h
cmtTdGFjaywgc3RhY2tQb2ludGVyLCB0aHJlYWQtPnN0YWNrQmFzZSk7Ci0gICAgbWFya1N0YWNr
LmRyYWluKCk7Ci0KLSAgICByZXN1bWVUaHJlYWQodGhyZWFkLT5wbGF0Zm9ybVRocmVhZCk7Ci19
Ci0KLSNlbmRpZgotCi12b2lkIEhlYXA6Om1hcmtTdGFja09iamVjdHNDb25zZXJ2YXRpdmVseShN
YXJrU3RhY2smIG1hcmtTdGFjaykKLXsKLSAgICBtYXJrQ3VycmVudFRocmVhZENvbnNlcnZhdGl2
ZWx5KG1hcmtTdGFjayk7Ci0KLSNpZiBFTkFCTEUoSlNDX01VTFRJUExFX1RIUkVBRFMpCi0KLSAg
ICBpZiAobV9jdXJyZW50VGhyZWFkUmVnaXN0cmFyKSB7Ci0KLSAgICAgICAgTXV0ZXhMb2NrZXIg
bG9jayhtX3JlZ2lzdGVyZWRUaHJlYWRzTXV0ZXgpOwotCi0jaWZuZGVmIE5ERUJVRwotICAgICAg
ICAvLyBGb3JiaWQgbWFsbG9jIGR1cmluZyB0aGUgbWFyayBwaGFzZS4gTWFya2luZyBhIHRocmVh
ZCBzdXNwZW5kcyBpdCwgc28gCi0gICAgICAgIC8vIGEgbWFsbG9jIGluc2lkZSBtYXJrQ2hpbGRy
ZW4oKSB3b3VsZCByaXNrIGEgZGVhZGxvY2sgd2l0aCBhIHRocmVhZCB0aGF0IGhhZCBiZWVuIAot
ICAgICAgICAvLyBzdXNwZW5kZWQgd2hpbGUgaG9sZGluZyB0aGUgbWFsbG9jIGxvY2suCi0gICAg
ICAgIGZhc3RNYWxsb2NGb3JiaWQoKTsKLSNlbmRpZgotICAgICAgICAvLyBJdCBpcyBzYWZlIHRv
IGFjY2VzcyB0aGUgcmVnaXN0ZXJlZFRocmVhZHMgbGlzdCwgYmVjYXVzZSB3ZSBlYXJsaWVyIGFz
c2VydGVkIHRoYXQgbG9ja3MgYXJlIGJlaW5nIGhlbGQsCi0gICAgICAgIC8vIGFuZCBzaW5jZSB0
aGlzIGlzIGEgc2hhcmVkIGhlYXAsIHRoZXkgYXJlIHJlYWwgbG9ja3MuCi0gICAgICAgIGZvciAo
VGhyZWFkKiB0aHJlYWQgPSBtX3JlZ2lzdGVyZWRUaHJlYWRzOyB0aHJlYWQ7IHRocmVhZCA9IHRo
cmVhZC0+bmV4dCkgewotICAgICAgICAgICAgaWYgKCFwdGhyZWFkX2VxdWFsKHRocmVhZC0+cG9z
aXhUaHJlYWQsIHB0aHJlYWRfc2VsZigpKSkKLSAgICAgICAgICAgICAgICBtYXJrT3RoZXJUaHJl
YWRDb25zZXJ2YXRpdmVseShtYXJrU3RhY2ssIHRocmVhZCk7Ci0gICAgICAgIH0KLSNpZm5kZWYg
TkRFQlVHCi0gICAgICAgIGZhc3RNYWxsb2NBbGxvdygpOwotI2VuZGlmCi0gICAgfQotI2VuZGlm
Ci19Ci0KIHZvaWQgSGVhcDo6dXBkYXRlV2Vha0dDSGFuZGxlcygpCiB7CiAgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IG1fd2Vha0dDSGFuZGxlUG9vbHMuc2l6ZSgpOyArK2kpCkBAIC04OTcs
NyArNTMwLDcgQEAgdm9pZCBIZWFwOjptYXJrUm9vdHMoKQogICAgIGNsZWFyTWFya0JpdHMoKTsK
IAogICAgIC8vIE1hcmsgc3RhY2sgcm9vdHMuCi0gICAgbWFya1N0YWNrT2JqZWN0c0NvbnNlcnZh
dGl2ZWx5KG1hcmtTdGFjayk7CisgICAgbV9tYWNoaW5lU3RhY2tNYXJrZXIubWFya01hY2hpbmVT
dGFja0NvbnNlcnZhdGl2ZWx5KG1hcmtTdGFjayk7CiAgICAgbV9nbG9iYWxEYXRhLT5pbnRlcnBy
ZXRlci0+cmVnaXN0ZXJGaWxlKCkubWFya0NhbGxGcmFtZXMobWFya1N0YWNrLCB0aGlzKTsKIAog
ICAgIC8vIE1hcmsgZXhwbGljaXRseSByZWdpc3RlcmVkIHJvb3RzLgpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29sbGVjdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0ph
dmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29sbGVjdG9yLmgJKHJldmlzaW9uIDc1Mjc1KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29sbGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAg
LTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgIkdDSGFuZGxlLmgiCiAjaW5jbHVkZSAiSlNWYWx1
ZS5oIgorI2luY2x1ZGUgIk1hY2hpbmVTdGFja01hcmtlci5oIgogI2luY2x1ZGUgPHN0ZGRlZi5o
PgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHd0Zi9CaXRtYXAuaD4KQEAgLTM2LDEx
ICszNyw2IEBACiAjaW5jbHVkZSA8d3RmL1BhZ2VBbGxvY2F0aW9uQWxpZ25lZC5oPgogI2luY2x1
ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2lu
Y2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KLQotI2lmIEVOQUJMRShKU0NfTVVMVElQTEVfVEhSRUFE
UykKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKIAogI2RlZmluZSBBU1NFUlRfQ0xBU1Nf
RklUU19JTl9DRUxMKGNsYXNzKSBDT01QSUxFX0FTU0VSVChzaXplb2YoY2xhc3MpIDw9IENFTExf
U0laRSwgY2xhc3NfZml0c19pbl9jZWxsKQogCkBAIC04Nyw4ICs4Myw2IEBAIG5hbWVzcGFjZSBK
U0MgewogCiAgICAgY2xhc3MgSGVhcCA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CiAgICAgcHVibGlj
OgotICAgICAgICBjbGFzcyBUaHJlYWQ7Ci0KICAgICAgICAgdm9pZCBkZXN0cm95KCk7CiAKICAg
ICAgICAgdm9pZCogYWxsb2NhdGVOdW1iZXIoc2l6ZV90KTsKQEAgLTEyNyw4ICsxMjEsNiBAQCBu
YW1lc3BhY2UgSlNDIHsKICAgICAgICAgSGFzaENvdW50ZWRTZXQ8Y29uc3QgY2hhcio+KiBwcm90
ZWN0ZWRPYmplY3RUeXBlQ291bnRzKCk7CiAgICAgICAgIEhhc2hDb3VudGVkU2V0PGNvbnN0IGNo
YXIqPiogb2JqZWN0VHlwZUNvdW50cygpOwogCi0gICAgICAgIHZvaWQgcmVnaXN0ZXJUaHJlYWQo
KTsgLy8gT25seSBuZWVkcyB0byBiZSBjYWxsZWQgYnkgY2xpZW50cyB0aGF0IGNhbiB1c2UgdGhl
IHNhbWUgaGVhcCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCi0KICAgICAgICAgc3RhdGljIGJvb2wg
aXNDZWxsTWFya2VkKGNvbnN0IEpTQ2VsbCopOwogICAgICAgICBzdGF0aWMgYm9vbCBjaGVja01h
cmtDZWxsKGNvbnN0IEpTQ2VsbCopOwogICAgICAgICBzdGF0aWMgdm9pZCBtYXJrQ2VsbChKU0Nl
bGwqKTsKQEAgLTE0OCw2ICsxNDAsOCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgTGl2ZU9i
amVjdEl0ZXJhdG9yIHByaW1hcnlIZWFwQmVnaW4oKTsKICAgICAgICAgTGl2ZU9iamVjdEl0ZXJh
dG9yIHByaW1hcnlIZWFwRW5kKCk7CiAKKyAgICAgICAgTWFjaGluZVN0YWNrTWFya2VyJiBtYWNo
aW5lU3RhY2tNYXJrZXIoKSB7IHJldHVybiBtX21hY2hpbmVTdGFja01hcmtlcjsgfQorCiAgICAg
cHJpdmF0ZToKICAgICAgICAgdm9pZCByZXNldCgpOwogICAgICAgICB2b2lkIHN3ZWVwKCk7CkBA
IC0xNzUsMTAgKzE2OSw2IEBAIG5hbWVzcGFjZSBKU0MgewogICAgICAgICB2b2lkIG1hcmtSb290
cygpOwogICAgICAgICB2b2lkIG1hcmtQcm90ZWN0ZWRPYmplY3RzKE1hcmtTdGFjayYpOwogICAg
ICAgICB2b2lkIG1hcmtUZW1wU29ydFZlY3RvcnMoTWFya1N0YWNrJik7Ci0gICAgICAgIHZvaWQg
bWFya0N1cnJlbnRUaHJlYWRDb25zZXJ2YXRpdmVseShNYXJrU3RhY2smKTsKLSAgICAgICAgdm9p
ZCBtYXJrQ3VycmVudFRocmVhZENvbnNlcnZhdGl2ZWx5SW50ZXJuYWwoTWFya1N0YWNrJik7Ci0g
ICAgICAgIHZvaWQgbWFya090aGVyVGhyZWFkQ29uc2VydmF0aXZlbHkoTWFya1N0YWNrJiwgVGhy
ZWFkKik7Ci0gICAgICAgIHZvaWQgbWFya1N0YWNrT2JqZWN0c0NvbnNlcnZhdGl2ZWx5KE1hcmtT
dGFjayYpOwogCiAgICAgICAgIHZvaWQgdXBkYXRlV2Vha0dDSGFuZGxlcygpOwogICAgICAgICBX
ZWFrR0NIYW5kbGVQb29sKiB3ZWFrR0NIYW5kbGVQb29sKHNpemVfdCBpbmRleCk7CkBAIC0xOTUs
MTggKzE4NSw5IEBAIG5hbWVzcGFjZSBKU0MgewogCiAgICAgICAgIE93blB0cjxHQ0FjdGl2aXR5
Q2FsbGJhY2s+IG1fYWN0aXZpdHlDYWxsYmFjazsKIAotI2lmIEVOQUJMRShKU0NfTVVMVElQTEVf
VEhSRUFEUykKLSAgICAgICAgdm9pZCBtYWtlVXNhYmxlRnJvbU11bHRpcGxlVGhyZWFkcygpOwot
Ci0gICAgICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJUaHJlYWQodm9pZCopOwotICAgICAgICB2
b2lkIHVucmVnaXN0ZXJUaHJlYWQoKTsKLQotICAgICAgICBNdXRleCBtX3JlZ2lzdGVyZWRUaHJl
YWRzTXV0ZXg7Ci0gICAgICAgIFRocmVhZCogbV9yZWdpc3RlcmVkVGhyZWFkczsKLSAgICAgICAg
cHRocmVhZF9rZXlfdCBtX2N1cnJlbnRUaHJlYWRSZWdpc3RyYXI7Ci0jZW5kaWYKLQogICAgICAg
ICBKU0dsb2JhbERhdGEqIG1fZ2xvYmFsRGF0YTsKKyAgICAgICAgCisgICAgICAgIE1hY2hpbmVT
dGFja01hcmtlciBtX21hY2hpbmVTdGFja01hcmtlcjsKICAgICB9OwogCiAgICAgLy8gdHVuYWJs
ZSBwYXJhbWV0ZXJzCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2Jh
bERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0ds
b2JhbERhdGEuaAkocmV2aXNpb24gNzUyNzUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9KU0dsb2JhbERhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtMTI4LDcgKzEyOCw3IEBAIG5h
bWVzcGFjZSBKU0MgewogCiAjaWYgRU5BQkxFKEpTQ19NVUxUSVBMRV9USFJFQURTKQogICAgICAg
ICAvLyBXaWxsIHN0YXJ0IHRyYWNraW5nIHRocmVhZHMgdGhhdCB1c2UgdGhlIGhlYXAsIHdoaWNo
IGlzIHJlc291cmNlLWhlYXZ5LgotICAgICAgICB2b2lkIG1ha2VVc2FibGVGcm9tTXVsdGlwbGVU
aHJlYWRzKCkgeyBoZWFwLm1ha2VVc2FibGVGcm9tTXVsdGlwbGVUaHJlYWRzKCk7IH0KKyAgICAg
ICAgdm9pZCBtYWtlVXNhYmxlRnJvbU11bHRpcGxlVGhyZWFkcygpIHsgaGVhcC5tYWNoaW5lU3Rh
Y2tNYXJrZXIoKS5tYWtlVXNhYmxlRnJvbU11bHRpcGxlVGhyZWFkcygpOyB9CiAjZW5kaWYKIAog
ICAgICAgICBHbG9iYWxEYXRhVHlwZSBnbG9iYWxEYXRhVHlwZTsKSW5kZXg6IFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL01hY2hpbmVTdGFja01hcmtlci5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvTWFjaGluZVN0YWNrTWFya2VyLmNwcAkocmV2
aXNpb24gNzUyNzUpCShmcm9tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0NvbGxlY3Rv
ci5jcHA6NzUyNzUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9NYWNoaW5lU3Rh
Y2tNYXJrZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTEwMCBAQAorLyoKKyAqICBD
b3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIENvcHlyaWdodCAoQykgMjAwNyBFcmlj
IFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
IExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdy
aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb2xsZWN0b3IuaCIKKworI2lu
Y2x1ZGUgIkFyZ0xpc3QuaCIKKyNpbmNsdWRlICJDYWxsRnJhbWUuaCIKKyNpbmNsdWRlICJDb2Rl
QmxvY2suaCIKKyNpbmNsdWRlICJDb2xsZWN0b3JIZWFwSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJH
Q0FjdGl2aXR5Q2FsbGJhY2suaCIKKyNpbmNsdWRlICJJbnRlcnByZXRlci5oIgorI2luY2x1ZGUg
IkpTQXJyYXkuaCIKKyNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgorI2luY2x1ZGUgIkpTTG9j
ay5oIgorI2luY2x1ZGUgIkpTT05PYmplY3QuaCIKKyNpbmNsdWRlICJKU1N0cmluZy5oIgorI2lu
Y2x1ZGUgIkpTVmFsdWUuaCIKKyNpbmNsdWRlICJKU1pvbWJpZS5oIgorI2luY2x1ZGUgIk1hcmtT
dGFjay5oIgorI2luY2x1ZGUgIk5vZGVzLmgiCisjaW5jbHVkZSAiVHJhY2luZy5oIgorI2luY2x1
ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4K
KyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgorI2luY2x1
ZGUgPHd0Zi9IYXNoQ291bnRlZFNldC5oPgorI2luY2x1ZGUgPHd0Zi9XVEZUaHJlYWREYXRhLmg+
CisjaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+CisjaW5jbHVkZSA8d3RmL1ZNVGFncy5oPgor
CisjaWYgT1MoREFSV0lOKQorCisjaW5jbHVkZSA8bWFjaC9tYWNoX2luaXQuaD4KKyNpbmNsdWRl
IDxtYWNoL21hY2hfcG9ydC5oPgorI2luY2x1ZGUgPG1hY2gvdGFzay5oPgorI2luY2x1ZGUgPG1h
Y2gvdGhyZWFkX2FjdC5oPgorI2luY2x1ZGUgPG1hY2gvdm1fbWFwLmg+CisKKyNlbGlmIE9TKFdJ
TkRPV1MpCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNl
bGlmIE9TKEhBSUtVKQorCisjaW5jbHVkZSA8T1MuaD4KKworI2VsaWYgT1MoVU5JWCkKKworI2lu
Y2x1ZGUgPHN0ZGxpYi5oPgorI2lmICFPUyhIQUlLVSkKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgor
I2VuZGlmCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZiBPUyhTT0xBUklTKQorI2luY2x1ZGUg
PHRocmVhZC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2lmIEhB
VkUoUFRIUkVBRF9OUF9IKQorI2luY2x1ZGUgPHB0aHJlYWRfbnAuaD4KKyNlbmRpZgorCisjaWYg
T1MoUU5YKQorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgorI2lu
Y2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZgorCisjZW5kaWYKKwor
I2RlZmluZSBDT0xMRUNUX09OX0VWRVJZX0FMTE9DQVRJT04gMAorCit1c2luZyBzdGQ6Om1heDsK
KworbmFtZXNwYWNlIEpTQyB7CisKKy8vIHR1bmFibGUgcGFyYW1ldGVycworCitjb25zdCBzaXpl
X3QgR1JPV1RIX0ZBQ1RPUiA9IDI7Citjb25zdCBzaXplX3QgTE9XX1dBVEVSX0ZBQ1RPUiA9IDQ7
Citjb25zdCBzaXplX3QgQUxMT0NBVElPTlNfUEVSX0NPTExFQ1RJT04gPSAzNjAwOworLy8gVGhp
cyB2YWx1ZSBoYXMgdG8gYmUgYSBtYWNybyB0byBiZSB1c2VkIGluIG1heCgpIHdpdGhvdXQgaW50
cm9kdWNpbmcKKy8vIGEgUElDIGJyYW5jaCBpbiBNYWNoLU8gYmluYXJpZXMsIHNlZSA8cmRhcjov
L3Byb2JsZW0vNTk3MTM5MT4uCisjZGVmaW5lIE1JTl9BUlJBWV9TSVpFIChzdGF0aWNfY2FzdDxz
aXplX3Q+KDE0KSkKKworI2lmIEVOQUJMRShKU0NfTVVMVElQTEVfVEhSRUFEUykKKworI2lmIE9T
KERBUldJTikKK3R5cGVkZWYgbWFjaF9wb3J0X3QgUGxhdGZvcm1UaHJlYWQ7CisjZWxpZiBPUyhX
SU5ET1dTKQordHlwZWRlZiBIQU5ETEUgUGxhdGZvcm1UaHJlYWQ7CisjZW5kaWYKKworY2xhc3Mg
SGVhcDo6VGhyZWFkIHsKK3B1YmxpYzoKKyAgICBUaHJlYWQocHRocmVhZF90IHB0aHJlYWQsIGNv
bnN0IFBsYXRmb3JtVGhyZWFkJiBwbGF0VGhyZWFkLCB2b2lkKiBiYXNlKSAKKyAgICAgICAgOiBw
b3NpeFRocmVhZChwdGhyZWFkKQorICAgICAgICAsIHBsYXRmb3JtVGhyZWFkKHBsYXRUaHJlYWQp
CisgICAgICAgICwgc3RhY2tCYXNlKGJhc2UpCisgICAgeworICAgIH0KKworICAgIFRocmVhZCog
bmV4dDsKKyAgICBwdGhyZWFkX3QgcG9zaXhUaHJlYWQ7CisgICAgUGxhdGZvcm1UaHJlYWQgcGxh
dGZvcm1UaHJlYWQ7CisgICAgdm9pZCogc3RhY2tCYXNlOworfTsKKworI2VuZGlmCisKK0hlYXA6
OkhlYXAoSlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRhKQorICAgIDogbV9tYXJrTGlzdFNldCgwKQor
I2lmIEVOQUJMRShKU0NfTVVMVElQTEVfVEhSRUFEUykKKyAgICAsIG1fcmVnaXN0ZXJlZFRocmVh
ZHMoMCkKKyAgICAsIG1fY3VycmVudFRocmVhZFJlZ2lzdHJhcigwKQorI2VuZGlmCisgICAgLCBt
X2dsb2JhbERhdGEoZ2xvYmFsRGF0YSkKK3sKKyAgICBBU1NFUlQoZ2xvYmFsRGF0YSk7CisgICAg
bWVtc2V0KCZtX2hlYXAsIDAsIHNpemVvZihDb2xsZWN0b3JIZWFwKSk7CisgICAgYWxsb2NhdGVC
bG9jaygpOworICAgIG1fYWN0aXZpdHlDYWxsYmFjayA9IERlZmF1bHRHQ0FjdGl2aXR5Q2FsbGJh
Y2s6OmNyZWF0ZSh0aGlzKTsKKyAgICAoKm1fYWN0aXZpdHlDYWxsYmFjaykoKTsKK30KKworSGVh
cDo6fkhlYXAoKQoreworICAgIC8vIFRoZSBkZXN0cm95IGZ1bmN0aW9uIG11c3QgYWxyZWFkeSBo
YXZlIGJlZW4gY2FsbGVkLCBzbyBhc3NlcnQgdGhpcy4KKyAgICBBU1NFUlQoIW1fZ2xvYmFsRGF0
YSk7Cit9CisKK3ZvaWQgSGVhcDo6ZGVzdHJveSgpCit7CisgICAgSlNMb2NrIGxvY2soU2lsZW5j
ZUFzc2VydGlvbnNPbmx5KTsKKworICAgIGlmICghbV9nbG9iYWxEYXRhKQorICAgICAgICByZXR1
cm47CisKKyAgICBBU1NFUlQoIW1fZ2xvYmFsRGF0YS0+ZHluYW1pY0dsb2JhbE9iamVjdCk7Cisg
ICAgQVNTRVJUKCFpc0J1c3koKSk7CisgICAgCisgICAgLy8gVGhlIGdsb2JhbCBvYmplY3QgaXMg
bm90IEdDIHByb3RlY3RlZCBhdCB0aGlzIHBvaW50LCBzbyBzd2VlcGluZyBtYXkgZGVsZXRlIGl0
CisgICAgLy8gKGFuZCB0aHVzIHRoZSBnbG9iYWwgZGF0YSkgYmVmb3JlIG90aGVyIG9iamVjdHMg
dGhhdCBtYXkgdXNlIHRoZSBnbG9iYWwgZGF0YS4KKyAgICBSZWZQdHI8SlNHbG9iYWxEYXRhPiBw
cm90ZWN0KG1fZ2xvYmFsRGF0YSk7CisKKyAgICBkZWxldGUgbV9tYXJrTGlzdFNldDsKKyAgICBt
X21hcmtMaXN0U2V0ID0gMDsKKworICAgIGZyZWVCbG9ja3MoKTsKKworI2lmIEVOQUJMRShKU0Nf
TVVMVElQTEVfVEhSRUFEUykKKyAgICBpZiAobV9jdXJyZW50VGhyZWFkUmVnaXN0cmFyKSB7Cisg
ICAgICAgIGludCBlcnJvciA9IHB0aHJlYWRfa2V5X2RlbGV0ZShtX2N1cnJlbnRUaHJlYWRSZWdp
c3RyYXIpOworICAgICAgICBBU1NFUlRfVU5VU0VEKGVycm9yLCAhZXJyb3IpOworICAgIH0KKwor
ICAgIE11dGV4TG9ja2VyIHJlZ2lzdGVyZWRUaHJlYWRzTG9jayhtX3JlZ2lzdGVyZWRUaHJlYWRz
TXV0ZXgpOworICAgIGZvciAoSGVhcDo6VGhyZWFkKiB0ID0gbV9yZWdpc3RlcmVkVGhyZWFkczsg
dDspIHsKKyAgICAgICAgSGVhcDo6VGhyZWFkKiBuZXh0ID0gdC0+bmV4dDsKKyAgICAgICAgZGVs
ZXRlIHQ7CisgICAgICAgIHQgPSBuZXh0OworICAgIH0KKyNlbmRpZgorICAgIG1fZ2xvYmFsRGF0
YSA9IDA7Cit9CisKK05FVkVSX0lOTElORSBDb2xsZWN0b3JCbG9jayogSGVhcDo6YWxsb2NhdGVC
bG9jaygpCit7CisgICAgUGFnZUFsbG9jYXRpb25BbGlnbmVkIGFsbG9jYXRpb24gPSBQYWdlQWxs
b2NhdGlvbkFsaWduZWQ6OmFsbG9jYXRlKEJMT0NLX1NJWkUsIEJMT0NLX1NJWkUsIE9TQWxsb2Nh
dG9yOjpKU0dDSGVhcFBhZ2VzKTsKKyAgICBDb2xsZWN0b3JCbG9jayogYmxvY2sgPSBzdGF0aWNf
Y2FzdDxDb2xsZWN0b3JCbG9jayo+KGFsbG9jYXRpb24uYmFzZSgpKTsKKyAgICBpZiAoIWJsb2Nr
KQorICAgICAgICBDUkFTSCgpOworCisgICAgLy8gSW5pdGlhbGl6ZSBibG9jay4KKworICAgIGJs
b2NrLT5oZWFwID0gdGhpczsKKyAgICBjbGVhck1hcmtCaXRzKGJsb2NrKTsKKworICAgIFN0cnVj
dHVyZSogZHVtbXlNYXJrYWJsZUNlbGxTdHJ1Y3R1cmUgPSBtX2dsb2JhbERhdGEtPmR1bW15TWFy
a2FibGVDZWxsU3RydWN0dXJlLmdldCgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgSGVh
cENvbnN0YW50czo6Y2VsbHNQZXJCbG9jazsgKytpKQorICAgICAgICBuZXcgKCZibG9jay0+Y2Vs
bHNbaV0pIEpTQ2VsbChkdW1teU1hcmthYmxlQ2VsbFN0cnVjdHVyZSk7CisgICAgCisgICAgLy8g
QWRkIGJsb2NrIHRvIGJsb2NrcyB2ZWN0b3IuCisKKyAgICBzaXplX3QgbnVtQmxvY2tzID0gbV9o
ZWFwLm51bUJsb2NrczsKKyAgICBpZiAobV9oZWFwLnVzZWRCbG9ja3MgPT0gbnVtQmxvY2tzKSB7
CisgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbWF4TnVtQmxvY2tzID0gVUxPTkdfTUFYIC8g
c2l6ZW9mKFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCkgLyBHUk9XVEhfRkFDVE9SOworICAgICAgICBp
ZiAobnVtQmxvY2tzID4gbWF4TnVtQmxvY2tzKQorICAgICAgICAgICAgQ1JBU0goKTsKKyAgICAg
ICAgbnVtQmxvY2tzID0gbWF4KE1JTl9BUlJBWV9TSVpFLCBudW1CbG9ja3MgKiBHUk9XVEhfRkFD
VE9SKTsKKyAgICAgICAgbV9oZWFwLm51bUJsb2NrcyA9IG51bUJsb2NrczsKKyAgICAgICAgbV9o
ZWFwLmJsb2NrcyA9IHN0YXRpY19jYXN0PFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCo+KGZhc3RSZWFs
bG9jKG1faGVhcC5ibG9ja3MsIG51bUJsb2NrcyAqIHNpemVvZihQYWdlQWxsb2NhdGlvbkFsaWdu
ZWQpKSk7CisgICAgfQorICAgIG1faGVhcC5ibG9ja3NbbV9oZWFwLnVzZWRCbG9ja3MrK10gPSBh
bGxvY2F0aW9uOworCisgICAgcmV0dXJuIGJsb2NrOworfQorCitORVZFUl9JTkxJTkUgdm9pZCBI
ZWFwOjpmcmVlQmxvY2soc2l6ZV90IGJsb2NrKQoreworICAgIG1faGVhcC5kaWRTaHJpbmsgPSB0
cnVlOworCisgICAgT2JqZWN0SXRlcmF0b3IgaXQobV9oZWFwLCBibG9jayk7CisgICAgT2JqZWN0
SXRlcmF0b3IgZW5kKG1faGVhcCwgYmxvY2sgKyAxKTsKKyAgICBmb3IgKCA7IGl0ICE9IGVuZDsg
KytpdCkKKyAgICAgICAgKCppdCktPn5KU0NlbGwoKTsKKyAgICBtX2hlYXAuYmxvY2tzW2Jsb2Nr
XS5kZWFsbG9jYXRlKCk7CisKKyAgICAvLyBzd2FwIHdpdGggdGhlIGxhc3QgYmxvY2sgc28gd2Ug
Y29tcGFjdCBhcyB3ZSBnbworICAgIG1faGVhcC5ibG9ja3NbYmxvY2tdID0gbV9oZWFwLmJsb2Nr
c1ttX2hlYXAudXNlZEJsb2NrcyAtIDFdOworICAgIG1faGVhcC51c2VkQmxvY2tzLS07CisKKyAg
ICBpZiAobV9oZWFwLm51bUJsb2NrcyA+IE1JTl9BUlJBWV9TSVpFICYmIG1faGVhcC51c2VkQmxv
Y2tzIDwgbV9oZWFwLm51bUJsb2NrcyAvIExPV19XQVRFUl9GQUNUT1IpIHsKKyAgICAgICAgbV9o
ZWFwLm51bUJsb2NrcyA9IG1faGVhcC5udW1CbG9ja3MgLyBHUk9XVEhfRkFDVE9SOyAKKyAgICAg
ICAgbV9oZWFwLmJsb2NrcyA9IHN0YXRpY19jYXN0PFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCo+KGZh
c3RSZWFsbG9jKG1faGVhcC5ibG9ja3MsIG1faGVhcC5udW1CbG9ja3MgKiBzaXplb2YoUGFnZUFs
bG9jYXRpb25BbGlnbmVkKSkpOworICAgIH0KK30KKwordm9pZCBIZWFwOjpmcmVlQmxvY2tzKCkK
K3sKKyAgICBQcm90ZWN0Q291bnRTZXQgcHJvdGVjdGVkVmFsdWVzQ29weSA9IG1fcHJvdGVjdGVk
VmFsdWVzOworCisgICAgY2xlYXJNYXJrQml0cygpOworICAgIFByb3RlY3RDb3VudFNldDo6aXRl
cmF0b3IgcHJvdGVjdGVkVmFsdWVzRW5kID0gcHJvdGVjdGVkVmFsdWVzQ29weS5lbmQoKTsKKyAg
ICBmb3IgKFByb3RlY3RDb3VudFNldDo6aXRlcmF0b3IgaXQgPSBwcm90ZWN0ZWRWYWx1ZXNDb3B5
LmJlZ2luKCk7IGl0ICE9IHByb3RlY3RlZFZhbHVlc0VuZDsgKytpdCkKKyAgICAgICAgbWFya0Nl
bGwoaXQtPmZpcnN0KTsKKworICAgIG1faGVhcC5uZXh0Q2VsbCA9IDA7CisgICAgbV9oZWFwLm5l
eHRCbG9jayA9IDA7CisgICAgRGVhZE9iamVjdEl0ZXJhdG9yIGl0KG1faGVhcCwgbV9oZWFwLm5l
eHRCbG9jaywgbV9oZWFwLm5leHRDZWxsKTsKKyAgICBEZWFkT2JqZWN0SXRlcmF0b3IgZW5kKG1f
aGVhcCwgbV9oZWFwLnVzZWRCbG9ja3MpOworICAgIGZvciAoIDsgaXQgIT0gZW5kOyArK2l0KQor
ICAgICAgICAoKml0KS0+fkpTQ2VsbCgpOworCisgICAgQVNTRVJUKCFwcm90ZWN0ZWRPYmplY3RD
b3VudCgpKTsKKworICAgIHByb3RlY3RlZFZhbHVlc0VuZCA9IHByb3RlY3RlZFZhbHVlc0NvcHku
ZW5kKCk7CisgICAgZm9yIChQcm90ZWN0Q291bnRTZXQ6Oml0ZXJhdG9yIGl0ID0gcHJvdGVjdGVk
VmFsdWVzQ29weS5iZWdpbigpOyBpdCAhPSBwcm90ZWN0ZWRWYWx1ZXNFbmQ7ICsraXQpCisgICAg
ICAgIGl0LT5maXJzdC0+fkpTQ2VsbCgpOworCisgICAgZm9yIChzaXplX3QgYmxvY2sgPSAwOyBi
bG9jayA8IG1faGVhcC51c2VkQmxvY2tzOyArK2Jsb2NrKQorICAgICAgICBtX2hlYXAuYmxvY2tz
W2Jsb2NrXS5kZWFsbG9jYXRlKCk7CisKKyAgICBmYXN0RnJlZShtX2hlYXAuYmxvY2tzKTsKKwor
ICAgIG1lbXNldCgmbV9oZWFwLCAwLCBzaXplb2YoQ29sbGVjdG9ySGVhcCkpOworfQorCit2b2lk
IEhlYXA6OnJlY29yZEV4dHJhQ29zdChzaXplX3QgY29zdCkKK3sKKyAgICAvLyBPdXIgZnJlcXVl
bmN5IG9mIGdhcmJhZ2UgY29sbGVjdGlvbiB0cmllcyB0byBiYWxhbmNlIG1lbW9yeSB1c2UgYWdh
aW5zdCBzcGVlZAorICAgIC8vIGJ5IGNvbGxlY3RpbmcgYmFzZWQgb24gdGhlIG51bWJlciBvZiBu
ZXdseSBjcmVhdGVkIHZhbHVlcy4gSG93ZXZlciwgZm9yIHZhbHVlcworICAgIC8vIHRoYXQgaG9s
ZCBvbiB0byBhIGdyZWF0IGRlYWwgb2YgbWVtb3J5IHRoYXQncyBub3QgaW4gdGhlIGZvcm0gb2Yg
b3RoZXIgSlMgdmFsdWVzLAorICAgIC8vIHRoYXQgaXMgbm90IGdvb2QgZW5vdWdoIC0gaW4gc29t
ZSBjYXNlcyBhIGxvdCBvZiB0aG9zZSBvYmplY3RzIGNhbiBwaWxlIHVwIGFuZAorICAgIC8vIHVz
ZSBjcmF6eSBhbW91bnRzIG9mIG1lbW9yeSB3aXRob3V0IGEgR0MgaGFwcGVuaW5nLiBTbyB3ZSB0
cmFjayB0aGVzZSBleHRyYQorICAgIC8vIG1lbW9yeSBjb3N0cy4gT25seSB1bnVzdWFsbHkgbGFy
Z2Ugb2JqZWN0cyBhcmUgbm90ZWQsIGFuZCB3ZSBvbmx5IGtlZXAgdHJhY2sKKyAgICAvLyBvZiB0
aGlzIGV4dHJhIGNvc3QgdW50aWwgdGhlIG5leHQgR0MuIEluIGdhcmJhZ2UgY29sbGVjdGVkIGxh
bmd1YWdlcywgbW9zdCB2YWx1ZXMKKyAgICAvLyBhcmUgZWl0aGVyIHZlcnkgc2hvcnQgbGl2ZWQg
dGVtcG9yYXJpZXMsIG9yIGhhdmUgZXh0cmVtZWx5IGxvbmcgbGlmZXRpbWVzLiBTbworICAgIC8v
IGlmIGEgbGFyZ2UgdmFsdWUgc3Vydml2ZXMgb25lIGdhcmJhZ2UgY29sbGVjdGlvbiwgdGhlcmUg
aXMgbm90IG11Y2ggcG9pbnQgdG8KKyAgICAvLyBjb2xsZWN0aW5nIG1vcmUgZnJlcXVlbnRseSBh
cyBsb25nIGFzIGl0IHN0YXlzIGFsaXZlLgorCisgICAgaWYgKG1faGVhcC5leHRyYUNvc3QgPiBt
YXhFeHRyYUNvc3QgJiYgbV9oZWFwLmV4dHJhQ29zdCA+IG1faGVhcC51c2VkQmxvY2tzICogQkxP
Q0tfU0laRSAvIDIpIHsKKyAgICAgICAgLy8gSWYgdGhlIGxhc3QgaXRlcmF0aW9uIHRocm91Z2gg
dGhlIGhlYXAgZGVhbGxvY2F0ZWQgYmxvY2tzLCB3ZSBuZWVkCisgICAgICAgIC8vIHRvIGNsZWFu
IHVwIHJlbWFpbmluZyBnYXJiYWdlIGJlZm9yZSBtYXJraW5nLiBPdGhlcndpc2UsIHRoZSBjb25z
ZXJ2YXRpdmUKKyAgICAgICAgLy8gbWFya2luZyBtZWNoYW5pc20gbWlnaHQgZm9sbG93IGEgcG9p
bnRlciB0byB1bm1hcHBlZCBtZW1vcnkuCisgICAgICAgIGlmIChtX2hlYXAuZGlkU2hyaW5rKQor
ICAgICAgICAgICAgc3dlZXAoKTsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisgICAgbV9oZWFw
LmV4dHJhQ29zdCArPSBjb3N0OworfQorCit2b2lkKiBIZWFwOjphbGxvY2F0ZShzaXplX3QgcykK
K3sKKyAgICBBU1NFUlQoZ2xvYmFsRGF0YSgpLT5pZGVudGlmaWVyVGFibGUgPT0gd3RmVGhyZWFk
RGF0YSgpLmN1cnJlbnRJZGVudGlmaWVyVGFibGUoKSk7CisgICAgdHlwZWRlZiBIZWFwQ29uc3Rh
bnRzOjpCbG9jayBCbG9jazsKKyAgICB0eXBlZGVmIEhlYXBDb25zdGFudHM6OkNlbGwgQ2VsbDsK
KyAgICAKKyAgICBBU1NFUlQoSlNMb2NrOjpsb2NrQ291bnQoKSA+IDApOworICAgIEFTU0VSVChK
U0xvY2s6OmN1cnJlbnRUaHJlYWRJc0hvbGRpbmdMb2NrKCkpOworICAgIEFTU0VSVF9VTlVTRUQo
cywgcyA8PSBIZWFwQ29uc3RhbnRzOjpjZWxsU2l6ZSk7CisKKyAgICBBU1NFUlQobV9oZWFwLm9w
ZXJhdGlvbkluUHJvZ3Jlc3MgPT0gTm9PcGVyYXRpb24pOworCisjaWYgQ09MTEVDVF9PTl9FVkVS
WV9BTExPQ0FUSU9OCisgICAgY29sbGVjdEFsbEdhcmJhZ2UoKTsKKyAgICBBU1NFUlQobV9oZWFw
Lm9wZXJhdGlvbkluUHJvZ3Jlc3MgPT0gTm9PcGVyYXRpb24pOworI2VuZGlmCisKK2FsbG9jYXRl
OgorCisgICAgLy8gRmFzdCBjYXNlOiBmaW5kIHRoZSBuZXh0IGdhcmJhZ2UgY2VsbCBhbmQgcmVj
eWNsZSBpdC4KKworICAgIGRvIHsKKyAgICAgICAgQVNTRVJUKG1faGVhcC5uZXh0QmxvY2sgPCBt
X2hlYXAudXNlZEJsb2Nrcyk7CisgICAgICAgIEJsb2NrKiBibG9jayA9IG1faGVhcC5jb2xsZWN0
b3JCbG9jayhtX2hlYXAubmV4dEJsb2NrKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgQVNT
RVJUKG1faGVhcC5uZXh0Q2VsbCA8IEhlYXBDb25zdGFudHM6OmNlbGxzUGVyQmxvY2spOworICAg
ICAgICAgICAgaWYgKCFibG9jay0+bWFya2VkLmdldChtX2hlYXAubmV4dENlbGwpKSB7IC8vIEFs
d2F5cyBmYWxzZSBmb3IgdGhlIGxhc3QgY2VsbCBpbiB0aGUgYmxvY2sKKyAgICAgICAgICAgICAg
ICBDZWxsKiBjZWxsID0gJmJsb2NrLT5jZWxsc1ttX2hlYXAubmV4dENlbGxdOworCisgICAgICAg
ICAgICAgICAgbV9oZWFwLm9wZXJhdGlvbkluUHJvZ3Jlc3MgPSBBbGxvY2F0aW9uOworICAgICAg
ICAgICAgICAgIEpTQ2VsbCogaW1wID0gcmVpbnRlcnByZXRfY2FzdDxKU0NlbGwqPihjZWxsKTsK
KyAgICAgICAgICAgICAgICBpbXAtPn5KU0NlbGwoKTsKKyAgICAgICAgICAgICAgICBtX2hlYXAu
b3BlcmF0aW9uSW5Qcm9ncmVzcyA9IE5vT3BlcmF0aW9uOworCisgICAgICAgICAgICAgICAgKytt
X2hlYXAubmV4dENlbGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNlbGw7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBibG9jay0+bWFya2VkLmFkdmFuY2VUb05leHRQb3NzaWJsZUZyZWVD
ZWxsKG1faGVhcC5uZXh0Q2VsbCk7CisgICAgICAgIH0gd2hpbGUgKG1faGVhcC5uZXh0Q2VsbCAh
PSBIZWFwQ29uc3RhbnRzOjpjZWxsc1BlckJsb2NrKTsKKyAgICAgICAgbV9oZWFwLm5leHRDZWxs
ID0gMDsKKyAgICB9IHdoaWxlICgrK21faGVhcC5uZXh0QmxvY2sgIT0gbV9oZWFwLnVzZWRCbG9j
a3MpOworCisgICAgLy8gU2xvdyBjYXNlOiByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGhlYXAuIE1h
cmsgbGl2ZSBvYmplY3RzIGFuZCBzdGFydCBvdmVyLgorCisgICAgcmVzZXQoKTsKKyAgICBnb3Rv
IGFsbG9jYXRlOworfQorCit2b2lkIEhlYXA6OnJlc2l6ZUJsb2NrcygpCit7CisgICAgbV9oZWFw
LmRpZFNocmluayA9IGZhbHNlOworCisgICAgc2l6ZV90IHVzZWRDZWxsQ291bnQgPSBtYXJrZWRD
ZWxscygpOworICAgIHNpemVfdCBtaW5DZWxsQ291bnQgPSB1c2VkQ2VsbENvdW50ICsgbWF4KEFM
TE9DQVRJT05TX1BFUl9DT0xMRUNUSU9OLCB1c2VkQ2VsbENvdW50KTsKKyAgICBzaXplX3QgbWlu
QmxvY2tDb3VudCA9IChtaW5DZWxsQ291bnQgKyBIZWFwQ29uc3RhbnRzOjpjZWxsc1BlckJsb2Nr
IC0gMSkgLyBIZWFwQ29uc3RhbnRzOjpjZWxsc1BlckJsb2NrOworCisgICAgc2l6ZV90IG1heENl
bGxDb3VudCA9IDEuMjVmICogbWluQ2VsbENvdW50OworICAgIHNpemVfdCBtYXhCbG9ja0NvdW50
ID0gKG1heENlbGxDb3VudCArIEhlYXBDb25zdGFudHM6OmNlbGxzUGVyQmxvY2sgLSAxKSAvIEhl
YXBDb25zdGFudHM6OmNlbGxzUGVyQmxvY2s7CisKKyAgICBpZiAobV9oZWFwLnVzZWRCbG9ja3Mg
PCBtaW5CbG9ja0NvdW50KQorICAgICAgICBncm93QmxvY2tzKG1pbkJsb2NrQ291bnQpOworICAg
IGVsc2UgaWYgKG1faGVhcC51c2VkQmxvY2tzID4gbWF4QmxvY2tDb3VudCkKKyAgICAgICAgc2hy
aW5rQmxvY2tzKG1heEJsb2NrQ291bnQpOworfQorCit2b2lkIEhlYXA6Omdyb3dCbG9ja3Moc2l6
ZV90IG5lZWRlZEJsb2NrcykKK3sKKyAgICBBU1NFUlQobV9oZWFwLnVzZWRCbG9ja3MgPCBuZWVk
ZWRCbG9ja3MpOworICAgIHdoaWxlIChtX2hlYXAudXNlZEJsb2NrcyA8IG5lZWRlZEJsb2NrcykK
KyAgICAgICAgYWxsb2NhdGVCbG9jaygpOworfQorCit2b2lkIEhlYXA6OnNocmlua0Jsb2Nrcyhz
aXplX3QgbmVlZGVkQmxvY2tzKQoreworICAgIEFTU0VSVChtX2hlYXAudXNlZEJsb2NrcyA+IG5l
ZWRlZEJsb2Nrcyk7CisgICAgCisgICAgLy8gQ2xlYXIgdGhlIGFsd2F5cy1vbiBsYXN0IGJpdCwg
c28gaXNFbXB0eSgpIGlzbid0IGZvb2xlZCBieSBpdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IG1faGVhcC51c2VkQmxvY2tzOyArK2kpCisgICAgICAgIG1faGVhcC5jb2xsZWN0b3JCbG9j
ayhpKS0+bWFya2VkLmNsZWFyKEhlYXBDb25zdGFudHM6OmNlbGxzUGVyQmxvY2sgLSAxKTsKKwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IG1faGVhcC51c2VkQmxvY2tzICYmIG1faGVhcC51
c2VkQmxvY2tzICE9IG5lZWRlZEJsb2NrczsgKSB7CisgICAgICAgIGlmIChtX2hlYXAuY29sbGVj
dG9yQmxvY2soaSktPm1hcmtlZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZyZWVCbG9jayhp
KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICArK2k7CisgICAgfQorCisgICAgLy8gUmVz
ZXQgdGhlIGFsd2F5cy1vbiBsYXN0IGJpdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1f
aGVhcC51c2VkQmxvY2tzOyArK2kpCisgICAgICAgIG1faGVhcC5jb2xsZWN0b3JCbG9jayhpKS0+
bWFya2VkLnNldChIZWFwQ29uc3RhbnRzOjpjZWxsc1BlckJsb2NrIC0gMSk7Cit9CisKKyNpZiBF
TkFCTEUoSlNDX01VTFRJUExFX1RIUkVBRFMpCisKK3N0YXRpYyBpbmxpbmUgUGxhdGZvcm1UaHJl
YWQgZ2V0Q3VycmVudFBsYXRmb3JtVGhyZWFkKCkKK3sKKyNpZiBPUyhEQVJXSU4pCisgICAgcmV0
dXJuIHB0aHJlYWRfbWFjaF90aHJlYWRfbnAocHRocmVhZF9zZWxmKCkpOworI2VsaWYgT1MoV0lO
RE9XUykKKyAgICByZXR1cm4gcHRocmVhZF9nZXR3MzJ0aHJlYWRoYW5kbGVfbnAocHRocmVhZF9z
ZWxmKCkpOworI2VuZGlmCit9CisKK3ZvaWQgSGVhcDo6bWFrZVVzYWJsZUZyb21NdWx0aXBsZVRo
cmVhZHMoKQoreworICAgIGlmIChtX2N1cnJlbnRUaHJlYWRSZWdpc3RyYXIpCisgICAgICAgIHJl
dHVybjsKKworICAgIGludCBlcnJvciA9IHB0aHJlYWRfa2V5X2NyZWF0ZSgmbV9jdXJyZW50VGhy
ZWFkUmVnaXN0cmFyLCB1bnJlZ2lzdGVyVGhyZWFkKTsKKyAgICBpZiAoZXJyb3IpCisgICAgICAg
IENSQVNIKCk7Cit9CisKK3ZvaWQgSGVhcDo6cmVnaXN0ZXJUaHJlYWQoKQoreworICAgIEFTU0VS
VCghbV9nbG9iYWxEYXRhLT5leGNsdXNpdmVUaHJlYWQgfHwgbV9nbG9iYWxEYXRhLT5leGNsdXNp
dmVUaHJlYWQgPT0gY3VycmVudFRocmVhZCgpKTsKKworICAgIGlmICghbV9jdXJyZW50VGhyZWFk
UmVnaXN0cmFyIHx8IHB0aHJlYWRfZ2V0c3BlY2lmaWMobV9jdXJyZW50VGhyZWFkUmVnaXN0cmFy
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhtX2N1cnJlbnRU
aHJlYWRSZWdpc3RyYXIsIHRoaXMpOworICAgIEhlYXA6OlRocmVhZCogdGhyZWFkID0gbmV3IEhl
YXA6OlRocmVhZChwdGhyZWFkX3NlbGYoKSwgZ2V0Q3VycmVudFBsYXRmb3JtVGhyZWFkKCksIG1f
Z2xvYmFsRGF0YS0+c3RhY2soKS5vcmlnaW4oKSk7CisKKyAgICBNdXRleExvY2tlciBsb2NrKG1f
cmVnaXN0ZXJlZFRocmVhZHNNdXRleCk7CisKKyAgICB0aHJlYWQtPm5leHQgPSBtX3JlZ2lzdGVy
ZWRUaHJlYWRzOworICAgIG1fcmVnaXN0ZXJlZFRocmVhZHMgPSB0aHJlYWQ7Cit9CisKK3ZvaWQg
SGVhcDo6dW5yZWdpc3RlclRocmVhZCh2b2lkKiBwKQoreworICAgIGlmIChwKQorICAgICAgICBz
dGF0aWNfY2FzdDxIZWFwKj4ocCktPnVucmVnaXN0ZXJUaHJlYWQoKTsKK30KKwordm9pZCBIZWFw
Ojp1bnJlZ2lzdGVyVGhyZWFkKCkKK3sKKyAgICBwdGhyZWFkX3QgY3VycmVudFBvc2l4VGhyZWFk
ID0gcHRocmVhZF9zZWxmKCk7CisKKyAgICBNdXRleExvY2tlciBsb2NrKG1fcmVnaXN0ZXJlZFRo
cmVhZHNNdXRleCk7CisKKyAgICBpZiAocHRocmVhZF9lcXVhbChjdXJyZW50UG9zaXhUaHJlYWQs
IG1fcmVnaXN0ZXJlZFRocmVhZHMtPnBvc2l4VGhyZWFkKSkgeworICAgICAgICBUaHJlYWQqIHQg
PSBtX3JlZ2lzdGVyZWRUaHJlYWRzOworICAgICAgICBtX3JlZ2lzdGVyZWRUaHJlYWRzID0gbV9y
ZWdpc3RlcmVkVGhyZWFkcy0+bmV4dDsKKyAgICAgICAgZGVsZXRlIHQ7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgSGVhcDo6VGhyZWFkKiBsYXN0ID0gbV9yZWdpc3RlcmVkVGhyZWFkczsKKyAgICAg
ICAgSGVhcDo6VGhyZWFkKiB0OworICAgICAgICBmb3IgKHQgPSBtX3JlZ2lzdGVyZWRUaHJlYWRz
LT5uZXh0OyB0OyB0ID0gdC0+bmV4dCkgeworICAgICAgICAgICAgaWYgKHB0aHJlYWRfZXF1YWwo
dC0+cG9zaXhUaHJlYWQsIGN1cnJlbnRQb3NpeFRocmVhZCkpIHsKKyAgICAgICAgICAgICAgICBs
YXN0LT5uZXh0ID0gdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGxhc3QgPSB0OworICAgICAgICB9CisgICAgICAgIEFTU0VSVCh0KTsg
Ly8gSWYgdCBpcyBOVUxMLCB3ZSBuZXZlciBmb3VuZCBvdXJzZWx2ZXMgaW4gdGhlIGxpc3QuCisg
ICAgICAgIGRlbGV0ZSB0OworICAgIH0KK30KKworI2Vsc2UgLy8gRU5BQkxFKEpTQ19NVUxUSVBM
RV9USFJFQURTKQorCit2b2lkIEhlYXA6OnJlZ2lzdGVyVGhyZWFkKCkKK3sKK30KKworI2VuZGlm
CisKK2lubGluZSBib29sIGlzUG9pbnRlckFsaWduZWQodm9pZCogcCkKK3sKKyAgICByZXR1cm4g
KCgoaW50cHRyX3QpKHApICYgKHNpemVvZihjaGFyKikgLSAxKSkgPT0gMCk7Cit9CisKKy8vIENl
bGwgc2l6ZSBuZWVkcyB0byBiZSBhIHBvd2VyIG9mIHR3byBmb3IgaXNQb3NzaWJsZUNlbGwgdG8g
YmUgdmFsaWQuCitDT01QSUxFX0FTU0VSVChzaXplb2YoQ29sbGVjdG9yQ2VsbCkgJSAyID09IDAs
IENvbGxlY3Rvcl9jZWxsX3NpemVfaXNfcG93ZXJfb2ZfdHdvKTsKKworc3RhdGljIGlubGluZSBi
b29sIGlzQ2VsbEFsaWduZWQodm9pZCAqcCkKK3sKKyAgICByZXR1cm4gKCgoaW50cHRyX3QpKHAp
ICYgQ0VMTF9NQVNLKSA9PSAwKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzUG9zc2libGVD
ZWxsKHZvaWQqIHApCit7CisgICAgcmV0dXJuIGlzQ2VsbEFsaWduZWQocCkgJiYgcDsKK30KKwor
dm9pZCBIZWFwOjptYXJrQ29uc2VydmF0aXZlbHkoTWFya1N0YWNrJiBtYXJrU3RhY2ssIHZvaWQq
IHN0YXJ0LCB2b2lkKiBlbmQpCit7CisjaWYgT1MoV0lOQ0UpCisgICAgaWYgKHN0YXJ0ID4gZW5k
KSB7CisgICAgICAgIHZvaWQqIHRtcCA9IHN0YXJ0OworICAgICAgICBzdGFydCA9IGVuZDsKKyAg
ICAgICAgZW5kID0gdG1wOworICAgIH0KKyNlbHNlCisgICAgQVNTRVJUKHN0YXJ0IDw9IGVuZCk7
CisjZW5kaWYKKworICAgIEFTU0VSVCgoc3RhdGljX2Nhc3Q8Y2hhcio+KGVuZCkgLSBzdGF0aWNf
Y2FzdDxjaGFyKj4oc3RhcnQpKSA8IDB4MTAwMDAwMCk7CisgICAgQVNTRVJUKGlzUG9pbnRlckFs
aWduZWQoc3RhcnQpKTsKKyAgICBBU1NFUlQoaXNQb2ludGVyQWxpZ25lZChlbmQpKTsKKworICAg
IGNoYXIqKiBwID0gc3RhdGljX2Nhc3Q8Y2hhcioqPihzdGFydCk7CisgICAgY2hhcioqIGUgPSBz
dGF0aWNfY2FzdDxjaGFyKio+KGVuZCk7CisKKyAgICB3aGlsZSAocCAhPSBlKSB7CisgICAgICAg
IGNoYXIqIHggPSAqcCsrOworICAgICAgICBpZiAoaXNQb3NzaWJsZUNlbGwoeCkpIHsKKyAgICAg
ICAgICAgIHNpemVfdCB1c2VkQmxvY2tzOworICAgICAgICAgICAgdWludHB0cl90IHhBc0JpdHMg
PSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oeCk7CisgICAgICAgICAgICB4QXNCaXRzICY9
IENFTExfQUxJR05fTUFTSzsKKworICAgICAgICAgICAgdWludHB0cl90IG9mZnNldCA9IHhBc0Jp
dHMgJiBCTE9DS19PRkZTRVRfTUFTSzsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBsYXN0Q2Vs
bE9mZnNldCA9IHNpemVvZihDb2xsZWN0b3JDZWxsKSAqIChDRUxMU19QRVJfQkxPQ0sgLSAxKTsK
KyAgICAgICAgICAgIGlmIChvZmZzZXQgPiBsYXN0Q2VsbE9mZnNldCkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKworICAgICAgICAgICAgQ29sbGVjdG9yQmxvY2sqIGJsb2NrQWRkciA9IHJl
aW50ZXJwcmV0X2Nhc3Q8Q29sbGVjdG9yQmxvY2sqPih4QXNCaXRzIC0gb2Zmc2V0KTsKKyAgICAg
ICAgICAgIHVzZWRCbG9ja3MgPSBtX2hlYXAudXNlZEJsb2NrczsKKyAgICAgICAgICAgIGZvciAo
c2l6ZV90IGJsb2NrID0gMDsgYmxvY2sgPCB1c2VkQmxvY2tzOyBibG9jaysrKSB7CisgICAgICAg
ICAgICAgICAgaWYgKG1faGVhcC5jb2xsZWN0b3JCbG9jayhibG9jaykgIT0gYmxvY2tBZGRyKQor
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBtYXJrU3RhY2su
YXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8SlNDZWxsKj4oeEFzQml0cykpOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIE5FVkVSX0lOTElORSBIZWFwOjptYXJrQ3Vy
cmVudFRocmVhZENvbnNlcnZhdGl2ZWx5SW50ZXJuYWwoTWFya1N0YWNrJiBtYXJrU3RhY2spCit7
CisgICAgbWFya0NvbnNlcnZhdGl2ZWx5KG1hcmtTdGFjaywgbV9nbG9iYWxEYXRhLT5zdGFjaygp
LmN1cnJlbnQoKSwgbV9nbG9iYWxEYXRhLT5zdGFjaygpLm9yaWdpbigpKTsKKyAgICBtYXJrU3Rh
Y2suZHJhaW4oKTsKK30KKworI2lmIENPTVBJTEVSKEdDQykKKyNkZWZpbmUgUkVHSVNURVJfQlVG
RkVSX0FMSUdOTUVOVCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoc2l6ZW9mKHZvaWQqKSkpKQor
I2Vsc2UKKyNkZWZpbmUgUkVHSVNURVJfQlVGRkVSX0FMSUdOTUVOVAorI2VuZGlmCisKK3ZvaWQg
SGVhcDo6bWFya0N1cnJlbnRUaHJlYWRDb25zZXJ2YXRpdmVseShNYXJrU3RhY2smIG1hcmtTdGFj
aykKK3sKKyAgICAvLyBzZXRqbXAgZm9yY2VzIHZvbGF0aWxlIHJlZ2lzdGVycyBvbnRvIHRoZSBz
dGFjaworICAgIGptcF9idWYgcmVnaXN0ZXJzIFJFR0lTVEVSX0JVRkZFUl9BTElHTk1FTlQ7Cisj
aWYgQ09NUElMRVIoTVNWQykKKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5n
KGRpc2FibGU6IDQ2MTEpCisjZW5kaWYKKyAgICBzZXRqbXAocmVnaXN0ZXJzKTsKKyNpZiBDT01Q
SUxFUihNU1ZDKQorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZgorCisgICAgbWFya0N1cnJl
bnRUaHJlYWRDb25zZXJ2YXRpdmVseUludGVybmFsKG1hcmtTdGFjayk7Cit9CisKKyNpZiBFTkFC
TEUoSlNDX01VTFRJUExFX1RIUkVBRFMpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdXNwZW5kVGhy
ZWFkKGNvbnN0IFBsYXRmb3JtVGhyZWFkJiBwbGF0Zm9ybVRocmVhZCkKK3sKKyNpZiBPUyhEQVJX
SU4pCisgICAgdGhyZWFkX3N1c3BlbmQocGxhdGZvcm1UaHJlYWQpOworI2VsaWYgT1MoV0lORE9X
UykKKyAgICBTdXNwZW5kVGhyZWFkKHBsYXRmb3JtVGhyZWFkKTsKKyNlbHNlCisjZXJyb3IgTmVl
ZCBhIHdheSB0byBzdXNwZW5kIHRocmVhZHMgb24gdGhpcyBwbGF0Zm9ybQorI2VuZGlmCit9CisK
K3N0YXRpYyBpbmxpbmUgdm9pZCByZXN1bWVUaHJlYWQoY29uc3QgUGxhdGZvcm1UaHJlYWQmIHBs
YXRmb3JtVGhyZWFkKQoreworI2lmIE9TKERBUldJTikKKyAgICB0aHJlYWRfcmVzdW1lKHBsYXRm
b3JtVGhyZWFkKTsKKyNlbGlmIE9TKFdJTkRPV1MpCisgICAgUmVzdW1lVGhyZWFkKHBsYXRmb3Jt
VGhyZWFkKTsKKyNlbHNlCisjZXJyb3IgTmVlZCBhIHdheSB0byByZXN1bWUgdGhyZWFkcyBvbiB0
aGlzIHBsYXRmb3JtCisjZW5kaWYKK30KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVzd29yZF90
OyAvLyB3b3JkIHNpemUsIGFzc3VtZWQgdG8gYmUgZWl0aGVyIDMyIG9yIDY0IGJpdAorCisjaWYg
T1MoREFSV0lOKQorCisjaWYgQ1BVKFg4NikKK3R5cGVkZWYgaTM4Nl90aHJlYWRfc3RhdGVfdCBQ
bGF0Zm9ybVRocmVhZFJlZ2lzdGVyczsKKyNlbGlmIENQVShYODZfNjQpCit0eXBlZGVmIHg4Nl90
aHJlYWRfc3RhdGU2NF90IFBsYXRmb3JtVGhyZWFkUmVnaXN0ZXJzOworI2VsaWYgQ1BVKFBQQykK
K3R5cGVkZWYgcHBjX3RocmVhZF9zdGF0ZV90IFBsYXRmb3JtVGhyZWFkUmVnaXN0ZXJzOworI2Vs
aWYgQ1BVKFBQQzY0KQordHlwZWRlZiBwcGNfdGhyZWFkX3N0YXRlNjRfdCBQbGF0Zm9ybVRocmVh
ZFJlZ2lzdGVyczsKKyNlbGlmIENQVShBUk0pCit0eXBlZGVmIGFybV90aHJlYWRfc3RhdGVfdCBQ
bGF0Zm9ybVRocmVhZFJlZ2lzdGVyczsKKyNlbHNlCisjZXJyb3IgVW5rbm93biBBcmNoaXRlY3R1
cmUKKyNlbmRpZgorCisjZWxpZiBPUyhXSU5ET1dTKSAmJiBDUFUoWDg2KQordHlwZWRlZiBDT05U
RVhUIFBsYXRmb3JtVGhyZWFkUmVnaXN0ZXJzOworI2Vsc2UKKyNlcnJvciBOZWVkIGEgdGhyZWFk
IHJlZ2lzdGVyIHN0cnVjdCBmb3IgdGhpcyBwbGF0Zm9ybQorI2VuZGlmCisKK3N0YXRpYyBzaXpl
X3QgZ2V0UGxhdGZvcm1UaHJlYWRSZWdpc3RlcnMoY29uc3QgUGxhdGZvcm1UaHJlYWQmIHBsYXRm
b3JtVGhyZWFkLCBQbGF0Zm9ybVRocmVhZFJlZ2lzdGVycyYgcmVncykKK3sKKyNpZiBPUyhEQVJX
SU4pCisKKyNpZiBDUFUoWDg2KQorICAgIHVuc2lnbmVkIHVzZXJfY291bnQgPSBzaXplb2YocmVn
cykvc2l6ZW9mKGludCk7CisgICAgdGhyZWFkX3N0YXRlX2ZsYXZvcl90IGZsYXZvciA9IGkzODZf
VEhSRUFEX1NUQVRFOworI2VsaWYgQ1BVKFg4Nl82NCkKKyAgICB1bnNpZ25lZCB1c2VyX2NvdW50
ID0geDg2X1RIUkVBRF9TVEFURTY0X0NPVU5UOworICAgIHRocmVhZF9zdGF0ZV9mbGF2b3JfdCBm
bGF2b3IgPSB4ODZfVEhSRUFEX1NUQVRFNjQ7CisjZWxpZiBDUFUoUFBDKSAKKyAgICB1bnNpZ25l
ZCB1c2VyX2NvdW50ID0gUFBDX1RIUkVBRF9TVEFURV9DT1VOVDsKKyAgICB0aHJlYWRfc3RhdGVf
Zmxhdm9yX3QgZmxhdm9yID0gUFBDX1RIUkVBRF9TVEFURTsKKyNlbGlmIENQVShQUEM2NCkKKyAg
ICB1bnNpZ25lZCB1c2VyX2NvdW50ID0gUFBDX1RIUkVBRF9TVEFURTY0X0NPVU5UOworICAgIHRo
cmVhZF9zdGF0ZV9mbGF2b3JfdCBmbGF2b3IgPSBQUENfVEhSRUFEX1NUQVRFNjQ7CisjZWxpZiBD
UFUoQVJNKQorICAgIHVuc2lnbmVkIHVzZXJfY291bnQgPSBBUk1fVEhSRUFEX1NUQVRFX0NPVU5U
OworICAgIHRocmVhZF9zdGF0ZV9mbGF2b3JfdCBmbGF2b3IgPSBBUk1fVEhSRUFEX1NUQVRFOwor
I2Vsc2UKKyNlcnJvciBVbmtub3duIEFyY2hpdGVjdHVyZQorI2VuZGlmCisKKyAgICBrZXJuX3Jl
dHVybl90IHJlc3VsdCA9IHRocmVhZF9nZXRfc3RhdGUocGxhdGZvcm1UaHJlYWQsIGZsYXZvciwg
KHRocmVhZF9zdGF0ZV90KSZyZWdzLCAmdXNlcl9jb3VudCk7CisgICAgaWYgKHJlc3VsdCAhPSBL
RVJOX1NVQ0NFU1MpIHsKKyAgICAgICAgV1RGUmVwb3J0RmF0YWxFcnJvcihfX0ZJTEVfXywgX19M
SU5FX18sIFdURl9QUkVUVFlfRlVOQ1RJT04sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJKYXZhU2NyaXB0IGdhcmJhZ2UgY29sbGVjdGlvbiBmYWlsZWQgYmVjYXVzZSB0aHJlYWRfZ2V0
X3N0YXRlIHJldHVybmVkIGFuIGVycm9yICglZCkuIFRoaXMgaXMgcHJvYmFibHkgdGhlIHJlc3Vs
dCBvZiBydW5uaW5nIGluc2lkZSBSb3NldHRhLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkLiIsIHJl
c3VsdCk7CisgICAgICAgIENSQVNIKCk7CisgICAgfQorICAgIHJldHVybiB1c2VyX2NvdW50ICog
c2l6ZW9mKHVzd29yZF90KTsKKy8vIGVuZCBPUyhEQVJXSU4pCisKKyNlbGlmIE9TKFdJTkRPV1Mp
ICYmIENQVShYODYpCisgICAgcmVncy5Db250ZXh0RmxhZ3MgPSBDT05URVhUX0lOVEVHRVIgfCBD
T05URVhUX0NPTlRST0wgfCBDT05URVhUX1NFR01FTlRTOworICAgIEdldFRocmVhZENvbnRleHQo
cGxhdGZvcm1UaHJlYWQsICZyZWdzKTsKKyAgICByZXR1cm4gc2l6ZW9mKENPTlRFWFQpOworI2Vs
c2UKKyNlcnJvciBOZWVkIGEgd2F5IHRvIGdldCB0aHJlYWQgcmVnaXN0ZXJzIG9uIHRoaXMgcGxh
dGZvcm0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQqIG90aGVyVGhyZWFkU3RhY2tQ
b2ludGVyKGNvbnN0IFBsYXRmb3JtVGhyZWFkUmVnaXN0ZXJzJiByZWdzKQoreworI2lmIE9TKERB
UldJTikKKworI2lmIF9fREFSV0lOX1VOSVgwMworCisjaWYgQ1BVKFg4NikKKyAgICByZXR1cm4g
cmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocmVncy5fX2VzcCk7CisjZWxpZiBDUFUoWDg2XzY0KQor
ICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPihyZWdzLl9fcnNwKTsKKyNlbGlmIENQ
VShQUEMpIHx8IENQVShQUEM2NCkKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4o
cmVncy5fX3IxKTsKKyNlbGlmIENQVShBUk0pCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8
dm9pZCo+KHJlZ3MuX19zcCk7CisjZWxzZQorI2Vycm9yIFVua25vd24gQXJjaGl0ZWN0dXJlCisj
ZW5kaWYKKworI2Vsc2UgLy8gIV9fREFSV0lOX1VOSVgwMworCisjaWYgQ1BVKFg4NikKKyAgICBy
ZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocmVncy5lc3ApOworI2VsaWYgQ1BVKFg4Nl82
NCkKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocmVncy5yc3ApOworI2VsaWYg
Q1BVKFBQQykgfHwgQ1BVKFBQQzY0KQorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQq
PihyZWdzLnIxKTsKKyNlbHNlCisjZXJyb3IgVW5rbm93biBBcmNoaXRlY3R1cmUKKyNlbmRpZgor
CisjZW5kaWYgLy8gX19EQVJXSU5fVU5JWDAzCisKKy8vIGVuZCBPUyhEQVJXSU4pCisjZWxpZiBD
UFUoWDg2KSAmJiBPUyhXSU5ET1dTKQorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQq
PigodWludHB0cl90KSByZWdzLkVzcCk7CisjZWxzZQorI2Vycm9yIE5lZWQgYSB3YXkgdG8gZ2V0
IHRoZSBzdGFjayBwb2ludGVyIGZvciBhbm90aGVyIHRocmVhZCBvbiB0aGlzIHBsYXRmb3JtCisj
ZW5kaWYKK30KKwordm9pZCBIZWFwOjptYXJrT3RoZXJUaHJlYWRDb25zZXJ2YXRpdmVseShNYXJr
U3RhY2smIG1hcmtTdGFjaywgVGhyZWFkKiB0aHJlYWQpCit7CisgICAgc3VzcGVuZFRocmVhZCh0
aHJlYWQtPnBsYXRmb3JtVGhyZWFkKTsKKworICAgIFBsYXRmb3JtVGhyZWFkUmVnaXN0ZXJzIHJl
Z3M7CisgICAgc2l6ZV90IHJlZ1NpemUgPSBnZXRQbGF0Zm9ybVRocmVhZFJlZ2lzdGVycyh0aHJl
YWQtPnBsYXRmb3JtVGhyZWFkLCByZWdzKTsKKworICAgIC8vIG1hcmsgdGhlIHRocmVhZCdzIHJl
Z2lzdGVycworICAgIG1hcmtDb25zZXJ2YXRpdmVseShtYXJrU3RhY2ssIHN0YXRpY19jYXN0PHZv
aWQqPigmcmVncyksIHN0YXRpY19jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PGNoYXIqPigm
cmVncykgKyByZWdTaXplKSk7CisgICAgbWFya1N0YWNrLmRyYWluKCk7CisKKyAgICB2b2lkKiBz
dGFja1BvaW50ZXIgPSBvdGhlclRocmVhZFN0YWNrUG9pbnRlcihyZWdzKTsKKyAgICBtYXJrQ29u
c2VydmF0aXZlbHkobWFya1N0YWNrLCBzdGFja1BvaW50ZXIsIHRocmVhZC0+c3RhY2tCYXNlKTsK
KyAgICBtYXJrU3RhY2suZHJhaW4oKTsKKworICAgIHJlc3VtZVRocmVhZCh0aHJlYWQtPnBsYXRm
b3JtVGhyZWFkKTsKK30KKworI2VuZGlmCisKK3ZvaWQgSGVhcDo6bWFya1N0YWNrT2JqZWN0c0Nv
bnNlcnZhdGl2ZWx5KE1hcmtTdGFjayYgbWFya1N0YWNrKQoreworICAgIG1hcmtDdXJyZW50VGhy
ZWFkQ29uc2VydmF0aXZlbHkobWFya1N0YWNrKTsKKworI2lmIEVOQUJMRShKU0NfTVVMVElQTEVf
VEhSRUFEUykKKworICAgIGlmIChtX2N1cnJlbnRUaHJlYWRSZWdpc3RyYXIpIHsKKworICAgICAg
ICBNdXRleExvY2tlciBsb2NrKG1fcmVnaXN0ZXJlZFRocmVhZHNNdXRleCk7CisKKyNpZm5kZWYg
TkRFQlVHCisgICAgICAgIC8vIEZvcmJpZCBtYWxsb2MgZHVyaW5nIHRoZSBtYXJrIHBoYXNlLiBN
YXJraW5nIGEgdGhyZWFkIHN1c3BlbmRzIGl0LCBzbyAKKyAgICAgICAgLy8gYSBtYWxsb2MgaW5z
aWRlIG1hcmtDaGlsZHJlbigpIHdvdWxkIHJpc2sgYSBkZWFkbG9jayB3aXRoIGEgdGhyZWFkIHRo
YXQgaGFkIGJlZW4gCisgICAgICAgIC8vIHN1c3BlbmRlZCB3aGlsZSBob2xkaW5nIHRoZSBtYWxs
b2MgbG9jay4KKyAgICAgICAgZmFzdE1hbGxvY0ZvcmJpZCgpOworI2VuZGlmCisgICAgICAgIC8v
IEl0IGlzIHNhZmUgdG8gYWNjZXNzIHRoZSByZWdpc3RlcmVkVGhyZWFkcyBsaXN0LCBiZWNhdXNl
IHdlIGVhcmxpZXIgYXNzZXJ0ZWQgdGhhdCBsb2NrcyBhcmUgYmVpbmcgaGVsZCwKKyAgICAgICAg
Ly8gYW5kIHNpbmNlIHRoaXMgaXMgYSBzaGFyZWQgaGVhcCwgdGhleSBhcmUgcmVhbCBsb2Nrcy4K
KyAgICAgICAgZm9yIChUaHJlYWQqIHRocmVhZCA9IG1fcmVnaXN0ZXJlZFRocmVhZHM7IHRocmVh
ZDsgdGhyZWFkID0gdGhyZWFkLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoIXB0aHJlYWRfZXF1
YWwodGhyZWFkLT5wb3NpeFRocmVhZCwgcHRocmVhZF9zZWxmKCkpKQorICAgICAgICAgICAgICAg
IG1hcmtPdGhlclRocmVhZENvbnNlcnZhdGl2ZWx5KG1hcmtTdGFjaywgdGhyZWFkKTsKKyAgICAg
ICAgfQorI2lmbmRlZiBOREVCVUcKKyAgICAgICAgZmFzdE1hbGxvY0FsbG93KCk7CisjZW5kaWYK
KyAgICB9CisjZW5kaWYKK30KKwordm9pZCBIZWFwOjp1cGRhdGVXZWFrR0NIYW5kbGVzKCkKK3sK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV93ZWFrR0NIYW5kbGVQb29scy5zaXplKCk7
ICsraSkKKyAgICAgICAgd2Vha0dDSGFuZGxlUG9vbChpKS0+dXBkYXRlKCk7Cit9CisKK3ZvaWQg
V2Vha0dDSGFuZGxlUG9vbDo6dXBkYXRlKCkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBp
IDwgV2Vha0dDSGFuZGxlUG9vbDo6bnVtUG9vbEVudHJpZXM7ICsraSkgeworICAgICAgICBpZiAo
bV9lbnRyaWVzW2ldLmlzVmFsaWRQdHIoKSkgeworICAgICAgICAgICAgSlNDZWxsKiBjZWxsID0g
bV9lbnRyaWVzW2ldLmdldCgpOworICAgICAgICAgICAgaWYgKCFjZWxsIHx8ICFIZWFwOjppc0Nl
bGxNYXJrZWQoY2VsbCkpCisgICAgICAgICAgICAgICAgbV9lbnRyaWVzW2ldLmludmFsaWRhdGUo
KTsKKyAgICAgICAgfQorICAgIH0KK30KKworV2Vha0dDSGFuZGxlKiBIZWFwOjphZGRXZWFrR0NI
YW5kbGUoSlNDZWxsKiBwdHIpCit7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1fd2Vh
a0dDSGFuZGxlUG9vbHMuc2l6ZSgpOyArK2kpCisgICAgICAgIGlmICghd2Vha0dDSGFuZGxlUG9v
bChpKS0+aXNGdWxsKCkpCisgICAgICAgICAgICByZXR1cm4gd2Vha0dDSGFuZGxlUG9vbChpKS0+
YWxsb2NhdGUocHRyKTsKKworICAgIFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCBhbGxvY2F0aW9uID0g
UGFnZUFsbG9jYXRpb25BbGlnbmVkOjphbGxvY2F0ZShXZWFrR0NIYW5kbGVQb29sOjpwb29sU2l6
ZSwgV2Vha0dDSGFuZGxlUG9vbDo6cG9vbFNpemUsIE9TQWxsb2NhdG9yOjpKU0dDSGVhcFBhZ2Vz
KTsKKyAgICBtX3dlYWtHQ0hhbmRsZVBvb2xzLmFwcGVuZChhbGxvY2F0aW9uKTsKKworICAgIFdl
YWtHQ0hhbmRsZVBvb2wqIHBvb2wgPSBuZXcgKGFsbG9jYXRpb24uYmFzZSgpKSBXZWFrR0NIYW5k
bGVQb29sKCk7CisgICAgcmV0dXJuIHBvb2wtPmFsbG9jYXRlKHB0cik7Cit9CisKK3ZvaWQgSGVh
cDo6cHJvdGVjdChKU1ZhbHVlIGspCit7CisgICAgQVNTRVJUKGspOworICAgIEFTU0VSVChKU0xv
Y2s6OmN1cnJlbnRUaHJlYWRJc0hvbGRpbmdMb2NrKCkgfHwgIW1fZ2xvYmFsRGF0YS0+aXNTaGFy
ZWRJbnN0YW5jZSgpKTsKKworICAgIGlmICghay5pc0NlbGwoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9wcm90ZWN0ZWRWYWx1ZXMuYWRkKGsuYXNDZWxsKCkpOworfQorCitib29sIEhlYXA6
OnVucHJvdGVjdChKU1ZhbHVlIGspCit7CisgICAgQVNTRVJUKGspOworICAgIEFTU0VSVChKU0xv
Y2s6OmN1cnJlbnRUaHJlYWRJc0hvbGRpbmdMb2NrKCkgfHwgIW1fZ2xvYmFsRGF0YS0+aXNTaGFy
ZWRJbnN0YW5jZSgpKTsKKworICAgIGlmICghay5pc0NlbGwoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgcmV0dXJuIG1fcHJvdGVjdGVkVmFsdWVzLnJlbW92ZShrLmFzQ2VsbCgpKTsK
K30KKwordm9pZCBIZWFwOjptYXJrUHJvdGVjdGVkT2JqZWN0cyhNYXJrU3RhY2smIG1hcmtTdGFj
aykKK3sKKyAgICBQcm90ZWN0Q291bnRTZXQ6Oml0ZXJhdG9yIGVuZCA9IG1fcHJvdGVjdGVkVmFs
dWVzLmVuZCgpOworICAgIGZvciAoUHJvdGVjdENvdW50U2V0OjppdGVyYXRvciBpdCA9IG1fcHJv
dGVjdGVkVmFsdWVzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBtYXJrU3Rh
Y2suYXBwZW5kKGl0LT5maXJzdCk7CisgICAgICAgIG1hcmtTdGFjay5kcmFpbigpOworICAgIH0K
K30KKwordm9pZCBIZWFwOjpwdXNoVGVtcFNvcnRWZWN0b3IoVmVjdG9yPFZhbHVlU3RyaW5nUGFp
cj4qIHRlbXBWZWN0b3IpCit7CisgICAgbV90ZW1wU29ydGluZ1ZlY3RvcnMuYXBwZW5kKHRlbXBW
ZWN0b3IpOworfQorCit2b2lkIEhlYXA6OnBvcFRlbXBTb3J0VmVjdG9yKFZlY3RvcjxWYWx1ZVN0
cmluZ1BhaXI+KiB0ZW1wVmVjdG9yKQoreworICAgIEFTU0VSVF9VTlVTRUQodGVtcFZlY3Rvciwg
dGVtcFZlY3RvciA9PSBtX3RlbXBTb3J0aW5nVmVjdG9ycy5sYXN0KCkpOworICAgIG1fdGVtcFNv
cnRpbmdWZWN0b3JzLnJlbW92ZUxhc3QoKTsKK30KKyAgICAKK3ZvaWQgSGVhcDo6bWFya1RlbXBT
b3J0VmVjdG9ycyhNYXJrU3RhY2smIG1hcmtTdGFjaykKK3sKKyAgICB0eXBlZGVmIFZlY3RvcjxW
ZWN0b3I8VmFsdWVTdHJpbmdQYWlyPiogPiBWZWN0b3JPZlZhbHVlU3RyaW5nVmVjdG9yczsKKwor
ICAgIFZlY3Rvck9mVmFsdWVTdHJpbmdWZWN0b3JzOjppdGVyYXRvciBlbmQgPSBtX3RlbXBTb3J0
aW5nVmVjdG9ycy5lbmQoKTsKKyAgICBmb3IgKFZlY3Rvck9mVmFsdWVTdHJpbmdWZWN0b3JzOjpp
dGVyYXRvciBpdCA9IG1fdGVtcFNvcnRpbmdWZWN0b3JzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkgeworICAgICAgICBWZWN0b3I8VmFsdWVTdHJpbmdQYWlyPiogdGVtcFNvcnRpbmdWZWN0b3Ig
PSAqaXQ7CisKKyAgICAgICAgVmVjdG9yPFZhbHVlU3RyaW5nUGFpcj46Oml0ZXJhdG9yIHZlY3Rv
ckVuZCA9IHRlbXBTb3J0aW5nVmVjdG9yLT5lbmQoKTsKKyAgICAgICAgZm9yIChWZWN0b3I8VmFs
dWVTdHJpbmdQYWlyPjo6aXRlcmF0b3IgdmVjdG9ySXQgPSB0ZW1wU29ydGluZ1ZlY3Rvci0+YmVn
aW4oKTsgdmVjdG9ySXQgIT0gdmVjdG9yRW5kOyArK3ZlY3Rvckl0KQorICAgICAgICAgICAgaWYg
KHZlY3Rvckl0LT5maXJzdCkKKyAgICAgICAgICAgICAgICBtYXJrU3RhY2suYXBwZW5kKHZlY3Rv
ckl0LT5maXJzdCk7CisgICAgICAgIG1hcmtTdGFjay5kcmFpbigpOworICAgIH0KK30KKyAgICAK
K3ZvaWQgSGVhcDo6Y2xlYXJNYXJrQml0cygpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtX2hlYXAudXNlZEJsb2NrczsgKytpKQorICAgICAgICBjbGVhck1hcmtCaXRzKG1faGVhcC5j
b2xsZWN0b3JCbG9jayhpKSk7Cit9CisKK3ZvaWQgSGVhcDo6Y2xlYXJNYXJrQml0cyhDb2xsZWN0
b3JCbG9jayogYmxvY2spCit7CisgICAgLy8gYWxsb2NhdGUgYXNzdW1lcyB0aGF0IHRoZSBsYXN0
IGNlbGwgaW4gZXZlcnkgYmxvY2sgaXMgbWFya2VkLgorICAgIGJsb2NrLT5tYXJrZWQuY2xlYXJB
bGwoKTsKKyAgICBibG9jay0+bWFya2VkLnNldChIZWFwQ29uc3RhbnRzOjpjZWxsc1BlckJsb2Nr
IC0gMSk7Cit9CisKK3NpemVfdCBIZWFwOjptYXJrZWRDZWxscyhzaXplX3Qgc3RhcnRCbG9jaywg
c2l6ZV90IHN0YXJ0Q2VsbCkgY29uc3QKK3sKKyAgICBBU1NFUlQoc3RhcnRCbG9jayA8PSBtX2hl
YXAudXNlZEJsb2Nrcyk7CisgICAgQVNTRVJUKHN0YXJ0Q2VsbCA8IEhlYXBDb25zdGFudHM6OmNl
bGxzUGVyQmxvY2spOworCisgICAgaWYgKHN0YXJ0QmxvY2sgPj0gbV9oZWFwLnVzZWRCbG9ja3Mp
CisgICAgICAgIHJldHVybiAwOworCisgICAgc2l6ZV90IHJlc3VsdCA9IDA7CisgICAgcmVzdWx0
ICs9IG1faGVhcC5jb2xsZWN0b3JCbG9jayhzdGFydEJsb2NrKS0+bWFya2VkLmNvdW50KHN0YXJ0
Q2VsbCk7CisgICAgZm9yIChzaXplX3QgaSA9IHN0YXJ0QmxvY2sgKyAxOyBpIDwgbV9oZWFwLnVz
ZWRCbG9ja3M7ICsraSkKKyAgICAgICAgcmVzdWx0ICs9IG1faGVhcC5jb2xsZWN0b3JCbG9jayhp
KS0+bWFya2VkLmNvdW50KCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEhlYXA6
OnN3ZWVwKCkKK3sKKyAgICBBU1NFUlQobV9oZWFwLm9wZXJhdGlvbkluUHJvZ3Jlc3MgPT0gTm9P
cGVyYXRpb24pOworICAgIGlmIChtX2hlYXAub3BlcmF0aW9uSW5Qcm9ncmVzcyAhPSBOb09wZXJh
dGlvbikKKyAgICAgICAgQ1JBU0goKTsKKyAgICBtX2hlYXAub3BlcmF0aW9uSW5Qcm9ncmVzcyA9
IENvbGxlY3Rpb247CisgICAgCisjaWYgIUVOQUJMRShKU0NfWk9NQklFUykKKyAgICBTdHJ1Y3R1
cmUqIGR1bW15TWFya2FibGVDZWxsU3RydWN0dXJlID0gbV9nbG9iYWxEYXRhLT5kdW1teU1hcmth
YmxlQ2VsbFN0cnVjdHVyZS5nZXQoKTsKKyNlbmRpZgorCisgICAgRGVhZE9iamVjdEl0ZXJhdG9y
IGl0KG1faGVhcCwgbV9oZWFwLm5leHRCbG9jaywgbV9oZWFwLm5leHRDZWxsKTsKKyAgICBEZWFk
T2JqZWN0SXRlcmF0b3IgZW5kKG1faGVhcCwgbV9oZWFwLnVzZWRCbG9ja3MpOworICAgIGZvciAo
IDsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIEpTQ2VsbCogY2VsbCA9ICppdDsKKyNpZiBF
TkFCTEUoSlNDX1pPTUJJRVMpCisgICAgICAgIGlmICghY2VsbC0+aXNab21iaWUoKSkgeworICAg
ICAgICAgICAgY29uc3QgQ2xhc3NJbmZvKiBpbmZvID0gY2VsbC0+Y2xhc3NJbmZvKCk7CisgICAg
ICAgICAgICBjZWxsLT5+SlNDZWxsKCk7CisgICAgICAgICAgICBuZXcgKGNlbGwpIEpTWm9tYmll
KGluZm8sIEpTWm9tYmllOjpsZWFrZWRab21iaWVTdHJ1Y3R1cmUoKSk7CisgICAgICAgICAgICBI
ZWFwOjptYXJrQ2VsbChjZWxsKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgY2VsbC0+fkpT
Q2VsbCgpOworICAgICAgICAvLyBDYWxsZXJzIG9mIHN3ZWVwIGFzc3VtZSBpdCdzIHNhZmUgdG8g
bWFyayBhbnkgY2VsbCBpbiB0aGUgaGVhcC4KKyAgICAgICAgbmV3IChjZWxsKSBKU0NlbGwoZHVt
bXlNYXJrYWJsZUNlbGxTdHJ1Y3R1cmUpOworI2VuZGlmCisgICAgfQorCisgICAgbV9oZWFwLm9w
ZXJhdGlvbkluUHJvZ3Jlc3MgPSBOb09wZXJhdGlvbjsKK30KKwordm9pZCBIZWFwOjptYXJrUm9v
dHMoKQoreworI2lmbmRlZiBOREVCVUcKKyAgICBpZiAobV9nbG9iYWxEYXRhLT5pc1NoYXJlZElu
c3RhbmNlKCkpIHsKKyAgICAgICAgQVNTRVJUKEpTTG9jazo6bG9ja0NvdW50KCkgPiAwKTsKKyAg
ICAgICAgQVNTRVJUKEpTTG9jazo6Y3VycmVudFRocmVhZElzSG9sZGluZ0xvY2soKSk7CisgICAg
fQorI2VuZGlmCisKKyAgICBBU1NFUlQobV9oZWFwLm9wZXJhdGlvbkluUHJvZ3Jlc3MgPT0gTm9P
cGVyYXRpb24pOworICAgIGlmIChtX2hlYXAub3BlcmF0aW9uSW5Qcm9ncmVzcyAhPSBOb09wZXJh
dGlvbikKKyAgICAgICAgQ1JBU0goKTsKKworICAgIG1faGVhcC5vcGVyYXRpb25JblByb2dyZXNz
ID0gQ29sbGVjdGlvbjsKKworICAgIE1hcmtTdGFjayYgbWFya1N0YWNrID0gbV9nbG9iYWxEYXRh
LT5tYXJrU3RhY2s7CisKKyAgICAvLyBSZXNldCBtYXJrIGJpdHMuCisgICAgY2xlYXJNYXJrQml0
cygpOworCisgICAgLy8gTWFyayBzdGFjayByb290cy4KKyAgICBtYXJrU3RhY2tPYmplY3RzQ29u
c2VydmF0aXZlbHkobWFya1N0YWNrKTsKKyAgICBtX2dsb2JhbERhdGEtPmludGVycHJldGVyLT5y
ZWdpc3RlckZpbGUoKS5tYXJrQ2FsbEZyYW1lcyhtYXJrU3RhY2ssIHRoaXMpOworCisgICAgLy8g
TWFyayBleHBsaWNpdGx5IHJlZ2lzdGVyZWQgcm9vdHMuCisgICAgbWFya1Byb3RlY3RlZE9iamVj
dHMobWFya1N0YWNrKTsKKyAgICAKKyAgICAvLyBNYXJrIHRlbXBvcmFyeSB2ZWN0b3IgZm9yIEFy
cmF5IHNvcnRpbmcKKyAgICBtYXJrVGVtcFNvcnRWZWN0b3JzKG1hcmtTdGFjayk7CisKKyAgICAv
LyBNYXJrIG1pc2MuIG90aGVyIHJvb3RzLgorICAgIGlmIChtX21hcmtMaXN0U2V0ICYmIG1fbWFy
a0xpc3RTZXQtPnNpemUoKSkKKyAgICAgICAgTWFya2VkQXJndW1lbnRCdWZmZXI6Om1hcmtMaXN0
cyhtYXJrU3RhY2ssICptX21hcmtMaXN0U2V0KTsKKyAgICBpZiAobV9nbG9iYWxEYXRhLT5leGNl
cHRpb24pCisgICAgICAgIG1hcmtTdGFjay5hcHBlbmQobV9nbG9iYWxEYXRhLT5leGNlcHRpb24p
OworICAgIGlmIChtX2dsb2JhbERhdGEtPmZpcnN0U3RyaW5naWZpZXJUb01hcmspCisgICAgICAg
IEpTT05PYmplY3Q6Om1hcmtTdHJpbmdpZmllcnMobWFya1N0YWNrLCBtX2dsb2JhbERhdGEtPmZp
cnN0U3RyaW5naWZpZXJUb01hcmspOworCisgICAgLy8gTWFyayB0aGUgc21hbGwgc3RyaW5ncyBj
YWNoZSBsYXN0LCBzaW5jZSBpdCB3aWxsIGNsZWFyIGl0c2VsZiBpZiBub3RoaW5nCisgICAgLy8g
ZWxzZSBoYXMgbWFya2VkIGl0LgorICAgIG1fZ2xvYmFsRGF0YS0+c21hbGxTdHJpbmdzLm1hcmtD
aGlsZHJlbihtYXJrU3RhY2spOworCisgICAgbWFya1N0YWNrLmRyYWluKCk7CisgICAgbWFya1N0
YWNrLmNvbXBhY3QoKTsKKworICAgIHVwZGF0ZVdlYWtHQ0hhbmRsZXMoKTsKKworICAgIG1faGVh
cC5vcGVyYXRpb25JblByb2dyZXNzID0gTm9PcGVyYXRpb247Cit9CisKK3NpemVfdCBIZWFwOjpv
YmplY3RDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faGVhcC5uZXh0QmxvY2sgKiBIZWFw
Q29uc3RhbnRzOjpjZWxsc1BlckJsb2NrIC8vIGFsbG9jYXRlZCBmdWxsIGJsb2NrcworICAgICAg
ICAgICArIG1faGVhcC5uZXh0Q2VsbCAvLyBhbGxvY2F0ZWQgY2VsbHMgaW4gY3VycmVudCBibG9j
aworICAgICAgICAgICArIG1hcmtlZENlbGxzKG1faGVhcC5uZXh0QmxvY2ssIG1faGVhcC5uZXh0
Q2VsbCkgLy8gbWFya2VkIGNlbGxzIGluIHJlbWFpbmRlciBvZiBtX2hlYXAKKyAgICAgICAgICAg
LSBtX2hlYXAudXNlZEJsb2NrczsgLy8gMSBjZWxsIHBlciBibG9jayBpcyBhIGR1bW15IHNlbnRp
bmVsCit9CisKK3ZvaWQgSGVhcDo6YWRkVG9TdGF0aXN0aWNzKEhlYXA6OlN0YXRpc3RpY3MmIHN0
YXRpc3RpY3MpIGNvbnN0Cit7CisgICAgc3RhdGlzdGljcy5zaXplICs9IG1faGVhcC51c2VkQmxv
Y2tzICogQkxPQ0tfU0laRTsKKyAgICBzdGF0aXN0aWNzLmZyZWUgKz0gbV9oZWFwLnVzZWRCbG9j
a3MgKiBCTE9DS19TSVpFIC0gKG9iamVjdENvdW50KCkgKiBIZWFwQ29uc3RhbnRzOjpjZWxsU2l6
ZSk7Cit9CisKK0hlYXA6OlN0YXRpc3RpY3MgSGVhcDo6c3RhdGlzdGljcygpIGNvbnN0Cit7Cisg
ICAgU3RhdGlzdGljcyBzdGF0aXN0aWNzID0geyAwLCAwIH07CisgICAgYWRkVG9TdGF0aXN0aWNz
KHN0YXRpc3RpY3MpOworICAgIHJldHVybiBzdGF0aXN0aWNzOworfQorCitzaXplX3QgSGVhcDo6
c2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faGVhcC51c2VkQmxvY2tzICogQkxPQ0tfU0la
RTsKK30KKworc2l6ZV90IEhlYXA6Omdsb2JhbE9iamVjdENvdW50KCkKK3sKKyAgICBzaXplX3Qg
Y291bnQgPSAwOworICAgIGlmIChKU0dsb2JhbE9iamVjdCogaGVhZCA9IG1fZ2xvYmFsRGF0YS0+
aGVhZCkgeworICAgICAgICBKU0dsb2JhbE9iamVjdCogbyA9IGhlYWQ7CisgICAgICAgIGRvIHsK
KyAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgICAgICBvID0gby0+bmV4dCgpOworICAgICAg
ICB9IHdoaWxlIChvICE9IGhlYWQpOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3Np
emVfdCBIZWFwOjpwcm90ZWN0ZWRHbG9iYWxPYmplY3RDb3VudCgpCit7CisgICAgc2l6ZV90IGNv
dW50ID0gMDsKKyAgICBpZiAoSlNHbG9iYWxPYmplY3QqIGhlYWQgPSBtX2dsb2JhbERhdGEtPmhl
YWQpIHsKKyAgICAgICAgSlNHbG9iYWxPYmplY3QqIG8gPSBoZWFkOworICAgICAgICBkbyB7Cisg
ICAgICAgICAgICBpZiAobV9wcm90ZWN0ZWRWYWx1ZXMuY29udGFpbnMobykpCisgICAgICAgICAg
ICAgICAgKytjb3VudDsKKyAgICAgICAgICAgIG8gPSBvLT5uZXh0KCk7CisgICAgICAgIH0gd2hp
bGUgKG8gIT0gaGVhZCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCitzaXplX3Qg
SGVhcDo6cHJvdGVjdGVkT2JqZWN0Q291bnQoKQoreworICAgIHJldHVybiBtX3Byb3RlY3RlZFZh
bHVlcy5zaXplKCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiB0eXBlTmFtZShKU0NlbGwqIGNl
bGwpCit7CisgICAgaWYgKGNlbGwtPmlzU3RyaW5nKCkpCisgICAgICAgIHJldHVybiAic3RyaW5n
IjsKKyAgICBpZiAoY2VsbC0+aXNHZXR0ZXJTZXR0ZXIoKSkKKyAgICAgICAgcmV0dXJuICJHZXR0
ZXItU2V0dGVyIjsKKyAgICBpZiAoY2VsbC0+aXNBUElWYWx1ZVdyYXBwZXIoKSkKKyAgICAgICAg
cmV0dXJuICJBUEkgd3JhcHBlciI7CisgICAgaWYgKGNlbGwtPmlzUHJvcGVydHlOYW1lSXRlcmF0
b3IoKSkKKyAgICAgICAgcmV0dXJuICJGb3ItaW4gaXRlcmF0b3IiOworICAgIGlmICghY2VsbC0+
aXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuICJbZW1wdHkgY2VsbF0iOworICAgIGNvbnN0IENs
YXNzSW5mbyogaW5mbyA9IGNlbGwtPmNsYXNzSW5mbygpOworICAgIHJldHVybiBpbmZvID8gaW5m
by0+Y2xhc3NOYW1lIDogIk9iamVjdCI7Cit9CisKK0hhc2hDb3VudGVkU2V0PGNvbnN0IGNoYXIq
PiogSGVhcDo6cHJvdGVjdGVkT2JqZWN0VHlwZUNvdW50cygpCit7CisgICAgSGFzaENvdW50ZWRT
ZXQ8Y29uc3QgY2hhcio+KiBjb3VudHMgPSBuZXcgSGFzaENvdW50ZWRTZXQ8Y29uc3QgY2hhcio+
OworCisgICAgUHJvdGVjdENvdW50U2V0OjppdGVyYXRvciBlbmQgPSBtX3Byb3RlY3RlZFZhbHVl
cy5lbmQoKTsKKyAgICBmb3IgKFByb3RlY3RDb3VudFNldDo6aXRlcmF0b3IgaXQgPSBtX3Byb3Rl
Y3RlZFZhbHVlcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIGNvdW50cy0+YWRk
KHR5cGVOYW1lKGl0LT5maXJzdCkpOworCisgICAgcmV0dXJuIGNvdW50czsKK30KKworSGFzaENv
dW50ZWRTZXQ8Y29uc3QgY2hhcio+KiBIZWFwOjpvYmplY3RUeXBlQ291bnRzKCkKK3sKKyAgICBI
YXNoQ291bnRlZFNldDxjb25zdCBjaGFyKj4qIGNvdW50cyA9IG5ldyBIYXNoQ291bnRlZFNldDxj
b25zdCBjaGFyKj47CisKKyAgICBMaXZlT2JqZWN0SXRlcmF0b3IgaXQgPSBwcmltYXJ5SGVhcEJl
Z2luKCk7CisgICAgTGl2ZU9iamVjdEl0ZXJhdG9yIGhlYXBFbmQgPSBwcmltYXJ5SGVhcEVuZCgp
OworICAgIGZvciAoIDsgaXQgIT0gaGVhcEVuZDsgKytpdCkKKyAgICAgICAgY291bnRzLT5hZGQo
dHlwZU5hbWUoKml0KSk7CisKKyAgICByZXR1cm4gY291bnRzOworfQorCitib29sIEhlYXA6Omlz
QnVzeSgpCit7CisgICAgcmV0dXJuIG1faGVhcC5vcGVyYXRpb25JblByb2dyZXNzICE9IE5vT3Bl
cmF0aW9uOworfQorCit2b2lkIEhlYXA6OnJlc2V0KCkKK3sKKyAgICBBU1NFUlQoZ2xvYmFsRGF0
YSgpLT5pZGVudGlmaWVyVGFibGUgPT0gd3RmVGhyZWFkRGF0YSgpLmN1cnJlbnRJZGVudGlmaWVy
VGFibGUoKSk7CisgICAgSkFWQVNDUklQVENPUkVfR0NfQkVHSU4oKTsKKworICAgIG1hcmtSb290
cygpOworCisgICAgSkFWQVNDUklQVENPUkVfR0NfTUFSS0VEKCk7CisKKyAgICBtX2hlYXAubmV4
dENlbGwgPSAwOworICAgIG1faGVhcC5uZXh0QmxvY2sgPSAwOworICAgIG1faGVhcC5uZXh0TnVt
YmVyID0gMDsKKyAgICBtX2hlYXAuZXh0cmFDb3N0ID0gMDsKKyNpZiBFTkFCTEUoSlNDX1pPTUJJ
RVMpCisgICAgc3dlZXAoKTsKKyNlbmRpZgorICAgIHJlc2l6ZUJsb2NrcygpOworCisgICAgSkFW
QVNDUklQVENPUkVfR0NfRU5EKCk7CisKKyAgICAoKm1fYWN0aXZpdHlDYWxsYmFjaykoKTsKK30K
Kwordm9pZCBIZWFwOjpjb2xsZWN0QWxsR2FyYmFnZSgpCit7CisgICAgQVNTRVJUKGdsb2JhbERh
dGEoKS0+aWRlbnRpZmllclRhYmxlID09IHd0ZlRocmVhZERhdGEoKS5jdXJyZW50SWRlbnRpZmll
clRhYmxlKCkpOworICAgIEpBVkFTQ1JJUFRDT1JFX0dDX0JFR0lOKCk7CisKKyAgICAvLyBJZiB0
aGUgbGFzdCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgaGVhcCBkZWFsbG9jYXRlZCBibG9ja3MsIHdl
IG5lZWQKKyAgICAvLyB0byBjbGVhbiB1cCByZW1haW5pbmcgZ2FyYmFnZSBiZWZvcmUgbWFya2lu
Zy4gT3RoZXJ3aXNlLCB0aGUgY29uc2VydmF0aXZlCisgICAgLy8gbWFya2luZyBtZWNoYW5pc20g
bWlnaHQgZm9sbG93IGEgcG9pbnRlciB0byB1bm1hcHBlZCBtZW1vcnkuCisgICAgaWYgKG1faGVh
cC5kaWRTaHJpbmspCisgICAgICAgIHN3ZWVwKCk7CisKKyAgICBtYXJrUm9vdHMoKTsKKworICAg
IEpBVkFTQ1JJUFRDT1JFX0dDX01BUktFRCgpOworCisgICAgbV9oZWFwLm5leHRDZWxsID0gMDsK
KyAgICBtX2hlYXAubmV4dEJsb2NrID0gMDsKKyAgICBtX2hlYXAubmV4dE51bWJlciA9IDA7Cisg
ICAgbV9oZWFwLmV4dHJhQ29zdCA9IDA7CisgICAgc3dlZXAoKTsKKyAgICByZXNpemVCbG9ja3Mo
KTsKKworICAgIEpBVkFTQ1JJUFRDT1JFX0dDX0VORCgpOworfQorCitMaXZlT2JqZWN0SXRlcmF0
b3IgSGVhcDo6cHJpbWFyeUhlYXBCZWdpbigpCit7CisgICAgcmV0dXJuIExpdmVPYmplY3RJdGVy
YXRvcihtX2hlYXAsIDApOworfQorCitMaXZlT2JqZWN0SXRlcmF0b3IgSGVhcDo6cHJpbWFyeUhl
YXBFbmQoKQoreworICAgIHJldHVybiBMaXZlT2JqZWN0SXRlcmF0b3IobV9oZWFwLCBtX2hlYXAu
dXNlZEJsb2Nrcyk7Cit9CisKK3ZvaWQgSGVhcDo6c2V0QWN0aXZpdHlDYWxsYmFjayhQYXNzT3du
UHRyPEdDQWN0aXZpdHlDYWxsYmFjaz4gYWN0aXZpdHlDYWxsYmFjaykKK3sKKyAgICBtX2FjdGl2
aXR5Q2FsbGJhY2sgPSBhY3Rpdml0eUNhbGxiYWNrOworfQorCitHQ0FjdGl2aXR5Q2FsbGJhY2sq
IEhlYXA6OmFjdGl2aXR5Q2FsbGJhY2soKQoreworICAgIHJldHVybiBtX2FjdGl2aXR5Q2FsbGJh
Y2suZ2V0KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIEpTQwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvTWFjaGluZVN0YWNrTWFya2VyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9NYWNoaW5lU3RhY2tNYXJrZXIuY3BwCShyZXZpc2lv
biA3NTI3NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01hY2hpbmVTdGFja01h
cmtlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE5LDMzICsxOSwxMyBAQAogICovCiAKICNpbmNs
dWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJDb2xsZWN0b3IuaCIKKyNpbmNsdWRlICJNYWNoaW5l
U3RhY2tNYXJrZXIuaCIKIAotI2luY2x1ZGUgIkFyZ0xpc3QuaCIKLSNpbmNsdWRlICJDYWxsRnJh
bWUuaCIKLSNpbmNsdWRlICJDb2RlQmxvY2suaCIKLSNpbmNsdWRlICJDb2xsZWN0b3JIZWFwSXRl
cmF0b3IuaCIKLSNpbmNsdWRlICJHQ0FjdGl2aXR5Q2FsbGJhY2suaCIKLSNpbmNsdWRlICJJbnRl
cnByZXRlci5oIgorI2luY2x1ZGUgIkNvbGxlY3Rvci5oIgogI2luY2x1ZGUgIkpTQXJyYXkuaCIK
LSNpbmNsdWRlICJKU0dsb2JhbE9iamVjdC5oIgotI2luY2x1ZGUgIkpTTG9jay5oIgotI2luY2x1
ZGUgIkpTT05PYmplY3QuaCIKLSNpbmNsdWRlICJKU1N0cmluZy5oIgotI2luY2x1ZGUgIkpTVmFs
dWUuaCIKLSNpbmNsdWRlICJKU1pvbWJpZS5oIgotI2luY2x1ZGUgIk1hcmtTdGFjay5oIgotI2lu
Y2x1ZGUgIk5vZGVzLmgiCi0jaW5jbHVkZSAiVHJhY2luZy5oIgotI2luY2x1ZGUgPGFsZ29yaXRo
bT4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJKU0dsb2JhbERhdGEuaCIKICNpbmNs
dWRlIDxzZXRqbXAuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx3dGYvRmFzdE1h
bGxvYy5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoQ291bnRlZFNldC5oPgotI2luY2x1ZGUgPHd0Zi9X
VEZUaHJlYWREYXRhLmg+Ci0jaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+Ci0jaW5jbHVkZSA8
d3RmL1ZNVGFncy5oPgogCiAjaWYgT1MoREFSV0lOKQogCkBAIC05MSwyMSArNzEsOCBAQAogCiAj
ZW5kaWYKIAotI2RlZmluZSBDT0xMRUNUX09OX0VWRVJZX0FMTE9DQVRJT04gMAotCi11c2luZyBz
dGQ6Om1heDsKLQogbmFtZXNwYWNlIEpTQyB7CiAKLS8vIHR1bmFibGUgcGFyYW1ldGVycwotCi1j
b25zdCBzaXplX3QgR1JPV1RIX0ZBQ1RPUiA9IDI7Ci1jb25zdCBzaXplX3QgTE9XX1dBVEVSX0ZB
Q1RPUiA9IDQ7Ci1jb25zdCBzaXplX3QgQUxMT0NBVElPTlNfUEVSX0NPTExFQ1RJT04gPSAzNjAw
OwotLy8gVGhpcyB2YWx1ZSBoYXMgdG8gYmUgYSBtYWNybyB0byBiZSB1c2VkIGluIG1heCgpIHdp
dGhvdXQgaW50cm9kdWNpbmcKLS8vIGEgUElDIGJyYW5jaCBpbiBNYWNoLU8gYmluYXJpZXMsIHNl
ZSA8cmRhcjovL3Byb2JsZW0vNTk3MTM5MT4uCi0jZGVmaW5lIE1JTl9BUlJBWV9TSVpFIChzdGF0
aWNfY2FzdDxzaXplX3Q+KDE0KSkKLQogI2lmIEVOQUJMRShKU0NfTVVMVElQTEVfVEhSRUFEUykK
IAogI2lmIE9TKERBUldJTikKQEAgLTExNCw3ICs4MSw3IEBAIHR5cGVkZWYgbWFjaF9wb3J0X3Qg
UGxhdGZvcm1UaHJlYWQ7CiB0eXBlZGVmIEhBTkRMRSBQbGF0Zm9ybVRocmVhZDsKICNlbmRpZgog
Ci1jbGFzcyBIZWFwOjpUaHJlYWQgeworY2xhc3MgTWFjaGluZVN0YWNrTWFya2VyOjpUaHJlYWQg
ewogcHVibGljOgogICAgIFRocmVhZChwdGhyZWFkX3QgcHRocmVhZCwgY29uc3QgUGxhdGZvcm1U
aHJlYWQmIHBsYXRUaHJlYWQsIHZvaWQqIGJhc2UpIAogICAgICAgICA6IHBvc2l4VGhyZWFkKHB0
aHJlYWQpCkBAIC0xMzEsNDYgKzk4LDE3IEBAIHB1YmxpYzoKIAogI2VuZGlmCiAKLUhlYXA6Okhl
YXAoSlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRhKQotICAgIDogbV9tYXJrTGlzdFNldCgwKQorTWFj
aGluZVN0YWNrTWFya2VyOjpNYWNoaW5lU3RhY2tNYXJrZXIoSGVhcCogaGVhcCkKKyAgICA6IG1f
aGVhcChoZWFwKQogI2lmIEVOQUJMRShKU0NfTVVMVElQTEVfVEhSRUFEUykKICAgICAsIG1fcmVn
aXN0ZXJlZFRocmVhZHMoMCkKICAgICAsIG1fY3VycmVudFRocmVhZFJlZ2lzdHJhcigwKQogI2Vu
ZGlmCi0gICAgLCBtX2dsb2JhbERhdGEoZ2xvYmFsRGF0YSkKIHsKLSAgICBBU1NFUlQoZ2xvYmFs
RGF0YSk7Ci0gICAgbWVtc2V0KCZtX2hlYXAsIDAsIHNpemVvZihDb2xsZWN0b3JIZWFwKSk7Ci0g
ICAgYWxsb2NhdGVCbG9jaygpOwotICAgIG1fYWN0aXZpdHlDYWxsYmFjayA9IERlZmF1bHRHQ0Fj
dGl2aXR5Q2FsbGJhY2s6OmNyZWF0ZSh0aGlzKTsKLSAgICAoKm1fYWN0aXZpdHlDYWxsYmFjayko
KTsKIH0KIAotSGVhcDo6fkhlYXAoKQorTWFjaGluZVN0YWNrTWFya2VyOjp+TWFjaGluZVN0YWNr
TWFya2VyKCkKIHsKLSAgICAvLyBUaGUgZGVzdHJveSBmdW5jdGlvbiBtdXN0IGFscmVhZHkgaGF2
ZSBiZWVuIGNhbGxlZCwgc28gYXNzZXJ0IHRoaXMuCi0gICAgQVNTRVJUKCFtX2dsb2JhbERhdGEp
OwotfQotCi12b2lkIEhlYXA6OmRlc3Ryb3koKQotewotICAgIEpTTG9jayBsb2NrKFNpbGVuY2VB
c3NlcnRpb25zT25seSk7Ci0KLSAgICBpZiAoIW1fZ2xvYmFsRGF0YSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgQVNTRVJUKCFtX2dsb2JhbERhdGEtPmR5bmFtaWNHbG9iYWxPYmplY3QpOwotICAg
IEFTU0VSVCghaXNCdXN5KCkpOwotICAgIAotICAgIC8vIFRoZSBnbG9iYWwgb2JqZWN0IGlzIG5v
dCBHQyBwcm90ZWN0ZWQgYXQgdGhpcyBwb2ludCwgc28gc3dlZXBpbmcgbWF5IGRlbGV0ZSBpdAot
ICAgIC8vIChhbmQgdGh1cyB0aGUgZ2xvYmFsIGRhdGEpIGJlZm9yZSBvdGhlciBvYmplY3RzIHRo
YXQgbWF5IHVzZSB0aGUgZ2xvYmFsIGRhdGEuCi0gICAgUmVmUHRyPEpTR2xvYmFsRGF0YT4gcHJv
dGVjdChtX2dsb2JhbERhdGEpOwotCi0gICAgZGVsZXRlIG1fbWFya0xpc3RTZXQ7Ci0gICAgbV9t
YXJrTGlzdFNldCA9IDA7Ci0KLSAgICBmcmVlQmxvY2tzKCk7Ci0KICNpZiBFTkFCTEUoSlNDX01V
TFRJUExFX1RIUkVBRFMpCiAgICAgaWYgKG1fY3VycmVudFRocmVhZFJlZ2lzdHJhcikgewogICAg
ICAgICBpbnQgZXJyb3IgPSBwdGhyZWFkX2tleV9kZWxldGUobV9jdXJyZW50VGhyZWFkUmVnaXN0
cmFyKTsKQEAgLTE3OCwyMTEgKzExNiwxMiBAQCB2b2lkIEhlYXA6OmRlc3Ryb3koKQogICAgIH0K
IAogICAgIE11dGV4TG9ja2VyIHJlZ2lzdGVyZWRUaHJlYWRzTG9jayhtX3JlZ2lzdGVyZWRUaHJl
YWRzTXV0ZXgpOwotICAgIGZvciAoSGVhcDo6VGhyZWFkKiB0ID0gbV9yZWdpc3RlcmVkVGhyZWFk
czsgdDspIHsKLSAgICAgICAgSGVhcDo6VGhyZWFkKiBuZXh0ID0gdC0+bmV4dDsKKyAgICBmb3Ig
KFRocmVhZCogdCA9IG1fcmVnaXN0ZXJlZFRocmVhZHM7IHQ7KSB7CisgICAgICAgIFRocmVhZCog
bmV4dCA9IHQtPm5leHQ7CiAgICAgICAgIGRlbGV0ZSB0OwogICAgICAgICB0ID0gbmV4dDsKICAg
ICB9CiAjZW5kaWYKLSAgICBtX2dsb2JhbERhdGEgPSAwOwotfQotCi1ORVZFUl9JTkxJTkUgQ29s
bGVjdG9yQmxvY2sqIEhlYXA6OmFsbG9jYXRlQmxvY2soKQotewotICAgIFBhZ2VBbGxvY2F0aW9u
QWxpZ25lZCBhbGxvY2F0aW9uID0gUGFnZUFsbG9jYXRpb25BbGlnbmVkOjphbGxvY2F0ZShCTE9D
S19TSVpFLCBCTE9DS19TSVpFLCBPU0FsbG9jYXRvcjo6SlNHQ0hlYXBQYWdlcyk7Ci0gICAgQ29s
bGVjdG9yQmxvY2sqIGJsb2NrID0gc3RhdGljX2Nhc3Q8Q29sbGVjdG9yQmxvY2sqPihhbGxvY2F0
aW9uLmJhc2UoKSk7Ci0gICAgaWYgKCFibG9jaykKLSAgICAgICAgQ1JBU0goKTsKLQotICAgIC8v
IEluaXRpYWxpemUgYmxvY2suCi0KLSAgICBibG9jay0+aGVhcCA9IHRoaXM7Ci0gICAgY2xlYXJN
YXJrQml0cyhibG9jayk7Ci0KLSAgICBTdHJ1Y3R1cmUqIGR1bW15TWFya2FibGVDZWxsU3RydWN0
dXJlID0gbV9nbG9iYWxEYXRhLT5kdW1teU1hcmthYmxlQ2VsbFN0cnVjdHVyZS5nZXQoKTsKLSAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEhlYXBDb25zdGFudHM6OmNlbGxzUGVyQmxvY2s7ICsr
aSkKLSAgICAgICAgbmV3ICgmYmxvY2stPmNlbGxzW2ldKSBKU0NlbGwoZHVtbXlNYXJrYWJsZUNl
bGxTdHJ1Y3R1cmUpOwotICAgIAotICAgIC8vIEFkZCBibG9jayB0byBibG9ja3MgdmVjdG9yLgot
Ci0gICAgc2l6ZV90IG51bUJsb2NrcyA9IG1faGVhcC5udW1CbG9ja3M7Ci0gICAgaWYgKG1faGVh
cC51c2VkQmxvY2tzID09IG51bUJsb2NrcykgewotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90
IG1heE51bUJsb2NrcyA9IFVMT05HX01BWCAvIHNpemVvZihQYWdlQWxsb2NhdGlvbkFsaWduZWQp
IC8gR1JPV1RIX0ZBQ1RPUjsKLSAgICAgICAgaWYgKG51bUJsb2NrcyA+IG1heE51bUJsb2NrcykK
LSAgICAgICAgICAgIENSQVNIKCk7Ci0gICAgICAgIG51bUJsb2NrcyA9IG1heChNSU5fQVJSQVlf
U0laRSwgbnVtQmxvY2tzICogR1JPV1RIX0ZBQ1RPUik7Ci0gICAgICAgIG1faGVhcC5udW1CbG9j
a3MgPSBudW1CbG9ja3M7Ci0gICAgICAgIG1faGVhcC5ibG9ja3MgPSBzdGF0aWNfY2FzdDxQYWdl
QWxsb2NhdGlvbkFsaWduZWQqPihmYXN0UmVhbGxvYyhtX2hlYXAuYmxvY2tzLCBudW1CbG9ja3Mg
KiBzaXplb2YoUGFnZUFsbG9jYXRpb25BbGlnbmVkKSkpOwotICAgIH0KLSAgICBtX2hlYXAuYmxv
Y2tzW21faGVhcC51c2VkQmxvY2tzKytdID0gYWxsb2NhdGlvbjsKLQotICAgIHJldHVybiBibG9j
azsKLX0KLQotTkVWRVJfSU5MSU5FIHZvaWQgSGVhcDo6ZnJlZUJsb2NrKHNpemVfdCBibG9jaykK
LXsKLSAgICBtX2hlYXAuZGlkU2hyaW5rID0gdHJ1ZTsKLQotICAgIE9iamVjdEl0ZXJhdG9yIGl0
KG1faGVhcCwgYmxvY2spOwotICAgIE9iamVjdEl0ZXJhdG9yIGVuZChtX2hlYXAsIGJsb2NrICsg
MSk7Ci0gICAgZm9yICggOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAgICAgICgqaXQpLT5+SlNDZWxs
KCk7Ci0gICAgbV9oZWFwLmJsb2Nrc1tibG9ja10uZGVhbGxvY2F0ZSgpOwotCi0gICAgLy8gc3dh
cCB3aXRoIHRoZSBsYXN0IGJsb2NrIHNvIHdlIGNvbXBhY3QgYXMgd2UgZ28KLSAgICBtX2hlYXAu
YmxvY2tzW2Jsb2NrXSA9IG1faGVhcC5ibG9ja3NbbV9oZWFwLnVzZWRCbG9ja3MgLSAxXTsKLSAg
ICBtX2hlYXAudXNlZEJsb2Nrcy0tOwotCi0gICAgaWYgKG1faGVhcC5udW1CbG9ja3MgPiBNSU5f
QVJSQVlfU0laRSAmJiBtX2hlYXAudXNlZEJsb2NrcyA8IG1faGVhcC5udW1CbG9ja3MgLyBMT1df
V0FURVJfRkFDVE9SKSB7Ci0gICAgICAgIG1faGVhcC5udW1CbG9ja3MgPSBtX2hlYXAubnVtQmxv
Y2tzIC8gR1JPV1RIX0ZBQ1RPUjsgCi0gICAgICAgIG1faGVhcC5ibG9ja3MgPSBzdGF0aWNfY2Fz
dDxQYWdlQWxsb2NhdGlvbkFsaWduZWQqPihmYXN0UmVhbGxvYyhtX2hlYXAuYmxvY2tzLCBtX2hl
YXAubnVtQmxvY2tzICogc2l6ZW9mKFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCkpKTsKLSAgICB9Ci19
Ci0KLXZvaWQgSGVhcDo6ZnJlZUJsb2NrcygpCi17Ci0gICAgUHJvdGVjdENvdW50U2V0IHByb3Rl
Y3RlZFZhbHVlc0NvcHkgPSBtX3Byb3RlY3RlZFZhbHVlczsKLQotICAgIGNsZWFyTWFya0JpdHMo
KTsKLSAgICBQcm90ZWN0Q291bnRTZXQ6Oml0ZXJhdG9yIHByb3RlY3RlZFZhbHVlc0VuZCA9IHBy
b3RlY3RlZFZhbHVlc0NvcHkuZW5kKCk7Ci0gICAgZm9yIChQcm90ZWN0Q291bnRTZXQ6Oml0ZXJh
dG9yIGl0ID0gcHJvdGVjdGVkVmFsdWVzQ29weS5iZWdpbigpOyBpdCAhPSBwcm90ZWN0ZWRWYWx1
ZXNFbmQ7ICsraXQpCi0gICAgICAgIG1hcmtDZWxsKGl0LT5maXJzdCk7Ci0KLSAgICBtX2hlYXAu
bmV4dENlbGwgPSAwOwotICAgIG1faGVhcC5uZXh0QmxvY2sgPSAwOwotICAgIERlYWRPYmplY3RJ
dGVyYXRvciBpdChtX2hlYXAsIG1faGVhcC5uZXh0QmxvY2ssIG1faGVhcC5uZXh0Q2VsbCk7Ci0g
ICAgRGVhZE9iamVjdEl0ZXJhdG9yIGVuZChtX2hlYXAsIG1faGVhcC51c2VkQmxvY2tzKTsKLSAg
ICBmb3IgKCA7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgKCppdCktPn5KU0NlbGwoKTsKLQot
ICAgIEFTU0VSVCghcHJvdGVjdGVkT2JqZWN0Q291bnQoKSk7Ci0KLSAgICBwcm90ZWN0ZWRWYWx1
ZXNFbmQgPSBwcm90ZWN0ZWRWYWx1ZXNDb3B5LmVuZCgpOwotICAgIGZvciAoUHJvdGVjdENvdW50
U2V0OjppdGVyYXRvciBpdCA9IHByb3RlY3RlZFZhbHVlc0NvcHkuYmVnaW4oKTsgaXQgIT0gcHJv
dGVjdGVkVmFsdWVzRW5kOyArK2l0KQotICAgICAgICBpdC0+Zmlyc3QtPn5KU0NlbGwoKTsKLQot
ICAgIGZvciAoc2l6ZV90IGJsb2NrID0gMDsgYmxvY2sgPCBtX2hlYXAudXNlZEJsb2NrczsgKyti
bG9jaykKLSAgICAgICAgbV9oZWFwLmJsb2Nrc1tibG9ja10uZGVhbGxvY2F0ZSgpOwotCi0gICAg
ZmFzdEZyZWUobV9oZWFwLmJsb2Nrcyk7Ci0KLSAgICBtZW1zZXQoJm1faGVhcCwgMCwgc2l6ZW9m
KENvbGxlY3RvckhlYXApKTsKLX0KLQotdm9pZCBIZWFwOjpyZWNvcmRFeHRyYUNvc3Qoc2l6ZV90
IGNvc3QpCi17Ci0gICAgLy8gT3VyIGZyZXF1ZW5jeSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24gdHJp
ZXMgdG8gYmFsYW5jZSBtZW1vcnkgdXNlIGFnYWluc3Qgc3BlZWQKLSAgICAvLyBieSBjb2xsZWN0
aW5nIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgbmV3bHkgY3JlYXRlZCB2YWx1ZXMuIEhvd2V2ZXIs
IGZvciB2YWx1ZXMKLSAgICAvLyB0aGF0IGhvbGQgb24gdG8gYSBncmVhdCBkZWFsIG9mIG1lbW9y
eSB0aGF0J3Mgbm90IGluIHRoZSBmb3JtIG9mIG90aGVyIEpTIHZhbHVlcywKLSAgICAvLyB0aGF0
IGlzIG5vdCBnb29kIGVub3VnaCAtIGluIHNvbWUgY2FzZXMgYSBsb3Qgb2YgdGhvc2Ugb2JqZWN0
cyBjYW4gcGlsZSB1cCBhbmQKLSAgICAvLyB1c2UgY3JhenkgYW1vdW50cyBvZiBtZW1vcnkgd2l0
aG91dCBhIEdDIGhhcHBlbmluZy4gU28gd2UgdHJhY2sgdGhlc2UgZXh0cmEKLSAgICAvLyBtZW1v
cnkgY29zdHMuIE9ubHkgdW51c3VhbGx5IGxhcmdlIG9iamVjdHMgYXJlIG5vdGVkLCBhbmQgd2Ug
b25seSBrZWVwIHRyYWNrCi0gICAgLy8gb2YgdGhpcyBleHRyYSBjb3N0IHVudGlsIHRoZSBuZXh0
IEdDLiBJbiBnYXJiYWdlIGNvbGxlY3RlZCBsYW5ndWFnZXMsIG1vc3QgdmFsdWVzCi0gICAgLy8g
YXJlIGVpdGhlciB2ZXJ5IHNob3J0IGxpdmVkIHRlbXBvcmFyaWVzLCBvciBoYXZlIGV4dHJlbWVs
eSBsb25nIGxpZmV0aW1lcy4gU28KLSAgICAvLyBpZiBhIGxhcmdlIHZhbHVlIHN1cnZpdmVzIG9u
ZSBnYXJiYWdlIGNvbGxlY3Rpb24sIHRoZXJlIGlzIG5vdCBtdWNoIHBvaW50IHRvCi0gICAgLy8g
Y29sbGVjdGluZyBtb3JlIGZyZXF1ZW50bHkgYXMgbG9uZyBhcyBpdCBzdGF5cyBhbGl2ZS4KLQot
ICAgIGlmIChtX2hlYXAuZXh0cmFDb3N0ID4gbWF4RXh0cmFDb3N0ICYmIG1faGVhcC5leHRyYUNv
c3QgPiBtX2hlYXAudXNlZEJsb2NrcyAqIEJMT0NLX1NJWkUgLyAyKSB7Ci0gICAgICAgIC8vIElm
IHRoZSBsYXN0IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBoZWFwIGRlYWxsb2NhdGVkIGJsb2Nrcywg
d2UgbmVlZAotICAgICAgICAvLyB0byBjbGVhbiB1cCByZW1haW5pbmcgZ2FyYmFnZSBiZWZvcmUg
bWFya2luZy4gT3RoZXJ3aXNlLCB0aGUgY29uc2VydmF0aXZlCi0gICAgICAgIC8vIG1hcmtpbmcg
bWVjaGFuaXNtIG1pZ2h0IGZvbGxvdyBhIHBvaW50ZXIgdG8gdW5tYXBwZWQgbWVtb3J5LgotICAg
ICAgICBpZiAobV9oZWFwLmRpZFNocmluaykKLSAgICAgICAgICAgIHN3ZWVwKCk7Ci0gICAgICAg
IHJlc2V0KCk7Ci0gICAgfQotICAgIG1faGVhcC5leHRyYUNvc3QgKz0gY29zdDsKLX0KLQotdm9p
ZCogSGVhcDo6YWxsb2NhdGUoc2l6ZV90IHMpCi17Ci0gICAgQVNTRVJUKGdsb2JhbERhdGEoKS0+
aWRlbnRpZmllclRhYmxlID09IHd0ZlRocmVhZERhdGEoKS5jdXJyZW50SWRlbnRpZmllclRhYmxl
KCkpOwotICAgIHR5cGVkZWYgSGVhcENvbnN0YW50czo6QmxvY2sgQmxvY2s7Ci0gICAgdHlwZWRl
ZiBIZWFwQ29uc3RhbnRzOjpDZWxsIENlbGw7Ci0gICAgCi0gICAgQVNTRVJUKEpTTG9jazo6bG9j
a0NvdW50KCkgPiAwKTsKLSAgICBBU1NFUlQoSlNMb2NrOjpjdXJyZW50VGhyZWFkSXNIb2xkaW5n
TG9jaygpKTsKLSAgICBBU1NFUlRfVU5VU0VEKHMsIHMgPD0gSGVhcENvbnN0YW50czo6Y2VsbFNp
emUpOwotCi0gICAgQVNTRVJUKG1faGVhcC5vcGVyYXRpb25JblByb2dyZXNzID09IE5vT3BlcmF0
aW9uKTsKLQotI2lmIENPTExFQ1RfT05fRVZFUllfQUxMT0NBVElPTgotICAgIGNvbGxlY3RBbGxH
YXJiYWdlKCk7Ci0gICAgQVNTRVJUKG1faGVhcC5vcGVyYXRpb25JblByb2dyZXNzID09IE5vT3Bl
cmF0aW9uKTsKLSNlbmRpZgotCi1hbGxvY2F0ZToKLQotICAgIC8vIEZhc3QgY2FzZTogZmluZCB0
aGUgbmV4dCBnYXJiYWdlIGNlbGwgYW5kIHJlY3ljbGUgaXQuCi0KLSAgICBkbyB7Ci0gICAgICAg
IEFTU0VSVChtX2hlYXAubmV4dEJsb2NrIDwgbV9oZWFwLnVzZWRCbG9ja3MpOwotICAgICAgICBC
bG9jayogYmxvY2sgPSBtX2hlYXAuY29sbGVjdG9yQmxvY2sobV9oZWFwLm5leHRCbG9jayk7Ci0g
ICAgICAgIGRvIHsKLSAgICAgICAgICAgIEFTU0VSVChtX2hlYXAubmV4dENlbGwgPCBIZWFwQ29u
c3RhbnRzOjpjZWxsc1BlckJsb2NrKTsKLSAgICAgICAgICAgIGlmICghYmxvY2stPm1hcmtlZC5n
ZXQobV9oZWFwLm5leHRDZWxsKSkgeyAvLyBBbHdheXMgZmFsc2UgZm9yIHRoZSBsYXN0IGNlbGwg
aW4gdGhlIGJsb2NrCi0gICAgICAgICAgICAgICAgQ2VsbCogY2VsbCA9ICZibG9jay0+Y2VsbHNb
bV9oZWFwLm5leHRDZWxsXTsKLQotICAgICAgICAgICAgICAgIG1faGVhcC5vcGVyYXRpb25JblBy
b2dyZXNzID0gQWxsb2NhdGlvbjsKLSAgICAgICAgICAgICAgICBKU0NlbGwqIGltcCA9IHJlaW50
ZXJwcmV0X2Nhc3Q8SlNDZWxsKj4oY2VsbCk7Ci0gICAgICAgICAgICAgICAgaW1wLT5+SlNDZWxs
KCk7Ci0gICAgICAgICAgICAgICAgbV9oZWFwLm9wZXJhdGlvbkluUHJvZ3Jlc3MgPSBOb09wZXJh
dGlvbjsKLQotICAgICAgICAgICAgICAgICsrbV9oZWFwLm5leHRDZWxsOwotICAgICAgICAgICAg
ICAgIHJldHVybiBjZWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmxvY2stPm1hcmtl
ZC5hZHZhbmNlVG9OZXh0UG9zc2libGVGcmVlQ2VsbChtX2hlYXAubmV4dENlbGwpOwotICAgICAg
ICB9IHdoaWxlIChtX2hlYXAubmV4dENlbGwgIT0gSGVhcENvbnN0YW50czo6Y2VsbHNQZXJCbG9j
ayk7Ci0gICAgICAgIG1faGVhcC5uZXh0Q2VsbCA9IDA7Ci0gICAgfSB3aGlsZSAoKyttX2hlYXAu
bmV4dEJsb2NrICE9IG1faGVhcC51c2VkQmxvY2tzKTsKLQotICAgIC8vIFNsb3cgY2FzZTogcmVh
Y2hlZCB0aGUgZW5kIG9mIHRoZSBoZWFwLiBNYXJrIGxpdmUgb2JqZWN0cyBhbmQgc3RhcnQgb3Zl
ci4KLQotICAgIHJlc2V0KCk7Ci0gICAgZ290byBhbGxvY2F0ZTsKLX0KLQotdm9pZCBIZWFwOjpy
ZXNpemVCbG9ja3MoKQotewotICAgIG1faGVhcC5kaWRTaHJpbmsgPSBmYWxzZTsKLQotICAgIHNp
emVfdCB1c2VkQ2VsbENvdW50ID0gbWFya2VkQ2VsbHMoKTsKLSAgICBzaXplX3QgbWluQ2VsbENv
dW50ID0gdXNlZENlbGxDb3VudCArIG1heChBTExPQ0FUSU9OU19QRVJfQ09MTEVDVElPTiwgdXNl
ZENlbGxDb3VudCk7Ci0gICAgc2l6ZV90IG1pbkJsb2NrQ291bnQgPSAobWluQ2VsbENvdW50ICsg
SGVhcENvbnN0YW50czo6Y2VsbHNQZXJCbG9jayAtIDEpIC8gSGVhcENvbnN0YW50czo6Y2VsbHNQ
ZXJCbG9jazsKLQotICAgIHNpemVfdCBtYXhDZWxsQ291bnQgPSAxLjI1ZiAqIG1pbkNlbGxDb3Vu
dDsKLSAgICBzaXplX3QgbWF4QmxvY2tDb3VudCA9IChtYXhDZWxsQ291bnQgKyBIZWFwQ29uc3Rh
bnRzOjpjZWxsc1BlckJsb2NrIC0gMSkgLyBIZWFwQ29uc3RhbnRzOjpjZWxsc1BlckJsb2NrOwot
Ci0gICAgaWYgKG1faGVhcC51c2VkQmxvY2tzIDwgbWluQmxvY2tDb3VudCkKLSAgICAgICAgZ3Jv
d0Jsb2NrcyhtaW5CbG9ja0NvdW50KTsKLSAgICBlbHNlIGlmIChtX2hlYXAudXNlZEJsb2NrcyA+
IG1heEJsb2NrQ291bnQpCi0gICAgICAgIHNocmlua0Jsb2NrcyhtYXhCbG9ja0NvdW50KTsKLX0K
LQotdm9pZCBIZWFwOjpncm93QmxvY2tzKHNpemVfdCBuZWVkZWRCbG9ja3MpCi17Ci0gICAgQVNT
RVJUKG1faGVhcC51c2VkQmxvY2tzIDwgbmVlZGVkQmxvY2tzKTsKLSAgICB3aGlsZSAobV9oZWFw
LnVzZWRCbG9ja3MgPCBuZWVkZWRCbG9ja3MpCi0gICAgICAgIGFsbG9jYXRlQmxvY2soKTsKLX0K
LQotdm9pZCBIZWFwOjpzaHJpbmtCbG9ja3Moc2l6ZV90IG5lZWRlZEJsb2NrcykKLXsKLSAgICBB
U1NFUlQobV9oZWFwLnVzZWRCbG9ja3MgPiBuZWVkZWRCbG9ja3MpOwotICAgIAotICAgIC8vIENs
ZWFyIHRoZSBhbHdheXMtb24gbGFzdCBiaXQsIHNvIGlzRW1wdHkoKSBpc24ndCBmb29sZWQgYnkg
aXQuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2hlYXAudXNlZEJsb2NrczsgKytpKQot
ICAgICAgICBtX2hlYXAuY29sbGVjdG9yQmxvY2soaSktPm1hcmtlZC5jbGVhcihIZWFwQ29uc3Rh
bnRzOjpjZWxsc1BlckJsb2NrIC0gMSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBt
X2hlYXAudXNlZEJsb2NrcyAmJiBtX2hlYXAudXNlZEJsb2NrcyAhPSBuZWVkZWRCbG9ja3M7ICkg
ewotICAgICAgICBpZiAobV9oZWFwLmNvbGxlY3RvckJsb2NrKGkpLT5tYXJrZWQuaXNFbXB0eSgp
KSB7Ci0gICAgICAgICAgICBmcmVlQmxvY2soaSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAg
ICAgKytpOwotICAgIH0KLQotICAgIC8vIFJlc2V0IHRoZSBhbHdheXMtb24gbGFzdCBiaXQuCi0g
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2hlYXAudXNlZEJsb2NrczsgKytpKQotICAgICAg
ICBtX2hlYXAuY29sbGVjdG9yQmxvY2soaSktPm1hcmtlZC5zZXQoSGVhcENvbnN0YW50czo6Y2Vs
bHNQZXJCbG9jayAtIDEpOwogfQogCiAjaWYgRU5BQkxFKEpTQ19NVUxUSVBMRV9USFJFQURTKQpA
QCAtMzk2LDcgKzEzNSw3IEBAIHN0YXRpYyBpbmxpbmUgUGxhdGZvcm1UaHJlYWQgZ2V0Q3VycmVu
dFAKICNlbmRpZgogfQogCi12b2lkIEhlYXA6Om1ha2VVc2FibGVGcm9tTXVsdGlwbGVUaHJlYWRz
KCkKK3ZvaWQgTWFjaGluZVN0YWNrTWFya2VyOjptYWtlVXNhYmxlRnJvbU11bHRpcGxlVGhyZWFk
cygpCiB7CiAgICAgaWYgKG1fY3VycmVudFRocmVhZFJlZ2lzdHJhcikKICAgICAgICAgcmV0dXJu
OwpAQCAtNDA2LDE1ICsxNDUsMTUgQEAgdm9pZCBIZWFwOjptYWtlVXNhYmxlRnJvbU11bHRpcGxl
VGhyZWFkcwogICAgICAgICBDUkFTSCgpOwogfQogCi12b2lkIEhlYXA6OnJlZ2lzdGVyVGhyZWFk
KCkKK3ZvaWQgTWFjaGluZVN0YWNrTWFya2VyOjpyZWdpc3RlclRocmVhZCgpCiB7Ci0gICAgQVNT
RVJUKCFtX2dsb2JhbERhdGEtPmV4Y2x1c2l2ZVRocmVhZCB8fCBtX2dsb2JhbERhdGEtPmV4Y2x1
c2l2ZVRocmVhZCA9PSBjdXJyZW50VGhyZWFkKCkpOworICAgIEFTU0VSVCghbV9oZWFwLT5nbG9i
YWxEYXRhKCktPmV4Y2x1c2l2ZVRocmVhZCB8fCBtX2hlYXAtPmdsb2JhbERhdGEoKS0+ZXhjbHVz
aXZlVGhyZWFkID09IGN1cnJlbnRUaHJlYWQoKSk7CiAKICAgICBpZiAoIW1fY3VycmVudFRocmVh
ZFJlZ2lzdHJhciB8fCBwdGhyZWFkX2dldHNwZWNpZmljKG1fY3VycmVudFRocmVhZFJlZ2lzdHJh
cikpCiAgICAgICAgIHJldHVybjsKIAogICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMobV9jdXJyZW50
VGhyZWFkUmVnaXN0cmFyLCB0aGlzKTsKLSAgICBIZWFwOjpUaHJlYWQqIHRocmVhZCA9IG5ldyBI
ZWFwOjpUaHJlYWQocHRocmVhZF9zZWxmKCksIGdldEN1cnJlbnRQbGF0Zm9ybVRocmVhZCgpLCBt
X2dsb2JhbERhdGEtPnN0YWNrKCkub3JpZ2luKCkpOworICAgIFRocmVhZCogdGhyZWFkID0gbmV3
IFRocmVhZChwdGhyZWFkX3NlbGYoKSwgZ2V0Q3VycmVudFBsYXRmb3JtVGhyZWFkKCksIG1faGVh
cC0+Z2xvYmFsRGF0YSgpLT5zdGFjaygpLm9yaWdpbigpKTsKIAogICAgIE11dGV4TG9ja2VyIGxv
Y2sobV9yZWdpc3RlcmVkVGhyZWFkc011dGV4KTsKIApAQCAtNDIyLDEzICsxNjEsMTMgQEAgdm9p
ZCBIZWFwOjpyZWdpc3RlclRocmVhZCgpCiAgICAgbV9yZWdpc3RlcmVkVGhyZWFkcyA9IHRocmVh
ZDsKIH0KIAotdm9pZCBIZWFwOjp1bnJlZ2lzdGVyVGhyZWFkKHZvaWQqIHApCit2b2lkIE1hY2hp
bmVTdGFja01hcmtlcjo6dW5yZWdpc3RlclRocmVhZCh2b2lkKiBwKQogewogICAgIGlmIChwKQot
ICAgICAgICBzdGF0aWNfY2FzdDxIZWFwKj4ocCktPnVucmVnaXN0ZXJUaHJlYWQoKTsKKyAgICAg
ICAgc3RhdGljX2Nhc3Q8TWFjaGluZVN0YWNrTWFya2VyKj4ocCktPnVucmVnaXN0ZXJUaHJlYWQo
KTsKIH0KIAotdm9pZCBIZWFwOjp1bnJlZ2lzdGVyVGhyZWFkKCkKK3ZvaWQgTWFjaGluZVN0YWNr
TWFya2VyOjp1bnJlZ2lzdGVyVGhyZWFkKCkKIHsKICAgICBwdGhyZWFkX3QgY3VycmVudFBvc2l4
VGhyZWFkID0gcHRocmVhZF9zZWxmKCk7CiAKQEAgLTQzOSw4ICsxNzgsOCBAQCB2b2lkIEhlYXA6
OnVucmVnaXN0ZXJUaHJlYWQoKQogICAgICAgICBtX3JlZ2lzdGVyZWRUaHJlYWRzID0gbV9yZWdp
c3RlcmVkVGhyZWFkcy0+bmV4dDsKICAgICAgICAgZGVsZXRlIHQ7CiAgICAgfSBlbHNlIHsKLSAg
ICAgICAgSGVhcDo6VGhyZWFkKiBsYXN0ID0gbV9yZWdpc3RlcmVkVGhyZWFkczsKLSAgICAgICAg
SGVhcDo6VGhyZWFkKiB0OworICAgICAgICBUaHJlYWQqIGxhc3QgPSBtX3JlZ2lzdGVyZWRUaHJl
YWRzOworICAgICAgICBUaHJlYWQqIHQ7CiAgICAgICAgIGZvciAodCA9IG1fcmVnaXN0ZXJlZFRo
cmVhZHMtPm5leHQ7IHQ7IHQgPSB0LT5uZXh0KSB7CiAgICAgICAgICAgICBpZiAocHRocmVhZF9l
cXVhbCh0LT5wb3NpeFRocmVhZCwgY3VycmVudFBvc2l4VGhyZWFkKSkgewogICAgICAgICAgICAg
ICAgIGxhc3QtPm5leHQgPSB0LT5uZXh0OwpAQCAtNDUzLDc3ICsxOTIsMTEgQEAgdm9pZCBIZWFw
Ojp1bnJlZ2lzdGVyVGhyZWFkKCkKICAgICB9CiB9CiAKLSNlbHNlIC8vIEVOQUJMRShKU0NfTVVM
VElQTEVfVEhSRUFEUykKLQotdm9pZCBIZWFwOjpyZWdpc3RlclRocmVhZCgpCi17Ci19Ci0KLSNl
bmRpZgotCi1pbmxpbmUgYm9vbCBpc1BvaW50ZXJBbGlnbmVkKHZvaWQqIHApCi17Ci0gICAgcmV0
dXJuICgoKGludHB0cl90KShwKSAmIChzaXplb2YoY2hhciopIC0gMSkpID09IDApOwotfQotCi0v
LyBDZWxsIHNpemUgbmVlZHMgdG8gYmUgYSBwb3dlciBvZiB0d28gZm9yIGlzUG9zc2libGVDZWxs
IHRvIGJlIHZhbGlkLgotQ09NUElMRV9BU1NFUlQoc2l6ZW9mKENvbGxlY3RvckNlbGwpICUgMiA9
PSAwLCBDb2xsZWN0b3JfY2VsbF9zaXplX2lzX3Bvd2VyX29mX3R3byk7Ci0KLXN0YXRpYyBpbmxp
bmUgYm9vbCBpc0NlbGxBbGlnbmVkKHZvaWQgKnApCi17Ci0gICAgcmV0dXJuICgoKGludHB0cl90
KShwKSAmIENFTExfTUFTSykgPT0gMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1Bvc3Np
YmxlQ2VsbCh2b2lkKiBwKQotewotICAgIHJldHVybiBpc0NlbGxBbGlnbmVkKHApICYmIHA7Ci19
Ci0KLXZvaWQgSGVhcDo6bWFya0NvbnNlcnZhdGl2ZWx5KE1hcmtTdGFjayYgbWFya1N0YWNrLCB2
b2lkKiBzdGFydCwgdm9pZCogZW5kKQotewotI2lmIE9TKFdJTkNFKQotICAgIGlmIChzdGFydCA+
IGVuZCkgewotICAgICAgICB2b2lkKiB0bXAgPSBzdGFydDsKLSAgICAgICAgc3RhcnQgPSBlbmQ7
Ci0gICAgICAgIGVuZCA9IHRtcDsKLSAgICB9Ci0jZWxzZQotICAgIEFTU0VSVChzdGFydCA8PSBl
bmQpOwogI2VuZGlmCiAKLSAgICBBU1NFUlQoKHN0YXRpY19jYXN0PGNoYXIqPihlbmQpIC0gc3Rh
dGljX2Nhc3Q8Y2hhcio+KHN0YXJ0KSkgPCAweDEwMDAwMDApOwotICAgIEFTU0VSVChpc1BvaW50
ZXJBbGlnbmVkKHN0YXJ0KSk7Ci0gICAgQVNTRVJUKGlzUG9pbnRlckFsaWduZWQoZW5kKSk7Ci0K
LSAgICBjaGFyKiogcCA9IHN0YXRpY19jYXN0PGNoYXIqKj4oc3RhcnQpOwotICAgIGNoYXIqKiBl
ID0gc3RhdGljX2Nhc3Q8Y2hhcioqPihlbmQpOwotCi0gICAgd2hpbGUgKHAgIT0gZSkgewotICAg
ICAgICBjaGFyKiB4ID0gKnArKzsKLSAgICAgICAgaWYgKGlzUG9zc2libGVDZWxsKHgpKSB7Ci0g
ICAgICAgICAgICBzaXplX3QgdXNlZEJsb2NrczsKLSAgICAgICAgICAgIHVpbnRwdHJfdCB4QXNC
aXRzID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHgpOwotICAgICAgICAgICAgeEFzQml0
cyAmPSBDRUxMX0FMSUdOX01BU0s7Ci0KLSAgICAgICAgICAgIHVpbnRwdHJfdCBvZmZzZXQgPSB4
QXNCaXRzICYgQkxPQ0tfT0ZGU0VUX01BU0s7Ci0gICAgICAgICAgICBjb25zdCBzaXplX3QgbGFz
dENlbGxPZmZzZXQgPSBzaXplb2YoQ29sbGVjdG9yQ2VsbCkgKiAoQ0VMTFNfUEVSX0JMT0NLIC0g
MSk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID4gbGFzdENlbGxPZmZzZXQpCi0gICAgICAgICAg
ICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIENvbGxlY3RvckJsb2NrKiBibG9ja0FkZHIg
PSByZWludGVycHJldF9jYXN0PENvbGxlY3RvckJsb2NrKj4oeEFzQml0cyAtIG9mZnNldCk7Ci0g
ICAgICAgICAgICB1c2VkQmxvY2tzID0gbV9oZWFwLnVzZWRCbG9ja3M7Ci0gICAgICAgICAgICBm
b3IgKHNpemVfdCBibG9jayA9IDA7IGJsb2NrIDwgdXNlZEJsb2NrczsgYmxvY2srKykgewotICAg
ICAgICAgICAgICAgIGlmIChtX2hlYXAuY29sbGVjdG9yQmxvY2soYmxvY2spICE9IGJsb2NrQWRk
cikKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgbWFya1N0
YWNrLmFwcGVuZChyZWludGVycHJldF9jYXN0PEpTQ2VsbCo+KHhBc0JpdHMpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBORVZFUl9JTkxJTkUgSGVhcDo6bWFy
a0N1cnJlbnRUaHJlYWRDb25zZXJ2YXRpdmVseUludGVybmFsKE1hcmtTdGFjayYgbWFya1N0YWNr
KQordm9pZCBORVZFUl9JTkxJTkUgTWFjaGluZVN0YWNrTWFya2VyOjptYXJrQ3VycmVudFRocmVh
ZENvbnNlcnZhdGl2ZWx5SW50ZXJuYWwoTWFya1N0YWNrJiBtYXJrU3RhY2spCiB7Ci0gICAgbWFy
a0NvbnNlcnZhdGl2ZWx5KG1hcmtTdGFjaywgbV9nbG9iYWxEYXRhLT5zdGFjaygpLmN1cnJlbnQo
KSwgbV9nbG9iYWxEYXRhLT5zdGFjaygpLm9yaWdpbigpKTsKKyAgICBtX2hlYXAtPm1hcmtDb25z
ZXJ2YXRpdmVseShtYXJrU3RhY2ssIG1faGVhcC0+Z2xvYmFsRGF0YSgpLT5zdGFjaygpLmN1cnJl
bnQoKSwgbV9oZWFwLT5nbG9iYWxEYXRhKCktPnN0YWNrKCkub3JpZ2luKCkpOwogICAgIG1hcmtT
dGFjay5kcmFpbigpOwogfQogCkBAIC01MzMsNyArMjA2LDcgQEAgdm9pZCBORVZFUl9JTkxJTkUg
SGVhcDo6bWFya0N1cnJlbnRUaHJlYQogI2RlZmluZSBSRUdJU1RFUl9CVUZGRVJfQUxJR05NRU5U
CiAjZW5kaWYKIAotdm9pZCBIZWFwOjptYXJrQ3VycmVudFRocmVhZENvbnNlcnZhdGl2ZWx5KE1h
cmtTdGFjayYgbWFya1N0YWNrKQordm9pZCBNYWNoaW5lU3RhY2tNYXJrZXI6Om1hcmtDdXJyZW50
VGhyZWFkQ29uc2VydmF0aXZlbHkoTWFya1N0YWNrJiBtYXJrU3RhY2spCiB7CiAgICAgLy8gc2V0
am1wIGZvcmNlcyB2b2xhdGlsZSByZWdpc3RlcnMgb250byB0aGUgc3RhY2sKICAgICBqbXBfYnVm
IHJlZ2lzdGVycyBSRUdJU1RFUl9CVUZGRVJfQUxJR05NRU5UOwpAQCAtNjc4LDcgKzM1MSw3IEBA
IHN0YXRpYyBpbmxpbmUgdm9pZCogb3RoZXJUaHJlYWRTdGFja1BvaW4KICNlbmRpZgogfQogCi12
b2lkIEhlYXA6Om1hcmtPdGhlclRocmVhZENvbnNlcnZhdGl2ZWx5KE1hcmtTdGFjayYgbWFya1N0
YWNrLCBUaHJlYWQqIHRocmVhZCkKK3ZvaWQgTWFjaGluZVN0YWNrTWFya2VyOjptYXJrT3RoZXJU
aHJlYWRDb25zZXJ2YXRpdmVseShNYXJrU3RhY2smIG1hcmtTdGFjaywgVGhyZWFkKiB0aHJlYWQp
CiB7CiAgICAgc3VzcGVuZFRocmVhZCh0aHJlYWQtPnBsYXRmb3JtVGhyZWFkKTsKIApAQCAtNjg2
LDExICszNTksMTEgQEAgdm9pZCBIZWFwOjptYXJrT3RoZXJUaHJlYWRDb25zZXJ2YXRpdmVseQog
ICAgIHNpemVfdCByZWdTaXplID0gZ2V0UGxhdGZvcm1UaHJlYWRSZWdpc3RlcnModGhyZWFkLT5w
bGF0Zm9ybVRocmVhZCwgcmVncyk7CiAKICAgICAvLyBtYXJrIHRoZSB0aHJlYWQncyByZWdpc3Rl
cnMKLSAgICBtYXJrQ29uc2VydmF0aXZlbHkobWFya1N0YWNrLCBzdGF0aWNfY2FzdDx2b2lkKj4o
JnJlZ3MpLCBzdGF0aWNfY2FzdDx2b2lkKj4ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnJlZ3Mp
ICsgcmVnU2l6ZSkpOworICAgIG1faGVhcC0+bWFya0NvbnNlcnZhdGl2ZWx5KG1hcmtTdGFjaywg
c3RhdGljX2Nhc3Q8dm9pZCo+KCZyZWdzKSwgc3RhdGljX2Nhc3Q8dm9pZCo+KHJlaW50ZXJwcmV0
X2Nhc3Q8Y2hhcio+KCZyZWdzKSArIHJlZ1NpemUpKTsKICAgICBtYXJrU3RhY2suZHJhaW4oKTsK
IAogICAgIHZvaWQqIHN0YWNrUG9pbnRlciA9IG90aGVyVGhyZWFkU3RhY2tQb2ludGVyKHJlZ3Mp
OwotICAgIG1hcmtDb25zZXJ2YXRpdmVseShtYXJrU3RhY2ssIHN0YWNrUG9pbnRlciwgdGhyZWFk
LT5zdGFja0Jhc2UpOworICAgIG1faGVhcC0+bWFya0NvbnNlcnZhdGl2ZWx5KG1hcmtTdGFjaywg
c3RhY2tQb2ludGVyLCB0aHJlYWQtPnN0YWNrQmFzZSk7CiAgICAgbWFya1N0YWNrLmRyYWluKCk7
CiAKICAgICByZXN1bWVUaHJlYWQodGhyZWFkLT5wbGF0Zm9ybVRocmVhZCk7CkBAIC02OTgsNyAr
MzcxLDcgQEAgdm9pZCBIZWFwOjptYXJrT3RoZXJUaHJlYWRDb25zZXJ2YXRpdmVseQogCiAjZW5k
aWYKIAotdm9pZCBIZWFwOjptYXJrU3RhY2tPYmplY3RzQ29uc2VydmF0aXZlbHkoTWFya1N0YWNr
JiBtYXJrU3RhY2spCit2b2lkIE1hY2hpbmVTdGFja01hcmtlcjo6bWFya01hY2hpbmVTdGFja0Nv
bnNlcnZhdGl2ZWx5KE1hcmtTdGFjayYgbWFya1N0YWNrKQogewogICAgIG1hcmtDdXJyZW50VGhy
ZWFkQ29uc2VydmF0aXZlbHkobWFya1N0YWNrKTsKIApAQCAtNzI3LDM3NCArNDAwLDQgQEAgdm9p
ZCBIZWFwOjptYXJrU3RhY2tPYmplY3RzQ29uc2VydmF0aXZlbAogI2VuZGlmCiB9CiAKLXZvaWQg
SGVhcDo6dXBkYXRlV2Vha0dDSGFuZGxlcygpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IG1fd2Vha0dDSGFuZGxlUG9vbHMuc2l6ZSgpOyArK2kpCi0gICAgICAgIHdlYWtHQ0hhbmRs
ZVBvb2woaSktPnVwZGF0ZSgpOwotfQotCi12b2lkIFdlYWtHQ0hhbmRsZVBvb2w6OnVwZGF0ZSgp
Ci17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IFdlYWtHQ0hhbmRsZVBvb2w6Om51bVBv
b2xFbnRyaWVzOyArK2kpIHsKLSAgICAgICAgaWYgKG1fZW50cmllc1tpXS5pc1ZhbGlkUHRyKCkp
IHsKLSAgICAgICAgICAgIEpTQ2VsbCogY2VsbCA9IG1fZW50cmllc1tpXS5nZXQoKTsKLSAgICAg
ICAgICAgIGlmICghY2VsbCB8fCAhSGVhcDo6aXNDZWxsTWFya2VkKGNlbGwpKQotICAgICAgICAg
ICAgICAgIG1fZW50cmllc1tpXS5pbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0K
LVdlYWtHQ0hhbmRsZSogSGVhcDo6YWRkV2Vha0dDSGFuZGxlKEpTQ2VsbCogcHRyKQotewotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX3dlYWtHQ0hhbmRsZVBvb2xzLnNpemUoKTsgKytp
KQotICAgICAgICBpZiAoIXdlYWtHQ0hhbmRsZVBvb2woaSktPmlzRnVsbCgpKQotICAgICAgICAg
ICAgcmV0dXJuIHdlYWtHQ0hhbmRsZVBvb2woaSktPmFsbG9jYXRlKHB0cik7Ci0KLSAgICBQYWdl
QWxsb2NhdGlvbkFsaWduZWQgYWxsb2NhdGlvbiA9IFBhZ2VBbGxvY2F0aW9uQWxpZ25lZDo6YWxs
b2NhdGUoV2Vha0dDSGFuZGxlUG9vbDo6cG9vbFNpemUsIFdlYWtHQ0hhbmRsZVBvb2w6OnBvb2xT
aXplLCBPU0FsbG9jYXRvcjo6SlNHQ0hlYXBQYWdlcyk7Ci0gICAgbV93ZWFrR0NIYW5kbGVQb29s
cy5hcHBlbmQoYWxsb2NhdGlvbik7Ci0KLSAgICBXZWFrR0NIYW5kbGVQb29sKiBwb29sID0gbmV3
IChhbGxvY2F0aW9uLmJhc2UoKSkgV2Vha0dDSGFuZGxlUG9vbCgpOwotICAgIHJldHVybiBwb29s
LT5hbGxvY2F0ZShwdHIpOwotfQotCi12b2lkIEhlYXA6OnByb3RlY3QoSlNWYWx1ZSBrKQotewot
ICAgIEFTU0VSVChrKTsKLSAgICBBU1NFUlQoSlNMb2NrOjpjdXJyZW50VGhyZWFkSXNIb2xkaW5n
TG9jaygpIHx8ICFtX2dsb2JhbERhdGEtPmlzU2hhcmVkSW5zdGFuY2UoKSk7Ci0KLSAgICBpZiAo
IWsuaXNDZWxsKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvdGVjdGVkVmFsdWVzLmFk
ZChrLmFzQ2VsbCgpKTsKLX0KLQotYm9vbCBIZWFwOjp1bnByb3RlY3QoSlNWYWx1ZSBrKQotewot
ICAgIEFTU0VSVChrKTsKLSAgICBBU1NFUlQoSlNMb2NrOjpjdXJyZW50VGhyZWFkSXNIb2xkaW5n
TG9jaygpIHx8ICFtX2dsb2JhbERhdGEtPmlzU2hhcmVkSW5zdGFuY2UoKSk7Ci0KLSAgICBpZiAo
IWsuaXNDZWxsKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBtX3Byb3Rl
Y3RlZFZhbHVlcy5yZW1vdmUoay5hc0NlbGwoKSk7Ci19Ci0KLXZvaWQgSGVhcDo6bWFya1Byb3Rl
Y3RlZE9iamVjdHMoTWFya1N0YWNrJiBtYXJrU3RhY2spCi17Ci0gICAgUHJvdGVjdENvdW50U2V0
OjppdGVyYXRvciBlbmQgPSBtX3Byb3RlY3RlZFZhbHVlcy5lbmQoKTsKLSAgICBmb3IgKFByb3Rl
Y3RDb3VudFNldDo6aXRlcmF0b3IgaXQgPSBtX3Byb3RlY3RlZFZhbHVlcy5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpIHsKLSAgICAgICAgbWFya1N0YWNrLmFwcGVuZChpdC0+Zmlyc3QpOwotICAg
ICAgICBtYXJrU3RhY2suZHJhaW4oKTsKLSAgICB9Ci19Ci0KLXZvaWQgSGVhcDo6cHVzaFRlbXBT
b3J0VmVjdG9yKFZlY3RvcjxWYWx1ZVN0cmluZ1BhaXI+KiB0ZW1wVmVjdG9yKQotewotICAgIG1f
dGVtcFNvcnRpbmdWZWN0b3JzLmFwcGVuZCh0ZW1wVmVjdG9yKTsKLX0KLQotdm9pZCBIZWFwOjpw
b3BUZW1wU29ydFZlY3RvcihWZWN0b3I8VmFsdWVTdHJpbmdQYWlyPiogdGVtcFZlY3RvcikKLXsK
LSAgICBBU1NFUlRfVU5VU0VEKHRlbXBWZWN0b3IsIHRlbXBWZWN0b3IgPT0gbV90ZW1wU29ydGlu
Z1ZlY3RvcnMubGFzdCgpKTsKLSAgICBtX3RlbXBTb3J0aW5nVmVjdG9ycy5yZW1vdmVMYXN0KCk7
Ci19Ci0gICAgCi12b2lkIEhlYXA6Om1hcmtUZW1wU29ydFZlY3RvcnMoTWFya1N0YWNrJiBtYXJr
U3RhY2spCi17Ci0gICAgdHlwZWRlZiBWZWN0b3I8VmVjdG9yPFZhbHVlU3RyaW5nUGFpcj4qID4g
VmVjdG9yT2ZWYWx1ZVN0cmluZ1ZlY3RvcnM7Ci0KLSAgICBWZWN0b3JPZlZhbHVlU3RyaW5nVmVj
dG9yczo6aXRlcmF0b3IgZW5kID0gbV90ZW1wU29ydGluZ1ZlY3RvcnMuZW5kKCk7Ci0gICAgZm9y
IChWZWN0b3JPZlZhbHVlU3RyaW5nVmVjdG9yczo6aXRlcmF0b3IgaXQgPSBtX3RlbXBTb3J0aW5n
VmVjdG9ycy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgVmVjdG9yPFZhbHVl
U3RyaW5nUGFpcj4qIHRlbXBTb3J0aW5nVmVjdG9yID0gKml0OwotCi0gICAgICAgIFZlY3RvcjxW
YWx1ZVN0cmluZ1BhaXI+OjppdGVyYXRvciB2ZWN0b3JFbmQgPSB0ZW1wU29ydGluZ1ZlY3Rvci0+
ZW5kKCk7Ci0gICAgICAgIGZvciAoVmVjdG9yPFZhbHVlU3RyaW5nUGFpcj46Oml0ZXJhdG9yIHZl
Y3Rvckl0ID0gdGVtcFNvcnRpbmdWZWN0b3ItPmJlZ2luKCk7IHZlY3Rvckl0ICE9IHZlY3RvckVu
ZDsgKyt2ZWN0b3JJdCkKLSAgICAgICAgICAgIGlmICh2ZWN0b3JJdC0+Zmlyc3QpCi0gICAgICAg
ICAgICAgICAgbWFya1N0YWNrLmFwcGVuZCh2ZWN0b3JJdC0+Zmlyc3QpOwotICAgICAgICBtYXJr
U3RhY2suZHJhaW4oKTsKLSAgICB9Ci19Ci0gICAgCi12b2lkIEhlYXA6OmNsZWFyTWFya0JpdHMo
KQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9oZWFwLnVzZWRCbG9ja3M7ICsraSkK
LSAgICAgICAgY2xlYXJNYXJrQml0cyhtX2hlYXAuY29sbGVjdG9yQmxvY2soaSkpOwotfQotCi12
b2lkIEhlYXA6OmNsZWFyTWFya0JpdHMoQ29sbGVjdG9yQmxvY2sqIGJsb2NrKQotewotICAgIC8v
IGFsbG9jYXRlIGFzc3VtZXMgdGhhdCB0aGUgbGFzdCBjZWxsIGluIGV2ZXJ5IGJsb2NrIGlzIG1h
cmtlZC4KLSAgICBibG9jay0+bWFya2VkLmNsZWFyQWxsKCk7Ci0gICAgYmxvY2stPm1hcmtlZC5z
ZXQoSGVhcENvbnN0YW50czo6Y2VsbHNQZXJCbG9jayAtIDEpOwotfQotCi1zaXplX3QgSGVhcDo6
bWFya2VkQ2VsbHMoc2l6ZV90IHN0YXJ0QmxvY2ssIHNpemVfdCBzdGFydENlbGwpIGNvbnN0Ci17
Ci0gICAgQVNTRVJUKHN0YXJ0QmxvY2sgPD0gbV9oZWFwLnVzZWRCbG9ja3MpOwotICAgIEFTU0VS
VChzdGFydENlbGwgPCBIZWFwQ29uc3RhbnRzOjpjZWxsc1BlckJsb2NrKTsKLQotICAgIGlmIChz
dGFydEJsb2NrID49IG1faGVhcC51c2VkQmxvY2tzKQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IHNpemVfdCByZXN1bHQgPSAwOwotICAgIHJlc3VsdCArPSBtX2hlYXAuY29sbGVjdG9yQmxvY2so
c3RhcnRCbG9jayktPm1hcmtlZC5jb3VudChzdGFydENlbGwpOwotICAgIGZvciAoc2l6ZV90IGkg
PSBzdGFydEJsb2NrICsgMTsgaSA8IG1faGVhcC51c2VkQmxvY2tzOyArK2kpCi0gICAgICAgIHJl
c3VsdCArPSBtX2hlYXAuY29sbGVjdG9yQmxvY2soaSktPm1hcmtlZC5jb3VudCgpOwotCi0gICAg
cmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBIZWFwOjpzd2VlcCgpCi17Ci0gICAgQVNTRVJUKG1f
aGVhcC5vcGVyYXRpb25JblByb2dyZXNzID09IE5vT3BlcmF0aW9uKTsKLSAgICBpZiAobV9oZWFw
Lm9wZXJhdGlvbkluUHJvZ3Jlc3MgIT0gTm9PcGVyYXRpb24pCi0gICAgICAgIENSQVNIKCk7Ci0g
ICAgbV9oZWFwLm9wZXJhdGlvbkluUHJvZ3Jlc3MgPSBDb2xsZWN0aW9uOwotICAgIAotI2lmICFF
TkFCTEUoSlNDX1pPTUJJRVMpCi0gICAgU3RydWN0dXJlKiBkdW1teU1hcmthYmxlQ2VsbFN0cnVj
dHVyZSA9IG1fZ2xvYmFsRGF0YS0+ZHVtbXlNYXJrYWJsZUNlbGxTdHJ1Y3R1cmUuZ2V0KCk7Ci0j
ZW5kaWYKLQotICAgIERlYWRPYmplY3RJdGVyYXRvciBpdChtX2hlYXAsIG1faGVhcC5uZXh0Qmxv
Y2ssIG1faGVhcC5uZXh0Q2VsbCk7Ci0gICAgRGVhZE9iamVjdEl0ZXJhdG9yIGVuZChtX2hlYXAs
IG1faGVhcC51c2VkQmxvY2tzKTsKLSAgICBmb3IgKCA7IGl0ICE9IGVuZDsgKytpdCkgewotICAg
ICAgICBKU0NlbGwqIGNlbGwgPSAqaXQ7Ci0jaWYgRU5BQkxFKEpTQ19aT01CSUVTKQotICAgICAg
ICBpZiAoIWNlbGwtPmlzWm9tYmllKCkpIHsKLSAgICAgICAgICAgIGNvbnN0IENsYXNzSW5mbyog
aW5mbyA9IGNlbGwtPmNsYXNzSW5mbygpOwotICAgICAgICAgICAgY2VsbC0+fkpTQ2VsbCgpOwot
ICAgICAgICAgICAgbmV3IChjZWxsKSBKU1pvbWJpZShpbmZvLCBKU1pvbWJpZTo6bGVha2VkWm9t
YmllU3RydWN0dXJlKCkpOwotICAgICAgICAgICAgSGVhcDo6bWFya0NlbGwoY2VsbCk7Ci0gICAg
ICAgIH0KLSNlbHNlCi0gICAgICAgIGNlbGwtPn5KU0NlbGwoKTsKLSAgICAgICAgLy8gQ2FsbGVy
cyBvZiBzd2VlcCBhc3N1bWUgaXQncyBzYWZlIHRvIG1hcmsgYW55IGNlbGwgaW4gdGhlIGhlYXAu
Ci0gICAgICAgIG5ldyAoY2VsbCkgSlNDZWxsKGR1bW15TWFya2FibGVDZWxsU3RydWN0dXJlKTsK
LSNlbmRpZgotICAgIH0KLQotICAgIG1faGVhcC5vcGVyYXRpb25JblByb2dyZXNzID0gTm9PcGVy
YXRpb247Ci19Ci0KLXZvaWQgSGVhcDo6bWFya1Jvb3RzKCkKLXsKLSNpZm5kZWYgTkRFQlVHCi0g
ICAgaWYgKG1fZ2xvYmFsRGF0YS0+aXNTaGFyZWRJbnN0YW5jZSgpKSB7Ci0gICAgICAgIEFTU0VS
VChKU0xvY2s6OmxvY2tDb3VudCgpID4gMCk7Ci0gICAgICAgIEFTU0VSVChKU0xvY2s6OmN1cnJl
bnRUaHJlYWRJc0hvbGRpbmdMb2NrKCkpOwotICAgIH0KLSNlbmRpZgotCi0gICAgQVNTRVJUKG1f
aGVhcC5vcGVyYXRpb25JblByb2dyZXNzID09IE5vT3BlcmF0aW9uKTsKLSAgICBpZiAobV9oZWFw
Lm9wZXJhdGlvbkluUHJvZ3Jlc3MgIT0gTm9PcGVyYXRpb24pCi0gICAgICAgIENSQVNIKCk7Ci0K
LSAgICBtX2hlYXAub3BlcmF0aW9uSW5Qcm9ncmVzcyA9IENvbGxlY3Rpb247Ci0KLSAgICBNYXJr
U3RhY2smIG1hcmtTdGFjayA9IG1fZ2xvYmFsRGF0YS0+bWFya1N0YWNrOwotCi0gICAgLy8gUmVz
ZXQgbWFyayBiaXRzLgotICAgIGNsZWFyTWFya0JpdHMoKTsKLQotICAgIC8vIE1hcmsgc3RhY2sg
cm9vdHMuCi0gICAgbWFya1N0YWNrT2JqZWN0c0NvbnNlcnZhdGl2ZWx5KG1hcmtTdGFjayk7Ci0g
ICAgbV9nbG9iYWxEYXRhLT5pbnRlcnByZXRlci0+cmVnaXN0ZXJGaWxlKCkubWFya0NhbGxGcmFt
ZXMobWFya1N0YWNrLCB0aGlzKTsKLQotICAgIC8vIE1hcmsgZXhwbGljaXRseSByZWdpc3RlcmVk
IHJvb3RzLgotICAgIG1hcmtQcm90ZWN0ZWRPYmplY3RzKG1hcmtTdGFjayk7Ci0gICAgCi0gICAg
Ly8gTWFyayB0ZW1wb3JhcnkgdmVjdG9yIGZvciBBcnJheSBzb3J0aW5nCi0gICAgbWFya1RlbXBT
b3J0VmVjdG9ycyhtYXJrU3RhY2spOwotCi0gICAgLy8gTWFyayBtaXNjLiBvdGhlciByb290cy4K
LSAgICBpZiAobV9tYXJrTGlzdFNldCAmJiBtX21hcmtMaXN0U2V0LT5zaXplKCkpCi0gICAgICAg
IE1hcmtlZEFyZ3VtZW50QnVmZmVyOjptYXJrTGlzdHMobWFya1N0YWNrLCAqbV9tYXJrTGlzdFNl
dCk7Ci0gICAgaWYgKG1fZ2xvYmFsRGF0YS0+ZXhjZXB0aW9uKQotICAgICAgICBtYXJrU3RhY2su
YXBwZW5kKG1fZ2xvYmFsRGF0YS0+ZXhjZXB0aW9uKTsKLSAgICBpZiAobV9nbG9iYWxEYXRhLT5m
aXJzdFN0cmluZ2lmaWVyVG9NYXJrKQotICAgICAgICBKU09OT2JqZWN0OjptYXJrU3RyaW5naWZp
ZXJzKG1hcmtTdGFjaywgbV9nbG9iYWxEYXRhLT5maXJzdFN0cmluZ2lmaWVyVG9NYXJrKTsKLQot
ICAgIC8vIE1hcmsgdGhlIHNtYWxsIHN0cmluZ3MgY2FjaGUgbGFzdCwgc2luY2UgaXQgd2lsbCBj
bGVhciBpdHNlbGYgaWYgbm90aGluZwotICAgIC8vIGVsc2UgaGFzIG1hcmtlZCBpdC4KLSAgICBt
X2dsb2JhbERhdGEtPnNtYWxsU3RyaW5ncy5tYXJrQ2hpbGRyZW4obWFya1N0YWNrKTsKLQotICAg
IG1hcmtTdGFjay5kcmFpbigpOwotICAgIG1hcmtTdGFjay5jb21wYWN0KCk7Ci0KLSAgICB1cGRh
dGVXZWFrR0NIYW5kbGVzKCk7Ci0KLSAgICBtX2hlYXAub3BlcmF0aW9uSW5Qcm9ncmVzcyA9IE5v
T3BlcmF0aW9uOwotfQotCi1zaXplX3QgSGVhcDo6b2JqZWN0Q291bnQoKSBjb25zdAotewotICAg
IHJldHVybiBtX2hlYXAubmV4dEJsb2NrICogSGVhcENvbnN0YW50czo6Y2VsbHNQZXJCbG9jayAv
LyBhbGxvY2F0ZWQgZnVsbCBibG9ja3MKLSAgICAgICAgICAgKyBtX2hlYXAubmV4dENlbGwgLy8g
YWxsb2NhdGVkIGNlbGxzIGluIGN1cnJlbnQgYmxvY2sKLSAgICAgICAgICAgKyBtYXJrZWRDZWxs
cyhtX2hlYXAubmV4dEJsb2NrLCBtX2hlYXAubmV4dENlbGwpIC8vIG1hcmtlZCBjZWxscyBpbiBy
ZW1haW5kZXIgb2YgbV9oZWFwCi0gICAgICAgICAgIC0gbV9oZWFwLnVzZWRCbG9ja3M7IC8vIDEg
Y2VsbCBwZXIgYmxvY2sgaXMgYSBkdW1teSBzZW50aW5lbAotfQotCi12b2lkIEhlYXA6OmFkZFRv
U3RhdGlzdGljcyhIZWFwOjpTdGF0aXN0aWNzJiBzdGF0aXN0aWNzKSBjb25zdAotewotICAgIHN0
YXRpc3RpY3Muc2l6ZSArPSBtX2hlYXAudXNlZEJsb2NrcyAqIEJMT0NLX1NJWkU7Ci0gICAgc3Rh
dGlzdGljcy5mcmVlICs9IG1faGVhcC51c2VkQmxvY2tzICogQkxPQ0tfU0laRSAtIChvYmplY3RD
b3VudCgpICogSGVhcENvbnN0YW50czo6Y2VsbFNpemUpOwotfQotCi1IZWFwOjpTdGF0aXN0aWNz
IEhlYXA6OnN0YXRpc3RpY3MoKSBjb25zdAotewotICAgIFN0YXRpc3RpY3Mgc3RhdGlzdGljcyA9
IHsgMCwgMCB9OwotICAgIGFkZFRvU3RhdGlzdGljcyhzdGF0aXN0aWNzKTsKLSAgICByZXR1cm4g
c3RhdGlzdGljczsKLX0KLQotc2l6ZV90IEhlYXA6OnNpemUoKSBjb25zdAotewotICAgIHJldHVy
biBtX2hlYXAudXNlZEJsb2NrcyAqIEJMT0NLX1NJWkU7Ci19Ci0KLXNpemVfdCBIZWFwOjpnbG9i
YWxPYmplY3RDb3VudCgpCi17Ci0gICAgc2l6ZV90IGNvdW50ID0gMDsKLSAgICBpZiAoSlNHbG9i
YWxPYmplY3QqIGhlYWQgPSBtX2dsb2JhbERhdGEtPmhlYWQpIHsKLSAgICAgICAgSlNHbG9iYWxP
YmplY3QqIG8gPSBoZWFkOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICArK2NvdW50OwotICAg
ICAgICAgICAgbyA9IG8tPm5leHQoKTsKLSAgICAgICAgfSB3aGlsZSAobyAhPSBoZWFkKTsKLSAg
ICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi1zaXplX3QgSGVhcDo6cHJvdGVjdGVkR2xvYmFs
T2JqZWN0Q291bnQoKQotewotICAgIHNpemVfdCBjb3VudCA9IDA7Ci0gICAgaWYgKEpTR2xvYmFs
T2JqZWN0KiBoZWFkID0gbV9nbG9iYWxEYXRhLT5oZWFkKSB7Ci0gICAgICAgIEpTR2xvYmFsT2Jq
ZWN0KiBvID0gaGVhZDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKG1fcHJvdGVjdGVk
VmFsdWVzLmNvbnRhaW5zKG8pKQotICAgICAgICAgICAgICAgICsrY291bnQ7Ci0gICAgICAgICAg
ICBvID0gby0+bmV4dCgpOwotICAgICAgICB9IHdoaWxlIChvICE9IGhlYWQpOwotICAgIH0KLQot
ICAgIHJldHVybiBjb3VudDsKLX0KLQotc2l6ZV90IEhlYXA6OnByb3RlY3RlZE9iamVjdENvdW50
KCkKLXsKLSAgICByZXR1cm4gbV9wcm90ZWN0ZWRWYWx1ZXMuc2l6ZSgpOwotfQotCi1zdGF0aWMg
Y29uc3QgY2hhciogdHlwZU5hbWUoSlNDZWxsKiBjZWxsKQotewotICAgIGlmIChjZWxsLT5pc1N0
cmluZygpKQotICAgICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgaWYgKGNlbGwtPmlzR2V0dGVy
U2V0dGVyKCkpCi0gICAgICAgIHJldHVybiAiR2V0dGVyLVNldHRlciI7Ci0gICAgaWYgKGNlbGwt
PmlzQVBJVmFsdWVXcmFwcGVyKCkpCi0gICAgICAgIHJldHVybiAiQVBJIHdyYXBwZXIiOwotICAg
IGlmIChjZWxsLT5pc1Byb3BlcnR5TmFtZUl0ZXJhdG9yKCkpCi0gICAgICAgIHJldHVybiAiRm9y
LWluIGl0ZXJhdG9yIjsKLSAgICBpZiAoIWNlbGwtPmlzT2JqZWN0KCkpCi0gICAgICAgIHJldHVy
biAiW2VtcHR5IGNlbGxdIjsKLSAgICBjb25zdCBDbGFzc0luZm8qIGluZm8gPSBjZWxsLT5jbGFz
c0luZm8oKTsKLSAgICByZXR1cm4gaW5mbyA/IGluZm8tPmNsYXNzTmFtZSA6ICJPYmplY3QiOwot
fQotCi1IYXNoQ291bnRlZFNldDxjb25zdCBjaGFyKj4qIEhlYXA6OnByb3RlY3RlZE9iamVjdFR5
cGVDb3VudHMoKQotewotICAgIEhhc2hDb3VudGVkU2V0PGNvbnN0IGNoYXIqPiogY291bnRzID0g
bmV3IEhhc2hDb3VudGVkU2V0PGNvbnN0IGNoYXIqPjsKLQotICAgIFByb3RlY3RDb3VudFNldDo6
aXRlcmF0b3IgZW5kID0gbV9wcm90ZWN0ZWRWYWx1ZXMuZW5kKCk7Ci0gICAgZm9yIChQcm90ZWN0
Q291bnRTZXQ6Oml0ZXJhdG9yIGl0ID0gbV9wcm90ZWN0ZWRWYWx1ZXMuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KQotICAgICAgICBjb3VudHMtPmFkZCh0eXBlTmFtZShpdC0+Zmlyc3QpKTsKLQot
ICAgIHJldHVybiBjb3VudHM7Ci19Ci0KLUhhc2hDb3VudGVkU2V0PGNvbnN0IGNoYXIqPiogSGVh
cDo6b2JqZWN0VHlwZUNvdW50cygpCi17Ci0gICAgSGFzaENvdW50ZWRTZXQ8Y29uc3QgY2hhcio+
KiBjb3VudHMgPSBuZXcgSGFzaENvdW50ZWRTZXQ8Y29uc3QgY2hhcio+OwotCi0gICAgTGl2ZU9i
amVjdEl0ZXJhdG9yIGl0ID0gcHJpbWFyeUhlYXBCZWdpbigpOwotICAgIExpdmVPYmplY3RJdGVy
YXRvciBoZWFwRW5kID0gcHJpbWFyeUhlYXBFbmQoKTsKLSAgICBmb3IgKCA7IGl0ICE9IGhlYXBF
bmQ7ICsraXQpCi0gICAgICAgIGNvdW50cy0+YWRkKHR5cGVOYW1lKCppdCkpOwotCi0gICAgcmV0
dXJuIGNvdW50czsKLX0KLQotYm9vbCBIZWFwOjppc0J1c3koKQotewotICAgIHJldHVybiBtX2hl
YXAub3BlcmF0aW9uSW5Qcm9ncmVzcyAhPSBOb09wZXJhdGlvbjsKLX0KLQotdm9pZCBIZWFwOjpy
ZXNldCgpCi17Ci0gICAgQVNTRVJUKGdsb2JhbERhdGEoKS0+aWRlbnRpZmllclRhYmxlID09IHd0
ZlRocmVhZERhdGEoKS5jdXJyZW50SWRlbnRpZmllclRhYmxlKCkpOwotICAgIEpBVkFTQ1JJUFRD
T1JFX0dDX0JFR0lOKCk7Ci0KLSAgICBtYXJrUm9vdHMoKTsKLQotICAgIEpBVkFTQ1JJUFRDT1JF
X0dDX01BUktFRCgpOwotCi0gICAgbV9oZWFwLm5leHRDZWxsID0gMDsKLSAgICBtX2hlYXAubmV4
dEJsb2NrID0gMDsKLSAgICBtX2hlYXAubmV4dE51bWJlciA9IDA7Ci0gICAgbV9oZWFwLmV4dHJh
Q29zdCA9IDA7Ci0jaWYgRU5BQkxFKEpTQ19aT01CSUVTKQotICAgIHN3ZWVwKCk7Ci0jZW5kaWYK
LSAgICByZXNpemVCbG9ja3MoKTsKLQotICAgIEpBVkFTQ1JJUFRDT1JFX0dDX0VORCgpOwotCi0g
ICAgKCptX2FjdGl2aXR5Q2FsbGJhY2spKCk7Ci19Ci0KLXZvaWQgSGVhcDo6Y29sbGVjdEFsbEdh
cmJhZ2UoKQotewotICAgIEFTU0VSVChnbG9iYWxEYXRhKCktPmlkZW50aWZpZXJUYWJsZSA9PSB3
dGZUaHJlYWREYXRhKCkuY3VycmVudElkZW50aWZpZXJUYWJsZSgpKTsKLSAgICBKQVZBU0NSSVBU
Q09SRV9HQ19CRUdJTigpOwotCi0gICAgLy8gSWYgdGhlIGxhc3QgaXRlcmF0aW9uIHRocm91Z2gg
dGhlIGhlYXAgZGVhbGxvY2F0ZWQgYmxvY2tzLCB3ZSBuZWVkCi0gICAgLy8gdG8gY2xlYW4gdXAg
cmVtYWluaW5nIGdhcmJhZ2UgYmVmb3JlIG1hcmtpbmcuIE90aGVyd2lzZSwgdGhlIGNvbnNlcnZh
dGl2ZQotICAgIC8vIG1hcmtpbmcgbWVjaGFuaXNtIG1pZ2h0IGZvbGxvdyBhIHBvaW50ZXIgdG8g
dW5tYXBwZWQgbWVtb3J5LgotICAgIGlmIChtX2hlYXAuZGlkU2hyaW5rKQotICAgICAgICBzd2Vl
cCgpOwotCi0gICAgbWFya1Jvb3RzKCk7Ci0KLSAgICBKQVZBU0NSSVBUQ09SRV9HQ19NQVJLRUQo
KTsKLQotICAgIG1faGVhcC5uZXh0Q2VsbCA9IDA7Ci0gICAgbV9oZWFwLm5leHRCbG9jayA9IDA7
Ci0gICAgbV9oZWFwLm5leHROdW1iZXIgPSAwOwotICAgIG1faGVhcC5leHRyYUNvc3QgPSAwOwot
ICAgIHN3ZWVwKCk7Ci0gICAgcmVzaXplQmxvY2tzKCk7Ci0KLSAgICBKQVZBU0NSSVBUQ09SRV9H
Q19FTkQoKTsKLX0KLQotTGl2ZU9iamVjdEl0ZXJhdG9yIEhlYXA6OnByaW1hcnlIZWFwQmVnaW4o
KQotewotICAgIHJldHVybiBMaXZlT2JqZWN0SXRlcmF0b3IobV9oZWFwLCAwKTsKLX0KLQotTGl2
ZU9iamVjdEl0ZXJhdG9yIEhlYXA6OnByaW1hcnlIZWFwRW5kKCkKLXsKLSAgICByZXR1cm4gTGl2
ZU9iamVjdEl0ZXJhdG9yKG1faGVhcCwgbV9oZWFwLnVzZWRCbG9ja3MpOwotfQotCi12b2lkIEhl
YXA6OnNldEFjdGl2aXR5Q2FsbGJhY2soUGFzc093blB0cjxHQ0FjdGl2aXR5Q2FsbGJhY2s+IGFj
dGl2aXR5Q2FsbGJhY2spCi17Ci0gICAgbV9hY3Rpdml0eUNhbGxiYWNrID0gYWN0aXZpdHlDYWxs
YmFjazsKLX0KLQotR0NBY3Rpdml0eUNhbGxiYWNrKiBIZWFwOjphY3Rpdml0eUNhbGxiYWNrKCkK
LXsKLSAgICByZXR1cm4gbV9hY3Rpdml0eUNhbGxiYWNrLmdldCgpOwotfQotCiB9IC8vIG5hbWVz
cGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01hY2hpbmVTdGFj
a01hcmtlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01h
Y2hpbmVTdGFja01hcmtlci5oCShyZXZpc2lvbiA3NTI3NSkJKGZyb20gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3J1bnRpbWUvQ29sbGVjdG9yLmg6NzUyNzUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9NYWNoaW5lU3RhY2tNYXJrZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDMzNiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBIYXJyaSBQb3J0ZW4gKHBv
cnRlbkBrZGUub3JnKQorICogIENvcHlyaWdodCAoQykgMjAwMSBQZXRlciBLZWxseSAocG1rQHBv
c3QuY29tKQorICogIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywg
MjAwOCwgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
KyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjEx
MC0xMzAxICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBDb2xsZWN0b3JfaAorI2RlZmluZSBDb2xs
ZWN0b3JfaAorCisjaW5jbHVkZSAiR0NIYW5kbGUuaCIKKyNpbmNsdWRlICJKU1ZhbHVlLmgiCisj
aW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL0Jp
dG1hcC5oPgorI2luY2x1ZGUgPHd0Zi9GaXhlZEFycmF5Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hD
b3VudGVkU2V0Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvTm9u
Y29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1BhZ2VB
bGxvY2F0aW9uLmg+CisjaW5jbHVkZSA8d3RmL1BhZ2VBbGxvY2F0aW9uQWxpZ25lZC5oPgorI2lu
Y2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgor
I2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKworI2lmIEVOQUJMRShKU0NfTVVMVElQTEVfVEhS
RUFEUykKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2RlZmluZSBBU1NFUlRfQ0xB
U1NfRklUU19JTl9DRUxMKGNsYXNzKSBDT01QSUxFX0FTU0VSVChzaXplb2YoY2xhc3MpIDw9IENF
TExfU0laRSwgY2xhc3NfZml0c19pbl9jZWxsKQorCituYW1lc3BhY2UgSlNDIHsKKworICAgIGNs
YXNzIENvbGxlY3RvckJsb2NrOworICAgIGNsYXNzIEdDQWN0aXZpdHlDYWxsYmFjazsKKyAgICBj
bGFzcyBKU0NlbGw7CisgICAgY2xhc3MgSlNHbG9iYWxEYXRhOworICAgIGNsYXNzIEpTVmFsdWU7
CisgICAgY2xhc3MgTWFya2VkQXJndW1lbnRCdWZmZXI7CisgICAgY2xhc3MgTWFya1N0YWNrOwor
CisgICAgZW51bSBPcGVyYXRpb25JblByb2dyZXNzIHsgTm9PcGVyYXRpb24sIEFsbG9jYXRpb24s
IENvbGxlY3Rpb24gfTsKKworICAgIGNsYXNzIExpdmVPYmplY3RJdGVyYXRvcjsKKworI2lmIE9T
KFdJTkNFKSB8fCBPUyhTWU1CSUFOKSB8fCBQTEFURk9STShCUkVXTVApCisgICAgY29uc3Qgc2l6
ZV90IEJMT0NLX1NJWkUgPSA2NCAqIDEwMjQ7IC8vIDY0aworI2Vsc2UKKyAgICBjb25zdCBzaXpl
X3QgQkxPQ0tfU0laRSA9IDI1NiAqIDEwMjQ7IC8vIDI1NmsKKyNlbmRpZgorCisgICAgc3RydWN0
IENvbGxlY3RvckhlYXAgeworICAgICAgICBzaXplX3QgbmV4dEJsb2NrOworICAgICAgICBzaXpl
X3QgbmV4dENlbGw7CisgICAgICAgIFBhZ2VBbGxvY2F0aW9uQWxpZ25lZCogYmxvY2tzOworICAg
ICAgICAKKyAgICAgICAgdm9pZCogbmV4dE51bWJlcjsKKworICAgICAgICBzaXplX3QgbnVtQmxv
Y2tzOworICAgICAgICBzaXplX3QgdXNlZEJsb2NrczsKKworICAgICAgICBzaXplX3QgZXh0cmFD
b3N0OworICAgICAgICBib29sIGRpZFNocmluazsKKworICAgICAgICBPcGVyYXRpb25JblByb2dy
ZXNzIG9wZXJhdGlvbkluUHJvZ3Jlc3M7CisKKyAgICAgICAgQ29sbGVjdG9yQmxvY2sqIGNvbGxl
Y3RvckJsb2NrKHNpemVfdCBpbmRleCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0
dXJuIHN0YXRpY19jYXN0PENvbGxlY3RvckJsb2NrKj4oYmxvY2tzW2luZGV4XS5iYXNlKCkpOwor
ICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIEhlYXAgOiBwdWJsaWMgTm9uY29weWFibGUg
eworICAgIHB1YmxpYzoKKyAgICAgICAgY2xhc3MgVGhyZWFkOworCisgICAgICAgIHZvaWQgZGVz
dHJveSgpOworCisgICAgICAgIHZvaWQqIGFsbG9jYXRlTnVtYmVyKHNpemVfdCk7CisgICAgICAg
IHZvaWQqIGFsbG9jYXRlKHNpemVfdCk7CisKKyAgICAgICAgYm9vbCBpc0J1c3koKTsgLy8gdHJ1
ZSBpZiBhbiBhbGxvY2F0aW9uIG9yIGNvbGxlY3Rpb24gaXMgaW4gcHJvZ3Jlc3MKKyAgICAgICAg
dm9pZCBjb2xsZWN0QWxsR2FyYmFnZSgpOworCisgICAgICAgIEdDQWN0aXZpdHlDYWxsYmFjayog
YWN0aXZpdHlDYWxsYmFjaygpOworICAgICAgICB2b2lkIHNldEFjdGl2aXR5Q2FsbGJhY2soUGFz
c093blB0cjxHQ0FjdGl2aXR5Q2FsbGJhY2s+KTsKKworICAgICAgICBzdGF0aWMgY29uc3Qgc2l6
ZV90IG1pbkV4dHJhQ29zdCA9IDI1NjsKKyAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBtYXhF
eHRyYUNvc3QgPSAxMDI0ICogMTAyNDsKKworICAgICAgICB2b2lkIHJlcG9ydEV4dHJhTWVtb3J5
Q29zdChzaXplX3QgY29zdCk7CisKKyAgICAgICAgc2l6ZV90IG9iamVjdENvdW50KCkgY29uc3Q7
CisgICAgICAgIHN0cnVjdCBTdGF0aXN0aWNzIHsKKyAgICAgICAgICAgIHNpemVfdCBzaXplOwor
ICAgICAgICAgICAgc2l6ZV90IGZyZWU7CisgICAgICAgIH07CisgICAgICAgIFN0YXRpc3RpY3Mg
c3RhdGlzdGljcygpIGNvbnN0OworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAg
ICAgIHZvaWQgcHJvdGVjdChKU1ZhbHVlKTsKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRo
ZSB2YWx1ZSBpcyBubyBsb25nZXIgcHJvdGVjdGVkIGJ5IGFueSBwcm90ZWN0IHBvaW50ZXJzCisg
ICAgICAgIC8vICh0aG91Z2ggaXQgbWF5IHN0aWxsIGJlIGFsaXZlIGR1ZSB0byBoZWFwL3N0YWNr
IHJlZmVyZW5jZXMpLgorICAgICAgICBib29sIHVucHJvdGVjdChKU1ZhbHVlKTsKKworICAgICAg
ICBzdGF0aWMgSGVhcCogaGVhcChKU1ZhbHVlKTsgLy8gMCBmb3IgaW1tZWRpYXRlIHZhbHVlcwor
ICAgICAgICBzdGF0aWMgSGVhcCogaGVhcChKU0NlbGwqKTsKKworICAgICAgICBzaXplX3QgZ2xv
YmFsT2JqZWN0Q291bnQoKTsKKyAgICAgICAgc2l6ZV90IHByb3RlY3RlZE9iamVjdENvdW50KCk7
CisgICAgICAgIHNpemVfdCBwcm90ZWN0ZWRHbG9iYWxPYmplY3RDb3VudCgpOworICAgICAgICBI
YXNoQ291bnRlZFNldDxjb25zdCBjaGFyKj4qIHByb3RlY3RlZE9iamVjdFR5cGVDb3VudHMoKTsK
KyAgICAgICAgSGFzaENvdW50ZWRTZXQ8Y29uc3QgY2hhcio+KiBvYmplY3RUeXBlQ291bnRzKCk7
CisKKyAgICAgICAgdm9pZCByZWdpc3RlclRocmVhZCgpOyAvLyBPbmx5IG5lZWRzIHRvIGJlIGNh
bGxlZCBieSBjbGllbnRzIHRoYXQgY2FuIHVzZSB0aGUgc2FtZSBoZWFwIGZyb20gbXVsdGlwbGUg
dGhyZWFkcy4KKworICAgICAgICBzdGF0aWMgYm9vbCBpc0NlbGxNYXJrZWQoY29uc3QgSlNDZWxs
Kik7CisgICAgICAgIHN0YXRpYyBib29sIGNoZWNrTWFya0NlbGwoY29uc3QgSlNDZWxsKik7Cisg
ICAgICAgIHN0YXRpYyB2b2lkIG1hcmtDZWxsKEpTQ2VsbCopOworCisgICAgICAgIFdlYWtHQ0hh
bmRsZSogYWRkV2Vha0dDSGFuZGxlKEpTQ2VsbCopOworCisgICAgICAgIHZvaWQgbWFya0NvbnNl
cnZhdGl2ZWx5KE1hcmtTdGFjayYsIHZvaWQqIHN0YXJ0LCB2b2lkKiBlbmQpOworCisgICAgICAg
IHZvaWQgcHVzaFRlbXBTb3J0VmVjdG9yKFdURjo6VmVjdG9yPFZhbHVlU3RyaW5nUGFpcj4qKTsK
KyAgICAgICAgdm9pZCBwb3BUZW1wU29ydFZlY3RvcihXVEY6OlZlY3RvcjxWYWx1ZVN0cmluZ1Bh
aXI+Kik7ICAgICAgICAKKworICAgICAgICBIYXNoU2V0PE1hcmtlZEFyZ3VtZW50QnVmZmVyKj4m
IG1hcmtMaXN0U2V0KCkgeyBpZiAoIW1fbWFya0xpc3RTZXQpIG1fbWFya0xpc3RTZXQgPSBuZXcg
SGFzaFNldDxNYXJrZWRBcmd1bWVudEJ1ZmZlcio+OyByZXR1cm4gKm1fbWFya0xpc3RTZXQ7IH0K
KworICAgICAgICBKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEoKSBjb25zdCB7IHJldHVybiBtX2ds
b2JhbERhdGE7IH0KKyAgICAgICAgc3RhdGljIGJvb2wgaXNOdW1iZXIoSlNDZWxsKik7CisgICAg
ICAgIAorICAgICAgICBMaXZlT2JqZWN0SXRlcmF0b3IgcHJpbWFyeUhlYXBCZWdpbigpOworICAg
ICAgICBMaXZlT2JqZWN0SXRlcmF0b3IgcHJpbWFyeUhlYXBFbmQoKTsKKworICAgIHByaXZhdGU6
CisgICAgICAgIHZvaWQgcmVzZXQoKTsKKyAgICAgICAgdm9pZCBzd2VlcCgpOworICAgICAgICBz
dGF0aWMgQ29sbGVjdG9yQmxvY2sqIGNlbGxCbG9jayhjb25zdCBKU0NlbGwqKTsKKyAgICAgICAg
c3RhdGljIHNpemVfdCBjZWxsT2Zmc2V0KGNvbnN0IEpTQ2VsbCopOworCisgICAgICAgIGZyaWVu
ZCBjbGFzcyBKU0dsb2JhbERhdGE7CisgICAgICAgIEhlYXAoSlNHbG9iYWxEYXRhKik7CisgICAg
ICAgIH5IZWFwKCk7CisKKyAgICAgICAgTkVWRVJfSU5MSU5FIENvbGxlY3RvckJsb2NrKiBhbGxv
Y2F0ZUJsb2NrKCk7CisgICAgICAgIE5FVkVSX0lOTElORSB2b2lkIGZyZWVCbG9jayhzaXplX3Qp
OworICAgICAgICB2b2lkIGZyZWVCbG9ja3MoKTsKKyAgICAgICAgdm9pZCByZXNpemVCbG9ja3Mo
KTsKKyAgICAgICAgdm9pZCBncm93QmxvY2tzKHNpemVfdCBuZWVkZWRCbG9ja3MpOworICAgICAg
ICB2b2lkIHNocmlua0Jsb2NrcyhzaXplX3QgbmVlZGVkQmxvY2tzKTsKKyAgICAgICAgdm9pZCBj
bGVhck1hcmtCaXRzKCk7CisgICAgICAgIHZvaWQgY2xlYXJNYXJrQml0cyhDb2xsZWN0b3JCbG9j
ayopOworICAgICAgICBzaXplX3QgbWFya2VkQ2VsbHMoc2l6ZV90IHN0YXJ0QmxvY2sgPSAwLCBz
aXplX3Qgc3RhcnRDZWxsID0gMCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCByZWNvcmRFeHRyYUNv
c3Qoc2l6ZV90KTsKKworICAgICAgICB2b2lkIGFkZFRvU3RhdGlzdGljcyhTdGF0aXN0aWNzJikg
Y29uc3Q7CisKKyAgICAgICAgdm9pZCBtYXJrUm9vdHMoKTsKKyAgICAgICAgdm9pZCBtYXJrUHJv
dGVjdGVkT2JqZWN0cyhNYXJrU3RhY2smKTsKKyAgICAgICAgdm9pZCBtYXJrVGVtcFNvcnRWZWN0
b3JzKE1hcmtTdGFjayYpOworICAgICAgICB2b2lkIG1hcmtDdXJyZW50VGhyZWFkQ29uc2VydmF0
aXZlbHkoTWFya1N0YWNrJik7CisgICAgICAgIHZvaWQgbWFya0N1cnJlbnRUaHJlYWRDb25zZXJ2
YXRpdmVseUludGVybmFsKE1hcmtTdGFjayYpOworICAgICAgICB2b2lkIG1hcmtPdGhlclRocmVh
ZENvbnNlcnZhdGl2ZWx5KE1hcmtTdGFjayYsIFRocmVhZCopOworICAgICAgICB2b2lkIG1hcmtT
dGFja09iamVjdHNDb25zZXJ2YXRpdmVseShNYXJrU3RhY2smKTsKKworICAgICAgICB2b2lkIHVw
ZGF0ZVdlYWtHQ0hhbmRsZXMoKTsKKyAgICAgICAgV2Vha0dDSGFuZGxlUG9vbCogd2Vha0dDSGFu
ZGxlUG9vbChzaXplX3QgaW5kZXgpOworCisgICAgICAgIHR5cGVkZWYgSGFzaENvdW50ZWRTZXQ8
SlNDZWxsKj4gUHJvdGVjdENvdW50U2V0OworCisgICAgICAgIENvbGxlY3RvckhlYXAgbV9oZWFw
OworCisgICAgICAgIFByb3RlY3RDb3VudFNldCBtX3Byb3RlY3RlZFZhbHVlczsKKyAgICAgICAg
V1RGOjpWZWN0b3I8UGFnZUFsbG9jYXRpb25BbGlnbmVkPiBtX3dlYWtHQ0hhbmRsZVBvb2xzOwor
ICAgICAgICBXVEY6OlZlY3RvcjxXVEY6OlZlY3RvcjxWYWx1ZVN0cmluZ1BhaXI+KiA+IG1fdGVt
cFNvcnRpbmdWZWN0b3JzOworCisgICAgICAgIEhhc2hTZXQ8TWFya2VkQXJndW1lbnRCdWZmZXIq
PiogbV9tYXJrTGlzdFNldDsKKworICAgICAgICBPd25QdHI8R0NBY3Rpdml0eUNhbGxiYWNrPiBt
X2FjdGl2aXR5Q2FsbGJhY2s7CisKKyNpZiBFTkFCTEUoSlNDX01VTFRJUExFX1RIUkVBRFMpCisg
ICAgICAgIHZvaWQgbWFrZVVzYWJsZUZyb21NdWx0aXBsZVRocmVhZHMoKTsKKworICAgICAgICBz
dGF0aWMgdm9pZCB1bnJlZ2lzdGVyVGhyZWFkKHZvaWQqKTsKKyAgICAgICAgdm9pZCB1bnJlZ2lz
dGVyVGhyZWFkKCk7CisKKyAgICAgICAgTXV0ZXggbV9yZWdpc3RlcmVkVGhyZWFkc011dGV4Owor
ICAgICAgICBUaHJlYWQqIG1fcmVnaXN0ZXJlZFRocmVhZHM7CisgICAgICAgIHB0aHJlYWRfa2V5
X3QgbV9jdXJyZW50VGhyZWFkUmVnaXN0cmFyOworI2VuZGlmCisKKyAgICAgICAgSlNHbG9iYWxE
YXRhKiBtX2dsb2JhbERhdGE7CisgICAgfTsKKworICAgIC8vIHR1bmFibGUgcGFyYW1ldGVycwor
ICAgIC8vIGRlcml2ZWQgY29uc3RhbnRzCisgICAgY29uc3Qgc2l6ZV90IEJMT0NLX09GRlNFVF9N
QVNLID0gQkxPQ0tfU0laRSAtIDE7CisgICAgY29uc3Qgc2l6ZV90IEJMT0NLX01BU0sgPSB+QkxP
Q0tfT0ZGU0VUX01BU0s7CisgICAgY29uc3Qgc2l6ZV90IE1JTklNVU1fQ0VMTF9TSVpFID0gNjQ7
CisgICAgY29uc3Qgc2l6ZV90IENFTExfQVJSQVlfTEVOR1RIID0gKE1JTklNVU1fQ0VMTF9TSVpF
IC8gc2l6ZW9mKGRvdWJsZSkpICsgKE1JTklNVU1fQ0VMTF9TSVpFICUgc2l6ZW9mKGRvdWJsZSkg
IT0gMCA/IHNpemVvZihkb3VibGUpIDogMCk7CisgICAgY29uc3Qgc2l6ZV90IENFTExfU0laRSA9
IENFTExfQVJSQVlfTEVOR1RIICogc2l6ZW9mKGRvdWJsZSk7CisgICAgY29uc3Qgc2l6ZV90IFNN
QUxMX0NFTExfU0laRSA9IENFTExfU0laRSAvIDI7CisgICAgY29uc3Qgc2l6ZV90IENFTExfTUFT
SyA9IENFTExfU0laRSAtIDE7CisgICAgY29uc3Qgc2l6ZV90IENFTExfQUxJR05fTUFTSyA9IH5D
RUxMX01BU0s7CisgICAgY29uc3Qgc2l6ZV90IENFTExTX1BFUl9CTE9DSyA9IChCTE9DS19TSVpF
IC0gc2l6ZW9mKEhlYXAqKSkgKiA4ICogQ0VMTF9TSVpFIC8gKDggKiBDRUxMX1NJWkUgKyAxKSAv
IENFTExfU0laRTsgLy8gb25lIGJpdG1hcCBieXRlIGNhbiByZXByZXNlbnQgOCBjZWxscy4KKyAg
ICAKKyAgICBjb25zdCBzaXplX3QgQklUTUFQX1NJWkUgPSAoQ0VMTFNfUEVSX0JMT0NLICsgNykg
LyA4OworICAgIGNvbnN0IHNpemVfdCBCSVRNQVBfV09SRFMgPSAoQklUTUFQX1NJWkUgKyAzKSAv
IHNpemVvZih1aW50MzJfdCk7CisKKyAgICBzdHJ1Y3QgQ29sbGVjdG9yQml0bWFwIHsKKyAgICAg
ICAgRml4ZWRBcnJheTx1aW50MzJfdCwgQklUTUFQX1dPUkRTPiBiaXRzOworICAgICAgICBib29s
IGdldChzaXplX3QgbikgY29uc3QgeyByZXR1cm4gISEoYml0c1tuID4+IDVdICYgKDEgPDwgKG4g
JiAweDFGKSkpOyB9IAorICAgICAgICB2b2lkIHNldChzaXplX3QgbikgeyBiaXRzW24gPj4gNV0g
fD0gKDEgPDwgKG4gJiAweDFGKSk7IH0gCisgICAgICAgIGJvb2wgZ2V0c2V0KHNpemVfdCBuKQor
ICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpID0gKDEgPDwgKG4gJiAweDFGKSk7Cisg
ICAgICAgICAgICB1aW50MzJfdCYgYiA9IGJpdHNbbiA+PiA1XTsKKyAgICAgICAgICAgIGJvb2wg
ciA9ICEhKGIgJiBpKTsKKyAgICAgICAgICAgIGIgfD0gaTsKKyAgICAgICAgICAgIHJldHVybiBy
OworICAgICAgICB9IAorICAgICAgICB2b2lkIGNsZWFyKHNpemVfdCBuKSB7IGJpdHNbbiA+PiA1
XSAmPSB+KDEgPDwgKG4gJiAweDFGKSk7IH0gCisgICAgICAgIHZvaWQgY2xlYXJBbGwoKSB7IG1l
bXNldChiaXRzLmRhdGEoKSwgMCwgc2l6ZW9mKGJpdHMpKTsgfQorICAgICAgICBBTFdBWVNfSU5M
SU5FIHZvaWQgYWR2YW5jZVRvTmV4dFBvc3NpYmxlRnJlZUNlbGwoc2l6ZV90JiBzdGFydENlbGwp
CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghfmJpdHNbc3RhcnRDZWxsID4+IDVdKQorICAg
ICAgICAgICAgICAgIHN0YXJ0Q2VsbCA9IChzdGFydENlbGwgJiAofjB4MUYpKSArIDMyOworICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICsrc3RhcnRDZWxsOworICAgICAgICB9Cisg
ICAgICAgIHNpemVfdCBjb3VudChzaXplX3Qgc3RhcnRDZWxsID0gMCkKKyAgICAgICAgeworICAg
ICAgICAgICAgc2l6ZV90IHJlc3VsdCA9IDA7CisgICAgICAgICAgICBmb3IgKCA7IChzdGFydENl
bGwgJiAweDFGKSAhPSAwOyArK3N0YXJ0Q2VsbCkgeworICAgICAgICAgICAgICAgIGlmIChnZXQo
c3RhcnRDZWxsKSkKKyAgICAgICAgICAgICAgICAgICAgKytyZXN1bHQ7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gc3RhcnRDZWxsID4+IDU7IGkgPCBCSVRNQVBf
V09SRFM7ICsraSkKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gV1RGOjpiaXRDb3VudChiaXRz
W2ldKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgc2l6
ZV90IGlzRW1wdHkoKSAvLyBNdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gdGVzdGluZyBjb3VudCgp
ID09IDAuCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQklU
TUFQX1dPUkRTOyArK2kpCisgICAgICAgICAgICAgICAgaWYgKGJpdHNbaV0gIT0gMCkKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIH0KKyAgICB9OworICAKKyAgICBzdHJ1Y3QgQ29sbGVjdG9yQ2VsbCB7CisgICAgICAg
IEZpeGVkQXJyYXk8ZG91YmxlLCBDRUxMX0FSUkFZX0xFTkdUSD4gbWVtb3J5OworICAgIH07CisK
KyAgICBjbGFzcyBDb2xsZWN0b3JCbG9jayB7CisgICAgcHVibGljOgorICAgICAgICBGaXhlZEFy
cmF5PENvbGxlY3RvckNlbGwsIENFTExTX1BFUl9CTE9DSz4gY2VsbHM7CisgICAgICAgIENvbGxl
Y3RvckJpdG1hcCBtYXJrZWQ7CisgICAgICAgIEhlYXAqIGhlYXA7CisgICAgfTsKKworICAgIHN0
cnVjdCBIZWFwQ29uc3RhbnRzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBjZWxsU2l6
ZSA9IENFTExfU0laRTsKKyAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBjZWxsc1BlckJsb2Nr
ID0gQ0VMTFNfUEVSX0JMT0NLOworICAgICAgICB0eXBlZGVmIENvbGxlY3RvckNlbGwgQ2VsbDsK
KyAgICAgICAgdHlwZWRlZiBDb2xsZWN0b3JCbG9jayBCbG9jazsKKyAgICB9OworCisgICAgaW5s
aW5lIENvbGxlY3RvckJsb2NrKiBIZWFwOjpjZWxsQmxvY2soY29uc3QgSlNDZWxsKiBjZWxsKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q29sbGVjdG9yQmxvY2sqPihy
ZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oY2VsbCkgJiBCTE9DS19NQVNLKTsKKyAgICB9CisK
KyAgICBpbmxpbmUgc2l6ZV90IEhlYXA6OmNlbGxPZmZzZXQoY29uc3QgSlNDZWxsKiBjZWxsKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oY2VsbCkg
JiBCTE9DS19PRkZTRVRfTUFTSykgLyBDRUxMX1NJWkU7CisgICAgfQorCisgICAgaW5saW5lIGJv
b2wgSGVhcDo6aXNDZWxsTWFya2VkKGNvbnN0IEpTQ2VsbCogY2VsbCkKKyAgICB7CisgICAgICAg
IHJldHVybiBjZWxsQmxvY2soY2VsbCktPm1hcmtlZC5nZXQoY2VsbE9mZnNldChjZWxsKSk7Cisg
ICAgfQorCisgICAgaW5saW5lIGJvb2wgSGVhcDo6Y2hlY2tNYXJrQ2VsbChjb25zdCBKU0NlbGwq
IGNlbGwpCisgICAgeworICAgICAgICByZXR1cm4gY2VsbEJsb2NrKGNlbGwpLT5tYXJrZWQuZ2V0
c2V0KGNlbGxPZmZzZXQoY2VsbCkpOworICAgIH0KKworICAgIGlubGluZSB2b2lkIEhlYXA6Om1h
cmtDZWxsKEpTQ2VsbCogY2VsbCkKKyAgICB7CisgICAgICAgIGNlbGxCbG9jayhjZWxsKS0+bWFy
a2VkLnNldChjZWxsT2Zmc2V0KGNlbGwpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgdm9pZCBIZWFw
OjpyZXBvcnRFeHRyYU1lbW9yeUNvc3Qoc2l6ZV90IGNvc3QpCisgICAgeworICAgICAgICBpZiAo
Y29zdCA+IG1pbkV4dHJhQ29zdCkgCisgICAgICAgICAgICByZWNvcmRFeHRyYUNvc3QoY29zdCk7
CisgICAgfQorICAgIAorICAgIGlubGluZSB2b2lkKiBIZWFwOjphbGxvY2F0ZU51bWJlcihzaXpl
X3QgcykKKyAgICB7CisgICAgICAgIGlmICh2b2lkKiByZXN1bHQgPSBtX2hlYXAubmV4dE51bWJl
cikgeworICAgICAgICAgICAgbV9oZWFwLm5leHROdW1iZXIgPSAwOworICAgICAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQqIHJlc3VsdCA9IGFsbG9jYXRl
KHMpOworICAgICAgICBtX2hlYXAubmV4dE51bWJlciA9IHN0YXRpY19jYXN0PGNoYXIqPihyZXN1
bHQpICsgKENFTExfU0laRSAvIDIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwor
CisgICAgaW5saW5lIFdlYWtHQ0hhbmRsZVBvb2wqIEhlYXA6OndlYWtHQ0hhbmRsZVBvb2woc2l6
ZV90IGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFdlYWtHQ0hhbmRs
ZVBvb2wqPihtX3dlYWtHQ0hhbmRsZVBvb2xzW2luZGV4XS5iYXNlKCkpOworICAgIH0KK30gLy8g
bmFtZXNwYWNlIEpTQworCisjZW5kaWYgLyogQ29sbGVjdG9yX2ggKi8KSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL01hY2hpbmVTdGFja01hcmtlci5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01hY2hpbmVTdGFja01hcmtlci5oCShyZXZp
c2lvbiA3NTI3NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL01hY2hpbmVTdGFj
a01hcmtlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOSwzMTggKzE5LDU1IEBACiAgKgogICovCiAK
LSNpZm5kZWYgQ29sbGVjdG9yX2gKLSNkZWZpbmUgQ29sbGVjdG9yX2gKKyNpZm5kZWYgTWFjaGlu
ZVN0YWNrTWFya2VyX2gKKyNkZWZpbmUgTWFjaGluZVN0YWNrTWFya2VyX2gKIAotI2luY2x1ZGUg
IkdDSGFuZGxlLmgiCi0jaW5jbHVkZSAiSlNWYWx1ZS5oIgotI2luY2x1ZGUgPHN0ZGRlZi5oPgot
I2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHd0Zi9CaXRtYXAuaD4KLSNpbmNsdWRlIDx3
dGYvRml4ZWRBcnJheS5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoQ291bnRlZFNldC5oPgotI2luY2x1
ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+Ci0jaW5jbHVk
ZSA8d3RmL093blB0ci5oPgotI2luY2x1ZGUgPHd0Zi9QYWdlQWxsb2NhdGlvbi5oPgotI2luY2x1
ZGUgPHd0Zi9QYWdlQWxsb2NhdGlvbkFsaWduZWQuaD4KLSNpbmNsdWRlIDx3dGYvUGFzc093blB0
ci5oPgotI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KLSNpbmNsdWRlIDx3dGYvVGhyZWFk
aW5nLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZ1ByaW1pdGl2ZXMuaD4KIAogI2lmIEVOQUJM
RShKU0NfTVVMVElQTEVfVEhSRUFEUykKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjZW5kaWYKIAot
I2RlZmluZSBBU1NFUlRfQ0xBU1NfRklUU19JTl9DRUxMKGNsYXNzKSBDT01QSUxFX0FTU0VSVChz
aXplb2YoY2xhc3MpIDw9IENFTExfU0laRSwgY2xhc3NfZml0c19pbl9jZWxsKQotCiBuYW1lc3Bh
Y2UgSlNDIHsKIAotICAgIGNsYXNzIENvbGxlY3RvckJsb2NrOwotICAgIGNsYXNzIEdDQWN0aXZp
dHlDYWxsYmFjazsKLSAgICBjbGFzcyBKU0NlbGw7Ci0gICAgY2xhc3MgSlNHbG9iYWxEYXRhOwot
ICAgIGNsYXNzIEpTVmFsdWU7Ci0gICAgY2xhc3MgTWFya2VkQXJndW1lbnRCdWZmZXI7CisgICAg
Y2xhc3MgSGVhcDsKICAgICBjbGFzcyBNYXJrU3RhY2s7CiAKLSAgICBlbnVtIE9wZXJhdGlvbklu
UHJvZ3Jlc3MgeyBOb09wZXJhdGlvbiwgQWxsb2NhdGlvbiwgQ29sbGVjdGlvbiB9OwotCi0gICAg
Y2xhc3MgTGl2ZU9iamVjdEl0ZXJhdG9yOwotCi0jaWYgT1MoV0lOQ0UpIHx8IE9TKFNZTUJJQU4p
IHx8IFBMQVRGT1JNKEJSRVdNUCkKLSAgICBjb25zdCBzaXplX3QgQkxPQ0tfU0laRSA9IDY0ICog
MTAyNDsgLy8gNjRrCi0jZWxzZQotICAgIGNvbnN0IHNpemVfdCBCTE9DS19TSVpFID0gMjU2ICog
MTAyNDsgLy8gMjU2awotI2VuZGlmCi0KLSAgICBzdHJ1Y3QgQ29sbGVjdG9ySGVhcCB7Ci0gICAg
ICAgIHNpemVfdCBuZXh0QmxvY2s7Ci0gICAgICAgIHNpemVfdCBuZXh0Q2VsbDsKLSAgICAgICAg
UGFnZUFsbG9jYXRpb25BbGlnbmVkKiBibG9ja3M7Ci0gICAgICAgIAotICAgICAgICB2b2lkKiBu
ZXh0TnVtYmVyOwotCi0gICAgICAgIHNpemVfdCBudW1CbG9ja3M7Ci0gICAgICAgIHNpemVfdCB1
c2VkQmxvY2tzOwotCi0gICAgICAgIHNpemVfdCBleHRyYUNvc3Q7Ci0gICAgICAgIGJvb2wgZGlk
U2hyaW5rOwotCi0gICAgICAgIE9wZXJhdGlvbkluUHJvZ3Jlc3Mgb3BlcmF0aW9uSW5Qcm9ncmVz
czsKLQotICAgICAgICBDb2xsZWN0b3JCbG9jayogY29sbGVjdG9yQmxvY2soc2l6ZV90IGluZGV4
KSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29sbGVj
dG9yQmxvY2sqPihibG9ja3NbaW5kZXhdLmJhc2UoKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0g
ICAgY2xhc3MgSGVhcCA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CisgICAgY2xhc3MgTWFjaGluZVN0
YWNrTWFya2VyIDogcHVibGljIE5vbmNvcHlhYmxlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIGNs
YXNzIFRocmVhZDsKLQotICAgICAgICB2b2lkIGRlc3Ryb3koKTsKLQotICAgICAgICB2b2lkKiBh
bGxvY2F0ZU51bWJlcihzaXplX3QpOwotICAgICAgICB2b2lkKiBhbGxvY2F0ZShzaXplX3QpOwot
Ci0gICAgICAgIGJvb2wgaXNCdXN5KCk7IC8vIHRydWUgaWYgYW4gYWxsb2NhdGlvbiBvciBjb2xs
ZWN0aW9uIGlzIGluIHByb2dyZXNzCi0gICAgICAgIHZvaWQgY29sbGVjdEFsbEdhcmJhZ2UoKTsK
KyAgICAgICAgTWFjaGluZVN0YWNrTWFya2VyKEhlYXAqKTsKKyAgICAgICAgfk1hY2hpbmVTdGFj
a01hcmtlcigpOwogCi0gICAgICAgIEdDQWN0aXZpdHlDYWxsYmFjayogYWN0aXZpdHlDYWxsYmFj
aygpOwotICAgICAgICB2b2lkIHNldEFjdGl2aXR5Q2FsbGJhY2soUGFzc093blB0cjxHQ0FjdGl2
aXR5Q2FsbGJhY2s+KTsKLQotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbkV4dHJhQ29z
dCA9IDI1NjsKLSAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBtYXhFeHRyYUNvc3QgPSAxMDI0
ICogMTAyNDsKLQotICAgICAgICB2b2lkIHJlcG9ydEV4dHJhTWVtb3J5Q29zdChzaXplX3QgY29z
dCk7Ci0KLSAgICAgICAgc2l6ZV90IG9iamVjdENvdW50KCkgY29uc3Q7Ci0gICAgICAgIHN0cnVj
dCBTdGF0aXN0aWNzIHsKLSAgICAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICAgICAgc2l6
ZV90IGZyZWU7Ci0gICAgICAgIH07Ci0gICAgICAgIFN0YXRpc3RpY3Mgc3RhdGlzdGljcygpIGNv
bnN0OwotICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgcHJvdGVj
dChKU1ZhbHVlKTsKLSAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBubyBs
b25nZXIgcHJvdGVjdGVkIGJ5IGFueSBwcm90ZWN0IHBvaW50ZXJzCi0gICAgICAgIC8vICh0aG91
Z2ggaXQgbWF5IHN0aWxsIGJlIGFsaXZlIGR1ZSB0byBoZWFwL3N0YWNrIHJlZmVyZW5jZXMpLgot
ICAgICAgICBib29sIHVucHJvdGVjdChKU1ZhbHVlKTsKLQotICAgICAgICBzdGF0aWMgSGVhcCog
aGVhcChKU1ZhbHVlKTsgLy8gMCBmb3IgaW1tZWRpYXRlIHZhbHVlcwotICAgICAgICBzdGF0aWMg
SGVhcCogaGVhcChKU0NlbGwqKTsKLQotICAgICAgICBzaXplX3QgZ2xvYmFsT2JqZWN0Q291bnQo
KTsKLSAgICAgICAgc2l6ZV90IHByb3RlY3RlZE9iamVjdENvdW50KCk7Ci0gICAgICAgIHNpemVf
dCBwcm90ZWN0ZWRHbG9iYWxPYmplY3RDb3VudCgpOwotICAgICAgICBIYXNoQ291bnRlZFNldDxj
b25zdCBjaGFyKj4qIHByb3RlY3RlZE9iamVjdFR5cGVDb3VudHMoKTsKLSAgICAgICAgSGFzaENv
dW50ZWRTZXQ8Y29uc3QgY2hhcio+KiBvYmplY3RUeXBlQ291bnRzKCk7CisgICAgICAgIHZvaWQg
bWFya01hY2hpbmVTdGFja0NvbnNlcnZhdGl2ZWx5KE1hcmtTdGFjayYpOwogCisjaWYgRU5BQkxF
KEpTQ19NVUxUSVBMRV9USFJFQURTKQorICAgICAgICB2b2lkIG1ha2VVc2FibGVGcm9tTXVsdGlw
bGVUaHJlYWRzKCk7CiAgICAgICAgIHZvaWQgcmVnaXN0ZXJUaHJlYWQoKTsgLy8gT25seSBuZWVk
cyB0byBiZSBjYWxsZWQgYnkgY2xpZW50cyB0aGF0IGNhbiB1c2UgdGhlIHNhbWUgaGVhcCBmcm9t
IG11bHRpcGxlIHRocmVhZHMuCi0KLSAgICAgICAgc3RhdGljIGJvb2wgaXNDZWxsTWFya2VkKGNv
bnN0IEpTQ2VsbCopOwotICAgICAgICBzdGF0aWMgYm9vbCBjaGVja01hcmtDZWxsKGNvbnN0IEpT
Q2VsbCopOwotICAgICAgICBzdGF0aWMgdm9pZCBtYXJrQ2VsbChKU0NlbGwqKTsKLQotICAgICAg
ICBXZWFrR0NIYW5kbGUqIGFkZFdlYWtHQ0hhbmRsZShKU0NlbGwqKTsKLQotICAgICAgICB2b2lk
IG1hcmtDb25zZXJ2YXRpdmVseShNYXJrU3RhY2smLCB2b2lkKiBzdGFydCwgdm9pZCogZW5kKTsK
LQotICAgICAgICB2b2lkIHB1c2hUZW1wU29ydFZlY3RvcihXVEY6OlZlY3RvcjxWYWx1ZVN0cmlu
Z1BhaXI+Kik7Ci0gICAgICAgIHZvaWQgcG9wVGVtcFNvcnRWZWN0b3IoV1RGOjpWZWN0b3I8VmFs
dWVTdHJpbmdQYWlyPiopOyAgICAgICAgCi0KLSAgICAgICAgSGFzaFNldDxNYXJrZWRBcmd1bWVu
dEJ1ZmZlcio+JiBtYXJrTGlzdFNldCgpIHsgaWYgKCFtX21hcmtMaXN0U2V0KSBtX21hcmtMaXN0
U2V0ID0gbmV3IEhhc2hTZXQ8TWFya2VkQXJndW1lbnRCdWZmZXIqPjsgcmV0dXJuICptX21hcmtM
aXN0U2V0OyB9Ci0KLSAgICAgICAgSlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRhKCkgY29uc3QgeyBy
ZXR1cm4gbV9nbG9iYWxEYXRhOyB9Ci0gICAgICAgIHN0YXRpYyBib29sIGlzTnVtYmVyKEpTQ2Vs
bCopOwotICAgICAgICAKLSAgICAgICAgTGl2ZU9iamVjdEl0ZXJhdG9yIHByaW1hcnlIZWFwQmVn
aW4oKTsKLSAgICAgICAgTGl2ZU9iamVjdEl0ZXJhdG9yIHByaW1hcnlIZWFwRW5kKCk7CisjZW5k
aWYKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIHZvaWQgcmVzZXQoKTsKLSAgICAgICAgdm9pZCBz
d2VlcCgpOwotICAgICAgICBzdGF0aWMgQ29sbGVjdG9yQmxvY2sqIGNlbGxCbG9jayhjb25zdCBK
U0NlbGwqKTsKLSAgICAgICAgc3RhdGljIHNpemVfdCBjZWxsT2Zmc2V0KGNvbnN0IEpTQ2VsbCop
OwotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBKU0dsb2JhbERhdGE7Ci0gICAgICAgIEhlYXAoSlNH
bG9iYWxEYXRhKik7Ci0gICAgICAgIH5IZWFwKCk7Ci0KLSAgICAgICAgTkVWRVJfSU5MSU5FIENv
bGxlY3RvckJsb2NrKiBhbGxvY2F0ZUJsb2NrKCk7Ci0gICAgICAgIE5FVkVSX0lOTElORSB2b2lk
IGZyZWVCbG9jayhzaXplX3QpOwotICAgICAgICB2b2lkIGZyZWVCbG9ja3MoKTsKLSAgICAgICAg
dm9pZCByZXNpemVCbG9ja3MoKTsKLSAgICAgICAgdm9pZCBncm93QmxvY2tzKHNpemVfdCBuZWVk
ZWRCbG9ja3MpOwotICAgICAgICB2b2lkIHNocmlua0Jsb2NrcyhzaXplX3QgbmVlZGVkQmxvY2tz
KTsKLSAgICAgICAgdm9pZCBjbGVhck1hcmtCaXRzKCk7Ci0gICAgICAgIHZvaWQgY2xlYXJNYXJr
Qml0cyhDb2xsZWN0b3JCbG9jayopOwotICAgICAgICBzaXplX3QgbWFya2VkQ2VsbHMoc2l6ZV90
IHN0YXJ0QmxvY2sgPSAwLCBzaXplX3Qgc3RhcnRDZWxsID0gMCkgY29uc3Q7Ci0KLSAgICAgICAg
dm9pZCByZWNvcmRFeHRyYUNvc3Qoc2l6ZV90KTsKLQotICAgICAgICB2b2lkIGFkZFRvU3RhdGlz
dGljcyhTdGF0aXN0aWNzJikgY29uc3Q7Ci0KLSAgICAgICAgdm9pZCBtYXJrUm9vdHMoKTsKLSAg
ICAgICAgdm9pZCBtYXJrUHJvdGVjdGVkT2JqZWN0cyhNYXJrU3RhY2smKTsKLSAgICAgICAgdm9p
ZCBtYXJrVGVtcFNvcnRWZWN0b3JzKE1hcmtTdGFjayYpOwogICAgICAgICB2b2lkIG1hcmtDdXJy
ZW50VGhyZWFkQ29uc2VydmF0aXZlbHkoTWFya1N0YWNrJik7CiAgICAgICAgIHZvaWQgbWFya0N1
cnJlbnRUaHJlYWRDb25zZXJ2YXRpdmVseUludGVybmFsKE1hcmtTdGFjayYpOwotICAgICAgICB2
b2lkIG1hcmtPdGhlclRocmVhZENvbnNlcnZhdGl2ZWx5KE1hcmtTdGFjayYsIFRocmVhZCopOwot
ICAgICAgICB2b2lkIG1hcmtTdGFja09iamVjdHNDb25zZXJ2YXRpdmVseShNYXJrU3RhY2smKTsK
LQotICAgICAgICB2b2lkIHVwZGF0ZVdlYWtHQ0hhbmRsZXMoKTsKLSAgICAgICAgV2Vha0dDSGFu
ZGxlUG9vbCogd2Vha0dDSGFuZGxlUG9vbChzaXplX3QgaW5kZXgpOwotCi0gICAgICAgIHR5cGVk
ZWYgSGFzaENvdW50ZWRTZXQ8SlNDZWxsKj4gUHJvdGVjdENvdW50U2V0OwotCi0gICAgICAgIENv
bGxlY3RvckhlYXAgbV9oZWFwOwotCi0gICAgICAgIFByb3RlY3RDb3VudFNldCBtX3Byb3RlY3Rl
ZFZhbHVlczsKLSAgICAgICAgV1RGOjpWZWN0b3I8UGFnZUFsbG9jYXRpb25BbGlnbmVkPiBtX3dl
YWtHQ0hhbmRsZVBvb2xzOwotICAgICAgICBXVEY6OlZlY3RvcjxXVEY6OlZlY3RvcjxWYWx1ZVN0
cmluZ1BhaXI+KiA+IG1fdGVtcFNvcnRpbmdWZWN0b3JzOwotCi0gICAgICAgIEhhc2hTZXQ8TWFy
a2VkQXJndW1lbnRCdWZmZXIqPiogbV9tYXJrTGlzdFNldDsKLQotICAgICAgICBPd25QdHI8R0NB
Y3Rpdml0eUNhbGxiYWNrPiBtX2FjdGl2aXR5Q2FsbGJhY2s7CiAKICNpZiBFTkFCTEUoSlNDX01V
TFRJUExFX1RIUkVBRFMpCi0gICAgICAgIHZvaWQgbWFrZVVzYWJsZUZyb21NdWx0aXBsZVRocmVh
ZHMoKTsKKyAgICAgICAgY2xhc3MgVGhyZWFkOwogCiAgICAgICAgIHN0YXRpYyB2b2lkIHVucmVn
aXN0ZXJUaHJlYWQodm9pZCopOworCiAgICAgICAgIHZvaWQgdW5yZWdpc3RlclRocmVhZCgpOwor
ICAgICAgICB2b2lkIG1hcmtPdGhlclRocmVhZENvbnNlcnZhdGl2ZWx5KE1hcmtTdGFjayYsIFRo
cmVhZCopOworI2VuZGlmCisKKyAgICAgICAgSGVhcCogbV9oZWFwOwogCisjaWYgRU5BQkxFKEpT
Q19NVUxUSVBMRV9USFJFQURTKQogICAgICAgICBNdXRleCBtX3JlZ2lzdGVyZWRUaHJlYWRzTXV0
ZXg7CiAgICAgICAgIFRocmVhZCogbV9yZWdpc3RlcmVkVGhyZWFkczsKICAgICAgICAgcHRocmVh
ZF9rZXlfdCBtX2N1cnJlbnRUaHJlYWRSZWdpc3RyYXI7CiAjZW5kaWYKLQotICAgICAgICBKU0ds
b2JhbERhdGEqIG1fZ2xvYmFsRGF0YTsKLSAgICB9OwotCi0gICAgLy8gdHVuYWJsZSBwYXJhbWV0
ZXJzCi0gICAgLy8gZGVyaXZlZCBjb25zdGFudHMKLSAgICBjb25zdCBzaXplX3QgQkxPQ0tfT0ZG
U0VUX01BU0sgPSBCTE9DS19TSVpFIC0gMTsKLSAgICBjb25zdCBzaXplX3QgQkxPQ0tfTUFTSyA9
IH5CTE9DS19PRkZTRVRfTUFTSzsKLSAgICBjb25zdCBzaXplX3QgTUlOSU1VTV9DRUxMX1NJWkUg
PSA2NDsKLSAgICBjb25zdCBzaXplX3QgQ0VMTF9BUlJBWV9MRU5HVEggPSAoTUlOSU1VTV9DRUxM
X1NJWkUgLyBzaXplb2YoZG91YmxlKSkgKyAoTUlOSU1VTV9DRUxMX1NJWkUgJSBzaXplb2YoZG91
YmxlKSAhPSAwID8gc2l6ZW9mKGRvdWJsZSkgOiAwKTsKLSAgICBjb25zdCBzaXplX3QgQ0VMTF9T
SVpFID0gQ0VMTF9BUlJBWV9MRU5HVEggKiBzaXplb2YoZG91YmxlKTsKLSAgICBjb25zdCBzaXpl
X3QgU01BTExfQ0VMTF9TSVpFID0gQ0VMTF9TSVpFIC8gMjsKLSAgICBjb25zdCBzaXplX3QgQ0VM
TF9NQVNLID0gQ0VMTF9TSVpFIC0gMTsKLSAgICBjb25zdCBzaXplX3QgQ0VMTF9BTElHTl9NQVNL
ID0gfkNFTExfTUFTSzsKLSAgICBjb25zdCBzaXplX3QgQ0VMTFNfUEVSX0JMT0NLID0gKEJMT0NL
X1NJWkUgLSBzaXplb2YoSGVhcCopKSAqIDggKiBDRUxMX1NJWkUgLyAoOCAqIENFTExfU0laRSAr
IDEpIC8gQ0VMTF9TSVpFOyAvLyBvbmUgYml0bWFwIGJ5dGUgY2FuIHJlcHJlc2VudCA4IGNlbGxz
LgotICAgIAotICAgIGNvbnN0IHNpemVfdCBCSVRNQVBfU0laRSA9IChDRUxMU19QRVJfQkxPQ0sg
KyA3KSAvIDg7Ci0gICAgY29uc3Qgc2l6ZV90IEJJVE1BUF9XT1JEUyA9IChCSVRNQVBfU0laRSAr
IDMpIC8gc2l6ZW9mKHVpbnQzMl90KTsKLQotICAgIHN0cnVjdCBDb2xsZWN0b3JCaXRtYXAgewot
ICAgICAgICBGaXhlZEFycmF5PHVpbnQzMl90LCBCSVRNQVBfV09SRFM+IGJpdHM7Ci0gICAgICAg
IGJvb2wgZ2V0KHNpemVfdCBuKSBjb25zdCB7IHJldHVybiAhIShiaXRzW24gPj4gNV0gJiAoMSA8
PCAobiAmIDB4MUYpKSk7IH0gCi0gICAgICAgIHZvaWQgc2V0KHNpemVfdCBuKSB7IGJpdHNbbiA+
PiA1XSB8PSAoMSA8PCAobiAmIDB4MUYpKTsgfSAKLSAgICAgICAgYm9vbCBnZXRzZXQoc2l6ZV90
IG4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGkgPSAoMSA8PCAobiAmIDB4MUYp
KTsKLSAgICAgICAgICAgIHVpbnQzMl90JiBiID0gYml0c1tuID4+IDVdOwotICAgICAgICAgICAg
Ym9vbCByID0gISEoYiAmIGkpOwotICAgICAgICAgICAgYiB8PSBpOwotICAgICAgICAgICAgcmV0
dXJuIHI7Ci0gICAgICAgIH0gCi0gICAgICAgIHZvaWQgY2xlYXIoc2l6ZV90IG4pIHsgYml0c1tu
ID4+IDVdICY9IH4oMSA8PCAobiAmIDB4MUYpKTsgfSAKLSAgICAgICAgdm9pZCBjbGVhckFsbCgp
IHsgbWVtc2V0KGJpdHMuZGF0YSgpLCAwLCBzaXplb2YoYml0cykpOyB9Ci0gICAgICAgIEFMV0FZ
U19JTkxJTkUgdm9pZCBhZHZhbmNlVG9OZXh0UG9zc2libGVGcmVlQ2VsbChzaXplX3QmIHN0YXJ0
Q2VsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCF+Yml0c1tzdGFydENlbGwgPj4gNV0p
Ci0gICAgICAgICAgICAgICAgc3RhcnRDZWxsID0gKHN0YXJ0Q2VsbCAmICh+MHgxRikpICsgMzI7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKytzdGFydENlbGw7Ci0gICAgICAg
IH0KLSAgICAgICAgc2l6ZV90IGNvdW50KHNpemVfdCBzdGFydENlbGwgPSAwKQotICAgICAgICB7
Ci0gICAgICAgICAgICBzaXplX3QgcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIGZvciAoIDsgKHN0
YXJ0Q2VsbCAmIDB4MUYpICE9IDA7ICsrc3RhcnRDZWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYg
KGdldChzdGFydENlbGwpKQotICAgICAgICAgICAgICAgICAgICArK3Jlc3VsdDsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSBzdGFydENlbGwgPj4gNTsgaSA8IEJJ
VE1BUF9XT1JEUzsgKytpKQotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBXVEY6OmJpdENvdW50
KGJpdHNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAg
ICBzaXplX3QgaXNFbXB0eSgpIC8vIE11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiB0ZXN0aW5nIGNv
dW50KCkgPT0gMC4KLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBCSVRNQVBfV09SRFM7ICsraSkKLSAgICAgICAgICAgICAgICBpZiAoYml0c1tpXSAhPSAwKQot
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICAgICAgfQotICAgIH07Ci0gIAotICAgIHN0cnVjdCBDb2xsZWN0b3JDZWxsIHsKLSAg
ICAgICAgRml4ZWRBcnJheTxkb3VibGUsIENFTExfQVJSQVlfTEVOR1RIPiBtZW1vcnk7Ci0gICAg
fTsKLQotICAgIGNsYXNzIENvbGxlY3RvckJsb2NrIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEZp
eGVkQXJyYXk8Q29sbGVjdG9yQ2VsbCwgQ0VMTFNfUEVSX0JMT0NLPiBjZWxsczsKLSAgICAgICAg
Q29sbGVjdG9yQml0bWFwIG1hcmtlZDsKLSAgICAgICAgSGVhcCogaGVhcDsKLSAgICB9OwotCi0g
ICAgc3RydWN0IEhlYXBDb25zdGFudHMgewotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGNl
bGxTaXplID0gQ0VMTF9TSVpFOwotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGNlbGxzUGVy
QmxvY2sgPSBDRUxMU19QRVJfQkxPQ0s7Ci0gICAgICAgIHR5cGVkZWYgQ29sbGVjdG9yQ2VsbCBD
ZWxsOwotICAgICAgICB0eXBlZGVmIENvbGxlY3RvckJsb2NrIEJsb2NrOwogICAgIH07CiAKLSAg
ICBpbmxpbmUgQ29sbGVjdG9yQmxvY2sqIEhlYXA6OmNlbGxCbG9jayhjb25zdCBKU0NlbGwqIGNl
bGwpCi0gICAgewotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDb2xsZWN0b3JCbG9j
ayo+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihjZWxsKSAmIEJMT0NLX01BU0spOwotICAg
IH0KLQotICAgIGlubGluZSBzaXplX3QgSGVhcDo6Y2VsbE9mZnNldChjb25zdCBKU0NlbGwqIGNl
bGwpCi0gICAgewotICAgICAgICByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihj
ZWxsKSAmIEJMT0NLX09GRlNFVF9NQVNLKSAvIENFTExfU0laRTsKLSAgICB9Ci0KLSAgICBpbmxp
bmUgYm9vbCBIZWFwOjppc0NlbGxNYXJrZWQoY29uc3QgSlNDZWxsKiBjZWxsKQotICAgIHsKLSAg
ICAgICAgcmV0dXJuIGNlbGxCbG9jayhjZWxsKS0+bWFya2VkLmdldChjZWxsT2Zmc2V0KGNlbGwp
KTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBIZWFwOjpjaGVja01hcmtDZWxsKGNvbnN0IEpT
Q2VsbCogY2VsbCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjZWxsQmxvY2soY2VsbCktPm1hcmtl
ZC5nZXRzZXQoY2VsbE9mZnNldChjZWxsKSk7Ci0gICAgfQotCi0gICAgaW5saW5lIHZvaWQgSGVh
cDo6bWFya0NlbGwoSlNDZWxsKiBjZWxsKQotICAgIHsKLSAgICAgICAgY2VsbEJsb2NrKGNlbGwp
LT5tYXJrZWQuc2V0KGNlbGxPZmZzZXQoY2VsbCkpOwotICAgIH0KLQotICAgIGlubGluZSB2b2lk
IEhlYXA6OnJlcG9ydEV4dHJhTWVtb3J5Q29zdChzaXplX3QgY29zdCkKLSAgICB7Ci0gICAgICAg
IGlmIChjb3N0ID4gbWluRXh0cmFDb3N0KSAKLSAgICAgICAgICAgIHJlY29yZEV4dHJhQ29zdChj
b3N0KTsKLSAgICB9Ci0gICAgCi0gICAgaW5saW5lIHZvaWQqIEhlYXA6OmFsbG9jYXRlTnVtYmVy
KHNpemVfdCBzKQotICAgIHsKLSAgICAgICAgaWYgKHZvaWQqIHJlc3VsdCA9IG1faGVhcC5uZXh0
TnVtYmVyKSB7Ci0gICAgICAgICAgICBtX2hlYXAubmV4dE51bWJlciA9IDA7Ci0gICAgICAgICAg
ICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCogcmVzdWx0ID0gYWxs
b2NhdGUocyk7Ci0gICAgICAgIG1faGVhcC5uZXh0TnVtYmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+
KHJlc3VsdCkgKyAoQ0VMTF9TSVpFIC8gMik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAg
fQotCi0KLSAgICBpbmxpbmUgV2Vha0dDSGFuZGxlUG9vbCogSGVhcDo6d2Vha0dDSGFuZGxlUG9v
bChzaXplX3QgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V2Vha0dD
SGFuZGxlUG9vbCo+KG1fd2Vha0dDSGFuZGxlUG9vbHNbaW5kZXhdLmJhc2UoKSk7Ci0gICAgfQog
fSAvLyBuYW1lc3BhY2UgSlNDCiAKLSNlbmRpZiAvKiBDb2xsZWN0b3JfaCAqLworI2VuZGlmIC8v
IE1hY2hpbmVTdGFja01hcmtlcl9oCg==
</data>
<flag name="review"
          id="69583"
          type_id="1"
          status="+"
          setter="barraclough"
    />
    <flag name="commit-queue"
          id="69593"
          type_id="3"
          status="-"
          setter="commit-queue"
    />
          </attachment>
      

    </bug>

</bugzilla>